On 05/05/2017 11:51 AM, David Malcolm wrote:
> This patch uses the name_hint/deferred_diagnostic to provide
> a message in the C++ frontend if a macro is used before it is defined
> e.g.:
> 
> test.c:6:24: error: expected ‘;’ at end of member declaration
>    virtual void clone() const OVERRIDE { }
>                         ^~~~~
>                              ;
> test.c:6:30: error: ‘OVERRIDE’ does not name a type
>    virtual void clone() const OVERRIDE { }
>                               ^~~~~~~~
> test.c:6:30: note: the macro ‘OVERRIDE’ had not yet been defined
> test.c:15:0: note: it was later defined here
>  #define OVERRIDE override
> 
> It's possible to do it from the C++ frontend as tokenization happens
> up-front (and hence the macro already exists when the above is parsed);
> I attempted to do it from the C frontend, but because the C frontend only
> tokenizes on-demand during parsing, the macro isn't known about until
> later.
> 
> gcc/cp/ChangeLog:
>       PR c++/72786
>       * name-lookup.c (class macro_use_before_def): New class.
>       (lookup_name_fuzzy): Detect macro that were used before being
>       defined, and report them as such.
> 
> gcc/ChangeLog:
>       PR c++/72786
>       * spellcheck.h (best_match::blithely_get_best_candidate): New
>       accessor.
> 
> gcc/testsuite/ChangeLog:
>       PR c++/72786
>       * g++.dg/spellcheck-macro-ordering-2.C: New test case.
>       * g++.dg/spellcheck-macro-ordering.C: Add dg-message directives
>       for macro used-before-defined.
> 
> libcpp/ChangeLog:
>       PR c++/72786
>       * include/cpplib.h (cpp_macro_definition_location): New decl.
>       * macro.c (cpp_macro_definition): New function.
This is fine once the prereq is approved.

jeff

Reply via email to