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:
parent
f6318a2baf
commit
328de7c2f1
6 changed files with 54 additions and 31 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
18
gcc/testsuite/g++.dg/template/ctor2.C
Normal file
18
gcc/testsuite/g++.dg/template/ctor2.C
Normal 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;
|
||||
}
|
||||
|
Loading…
Add table
Reference in a new issue