aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Reichelt <reichelt@gcc.gnu.org>2005-08-11 22:46:29 +0000
committerVolker Reichelt <reichelt@gcc.gnu.org>2005-08-11 22:46:29 +0000
commitea7ce50bf7fcd34d903b9dd1b238f099c9cc0534 (patch)
tree28c40802942a7d9fc02787e809812320186261a5
parent86bd8ebf5dec81d0a84b72a289db5af36f7d866d (diff)
downloadgcc-ea7ce50bf7fcd34d903b9dd1b238f099c9cc0534.zip
gcc-ea7ce50bf7fcd34d903b9dd1b238f099c9cc0534.tar.gz
gcc-ea7ce50bf7fcd34d903b9dd1b238f099c9cc0534.tar.bz2
re PR c++/23266 (ICE on pure specifier for static method)
PR c++/23266 * decl2.c (grokfield): Check that method is not static before marking it as pure. PR c++/23266 * g++.dg/inherit/pure1.C: New test. * ChangeLog: Fix typos. From-SVN: r103006
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl2.c14
-rw-r--r--gcc/testsuite/ChangeLog11
-rw-r--r--gcc/testsuite/g++.dg/inherit/pure1.C19
4 files changed, 45 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e904821..fce855a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2005-08-11 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/23266
+ * decl2.c (grokfield): Check that method is not static before
+ marking it as pure.
+
2005-08-11 Nathan Sidwell <nathan@codesourcery.com>
PR c++/23219
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index e7db552..b08bac8 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -896,9 +896,17 @@ grokfield (const cp_declarator *declarator,
{
/* Initializers for functions are rejected early in the parser.
If we get here, it must be a pure specifier for a method. */
- gcc_assert (TREE_CODE (TREE_TYPE (value)) == METHOD_TYPE);
- gcc_assert (error_operand_p (init) || integer_zerop (init));
- DECL_PURE_VIRTUAL_P (value) = 1;
+ if (TREE_CODE (TREE_TYPE (value)) == METHOD_TYPE)
+ {
+ gcc_assert (error_operand_p (init) || integer_zerop (init));
+ DECL_PURE_VIRTUAL_P (value) = 1;
+ }
+ else
+ {
+ gcc_assert (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE);
+ error ("initializer specified for static member function %qD",
+ value);
+ }
}
else if (pedantic && TREE_CODE (value) != VAR_DECL)
/* Already complained in grokdeclarator. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 40e97e6..4c36525 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,4 +1,11 @@
-2005-09-11 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+2005-08-11 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/23266
+ * g++.dg/inherit/pure1.C: New test.
+
+ * ChangeLog: Fix typos.
+
+2005-08-11 Francois-Xavier Coudert <coudert@clipper.ens.fr>
Steven Bosscher <stevenb@suse.de>
* gfortran.dg/runtime_warning_1.f90: New test.
@@ -13,7 +20,7 @@
PR target/23289
* gcc.target/i386/tailcall-1.c: New testcase.
-2005-08-10 James A. Morrison <phython@gc.gnu.org>
+2005-08-10 James A. Morrison <phython@gcc.gnu.org>
* gcc.dg/vect/vect-67.c: Un-xfail.
diff --git a/gcc/testsuite/g++.dg/inherit/pure1.C b/gcc/testsuite/g++.dg/inherit/pure1.C
new file mode 100644
index 0000000..ddd3cb3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/pure1.C
@@ -0,0 +1,19 @@
+// PR c++/23266
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+void foo0() = 0; // { dg-error "like a variable" }
+virtual void foo1() = 0; // { dg-error "outside class|variable" }
+
+struct A
+{
+ void foo2() = 0; // { dg-error "non-virtual" }
+ static void foo3() = 0; // { dg-error "static member" }
+ virtual static void foo4() = 0; // { dg-error "both virtual and static" }
+ virtual void foo5() = 0; // { dg-error "base class" }
+};
+
+struct B : A
+{
+ static void foo5() = 0; // { dg-error "static member|declared" }
+};