diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -6619,28 +6619,8 @@ return false; } - // The trailing require clause of instantiated function may change during - // the semantic analysis. Trying to get the primary template function (if - // exists) to compare the primary trailing require clause. - auto TryToGetPrimaryTemplatedFunction = - [](const FunctionDecl *FD) -> const FunctionDecl * { - switch (FD->getTemplatedKind()) { - case FunctionDecl::TK_DependentNonTemplate: - return FD->getInstantiatedFromDecl(); - case FunctionDecl::TK_FunctionTemplate: - return FD->getDescribedFunctionTemplate()->getTemplatedDecl(); - case FunctionDecl::TK_MemberSpecialization: - return FD->getInstantiatedFromMemberFunction(); - case FunctionDecl::TK_FunctionTemplateSpecialization: - return FD->getPrimaryTemplate()->getTemplatedDecl(); - default: - return FD; - } - }; - const FunctionDecl *PrimaryX = TryToGetPrimaryTemplatedFunction(FuncX); - const FunctionDecl *PrimaryY = TryToGetPrimaryTemplatedFunction(FuncY); - if (!isSameConstraintExpr(PrimaryX->getTrailingRequiresClause(), - PrimaryY->getTrailingRequiresClause())) + if (!isSameConstraintExpr(FuncX->getTrailingRequiresClause(), + FuncY->getTrailingRequiresClause())) return false; auto GetTypeAsWritten = [](const FunctionDecl *FD) { diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -704,26 +704,10 @@ Record = const_cast(Method->getParent()); } CXXThisScopeRAII ThisScope(*this, Record, ThisQuals, Record != nullptr); - // We substitute with empty arguments in order to rebuild the atomic - // constraint in a constant-evaluated context. - // FIXME: Should this be a dedicated TreeTransform? - const Expr *RC = FD->getTrailingRequiresClause(); - llvm::SmallVector Converted; - - if (CheckConstraintSatisfaction( - FD, {RC}, Converted, *MLTAL, - SourceRange(UsageLoc.isValid() ? UsageLoc : FD->getLocation()), - Satisfaction)) - return true; - - // FIXME: we need to do this for the function constraints for - // comparison of constraints to work, but do we also need to do it for - // CheckInstantiatedFunctionConstraints? That one is more difficult, but we - // seem to always just pick up the constraints from the primary template. - assert(Converted.size() <= 1 && "Got more expressions converted?"); - if (!Converted.empty() && Converted[0] != nullptr) - const_cast(FD)->setTrailingRequiresClause(Converted[0]); - return false; + return CheckConstraintSatisfaction( + FD, {FD->getTrailingRequiresClause()}, *MLTAL, + SourceRange(UsageLoc.isValid() ? UsageLoc : FD->getLocation()), + Satisfaction); }