summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-08-28 15:18:15 +0000
committerAnders Carlsson <andersca@mac.com>2009-08-28 15:18:15 +0000
commit4bd7875b9cf4e5a2f68b554db0456200a97b4280 (patch)
tree14ca5a12a2707500701d6137b284d094f679bd1a /clang/lib
parent8b899e424718788712fe10a42fde919ff3bc0362 (diff)
downloadbcm5719-llvm-4bd7875b9cf4e5a2f68b554db0456200a97b4280.tar.gz
bcm5719-llvm-4bd7875b9cf4e5a2f68b554db0456200a97b4280.zip
Instantiate unresolved using declarations.
llvm-svn: 80366
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp5
-rw-r--r--clang/lib/Sema/SemaTemplateInstantiateDecl.cpp21
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);
OpenPOWER on IntegriCloud