diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-04-05 23:30:47 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-04-05 23:30:47 +0200 |
commit | 86c9f54bb6e513b97fc40eeefd419a3f28ba451e (patch) | |
tree | 9e067a4874d858d09084d7998fff8cb0de7e518c /gcc | |
parent | a1afa75e015d3b139fc8fa0f1786ae4a9ccbf022 (diff) | |
download | gcc-86c9f54bb6e513b97fc40eeefd419a3f28ba451e.zip gcc-86c9f54bb6e513b97fc40eeefd419a3f28ba451e.tar.gz gcc-86c9f54bb6e513b97fc40eeefd419a3f28ba451e.tar.bz2 |
re PR c++/85209 (ICE with lambda and structured binding)
PR c++/85209
* pt.c (tsubst_decomp_names): Don't fail or ICE if DECL_CHAIN (decl3)
is not prev, if prev == decl.
* g++.dg/cpp1z/decomp39.C: New test.
* g++.dg/cpp1z/decomp40.C: New test.
From-SVN: r259156
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/decomp39.C | 16 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/decomp40.C | 18 |
5 files changed, 44 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 59c11be..759e9c9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-04-05 Jakub Jelinek <jakub@redhat.com> + PR c++/85209 + * pt.c (tsubst_decomp_names): Don't fail or ICE if DECL_CHAIN (decl3) + is not prev, if prev == decl. + PR c++/85208 * decl.c (start_decl): For DECL_DECOMPOSITION_P decls, don't call maybe_apply_pragma_weak here... diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index dc2310a..3bac756 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -16239,7 +16239,8 @@ tsubst_decomp_names (tree decl, tree pattern_decl, tree args, if (error_operand_p (decl3)) decl = error_mark_node; else if (decl != error_mark_node - && DECL_CHAIN (decl3) != prev) + && DECL_CHAIN (decl3) != prev + && decl != prev) { gcc_assert (errorcount); decl = error_mark_node; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0a32f87..a000873 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2018-04-05 Jakub Jelinek <jakub@redhat.com> + PR c++/85209 + * g++.dg/cpp1z/decomp39.C: New test. + * g++.dg/cpp1z/decomp40.C: New test. + PR c++/85208 * g++.dg/cpp1z/decomp41.C: New test. diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp39.C b/gcc/testsuite/g++.dg/cpp1z/decomp39.C new file mode 100644 index 0000000..fcc806a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/decomp39.C @@ -0,0 +1,16 @@ +// PR c++/85209 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template <int> +void +foo () +{ + auto [a] = []{}; // { dg-error "cannot decompose lambda closure type" } +} // { dg-warning "structured bindings only available with" "" { target c++14_down } .-1 } + +void +bar () +{ + foo<0> (); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp40.C b/gcc/testsuite/g++.dg/cpp1z/decomp40.C new file mode 100644 index 0000000..4210d6a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/decomp40.C @@ -0,0 +1,18 @@ +// PR c++/85209 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +struct S { int a; } s; + +template <int> +void +foo () +{ + auto [a] = []{ return s; } (); // { dg-warning "structured bindings only available with" "" { target c++14_down } } +}; + +void +bar () +{ + foo<0> (); +} |