diff mbox

[C++] "decomposition declaration" -> "structured binding" in C++ diagnostics

Message ID 20170630172630.GO2123@tucnak
State New
Headers show

Commit Message

Jakub Jelinek June 30, 2017, 5:26 p.m. UTC
Hi!

As C++17 decided to rename decompositions to structured bindings, this
patch attempts to adjust the diagnostics by replacing
"decomposition declaration" with "structured binding".
Or shall I use "structured binding declaration" instead (or is that too
longer/verbose), or something different?

Bootstrapped/regtested on x86_64-linux and i686-linux.

2017-06-30  Jakub Jelinek  <jakub@redhat.com>

	* parser.c (cp_parser_decomposition_declaration): Replace
	decomposition declaration with structured binding in diagnostics.
	* decl.c (cp_finish_decomp): Likewise.
	(grokdeclarator): Likewise.

	* g++.dg/cpp1z/decomp1.C: Expect structured binding instead of
	decomposition declaration in diagnostics.
	* g++.dg/cpp1z/decomp2.C: Likewise.
	* g++.dg/cpp1z/decomp3.C: Likewise.
	* g++.dg/cpp1z/decomp4.C: Likewise.
	* g++.dg/cpp1z/decomp5.C: Likewise.
	* g++.dg/cpp1z/decomp6.C: Likewise.
	* g++.dg/cpp1z/decomp7.C: Likewise.
	* g++.dg/cpp1z/decomp8.C: Likewise.
	* g++.dg/cpp1z/decomp13.C: Likewise.
	* g++.dg/cpp1z/decomp14.C: Likewise.
	* g++.dg/cpp1z/decomp18.C: Likewise.
	* g++.dg/cpp1z/decomp19.C: Likewise.
	* g++.dg/cpp1z/decomp22.C: Likewise.
	* g++.dg/cpp1z/decomp23.C: Likewise.
	* g++.dg/cpp1z/decomp24.C: Likewise.
	* g++.dg/cpp1z/decomp25.C: Likewise.
	* g++.dg/cpp1z/decomp26.C: Likewise.
	* g++.dg/cpp1z/decomp28.C: Likewise.


	Jakub

Comments

Nathan Sidwell June 30, 2017, 5:39 p.m. UTC | #1
On 06/30/2017 01:26 PM, Jakub Jelinek wrote:
> Hi!
> 
> As C++17 decided to rename decompositions to structured bindings, this
> patch attempts to adjust the diagnostics by replacing
> "decomposition declaration" with "structured binding".
> Or shall I use "structured binding declaration" instead (or is that too
> longer/verbose), or something different?

IMHO 'structured binding' is fine.

nathan
Jason Merrill June 30, 2017, 7:15 p.m. UTC | #2
On Fri, Jun 30, 2017 at 1:26 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> As C++17 decided to rename decompositions to structured bindings, this
> patch attempts to adjust the diagnostics by replacing
> "decomposition declaration" with "structured binding".
> Or shall I use "structured binding declaration" instead (or is that too
> longer/verbose), or something different?

"structured binding declaration" is better when you're talking about
the declaration syntax.  When you're talking about the feature in the
first hunk, "structured bindings".  "structured binding variable" is
good in the one hunk where you've used that.

Jason
Jakub Jelinek June 30, 2017, 7:35 p.m. UTC | #3
On Fri, Jun 30, 2017 at 03:15:21PM -0400, Jason Merrill wrote:
> On Fri, Jun 30, 2017 at 1:26 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> > Hi!
> >
> > As C++17 decided to rename decompositions to structured bindings, this
> > patch attempts to adjust the diagnostics by replacing
> > "decomposition declaration" with "structured binding".
> > Or shall I use "structured binding declaration" instead (or is that too
> > longer/verbose), or something different?
> 
> "structured binding declaration" is better when you're talking about
> the declaration syntax.  When you're talking about the feature in the
> first hunk, "structured bindings".  "structured binding variable" is
> good in the one hunk where you've used that.

What about that:
        case cdk_decomp:
-         name = "decomposition";
+         name = "structured binding";
          break;
hunk?

Also, aren't there too many "declar*" roots, both in the previous
"decomposition declaration cannot be declared"
and
"structured binding declaration cannot be declared"
?  I mean wouldn't be "structured bindings cannot be declared"
or "structured binding cannot be declared" better in that case?

	Jakub
Jason Merrill June 30, 2017, 7:44 p.m. UTC | #4
On Fri, Jun 30, 2017 at 3:35 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Fri, Jun 30, 2017 at 03:15:21PM -0400, Jason Merrill wrote:
>> On Fri, Jun 30, 2017 at 1:26 PM, Jakub Jelinek <jakub@redhat.com> wrote:
>> > Hi!
>> >
>> > As C++17 decided to rename decompositions to structured bindings, this
>> > patch attempts to adjust the diagnostics by replacing
>> > "decomposition declaration" with "structured binding".
>> > Or shall I use "structured binding declaration" instead (or is that too
>> > longer/verbose), or something different?
>>
>> "structured binding declaration" is better when you're talking about
>> the declaration syntax.  When you're talking about the feature in the
>> first hunk, "structured bindings".  "structured binding variable" is
>> good in the one hunk where you've used that.
>
> What about that:
>         case cdk_decomp:
> -         name = "decomposition";
> +         name = "structured binding";
>           break;
> hunk?

I think that's OK.

> Also, aren't there too many "declar*" roots, both in the previous
> "decomposition declaration cannot be declared"
> and
> "structured binding declaration cannot be declared"
> ?  I mean wouldn't be "structured bindings cannot be declared"
> or "structured binding cannot be declared" better in that case?

Well, the term "structured binding" refers to one of the names
declared by the declaration, not the declaration as a whole, and those
errors refer to the latter.  We could change "cannot be declared" to
something else, perhaps just drop the "declared", so e.g. "structured
binding declaration cannot be %<constexpr%>"?  Or "cannot use X
specifier"?

Jason
diff mbox

Patch

--- gcc/cp/parser.c.jj	2017-06-30 11:03:18.000000000 +0200
+++ gcc/cp/parser.c	2017-06-30 11:23:26.430710676 +0200
@@ -13136,7 +13136,7 @@  cp_parser_decomposition_declaration (cp_
     }
 
   if (cxx_dialect < cxx1z)
-    pedwarn (loc, 0, "decomposition declaration only available with "
+    pedwarn (loc, 0, "structured binding only available with "
 		     "-std=c++1z or -std=gnu++1z");
 
   tree pushed_scope;
@@ -13185,7 +13185,7 @@  cp_parser_decomposition_declaration (cp_
 
   if (v.is_empty ())
     {
-      error_at (loc, "empty decomposition declaration");
+      error_at (loc, "empty structured binding");
       decl = error_mark_node;
     }
 
--- gcc/cp/decl.c.jj	2017-06-30 09:49:24.000000000 +0200
+++ gcc/cp/decl.c	2017-06-30 11:22:59.496040927 +0200
@@ -7486,8 +7486,8 @@  cp_finish_decomp (tree decl, tree first,
 
 	  if (init == error_mark_node || eltype == error_mark_node)
 	    {
-	      inform (dloc, "in initialization of decomposition variable %qD",
-		      v[i]);
+	      inform (dloc, "in initialization of structured binding "
+		      "variable %qD", v[i]);
 	      goto error_out;
 	    }
 	  /* Save the decltype away before reference collapse.  */
@@ -10137,7 +10137,7 @@  grokdeclarator (const cp_declarator *dec
 	  break;
 
 	case cdk_decomp:
-	  name = "decomposition";
+	  name = "structured binding";
 	  break;
 
 	case cdk_error:
@@ -10591,43 +10591,43 @@  grokdeclarator (const cp_declarator *dec
 			? declarator->declarator->id_loc : declarator->id_loc);
       if (inlinep)
 	error_at (declspecs->locations[ds_inline],
-		  "decomposition declaration cannot be declared %<inline%>");
+		  "structured binding cannot be declared %<inline%>");
       if (typedef_p)
 	error_at (declspecs->locations[ds_typedef],
-		  "decomposition declaration cannot be declared %<typedef%>");
+		  "structured binding cannot be declared %<typedef%>");
       if (constexpr_p)
-	error_at (declspecs->locations[ds_constexpr], "decomposition "
-		  "declaration cannot be declared %<constexpr%>");
+	error_at (declspecs->locations[ds_constexpr], "structured "
+		  "binding cannot be declared %<constexpr%>");
       if (thread_p)
 	error_at (declspecs->locations[ds_thread],
-		  "decomposition declaration cannot be declared %qs",
+		  "structured binding cannot be declared %qs",
 		  declspecs->gnu_thread_keyword_p
 		  ? "__thread" : "thread_local");
       if (concept_p)
 	error_at (declspecs->locations[ds_concept],
-		  "decomposition declaration cannot be declared %<concept%>");
+		  "structured binding cannot be declared %<concept%>");
       switch (storage_class)
 	{
 	case sc_none:
 	  break;
 	case sc_register:
-	  error_at (loc, "decomposition declaration cannot be declared "
+	  error_at (loc, "structured binding cannot be declared "
 		    "%<register%>");
 	  break;
 	case sc_static:
-	  error_at (loc, "decomposition declaration cannot be declared "
+	  error_at (loc, "structured binding cannot be declared "
 		    "%<static%>");
 	  break;
 	case sc_extern:
-	  error_at (loc, "decomposition declaration cannot be declared "
+	  error_at (loc, "structured binding cannot be declared "
 		    "%<extern%>");
 	  break;
 	case sc_mutable:
-	  error_at (loc, "decomposition declaration cannot be declared "
+	  error_at (loc, "structured binding cannot be declared "
 		    "%<mutable%>");
 	  break;
 	case sc_auto:
-	  error_at (loc, "decomposition declaration cannot be declared "
+	  error_at (loc, "structured binding cannot be declared "
 		    "C++98 %<auto%>");
 	  break;
 	default:
@@ -10638,7 +10638,7 @@  grokdeclarator (const cp_declarator *dec
 	{
 	  if (type != error_mark_node)
 	    {
-	      error_at (loc, "decomposition declaration cannot be declared "
+	      error_at (loc, "structured binding cannot be declared "
 			"with type %qT", type);
 	      inform (loc,
 		      "type must be cv-qualified %<auto%> or reference to "
--- gcc/testsuite/g++.dg/cpp1z/decomp1.C.jj	2016-11-14 08:52:18.309721554 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp1.C	2017-06-30 11:38:33.323750539 +0200
@@ -7,10 +7,10 @@  struct S { int a; signed char b; float c
 int
 main ()
 {
-  auto & [ c, d ] = a;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto [ e, f ] = a;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto [ g, h, i ] = s;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto & [ j, k, l ] = s;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto & [ c, d ] = a;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto [ e, f ] = a;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto [ g, h, i ] = s;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto & [ j, k, l ] = s;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
   c++;
   d++;
   e += 6;
--- gcc/testsuite/g++.dg/cpp1z/decomp2.C.jj	2016-11-14 08:52:18.309721554 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp2.C	2017-06-30 11:38:33.370749983 +0200
@@ -9,12 +9,12 @@  __complex__ int c = 7 + 8i;
 int
 main ()
 {
-  auto & [ d, e, f, g ] = a;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto [ h, i, j, k ] = a;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto [ l, m ] = b;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto & [ n, o ] = b;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto & [ p, q ] = c;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto [ r, s ] = c;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto & [ d, e, f, g ] = a;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto [ h, i, j, k ] = a;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto [ l, m ] = b;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto & [ n, o ] = b;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto & [ p, q ] = c;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto [ r, s ] = c;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
   d += 10;
   e += 11;
   f += 12;
--- gcc/testsuite/g++.dg/cpp1z/decomp3.C.jj	2016-11-14 08:52:18.309721554 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp3.C	2017-06-30 11:39:08.560333602 +0200
@@ -9,36 +9,36 @@  B baz ();
 void
 test (A &b, B c)
 {
-  int && [ d ] = c;			// { dg-error "decomposition declaration cannot be declared with type 'int'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  char & [ e, f, ff ] { b };		// { dg-error "decomposition declaration cannot be declared with type 'char'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  auto&[g,h,i]=b;			// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } }
-  decltype (auto) [ j ] = c;		// { dg-error "decomposition declaration cannot be declared with type 'decltype.auto.'" "" { target c++14 } }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  int && [ d ] = c;			// { dg-error "structured binding cannot be declared with type 'int'" }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  char & [ e, f, ff ] { b };		// { dg-error "structured binding cannot be declared with type 'char'" }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  auto&[g,h,i]=b;			// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } }
+  decltype (auto) [ j ] = c;		// { dg-error "structured binding cannot be declared with type 'decltype.auto.'" "" { target c++14 } }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
 					// { dg-error "expected primary-expression before 'decltype'" "" { target c++11_down } .-2 }
   auto & & && & [ m, n, o ] = b;	// { dg-error "multiple ref-qualifiers" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  constexpr auto [ p ] = c;		// { dg-error "decomposition declaration cannot be declared 'constexpr'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  constexpr auto [ p ] = c;		// { dg-error "structured binding cannot be declared 'constexpr'" }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
   friend auto [ q ] = c;		// { dg-error "'friend' used outside of class" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  typedef auto [ r ] = c;		// { dg-error "decomposition declaration cannot be declared 'typedef'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  inline auto [ s ] = c;		// { dg-error "decomposition declaration cannot be declared 'inline'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  typedef auto [ r ] = c;		// { dg-error "structured binding cannot be declared 'typedef'" }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  inline auto [ s ] = c;		// { dg-error "structured binding cannot be declared 'inline'" }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
   __restrict auto [ t ] = c;		// { dg-error "invalid use of 'restrict'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  long long auto [ u ] = c;		// { dg-error "'long long' invalid for 'decomposition'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  long long auto [ u ] = c;		// { dg-error "'long long' invalid for 'structured binding'" }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
   virtual auto [ v ] = c;		// { dg-error "'virtual' outside class declaration" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
   explicit auto [ w ] = c;		// { dg-error "'explicit' outside class declaration" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  static auto [ x ] = c;		// { dg-error "decomposition declaration cannot be declared 'static'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  extern auto [ y ] { c };		// { dg-error "decomposition declaration cannot be declared 'extern'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  static auto [ x ] = c;		// { dg-error "structured binding cannot be declared 'static'" }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  extern auto [ y ] { c };		// { dg-error "structured binding cannot be declared 'extern'" }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
 }
 
 void
@@ -52,15 +52,15 @@  void
 test3 (A &b, B c)
 {
   auto [ d, e, f ] = arr;		// { dg-error "only 3 names provided while 'int .4.' decomposes into 4 elements" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
   auto & [ g, h, i, j, k ] = arr;	// { dg-error "5 names provided while 'int .4.' decomposes into 4 elements" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
   auto [ l, m ] = b;			// { dg-error "only 2 names provided while 'A' decomposes into 3 elements" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
   auto & [ n, o, p, q ] = b;		// { dg-error "4 names provided while 'A' decomposes into 3 elements" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  auto [] { c };			// { dg-error "empty decomposition declaration" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  auto [] { c };			// { dg-error "empty structured binding" }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
   auto [ r, s ] = c;			// { dg-error "2 names provided while 'B' decomposes into 1 elements" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
 }
--- gcc/testsuite/g++.dg/cpp1z/decomp4.C.jj	2017-01-11 12:03:54.244784029 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp4.C	2017-06-30 11:38:33.379749877 +0200
@@ -15,18 +15,18 @@  void
 test (A &a, B &b, C &c, D &d, E &e, F &f, G &g, H &h, I &i)
 {
   auto [ j ] = a;			// { dg-error "cannot decompose class type 'A' because it has an anonymous struct member" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
   auto [ k ] { b };			// { dg-error "cannot decompose class type 'B' because it has an anonymous union member" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
   auto [ l, l2 ] = c;			// { dg-error "cannot decompose non-public member 'C::b' of 'C'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  auto [ m ] = d;			// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  auto [ m ] = d;			// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } }
   auto [ n ] { e };			// { dg-error "cannot decompose non-public member 'E::a' of 'E'" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  auto [ o ] { f };			// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  auto [ o ] { f };			// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } }
   auto & [ p ] { g };			// { dg-error "cannot decompose class type 'G': both it and its base class 'F' have non-static data members" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
-  auto [ q ] { h };			// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+  auto [ q ] { h };			// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } }
   auto [ r ] { i };			// { dg-error "cannot decompose class type 'I': its base classes 'F' and 'H' have non-static data members" }
-					// { dg-warning "decomposition declaration only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with -std=c..1z or -std=gnu..1z" "" { target c++14_down } .-1 }
 }
--- gcc/testsuite/g++.dg/cpp1z/decomp5.C.jj	2016-11-14 08:52:18.310721542 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp5.C	2017-06-30 11:38:33.406749557 +0200
@@ -12,19 +12,19 @@  main ()
       x.i = i;
       x.j = 2 * i++;
     }
-  for (auto & [ x, y ] : a)	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  for (auto & [ x, y ] : a)	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     {
       x += 2;
       y += 3;
     }
   i = 0;
-  for (const auto [ u, v ] : a)	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  for (const auto [ u, v ] : a)	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     {
       if (u != i + 2 || v != 2 * i++ + 3)
 	__builtin_abort ();
     }
   i = 0;
-  for (auto [ x, y ] : a)	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  for (auto [ x, y ] : a)	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     {
       x += 4;
       y += 5;
--- gcc/testsuite/g++.dg/cpp1z/decomp6.C.jj	2017-01-19 16:58:14.869362536 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp6.C	2017-06-30 11:38:33.411749498 +0200
@@ -23,7 +23,7 @@  main ()
     if (ccnt != 6 || dcnt || cccnt || tccnt)
       __builtin_abort ();
     {
-      auto [b,c,d,e,f,g] = a;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+      auto [b,c,d,e,f,g] = a;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
       if (ccnt != 6 || dcnt || cccnt || tccnt != 6)
 	__builtin_abort ();
       b.a++;
@@ -34,7 +34,7 @@  main ()
       if (&b == &a[0] || &c == &a[1] || &d == &a[2] || &e == &a[3] || &f == &a[4] || &g == &a[5])
 	__builtin_abort ();
       {
-	auto&[ h, i, j, k, l, m ] = a;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+	auto&[ h, i, j, k, l, m ] = a;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
 	if (ccnt != 6 || dcnt || cccnt || tccnt != 6)
 	  __builtin_abort ();
 	j.a += 4;
@@ -59,7 +59,7 @@  main ()
     if (ccnt != 12 || dcnt != 12 || cccnt || tccnt != 6)
       __builtin_abort ();
     {
-      auto [b,c,d,e,f,g] { a };		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+      auto [b,c,d,e,f,g] { a };		// { dg-warning "structured binding only available with" "" { target c++14_down } }
       if (ccnt != 12 || dcnt != 12 || cccnt != 6 || tccnt != 6)
 	__builtin_abort ();
       b.a++;
@@ -70,7 +70,7 @@  main ()
       if (&b == &a[0] || &c == &a[1] || &d == &a[2] || &e == &a[3] || &f == &a[4] || &g == &a[5])
 	__builtin_abort ();
       {
-	auto&[ h, i, j, k, l, m ] {a};	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+	auto&[ h, i, j, k, l, m ] {a};	// { dg-warning "structured binding only available with" "" { target c++14_down } }
 	if (ccnt != 12 || dcnt != 12 || cccnt != 6 || tccnt != 6)
 	  __builtin_abort ();
 	j.a += 4;
@@ -95,7 +95,7 @@  main ()
     if (ccnt != 18 || dcnt != 24 || cccnt != 6 || tccnt != 6)
       __builtin_abort ();
     {
-      auto [b,c,d,e,f,g] ( a );		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+      auto [b,c,d,e,f,g] ( a );		// { dg-warning "structured binding only available with" "" { target c++14_down } }
       if (ccnt != 18 || dcnt != 24 || cccnt != 12 || tccnt != 6)
 	__builtin_abort ();
       b.a++;
@@ -106,7 +106,7 @@  main ()
       if (&b == &a[0] || &c == &a[1] || &d == &a[2] || &e == &a[3] || &f == &a[4] || &g == &a[5])
 	__builtin_abort ();
       {
-	auto&[ h, i, j, k, l, m ] (a);	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+	auto&[ h, i, j, k, l, m ] (a);	// { dg-warning "structured binding only available with" "" { target c++14_down } }
 	if (ccnt != 18 || dcnt != 24 || cccnt != 12 || tccnt != 6)
 	  __builtin_abort ();
 	j.a += 4;
--- gcc/testsuite/g++.dg/cpp1z/decomp7.C.jj	2016-11-14 08:52:18.310721542 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp7.C	2017-06-30 11:38:33.416749439 +0200
@@ -10,14 +10,14 @@  template <typename T, typename U>
 void
 foo (T &x, U &y)
 {
-  auto & [ c, d ] = a;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto [ e, f ] = a;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto [ g, h, i ] = sa;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto & [ j, k, l ] = sa;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto & [ m, n ] = x;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto [ o, p ] = x;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto [ q, r, s ] = y;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
-  auto & [ t, u, v ] = y;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto & [ c, d ] = a;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto [ e, f ] = a;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto [ g, h, i ] = sa;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto & [ j, k, l ] = sa;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto & [ m, n ] = x;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto [ o, p ] = x;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto [ q, r, s ] = y;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
+  auto & [ t, u, v ] = y;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
   c += 1;
   e += 2;
   g += 3;
--- gcc/testsuite/g++.dg/cpp1z/decomp8.C.jj	2016-11-14 08:52:18.311721530 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp8.C	2017-06-30 11:38:33.421749380 +0200
@@ -14,19 +14,19 @@  foo (T &b)
       x.i = i;
       x.j = 2 * i++;
     }
-  for (auto & [ x, y ] : a)	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  for (auto & [ x, y ] : a)	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     {
       x += 2;
       y += 3;
     }
   i = 0;
-  for (const auto [ u, v ] : a)	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  for (const auto [ u, v ] : a)	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     {
       if (u != i + 2 || v != 2 * i++ + 3)
 	__builtin_abort ();
     }
   i = 0;
-  for (auto [ x, y ] : a)	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  for (auto [ x, y ] : a)	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     {
       x += 4;
       y += 5;
@@ -45,19 +45,19 @@  foo (T &b)
       x.i = i;
       x.j = 2 * i++;
     }
-  for (auto & [ x, y ] : b)	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  for (auto & [ x, y ] : b)	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     {
       x -= 2;
       y -= 3;
     }
   i = 0;
-  for (const auto [ u, v ] : b)	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  for (const auto [ u, v ] : b)	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     {
       if (u != i - 2 || v != 2 * i++ - 3)
 	__builtin_abort ();
     }
   i = 0;
-  for (auto [ x, y ] : b)	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  for (auto [ x, y ] : b)	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     {
       x -= 4;
       y -= 5;
--- gcc/testsuite/g++.dg/cpp1z/decomp13.C.jj	2016-11-15 18:04:19.185977631 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp13.C	2017-06-30 11:38:32.820756491 +0200
@@ -11,27 +11,27 @@  namespace std {
 template<> struct std::tuple_size<B> { static constexpr int value = 2; };
 template<int I> struct std::tuple_element<I,B> { typedef int type; };
 
-auto [ aa, bb, cc, dd ] = a;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+auto [ aa, bb, cc, dd ] = a;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
 // { dg-final { scan-assembler "_ZDC2aa2bb2cc2ddE" } }
-const auto & [ e, f, g, h ] = a;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+const auto & [ e, f, g, h ] = a;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
 // { dg-final { scan-assembler "_ZDC1e1f1g1hE" } }
-auto [ ee, ff ] = b;			// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+auto [ ee, ff ] = b;			// { dg-warning "structured binding only available with" "" { target c++14_down } }
 // { dg-final { scan-assembler "_ZDC2ee2ffE" } }
-auto & [ gg, hh ] = b;			// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+auto & [ gg, hh ] = b;			// { dg-warning "structured binding only available with" "" { target c++14_down } }
 // { dg-final { scan-assembler "_ZDC2gg2hhE" } }
 namespace N
 {
   namespace M
   {
-    auto [ i, j, k, l ] = a;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+    auto [ i, j, k, l ] = a;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
     // { dg-final { scan-assembler "_ZN1N1MDC1i1j1k1lEE" } }
-    auto & [ m, n, o, ppp ] = a;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+    auto & [ m, n, o, ppp ] = a;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     // { dg-final { scan-assembler "_ZN1N1MDC1m1n1o3pppEE" } }
-    auto [ ii, jj ] = b;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+    auto [ ii, jj ] = b;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
     // { dg-final { scan-assembler "_ZN1N1MDC2ii2jjEE" } }
     // { dg-final { scan-assembler "_ZN1N1M2iiE" } }
     // { dg-final { scan-assembler "_ZN1N1M2jjE" } }
-    auto & [ mm, nn ] = b;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+    auto & [ mm, nn ] = b;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
     // { dg-final { scan-assembler "_ZN1N1MDC2mm2nnEE" } }
     // { dg-final { scan-assembler "_ZN1N1M2mmE" } }
     // { dg-final { scan-assembler "_ZN1N1M2nnE" } }
@@ -39,14 +39,14 @@  namespace N
 }
 namespace std
 {
-  auto [ i2, j2, k2, l2 ] = a;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto [ i2, j2, k2, l2 ] = a;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
   // { dg-final { scan-assembler "_ZStDC2i22j22k22l2E" } }
-  auto [ vv, ww ] = b;			// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto [ vv, ww ] = b;			// { dg-warning "structured binding only available with" "" { target c++14_down } }
   // { dg-final { scan-assembler "_ZStDC2vv2wwE" } }
   // { dg-final { scan-assembler "_ZSt2vv" } }
   // { dg-final { scan-assembler "_ZSt2ww" } }
 }
 namespace
 {
-  auto [ v, w, x, y ] = a;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto [ v, w, x, y ] = a;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
 }
--- gcc/testsuite/g++.dg/cpp1z/decomp14.C.jj	2016-11-15 18:06:17.286482555 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp14.C	2017-06-30 11:38:33.241751510 +0200
@@ -18,13 +18,13 @@  struct M : virtual J, L {};
 void
 foo (C &c, F &f, G &g, H &h, I &i, K &k, M &m)
 {
-  auto [ ci ] = c;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto [ ci ] = c;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
   auto [ fi ] = f;		// { dg-error "cannot decompose class type 'F': both it and its base class 'A' have non-static data members" }
-				// { dg-warning "decomposition declaration only available with" "" { target c++14_down } .-1 }
+				// { dg-warning "structured binding only available with" "" { target c++14_down } .-1 }
   auto [ gi ] = g;		// { dg-error "cannot decompose class type 'G': its base classes 'A' and 'E' have non-static data members" }
-				// { dg-warning "decomposition declaration only available with" "" { target c++14_down } .-1 }
-  auto [ hi ] = h;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+				// { dg-warning "structured binding only available with" "" { target c++14_down } .-1 }
+  auto [ hi ] = h;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
   auto [ ki ] = k;		// { dg-error "'B' is an ambiguous base of 'K'" }
-				// { dg-warning "decomposition declaration only available with" "" { target c++14_down } .-1 }
-  auto [ mi ] = m;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+				// { dg-warning "structured binding only available with" "" { target c++14_down } .-1 }
+  auto [ mi ] = m;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
 }
--- gcc/testsuite/g++.dg/cpp1z/decomp18.C.jj	2016-11-25 09:49:43.067449767 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp18.C	2017-06-30 11:38:33.246751450 +0200
@@ -7,6 +7,6 @@  void
 foo ()
 {
   int z = 0;
-  for (auto & [ b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s ] : a)	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  for (auto & [ b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s ] : a)	// { dg-warning "structured binding only available with" "" { target c++14_down } }
     z += b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s;
 }
--- gcc/testsuite/g++.dg/cpp1z/decomp19.C.jj	2017-01-05 22:12:37.429122868 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp19.C	2017-06-30 11:38:33.318750598 +0200
@@ -8,6 +8,6 @@  main ()
   int x = 99;
   struct S { int &x; };
   S s{x};
-  auto [p] = s;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto [p] = s;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
   return p - 99;
 }
--- gcc/testsuite/g++.dg/cpp1z/decomp22.C.jj	2017-01-24 23:33:03.471455956 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp22.C	2017-06-30 11:38:33.328750480 +0200
@@ -16,6 +16,6 @@  int &&get (C<E...> &&);
 int
 foo (C<int> t)
 {
-  auto[x0] = t;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto[x0] = t;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
   return x0;
 }
--- gcc/testsuite/g++.dg/cpp1z/decomp23.C.jj	2017-01-24 23:33:03.471455956 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp23.C	2017-06-30 11:38:33.332750433 +0200
@@ -7,6 +7,6 @@ 
 int
 foo (std::tuple<int> t)
 {
-  auto [x0] = t;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto [x0] = t;	// { dg-warning "structured binding only available with" "" { target c++14_down } }
   return x0;
 }
--- gcc/testsuite/g++.dg/cpp1z/decomp24.C.jj	2017-01-25 23:35:44.996344375 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp24.C	2017-06-30 11:38:33.337750374 +0200
@@ -7,5 +7,5 @@  foo ()
 {
   int a {10};
   auto [b] { [&a](){} };	// { dg-error "cannot decompose lambda closure type" }
-  return b - a;			// { dg-warning "decomposition declaration only available with" "" { target c++14_down } .-1 }
+  return b - a;			// { dg-warning "structured binding only available with" "" { target c++14_down } .-1 }
 }
--- gcc/testsuite/g++.dg/cpp1z/decomp25.C.jj	2017-02-06 21:02:40.511972113 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp25.C	2017-06-30 11:38:33.342750314 +0200
@@ -7,9 +7,9 @@  struct S
 {
   enum E { A };
   void f () { auto [x] = 0; x++; }	// { dg-error "cannot decompose non-array non-class type" }
-					// { dg-warning "decomposition declaration only available with" "" { target c++14_down } .-1 }
+					// { dg-warning "structured binding only available with" "" { target c++14_down } .-1 }
   void g (T t) { auto [y] = t; y++; }	// { dg-error "cannot decompose non-array non-class type" }
-};					// { dg-warning "decomposition declaration only available with" "" { target c++14_down } .-1 }
+};					// { dg-warning "structured binding only available with" "" { target c++14_down } .-1 }
 
 int
 main ()
--- gcc/testsuite/g++.dg/cpp1z/decomp26.C.jj	2017-02-21 18:59:36.565649675 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp26.C	2017-06-30 11:38:33.360750101 +0200
@@ -2,5 +2,5 @@ 
 // { dg-do compile { target c++11 } }
 // { dg-options "" }
 
-template<typename T> T &make();	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } .+1 }
+template<typename T> T &make();	// { dg-warning "structured binding only available with" "" { target c++14_down } .+1 }
 auto [d1, d2] = make<int>();	// { dg-error "cannot decompose non-array non-class type" }
--- gcc/testsuite/g++.dg/cpp1z/decomp28.C.jj	2017-04-11 22:50:15.952478269 +0200
+++ gcc/testsuite/g++.dg/cpp1z/decomp28.C	2017-06-30 11:38:33.365750042 +0200
@@ -15,14 +15,14 @@  template <int N>
 void
 foo (std::tuple<int> b)
 {
-  auto [c] = b;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto [c] = b;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
 }
 
 template <typename T>
 void
 bar (std::tuple<T> b)
 {
-  auto [c] = b;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  auto [c] = b;		// { dg-warning "structured binding only available with" "" { target c++14_down } }
 }
 
 void
@@ -35,5 +35,5 @@  baz (std::tuple<int> b)
 int
 main ()
 {
-  [](auto) { [](std::tuple<int> b) { auto[c] = b; }; } (0); // { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
+  [](auto) { [](std::tuple<int> b) { auto[c] = b; }; } (0); // { dg-warning "structured binding only available with" "" { target c++14_down } }
 }