------- Comment #3 from matz at gcc dot gnu dot org  2008-01-22 18:28 -------
The problem is, that gen_type_die() generates a DIE only for the main variant
of the given type.  But lookup_type_die looks in the type itself.  In the
example the type in question is "const A", for which no DIE exists already.
So force_type_die() goes into the if(), calls gen_type_die which generated
a DIE for "A" (in fact that already exists, so it just returns).  But
a DIE for "const A" still doesn't exist of course.  The example can be made to
compile to force such existence, e.g. by adding a member to "A":

  struct A {
    ...
    void cmem() const;
  };

There are two ways of fixing this:
1) making sure, that "const A" (the tree node) refers to the DIE for "A", i.e.
   losing the qualifiers.  One could ensure this in either force_type_die
   or even gen_type_die by calling equate_type_number_to_die.
2) ensure that force_type_die() really creates a DIE which reflects type
   (and not just the main variant).

With the above test one can see, that the intention was, that the AT_import
decl really comes inside the DIE for "const A".  So, that speaks for option 2.
This is also the natural choice as a function named "force_type_die" surely
should generate a DIE for that very type and not some other variant of it.

The below patch would implement this.

Index: dwarf2out.c
===================================================================
--- dwarf2out.c (revision 131712)
+++ dwarf2out.c (working copy)
@@ -13736,11 +13736,8 @@ force_type_die (tree type)
       else
        context_die = comp_unit_die;

-      type_die = lookup_type_die (type);
-      if (type_die)
-       return type_die;
-      gen_type_die (type, context_die);
-      type_die = lookup_type_die (type);
+      type_die = modified_type_die (type, TYPE_READONLY (type),
+                                   TYPE_VOLATILE (type), context_die);
       gcc_assert (type_die);
     }
   return type_die;


-- 


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

Reply via email to