mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-08 18:57:49 +08:00
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:
parent
79f565f6bd
commit
3e41d13b03
@ -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
|
||||
|
@ -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;
|
||||
|
27
gcc/testsuite/g++.old-deja/g++.pt/static9.C
Normal file
27
gcc/testsuite/g++.old-deja/g++.pt/static9.C
Normal 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user