diff options
author | Volker Reichelt <reichelt@gcc.gnu.org> | 2005-08-11 22:46:29 +0000 |
---|---|---|
committer | Volker Reichelt <reichelt@gcc.gnu.org> | 2005-08-11 22:46:29 +0000 |
commit | ea7ce50bf7fcd34d903b9dd1b238f099c9cc0534 (patch) | |
tree | 28c40802942a7d9fc02787e809812320186261a5 /gcc | |
parent | 86bd8ebf5dec81d0a84b72a289db5af36f7d866d (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/pure1.C | 19 |
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" } +}; |