From 8c081e84f7b8dbc477c62c5a16834e2f6ce9d095 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Thu, 31 Oct 2002 00:04:12 +0000 Subject: [PATCH] re PR c++/8160 (ICE in build_modify_expr, at cp/typeck.c:5494: Array initialization) PR c++/8160 * typeck2.c (process_init_constructor): Call complete_array_type. PR c++/8149 * decl.c (make_typename_type): Issue errors about invalid results. PR c++/8160 * g++.dg/template/complit1.C: New test. PR c++/8149 * g++.dg/template/typename4.C: Likewise. From-SVN: r58663 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/decl.c | 7 +++++++ gcc/cp/typeck2.c | 2 ++ gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/template/complit1.C | 11 +++++++++++ gcc/testsuite/g++.dg/template/typename4.C | 3 +++ 6 files changed, 39 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/complit1.C create mode 100644 gcc/testsuite/g++.dg/template/typename4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1dc2487d526..d53fd4d947a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2002-10-30 Mark Mitchell + + PR c++/8160 + * typeck2.c (process_init_constructor): Call complete_array_type. + + PR c++/8149 + * decl.c (make_typename_type): Issue errors about invalid results. + 2002-10-30 Kriang Lerdsuwanakij Core issue 287, PR c++/7639 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 4fcb36369dd..9ee055679ff 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5702,6 +5702,13 @@ make_typename_type (context, name, complain) t = lookup_field (context, name, 0, 1); if (t) { + if (TREE_CODE (t) != TYPE_DECL) + { + if (complain & tf_error) + error ("no type named `%#T' in `%#T'", name, context); + return error_mark_node; + } + if (complain & tf_parsing) type_access_control (context, t); else diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index b8d0869d1ef..750aa3c94bf 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -942,6 +942,8 @@ process_init_constructor (type, init, elts) return error_mark_node; result = build (CONSTRUCTOR, type, NULL_TREE, nreverse (members)); + if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type) == NULL_TREE) + complete_array_type (type, result, /*do_default=*/0); if (init) TREE_HAS_CONSTRUCTOR (result) = TREE_HAS_CONSTRUCTOR (init); if (allconstant) TREE_CONSTANT (result) = 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2c0826d0b30..437893d0b51 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2002-10-30 Mark Mitchell + + PR c++/8160 + * g++.dg/template/complit1.C: New test. + + PR c++/8149 + * g++.dg/template/typename4.C: Likewise. + 2002-10-30 Kriang Lerdsuwanakij Core issue 287, PR c++/7639 diff --git a/gcc/testsuite/g++.dg/template/complit1.C b/gcc/testsuite/g++.dg/template/complit1.C new file mode 100644 index 00000000000..ab057b3b7ee --- /dev/null +++ b/gcc/testsuite/g++.dg/template/complit1.C @@ -0,0 +1,11 @@ +// { dg-options "" } + +template struct C { + int d[3]; + C(); +}; + +template +C::C() : d((int[]){1,2,3}) {}; + +template class C<1>; diff --git a/gcc/testsuite/g++.dg/template/typename4.C b/gcc/testsuite/g++.dg/template/typename4.C new file mode 100644 index 00000000000..add95156cec --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename4.C @@ -0,0 +1,3 @@ +struct B { template struct C; }; +template struct A { typedef typename T::C V; }; // { dg-error "" } +void f () { A::V p; } // { dg-error "" } -- 2.30.2