OSDN Git Service

* decl.c (lookup_name_real): Handle template parameters for member
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Oct 1998 18:40:36 +0000 (18:40 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Oct 1998 18:40:36 +0000 (18:40 +0000)
temlates where said parameters have the same name as the
surrounding class.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@23141 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.old-deja/g++.pt/redecl2.C [new file with mode: 0644]

index 0569dd3..11159fa 100644 (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.
index 80ee017..1c4f12c 100644 (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;
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 (file)
index 0000000..0b65e1e
--- /dev/null
@@ -0,0 +1,14 @@
+// Build don't link:
+
+struct A 
+{
+  template <class A>
+  void f(A) {}
+};
+
+void g()
+{
+  A a;
+  a.f(3);
+}
+