aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>1999-05-30 14:41:33 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1999-05-30 14:41:33 +0000
commit3e41d13b038153f299e0778130d676f6315be58b (patch)
treebfef7dea0addeb5d679ef6c72937f2e0ec8aaeaa
parent79f565f6bd80427f87c6d605497c5ca5d9bb2123 (diff)
downloadgcc-3e41d13b038153f299e0778130d676f6315be58b.zip
gcc-3e41d13b038153f299e0778130d676f6315be58b.tar.gz
gcc-3e41d13b038153f299e0778130d676f6315be58b.tar.bz2
decl.c (start_decl): Move checks on initialization to ...
* decl.c (start_decl): Move checks on initialization to ... (cp_finish_decl): Here. Tidy formatting slightly. From-SVN: r27252
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c46
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/static9.C27
3 files changed, 52 insertions, 26 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5307cb2..99f2635 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+1999-05-30 Mark Mitchell <mark@codesourcery.com>
+
+ * decl.c (start_decl): Move checks on initialization to ...
+ (cp_finish_decl): Here. Tidy formatting slightly.
+
1999-05-28 Mark Mitchell <mark@codesourcery.com>
* decl.c (add_binding): Don't complain about a redeclaration of a
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index edcd608..c30fa7c 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -7305,28 +7305,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
break;
default:
- if (! processing_template_decl)
- {
- if (type != error_mark_node)
- {
- if (TYPE_SIZE (type) != NULL_TREE
- && ! TREE_CONSTANT (TYPE_SIZE (type)))
- {
- cp_error
- ("variable-sized object `%D' may not be initialized",
- decl);
- initialized = 0;
- }
-
- if (TREE_CODE (type) == ARRAY_TYPE
- && TYPE_SIZE (complete_type (TREE_TYPE (type))) == NULL_TREE)
- {
- cp_error
- ("elements of array `%#D' have incomplete type", decl);
- initialized = 0;
- }
- }
- }
+ break;
}
if (initialized)
@@ -7820,6 +7799,7 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
goto finish_end0;
}
+
/* Take care of TYPE_DECLs up front. */
if (TREE_CODE (decl) == TYPE_DECL)
{
@@ -7850,15 +7830,13 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
DECL_CONTEXT (decl) == NULL_TREE, at_eof);
goto finish_end;
}
+
if (TREE_CODE (decl) != FUNCTION_DECL)
- {
- ttype = target_type (type);
- }
+ ttype = target_type (type);
if (! DECL_EXTERNAL (decl) && TREE_READONLY (decl)
&& TYPE_NEEDS_CONSTRUCTING (type))
{
-
/* Currently, GNU C++ puts constants in text space, making them
impossible to initialize. In the future, one would hope for
an operating system which understood the difference between
@@ -7897,6 +7875,22 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
init = NULL_TREE;
}
+ /* Check for certain invalid initializations. */
+ if (init)
+ {
+ if (TYPE_SIZE (type) && !TREE_CONSTANT (TYPE_SIZE (type)))
+ {
+ cp_error ("variable-sized object `%D' may not be initialized", decl);
+ init = NULL_TREE;
+ }
+ if (TREE_CODE (type) == ARRAY_TYPE
+ && !TYPE_SIZE (complete_type (TREE_TYPE (type))))
+ {
+ cp_error ("elements of array `%#D' have incomplete type", decl);
+ init = NULL_TREE;
+ }
+ }
+
GNU_xref_decl (current_function_decl, decl);
core_type = type;
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/static9.C b/gcc/testsuite/g++.old-deja/g++.pt/static9.C
new file mode 100644
index 0000000..35484a3
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/static9.C
@@ -0,0 +1,27 @@
+// Build don't link:
+// Origin: Mark Mitchell <mark@codesourcery.com>
+
+template <class T>
+struct S {
+ int i;
+};
+
+template <class T>
+struct X {
+ static S<T> s[];
+};
+
+template <class T>
+S<T> X<T>::s[] = {
+ { 3 }
+};
+
+struct Z {};
+
+void f(S<Z>* s);
+
+void g()
+{
+ f (X<Z>::s);
+}
+