]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/35985 (ICE with pointer to member function as base)
authorVolker Reichelt <v.reichelt@netcologne.de>
Fri, 8 Aug 2008 21:17:54 +0000 (21:17 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Fri, 8 Aug 2008 21:17:54 +0000 (21:17 +0000)
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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/inherit/base3.C [new file with mode: 0644]

index 5e5d1c28c4664aa849524cdb93d53ca1fade361c..d37f31f96fb4cd0f6bfbd01d8aa7b310aa8a9529 100644 (file)
@@ -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.
index 4c340e28a915eb074fa21a5d65740c91d4d9af3e..691056252aad4fb543f004f091620ae2e2462a5f 100644 (file)
@@ -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);
index 0d9eb93a2ccb3042a4db69f9114a118ace7886b2..22bd5e5e4d4ecae4490129ba512557cff3b66d59 100644 (file)
@@ -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 (file)
index 0000000..c586e39
--- /dev/null
@@ -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" }