[cfe-dev] -Wheader-guard emits warning after #undef of guard macro

Prathamesh Kulkarni bilbotheelffriend at gmail.com
Thu Jan 16 04:27:38 PST 2014


On Thu, Jan 16, 2014 at 3:09 AM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Mon, Jan 13, 2014 at 9:58 PM, Prathamesh Kulkarni
> <bilbotheelffriend at gmail.com> wrote:
>>
>> On Tue, Jan 14, 2014 at 1:57 AM, Richard Trieu <rtrieu at google.com> wrote:
>> > Prathamesh,
>> >
>> > Can you tell me more about your use case?  Is this a common pattern you
>> > have
>> > encountered?
>> Um no, it's a contrived test case.
>
>
> Is this a reduction of a real problem? (This seems like a somewhat
> legitimate complaint either way -- a macro that gets undefined probably
> wasn't an include guard -- but if this actually occurs in the wild, it would
> make this a higher priority issue.)
>
No, it was a contrived test case.
I added DefinedMacro->hasMacroDefinition() and it worked for me.

Index: PPLexerChange.cpp
===================================================================
--- PPLexerChange.cpp (revision 199001)
+++ PPLexerChange.cpp (working copy)
@@ -291,6 +291,7 @@ bool Preprocessor::HandleEndOfFile(Token
               CurPPLexer->MIOpt.GetDefinedMacro()) {
           if (!ControllingMacro->hasMacroDefinition() &&
               DefinedMacro != ControllingMacro &&
+              DefinedMacro->hasMacroDefinition() &&
               HeaderInfo.FirstTimeLexingFile(FE)) {

             // If the edit distance between the two macros is more than 50%,


>>
>> #ifndef Macro1
>> #define Macro2
>> Should warning be suppressed, if Macro2 gets undefined later in the
>> same header ?
>> eg:  (they are literally named Macro1 and Macro2)
>> #ifndef Macro1
>> #define Macro2
>> ...
>> #undef Macro2
>> #endif
>>
>> Is it better to suppress the warning because it's equivalent to:
>> #ifndef Macro1
>> #endif
>>
>> >
>> > The header guard warning triggers on files with the following format:
>> >
>> > // Start of file
>> > #ifndef Macro1
>> > #define Macro2
>> > ...
>> > #endif // matches the #ifndef on the first line.
>> > // End of file
>> >
>> > and warns when Macro1 and Macro2 are close, but not exactly the same.
>> > The
>> > warning already ignores cases where Macro1 and Macro2 are very different
>> > (edit distance is over half the length).  A similar exemption maybe be
>> > warranted in this case too.
>>
>> Thanks for pointing that out. However that's not the issue.
>> Could you please explain in short heuristics used by clang to decide
>> when the two macros are
>> "sufficiently" different ? Thanks ;)
>>
>> >
>> > Richard
>> >
>> >
>> > On Mon, Jan 13, 2014 at 3:06 AM, Prathamesh Kulkarni
>> > <bilbotheelffriend at gmail.com> wrote:
>> >>
>> >> For the following test-case:
>> >> #ifndef FOO
>> >> #define FOO2
>> >>
>> >> #undef FOO2
>> >> #endif
>> >>
>> >> -Wheader-guard emits warning:
>> >> ./foo.h:4:9: warning: 'FOO' is used as a header guard here, followed
>> >> by #define of a different macro [-Wheader-guard]
>> >> #ifndef FOO
>> >>         ^~~
>> >> ./foo.h:5:9: note: 'FOO2' is defined here; did you mean 'FOO'?
>> >> #define FOO2
>> >>         ^~~~
>> >>
>> >> Is this appropriate or should it suppress warning in this case
>> >> since it's equivalent to the following: ?
>> >> #ifndef FOO
>> >> #endif
>> >>
>> >> Thanks and Regards,
>> >> Prathamesh
>> >> _______________________________________________
>> >> cfe-dev mailing list
>> >> cfe-dev at cs.uiuc.edu
>> >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>> >
>> >
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>



More information about the cfe-dev mailing list