aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2002-12-01 04:55:20 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2002-12-01 04:55:20 +0000
commit328de7c2f1018e5553f48760aa0b89bbc28d4c8b (patch)
treeb245d8c933469c93a0bd802e68f291b65025b67f
parentf6318a2baf8e87c2fd7f02308b3c2d05569684a2 (diff)
downloadgcc-328de7c2f1018e5553f48760aa0b89bbc28d4c8b.zip
gcc-328de7c2f1018e5553f48760aa0b89bbc28d4c8b.tar.gz
gcc-328de7c2f1018e5553f48760aa0b89bbc28d4c8b.tar.bz2
re PR c++/8227 (g++ 3.3: ctors not called in static array initialization)
PR c++/8227 * decl.c (layout_var_decl): Deal gracefully with erroneous types. (check_initializer): Validate the type of the initialized variable, even if the initializer is absent. * typeck.c (cp_type_quals): Deal gracefully with erroneous types. PR c++/8227 * g++.dg/template/ctor2.C: New test. From-SVN: r59672
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/decl.c50
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/cp/typeck.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/ctor2.C18
6 files changed, 54 insertions, 31 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 87cfabe..aee593f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,11 +1,15 @@
2002-11-30 Mark Mitchell <mark@codesourcery.com>
+ PR c++/8227
+ * decl.c (layout_var_decl): Deal gracefully with erroneous types.
+ (check_initializer): Validate the type of the initialized
+ variable, even if the initializer is absent.
+ * typeck.c (cp_type_quals): Deal gracefully with erroneous types.
+
PR c++/8214
* typeck.c (convert_for_assignment): Do not use
decl_constant_value on the operand.
-2002-11-30 Mark Mitchell <mark@codesourcery.com>
-
PR c++/8511
* pt.c (instantiate_decl): Handle template friends defined outside
of the class correctly.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 5a30e5b..dbb96eb 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -7631,6 +7631,7 @@ layout_var_decl (decl)
if (!DECL_EXTERNAL (decl))
complete_type (type);
if (!DECL_SIZE (decl)
+ && TREE_TYPE (decl) != error_mark_node
&& (COMPLETE_TYPE_P (type)
|| (TREE_CODE (type) == ARRAY_TYPE
&& !TYPE_DOMAIN (type)
@@ -7974,33 +7975,30 @@ check_initializer (tree decl, tree init, int flags)
the static initialization -- if any -- of DECL. */
DECL_INITIAL (decl) = NULL_TREE;
- /* Check the initializer. */
- if (init)
- {
- /* Things that are going to be initialized need to have complete
- type. */
- TREE_TYPE (decl) = type = complete_type (TREE_TYPE (decl));
+ /* Things that are going to be initialized need to have complete
+ type. */
+ TREE_TYPE (decl) = type = complete_type (TREE_TYPE (decl));
- if (type == error_mark_node)
- /* We will have already complained. */
- init = NULL_TREE;
- else if (COMPLETE_TYPE_P (type) && !TREE_CONSTANT (TYPE_SIZE (type)))
- {
- error ("variable-sized object `%D' may not be initialized", decl);
- init = NULL_TREE;
- }
- else if (TREE_CODE (type) == ARRAY_TYPE
- && !COMPLETE_TYPE_P (complete_type (TREE_TYPE (type))))
- {
- error ("elements of array `%#D' have incomplete type", decl);
- init = NULL_TREE;
- }
- else if (TREE_CODE (type) != ARRAY_TYPE && !COMPLETE_TYPE_P (type))
- {
- error ("`%D' has incomplete type", decl);
- TREE_TYPE (decl) = error_mark_node;
- init = NULL_TREE;
- }
+ if (type == error_mark_node)
+ /* We will have already complained. */
+ init = NULL_TREE;
+ else if (init && COMPLETE_TYPE_P (type)
+ && !TREE_CONSTANT (TYPE_SIZE (type)))
+ {
+ error ("variable-sized object `%D' may not be initialized", decl);
+ init = NULL_TREE;
+ }
+ else if (TREE_CODE (type) == ARRAY_TYPE
+ && !COMPLETE_TYPE_P (complete_type (TREE_TYPE (type))))
+ {
+ error ("elements of array `%#D' have incomplete type", decl);
+ init = NULL_TREE;
+ }
+ else if (TREE_CODE (type) != ARRAY_TYPE && !COMPLETE_TYPE_P (type))
+ {
+ error ("`%D' has incomplete type", decl);
+ TREE_TYPE (decl) = error_mark_node;
+ init = NULL_TREE;
}
if (TREE_CODE (decl) == CONST_DECL)
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 99f10d5..77b2fd9 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -10063,7 +10063,7 @@ instantiate_decl (d, defer_ok)
code_pattern = DECL_TEMPLATE_RESULT (td);
- /* In the case of a friend temlpate whose definition is provided
+ /* In the case of a friend template whose definition is provided
outside the class, we may have too many arguments. Drop the ones
we don't need. */
args = get_innermost_template_args (gen_args,
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 6a0ec18..85eef41 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -6473,6 +6473,8 @@ cp_type_quals (type)
tree type;
{
type = strip_array_types (type);
+ if (type == error_mark_node)
+ return TYPE_UNQUALIFIED;
return TYPE_QUALS (type);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1ac64f5..5574e17 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,10 +1,11 @@
2002-11-30 Mark Mitchell <mark@codesourcery.com>
+ PR c++/8227
+ * g++.dg/template/ctor2.C: New test.
+
PR c++/8214
* g++.dg/init/string1.C: New test.
-2002-11-30 Mark Mitchell <mark@codesourcery.com>
-
PR c++/8511
* g++.dg/template/friend8.C: New test.
diff --git a/gcc/testsuite/g++.dg/template/ctor2.C b/gcc/testsuite/g++.dg/template/ctor2.C
new file mode 100644
index 0000000..1c8d8a6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ctor2.C
@@ -0,0 +1,18 @@
+// { dg-do run }
+
+int i;
+
+template <class T>
+struct S
+{
+ S () { i = 1; }
+};
+
+static S<int> s[1];
+
+int main ()
+{
+ if (!i)
+ return 1;
+}
+