decl.c (finish_enum): Handle member enums of classes declared in template functions.
authorMark Mitchell <mark@markmitchell.com>
Mon, 31 Aug 1998 23:38:02 +0000 (23:38 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 31 Aug 1998 23:38:02 +0000 (23:38 +0000)
* decl.c (finish_enum): Handle member enums of classes declared in
template functions.
* decl2.c (grok_x_components): Strip attributres before calling
groktypename.

From-SVN: r22144

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

index 0ccaeba11697f7f2fecd6b9d74dd0e4d7e8ec37e..4e17539b35bd4deb2820738a61f6682aa6c2a802 100644 (file)
@@ -1,3 +1,11 @@
+1998-08-31  Mark Mitchell  <mark@markmitchell.com>
+
+       * decl.c (finish_enum): Handle member enums of classes declared in
+       template functions.
+       
+       * decl2.c (grok_x_components): Strip attributres before calling
+       groktypename. 
+       
 1998-08-31  Jason Merrill  <jason@yorick.cygnus.com>
 
        * cp-tree.h, decl2.c: Remove support for -fall-virtual,
index 3da20575fead7cc86d82eb7928f7a0cae07ffdc6..fe9160dc2c031743af75733754f9fadb5641a688 100644 (file)
@@ -11931,7 +11931,8 @@ finish_enum (enumtype)
 
   if (processing_template_decl)
     {
-      if (current_function_decl)
+      tree scope = current_scope ();
+      if (scope && TREE_CODE (scope) == FUNCTION_DECL)
        {
          add_tree (build_min (TAG_DEFN, enumtype));
          resume_temporary_allocation ();
index 3345b83a69dd7282358061584b3191a22168e338..04424bf147ce22506126082b9dafb88508b6200d 100644 (file)
@@ -853,7 +853,8 @@ grok_x_components (specs, components)
 
   if (components == NULL_TREE)
     {
-      t = groktypename (build_decl_list (specs, NULL_TREE));
+      t = groktypename (build_decl_list (strip_attrs (specs),
+                                        NULL_TREE)); 
 
       if (t == NULL_TREE)
        {
diff --git a/gcc/testsuite/g++.old-deja/g++.other/crash4.C b/gcc/testsuite/g++.old-deja/g++.other/crash4.C
new file mode 100644 (file)
index 0000000..d86a6bb
--- /dev/null
@@ -0,0 +1,7 @@
+// Build don't link:
+
+struct T {
+  struct S __attribute__ ((packed)) { // ERROR - parse error
+    int i;                            
+  };
+}; // ERROR - parse error
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/enum11.C b/gcc/testsuite/g++.old-deja/g++.pt/enum11.C
new file mode 100644 (file)
index 0000000..77631c4
--- /dev/null
@@ -0,0 +1,10 @@
+// Build don't link:
+
+template <class T> void f1() 
+{ 
+  struct foo { enum T2 {
+    un, du, toi };
+  }; 
+}
+
+void f2() { f1<int>(); }