14#ifndef LLVM_CLANG_AST_EXPRCONCEPTS_H
15#define LLVM_CLANG_AST_EXPRCONCEPTS_H
27#include "llvm/ADT/STLFunctionalExtras.h"
28#include "llvm/Support/ErrorHandling.h"
29#include "llvm/Support/TrailingObjects.h"
42class ConceptSpecializationExpr final :
public Expr {
66 bool ContainsUnexpandedParameterPack);
70 static ConceptSpecializationExpr *
75 static ConceptSpecializationExpr *
79 bool ContainsUnexpandedParameterPack);
82 return SpecDecl->getTemplateArguments();
94 return ConceptRef->hasExplicitTemplateArgs();
98 return ConceptRef->getConceptNameLoc();
101 return ConceptRef->getTemplateArgsAsWritten();
105 return ConceptRef->getNestedNameSpecifierLoc();
109 return ConceptRef->getTemplateKWLoc();
115 return ConceptRef->getConceptNameInfo();
119 assert(SpecDecl &&
"Template Argument Decl not initialized");
128 "isSatisfied called on a dependent ConceptSpecializationExpr");
129 return Satisfaction->IsSatisfied;
137 "getSatisfaction called on dependent ConceptSpecializationExpr");
138 return *Satisfaction;
142 return T->getStmtClass() == ConceptSpecializationExprClass;
146 return ConceptRef->getBeginLoc();
150 return ConceptRef->getEndLoc();
154 return ConceptRef->getLocation();
178 LLVM_PREFERRED_TYPE(
bool)
180 LLVM_PREFERRED_TYPE(
bool)
181 bool ContainsUnexpandedParameterPack : 1;
182 LLVM_PREFERRED_TYPE(
bool)
195 bool ContainsUnexpandedParameterPack,
bool IsSatisfied =
true) :
196 Kind(Kind), Dependent(IsDependent),
197 ContainsUnexpandedParameterPack(ContainsUnexpandedParameterPack),
198 Satisfied(IsSatisfied) {}
204 "isSatisfied can only be called on non-dependent requirements.");
210 "setSatisfied can only be called on non-dependent requirements.");
211 Satisfied = IsSatisfied;
218 ContainsUnexpandedParameterPack = Contains;
221 return ContainsUnexpandedParameterPack;
235 llvm::PointerUnion<SubstitutionDiagnostic *, TypeSourceInfo *>
Value;
236 SatisfactionStatus Status;
255 this->Status = Status;
264 "Attempted to get substitution diagnostic when there has been no "
265 "substitution failure.");
271 "Attempted to get type when there has been a substitution failure.");
293 llvm::PointerIntPair<
294 llvm::PointerUnion<TemplateParameterList *, SubstitutionDiagnostic *>,
307 TypeConstraintInfo(SubstDiag,
false) {}
319 return TypeConstraintInfo.getInt();
330 return TypeConstraintInfo.getPointer().isNull();
356 llvm::PointerUnion<Expr *, SubstitutionDiagnostic *>
Value;
358 ReturnTypeRequirement TypeReq;
360 SatisfactionStatus Status;
408 return SubstitutedConstraintExpr;
413 "Attempted to get expression substitution diagnostic when there has "
414 "been no expression substitution failure");
420 "ExprRequirement has no expression because there has been a "
421 "substitution failure.");
433 Expr *Constraint =
nullptr;
435 bool HasInvalidConstraint =
false;
436 StringRef InvalidConstraintEntity;
445 Constraint(Constraint) {
446 assert(Constraint->isInstantiationDependent() &&
447 "Nested requirement with non-dependent constraint must be "
448 "constructed with a ConstraintSatisfaction object");
455 Satisfaction.IsSatisfied),
456 Constraint(Constraint),
464 Satisfaction->IsSatisfied),
465 Satisfaction(Satisfaction), HasInvalidConstraint(
true),
466 InvalidConstraintEntity(InvalidConstraintEntity) {}
477 return InvalidConstraintEntity;
482 "getConstraintExpr() may not be called "
483 "on nested requirements with invalid constraint.");
488 return *Satisfaction;
503class RequiresExpr final :
public Expr,
504 llvm::TrailingObjects<RequiresExpr, ParmVarDecl *,
505 concepts::Requirement *> {
506 friend TrailingObjects;
509 unsigned NumLocalParameters;
510 unsigned NumRequirements;
516 unsigned numTrailingObjects(OverloadToken<ParmVarDecl *>)
const {
517 return NumLocalParameters;
527 unsigned NumRequirements);
539 unsigned NumRequirements);
542 return getTrailingObjects<ParmVarDecl *>(NumLocalParameters);
548 return getTrailingObjects<concepts::Requirement *>(NumRequirements);
555 &&
"isSatisfied called on a dependent RequiresExpr");
561 "setSatisfied called on a dependent RequiresExpr");
574 return T->getStmtClass() == RequiresExprClass;
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
Defines the C++ template declaration subclasses.
Defines the clang::SourceLocation class and associated facilities.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Declaration of a C++20 concept.
A reference to a concept and its template args, as it appears in the code.
Represents the specialization of a concept - evaluates to a prvalue of type bool.
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getExprLoc() const LLVM_READONLY
const_child_range children() const
bool isSatisfied() const
Whether or not the concept with the given arguments was satisfied when the expression was created.
ArrayRef< TemplateArgument > getTemplateArguments() const
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
bool hasExplicitTemplateArgs() const
static bool classof(const Stmt *T)
ConceptReference * getConceptReference() const
SourceLocation getConceptNameLoc() const
const ImplicitConceptSpecializationDecl * getSpecializationDecl() const
friend class ASTStmtReader
const DeclarationNameInfo & getConceptNameInfo() const
const ASTConstraintSatisfaction & getSatisfaction() const
Get elaborated satisfaction info about the template arguments' satisfaction of the named concept.
SourceLocation getTemplateKWLoc() const
ConceptDecl * getNamedConcept() const
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
This represents a decl that may have a name.
A C++ nested-name-specifier augmented with source location information.
Represents the body of a requires-expression.
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
SourceLocation getRBraceLoc() const
void setSatisfied(bool IsSatisfied)
SourceLocation getRequiresKWLoc() const
SourceLocation getEndLoc() const LLVM_READONLY
const_child_range children() const
RequiresExprBodyDecl * getBody() const
ArrayRef< concepts::Requirement * > getRequirements() const
bool isSatisfied() const
Whether or not the requires clause is satisfied.
SourceLocation getBeginLoc() const LLVM_READONLY
static bool classof(const Stmt *T)
ArrayRef< ParmVarDecl * > getLocalParameters() const
friend class ASTStmtReader
Encodes a location in the source.
Stmt - This represents one statement.
StmtIterator child_iterator
Child Iterators: All subclasses must implement 'children' to permit easy iteration over the substatem...
llvm::iterator_range< child_iterator > child_range
RequiresExprBitfields RequiresExprBits
ConstStmtIterator const_child_iterator
llvm::iterator_range< const_child_iterator > const_child_range
Stores a list of template parameters for a TemplateDecl and its derived classes.
bool containsUnexpandedParameterPack() const
Determine whether this template parameter list contains an unexpanded parameter pack.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
A container of type source information.
ReturnTypeRequirement()
No return type requirement was specified.
bool containsUnexpandedParameterPack() const
bool isTypeConstraint() const
TemplateParameterList * getTypeConstraintTemplateParameterList() const
const TypeConstraint * getTypeConstraint() const
bool isSubstitutionFailure() const
SubstitutionDiagnostic * getSubstitutionDiagnostic() const
ReturnTypeRequirement(SubstitutionDiagnostic *SubstDiag)
A return type requirement was specified but it was a substitution failure.
SubstitutionDiagnostic * getExprSubstitutionDiagnostic() const
ConceptSpecializationExpr * getReturnTypeRequirementSubstitutedConstraintExpr() const
bool isExprSubstitutionFailure() const
@ SS_ConstraintsNotSatisfied
@ SS_TypeRequirementSubstitutionFailure
@ SS_ExprSubstitutionFailure
const ReturnTypeRequirement & getReturnTypeRequirement() const
SatisfactionStatus getSatisfactionStatus() const
SourceLocation getNoexceptLoc() const
static bool classof(const Requirement *R)
ExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, ReturnTypeRequirement Req, SatisfactionStatus Status, ConceptSpecializationExpr *SubstitutedConstraintExpr=nullptr)
Construct a compound requirement.
bool hasNoexceptRequirement() const
NestedRequirement(StringRef InvalidConstraintEntity, const ASTConstraintSatisfaction *Satisfaction)
static bool classof(const Requirement *R)
const ASTConstraintSatisfaction & getConstraintSatisfaction() const
bool hasInvalidConstraint() const
Expr * getConstraintExpr() const
NestedRequirement(ASTContext &C, StringRef InvalidConstraintEntity, const ConstraintSatisfaction &Satisfaction)
StringRef getInvalidConstraintEntity()
NestedRequirement(ASTContext &C, Expr *Constraint, const ConstraintSatisfaction &Satisfaction)
NestedRequirement(Expr *Constraint)
void setSatisfied(bool IsSatisfied)
void setContainsUnexpandedParameterPack(bool Contains)
void setDependent(bool IsDependent)
RequirementKind getKind() const
bool containsUnexpandedParameterPack() const
Requirement(RequirementKind Kind, bool IsDependent, bool ContainsUnexpandedParameterPack, bool IsSatisfied=true)
TypeRequirement(SubstitutionDiagnostic *Diagnostic)
Construct a type requirement when the nested name specifier is invalid due to a bad substitution.
static bool classof(const Requirement *R)
bool isSubstitutionFailure() const
SubstitutionDiagnostic * getSubstitutionDiagnostic() const
TypeSourceInfo * getType() const
SatisfactionStatus getSatisfactionStatus() const
TypeRequirement(TypeSourceInfo *T)
Construct a type requirement from a type.
void setSatisfactionStatus(SatisfactionStatus Status)
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
const FunctionProtoType * T
static OpenACCComputeConstruct * Create(const ASTContext &C, OpenACCDirectiveKind K, SourceLocation BeginLoc, SourceLocation DirectiveLoc, SourceLocation EndLoc, ArrayRef< const OpenACCClause * > Clauses, Stmt *StructuredBlock)
U cast(CodeGen::Address addr)
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
A placeholder type used to construct an empty shell of a type, that will be filled in later (e....
StringRef SubstitutedEntity