summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/TreeTransform.h
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-04-27 18:19:34 +0000
committerDouglas Gregor <dgregor@apple.com>2010-04-27 18:19:34 +0000
commit9262f4775d456460aba130bdb03d685b9bc557de (patch)
treecb3a2cb6cfbd927668299a3110827c271eaf33b0 /clang/lib/Sema/TreeTransform.h
parent0a3fe0456fcba47f029363499c2ee7dfa4ea30cf (diff)
downloadbcm5719-llvm-9262f4775d456460aba130bdb03d685b9bc557de.tar.gz
bcm5719-llvm-9262f4775d456460aba130bdb03d685b9bc557de.zip
During template instantiation, set the naming class of
UnresolvedLookupExpr and UnresolvedMemberExpr by substituting the naming class we computed when building the expression in the template... ... which we didn't always do correctly. Teach UnresolvedMemberExpr::getNamingClass() all about the new representation of injected-class-names in templates, so that it can return a naming class that is the current instantiation. Also, when decomposing a template-id into its template name and its arguments, be sure to set the naming class on the LookupResult structure. Fixes PR6947 the right way. llvm-svn: 102448
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
-rw-r--r--clang/lib/Sema/TreeTransform.h37
1 files changed, 10 insertions, 27 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 2f36807659c..cca14caa443 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -5336,19 +5336,16 @@ TreeTransform<Derived>::TransformUnresolvedLookupExpr(
SS.setScopeRep(Qualifier);
SS.setRange(Old->getQualifierRange());
-
- // If this nested-name-specifier refers to a class type, that is the
- // naming class.
- if (const Type *NamedType = Qualifier->getAsType())
- if (const RecordType *NamedRecord = NamedType->getAs<RecordType>())
- R.setNamingClass(cast<CXXRecordDecl>(NamedRecord->getDecl()));
- } else if (Old->getNamingClass()) {
+ }
+
+ if (Old->getNamingClass()) {
CXXRecordDecl *NamingClass
= cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
Old->getNameLoc(),
Old->getNamingClass()));
if (!NamingClass)
return SemaRef.ExprError();
+
R.setNamingClass(NamingClass);
}
@@ -5735,7 +5732,6 @@ TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old)
BaseType = getDerived().TransformType(Old->getBaseType());
}
- CXXRecordDecl *NamingClass = 0;
NestedNameSpecifier *Qualifier = 0;
if (Old->getQualifier()) {
Qualifier
@@ -5743,12 +5739,6 @@ TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old)
Old->getQualifierRange());
if (Qualifier == 0)
return SemaRef.ExprError();
-
- // If this nested-name-specifier refers to a class type, that is the
- // naming class.
- if (const Type *NamedType = Qualifier->getAsType())
- if (const RecordType *NamedRecord = NamedType->getAs<RecordType>())
- NamingClass = cast<CXXRecordDecl>(NamedRecord->getDecl());
}
LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(),
@@ -5783,24 +5773,17 @@ TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old)
R.resolveKind();
- // Determine the naming class, if we haven't already.
- if (!NamingClass) {
- QualType T = BaseType;
- if (const PointerType *PointerTy = T->getAs<PointerType>())
- T = PointerTy->getPointeeType();
- if (const RecordType *NamedRecord = T->getAs<RecordType>())
- NamingClass = cast<CXXRecordDecl>(NamedRecord->getDecl());
- }
-
- if (!NamingClass && Old->getNamingClass()) {
- NamingClass = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
+ // Determine the naming class.
+ if (!Old->getNamingClass()) {
+ CXXRecordDecl *NamingClass
+ = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
Old->getMemberLoc(),
Old->getNamingClass()));
if (!NamingClass)
return SemaRef.ExprError();
- }
- if (NamingClass)
+
R.setNamingClass(NamingClass);
+ }
TemplateArgumentListInfo TransArgs;
if (Old->hasExplicitTemplateArgs()) {
OpenPOWER on IntegriCloud