From: Patrick Palka Date: Tue, 30 Jan 2024 15:13:41 +0000 (-0500) Subject: c++: unifying integer parm with type-dep arg [PR113644] X-Git-Tag: basepoints/gcc-15~1509 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=af37bef86199e50368cbfbc97befe0622a07f12f;p=thirdparty%2Fgcc.git c++: unifying integer parm with type-dep arg [PR113644] Here when trying to unify P=42 A=T::value we ICE due to the latter's empty type, which same_type_p dislikes. PR c++/113644 gcc/cp/ChangeLog: * pt.cc (unify) : Handle NULL_TREE type. gcc/testsuite/ChangeLog: * g++.dg/template/nontype30.C: New test. --- diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index fb2448a26e96..5871cb668d0c 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -24949,7 +24949,8 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict, /* Type INTEGER_CST can come from ordinary constant template args. */ case INTEGER_CST: case REAL_CST: - if (!same_type_p (TREE_TYPE (parm), TREE_TYPE (arg))) + if (TREE_TYPE (arg) == NULL_TREE + || !same_type_p (TREE_TYPE (parm), TREE_TYPE (arg))) return unify_template_argument_mismatch (explain_p, parm, arg); while (CONVERT_EXPR_P (arg)) arg = TREE_OPERAND (arg, 0); diff --git a/gcc/testsuite/g++.dg/template/nontype30.C b/gcc/testsuite/g++.dg/template/nontype30.C new file mode 100644 index 000000000000..926a7726547d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype30.C @@ -0,0 +1,13 @@ +// PR c++/113644 + +template struct A { }; + +template void f(A<42>); +template void f(A); + +struct B { static const int value = 42; }; + +int main() { + A<42> a; + f(a); // { dg-error "ambiguous" } +}