6565#include "clang/Sema/Redeclaration.h"
6666#include "clang/Sema/Scope.h"
6767#include "clang/Sema/SemaBase.h"
68- #include "clang/Sema/SemaConcept.h"
6968#include "clang/Sema/TypoCorrection.h"
7069#include "clang/Sema/Weak.h"
7170#include "llvm/ADT/APInt.h"
@@ -11695,9 +11694,8 @@ class Sema final : public SemaBase {
1169511694 ExprResult
1169611695 CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
1169711696 const DeclarationNameInfo &ConceptNameInfo,
11698- NamedDecl *FoundDecl, TemplateDecl *NamedConcept,
11699- const TemplateArgumentListInfo *TemplateArgs,
11700- bool DoCheckConstraintSatisfaction = true);
11697+ NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
11698+ const TemplateArgumentListInfo *TemplateArgs);
1170111699
1170211700 void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc);
1170311701 void diagnoseMissingTemplateArguments(const CXXScopeSpec &SS,
@@ -12027,13 +12025,6 @@ class Sema final : public SemaBase {
1202712025 bool UpdateArgsWithConversions = true,
1202812026 bool *ConstraintsNotSatisfied = nullptr);
1202912027
12030- bool CheckTemplateArgumentList(
12031- TemplateDecl *Template, TemplateParameterList *Params,
12032- SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs,
12033- const DefaultArguments &DefaultArgs, bool PartialTemplateArgs,
12034- CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions = true,
12035- bool *ConstraintsNotSatisfied = nullptr);
12036-
1203712028 bool CheckTemplateTypeArgument(
1203812029 TemplateTypeParmDecl *Param, TemplateArgumentLoc &Arg,
1203912030 SmallVectorImpl<TemplateArgument> &SugaredConverted,
@@ -12792,18 +12783,6 @@ class Sema final : public SemaBase {
1279212783 void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
1279312784 unsigned Depth, llvm::SmallBitVector &Used);
1279412785
12795- /// Mark which template parameters are named in a given expression.
12796- ///
12797- /// Unlike MarkUsedTemplateParameters, this excludes parameter that
12798- /// are used but not directly named by an expression - i.e. it excludes
12799- /// any template parameter that denotes the type of a referenced NTTP.
12800- ///
12801- /// \param Used a bit vector whose elements will be set to \c true
12802- /// to indicate when the corresponding template parameter will be
12803- /// deduced.
12804- void MarkUsedTemplateParametersForSubsumptionParameterMapping(
12805- const Expr *E, unsigned Depth, llvm::SmallBitVector &Used);
12806-
1280712786 /// Mark which template parameters can be deduced from a given
1280812787 /// template argument list.
1280912788 ///
@@ -12820,9 +12799,6 @@ class Sema final : public SemaBase {
1282012799 void MarkUsedTemplateParameters(ArrayRef<TemplateArgument> TemplateArgs,
1282112800 unsigned Depth, llvm::SmallBitVector &Used);
1282212801
12823- void MarkUsedTemplateParameters(ArrayRef<TemplateArgumentLoc> TemplateArgs,
12824- unsigned Depth, llvm::SmallBitVector &Used);
12825-
1282612802 void
1282712803 MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate,
1282812804 llvm::SmallBitVector &Deduced) {
@@ -13120,9 +13096,6 @@ class Sema final : public SemaBase {
1312013096 /// Whether we're substituting into constraints.
1312113097 bool InConstraintSubstitution;
1312213098
13123- /// Whether we're substituting into the parameter mapping of a constraint.
13124- bool InParameterMappingSubstitution;
13125-
1312613099 /// The point of instantiation or synthesis within the source code.
1312713100 SourceLocation PointOfInstantiation;
1312813101
@@ -13386,11 +13359,6 @@ class Sema final : public SemaBase {
1338613359 const MultiLevelTemplateArgumentList &TemplateArgs,
1338713360 TemplateArgumentListInfo &Outputs);
1338813361
13389- bool SubstTemplateArgumentsInParameterMapping(
13390- ArrayRef<TemplateArgumentLoc> Args, SourceLocation BaseLoc,
13391- const MultiLevelTemplateArgumentList &TemplateArgs,
13392- TemplateArgumentListInfo &Out, bool BuildPackExpansionTypes);
13393-
1339413362 /// Retrieve the template argument list(s) that should be used to
1339513363 /// instantiate the definition of the given declaration.
1339613364 ///
@@ -13852,12 +13820,6 @@ class Sema final : public SemaBase {
1385213820 CodeSynthesisContexts.back().InConstraintSubstitution;
1385313821 }
1385413822
13855- bool inParameterMappingSubstitution() const {
13856- return !CodeSynthesisContexts.empty() &&
13857- CodeSynthesisContexts.back().InParameterMappingSubstitution &&
13858- !inConstraintSubstitution();
13859- }
13860-
1386113823 using EntityPrinter = llvm::function_ref<void(llvm::raw_ostream &)>;
1386213824
1386313825 /// \brief create a Requirement::SubstitutionDiagnostic with only a
@@ -14742,10 +14704,6 @@ class Sema final : public SemaBase {
1474214704 SatisfactionStack.swap(NewSS);
1474314705 }
1474414706
14745- using ConstrainedDeclOrNestedRequirement =
14746- llvm::PointerUnion<const NamedDecl *,
14747- const concepts::NestedRequirement *>;
14748-
1474914707 /// Check whether the given expression is a valid constraint expression.
1475014708 /// A diagnostic is emitted if it is not, false is returned, and
1475114709 /// PossibleNonPrimary will be set to true if the failure might be due to a
@@ -14770,12 +14728,44 @@ class Sema final : public SemaBase {
1477014728 /// \returns true if an error occurred and satisfaction could not be checked,
1477114729 /// false otherwise.
1477214730 bool CheckConstraintSatisfaction(
14773- ConstrainedDeclOrNestedRequirement Entity ,
14731+ const NamedDecl *Template ,
1477414732 ArrayRef<AssociatedConstraint> AssociatedConstraints,
1477514733 const MultiLevelTemplateArgumentList &TemplateArgLists,
14776- SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction,
14777- const ConceptReference *TopLevelConceptId = nullptr,
14778- Expr **ConvertedExpr = nullptr);
14734+ SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction) {
14735+ llvm::SmallVector<Expr *, 4> Converted;
14736+ return CheckConstraintSatisfaction(Template, AssociatedConstraints,
14737+ Converted, TemplateArgLists,
14738+ TemplateIDRange, Satisfaction);
14739+ }
14740+
14741+ /// \brief Check whether the given list of constraint expressions are
14742+ /// satisfied (as if in a 'conjunction') given template arguments.
14743+ /// Additionally, takes an empty list of Expressions which is populated with
14744+ /// the instantiated versions of the ConstraintExprs.
14745+ /// \param Template the template-like entity that triggered the constraints
14746+ /// check (either a concept or a constrained entity).
14747+ /// \param ConstraintExprs a list of constraint expressions, treated as if
14748+ /// they were 'AND'ed together.
14749+ /// \param ConvertedConstraints a out parameter that will get populated with
14750+ /// the instantiated version of the ConstraintExprs if we successfully checked
14751+ /// satisfaction.
14752+ /// \param TemplateArgList the multi-level list of template arguments to
14753+ /// substitute into the constraint expression. This should be relative to the
14754+ /// top-level (hence multi-level), since we need to instantiate fully at the
14755+ /// time of checking.
14756+ /// \param TemplateIDRange The source range of the template id that
14757+ /// caused the constraints check.
14758+ /// \param Satisfaction if true is returned, will contain details of the
14759+ /// satisfaction, with enough information to diagnose an unsatisfied
14760+ /// expression.
14761+ /// \returns true if an error occurred and satisfaction could not be checked,
14762+ /// false otherwise.
14763+ bool CheckConstraintSatisfaction(
14764+ const NamedDecl *Template,
14765+ ArrayRef<AssociatedConstraint> AssociatedConstraints,
14766+ llvm::SmallVectorImpl<Expr *> &ConvertedConstraints,
14767+ const MultiLevelTemplateArgumentList &TemplateArgList,
14768+ SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction);
1477914769
1478014770 /// \brief Check whether the given non-dependent constraint expression is
1478114771 /// satisfied. Returns false and updates Satisfaction with the satisfaction
@@ -14841,17 +14831,16 @@ class Sema final : public SemaBase {
1484114831 /// \param First whether this is the first time an unsatisfied constraint is
1484214832 /// diagnosed for this error.
1484314833 void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction,
14844- SourceLocation Loc = {},
1484514834 bool First = true);
1484614835
1484714836 /// \brief Emit diagnostics explaining why a constraint expression was deemed
1484814837 /// unsatisfied.
1484914838 void
14850- DiagnoseUnsatisfiedConstraint(const ConceptSpecializationExpr *ConstraintExpr ,
14839+ DiagnoseUnsatisfiedConstraint(const ASTConstraintSatisfaction &Satisfaction ,
1485114840 bool First = true);
1485214841
1485314842 const NormalizedConstraint *getNormalizedAssociatedConstraints(
14854- ConstrainedDeclOrNestedRequirement Entity ,
14843+ const NamedDecl *ConstrainedDecl ,
1485514844 ArrayRef<AssociatedConstraint> AssociatedConstraints);
1485614845
1485714846 /// \brief Check whether the given declaration's associated constraints are
@@ -14876,15 +14865,6 @@ class Sema final : public SemaBase {
1487614865 const NamedDecl *D1, ArrayRef<AssociatedConstraint> AC1,
1487714866 const NamedDecl *D2, ArrayRef<AssociatedConstraint> AC2);
1487814867
14879- /// Cache the satisfaction of an atomic constraint.
14880- /// The key is based on the unsubstituted expression and the parameter
14881- /// mapping. This lets us not substituting the mapping more than once,
14882- /// which is (very!) expensive.
14883- /// FIXME: this should be private.
14884- llvm::DenseMap<llvm::FoldingSetNodeID,
14885- UnsubstitutedConstraintSatisfactionCacheResult>
14886- UnsubstitutedConstraintSatisfactionCache;
14887-
1488814868private:
1488914869 /// Caches pairs of template-like decls whose associated constraints were
1489014870 /// checked for subsumption and whether or not the first's constraints did in
@@ -14895,11 +14875,8 @@ class Sema final : public SemaBase {
1489514875 /// constrained declarations). If an error occurred while normalizing the
1489614876 /// associated constraints of the template or concept, nullptr will be cached
1489714877 /// here.
14898- llvm::DenseMap<ConstrainedDeclOrNestedRequirement, NormalizedConstraint *>
14899- NormalizationCache;
14878+ llvm::DenseMap<const NamedDecl *, NormalizedConstraint *> NormalizationCache;
1490014879
14901- /// Cache whether the associated constraint of a declaration
14902- /// is satisfied.
1490314880 llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
1490414881 SatisfactionCache;
1490514882
0 commit comments