#define A(a)
#define A(b)

g++-4.3  -S t.C
t.C:2:1: error: "A" redefined
t.C:1:1: error: this is the location of the previous definition

We check the parameter names before the expansion, but if the expansion is
empty in both cases there is no need to warn about different names.

Of course watch out to still warn for

#define A(a) a
#define A(b) a

which is why this only works for empty macros.  The following would work
for example:

Index: macro.c
===================================================================
--- macro.c     (revision 129646)
+++ macro.c     (working copy)
@@ -1281,6 +1281,12 @@ warn_of_redefinition (cpp_reader *pfile,
       || macro1->variadic != macro2->variadic)
     return true;

+  /* If the macro expansion has no tokens there is no need to compare
+     parameters spellings.  */
+  if (macro1->count == 0
+      && macro2->count == 0)
+    return false;
+
   /* Check parameter spellings.  */
   for (i = 0; i < macro1->paramc; i++)
     if (macro1->params[i] != macro2->params[i])


-- 
           Summary: Empty macro definitions not considered equal
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Keywords: diagnostic
          Severity: normal
          Priority: P3
         Component: preprocessor
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rguenth at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33907

Reply via email to