diff options
author | gdr <gdr@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-02-16 22:52:29 +0000 |
---|---|---|
committer | gdr <gdr@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-02-16 22:52:29 +0000 |
commit | a614c8309aeae5ad94679503cdcf24f690009ed7 (patch) | |
tree | 245b357fb269d110d467bf44522abd95190d56e5 /gcc/cp | |
parent | 4caf3e12dbdf88157e0d6ec56a417e41d0a6d856 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 24 |
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); |