annotate clang/lib/AST/ExprCXX.cpp @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- ExprCXX.cpp - (C++) Expression AST Node Implementation -------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file implements the subclesses of Expr class declared in ExprCXX.h
anatofuz
parents:
diff changeset
10 //
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 #include "clang/AST/ExprCXX.h"
anatofuz
parents:
diff changeset
14 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
15 #include "clang/AST/Attr.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
16 #include "clang/AST/ComputeDependence.h"
150
anatofuz
parents:
diff changeset
17 #include "clang/AST/Decl.h"
anatofuz
parents:
diff changeset
18 #include "clang/AST/DeclAccessPair.h"
anatofuz
parents:
diff changeset
19 #include "clang/AST/DeclBase.h"
anatofuz
parents:
diff changeset
20 #include "clang/AST/DeclCXX.h"
anatofuz
parents:
diff changeset
21 #include "clang/AST/DeclTemplate.h"
anatofuz
parents:
diff changeset
22 #include "clang/AST/DeclarationName.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
23 #include "clang/AST/DependenceFlags.h"
150
anatofuz
parents:
diff changeset
24 #include "clang/AST/Expr.h"
anatofuz
parents:
diff changeset
25 #include "clang/AST/LambdaCapture.h"
anatofuz
parents:
diff changeset
26 #include "clang/AST/NestedNameSpecifier.h"
anatofuz
parents:
diff changeset
27 #include "clang/AST/TemplateBase.h"
anatofuz
parents:
diff changeset
28 #include "clang/AST/Type.h"
anatofuz
parents:
diff changeset
29 #include "clang/AST/TypeLoc.h"
anatofuz
parents:
diff changeset
30 #include "clang/Basic/LLVM.h"
anatofuz
parents:
diff changeset
31 #include "clang/Basic/OperatorKinds.h"
anatofuz
parents:
diff changeset
32 #include "clang/Basic/SourceLocation.h"
anatofuz
parents:
diff changeset
33 #include "clang/Basic/Specifiers.h"
anatofuz
parents:
diff changeset
34 #include "llvm/ADT/ArrayRef.h"
anatofuz
parents:
diff changeset
35 #include "llvm/Support/Casting.h"
anatofuz
parents:
diff changeset
36 #include "llvm/Support/ErrorHandling.h"
anatofuz
parents:
diff changeset
37 #include <cassert>
anatofuz
parents:
diff changeset
38 #include <cstddef>
anatofuz
parents:
diff changeset
39 #include <cstring>
anatofuz
parents:
diff changeset
40 #include <memory>
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 using namespace clang;
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
45 // Child Iterators for iterating over subexpressions/substatements
anatofuz
parents:
diff changeset
46 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 bool CXXOperatorCallExpr::isInfixBinaryOp() const {
anatofuz
parents:
diff changeset
49 // An infix binary operator is any operator with two arguments other than
anatofuz
parents:
diff changeset
50 // operator() and operator[]. Note that none of these operators can have
anatofuz
parents:
diff changeset
51 // default arguments, so it suffices to check the number of argument
anatofuz
parents:
diff changeset
52 // expressions.
anatofuz
parents:
diff changeset
53 if (getNumArgs() != 2)
anatofuz
parents:
diff changeset
54 return false;
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 switch (getOperator()) {
anatofuz
parents:
diff changeset
57 case OO_Call: case OO_Subscript:
anatofuz
parents:
diff changeset
58 return false;
anatofuz
parents:
diff changeset
59 default:
anatofuz
parents:
diff changeset
60 return true;
anatofuz
parents:
diff changeset
61 }
anatofuz
parents:
diff changeset
62 }
anatofuz
parents:
diff changeset
63
anatofuz
parents:
diff changeset
64 CXXRewrittenBinaryOperator::DecomposedForm
anatofuz
parents:
diff changeset
65 CXXRewrittenBinaryOperator::getDecomposedForm() const {
anatofuz
parents:
diff changeset
66 DecomposedForm Result = {};
anatofuz
parents:
diff changeset
67 const Expr *E = getSemanticForm()->IgnoreImplicit();
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 // Remove an outer '!' if it exists (only happens for a '!=' rewrite).
anatofuz
parents:
diff changeset
70 bool SkippedNot = false;
anatofuz
parents:
diff changeset
71 if (auto *NotEq = dyn_cast<UnaryOperator>(E)) {
anatofuz
parents:
diff changeset
72 assert(NotEq->getOpcode() == UO_LNot);
anatofuz
parents:
diff changeset
73 E = NotEq->getSubExpr()->IgnoreImplicit();
anatofuz
parents:
diff changeset
74 SkippedNot = true;
anatofuz
parents:
diff changeset
75 }
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 // Decompose the outer binary operator.
anatofuz
parents:
diff changeset
78 if (auto *BO = dyn_cast<BinaryOperator>(E)) {
anatofuz
parents:
diff changeset
79 assert(!SkippedNot || BO->getOpcode() == BO_EQ);
anatofuz
parents:
diff changeset
80 Result.Opcode = SkippedNot ? BO_NE : BO->getOpcode();
anatofuz
parents:
diff changeset
81 Result.LHS = BO->getLHS();
anatofuz
parents:
diff changeset
82 Result.RHS = BO->getRHS();
anatofuz
parents:
diff changeset
83 Result.InnerBinOp = BO;
anatofuz
parents:
diff changeset
84 } else if (auto *BO = dyn_cast<CXXOperatorCallExpr>(E)) {
anatofuz
parents:
diff changeset
85 assert(!SkippedNot || BO->getOperator() == OO_EqualEqual);
anatofuz
parents:
diff changeset
86 assert(BO->isInfixBinaryOp());
anatofuz
parents:
diff changeset
87 switch (BO->getOperator()) {
anatofuz
parents:
diff changeset
88 case OO_Less: Result.Opcode = BO_LT; break;
anatofuz
parents:
diff changeset
89 case OO_LessEqual: Result.Opcode = BO_LE; break;
anatofuz
parents:
diff changeset
90 case OO_Greater: Result.Opcode = BO_GT; break;
anatofuz
parents:
diff changeset
91 case OO_GreaterEqual: Result.Opcode = BO_GE; break;
anatofuz
parents:
diff changeset
92 case OO_Spaceship: Result.Opcode = BO_Cmp; break;
anatofuz
parents:
diff changeset
93 case OO_EqualEqual: Result.Opcode = SkippedNot ? BO_NE : BO_EQ; break;
anatofuz
parents:
diff changeset
94 default: llvm_unreachable("unexpected binop in rewritten operator expr");
anatofuz
parents:
diff changeset
95 }
anatofuz
parents:
diff changeset
96 Result.LHS = BO->getArg(0);
anatofuz
parents:
diff changeset
97 Result.RHS = BO->getArg(1);
anatofuz
parents:
diff changeset
98 Result.InnerBinOp = BO;
anatofuz
parents:
diff changeset
99 } else {
anatofuz
parents:
diff changeset
100 llvm_unreachable("unexpected rewritten operator form");
anatofuz
parents:
diff changeset
101 }
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 // Put the operands in the right order for == and !=, and canonicalize the
anatofuz
parents:
diff changeset
104 // <=> subexpression onto the LHS for all other forms.
anatofuz
parents:
diff changeset
105 if (isReversed())
anatofuz
parents:
diff changeset
106 std::swap(Result.LHS, Result.RHS);
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 // If this isn't a spaceship rewrite, we're done.
anatofuz
parents:
diff changeset
109 if (Result.Opcode == BO_EQ || Result.Opcode == BO_NE)
anatofuz
parents:
diff changeset
110 return Result;
anatofuz
parents:
diff changeset
111
anatofuz
parents:
diff changeset
112 // Otherwise, we expect a <=> to now be on the LHS.
anatofuz
parents:
diff changeset
113 E = Result.LHS->IgnoreImplicitAsWritten();
anatofuz
parents:
diff changeset
114 if (auto *BO = dyn_cast<BinaryOperator>(E)) {
anatofuz
parents:
diff changeset
115 assert(BO->getOpcode() == BO_Cmp);
anatofuz
parents:
diff changeset
116 Result.LHS = BO->getLHS();
anatofuz
parents:
diff changeset
117 Result.RHS = BO->getRHS();
anatofuz
parents:
diff changeset
118 Result.InnerBinOp = BO;
anatofuz
parents:
diff changeset
119 } else if (auto *BO = dyn_cast<CXXOperatorCallExpr>(E)) {
anatofuz
parents:
diff changeset
120 assert(BO->getOperator() == OO_Spaceship);
anatofuz
parents:
diff changeset
121 Result.LHS = BO->getArg(0);
anatofuz
parents:
diff changeset
122 Result.RHS = BO->getArg(1);
anatofuz
parents:
diff changeset
123 Result.InnerBinOp = BO;
anatofuz
parents:
diff changeset
124 } else {
anatofuz
parents:
diff changeset
125 llvm_unreachable("unexpected rewritten operator form");
anatofuz
parents:
diff changeset
126 }
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 // Put the comparison operands in the right order.
anatofuz
parents:
diff changeset
129 if (isReversed())
anatofuz
parents:
diff changeset
130 std::swap(Result.LHS, Result.RHS);
anatofuz
parents:
diff changeset
131 return Result;
anatofuz
parents:
diff changeset
132 }
anatofuz
parents:
diff changeset
133
anatofuz
parents:
diff changeset
134 bool CXXTypeidExpr::isPotentiallyEvaluated() const {
anatofuz
parents:
diff changeset
135 if (isTypeOperand())
anatofuz
parents:
diff changeset
136 return false;
anatofuz
parents:
diff changeset
137
anatofuz
parents:
diff changeset
138 // C++11 [expr.typeid]p3:
anatofuz
parents:
diff changeset
139 // When typeid is applied to an expression other than a glvalue of
anatofuz
parents:
diff changeset
140 // polymorphic class type, [...] the expression is an unevaluated operand.
anatofuz
parents:
diff changeset
141 const Expr *E = getExprOperand();
anatofuz
parents:
diff changeset
142 if (const CXXRecordDecl *RD = E->getType()->getAsCXXRecordDecl())
anatofuz
parents:
diff changeset
143 if (RD->isPolymorphic() && E->isGLValue())
anatofuz
parents:
diff changeset
144 return true;
anatofuz
parents:
diff changeset
145
anatofuz
parents:
diff changeset
146 return false;
anatofuz
parents:
diff changeset
147 }
anatofuz
parents:
diff changeset
148
anatofuz
parents:
diff changeset
149 QualType CXXTypeidExpr::getTypeOperand(ASTContext &Context) const {
anatofuz
parents:
diff changeset
150 assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
anatofuz
parents:
diff changeset
151 Qualifiers Quals;
anatofuz
parents:
diff changeset
152 return Context.getUnqualifiedArrayType(
anatofuz
parents:
diff changeset
153 Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType(), Quals);
anatofuz
parents:
diff changeset
154 }
anatofuz
parents:
diff changeset
155
anatofuz
parents:
diff changeset
156 QualType CXXUuidofExpr::getTypeOperand(ASTContext &Context) const {
anatofuz
parents:
diff changeset
157 assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
anatofuz
parents:
diff changeset
158 Qualifiers Quals;
anatofuz
parents:
diff changeset
159 return Context.getUnqualifiedArrayType(
anatofuz
parents:
diff changeset
160 Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType(), Quals);
anatofuz
parents:
diff changeset
161 }
anatofuz
parents:
diff changeset
162
anatofuz
parents:
diff changeset
163 // CXXScalarValueInitExpr
anatofuz
parents:
diff changeset
164 SourceLocation CXXScalarValueInitExpr::getBeginLoc() const {
anatofuz
parents:
diff changeset
165 return TypeInfo ? TypeInfo->getTypeLoc().getBeginLoc() : getRParenLoc();
anatofuz
parents:
diff changeset
166 }
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 // CXXNewExpr
anatofuz
parents:
diff changeset
169 CXXNewExpr::CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew,
anatofuz
parents:
diff changeset
170 FunctionDecl *OperatorDelete, bool ShouldPassAlignment,
anatofuz
parents:
diff changeset
171 bool UsualArrayDeleteWantsSize,
anatofuz
parents:
diff changeset
172 ArrayRef<Expr *> PlacementArgs, SourceRange TypeIdParens,
anatofuz
parents:
diff changeset
173 Optional<Expr *> ArraySize,
anatofuz
parents:
diff changeset
174 InitializationStyle InitializationStyle,
anatofuz
parents:
diff changeset
175 Expr *Initializer, QualType Ty,
anatofuz
parents:
diff changeset
176 TypeSourceInfo *AllocatedTypeInfo, SourceRange Range,
anatofuz
parents:
diff changeset
177 SourceRange DirectInitRange)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
178 : Expr(CXXNewExprClass, Ty, VK_RValue, OK_Ordinary),
150
anatofuz
parents:
diff changeset
179 OperatorNew(OperatorNew), OperatorDelete(OperatorDelete),
anatofuz
parents:
diff changeset
180 AllocatedTypeInfo(AllocatedTypeInfo), Range(Range),
anatofuz
parents:
diff changeset
181 DirectInitRange(DirectInitRange) {
anatofuz
parents:
diff changeset
182
anatofuz
parents:
diff changeset
183 assert((Initializer != nullptr || InitializationStyle == NoInit) &&
anatofuz
parents:
diff changeset
184 "Only NoInit can have no initializer!");
anatofuz
parents:
diff changeset
185
anatofuz
parents:
diff changeset
186 CXXNewExprBits.IsGlobalNew = IsGlobalNew;
anatofuz
parents:
diff changeset
187 CXXNewExprBits.IsArray = ArraySize.hasValue();
anatofuz
parents:
diff changeset
188 CXXNewExprBits.ShouldPassAlignment = ShouldPassAlignment;
anatofuz
parents:
diff changeset
189 CXXNewExprBits.UsualArrayDeleteWantsSize = UsualArrayDeleteWantsSize;
anatofuz
parents:
diff changeset
190 CXXNewExprBits.StoredInitializationStyle =
anatofuz
parents:
diff changeset
191 Initializer ? InitializationStyle + 1 : 0;
anatofuz
parents:
diff changeset
192 bool IsParenTypeId = TypeIdParens.isValid();
anatofuz
parents:
diff changeset
193 CXXNewExprBits.IsParenTypeId = IsParenTypeId;
anatofuz
parents:
diff changeset
194 CXXNewExprBits.NumPlacementArgs = PlacementArgs.size();
anatofuz
parents:
diff changeset
195
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
196 if (ArraySize)
150
anatofuz
parents:
diff changeset
197 getTrailingObjects<Stmt *>()[arraySizeOffset()] = *ArraySize;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
198 if (Initializer)
150
anatofuz
parents:
diff changeset
199 getTrailingObjects<Stmt *>()[initExprOffset()] = Initializer;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
200 for (unsigned I = 0; I != PlacementArgs.size(); ++I)
150
anatofuz
parents:
diff changeset
201 getTrailingObjects<Stmt *>()[placementNewArgsOffset() + I] =
anatofuz
parents:
diff changeset
202 PlacementArgs[I];
anatofuz
parents:
diff changeset
203 if (IsParenTypeId)
anatofuz
parents:
diff changeset
204 getTrailingObjects<SourceRange>()[0] = TypeIdParens;
anatofuz
parents:
diff changeset
205
anatofuz
parents:
diff changeset
206 switch (getInitializationStyle()) {
anatofuz
parents:
diff changeset
207 case CallInit:
anatofuz
parents:
diff changeset
208 this->Range.setEnd(DirectInitRange.getEnd());
anatofuz
parents:
diff changeset
209 break;
anatofuz
parents:
diff changeset
210 case ListInit:
anatofuz
parents:
diff changeset
211 this->Range.setEnd(getInitializer()->getSourceRange().getEnd());
anatofuz
parents:
diff changeset
212 break;
anatofuz
parents:
diff changeset
213 default:
anatofuz
parents:
diff changeset
214 if (IsParenTypeId)
anatofuz
parents:
diff changeset
215 this->Range.setEnd(TypeIdParens.getEnd());
anatofuz
parents:
diff changeset
216 break;
anatofuz
parents:
diff changeset
217 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
218
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
219 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
220 }
anatofuz
parents:
diff changeset
221
anatofuz
parents:
diff changeset
222 CXXNewExpr::CXXNewExpr(EmptyShell Empty, bool IsArray,
anatofuz
parents:
diff changeset
223 unsigned NumPlacementArgs, bool IsParenTypeId)
anatofuz
parents:
diff changeset
224 : Expr(CXXNewExprClass, Empty) {
anatofuz
parents:
diff changeset
225 CXXNewExprBits.IsArray = IsArray;
anatofuz
parents:
diff changeset
226 CXXNewExprBits.NumPlacementArgs = NumPlacementArgs;
anatofuz
parents:
diff changeset
227 CXXNewExprBits.IsParenTypeId = IsParenTypeId;
anatofuz
parents:
diff changeset
228 }
anatofuz
parents:
diff changeset
229
anatofuz
parents:
diff changeset
230 CXXNewExpr *
anatofuz
parents:
diff changeset
231 CXXNewExpr::Create(const ASTContext &Ctx, bool IsGlobalNew,
anatofuz
parents:
diff changeset
232 FunctionDecl *OperatorNew, FunctionDecl *OperatorDelete,
anatofuz
parents:
diff changeset
233 bool ShouldPassAlignment, bool UsualArrayDeleteWantsSize,
anatofuz
parents:
diff changeset
234 ArrayRef<Expr *> PlacementArgs, SourceRange TypeIdParens,
anatofuz
parents:
diff changeset
235 Optional<Expr *> ArraySize,
anatofuz
parents:
diff changeset
236 InitializationStyle InitializationStyle, Expr *Initializer,
anatofuz
parents:
diff changeset
237 QualType Ty, TypeSourceInfo *AllocatedTypeInfo,
anatofuz
parents:
diff changeset
238 SourceRange Range, SourceRange DirectInitRange) {
anatofuz
parents:
diff changeset
239 bool IsArray = ArraySize.hasValue();
anatofuz
parents:
diff changeset
240 bool HasInit = Initializer != nullptr;
anatofuz
parents:
diff changeset
241 unsigned NumPlacementArgs = PlacementArgs.size();
anatofuz
parents:
diff changeset
242 bool IsParenTypeId = TypeIdParens.isValid();
anatofuz
parents:
diff changeset
243 void *Mem =
anatofuz
parents:
diff changeset
244 Ctx.Allocate(totalSizeToAlloc<Stmt *, SourceRange>(
anatofuz
parents:
diff changeset
245 IsArray + HasInit + NumPlacementArgs, IsParenTypeId),
anatofuz
parents:
diff changeset
246 alignof(CXXNewExpr));
anatofuz
parents:
diff changeset
247 return new (Mem)
anatofuz
parents:
diff changeset
248 CXXNewExpr(IsGlobalNew, OperatorNew, OperatorDelete, ShouldPassAlignment,
anatofuz
parents:
diff changeset
249 UsualArrayDeleteWantsSize, PlacementArgs, TypeIdParens,
anatofuz
parents:
diff changeset
250 ArraySize, InitializationStyle, Initializer, Ty,
anatofuz
parents:
diff changeset
251 AllocatedTypeInfo, Range, DirectInitRange);
anatofuz
parents:
diff changeset
252 }
anatofuz
parents:
diff changeset
253
anatofuz
parents:
diff changeset
254 CXXNewExpr *CXXNewExpr::CreateEmpty(const ASTContext &Ctx, bool IsArray,
anatofuz
parents:
diff changeset
255 bool HasInit, unsigned NumPlacementArgs,
anatofuz
parents:
diff changeset
256 bool IsParenTypeId) {
anatofuz
parents:
diff changeset
257 void *Mem =
anatofuz
parents:
diff changeset
258 Ctx.Allocate(totalSizeToAlloc<Stmt *, SourceRange>(
anatofuz
parents:
diff changeset
259 IsArray + HasInit + NumPlacementArgs, IsParenTypeId),
anatofuz
parents:
diff changeset
260 alignof(CXXNewExpr));
anatofuz
parents:
diff changeset
261 return new (Mem)
anatofuz
parents:
diff changeset
262 CXXNewExpr(EmptyShell(), IsArray, NumPlacementArgs, IsParenTypeId);
anatofuz
parents:
diff changeset
263 }
anatofuz
parents:
diff changeset
264
anatofuz
parents:
diff changeset
265 bool CXXNewExpr::shouldNullCheckAllocation() const {
anatofuz
parents:
diff changeset
266 return getOperatorNew()
anatofuz
parents:
diff changeset
267 ->getType()
anatofuz
parents:
diff changeset
268 ->castAs<FunctionProtoType>()
anatofuz
parents:
diff changeset
269 ->isNothrow() &&
anatofuz
parents:
diff changeset
270 !getOperatorNew()->isReservedGlobalPlacementOperator();
anatofuz
parents:
diff changeset
271 }
anatofuz
parents:
diff changeset
272
anatofuz
parents:
diff changeset
273 // CXXDeleteExpr
anatofuz
parents:
diff changeset
274 QualType CXXDeleteExpr::getDestroyedType() const {
anatofuz
parents:
diff changeset
275 const Expr *Arg = getArgument();
anatofuz
parents:
diff changeset
276
anatofuz
parents:
diff changeset
277 // For a destroying operator delete, we may have implicitly converted the
anatofuz
parents:
diff changeset
278 // pointer type to the type of the parameter of the 'operator delete'
anatofuz
parents:
diff changeset
279 // function.
anatofuz
parents:
diff changeset
280 while (const auto *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
anatofuz
parents:
diff changeset
281 if (ICE->getCastKind() == CK_DerivedToBase ||
anatofuz
parents:
diff changeset
282 ICE->getCastKind() == CK_UncheckedDerivedToBase ||
anatofuz
parents:
diff changeset
283 ICE->getCastKind() == CK_NoOp) {
anatofuz
parents:
diff changeset
284 assert((ICE->getCastKind() == CK_NoOp ||
anatofuz
parents:
diff changeset
285 getOperatorDelete()->isDestroyingOperatorDelete()) &&
anatofuz
parents:
diff changeset
286 "only a destroying operator delete can have a converted arg");
anatofuz
parents:
diff changeset
287 Arg = ICE->getSubExpr();
anatofuz
parents:
diff changeset
288 } else
anatofuz
parents:
diff changeset
289 break;
anatofuz
parents:
diff changeset
290 }
anatofuz
parents:
diff changeset
291
anatofuz
parents:
diff changeset
292 // The type-to-delete may not be a pointer if it's a dependent type.
anatofuz
parents:
diff changeset
293 const QualType ArgType = Arg->getType();
anatofuz
parents:
diff changeset
294
anatofuz
parents:
diff changeset
295 if (ArgType->isDependentType() && !ArgType->isPointerType())
anatofuz
parents:
diff changeset
296 return QualType();
anatofuz
parents:
diff changeset
297
anatofuz
parents:
diff changeset
298 return ArgType->castAs<PointerType>()->getPointeeType();
anatofuz
parents:
diff changeset
299 }
anatofuz
parents:
diff changeset
300
anatofuz
parents:
diff changeset
301 // CXXPseudoDestructorExpr
anatofuz
parents:
diff changeset
302 PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
anatofuz
parents:
diff changeset
303 : Type(Info) {
anatofuz
parents:
diff changeset
304 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
anatofuz
parents:
diff changeset
305 }
anatofuz
parents:
diff changeset
306
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
307 CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
308 const ASTContext &Context, Expr *Base, bool isArrow,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
309 SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
310 TypeSourceInfo *ScopeType, SourceLocation ColonColonLoc,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
311 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
312 : Expr(CXXPseudoDestructorExprClass, Context.BoundMemberTy, VK_RValue,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
313 OK_Ordinary),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
314 Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
315 OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
316 ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
317 DestroyedType(DestroyedType) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
318 setDependence(computeDependence(this));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
319 }
150
anatofuz
parents:
diff changeset
320
anatofuz
parents:
diff changeset
321 QualType CXXPseudoDestructorExpr::getDestroyedType() const {
anatofuz
parents:
diff changeset
322 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
anatofuz
parents:
diff changeset
323 return TInfo->getType();
anatofuz
parents:
diff changeset
324
anatofuz
parents:
diff changeset
325 return QualType();
anatofuz
parents:
diff changeset
326 }
anatofuz
parents:
diff changeset
327
anatofuz
parents:
diff changeset
328 SourceLocation CXXPseudoDestructorExpr::getEndLoc() const {
anatofuz
parents:
diff changeset
329 SourceLocation End = DestroyedType.getLocation();
anatofuz
parents:
diff changeset
330 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
anatofuz
parents:
diff changeset
331 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
anatofuz
parents:
diff changeset
332 return End;
anatofuz
parents:
diff changeset
333 }
anatofuz
parents:
diff changeset
334
anatofuz
parents:
diff changeset
335 // UnresolvedLookupExpr
anatofuz
parents:
diff changeset
336 UnresolvedLookupExpr::UnresolvedLookupExpr(
anatofuz
parents:
diff changeset
337 const ASTContext &Context, CXXRecordDecl *NamingClass,
anatofuz
parents:
diff changeset
338 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
anatofuz
parents:
diff changeset
339 const DeclarationNameInfo &NameInfo, bool RequiresADL, bool Overloaded,
anatofuz
parents:
diff changeset
340 const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin,
anatofuz
parents:
diff changeset
341 UnresolvedSetIterator End)
anatofuz
parents:
diff changeset
342 : OverloadExpr(UnresolvedLookupExprClass, Context, QualifierLoc,
anatofuz
parents:
diff changeset
343 TemplateKWLoc, NameInfo, TemplateArgs, Begin, End, false,
anatofuz
parents:
diff changeset
344 false, false),
anatofuz
parents:
diff changeset
345 NamingClass(NamingClass) {
anatofuz
parents:
diff changeset
346 UnresolvedLookupExprBits.RequiresADL = RequiresADL;
anatofuz
parents:
diff changeset
347 UnresolvedLookupExprBits.Overloaded = Overloaded;
anatofuz
parents:
diff changeset
348 }
anatofuz
parents:
diff changeset
349
anatofuz
parents:
diff changeset
350 UnresolvedLookupExpr::UnresolvedLookupExpr(EmptyShell Empty,
anatofuz
parents:
diff changeset
351 unsigned NumResults,
anatofuz
parents:
diff changeset
352 bool HasTemplateKWAndArgsInfo)
anatofuz
parents:
diff changeset
353 : OverloadExpr(UnresolvedLookupExprClass, Empty, NumResults,
anatofuz
parents:
diff changeset
354 HasTemplateKWAndArgsInfo) {}
anatofuz
parents:
diff changeset
355
anatofuz
parents:
diff changeset
356 UnresolvedLookupExpr *UnresolvedLookupExpr::Create(
anatofuz
parents:
diff changeset
357 const ASTContext &Context, CXXRecordDecl *NamingClass,
anatofuz
parents:
diff changeset
358 NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo,
anatofuz
parents:
diff changeset
359 bool RequiresADL, bool Overloaded, UnresolvedSetIterator Begin,
anatofuz
parents:
diff changeset
360 UnresolvedSetIterator End) {
anatofuz
parents:
diff changeset
361 unsigned NumResults = End - Begin;
anatofuz
parents:
diff changeset
362 unsigned Size = totalSizeToAlloc<DeclAccessPair, ASTTemplateKWAndArgsInfo,
anatofuz
parents:
diff changeset
363 TemplateArgumentLoc>(NumResults, 0, 0);
anatofuz
parents:
diff changeset
364 void *Mem = Context.Allocate(Size, alignof(UnresolvedLookupExpr));
anatofuz
parents:
diff changeset
365 return new (Mem) UnresolvedLookupExpr(Context, NamingClass, QualifierLoc,
anatofuz
parents:
diff changeset
366 SourceLocation(), NameInfo, RequiresADL,
anatofuz
parents:
diff changeset
367 Overloaded, nullptr, Begin, End);
anatofuz
parents:
diff changeset
368 }
anatofuz
parents:
diff changeset
369
anatofuz
parents:
diff changeset
370 UnresolvedLookupExpr *UnresolvedLookupExpr::Create(
anatofuz
parents:
diff changeset
371 const ASTContext &Context, CXXRecordDecl *NamingClass,
anatofuz
parents:
diff changeset
372 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
anatofuz
parents:
diff changeset
373 const DeclarationNameInfo &NameInfo, bool RequiresADL,
anatofuz
parents:
diff changeset
374 const TemplateArgumentListInfo *Args, UnresolvedSetIterator Begin,
anatofuz
parents:
diff changeset
375 UnresolvedSetIterator End) {
anatofuz
parents:
diff changeset
376 assert(Args || TemplateKWLoc.isValid());
anatofuz
parents:
diff changeset
377 unsigned NumResults = End - Begin;
anatofuz
parents:
diff changeset
378 unsigned NumTemplateArgs = Args ? Args->size() : 0;
anatofuz
parents:
diff changeset
379 unsigned Size =
anatofuz
parents:
diff changeset
380 totalSizeToAlloc<DeclAccessPair, ASTTemplateKWAndArgsInfo,
anatofuz
parents:
diff changeset
381 TemplateArgumentLoc>(NumResults, 1, NumTemplateArgs);
anatofuz
parents:
diff changeset
382 void *Mem = Context.Allocate(Size, alignof(UnresolvedLookupExpr));
anatofuz
parents:
diff changeset
383 return new (Mem) UnresolvedLookupExpr(Context, NamingClass, QualifierLoc,
anatofuz
parents:
diff changeset
384 TemplateKWLoc, NameInfo, RequiresADL,
anatofuz
parents:
diff changeset
385 /*Overloaded*/ true, Args, Begin, End);
anatofuz
parents:
diff changeset
386 }
anatofuz
parents:
diff changeset
387
anatofuz
parents:
diff changeset
388 UnresolvedLookupExpr *UnresolvedLookupExpr::CreateEmpty(
anatofuz
parents:
diff changeset
389 const ASTContext &Context, unsigned NumResults,
anatofuz
parents:
diff changeset
390 bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs) {
anatofuz
parents:
diff changeset
391 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
anatofuz
parents:
diff changeset
392 unsigned Size = totalSizeToAlloc<DeclAccessPair, ASTTemplateKWAndArgsInfo,
anatofuz
parents:
diff changeset
393 TemplateArgumentLoc>(
anatofuz
parents:
diff changeset
394 NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
anatofuz
parents:
diff changeset
395 void *Mem = Context.Allocate(Size, alignof(UnresolvedLookupExpr));
anatofuz
parents:
diff changeset
396 return new (Mem)
anatofuz
parents:
diff changeset
397 UnresolvedLookupExpr(EmptyShell(), NumResults, HasTemplateKWAndArgsInfo);
anatofuz
parents:
diff changeset
398 }
anatofuz
parents:
diff changeset
399
anatofuz
parents:
diff changeset
400 OverloadExpr::OverloadExpr(StmtClass SC, const ASTContext &Context,
anatofuz
parents:
diff changeset
401 NestedNameSpecifierLoc QualifierLoc,
anatofuz
parents:
diff changeset
402 SourceLocation TemplateKWLoc,
anatofuz
parents:
diff changeset
403 const DeclarationNameInfo &NameInfo,
anatofuz
parents:
diff changeset
404 const TemplateArgumentListInfo *TemplateArgs,
anatofuz
parents:
diff changeset
405 UnresolvedSetIterator Begin,
anatofuz
parents:
diff changeset
406 UnresolvedSetIterator End, bool KnownDependent,
anatofuz
parents:
diff changeset
407 bool KnownInstantiationDependent,
anatofuz
parents:
diff changeset
408 bool KnownContainsUnexpandedParameterPack)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
409 : Expr(SC, Context.OverloadTy, VK_LValue, OK_Ordinary), NameInfo(NameInfo),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
410 QualifierLoc(QualifierLoc) {
150
anatofuz
parents:
diff changeset
411 unsigned NumResults = End - Begin;
anatofuz
parents:
diff changeset
412 OverloadExprBits.NumResults = NumResults;
anatofuz
parents:
diff changeset
413 OverloadExprBits.HasTemplateKWAndArgsInfo =
anatofuz
parents:
diff changeset
414 (TemplateArgs != nullptr ) || TemplateKWLoc.isValid();
anatofuz
parents:
diff changeset
415
anatofuz
parents:
diff changeset
416 if (NumResults) {
anatofuz
parents:
diff changeset
417 // Copy the results to the trailing array past UnresolvedLookupExpr
anatofuz
parents:
diff changeset
418 // or UnresolvedMemberExpr.
anatofuz
parents:
diff changeset
419 DeclAccessPair *Results = getTrailingResults();
anatofuz
parents:
diff changeset
420 memcpy(Results, Begin.I, NumResults * sizeof(DeclAccessPair));
anatofuz
parents:
diff changeset
421 }
anatofuz
parents:
diff changeset
422
anatofuz
parents:
diff changeset
423 if (TemplateArgs) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
424 auto Deps = TemplateArgumentDependence::None;
150
anatofuz
parents:
diff changeset
425 getTrailingASTTemplateKWAndArgsInfo()->initializeFrom(
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
426 TemplateKWLoc, *TemplateArgs, getTrailingTemplateArgumentLoc(), Deps);
150
anatofuz
parents:
diff changeset
427 } else if (TemplateKWLoc.isValid()) {
anatofuz
parents:
diff changeset
428 getTrailingASTTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
anatofuz
parents:
diff changeset
429 }
anatofuz
parents:
diff changeset
430
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
431 setDependence(computeDependence(this, KnownDependent,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
432 KnownInstantiationDependent,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
433 KnownContainsUnexpandedParameterPack));
150
anatofuz
parents:
diff changeset
434 if (isTypeDependent())
anatofuz
parents:
diff changeset
435 setType(Context.DependentTy);
anatofuz
parents:
diff changeset
436 }
anatofuz
parents:
diff changeset
437
anatofuz
parents:
diff changeset
438 OverloadExpr::OverloadExpr(StmtClass SC, EmptyShell Empty, unsigned NumResults,
anatofuz
parents:
diff changeset
439 bool HasTemplateKWAndArgsInfo)
anatofuz
parents:
diff changeset
440 : Expr(SC, Empty) {
anatofuz
parents:
diff changeset
441 OverloadExprBits.NumResults = NumResults;
anatofuz
parents:
diff changeset
442 OverloadExprBits.HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
anatofuz
parents:
diff changeset
443 }
anatofuz
parents:
diff changeset
444
anatofuz
parents:
diff changeset
445 // DependentScopeDeclRefExpr
anatofuz
parents:
diff changeset
446 DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(
anatofuz
parents:
diff changeset
447 QualType Ty, NestedNameSpecifierLoc QualifierLoc,
anatofuz
parents:
diff changeset
448 SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo,
anatofuz
parents:
diff changeset
449 const TemplateArgumentListInfo *Args)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
450 : Expr(DependentScopeDeclRefExprClass, Ty, VK_LValue, OK_Ordinary),
150
anatofuz
parents:
diff changeset
451 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {
anatofuz
parents:
diff changeset
452 DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo =
anatofuz
parents:
diff changeset
453 (Args != nullptr) || TemplateKWLoc.isValid();
anatofuz
parents:
diff changeset
454 if (Args) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
455 auto Deps = TemplateArgumentDependence::None;
150
anatofuz
parents:
diff changeset
456 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
457 TemplateKWLoc, *Args, getTrailingObjects<TemplateArgumentLoc>(), Deps);
150
anatofuz
parents:
diff changeset
458 } else if (TemplateKWLoc.isValid()) {
anatofuz
parents:
diff changeset
459 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
anatofuz
parents:
diff changeset
460 TemplateKWLoc);
anatofuz
parents:
diff changeset
461 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
462 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
463 }
anatofuz
parents:
diff changeset
464
anatofuz
parents:
diff changeset
465 DependentScopeDeclRefExpr *DependentScopeDeclRefExpr::Create(
anatofuz
parents:
diff changeset
466 const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
anatofuz
parents:
diff changeset
467 SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo,
anatofuz
parents:
diff changeset
468 const TemplateArgumentListInfo *Args) {
anatofuz
parents:
diff changeset
469 assert(QualifierLoc && "should be created for dependent qualifiers");
anatofuz
parents:
diff changeset
470 bool HasTemplateKWAndArgsInfo = Args || TemplateKWLoc.isValid();
anatofuz
parents:
diff changeset
471 std::size_t Size =
anatofuz
parents:
diff changeset
472 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
anatofuz
parents:
diff changeset
473 HasTemplateKWAndArgsInfo, Args ? Args->size() : 0);
anatofuz
parents:
diff changeset
474 void *Mem = Context.Allocate(Size);
anatofuz
parents:
diff changeset
475 return new (Mem) DependentScopeDeclRefExpr(Context.DependentTy, QualifierLoc,
anatofuz
parents:
diff changeset
476 TemplateKWLoc, NameInfo, Args);
anatofuz
parents:
diff changeset
477 }
anatofuz
parents:
diff changeset
478
anatofuz
parents:
diff changeset
479 DependentScopeDeclRefExpr *
anatofuz
parents:
diff changeset
480 DependentScopeDeclRefExpr::CreateEmpty(const ASTContext &Context,
anatofuz
parents:
diff changeset
481 bool HasTemplateKWAndArgsInfo,
anatofuz
parents:
diff changeset
482 unsigned NumTemplateArgs) {
anatofuz
parents:
diff changeset
483 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
anatofuz
parents:
diff changeset
484 std::size_t Size =
anatofuz
parents:
diff changeset
485 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
anatofuz
parents:
diff changeset
486 HasTemplateKWAndArgsInfo, NumTemplateArgs);
anatofuz
parents:
diff changeset
487 void *Mem = Context.Allocate(Size);
anatofuz
parents:
diff changeset
488 auto *E = new (Mem) DependentScopeDeclRefExpr(
anatofuz
parents:
diff changeset
489 QualType(), NestedNameSpecifierLoc(), SourceLocation(),
anatofuz
parents:
diff changeset
490 DeclarationNameInfo(), nullptr);
anatofuz
parents:
diff changeset
491 E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo =
anatofuz
parents:
diff changeset
492 HasTemplateKWAndArgsInfo;
anatofuz
parents:
diff changeset
493 return E;
anatofuz
parents:
diff changeset
494 }
anatofuz
parents:
diff changeset
495
anatofuz
parents:
diff changeset
496 SourceLocation CXXConstructExpr::getBeginLoc() const {
anatofuz
parents:
diff changeset
497 if (isa<CXXTemporaryObjectExpr>(this))
anatofuz
parents:
diff changeset
498 return cast<CXXTemporaryObjectExpr>(this)->getBeginLoc();
anatofuz
parents:
diff changeset
499 return getLocation();
anatofuz
parents:
diff changeset
500 }
anatofuz
parents:
diff changeset
501
anatofuz
parents:
diff changeset
502 SourceLocation CXXConstructExpr::getEndLoc() const {
anatofuz
parents:
diff changeset
503 if (isa<CXXTemporaryObjectExpr>(this))
anatofuz
parents:
diff changeset
504 return cast<CXXTemporaryObjectExpr>(this)->getEndLoc();
anatofuz
parents:
diff changeset
505
anatofuz
parents:
diff changeset
506 if (ParenOrBraceRange.isValid())
anatofuz
parents:
diff changeset
507 return ParenOrBraceRange.getEnd();
anatofuz
parents:
diff changeset
508
anatofuz
parents:
diff changeset
509 SourceLocation End = getLocation();
anatofuz
parents:
diff changeset
510 for (unsigned I = getNumArgs(); I > 0; --I) {
anatofuz
parents:
diff changeset
511 const Expr *Arg = getArg(I-1);
anatofuz
parents:
diff changeset
512 if (!Arg->isDefaultArgument()) {
anatofuz
parents:
diff changeset
513 SourceLocation NewEnd = Arg->getEndLoc();
anatofuz
parents:
diff changeset
514 if (NewEnd.isValid()) {
anatofuz
parents:
diff changeset
515 End = NewEnd;
anatofuz
parents:
diff changeset
516 break;
anatofuz
parents:
diff changeset
517 }
anatofuz
parents:
diff changeset
518 }
anatofuz
parents:
diff changeset
519 }
anatofuz
parents:
diff changeset
520
anatofuz
parents:
diff changeset
521 return End;
anatofuz
parents:
diff changeset
522 }
anatofuz
parents:
diff changeset
523
anatofuz
parents:
diff changeset
524 CXXOperatorCallExpr::CXXOperatorCallExpr(OverloadedOperatorKind OpKind,
anatofuz
parents:
diff changeset
525 Expr *Fn, ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
526 QualType Ty, ExprValueKind VK,
anatofuz
parents:
diff changeset
527 SourceLocation OperatorLoc,
anatofuz
parents:
diff changeset
528 FPOptions FPFeatures,
anatofuz
parents:
diff changeset
529 ADLCallKind UsesADL)
anatofuz
parents:
diff changeset
530 : CallExpr(CXXOperatorCallExprClass, Fn, /*PreArgs=*/{}, Args, Ty, VK,
anatofuz
parents:
diff changeset
531 OperatorLoc, /*MinNumArgs=*/0, UsesADL) {
anatofuz
parents:
diff changeset
532 CXXOperatorCallExprBits.OperatorKind = OpKind;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
533 CXXOperatorCallExprBits.FPFeatures = FPFeatures.getAsOpaqueInt();
150
anatofuz
parents:
diff changeset
534 assert(
anatofuz
parents:
diff changeset
535 (CXXOperatorCallExprBits.OperatorKind == static_cast<unsigned>(OpKind)) &&
anatofuz
parents:
diff changeset
536 "OperatorKind overflow!");
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
537 assert((CXXOperatorCallExprBits.FPFeatures == FPFeatures.getAsOpaqueInt()) &&
150
anatofuz
parents:
diff changeset
538 "FPFeatures overflow!");
anatofuz
parents:
diff changeset
539 Range = getSourceRangeImpl();
anatofuz
parents:
diff changeset
540 }
anatofuz
parents:
diff changeset
541
anatofuz
parents:
diff changeset
542 CXXOperatorCallExpr::CXXOperatorCallExpr(unsigned NumArgs, EmptyShell Empty)
anatofuz
parents:
diff changeset
543 : CallExpr(CXXOperatorCallExprClass, /*NumPreArgs=*/0, NumArgs, Empty) {}
anatofuz
parents:
diff changeset
544
anatofuz
parents:
diff changeset
545 CXXOperatorCallExpr *CXXOperatorCallExpr::Create(
anatofuz
parents:
diff changeset
546 const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn,
anatofuz
parents:
diff changeset
547 ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
anatofuz
parents:
diff changeset
548 SourceLocation OperatorLoc, FPOptions FPFeatures, ADLCallKind UsesADL) {
anatofuz
parents:
diff changeset
549 // Allocate storage for the trailing objects of CallExpr.
anatofuz
parents:
diff changeset
550 unsigned NumArgs = Args.size();
anatofuz
parents:
diff changeset
551 unsigned SizeOfTrailingObjects =
anatofuz
parents:
diff changeset
552 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs);
anatofuz
parents:
diff changeset
553 void *Mem = Ctx.Allocate(sizeof(CXXOperatorCallExpr) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
554 alignof(CXXOperatorCallExpr));
anatofuz
parents:
diff changeset
555 return new (Mem) CXXOperatorCallExpr(OpKind, Fn, Args, Ty, VK, OperatorLoc,
anatofuz
parents:
diff changeset
556 FPFeatures, UsesADL);
anatofuz
parents:
diff changeset
557 }
anatofuz
parents:
diff changeset
558
anatofuz
parents:
diff changeset
559 CXXOperatorCallExpr *CXXOperatorCallExpr::CreateEmpty(const ASTContext &Ctx,
anatofuz
parents:
diff changeset
560 unsigned NumArgs,
anatofuz
parents:
diff changeset
561 EmptyShell Empty) {
anatofuz
parents:
diff changeset
562 // Allocate storage for the trailing objects of CallExpr.
anatofuz
parents:
diff changeset
563 unsigned SizeOfTrailingObjects =
anatofuz
parents:
diff changeset
564 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs);
anatofuz
parents:
diff changeset
565 void *Mem = Ctx.Allocate(sizeof(CXXOperatorCallExpr) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
566 alignof(CXXOperatorCallExpr));
anatofuz
parents:
diff changeset
567 return new (Mem) CXXOperatorCallExpr(NumArgs, Empty);
anatofuz
parents:
diff changeset
568 }
anatofuz
parents:
diff changeset
569
anatofuz
parents:
diff changeset
570 SourceRange CXXOperatorCallExpr::getSourceRangeImpl() const {
anatofuz
parents:
diff changeset
571 OverloadedOperatorKind Kind = getOperator();
anatofuz
parents:
diff changeset
572 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
anatofuz
parents:
diff changeset
573 if (getNumArgs() == 1)
anatofuz
parents:
diff changeset
574 // Prefix operator
anatofuz
parents:
diff changeset
575 return SourceRange(getOperatorLoc(), getArg(0)->getEndLoc());
anatofuz
parents:
diff changeset
576 else
anatofuz
parents:
diff changeset
577 // Postfix operator
anatofuz
parents:
diff changeset
578 return SourceRange(getArg(0)->getBeginLoc(), getOperatorLoc());
anatofuz
parents:
diff changeset
579 } else if (Kind == OO_Arrow) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
580 return SourceRange(getArg(0)->getBeginLoc(), getOperatorLoc());
150
anatofuz
parents:
diff changeset
581 } else if (Kind == OO_Call) {
anatofuz
parents:
diff changeset
582 return SourceRange(getArg(0)->getBeginLoc(), getRParenLoc());
anatofuz
parents:
diff changeset
583 } else if (Kind == OO_Subscript) {
anatofuz
parents:
diff changeset
584 return SourceRange(getArg(0)->getBeginLoc(), getRParenLoc());
anatofuz
parents:
diff changeset
585 } else if (getNumArgs() == 1) {
anatofuz
parents:
diff changeset
586 return SourceRange(getOperatorLoc(), getArg(0)->getEndLoc());
anatofuz
parents:
diff changeset
587 } else if (getNumArgs() == 2) {
anatofuz
parents:
diff changeset
588 return SourceRange(getArg(0)->getBeginLoc(), getArg(1)->getEndLoc());
anatofuz
parents:
diff changeset
589 } else {
anatofuz
parents:
diff changeset
590 return getOperatorLoc();
anatofuz
parents:
diff changeset
591 }
anatofuz
parents:
diff changeset
592 }
anatofuz
parents:
diff changeset
593
anatofuz
parents:
diff changeset
594 CXXMemberCallExpr::CXXMemberCallExpr(Expr *Fn, ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
595 QualType Ty, ExprValueKind VK,
anatofuz
parents:
diff changeset
596 SourceLocation RP, unsigned MinNumArgs)
anatofuz
parents:
diff changeset
597 : CallExpr(CXXMemberCallExprClass, Fn, /*PreArgs=*/{}, Args, Ty, VK, RP,
anatofuz
parents:
diff changeset
598 MinNumArgs, NotADL) {}
anatofuz
parents:
diff changeset
599
anatofuz
parents:
diff changeset
600 CXXMemberCallExpr::CXXMemberCallExpr(unsigned NumArgs, EmptyShell Empty)
anatofuz
parents:
diff changeset
601 : CallExpr(CXXMemberCallExprClass, /*NumPreArgs=*/0, NumArgs, Empty) {}
anatofuz
parents:
diff changeset
602
anatofuz
parents:
diff changeset
603 CXXMemberCallExpr *CXXMemberCallExpr::Create(const ASTContext &Ctx, Expr *Fn,
anatofuz
parents:
diff changeset
604 ArrayRef<Expr *> Args, QualType Ty,
anatofuz
parents:
diff changeset
605 ExprValueKind VK,
anatofuz
parents:
diff changeset
606 SourceLocation RP,
anatofuz
parents:
diff changeset
607 unsigned MinNumArgs) {
anatofuz
parents:
diff changeset
608 // Allocate storage for the trailing objects of CallExpr.
anatofuz
parents:
diff changeset
609 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
anatofuz
parents:
diff changeset
610 unsigned SizeOfTrailingObjects =
anatofuz
parents:
diff changeset
611 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs);
anatofuz
parents:
diff changeset
612 void *Mem = Ctx.Allocate(sizeof(CXXMemberCallExpr) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
613 alignof(CXXMemberCallExpr));
anatofuz
parents:
diff changeset
614 return new (Mem) CXXMemberCallExpr(Fn, Args, Ty, VK, RP, MinNumArgs);
anatofuz
parents:
diff changeset
615 }
anatofuz
parents:
diff changeset
616
anatofuz
parents:
diff changeset
617 CXXMemberCallExpr *CXXMemberCallExpr::CreateEmpty(const ASTContext &Ctx,
anatofuz
parents:
diff changeset
618 unsigned NumArgs,
anatofuz
parents:
diff changeset
619 EmptyShell Empty) {
anatofuz
parents:
diff changeset
620 // Allocate storage for the trailing objects of CallExpr.
anatofuz
parents:
diff changeset
621 unsigned SizeOfTrailingObjects =
anatofuz
parents:
diff changeset
622 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs);
anatofuz
parents:
diff changeset
623 void *Mem = Ctx.Allocate(sizeof(CXXMemberCallExpr) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
624 alignof(CXXMemberCallExpr));
anatofuz
parents:
diff changeset
625 return new (Mem) CXXMemberCallExpr(NumArgs, Empty);
anatofuz
parents:
diff changeset
626 }
anatofuz
parents:
diff changeset
627
anatofuz
parents:
diff changeset
628 Expr *CXXMemberCallExpr::getImplicitObjectArgument() const {
anatofuz
parents:
diff changeset
629 const Expr *Callee = getCallee()->IgnoreParens();
anatofuz
parents:
diff changeset
630 if (const auto *MemExpr = dyn_cast<MemberExpr>(Callee))
anatofuz
parents:
diff changeset
631 return MemExpr->getBase();
anatofuz
parents:
diff changeset
632 if (const auto *BO = dyn_cast<BinaryOperator>(Callee))
anatofuz
parents:
diff changeset
633 if (BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI)
anatofuz
parents:
diff changeset
634 return BO->getLHS();
anatofuz
parents:
diff changeset
635
anatofuz
parents:
diff changeset
636 // FIXME: Will eventually need to cope with member pointers.
anatofuz
parents:
diff changeset
637 return nullptr;
anatofuz
parents:
diff changeset
638 }
anatofuz
parents:
diff changeset
639
anatofuz
parents:
diff changeset
640 QualType CXXMemberCallExpr::getObjectType() const {
anatofuz
parents:
diff changeset
641 QualType Ty = getImplicitObjectArgument()->getType();
anatofuz
parents:
diff changeset
642 if (Ty->isPointerType())
anatofuz
parents:
diff changeset
643 Ty = Ty->getPointeeType();
anatofuz
parents:
diff changeset
644 return Ty;
anatofuz
parents:
diff changeset
645 }
anatofuz
parents:
diff changeset
646
anatofuz
parents:
diff changeset
647 CXXMethodDecl *CXXMemberCallExpr::getMethodDecl() const {
anatofuz
parents:
diff changeset
648 if (const auto *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
anatofuz
parents:
diff changeset
649 return cast<CXXMethodDecl>(MemExpr->getMemberDecl());
anatofuz
parents:
diff changeset
650
anatofuz
parents:
diff changeset
651 // FIXME: Will eventually need to cope with member pointers.
anatofuz
parents:
diff changeset
652 return nullptr;
anatofuz
parents:
diff changeset
653 }
anatofuz
parents:
diff changeset
654
anatofuz
parents:
diff changeset
655 CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() const {
anatofuz
parents:
diff changeset
656 Expr* ThisArg = getImplicitObjectArgument();
anatofuz
parents:
diff changeset
657 if (!ThisArg)
anatofuz
parents:
diff changeset
658 return nullptr;
anatofuz
parents:
diff changeset
659
anatofuz
parents:
diff changeset
660 if (ThisArg->getType()->isAnyPointerType())
anatofuz
parents:
diff changeset
661 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
anatofuz
parents:
diff changeset
662
anatofuz
parents:
diff changeset
663 return ThisArg->getType()->getAsCXXRecordDecl();
anatofuz
parents:
diff changeset
664 }
anatofuz
parents:
diff changeset
665
anatofuz
parents:
diff changeset
666 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
667 // Named casts
anatofuz
parents:
diff changeset
668 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
669
anatofuz
parents:
diff changeset
670 /// getCastName - Get the name of the C++ cast being used, e.g.,
anatofuz
parents:
diff changeset
671 /// "static_cast", "dynamic_cast", "reinterpret_cast", or
anatofuz
parents:
diff changeset
672 /// "const_cast". The returned pointer must not be freed.
anatofuz
parents:
diff changeset
673 const char *CXXNamedCastExpr::getCastName() const {
anatofuz
parents:
diff changeset
674 switch (getStmtClass()) {
anatofuz
parents:
diff changeset
675 case CXXStaticCastExprClass: return "static_cast";
anatofuz
parents:
diff changeset
676 case CXXDynamicCastExprClass: return "dynamic_cast";
anatofuz
parents:
diff changeset
677 case CXXReinterpretCastExprClass: return "reinterpret_cast";
anatofuz
parents:
diff changeset
678 case CXXConstCastExprClass: return "const_cast";
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
679 case CXXAddrspaceCastExprClass: return "addrspace_cast";
150
anatofuz
parents:
diff changeset
680 default: return "<invalid cast>";
anatofuz
parents:
diff changeset
681 }
anatofuz
parents:
diff changeset
682 }
anatofuz
parents:
diff changeset
683
anatofuz
parents:
diff changeset
684 CXXStaticCastExpr *CXXStaticCastExpr::Create(const ASTContext &C, QualType T,
anatofuz
parents:
diff changeset
685 ExprValueKind VK,
anatofuz
parents:
diff changeset
686 CastKind K, Expr *Op,
anatofuz
parents:
diff changeset
687 const CXXCastPath *BasePath,
anatofuz
parents:
diff changeset
688 TypeSourceInfo *WrittenTy,
anatofuz
parents:
diff changeset
689 SourceLocation L,
anatofuz
parents:
diff changeset
690 SourceLocation RParenLoc,
anatofuz
parents:
diff changeset
691 SourceRange AngleBrackets) {
anatofuz
parents:
diff changeset
692 unsigned PathSize = (BasePath ? BasePath->size() : 0);
anatofuz
parents:
diff changeset
693 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
anatofuz
parents:
diff changeset
694 auto *E =
anatofuz
parents:
diff changeset
695 new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
anatofuz
parents:
diff changeset
696 RParenLoc, AngleBrackets);
anatofuz
parents:
diff changeset
697 if (PathSize)
anatofuz
parents:
diff changeset
698 std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
anatofuz
parents:
diff changeset
699 E->getTrailingObjects<CXXBaseSpecifier *>());
anatofuz
parents:
diff changeset
700 return E;
anatofuz
parents:
diff changeset
701 }
anatofuz
parents:
diff changeset
702
anatofuz
parents:
diff changeset
703 CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(const ASTContext &C,
anatofuz
parents:
diff changeset
704 unsigned PathSize) {
anatofuz
parents:
diff changeset
705 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
anatofuz
parents:
diff changeset
706 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
anatofuz
parents:
diff changeset
707 }
anatofuz
parents:
diff changeset
708
anatofuz
parents:
diff changeset
709 CXXDynamicCastExpr *CXXDynamicCastExpr::Create(const ASTContext &C, QualType T,
anatofuz
parents:
diff changeset
710 ExprValueKind VK,
anatofuz
parents:
diff changeset
711 CastKind K, Expr *Op,
anatofuz
parents:
diff changeset
712 const CXXCastPath *BasePath,
anatofuz
parents:
diff changeset
713 TypeSourceInfo *WrittenTy,
anatofuz
parents:
diff changeset
714 SourceLocation L,
anatofuz
parents:
diff changeset
715 SourceLocation RParenLoc,
anatofuz
parents:
diff changeset
716 SourceRange AngleBrackets) {
anatofuz
parents:
diff changeset
717 unsigned PathSize = (BasePath ? BasePath->size() : 0);
anatofuz
parents:
diff changeset
718 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
anatofuz
parents:
diff changeset
719 auto *E =
anatofuz
parents:
diff changeset
720 new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
anatofuz
parents:
diff changeset
721 RParenLoc, AngleBrackets);
anatofuz
parents:
diff changeset
722 if (PathSize)
anatofuz
parents:
diff changeset
723 std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
anatofuz
parents:
diff changeset
724 E->getTrailingObjects<CXXBaseSpecifier *>());
anatofuz
parents:
diff changeset
725 return E;
anatofuz
parents:
diff changeset
726 }
anatofuz
parents:
diff changeset
727
anatofuz
parents:
diff changeset
728 CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(const ASTContext &C,
anatofuz
parents:
diff changeset
729 unsigned PathSize) {
anatofuz
parents:
diff changeset
730 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
anatofuz
parents:
diff changeset
731 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
anatofuz
parents:
diff changeset
732 }
anatofuz
parents:
diff changeset
733
anatofuz
parents:
diff changeset
734 /// isAlwaysNull - Return whether the result of the dynamic_cast is proven
anatofuz
parents:
diff changeset
735 /// to always be null. For example:
anatofuz
parents:
diff changeset
736 ///
anatofuz
parents:
diff changeset
737 /// struct A { };
anatofuz
parents:
diff changeset
738 /// struct B final : A { };
anatofuz
parents:
diff changeset
739 /// struct C { };
anatofuz
parents:
diff changeset
740 ///
anatofuz
parents:
diff changeset
741 /// C *f(B* b) { return dynamic_cast<C*>(b); }
anatofuz
parents:
diff changeset
742 bool CXXDynamicCastExpr::isAlwaysNull() const
anatofuz
parents:
diff changeset
743 {
anatofuz
parents:
diff changeset
744 QualType SrcType = getSubExpr()->getType();
anatofuz
parents:
diff changeset
745 QualType DestType = getType();
anatofuz
parents:
diff changeset
746
anatofuz
parents:
diff changeset
747 if (const auto *SrcPTy = SrcType->getAs<PointerType>()) {
anatofuz
parents:
diff changeset
748 SrcType = SrcPTy->getPointeeType();
anatofuz
parents:
diff changeset
749 DestType = DestType->castAs<PointerType>()->getPointeeType();
anatofuz
parents:
diff changeset
750 }
anatofuz
parents:
diff changeset
751
anatofuz
parents:
diff changeset
752 if (DestType->isVoidType())
anatofuz
parents:
diff changeset
753 return false;
anatofuz
parents:
diff changeset
754
anatofuz
parents:
diff changeset
755 const auto *SrcRD =
anatofuz
parents:
diff changeset
756 cast<CXXRecordDecl>(SrcType->castAs<RecordType>()->getDecl());
anatofuz
parents:
diff changeset
757
anatofuz
parents:
diff changeset
758 if (!SrcRD->hasAttr<FinalAttr>())
anatofuz
parents:
diff changeset
759 return false;
anatofuz
parents:
diff changeset
760
anatofuz
parents:
diff changeset
761 const auto *DestRD =
anatofuz
parents:
diff changeset
762 cast<CXXRecordDecl>(DestType->castAs<RecordType>()->getDecl());
anatofuz
parents:
diff changeset
763
anatofuz
parents:
diff changeset
764 return !DestRD->isDerivedFrom(SrcRD);
anatofuz
parents:
diff changeset
765 }
anatofuz
parents:
diff changeset
766
anatofuz
parents:
diff changeset
767 CXXReinterpretCastExpr *
anatofuz
parents:
diff changeset
768 CXXReinterpretCastExpr::Create(const ASTContext &C, QualType T,
anatofuz
parents:
diff changeset
769 ExprValueKind VK, CastKind K, Expr *Op,
anatofuz
parents:
diff changeset
770 const CXXCastPath *BasePath,
anatofuz
parents:
diff changeset
771 TypeSourceInfo *WrittenTy, SourceLocation L,
anatofuz
parents:
diff changeset
772 SourceLocation RParenLoc,
anatofuz
parents:
diff changeset
773 SourceRange AngleBrackets) {
anatofuz
parents:
diff changeset
774 unsigned PathSize = (BasePath ? BasePath->size() : 0);
anatofuz
parents:
diff changeset
775 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
anatofuz
parents:
diff changeset
776 auto *E =
anatofuz
parents:
diff changeset
777 new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
anatofuz
parents:
diff changeset
778 RParenLoc, AngleBrackets);
anatofuz
parents:
diff changeset
779 if (PathSize)
anatofuz
parents:
diff changeset
780 std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
anatofuz
parents:
diff changeset
781 E->getTrailingObjects<CXXBaseSpecifier *>());
anatofuz
parents:
diff changeset
782 return E;
anatofuz
parents:
diff changeset
783 }
anatofuz
parents:
diff changeset
784
anatofuz
parents:
diff changeset
785 CXXReinterpretCastExpr *
anatofuz
parents:
diff changeset
786 CXXReinterpretCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) {
anatofuz
parents:
diff changeset
787 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
anatofuz
parents:
diff changeset
788 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
anatofuz
parents:
diff changeset
789 }
anatofuz
parents:
diff changeset
790
anatofuz
parents:
diff changeset
791 CXXConstCastExpr *CXXConstCastExpr::Create(const ASTContext &C, QualType T,
anatofuz
parents:
diff changeset
792 ExprValueKind VK, Expr *Op,
anatofuz
parents:
diff changeset
793 TypeSourceInfo *WrittenTy,
anatofuz
parents:
diff changeset
794 SourceLocation L,
anatofuz
parents:
diff changeset
795 SourceLocation RParenLoc,
anatofuz
parents:
diff changeset
796 SourceRange AngleBrackets) {
anatofuz
parents:
diff changeset
797 return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc, AngleBrackets);
anatofuz
parents:
diff changeset
798 }
anatofuz
parents:
diff changeset
799
anatofuz
parents:
diff changeset
800 CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(const ASTContext &C) {
anatofuz
parents:
diff changeset
801 return new (C) CXXConstCastExpr(EmptyShell());
anatofuz
parents:
diff changeset
802 }
anatofuz
parents:
diff changeset
803
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
804 CXXAddrspaceCastExpr *
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
805 CXXAddrspaceCastExpr::Create(const ASTContext &C, QualType T, ExprValueKind VK,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
806 CastKind K, Expr *Op, TypeSourceInfo *WrittenTy,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
807 SourceLocation L, SourceLocation RParenLoc,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
808 SourceRange AngleBrackets) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
809 return new (C) CXXAddrspaceCastExpr(T, VK, K, Op, WrittenTy, L, RParenLoc,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
810 AngleBrackets);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
811 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
812
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
813 CXXAddrspaceCastExpr *CXXAddrspaceCastExpr::CreateEmpty(const ASTContext &C) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
814 return new (C) CXXAddrspaceCastExpr(EmptyShell());
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
815 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
816
150
anatofuz
parents:
diff changeset
817 CXXFunctionalCastExpr *
anatofuz
parents:
diff changeset
818 CXXFunctionalCastExpr::Create(const ASTContext &C, QualType T, ExprValueKind VK,
anatofuz
parents:
diff changeset
819 TypeSourceInfo *Written, CastKind K, Expr *Op,
anatofuz
parents:
diff changeset
820 const CXXCastPath *BasePath,
anatofuz
parents:
diff changeset
821 SourceLocation L, SourceLocation R) {
anatofuz
parents:
diff changeset
822 unsigned PathSize = (BasePath ? BasePath->size() : 0);
anatofuz
parents:
diff changeset
823 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
anatofuz
parents:
diff changeset
824 auto *E =
anatofuz
parents:
diff changeset
825 new (Buffer) CXXFunctionalCastExpr(T, VK, Written, K, Op, PathSize, L, R);
anatofuz
parents:
diff changeset
826 if (PathSize)
anatofuz
parents:
diff changeset
827 std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
anatofuz
parents:
diff changeset
828 E->getTrailingObjects<CXXBaseSpecifier *>());
anatofuz
parents:
diff changeset
829 return E;
anatofuz
parents:
diff changeset
830 }
anatofuz
parents:
diff changeset
831
anatofuz
parents:
diff changeset
832 CXXFunctionalCastExpr *
anatofuz
parents:
diff changeset
833 CXXFunctionalCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) {
anatofuz
parents:
diff changeset
834 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
anatofuz
parents:
diff changeset
835 return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
anatofuz
parents:
diff changeset
836 }
anatofuz
parents:
diff changeset
837
anatofuz
parents:
diff changeset
838 SourceLocation CXXFunctionalCastExpr::getBeginLoc() const {
anatofuz
parents:
diff changeset
839 return getTypeInfoAsWritten()->getTypeLoc().getBeginLoc();
anatofuz
parents:
diff changeset
840 }
anatofuz
parents:
diff changeset
841
anatofuz
parents:
diff changeset
842 SourceLocation CXXFunctionalCastExpr::getEndLoc() const {
anatofuz
parents:
diff changeset
843 return RParenLoc.isValid() ? RParenLoc : getSubExpr()->getEndLoc();
anatofuz
parents:
diff changeset
844 }
anatofuz
parents:
diff changeset
845
anatofuz
parents:
diff changeset
846 UserDefinedLiteral::UserDefinedLiteral(Expr *Fn, ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
847 QualType Ty, ExprValueKind VK,
anatofuz
parents:
diff changeset
848 SourceLocation LitEndLoc,
anatofuz
parents:
diff changeset
849 SourceLocation SuffixLoc)
anatofuz
parents:
diff changeset
850 : CallExpr(UserDefinedLiteralClass, Fn, /*PreArgs=*/{}, Args, Ty, VK,
anatofuz
parents:
diff changeset
851 LitEndLoc, /*MinNumArgs=*/0, NotADL),
anatofuz
parents:
diff changeset
852 UDSuffixLoc(SuffixLoc) {}
anatofuz
parents:
diff changeset
853
anatofuz
parents:
diff changeset
854 UserDefinedLiteral::UserDefinedLiteral(unsigned NumArgs, EmptyShell Empty)
anatofuz
parents:
diff changeset
855 : CallExpr(UserDefinedLiteralClass, /*NumPreArgs=*/0, NumArgs, Empty) {}
anatofuz
parents:
diff changeset
856
anatofuz
parents:
diff changeset
857 UserDefinedLiteral *UserDefinedLiteral::Create(const ASTContext &Ctx, Expr *Fn,
anatofuz
parents:
diff changeset
858 ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
859 QualType Ty, ExprValueKind VK,
anatofuz
parents:
diff changeset
860 SourceLocation LitEndLoc,
anatofuz
parents:
diff changeset
861 SourceLocation SuffixLoc) {
anatofuz
parents:
diff changeset
862 // Allocate storage for the trailing objects of CallExpr.
anatofuz
parents:
diff changeset
863 unsigned NumArgs = Args.size();
anatofuz
parents:
diff changeset
864 unsigned SizeOfTrailingObjects =
anatofuz
parents:
diff changeset
865 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs);
anatofuz
parents:
diff changeset
866 void *Mem = Ctx.Allocate(sizeof(UserDefinedLiteral) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
867 alignof(UserDefinedLiteral));
anatofuz
parents:
diff changeset
868 return new (Mem) UserDefinedLiteral(Fn, Args, Ty, VK, LitEndLoc, SuffixLoc);
anatofuz
parents:
diff changeset
869 }
anatofuz
parents:
diff changeset
870
anatofuz
parents:
diff changeset
871 UserDefinedLiteral *UserDefinedLiteral::CreateEmpty(const ASTContext &Ctx,
anatofuz
parents:
diff changeset
872 unsigned NumArgs,
anatofuz
parents:
diff changeset
873 EmptyShell Empty) {
anatofuz
parents:
diff changeset
874 // Allocate storage for the trailing objects of CallExpr.
anatofuz
parents:
diff changeset
875 unsigned SizeOfTrailingObjects =
anatofuz
parents:
diff changeset
876 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs);
anatofuz
parents:
diff changeset
877 void *Mem = Ctx.Allocate(sizeof(UserDefinedLiteral) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
878 alignof(UserDefinedLiteral));
anatofuz
parents:
diff changeset
879 return new (Mem) UserDefinedLiteral(NumArgs, Empty);
anatofuz
parents:
diff changeset
880 }
anatofuz
parents:
diff changeset
881
anatofuz
parents:
diff changeset
882 UserDefinedLiteral::LiteralOperatorKind
anatofuz
parents:
diff changeset
883 UserDefinedLiteral::getLiteralOperatorKind() const {
anatofuz
parents:
diff changeset
884 if (getNumArgs() == 0)
anatofuz
parents:
diff changeset
885 return LOK_Template;
anatofuz
parents:
diff changeset
886 if (getNumArgs() == 2)
anatofuz
parents:
diff changeset
887 return LOK_String;
anatofuz
parents:
diff changeset
888
anatofuz
parents:
diff changeset
889 assert(getNumArgs() == 1 && "unexpected #args in literal operator call");
anatofuz
parents:
diff changeset
890 QualType ParamTy =
anatofuz
parents:
diff changeset
891 cast<FunctionDecl>(getCalleeDecl())->getParamDecl(0)->getType();
anatofuz
parents:
diff changeset
892 if (ParamTy->isPointerType())
anatofuz
parents:
diff changeset
893 return LOK_Raw;
anatofuz
parents:
diff changeset
894 if (ParamTy->isAnyCharacterType())
anatofuz
parents:
diff changeset
895 return LOK_Character;
anatofuz
parents:
diff changeset
896 if (ParamTy->isIntegerType())
anatofuz
parents:
diff changeset
897 return LOK_Integer;
anatofuz
parents:
diff changeset
898 if (ParamTy->isFloatingType())
anatofuz
parents:
diff changeset
899 return LOK_Floating;
anatofuz
parents:
diff changeset
900
anatofuz
parents:
diff changeset
901 llvm_unreachable("unknown kind of literal operator");
anatofuz
parents:
diff changeset
902 }
anatofuz
parents:
diff changeset
903
anatofuz
parents:
diff changeset
904 Expr *UserDefinedLiteral::getCookedLiteral() {
anatofuz
parents:
diff changeset
905 #ifndef NDEBUG
anatofuz
parents:
diff changeset
906 LiteralOperatorKind LOK = getLiteralOperatorKind();
anatofuz
parents:
diff changeset
907 assert(LOK != LOK_Template && LOK != LOK_Raw && "not a cooked literal");
anatofuz
parents:
diff changeset
908 #endif
anatofuz
parents:
diff changeset
909 return getArg(0);
anatofuz
parents:
diff changeset
910 }
anatofuz
parents:
diff changeset
911
anatofuz
parents:
diff changeset
912 const IdentifierInfo *UserDefinedLiteral::getUDSuffix() const {
anatofuz
parents:
diff changeset
913 return cast<FunctionDecl>(getCalleeDecl())->getLiteralIdentifier();
anatofuz
parents:
diff changeset
914 }
anatofuz
parents:
diff changeset
915
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
916 CXXDefaultInitExpr::CXXDefaultInitExpr(const ASTContext &Ctx,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
917 SourceLocation Loc, FieldDecl *Field,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
918 QualType Ty, DeclContext *UsedContext)
150
anatofuz
parents:
diff changeset
919 : Expr(CXXDefaultInitExprClass, Ty.getNonLValueExprType(Ctx),
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
920 Ty->isLValueReferenceType()
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
921 ? VK_LValue
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
922 : Ty->isRValueReferenceType() ? VK_XValue : VK_RValue,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
923 /*FIXME*/ OK_Ordinary),
150
anatofuz
parents:
diff changeset
924 Field(Field), UsedContext(UsedContext) {
anatofuz
parents:
diff changeset
925 CXXDefaultInitExprBits.Loc = Loc;
anatofuz
parents:
diff changeset
926 assert(Field->hasInClassInitializer());
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
927
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
928 setDependence(ExprDependence::None);
150
anatofuz
parents:
diff changeset
929 }
anatofuz
parents:
diff changeset
930
anatofuz
parents:
diff changeset
931 CXXTemporary *CXXTemporary::Create(const ASTContext &C,
anatofuz
parents:
diff changeset
932 const CXXDestructorDecl *Destructor) {
anatofuz
parents:
diff changeset
933 return new (C) CXXTemporary(Destructor);
anatofuz
parents:
diff changeset
934 }
anatofuz
parents:
diff changeset
935
anatofuz
parents:
diff changeset
936 CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(const ASTContext &C,
anatofuz
parents:
diff changeset
937 CXXTemporary *Temp,
anatofuz
parents:
diff changeset
938 Expr* SubExpr) {
anatofuz
parents:
diff changeset
939 assert((SubExpr->getType()->isRecordType() ||
anatofuz
parents:
diff changeset
940 SubExpr->getType()->isArrayType()) &&
anatofuz
parents:
diff changeset
941 "Expression bound to a temporary must have record or array type!");
anatofuz
parents:
diff changeset
942
anatofuz
parents:
diff changeset
943 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
anatofuz
parents:
diff changeset
944 }
anatofuz
parents:
diff changeset
945
anatofuz
parents:
diff changeset
946 CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(
anatofuz
parents:
diff changeset
947 CXXConstructorDecl *Cons, QualType Ty, TypeSourceInfo *TSI,
anatofuz
parents:
diff changeset
948 ArrayRef<Expr *> Args, SourceRange ParenOrBraceRange,
anatofuz
parents:
diff changeset
949 bool HadMultipleCandidates, bool ListInitialization,
anatofuz
parents:
diff changeset
950 bool StdInitListInitialization, bool ZeroInitialization)
anatofuz
parents:
diff changeset
951 : CXXConstructExpr(
anatofuz
parents:
diff changeset
952 CXXTemporaryObjectExprClass, Ty, TSI->getTypeLoc().getBeginLoc(),
anatofuz
parents:
diff changeset
953 Cons, /* Elidable=*/false, Args, HadMultipleCandidates,
anatofuz
parents:
diff changeset
954 ListInitialization, StdInitListInitialization, ZeroInitialization,
anatofuz
parents:
diff changeset
955 CXXConstructExpr::CK_Complete, ParenOrBraceRange),
anatofuz
parents:
diff changeset
956 TSI(TSI) {}
anatofuz
parents:
diff changeset
957
anatofuz
parents:
diff changeset
958 CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(EmptyShell Empty,
anatofuz
parents:
diff changeset
959 unsigned NumArgs)
anatofuz
parents:
diff changeset
960 : CXXConstructExpr(CXXTemporaryObjectExprClass, Empty, NumArgs) {}
anatofuz
parents:
diff changeset
961
anatofuz
parents:
diff changeset
962 CXXTemporaryObjectExpr *CXXTemporaryObjectExpr::Create(
anatofuz
parents:
diff changeset
963 const ASTContext &Ctx, CXXConstructorDecl *Cons, QualType Ty,
anatofuz
parents:
diff changeset
964 TypeSourceInfo *TSI, ArrayRef<Expr *> Args, SourceRange ParenOrBraceRange,
anatofuz
parents:
diff changeset
965 bool HadMultipleCandidates, bool ListInitialization,
anatofuz
parents:
diff changeset
966 bool StdInitListInitialization, bool ZeroInitialization) {
anatofuz
parents:
diff changeset
967 unsigned SizeOfTrailingObjects = sizeOfTrailingObjects(Args.size());
anatofuz
parents:
diff changeset
968 void *Mem =
anatofuz
parents:
diff changeset
969 Ctx.Allocate(sizeof(CXXTemporaryObjectExpr) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
970 alignof(CXXTemporaryObjectExpr));
anatofuz
parents:
diff changeset
971 return new (Mem) CXXTemporaryObjectExpr(
anatofuz
parents:
diff changeset
972 Cons, Ty, TSI, Args, ParenOrBraceRange, HadMultipleCandidates,
anatofuz
parents:
diff changeset
973 ListInitialization, StdInitListInitialization, ZeroInitialization);
anatofuz
parents:
diff changeset
974 }
anatofuz
parents:
diff changeset
975
anatofuz
parents:
diff changeset
976 CXXTemporaryObjectExpr *
anatofuz
parents:
diff changeset
977 CXXTemporaryObjectExpr::CreateEmpty(const ASTContext &Ctx, unsigned NumArgs) {
anatofuz
parents:
diff changeset
978 unsigned SizeOfTrailingObjects = sizeOfTrailingObjects(NumArgs);
anatofuz
parents:
diff changeset
979 void *Mem =
anatofuz
parents:
diff changeset
980 Ctx.Allocate(sizeof(CXXTemporaryObjectExpr) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
981 alignof(CXXTemporaryObjectExpr));
anatofuz
parents:
diff changeset
982 return new (Mem) CXXTemporaryObjectExpr(EmptyShell(), NumArgs);
anatofuz
parents:
diff changeset
983 }
anatofuz
parents:
diff changeset
984
anatofuz
parents:
diff changeset
985 SourceLocation CXXTemporaryObjectExpr::getBeginLoc() const {
anatofuz
parents:
diff changeset
986 return getTypeSourceInfo()->getTypeLoc().getBeginLoc();
anatofuz
parents:
diff changeset
987 }
anatofuz
parents:
diff changeset
988
anatofuz
parents:
diff changeset
989 SourceLocation CXXTemporaryObjectExpr::getEndLoc() const {
anatofuz
parents:
diff changeset
990 SourceLocation Loc = getParenOrBraceRange().getEnd();
anatofuz
parents:
diff changeset
991 if (Loc.isInvalid() && getNumArgs())
anatofuz
parents:
diff changeset
992 Loc = getArg(getNumArgs() - 1)->getEndLoc();
anatofuz
parents:
diff changeset
993 return Loc;
anatofuz
parents:
diff changeset
994 }
anatofuz
parents:
diff changeset
995
anatofuz
parents:
diff changeset
996 CXXConstructExpr *CXXConstructExpr::Create(
anatofuz
parents:
diff changeset
997 const ASTContext &Ctx, QualType Ty, SourceLocation Loc,
anatofuz
parents:
diff changeset
998 CXXConstructorDecl *Ctor, bool Elidable, ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
999 bool HadMultipleCandidates, bool ListInitialization,
anatofuz
parents:
diff changeset
1000 bool StdInitListInitialization, bool ZeroInitialization,
anatofuz
parents:
diff changeset
1001 ConstructionKind ConstructKind, SourceRange ParenOrBraceRange) {
anatofuz
parents:
diff changeset
1002 unsigned SizeOfTrailingObjects = sizeOfTrailingObjects(Args.size());
anatofuz
parents:
diff changeset
1003 void *Mem = Ctx.Allocate(sizeof(CXXConstructExpr) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
1004 alignof(CXXConstructExpr));
anatofuz
parents:
diff changeset
1005 return new (Mem) CXXConstructExpr(
anatofuz
parents:
diff changeset
1006 CXXConstructExprClass, Ty, Loc, Ctor, Elidable, Args,
anatofuz
parents:
diff changeset
1007 HadMultipleCandidates, ListInitialization, StdInitListInitialization,
anatofuz
parents:
diff changeset
1008 ZeroInitialization, ConstructKind, ParenOrBraceRange);
anatofuz
parents:
diff changeset
1009 }
anatofuz
parents:
diff changeset
1010
anatofuz
parents:
diff changeset
1011 CXXConstructExpr *CXXConstructExpr::CreateEmpty(const ASTContext &Ctx,
anatofuz
parents:
diff changeset
1012 unsigned NumArgs) {
anatofuz
parents:
diff changeset
1013 unsigned SizeOfTrailingObjects = sizeOfTrailingObjects(NumArgs);
anatofuz
parents:
diff changeset
1014 void *Mem = Ctx.Allocate(sizeof(CXXConstructExpr) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
1015 alignof(CXXConstructExpr));
anatofuz
parents:
diff changeset
1016 return new (Mem)
anatofuz
parents:
diff changeset
1017 CXXConstructExpr(CXXConstructExprClass, EmptyShell(), NumArgs);
anatofuz
parents:
diff changeset
1018 }
anatofuz
parents:
diff changeset
1019
anatofuz
parents:
diff changeset
1020 CXXConstructExpr::CXXConstructExpr(
anatofuz
parents:
diff changeset
1021 StmtClass SC, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor,
anatofuz
parents:
diff changeset
1022 bool Elidable, ArrayRef<Expr *> Args, bool HadMultipleCandidates,
anatofuz
parents:
diff changeset
1023 bool ListInitialization, bool StdInitListInitialization,
anatofuz
parents:
diff changeset
1024 bool ZeroInitialization, ConstructionKind ConstructKind,
anatofuz
parents:
diff changeset
1025 SourceRange ParenOrBraceRange)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1026 : Expr(SC, Ty, VK_RValue, OK_Ordinary), Constructor(Ctor),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1027 ParenOrBraceRange(ParenOrBraceRange), NumArgs(Args.size()) {
150
anatofuz
parents:
diff changeset
1028 CXXConstructExprBits.Elidable = Elidable;
anatofuz
parents:
diff changeset
1029 CXXConstructExprBits.HadMultipleCandidates = HadMultipleCandidates;
anatofuz
parents:
diff changeset
1030 CXXConstructExprBits.ListInitialization = ListInitialization;
anatofuz
parents:
diff changeset
1031 CXXConstructExprBits.StdInitListInitialization = StdInitListInitialization;
anatofuz
parents:
diff changeset
1032 CXXConstructExprBits.ZeroInitialization = ZeroInitialization;
anatofuz
parents:
diff changeset
1033 CXXConstructExprBits.ConstructionKind = ConstructKind;
anatofuz
parents:
diff changeset
1034 CXXConstructExprBits.Loc = Loc;
anatofuz
parents:
diff changeset
1035
anatofuz
parents:
diff changeset
1036 Stmt **TrailingArgs = getTrailingArgs();
anatofuz
parents:
diff changeset
1037 for (unsigned I = 0, N = Args.size(); I != N; ++I) {
anatofuz
parents:
diff changeset
1038 assert(Args[I] && "NULL argument in CXXConstructExpr!");
anatofuz
parents:
diff changeset
1039 TrailingArgs[I] = Args[I];
anatofuz
parents:
diff changeset
1040 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1041
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1042 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
1043 }
anatofuz
parents:
diff changeset
1044
anatofuz
parents:
diff changeset
1045 CXXConstructExpr::CXXConstructExpr(StmtClass SC, EmptyShell Empty,
anatofuz
parents:
diff changeset
1046 unsigned NumArgs)
anatofuz
parents:
diff changeset
1047 : Expr(SC, Empty), NumArgs(NumArgs) {}
anatofuz
parents:
diff changeset
1048
anatofuz
parents:
diff changeset
1049 LambdaCapture::LambdaCapture(SourceLocation Loc, bool Implicit,
anatofuz
parents:
diff changeset
1050 LambdaCaptureKind Kind, VarDecl *Var,
anatofuz
parents:
diff changeset
1051 SourceLocation EllipsisLoc)
anatofuz
parents:
diff changeset
1052 : DeclAndBits(Var, 0), Loc(Loc), EllipsisLoc(EllipsisLoc) {
anatofuz
parents:
diff changeset
1053 unsigned Bits = 0;
anatofuz
parents:
diff changeset
1054 if (Implicit)
anatofuz
parents:
diff changeset
1055 Bits |= Capture_Implicit;
anatofuz
parents:
diff changeset
1056
anatofuz
parents:
diff changeset
1057 switch (Kind) {
anatofuz
parents:
diff changeset
1058 case LCK_StarThis:
anatofuz
parents:
diff changeset
1059 Bits |= Capture_ByCopy;
anatofuz
parents:
diff changeset
1060 LLVM_FALLTHROUGH;
anatofuz
parents:
diff changeset
1061 case LCK_This:
anatofuz
parents:
diff changeset
1062 assert(!Var && "'this' capture cannot have a variable!");
anatofuz
parents:
diff changeset
1063 Bits |= Capture_This;
anatofuz
parents:
diff changeset
1064 break;
anatofuz
parents:
diff changeset
1065
anatofuz
parents:
diff changeset
1066 case LCK_ByCopy:
anatofuz
parents:
diff changeset
1067 Bits |= Capture_ByCopy;
anatofuz
parents:
diff changeset
1068 LLVM_FALLTHROUGH;
anatofuz
parents:
diff changeset
1069 case LCK_ByRef:
anatofuz
parents:
diff changeset
1070 assert(Var && "capture must have a variable!");
anatofuz
parents:
diff changeset
1071 break;
anatofuz
parents:
diff changeset
1072 case LCK_VLAType:
anatofuz
parents:
diff changeset
1073 assert(!Var && "VLA type capture cannot have a variable!");
anatofuz
parents:
diff changeset
1074 break;
anatofuz
parents:
diff changeset
1075 }
anatofuz
parents:
diff changeset
1076 DeclAndBits.setInt(Bits);
anatofuz
parents:
diff changeset
1077 }
anatofuz
parents:
diff changeset
1078
anatofuz
parents:
diff changeset
1079 LambdaCaptureKind LambdaCapture::getCaptureKind() const {
anatofuz
parents:
diff changeset
1080 if (capturesVLAType())
anatofuz
parents:
diff changeset
1081 return LCK_VLAType;
anatofuz
parents:
diff changeset
1082 bool CapByCopy = DeclAndBits.getInt() & Capture_ByCopy;
anatofuz
parents:
diff changeset
1083 if (capturesThis())
anatofuz
parents:
diff changeset
1084 return CapByCopy ? LCK_StarThis : LCK_This;
anatofuz
parents:
diff changeset
1085 return CapByCopy ? LCK_ByCopy : LCK_ByRef;
anatofuz
parents:
diff changeset
1086 }
anatofuz
parents:
diff changeset
1087
anatofuz
parents:
diff changeset
1088 LambdaExpr::LambdaExpr(QualType T, SourceRange IntroducerRange,
anatofuz
parents:
diff changeset
1089 LambdaCaptureDefault CaptureDefault,
anatofuz
parents:
diff changeset
1090 SourceLocation CaptureDefaultLoc,
anatofuz
parents:
diff changeset
1091 ArrayRef<LambdaCapture> Captures, bool ExplicitParams,
anatofuz
parents:
diff changeset
1092 bool ExplicitResultType, ArrayRef<Expr *> CaptureInits,
anatofuz
parents:
diff changeset
1093 SourceLocation ClosingBrace,
anatofuz
parents:
diff changeset
1094 bool ContainsUnexpandedParameterPack)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1095 : Expr(LambdaExprClass, T, VK_RValue, OK_Ordinary),
150
anatofuz
parents:
diff changeset
1096 IntroducerRange(IntroducerRange), CaptureDefaultLoc(CaptureDefaultLoc),
anatofuz
parents:
diff changeset
1097 NumCaptures(Captures.size()), CaptureDefault(CaptureDefault),
anatofuz
parents:
diff changeset
1098 ExplicitParams(ExplicitParams), ExplicitResultType(ExplicitResultType),
anatofuz
parents:
diff changeset
1099 ClosingBrace(ClosingBrace) {
anatofuz
parents:
diff changeset
1100 assert(CaptureInits.size() == Captures.size() && "Wrong number of arguments");
anatofuz
parents:
diff changeset
1101 CXXRecordDecl *Class = getLambdaClass();
anatofuz
parents:
diff changeset
1102 CXXRecordDecl::LambdaDefinitionData &Data = Class->getLambdaData();
anatofuz
parents:
diff changeset
1103
anatofuz
parents:
diff changeset
1104 // FIXME: Propagate "has unexpanded parameter pack" bit.
anatofuz
parents:
diff changeset
1105
anatofuz
parents:
diff changeset
1106 // Copy captures.
anatofuz
parents:
diff changeset
1107 const ASTContext &Context = Class->getASTContext();
anatofuz
parents:
diff changeset
1108 Data.NumCaptures = NumCaptures;
anatofuz
parents:
diff changeset
1109 Data.NumExplicitCaptures = 0;
anatofuz
parents:
diff changeset
1110 Data.Captures =
anatofuz
parents:
diff changeset
1111 (LambdaCapture *)Context.Allocate(sizeof(LambdaCapture) * NumCaptures);
anatofuz
parents:
diff changeset
1112 LambdaCapture *ToCapture = Data.Captures;
anatofuz
parents:
diff changeset
1113 for (unsigned I = 0, N = Captures.size(); I != N; ++I) {
anatofuz
parents:
diff changeset
1114 if (Captures[I].isExplicit())
anatofuz
parents:
diff changeset
1115 ++Data.NumExplicitCaptures;
anatofuz
parents:
diff changeset
1116
anatofuz
parents:
diff changeset
1117 *ToCapture++ = Captures[I];
anatofuz
parents:
diff changeset
1118 }
anatofuz
parents:
diff changeset
1119
anatofuz
parents:
diff changeset
1120 // Copy initialization expressions for the non-static data members.
anatofuz
parents:
diff changeset
1121 Stmt **Stored = getStoredStmts();
anatofuz
parents:
diff changeset
1122 for (unsigned I = 0, N = CaptureInits.size(); I != N; ++I)
anatofuz
parents:
diff changeset
1123 *Stored++ = CaptureInits[I];
anatofuz
parents:
diff changeset
1124
anatofuz
parents:
diff changeset
1125 // Copy the body of the lambda.
anatofuz
parents:
diff changeset
1126 *Stored++ = getCallOperator()->getBody();
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1127
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1128 setDependence(computeDependence(this, ContainsUnexpandedParameterPack));
150
anatofuz
parents:
diff changeset
1129 }
anatofuz
parents:
diff changeset
1130
anatofuz
parents:
diff changeset
1131 LambdaExpr *LambdaExpr::Create(
anatofuz
parents:
diff changeset
1132 const ASTContext &Context, CXXRecordDecl *Class,
anatofuz
parents:
diff changeset
1133 SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault,
anatofuz
parents:
diff changeset
1134 SourceLocation CaptureDefaultLoc, ArrayRef<LambdaCapture> Captures,
anatofuz
parents:
diff changeset
1135 bool ExplicitParams, bool ExplicitResultType, ArrayRef<Expr *> CaptureInits,
anatofuz
parents:
diff changeset
1136 SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack) {
anatofuz
parents:
diff changeset
1137 // Determine the type of the expression (i.e., the type of the
anatofuz
parents:
diff changeset
1138 // function object we're creating).
anatofuz
parents:
diff changeset
1139 QualType T = Context.getTypeDeclType(Class);
anatofuz
parents:
diff changeset
1140
anatofuz
parents:
diff changeset
1141 unsigned Size = totalSizeToAlloc<Stmt *>(Captures.size() + 1);
anatofuz
parents:
diff changeset
1142 void *Mem = Context.Allocate(Size);
anatofuz
parents:
diff changeset
1143 return new (Mem)
anatofuz
parents:
diff changeset
1144 LambdaExpr(T, IntroducerRange, CaptureDefault, CaptureDefaultLoc,
anatofuz
parents:
diff changeset
1145 Captures, ExplicitParams, ExplicitResultType, CaptureInits,
anatofuz
parents:
diff changeset
1146 ClosingBrace, ContainsUnexpandedParameterPack);
anatofuz
parents:
diff changeset
1147 }
anatofuz
parents:
diff changeset
1148
anatofuz
parents:
diff changeset
1149 LambdaExpr *LambdaExpr::CreateDeserialized(const ASTContext &C,
anatofuz
parents:
diff changeset
1150 unsigned NumCaptures) {
anatofuz
parents:
diff changeset
1151 unsigned Size = totalSizeToAlloc<Stmt *>(NumCaptures + 1);
anatofuz
parents:
diff changeset
1152 void *Mem = C.Allocate(Size);
anatofuz
parents:
diff changeset
1153 return new (Mem) LambdaExpr(EmptyShell(), NumCaptures);
anatofuz
parents:
diff changeset
1154 }
anatofuz
parents:
diff changeset
1155
anatofuz
parents:
diff changeset
1156 bool LambdaExpr::isInitCapture(const LambdaCapture *C) const {
anatofuz
parents:
diff changeset
1157 return (C->capturesVariable() && C->getCapturedVar()->isInitCapture() &&
anatofuz
parents:
diff changeset
1158 (getCallOperator() == C->getCapturedVar()->getDeclContext()));
anatofuz
parents:
diff changeset
1159 }
anatofuz
parents:
diff changeset
1160
anatofuz
parents:
diff changeset
1161 LambdaExpr::capture_iterator LambdaExpr::capture_begin() const {
anatofuz
parents:
diff changeset
1162 return getLambdaClass()->getLambdaData().Captures;
anatofuz
parents:
diff changeset
1163 }
anatofuz
parents:
diff changeset
1164
anatofuz
parents:
diff changeset
1165 LambdaExpr::capture_iterator LambdaExpr::capture_end() const {
anatofuz
parents:
diff changeset
1166 return capture_begin() + NumCaptures;
anatofuz
parents:
diff changeset
1167 }
anatofuz
parents:
diff changeset
1168
anatofuz
parents:
diff changeset
1169 LambdaExpr::capture_range LambdaExpr::captures() const {
anatofuz
parents:
diff changeset
1170 return capture_range(capture_begin(), capture_end());
anatofuz
parents:
diff changeset
1171 }
anatofuz
parents:
diff changeset
1172
anatofuz
parents:
diff changeset
1173 LambdaExpr::capture_iterator LambdaExpr::explicit_capture_begin() const {
anatofuz
parents:
diff changeset
1174 return capture_begin();
anatofuz
parents:
diff changeset
1175 }
anatofuz
parents:
diff changeset
1176
anatofuz
parents:
diff changeset
1177 LambdaExpr::capture_iterator LambdaExpr::explicit_capture_end() const {
anatofuz
parents:
diff changeset
1178 struct CXXRecordDecl::LambdaDefinitionData &Data
anatofuz
parents:
diff changeset
1179 = getLambdaClass()->getLambdaData();
anatofuz
parents:
diff changeset
1180 return Data.Captures + Data.NumExplicitCaptures;
anatofuz
parents:
diff changeset
1181 }
anatofuz
parents:
diff changeset
1182
anatofuz
parents:
diff changeset
1183 LambdaExpr::capture_range LambdaExpr::explicit_captures() const {
anatofuz
parents:
diff changeset
1184 return capture_range(explicit_capture_begin(), explicit_capture_end());
anatofuz
parents:
diff changeset
1185 }
anatofuz
parents:
diff changeset
1186
anatofuz
parents:
diff changeset
1187 LambdaExpr::capture_iterator LambdaExpr::implicit_capture_begin() const {
anatofuz
parents:
diff changeset
1188 return explicit_capture_end();
anatofuz
parents:
diff changeset
1189 }
anatofuz
parents:
diff changeset
1190
anatofuz
parents:
diff changeset
1191 LambdaExpr::capture_iterator LambdaExpr::implicit_capture_end() const {
anatofuz
parents:
diff changeset
1192 return capture_end();
anatofuz
parents:
diff changeset
1193 }
anatofuz
parents:
diff changeset
1194
anatofuz
parents:
diff changeset
1195 LambdaExpr::capture_range LambdaExpr::implicit_captures() const {
anatofuz
parents:
diff changeset
1196 return capture_range(implicit_capture_begin(), implicit_capture_end());
anatofuz
parents:
diff changeset
1197 }
anatofuz
parents:
diff changeset
1198
anatofuz
parents:
diff changeset
1199 CXXRecordDecl *LambdaExpr::getLambdaClass() const {
anatofuz
parents:
diff changeset
1200 return getType()->getAsCXXRecordDecl();
anatofuz
parents:
diff changeset
1201 }
anatofuz
parents:
diff changeset
1202
anatofuz
parents:
diff changeset
1203 CXXMethodDecl *LambdaExpr::getCallOperator() const {
anatofuz
parents:
diff changeset
1204 CXXRecordDecl *Record = getLambdaClass();
anatofuz
parents:
diff changeset
1205 return Record->getLambdaCallOperator();
anatofuz
parents:
diff changeset
1206 }
anatofuz
parents:
diff changeset
1207
anatofuz
parents:
diff changeset
1208 FunctionTemplateDecl *LambdaExpr::getDependentCallOperator() const {
anatofuz
parents:
diff changeset
1209 CXXRecordDecl *Record = getLambdaClass();
anatofuz
parents:
diff changeset
1210 return Record->getDependentLambdaCallOperator();
anatofuz
parents:
diff changeset
1211 }
anatofuz
parents:
diff changeset
1212
anatofuz
parents:
diff changeset
1213 TemplateParameterList *LambdaExpr::getTemplateParameterList() const {
anatofuz
parents:
diff changeset
1214 CXXRecordDecl *Record = getLambdaClass();
anatofuz
parents:
diff changeset
1215 return Record->getGenericLambdaTemplateParameterList();
anatofuz
parents:
diff changeset
1216 }
anatofuz
parents:
diff changeset
1217
anatofuz
parents:
diff changeset
1218 ArrayRef<NamedDecl *> LambdaExpr::getExplicitTemplateParameters() const {
anatofuz
parents:
diff changeset
1219 const CXXRecordDecl *Record = getLambdaClass();
anatofuz
parents:
diff changeset
1220 return Record->getLambdaExplicitTemplateParameters();
anatofuz
parents:
diff changeset
1221 }
anatofuz
parents:
diff changeset
1222
anatofuz
parents:
diff changeset
1223 CompoundStmt *LambdaExpr::getBody() const {
anatofuz
parents:
diff changeset
1224 // FIXME: this mutation in getBody is bogus. It should be
anatofuz
parents:
diff changeset
1225 // initialized in ASTStmtReader::VisitLambdaExpr, but for reasons I
anatofuz
parents:
diff changeset
1226 // don't understand, that doesn't work.
anatofuz
parents:
diff changeset
1227 if (!getStoredStmts()[NumCaptures])
anatofuz
parents:
diff changeset
1228 *const_cast<Stmt **>(&getStoredStmts()[NumCaptures]) =
anatofuz
parents:
diff changeset
1229 getCallOperator()->getBody();
anatofuz
parents:
diff changeset
1230
anatofuz
parents:
diff changeset
1231 return static_cast<CompoundStmt *>(getStoredStmts()[NumCaptures]);
anatofuz
parents:
diff changeset
1232 }
anatofuz
parents:
diff changeset
1233
anatofuz
parents:
diff changeset
1234 bool LambdaExpr::isMutable() const {
anatofuz
parents:
diff changeset
1235 return !getCallOperator()->isConst();
anatofuz
parents:
diff changeset
1236 }
anatofuz
parents:
diff changeset
1237
anatofuz
parents:
diff changeset
1238 ExprWithCleanups::ExprWithCleanups(Expr *subexpr,
anatofuz
parents:
diff changeset
1239 bool CleanupsHaveSideEffects,
anatofuz
parents:
diff changeset
1240 ArrayRef<CleanupObject> objects)
anatofuz
parents:
diff changeset
1241 : FullExpr(ExprWithCleanupsClass, subexpr) {
anatofuz
parents:
diff changeset
1242 ExprWithCleanupsBits.CleanupsHaveSideEffects = CleanupsHaveSideEffects;
anatofuz
parents:
diff changeset
1243 ExprWithCleanupsBits.NumObjects = objects.size();
anatofuz
parents:
diff changeset
1244 for (unsigned i = 0, e = objects.size(); i != e; ++i)
anatofuz
parents:
diff changeset
1245 getTrailingObjects<CleanupObject>()[i] = objects[i];
anatofuz
parents:
diff changeset
1246 }
anatofuz
parents:
diff changeset
1247
anatofuz
parents:
diff changeset
1248 ExprWithCleanups *ExprWithCleanups::Create(const ASTContext &C, Expr *subexpr,
anatofuz
parents:
diff changeset
1249 bool CleanupsHaveSideEffects,
anatofuz
parents:
diff changeset
1250 ArrayRef<CleanupObject> objects) {
anatofuz
parents:
diff changeset
1251 void *buffer = C.Allocate(totalSizeToAlloc<CleanupObject>(objects.size()),
anatofuz
parents:
diff changeset
1252 alignof(ExprWithCleanups));
anatofuz
parents:
diff changeset
1253 return new (buffer)
anatofuz
parents:
diff changeset
1254 ExprWithCleanups(subexpr, CleanupsHaveSideEffects, objects);
anatofuz
parents:
diff changeset
1255 }
anatofuz
parents:
diff changeset
1256
anatofuz
parents:
diff changeset
1257 ExprWithCleanups::ExprWithCleanups(EmptyShell empty, unsigned numObjects)
anatofuz
parents:
diff changeset
1258 : FullExpr(ExprWithCleanupsClass, empty) {
anatofuz
parents:
diff changeset
1259 ExprWithCleanupsBits.NumObjects = numObjects;
anatofuz
parents:
diff changeset
1260 }
anatofuz
parents:
diff changeset
1261
anatofuz
parents:
diff changeset
1262 ExprWithCleanups *ExprWithCleanups::Create(const ASTContext &C,
anatofuz
parents:
diff changeset
1263 EmptyShell empty,
anatofuz
parents:
diff changeset
1264 unsigned numObjects) {
anatofuz
parents:
diff changeset
1265 void *buffer = C.Allocate(totalSizeToAlloc<CleanupObject>(numObjects),
anatofuz
parents:
diff changeset
1266 alignof(ExprWithCleanups));
anatofuz
parents:
diff changeset
1267 return new (buffer) ExprWithCleanups(empty, numObjects);
anatofuz
parents:
diff changeset
1268 }
anatofuz
parents:
diff changeset
1269
anatofuz
parents:
diff changeset
1270 CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *TSI,
anatofuz
parents:
diff changeset
1271 SourceLocation LParenLoc,
anatofuz
parents:
diff changeset
1272 ArrayRef<Expr *> Args,
anatofuz
parents:
diff changeset
1273 SourceLocation RParenLoc)
anatofuz
parents:
diff changeset
1274 : Expr(CXXUnresolvedConstructExprClass,
anatofuz
parents:
diff changeset
1275 TSI->getType().getNonReferenceType(),
anatofuz
parents:
diff changeset
1276 (TSI->getType()->isLValueReferenceType()
anatofuz
parents:
diff changeset
1277 ? VK_LValue
anatofuz
parents:
diff changeset
1278 : TSI->getType()->isRValueReferenceType() ? VK_XValue
anatofuz
parents:
diff changeset
1279 : VK_RValue),
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1280 OK_Ordinary),
150
anatofuz
parents:
diff changeset
1281 TSI(TSI), LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
anatofuz
parents:
diff changeset
1282 CXXUnresolvedConstructExprBits.NumArgs = Args.size();
anatofuz
parents:
diff changeset
1283 auto **StoredArgs = getTrailingObjects<Expr *>();
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1284 for (unsigned I = 0; I != Args.size(); ++I)
150
anatofuz
parents:
diff changeset
1285 StoredArgs[I] = Args[I];
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1286 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
1287 }
anatofuz
parents:
diff changeset
1288
anatofuz
parents:
diff changeset
1289 CXXUnresolvedConstructExpr *CXXUnresolvedConstructExpr::Create(
anatofuz
parents:
diff changeset
1290 const ASTContext &Context, TypeSourceInfo *TSI, SourceLocation LParenLoc,
anatofuz
parents:
diff changeset
1291 ArrayRef<Expr *> Args, SourceLocation RParenLoc) {
anatofuz
parents:
diff changeset
1292 void *Mem = Context.Allocate(totalSizeToAlloc<Expr *>(Args.size()));
anatofuz
parents:
diff changeset
1293 return new (Mem) CXXUnresolvedConstructExpr(TSI, LParenLoc, Args, RParenLoc);
anatofuz
parents:
diff changeset
1294 }
anatofuz
parents:
diff changeset
1295
anatofuz
parents:
diff changeset
1296 CXXUnresolvedConstructExpr *
anatofuz
parents:
diff changeset
1297 CXXUnresolvedConstructExpr::CreateEmpty(const ASTContext &Context,
anatofuz
parents:
diff changeset
1298 unsigned NumArgs) {
anatofuz
parents:
diff changeset
1299 void *Mem = Context.Allocate(totalSizeToAlloc<Expr *>(NumArgs));
anatofuz
parents:
diff changeset
1300 return new (Mem) CXXUnresolvedConstructExpr(EmptyShell(), NumArgs);
anatofuz
parents:
diff changeset
1301 }
anatofuz
parents:
diff changeset
1302
anatofuz
parents:
diff changeset
1303 SourceLocation CXXUnresolvedConstructExpr::getBeginLoc() const {
anatofuz
parents:
diff changeset
1304 return TSI->getTypeLoc().getBeginLoc();
anatofuz
parents:
diff changeset
1305 }
anatofuz
parents:
diff changeset
1306
anatofuz
parents:
diff changeset
1307 CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(
anatofuz
parents:
diff changeset
1308 const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow,
anatofuz
parents:
diff changeset
1309 SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
anatofuz
parents:
diff changeset
1310 SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
anatofuz
parents:
diff changeset
1311 DeclarationNameInfo MemberNameInfo,
anatofuz
parents:
diff changeset
1312 const TemplateArgumentListInfo *TemplateArgs)
anatofuz
parents:
diff changeset
1313 : Expr(CXXDependentScopeMemberExprClass, Ctx.DependentTy, VK_LValue,
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1314 OK_Ordinary),
150
anatofuz
parents:
diff changeset
1315 Base(Base), BaseType(BaseType), QualifierLoc(QualifierLoc),
anatofuz
parents:
diff changeset
1316 MemberNameInfo(MemberNameInfo) {
anatofuz
parents:
diff changeset
1317 CXXDependentScopeMemberExprBits.IsArrow = IsArrow;
anatofuz
parents:
diff changeset
1318 CXXDependentScopeMemberExprBits.HasTemplateKWAndArgsInfo =
anatofuz
parents:
diff changeset
1319 (TemplateArgs != nullptr) || TemplateKWLoc.isValid();
anatofuz
parents:
diff changeset
1320 CXXDependentScopeMemberExprBits.HasFirstQualifierFoundInScope =
anatofuz
parents:
diff changeset
1321 FirstQualifierFoundInScope != nullptr;
anatofuz
parents:
diff changeset
1322 CXXDependentScopeMemberExprBits.OperatorLoc = OperatorLoc;
anatofuz
parents:
diff changeset
1323
anatofuz
parents:
diff changeset
1324 if (TemplateArgs) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1325 auto Deps = TemplateArgumentDependence::None;
150
anatofuz
parents:
diff changeset
1326 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
anatofuz
parents:
diff changeset
1327 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1328 Deps);
150
anatofuz
parents:
diff changeset
1329 } else if (TemplateKWLoc.isValid()) {
anatofuz
parents:
diff changeset
1330 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
anatofuz
parents:
diff changeset
1331 TemplateKWLoc);
anatofuz
parents:
diff changeset
1332 }
anatofuz
parents:
diff changeset
1333
anatofuz
parents:
diff changeset
1334 if (hasFirstQualifierFoundInScope())
anatofuz
parents:
diff changeset
1335 *getTrailingObjects<NamedDecl *>() = FirstQualifierFoundInScope;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1336 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
1337 }
anatofuz
parents:
diff changeset
1338
anatofuz
parents:
diff changeset
1339 CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(
anatofuz
parents:
diff changeset
1340 EmptyShell Empty, bool HasTemplateKWAndArgsInfo,
anatofuz
parents:
diff changeset
1341 bool HasFirstQualifierFoundInScope)
anatofuz
parents:
diff changeset
1342 : Expr(CXXDependentScopeMemberExprClass, Empty) {
anatofuz
parents:
diff changeset
1343 CXXDependentScopeMemberExprBits.HasTemplateKWAndArgsInfo =
anatofuz
parents:
diff changeset
1344 HasTemplateKWAndArgsInfo;
anatofuz
parents:
diff changeset
1345 CXXDependentScopeMemberExprBits.HasFirstQualifierFoundInScope =
anatofuz
parents:
diff changeset
1346 HasFirstQualifierFoundInScope;
anatofuz
parents:
diff changeset
1347 }
anatofuz
parents:
diff changeset
1348
anatofuz
parents:
diff changeset
1349 CXXDependentScopeMemberExpr *CXXDependentScopeMemberExpr::Create(
anatofuz
parents:
diff changeset
1350 const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow,
anatofuz
parents:
diff changeset
1351 SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
anatofuz
parents:
diff changeset
1352 SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
anatofuz
parents:
diff changeset
1353 DeclarationNameInfo MemberNameInfo,
anatofuz
parents:
diff changeset
1354 const TemplateArgumentListInfo *TemplateArgs) {
anatofuz
parents:
diff changeset
1355 bool HasTemplateKWAndArgsInfo =
anatofuz
parents:
diff changeset
1356 (TemplateArgs != nullptr) || TemplateKWLoc.isValid();
anatofuz
parents:
diff changeset
1357 unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->size() : 0;
anatofuz
parents:
diff changeset
1358 bool HasFirstQualifierFoundInScope = FirstQualifierFoundInScope != nullptr;
anatofuz
parents:
diff changeset
1359
anatofuz
parents:
diff changeset
1360 unsigned Size = totalSizeToAlloc<ASTTemplateKWAndArgsInfo,
anatofuz
parents:
diff changeset
1361 TemplateArgumentLoc, NamedDecl *>(
anatofuz
parents:
diff changeset
1362 HasTemplateKWAndArgsInfo, NumTemplateArgs, HasFirstQualifierFoundInScope);
anatofuz
parents:
diff changeset
1363
anatofuz
parents:
diff changeset
1364 void *Mem = Ctx.Allocate(Size, alignof(CXXDependentScopeMemberExpr));
anatofuz
parents:
diff changeset
1365 return new (Mem) CXXDependentScopeMemberExpr(
anatofuz
parents:
diff changeset
1366 Ctx, Base, BaseType, IsArrow, OperatorLoc, QualifierLoc, TemplateKWLoc,
anatofuz
parents:
diff changeset
1367 FirstQualifierFoundInScope, MemberNameInfo, TemplateArgs);
anatofuz
parents:
diff changeset
1368 }
anatofuz
parents:
diff changeset
1369
anatofuz
parents:
diff changeset
1370 CXXDependentScopeMemberExpr *CXXDependentScopeMemberExpr::CreateEmpty(
anatofuz
parents:
diff changeset
1371 const ASTContext &Ctx, bool HasTemplateKWAndArgsInfo,
anatofuz
parents:
diff changeset
1372 unsigned NumTemplateArgs, bool HasFirstQualifierFoundInScope) {
anatofuz
parents:
diff changeset
1373 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
anatofuz
parents:
diff changeset
1374
anatofuz
parents:
diff changeset
1375 unsigned Size = totalSizeToAlloc<ASTTemplateKWAndArgsInfo,
anatofuz
parents:
diff changeset
1376 TemplateArgumentLoc, NamedDecl *>(
anatofuz
parents:
diff changeset
1377 HasTemplateKWAndArgsInfo, NumTemplateArgs, HasFirstQualifierFoundInScope);
anatofuz
parents:
diff changeset
1378
anatofuz
parents:
diff changeset
1379 void *Mem = Ctx.Allocate(Size, alignof(CXXDependentScopeMemberExpr));
anatofuz
parents:
diff changeset
1380 return new (Mem) CXXDependentScopeMemberExpr(
anatofuz
parents:
diff changeset
1381 EmptyShell(), HasTemplateKWAndArgsInfo, HasFirstQualifierFoundInScope);
anatofuz
parents:
diff changeset
1382 }
anatofuz
parents:
diff changeset
1383
anatofuz
parents:
diff changeset
1384 static bool hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin,
anatofuz
parents:
diff changeset
1385 UnresolvedSetIterator end) {
anatofuz
parents:
diff changeset
1386 do {
anatofuz
parents:
diff changeset
1387 NamedDecl *decl = *begin;
anatofuz
parents:
diff changeset
1388 if (isa<UnresolvedUsingValueDecl>(decl))
anatofuz
parents:
diff changeset
1389 return false;
anatofuz
parents:
diff changeset
1390
anatofuz
parents:
diff changeset
1391 // Unresolved member expressions should only contain methods and
anatofuz
parents:
diff changeset
1392 // method templates.
anatofuz
parents:
diff changeset
1393 if (cast<CXXMethodDecl>(decl->getUnderlyingDecl()->getAsFunction())
anatofuz
parents:
diff changeset
1394 ->isStatic())
anatofuz
parents:
diff changeset
1395 return false;
anatofuz
parents:
diff changeset
1396 } while (++begin != end);
anatofuz
parents:
diff changeset
1397
anatofuz
parents:
diff changeset
1398 return true;
anatofuz
parents:
diff changeset
1399 }
anatofuz
parents:
diff changeset
1400
anatofuz
parents:
diff changeset
1401 UnresolvedMemberExpr::UnresolvedMemberExpr(
anatofuz
parents:
diff changeset
1402 const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base,
anatofuz
parents:
diff changeset
1403 QualType BaseType, bool IsArrow, SourceLocation OperatorLoc,
anatofuz
parents:
diff changeset
1404 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
anatofuz
parents:
diff changeset
1405 const DeclarationNameInfo &MemberNameInfo,
anatofuz
parents:
diff changeset
1406 const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin,
anatofuz
parents:
diff changeset
1407 UnresolvedSetIterator End)
anatofuz
parents:
diff changeset
1408 : OverloadExpr(
anatofuz
parents:
diff changeset
1409 UnresolvedMemberExprClass, Context, QualifierLoc, TemplateKWLoc,
anatofuz
parents:
diff changeset
1410 MemberNameInfo, TemplateArgs, Begin, End,
anatofuz
parents:
diff changeset
1411 // Dependent
anatofuz
parents:
diff changeset
1412 ((Base && Base->isTypeDependent()) || BaseType->isDependentType()),
anatofuz
parents:
diff changeset
1413 ((Base && Base->isInstantiationDependent()) ||
anatofuz
parents:
diff changeset
1414 BaseType->isInstantiationDependentType()),
anatofuz
parents:
diff changeset
1415 // Contains unexpanded parameter pack
anatofuz
parents:
diff changeset
1416 ((Base && Base->containsUnexpandedParameterPack()) ||
anatofuz
parents:
diff changeset
1417 BaseType->containsUnexpandedParameterPack())),
anatofuz
parents:
diff changeset
1418 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
anatofuz
parents:
diff changeset
1419 UnresolvedMemberExprBits.IsArrow = IsArrow;
anatofuz
parents:
diff changeset
1420 UnresolvedMemberExprBits.HasUnresolvedUsing = HasUnresolvedUsing;
anatofuz
parents:
diff changeset
1421
anatofuz
parents:
diff changeset
1422 // Check whether all of the members are non-static member functions,
anatofuz
parents:
diff changeset
1423 // and if so, mark give this bound-member type instead of overload type.
anatofuz
parents:
diff changeset
1424 if (hasOnlyNonStaticMemberFunctions(Begin, End))
anatofuz
parents:
diff changeset
1425 setType(Context.BoundMemberTy);
anatofuz
parents:
diff changeset
1426 }
anatofuz
parents:
diff changeset
1427
anatofuz
parents:
diff changeset
1428 UnresolvedMemberExpr::UnresolvedMemberExpr(EmptyShell Empty,
anatofuz
parents:
diff changeset
1429 unsigned NumResults,
anatofuz
parents:
diff changeset
1430 bool HasTemplateKWAndArgsInfo)
anatofuz
parents:
diff changeset
1431 : OverloadExpr(UnresolvedMemberExprClass, Empty, NumResults,
anatofuz
parents:
diff changeset
1432 HasTemplateKWAndArgsInfo) {}
anatofuz
parents:
diff changeset
1433
anatofuz
parents:
diff changeset
1434 bool UnresolvedMemberExpr::isImplicitAccess() const {
anatofuz
parents:
diff changeset
1435 if (!Base)
anatofuz
parents:
diff changeset
1436 return true;
anatofuz
parents:
diff changeset
1437
anatofuz
parents:
diff changeset
1438 return cast<Expr>(Base)->isImplicitCXXThis();
anatofuz
parents:
diff changeset
1439 }
anatofuz
parents:
diff changeset
1440
anatofuz
parents:
diff changeset
1441 UnresolvedMemberExpr *UnresolvedMemberExpr::Create(
anatofuz
parents:
diff changeset
1442 const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base,
anatofuz
parents:
diff changeset
1443 QualType BaseType, bool IsArrow, SourceLocation OperatorLoc,
anatofuz
parents:
diff changeset
1444 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
anatofuz
parents:
diff changeset
1445 const DeclarationNameInfo &MemberNameInfo,
anatofuz
parents:
diff changeset
1446 const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin,
anatofuz
parents:
diff changeset
1447 UnresolvedSetIterator End) {
anatofuz
parents:
diff changeset
1448 unsigned NumResults = End - Begin;
anatofuz
parents:
diff changeset
1449 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid();
anatofuz
parents:
diff changeset
1450 unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->size() : 0;
anatofuz
parents:
diff changeset
1451 unsigned Size = totalSizeToAlloc<DeclAccessPair, ASTTemplateKWAndArgsInfo,
anatofuz
parents:
diff changeset
1452 TemplateArgumentLoc>(
anatofuz
parents:
diff changeset
1453 NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
anatofuz
parents:
diff changeset
1454 void *Mem = Context.Allocate(Size, alignof(UnresolvedMemberExpr));
anatofuz
parents:
diff changeset
1455 return new (Mem) UnresolvedMemberExpr(
anatofuz
parents:
diff changeset
1456 Context, HasUnresolvedUsing, Base, BaseType, IsArrow, OperatorLoc,
anatofuz
parents:
diff changeset
1457 QualifierLoc, TemplateKWLoc, MemberNameInfo, TemplateArgs, Begin, End);
anatofuz
parents:
diff changeset
1458 }
anatofuz
parents:
diff changeset
1459
anatofuz
parents:
diff changeset
1460 UnresolvedMemberExpr *UnresolvedMemberExpr::CreateEmpty(
anatofuz
parents:
diff changeset
1461 const ASTContext &Context, unsigned NumResults,
anatofuz
parents:
diff changeset
1462 bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs) {
anatofuz
parents:
diff changeset
1463 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
anatofuz
parents:
diff changeset
1464 unsigned Size = totalSizeToAlloc<DeclAccessPair, ASTTemplateKWAndArgsInfo,
anatofuz
parents:
diff changeset
1465 TemplateArgumentLoc>(
anatofuz
parents:
diff changeset
1466 NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
anatofuz
parents:
diff changeset
1467 void *Mem = Context.Allocate(Size, alignof(UnresolvedMemberExpr));
anatofuz
parents:
diff changeset
1468 return new (Mem)
anatofuz
parents:
diff changeset
1469 UnresolvedMemberExpr(EmptyShell(), NumResults, HasTemplateKWAndArgsInfo);
anatofuz
parents:
diff changeset
1470 }
anatofuz
parents:
diff changeset
1471
anatofuz
parents:
diff changeset
1472 CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() {
anatofuz
parents:
diff changeset
1473 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
anatofuz
parents:
diff changeset
1474
anatofuz
parents:
diff changeset
1475 // If there was a nested name specifier, it names the naming class.
anatofuz
parents:
diff changeset
1476 // It can't be dependent: after all, we were actually able to do the
anatofuz
parents:
diff changeset
1477 // lookup.
anatofuz
parents:
diff changeset
1478 CXXRecordDecl *Record = nullptr;
anatofuz
parents:
diff changeset
1479 auto *NNS = getQualifier();
anatofuz
parents:
diff changeset
1480 if (NNS && NNS->getKind() != NestedNameSpecifier::Super) {
anatofuz
parents:
diff changeset
1481 const Type *T = getQualifier()->getAsType();
anatofuz
parents:
diff changeset
1482 assert(T && "qualifier in member expression does not name type");
anatofuz
parents:
diff changeset
1483 Record = T->getAsCXXRecordDecl();
anatofuz
parents:
diff changeset
1484 assert(Record && "qualifier in member expression does not name record");
anatofuz
parents:
diff changeset
1485 }
anatofuz
parents:
diff changeset
1486 // Otherwise the naming class must have been the base class.
anatofuz
parents:
diff changeset
1487 else {
anatofuz
parents:
diff changeset
1488 QualType BaseType = getBaseType().getNonReferenceType();
anatofuz
parents:
diff changeset
1489 if (isArrow())
anatofuz
parents:
diff changeset
1490 BaseType = BaseType->castAs<PointerType>()->getPointeeType();
anatofuz
parents:
diff changeset
1491
anatofuz
parents:
diff changeset
1492 Record = BaseType->getAsCXXRecordDecl();
anatofuz
parents:
diff changeset
1493 assert(Record && "base of member expression does not name record");
anatofuz
parents:
diff changeset
1494 }
anatofuz
parents:
diff changeset
1495
anatofuz
parents:
diff changeset
1496 return Record;
anatofuz
parents:
diff changeset
1497 }
anatofuz
parents:
diff changeset
1498
anatofuz
parents:
diff changeset
1499 SizeOfPackExpr *
anatofuz
parents:
diff changeset
1500 SizeOfPackExpr::Create(ASTContext &Context, SourceLocation OperatorLoc,
anatofuz
parents:
diff changeset
1501 NamedDecl *Pack, SourceLocation PackLoc,
anatofuz
parents:
diff changeset
1502 SourceLocation RParenLoc,
anatofuz
parents:
diff changeset
1503 Optional<unsigned> Length,
anatofuz
parents:
diff changeset
1504 ArrayRef<TemplateArgument> PartialArgs) {
anatofuz
parents:
diff changeset
1505 void *Storage =
anatofuz
parents:
diff changeset
1506 Context.Allocate(totalSizeToAlloc<TemplateArgument>(PartialArgs.size()));
anatofuz
parents:
diff changeset
1507 return new (Storage) SizeOfPackExpr(Context.getSizeType(), OperatorLoc, Pack,
anatofuz
parents:
diff changeset
1508 PackLoc, RParenLoc, Length, PartialArgs);
anatofuz
parents:
diff changeset
1509 }
anatofuz
parents:
diff changeset
1510
anatofuz
parents:
diff changeset
1511 SizeOfPackExpr *SizeOfPackExpr::CreateDeserialized(ASTContext &Context,
anatofuz
parents:
diff changeset
1512 unsigned NumPartialArgs) {
anatofuz
parents:
diff changeset
1513 void *Storage =
anatofuz
parents:
diff changeset
1514 Context.Allocate(totalSizeToAlloc<TemplateArgument>(NumPartialArgs));
anatofuz
parents:
diff changeset
1515 return new (Storage) SizeOfPackExpr(EmptyShell(), NumPartialArgs);
anatofuz
parents:
diff changeset
1516 }
anatofuz
parents:
diff changeset
1517
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1518 SubstNonTypeTemplateParmPackExpr::SubstNonTypeTemplateParmPackExpr(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1519 QualType T, ExprValueKind ValueKind, NonTypeTemplateParmDecl *Param,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1520 SourceLocation NameLoc, const TemplateArgument &ArgPack)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1521 : Expr(SubstNonTypeTemplateParmPackExprClass, T, ValueKind, OK_Ordinary),
150
anatofuz
parents:
diff changeset
1522 Param(Param), Arguments(ArgPack.pack_begin()),
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1523 NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1524 setDependence(ExprDependence::TypeValueInstantiation |
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1525 ExprDependence::UnexpandedPack);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1526 }
150
anatofuz
parents:
diff changeset
1527
anatofuz
parents:
diff changeset
1528 TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const {
anatofuz
parents:
diff changeset
1529 return TemplateArgument(llvm::makeArrayRef(Arguments, NumArguments));
anatofuz
parents:
diff changeset
1530 }
anatofuz
parents:
diff changeset
1531
anatofuz
parents:
diff changeset
1532 FunctionParmPackExpr::FunctionParmPackExpr(QualType T, VarDecl *ParamPack,
anatofuz
parents:
diff changeset
1533 SourceLocation NameLoc,
anatofuz
parents:
diff changeset
1534 unsigned NumParams,
anatofuz
parents:
diff changeset
1535 VarDecl *const *Params)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1536 : Expr(FunctionParmPackExprClass, T, VK_LValue, OK_Ordinary),
150
anatofuz
parents:
diff changeset
1537 ParamPack(ParamPack), NameLoc(NameLoc), NumParameters(NumParams) {
anatofuz
parents:
diff changeset
1538 if (Params)
anatofuz
parents:
diff changeset
1539 std::uninitialized_copy(Params, Params + NumParams,
anatofuz
parents:
diff changeset
1540 getTrailingObjects<VarDecl *>());
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1541 setDependence(ExprDependence::TypeValueInstantiation |
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1542 ExprDependence::UnexpandedPack);
150
anatofuz
parents:
diff changeset
1543 }
anatofuz
parents:
diff changeset
1544
anatofuz
parents:
diff changeset
1545 FunctionParmPackExpr *
anatofuz
parents:
diff changeset
1546 FunctionParmPackExpr::Create(const ASTContext &Context, QualType T,
anatofuz
parents:
diff changeset
1547 VarDecl *ParamPack, SourceLocation NameLoc,
anatofuz
parents:
diff changeset
1548 ArrayRef<VarDecl *> Params) {
anatofuz
parents:
diff changeset
1549 return new (Context.Allocate(totalSizeToAlloc<VarDecl *>(Params.size())))
anatofuz
parents:
diff changeset
1550 FunctionParmPackExpr(T, ParamPack, NameLoc, Params.size(), Params.data());
anatofuz
parents:
diff changeset
1551 }
anatofuz
parents:
diff changeset
1552
anatofuz
parents:
diff changeset
1553 FunctionParmPackExpr *
anatofuz
parents:
diff changeset
1554 FunctionParmPackExpr::CreateEmpty(const ASTContext &Context,
anatofuz
parents:
diff changeset
1555 unsigned NumParams) {
anatofuz
parents:
diff changeset
1556 return new (Context.Allocate(totalSizeToAlloc<VarDecl *>(NumParams)))
anatofuz
parents:
diff changeset
1557 FunctionParmPackExpr(QualType(), nullptr, SourceLocation(), 0, nullptr);
anatofuz
parents:
diff changeset
1558 }
anatofuz
parents:
diff changeset
1559
anatofuz
parents:
diff changeset
1560 MaterializeTemporaryExpr::MaterializeTemporaryExpr(
anatofuz
parents:
diff changeset
1561 QualType T, Expr *Temporary, bool BoundToLvalueReference,
anatofuz
parents:
diff changeset
1562 LifetimeExtendedTemporaryDecl *MTD)
anatofuz
parents:
diff changeset
1563 : Expr(MaterializeTemporaryExprClass, T,
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1564 BoundToLvalueReference ? VK_LValue : VK_XValue, OK_Ordinary) {
150
anatofuz
parents:
diff changeset
1565 if (MTD) {
anatofuz
parents:
diff changeset
1566 State = MTD;
anatofuz
parents:
diff changeset
1567 MTD->ExprWithTemporary = Temporary;
anatofuz
parents:
diff changeset
1568 return;
anatofuz
parents:
diff changeset
1569 }
anatofuz
parents:
diff changeset
1570 State = Temporary;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1571 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
1572 }
anatofuz
parents:
diff changeset
1573
anatofuz
parents:
diff changeset
1574 void MaterializeTemporaryExpr::setExtendingDecl(ValueDecl *ExtendedBy,
anatofuz
parents:
diff changeset
1575 unsigned ManglingNumber) {
anatofuz
parents:
diff changeset
1576 // We only need extra state if we have to remember more than just the Stmt.
anatofuz
parents:
diff changeset
1577 if (!ExtendedBy)
anatofuz
parents:
diff changeset
1578 return;
anatofuz
parents:
diff changeset
1579
anatofuz
parents:
diff changeset
1580 // We may need to allocate extra storage for the mangling number and the
anatofuz
parents:
diff changeset
1581 // extended-by ValueDecl.
anatofuz
parents:
diff changeset
1582 if (!State.is<LifetimeExtendedTemporaryDecl *>())
anatofuz
parents:
diff changeset
1583 State = LifetimeExtendedTemporaryDecl::Create(
anatofuz
parents:
diff changeset
1584 cast<Expr>(State.get<Stmt *>()), ExtendedBy, ManglingNumber);
anatofuz
parents:
diff changeset
1585
anatofuz
parents:
diff changeset
1586 auto ES = State.get<LifetimeExtendedTemporaryDecl *>();
anatofuz
parents:
diff changeset
1587 ES->ExtendingDecl = ExtendedBy;
anatofuz
parents:
diff changeset
1588 ES->ManglingNumber = ManglingNumber;
anatofuz
parents:
diff changeset
1589 }
anatofuz
parents:
diff changeset
1590
anatofuz
parents:
diff changeset
1591 TypeTraitExpr::TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind,
anatofuz
parents:
diff changeset
1592 ArrayRef<TypeSourceInfo *> Args,
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1593 SourceLocation RParenLoc, bool Value)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1594 : Expr(TypeTraitExprClass, T, VK_RValue, OK_Ordinary), Loc(Loc),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1595 RParenLoc(RParenLoc) {
150
anatofuz
parents:
diff changeset
1596 TypeTraitExprBits.Kind = Kind;
anatofuz
parents:
diff changeset
1597 TypeTraitExprBits.Value = Value;
anatofuz
parents:
diff changeset
1598 TypeTraitExprBits.NumArgs = Args.size();
anatofuz
parents:
diff changeset
1599
anatofuz
parents:
diff changeset
1600 auto **ToArgs = getTrailingObjects<TypeSourceInfo *>();
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1601 for (unsigned I = 0, N = Args.size(); I != N; ++I)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1602 ToArgs[I] = Args[I];
150
anatofuz
parents:
diff changeset
1603
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1604 setDependence(computeDependence(this));
150
anatofuz
parents:
diff changeset
1605 }
anatofuz
parents:
diff changeset
1606
anatofuz
parents:
diff changeset
1607 TypeTraitExpr *TypeTraitExpr::Create(const ASTContext &C, QualType T,
anatofuz
parents:
diff changeset
1608 SourceLocation Loc,
anatofuz
parents:
diff changeset
1609 TypeTrait Kind,
anatofuz
parents:
diff changeset
1610 ArrayRef<TypeSourceInfo *> Args,
anatofuz
parents:
diff changeset
1611 SourceLocation RParenLoc,
anatofuz
parents:
diff changeset
1612 bool Value) {
anatofuz
parents:
diff changeset
1613 void *Mem = C.Allocate(totalSizeToAlloc<TypeSourceInfo *>(Args.size()));
anatofuz
parents:
diff changeset
1614 return new (Mem) TypeTraitExpr(T, Loc, Kind, Args, RParenLoc, Value);
anatofuz
parents:
diff changeset
1615 }
anatofuz
parents:
diff changeset
1616
anatofuz
parents:
diff changeset
1617 TypeTraitExpr *TypeTraitExpr::CreateDeserialized(const ASTContext &C,
anatofuz
parents:
diff changeset
1618 unsigned NumArgs) {
anatofuz
parents:
diff changeset
1619 void *Mem = C.Allocate(totalSizeToAlloc<TypeSourceInfo *>(NumArgs));
anatofuz
parents:
diff changeset
1620 return new (Mem) TypeTraitExpr(EmptyShell());
anatofuz
parents:
diff changeset
1621 }
anatofuz
parents:
diff changeset
1622
anatofuz
parents:
diff changeset
1623 CUDAKernelCallExpr::CUDAKernelCallExpr(Expr *Fn, CallExpr *Config,
anatofuz
parents:
diff changeset
1624 ArrayRef<Expr *> Args, QualType Ty,
anatofuz
parents:
diff changeset
1625 ExprValueKind VK, SourceLocation RP,
anatofuz
parents:
diff changeset
1626 unsigned MinNumArgs)
anatofuz
parents:
diff changeset
1627 : CallExpr(CUDAKernelCallExprClass, Fn, /*PreArgs=*/Config, Args, Ty, VK,
anatofuz
parents:
diff changeset
1628 RP, MinNumArgs, NotADL) {}
anatofuz
parents:
diff changeset
1629
anatofuz
parents:
diff changeset
1630 CUDAKernelCallExpr::CUDAKernelCallExpr(unsigned NumArgs, EmptyShell Empty)
anatofuz
parents:
diff changeset
1631 : CallExpr(CUDAKernelCallExprClass, /*NumPreArgs=*/END_PREARG, NumArgs,
anatofuz
parents:
diff changeset
1632 Empty) {}
anatofuz
parents:
diff changeset
1633
anatofuz
parents:
diff changeset
1634 CUDAKernelCallExpr *
anatofuz
parents:
diff changeset
1635 CUDAKernelCallExpr::Create(const ASTContext &Ctx, Expr *Fn, CallExpr *Config,
anatofuz
parents:
diff changeset
1636 ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
anatofuz
parents:
diff changeset
1637 SourceLocation RP, unsigned MinNumArgs) {
anatofuz
parents:
diff changeset
1638 // Allocate storage for the trailing objects of CallExpr.
anatofuz
parents:
diff changeset
1639 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
anatofuz
parents:
diff changeset
1640 unsigned SizeOfTrailingObjects =
anatofuz
parents:
diff changeset
1641 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/END_PREARG, NumArgs);
anatofuz
parents:
diff changeset
1642 void *Mem = Ctx.Allocate(sizeof(CUDAKernelCallExpr) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
1643 alignof(CUDAKernelCallExpr));
anatofuz
parents:
diff changeset
1644 return new (Mem) CUDAKernelCallExpr(Fn, Config, Args, Ty, VK, RP, MinNumArgs);
anatofuz
parents:
diff changeset
1645 }
anatofuz
parents:
diff changeset
1646
anatofuz
parents:
diff changeset
1647 CUDAKernelCallExpr *CUDAKernelCallExpr::CreateEmpty(const ASTContext &Ctx,
anatofuz
parents:
diff changeset
1648 unsigned NumArgs,
anatofuz
parents:
diff changeset
1649 EmptyShell Empty) {
anatofuz
parents:
diff changeset
1650 // Allocate storage for the trailing objects of CallExpr.
anatofuz
parents:
diff changeset
1651 unsigned SizeOfTrailingObjects =
anatofuz
parents:
diff changeset
1652 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/END_PREARG, NumArgs);
anatofuz
parents:
diff changeset
1653 void *Mem = Ctx.Allocate(sizeof(CUDAKernelCallExpr) + SizeOfTrailingObjects,
anatofuz
parents:
diff changeset
1654 alignof(CUDAKernelCallExpr));
anatofuz
parents:
diff changeset
1655 return new (Mem) CUDAKernelCallExpr(NumArgs, Empty);
anatofuz
parents:
diff changeset
1656 }