diff options
-rw-r--r-- | lib/Lex/PPMacroExpansion.cpp | 21 | ||||
-rw-r--r-- | test/Modules/macros.c | 28 |
2 files changed, 24 insertions, 25 deletions
diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index bb2634ffb6..21451f581f 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -211,7 +211,9 @@ bool Preprocessor::isNextPPTokenLParen() { /// expanded as a macro, handle it and return the next token as 'Identifier'. bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, MacroDirective *MD) { - MacroInfo *MI = MD->getMacroInfo(); + MacroDirective::DefInfo Def = MD->getDefinition(); + assert(Def.isValid()); + MacroInfo *MI = Def.getMacroInfo(); // If this is a macro expansion in the "#if !defined(x)" line for the file, // then the macro could expand to different things in other contexts, we need @@ -286,25 +288,22 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, } } - // FIXME: Temporarily disable this warning that is currently bogus with a PCH - // that redefined a macro without undef'ing it first (test/PCH/macro-redef.c). -#if 0 // If the macro definition is ambiguous, complain. - if (MI->isAmbiguous()) { + if (Def.getDirective()->isAmbiguous()) { Diag(Identifier, diag::warn_pp_ambiguous_macro) << Identifier.getIdentifierInfo(); Diag(MI->getDefinitionLoc(), diag::note_pp_ambiguous_macro_chosen) << Identifier.getIdentifierInfo(); - for (MacroInfo *PrevMI = MI->getPreviousDefinition(); - PrevMI && PrevMI->isDefined(); - PrevMI = PrevMI->getPreviousDefinition()) { - if (PrevMI->isAmbiguous()) { - Diag(PrevMI->getDefinitionLoc(), diag::note_pp_ambiguous_macro_other) + for (MacroDirective::DefInfo PrevDef = Def.getPreviousDefinition(); + PrevDef && !PrevDef.isUndefined(); + PrevDef = PrevDef.getPreviousDefinition()) { + if (PrevDef.getDirective()->isAmbiguous()) { + Diag(PrevDef.getMacroInfo()->getDefinitionLoc(), + diag::note_pp_ambiguous_macro_other) << Identifier.getIdentifierInfo(); } } } -#endif // If we started lexing a macro, enter the macro expansion body. diff --git a/test/Modules/macros.c b/test/Modules/macros.c index 406e554a7a..c715ec9651 100644 --- a/test/Modules/macros.c +++ b/test/Modules/macros.c @@ -1,4 +1,3 @@ -// XFAIL: * // RUN: rm -rf %t // RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=macros_top %S/Inputs/module.map // RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodules-cache-path=%t -fmodule-name=macros_left %S/Inputs/module.map @@ -10,12 +9,12 @@ // These notes come from headers in modules, and are bogus. // FIXME: expected-note{{previous definition is here}} +// FIXME: expected-note{{previous definition is here}} expected-note{{expanding this definition of 'LEFT_RIGHT_DIFFERENT'}} +// expected-note{{other definition of 'TOP_RIGHT_REDEF'}} expected-note{{expanding this definition of 'LEFT_RIGHT_DIFFERENT2'}} // expected-note{{other definition of 'LEFT_RIGHT_DIFFERENT'}} -// expected-note{{expanding this definition of 'TOP_RIGHT_REDEF'}} -// FIXME: expected-note{{previous definition is here}} \ -// expected-note{{expanding this definition of 'LEFT_RIGHT_DIFFERENT'}} -// expected-note{{other definition of 'TOP_RIGHT_REDEF'}} + +// expected-note{{expanding this definition of 'TOP_RIGHT_REDEF'}} @import macros; @@ -80,8 +79,8 @@ void f() { # error TOP should be visible #endif -#ifdef TOP_LEFT_UNDEF -# error TOP_LEFT_UNDEF should not be visible +#ifndef TOP_LEFT_UNDEF +# error TOP_LEFT_UNDEF should still be defined #endif void test1() { @@ -89,7 +88,8 @@ void test1() { TOP_RIGHT_REDEF *ip = &i; } -#define LEFT_RIGHT_DIFFERENT2 double // FIXME: expected-warning{{'LEFT_RIGHT_DIFFERENT2' macro redefined}} +#define LEFT_RIGHT_DIFFERENT2 double // FIXME: expected-warning{{'LEFT_RIGHT_DIFFERENT2' macro redefined}} \ + // expected-note{{other definition of 'LEFT_RIGHT_DIFFERENT2'}} // Import right module (which also imports top) @import macros_right; @@ -112,11 +112,11 @@ void test2() { int i; float f; double d; - TOP_RIGHT_REDEF *ip = &i; // expected-warning{{ambiguous expansion of macro 'TOP_RIGHT_REDEF'}} + TOP_RIGHT_REDEF *fp = &f; // expected-warning{{ambiguous expansion of macro 'TOP_RIGHT_REDEF'}} - LEFT_RIGHT_IDENTICAL *ip2 = &i; - LEFT_RIGHT_DIFFERENT *fp = &f; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT'}} - LEFT_RIGHT_DIFFERENT2 *dp = &d; + LEFT_RIGHT_IDENTICAL *ip = &i; + LEFT_RIGHT_DIFFERENT *ip2 = &i; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT'}} + LEFT_RIGHT_DIFFERENT2 *ip3 = &i; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT2}} int LEFT_RIGHT_DIFFERENT3; } @@ -133,6 +133,6 @@ void test3() { @import macros_right.undef; -#ifdef TOP_RIGHT_UNDEF -# error TOP_RIGHT_UNDEF should not be defined +#ifndef TOP_RIGHT_UNDEF +# error TOP_RIGHT_UNDEF should still be defined #endif |