16#ifndef LLVM_CLANG_ANALYSIS_CONSTRUCTIONCONTEXT_H
17#define LLVM_CLANG_ANALYSIS_CONSTRUCTIONCONTEXT_H
51 case VariableKind:
return "construct into local variable";
53 case ReturnKind:
return "construct into return address";
60 return "construct into lambda captured variable";
63 llvm_unreachable(
"Unknown ItemKind");
67 const void *
const Data;
69 const unsigned Index = 0;
71 bool hasStatement()
const {
76 bool hasIndex()
const {
81 bool hasInitializer()
const {
103 bool IsElided =
false)
147 assert(hasStatement());
148 return static_cast<const Stmt *
>(Data);
152 return hasStatement() ?
getStmt() :
nullptr;
159 assert(hasInitializer());
174 void Profile(llvm::FoldingSetNodeID &ID)
const {
177 ID.AddInteger(Index);
184 return std::make_tuple(Data, Kind, Index) ==
189 return std::make_tuple(Data, Kind, Index) <
213class ConstructionContextLayer {
214 const ConstructionContextLayer *Parent =
nullptr;
218 const ConstructionContextLayer *Parent)
219 : Parent(Parent), Item(Item) {}
222 static const ConstructionContextLayer *
224 const ConstructionContextLayer *Parent =
nullptr);
227 const ConstructionContextLayer *
getParent()
const {
return Parent; }
276 template <
typename T,
typename... ArgTypes>
278 auto *CC =
C.getAllocator().Allocate<
T>();
279 return new (CC)
T(Args...);
286 BumpVectorContext &
C,
const MaterializeTemporaryExpr *MTE,
287 const CXXBindTemporaryExpr *BTE,
288 const ConstructionContextLayer *ParentLayer);
295 createBoundTemporaryFromLayers(
296 BumpVectorContext &
C,
const CXXBindTemporaryExpr *BTE,
297 const ConstructionContextLayer *ParentLayer);
305 const ConstructionContextLayer *TopLayer);
332 return dyn_cast<ArrayInitLoopExpr>(Var->getInit());
348 explicit SimpleVariableConstructionContext(
const DeclStmt *DS)
367class CXX17ElidedCopyVariableConstructionContext
373 explicit CXX17ElidedCopyVariableConstructionContext(
403 return dyn_cast<ArrayInitLoopExpr>(I->getInit());
414class SimpleConstructorInitializerConstructionContext
418 explicit SimpleConstructorInitializerConstructionContext(
439class CXX17ElidedCopyConstructorInitializerConstructionContext
445 explicit CXX17ElidedCopyConstructorInitializerConstructionContext(
468 explicit NewAllocatedObjectConstructionContext(
const CXXNewExpr *NE)
526class SimpleTemporaryObjectConstructionContext
530 explicit SimpleTemporaryObjectConstructionContext(
549class ElidedTemporaryObjectConstructionContext
556 explicit ElidedTemporaryObjectConstructionContext(
561 ElidedCE(ElidedCE), ElidedCC(ElidedCC) {
565 assert(ElidedCE && ElidedCE->isElidable() && ElidedCC);
607class SimpleReturnedValueConstructionContext
611 explicit SimpleReturnedValueConstructionContext(
const ReturnStmt *RS)
629class CXX17ElidedCopyReturnedValueConstructionContext
635 explicit CXX17ElidedCopyReturnedValueConstructionContext(
665 explicit ArgumentConstructionContext(
const Expr *CE,
unsigned Index,
668 Index(Index), BTE(BTE) {
693 explicit LambdaCaptureConstructionContext(
const LambdaExpr *LE,
702 return *(LE->capture_init_begin() + Index);
706 auto It = LE->getLambdaClass()->field_begin();
707 std::advance(It, Index);
Defines the clang::Expr interface and subclasses for C++ expressions.
static bool classof(const ConstructionContext *CC)
friend class ConstructionContext
const Expr * getCallLikeExpr() const
unsigned getIndex() const
const CXXBindTemporaryExpr * getCXXBindTemporaryExpr() const
Represents a loop initializing the elements of an array.
const CXXBindTemporaryExpr * getCXXBindTemporaryExpr() const
friend class ConstructionContext
static bool classof(const ConstructionContext *CC)
static bool classof(const ConstructionContext *CC)
const CXXBindTemporaryExpr * getCXXBindTemporaryExpr() const
friend class ConstructionContext
friend class ConstructionContext
static bool classof(const ConstructionContext *CC)
const CXXBindTemporaryExpr * getCXXBindTemporaryExpr() const
Represents binding an expression to a temporary.
Represents a call to a C++ constructor.
Represents a C++ base or member initializer.
Represents a call to an inherited base class constructor from an inheriting constructor.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Represents a single point (AST node) in the program that requires attention during construction of an...
ConstructionContextItem(const ReturnStmt *RS)
ConstructionContextItem(const CXXInheritedCtorInitExpr *CE, unsigned Index)
ConstructionContextItem(const CallExpr *CE, unsigned Index)
ConstructionContextItem(const CXXCtorInitializer *Init)
ConstructionContextItem(const LambdaExpr *LE, unsigned Index)
unsigned getIndex() const
If a single trigger statement triggers multiple constructors, they are usually being enumerated.
bool operator==(const ConstructionContextItem &Other) const
bool operator<(const ConstructionContextItem &Other) const
const CXXCtorInitializer * getCXXCtorInitializer() const
The construction site is not necessarily a statement.
void Profile(llvm::FoldingSetNodeID &ID) const
ConstructionContextItem(const MaterializeTemporaryExpr *MTE)
ConstructionContextItem(const CXXConstructExpr *CE, unsigned Index)
ConstructionContextItem(const ObjCMessageExpr *ME, unsigned Index)
ConstructionContextItem(const CXXConstructExpr *CE)
ConstructionContextItem(const DeclStmt *DS)
ConstructionContextItem(const CXXNewExpr *NE)
@ STATEMENT_WITH_INDEX_KIND_END
@ STATEMENT_WITH_INDEX_KIND_BEGIN
@ TemporaryDestructorKind
@ ElidableConstructorKind
LLVM_DUMP_METHOD StringRef getKindAsString() const
const Stmt * getStmtOrNull() const
static LLVM_DUMP_METHOD StringRef getKindAsString(ItemKind K)
ConstructionContextItem(const Expr *E, unsigned Index)
ConstructionContextItem(const CXXBindTemporaryExpr *BTE, bool IsElided=false)
const Stmt * getStmt() const
The construction site - the statement that triggered the construction for one of its parts.
Construction context can be seen as a linked list of multiple layers.
static const ConstructionContextLayer * create(BumpVectorContext &C, const ConstructionContextItem &Item, const ConstructionContextLayer *Parent=nullptr)
const ConstructionContextItem & getItem() const
const ConstructionContextLayer * getParent() const
bool isStrictlyMoreSpecificThan(const ConstructionContextLayer *Other) const
See if Other is a proper initial segment of this construction context in terms of the parent chain - ...
virtual const ArrayInitLoopExpr * getArrayInitLoop() const
virtual ~ConstructionContext()=default
static const ConstructionContext * createFromLayers(BumpVectorContext &C, const ConstructionContextLayer *TopLayer)
Consume the construction context layer, together with its parent layers, and wrap it up into a comple...
ConstructionContext(Kind K)
@ CXX17ElidedCopyVariableKind
@ ElidedTemporaryObjectKind
@ SimpleTemporaryObjectKind
@ CXX17ElidedCopyConstructorInitializerKind
@ SimpleConstructorInitializerKind
@ SimpleReturnedValueKind
@ CXX17ElidedCopyReturnedValueKind
const CXXCtorInitializer * getCXXCtorInitializer() const
ConstructorInitializerConstructionContext(ConstructionContext::Kind K, const CXXCtorInitializer *I)
const ArrayInitLoopExpr * getArrayInitLoop() const override
static bool classof(const ConstructionContext *CC)
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
static bool classof(const ConstructionContext *CC)
const ConstructionContext * getConstructionContextAfterElision() const
friend class ConstructionContext
const CXXConstructExpr * getConstructorAfterElision() const
This represents one expression.
Represents a member of a struct/union/class.
const Expr * getInitializer() const
const LambdaExpr * getLambdaExpr() const
unsigned getIndex() const
friend class ConstructionContext
const ArrayInitLoopExpr * getArrayInitLoop() const override
const FieldDecl * getFieldDecl() const
static bool classof(const ConstructionContext *CC)
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
friend class ConstructionContext
const CXXNewExpr * getCXXNewExpr() const
static bool classof(const ConstructionContext *CC)
An expression that sends a message to the given Objective-C object or class.
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
ReturnedValueConstructionContext(ConstructionContext::Kind K, const ReturnStmt *RS)
static bool classof(const ConstructionContext *CC)
const ReturnStmt * getReturnStmt() const
friend class ConstructionContext
static bool classof(const ConstructionContext *CC)
friend class ConstructionContext
static bool classof(const ConstructionContext *CC)
friend class ConstructionContext
static bool classof(const ConstructionContext *CC)
static bool classof(const ConstructionContext *CC)
friend class ConstructionContext
Stmt - This represents one statement.
const CXXBindTemporaryExpr * getCXXBindTemporaryExpr() const
CXXBindTemporaryExpr here is non-null as long as the temporary has a non-trivial destructor.
const MaterializeTemporaryExpr * getMaterializedTemporaryExpr() const
MaterializeTemporaryExpr is non-null as long as the temporary is actually used after construction,...
static bool classof(const ConstructionContext *CC)
TemporaryObjectConstructionContext(ConstructionContext::Kind K, const CXXBindTemporaryExpr *BTE, const MaterializeTemporaryExpr *MTE)
static bool classof(const ConstructionContext *CC)
const ArrayInitLoopExpr * getArrayInitLoop() const override
VariableConstructionContext(ConstructionContext::Kind K, const DeclStmt *DS)
const DeclStmt * getDeclStmt() const
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
const FunctionProtoType * T
U cast(CodeGen::Address addr)
@ Other
Other implicit parameter.