call.c (build_over_call): Do name resolution for default arguments of function templa...
authorMark Mitchell <mmitchell@usa.net>
Wed, 1 Apr 1998 16:27:24 +0000 (16:27 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Wed, 1 Apr 1998 16:27:24 +0000 (16:27 +0000)
* call.c (build_over_call): Do name resolution for default
arguments of function templates in the scope of the templates.

From-SVN: r18932

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

index 06f1bb0..7d96732 100644 (file)
@@ -1,3 +1,8 @@
+Wed Apr  1 14:58:35 1998  Mark Mitchell  <mmitchell@usa.net>
+
+       * call.c (build_over_call): Do name resolution for default
+       arguments of function templates in the scope of the templates.
+
 Tue Mar 31 13:43:57 1998  Jeffrey A Law  (law@cygnus.com)
 
        * call.c: Include system.h.  Remove includes, declarations and
index 2959fc2..ab3e05e 100644 (file)
@@ -3220,9 +3220,26 @@ build_over_call (fn, convs, args, flags)
       tree arg = TREE_PURPOSE (parm);
 
       if (DECL_TEMPLATE_INFO (fn))
-       /* This came from a template.  Instantiate the default arg here,
-          not in tsubst.  */
-       arg = tsubst_expr (arg, DECL_TI_ARGS (fn), NULL_TREE);
+       {
+         /* This came from a template.  Instantiate the default arg here,
+            not in tsubst.  In the case of something like:
+
+              template <class T>
+              struct S {
+                static T t();
+                void f(T = t());
+              };
+
+            we must be careful to do name lookup in the scope of
+            S<T>, rather than in the current class.  */
+         if (DECL_REAL_CONTEXT (fn))
+           pushclass (DECL_REAL_CONTEXT (fn), 2);
+
+         arg = tsubst_expr (arg, DECL_TI_ARGS (fn), NULL_TREE);
+
+         if (DECL_REAL_CONTEXT (fn))
+           popclass (0);
+       }
       converted_args = expr_tree_cons
        (NULL_TREE, convert_default_arg (TREE_VALUE (parm), arg),
         converted_args);
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/defarg4.C b/gcc/testsuite/g++.old-deja/g++.pt/defarg4.C
new file mode 100644 (file)
index 0000000..9d5df8c
--- /dev/null
@@ -0,0 +1,32 @@
+// Build don't link:
+
+template <class T>
+struct S1
+{
+  void foo(T = t());
+
+  static T t();
+};
+
+
+template <class T>
+struct S2
+{
+  void bar();
+};
+
+
+template <class T>
+void S2<T>::bar ()
+{
+  S1<T> st;
+  st.foo();
+}
+
+
+int main()
+{
+  S2<int> s2i;
+  s2i.bar();
+}
+