aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaTemplateInstantiateExpr.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-05-27 17:07:49 +0000
committerDouglas Gregor <dgregor@apple.com>2009-05-27 17:07:49 +0000
commit2bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6e (patch)
tree611cf27603b2bde8b1b67ddd443eee3fffbd79c0 /lib/Sema/SemaTemplateInstantiateExpr.cpp
parente70e8f7fef3efb3d526ee25b3a0e2a4bf67a04b6 (diff)
Improve name lookup for and template instantiation of declaration
references. There are several smallish fixes here: - Make sure we look through template parameter scope when determining whether we're parsing a nested class (or nested class *template*). This makes sure that we delay parsing the bodies of inline member functions until after we're out of the outermost class (template) scope. - Since the bodies of member functions are always parsed "out-of-line", even when they were declared in-line, teach unqualified name lookup to look into the (semantic) parents. - Use the new InstantiateDeclRef to handle the instantiation of a reference to a declaration (in DeclRefExpr), which drastically simplifies template instantiation for DeclRefExprs. - When we're instantiating a ParmVarDecl, it must be in the current instantiation scope, so only look there. Also, remove the #if 0's and FIXME's from the dynarray example, which now compiles and executes thanks to Anders and Eli. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72481 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateInstantiateExpr.cpp')
-rw-r--r--lib/Sema/SemaTemplateInstantiateExpr.cpp28
1 files changed, 10 insertions, 18 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp
index a0fc25de92..726ac2b425 100644
--- a/lib/Sema/SemaTemplateInstantiateExpr.cpp
+++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp
@@ -109,8 +109,7 @@ TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
Sema::OwningExprResult
TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
// FIXME: Recast this in terms of Sema::InstantiateDeclRef.
- Decl *D = E->getDecl();
- ValueDecl *NewD = 0;
+ NamedDecl *D = E->getDecl();
if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
assert(NTTP->getDepth() == 0 && "No nested templates yet");
const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
@@ -131,29 +130,22 @@ TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
*Arg.getAsIntegral(),
T,
E->getSourceRange().getBegin()));
- } else if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
- NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Parm);
- } else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
- if (Var->hasLocalStorage())
- NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Var);
- else
- assert(false &&
- "FIXME: instantiation of non-local variable declarations");
- } else if (isa<FunctionDecl>(D)) {
- // FIXME: Instantiate decl!
- NewD = cast<ValueDecl>(D);
- } else if (isa<OverloadedFunctionDecl>(D)) {
- // FIXME: instantiate decls?
- return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(cast<NamedDecl>(D),
+ }
+
+ if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
+ // FIXME: instantiate each decl in the overload set
+ return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Ovl,
SemaRef.Context.OverloadTy,
E->getLocation(),
false, false));
- } else
- assert(false && "FIXME: unhandled declaration reference kind");
+ }
+ ValueDecl *NewD
+ = dyn_cast_or_null<ValueDecl>(SemaRef.InstantiateDeclRef(D, TemplateArgs));
if (!NewD)
return SemaRef.ExprError();
+ // FIXME: Build QualifiedDeclRefExpr?
QualType T = NewD->getType();
return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
T.getNonReferenceType(),