From 0ee8de7fe9c1fb74574c62b9d59ffe46a94435f4 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Fri, 14 Dec 2012 18:53:47 +0000 Subject: [PATCH] [preprocessor] For errors at a function macro invocation, also include a note about where the macro is defined. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@170228 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/PPMacroExpansion.cpp | 8 ++++++++ test/Preprocessor/macro_fn.c | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index a551b897e2..5582100918 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -517,6 +517,8 @@ MacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, if (Tok.is(tok::eof) || Tok.is(tok::eod)) { // "#if f(" & "#if f(\n" Diag(MacroName, diag::err_unterm_macro_invoc); + Diag(MI->getDefinitionLoc(), diag::note_macro_here) + << MacroName.getIdentifierInfo(); // Do not lose the EOF/EOD. Return it to the client. MacroName = Tok; return 0; @@ -575,6 +577,8 @@ MacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, // Emit the diagnostic at the macro name in case there is a missing ). // Emitting it at the , could be far away from the macro name. Diag(ArgStartLoc, diag::err_too_many_args_in_macro_invoc); + Diag(MI->getDefinitionLoc(), diag::note_macro_here) + << MacroName.getIdentifierInfo(); return 0; } @@ -638,6 +642,8 @@ MacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, } else { // Otherwise, emit the error. Diag(Tok, diag::err_too_few_args_in_macro_invoc); + Diag(MI->getDefinitionLoc(), diag::note_macro_here) + << MacroName.getIdentifierInfo(); return 0; } @@ -657,6 +663,8 @@ MacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, // Emit the diagnostic at the macro name in case there is a missing ). // Emitting it at the , could be far away from the macro name. Diag(MacroName, diag::err_too_many_args_in_macro_invoc); + Diag(MI->getDefinitionLoc(), diag::note_macro_here) + << MacroName.getIdentifierInfo(); return 0; } diff --git a/test/Preprocessor/macro_fn.c b/test/Preprocessor/macro_fn.c index 8ac9ed9a24..fcdb90ad57 100644 --- a/test/Preprocessor/macro_fn.c +++ b/test/Preprocessor/macro_fn.c @@ -1,9 +1,9 @@ /* RUN: %clang_cc1 %s -Eonly -std=c89 -pedantic -verify */ /* PR3937 */ -#define zero() 0 -#define one(x) 0 -#define two(x, y) 0 +#define zero() 0 /* expected-note 2 {{defined here}} */ +#define one(x) 0 /* expected-note 2 {{defined here}} */ +#define two(x, y) 0 /* expected-note 4 {{defined here}} */ #define zero_dot(...) 0 /* expected-warning {{variadic macros are a C99 feature}} */ #define one_dot(x, ...) 0 /* expected-warning {{variadic macros are a C99 feature}} expected-note 2{{macro 'one_dot' defined here}} */ -- 2.40.0