> On Fri, Apr 10, 2015 at 11:18:39AM -0400, Trevor Saunders wrote:
> > On Fri, Apr 10, 2015 at 03:59:19PM +0200, Toon Moene wrote:
> > > Like this:
> > > 
> > > https://gcc.gnu.org/ml/gcc-testresults/2015-04/msg01086.html
> > > 
> > > ODR rears its head again ...
> > 
> >  huh, why is c/c-lang.h getting included in files linked into cc1plus?
> >  that seems strange.
> 
> readelf -wl cc1plus | grep c-lang.h
> doesn't show anything.

I tried to reproduce it and my bootstrap passes with same options as Toon's
The following patch ought to be able to tell the particular translation unit
causing the conflict.

Index: tree.c
===================================================================
--- tree.c      (revision 221977)
+++ tree.c      (working copy)
@@ -4679,6 +4679,8 @@ build_translation_unit_decl (tree name)
   tree tu = build_decl (UNKNOWN_LOCATION, TRANSLATION_UNIT_DECL,
                        name, NULL_TREE);
   TRANSLATION_UNIT_LANGUAGE (tu) = lang_hooks.name;
+  if (main_input_filename)
+    DECL_NAME (tu) = get_identifier (main_input_filename);
   vec_safe_push (all_translation_units, tu);
   return tu;
 }
Index: ipa-devirt.c
===================================================================
--- ipa-devirt.c        (revision 221977)
+++ ipa-devirt.c        (working copy)
@@ -979,6 +979,21 @@ warn_odr (tree t1, tree t2, tree st1, tr
     return;
   inform (DECL_SOURCE_LOCATION (decl2), reason);
 
+  tree name = TYPE_NAME (t1);
+  tree name1 = decl2;
+  /* See if we have info about the translation unit.  It may not be around
+       if types was already merged.   */
+    while (TREE_CODE (name) != TRANSLATION_UNIT_DECL)
+      name = TYPE_P (name) ? TYPE_CONTEXT (name) : DECL_CONTEXT (name);
+    while (TREE_CODE (name1) != TRANSLATION_UNIT_DECL)
+      name1 = TYPE_P (name1) ? TYPE_CONTEXT (name1) : DECL_CONTEXT (name1);
+    name = DECL_NAME (name);
+    name1 = DECL_NAME (name1);
+    if (name != name1 && name && name1)
+      inform (UNKNOWN_LOCATION, "Conflicting compilation units: %s and %s",
+             IDENTIFIER_POINTER (name),
+             IDENTIFIER_POINTER (name1));
+
   if (warned)
     *warned = true;
 }

Reply via email to