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:
Jakub Jelinek 2017-11-27 22:54:25 +01:00 committed by Jakub Jelinek
parent 528c7559a8
commit de3d4fd0f5
5 changed files with 36 additions and 1 deletions

View File

@ -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

View File

@ -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 "

View File

@ -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

View File

@ -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" }

View 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> ();