24 const ConstructionContextLayer *Parent) {
25 ConstructionContextLayer *CC =
26 C.getAllocator().Allocate<ConstructionContextLayer>();
27 return new (CC) ConstructionContextLayer(Item, Parent);
31 const ConstructionContextLayer *
Other)
const {
32 const ConstructionContextLayer *
Self =
this;
41 llvm_unreachable(
"The above loop can only be terminated via return!");
45ConstructionContext::createMaterializedTemporaryFromLayers(
68 const CXXConstructExpr *ElidedCE =
nullptr;
71 const ConstructionContextItem &ElidedItem = ParentLayer->
getItem();
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,
107 const ConstructionContextItem &ParentItem = ParentLayer->
getItem();
108 switch (ParentItem.
getKind()) {
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());
121 assert(!RS->getRetValue()->getType().getCanonicalType()
122 ->getAsCXXRecordDecl()->hasTrivialDestructor());
123 return create<CXX17ElidedCopyReturnedValueConstructionContext>(
C, RS,
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());
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());
162 return create<LambdaCaptureConstructionContext>(
C, E,
167 llvm_unreachable(
"Unexpected construction context with destructor!");
178 assert(TopLayer->
isLast());
180 return create<SimpleVariableConstructionContext>(
C, DS);
183 assert(TopLayer->
isLast());
185 return create<NewAllocatedObjectConstructionContext>(
C, NE);
188 assert(TopLayer->
isLast());
190 return create<SimpleReturnedValueConstructionContext>(
C, RS);
194 return createMaterializedTemporaryFromLayers(
C, MTE,
nullptr,
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());
212 return create<LambdaCaptureConstructionContext>(
C, E, TopItem.
getIndex());
215 assert(TopLayer->
isLast());
217 return create<SimpleConstructorInitializerConstructionContext>(
C, I);
220 assert(TopLayer->
isLast());
222 return create<ArgumentConstructionContext>(
C, E, TopItem.
getIndex(),
226 llvm_unreachable(
"Unexpected construction context!");
Represents binding an expression to a temporary.
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...
ConstructionContext(Kind K)
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.
bool isa(CodeGen::Address addr)
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ SD_FullExpression
Full-expression storage duration (for temporaries).
U cast(CodeGen::Address addr)
@ Other
Other implicit parameter.