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:
parent
63959c221b
commit
59581da697
3 changed files with 57 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
32
gcc/testsuite/g++.old-deja/g++.pt/defarg4.C
Normal file
32
gcc/testsuite/g++.old-deja/g++.pt/defarg4.C
Normal 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();
|
||||
}
|
||||
|
Loading…
Add table
Reference in a new issue