41 llvm_unreachable(
"The above loop can only be terminated via return!");
45ConstructionContext::createMaterializedTemporaryFromLayers(
74 ElidedCE = cast<CXXConstructExpr>(ElidedItem.
getStmt());
84 return create<SimpleTemporaryObjectConstructionContext>(
C, BTE, MTE);
86 return create<ElidedTemporaryObjectConstructionContext>(
87 C, BTE, MTE, ElidedCE, ElidedCC);
92 return create<SimpleTemporaryObjectConstructionContext>(
C, BTE, MTE);
103 return create<SimpleTemporaryObjectConstructionContext>(
C, BTE,
108 switch (ParentItem.
getKind()) {
110 const auto *DS = cast<DeclStmt>(ParentItem.
getStmt());
111 assert(!cast<VarDecl>(DS->getSingleDecl())->getType().getCanonicalType()
112 ->getAsCXXRecordDecl()->hasTrivialDestructor());
113 return create<CXX17ElidedCopyVariableConstructionContext>(
C, DS, BTE);
116 llvm_unreachable(
"This context does not accept a bound temporary!");
119 assert(ParentLayer->
isLast());
120 const auto *RS = cast<ReturnStmt>(ParentItem.
getStmt());
121 assert(!RS->getRetValue()->getType().getCanonicalType()
122 ->getAsCXXRecordDecl()->hasTrivialDestructor());
123 return create<CXX17ElidedCopyReturnedValueConstructionContext>(
C, RS,
129 const auto *MTE = cast<MaterializeTemporaryExpr>(ParentItem.
getStmt());
130 return createMaterializedTemporaryFromLayers(
C, MTE, BTE,
134 llvm_unreachable(
"Duplicate CXXBindTemporaryExpr in the AST!");
137 llvm_unreachable(
"Elided destructor items are not produced by the CFG!");
140 llvm_unreachable(
"Materialization is necessary to put temporary into a "
141 "copy or move constructor!");
144 assert(ParentLayer->
isLast());
145 const auto *
E = cast<Expr>(ParentItem.
getStmt());
146 assert(isa<CallExpr>(
E) || isa<CXXConstructExpr>(
E) ||
147 isa<ObjCMessageExpr>(
E));
148 return create<ArgumentConstructionContext>(
C,
E, ParentItem.
getIndex(),
152 assert(ParentLayer->
isLast());
154 assert(!I->getAnyMember()->getType().getCanonicalType()
155 ->getAsCXXRecordDecl()->hasTrivialDestructor());
156 return create<CXX17ElidedCopyConstructorInitializerConstructionContext>(
160 assert(ParentLayer->
isLast());
161 const auto *
E = cast<LambdaExpr>(ParentItem.
getStmt());
162 return create<LambdaCaptureConstructionContext>(
C,
E,
167 llvm_unreachable(
"Unexpected construction context with destructor!");
178 assert(TopLayer->
isLast());
179 const auto *DS = cast<DeclStmt>(TopItem.
getStmt());
180 return create<SimpleVariableConstructionContext>(
C, DS);
183 assert(TopLayer->
isLast());
184 const auto *NE = cast<CXXNewExpr>(TopItem.
getStmt());
185 return create<NewAllocatedObjectConstructionContext>(
C, NE);
188 assert(TopLayer->
isLast());
189 const auto *RS = cast<ReturnStmt>(TopItem.
getStmt());
190 return create<SimpleReturnedValueConstructionContext>(
C, RS);
193 const auto *MTE = cast<MaterializeTemporaryExpr>(TopItem.
getStmt());
194 return createMaterializedTemporaryFromLayers(
C, MTE,
nullptr,
198 const auto *BTE = cast<CXXBindTemporaryExpr>(TopItem.
getStmt());
201 return createBoundTemporaryFromLayers(
C, BTE, TopLayer->
getParent());
204 llvm_unreachable(
"Elided destructor items are not produced by the CFG!");
207 llvm_unreachable(
"The argument needs to be materialized first!");
210 assert(TopLayer->
isLast());
211 const auto *
E = cast<LambdaExpr>(TopItem.
getStmt());
212 return create<LambdaCaptureConstructionContext>(
C,
E, TopItem.
getIndex());
215 assert(TopLayer->
isLast());
217 return create<SimpleConstructorInitializerConstructionContext>(
C, I);
220 assert(TopLayer->
isLast());
221 const auto *
E = cast<Expr>(TopItem.
getStmt());
222 return create<ArgumentConstructionContext>(
C,
E, TopItem.
getIndex(),
226 llvm_unreachable(
"Unexpected construction context!");
Represents binding an expression to a temporary.
Represents a call to a C++ constructor.
bool isElidable() const
Whether this construction is elidable.
Represents a C++ base or member initializer.
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
bool hasNonTrivialDestructor() const
Determine whether this class has a non-trivial destructor (C++ [class.dtor]p3)
Represents a single point (AST node) in the program that requires attention during construction of an...
unsigned getIndex() const
If a single trigger statement triggers multiple constructors, they are usually being enumerated.
const CXXCtorInitializer * getCXXCtorInitializer() const
The construction site is not necessarily a statement.
@ TemporaryDestructorKind
@ ElidableConstructorKind
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 - ...
ConstructionContext's subclasses describe different ways of constructing an object in C++.
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...
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
QualType getCanonicalType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
The JSON file list parser is used to communicate input to InstallAPI.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ SD_FullExpression
Full-expression storage duration (for temporaries).
@ Other
Other implicit parameter.