26 #include "llvm/Support/TrailingObjects.h"
31 using namespace clang;
42 NamedConcept, ArgsAsWritten),
43 NumTemplateArgs(ConvertedArgs.size()),
44 Satisfaction(Satisfaction
56 "should not be value-dependent");
60 unsigned NumTemplateArgs)
61 :
Expr(ConceptSpecializationExprClass, Empty),
62 NumTemplateArgs(NumTemplateArgs) {}
67 std::uninitialized_copy(Converted.begin(), Converted.end(),
68 getTrailingObjects<TemplateArgument>());
81 void *Buffer = C.Allocate(totalSizeToAlloc<TemplateArgument>(
82 ConvertedArgs.size()));
93 bool ContainsUnexpandedParameterPack)
98 NumTemplateArgs(ConvertedArgs.size()),
99 Satisfaction(Satisfaction
107 D |= ExprDependence::Instantiation;
108 if (ContainsUnexpandedParameterPack)
109 D |= ExprDependence::UnexpandedPack;
119 bool ContainsUnexpandedParameterPack) {
120 void *Buffer = C.Allocate(totalSizeToAlloc<TemplateArgument>(
121 ConvertedArgs.size()));
124 ContainsUnexpandedParameterPack);
129 unsigned NumTemplateArgs) {
130 void *Buffer = C.Allocate(totalSizeToAlloc<TemplateArgument>(
140 return cast<TemplateTypeParmDecl>(TPL->getParam(0))
141 ->getTypeConstraint();
150 NumLocalParameters(LocalParameters.size()),
151 NumRequirements(Requirements.size()), Body(Body), RBraceLoc(RBraceLoc) {
152 RequiresExprBits.IsSatisfied =
false;
153 RequiresExprBits.RequiresKWLoc = RequiresKWLoc;
154 bool Dependent =
false;
155 bool ContainsUnexpandedParameterPack =
false;
157 Dependent |=
P->getType()->isInstantiationDependentType();
158 ContainsUnexpandedParameterPack |=
159 P->getType()->containsUnexpandedParameterPack();
161 RequiresExprBits.IsSatisfied =
true;
163 Dependent |= R->isDependent();
164 ContainsUnexpandedParameterPack |= R->containsUnexpandedParameterPack();
166 RequiresExprBits.IsSatisfied = R->isSatisfied();
167 if (!RequiresExprBits.IsSatisfied)
171 std::copy(LocalParameters.begin(), LocalParameters.end(),
172 getTrailingObjects<ParmVarDecl *>());
173 std::copy(Requirements.begin(), Requirements.end(),
174 getTrailingObjects<concepts::Requirement *>());
175 RequiresExprBits.IsSatisfied |= Dependent;
177 if (ContainsUnexpandedParameterPack)
178 setDependence(getDependence() | ExprDependence::UnexpandedPack);
184 setDependence(getDependence() | ExprDependence::ValueInstantiation);
187 RequiresExpr::RequiresExpr(
ASTContext &C, EmptyShell Empty,
188 unsigned NumLocalParameters,
189 unsigned NumRequirements)
190 :
Expr(RequiresExprClass, Empty), NumLocalParameters(NumLocalParameters),
191 NumRequirements(NumRequirements) { }
200 C.Allocate(totalSizeToAlloc<ParmVarDecl *, concepts::Requirement *>(
201 LocalParameters.size(), Requirements.size()),
203 return new (Mem)
RequiresExpr(C, RequiresKWLoc, Body, LocalParameters,
204 Requirements, RBraceLoc);
209 unsigned NumLocalParameters,
unsigned NumRequirements) {
211 C.Allocate(totalSizeToAlloc<ParmVarDecl *, concepts::Requirement *>(
212 NumLocalParameters, NumRequirements),
214 return new (Mem)
RequiresExpr(C, Empty, NumLocalParameters, NumRequirements);