diff mbox

[Ada] Fix wrong scope for descriptive type in debug info

Message ID 1765068.1ApteRlr7U@polaris
State New
Headers show

Commit Message

Eric Botcazou Oct. 19, 2013, 10:53 a.m. UTC
This is a regression present on all active branches.  The descriptive types 
emitted in the debug info by the Ada compiler can have a different scope than 
that of the type they are associated with, which goes against the spec.

Tested on x86_64-suse-linux, applied on all active branches.


2013-10-19  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/utils.c (gnat_set_type_context): New function.
	(gnat_pushdecl): Use it to set the context of the type.
diff mbox

Patch

Index: gcc-interface/utils.c
===================================================================
--- gcc-interface/utils.c	(revision 297217)
+++ gcc-interface/utils.c	(revision 297218)
@@ -531,6 +531,22 @@  gnat_zaplevel (void)
   free_binding_level = level;
 }
 
+/* Set the context of TYPE and its parallel types (if any) to CONTEXT.  */
+
+static void
+gnat_set_type_context (tree type, tree context)
+{
+  tree decl = TYPE_STUB_DECL (type);
+
+  TYPE_CONTEXT (type) = context;
+
+  while (decl && DECL_PARALLEL_TYPE (decl))
+    {
+      TYPE_CONTEXT (DECL_PARALLEL_TYPE (decl)) = context;
+      decl = TYPE_STUB_DECL (DECL_PARALLEL_TYPE (decl));
+    }
+}
+
 /* Record DECL as belonging to the current lexical scope and use GNAT_NODE
    for location information and flag propagation.  */
 
@@ -612,7 +628,7 @@  gnat_pushdecl (tree decl, Node_Id gnat_n
 	      if (TREE_CODE (t) == POINTER_TYPE)
 		TYPE_NEXT_PTR_TO (t) = tt;
 	      TYPE_NAME (tt) = DECL_NAME (decl);
-	      TYPE_CONTEXT (tt) = DECL_CONTEXT (decl);
+	      gnat_set_type_context (tt, DECL_CONTEXT (decl));
 	      TYPE_STUB_DECL (tt) = TYPE_STUB_DECL (t);
 	      DECL_ORIGINAL_TYPE (decl) = tt;
 	    }
@@ -622,7 +638,7 @@  gnat_pushdecl (tree decl, Node_Id gnat_n
 	  /* We need a variant for the placeholder machinery to work.  */
 	  tree tt = build_variant_type_copy (t);
 	  TYPE_NAME (tt) = decl;
-	  TYPE_CONTEXT (tt) = DECL_CONTEXT (decl);
+	  gnat_set_type_context (tt, DECL_CONTEXT (decl));
 	  TREE_USED (tt) = TREE_USED (t);
 	  TREE_TYPE (decl) = tt;
 	  if (DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
@@ -644,7 +660,7 @@  gnat_pushdecl (tree decl, Node_Id gnat_n
 	  if (!(TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL))
 	    {
 	      TYPE_NAME (t) = decl;
-	      TYPE_CONTEXT (t) = DECL_CONTEXT (decl);
+	      gnat_set_type_context (t, DECL_CONTEXT (decl));
 	    }
     }
 }