C++: provide macro used-before-defined hint (PR c++/72786)
commitdbfb2c436f818142ab4d441f22cd1d9a8747af9e
authordmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 Nov 2017 00:40:53 +0000 (21 00:40 +0000)
committerdmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 Nov 2017 00:40:53 +0000 (21 00:40 +0000)
tree2fd6c86557307e928d7444794521945cbde6d559
parent69eab567dcc51ec88d4f482c82d80aa01c3fcdd7
C++: provide macro used-before-defined hint (PR c++/72786)

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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@254978 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/spellcheck.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/spellcheck-macro-ordering-2.C [copied from gcc/testsuite/g++.dg/spellcheck-macro-ordering.C with 53% similarity]
gcc/testsuite/g++.dg/spellcheck-macro-ordering.C
libcpp/ChangeLog
libcpp/include/cpplib.h
libcpp/macro.c