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
This commit is contained in:
Mark Mitchell 2002-12-01 04:55:20 +00:00 committed by Mark Mitchell
parent f6318a2baf
commit 328de7c2f1
6 changed files with 54 additions and 31 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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