cp/
authorgdr <gdr@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Feb 2001 22:52:29 +0000 (22:52 +0000)
committergdr <gdr@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Feb 2001 22:52:29 +0000 (22:52 +0000)
        * 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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/decl9.C [new file with mode: 0644]

index d79146c..55f14cf 100644 (file)
@@ -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.
index 3e3f37b..7cf983b 100644 (file)
@@ -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);
 
index 3d93933..ff6cea8 100644 (file)
@@ -1,3 +1,7 @@
+2001-02-16  Gabriel Dos Reis <gdr@codesourcery.com>
+
+       * g++.old-deja/g++.other/decl9.C: New test.
+       
 2001-02-16  Jakub Jelinek  <jakub@redhat.com>
 
        * g++.old-deja/g++.other/init16.C: Update the test so that it does
diff --git a/gcc/testsuite/g++.old-deja/g++.other/decl9.C b/gcc/testsuite/g++.old-deja/g++.other/decl9.C
new file mode 100644 (file)
index 0000000..5ec9a6e
--- /dev/null
@@ -0,0 +1,9 @@
+// Build don't link
+// Origin: batali@cogsci.ucsd.edu
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+
+typedef struct { } S;           // OK
+typedef struct { };             // ERROR - Missing type-name
+
+typedef union { } U;            // OK
+typedef union { };              // ERROR - Missing type-name