diff options
author | Volker Reichelt <v.reichelt@netcologne.de> | 2008-08-08 21:17:54 +0000 |
---|---|---|
committer | Volker Reichelt <reichelt@gcc.gnu.org> | 2008-08-08 21:17:54 +0000 |
commit | 76871f0f310eb6e7fec812d33884be46a5da6833 (patch) | |
tree | b8cf033d852dd0b4272c3cb660f3af338b2c83b6 /gcc | |
parent | 7910ae0cde83554100eefaca68a506bb25655498 (diff) | |
download | gcc-76871f0f310eb6e7fec812d33884be46a5da6833.zip gcc-76871f0f310eb6e7fec812d33884be46a5da6833.tar.gz gcc-76871f0f310eb6e7fec812d33884be46a5da6833.tar.bz2 |
re PR c++/35985 (ICE with pointer to member function as base)
PR c++/35985
* decl.c (xref_basetypes): Check base for MAYBE_CLASS_TYPE_P,
and make sure it is not a union.
* g++.dg/inherit/base3.C: New.
From-SVN: r138886
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/base3.C | 8 |
4 files changed, 20 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5e5d1c2..d37f31f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-08-08 Volker Reichelt <v.reichelt@netcologne.de> + + PR c++/35985 + * decl.c (xref_basetypes): Check base for MAYBE_CLASS_TYPE_P, + and make sure it is not a union. + 2008-08-07 H.J. Lu <hongjiu.lu@intel.com> * semantics.c (finish_decltype_type): Initialize type. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 4c340e2..6910562 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -10616,10 +10616,7 @@ xref_basetypes (tree ref, tree base_list) basetype = PACK_EXPANSION_PATTERN (basetype); if (TREE_CODE (basetype) == TYPE_DECL) basetype = TREE_TYPE (basetype); - if (TREE_CODE (basetype) != RECORD_TYPE - && TREE_CODE (basetype) != TYPENAME_TYPE - && TREE_CODE (basetype) != TEMPLATE_TYPE_PARM - && TREE_CODE (basetype) != BOUND_TEMPLATE_TEMPLATE_PARM) + if (!MAYBE_CLASS_TYPE_P (basetype) || TREE_CODE (basetype) == UNION_TYPE) { error ("base type %qT fails to be a struct or class type", basetype); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0d9eb93..22bd5e5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-08-08 Volker Reichelt <v.reichelt@netcologne.de> + + PR c++/35985 + * g++.dg/inherit/base3.C: New. + 2008-08-08 Dorit Nuzman <dorit@il.ibm.com> * lib/target-supports.exp (check_effective_target_vect_floatint_cvt): diff --git a/gcc/testsuite/g++.dg/inherit/base3.C b/gcc/testsuite/g++.dg/inherit/base3.C new file mode 100644 index 0000000..c586e39 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/base3.C @@ -0,0 +1,8 @@ +// PR c++/35985 +// { dg-do compile } + +template<typename T> struct A : T {}; // { dg-error "struct or class type" } + +struct B; + +A<void (B::*)()> a; // { dg-error "instantiated" } |