pt.c (fn_type_unification): Allow incomplete unification without an immediate error message.
* pt.c (fn_type_unification): Allow incomplete unification without an immediate error message. From-SVN: r18912
This commit is contained in:
parent
b04cd50711
commit
7cd55873dc
@ -1,3 +1,8 @@
|
|||||||
|
Mon Mar 30 12:15:00 1998 Mark Mitchell <mmitchell@usa.net>
|
||||||
|
|
||||||
|
* pt.c (fn_type_unification): Allow incomplete unification without
|
||||||
|
an immediate error message.
|
||||||
|
|
||||||
Mon Mar 30 08:55:42 1998 Jason Merrill <jason@yorick.cygnus.com>
|
Mon Mar 30 08:55:42 1998 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
* tree.c (member_p): New fn.
|
* tree.c (member_p): New fn.
|
||||||
|
@ -5325,12 +5325,16 @@ fn_type_unification (fn, explicit_targs, targs, args, return_type,
|
|||||||
fn_arg_types = scratch_tree_cons (NULL_TREE, extra_fn_arg,
|
fn_arg_types = scratch_tree_cons (NULL_TREE, extra_fn_arg,
|
||||||
fn_arg_types);
|
fn_arg_types);
|
||||||
|
|
||||||
|
/* We allow incomplete unification without an error message here
|
||||||
|
because the standard doesn't seem to explicitly prohibit it. Our
|
||||||
|
callers must be ready to deal with unification failures in any
|
||||||
|
event. */
|
||||||
i = type_unification (DECL_INNERMOST_TEMPLATE_PARMS (fn),
|
i = type_unification (DECL_INNERMOST_TEMPLATE_PARMS (fn),
|
||||||
targs,
|
targs,
|
||||||
fn_arg_types,
|
fn_arg_types,
|
||||||
decl_arg_types,
|
decl_arg_types,
|
||||||
explicit_targs,
|
explicit_targs,
|
||||||
strict, 0);
|
strict, 1);
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
27
gcc/testsuite/g++.old-deja/g++.pt/unify2.C
Normal file
27
gcc/testsuite/g++.old-deja/g++.pt/unify2.C
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// Build don't link:
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct S
|
||||||
|
{
|
||||||
|
typedef T S_Type;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void foo(typename S<T>::S_Type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void foo(T)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct S2 {};
|
||||||
|
|
||||||
|
void bar()
|
||||||
|
{
|
||||||
|
foo(S2()); // We can't unify with the first foo, so we get the second.
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user