diff options
-rw-r--r-- | lib/Frontend/TextDiagnostic.cpp | 25 | ||||
-rw-r--r-- | test/Misc/caret-diags-macros.c | 58 | ||||
-rw-r--r-- | test/Misc/include-stack-for-note-flag.cpp | 4 | ||||
-rw-r--r-- | test/Misc/macro-backtrace.c | 22 |
4 files changed, 65 insertions, 44 deletions
diff --git a/lib/Frontend/TextDiagnostic.cpp b/lib/Frontend/TextDiagnostic.cpp index 7b3ebc4cd6..8dab0afcac 100644 --- a/lib/Frontend/TextDiagnostic.cpp +++ b/lib/Frontend/TextDiagnostic.cpp @@ -689,6 +689,9 @@ void TextDiagnostic::emitMacroExpansionsAndCarets( emitMacroExpansionsAndCarets(OneLevelUp, Level, Ranges, Hints, MacroDepth, OnMacroInst + 1); + // Save the original location so we can find the spelling of the macro call. + SourceLocation MacroLoc = Loc; + // Map the location. Loc = getImmediateMacroCalleeLoc(SM, Loc); @@ -726,9 +729,27 @@ void TextDiagnostic::emitMacroExpansionsAndCarets( return; } - // FIXME: Format an actual diagnostic rather than a hard coded string. + // Walk past macro argument expanions. + while (SM.isMacroArgExpansion(MacroLoc)) + MacroLoc = SM.getImmediateExpansionRange(MacroLoc).first; + + // Find the spelling location of the start of the non-argument expansion + // range. This is where the macro name was spelled in order to begin + // expanding this macro. + MacroLoc = SM.getSpellingLoc(SM.getImmediateExpansionRange(MacroLoc).first); + + // Dig out the buffer where the macro name was spelled and the extents of the + // name so that we can render it into the expansion note. + std::pair<FileID, unsigned> ExpansionInfo = SM.getDecomposedLoc(MacroLoc); + unsigned MacroTokenLength = Lexer::MeasureTokenLength(MacroLoc, SM, LangOpts); + StringRef ExpansionBuffer = SM.getBufferData(ExpansionInfo.first); + + llvm::SmallString<100> MessageStorage; + llvm::raw_svector_ostream Message(MessageStorage); + Message << "expanded from macro: " + << ExpansionBuffer.substr(ExpansionInfo.second, MacroTokenLength); emitDiagnostic(SM.getSpellingLoc(Loc), DiagnosticsEngine::Note, - "expanded from:", + Message.str(), Ranges, ArrayRef<FixItHint>()); } diff --git a/test/Misc/caret-diags-macros.c b/test/Misc/caret-diags-macros.c index 3d2e576d64..38a1e9946b 100644 --- a/test/Misc/caret-diags-macros.c +++ b/test/Misc/caret-diags-macros.c @@ -6,8 +6,8 @@ void foo() { M1( M2); // CHECK: :7:{{[0-9]+}}: warning: expression result unused - // CHECK: :4:{{[0-9]+}}: note: expanded from: - // CHECK: :3:{{[0-9]+}}: note: expanded from: + // CHECK: :4:{{[0-9]+}}: note: expanded from macro: M2 + // CHECK: :3:{{[0-9]+}}: note: expanded from macro: M1 } #define A 1 @@ -16,9 +16,9 @@ void foo() { void bar() { C; // CHECK: :17:3: warning: expression result unused - // CHECK: :15:11: note: expanded from: - // CHECK: :14:11: note: expanded from: - // CHECK: :13:11: note: expanded from: + // CHECK: :15:11: note: expanded from macro: C + // CHECK: :14:11: note: expanded from macro: B + // CHECK: :13:11: note: expanded from macro: A } // rdar://7597492 @@ -46,28 +46,28 @@ void test() { // its easy to FileCheck. // CHECK-NEXT: macro_args3(1); // CHECK-NEXT: ~~~~~~~~~~~~^~ - // CHECK: {{.*}}:36:36: note: expanded from: - // CHECK: {{.*}}:35:36: note: expanded from: - // CHECK: {{.*}}:34:24: note: expanded from: + // CHECK: {{.*}}:36:36: note: expanded from macro: macro_args3 + // CHECK: {{.*}}:35:36: note: expanded from macro: macro_args2 + // CHECK: {{.*}}:34:24: note: expanded from macro: macro_args1 macro_many_args3( 1, 2, 3); // CHECK: {{.*}}:55:5: warning: expression result unused - // CHECK: {{.*}}:40:55: note: expanded from: - // CHECK: {{.*}}:39:55: note: expanded from: - // CHECK: {{.*}}:38:35: note: expanded from: + // CHECK: {{.*}}:40:55: note: expanded from macro: macro_many_args3 + // CHECK: {{.*}}:39:55: note: expanded from macro: macro_many_args2 + // CHECK: {{.*}}:38:35: note: expanded from macro: macro_many_args1 macro_many_args3( 1, M2, 3); // CHECK: {{.*}}:64:5: warning: expression result unused - // CHECK: {{.*}}:4:12: note: expanded from: - // CHECK: {{.*}}:40:55: note: expanded from: - // CHECK: {{.*}}:39:55: note: expanded from: - // CHECK: {{.*}}:38:35: note: expanded from: + // CHECK: {{.*}}:4:12: note: expanded from macro: M2 + // CHECK: {{.*}}:40:55: note: expanded from macro: macro_many_args3 + // CHECK: {{.*}}:39:55: note: expanded from macro: macro_many_args2 + // CHECK: {{.*}}:38:35: note: expanded from macro: macro_many_args1 macro_many_args3( 1, @@ -78,11 +78,11 @@ void test() { // arguments. // CHECK-NEXT: macro_args2(2), // CHECK-NEXT: ~~~~~~~~~~~~^~~ - // CHECK: {{.*}}:35:36: note: expanded from: - // CHECK: {{.*}}:34:24: note: expanded from: - // CHECK: {{.*}}:40:55: note: expanded from: - // CHECK: {{.*}}:39:55: note: expanded from: - // CHECK: {{.*}}:38:35: note: expanded from: + // CHECK: {{.*}}:35:36: note: expanded from macro: macro_args2 + // CHECK: {{.*}}:34:24: note: expanded from macro: macro_args1 + // CHECK: {{.*}}:40:55: note: expanded from macro: macro_many_args3 + // CHECK: {{.*}}:39:55: note: expanded from macro: macro_many_args2 + // CHECK: {{.*}}:38:35: note: expanded from macro: macro_many_args1 } #define variadic_args1(x, y, ...) y @@ -94,9 +94,9 @@ void test2() { // CHECK: {{.*}}:93:21: warning: expression result unused // CHECK-NEXT: variadic_args3(1, 2, 3, 4); // CHECK-NEXT: ~~~~~~~~~~~~~~~~~~^~~~~~~~ - // CHECK: {{.*}}:90:53: note: expanded from: - // CHECK: {{.*}}:89:50: note: expanded from: - // CHECK: {{.*}}:88:35: note: expanded from: + // CHECK: {{.*}}:90:53: note: expanded from macro: variadic_args3 + // CHECK: {{.*}}:89:50: note: expanded from macro: variadic_args2 + // CHECK: {{.*}}:88:35: note: expanded from macro: variadic_args1 } #define variadic_pasting_args1(x, y, z) y @@ -108,13 +108,13 @@ void test2() { void test3() { variadic_pasting_args3(1, 2, 3, 4); // CHECK: {{.*}}:109:32: warning: expression result unused - // CHECK: {{.*}}:105:72: note: expanded from: - // CHECK: {{.*}}:103:68: note: expanded from: - // CHECK: {{.*}}:102:41: note: expanded from: + // CHECK: {{.*}}:105:72: note: expanded from macro: variadic_pasting_args3 + // CHECK: {{.*}}:103:68: note: expanded from macro: variadic_pasting_args2 + // CHECK: {{.*}}:102:41: note: expanded from macro: variadic_pasting_args1 variadic_pasting_args3a(1, 2, 3, 4); // CHECK: {{.*}}:115:30: warning: expression result unused - // CHECK: {{.*}}:106:71: note: expanded from: - // CHECK: {{.*}}:104:70: note: expanded from: - // CHECK: {{.*}}:102:41: note: expanded from: + // CHECK: {{.*}}:106:71: note: expanded from macro: variadic_pasting_args3a + // CHECK: {{.*}}:104:70: note: expanded from macro: variadic_pasting_args2a + // CHECK: {{.*}}:102:41: note: expanded from macro: variadic_pasting_args1 } diff --git a/test/Misc/include-stack-for-note-flag.cpp b/test/Misc/include-stack-for-note-flag.cpp index cfec5066a0..7058cb0774 100644 --- a/test/Misc/include-stack-for-note-flag.cpp +++ b/test/Misc/include-stack-for-note-flag.cpp @@ -18,11 +18,11 @@ bool macro(int x, int y) { // STACK: note: candidate function not viable // STACK: error: comparison between pointer and integer // STACK: In file included from -// STACK: note: expanded from: +// STACK: note: expanded from macro: // STACKLESS: error: no matching function for call to 'foo' // STACKLESS-NOT: In file included from // STACKLESS: note: candidate function not viable // STACKLESS: error: comparison between pointer and integer // STACKLESS-NOT: In file included from -// STACKLESS: note: expanded from: +// STACKLESS: note: expanded from macro: diff --git a/test/Misc/macro-backtrace.c b/test/Misc/macro-backtrace.c index a76d4d22e3..f292519e33 100644 --- a/test/Misc/macro-backtrace.c +++ b/test/Misc/macro-backtrace.c @@ -20,16 +20,16 @@ void f(int *ip, float *fp) { // RUN: | FileCheck %s -check-prefix=CHECK-LIMIT // CHECK-LIMIT: macro-backtrace.c:18:7: warning: comparison of distinct pointer types ('int *' and 'float *') // CHECK-LIMIT: if (M12(ip, fp)) { } - // CHECK-LIMIT: macro-backtrace.c:15:19: note: expanded from: + // CHECK-LIMIT: macro-backtrace.c:15:19: note: expanded from macro: M12 // CHECK-LIMIT: #define M12(A, B) M11(A, B) - // CHECK-LIMIT: macro-backtrace.c:14:19: note: expanded from: + // CHECK-LIMIT: macro-backtrace.c:14:19: note: expanded from macro: M11 // CHECK-LIMIT: #define M11(A, B) M10(A, B) // CHECK-LIMIT: note: (skipping 7 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all) - // CHECK-LIMIT: macro-backtrace.c:6:18: note: expanded from: + // CHECK-LIMIT: macro-backtrace.c:6:18: note: expanded from macro: M3 // CHECK-LIMIT: #define M3(A, B) M2(A, B) - // CHECK-LIMIT: macro-backtrace.c:5:18: note: expanded from: + // CHECK-LIMIT: macro-backtrace.c:5:18: note: expanded from macro: M2 // CHECK-LIMIT: #define M2(A, B) M1(A, B) - // CHECK-LIMIT: macro-backtrace.c:4:23: note: expanded from: + // CHECK-LIMIT: macro-backtrace.c:4:23: note: expanded from macro: M1 // CHECK-LIMIT: #define M1(A, B) ((A) < (B)) // FIXME: We should have higher quality messages, especially when caret @@ -37,11 +37,11 @@ void f(int *ip, float *fp) { // RUN: %clang_cc1 -fsyntax-only -fno-caret-diagnostics %s 2>&1 \ // RUN: | FileCheck %s -check-prefix=CHECK-NO-CARETS // CHECK-NO-CARETS: macro-backtrace.c:18:7: warning: comparison of distinct pointer types ('int *' and 'float *') - // CHECK-NO-CARETS-NEXT: macro-backtrace.c:15:19: note: expanded from: - // CHECK-NO-CARETS-NEXT: macro-backtrace.c:14:19: note: expanded from: - // CHECK-NO-CARETS-NEXT: macro-backtrace.c:13:19: note: expanded from: + // CHECK-NO-CARETS-NEXT: macro-backtrace.c:15:19: note: expanded from macro: M12 + // CHECK-NO-CARETS-NEXT: macro-backtrace.c:14:19: note: expanded from macro: M11 + // CHECK-NO-CARETS-NEXT: macro-backtrace.c:13:19: note: expanded from macro: M10 // CHECK-NO-CARETS-NEXT: note: (skipping 6 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all) - // CHECK-NO-CARETS-NEXT: macro-backtrace.c:6:18: note: expanded from: - // CHECK-NO-CARETS-NEXT: macro-backtrace.c:5:18: note: expanded from: - // CHECK-NO-CARETS-NEXT: macro-backtrace.c:4:23: note: expanded from: + // CHECK-NO-CARETS-NEXT: macro-backtrace.c:6:18: note: expanded from macro: M3 + // CHECK-NO-CARETS-NEXT: macro-backtrace.c:5:18: note: expanded from macro: M2 + // CHECK-NO-CARETS-NEXT: macro-backtrace.c:4:23: note: expanded from macro: M1 } |