aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-05-30 13:32:54 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-05-30 13:32:54 -0400
commitcd7fa7a74b672bb7d978807b2190feaf57afc43a (patch)
tree7d8cc3be73907df67e1b449d62e4540280174ecc
parentd555daaf92d9c20e44d78e740bcc8b6501faff24 (diff)
downloadgcc-cd7fa7a74b672bb7d978807b2190feaf57afc43a.zip
gcc-cd7fa7a74b672bb7d978807b2190feaf57afc43a.tar.gz
gcc-cd7fa7a74b672bb7d978807b2190feaf57afc43a.tar.bz2
Improve error recovery for structured binding in condition.
* parser.c (cp_parser_check_condition_declarator): Handle cp_error_declarator. From-SVN: r260968
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parser.c7
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/decomp16.C2
3 files changed, 11 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 37874c0..07fbafa 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2018-05-30 Jason Merrill <jason@redhat.com>
+
+ * parser.c (cp_parser_check_condition_declarator): Handle
+ cp_error_declarator.
+
2018-05-30 Jonathan Wakely <jwakely@redhat.com>
* typeck.c (cxx_sizeof_or_alignof_type): Return size_one_node instead
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index d17beb8..de090d4 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -11594,10 +11594,13 @@ cp_parser_check_condition_declarator (cp_parser* parser,
cp_declarator *declarator,
location_t loc)
{
- if (function_declarator_p (declarator)
+ if (declarator == cp_error_declarator
+ || function_declarator_p (declarator)
|| declarator->kind == cdk_array)
{
- if (declarator->kind == cdk_array)
+ if (declarator == cp_error_declarator)
+ /* Already complained. */;
+ else if (declarator->kind == cdk_array)
error_at (loc, "condition declares an array");
else
error_at (loc, "condition declares a function");
diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp16.C b/gcc/testsuite/g++.dg/cpp1z/decomp16.C
index dad69b8..7589c80 100644
--- a/gcc/testsuite/g++.dg/cpp1z/decomp16.C
+++ b/gcc/testsuite/g++.dg/cpp1z/decomp16.C
@@ -8,7 +8,7 @@ void
foo ()
{
auto [ a, b ] = A ();
- for (; auto [ a, b ] = A (); ) // { dg-error "expected|no match" }
+ for (; auto [ a, b ] = A (); ) // { dg-error "expected" }
;
for (; false; auto [ a, b ] = A ()) // { dg-error "expected" }
;