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
This commit is contained in:
Nathan Sidwell 1999-04-30 02:19:00 +00:00 committed by Nathan Sidwell
parent 0c42bebfad
commit 1c609c4cbe
3 changed files with 37 additions and 11 deletions

View file

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

View file

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

View file

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