commit 8807d220e86960d8ede6faabd963307c5951c278
Author: Jason Merrill <jason@redhat.com>
Date: Tue Jul 27 11:03:35 2010 -0400
* 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.
@@ -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
@@ -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;
}
new file mode 100644
@@ -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>();
+}
new file mode 100644
@@ -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[]>();
+}