]> granicus.if.org Git - clang/commitdiff
Change SourceManager::getInstantiationLoc to take virtual locations, doing its
authorChris Lattner <sabre@nondot.org>
Sun, 15 Jul 2007 06:35:27 +0000 (06:35 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 15 Jul 2007 06:35:27 +0000 (06:35 +0000)
virtual->physical mapping explicitly.

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

Basic/SourceManager.cpp
Lex/MacroExpander.cpp
include/clang/Basic/SourceManager.h

index 2a9a553fccac87302de261a5e225a148a831fc38..a2520e3aff3e315b41054509221afdd28e0b5caa 100644 (file)
@@ -166,11 +166,12 @@ unsigned SourceManager::createFileID(const InfoRec *File,
 /// getInstantiationLoc - Return a new SourceLocation that encodes the fact
 /// that a token from physloc PhysLoc should actually be referenced from
 /// InstantiationLoc.
-SourceLocation SourceManager::getInstantiationLoc(SourceLocation PhysLoc,
+SourceLocation SourceManager::getInstantiationLoc(SourceLocation VirtLoc,
                                                   SourceLocation InstantLoc) {
-  assert(getFIDInfo(PhysLoc.getFileID())->IDType !=
-         SrcMgr::FileIDInfo::MacroExpansion &&
-         "Location instantiated in a macro?");
+  // The specified source location may be a mapped location, due to a macro
+  // instantiation or #line directive.  Strip off this information to find out
+  // where the characters are actually located.
+  SourceLocation PhysLoc = getPhysicalLoc(VirtLoc);
   
   // Resolve InstantLoc down to a real logical location.
   InstantLoc = getLogicalLoc(InstantLoc);
index 7a46b1429724aab3547c9035e7ef93c820ca70f7..c98949ec1d304104327270e89c6379e02ac52082 100644 (file)
@@ -499,8 +499,8 @@ void MacroExpander::Lex(LexerToken &Tok) {
     // The token could have come from a prior macro expansion.  In that case,
     // ignore the macro expand part to get to the physloc.  This happens for
     // stuff like:  #define A(X) X    A(A(X))    A(1)
-    SourceLocation PhysLoc = SrcMgr.getPhysicalLoc(Tok.getLocation());
-    Tok.setLocation(SrcMgr.getInstantiationLoc(PhysLoc, InstantiateLoc));
+    Tok.setLocation(SrcMgr.getInstantiationLoc(Tok.getLocation(), 
+                                               InstantiateLoc));
   }
   
   // If this is the first token, set the lexical properties of the token to
index e7f0d30a1fadf3b38e9b035a0ddd0987bb1d5d1a..741ca16913fabb53ee1c715112b09fdf85c39a72 100644 (file)
@@ -195,9 +195,8 @@ public:
   }
   
   /// getInstantiationLoc - Return a new SourceLocation that encodes the fact
-  /// that a token from physloc PhysLoc should actually be referenced from
-  /// InstantiationLoc.
-  SourceLocation getInstantiationLoc(SourceLocation PhysLoc,
+  /// that a token at Loc should actually be referenced from InstantiationLoc.
+  SourceLocation getInstantiationLoc(SourceLocation Loc,
                                      SourceLocation InstantiationLoc);
   
   /// getBuffer - Return the buffer for the specified FileID.