From 65f36ac8689fcf7c2794b4693bd921fe6893dfe1 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 1 Feb 2002 10:50:01 -0500 Subject: [PATCH] re PR c++/4286 (Internal error: Segmentation fault) * decl2.c (finish_static_data_member_decl): Complain about a local class with a static data member. PR c++/4286 * search.c (lookup_field_1): Don't xref a static data member just because we looked it up. From-SVN: r49395 --- gcc/cp/ChangeLog | 16 ++++++++++++++++ gcc/cp/decl2.c | 4 ++++ gcc/cp/search.c | 8 +------- gcc/testsuite/g++.dg/template/local1.C | 25 +++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/local1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 91d3dc69bd3..a3aa99e0051 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,19 @@ +2002-02-01 Jason Merrill + + PR c++/4872 + * decl.c (finish_function): Warn about a non-void function with + no return statement. + + * error.c (dump_scope): Don't add TFF_DECL_SPECIFIERS. + (dump_function_decl): Always dump parms. + + * decl2.c (finish_static_data_member_decl): Complain about a local + class with a static data member. + + PR c++/4286 + * search.c (lookup_field_1): Don't xref a static data member + just because we looked it up. + 2002-01-31 Jason Merrill * Make-lang.in (parse.c): Handle .output file. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 70fcf452786..9b1c355f7c8 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1420,6 +1420,10 @@ finish_static_data_member_decl (decl, init, asmspec_tree, flags) VARRAY_PUSH_TREE (pending_statics, decl); } + if (LOCAL_CLASS_P (current_class_type)) + pedwarn ("local class `%#T' shall not have static data member `%#D'", + current_class_type, decl); + /* Static consts need not be initialized in the class definition. */ if (init != NULL_TREE && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))) { diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 22d53323468..10ebc739f07 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -523,13 +523,7 @@ lookup_field_1 (type, name) from TYPE_FIELDS anyhow; see handle_using_decl. */ ; else if (DECL_NAME (field) == name) - { - if (TREE_CODE(field) == VAR_DECL - && (TREE_STATIC (field) || DECL_EXTERNAL (field))) - GNU_xref_ref(current_function_decl, - IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (field))); - return field; - } + return field; field = TREE_CHAIN (field); } /* Not found. */ diff --git a/gcc/testsuite/g++.dg/template/local1.C b/gcc/testsuite/g++.dg/template/local1.C new file mode 100644 index 00000000000..85b005678df --- /dev/null +++ b/gcc/testsuite/g++.dg/template/local1.C @@ -0,0 +1,25 @@ +// PR c++/4286: We were crashing when trying to set up the class bindings in +// g(), because xref wanted the mangled name, which breaks inside a template. + +// Of course, the offending code is actually ill-formed anyway, so check +// for the error. + +struct A +{ + template void f(); +}; + +template void A::f() +{ + struct B + { + void g() {} + static int x; // { dg-error "static" "" } + }; +} + +int main () +{ + A a; + a.f (); +} -- 2.30.2