Patch committed: Don't confuse -fdump-go-spec with tag/var name

Message ID
State New
Headers show

Commit Message

Ian Taylor Jan. 11, 2011, 10:59 p.m.
In C you can have a struct tag and a variable with the same name.  The
-fdump-go-spec option dumps a struct tag as a type name, but Go does not
permit a type and a variable to have the same name.  This patch avoids
the most common case of this problem by not emitting a variable if it
has already seen a type with the same name.  Bootstrapped and ran Go
testsuite on x86_64-unknown-linux-gnu.  Committed to mainline.


2011-01-11  Ian Lance Taylor  <>

	* godump.c (go_output_var): Don't output the variable if there is
	already a type with the same name.


Index: godump.c
--- godump.c	(revision 168682)
+++ godump.c	(working copy)
@@ -715,13 +715,27 @@  go_output_typedef (struct godump_contain
 static void
 go_output_var (struct godump_container *container, tree decl)
+  bool is_valid;
   if (pointer_set_contains (container->decls_seen, decl)
       || pointer_set_contains (container->decls_seen, DECL_NAME (decl)))
   pointer_set_insert (container->decls_seen, decl);
   pointer_set_insert (container->decls_seen, DECL_NAME (decl));
-  if (!go_format_type (container, TREE_TYPE (decl), true, false))
+  is_valid = go_format_type (container, TREE_TYPE (decl), true, false);
+  if (is_valid
+      && htab_find_slot (container->type_hash,
+			 NO_INSERT) != NULL)
+    {
+      /* There is already a type with this name, probably from a
+	 struct tag.  Prefer the type to the variable.  */
+      is_valid = false;
+    }
+  if (!is_valid)
     fprintf (go_dump_file, "// ");
   fprintf (go_dump_file, "var _%s ",
   go_output_type (container);