Bug 100282 - local class in lambda in pack expansion
Summary: local class in lambda in pack expansion
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 11.0
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: c++-lambda, FIXME, rejects-valid
: 103428 (view as bug list)
Depends on:
Blocks: lambdas
  Show dependency treegraph
 
Reported: 2021-04-27 09:16 UTC by Arseny Solokha
Modified: 2024-06-21 02:44 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2024-04-15 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Arseny Solokha 2021-04-27 09:16:11 UTC
g++-11.0.1-alpha20210418 snapshot (g:b412ce8e961052e6becea3bc783a53e1d5feaa0f) ICEs when compiling the following testcase, reduced from test/SemaCXX/lambda-expressions.cpp from the clang 11.1.0 test suite:

template <typename... Ts>
void
local_class ()
{
  int { []{ struct ZZ : Ts {}; }... };
}

template // <>
void
local_class<int> ();

% g++-11.0.1 -c xhrah4q6.cpp
xhrah4q6.cpp: In instantiation of 'struct local_class<int>()::<lambda()>::ZZ':
xhrah4q6.cpp:5:29:   required from 'void local_class() [with Ts = {int}]'
xhrah4q6.cpp:10:19:   required from here
xhrah4q6.cpp:5:20: internal compiler error: in dependent_type_p, at cp/pt.c:26813
    5 |   int { []{ struct ZZ : Ts {}; }... };
      |                    ^~
0x69d8fd dependent_type_p(tree_node*)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:26813
0x983e58 xref_basetypes(tree_node*, tree_node*)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/decl.c:15434
0xad9331 instantiate_class_template_1
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:11922
0xadadb2 instantiate_class_template(tree_node*)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:12287
0xb272e9 complete_type(tree_node*)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/typeck.c:143
0xab048d tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:18737
0xab0af1 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:18238
0xab05df tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:18589
0xadbabe tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:18223
0xadbabe tsubst_lambda_expr(tree_node*, tree_node*, int, tree_node*)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:19540
0xaa5284 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:20891
0xaadfd8 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:19198
0xaad864 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:18223
0xaad864 gen_elem_of_pack_expansion_instantiation
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:12562
0xaad864 tsubst_pack_expansion(tree_node*, tree_node*, int, tree_node*)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:13227
0xaa5be3 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:20735
0xaadfd8 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:19198
0xab038c tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:18268
0xab0af1 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:18238
0xab05df tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
	/var/tmp/portage/sys-devel/gcc-11.0.1_alpha20210426/work/gcc-11-20210426/gcc/cp/pt.c:18589
Comment 1 Marek Polacek 2021-04-28 22:44:28 UTC
Confirmed.
Comment 2 Arseny Solokha 2021-05-31 04:56:31 UTC
g++-12.0.0-alpha20210530 snapshot (g:a0a7adeea31918deefb053a9a15257af94aecfaf) rejects the testcase w/o ICE.
Comment 3 Richard Biener 2021-07-28 07:06:27 UTC
GCC 11.2 is being released, retargeting bugs to GCC 11.3
Comment 4 GCC Commits 2022-01-28 03:21:54 UTC
The master branch has been updated by Jason Merrill <jason@gcc.gnu.org>:

https://gcc.gnu.org/g:4d2efec9f229c2e2e7cb6c3f06beb4c3e9d244a1

commit r12-6909-g4d2efec9f229c2e2e7cb6c3f06beb4c3e9d244a1
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Jan 27 17:46:43 2022 -0500

    c++: pack in enumerator in lambda [PR100198]
    
    The GCC 8 lambda overhaul fixed most uses of lambdas in pack expansions, but
    local enums and classes within such lambdas that depend on parameter packs
    are still broken.  For now, give a sorry instead of an ICE or incorrect
    error.
    
            PR c++/100198
            PR c++/100030
            PR c++/100282
    
    gcc/cp/ChangeLog:
    
            * parser.cc (cp_parser_enumerator_definition): Sorry on parameter
            pack in lambda.
            (cp_parser_class_head): And in class attributes.
            * pt.cc (check_for_bare_parameter_packs): Sorry instead of error
            in lambda.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp0x/lambda/lambda-variadic13.C: Accept the sorry
            as well as the correct error.
            * g++.dg/cpp0x/lambda/lambda-variadic14.C: Likewise.
            * g++.dg/cpp0x/lambda/lambda-variadic14a.C: New test.
            * g++.dg/cpp0x/lambda/lambda-variadic15.C: New test.
            * g++.dg/cpp0x/lambda/lambda-variadic16.C: New test.
Comment 5 Jason Merrill 2022-01-28 05:11:47 UTC
I can't reproduce the ICE with the top of any branch; leaving the PR open for the rejects-valid bug.
Comment 6 Jason Merrill 2022-03-27 00:18:40 UTC
*** Bug 103428 has been marked as a duplicate of this bug. ***