https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109083

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

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

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
What happens is that finish_template_type is called once from unused_function
with
is_member_function_pointer TEMPLATE_DECL as name and args
 <tree_vec 0x7fffea2fd2e0 length:1
    elt:0 <decltype_type 0x7fffea2fc930 VOID
        align:8 warn_if_not_align:0 symtab:0 alias-set -1 structural-equality
        expr <addr_expr 0x7fffea2fd2c0 type <dependent_operator_type
0x7fffea2fc888>

            arg:0 <scope_ref 0x7fffea2fbd20 tree_0 arg:0 <template_type_parm
0x7fffea2fc738 T>
                arg:1 <identifier_node 0x7fffea2e9cc0 foo
                    normal local bindings <(nil)>>
                pr109083.ii:86:64 start: pr109083.ii:86:64 finish:
pr109083.ii:86:66>
            pr109083.ii:86:60 start: pr109083.ii:86:60 finish:
pr109083.ii:86:66>>>
(in my case of reduced preprocessed source), calls lookup_template_class, finds
nothing in
9943          entry = type_specializations->find_with_hash (&elt, hash);
and so creates
10082             t = make_class_type (TREE_CODE (template_type));
etc.
Next time finish_template_type is called from fail_here with the same
TEMPLATE_DECL as name and args
 <tree_vec 0x7fffea2fd400 length:1
    elt:0 <decltype_type 0x7fffea2fcf18 VOID
        align:8 warn_if_not_align:0 symtab:0 alias-set -1 structural-equality
        expr <addr_expr 0x7fffea2fd3e0 type <dependent_operator_type
0x7fffea2fce70>

            arg:0 <scope_ref 0x7fffea302000 tree_0 arg:0 <template_type_parm
0x7fffea2fcd20 T>
                arg:1 <identifier_node 0x7fffea2e9cc0 foo
                    normal local bindings <(nil)>>
                pr109083.ii:92:64 start: pr109083.ii:92:64 finish:
pr109083.ii:92:66>
            pr109083.ii:92:60 start: pr109083.ii:92:60 finish:
pr109083.ii:92:66>>>
but this type the previously created specialization from unused_function is
returned.

So, shall template_args_equal or whatever it calls be changed so that it
doesn't consider these to be equal?  If so, what compilation memory effects
will it have?

Reply via email to