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);
117 assert(SpecDecl &&
"Template Argument Decl not initialized");
126 "isSatisfied called on a dependent ConceptSpecializationExpr");
135 "getSatisfaction called on dependent ConceptSpecializationExpr");
136 return *Satisfaction;
140 return T->getStmtClass() == ConceptSpecializationExprClass;
176 LLVM_PREFERRED_TYPE(
bool)
178 LLVM_PREFERRED_TYPE(
bool)
179 bool ContainsUnexpandedParameterPack : 1;
180 LLVM_PREFERRED_TYPE(
bool)
193 bool ContainsUnexpandedParameterPack,
bool IsSatisfied =
true) :
194 Kind(Kind), Dependent(IsDependent),
195 ContainsUnexpandedParameterPack(ContainsUnexpandedParameterPack),
196 Satisfied(IsSatisfied) {}
202 "isSatisfied can only be called on non-dependent requirements.");
208 "setSatisfied can only be called on non-dependent requirements.");
209 Satisfied = IsSatisfied;
216 ContainsUnexpandedParameterPack = Contains;
219 return ContainsUnexpandedParameterPack;
233 llvm::PointerUnion<SubstitutionDiagnostic *, TypeSourceInfo *>
Value;
253 this->Status = Status;
262 "Attempted to get substitution diagnostic when there has been no "
263 "substitution failure.");
269 "Attempted to get type when there has been a substitution failure.");
291 llvm::PointerIntPair<
292 llvm::PointerUnion<TemplateParameterList *, SubstitutionDiagnostic *>,
305 TypeConstraintInfo(SubstDiag,
false) {}
316 return TypeConstraintInfo.getInt();
327 return TypeConstraintInfo.getPointer().isNull();
353 llvm::PointerUnion<Expr *, SubstitutionDiagnostic *>
Value;
355 ReturnTypeRequirement TypeReq;
405 return SubstitutedConstraintExpr;
410 "Attempted to get expression substitution diagnostic when there has "
411 "been no expression substitution failure");
417 "ExprRequirement has no expression because there has been a "
418 "substitution failure.");
430 Expr *Constraint =
nullptr;
432 bool HasInvalidConstraint =
false;
433 StringRef InvalidConstraintEntity;
442 Constraint(Constraint) {
444 "Nested requirement with non-dependent constraint must be "
445 "constructed with a ConstraintSatisfaction object");
452 Satisfaction.IsSatisfied),
453 Constraint(Constraint),
461 Satisfaction->IsSatisfied),
462 Satisfaction(Satisfaction), HasInvalidConstraint(
true),
463 InvalidConstraintEntity(InvalidConstraintEntity) {}
474 return InvalidConstraintEntity;
479 "getConstraintExpr() may not be called "
480 "on nested requirements with invalid constraint.");
485 return *Satisfaction;
509 llvm::TrailingObjects<RequiresExpr, ParmVarDecl *,
510 concepts::Requirement *> {
511 friend TrailingObjects;
514 unsigned NumLocalParameters;
515 unsigned NumRequirements;
521 unsigned numTrailingObjects(OverloadToken<ParmVarDecl *>)
const {
522 return NumLocalParameters;
525 unsigned numTrailingObjects(OverloadToken<concepts::Requirement *>)
const {
526 return NumRequirements;
529 RequiresExpr(ASTContext &
C, SourceLocation RequiresKWLoc,
530 RequiresExprBodyDecl *Body, SourceLocation LParenLoc,
531 ArrayRef<ParmVarDecl *> LocalParameters,
532 SourceLocation RParenLoc,
533 ArrayRef<concepts::Requirement *> Requirements,
534 SourceLocation RBraceLoc);
535 RequiresExpr(ASTContext &
C, EmptyShell
Empty,
unsigned NumLocalParameters,
536 unsigned NumRequirements);
539 static RequiresExpr *
Create(ASTContext &
C, SourceLocation RequiresKWLoc,
540 RequiresExprBodyDecl *Body,
541 SourceLocation LParenLoc,
542 ArrayRef<ParmVarDecl *> LocalParameters,
543 SourceLocation RParenLoc,
544 ArrayRef<concepts::Requirement *> Requirements,
545 SourceLocation RBraceLoc);
546 static RequiresExpr *
547 Create(ASTContext &
C, EmptyShell
Empty,
unsigned NumLocalParameters,
548 unsigned NumRequirements);
551 return {getTrailingObjects<ParmVarDecl *>(), NumLocalParameters};
557 return {getTrailingObjects<concepts::Requirement *>(), NumRequirements};
564 &&
"isSatisfied called on a dependent RequiresExpr");
570 "setSatisfied called on a dependent RequiresExpr");
583 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
ConceptDecl * getNamedConcept() const
SourceLocation getLocation() const
SourceLocation getBeginLoc() const LLVM_READONLY
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
SourceLocation getEndLoc() const LLVM_READONLY
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) ...
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
Sema - This implements semantic analysis and AST building for C.
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)
Requirement::SubstitutionDiagnostic * createSubstDiagAt(Sema &S, SourceLocation Location, EntityPrinter Printer)
create a Requirement::SubstitutionDiagnostic with only a SubstitutedEntity and DiagLoc using Sema's a...
llvm::function_ref< void(llvm::raw_ostream &)> EntityPrinter
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',...
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