summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/TreeTransform.h
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2009-12-08 09:08:17 +0000
committerJohn McCall <rjmccall@apple.com>2009-12-08 09:08:17 +0000
commitce54657e956ec91a1e81596beeb44933dda03f8c (patch)
treebdc30a5b8b3f4265795fbdbd278c64b8a4741418 /clang/lib/Sema/TreeTransform.h
parentfe2f901269a9744aaece1b6c322b86223aa2b0d6 (diff)
downloadbcm5719-llvm-ce54657e956ec91a1e81596beeb44933dda03f8c.tar.gz
bcm5719-llvm-ce54657e956ec91a1e81596beeb44933dda03f8c.zip
DeclRefExpr stores a ValueDecl internally.
Template instantiation can re-use DeclRefExprs. llvm-svn: 90848
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
-rw-r--r--clang/lib/Sema/TreeTransform.h50
1 files changed, 29 insertions, 21 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 5f2ae604de7..155e2e4a7de 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -830,15 +830,15 @@ public:
/// Subclasses may override this routine to provide different behavior.
OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
SourceRange QualifierRange,
- NamedDecl *ND, SourceLocation Loc,
- bool isAddressOfOperand) {
+ ValueDecl *VD, SourceLocation Loc,
+ TemplateArgumentListInfo *TemplateArgs) {
CXXScopeSpec SS;
SS.setScopeRep(Qualifier);
SS.setRange(QualifierRange);
- return getSema().BuildDeclarationNameExpr(Loc, ND,
- /*FIXME:*/false,
- &SS,
- isAddressOfOperand);
+
+ // FIXME: loses template args.
+
+ return getSema().BuildDeclarationNameExpr(SS, Loc, VD);
}
/// \brief Build a new expression in parentheses.
@@ -3484,31 +3484,39 @@ TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E,
if (!Qualifier)
return SemaRef.ExprError();
}
-
- NamedDecl *ND
- = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
+
+ ValueDecl *ND
+ = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getDecl()));
if (!ND)
return SemaRef.ExprError();
if (!getDerived().AlwaysRebuild() &&
Qualifier == E->getQualifier() &&
ND == E->getDecl() &&
- !E->hasExplicitTemplateArgumentList())
- return SemaRef.Owned(E->Retain());
+ !E->hasExplicitTemplateArgumentList()) {
- // FIXME: We're losing the explicit template arguments in this transformation.
+ // Mark it referenced in the new context regardless.
+ // FIXME: this is a bit instantiation-specific.
+ SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
- llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
- for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
- if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
- TransArgs[I]))
- return SemaRef.ExprError();
+ return SemaRef.Owned(E->Retain());
}
-
- // FIXME: Pass the qualifier/qualifier range along.
+
+ TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
+ if (E->hasExplicitTemplateArgumentList()) {
+ TemplateArgs = &TransArgs;
+ TransArgs.setLAngleLoc(E->getLAngleLoc());
+ TransArgs.setRAngleLoc(E->getRAngleLoc());
+ for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
+ TemplateArgumentLoc Loc;
+ if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
+ return SemaRef.ExprError();
+ TransArgs.addArgument(Loc);
+ }
+ }
+
return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
- ND, E->getLocation(),
- isAddressOfOperand);
+ ND, E->getLocation(), TemplateArgs);
}
template<typename Derived>
OpenPOWER on IntegriCloud