re PR c++/81888 (Structured bindings stopped working)
PR c++/81888 * parser.c (cp_parser_decomposition_declaration): Reject just BRACE_ENCLOSED_INITIALIZER_P initializers with nelts != 1 rather than all such CONSTRUCTORs, and only if is_direct_init is true. * g++.dg/cpp1z/decomp30.C: Add a test for structured binding with = {} and = { a, a } initializers. * g++.dg/cpp1z/decomp31.C: New test. From-SVN: r255180
This commit is contained in:
parent
528c7559a8
commit
de3d4fd0f5
@ -1,3 +1,10 @@
|
||||
2017-11-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/81888
|
||||
* parser.c (cp_parser_decomposition_declaration): Reject just
|
||||
BRACE_ENCLOSED_INITIALIZER_P initializers with nelts != 1 rather
|
||||
than all such CONSTRUCTORs, and only if is_direct_init is true.
|
||||
|
||||
2017-11-27 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* pt.c (primary_template_specialization_p): Rename from
|
||||
|
@ -13382,7 +13382,8 @@ cp_parser_decomposition_declaration (cp_parser *parser,
|
||||
if (initializer == NULL_TREE
|
||||
|| (TREE_CODE (initializer) == TREE_LIST
|
||||
&& TREE_CHAIN (initializer))
|
||||
|| (TREE_CODE (initializer) == CONSTRUCTOR
|
||||
|| (is_direct_init
|
||||
&& BRACE_ENCLOSED_INITIALIZER_P (initializer)
|
||||
&& CONSTRUCTOR_NELTS (initializer) != 1))
|
||||
{
|
||||
error_at (loc, "invalid initializer for structured binding "
|
||||
|
@ -1,3 +1,10 @@
|
||||
2017-11-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/81888
|
||||
* g++.dg/cpp1z/decomp30.C: Add a test for structured binding with
|
||||
= {} and = { a, a } initializers.
|
||||
* g++.dg/cpp1z/decomp31.C: New test.
|
||||
|
||||
2017-11-27 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||
|
||||
PR middle_end/82333
|
||||
|
@ -10,3 +10,5 @@ auto [j, k] { a, a }; // { dg-error "invalid initializer for structured binding
|
||||
auto [l, m] = { a }; // { dg-error "deducing from brace-enclosed initializer list requires" }
|
||||
auto [n, o] {}; // { dg-error "invalid initializer for structured binding declaration" }
|
||||
auto [p, q] (); // { dg-error "invalid initializer for structured binding declaration" }
|
||||
auto [r, s] = {}; // { dg-error "deducing from brace-enclosed initializer list requires" }
|
||||
auto [t, u] = { a, a }; // { dg-error "deducing from brace-enclosed initializer list requires" }
|
||||
|
18
gcc/testsuite/g++.dg/cpp1z/decomp31.C
Normal file
18
gcc/testsuite/g++.dg/cpp1z/decomp31.C
Normal file
@ -0,0 +1,18 @@
|
||||
// PR c++/81888
|
||||
// { dg-do compile { target c++17 } }
|
||||
|
||||
struct S {
|
||||
bool s = true;
|
||||
};
|
||||
|
||||
auto [a] = S{};
|
||||
|
||||
template <class T>
|
||||
bool
|
||||
foo () noexcept
|
||||
{
|
||||
auto [c] = T{};
|
||||
return c;
|
||||
}
|
||||
|
||||
const bool b = foo<S> ();
|
Loading…
Reference in New Issue
Block a user