aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2018-04-12 23:44:09 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2018-04-12 23:44:09 +0000
commitb0cc1e5343e914ff0286d5608947274c62c3b448 (patch)
tree6207beaff213a6b74ad72a649609313b2fdda17c /gcc/cp
parentbc436e10e0b892b6953e19776367170cd982367c (diff)
downloadgcc-b0cc1e5343e914ff0286d5608947274c62c3b448.zip
gcc-b0cc1e5343e914ff0286d5608947274c62c3b448.tar.gz
gcc-b0cc1e5343e914ff0286d5608947274c62c3b448.tar.bz2
Prevent erroneous "macro had not yet been defined" messages (PR c++/85385)
PR c++/85385 reports an issue where we emit bogus "macro had not yet been defined" notes when a macro is mis-used: $ cat test.c #define MACRO(X,Y) void test () { MACRO(42); } $ ./xg++ -B. -c test.c test.c:5:11: error: macro "MACRO" requires 2 arguments, but only 1 given MACRO(42); ^ test.c: In function ‘void test()’: test.c:5:3: error: ‘MACRO’ was not declared in this scope MACRO(42); ^~~~~ test.c:5:3: note: test.c:1: note: it was later defined here #define MACRO(X,Y) The macro *had* been defined, it was merely misused. This patch fixes the issue by only issuing the note if the use location is before the definition location (using linemap_location_before_p). gcc/cp/ChangeLog: PR c++/85385 * name-lookup.c (macro_use_before_def::maybe_make): New function, checking that the use is indeed before the definition. (macro_use_before_def::macro_use_before_def): Make private. (macro_use_before_def::~macro_use_before_def): Make private. Move check for UNKNOWN_LOCATION to macro_use_before_def::maybe_make. (lookup_name_fuzzy): Call macro_use_before_def::maybe_make rather than using new directly. gcc/testsuite/ChangeLog: PR c++/85385 * g++.dg/diagnostic/macro-arg-count.C: New test. From-SVN: r259360
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog11
-rw-r--r--gcc/cp/name-lookup.c39
2 files changed, 40 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 08021df..5f29b0c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,14 @@
+2018-04-12 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/85385
+ * name-lookup.c (macro_use_before_def::maybe_make): New function,
+ checking that the use is indeed before the definition.
+ (macro_use_before_def::macro_use_before_def): Make private.
+ (macro_use_before_def::~macro_use_before_def): Make private. Move
+ check for UNKNOWN_LOCATION to macro_use_before_def::maybe_make.
+ (lookup_name_fuzzy): Call macro_use_before_def::maybe_make rather
+ than using new directly.
+
2018-04-12 Jason Merrill <jason@redhat.com>
PR c++/85356 - ICE with pointer to member function.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index ca77684..3f86cd2 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -5888,6 +5888,27 @@ consider_binding_level (tree name, best_match <tree, const char *> &bm,
class macro_use_before_def : public deferred_diagnostic
{
public:
+ /* Factory function. Return a new macro_use_before_def instance if
+ appropriate, or return NULL. */
+ static macro_use_before_def *
+ maybe_make (location_t use_loc, cpp_hashnode *macro)
+ {
+ source_location def_loc = cpp_macro_definition_location (macro);
+ if (def_loc == UNKNOWN_LOCATION)
+ return NULL;
+
+ /* We only want to issue a note if the macro was used *before* it was
+ defined.
+ We don't want to issue a note for cases where a macro was incorrectly
+ used, leaving it unexpanded (e.g. by using the wrong argument
+ count). */
+ if (!linemap_location_before_p (line_table, use_loc, def_loc))
+ return NULL;
+
+ return new macro_use_before_def (use_loc, macro);
+ }
+
+ private:
/* Ctor. LOC is the location of the usage. MACRO is the
macro that was used. */
macro_use_before_def (location_t loc, cpp_hashnode *macro)
@@ -5901,13 +5922,10 @@ class macro_use_before_def : public deferred_diagnostic
if (is_suppressed_p ())
return;
- source_location def_loc = cpp_macro_definition_location (m_macro);
- if (def_loc != UNKNOWN_LOCATION)
- {
- inform (get_location (), "the macro %qs had not yet been defined",
- (const char *)m_macro->ident.str);
- inform (def_loc, "it was later defined here");
- }
+ inform (get_location (), "the macro %qs had not yet been defined",
+ (const char *)m_macro->ident.str);
+ inform (cpp_macro_definition_location (m_macro),
+ "it was later defined here");
}
private:
@@ -5990,12 +6008,13 @@ lookup_name_fuzzy (tree name, enum lookup_name_fuzzy_kind kind, location_t loc)
bm.consider ((const char *)best_macro->ident.str);
else if (bmm.get_best_distance () == 0)
{
- /* If we have an exact match for a macro name, then the
- macro has been used before it was defined. */
+ /* If we have an exact match for a macro name, then either the
+ macro was used with the wrong argument count, or the macro
+ has been used before it was defined. */
cpp_hashnode *macro = bmm.blithely_get_best_candidate ();
if (macro && (macro->flags & NODE_BUILTIN) == 0)
return name_hint (NULL,
- new macro_use_before_def (loc, macro));
+ macro_use_before_def::maybe_make (loc, macro));
}
/* Try the "starts_decl_specifier_p" keywords to detect