diff options
author | Anders Carlsson <andersca@mac.com> | 2009-08-28 15:18:15 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-08-28 15:18:15 +0000 |
commit | 4bd7875b9cf4e5a2f68b554db0456200a97b4280 (patch) | |
tree | 14ca5a12a2707500701d6137b284d094f679bd1a /clang/lib/Sema | |
parent | 8b899e424718788712fe10a42fde919ff3bc0362 (diff) | |
download | bcm5719-llvm-4bd7875b9cf4e5a2f68b554db0456200a97b4280.tar.gz bcm5719-llvm-4bd7875b9cf4e5a2f68b554db0456200a97b4280.zip |
Instantiate unresolved using declarations.
llvm-svn: 80366
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 5 | ||||
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 21 |
2 files changed, 23 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 4874c92dece..5d1c059c7ff 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -2160,8 +2160,9 @@ NamedDecl *Sema::BuildUsingDeclaration(SourceLocation UsingLoc, << NNS << RD->getDeclName(); return 0; } - - LookupContext = cast<RecordType>(Ty)->getDecl(); + + QualType BaseTy = Context.getCanonicalType(QualType(Ty, 0)); + LookupContext = BaseTy->getAs<RecordType>()->getDecl(); } else { // C++0x N2914 [namespace.udecl]p8: // A using-declaration for a class member shall be a member-declaration. diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 0bf832f3ebd..4f9fcc3b9e0 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -58,7 +58,8 @@ namespace { Decl *VisitClassTemplateDecl(ClassTemplateDecl *D); Decl *VisitFunctionTemplateDecl(FunctionTemplateDecl *D); Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); - + Decl *VisitUnresolvedUsingDecl(UnresolvedUsingDecl *D); + // Base case. FIXME: Remove once we can instantiate everything. Decl *VisitDecl(Decl *) { assert(false && "Template instantiation of unknown declaration kind!"); @@ -740,6 +741,24 @@ Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl( return Inst; } +Decl * +TemplateDeclInstantiator::VisitUnresolvedUsingDecl(UnresolvedUsingDecl *D) { + NestedNameSpecifier *NNS = + SemaRef.SubstNestedNameSpecifier(D->getTargetNestedNameSpecifier(), + D->getTargetNestedNameRange(), + TemplateArgs); + if (!NNS) + return 0; + + CXXScopeSpec SS; + SS.setRange(D->getTargetNestedNameRange()); + SS.setScopeRep(NNS); + + return SemaRef.BuildUsingDeclaration(D->getLocation(), SS, + D->getTargetNameLocation(), + D->getTargetName(), 0, D->isTypeName()); +} + Decl *Sema::SubstDecl(Decl *D, DeclContext *Owner, const TemplateArgumentList &TemplateArgs) { TemplateDeclInstantiator Instantiator(*this, Owner, TemplateArgs); |