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

Richard Guenther <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dodji at gcc dot gnu.org,
                   |                            |jason at gcc dot gnu.org

--- Comment #3 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-12-08 
16:46:41 UTC ---
Program received signal SIGSEGV, Segmentation fault.
0x0000000000569d33 in primary_template_instantiation_p (t=0x7ffff5b8f930)
    at /space/rguenther/src/svn/trunk/gcc/cp/pt.c:2874
2874      else if (CLASS_TYPE_P (t) && !TYPE_DECL_ALIAS_P (TYPE_NAME (t)))
(gdb)

but TYPE_NAME (t) is NULL:

(gdb) call debug_tree (t)
 <union_type 0x7ffff5b8f930 sizes-gimplified type_5 type_6 DI
    size <integer_cst 0x7ffff5a20f40 type <integer_type 0x7ffff5a390a8
bitsizetype> constant 64>
    unit size <integer_cst 0x7ffff5a20f60 type <integer_type 0x7ffff5a39000
sizetype> constant 8>
    align 64 symtab -173746304 alias set -1 canonical type 0x7ffff5b8f930
    fields <field_decl 0x7ffff5b8c8e8 p
        type <pointer_type 0x7ffff5a472a0 type <integer_type 0x7ffff5a395e8
int>
            sizes-gimplified asm_written unsigned type_6 DI size <integer_cst
0x7ffff5a20f40 64> unit size <integer_cst 0x7ffff5a20f60 8>
            align 64 symtab -173747024 alias set -1 canonical type
0x7ffff5a472a0>
        used unsigned nonlocal decl_3 DI file t.C line 6 col 12 size
<integer_cst 0x7ffff5a20f40 64> unit size <integer_cst 0x7ffff5a20f60 8>
        align 64 offset_align 128
        offset <integer_cst 0x7ffff5a20f80 constant 0>
        bit offset <integer_cst 0x7ffff5a20fe0 constant 0> context <union_type
0x7ffff5b8f930>> context <function_decl 0x7ffff5b8ef00 bar>
    full-name "union<anonymous>"
    X() X(constX&) this=(X&)
    chain <type_decl 0x7ffff5ba52e0 ._0>>

cleared by the C++ free_lang_data langhook:

  if (CP_AGGREGATE_TYPE_P (t)
      && TYPE_NAME (t))
    {
      tree name = TYPE_NAME (t);
      if (TREE_CODE (name) == TYPE_DECL)
        name = DECL_NAME (name);
      /* Drop anonymous names.  */
      if (name != NULL_TREE
          && ANON_AGGRNAME_P (name))
        TYPE_NAME (t) = NULL_TREE;

the type is anonymous before:

 <union_type 0x7ffff5b8f930 ._0 sizes-gimplified type_5 type_6 DI

it's name:

 <type_decl 0x7ffff5ba52e0 ._0
...
    public decl_2 VOID file t.C line 5 col 5
    align 8 context <function_decl 0x7ffff5b8ef00 bar> chain <var_decl
0x7ffff5a2c3c0 u>>

does not have DECL_LANG_FLAG_6 set (TYPE_DECL_ALIAS_P).

Dodji, Jason, can such anonymous name types ever have TYPE_DECL_ALIAS_P
set?  Thus, is a valid fix

Index: pt.c
===================================================================
--- pt.c        (revision 182117)
+++ pt.c        (working copy)
@@ -2871,7 +2871,8 @@ primary_template_instantiation_p (const_
     return DECL_LANG_SPECIFIC (t)
           && DECL_TEMPLATE_INSTANTIATION (t)
           && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t));
-  else if (CLASS_TYPE_P (t) && !TYPE_DECL_ALIAS_P (TYPE_NAME (t)))
+  else if (CLASS_TYPE_P (t)
+          && TYPE_NAME (t) && !TYPE_DECL_ALIAS_P (TYPE_NAME (t)))
     return CLASSTYPE_TEMPLATE_INSTANTIATION (t)
           && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t));
   else if (TYPE_P (t)

?

Technically clearing the anonymous names is probably no longer necessary,
I'm testing a patch to remove that.

Reply via email to