From 749adefd03907c4dd0e039ad8cb6c4345a3b5bf7 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 8 May 1998 00:51:27 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/call.c | 23 ++++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c5699e629af..8c4b6ba8b3b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +Fri May 8 00:43:50 1998 Jason Merrill + + * call.c (build_user_type_conversion_1): Handle second_conv + properly for templates. + Thu May 7 17:09:25 EDT 1998 Andrew MacLeod * method.c (build_decl_overload_real): Set TREE_USED flag to diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c7eaed4ae7f..c79fafc3a6c 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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; } } -- 2.30.2