From d525c67f13c824db4b0d9f9d8107fd398d1fcdf0 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 12 Jun 2018 15:53:02 -0400 Subject: [PATCH] PR c++/86060 - ICE on range for with -std=c++98. * parser.c (cp_parser_init_statement): Don't clobber *decl after pedwarn. From-SVN: r261523 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 9 +++------ gcc/testsuite/g++.dg/cpp0x/range-for35.C | 8 ++++++++ gcc/testsuite/g++.dg/cpp0x/range-for9.C | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/range-for35.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2a5f0e0985ef..12758978136e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-06-12 Jason Merrill + + PR c++/86060 - ICE on range for with -std=c++98. + * parser.c (cp_parser_init_statement): Don't clobber *decl after + pedwarn. + 2018-05-07 Jason Merrill PR c++/85646 - lambda visibility. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9a65d9452328..7ba1f5317131 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -12103,12 +12103,9 @@ cp_parser_init_statement (cp_parser* parser, tree *decl) cp_lexer_consume_token (parser->lexer); is_range_for = true; if (cxx_dialect < cxx11) - { - pedwarn (cp_lexer_peek_token (parser->lexer)->location, 0, - "range-based % loops only available with " - "-std=c++11 or -std=gnu++11"); - *decl = error_mark_node; - } + pedwarn (cp_lexer_peek_token (parser->lexer)->location, 0, + "range-based % loops only available with " + "-std=c++11 or -std=gnu++11"); } else /* The ';' is not consumed yet because we told diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for35.C b/gcc/testsuite/g++.dg/cpp0x/range-for35.C new file mode 100644 index 000000000000..c77a5af5a449 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for35.C @@ -0,0 +1,8 @@ +// PR c++/86060 +// { dg-options -Wpedantic } + +template void foo(T (&a)[8]) { + for (int i : a) // { dg-warning "range-based" "" { target c++98_only } } + i; +} +void fn1() { foo; } diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for9.C b/gcc/testsuite/g++.dg/cpp0x/range-for9.C index 6a50ec36c141..eaa5b4068800 100644 --- a/gcc/testsuite/g++.dg/cpp0x/range-for9.C +++ b/gcc/testsuite/g++.dg/cpp0x/range-for9.C @@ -5,6 +5,6 @@ void test() { int a[] = {0,1,2}; - for (int x : a) // { dg-error "range-based 'for'" } + for (int x : a) // { dg-error "range-based 'for'|forming reference" } ; } -- 2.47.2