]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: unifying integer parm with type-dep arg [PR113644]
authorPatrick Palka <ppalka@redhat.com>
Tue, 30 Jan 2024 15:13:41 +0000 (10:13 -0500)
committerPatrick Palka <ppalka@redhat.com>
Tue, 30 Jan 2024 15:13:41 +0000 (10:13 -0500)
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) <case INTEGER_CST>: Handle NULL_TREE type.

gcc/testsuite/ChangeLog:

* g++.dg/template/nontype30.C: New test.

gcc/cp/pt.cc
gcc/testsuite/g++.dg/template/nontype30.C [new file with mode: 0644]

index fb2448a26e968433c7705853ce1944ae36cb8d22..5871cb668d0cb65906639a90596435ddedf9928f 100644 (file)
@@ -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 (file)
index 0000000..926a772
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/113644
+
+template<int> struct A { };
+
+template<class T> void f(A<42>);
+template<class T> void f(A<T::value>);
+
+struct B { static const int value = 42; };
+
+int main() {
+  A<42> a;
+  f<B>(a); // { dg-error "ambiguous" }
+}