diff options
-rw-r--r-- | test/Index/fix-its.c | 11 | ||||
-rw-r--r-- | tools/libclang/CIndex.cpp | 7 |
2 files changed, 14 insertions, 4 deletions
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); } |