aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>1999-04-30 02:19:00 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>1999-04-30 02:19:00 +0000
commit1c609c4cbee4dd46a739fae213da8d48fe1147e4 (patch)
treea77337bacbf76df14b1697ada6e2d59cfda00827
parent0c42bebfad7d884832bc28d1b768e9ed48336889 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/decl.c24
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/decl3.C19
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;
+}