call.c (build_over_call): Do name resolution for default arguments of function templates in the scope of...

* call.c (build_over_call): Do name resolution for default
	arguments of function templates in the scope of the templates.

From-SVN: r18932
This commit is contained in:
Mark Mitchell 1998-04-01 16:27:24 +00:00 committed by Mark Mitchell
parent 63959c221b
commit 59581da697
3 changed files with 57 additions and 3 deletions

View 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

View 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);

View File

@ -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();
}