From: Nathan Sidwell Date: Fri, 30 Apr 1999 02:19:00 +0000 (+0000) Subject: decl.c (cp_finish_decl): Don't permit arrays of abstract or signature type. X-Git-Tag: prereleases/gcc-2.95-test~694 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1c609c4cbee4dd46a739fae213da8d48fe1147e4;p=thirdparty%2Fgcc.git decl.c (cp_finish_decl): Don't permit arrays of abstract or signature type. * decl.c (cp_finish_decl): Don't permit arrays of abstract or signature type. From-SVN: r26706 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b8d95001c228..a6dec3a88fbd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1999-04-30 Nathan Sidwell + + * decl.c (cp_finish_decl): Don't permit arrays of abstract or + signature type. + 1999-04-29 Mark Mitchell * decl2.c (do_static_destruction): Remove obsolete FIXME comment. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5457e9216c31..05ee40863cac 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7704,6 +7704,7 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags) char *asmspec = NULL; int was_readonly = 0; int already_used = 0; + tree core_type; /* If this is 0, then we did not change obstacks. */ if (! decl) @@ -7859,6 +7860,10 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags) GNU_xref_decl (current_function_decl, decl); + core_type = type; + while (TREE_CODE (core_type) == ARRAY_TYPE) + core_type = TREE_TYPE (core_type); + if (TREE_CODE (decl) == FIELD_DECL) ; else if (TREE_CODE (decl) == CONST_DECL) @@ -7907,14 +7912,11 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags) else if (TREE_CODE_CLASS (TREE_CODE (type)) == 't' && (IS_AGGR_TYPE (type) || TYPE_NEEDS_CONSTRUCTING (type))) { - tree ctype = type; - while (TREE_CODE (ctype) == ARRAY_TYPE) - ctype = TREE_TYPE (ctype); - if (! TYPE_NEEDS_CONSTRUCTING (ctype)) + if (! TYPE_NEEDS_CONSTRUCTING (core_type)) { - if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (ctype)) + if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)) cp_error ("structure `%D' with uninitialized const members", decl); - if (CLASSTYPE_REF_FIELDS_NEED_INIT (ctype)) + if (CLASSTYPE_REF_FIELDS_NEED_INIT (core_type)) cp_error ("structure `%D' with uninitialized reference members", decl); } @@ -8183,17 +8185,17 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags) resume_temporary_allocation (); if (type != error_mark_node - && TYPE_LANG_SPECIFIC (type) - && CLASSTYPE_ABSTRACT_VIRTUALS (type)) - abstract_virtuals_error (decl, type); + && TYPE_LANG_SPECIFIC (core_type) + && CLASSTYPE_ABSTRACT_VIRTUALS (core_type)) + abstract_virtuals_error (decl, core_type); else if ((TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE) && TYPE_LANG_SPECIFIC (TREE_TYPE (type)) && CLASSTYPE_ABSTRACT_VIRTUALS (TREE_TYPE (type))) abstract_virtuals_error (decl, TREE_TYPE (type)); - if (TYPE_LANG_SPECIFIC (type) && IS_SIGNATURE (type)) - signature_error (decl, type); + if (TYPE_LANG_SPECIFIC (core_type) && IS_SIGNATURE (core_type)) + signature_error (decl, core_type); else if ((TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE) && TYPE_LANG_SPECIFIC (TREE_TYPE (type)) diff --git a/gcc/testsuite/g++.old-deja/g++.other/decl3.C b/gcc/testsuite/g++.old-deja/g++.other/decl3.C new file mode 100644 index 000000000000..6068e3105dcc --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/decl3.C @@ -0,0 +1,19 @@ +// Build don't link: + +// Origin: Adapted by Nathan Sidwell 29 Apr 1999 +// from a test case submitted by Corey Kosak +// http://egcs.cygnus.com/ml/egcs-bugs/1999-04/msg00502.html + +// We should not allow arrays of abstract type. [class.abstract/2] + +struct cow_t { + virtual void f()=0; // ERROR - abstract +}; + + +int main() +{ + cow_t cow[2]; // ERROR - abstract class + cow[0].f(); + return 0; +}