diff options
author | David Malcolm <dmalcolm@redhat.com> | 2017-11-21 00:40:53 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2017-11-21 00:40:53 +0000 |
commit | 01ada12136c64ad9ff305f456637d43b9f6d4356 (patch) | |
tree | 2fd6c86557307e928d7444794521945cbde6d559 /libcpp/include | |
parent | 874b8068f6c4cab53b14b7d2db117abd71f7da95 (diff) | |
download | gcc-01ada12136c64ad9ff305f456637d43b9f6d4356.zip gcc-01ada12136c64ad9ff305f456637d43b9f6d4356.tar.gz gcc-01ada12136c64ad9ff305f456637d43b9f6d4356.tar.bz2 |
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.
From-SVN: r254978
Diffstat (limited to 'libcpp/include')
-rw-r--r-- | libcpp/include/cpplib.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 101b33a..4d04a48 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -889,6 +889,7 @@ extern const cpp_token *cpp_get_token_with_location (cpp_reader *, extern bool cpp_fun_like_macro_p (cpp_hashnode *); extern const unsigned char *cpp_macro_definition (cpp_reader *, cpp_hashnode *); +extern source_location cpp_macro_definition_location (cpp_hashnode *); extern void _cpp_backup_tokens (cpp_reader *, unsigned int); extern const cpp_token *cpp_peek_token (cpp_reader *, int); |