diff options
author | Mark Mitchell <mark@markmitchell.com> | 1998-08-31 23:38:02 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 1998-08-31 23:38:02 +0000 |
commit | 9360ac70adae2f86d84aa52dd61bbdba48f0d982 (patch) | |
tree | c8a33282da499de3ea1893034d15210629921e5e | |
parent | 2571e6acfa2e7b5e770d7bfdd39e773161f10b1d (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/decl.c | 3 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.other/crash4.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/enum11.C | 10 |
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>(); } |