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
This commit is contained in:
Mark Mitchell 1998-10-16 18:40:36 +00:00 committed by Mark Mitchell
parent 96b106e5c9
commit 8e52e063af
3 changed files with 41 additions and 1 deletions

View File

@ -1,5 +1,9 @@
1998-10-16 Mark Mitchell <mark@markmitchell.com>
* 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.

View File

@ -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 <class A> 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;

View File

@ -0,0 +1,14 @@
// Build don't link:
struct A
{
template <class A>
void f(A) {}
};
void g()
{
A a;
a.f(3);
}