On Fri, Jun 30, 2017 at 01:38:13PM -0400, Nathan Sidwell wrote: > On 06/30/2017 01:24 PM, Jakub Jelinek wrote: > > > The initializer for structured binding has to be one of: > > = assignment-expression > > ( assignment-expression ) > > { assignment-expression } > > but cp_parser_initializer can parse other forms, with fewer or more > > expressions in there. Some cases we caught with various cryptic errors > > or pedwarns, but others we just ICEd on. > > > > The following patch attempts to check this. > > ok, but ... > > > --- gcc/testsuite/g++.dg/cpp1z/decomp21.C.jj 2017-01-19 > > 17:01:21.000000000 +0100 > > +++ gcc/testsuite/g++.dg/cpp1z/decomp21.C 2017-06-30 11:07:04.786746784 > > +0200 > > @@ -12,5 +12,5 @@ foo () > > auto [ n, o, p ] { a }; > > auto [ q, r, t ] ( s ); > > auto [ u, v, w ] ( s, ); // { dg-error "expected > > primary-expression before '.' token" } > > - auto [ x, y, z ] ( a ); // { dg-error "expression list treated as > > compound expression in initializer" "" { target *-*-* } .-1 } > > + auto [ x, y, z ] ( a ); // { dg-error "invalid initializer for > > structured binding" "" { target *-*-* } .-1 } > > } > > The .-1 on the final error is actually about the previous statement, not the > line it's lexically on. Could you put it on a line on its own, while you're > there?
Ok. In the light of the http://gcc.gnu.org/ml/gcc-patches/2017-06/msg02432.html thread, shouldn't this be structured binding declaration then? I.e. 2017-07-03 Jakub Jelinek <ja...@redhat.com> PR c++/81258 * parser.c (cp_parser_decomposition_declaration): Diagnose invalid forms of structured binding initializers. * g++.dg/cpp1z/decomp21.C (foo): Adjust expected diagnostics. * g++.dg/cpp1z/decomp30.C: New test. --- gcc/cp/parser.c.jj 2017-06-30 09:49:25.000000000 +0200 +++ gcc/cp/parser.c 2017-06-30 11:03:18.526521000 +0200 @@ -13196,6 +13196,16 @@ cp_parser_decomposition_declaration (cp_ *init_loc = cp_lexer_peek_token (parser->lexer)->location; tree initializer = cp_parser_initializer (parser, &is_direct_init, &non_constant_p); + if (initializer == NULL_TREE + || (TREE_CODE (initializer) == TREE_LIST + && TREE_CHAIN (initializer)) + || (TREE_CODE (initializer) == CONSTRUCTOR + && CONSTRUCTOR_NELTS (initializer) != 1)) + { + error_at (loc, "invalid initializer for structured binding " + "declaration"); + initializer = error_mark_node; + } if (decl != error_mark_node) { --- gcc/testsuite/g++.dg/cpp1z/decomp21.C.jj 2017-01-19 17:01:21.000000000 +0100 +++ gcc/testsuite/g++.dg/cpp1z/decomp21.C 2017-06-30 11:07:04.786746784 +0200 @@ -12,5 +12,6 @@ foo () auto [ n, o, p ] { a }; auto [ q, r, t ] ( s ); auto [ u, v, w ] ( s, ); // { dg-error "expected primary-expression before '.' token" } - auto [ x, y, z ] ( a ); // { dg-error "expression list treated as compound expression in initializer" "" { target *-*-* } .-1 } + // { dg-error "invalid initializer for structured binding declaration" "" { target *-*-* } .-1 } + auto [ x, y, z ] ( a ); } --- gcc/testsuite/g++.dg/cpp1z/decomp30.C.jj 2017-06-30 11:09:31.934942575 +0200 +++ gcc/testsuite/g++.dg/cpp1z/decomp30.C 2017-06-30 11:09:22.000000000 +0200 @@ -0,0 +1,12 @@ +// PR c++/81258 +// { dg-options -std=c++1z } + +int a[2]; +auto [b, c] (a); +auto [d, e] { a }; +auto [f, g] = a; +auto [h, i] ( a, a ); // { dg-error "invalid initializer for structured binding declaration" } +auto [j, k] { a, a }; // { dg-error "invalid initializer for structured binding declaration" } +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" } Jakub