Weak references and variables that are not definitions are not required for early codegen/deserialization.

llvm-svn: 109796
This commit is contained in:
Argyrios Kyrtzidis 2010-07-29 20:07:52 +00:00
parent 5fb47cd535
commit 6e03a7476f
2 changed files with 14 additions and 0 deletions

View File

@ -5550,6 +5550,10 @@ bool ASTContext::DeclIsRequiredFunctionOrFileScopedVar(const Decl *D) {
} else if (!isa<FunctionDecl>(D))
return false;
// Weak references don't produce any output by themselves.
if (D->hasAttr<WeakRefAttr>())
return false;
// Aliases and used decls are required.
if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>())
return true;
@ -5587,6 +5591,9 @@ bool ASTContext::DeclIsRequiredFunctionOrFileScopedVar(const Decl *D) {
const VarDecl *VD = cast<VarDecl>(D);
assert(VD->isFileVarDecl() && "Expected file scoped var");
if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly)
return false;
// Structs that have non-trivial constructors or destructors are required.
// FIXME: Handle references.

View File

@ -109,3 +109,10 @@ template<typename T> struct S_PR7660 { void g(void (*)(T)); };
template<typename> class C_PR7670;
template<> class C_PR7670<int>;
template<> class C_PR7670<int>;
template <bool B>
struct S2 {
static bool V;
};
extern template class S2<true>;