diff options
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/init.c | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic102.C | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic103.C | 14 |
6 files changed, 61 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3541686..3625021 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2010-07-27 Jason Merrill <jason@redhat.com> + + * pt.c (tsubst_expr) [DECL_EXPR]: Handle getting an AGGR_INIT_EXPR + from build_value_init. + * init.c (build_value_init_noctor): Give error for unknown array + bound. + 2010-07-27 Joseph Myers <joseph@codesourcery.com> * cp-objcp-common.h (LANG_HOOKS_MISSING_ARGUMENT): Remove. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index d796fd0..0edb800 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -379,7 +379,10 @@ build_value_init_noctor (tree type) /* If we have an error_mark here, we should just return error mark as we don't know the size of the array yet. */ if (max_index == error_mark_node) - return error_mark_node; + { + error ("cannot value-initialize array of unknown bound %qT", type); + return error_mark_node; + } gcc_assert (TREE_CODE (max_index) == INTEGER_CST); /* A zero-sized array, which is accepted as an extension, will diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 7a33147..2777ab7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11697,14 +11697,18 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, tree t = RECUR (init); if (init && !t) - /* If we had an initializer but it - instantiated to nothing, - value-initialize the object. This will - only occur when the initializer was a - pack expansion where the parameter packs - used in that expansion were of length - zero. */ - init = build_value_init (TREE_TYPE (decl)); + { + /* If we had an initializer but it + instantiated to nothing, + value-initialize the object. This will + only occur when the initializer was a + pack expansion where the parameter packs + used in that expansion were of length + zero. */ + init = build_value_init (TREE_TYPE (decl)); + if (TREE_CODE (init) == AGGR_INIT_EXPR) + init = get_target_expr (init); + } else init = t; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 68b51d8..7a1a175 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-07-27 Jason Merrill <jason@redhat.com> + + * g++.dg/cpp0x/variadic102.C: New. + * g++.dg/cpp0x/variadic103.C: New. + 2010-07-27 Maxim Kuvyrkov <maxim@codesourcery.com> PR rtl-optimization/40956 diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic102.C b/gcc/testsuite/g++.dg/cpp0x/variadic102.C new file mode 100644 index 0000000..dc9c4ae --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic102.C @@ -0,0 +1,19 @@ +// { dg-options "-std=c++0x" } + +struct nAny { + template<class... T> + nAny(T&&...); +}; + +template<class T> +T&& create(); + +template<class T, class... Args> +void test() { + T t(create<Args>()...); + (void) t; +} + +int main() { + test<nAny>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic103.C b/gcc/testsuite/g++.dg/cpp0x/variadic103.C new file mode 100644 index 0000000..6d12331 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic103.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++0x" } + +template<class T> +T&& create(); + +template<class T, class... Args> +void test() { + T t(create<Args>()...); // { dg-error "unknown bound" } + (void) t; +} + +int main() { + test<int[]>(); +} |