From 343b4fc0f8d27ab18f1ccf7125ee4b58a7f53f5f Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 1 Apr 2013 17:19:03 -0400 Subject: [PATCH] re PR c++/56794 (C++11 Error in range-based for with parameter pack array) PR c++/56794 * parser.c (cp_parser_range_for): Don't try to do auto deduction in a template if the type of the range is incomplete. From-SVN: r197328 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 5 ++++- gcc/testsuite/g++.dg/cpp0x/range-for24.C | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/range-for24.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 58c2b149c20e..bd0368b400d0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-04-01 Jason Merrill + + PR c++/56794 + * parser.c (cp_parser_range_for): Don't try to do auto deduction + in a template if the type of the range is incomplete. + 2013-03-29 Jason Merrill PR c++/56774 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index f875b66ffa4a..f5c60d3c70e9 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -9364,7 +9364,10 @@ cp_parser_range_for (cp_parser *parser, tree scope, tree init, tree range_decl) range_expr = error_mark_node; stmt = begin_range_for_stmt (scope, init); finish_range_for_decl (stmt, range_decl, range_expr); - if (!type_dependent_expression_p (range_expr) + if (range_expr != error_mark_node + && !type_dependent_expression_p (range_expr) + /* The length of an array might be dependent. */ + && COMPLETE_TYPE_P (TREE_TYPE (range_expr)) /* do_auto_deduction doesn't mess with template init-lists. */ && !BRACE_ENCLOSED_INITIALIZER_P (range_expr)) do_range_for_auto_deduction (range_decl, range_expr); diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for24.C b/gcc/testsuite/g++.dg/cpp0x/range-for24.C new file mode 100644 index 000000000000..b4a5b185bd78 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for24.C @@ -0,0 +1,15 @@ +// PR c++/56794 +// { dg-require-effective-target c++11 } + +template +static void Colors() +{ + static const int colors[] = { values... }; + + for(auto c: colors) { } +} + +int main() +{ + Colors<0,1,2> (); +} -- 2.47.2