From 7950124ec2fe2ae52d99766ce4eaeed7ffc8a8bd Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 20 Feb 2017 01:05:54 -0500 Subject: [PATCH] PR c++/79566 - elaborated-type-specifier in range for * parser.c (cp_parser_simple_declaration): Fix check for type definition. From-SVN: r245591 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/parser.c | 2 +- gcc/testsuite/g++.dg/cpp0x/range-for34.C | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/range-for34.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ceef9db73c8..8ff836e28d0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2017-02-19 Jason Merrill + PR c++/79566 - elaborated-type-specifier in range for + * parser.c (cp_parser_simple_declaration): Fix check for type + definition. + PR c++/79400 - confusing suggestion of 'noexcept' * parser.c (cp_parser_exception_specification_opt): Remove suggestion for deprecated dynamic exception-specification. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 72597f3e9f2..0146596d154 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -12883,7 +12883,7 @@ cp_parser_simple_declaration (cp_parser* parser, break; else if (maybe_range_for_decl) { - if (declares_class_or_enum && token->type == CPP_COLON) + if ((declares_class_or_enum & 2) && token->type == CPP_COLON) permerror (decl_specifiers.locations[ds_type_spec], "types may not be defined in a for-range-declaration"); break; diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for34.C b/gcc/testsuite/g++.dg/cpp0x/range-for34.C new file mode 100644 index 00000000000..2041848294d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for34.C @@ -0,0 +1,16 @@ +// PR c++/79566 +// { dg-do compile { target c++11 } } + +struct X { + struct Y { }; + + Y* begin(); + Y* end(); +}; + +void f() +{ + X x; + for (struct X::Y& y : x) + ; +} -- 2.30.2