call.c (build_user_type_conversion_1): Handle second_conv properly for templates.
authorJason Merrill <jason@yorick.cygnus.com>
Fri, 8 May 1998 00:51:27 +0000 (00:51 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 8 May 1998 00:51:27 +0000 (20:51 -0400)
* call.c (build_user_type_conversion_1): Handle second_conv
properly for templates.

From-SVN: r19626

gcc/cp/ChangeLog
gcc/cp/call.c

index c5699e629afa17b4662b906a69f9bb2fdcf9cb48..8c4b6ba8b3b5e6b5b31c79aff5eb235949067e5a 100644 (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
index c7eaed4ae7f8a409e4dbfd3d6dab68efea7a0c36..c79fafc3a6c9f898ed339f8b70d2645c074c29df 100644 (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;
              }
          }