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:
parent
96b106e5c9
commit
8e52e063af
@ -1,5 +1,9 @@
|
|||||||
1998-10-16 Mark Mitchell <mark@markmitchell.com>
|
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
|
* decl.c (expand_static_init): Build cleanups before entering the
|
||||||
anonymous function used to do them to avoid access-checking
|
anonymous function used to do them to avoid access-checking
|
||||||
confusion.
|
confusion.
|
||||||
|
@ -5166,7 +5166,29 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
|
|||||||
|
|
||||||
if (locval && classval)
|
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))
|
&& ! hack_decl_function_context (current_function_decl))
|
||||||
/* Not in a nested function. */
|
/* Not in a nested function. */
|
||||||
val = locval;
|
val = locval;
|
||||||
|
14
gcc/testsuite/g++.old-deja/g++.pt/redecl2.C
Normal file
14
gcc/testsuite/g++.old-deja/g++.pt/redecl2.C
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Build don't link:
|
||||||
|
|
||||||
|
struct A
|
||||||
|
{
|
||||||
|
template <class A>
|
||||||
|
void f(A) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
void g()
|
||||||
|
{
|
||||||
|
A a;
|
||||||
|
a.f(3);
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user