call.c (build_user_type_conversion_1): Handle second_conv properly for templates.

* call.c (build_user_type_conversion_1): Handle second_conv
	properly for templates.

From-SVN: r19626
This commit is contained in:
Jason Merrill 1998-05-08 00:51:27 +00:00 committed by Jason Merrill
parent bbeb7b6556
commit 749adefd03
2 changed files with 19 additions and 9 deletions

View File

@ -1,3 +1,8 @@
Fri May 8 00:43:50 1998 Jason Merrill <jason@yorick.cygnus.com>
* call.c (build_user_type_conversion_1): Handle second_conv
properly for templates.
Thu May 7 17:09:25 EDT 1998 Andrew MacLeod <amacleod@cygnus.com>
* method.c (build_decl_overload_real): Set TREE_USED flag to

View File

@ -2087,19 +2087,16 @@ build_user_type_conversion_1 (totype, expr, flags)
ics = implicit_conversion
(totype, TREE_TYPE (TREE_TYPE (fn)), 0, convflags);
else
/* Here, the template conversion operator result must
precisely match the TOTYPE. (FIXME: Actually, we're
supposed to do some simple conversions here; see
[temp.deduct.conv].). If the result of the conversion
operator is not actually TOTYPE, then
add_template_candidate will fail below. */
ics = implicit_conversion (totype, totype, 0, convflags);
/* We can't compute this yet. */
ics = error_mark_node;
if (TREE_CODE (totype) == REFERENCE_TYPE && ics && ICS_BAD_FLAG (ics))
/* ignore the near match. */;
else if (ics)
for (; fn; fn = DECL_CHAIN (fn))
{
struct z_candidate *old_candidates = candidates;
if (TREE_CODE (fn) == TEMPLATE_DECL)
{
templates = scratch_tree_cons (NULL_TREE, fn, templates);
@ -2111,11 +2108,19 @@ build_user_type_conversion_1 (totype, expr, flags)
candidates = add_function_candidate (candidates, fn,
args, flags);
if (candidates)
if (candidates != old_candidates)
{
if (TREE_CODE (fn) == TEMPLATE_DECL)
ics = implicit_conversion
(totype, TREE_TYPE (TREE_TYPE (candidates->fn)),
0, convflags);
candidates->second_conv = ics;
candidates->basetype_path = TREE_PURPOSE (convs);
if (candidates->viable == 1 && ICS_BAD_FLAG (ics))
if (ics == NULL_TREE)
candidates->viable = 0;
else if (candidates->viable == 1 && ICS_BAD_FLAG (ics))
candidates->viable = -1;
}
}