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