diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 87cfabee95d..aee593f470d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,11 +1,15 @@ 2002-11-30 Mark Mitchell + 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 - PR c++/8511 * pt.c (instantiate_decl): Handle template friends defined outside of the class correctly. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5a30e5b5ef3..dbb96eb6a28 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 99f10d57dfc..77b2fd95056 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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, diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 6a0ec18f0c1..85eef41c2e0 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ac64f5847b..5574e17a549 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,10 +1,11 @@ 2002-11-30 Mark Mitchell + 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 - PR c++/8511 * g++.dg/template/friend8.C: New test. diff --git a/gcc/testsuite/g++.dg/template/ctor2.C b/gcc/testsuite/g++.dg/template/ctor2.C new file mode 100644 index 00000000000..1c8d8a65d9b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor2.C @@ -0,0 +1,18 @@ +// { dg-do run } + +int i; + +template +struct S +{ + S () { i = 1; } +}; + +static S s[1]; + +int main () +{ + if (!i) + return 1; +} +