From ea7ce50bf7fcd34d903b9dd1b238f099c9cc0534 Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Thu, 11 Aug 2005 22:46:29 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl2.c | 14 +++++++++++--- gcc/testsuite/ChangeLog | 11 +++++++++-- gcc/testsuite/g++.dg/inherit/pure1.C | 19 +++++++++++++++++++ 4 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/inherit/pure1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e9048213b06..fce855a3cd1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-08-11 Volker Reichelt + + PR c++/23266 + * decl2.c (grokfield): Check that method is not static before + marking it as pure. + 2005-08-11 Nathan Sidwell PR c++/23219 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index e7db5525961..b08bac86d75 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 40e97e69957..4c3652541a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,11 @@ -2005-09-11 Francois-Xavier Coudert +2005-08-11 Volker Reichelt + + PR c++/23266 + * g++.dg/inherit/pure1.C: New test. + + * ChangeLog: Fix typos. + +2005-08-11 Francois-Xavier Coudert Steven Bosscher * 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 +2005-08-10 James A. Morrison * 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 00000000000..ddd3cb332df --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/pure1.C @@ -0,0 +1,19 @@ +// PR c++/23266 +// Origin: Volker Reichelt +// { 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" } +}; -- 2.30.2