]> granicus.if.org Git - clang/commitdiff
Tweak the CXXScopeSpec API a bit, so that we require the
authorDouglas Gregor <dgregor@apple.com>
Thu, 24 Feb 2011 00:49:34 +0000 (00:49 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 24 Feb 2011 00:49:34 +0000 (00:49 +0000)
nested-name-specifier and source range to be set at the same time.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126347 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Sema/DeclSpec.h
lib/Parse/ParseDecl.cpp
lib/Parse/ParseExprCXX.cpp
lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaExprCXX.cpp
lib/Sema/SemaOverload.cpp
lib/Sema/SemaTemplate.cpp
lib/Sema/SemaTemplateInstantiateDecl.cpp
lib/Sema/TreeTransform.h

index 05b9015fbd2b351acdebc08fbedc40fa4feace12..cb64d2585c54683bad21207de7d4c7cc2d6a7d03 100644 (file)
@@ -66,7 +66,6 @@ public:
   SourceLocation getEndLoc() const { return Range.getEnd(); }
 
   NestedNameSpecifier *getScopeRep() const { return ScopeRep; }
-  void setScopeRep(NestedNameSpecifier *S) { ScopeRep = S; }
 
   /// \brief Extend the current nested-name-specifier by another
   /// nested-name-specifier component of the form 'type::'.
@@ -116,6 +115,13 @@ public:
   /// nested-name-specifier '::'.
   void MakeGlobal(ASTContext &Context, SourceLocation ColonColonLoc);
   
+  /// \brief Adopt an existing nested-name-specifier and its source range
+  /// as our own.
+  void Adopt(NestedNameSpecifier *Qualifier, SourceRange R) {
+    ScopeRep = Qualifier;
+    Range = R;
+  }
+  
   /// No scope specifier.
   bool isEmpty() const { return !Range.isValid(); }
   /// A scope specifier is present, but may be valid or invalid.
index 60c3a4c262b1ef124180a47c64c3ca9e069389c2..caf7226c4d76e0807422ed66718f2289777a33b6 100644 (file)
@@ -956,8 +956,8 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
         goto DoneWithDeclSpec;
 
       CXXScopeSpec SS;
-      SS.setScopeRep((NestedNameSpecifier*) Tok.getAnnotationValue());
-      SS.setRange(Tok.getAnnotationRange());
+      SS.Adopt(static_cast<NestedNameSpecifier *>(Tok.getAnnotationValue()),
+               Tok.getAnnotationRange());
 
       // We are looking for a qualified typename.
       Token Next = NextToken();
index e12f62fb290f09466025b0179bce3df70098afa0..ee87135601173be9f39b0a9368f520cff43c7453 100644 (file)
@@ -65,8 +65,8 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS,
          "Call sites of this function should be guarded by checking for C++");
 
   if (Tok.is(tok::annot_cxxscope)) {
-    SS.setScopeRep(static_cast<NestedNameSpecifier*>(Tok.getAnnotationValue()));
-    SS.setRange(Tok.getAnnotationRange());
+    SS.Adopt(static_cast<NestedNameSpecifier*>(Tok.getAnnotationValue()),
+             Tok.getAnnotationRange());
     ConsumeToken();
     return false;
   }
index fbc2a466ee70b26d799d69d2aab1ab446170e408..30946224e588ec8b539cf53bc1da85db29fdc4f9 100644 (file)
@@ -5085,9 +5085,8 @@ BuildSingleCopyAssign(Sema &S, SourceLocation Loc, QualType T,
     // reference to operator=; this is required to suppress the virtual
     // call mechanism.
     CXXScopeSpec SS;
-    SS.setRange(Loc);
-    SS.setScopeRep(NestedNameSpecifier::Create(S.Context, 0, false, 
-                                               T.getTypePtr()));
+    SS.Adopt(NestedNameSpecifier::Create(S.Context, 0, false, T.getTypePtr()),
+             Loc);
     
     // Create the reference to operator=.
     ExprResult OpEqualRef
index a051661285d62ad84d539ff9d438021a21c0437a..c0e08c072068434a7b936e73547eda52c9ca098a 100644 (file)
@@ -107,7 +107,7 @@ ParsedType Sema::getDestructorName(SourceLocation TildeLoc,
       // Nothing left to do.
     } else if (LookAtPrefix && (Prefix = NNS->getPrefix())) {
       CXXScopeSpec PrefixSS;
-      PrefixSS.setScopeRep(Prefix);
+      PrefixSS.Adopt(Prefix, SS.getRange());
       LookupCtx = computeDeclContext(PrefixSS, EnteringContext);
       isDependent = isDependentScopeSpecifier(PrefixSS);
     } else if (ObjectTypePtr) {
index b8fd5a6f025d47fe961a04ae5c36fc4130a0b242..7d3de8dde08125f371fe9af78d0a244b871724a4 100644 (file)
@@ -7593,10 +7593,8 @@ BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn,
                       SourceLocation RParenLoc) {
 
   CXXScopeSpec SS;
-  if (ULE->getQualifier()) {
-    SS.setScopeRep(ULE->getQualifier());
-    SS.setRange(ULE->getQualifierRange());
-  }
+  if (ULE->getQualifier())
+    SS.Adopt(ULE->getQualifier(), ULE->getQualifierRange());
 
   TemplateArgumentListInfo TABuffer;
   const TemplateArgumentListInfo *ExplicitTemplateArgs = 0;
index f0a0103205d5a4e969bbf0fd13056d8e0fbdb414..ab6dde5eb189329f5752dc5b0a6137551d2677ac 100644 (file)
@@ -3610,7 +3610,7 @@ Sema::BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg,
         = NestedNameSpecifier::Create(Context, 0, false,
                                       ClassType.getTypePtr());
       CXXScopeSpec SS;
-      SS.setScopeRep(Qualifier);
+      SS.Adopt(Qualifier, Loc);
 
       // The actual value-ness of this is unimportant, but for
       // internal consistency's sake, references to instance methods
@@ -5997,8 +5997,7 @@ Sema::CheckTypenameType(ElaboratedTypeKeyword Keyword,
                         SourceLocation KeywordLoc, SourceRange NNSRange,
                         SourceLocation IILoc) {
   CXXScopeSpec SS;
-  SS.setScopeRep(NNS);
-  SS.setRange(NNSRange);
+  SS.Adopt(NNS, NNSRange);
 
   DeclContext *Ctx = computeDeclContext(SS);
   if (!Ctx) {
@@ -6177,7 +6176,7 @@ bool Sema::RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS) {
     Rebuilder.TransformNestedNameSpecifier(NNS, SS.getRange());
   if (!Rebuilt) return true;
 
-  SS.setScopeRep(Rebuilt);
+  SS.Adopt(Rebuilt, SS.getRange());
   return false;
 }
 
index c0150c07bbf1cd7f1b5b0eda6c194910f2b7545d..73511fbc7a45127c3fc3ac345939fb575eb642a0 100644 (file)
@@ -670,8 +670,7 @@ Decl *TemplateDeclInstantiator::VisitClassTemplateDecl(ClassTemplateDecl *D) {
   if (isFriend) {
     if (Qualifier) {
       CXXScopeSpec SS;
-      SS.setScopeRep(Qualifier);
-      SS.setRange(Pattern->getQualifierRange());
+      SS.Adopt(Qualifier, Pattern->getQualifierRange());
       DC = SemaRef.computeDeclContext(SS);
       if (!DC) return 0;
     } else {
@@ -984,8 +983,7 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D,
     DC = Owner;
   else if (isFriend && Qualifier) {
     CXXScopeSpec SS;
-    SS.setScopeRep(Qualifier);
-    SS.setRange(D->getQualifierRange());
+    SS.Adopt(Qualifier, D->getQualifierRange());
     DC = SemaRef.computeDeclContext(SS);
     if (!DC) return 0;
   } else {
@@ -1274,8 +1272,7 @@ TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D,
   if (isFriend) {
     if (Qualifier) {
       CXXScopeSpec SS;
-      SS.setScopeRep(Qualifier);
-      SS.setRange(D->getQualifierRange());
+      SS.Adopt(Qualifier, D->getQualifierRange());
       DC = SemaRef.computeDeclContext(SS);
 
       if (DC && SemaRef.RequireCompleteDeclContext(SS, DC))
@@ -1691,8 +1688,7 @@ Decl *TemplateDeclInstantiator::VisitUsingDecl(UsingDecl *D) {
                                        D->isTypeName());
 
   CXXScopeSpec SS;
-  SS.setScopeRep(NNS);
-  SS.setRange(D->getNestedNameRange());
+  SS.Adopt(NNS, D->getNestedNameRange());
 
   if (CheckRedeclaration) {
     Prev.setHideTags(false);
@@ -1760,8 +1756,7 @@ Decl * TemplateDeclInstantiator
     return 0;
 
   CXXScopeSpec SS;
-  SS.setRange(D->getTargetNestedNameRange());
-  SS.setScopeRep(NNS);
+  SS.Adopt(NNS, D->getTargetNestedNameRange());
 
   // Since NameInfo refers to a typename, it cannot be a C++ special name.
   // Hence, no tranformation is required for it.
@@ -1787,8 +1782,7 @@ Decl * TemplateDeclInstantiator
     return 0;
 
   CXXScopeSpec SS;
-  SS.setRange(D->getTargetNestedNameRange());
-  SS.setScopeRep(NNS);
+  SS.Adopt(NNS, D->getTargetNestedNameRange());
 
   DeclarationNameInfo NameInfo
     = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
index 92fd5084c13e5660c1bff6cc002f6f8dac3c1f2c..7a0754fc883234975c27cac2173c1beadb5b3841 100644 (file)
@@ -759,8 +759,7 @@ public:
                                     SourceRange NNSRange,
                                     SourceLocation IdLoc) {
     CXXScopeSpec SS;
-    SS.setScopeRep(NNS);
-    SS.setRange(NNSRange);
+    SS.Adopt(NNS, NNSRange);
 
     if (NNS->isDependent()) {
       // If the name is still dependent, just build a new dependent name type.
@@ -1243,8 +1242,7 @@ public:
                                 const DeclarationNameInfo &NameInfo,
                                 TemplateArgumentListInfo *TemplateArgs) {
     CXXScopeSpec SS;
-    SS.setScopeRep(Qualifier);
-    SS.setRange(QualifierRange);
+    SS.Adopt(Qualifier, QualifierRange);
 
     // FIXME: loses template args.
 
@@ -1383,8 +1381,7 @@ public:
 
     CXXScopeSpec SS;
     if (Qualifier) {
-      SS.setRange(QualifierRange);
-      SS.setScopeRep(Qualifier);
+      SS.Adopt(Qualifier, QualifierRange);
     }
 
     getSema().DefaultFunctionArrayConversion(Base);
@@ -1875,8 +1872,7 @@ public:
                                        const DeclarationNameInfo &NameInfo,
                               const TemplateArgumentListInfo *TemplateArgs) {
     CXXScopeSpec SS;
-    SS.setRange(QualifierRange);
-    SS.setScopeRep(NNS);
+    SS.Adopt(NNS, QualifierRange);
 
     if (TemplateArgs)
       return getSema().BuildQualifiedTemplateIdExpr(SS, NameInfo,
@@ -1961,8 +1957,7 @@ public:
                                    const DeclarationNameInfo &MemberNameInfo,
                               const TemplateArgumentListInfo *TemplateArgs) {
     CXXScopeSpec SS;
-    SS.setRange(QualifierRange);
-    SS.setScopeRep(Qualifier);
+    SS.Adopt(Qualifier, QualifierRange);
 
     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
                                             OperatorLoc, IsArrow,
@@ -1985,8 +1980,7 @@ public:
                                                LookupResult &R,
                                 const TemplateArgumentListInfo *TemplateArgs) {
     CXXScopeSpec SS;
-    SS.setRange(QualifierRange);
-    SS.setScopeRep(Qualifier);
+    SS.Adopt(Qualifier, QualifierRange);
 
     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
                                             OperatorLoc, IsArrow,
@@ -6449,10 +6443,8 @@ TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
   } else {
     // Look for a destructor known with the given name.
     CXXScopeSpec SS;
-    if (Qualifier) {
-      SS.setScopeRep(Qualifier);
-      SS.setRange(E->getQualifierRange());
-    }
+    if (Qualifier)
+      SS.Adopt(Qualifier, E->getQualifierRange());
     
     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
                                               *E->getDestroyedTypeIdentifier(),
@@ -6535,8 +6527,7 @@ TreeTransform<Derived>::TransformUnresolvedLookupExpr(
     if (!Qualifier)
       return ExprError();
     
-    SS.setScopeRep(Qualifier);
-    SS.setRange(Old->getQualifierRange());
+    SS.Adopt(Qualifier, Old->getQualifierRange());
   } 
   
   if (Old->getNamingClass()) {
@@ -7557,8 +7548,7 @@ TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
                                                    NamedDecl *FirstQualifierInScope) {
   CXXScopeSpec SS;
   // FIXME: The source location information is all wrong.
-  SS.setRange(Range);
-  SS.setScopeRep(Prefix);
+  SS.Adopt(Prefix, Range);
   if (SemaRef.BuildCXXNestedNameSpecifier(0, II, /*FIXME:*/Range.getBegin(),
                                           /*FIXME:*/Range.getEnd(),
                                           ObjectType, false,
@@ -7611,8 +7601,7 @@ TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
                                             QualType ObjectType,
                                             NamedDecl *FirstQualifierInScope) {
   CXXScopeSpec SS;
-  SS.setRange(QualifierRange);
-  SS.setScopeRep(Qualifier);
+  SS.Adopt(Qualifier, QualifierRange);
   UnqualifiedId Name;
   Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
   Sema::TemplateTy Template;
@@ -7632,8 +7621,7 @@ TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
                                             OverloadedOperatorKind Operator,
                                             QualType ObjectType) {
   CXXScopeSpec SS;
-  SS.setRange(SourceRange(getDerived().getBaseLocation()));
-  SS.setScopeRep(Qualifier);
+  SS.Adopt(Qualifier, SourceRange(getDerived().getBaseLocation()));
   UnqualifiedId Name;
   SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
   Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
@@ -7746,10 +7734,8 @@ TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
                                                        SourceLocation TildeLoc,
                                         PseudoDestructorTypeStorage Destroyed) {
   CXXScopeSpec SS;
-  if (Qualifier) {
-    SS.setRange(QualifierRange);
-    SS.setScopeRep(Qualifier);
-  }
+  if (Qualifier)
+    SS.Adopt(Qualifier, QualifierRange);
 
   QualType BaseType = Base->getType();
   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||