https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92705

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
The ICE is because conv is ck_ambig with user_conv_p set.
Looking at other conv->user_conv_p tests, e.g. reference_binding does:
  if (conv->user_conv_p)
    {
...

      for (conversion *t = conv; t; t = next_conversion (t))
        if (t->kind == ck_user
            && DECL_CONV_FN_P (t->cand->fn))
          {
and doesn't expect that user_conv_p implies that ck_user will appear.
The following patch restores the previous diagnostics on the testcase, but I'm
afraid I have no idea what is right.  If ck_ambig with user_conv_p set is
right, then it itself isn't ck_user and next_conversion on it is NULL.

--- gcc/cp/call.c.jj    2019-11-28 18:58:55.671297387 +0100
+++ gcc/cp/call.c       2019-11-29 12:33:04.033386816 +0100
@@ -6370,8 +6370,12 @@ build_new_op_1 (const op_location_t &loc
          conv = cand->convs[0];
          if (conv->user_conv_p)
            {
-             while (conv->kind != ck_user)
-               conv = next_conversion (conv);
+             for (conversion *t = conv; t; t = next_conversion (t))
+               if (t->kind == ck_user)
+                 {
+                   conv = t;
+                   break;
+                 }
              arg1 = convert_like (conv, arg1, complain);
            }

@@ -6380,8 +6384,12 @@ build_new_op_1 (const op_location_t &loc
              conv = cand->convs[1];
              if (conv->user_conv_p)
                {
-                 while (conv->kind != ck_user)
-                   conv = next_conversion (conv);
+                 for (conversion *t = conv; t; t = next_conversion (t))
+                   if (t->kind == ck_user)
+                     {
+                       conv = t;
+                       break;
+                     }
                  arg2 = convert_like (conv, arg2, complain);
                }
            }
@@ -6391,8 +6399,12 @@ build_new_op_1 (const op_location_t &loc
              conv = cand->convs[2];
              if (conv->user_conv_p)
                {
-                 while (conv->kind != ck_user)
-                   conv = next_conversion (conv);
+                 for (conversion *t = conv; t; t = next_conversion (t))
+                   if (t->kind == ck_user)
+                     {
+                       conv = t;
+                       break;
+                     }
                  arg3 = convert_like (conv, arg3, complain);
                }
            }

Reply via email to