[clang] [clang] check deduction consistency when partial ordering function templates (PR #100692)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 23 08:15:08 PDT 2024


================
@@ -0,0 +1,32 @@
+// RUN: %clang_cc1 -std=c++23 -verify %s
+
+namespace t1 {
+template<bool> struct enable_if { typedef void type; };
+template <class T> class Foo {};
+template <class X> constexpr bool check() { return true; }
+template <class X, class Enable = void> struct Bar {};
+
+template<class X> void func(Bar<X, typename enable_if<check<X>()>::type>) {}
+// expected-note at -1 {{candidate function}}
+
+template<class T> void func(Bar<Foo<T>>) {}
+// expected-note at -1 {{candidate function}}
+
+void g() {
+  func(Bar<Foo<int>>()); // expected-error {{call to 'func' is ambiguous}}
----------------
AaronBallman wrote:

Okay, after playing around a bit more... I don't think I can explain what our behavior is in practice, so maybe this is the correct approach. Certainly the code *seems* ambiguous to me, so I think the changes are defensible. I'm curious if @zygoloid has opinions here, but if not, I think it's fine to move forward.

https://github.com/llvm/llvm-project/pull/100692


More information about the cfe-commits mailing list