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

--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-14 branch has been updated by Marek Polacek
<mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:52da8588fd06198edcda81d7acf83ec92ccb63ef

commit r14-10603-g52da8588fd06198edcda81d7acf83ec92ccb63ef
Author: Marek Polacek <pola...@redhat.com>
Date:   Thu Aug 15 11:53:10 2024 -0400

    c++: fix ICE in convert_nontype_argument [PR116384]

    Here we ICE since r14-8291 in C++11/C++14 modes.  Fortunately
    this is an easy one.

    The important bit of r14-8291 is this:

    @@ -20056,9 +20071,12 @@ tsubst_expr (tree t, tree args, tsubst_flags_t
complain, tree in_decl)
            RETURN (retval);
          }
        if (IMPLICIT_CONV_EXPR_NONTYPE_ARG (t))
    -     /* We'll pass this to convert_nontype_argument again, we don't need
    -        to actually perform any conversion here.  */
    -     RETURN (expr);
    +     {
    +       tree r = convert_nontype_argument (type, expr, complain);
    +       if (r == NULL_TREE)
    +         r = error_mark_node;
    +       RETURN (r);
    +     }

    which obviously means that instead of returning right away we go
    to convert_nontype_argument.  When type is error_mark_node and we're
    in C++17, in convert_nontype_argument we go down this path:

          else if (INTEGRAL_OR_ENUMERATION_TYPE_P (type)
                   || cxx_dialect >= cxx17)
            {
              expr = build_converted_constant_expr (type, expr, complain);
              if (expr == error_mark_node)
                return (complain & tf_error) ? NULL_TREE : error_mark_node;
              // ...
            }

    but pre-C++17, we take a different route and end up crashing on
    gcc_unreachable.

    It would of course also work to check for error_mark_node early in
    build_converted_constant_expr.

            PR c++/116384

    gcc/cp/ChangeLog:

            * pt.cc (tsubst_expr) <case IMPLICIT_CONV_EXPR>: Bail if tsubst
            returns error_mark_node.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp0x/vt-116384.C: New test.

    (cherry picked from commit 8191f15022b0ea44fcb549449b0458d07ae02e0a)

Reply via email to