forked from OSchip/llvm-project
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 llvm-svn: 354009
This commit is contained in:
parent
ee704c1d91
commit
023dd1eefa
|
@ -391,6 +391,7 @@ def warn_cxx98_compat_empty_fnmacro_arg : Warning<
|
|||
"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">;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -886,6 +886,8 @@ void Preprocessor::HandleDirective(Token &Result) {
|
|||
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:
|
||||
|
|
|
@ -492,10 +492,13 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
|
|||
// 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;
|
||||
|
|
|
@ -102,6 +102,7 @@ Preprocessor::Preprocessor(std::shared_ptr<PreprocessorOptions> PPOpts,
|
|||
DisableMacroExpansion = false;
|
||||
MacroExpansionInDirectivesOverride = false;
|
||||
InMacroArgs = false;
|
||||
ArgMacro = nullptr;
|
||||
InMacroArgPreExpansion = false;
|
||||
NumCachedTokenLexers = 0;
|
||||
PragmasEnabled = true;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue