Author: nico Date: Wed Feb 13 20:13:17 2019 New Revision: 354009 URL: http://llvm.org/viewvc/llvm-project?rev=354009&view=rev Log: Print a note to the called macro when diagnosing err_embedded_directive
Fixes PR40713, see there for the motivation for this. Differential Revision: https://reviews.llvm.org/D58161 Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td cfe/trunk/include/clang/Lex/Preprocessor.h cfe/trunk/lib/Lex/PPDirectives.cpp cfe/trunk/lib/Lex/PPMacroExpansion.cpp cfe/trunk/lib/Lex/Preprocessor.cpp cfe/trunk/test/Preprocessor/macro_arg_directive.c Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=354009&r1=354008&r2=354009&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Wed Feb 13 20:13:17 2019 @@ -391,6 +391,7 @@ def warn_cxx98_compat_empty_fnmacro_arg "empty macro arguments are incompatible with C++98">, InGroup<CXX98CompatPedantic>, DefaultIgnore; def note_macro_here : Note<"macro %0 defined here">; +def note_macro_expansion_here : Note<"expansion of macro %0 requested here">; def err_pp_opencl_variadic_macros : Error<"variadic macros not supported in OpenCL">; Modified: cfe/trunk/include/clang/Lex/Preprocessor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=354009&r1=354008&r2=354009&view=diff ============================================================================== --- cfe/trunk/include/clang/Lex/Preprocessor.h (original) +++ cfe/trunk/include/clang/Lex/Preprocessor.h Wed Feb 13 20:13:17 2019 @@ -173,6 +173,9 @@ class Preprocessor { IdentifierInfo *Ident__is_target_os; // __is_target_os IdentifierInfo *Ident__is_target_environment; // __is_target_environment + // Weak, only valid (and set) while InMacroArgs is true. + Token* ArgMacro; + SourceLocation DATELoc, TIMELoc; // Next __COUNTER__ value, starts at 0. Modified: cfe/trunk/lib/Lex/PPDirectives.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=354009&r1=354008&r2=354009&view=diff ============================================================================== --- cfe/trunk/lib/Lex/PPDirectives.cpp (original) +++ cfe/trunk/lib/Lex/PPDirectives.cpp Wed Feb 13 20:13:17 2019 @@ -886,6 +886,8 @@ void Preprocessor::HandleDirective(Token case tok::pp___include_macros: case tok::pp_pragma: Diag(Result, diag::err_embedded_directive) << II->getName(); + Diag(*ArgMacro, diag::note_macro_expansion_here) + << ArgMacro->getIdentifierInfo(); DiscardUntilEndOfDirective(); return; default: Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=354009&r1=354008&r2=354009&view=diff ============================================================================== --- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original) +++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Wed Feb 13 20:13:17 2019 @@ -492,10 +492,13 @@ bool Preprocessor::HandleMacroExpandedId // Preprocessor directives used inside macro arguments are not portable, and // this enables the warning. InMacroArgs = true; + ArgMacro = &Identifier; + Args = ReadMacroCallArgumentList(Identifier, MI, ExpansionEnd); // Finished parsing args. InMacroArgs = false; + ArgMacro = nullptr; // If there was an error parsing the arguments, bail out. if (!Args) return true; Modified: cfe/trunk/lib/Lex/Preprocessor.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Preprocessor.cpp?rev=354009&r1=354008&r2=354009&view=diff ============================================================================== --- cfe/trunk/lib/Lex/Preprocessor.cpp (original) +++ cfe/trunk/lib/Lex/Preprocessor.cpp Wed Feb 13 20:13:17 2019 @@ -102,6 +102,7 @@ Preprocessor::Preprocessor(std::shared_p DisableMacroExpansion = false; MacroExpansionInDirectivesOverride = false; InMacroArgs = false; + ArgMacro = nullptr; InMacroArgPreExpansion = false; NumCachedTokenLexers = 0; PragmasEnabled = true; Modified: cfe/trunk/test/Preprocessor/macro_arg_directive.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/macro_arg_directive.c?rev=354009&r1=354008&r2=354009&view=diff ============================================================================== --- cfe/trunk/test/Preprocessor/macro_arg_directive.c (original) +++ cfe/trunk/test/Preprocessor/macro_arg_directive.c Wed Feb 13 20:13:17 2019 @@ -8,7 +8,7 @@ a(n = _Static_assert(n == 5, ""); #define M(A) -M( +M( // expected-note {{expansion of macro 'M' requested here}} #pragma pack(pop) // expected-error {{embedding a #pragma directive within macro arguments is not supported}} ) @@ -18,7 +18,7 @@ void fail(const char *); ({ int result = 0; __VA_ARGS__; if (!result) { fail(#__VA_ARGS__); }; result }) static inline int f(int k) { - return MUNCH( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{returning 'void'}} + return MUNCH( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{returning 'void'}} expected-note {{expansion of macro 'MUNCH' requested here}} if (k < 3) result = 24; else if (k > 4) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits