From af37bef86199e50368cbfbc97befe0622a07f12f Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Tue, 30 Jan 2024 10:13:41 -0500 Subject: [PATCH] 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. --- gcc/cp/pt.cc | 3 ++- gcc/testsuite/g++.dg/template/nontype30.C | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/nontype30.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index fb2448a26e9..5871cb668d0 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 00000000000..926a7726547 --- /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" } +} -- 2.11.4.GIT