summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-27 22:06:03 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-27 22:06:03 +0000
commit76124e58d2662dc47ea660090bceedaa39a4a291 (patch)
tree006042e9b7977e67d56f3ee4b12aba0da516f847 /gcc
parent3a55c112b92d0ef76f0a956b6c3b826037c1be8f (diff)
downloadgcc-76124e58d2662dc47ea660090bceedaa39a4a291.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162603 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/init.c5
-rw-r--r--gcc/cp/pt.c20
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic102.C19
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic103.C14
6 files changed, 61 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 35416869926..362502126cb 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 d796fd0822c..0edb8004618 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 7a331479d8b..2777ab79065 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 68b51d85a75..7a1a1759bab 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 00000000000..dc9c4aea8cb
--- /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 00000000000..6d12331d000
--- /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[]>();
+}