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);
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>());
}
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
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
// 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,
// 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
// 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
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
}
// 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
// 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
}