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"
66 bool ContainsUnexpandedParameterPack);
79 bool ContainsUnexpandedParameterPack);
119 assert(SpecDecl &&
"Template Argument Decl not initialized");
128 "isSatisfied called on a dependent ConceptSpecializationExpr");
137 "getSatisfaction called on dependent ConceptSpecializationExpr");
138 return *Satisfaction;
142 return T->getStmtClass() == ConceptSpecializationExprClass;
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;
255 this->Status = Status;
264 "Attempted to get substitution diagnostic when there has been no "
265 "substitution failure.");
266 return cast<SubstitutionDiagnostic *>(
Value);
271 "Attempted to get type when there has been a substitution failure.");
272 return cast<TypeSourceInfo *>(
Value);
293 llvm::PointerIntPair<
294 llvm::PointerUnion<TemplateParameterList *, SubstitutionDiagnostic *>,
307 TypeConstraintInfo(SubstDiag,
false) {}
319 return TypeConstraintInfo.getInt();
330 return TypeConstraintInfo.getPointer().isNull();
335 isa<SubstitutionDiagnostic *>(TypeConstraintInfo.getPointer());
340 isa<TemplateParameterList *>(TypeConstraintInfo.getPointer());
345 return cast<SubstitutionDiagnostic *>(TypeConstraintInfo.getPointer());
352 return cast<TemplateParameterList *>(TypeConstraintInfo.getPointer());
356 llvm::PointerUnion<Expr *, SubstitutionDiagnostic *>
Value;
358 ReturnTypeRequirement TypeReq;
408 return SubstitutedConstraintExpr;
413 "Attempted to get expression substitution diagnostic when there has "
414 "been no expression substitution failure");
415 return cast<SubstitutionDiagnostic *>(
Value);
420 "ExprRequirement has no expression because there has been a "
421 "substitution failure.");
422 return cast<Expr *>(
Value);
433 Expr *Constraint =
nullptr;
435 bool HasInvalidConstraint =
false;
436 StringRef InvalidConstraintEntity;
445 Constraint(Constraint) {
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;
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 ...
Reads an AST files chain containing the contents of a translation unit.
Declaration of a C++20 concept.
A reference to a concept and its template args, as it appears in the code.
bool hasExplicitTemplateArgs() const
Whether or not template arguments were explicitly specified in the concept reference (they might not ...
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
const DeclarationNameInfo & getConceptNameInfo() const
SourceLocation getConceptNameLoc() const
SourceLocation getLocation() const
SourceLocation getBeginLoc() const LLVM_READONLY
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
SourceLocation getEndLoc() const LLVM_READONLY
TemplateDecl * getNamedConcept() const
SourceLocation getTemplateKWLoc() const
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
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.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
ArrayRef< TemplateArgument > getTemplateArguments() const
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
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
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.
A requires-expression requirement which queries the validity and properties of an expression ('simple...
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)
bool hasNoexceptRequirement() const
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
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)
A static requirement that can be used in a requires-expression to check properties of types and expre...
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)
A requires-expression requirement which queries the existence of a type name or type template special...
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
void setSatisfactionStatus(SatisfactionStatus Status)
The JSON file list parser is used to communicate input to InstallAPI.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
const FunctionProtoType * T
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