From 8e52e063afdb17d8d92e5ceb1c03dc915a5a17a3 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 16 Oct 1998 18:40:36 +0000 Subject: [PATCH] decl.c (lookup_name_real): Handle template parameters for member temlates where said parameters have the... * decl.c (lookup_name_real): Handle template parameters for member temlates where said parameters have the same name as the surrounding class. From-SVN: r23141 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/decl.c | 24 ++++++++++++++++++++- gcc/testsuite/g++.old-deja/g++.pt/redecl2.C | 14 ++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/redecl2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0569dd3232a..11159fa2f2e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 1998-10-16 Mark Mitchell + * decl.c (lookup_name_real): Handle template parameters for member + temlates where said parameters have the same name as the + surrounding class. + * decl.c (expand_static_init): Build cleanups before entering the anonymous function used to do them to avoid access-checking confusion. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 80ee017bf50..1c4f12c7fa8 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5166,7 +5166,29 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only) if (locval && classval) { - if (current_scope () == current_function_decl + /* We have both a local binding and a class-level binding. This + can happen in two ways: + + o We are in a member function of a class. + o We are in a local class within a function. + + We need to determine which one of these situations is + occuring, and give the innermost binding. One tricky bit is + that with member templates we can be in the first case + without CURRENT_FUNCTION_DECL being set. Consider + + struct A { template void f(A); }; + + Here, when we look at the `A' in the parameter declaration + for `f' we have a local binding (the template parameter) and + a class-level binding (the TYPE_DECL for the class). + Fortunately, if LOCVAL is a template parameter it is safe to + take it; nothing within the scope of the template parameter + is allowed to have the same name. */ + + if (decl_template_parm_p (locval)) + val = locval; + else if (current_scope () == current_function_decl && ! hack_decl_function_context (current_function_decl)) /* Not in a nested function. */ val = locval; diff --git a/gcc/testsuite/g++.old-deja/g++.pt/redecl2.C b/gcc/testsuite/g++.old-deja/g++.pt/redecl2.C new file mode 100644 index 00000000000..0b65e1ec957 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/redecl2.C @@ -0,0 +1,14 @@ +// Build don't link: + +struct A +{ + template + void f(A) {} +}; + +void g() +{ + A a; + a.f(3); +} +