https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98533
--- Comment #15 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
struct S {
template <typename> void foo (int = [] {}) const;
};
struct T {
static void bar (const S &);
};
The earlier finish_member_declaration calls are followed by finish_struct ->
finish_struct_1 -> finish_struct_bits -> fixup_type_variants which updates the
variants
(there is const S next to the S main variant).
But later on there is
#0 finish_member_declaration (decl=<template_decl 0x7fffea13ae58 ._anon_0>) at
../../gcc/cp/semantics.cc:4294
#1 0x00000000006bad53 in maybe_process_template_type_declaration
(type=<record_type 0x7fffea2e9738 ._anon_0>, is_friend=0, b=0x7fffea1378b8) at
../../gcc/cp/name-lookup.cc:8400
#2 0x00000000006bb132 in pushtag (name=<identifier_node 0x7fffea301640
._anon_0>, type=<record_type 0x7fffea2e9738 ._anon_0>,
how=TAG_how::CURRENT_ONLY)
at ../../gcc/cp/name-lookup.cc:8500
#3 0x0000000000575fdd in xref_tag (tag_code=record_type, name=<identifier_node
0x7fffea301640 ._anon_0>, how=TAG_how::CURRENT_ONLY, template_header_p=false)
at ../../gcc/cp/decl.cc:17213
#4 0x00000000005e9271 in begin_lambda_type (lambda=<lambda_expr
0x7fffea15e0a0>) at ../../gcc/cp/lambda.cc:138
#5 0x00000000006df1b2 in cp_parser_lambda_expression (parser=0x7fffea2e9a80)
at ../../gcc/cp/parser.cc:11739
#6 0x00000000006d104b in cp_parser_primary_expression (parser=0x7fffea2e9a80,
address_p=false, cast_p=false, template_arg_p=false, decltype_p=false,
idk=0x7fffffffbf7c)
at ../../gcc/cp/parser.cc:6229
#7 0x00000000006d6516 in cp_parser_postfix_expression (parser=0x7fffea2e9a80,
address_p=false, cast_p=false, member_access_only_p=false, decltype_p=false,
pidk_return=0x0)
at ../../gcc/cp/parser.cc:8238
#8 0x00000000006dad9e in cp_parser_unary_expression (parser=0x7fffea2e9a80,
pidk=0x0, address_p=false, cast_p=false, decltype_p=false) at
../../gcc/cp/parser.cc:9733
#9 0x00000000006dc581 in cp_parser_cast_expression (parser=0x7fffea2e9a80,
address_p=false, cast_p=false, decltype_p=false, pidk=0x0) at
../../gcc/cp/parser.cc:10648
#10 0x00000000006dc684 in cp_parser_binary_expression (parser=0x7fffea2e9a80,
cast_p=false, no_toplevel_fold_p=false, decltype_p=false,
prec=PREC_NOT_OPERATOR, pidk=0x0)
at ../../gcc/cp/parser.cc:10751
#11 0x00000000006dd832 in cp_parser_assignment_expression
(parser=0x7fffea2e9a80, pidk=0x0, cast_p=false, decltype_p=false) at
../../gcc/cp/parser.cc:11096
#12 0x00000000006de26b in cp_parser_constant_expression (parser=0x7fffea2e9a80,
allow_non_constant_p=2, non_constant_p=0x0, strict_p=false) at
../../gcc/cp/parser.cc:11402
#13 0x00000000007007ed in cp_parser_initializer_clause (parser=0x7fffea2e9a80,
non_constant_p=0x0) at ../../gcc/cp/parser.cc:26844
#14 0x00000000007005f5 in cp_parser_initializer (parser=0x7fffea2e9a80,
is_direct_init=0x0, non_constant_p=0x0, subexpression_p=false) at
../../gcc/cp/parser.cc:26783
#15 0x000000000071267f in cp_parser_late_parse_one_default_arg
(parser=0x7fffea2e9a80, decl=<parm_decl 0x7fffea13ac38>,
default_arg=<deferred_parse 0x7fffea2fc5b8>,
parmtype=<integer_type 0x7fffea1525e8 int>) at ../../gcc/cp/parser.cc:34576
#16 0x0000000000712a75 in cp_parser_late_parsing_default_args
(parser=0x7fffea2e9a80, fn=<function_decl 0x7fffea2ecb00 foo>) at
../../gcc/cp/parser.cc:34689
which pushes another TYPE_FIELDS and nothing propagates that to the variants
afterwards.
I guess the most important question is if the lambda ._anon_0 from the default
argument and its associated TEMPLATE_DECL should be pushed into the TYPE_FIELDS
of the containing class at all. If yes, there should be some further
fixup_type_variants to sync that up after processing all the late default
arguments. If not, what should prevent that and where should that lambda go
(if anywhere)?
Jason, any ideas?