From: Richard Trieu Date: Thu, 3 May 2012 01:09:59 +0000 (+0000) Subject: Fix a note without a SourceLocation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7b0a3e378c441cec60f929d13bd48846c267a008;p=clang Fix a note without a SourceLocation. #define TEST int y; int x = y; void foo() { TEST } -Wuninitialized gives this warning: invalid-loc.cc:4:3: warning: variable 'y' is uninitialized when used here [-Wuninitialized] TEST ^~~~ invalid-loc.cc:2:29: note: expanded from macro 'TEST' #define TEST int y; int x = y; ^ note: initialize the variable 'y' to silence this warning 1 warning generated. The second note lacks filename, line number, and code snippet. This change will remove the fixit and only point to variable declaration. invalid-loc.cc:4:3: warning: variable 'y' is uninitialized when used here [-Wuninitialized] TEST ^~~~ invalid-loc.cc:2:29: note: expanded from macro 'TEST' #define TEST int y; int x = y; ^ invalid-loc.cc:4:3: note: variable 'y' is declared here TEST ^ invalid-loc.cc:2:14: note: expanded from macro 'TEST' #define TEST int y; int x = y; ^ 1 warning generated. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156045 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp index 0288621928..c3b802e4db 100644 --- a/lib/Sema/AnalysisBasedWarnings.cpp +++ b/lib/Sema/AnalysisBasedWarnings.cpp @@ -441,6 +441,11 @@ static bool SuggestInitializationFixit(Sema &S, const VarDecl *VD) { std::string Init = S.getFixItZeroInitializerForType(VariableTy); if (Init.empty()) return false; + + // Don't suggest a fixit inside macros. + if (VD->getLocEnd().isMacroID()) + return false; + SourceLocation Loc = S.PP.getLocForEndOfToken(VD->getLocEnd()); S.Diag(Loc, diag::note_var_fixit_add_initialization) << VD->getDeclName() diff --git a/test/Sema/uninit-variables.c b/test/Sema/uninit-variables.c index d62186df73..30db640323 100644 --- a/test/Sema/uninit-variables.c +++ b/test/Sema/uninit-variables.c @@ -424,3 +424,13 @@ void rdar9432305(float *P) { for (; i < 10000; ++i) // expected-warning {{variable 'i' is uninitialized when used here}} P[i] = 0.0f; } + +// Test that fixits are not emitted inside macros. +#define UNINIT(T, x, y) T x; T y = x; +#define ASSIGN(T, x, y) T y = x; +void test54() { + UNINIT(int, a, b); // expected-warning {{variable 'a' is uninitialized when used here}} \ + // expected-note {{variable 'a' is declared here}} + int c; // expected-note {{initialize the variable 'c' to silence this warning}} + ASSIGN(int, c, d); // expected-warning {{variable 'c' is uninitialized when used here}} +}