[clang] 13d6a57 - [Clang] constraints partial ordering should work with deduction guide

Yuanfang Chen via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 18 17:31:14 PDT 2022


Author: Yuanfang Chen
Date: 2022-10-18T17:30:47-07:00
New Revision: 13d6a57cbe2776c4873302c0cf04e27b77bd2862

URL: https://github.com/llvm/llvm-project/commit/13d6a57cbe2776c4873302c0cf04e27b77bd2862
DIFF: https://github.com/llvm/llvm-project/commit/13d6a57cbe2776c4873302c0cf04e27b77bd2862.diff

LOG: [Clang] constraints partial ordering should work with deduction guide

D128750 incorrectly skips constraints partial ordering for deduction guide.
This patch reverts that part.

Fixes https://github.com/llvm/llvm-project/issues/58456.

Added: 
    clang/test/SemaTemplate/deduction-guide-partial-ordering.cpp

Modified: 
    clang/lib/Sema/SemaTemplateDeduction.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 00b1cf1224e2..0572a663561c 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -5243,8 +5243,7 @@ FunctionTemplateDecl *Sema::getMoreSpecializedTemplate(
     }
   }
 
-  if (!Context.getLangOpts().CPlusPlus20 || isa<CXXDeductionGuideDecl>(FD1) ||
-      isa<CXXDeductionGuideDecl>(FD2))
+  if (!Context.getLangOpts().CPlusPlus20)
     return nullptr;
 
   // Match GCC on not implementing [temp.func.order]p6.2.1.

diff  --git a/clang/test/SemaTemplate/deduction-guide-partial-ordering.cpp b/clang/test/SemaTemplate/deduction-guide-partial-ordering.cpp
new file mode 100644
index 000000000000..4f57d07a850d
--- /dev/null
+++ b/clang/test/SemaTemplate/deduction-guide-partial-ordering.cpp
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -std=c++20 -verify %s
+// expected-no-diagnostics
+
+namespace pr58456 {
+  template<typename>
+  struct s {
+    constexpr s(auto) {
+    }
+  };
+
+  template<typename T>
+  s(T) -> s<int>;
+
+  template<typename T> requires true
+  s(T) -> s<int>;
+
+  void f() {
+    auto const y = s(0);
+  }
+}


        


More information about the cfe-commits mailing list