================ @@ -1109,12 +1109,50 @@ bool Sema::EnsureTemplateArgumentListConstraints( return false; } -bool Sema::CheckInstantiatedFunctionTemplateConstraints( +static bool CheckFunctionConstraintsWithoutInstantiation( + Sema &SemaRef, SourceLocation PointOfInstantiation, + FunctionTemplateDecl *Template, ArrayRef<TemplateArgument> TemplateArgs, + ConstraintSatisfaction &Satisfaction) { + SmallVector<const Expr *, 3> TemplateAC; + Template->getAssociatedConstraints(TemplateAC); + if (TemplateAC.empty()) { + Satisfaction.IsSatisfied = true; + return false; + } + + LocalInstantiationScope Scope(SemaRef); + + FunctionDecl *FD = Template->getTemplatedDecl(); + // Collect the list of template arguments relative to the 'primary' + // template. We need the entire list, since the constraint is completely + // uninstantiated at this point. + MultiLevelTemplateArgumentList MLTAL = + SemaRef.getTemplateInstantiationArgs(FD, /*DC=*/nullptr, + /*Final=*/false, + /*Innermost=*/TemplateArgs, + /*RelativeToPrimary=*/true, + /*ForConstraintInstantiation=*/true); + + std::optional<Sema::CXXThisScopeRAII> ThisScope; + if (auto *Method = dyn_cast<CXXMethodDecl>(FD)) + ThisScope.emplace(SemaRef, /*Record=*/Method->getParent(), + /*ThisQuals=*/Method->getMethodQualifiers()); ---------------- zyn0217 wrote:
I tried to contrive a case like ```cpp template <class T> struct S { void foo() requires(__is_same_as(S&, decltype(*this))) {} }; void g() { S<int>().foo(); } ``` But there would still be no difference if we did the `CXXThisScopeRAII` things away. (It always compiles.) Maybe I'm running out of ideas right now, so let's just preserve these "strange but plausible" things? https://github.com/llvm/llvm-project/pull/102857 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits