diff options
author | Mark Mitchell <mark@codesourcery.com> | 1999-05-30 14:41:33 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 1999-05-30 14:41:33 +0000 |
commit | 3e41d13b038153f299e0778130d676f6315be58b (patch) | |
tree | bfef7dea0addeb5d679ef6c72937f2e0ec8aaeaa | |
parent | 79f565f6bd80427f87c6d605497c5ca5d9bb2123 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 46 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/static9.C | 27 |
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); +} + |