From: Chris Lattner Date: Fri, 12 Feb 2010 19:31:35 +0000 (+0000) Subject: fix a bug in SourceManager::getInstantiationLocSlowCase, where X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a5c6c5814b4c9f562247d2182eb59ccad128dbde;p=clang fix a bug in SourceManager::getInstantiationLocSlowCase, where we'd add an offset from the spelling location space to the instantiation location, which doesn't make sense and would lead up to the text diagnostics crashing when presented with non-sensical locations. This fixes rdar://7597492, a crash on 255.vortex. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96004 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp index 354bf7befb..b91671ad17 100644 --- a/lib/Basic/SourceManager.cpp +++ b/lib/Basic/SourceManager.cpp @@ -560,10 +560,14 @@ FileID SourceManager::getFileIDSlow(unsigned SLocOffset) const { SourceLocation SourceManager:: getInstantiationLocSlowCase(SourceLocation Loc) const { do { - std::pair LocInfo = getDecomposedLoc(Loc); - Loc = getSLocEntry(LocInfo.first).getInstantiation() + // Note: If Loc indicates an offset into a token that came from a macro + // expansion (e.g. the 5th character of the token) we do not want to add + // this offset when going to the instantiation location. The instatiation + // location is the macro invocation, which the offset has nothing to do + // with. This is unlike when we get the spelling loc, because the offset + // directly correspond to the token whose spelling we're inspecting. + Loc = getSLocEntry(getFileID(Loc)).getInstantiation() .getInstantiationLocStart(); - Loc = Loc.getFileLocWithOffset(LocInfo.second); } while (!Loc.isFileID()); return Loc; diff --git a/test/Misc/caret-diags-macros.c b/test/Misc/caret-diags-macros.c index 80371a94eb..e138f59d60 100644 --- a/test/Misc/caret-diags-macros.c +++ b/test/Misc/caret-diags-macros.c @@ -24,3 +24,12 @@ void bar() { C; } + +// rdar://7597492 +#define sprintf(str, A, B) \ +__builtin___sprintf_chk (str, 0, 42, A, B) + +void baz(char *Msg) { + sprintf(Msg, " sizeof FoooLib : =%3u\n", 12LL); +} +