This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Fix glitch with TYPE_NAME


In finish_record_type

  TYPE_STUB_DECL (record_type)
    = build_decl (TYPE_DECL, TYPE_NAME (record_type), record_type);

we build TYPE_DECL of TYPE_DECL if the TYPE_NAME is already a TYPE_DECL.

Fixed by adding the canonical couple of lines missing in make_packable_type.

Bootstrapped/regtested on i586-suse-linux, applied on the mainline.


2007-11-29  Eric Botcazou  <ebotcazou@adacore.com>

	* decl.c (make_packable_type): Retrieve the real name of the type.
	(maybe_pad_type): Simplify similar code.


-- 
Eric Botcazou
Index: decl.c
===================================================================
--- decl.c	(revision 130511)
+++ decl.c	(working copy)
@@ -5198,13 +5198,17 @@ static tree
 make_packable_type (tree type)
 {
   tree new_type = make_node (TREE_CODE (type));
+  tree name = TYPE_NAME (type);
   tree field_list = NULL_TREE;
   tree old_field;
 
+  if (name && TREE_CODE (name) == TYPE_DECL)
+    name = DECL_NAME (name);
+
   /* Copy the name and flags from the old type to that of the new and set
      the alignment to try for an integral type.  For QUAL_UNION_TYPE,
      also copy the size.  */
-  TYPE_NAME (new_type) = TYPE_NAME (type);
+  TYPE_NAME (new_type) = name;
   TYPE_JUSTIFIED_MODULAR_P (new_type)
     = TYPE_JUSTIFIED_MODULAR_P (type);
   TYPE_CONTAINS_TEMPLATE_P (new_type) = TYPE_CONTAINS_TEMPLATE_P (type);
@@ -5394,16 +5398,18 @@ maybe_pad_type (tree type, tree size, un
   /* Unless debugging information isn't being written for the input type,
      write a record that shows what we are a subtype of and also make a
      variable that indicates our size, if variable. */
-  if (TYPE_NAME (record) && AGGREGATE_TYPE_P (type)
+  if (TYPE_NAME (record)
+      && AGGREGATE_TYPE_P (type)
       && (TREE_CODE (TYPE_NAME (type)) != TYPE_DECL
 	  || !DECL_IGNORED_P (TYPE_NAME (type))))
     {
       tree marker = make_node (RECORD_TYPE);
-      tree name = (TREE_CODE (TYPE_NAME (record)) == TYPE_DECL
-		   ? DECL_NAME (TYPE_NAME (record))
-		   : TYPE_NAME (record));
+      tree name = TYPE_NAME (record);
       tree orig_name = TYPE_NAME (type);
 
+      if (TREE_CODE (name) == TYPE_DECL)
+	name = DECL_NAME (name);
+
       if (TREE_CODE (orig_name) == TYPE_DECL)
 	orig_name = DECL_NAME (orig_name);
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]