From 3dd55b2f9fdbf102dad43fca46578f4054174d45 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 18 Jun 2013 22:20:10 +0000 Subject: [PATCH] re PR c++/53211 (range-based 'for' expression of type 'const int []' has incomplete type) /cp 2013-06-18 Paolo Carlini PR c++/53211 * pt.c (type_dependent_expression_p): Handle an array of unknown bound depending on a variadic parameter. * parser.c (cp_parser_range_for): Revert PR56794 changes. /testsuite 2013-06-18 Paolo Carlini PR c++/53211 * g++.dg/cpp0x/decltype55.C: New. From-SVN: r200178 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/parser.c | 5 +---- gcc/cp/pt.c | 23 +++++++++++++++++++++++ gcc/testsuite/ChangeLog | 9 +++++++-- gcc/testsuite/g++.dg/cpp0x/decltype55.C | 20 ++++++++++++++++++++ 5 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/decltype55.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1b58ba00f4b..7e25e525374 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2013-06-18 Paolo Carlini + + PR c++/53211 + * pt.c (type_dependent_expression_p): Handle an array of unknown + bound depending on a variadic parameter. + * parser.c (cp_parser_range_for): Revert PR56794 changes. + 2013-06-17 Richard Biener * cp-tree.h (ANON_AGGRNAME_FORMAT, ANON_AGGRNAME_P): Move to tree.h. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index d844d1553a0..904ae0b8003 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -9750,10 +9750,7 @@ 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 (range_expr != error_mark_node - && !type_dependent_expression_p (range_expr) - /* The length of an array might be dependent. */ - && COMPLETE_TYPE_P (complete_type (TREE_TYPE (range_expr))) + if (!type_dependent_expression_p (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/cp/pt.c b/gcc/cp/pt.c index 3602fcd2dd8..25cbf3100cf 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -20079,6 +20079,29 @@ type_dependent_expression_p (tree expression) && VAR_HAD_UNKNOWN_BOUND (expression)) return true; + /* An array of unknown bound depending on a variadic parameter, eg: + + template + void foo (Args... args) + { + int arr[] = { args... }; + } + + template + void bar () + { + int arr[] = { vals... }; + } + + If the array has no length and has an initializer, it must be that + we couldn't determine its length in cp_complete_array_type because + it is dependent. */ + if (VAR_P (expression) + && TREE_CODE (TREE_TYPE (expression)) == ARRAY_TYPE + && !TYPE_DOMAIN (TREE_TYPE (expression)) + && DECL_INITIAL (expression)) + return true; + if (TREE_TYPE (expression) == unknown_type_node) { if (TREE_CODE (expression) == ADDR_EXPR) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 743ae6c4fe4..53b844f62da 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-06-18 Paolo Carlini + + PR c++/53211 + * g++.dg/cpp0x/decltype55.C: New. + 2013-06-18 Marek Polacek * gcc.dg/c90-fordecl-1.c: Adjust expected message. @@ -7,11 +12,11 @@ * c-c++-common/cilk-plus/AN/sec_reduce_ind_same_value.c: New test. 2013-06-17 Balaji V. Iyer - + * c-c++-common/cilk-plus/AN/array_test1.c: Make this an execution test. Also changed the returns from error as distinct values so that it is easier to debug. - + 2013-06-17 Sofiane Naci * gcc.target/aarch64/scalar_intrinsics.c: Update. diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype55.C b/gcc/testsuite/g++.dg/cpp0x/decltype55.C new file mode 100644 index 00000000000..95427fc0018 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype55.C @@ -0,0 +1,20 @@ +// PR c++/53211 +// { dg-do compile { target c++11 } } + +template + struct is_same { static const bool value = false; }; + +template + struct is_same { static const bool value = true; }; + +template +void func(Args... args) +{ + int arr[] = { args... }; + static_assert (is_same::value, ""); +} + +int main() +{ + func(1, 2, 3, 4); +} -- 2.30.2