On 2/19/26 6:19 AM, Jakub Jelinek wrote:
Hi!

Some of the following testcases are incorrectly accepted.
The problem is in convert_nontype_argument.  It just does
maybe_constant_value earlier.  Later on for integral/enum/floating
point args it uses cxx_constant_value for complain & tf_error if
not val_dep_p and expr is not a simple constant, similarly for
class type it calls
       /* Replace the argument with a reference to the corresponding template
          parameter object.  */
       if (!val_dep_p)
         expr = create_template_parm_object (expr, complain);
       if (expr == error_mark_node)
         return NULL_TREE;
etc.  But for NULLPTR_TYPE_P and REFLECTION_TYPE_P cases (I bet
Marek has based the latter on the former) it only verifies the type
and not the actual expression.
I think we need to do that, because if maybe_constant_value fails, it
just returns the passed in argument and if nothing checks it, we accept
whatever was there (and sometimes ICE later).

The following patch implements that.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2026-02-18  Jakub Jelinek  <[email protected]>

        PR c++/124070
        * pt.cc (convert_nontype_argument): For NULLPTR_TYPE_P case
        if expr is not integer_zerop and is not val_dep_p try harder,
        for complain & tf_error use cxx_constant_value and return NULL_TREE
        for error_mark_node,

Yes.

without tf_error return NULL_TREE.  Similarly

...but the function comment says that we should return error_mark_node on failure when !tf_error.

Jason

Reply via email to