I missed one case where we needed to change cp_type_quals to type_memfn_quals. After that fix we gave the correct error, but still ICEd, so to avoid that I go ahead and strip the offending cv-quals.

Tested x86_64-pc-linux-gnu, applying to trunk, will apply to 4.6.1 after 4.6.0 release.
commit 3ac9d1e0b60a71e6ff154d4c8996ebedb7ba9652
Author: Jason Merrill <ja...@redhat.com>
Date:   Thu Mar 17 10:24:48 2011 -0400

        PR c++/48166
        * decl.c (revert_static_member_fn): Strip function-cv-quals.

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index a7da574..0985749 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -13344,10 +13344,14 @@ static_fn_type (tree memfntype)
 void
 revert_static_member_fn (tree decl)
 {
-  TREE_TYPE (decl) = static_fn_type (decl);
+  tree stype = static_fn_type (decl);
 
-  if (cp_type_quals (TREE_TYPE (decl)) != TYPE_UNQUALIFIED)
-    error ("static member function %q#D declared with type qualifiers", decl);
+  if (type_memfn_quals (stype) != TYPE_UNQUALIFIED)
+    {
+      error ("static member function %q#D declared with type qualifiers", 
decl);
+      stype = apply_memfn_quals (stype, TYPE_UNQUALIFIED);
+    }
+  TREE_TYPE (decl) = stype;
 
   if (DECL_ARGUMENTS (decl))
     DECL_ARGUMENTS (decl) = DECL_CHAIN (DECL_ARGUMENTS (decl));
diff --git a/gcc/testsuite/g++.dg/parse/memfnquals1.C 
b/gcc/testsuite/g++.dg/parse/memfnquals1.C
new file mode 100644
index 0000000..ce8af7b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/memfnquals1.C
@@ -0,0 +1,6 @@
+// PR c++/48166
+
+struct foo {
+  static void func ();
+};
+void foo::func () const {}     // { dg-error "type qualifiers" }

Reply via email to