From a82f93ac13c4280fdf2b5d48648bfc3f7668406b Mon Sep 17 00:00:00 2001 From: Steve Ellcey Date: Tue, 1 Aug 2006 16:45:14 +0000 Subject: [PATCH] re PR c++/28432 (duplicate "no member function declared" message) PR c++/28432 * decl2.c (check_classfn): Remove early return. * search.c (lookup_member): Return NULL with bad type. * g++.dg/other/pr28304.C: Change expected error message. * g++.dg/other/pr28432.C: New test. From-SVN: r115857 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl2.c | 7 ++----- gcc/cp/search.c | 3 ++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/other/pr28304.C | 2 +- gcc/testsuite/g++.dg/other/pr28432.C | 7 +++++++ 6 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/pr28432.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8fe52a90c0f0..a93e420ff862 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-08-01 Steve Ellcey + + PR c++/28432 + * decl2.c (check_classfn): Remove early return. + * search.c (lookup_member): Return NULL with bad type. + 2006-08-01 Steve Ellcey PR c++/28256 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index faee0aaf693d..8b39b81901a0 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -673,11 +673,8 @@ check_classfn (tree ctype, tree function, tree template_parms) else if (!COMPLETE_TYPE_P (ctype)) cxx_incomplete_type_error (function, ctype); else - { - error ("no %q#D member function declared in class %qT", - function, ctype); - return NULL_TREE; - } + error ("no %q#D member function declared in class %qT", + function, ctype); /* If we did not find the method in the class, add it to avoid spurious errors (unless the CTYPE is not yet defined, in which diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 50e704fe366a..d54e6078cb13 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -1209,7 +1209,8 @@ lookup_member (tree xbasetype, tree name, int protect, bool want_type) } else { - gcc_assert (IS_AGGR_TYPE_CODE (TREE_CODE (xbasetype))); + if (!IS_AGGR_TYPE_CODE (TREE_CODE (xbasetype))) + return NULL_TREE; type = xbasetype; xbasetype = NULL_TREE; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e1a69c1dd9ad..097e7842afc5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-08-01 Steve Ellcey + + PR c++/28432 + * g++.dg/other/pr28304.C: Change expected error message. + * g++.dg/other/pr28432.C: New test. + 2006-08-01 Steve Ellcey PR c++/28256 diff --git a/gcc/testsuite/g++.dg/other/pr28304.C b/gcc/testsuite/g++.dg/other/pr28304.C index 9a0e9cdd791c..c86efd489637 100644 --- a/gcc/testsuite/g++.dg/other/pr28304.C +++ b/gcc/testsuite/g++.dg/other/pr28304.C @@ -7,5 +7,5 @@ template void A::foo(T) {} // { dg-error "" } void bar() { - A::foo(1); // { dg-error "not a member" } + A::foo(1); // { dg-error "no matching function for call" } } diff --git a/gcc/testsuite/g++.dg/other/pr28432.C b/gcc/testsuite/g++.dg/other/pr28432.C new file mode 100644 index 000000000000..2b9c76343671 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr28432.C @@ -0,0 +1,7 @@ + +// Test to make sure we do not ICE on this invalid program. + +// { dg-options "" } + +struct A {}; +void A::foo(); // { dg-error "member function declared in class|outside of class is not definition" }