]> granicus.if.org Git - clang/commitdiff
When placing an annotation token over an existing annotation token, make sure that...
authorSebastian Redl <sebastian.redl@getdesigned.at>
Mon, 8 Feb 2010 19:35:18 +0000 (19:35 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Mon, 8 Feb 2010 19:35:18 +0000 (19:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95555 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Lex/Token.h
lib/Lex/PPCaching.cpp
lib/Parse/ParseTemplate.cpp
lib/Parse/Parser.cpp

index 604eae1027aad1857895c96890be05e80e929700..b5dde9a700e810f37a5bd758d1044d6fe8244048 100644 (file)
@@ -124,6 +124,10 @@ public:
     UintData = L.getRawEncoding();
   }
 
+  SourceLocation getLastLoc() const {
+    return isAnnotation() ? getAnnotationEndLoc() : getLocation();
+  }
+
   /// getAnnotationRange - SourceRange of the group of tokens that this
   /// annotation token represents.
   SourceRange getAnnotationRange() const {
index 7c3780ffc0ac74f6ef962763c5e78d7958851a64..6aeb6fa3a2f77704e2a36f02499eb9868c7305a3 100644 (file)
@@ -91,7 +91,7 @@ const Token &Preprocessor::PeekAhead(unsigned N) {
 void Preprocessor::AnnotatePreviousCachedTokens(const Token &Tok) {
   assert(Tok.isAnnotation() && "Expected annotation token");
   assert(CachedLexPos != 0 && "Expected to have some cached tokens");
-  assert(CachedTokens[CachedLexPos-1].getLocation() == Tok.getAnnotationEndLoc()
+  assert(CachedTokens[CachedLexPos-1].getLastLoc() == Tok.getAnnotationEndLoc()
          && "The annotation should be until the most recent cached token");
 
   // Start from the end of the cached tokens list and look for the token
index 797c1dfe3e6a9c9fc01868934e960094ff79f814..12f26bfcb94e42d767374dda38c20e427dc902f4 100644 (file)
@@ -836,7 +836,7 @@ void Parser::AnnotateTemplateIdTokenAsType(const CXXScopeSpec *SS) {
   Tok.setAnnotationValue(Type.isInvalid()? 0 : Type.get());
   if (SS && SS->isNotEmpty()) // it was a C++ qualified type name.
     Tok.setLocation(SS->getBeginLoc());
-  Tok.setAnnotationEndLoc(TemplateId->TemplateNameLoc);
+  // End location stays the same
 
   // Replace the template-id annotation token, and possible the scope-specifier
   // that precedes it, with the typename annotation token.
index 2558b6675812252d2d42139242507c36809c6b03..e5bed3096d5e615e8b5a44e983bbdf7e98716cc6 100644 (file)
@@ -944,9 +944,10 @@ bool Parser::TryAnnotateTypeOrScopeToken(bool EnteringContext) {
       return false;
     }
 
+    SourceLocation EndLoc = Tok.getLastLoc();
     Tok.setKind(tok::annot_typename);
     Tok.setAnnotationValue(Ty.isInvalid()? 0 : Ty.get());
-    Tok.setAnnotationEndLoc(Tok.getLocation());
+    Tok.setAnnotationEndLoc(EndLoc);
     Tok.setLocation(TypenameLoc);
     PP.AnnotateCachedTokens(Tok);
     return true;