aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-02-28 18:50:33 +0000
committerDouglas Gregor <dgregor@apple.com>2011-02-28 18:50:33 +0000
commit7c3179cf463c3b3b8c21dbb955f933ba50b74f28 (patch)
treecc4afe1f9a3f8201c23d02d17321ef1b1ee2dbac /lib/Sema
parentb3d74da3e1620c9a7a378afb5f244e4987e6713e (diff)
Push nested-name-specifier source location information into
CXXDependentScopeMemberExpr, and clean up instantiation of nested-name-specifiers with dependent template specialization types in the process. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126663 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema')
-rw-r--r--lib/Sema/SemaExpr.cpp12
-rw-r--r--lib/Sema/SemaTemplate.cpp5
-rw-r--r--lib/Sema/TreeTransform.h60
3 files changed, 32 insertions, 45 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 415ab3f38d..2abbcf0acd 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1350,10 +1350,17 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
TemplateArgumentListInfo TList;
if (ULE->hasExplicitTemplateArgs())
ULE->copyTemplateArgumentsInto(TList);
+
+ // FIXME: We should have nested-name-specifier location info in
+ // the ULE itself.
+ CXXScopeSpec SS;
+ SS.MakeTrivial(Context, ULE->getQualifier(),
+ ULE->getQualifierRange());
+
CXXDependentScopeMemberExpr *DepExpr =
CXXDependentScopeMemberExpr::Create(
Context, DepThis, DepThisType, true, SourceLocation(),
- ULE->getQualifier(), ULE->getQualifierRange(), NULL,
+ SS.getWithLocInContext(Context), NULL,
R.getLookupNameInfo(), &TList);
CallsUndergoingInstantiation.back()->setCallee(DepExpr);
} else {
@@ -3269,8 +3276,7 @@ Sema::ActOnDependentMemberExpr(Expr *BaseExpr, QualType BaseType,
// must have pointer type, and the accessed type is the pointee.
return Owned(CXXDependentScopeMemberExpr::Create(Context, BaseExpr, BaseType,
IsArrow, OpLoc,
- SS.getScopeRep(),
- SS.getRange(),
+ SS.getWithLocInContext(Context),
FirstQualifierInScope,
NameInfo, TemplateArgs));
}
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp
index cbfd7b0939..01850353fd 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -368,9 +368,6 @@ Sema::ActOnDependentIdExpression(const CXXScopeSpec &SS,
const DeclarationNameInfo &NameInfo,
bool isAddressOfOperand,
const TemplateArgumentListInfo *TemplateArgs) {
- NestedNameSpecifier *Qualifier
- = static_cast<NestedNameSpecifier*>(SS.getScopeRep());
-
DeclContext *DC = getFunctionLevelDeclContext();
if (!isAddressOfOperand &&
@@ -386,7 +383,7 @@ Sema::ActOnDependentIdExpression(const CXXScopeSpec &SS,
/*This*/ 0, ThisType,
/*IsArrow*/ true,
/*Op*/ SourceLocation(),
- Qualifier, SS.getRange(),
+ SS.getWithLocInContext(Context),
FirstQualifierInScope,
NameInfo,
TemplateArgs));
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index 8f875fbef0..4e2902690c 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -1975,16 +1975,15 @@ public:
/// By default, performs semantic analysis to build the new expression.
/// Subclasses may override this routine to provide different behavior.
ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
- QualType BaseType,
- bool IsArrow,
- SourceLocation OperatorLoc,
- NestedNameSpecifier *Qualifier,
- SourceRange QualifierRange,
+ QualType BaseType,
+ bool IsArrow,
+ SourceLocation OperatorLoc,
+ NestedNameSpecifierLoc QualifierLoc,
NamedDecl *FirstQualifierInScope,
const DeclarationNameInfo &MemberNameInfo,
const TemplateArgumentListInfo *TemplateArgs) {
CXXScopeSpec SS;
- SS.MakeTrivial(SemaRef.Context, Qualifier, QualifierRange);
+ SS.Adopt(QualifierLoc);
return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
OperatorLoc, IsArrow,
@@ -2601,10 +2600,11 @@ TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
<< TL.getType() << SS.getRange();
return NestedNameSpecifierLoc();
}
- }
+ }
- // The qualifier-in-scope only applies to the leftmost entity.
+ // The qualifier-in-scope and object type only apply to the leftmost entity.
FirstQualifierInScope = 0;
+ ObjectType = QualType();
}
// Don't rebuild the nested-name-specifier if we don't have to.
@@ -3273,17 +3273,6 @@ TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
CXXScopeSpec &SS) {
// FIXME: Painfully copy-paste from the above!
- // TODO: in some cases, we might have some verification to do here.
- if (ObjectType.isNull()) {
- TypeLocBuilder TLB;
- TLB.reserve(TL.getFullDataSize());
- QualType Result = getDerived().TransformType(TLB, TL);
- if (Result.isNull())
- return TypeLoc();
-
- return TLB.getTypeSourceInfo(SemaRef.Context, Result)->getTypeLoc();
- }
-
QualType T = TL.getType();
if (getDerived().AlreadyTransformed(T))
return TL;
@@ -3308,12 +3297,9 @@ TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
= cast<DependentTemplateSpecializationTypeLoc>(TL);
TemplateName Template
- = SemaRef.Context.getDependentTemplateName(
- SpecTL.getTypePtr()->getQualifier(),
- SpecTL.getTypePtr()->getIdentifier());
-
- Template = getDerived().TransformTemplateName(Template, ObjectType,
- UnqualLookup);
+ = getDerived().RebuildTemplateName(SS.getScopeRep(), SS.getRange(),
+ *SpecTL.getTypePtr()->getIdentifier(),
+ ObjectType, UnqualLookup);
if (Template.isNull())
return TypeLoc();
@@ -7079,16 +7065,16 @@ TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
// the member name.
NamedDecl *FirstQualifierInScope
= getDerived().TransformFirstQualifierInScope(
- E->getFirstQualifierFoundInScope(),
- E->getQualifierRange().getBegin());
+ E->getFirstQualifierFoundInScope(),
+ E->getQualifierLoc().getBeginLoc());
- NestedNameSpecifier *Qualifier = 0;
+ NestedNameSpecifierLoc QualifierLoc;
if (E->getQualifier()) {
- Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
- E->getQualifierRange(),
- ObjectType,
- FirstQualifierInScope);
- if (!Qualifier)
+ QualifierLoc
+ = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
+ ObjectType,
+ FirstQualifierInScope);
+ if (!QualifierLoc)
return ExprError();
}
@@ -7107,7 +7093,7 @@ TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
if (!getDerived().AlwaysRebuild() &&
Base.get() == OldBase &&
BaseType == E->getBaseType() &&
- Qualifier == E->getQualifier() &&
+ QualifierLoc == E->getQualifierLoc() &&
NameInfo.getName() == E->getMember() &&
FirstQualifierInScope == E->getFirstQualifierFoundInScope())
return SemaRef.Owned(E);
@@ -7116,8 +7102,7 @@ TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
BaseType,
E->isArrow(),
E->getOperatorLoc(),
- Qualifier,
- E->getQualifierRange(),
+ QualifierLoc,
FirstQualifierInScope,
NameInfo,
/*TemplateArgs*/ 0);
@@ -7133,8 +7118,7 @@ TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
BaseType,
E->isArrow(),
E->getOperatorLoc(),
- Qualifier,
- E->getQualifierRange(),
+ QualifierLoc,
FirstQualifierInScope,
NameInfo,
&TransArgs);