From: Argyrios Kyrtzidis Date: Wed, 11 Apr 2012 18:15:01 +0000 (+0000) Subject: [libclang] In cxloc::translateSourceRange make sure to handle locations in macro... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eba8cd5967e47592285590360bde73063c9c226f;p=clang [libclang] In cxloc::translateSourceRange make sure to handle locations in macro arguments correctly. clang diagnostics can provide fixits inside a macro argument now. rdar://11014346 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154517 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Index/fix-its.c b/test/Index/fix-its.c index 6be7fa5a7e..d5cb1af854 100644 --- a/test/Index/fix-its.c +++ b/test/Index/fix-its.c @@ -8,7 +8,7 @@ struct X { void f(struct X *x) { // CHECK: error: no member named 'wobble' in 'struct X'; did you mean 'wibble'? - // CHECK: FIX-IT: Replace [13:12 - 13:24] with "wibble" + // CHECK: FIX-IT: Replace [13:12 - 13:18] with "wibble" // CHECK: note: 'wibble' declared here MACRO(x->wobble = 17); // CHECK: error: no member named 'wabble' in 'struct X'; did you mean 'wibble'? @@ -16,3 +16,12 @@ void f(struct X *x) { // CHECK: note: 'wibble' declared here x->wabble = 17; } + +int printf(const char *restrict, ...); + +void f2() { + unsigned long index; + // CHECK: warning: format specifies type 'int' but the argument has type 'unsigned long' + // CHECK: FIX-IT: Replace [26:17 - 26:19] with "%ld" + MACRO(printf("%d", index)); +} diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 67c56a2674..808de3d253 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -112,10 +112,11 @@ CXSourceRange cxloc::translateSourceRange(const SourceManager &SM, // We want the last character in this location, so we will adjust the // location accordingly. SourceLocation EndLoc = R.getEnd(); - if (EndLoc.isValid() && EndLoc.isMacroID()) + if (EndLoc.isValid() && EndLoc.isMacroID() && !SM.isMacroArgExpansion(EndLoc)) EndLoc = SM.getExpansionRange(EndLoc).second; - if (R.isTokenRange() && !EndLoc.isInvalid() && EndLoc.isFileID()) { - unsigned Length = Lexer::MeasureTokenLength(EndLoc, SM, LangOpts); + if (R.isTokenRange() && !EndLoc.isInvalid()) { + unsigned Length = Lexer::MeasureTokenLength(SM.getSpellingLoc(EndLoc), + SM, LangOpts); EndLoc = EndLoc.getLocWithOffset(Length); }