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
