aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@markmitchell.com>1998-08-31 23:38:02 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1998-08-31 23:38:02 +0000
commit9360ac70adae2f86d84aa52dd61bbdba48f0d982 (patch)
treec8a33282da499de3ea1893034d15210629921e5e
parent2571e6acfa2e7b5e770d7bfdd39e773161f10b1d (diff)
downloadgcc-9360ac70adae2f86d84aa52dd61bbdba48f0d982.zip
gcc-9360ac70adae2f86d84aa52dd61bbdba48f0d982.tar.gz
gcc-9360ac70adae2f86d84aa52dd61bbdba48f0d982.tar.bz2
decl.c (finish_enum): Handle member enums of classes declared in template functions.
* 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
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/decl.c3
-rw-r--r--gcc/cp/decl2.c3
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/crash4.C7
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/enum11.C10
5 files changed, 29 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0ccaeba..4e17539 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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,
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 3da2057..fe9160d 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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 ();
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 3345b83..04424bf 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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
index 0000000..d86a6bb
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/crash4.C
@@ -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
index 0000000..77631c4
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/enum11.C
@@ -0,0 +1,10 @@
+// Build don't link:
+
+template <class T> void f1()
+{
+ struct foo { enum T2 {
+ un, du, toi };
+ };
+}
+
+void f2() { f1<int>(); }