diff options
author | Nathan Sidwell <nathan@acm.org> | 1999-04-30 02:19:00 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 1999-04-30 02:19:00 +0000 |
commit | 1c609c4cbee4dd46a739fae213da8d48fe1147e4 (patch) | |
tree | a77337bacbf76df14b1697ada6e2d59cfda00827 | |
parent | 0c42bebfad7d884832bc28d1b768e9ed48336889 (diff) | |
download | gcc-1c609c4cbee4dd46a739fae213da8d48fe1147e4.zip gcc-1c609c4cbee4dd46a739fae213da8d48fe1147e4.tar.gz gcc-1c609c4cbee4dd46a739fae213da8d48fe1147e4.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.other/decl3.C | 19 |
3 files changed, 37 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b8d9500..a6dec3a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1999-04-30 Nathan Sidwell <nathan@acm.org> + + * decl.c (cp_finish_decl): Don't permit arrays of abstract or + signature type. + 1999-04-29 Mark Mitchell <mark@codesourcery.com> * decl2.c (do_static_destruction): Remove obsolete FIXME comment. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5457e92..05ee408 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 0000000..6068e31 --- /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 <nathan@acm.org> +// from a test case submitted by Corey Kosak <kosak@cs.cmu.edu> +// 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; +} |