diff options
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateDecl.cpp | 40 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-anonymous-union.cpp | 8 |
2 files changed, 34 insertions, 14 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 732394d867..7b06bf909a 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -1117,23 +1117,35 @@ static bool isInstantiationOf(ASTContext &Ctx, NamedDecl *D, Decl *Other) { if (D->getKind() != Other->getKind()) return false; - if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Other)) - return Record->getInstantiatedFromMemberClass()->getCanonicalDecl() - == D->getCanonicalDecl(); - - if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Other)) - return Function->getInstantiatedFromMemberFunction()->getCanonicalDecl() - == D->getCanonicalDecl(); + if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Other)) { + if (CXXRecordDecl *Pattern = Record->getInstantiatedFromMemberClass()) + return Pattern->getCanonicalDecl() == D->getCanonicalDecl(); + else + return false; + } + + if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Other)) { + if (FunctionDecl *Pattern = Function->getInstantiatedFromMemberFunction()) + return Pattern->getCanonicalDecl() == D->getCanonicalDecl(); + else + return false; + } - if (EnumDecl *Enum = dyn_cast<EnumDecl>(Other)) - return Enum->getInstantiatedFromMemberEnum()->getCanonicalDecl() - == D->getCanonicalDecl(); + if (EnumDecl *Enum = dyn_cast<EnumDecl>(Other)) { + if (EnumDecl *Pattern = Enum->getInstantiatedFromMemberEnum()) + return Pattern->getCanonicalDecl() == D->getCanonicalDecl(); + else + return false; + } if (VarDecl *Var = dyn_cast<VarDecl>(Other)) - if (Var->isStaticDataMember()) - return Var->getInstantiatedFromStaticDataMember()->getCanonicalDecl() - == D->getCanonicalDecl(); - + if (Var->isStaticDataMember()) { + if (VarDecl *Pattern = Var->getInstantiatedFromStaticDataMember()) + return Pattern->getCanonicalDecl() == D->getCanonicalDecl(); + else + return false; + } + // FIXME: How can we find instantiations of anonymous unions? return D->getDeclName() && isa<NamedDecl>(Other) && diff --git a/test/SemaTemplate/instantiate-anonymous-union.cpp b/test/SemaTemplate/instantiate-anonymous-union.cpp new file mode 100644 index 0000000000..4eb5b0c24c --- /dev/null +++ b/test/SemaTemplate/instantiate-anonymous-union.cpp @@ -0,0 +1,8 @@ +// RUN: clang-cc -fsyntax-only %s + +// FIXME: We need to test anonymous structs/unions in templates for real. + +template <typename T> class A { struct { }; }; + +A<int> a0; + |