summaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorgdr <gdr@138bc75d-0d04-0410-961f-82ee72b054a4>2001-02-16 22:52:29 +0000
committergdr <gdr@138bc75d-0d04-0410-961f-82ee72b054a4>2001-02-16 22:52:29 +0000
commita614c8309aeae5ad94679503cdcf24f690009ed7 (patch)
tree245b357fb269d110d467bf44522abd95190d56e5 /gcc/cp
parent4caf3e12dbdf88157e0d6ec56a417e41d0a6d856 (diff)
downloadgcc-a614c8309aeae5ad94679503cdcf24f690009ed7.tar.gz
cp/
* decl.c (check_tag_decl): Make sure a typedef for an anonymous class-type introduces at least a type-name. testsuite/ * g++.old-deja/g++.other/decl9.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@39781 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c24
2 files changed, 29 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d79146c010a..55f14cf5a21 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2001-02-16 Gabriel Dos Reis <gdr@codesourcery.com>
+
+ * decl.c (check_tag_decl): Make sure a typedef for an anonymous
+ class-type introduces at least a type-name.
+
2001-02-16 Jakub Jelinek <jakub@redhat.com>
* call.c (convert_like_real): Create a temporary for non-lvalue.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 3e3f37be89d..7cf983b679b 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6846,6 +6846,7 @@ check_tag_decl (declspecs)
{
int found_type = 0;
int saw_friend = 0;
+ int saw_typedef = 0;
tree ob_modifier = NULL_TREE;
register tree link;
register tree t = NULL_TREE;
@@ -6877,6 +6878,8 @@ check_tag_decl (declspecs)
t = value;
}
}
+ else if (value == ridpointers[(int) RID_TYPEDEF])
+ saw_typedef = 1;
else if (value == ridpointers[(int) RID_FRIEND])
{
if (current_class_type == NULL_TREE
@@ -6910,6 +6913,27 @@ check_tag_decl (declspecs)
&& TYPE_NAME (t)
&& ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)))
{
+ /* 7/3 In a simple-declaration, the optional init-declarator-list
+ can be omitted only when declaring a class (clause 9) or
+ enumeration (7.2), that is, when the decl-specifier-seq contains
+ either a class-specifier, an elaborated-type-specifier with
+ a class-key (9.1), or an enum-specifier. In these cases and
+ whenever a class-specifier or enum-specifier is present in the
+ decl-specifier-seq, the identifiers in these specifiers are among
+ the names being declared by the declaration (as class-name,
+ enum-names, or enumerators, depending on the syntax). In such
+ cases, and except for the declaration of an unnamed bit-field (9.6),
+ the decl-specifier-seq shall introduce one or more names into the
+ program, or shall redeclare a name introduced by a previous
+ declaration. [Example:
+ enum { }; // ill-formed
+ typedef class { }; // ill-formed
+ --end example] */
+ if (saw_typedef)
+ {
+ error ("Missing type-name in typedef-declaration.");
+ return NULL_TREE;
+ }
/* Anonymous unions are objects, so they can have specifiers. */;
SET_ANON_AGGR_TYPE_P (t);