rsmith created this revision. rsmith added reviewers: erichkeane, ChuanqiXu. Herald added a project: All. rsmith requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This change reverts the functional change from D144626 <https://reviews.llvm.org/D144626> but retains its test. Instead of dealing with the possibility that a trailing requires clause might have been rewritten into some other incorrect form, just stop rewriting it. No functionality changes intended. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D147281 Files: clang/lib/AST/ASTContext.cpp clang/lib/Sema/SemaConcept.cpp Index: clang/lib/Sema/SemaConcept.cpp =================================================================== --- clang/lib/Sema/SemaConcept.cpp +++ clang/lib/Sema/SemaConcept.cpp @@ -704,26 +704,10 @@ Record = const_cast<CXXRecordDecl *>(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<Expr *, 1> 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<FunctionDecl *>(FD)->setTrailingRequiresClause(Converted[0]); - return false; + return CheckConstraintSatisfaction( + FD, {FD->getTrailingRequiresClause()}, *MLTAL, + SourceRange(UsageLoc.isValid() ? UsageLoc : FD->getLocation()), + Satisfaction); } Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -6701,28 +6701,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; // Constrained friends are different in certain cases, see: [temp.friend]p9.
Index: clang/lib/Sema/SemaConcept.cpp =================================================================== --- clang/lib/Sema/SemaConcept.cpp +++ clang/lib/Sema/SemaConcept.cpp @@ -704,26 +704,10 @@ Record = const_cast<CXXRecordDecl *>(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<Expr *, 1> 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<FunctionDecl *>(FD)->setTrailingRequiresClause(Converted[0]); - return false; + return CheckConstraintSatisfaction( + FD, {FD->getTrailingRequiresClause()}, *MLTAL, + SourceRange(UsageLoc.isValid() ? UsageLoc : FD->getLocation()), + Satisfaction); } Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -6701,28 +6701,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; // Constrained friends are different in certain cases, see: [temp.friend]p9.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits