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
This commit is contained in:
Mark Mitchell 1999-05-30 14:41:33 +00:00 committed by Mark Mitchell
parent 79f565f6bd
commit 3e41d13b03
3 changed files with 52 additions and 26 deletions

View File

@ -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

View File

@ -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;

View File

@ -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);
}