From 094e9f4779eb9b5c6a49014f2f80b8cbb833572f Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Sun, 18 Oct 2020 14:15:12 -0700 Subject: [PATCH] PR47893: Synthesis of a comparison operator from an 'operator<=>' inherits the SFINAEness of its enclosing context. --- clang/lib/Sema/SemaTemplateInstantiate.cpp | 2 +- clang/test/SemaCXX/cxx2a-three-way-comparison.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 92a8879..67ba2b8 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -856,6 +856,7 @@ Optional Sema::isSFINAEContext() const { case CodeSynthesisContext::DefaultTemplateArgumentInstantiation: case CodeSynthesisContext::PriorTemplateArgumentSubstitution: case CodeSynthesisContext::DefaultTemplateArgumentChecking: + case CodeSynthesisContext::RewritingOperatorAsSpaceship: // A default template argument instantiation and substitution into // template parameters with arguments for prior parameters may or may // not be a SFINAE context; look further up the stack. @@ -874,7 +875,6 @@ Optional Sema::isSFINAEContext() const { case CodeSynthesisContext::DeclaringSpecialMember: case CodeSynthesisContext::DeclaringImplicitEqualityComparison: case CodeSynthesisContext::DefiningSynthesizedFunction: - case CodeSynthesisContext::RewritingOperatorAsSpaceship: case CodeSynthesisContext::InitializingStructuredBinding: case CodeSynthesisContext::MarkingClassDllexported: // This happens in a context unrelated to template instantiation, so diff --git a/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp b/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp index 29ae950..353360e 100644 --- a/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp +++ b/clang/test/SemaCXX/cxx2a-three-way-comparison.cpp @@ -31,3 +31,12 @@ struct B { }; int &r = B().operator<=>(0); + +namespace PR47893 { + struct A { + void operator<=>(const A&) const; + }; + template auto f(T a, T b) -> decltype(a < b) = delete; + int &f(...); + int &r = f(A(), A()); +} -- 2.7.4