Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===--- Expr.h - Classes for representing expressions ----------*- C++ -*-===// |
2 | // |
||
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
4 | // See https://llvm.org/LICENSE.txt for license information. |
||
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
6 | // |
||
7 | //===----------------------------------------------------------------------===// |
||
8 | // |
||
9 | // This file defines the Expr interface and subclasses. |
||
10 | // |
||
11 | //===----------------------------------------------------------------------===// |
||
12 | |||
13 | #ifndef LLVM_CLANG_AST_EXPR_H |
||
14 | #define LLVM_CLANG_AST_EXPR_H |
||
15 | |||
16 | #include "clang/AST/APValue.h" |
||
17 | #include "clang/AST/ASTVector.h" |
||
18 | #include "clang/AST/ComputeDependence.h" |
||
19 | #include "clang/AST/Decl.h" |
||
20 | #include "clang/AST/DeclAccessPair.h" |
||
21 | #include "clang/AST/DependenceFlags.h" |
||
22 | #include "clang/AST/OperationKinds.h" |
||
23 | #include "clang/AST/Stmt.h" |
||
24 | #include "clang/AST/TemplateBase.h" |
||
25 | #include "clang/AST/Type.h" |
||
26 | #include "clang/Basic/CharInfo.h" |
||
27 | #include "clang/Basic/LangOptions.h" |
||
28 | #include "clang/Basic/SyncScope.h" |
||
29 | #include "clang/Basic/TypeTraits.h" |
||
30 | #include "llvm/ADT/APFloat.h" |
||
31 | #include "llvm/ADT/APSInt.h" |
||
32 | #include "llvm/ADT/SmallVector.h" |
||
33 | #include "llvm/ADT/StringRef.h" |
||
34 | #include "llvm/ADT/iterator.h" |
||
35 | #include "llvm/ADT/iterator_range.h" |
||
36 | #include "llvm/Support/AtomicOrdering.h" |
||
37 | #include "llvm/Support/Compiler.h" |
||
38 | #include "llvm/Support/TrailingObjects.h" |
||
39 | #include <optional> |
||
40 | |||
41 | namespace clang { |
||
42 | class APValue; |
||
43 | class ASTContext; |
||
44 | class BlockDecl; |
||
45 | class CXXBaseSpecifier; |
||
46 | class CXXMemberCallExpr; |
||
47 | class CXXOperatorCallExpr; |
||
48 | class CastExpr; |
||
49 | class Decl; |
||
50 | class IdentifierInfo; |
||
51 | class MaterializeTemporaryExpr; |
||
52 | class NamedDecl; |
||
53 | class ObjCPropertyRefExpr; |
||
54 | class OpaqueValueExpr; |
||
55 | class ParmVarDecl; |
||
56 | class StringLiteral; |
||
57 | class TargetInfo; |
||
58 | class ValueDecl; |
||
59 | |||
60 | /// A simple array of base specifiers. |
||
61 | typedef SmallVector<CXXBaseSpecifier*, 4> CXXCastPath; |
||
62 | |||
63 | /// An adjustment to be made to the temporary created when emitting a |
||
64 | /// reference binding, which accesses a particular subobject of that temporary. |
||
65 | struct SubobjectAdjustment { |
||
66 | enum { |
||
67 | DerivedToBaseAdjustment, |
||
68 | FieldAdjustment, |
||
69 | MemberPointerAdjustment |
||
70 | } Kind; |
||
71 | |||
72 | struct DTB { |
||
73 | const CastExpr *BasePath; |
||
74 | const CXXRecordDecl *DerivedClass; |
||
75 | }; |
||
76 | |||
77 | struct P { |
||
78 | const MemberPointerType *MPT; |
||
79 | Expr *RHS; |
||
80 | }; |
||
81 | |||
82 | union { |
||
83 | struct DTB DerivedToBase; |
||
84 | FieldDecl *Field; |
||
85 | struct P Ptr; |
||
86 | }; |
||
87 | |||
88 | SubobjectAdjustment(const CastExpr *BasePath, |
||
89 | const CXXRecordDecl *DerivedClass) |
||
90 | : Kind(DerivedToBaseAdjustment) { |
||
91 | DerivedToBase.BasePath = BasePath; |
||
92 | DerivedToBase.DerivedClass = DerivedClass; |
||
93 | } |
||
94 | |||
95 | SubobjectAdjustment(FieldDecl *Field) |
||
96 | : Kind(FieldAdjustment) { |
||
97 | this->Field = Field; |
||
98 | } |
||
99 | |||
100 | SubobjectAdjustment(const MemberPointerType *MPT, Expr *RHS) |
||
101 | : Kind(MemberPointerAdjustment) { |
||
102 | this->Ptr.MPT = MPT; |
||
103 | this->Ptr.RHS = RHS; |
||
104 | } |
||
105 | }; |
||
106 | |||
107 | /// This represents one expression. Note that Expr's are subclasses of Stmt. |
||
108 | /// This allows an expression to be transparently used any place a Stmt is |
||
109 | /// required. |
||
110 | class Expr : public ValueStmt { |
||
111 | QualType TR; |
||
112 | |||
113 | public: |
||
114 | Expr() = delete; |
||
115 | Expr(const Expr&) = delete; |
||
116 | Expr(Expr &&) = delete; |
||
117 | Expr &operator=(const Expr&) = delete; |
||
118 | Expr &operator=(Expr&&) = delete; |
||
119 | |||
120 | protected: |
||
121 | Expr(StmtClass SC, QualType T, ExprValueKind VK, ExprObjectKind OK) |
||
122 | : ValueStmt(SC) { |
||
123 | ExprBits.Dependent = 0; |
||
124 | ExprBits.ValueKind = VK; |
||
125 | ExprBits.ObjectKind = OK; |
||
126 | assert(ExprBits.ObjectKind == OK && "truncated kind"); |
||
127 | setType(T); |
||
128 | } |
||
129 | |||
130 | /// Construct an empty expression. |
||
131 | explicit Expr(StmtClass SC, EmptyShell) : ValueStmt(SC) { } |
||
132 | |||
133 | /// Each concrete expr subclass is expected to compute its dependence and call |
||
134 | /// this in the constructor. |
||
135 | void setDependence(ExprDependence Deps) { |
||
136 | ExprBits.Dependent = static_cast<unsigned>(Deps); |
||
137 | } |
||
138 | friend class ASTImporter; // Sets dependence dircetly. |
||
139 | friend class ASTStmtReader; // Sets dependence dircetly. |
||
140 | |||
141 | public: |
||
142 | QualType getType() const { return TR; } |
||
143 | void setType(QualType t) { |
||
144 | // In C++, the type of an expression is always adjusted so that it |
||
145 | // will not have reference type (C++ [expr]p6). Use |
||
146 | // QualType::getNonReferenceType() to retrieve the non-reference |
||
147 | // type. Additionally, inspect Expr::isLvalue to determine whether |
||
148 | // an expression that is adjusted in this manner should be |
||
149 | // considered an lvalue. |
||
150 | assert((t.isNull() || !t->isReferenceType()) && |
||
151 | "Expressions can't have reference type"); |
||
152 | |||
153 | TR = t; |
||
154 | } |
||
155 | |||
156 | ExprDependence getDependence() const { |
||
157 | return static_cast<ExprDependence>(ExprBits.Dependent); |
||
158 | } |
||
159 | |||
160 | /// Determines whether the value of this expression depends on |
||
161 | /// - a template parameter (C++ [temp.dep.constexpr]) |
||
162 | /// - or an error, whose resolution is unknown |
||
163 | /// |
||
164 | /// For example, the array bound of "Chars" in the following example is |
||
165 | /// value-dependent. |
||
166 | /// @code |
||
167 | /// template<int Size, char (&Chars)[Size]> struct meta_string; |
||
168 | /// @endcode |
||
169 | bool isValueDependent() const { |
||
170 | return static_cast<bool>(getDependence() & ExprDependence::Value); |
||
171 | } |
||
172 | |||
173 | /// Determines whether the type of this expression depends on |
||
174 | /// - a template paramter (C++ [temp.dep.expr], which means that its type |
||
175 | /// could change from one template instantiation to the next) |
||
176 | /// - or an error |
||
177 | /// |
||
178 | /// For example, the expressions "x" and "x + y" are type-dependent in |
||
179 | /// the following code, but "y" is not type-dependent: |
||
180 | /// @code |
||
181 | /// template<typename T> |
||
182 | /// void add(T x, int y) { |
||
183 | /// x + y; |
||
184 | /// } |
||
185 | /// @endcode |
||
186 | bool isTypeDependent() const { |
||
187 | return static_cast<bool>(getDependence() & ExprDependence::Type); |
||
188 | } |
||
189 | |||
190 | /// Whether this expression is instantiation-dependent, meaning that |
||
191 | /// it depends in some way on |
||
192 | /// - a template parameter (even if neither its type nor (constant) value |
||
193 | /// can change due to the template instantiation) |
||
194 | /// - or an error |
||
195 | /// |
||
196 | /// In the following example, the expression \c sizeof(sizeof(T() + T())) is |
||
197 | /// instantiation-dependent (since it involves a template parameter \c T), but |
||
198 | /// is neither type- nor value-dependent, since the type of the inner |
||
199 | /// \c sizeof is known (\c std::size_t) and therefore the size of the outer |
||
200 | /// \c sizeof is known. |
||
201 | /// |
||
202 | /// \code |
||
203 | /// template<typename T> |
||
204 | /// void f(T x, T y) { |
||
205 | /// sizeof(sizeof(T() + T()); |
||
206 | /// } |
||
207 | /// \endcode |
||
208 | /// |
||
209 | /// \code |
||
210 | /// void func(int) { |
||
211 | /// func(); // the expression is instantiation-dependent, because it depends |
||
212 | /// // on an error. |
||
213 | /// } |
||
214 | /// \endcode |
||
215 | bool isInstantiationDependent() const { |
||
216 | return static_cast<bool>(getDependence() & ExprDependence::Instantiation); |
||
217 | } |
||
218 | |||
219 | /// Whether this expression contains an unexpanded parameter |
||
220 | /// pack (for C++11 variadic templates). |
||
221 | /// |
||
222 | /// Given the following function template: |
||
223 | /// |
||
224 | /// \code |
||
225 | /// template<typename F, typename ...Types> |
||
226 | /// void forward(const F &f, Types &&...args) { |
||
227 | /// f(static_cast<Types&&>(args)...); |
||
228 | /// } |
||
229 | /// \endcode |
||
230 | /// |
||
231 | /// The expressions \c args and \c static_cast<Types&&>(args) both |
||
232 | /// contain parameter packs. |
||
233 | bool containsUnexpandedParameterPack() const { |
||
234 | return static_cast<bool>(getDependence() & ExprDependence::UnexpandedPack); |
||
235 | } |
||
236 | |||
237 | /// Whether this expression contains subexpressions which had errors, e.g. a |
||
238 | /// TypoExpr. |
||
239 | bool containsErrors() const { |
||
240 | return static_cast<bool>(getDependence() & ExprDependence::Error); |
||
241 | } |
||
242 | |||
243 | /// getExprLoc - Return the preferred location for the arrow when diagnosing |
||
244 | /// a problem with a generic expression. |
||
245 | SourceLocation getExprLoc() const LLVM_READONLY; |
||
246 | |||
247 | /// Determine whether an lvalue-to-rvalue conversion should implicitly be |
||
248 | /// applied to this expression if it appears as a discarded-value expression |
||
249 | /// in C++11 onwards. This applies to certain forms of volatile glvalues. |
||
250 | bool isReadIfDiscardedInCPlusPlus11() const; |
||
251 | |||
252 | /// isUnusedResultAWarning - Return true if this immediate expression should |
||
253 | /// be warned about if the result is unused. If so, fill in expr, location, |
||
254 | /// and ranges with expr to warn on and source locations/ranges appropriate |
||
255 | /// for a warning. |
||
256 | bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc, |
||
257 | SourceRange &R1, SourceRange &R2, |
||
258 | ASTContext &Ctx) const; |
||
259 | |||
260 | /// isLValue - True if this expression is an "l-value" according to |
||
261 | /// the rules of the current language. C and C++ give somewhat |
||
262 | /// different rules for this concept, but in general, the result of |
||
263 | /// an l-value expression identifies a specific object whereas the |
||
264 | /// result of an r-value expression is a value detached from any |
||
265 | /// specific storage. |
||
266 | /// |
||
267 | /// C++11 divides the concept of "r-value" into pure r-values |
||
268 | /// ("pr-values") and so-called expiring values ("x-values"), which |
||
269 | /// identify specific objects that can be safely cannibalized for |
||
270 | /// their resources. |
||
271 | bool isLValue() const { return getValueKind() == VK_LValue; } |
||
272 | bool isPRValue() const { return getValueKind() == VK_PRValue; } |
||
273 | bool isXValue() const { return getValueKind() == VK_XValue; } |
||
274 | bool isGLValue() const { return getValueKind() != VK_PRValue; } |
||
275 | |||
276 | enum LValueClassification { |
||
277 | LV_Valid, |
||
278 | LV_NotObjectType, |
||
279 | LV_IncompleteVoidType, |
||
280 | LV_DuplicateVectorComponents, |
||
281 | LV_InvalidExpression, |
||
282 | LV_InvalidMessageExpression, |
||
283 | LV_MemberFunction, |
||
284 | LV_SubObjCPropertySetting, |
||
285 | LV_ClassTemporary, |
||
286 | LV_ArrayTemporary |
||
287 | }; |
||
288 | /// Reasons why an expression might not be an l-value. |
||
289 | LValueClassification ClassifyLValue(ASTContext &Ctx) const; |
||
290 | |||
291 | enum isModifiableLvalueResult { |
||
292 | MLV_Valid, |
||
293 | MLV_NotObjectType, |
||
294 | MLV_IncompleteVoidType, |
||
295 | MLV_DuplicateVectorComponents, |
||
296 | MLV_InvalidExpression, |
||
297 | MLV_LValueCast, // Specialized form of MLV_InvalidExpression. |
||
298 | MLV_IncompleteType, |
||
299 | MLV_ConstQualified, |
||
300 | MLV_ConstQualifiedField, |
||
301 | MLV_ConstAddrSpace, |
||
302 | MLV_ArrayType, |
||
303 | MLV_NoSetterProperty, |
||
304 | MLV_MemberFunction, |
||
305 | MLV_SubObjCPropertySetting, |
||
306 | MLV_InvalidMessageExpression, |
||
307 | MLV_ClassTemporary, |
||
308 | MLV_ArrayTemporary |
||
309 | }; |
||
310 | /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, |
||
311 | /// does not have an incomplete type, does not have a const-qualified type, |
||
312 | /// and if it is a structure or union, does not have any member (including, |
||
313 | /// recursively, any member or element of all contained aggregates or unions) |
||
314 | /// with a const-qualified type. |
||
315 | /// |
||
316 | /// \param Loc [in,out] - A source location which *may* be filled |
||
317 | /// in with the location of the expression making this a |
||
318 | /// non-modifiable lvalue, if specified. |
||
319 | isModifiableLvalueResult |
||
320 | isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc = nullptr) const; |
||
321 | |||
322 | /// The return type of classify(). Represents the C++11 expression |
||
323 | /// taxonomy. |
||
324 | class Classification { |
||
325 | public: |
||
326 | /// The various classification results. Most of these mean prvalue. |
||
327 | enum Kinds { |
||
328 | CL_LValue, |
||
329 | CL_XValue, |
||
330 | CL_Function, // Functions cannot be lvalues in C. |
||
331 | CL_Void, // Void cannot be an lvalue in C. |
||
332 | CL_AddressableVoid, // Void expression whose address can be taken in C. |
||
333 | CL_DuplicateVectorComponents, // A vector shuffle with dupes. |
||
334 | CL_MemberFunction, // An expression referring to a member function |
||
335 | CL_SubObjCPropertySetting, |
||
336 | CL_ClassTemporary, // A temporary of class type, or subobject thereof. |
||
337 | CL_ArrayTemporary, // A temporary of array type. |
||
338 | CL_ObjCMessageRValue, // ObjC message is an rvalue |
||
339 | CL_PRValue // A prvalue for any other reason, of any other type |
||
340 | }; |
||
341 | /// The results of modification testing. |
||
342 | enum ModifiableType { |
||
343 | CM_Untested, // testModifiable was false. |
||
344 | CM_Modifiable, |
||
345 | CM_RValue, // Not modifiable because it's an rvalue |
||
346 | CM_Function, // Not modifiable because it's a function; C++ only |
||
347 | CM_LValueCast, // Same as CM_RValue, but indicates GCC cast-as-lvalue ext |
||
348 | CM_NoSetterProperty,// Implicit assignment to ObjC property without setter |
||
349 | CM_ConstQualified, |
||
350 | CM_ConstQualifiedField, |
||
351 | CM_ConstAddrSpace, |
||
352 | CM_ArrayType, |
||
353 | CM_IncompleteType |
||
354 | }; |
||
355 | |||
356 | private: |
||
357 | friend class Expr; |
||
358 | |||
359 | unsigned short Kind; |
||
360 | unsigned short Modifiable; |
||
361 | |||
362 | explicit Classification(Kinds k, ModifiableType m) |
||
363 | : Kind(k), Modifiable(m) |
||
364 | {} |
||
365 | |||
366 | public: |
||
367 | Classification() {} |
||
368 | |||
369 | Kinds getKind() const { return static_cast<Kinds>(Kind); } |
||
370 | ModifiableType getModifiable() const { |
||
371 | assert(Modifiable != CM_Untested && "Did not test for modifiability."); |
||
372 | return static_cast<ModifiableType>(Modifiable); |
||
373 | } |
||
374 | bool isLValue() const { return Kind == CL_LValue; } |
||
375 | bool isXValue() const { return Kind == CL_XValue; } |
||
376 | bool isGLValue() const { return Kind <= CL_XValue; } |
||
377 | bool isPRValue() const { return Kind >= CL_Function; } |
||
378 | bool isRValue() const { return Kind >= CL_XValue; } |
||
379 | bool isModifiable() const { return getModifiable() == CM_Modifiable; } |
||
380 | |||
381 | /// Create a simple, modifiably lvalue |
||
382 | static Classification makeSimpleLValue() { |
||
383 | return Classification(CL_LValue, CM_Modifiable); |
||
384 | } |
||
385 | |||
386 | }; |
||
387 | /// Classify - Classify this expression according to the C++11 |
||
388 | /// expression taxonomy. |
||
389 | /// |
||
390 | /// C++11 defines ([basic.lval]) a new taxonomy of expressions to replace the |
||
391 | /// old lvalue vs rvalue. This function determines the type of expression this |
||
392 | /// is. There are three expression types: |
||
393 | /// - lvalues are classical lvalues as in C++03. |
||
394 | /// - prvalues are equivalent to rvalues in C++03. |
||
395 | /// - xvalues are expressions yielding unnamed rvalue references, e.g. a |
||
396 | /// function returning an rvalue reference. |
||
397 | /// lvalues and xvalues are collectively referred to as glvalues, while |
||
398 | /// prvalues and xvalues together form rvalues. |
||
399 | Classification Classify(ASTContext &Ctx) const { |
||
400 | return ClassifyImpl(Ctx, nullptr); |
||
401 | } |
||
402 | |||
403 | /// ClassifyModifiable - Classify this expression according to the |
||
404 | /// C++11 expression taxonomy, and see if it is valid on the left side |
||
405 | /// of an assignment. |
||
406 | /// |
||
407 | /// This function extends classify in that it also tests whether the |
||
408 | /// expression is modifiable (C99 6.3.2.1p1). |
||
409 | /// \param Loc A source location that might be filled with a relevant location |
||
410 | /// if the expression is not modifiable. |
||
411 | Classification ClassifyModifiable(ASTContext &Ctx, SourceLocation &Loc) const{ |
||
412 | return ClassifyImpl(Ctx, &Loc); |
||
413 | } |
||
414 | |||
415 | /// Returns the set of floating point options that apply to this expression. |
||
416 | /// Only meaningful for operations on floating point values. |
||
417 | FPOptions getFPFeaturesInEffect(const LangOptions &LO) const; |
||
418 | |||
419 | /// getValueKindForType - Given a formal return or parameter type, |
||
420 | /// give its value kind. |
||
421 | static ExprValueKind getValueKindForType(QualType T) { |
||
422 | if (const ReferenceType *RT = T->getAs<ReferenceType>()) |
||
423 | return (isa<LValueReferenceType>(RT) |
||
424 | ? VK_LValue |
||
425 | : (RT->getPointeeType()->isFunctionType() |
||
426 | ? VK_LValue : VK_XValue)); |
||
427 | return VK_PRValue; |
||
428 | } |
||
429 | |||
430 | /// getValueKind - The value kind that this expression produces. |
||
431 | ExprValueKind getValueKind() const { |
||
432 | return static_cast<ExprValueKind>(ExprBits.ValueKind); |
||
433 | } |
||
434 | |||
435 | /// getObjectKind - The object kind that this expression produces. |
||
436 | /// Object kinds are meaningful only for expressions that yield an |
||
437 | /// l-value or x-value. |
||
438 | ExprObjectKind getObjectKind() const { |
||
439 | return static_cast<ExprObjectKind>(ExprBits.ObjectKind); |
||
440 | } |
||
441 | |||
442 | bool isOrdinaryOrBitFieldObject() const { |
||
443 | ExprObjectKind OK = getObjectKind(); |
||
444 | return (OK == OK_Ordinary || OK == OK_BitField); |
||
445 | } |
||
446 | |||
447 | /// setValueKind - Set the value kind produced by this expression. |
||
448 | void setValueKind(ExprValueKind Cat) { ExprBits.ValueKind = Cat; } |
||
449 | |||
450 | /// setObjectKind - Set the object kind produced by this expression. |
||
451 | void setObjectKind(ExprObjectKind Cat) { ExprBits.ObjectKind = Cat; } |
||
452 | |||
453 | private: |
||
454 | Classification ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const; |
||
455 | |||
456 | public: |
||
457 | |||
458 | /// Returns true if this expression is a gl-value that |
||
459 | /// potentially refers to a bit-field. |
||
460 | /// |
||
461 | /// In C++, whether a gl-value refers to a bitfield is essentially |
||
462 | /// an aspect of the value-kind type system. |
||
463 | bool refersToBitField() const { return getObjectKind() == OK_BitField; } |
||
464 | |||
465 | /// If this expression refers to a bit-field, retrieve the |
||
466 | /// declaration of that bit-field. |
||
467 | /// |
||
468 | /// Note that this returns a non-null pointer in subtly different |
||
469 | /// places than refersToBitField returns true. In particular, this can |
||
470 | /// return a non-null pointer even for r-values loaded from |
||
471 | /// bit-fields, but it will return null for a conditional bit-field. |
||
472 | FieldDecl *getSourceBitField(); |
||
473 | |||
474 | const FieldDecl *getSourceBitField() const { |
||
475 | return const_cast<Expr*>(this)->getSourceBitField(); |
||
476 | } |
||
477 | |||
478 | Decl *getReferencedDeclOfCallee(); |
||
479 | const Decl *getReferencedDeclOfCallee() const { |
||
480 | return const_cast<Expr*>(this)->getReferencedDeclOfCallee(); |
||
481 | } |
||
482 | |||
483 | /// If this expression is an l-value for an Objective C |
||
484 | /// property, find the underlying property reference expression. |
||
485 | const ObjCPropertyRefExpr *getObjCProperty() const; |
||
486 | |||
487 | /// Check if this expression is the ObjC 'self' implicit parameter. |
||
488 | bool isObjCSelfExpr() const; |
||
489 | |||
490 | /// Returns whether this expression refers to a vector element. |
||
491 | bool refersToVectorElement() const; |
||
492 | |||
493 | /// Returns whether this expression refers to a matrix element. |
||
494 | bool refersToMatrixElement() const { |
||
495 | return getObjectKind() == OK_MatrixComponent; |
||
496 | } |
||
497 | |||
498 | /// Returns whether this expression refers to a global register |
||
499 | /// variable. |
||
500 | bool refersToGlobalRegisterVar() const; |
||
501 | |||
502 | /// Returns whether this expression has a placeholder type. |
||
503 | bool hasPlaceholderType() const { |
||
504 | return getType()->isPlaceholderType(); |
||
505 | } |
||
506 | |||
507 | /// Returns whether this expression has a specific placeholder type. |
||
508 | bool hasPlaceholderType(BuiltinType::Kind K) const { |
||
509 | assert(BuiltinType::isPlaceholderTypeKind(K)); |
||
510 | if (const BuiltinType *BT = dyn_cast<BuiltinType>(getType())) |
||
511 | return BT->getKind() == K; |
||
512 | return false; |
||
513 | } |
||
514 | |||
515 | /// isKnownToHaveBooleanValue - Return true if this is an integer expression |
||
516 | /// that is known to return 0 or 1. This happens for _Bool/bool expressions |
||
517 | /// but also int expressions which are produced by things like comparisons in |
||
518 | /// C. |
||
519 | /// |
||
520 | /// \param Semantic If true, only return true for expressions that are known |
||
521 | /// to be semantically boolean, which might not be true even for expressions |
||
522 | /// that are known to evaluate to 0/1. For instance, reading an unsigned |
||
523 | /// bit-field with width '1' will evaluate to 0/1, but doesn't necessarily |
||
524 | /// semantically correspond to a bool. |
||
525 | bool isKnownToHaveBooleanValue(bool Semantic = true) const; |
||
526 | |||
527 | /// Check whether this array fits the idiom of a flexible array member, |
||
528 | /// depending on the value of -fstrict-flex-array. |
||
529 | /// When IgnoreTemplateOrMacroSubstitution is set, it doesn't consider sizes |
||
530 | /// resulting from the substitution of a macro or a template as special sizes. |
||
531 | bool isFlexibleArrayMemberLike( |
||
532 | ASTContext &Context, |
||
533 | LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, |
||
534 | bool IgnoreTemplateOrMacroSubstitution = false) const; |
||
535 | |||
536 | /// isIntegerConstantExpr - Return the value if this expression is a valid |
||
537 | /// integer constant expression. If not a valid i-c-e, return std::nullopt |
||
538 | /// and fill in Loc (if specified) with the location of the invalid |
||
539 | /// expression. |
||
540 | /// |
||
541 | /// Note: This does not perform the implicit conversions required by C++11 |
||
542 | /// [expr.const]p5. |
||
543 | std::optional<llvm::APSInt> |
||
544 | getIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc = nullptr, |
||
545 | bool isEvaluated = true) const; |
||
546 | bool isIntegerConstantExpr(const ASTContext &Ctx, |
||
547 | SourceLocation *Loc = nullptr) const; |
||
548 | |||
549 | /// isCXX98IntegralConstantExpr - Return true if this expression is an |
||
550 | /// integral constant expression in C++98. Can only be used in C++. |
||
551 | bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const; |
||
552 | |||
553 | /// isCXX11ConstantExpr - Return true if this expression is a constant |
||
554 | /// expression in C++11. Can only be used in C++. |
||
555 | /// |
||
556 | /// Note: This does not perform the implicit conversions required by C++11 |
||
557 | /// [expr.const]p5. |
||
558 | bool isCXX11ConstantExpr(const ASTContext &Ctx, APValue *Result = nullptr, |
||
559 | SourceLocation *Loc = nullptr) const; |
||
560 | |||
561 | /// isPotentialConstantExpr - Return true if this function's definition |
||
562 | /// might be usable in a constant expression in C++11, if it were marked |
||
563 | /// constexpr. Return false if the function can never produce a constant |
||
564 | /// expression, along with diagnostics describing why not. |
||
565 | static bool isPotentialConstantExpr(const FunctionDecl *FD, |
||
566 | SmallVectorImpl< |
||
567 | PartialDiagnosticAt> &Diags); |
||
568 | |||
569 | /// isPotentialConstantExprUnevaluted - Return true if this expression might |
||
570 | /// be usable in a constant expression in C++11 in an unevaluated context, if |
||
571 | /// it were in function FD marked constexpr. Return false if the function can |
||
572 | /// never produce a constant expression, along with diagnostics describing |
||
573 | /// why not. |
||
574 | static bool isPotentialConstantExprUnevaluated(Expr *E, |
||
575 | const FunctionDecl *FD, |
||
576 | SmallVectorImpl< |
||
577 | PartialDiagnosticAt> &Diags); |
||
578 | |||
579 | /// isConstantInitializer - Returns true if this expression can be emitted to |
||
580 | /// IR as a constant, and thus can be used as a constant initializer in C. |
||
581 | /// If this expression is not constant and Culprit is non-null, |
||
582 | /// it is used to store the address of first non constant expr. |
||
583 | bool isConstantInitializer(ASTContext &Ctx, bool ForRef, |
||
584 | const Expr **Culprit = nullptr) const; |
||
585 | |||
586 | /// If this expression is an unambiguous reference to a single declaration, |
||
587 | /// in the style of __builtin_function_start, return that declaration. Note |
||
588 | /// that this may return a non-static member function or field in C++ if this |
||
589 | /// expression is a member pointer constant. |
||
590 | const ValueDecl *getAsBuiltinConstantDeclRef(const ASTContext &Context) const; |
||
591 | |||
592 | /// EvalStatus is a struct with detailed info about an evaluation in progress. |
||
593 | struct EvalStatus { |
||
594 | /// Whether the evaluated expression has side effects. |
||
595 | /// For example, (f() && 0) can be folded, but it still has side effects. |
||
596 | bool HasSideEffects; |
||
597 | |||
598 | /// Whether the evaluation hit undefined behavior. |
||
599 | /// For example, 1.0 / 0.0 can be folded to Inf, but has undefined behavior. |
||
600 | /// Likewise, INT_MAX + 1 can be folded to INT_MIN, but has UB. |
||
601 | bool HasUndefinedBehavior; |
||
602 | |||
603 | /// Diag - If this is non-null, it will be filled in with a stack of notes |
||
604 | /// indicating why evaluation failed (or why it failed to produce a constant |
||
605 | /// expression). |
||
606 | /// If the expression is unfoldable, the notes will indicate why it's not |
||
607 | /// foldable. If the expression is foldable, but not a constant expression, |
||
608 | /// the notes will describes why it isn't a constant expression. If the |
||
609 | /// expression *is* a constant expression, no notes will be produced. |
||
610 | SmallVectorImpl<PartialDiagnosticAt> *Diag; |
||
611 | |||
612 | EvalStatus() |
||
613 | : HasSideEffects(false), HasUndefinedBehavior(false), Diag(nullptr) {} |
||
614 | |||
615 | // hasSideEffects - Return true if the evaluated expression has |
||
616 | // side effects. |
||
617 | bool hasSideEffects() const { |
||
618 | return HasSideEffects; |
||
619 | } |
||
620 | }; |
||
621 | |||
622 | /// EvalResult is a struct with detailed info about an evaluated expression. |
||
623 | struct EvalResult : EvalStatus { |
||
624 | /// Val - This is the value the expression can be folded to. |
||
625 | APValue Val; |
||
626 | |||
627 | // isGlobalLValue - Return true if the evaluated lvalue expression |
||
628 | // is global. |
||
629 | bool isGlobalLValue() const; |
||
630 | }; |
||
631 | |||
632 | /// EvaluateAsRValue - Return true if this is a constant which we can fold to |
||
633 | /// an rvalue using any crazy technique (that has nothing to do with language |
||
634 | /// standards) that we want to, even if the expression has side-effects. If |
||
635 | /// this function returns true, it returns the folded constant in Result. If |
||
636 | /// the expression is a glvalue, an lvalue-to-rvalue conversion will be |
||
637 | /// applied. |
||
638 | bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, |
||
639 | bool InConstantContext = false) const; |
||
640 | |||
641 | /// EvaluateAsBooleanCondition - Return true if this is a constant |
||
642 | /// which we can fold and convert to a boolean condition using |
||
643 | /// any crazy technique that we want to, even if the expression has |
||
644 | /// side-effects. |
||
645 | bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx, |
||
646 | bool InConstantContext = false) const; |
||
647 | |||
648 | enum SideEffectsKind { |
||
649 | SE_NoSideEffects, ///< Strictly evaluate the expression. |
||
650 | SE_AllowUndefinedBehavior, ///< Allow UB that we can give a value, but not |
||
651 | ///< arbitrary unmodeled side effects. |
||
652 | SE_AllowSideEffects ///< Allow any unmodeled side effect. |
||
653 | }; |
||
654 | |||
655 | /// EvaluateAsInt - Return true if this is a constant which we can fold and |
||
656 | /// convert to an integer, using any crazy technique that we want to. |
||
657 | bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, |
||
658 | SideEffectsKind AllowSideEffects = SE_NoSideEffects, |
||
659 | bool InConstantContext = false) const; |
||
660 | |||
661 | /// EvaluateAsFloat - Return true if this is a constant which we can fold and |
||
662 | /// convert to a floating point value, using any crazy technique that we |
||
663 | /// want to. |
||
664 | bool EvaluateAsFloat(llvm::APFloat &Result, const ASTContext &Ctx, |
||
665 | SideEffectsKind AllowSideEffects = SE_NoSideEffects, |
||
666 | bool InConstantContext = false) const; |
||
667 | |||
668 | /// EvaluateAsFloat - Return true if this is a constant which we can fold and |
||
669 | /// convert to a fixed point value. |
||
670 | bool EvaluateAsFixedPoint(EvalResult &Result, const ASTContext &Ctx, |
||
671 | SideEffectsKind AllowSideEffects = SE_NoSideEffects, |
||
672 | bool InConstantContext = false) const; |
||
673 | |||
674 | /// isEvaluatable - Call EvaluateAsRValue to see if this expression can be |
||
675 | /// constant folded without side-effects, but discard the result. |
||
676 | bool isEvaluatable(const ASTContext &Ctx, |
||
677 | SideEffectsKind AllowSideEffects = SE_NoSideEffects) const; |
||
678 | |||
679 | /// HasSideEffects - This routine returns true for all those expressions |
||
680 | /// which have any effect other than producing a value. Example is a function |
||
681 | /// call, volatile variable read, or throwing an exception. If |
||
682 | /// IncludePossibleEffects is false, this call treats certain expressions with |
||
683 | /// potential side effects (such as function call-like expressions, |
||
684 | /// instantiation-dependent expressions, or invocations from a macro) as not |
||
685 | /// having side effects. |
||
686 | bool HasSideEffects(const ASTContext &Ctx, |
||
687 | bool IncludePossibleEffects = true) const; |
||
688 | |||
689 | /// Determine whether this expression involves a call to any function |
||
690 | /// that is not trivial. |
||
691 | bool hasNonTrivialCall(const ASTContext &Ctx) const; |
||
692 | |||
693 | /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded |
||
694 | /// integer. This must be called on an expression that constant folds to an |
||
695 | /// integer. |
||
696 | llvm::APSInt EvaluateKnownConstInt( |
||
697 | const ASTContext &Ctx, |
||
698 | SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const; |
||
699 | |||
700 | llvm::APSInt EvaluateKnownConstIntCheckOverflow( |
||
701 | const ASTContext &Ctx, |
||
702 | SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const; |
||
703 | |||
704 | void EvaluateForOverflow(const ASTContext &Ctx) const; |
||
705 | |||
706 | /// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an |
||
707 | /// lvalue with link time known address, with no side-effects. |
||
708 | bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx, |
||
709 | bool InConstantContext = false) const; |
||
710 | |||
711 | /// EvaluateAsInitializer - Evaluate an expression as if it were the |
||
712 | /// initializer of the given declaration. Returns true if the initializer |
||
713 | /// can be folded to a constant, and produces any relevant notes. In C++11, |
||
714 | /// notes will be produced if the expression is not a constant expression. |
||
715 | bool EvaluateAsInitializer(APValue &Result, const ASTContext &Ctx, |
||
716 | const VarDecl *VD, |
||
717 | SmallVectorImpl<PartialDiagnosticAt> &Notes, |
||
718 | bool IsConstantInitializer) const; |
||
719 | |||
720 | /// EvaluateWithSubstitution - Evaluate an expression as if from the context |
||
721 | /// of a call to the given function with the given arguments, inside an |
||
722 | /// unevaluated context. Returns true if the expression could be folded to a |
||
723 | /// constant. |
||
724 | bool EvaluateWithSubstitution(APValue &Value, ASTContext &Ctx, |
||
725 | const FunctionDecl *Callee, |
||
726 | ArrayRef<const Expr*> Args, |
||
727 | const Expr *This = nullptr) const; |
||
728 | |||
729 | enum class ConstantExprKind { |
||
730 | /// An integer constant expression (an array bound, enumerator, case value, |
||
731 | /// bit-field width, or similar) or similar. |
||
732 | Normal, |
||
733 | /// A non-class template argument. Such a value is only used for mangling, |
||
734 | /// not for code generation, so can refer to dllimported functions. |
||
735 | NonClassTemplateArgument, |
||
736 | /// A class template argument. Such a value is used for code generation. |
||
737 | ClassTemplateArgument, |
||
738 | /// An immediate invocation. The destruction of the end result of this |
||
739 | /// evaluation is not part of the evaluation, but all other temporaries |
||
740 | /// are destroyed. |
||
741 | ImmediateInvocation, |
||
742 | }; |
||
743 | |||
744 | /// Evaluate an expression that is required to be a constant expression. Does |
||
745 | /// not check the syntactic constraints for C and C++98 constant expressions. |
||
746 | bool EvaluateAsConstantExpr( |
||
747 | EvalResult &Result, const ASTContext &Ctx, |
||
748 | ConstantExprKind Kind = ConstantExprKind::Normal) const; |
||
749 | |||
750 | /// If the current Expr is a pointer, this will try to statically |
||
751 | /// determine the number of bytes available where the pointer is pointing. |
||
752 | /// Returns true if all of the above holds and we were able to figure out the |
||
753 | /// size, false otherwise. |
||
754 | /// |
||
755 | /// \param Type - How to evaluate the size of the Expr, as defined by the |
||
756 | /// "type" parameter of __builtin_object_size |
||
757 | bool tryEvaluateObjectSize(uint64_t &Result, ASTContext &Ctx, |
||
758 | unsigned Type) const; |
||
759 | |||
760 | /// If the current Expr is a pointer, this will try to statically |
||
761 | /// determine the strlen of the string pointed to. |
||
762 | /// Returns true if all of the above holds and we were able to figure out the |
||
763 | /// strlen, false otherwise. |
||
764 | bool tryEvaluateStrLen(uint64_t &Result, ASTContext &Ctx) const; |
||
765 | |||
766 | /// Enumeration used to describe the kind of Null pointer constant |
||
767 | /// returned from \c isNullPointerConstant(). |
||
768 | enum NullPointerConstantKind { |
||
769 | /// Expression is not a Null pointer constant. |
||
770 | NPCK_NotNull = 0, |
||
771 | |||
772 | /// Expression is a Null pointer constant built from a zero integer |
||
773 | /// expression that is not a simple, possibly parenthesized, zero literal. |
||
774 | /// C++ Core Issue 903 will classify these expressions as "not pointers" |
||
775 | /// once it is adopted. |
||
776 | /// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903 |
||
777 | NPCK_ZeroExpression, |
||
778 | |||
779 | /// Expression is a Null pointer constant built from a literal zero. |
||
780 | NPCK_ZeroLiteral, |
||
781 | |||
782 | /// Expression is a C++11 nullptr. |
||
783 | NPCK_CXX11_nullptr, |
||
784 | |||
785 | /// Expression is a GNU-style __null constant. |
||
786 | NPCK_GNUNull |
||
787 | }; |
||
788 | |||
789 | /// Enumeration used to describe how \c isNullPointerConstant() |
||
790 | /// should cope with value-dependent expressions. |
||
791 | enum NullPointerConstantValueDependence { |
||
792 | /// Specifies that the expression should never be value-dependent. |
||
793 | NPC_NeverValueDependent = 0, |
||
794 | |||
795 | /// Specifies that a value-dependent expression of integral or |
||
796 | /// dependent type should be considered a null pointer constant. |
||
797 | NPC_ValueDependentIsNull, |
||
798 | |||
799 | /// Specifies that a value-dependent expression should be considered |
||
800 | /// to never be a null pointer constant. |
||
801 | NPC_ValueDependentIsNotNull |
||
802 | }; |
||
803 | |||
804 | /// isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to |
||
805 | /// a Null pointer constant. The return value can further distinguish the |
||
806 | /// kind of NULL pointer constant that was detected. |
||
807 | NullPointerConstantKind isNullPointerConstant( |
||
808 | ASTContext &Ctx, |
||
809 | NullPointerConstantValueDependence NPC) const; |
||
810 | |||
811 | /// isOBJCGCCandidate - Return true if this expression may be used in a read/ |
||
812 | /// write barrier. |
||
813 | bool isOBJCGCCandidate(ASTContext &Ctx) const; |
||
814 | |||
815 | /// Returns true if this expression is a bound member function. |
||
816 | bool isBoundMemberFunction(ASTContext &Ctx) const; |
||
817 | |||
818 | /// Given an expression of bound-member type, find the type |
||
819 | /// of the member. Returns null if this is an *overloaded* bound |
||
820 | /// member expression. |
||
821 | static QualType findBoundMemberType(const Expr *expr); |
||
822 | |||
823 | /// Skip past any invisble AST nodes which might surround this |
||
824 | /// statement, such as ExprWithCleanups or ImplicitCastExpr nodes, |
||
825 | /// but also injected CXXMemberExpr and CXXConstructExpr which represent |
||
826 | /// implicit conversions. |
||
827 | Expr *IgnoreUnlessSpelledInSource(); |
||
828 | const Expr *IgnoreUnlessSpelledInSource() const { |
||
829 | return const_cast<Expr *>(this)->IgnoreUnlessSpelledInSource(); |
||
830 | } |
||
831 | |||
832 | /// Skip past any implicit casts which might surround this expression until |
||
833 | /// reaching a fixed point. Skips: |
||
834 | /// * ImplicitCastExpr |
||
835 | /// * FullExpr |
||
836 | Expr *IgnoreImpCasts() LLVM_READONLY; |
||
837 | const Expr *IgnoreImpCasts() const { |
||
838 | return const_cast<Expr *>(this)->IgnoreImpCasts(); |
||
839 | } |
||
840 | |||
841 | /// Skip past any casts which might surround this expression until reaching |
||
842 | /// a fixed point. Skips: |
||
843 | /// * CastExpr |
||
844 | /// * FullExpr |
||
845 | /// * MaterializeTemporaryExpr |
||
846 | /// * SubstNonTypeTemplateParmExpr |
||
847 | Expr *IgnoreCasts() LLVM_READONLY; |
||
848 | const Expr *IgnoreCasts() const { |
||
849 | return const_cast<Expr *>(this)->IgnoreCasts(); |
||
850 | } |
||
851 | |||
852 | /// Skip past any implicit AST nodes which might surround this expression |
||
853 | /// until reaching a fixed point. Skips: |
||
854 | /// * What IgnoreImpCasts() skips |
||
855 | /// * MaterializeTemporaryExpr |
||
856 | /// * CXXBindTemporaryExpr |
||
857 | Expr *IgnoreImplicit() LLVM_READONLY; |
||
858 | const Expr *IgnoreImplicit() const { |
||
859 | return const_cast<Expr *>(this)->IgnoreImplicit(); |
||
860 | } |
||
861 | |||
862 | /// Skip past any implicit AST nodes which might surround this expression |
||
863 | /// until reaching a fixed point. Same as IgnoreImplicit, except that it |
||
864 | /// also skips over implicit calls to constructors and conversion functions. |
||
865 | /// |
||
866 | /// FIXME: Should IgnoreImplicit do this? |
||
867 | Expr *IgnoreImplicitAsWritten() LLVM_READONLY; |
||
868 | const Expr *IgnoreImplicitAsWritten() const { |
||
869 | return const_cast<Expr *>(this)->IgnoreImplicitAsWritten(); |
||
870 | } |
||
871 | |||
872 | /// Skip past any parentheses which might surround this expression until |
||
873 | /// reaching a fixed point. Skips: |
||
874 | /// * ParenExpr |
||
875 | /// * UnaryOperator if `UO_Extension` |
||
876 | /// * GenericSelectionExpr if `!isResultDependent()` |
||
877 | /// * ChooseExpr if `!isConditionDependent()` |
||
878 | /// * ConstantExpr |
||
879 | Expr *IgnoreParens() LLVM_READONLY; |
||
880 | const Expr *IgnoreParens() const { |
||
881 | return const_cast<Expr *>(this)->IgnoreParens(); |
||
882 | } |
||
883 | |||
884 | /// Skip past any parentheses and implicit casts which might surround this |
||
885 | /// expression until reaching a fixed point. |
||
886 | /// FIXME: IgnoreParenImpCasts really ought to be equivalent to |
||
887 | /// IgnoreParens() + IgnoreImpCasts() until reaching a fixed point. However |
||
888 | /// this is currently not the case. Instead IgnoreParenImpCasts() skips: |
||
889 | /// * What IgnoreParens() skips |
||
890 | /// * What IgnoreImpCasts() skips |
||
891 | /// * MaterializeTemporaryExpr |
||
892 | /// * SubstNonTypeTemplateParmExpr |
||
893 | Expr *IgnoreParenImpCasts() LLVM_READONLY; |
||
894 | const Expr *IgnoreParenImpCasts() const { |
||
895 | return const_cast<Expr *>(this)->IgnoreParenImpCasts(); |
||
896 | } |
||
897 | |||
898 | /// Skip past any parentheses and casts which might surround this expression |
||
899 | /// until reaching a fixed point. Skips: |
||
900 | /// * What IgnoreParens() skips |
||
901 | /// * What IgnoreCasts() skips |
||
902 | Expr *IgnoreParenCasts() LLVM_READONLY; |
||
903 | const Expr *IgnoreParenCasts() const { |
||
904 | return const_cast<Expr *>(this)->IgnoreParenCasts(); |
||
905 | } |
||
906 | |||
907 | /// Skip conversion operators. If this Expr is a call to a conversion |
||
908 | /// operator, return the argument. |
||
909 | Expr *IgnoreConversionOperatorSingleStep() LLVM_READONLY; |
||
910 | const Expr *IgnoreConversionOperatorSingleStep() const { |
||
911 | return const_cast<Expr *>(this)->IgnoreConversionOperatorSingleStep(); |
||
912 | } |
||
913 | |||
914 | /// Skip past any parentheses and lvalue casts which might surround this |
||
915 | /// expression until reaching a fixed point. Skips: |
||
916 | /// * What IgnoreParens() skips |
||
917 | /// * What IgnoreCasts() skips, except that only lvalue-to-rvalue |
||
918 | /// casts are skipped |
||
919 | /// FIXME: This is intended purely as a temporary workaround for code |
||
920 | /// that hasn't yet been rewritten to do the right thing about those |
||
921 | /// casts, and may disappear along with the last internal use. |
||
922 | Expr *IgnoreParenLValueCasts() LLVM_READONLY; |
||
923 | const Expr *IgnoreParenLValueCasts() const { |
||
924 | return const_cast<Expr *>(this)->IgnoreParenLValueCasts(); |
||
925 | } |
||
926 | |||
927 | /// Skip past any parenthese and casts which do not change the value |
||
928 | /// (including ptr->int casts of the same size) until reaching a fixed point. |
||
929 | /// Skips: |
||
930 | /// * What IgnoreParens() skips |
||
931 | /// * CastExpr which do not change the value |
||
932 | /// * SubstNonTypeTemplateParmExpr |
||
933 | Expr *IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY; |
||
934 | const Expr *IgnoreParenNoopCasts(const ASTContext &Ctx) const { |
||
935 | return const_cast<Expr *>(this)->IgnoreParenNoopCasts(Ctx); |
||
936 | } |
||
937 | |||
938 | /// Skip past any parentheses and derived-to-base casts until reaching a |
||
939 | /// fixed point. Skips: |
||
940 | /// * What IgnoreParens() skips |
||
941 | /// * CastExpr which represent a derived-to-base cast (CK_DerivedToBase, |
||
942 | /// CK_UncheckedDerivedToBase and CK_NoOp) |
||
943 | Expr *IgnoreParenBaseCasts() LLVM_READONLY; |
||
944 | const Expr *IgnoreParenBaseCasts() const { |
||
945 | return const_cast<Expr *>(this)->IgnoreParenBaseCasts(); |
||
946 | } |
||
947 | |||
948 | /// Determine whether this expression is a default function argument. |
||
949 | /// |
||
950 | /// Default arguments are implicitly generated in the abstract syntax tree |
||
951 | /// by semantic analysis for function calls, object constructions, etc. in |
||
952 | /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes; |
||
953 | /// this routine also looks through any implicit casts to determine whether |
||
954 | /// the expression is a default argument. |
||
955 | bool isDefaultArgument() const; |
||
956 | |||
957 | /// Determine whether the result of this expression is a |
||
958 | /// temporary object of the given class type. |
||
959 | bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const; |
||
960 | |||
961 | /// Whether this expression is an implicit reference to 'this' in C++. |
||
962 | bool isImplicitCXXThis() const; |
||
963 | |||
964 | static bool hasAnyTypeDependentArguments(ArrayRef<Expr *> Exprs); |
||
965 | |||
966 | /// For an expression of class type or pointer to class type, |
||
967 | /// return the most derived class decl the expression is known to refer to. |
||
968 | /// |
||
969 | /// If this expression is a cast, this method looks through it to find the |
||
970 | /// most derived decl that can be inferred from the expression. |
||
971 | /// This is valid because derived-to-base conversions have undefined |
||
972 | /// behavior if the object isn't dynamically of the derived type. |
||
973 | const CXXRecordDecl *getBestDynamicClassType() const; |
||
974 | |||
975 | /// Get the inner expression that determines the best dynamic class. |
||
976 | /// If this is a prvalue, we guarantee that it is of the most-derived type |
||
977 | /// for the object itself. |
||
978 | const Expr *getBestDynamicClassTypeExpr() const; |
||
979 | |||
980 | /// Walk outwards from an expression we want to bind a reference to and |
||
981 | /// find the expression whose lifetime needs to be extended. Record |
||
982 | /// the LHSs of comma expressions and adjustments needed along the path. |
||
983 | const Expr *skipRValueSubobjectAdjustments( |
||
984 | SmallVectorImpl<const Expr *> &CommaLHS, |
||
985 | SmallVectorImpl<SubobjectAdjustment> &Adjustments) const; |
||
986 | const Expr *skipRValueSubobjectAdjustments() const { |
||
987 | SmallVector<const Expr *, 8> CommaLHSs; |
||
988 | SmallVector<SubobjectAdjustment, 8> Adjustments; |
||
989 | return skipRValueSubobjectAdjustments(CommaLHSs, Adjustments); |
||
990 | } |
||
991 | |||
992 | /// Checks that the two Expr's will refer to the same value as a comparison |
||
993 | /// operand. The caller must ensure that the values referenced by the Expr's |
||
994 | /// are not modified between E1 and E2 or the result my be invalid. |
||
995 | static bool isSameComparisonOperand(const Expr* E1, const Expr* E2); |
||
996 | |||
997 | static bool classof(const Stmt *T) { |
||
998 | return T->getStmtClass() >= firstExprConstant && |
||
999 | T->getStmtClass() <= lastExprConstant; |
||
1000 | } |
||
1001 | }; |
||
1002 | // PointerLikeTypeTraits is specialized so it can be used with a forward-decl of |
||
1003 | // Expr. Verify that we got it right. |
||
1004 | static_assert(llvm::PointerLikeTypeTraits<Expr *>::NumLowBitsAvailable <= |
||
1005 | llvm::detail::ConstantLog2<alignof(Expr)>::value, |
||
1006 | "PointerLikeTypeTraits<Expr*> assumes too much alignment."); |
||
1007 | |||
1008 | using ConstantExprKind = Expr::ConstantExprKind; |
||
1009 | |||
1010 | //===----------------------------------------------------------------------===// |
||
1011 | // Wrapper Expressions. |
||
1012 | //===----------------------------------------------------------------------===// |
||
1013 | |||
1014 | /// FullExpr - Represents a "full-expression" node. |
||
1015 | class FullExpr : public Expr { |
||
1016 | protected: |
||
1017 | Stmt *SubExpr; |
||
1018 | |||
1019 | FullExpr(StmtClass SC, Expr *subexpr) |
||
1020 | : Expr(SC, subexpr->getType(), subexpr->getValueKind(), |
||
1021 | subexpr->getObjectKind()), |
||
1022 | SubExpr(subexpr) { |
||
1023 | setDependence(computeDependence(this)); |
||
1024 | } |
||
1025 | FullExpr(StmtClass SC, EmptyShell Empty) |
||
1026 | : Expr(SC, Empty) {} |
||
1027 | public: |
||
1028 | const Expr *getSubExpr() const { return cast<Expr>(SubExpr); } |
||
1029 | Expr *getSubExpr() { return cast<Expr>(SubExpr); } |
||
1030 | |||
1031 | /// As with any mutator of the AST, be very careful when modifying an |
||
1032 | /// existing AST to preserve its invariants. |
||
1033 | void setSubExpr(Expr *E) { SubExpr = E; } |
||
1034 | |||
1035 | static bool classof(const Stmt *T) { |
||
1036 | return T->getStmtClass() >= firstFullExprConstant && |
||
1037 | T->getStmtClass() <= lastFullExprConstant; |
||
1038 | } |
||
1039 | }; |
||
1040 | |||
1041 | /// ConstantExpr - An expression that occurs in a constant context and |
||
1042 | /// optionally the result of evaluating the expression. |
||
1043 | class ConstantExpr final |
||
1044 | : public FullExpr, |
||
1045 | private llvm::TrailingObjects<ConstantExpr, APValue, uint64_t> { |
||
1046 | static_assert(std::is_same<uint64_t, llvm::APInt::WordType>::value, |
||
1047 | "ConstantExpr assumes that llvm::APInt::WordType is uint64_t " |
||
1048 | "for tail-allocated storage"); |
||
1049 | friend TrailingObjects; |
||
1050 | friend class ASTStmtReader; |
||
1051 | friend class ASTStmtWriter; |
||
1052 | |||
1053 | public: |
||
1054 | /// Describes the kind of result that can be tail-allocated. |
||
1055 | enum ResultStorageKind { RSK_None, RSK_Int64, RSK_APValue }; |
||
1056 | |||
1057 | private: |
||
1058 | size_t numTrailingObjects(OverloadToken<APValue>) const { |
||
1059 | return ConstantExprBits.ResultKind == ConstantExpr::RSK_APValue; |
||
1060 | } |
||
1061 | size_t numTrailingObjects(OverloadToken<uint64_t>) const { |
||
1062 | return ConstantExprBits.ResultKind == ConstantExpr::RSK_Int64; |
||
1063 | } |
||
1064 | |||
1065 | uint64_t &Int64Result() { |
||
1066 | assert(ConstantExprBits.ResultKind == ConstantExpr::RSK_Int64 && |
||
1067 | "invalid accessor"); |
||
1068 | return *getTrailingObjects<uint64_t>(); |
||
1069 | } |
||
1070 | const uint64_t &Int64Result() const { |
||
1071 | return const_cast<ConstantExpr *>(this)->Int64Result(); |
||
1072 | } |
||
1073 | APValue &APValueResult() { |
||
1074 | assert(ConstantExprBits.ResultKind == ConstantExpr::RSK_APValue && |
||
1075 | "invalid accessor"); |
||
1076 | return *getTrailingObjects<APValue>(); |
||
1077 | } |
||
1078 | APValue &APValueResult() const { |
||
1079 | return const_cast<ConstantExpr *>(this)->APValueResult(); |
||
1080 | } |
||
1081 | |||
1082 | ConstantExpr(Expr *SubExpr, ResultStorageKind StorageKind, |
||
1083 | bool IsImmediateInvocation); |
||
1084 | ConstantExpr(EmptyShell Empty, ResultStorageKind StorageKind); |
||
1085 | |||
1086 | public: |
||
1087 | static ConstantExpr *Create(const ASTContext &Context, Expr *E, |
||
1088 | const APValue &Result); |
||
1089 | static ConstantExpr *Create(const ASTContext &Context, Expr *E, |
||
1090 | ResultStorageKind Storage = RSK_None, |
||
1091 | bool IsImmediateInvocation = false); |
||
1092 | static ConstantExpr *CreateEmpty(const ASTContext &Context, |
||
1093 | ResultStorageKind StorageKind); |
||
1094 | |||
1095 | static ResultStorageKind getStorageKind(const APValue &Value); |
||
1096 | static ResultStorageKind getStorageKind(const Type *T, |
||
1097 | const ASTContext &Context); |
||
1098 | |||
1099 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
1100 | return SubExpr->getBeginLoc(); |
||
1101 | } |
||
1102 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
1103 | return SubExpr->getEndLoc(); |
||
1104 | } |
||
1105 | |||
1106 | static bool classof(const Stmt *T) { |
||
1107 | return T->getStmtClass() == ConstantExprClass; |
||
1108 | } |
||
1109 | |||
1110 | void SetResult(APValue Value, const ASTContext &Context) { |
||
1111 | MoveIntoResult(Value, Context); |
||
1112 | } |
||
1113 | void MoveIntoResult(APValue &Value, const ASTContext &Context); |
||
1114 | |||
1115 | APValue::ValueKind getResultAPValueKind() const { |
||
1116 | return static_cast<APValue::ValueKind>(ConstantExprBits.APValueKind); |
||
1117 | } |
||
1118 | ResultStorageKind getResultStorageKind() const { |
||
1119 | return static_cast<ResultStorageKind>(ConstantExprBits.ResultKind); |
||
1120 | } |
||
1121 | bool isImmediateInvocation() const { |
||
1122 | return ConstantExprBits.IsImmediateInvocation; |
||
1123 | } |
||
1124 | bool hasAPValueResult() const { |
||
1125 | return ConstantExprBits.APValueKind != APValue::None; |
||
1126 | } |
||
1127 | APValue getAPValueResult() const; |
||
1128 | APValue &getResultAsAPValue() const { return APValueResult(); } |
||
1129 | llvm::APSInt getResultAsAPSInt() const; |
||
1130 | // Iterators |
||
1131 | child_range children() { return child_range(&SubExpr, &SubExpr+1); } |
||
1132 | const_child_range children() const { |
||
1133 | return const_child_range(&SubExpr, &SubExpr + 1); |
||
1134 | } |
||
1135 | }; |
||
1136 | |||
1137 | //===----------------------------------------------------------------------===// |
||
1138 | // Primary Expressions. |
||
1139 | //===----------------------------------------------------------------------===// |
||
1140 | |||
1141 | /// OpaqueValueExpr - An expression referring to an opaque object of a |
||
1142 | /// fixed type and value class. These don't correspond to concrete |
||
1143 | /// syntax; instead they're used to express operations (usually copy |
||
1144 | /// operations) on values whose source is generally obvious from |
||
1145 | /// context. |
||
1146 | class OpaqueValueExpr : public Expr { |
||
1147 | friend class ASTStmtReader; |
||
1148 | Expr *SourceExpr; |
||
1149 | |||
1150 | public: |
||
1151 | OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK, |
||
1152 | ExprObjectKind OK = OK_Ordinary, Expr *SourceExpr = nullptr) |
||
1153 | : Expr(OpaqueValueExprClass, T, VK, OK), SourceExpr(SourceExpr) { |
||
1154 | setIsUnique(false); |
||
1155 | OpaqueValueExprBits.Loc = Loc; |
||
1156 | setDependence(computeDependence(this)); |
||
1157 | } |
||
1158 | |||
1159 | /// Given an expression which invokes a copy constructor --- i.e. a |
||
1160 | /// CXXConstructExpr, possibly wrapped in an ExprWithCleanups --- |
||
1161 | /// find the OpaqueValueExpr that's the source of the construction. |
||
1162 | static const OpaqueValueExpr *findInCopyConstruct(const Expr *expr); |
||
1163 | |||
1164 | explicit OpaqueValueExpr(EmptyShell Empty) |
||
1165 | : Expr(OpaqueValueExprClass, Empty) {} |
||
1166 | |||
1167 | /// Retrieve the location of this expression. |
||
1168 | SourceLocation getLocation() const { return OpaqueValueExprBits.Loc; } |
||
1169 | |||
1170 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
1171 | return SourceExpr ? SourceExpr->getBeginLoc() : getLocation(); |
||
1172 | } |
||
1173 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
1174 | return SourceExpr ? SourceExpr->getEndLoc() : getLocation(); |
||
1175 | } |
||
1176 | SourceLocation getExprLoc() const LLVM_READONLY { |
||
1177 | return SourceExpr ? SourceExpr->getExprLoc() : getLocation(); |
||
1178 | } |
||
1179 | |||
1180 | child_range children() { |
||
1181 | return child_range(child_iterator(), child_iterator()); |
||
1182 | } |
||
1183 | |||
1184 | const_child_range children() const { |
||
1185 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
1186 | } |
||
1187 | |||
1188 | /// The source expression of an opaque value expression is the |
||
1189 | /// expression which originally generated the value. This is |
||
1190 | /// provided as a convenience for analyses that don't wish to |
||
1191 | /// precisely model the execution behavior of the program. |
||
1192 | /// |
||
1193 | /// The source expression is typically set when building the |
||
1194 | /// expression which binds the opaque value expression in the first |
||
1195 | /// place. |
||
1196 | Expr *getSourceExpr() const { return SourceExpr; } |
||
1197 | |||
1198 | void setIsUnique(bool V) { |
||
1199 | assert((!V || SourceExpr) && |
||
1200 | "unique OVEs are expected to have source expressions"); |
||
1201 | OpaqueValueExprBits.IsUnique = V; |
||
1202 | } |
||
1203 | |||
1204 | bool isUnique() const { return OpaqueValueExprBits.IsUnique; } |
||
1205 | |||
1206 | static bool classof(const Stmt *T) { |
||
1207 | return T->getStmtClass() == OpaqueValueExprClass; |
||
1208 | } |
||
1209 | }; |
||
1210 | |||
1211 | /// A reference to a declared variable, function, enum, etc. |
||
1212 | /// [C99 6.5.1p2] |
||
1213 | /// |
||
1214 | /// This encodes all the information about how a declaration is referenced |
||
1215 | /// within an expression. |
||
1216 | /// |
||
1217 | /// There are several optional constructs attached to DeclRefExprs only when |
||
1218 | /// they apply in order to conserve memory. These are laid out past the end of |
||
1219 | /// the object, and flags in the DeclRefExprBitfield track whether they exist: |
||
1220 | /// |
||
1221 | /// DeclRefExprBits.HasQualifier: |
||
1222 | /// Specifies when this declaration reference expression has a C++ |
||
1223 | /// nested-name-specifier. |
||
1224 | /// DeclRefExprBits.HasFoundDecl: |
||
1225 | /// Specifies when this declaration reference expression has a record of |
||
1226 | /// a NamedDecl (different from the referenced ValueDecl) which was found |
||
1227 | /// during name lookup and/or overload resolution. |
||
1228 | /// DeclRefExprBits.HasTemplateKWAndArgsInfo: |
||
1229 | /// Specifies when this declaration reference expression has an explicit |
||
1230 | /// C++ template keyword and/or template argument list. |
||
1231 | /// DeclRefExprBits.RefersToEnclosingVariableOrCapture |
||
1232 | /// Specifies when this declaration reference expression (validly) |
||
1233 | /// refers to an enclosed local or a captured variable. |
||
1234 | class DeclRefExpr final |
||
1235 | : public Expr, |
||
1236 | private llvm::TrailingObjects<DeclRefExpr, NestedNameSpecifierLoc, |
||
1237 | NamedDecl *, ASTTemplateKWAndArgsInfo, |
||
1238 | TemplateArgumentLoc> { |
||
1239 | friend class ASTStmtReader; |
||
1240 | friend class ASTStmtWriter; |
||
1241 | friend TrailingObjects; |
||
1242 | |||
1243 | /// The declaration that we are referencing. |
||
1244 | ValueDecl *D; |
||
1245 | |||
1246 | /// Provides source/type location info for the declaration name |
||
1247 | /// embedded in D. |
||
1248 | DeclarationNameLoc DNLoc; |
||
1249 | |||
1250 | size_t numTrailingObjects(OverloadToken<NestedNameSpecifierLoc>) const { |
||
1251 | return hasQualifier(); |
||
1252 | } |
||
1253 | |||
1254 | size_t numTrailingObjects(OverloadToken<NamedDecl *>) const { |
||
1255 | return hasFoundDecl(); |
||
1256 | } |
||
1257 | |||
1258 | size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const { |
||
1259 | return hasTemplateKWAndArgsInfo(); |
||
1260 | } |
||
1261 | |||
1262 | /// Test whether there is a distinct FoundDecl attached to the end of |
||
1263 | /// this DRE. |
||
1264 | bool hasFoundDecl() const { return DeclRefExprBits.HasFoundDecl; } |
||
1265 | |||
1266 | DeclRefExpr(const ASTContext &Ctx, NestedNameSpecifierLoc QualifierLoc, |
||
1267 | SourceLocation TemplateKWLoc, ValueDecl *D, |
||
1268 | bool RefersToEnlosingVariableOrCapture, |
||
1269 | const DeclarationNameInfo &NameInfo, NamedDecl *FoundD, |
||
1270 | const TemplateArgumentListInfo *TemplateArgs, QualType T, |
||
1271 | ExprValueKind VK, NonOdrUseReason NOUR); |
||
1272 | |||
1273 | /// Construct an empty declaration reference expression. |
||
1274 | explicit DeclRefExpr(EmptyShell Empty) : Expr(DeclRefExprClass, Empty) {} |
||
1275 | |||
1276 | public: |
||
1277 | DeclRefExpr(const ASTContext &Ctx, ValueDecl *D, |
||
1278 | bool RefersToEnclosingVariableOrCapture, QualType T, |
||
1279 | ExprValueKind VK, SourceLocation L, |
||
1280 | const DeclarationNameLoc &LocInfo = DeclarationNameLoc(), |
||
1281 | NonOdrUseReason NOUR = NOUR_None); |
||
1282 | |||
1283 | static DeclRefExpr * |
||
1284 | Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, |
||
1285 | SourceLocation TemplateKWLoc, ValueDecl *D, |
||
1286 | bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, |
||
1287 | QualType T, ExprValueKind VK, NamedDecl *FoundD = nullptr, |
||
1288 | const TemplateArgumentListInfo *TemplateArgs = nullptr, |
||
1289 | NonOdrUseReason NOUR = NOUR_None); |
||
1290 | |||
1291 | static DeclRefExpr * |
||
1292 | Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, |
||
1293 | SourceLocation TemplateKWLoc, ValueDecl *D, |
||
1294 | bool RefersToEnclosingVariableOrCapture, |
||
1295 | const DeclarationNameInfo &NameInfo, QualType T, ExprValueKind VK, |
||
1296 | NamedDecl *FoundD = nullptr, |
||
1297 | const TemplateArgumentListInfo *TemplateArgs = nullptr, |
||
1298 | NonOdrUseReason NOUR = NOUR_None); |
||
1299 | |||
1300 | /// Construct an empty declaration reference expression. |
||
1301 | static DeclRefExpr *CreateEmpty(const ASTContext &Context, bool HasQualifier, |
||
1302 | bool HasFoundDecl, |
||
1303 | bool HasTemplateKWAndArgsInfo, |
||
1304 | unsigned NumTemplateArgs); |
||
1305 | |||
1306 | ValueDecl *getDecl() { return D; } |
||
1307 | const ValueDecl *getDecl() const { return D; } |
||
1308 | void setDecl(ValueDecl *NewD); |
||
1309 | |||
1310 | DeclarationNameInfo getNameInfo() const { |
||
1311 | return DeclarationNameInfo(getDecl()->getDeclName(), getLocation(), DNLoc); |
||
1312 | } |
||
1313 | |||
1314 | SourceLocation getLocation() const { return DeclRefExprBits.Loc; } |
||
1315 | void setLocation(SourceLocation L) { DeclRefExprBits.Loc = L; } |
||
1316 | SourceLocation getBeginLoc() const LLVM_READONLY; |
||
1317 | SourceLocation getEndLoc() const LLVM_READONLY; |
||
1318 | |||
1319 | /// Determine whether this declaration reference was preceded by a |
||
1320 | /// C++ nested-name-specifier, e.g., \c N::foo. |
||
1321 | bool hasQualifier() const { return DeclRefExprBits.HasQualifier; } |
||
1322 | |||
1323 | /// If the name was qualified, retrieves the nested-name-specifier |
||
1324 | /// that precedes the name, with source-location information. |
||
1325 | NestedNameSpecifierLoc getQualifierLoc() const { |
||
1326 | if (!hasQualifier()) |
||
1327 | return NestedNameSpecifierLoc(); |
||
1328 | return *getTrailingObjects<NestedNameSpecifierLoc>(); |
||
1329 | } |
||
1330 | |||
1331 | /// If the name was qualified, retrieves the nested-name-specifier |
||
1332 | /// that precedes the name. Otherwise, returns NULL. |
||
1333 | NestedNameSpecifier *getQualifier() const { |
||
1334 | return getQualifierLoc().getNestedNameSpecifier(); |
||
1335 | } |
||
1336 | |||
1337 | /// Get the NamedDecl through which this reference occurred. |
||
1338 | /// |
||
1339 | /// This Decl may be different from the ValueDecl actually referred to in the |
||
1340 | /// presence of using declarations, etc. It always returns non-NULL, and may |
||
1341 | /// simple return the ValueDecl when appropriate. |
||
1342 | |||
1343 | NamedDecl *getFoundDecl() { |
||
1344 | return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D; |
||
1345 | } |
||
1346 | |||
1347 | /// Get the NamedDecl through which this reference occurred. |
||
1348 | /// See non-const variant. |
||
1349 | const NamedDecl *getFoundDecl() const { |
||
1350 | return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D; |
||
1351 | } |
||
1352 | |||
1353 | bool hasTemplateKWAndArgsInfo() const { |
||
1354 | return DeclRefExprBits.HasTemplateKWAndArgsInfo; |
||
1355 | } |
||
1356 | |||
1357 | /// Retrieve the location of the template keyword preceding |
||
1358 | /// this name, if any. |
||
1359 | SourceLocation getTemplateKeywordLoc() const { |
||
1360 | if (!hasTemplateKWAndArgsInfo()) |
||
1361 | return SourceLocation(); |
||
1362 | return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc; |
||
1363 | } |
||
1364 | |||
1365 | /// Retrieve the location of the left angle bracket starting the |
||
1366 | /// explicit template argument list following the name, if any. |
||
1367 | SourceLocation getLAngleLoc() const { |
||
1368 | if (!hasTemplateKWAndArgsInfo()) |
||
1369 | return SourceLocation(); |
||
1370 | return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc; |
||
1371 | } |
||
1372 | |||
1373 | /// Retrieve the location of the right angle bracket ending the |
||
1374 | /// explicit template argument list following the name, if any. |
||
1375 | SourceLocation getRAngleLoc() const { |
||
1376 | if (!hasTemplateKWAndArgsInfo()) |
||
1377 | return SourceLocation(); |
||
1378 | return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc; |
||
1379 | } |
||
1380 | |||
1381 | /// Determines whether the name in this declaration reference |
||
1382 | /// was preceded by the template keyword. |
||
1383 | bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } |
||
1384 | |||
1385 | /// Determines whether this declaration reference was followed by an |
||
1386 | /// explicit template argument list. |
||
1387 | bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } |
||
1388 | |||
1389 | /// Copies the template arguments (if present) into the given |
||
1390 | /// structure. |
||
1391 | void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { |
||
1392 | if (hasExplicitTemplateArgs()) |
||
1393 | getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto( |
||
1394 | getTrailingObjects<TemplateArgumentLoc>(), List); |
||
1395 | } |
||
1396 | |||
1397 | /// Retrieve the template arguments provided as part of this |
||
1398 | /// template-id. |
||
1399 | const TemplateArgumentLoc *getTemplateArgs() const { |
||
1400 | if (!hasExplicitTemplateArgs()) |
||
1401 | return nullptr; |
||
1402 | return getTrailingObjects<TemplateArgumentLoc>(); |
||
1403 | } |
||
1404 | |||
1405 | /// Retrieve the number of template arguments provided as part of this |
||
1406 | /// template-id. |
||
1407 | unsigned getNumTemplateArgs() const { |
||
1408 | if (!hasExplicitTemplateArgs()) |
||
1409 | return 0; |
||
1410 | return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs; |
||
1411 | } |
||
1412 | |||
1413 | ArrayRef<TemplateArgumentLoc> template_arguments() const { |
||
1414 | return {getTemplateArgs(), getNumTemplateArgs()}; |
||
1415 | } |
||
1416 | |||
1417 | /// Returns true if this expression refers to a function that |
||
1418 | /// was resolved from an overloaded set having size greater than 1. |
||
1419 | bool hadMultipleCandidates() const { |
||
1420 | return DeclRefExprBits.HadMultipleCandidates; |
||
1421 | } |
||
1422 | /// Sets the flag telling whether this expression refers to |
||
1423 | /// a function that was resolved from an overloaded set having size |
||
1424 | /// greater than 1. |
||
1425 | void setHadMultipleCandidates(bool V = true) { |
||
1426 | DeclRefExprBits.HadMultipleCandidates = V; |
||
1427 | } |
||
1428 | |||
1429 | /// Is this expression a non-odr-use reference, and if so, why? |
||
1430 | NonOdrUseReason isNonOdrUse() const { |
||
1431 | return static_cast<NonOdrUseReason>(DeclRefExprBits.NonOdrUseReason); |
||
1432 | } |
||
1433 | |||
1434 | /// Does this DeclRefExpr refer to an enclosing local or a captured |
||
1435 | /// variable? |
||
1436 | bool refersToEnclosingVariableOrCapture() const { |
||
1437 | return DeclRefExprBits.RefersToEnclosingVariableOrCapture; |
||
1438 | } |
||
1439 | |||
1440 | static bool classof(const Stmt *T) { |
||
1441 | return T->getStmtClass() == DeclRefExprClass; |
||
1442 | } |
||
1443 | |||
1444 | // Iterators |
||
1445 | child_range children() { |
||
1446 | return child_range(child_iterator(), child_iterator()); |
||
1447 | } |
||
1448 | |||
1449 | const_child_range children() const { |
||
1450 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
1451 | } |
||
1452 | }; |
||
1453 | |||
1454 | /// Used by IntegerLiteral/FloatingLiteral to store the numeric without |
||
1455 | /// leaking memory. |
||
1456 | /// |
||
1457 | /// For large floats/integers, APFloat/APInt will allocate memory from the heap |
||
1458 | /// to represent these numbers. Unfortunately, when we use a BumpPtrAllocator |
||
1459 | /// to allocate IntegerLiteral/FloatingLiteral nodes the memory associated with |
||
1460 | /// the APFloat/APInt values will never get freed. APNumericStorage uses |
||
1461 | /// ASTContext's allocator for memory allocation. |
||
1462 | class APNumericStorage { |
||
1463 | union { |
||
1464 | uint64_t VAL; ///< Used to store the <= 64 bits integer value. |
||
1465 | uint64_t *pVal; ///< Used to store the >64 bits integer value. |
||
1466 | }; |
||
1467 | unsigned BitWidth; |
||
1468 | |||
1469 | bool hasAllocation() const { return llvm::APInt::getNumWords(BitWidth) > 1; } |
||
1470 | |||
1471 | APNumericStorage(const APNumericStorage &) = delete; |
||
1472 | void operator=(const APNumericStorage &) = delete; |
||
1473 | |||
1474 | protected: |
||
1475 | APNumericStorage() : VAL(0), BitWidth(0) { } |
||
1476 | |||
1477 | llvm::APInt getIntValue() const { |
||
1478 | unsigned NumWords = llvm::APInt::getNumWords(BitWidth); |
||
1479 | if (NumWords > 1) |
||
1480 | return llvm::APInt(BitWidth, NumWords, pVal); |
||
1481 | else |
||
1482 | return llvm::APInt(BitWidth, VAL); |
||
1483 | } |
||
1484 | void setIntValue(const ASTContext &C, const llvm::APInt &Val); |
||
1485 | }; |
||
1486 | |||
1487 | class APIntStorage : private APNumericStorage { |
||
1488 | public: |
||
1489 | llvm::APInt getValue() const { return getIntValue(); } |
||
1490 | void setValue(const ASTContext &C, const llvm::APInt &Val) { |
||
1491 | setIntValue(C, Val); |
||
1492 | } |
||
1493 | }; |
||
1494 | |||
1495 | class APFloatStorage : private APNumericStorage { |
||
1496 | public: |
||
1497 | llvm::APFloat getValue(const llvm::fltSemantics &Semantics) const { |
||
1498 | return llvm::APFloat(Semantics, getIntValue()); |
||
1499 | } |
||
1500 | void setValue(const ASTContext &C, const llvm::APFloat &Val) { |
||
1501 | setIntValue(C, Val.bitcastToAPInt()); |
||
1502 | } |
||
1503 | }; |
||
1504 | |||
1505 | class IntegerLiteral : public Expr, public APIntStorage { |
||
1506 | SourceLocation Loc; |
||
1507 | |||
1508 | /// Construct an empty integer literal. |
||
1509 | explicit IntegerLiteral(EmptyShell Empty) |
||
1510 | : Expr(IntegerLiteralClass, Empty) { } |
||
1511 | |||
1512 | public: |
||
1513 | // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy, |
||
1514 | // or UnsignedLongLongTy |
||
1515 | IntegerLiteral(const ASTContext &C, const llvm::APInt &V, QualType type, |
||
1516 | SourceLocation l); |
||
1517 | |||
1518 | /// Returns a new integer literal with value 'V' and type 'type'. |
||
1519 | /// \param type - either IntTy, LongTy, LongLongTy, UnsignedIntTy, |
||
1520 | /// UnsignedLongTy, or UnsignedLongLongTy which should match the size of V |
||
1521 | /// \param V - the value that the returned integer literal contains. |
||
1522 | static IntegerLiteral *Create(const ASTContext &C, const llvm::APInt &V, |
||
1523 | QualType type, SourceLocation l); |
||
1524 | /// Returns a new empty integer literal. |
||
1525 | static IntegerLiteral *Create(const ASTContext &C, EmptyShell Empty); |
||
1526 | |||
1527 | SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; } |
||
1528 | SourceLocation getEndLoc() const LLVM_READONLY { return Loc; } |
||
1529 | |||
1530 | /// Retrieve the location of the literal. |
||
1531 | SourceLocation getLocation() const { return Loc; } |
||
1532 | |||
1533 | void setLocation(SourceLocation Location) { Loc = Location; } |
||
1534 | |||
1535 | static bool classof(const Stmt *T) { |
||
1536 | return T->getStmtClass() == IntegerLiteralClass; |
||
1537 | } |
||
1538 | |||
1539 | // Iterators |
||
1540 | child_range children() { |
||
1541 | return child_range(child_iterator(), child_iterator()); |
||
1542 | } |
||
1543 | const_child_range children() const { |
||
1544 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
1545 | } |
||
1546 | }; |
||
1547 | |||
1548 | class FixedPointLiteral : public Expr, public APIntStorage { |
||
1549 | SourceLocation Loc; |
||
1550 | unsigned Scale; |
||
1551 | |||
1552 | /// \brief Construct an empty fixed-point literal. |
||
1553 | explicit FixedPointLiteral(EmptyShell Empty) |
||
1554 | : Expr(FixedPointLiteralClass, Empty) {} |
||
1555 | |||
1556 | public: |
||
1557 | FixedPointLiteral(const ASTContext &C, const llvm::APInt &V, QualType type, |
||
1558 | SourceLocation l, unsigned Scale); |
||
1559 | |||
1560 | // Store the int as is without any bit shifting. |
||
1561 | static FixedPointLiteral *CreateFromRawInt(const ASTContext &C, |
||
1562 | const llvm::APInt &V, |
||
1563 | QualType type, SourceLocation l, |
||
1564 | unsigned Scale); |
||
1565 | |||
1566 | /// Returns an empty fixed-point literal. |
||
1567 | static FixedPointLiteral *Create(const ASTContext &C, EmptyShell Empty); |
||
1568 | |||
1569 | SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; } |
||
1570 | SourceLocation getEndLoc() const LLVM_READONLY { return Loc; } |
||
1571 | |||
1572 | /// \brief Retrieve the location of the literal. |
||
1573 | SourceLocation getLocation() const { return Loc; } |
||
1574 | |||
1575 | void setLocation(SourceLocation Location) { Loc = Location; } |
||
1576 | |||
1577 | unsigned getScale() const { return Scale; } |
||
1578 | void setScale(unsigned S) { Scale = S; } |
||
1579 | |||
1580 | static bool classof(const Stmt *T) { |
||
1581 | return T->getStmtClass() == FixedPointLiteralClass; |
||
1582 | } |
||
1583 | |||
1584 | std::string getValueAsString(unsigned Radix) const; |
||
1585 | |||
1586 | // Iterators |
||
1587 | child_range children() { |
||
1588 | return child_range(child_iterator(), child_iterator()); |
||
1589 | } |
||
1590 | const_child_range children() const { |
||
1591 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
1592 | } |
||
1593 | }; |
||
1594 | |||
1595 | class CharacterLiteral : public Expr { |
||
1596 | public: |
||
1597 | enum CharacterKind { |
||
1598 | Ascii, |
||
1599 | Wide, |
||
1600 | UTF8, |
||
1601 | UTF16, |
||
1602 | UTF32 |
||
1603 | }; |
||
1604 | |||
1605 | private: |
||
1606 | unsigned Value; |
||
1607 | SourceLocation Loc; |
||
1608 | public: |
||
1609 | // type should be IntTy |
||
1610 | CharacterLiteral(unsigned value, CharacterKind kind, QualType type, |
||
1611 | SourceLocation l) |
||
1612 | : Expr(CharacterLiteralClass, type, VK_PRValue, OK_Ordinary), |
||
1613 | Value(value), Loc(l) { |
||
1614 | CharacterLiteralBits.Kind = kind; |
||
1615 | setDependence(ExprDependence::None); |
||
1616 | } |
||
1617 | |||
1618 | /// Construct an empty character literal. |
||
1619 | CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { } |
||
1620 | |||
1621 | SourceLocation getLocation() const { return Loc; } |
||
1622 | CharacterKind getKind() const { |
||
1623 | return static_cast<CharacterKind>(CharacterLiteralBits.Kind); |
||
1624 | } |
||
1625 | |||
1626 | SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; } |
||
1627 | SourceLocation getEndLoc() const LLVM_READONLY { return Loc; } |
||
1628 | |||
1629 | unsigned getValue() const { return Value; } |
||
1630 | |||
1631 | void setLocation(SourceLocation Location) { Loc = Location; } |
||
1632 | void setKind(CharacterKind kind) { CharacterLiteralBits.Kind = kind; } |
||
1633 | void setValue(unsigned Val) { Value = Val; } |
||
1634 | |||
1635 | static bool classof(const Stmt *T) { |
||
1636 | return T->getStmtClass() == CharacterLiteralClass; |
||
1637 | } |
||
1638 | |||
1639 | static void print(unsigned val, CharacterKind Kind, raw_ostream &OS); |
||
1640 | |||
1641 | // Iterators |
||
1642 | child_range children() { |
||
1643 | return child_range(child_iterator(), child_iterator()); |
||
1644 | } |
||
1645 | const_child_range children() const { |
||
1646 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
1647 | } |
||
1648 | }; |
||
1649 | |||
1650 | class FloatingLiteral : public Expr, private APFloatStorage { |
||
1651 | SourceLocation Loc; |
||
1652 | |||
1653 | FloatingLiteral(const ASTContext &C, const llvm::APFloat &V, bool isexact, |
||
1654 | QualType Type, SourceLocation L); |
||
1655 | |||
1656 | /// Construct an empty floating-point literal. |
||
1657 | explicit FloatingLiteral(const ASTContext &C, EmptyShell Empty); |
||
1658 | |||
1659 | public: |
||
1660 | static FloatingLiteral *Create(const ASTContext &C, const llvm::APFloat &V, |
||
1661 | bool isexact, QualType Type, SourceLocation L); |
||
1662 | static FloatingLiteral *Create(const ASTContext &C, EmptyShell Empty); |
||
1663 | |||
1664 | llvm::APFloat getValue() const { |
||
1665 | return APFloatStorage::getValue(getSemantics()); |
||
1666 | } |
||
1667 | void setValue(const ASTContext &C, const llvm::APFloat &Val) { |
||
1668 | assert(&getSemantics() == &Val.getSemantics() && "Inconsistent semantics"); |
||
1669 | APFloatStorage::setValue(C, Val); |
||
1670 | } |
||
1671 | |||
1672 | /// Get a raw enumeration value representing the floating-point semantics of |
||
1673 | /// this literal (32-bit IEEE, x87, ...), suitable for serialisation. |
||
1674 | llvm::APFloatBase::Semantics getRawSemantics() const { |
||
1675 | return static_cast<llvm::APFloatBase::Semantics>( |
||
1676 | FloatingLiteralBits.Semantics); |
||
1677 | } |
||
1678 | |||
1679 | /// Set the raw enumeration value representing the floating-point semantics of |
||
1680 | /// this literal (32-bit IEEE, x87, ...), suitable for serialisation. |
||
1681 | void setRawSemantics(llvm::APFloatBase::Semantics Sem) { |
||
1682 | FloatingLiteralBits.Semantics = Sem; |
||
1683 | } |
||
1684 | |||
1685 | /// Return the APFloat semantics this literal uses. |
||
1686 | const llvm::fltSemantics &getSemantics() const { |
||
1687 | return llvm::APFloatBase::EnumToSemantics( |
||
1688 | static_cast<llvm::APFloatBase::Semantics>( |
||
1689 | FloatingLiteralBits.Semantics)); |
||
1690 | } |
||
1691 | |||
1692 | /// Set the APFloat semantics this literal uses. |
||
1693 | void setSemantics(const llvm::fltSemantics &Sem) { |
||
1694 | FloatingLiteralBits.Semantics = llvm::APFloatBase::SemanticsToEnum(Sem); |
||
1695 | } |
||
1696 | |||
1697 | bool isExact() const { return FloatingLiteralBits.IsExact; } |
||
1698 | void setExact(bool E) { FloatingLiteralBits.IsExact = E; } |
||
1699 | |||
1700 | /// getValueAsApproximateDouble - This returns the value as an inaccurate |
||
1701 | /// double. Note that this may cause loss of precision, but is useful for |
||
1702 | /// debugging dumps, etc. |
||
1703 | double getValueAsApproximateDouble() const; |
||
1704 | |||
1705 | SourceLocation getLocation() const { return Loc; } |
||
1706 | void setLocation(SourceLocation L) { Loc = L; } |
||
1707 | |||
1708 | SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; } |
||
1709 | SourceLocation getEndLoc() const LLVM_READONLY { return Loc; } |
||
1710 | |||
1711 | static bool classof(const Stmt *T) { |
||
1712 | return T->getStmtClass() == FloatingLiteralClass; |
||
1713 | } |
||
1714 | |||
1715 | // Iterators |
||
1716 | child_range children() { |
||
1717 | return child_range(child_iterator(), child_iterator()); |
||
1718 | } |
||
1719 | const_child_range children() const { |
||
1720 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
1721 | } |
||
1722 | }; |
||
1723 | |||
1724 | /// ImaginaryLiteral - We support imaginary integer and floating point literals, |
||
1725 | /// like "1.0i". We represent these as a wrapper around FloatingLiteral and |
||
1726 | /// IntegerLiteral classes. Instances of this class always have a Complex type |
||
1727 | /// whose element type matches the subexpression. |
||
1728 | /// |
||
1729 | class ImaginaryLiteral : public Expr { |
||
1730 | Stmt *Val; |
||
1731 | public: |
||
1732 | ImaginaryLiteral(Expr *val, QualType Ty) |
||
1733 | : Expr(ImaginaryLiteralClass, Ty, VK_PRValue, OK_Ordinary), Val(val) { |
||
1734 | setDependence(ExprDependence::None); |
||
1735 | } |
||
1736 | |||
1737 | /// Build an empty imaginary literal. |
||
1738 | explicit ImaginaryLiteral(EmptyShell Empty) |
||
1739 | : Expr(ImaginaryLiteralClass, Empty) { } |
||
1740 | |||
1741 | const Expr *getSubExpr() const { return cast<Expr>(Val); } |
||
1742 | Expr *getSubExpr() { return cast<Expr>(Val); } |
||
1743 | void setSubExpr(Expr *E) { Val = E; } |
||
1744 | |||
1745 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
1746 | return Val->getBeginLoc(); |
||
1747 | } |
||
1748 | SourceLocation getEndLoc() const LLVM_READONLY { return Val->getEndLoc(); } |
||
1749 | |||
1750 | static bool classof(const Stmt *T) { |
||
1751 | return T->getStmtClass() == ImaginaryLiteralClass; |
||
1752 | } |
||
1753 | |||
1754 | // Iterators |
||
1755 | child_range children() { return child_range(&Val, &Val+1); } |
||
1756 | const_child_range children() const { |
||
1757 | return const_child_range(&Val, &Val + 1); |
||
1758 | } |
||
1759 | }; |
||
1760 | |||
1761 | /// StringLiteral - This represents a string literal expression, e.g. "foo" |
||
1762 | /// or L"bar" (wide strings). The actual string data can be obtained with |
||
1763 | /// getBytes() and is NOT null-terminated. The length of the string data is |
||
1764 | /// determined by calling getByteLength(). |
||
1765 | /// |
||
1766 | /// The C type for a string is always a ConstantArrayType. In C++, the char |
||
1767 | /// type is const qualified, in C it is not. |
||
1768 | /// |
||
1769 | /// Note that strings in C can be formed by concatenation of multiple string |
||
1770 | /// literal pptokens in translation phase #6. This keeps track of the locations |
||
1771 | /// of each of these pieces. |
||
1772 | /// |
||
1773 | /// Strings in C can also be truncated and extended by assigning into arrays, |
||
1774 | /// e.g. with constructs like: |
||
1775 | /// char X[2] = "foobar"; |
||
1776 | /// In this case, getByteLength() will return 6, but the string literal will |
||
1777 | /// have type "char[2]". |
||
1778 | class StringLiteral final |
||
1779 | : public Expr, |
||
1780 | private llvm::TrailingObjects<StringLiteral, unsigned, SourceLocation, |
||
1781 | char> { |
||
1782 | friend class ASTStmtReader; |
||
1783 | friend TrailingObjects; |
||
1784 | |||
1785 | /// StringLiteral is followed by several trailing objects. They are in order: |
||
1786 | /// |
||
1787 | /// * A single unsigned storing the length in characters of this string. The |
||
1788 | /// length in bytes is this length times the width of a single character. |
||
1789 | /// Always present and stored as a trailing objects because storing it in |
||
1790 | /// StringLiteral would increase the size of StringLiteral by sizeof(void *) |
||
1791 | /// due to alignment requirements. If you add some data to StringLiteral, |
||
1792 | /// consider moving it inside StringLiteral. |
||
1793 | /// |
||
1794 | /// * An array of getNumConcatenated() SourceLocation, one for each of the |
||
1795 | /// token this string is made of. |
||
1796 | /// |
||
1797 | /// * An array of getByteLength() char used to store the string data. |
||
1798 | |||
1799 | public: |
||
1800 | enum StringKind { Ordinary, Wide, UTF8, UTF16, UTF32 }; |
||
1801 | |||
1802 | private: |
||
1803 | unsigned numTrailingObjects(OverloadToken<unsigned>) const { return 1; } |
||
1804 | unsigned numTrailingObjects(OverloadToken<SourceLocation>) const { |
||
1805 | return getNumConcatenated(); |
||
1806 | } |
||
1807 | |||
1808 | unsigned numTrailingObjects(OverloadToken<char>) const { |
||
1809 | return getByteLength(); |
||
1810 | } |
||
1811 | |||
1812 | char *getStrDataAsChar() { return getTrailingObjects<char>(); } |
||
1813 | const char *getStrDataAsChar() const { return getTrailingObjects<char>(); } |
||
1814 | |||
1815 | const uint16_t *getStrDataAsUInt16() const { |
||
1816 | return reinterpret_cast<const uint16_t *>(getTrailingObjects<char>()); |
||
1817 | } |
||
1818 | |||
1819 | const uint32_t *getStrDataAsUInt32() const { |
||
1820 | return reinterpret_cast<const uint32_t *>(getTrailingObjects<char>()); |
||
1821 | } |
||
1822 | |||
1823 | /// Build a string literal. |
||
1824 | StringLiteral(const ASTContext &Ctx, StringRef Str, StringKind Kind, |
||
1825 | bool Pascal, QualType Ty, const SourceLocation *Loc, |
||
1826 | unsigned NumConcatenated); |
||
1827 | |||
1828 | /// Build an empty string literal. |
||
1829 | StringLiteral(EmptyShell Empty, unsigned NumConcatenated, unsigned Length, |
||
1830 | unsigned CharByteWidth); |
||
1831 | |||
1832 | /// Map a target and string kind to the appropriate character width. |
||
1833 | static unsigned mapCharByteWidth(TargetInfo const &Target, StringKind SK); |
||
1834 | |||
1835 | /// Set one of the string literal token. |
||
1836 | void setStrTokenLoc(unsigned TokNum, SourceLocation L) { |
||
1837 | assert(TokNum < getNumConcatenated() && "Invalid tok number"); |
||
1838 | getTrailingObjects<SourceLocation>()[TokNum] = L; |
||
1839 | } |
||
1840 | |||
1841 | public: |
||
1842 | /// This is the "fully general" constructor that allows representation of |
||
1843 | /// strings formed from multiple concatenated tokens. |
||
1844 | static StringLiteral *Create(const ASTContext &Ctx, StringRef Str, |
||
1845 | StringKind Kind, bool Pascal, QualType Ty, |
||
1846 | const SourceLocation *Loc, |
||
1847 | unsigned NumConcatenated); |
||
1848 | |||
1849 | /// Simple constructor for string literals made from one token. |
||
1850 | static StringLiteral *Create(const ASTContext &Ctx, StringRef Str, |
||
1851 | StringKind Kind, bool Pascal, QualType Ty, |
||
1852 | SourceLocation Loc) { |
||
1853 | return Create(Ctx, Str, Kind, Pascal, Ty, &Loc, 1); |
||
1854 | } |
||
1855 | |||
1856 | /// Construct an empty string literal. |
||
1857 | static StringLiteral *CreateEmpty(const ASTContext &Ctx, |
||
1858 | unsigned NumConcatenated, unsigned Length, |
||
1859 | unsigned CharByteWidth); |
||
1860 | |||
1861 | StringRef getString() const { |
||
1862 | assert(getCharByteWidth() == 1 && |
||
1863 | "This function is used in places that assume strings use char"); |
||
1864 | return StringRef(getStrDataAsChar(), getByteLength()); |
||
1865 | } |
||
1866 | |||
1867 | /// Allow access to clients that need the byte representation, such as |
||
1868 | /// ASTWriterStmt::VisitStringLiteral(). |
||
1869 | StringRef getBytes() const { |
||
1870 | // FIXME: StringRef may not be the right type to use as a result for this. |
||
1871 | return StringRef(getStrDataAsChar(), getByteLength()); |
||
1872 | } |
||
1873 | |||
1874 | void outputString(raw_ostream &OS) const; |
||
1875 | |||
1876 | uint32_t getCodeUnit(size_t i) const { |
||
1877 | assert(i < getLength() && "out of bounds access"); |
||
1878 | switch (getCharByteWidth()) { |
||
1879 | case 1: |
||
1880 | return static_cast<unsigned char>(getStrDataAsChar()[i]); |
||
1881 | case 2: |
||
1882 | return getStrDataAsUInt16()[i]; |
||
1883 | case 4: |
||
1884 | return getStrDataAsUInt32()[i]; |
||
1885 | } |
||
1886 | llvm_unreachable("Unsupported character width!"); |
||
1887 | } |
||
1888 | |||
1889 | unsigned getByteLength() const { return getCharByteWidth() * getLength(); } |
||
1890 | unsigned getLength() const { return *getTrailingObjects<unsigned>(); } |
||
1891 | unsigned getCharByteWidth() const { return StringLiteralBits.CharByteWidth; } |
||
1892 | |||
1893 | StringKind getKind() const { |
||
1894 | return static_cast<StringKind>(StringLiteralBits.Kind); |
||
1895 | } |
||
1896 | |||
1897 | bool isOrdinary() const { return getKind() == Ordinary; } |
||
1898 | bool isWide() const { return getKind() == Wide; } |
||
1899 | bool isUTF8() const { return getKind() == UTF8; } |
||
1900 | bool isUTF16() const { return getKind() == UTF16; } |
||
1901 | bool isUTF32() const { return getKind() == UTF32; } |
||
1902 | bool isPascal() const { return StringLiteralBits.IsPascal; } |
||
1903 | |||
1904 | bool containsNonAscii() const { |
||
1905 | for (auto c : getString()) |
||
1906 | if (!isASCII(c)) |
||
1907 | return true; |
||
1908 | return false; |
||
1909 | } |
||
1910 | |||
1911 | bool containsNonAsciiOrNull() const { |
||
1912 | for (auto c : getString()) |
||
1913 | if (!isASCII(c) || !c) |
||
1914 | return true; |
||
1915 | return false; |
||
1916 | } |
||
1917 | |||
1918 | /// getNumConcatenated - Get the number of string literal tokens that were |
||
1919 | /// concatenated in translation phase #6 to form this string literal. |
||
1920 | unsigned getNumConcatenated() const { |
||
1921 | return StringLiteralBits.NumConcatenated; |
||
1922 | } |
||
1923 | |||
1924 | /// Get one of the string literal token. |
||
1925 | SourceLocation getStrTokenLoc(unsigned TokNum) const { |
||
1926 | assert(TokNum < getNumConcatenated() && "Invalid tok number"); |
||
1927 | return getTrailingObjects<SourceLocation>()[TokNum]; |
||
1928 | } |
||
1929 | |||
1930 | /// getLocationOfByte - Return a source location that points to the specified |
||
1931 | /// byte of this string literal. |
||
1932 | /// |
||
1933 | /// Strings are amazingly complex. They can be formed from multiple tokens |
||
1934 | /// and can have escape sequences in them in addition to the usual trigraph |
||
1935 | /// and escaped newline business. This routine handles this complexity. |
||
1936 | /// |
||
1937 | SourceLocation |
||
1938 | getLocationOfByte(unsigned ByteNo, const SourceManager &SM, |
||
1939 | const LangOptions &Features, const TargetInfo &Target, |
||
1940 | unsigned *StartToken = nullptr, |
||
1941 | unsigned *StartTokenByteOffset = nullptr) const; |
||
1942 | |||
1943 | typedef const SourceLocation *tokloc_iterator; |
||
1944 | |||
1945 | tokloc_iterator tokloc_begin() const { |
||
1946 | return getTrailingObjects<SourceLocation>(); |
||
1947 | } |
||
1948 | |||
1949 | tokloc_iterator tokloc_end() const { |
||
1950 | return getTrailingObjects<SourceLocation>() + getNumConcatenated(); |
||
1951 | } |
||
1952 | |||
1953 | SourceLocation getBeginLoc() const LLVM_READONLY { return *tokloc_begin(); } |
||
1954 | SourceLocation getEndLoc() const LLVM_READONLY { return *(tokloc_end() - 1); } |
||
1955 | |||
1956 | static bool classof(const Stmt *T) { |
||
1957 | return T->getStmtClass() == StringLiteralClass; |
||
1958 | } |
||
1959 | |||
1960 | // Iterators |
||
1961 | child_range children() { |
||
1962 | return child_range(child_iterator(), child_iterator()); |
||
1963 | } |
||
1964 | const_child_range children() const { |
||
1965 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
1966 | } |
||
1967 | }; |
||
1968 | |||
1969 | /// [C99 6.4.2.2] - A predefined identifier such as __func__. |
||
1970 | class PredefinedExpr final |
||
1971 | : public Expr, |
||
1972 | private llvm::TrailingObjects<PredefinedExpr, Stmt *> { |
||
1973 | friend class ASTStmtReader; |
||
1974 | friend TrailingObjects; |
||
1975 | |||
1976 | // PredefinedExpr is optionally followed by a single trailing |
||
1977 | // "Stmt *" for the predefined identifier. It is present if and only if |
||
1978 | // hasFunctionName() is true and is always a "StringLiteral *". |
||
1979 | |||
1980 | public: |
||
1981 | enum IdentKind { |
||
1982 | Func, |
||
1983 | Function, |
||
1984 | LFunction, // Same as Function, but as wide string. |
||
1985 | FuncDName, |
||
1986 | FuncSig, |
||
1987 | LFuncSig, // Same as FuncSig, but as wide string |
||
1988 | PrettyFunction, |
||
1989 | /// The same as PrettyFunction, except that the |
||
1990 | /// 'virtual' keyword is omitted for virtual member functions. |
||
1991 | PrettyFunctionNoVirtual |
||
1992 | }; |
||
1993 | |||
1994 | private: |
||
1995 | PredefinedExpr(SourceLocation L, QualType FNTy, IdentKind IK, |
||
1996 | StringLiteral *SL); |
||
1997 | |||
1998 | explicit PredefinedExpr(EmptyShell Empty, bool HasFunctionName); |
||
1999 | |||
2000 | /// True if this PredefinedExpr has storage for a function name. |
||
2001 | bool hasFunctionName() const { return PredefinedExprBits.HasFunctionName; } |
||
2002 | |||
2003 | void setFunctionName(StringLiteral *SL) { |
||
2004 | assert(hasFunctionName() && |
||
2005 | "This PredefinedExpr has no storage for a function name!"); |
||
2006 | *getTrailingObjects<Stmt *>() = SL; |
||
2007 | } |
||
2008 | |||
2009 | public: |
||
2010 | /// Create a PredefinedExpr. |
||
2011 | static PredefinedExpr *Create(const ASTContext &Ctx, SourceLocation L, |
||
2012 | QualType FNTy, IdentKind IK, StringLiteral *SL); |
||
2013 | |||
2014 | /// Create an empty PredefinedExpr. |
||
2015 | static PredefinedExpr *CreateEmpty(const ASTContext &Ctx, |
||
2016 | bool HasFunctionName); |
||
2017 | |||
2018 | IdentKind getIdentKind() const { |
||
2019 | return static_cast<IdentKind>(PredefinedExprBits.Kind); |
||
2020 | } |
||
2021 | |||
2022 | SourceLocation getLocation() const { return PredefinedExprBits.Loc; } |
||
2023 | void setLocation(SourceLocation L) { PredefinedExprBits.Loc = L; } |
||
2024 | |||
2025 | StringLiteral *getFunctionName() { |
||
2026 | return hasFunctionName() |
||
2027 | ? static_cast<StringLiteral *>(*getTrailingObjects<Stmt *>()) |
||
2028 | : nullptr; |
||
2029 | } |
||
2030 | |||
2031 | const StringLiteral *getFunctionName() const { |
||
2032 | return hasFunctionName() |
||
2033 | ? static_cast<StringLiteral *>(*getTrailingObjects<Stmt *>()) |
||
2034 | : nullptr; |
||
2035 | } |
||
2036 | |||
2037 | static StringRef getIdentKindName(IdentKind IK); |
||
2038 | StringRef getIdentKindName() const { |
||
2039 | return getIdentKindName(getIdentKind()); |
||
2040 | } |
||
2041 | |||
2042 | static std::string ComputeName(IdentKind IK, const Decl *CurrentDecl); |
||
2043 | |||
2044 | SourceLocation getBeginLoc() const { return getLocation(); } |
||
2045 | SourceLocation getEndLoc() const { return getLocation(); } |
||
2046 | |||
2047 | static bool classof(const Stmt *T) { |
||
2048 | return T->getStmtClass() == PredefinedExprClass; |
||
2049 | } |
||
2050 | |||
2051 | // Iterators |
||
2052 | child_range children() { |
||
2053 | return child_range(getTrailingObjects<Stmt *>(), |
||
2054 | getTrailingObjects<Stmt *>() + hasFunctionName()); |
||
2055 | } |
||
2056 | |||
2057 | const_child_range children() const { |
||
2058 | return const_child_range(getTrailingObjects<Stmt *>(), |
||
2059 | getTrailingObjects<Stmt *>() + hasFunctionName()); |
||
2060 | } |
||
2061 | }; |
||
2062 | |||
2063 | // This represents a use of the __builtin_sycl_unique_stable_name, which takes a |
||
2064 | // type-id, and at CodeGen time emits a unique string representation of the |
||
2065 | // type in a way that permits us to properly encode information about the SYCL |
||
2066 | // kernels. |
||
2067 | class SYCLUniqueStableNameExpr final : public Expr { |
||
2068 | friend class ASTStmtReader; |
||
2069 | SourceLocation OpLoc, LParen, RParen; |
||
2070 | TypeSourceInfo *TypeInfo; |
||
2071 | |||
2072 | SYCLUniqueStableNameExpr(EmptyShell Empty, QualType ResultTy); |
||
2073 | SYCLUniqueStableNameExpr(SourceLocation OpLoc, SourceLocation LParen, |
||
2074 | SourceLocation RParen, QualType ResultTy, |
||
2075 | TypeSourceInfo *TSI); |
||
2076 | |||
2077 | void setTypeSourceInfo(TypeSourceInfo *Ty) { TypeInfo = Ty; } |
||
2078 | |||
2079 | void setLocation(SourceLocation L) { OpLoc = L; } |
||
2080 | void setLParenLocation(SourceLocation L) { LParen = L; } |
||
2081 | void setRParenLocation(SourceLocation L) { RParen = L; } |
||
2082 | |||
2083 | public: |
||
2084 | TypeSourceInfo *getTypeSourceInfo() { return TypeInfo; } |
||
2085 | |||
2086 | const TypeSourceInfo *getTypeSourceInfo() const { return TypeInfo; } |
||
2087 | |||
2088 | static SYCLUniqueStableNameExpr * |
||
2089 | Create(const ASTContext &Ctx, SourceLocation OpLoc, SourceLocation LParen, |
||
2090 | SourceLocation RParen, TypeSourceInfo *TSI); |
||
2091 | |||
2092 | static SYCLUniqueStableNameExpr *CreateEmpty(const ASTContext &Ctx); |
||
2093 | |||
2094 | SourceLocation getBeginLoc() const { return getLocation(); } |
||
2095 | SourceLocation getEndLoc() const { return RParen; } |
||
2096 | SourceLocation getLocation() const { return OpLoc; } |
||
2097 | SourceLocation getLParenLocation() const { return LParen; } |
||
2098 | SourceLocation getRParenLocation() const { return RParen; } |
||
2099 | |||
2100 | static bool classof(const Stmt *T) { |
||
2101 | return T->getStmtClass() == SYCLUniqueStableNameExprClass; |
||
2102 | } |
||
2103 | |||
2104 | // Iterators |
||
2105 | child_range children() { |
||
2106 | return child_range(child_iterator(), child_iterator()); |
||
2107 | } |
||
2108 | |||
2109 | const_child_range children() const { |
||
2110 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
2111 | } |
||
2112 | |||
2113 | // Convenience function to generate the name of the currently stored type. |
||
2114 | std::string ComputeName(ASTContext &Context) const; |
||
2115 | |||
2116 | // Get the generated name of the type. Note that this only works after all |
||
2117 | // kernels have been instantiated. |
||
2118 | static std::string ComputeName(ASTContext &Context, QualType Ty); |
||
2119 | }; |
||
2120 | |||
2121 | /// ParenExpr - This represents a parethesized expression, e.g. "(1)". This |
||
2122 | /// AST node is only formed if full location information is requested. |
||
2123 | class ParenExpr : public Expr { |
||
2124 | SourceLocation L, R; |
||
2125 | Stmt *Val; |
||
2126 | public: |
||
2127 | ParenExpr(SourceLocation l, SourceLocation r, Expr *val) |
||
2128 | : Expr(ParenExprClass, val->getType(), val->getValueKind(), |
||
2129 | val->getObjectKind()), |
||
2130 | L(l), R(r), Val(val) { |
||
2131 | setDependence(computeDependence(this)); |
||
2132 | } |
||
2133 | |||
2134 | /// Construct an empty parenthesized expression. |
||
2135 | explicit ParenExpr(EmptyShell Empty) |
||
2136 | : Expr(ParenExprClass, Empty) { } |
||
2137 | |||
2138 | const Expr *getSubExpr() const { return cast<Expr>(Val); } |
||
2139 | Expr *getSubExpr() { return cast<Expr>(Val); } |
||
2140 | void setSubExpr(Expr *E) { Val = E; } |
||
2141 | |||
2142 | SourceLocation getBeginLoc() const LLVM_READONLY { return L; } |
||
2143 | SourceLocation getEndLoc() const LLVM_READONLY { return R; } |
||
2144 | |||
2145 | /// Get the location of the left parentheses '('. |
||
2146 | SourceLocation getLParen() const { return L; } |
||
2147 | void setLParen(SourceLocation Loc) { L = Loc; } |
||
2148 | |||
2149 | /// Get the location of the right parentheses ')'. |
||
2150 | SourceLocation getRParen() const { return R; } |
||
2151 | void setRParen(SourceLocation Loc) { R = Loc; } |
||
2152 | |||
2153 | static bool classof(const Stmt *T) { |
||
2154 | return T->getStmtClass() == ParenExprClass; |
||
2155 | } |
||
2156 | |||
2157 | // Iterators |
||
2158 | child_range children() { return child_range(&Val, &Val+1); } |
||
2159 | const_child_range children() const { |
||
2160 | return const_child_range(&Val, &Val + 1); |
||
2161 | } |
||
2162 | }; |
||
2163 | |||
2164 | /// UnaryOperator - This represents the unary-expression's (except sizeof and |
||
2165 | /// alignof), the postinc/postdec operators from postfix-expression, and various |
||
2166 | /// extensions. |
||
2167 | /// |
||
2168 | /// Notes on various nodes: |
||
2169 | /// |
||
2170 | /// Real/Imag - These return the real/imag part of a complex operand. If |
||
2171 | /// applied to a non-complex value, the former returns its operand and the |
||
2172 | /// later returns zero in the type of the operand. |
||
2173 | /// |
||
2174 | class UnaryOperator final |
||
2175 | : public Expr, |
||
2176 | private llvm::TrailingObjects<UnaryOperator, FPOptionsOverride> { |
||
2177 | Stmt *Val; |
||
2178 | |||
2179 | size_t numTrailingObjects(OverloadToken<FPOptionsOverride>) const { |
||
2180 | return UnaryOperatorBits.HasFPFeatures ? 1 : 0; |
||
2181 | } |
||
2182 | |||
2183 | FPOptionsOverride &getTrailingFPFeatures() { |
||
2184 | assert(UnaryOperatorBits.HasFPFeatures); |
||
2185 | return *getTrailingObjects<FPOptionsOverride>(); |
||
2186 | } |
||
2187 | |||
2188 | const FPOptionsOverride &getTrailingFPFeatures() const { |
||
2189 | assert(UnaryOperatorBits.HasFPFeatures); |
||
2190 | return *getTrailingObjects<FPOptionsOverride>(); |
||
2191 | } |
||
2192 | |||
2193 | public: |
||
2194 | typedef UnaryOperatorKind Opcode; |
||
2195 | |||
2196 | protected: |
||
2197 | UnaryOperator(const ASTContext &Ctx, Expr *input, Opcode opc, QualType type, |
||
2198 | ExprValueKind VK, ExprObjectKind OK, SourceLocation l, |
||
2199 | bool CanOverflow, FPOptionsOverride FPFeatures); |
||
2200 | |||
2201 | /// Build an empty unary operator. |
||
2202 | explicit UnaryOperator(bool HasFPFeatures, EmptyShell Empty) |
||
2203 | : Expr(UnaryOperatorClass, Empty) { |
||
2204 | UnaryOperatorBits.Opc = UO_AddrOf; |
||
2205 | UnaryOperatorBits.HasFPFeatures = HasFPFeatures; |
||
2206 | } |
||
2207 | |||
2208 | public: |
||
2209 | static UnaryOperator *CreateEmpty(const ASTContext &C, bool hasFPFeatures); |
||
2210 | |||
2211 | static UnaryOperator *Create(const ASTContext &C, Expr *input, Opcode opc, |
||
2212 | QualType type, ExprValueKind VK, |
||
2213 | ExprObjectKind OK, SourceLocation l, |
||
2214 | bool CanOverflow, FPOptionsOverride FPFeatures); |
||
2215 | |||
2216 | Opcode getOpcode() const { |
||
2217 | return static_cast<Opcode>(UnaryOperatorBits.Opc); |
||
2218 | } |
||
2219 | void setOpcode(Opcode Opc) { UnaryOperatorBits.Opc = Opc; } |
||
2220 | |||
2221 | Expr *getSubExpr() const { return cast<Expr>(Val); } |
||
2222 | void setSubExpr(Expr *E) { Val = E; } |
||
2223 | |||
2224 | /// getOperatorLoc - Return the location of the operator. |
||
2225 | SourceLocation getOperatorLoc() const { return UnaryOperatorBits.Loc; } |
||
2226 | void setOperatorLoc(SourceLocation L) { UnaryOperatorBits.Loc = L; } |
||
2227 | |||
2228 | /// Returns true if the unary operator can cause an overflow. For instance, |
||
2229 | /// signed int i = INT_MAX; i++; |
||
2230 | /// signed char c = CHAR_MAX; c++; |
||
2231 | /// Due to integer promotions, c++ is promoted to an int before the postfix |
||
2232 | /// increment, and the result is an int that cannot overflow. However, i++ |
||
2233 | /// can overflow. |
||
2234 | bool canOverflow() const { return UnaryOperatorBits.CanOverflow; } |
||
2235 | void setCanOverflow(bool C) { UnaryOperatorBits.CanOverflow = C; } |
||
2236 | |||
2237 | // Get the FP contractability status of this operator. Only meaningful for |
||
2238 | // operations on floating point types. |
||
2239 | bool isFPContractableWithinStatement(const LangOptions &LO) const { |
||
2240 | return getFPFeaturesInEffect(LO).allowFPContractWithinStatement(); |
||
2241 | } |
||
2242 | |||
2243 | // Get the FENV_ACCESS status of this operator. Only meaningful for |
||
2244 | // operations on floating point types. |
||
2245 | bool isFEnvAccessOn(const LangOptions &LO) const { |
||
2246 | return getFPFeaturesInEffect(LO).getAllowFEnvAccess(); |
||
2247 | } |
||
2248 | |||
2249 | /// isPostfix - Return true if this is a postfix operation, like x++. |
||
2250 | static bool isPostfix(Opcode Op) { |
||
2251 | return Op == UO_PostInc || Op == UO_PostDec; |
||
2252 | } |
||
2253 | |||
2254 | /// isPrefix - Return true if this is a prefix operation, like --x. |
||
2255 | static bool isPrefix(Opcode Op) { |
||
2256 | return Op == UO_PreInc || Op == UO_PreDec; |
||
2257 | } |
||
2258 | |||
2259 | bool isPrefix() const { return isPrefix(getOpcode()); } |
||
2260 | bool isPostfix() const { return isPostfix(getOpcode()); } |
||
2261 | |||
2262 | static bool isIncrementOp(Opcode Op) { |
||
2263 | return Op == UO_PreInc || Op == UO_PostInc; |
||
2264 | } |
||
2265 | bool isIncrementOp() const { |
||
2266 | return isIncrementOp(getOpcode()); |
||
2267 | } |
||
2268 | |||
2269 | static bool isDecrementOp(Opcode Op) { |
||
2270 | return Op == UO_PreDec || Op == UO_PostDec; |
||
2271 | } |
||
2272 | bool isDecrementOp() const { |
||
2273 | return isDecrementOp(getOpcode()); |
||
2274 | } |
||
2275 | |||
2276 | static bool isIncrementDecrementOp(Opcode Op) { return Op <= UO_PreDec; } |
||
2277 | bool isIncrementDecrementOp() const { |
||
2278 | return isIncrementDecrementOp(getOpcode()); |
||
2279 | } |
||
2280 | |||
2281 | static bool isArithmeticOp(Opcode Op) { |
||
2282 | return Op >= UO_Plus && Op <= UO_LNot; |
||
2283 | } |
||
2284 | bool isArithmeticOp() const { return isArithmeticOp(getOpcode()); } |
||
2285 | |||
2286 | /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it |
||
2287 | /// corresponds to, e.g. "sizeof" or "[pre]++" |
||
2288 | static StringRef getOpcodeStr(Opcode Op); |
||
2289 | |||
2290 | /// Retrieve the unary opcode that corresponds to the given |
||
2291 | /// overloaded operator. |
||
2292 | static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix); |
||
2293 | |||
2294 | /// Retrieve the overloaded operator kind that corresponds to |
||
2295 | /// the given unary opcode. |
||
2296 | static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); |
||
2297 | |||
2298 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
2299 | return isPostfix() ? Val->getBeginLoc() : getOperatorLoc(); |
||
2300 | } |
||
2301 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
2302 | return isPostfix() ? getOperatorLoc() : Val->getEndLoc(); |
||
2303 | } |
||
2304 | SourceLocation getExprLoc() const { return getOperatorLoc(); } |
||
2305 | |||
2306 | static bool classof(const Stmt *T) { |
||
2307 | return T->getStmtClass() == UnaryOperatorClass; |
||
2308 | } |
||
2309 | |||
2310 | // Iterators |
||
2311 | child_range children() { return child_range(&Val, &Val+1); } |
||
2312 | const_child_range children() const { |
||
2313 | return const_child_range(&Val, &Val + 1); |
||
2314 | } |
||
2315 | |||
2316 | /// Is FPFeatures in Trailing Storage? |
||
2317 | bool hasStoredFPFeatures() const { return UnaryOperatorBits.HasFPFeatures; } |
||
2318 | |||
2319 | /// Get FPFeatures from trailing storage. |
||
2320 | FPOptionsOverride getStoredFPFeatures() const { |
||
2321 | return getTrailingFPFeatures(); |
||
2322 | } |
||
2323 | |||
2324 | protected: |
||
2325 | /// Set FPFeatures in trailing storage, used only by Serialization |
||
2326 | void setStoredFPFeatures(FPOptionsOverride F) { getTrailingFPFeatures() = F; } |
||
2327 | |||
2328 | public: |
||
2329 | // Get the FP features status of this operator. Only meaningful for |
||
2330 | // operations on floating point types. |
||
2331 | FPOptions getFPFeaturesInEffect(const LangOptions &LO) const { |
||
2332 | if (UnaryOperatorBits.HasFPFeatures) |
||
2333 | return getStoredFPFeatures().applyOverrides(LO); |
||
2334 | return FPOptions::defaultWithoutTrailingStorage(LO); |
||
2335 | } |
||
2336 | FPOptionsOverride getFPOptionsOverride() const { |
||
2337 | if (UnaryOperatorBits.HasFPFeatures) |
||
2338 | return getStoredFPFeatures(); |
||
2339 | return FPOptionsOverride(); |
||
2340 | } |
||
2341 | |||
2342 | friend TrailingObjects; |
||
2343 | friend class ASTReader; |
||
2344 | friend class ASTStmtReader; |
||
2345 | friend class ASTStmtWriter; |
||
2346 | }; |
||
2347 | |||
2348 | /// Helper class for OffsetOfExpr. |
||
2349 | |||
2350 | // __builtin_offsetof(type, identifier(.identifier|[expr])*) |
||
2351 | class OffsetOfNode { |
||
2352 | public: |
||
2353 | /// The kind of offsetof node we have. |
||
2354 | enum Kind { |
||
2355 | /// An index into an array. |
||
2356 | Array = 0x00, |
||
2357 | /// A field. |
||
2358 | Field = 0x01, |
||
2359 | /// A field in a dependent type, known only by its name. |
||
2360 | Identifier = 0x02, |
||
2361 | /// An implicit indirection through a C++ base class, when the |
||
2362 | /// field found is in a base class. |
||
2363 | Base = 0x03 |
||
2364 | }; |
||
2365 | |||
2366 | private: |
||
2367 | enum { MaskBits = 2, Mask = 0x03 }; |
||
2368 | |||
2369 | /// The source range that covers this part of the designator. |
||
2370 | SourceRange Range; |
||
2371 | |||
2372 | /// The data describing the designator, which comes in three |
||
2373 | /// different forms, depending on the lower two bits. |
||
2374 | /// - An unsigned index into the array of Expr*'s stored after this node |
||
2375 | /// in memory, for [constant-expression] designators. |
||
2376 | /// - A FieldDecl*, for references to a known field. |
||
2377 | /// - An IdentifierInfo*, for references to a field with a given name |
||
2378 | /// when the class type is dependent. |
||
2379 | /// - A CXXBaseSpecifier*, for references that look at a field in a |
||
2380 | /// base class. |
||
2381 | uintptr_t Data; |
||
2382 | |||
2383 | public: |
||
2384 | /// Create an offsetof node that refers to an array element. |
||
2385 | OffsetOfNode(SourceLocation LBracketLoc, unsigned Index, |
||
2386 | SourceLocation RBracketLoc) |
||
2387 | : Range(LBracketLoc, RBracketLoc), Data((Index << 2) | Array) {} |
||
2388 | |||
2389 | /// Create an offsetof node that refers to a field. |
||
2390 | OffsetOfNode(SourceLocation DotLoc, FieldDecl *Field, SourceLocation NameLoc) |
||
2391 | : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc), |
||
2392 | Data(reinterpret_cast<uintptr_t>(Field) | OffsetOfNode::Field) {} |
||
2393 | |||
2394 | /// Create an offsetof node that refers to an identifier. |
||
2395 | OffsetOfNode(SourceLocation DotLoc, IdentifierInfo *Name, |
||
2396 | SourceLocation NameLoc) |
||
2397 | : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc), |
||
2398 | Data(reinterpret_cast<uintptr_t>(Name) | Identifier) {} |
||
2399 | |||
2400 | /// Create an offsetof node that refers into a C++ base class. |
||
2401 | explicit OffsetOfNode(const CXXBaseSpecifier *Base) |
||
2402 | : Data(reinterpret_cast<uintptr_t>(Base) | OffsetOfNode::Base) {} |
||
2403 | |||
2404 | /// Determine what kind of offsetof node this is. |
||
2405 | Kind getKind() const { return static_cast<Kind>(Data & Mask); } |
||
2406 | |||
2407 | /// For an array element node, returns the index into the array |
||
2408 | /// of expressions. |
||
2409 | unsigned getArrayExprIndex() const { |
||
2410 | assert(getKind() == Array); |
||
2411 | return Data >> 2; |
||
2412 | } |
||
2413 | |||
2414 | /// For a field offsetof node, returns the field. |
||
2415 | FieldDecl *getField() const { |
||
2416 | assert(getKind() == Field); |
||
2417 | return reinterpret_cast<FieldDecl *>(Data & ~(uintptr_t)Mask); |
||
2418 | } |
||
2419 | |||
2420 | /// For a field or identifier offsetof node, returns the name of |
||
2421 | /// the field. |
||
2422 | IdentifierInfo *getFieldName() const; |
||
2423 | |||
2424 | /// For a base class node, returns the base specifier. |
||
2425 | CXXBaseSpecifier *getBase() const { |
||
2426 | assert(getKind() == Base); |
||
2427 | return reinterpret_cast<CXXBaseSpecifier *>(Data & ~(uintptr_t)Mask); |
||
2428 | } |
||
2429 | |||
2430 | /// Retrieve the source range that covers this offsetof node. |
||
2431 | /// |
||
2432 | /// For an array element node, the source range contains the locations of |
||
2433 | /// the square brackets. For a field or identifier node, the source range |
||
2434 | /// contains the location of the period (if there is one) and the |
||
2435 | /// identifier. |
||
2436 | SourceRange getSourceRange() const LLVM_READONLY { return Range; } |
||
2437 | SourceLocation getBeginLoc() const LLVM_READONLY { return Range.getBegin(); } |
||
2438 | SourceLocation getEndLoc() const LLVM_READONLY { return Range.getEnd(); } |
||
2439 | }; |
||
2440 | |||
2441 | /// OffsetOfExpr - [C99 7.17] - This represents an expression of the form |
||
2442 | /// offsetof(record-type, member-designator). For example, given: |
||
2443 | /// @code |
||
2444 | /// struct S { |
||
2445 | /// float f; |
||
2446 | /// double d; |
||
2447 | /// }; |
||
2448 | /// struct T { |
||
2449 | /// int i; |
||
2450 | /// struct S s[10]; |
||
2451 | /// }; |
||
2452 | /// @endcode |
||
2453 | /// we can represent and evaluate the expression @c offsetof(struct T, s[2].d). |
||
2454 | |||
2455 | class OffsetOfExpr final |
||
2456 | : public Expr, |
||
2457 | private llvm::TrailingObjects<OffsetOfExpr, OffsetOfNode, Expr *> { |
||
2458 | SourceLocation OperatorLoc, RParenLoc; |
||
2459 | // Base type; |
||
2460 | TypeSourceInfo *TSInfo; |
||
2461 | // Number of sub-components (i.e. instances of OffsetOfNode). |
||
2462 | unsigned NumComps; |
||
2463 | // Number of sub-expressions (i.e. array subscript expressions). |
||
2464 | unsigned NumExprs; |
||
2465 | |||
2466 | size_t numTrailingObjects(OverloadToken<OffsetOfNode>) const { |
||
2467 | return NumComps; |
||
2468 | } |
||
2469 | |||
2470 | OffsetOfExpr(const ASTContext &C, QualType type, |
||
2471 | SourceLocation OperatorLoc, TypeSourceInfo *tsi, |
||
2472 | ArrayRef<OffsetOfNode> comps, ArrayRef<Expr*> exprs, |
||
2473 | SourceLocation RParenLoc); |
||
2474 | |||
2475 | explicit OffsetOfExpr(unsigned numComps, unsigned numExprs) |
||
2476 | : Expr(OffsetOfExprClass, EmptyShell()), |
||
2477 | TSInfo(nullptr), NumComps(numComps), NumExprs(numExprs) {} |
||
2478 | |||
2479 | public: |
||
2480 | |||
2481 | static OffsetOfExpr *Create(const ASTContext &C, QualType type, |
||
2482 | SourceLocation OperatorLoc, TypeSourceInfo *tsi, |
||
2483 | ArrayRef<OffsetOfNode> comps, |
||
2484 | ArrayRef<Expr*> exprs, SourceLocation RParenLoc); |
||
2485 | |||
2486 | static OffsetOfExpr *CreateEmpty(const ASTContext &C, |
||
2487 | unsigned NumComps, unsigned NumExprs); |
||
2488 | |||
2489 | /// getOperatorLoc - Return the location of the operator. |
||
2490 | SourceLocation getOperatorLoc() const { return OperatorLoc; } |
||
2491 | void setOperatorLoc(SourceLocation L) { OperatorLoc = L; } |
||
2492 | |||
2493 | /// Return the location of the right parentheses. |
||
2494 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
2495 | void setRParenLoc(SourceLocation R) { RParenLoc = R; } |
||
2496 | |||
2497 | TypeSourceInfo *getTypeSourceInfo() const { |
||
2498 | return TSInfo; |
||
2499 | } |
||
2500 | void setTypeSourceInfo(TypeSourceInfo *tsi) { |
||
2501 | TSInfo = tsi; |
||
2502 | } |
||
2503 | |||
2504 | const OffsetOfNode &getComponent(unsigned Idx) const { |
||
2505 | assert(Idx < NumComps && "Subscript out of range"); |
||
2506 | return getTrailingObjects<OffsetOfNode>()[Idx]; |
||
2507 | } |
||
2508 | |||
2509 | void setComponent(unsigned Idx, OffsetOfNode ON) { |
||
2510 | assert(Idx < NumComps && "Subscript out of range"); |
||
2511 | getTrailingObjects<OffsetOfNode>()[Idx] = ON; |
||
2512 | } |
||
2513 | |||
2514 | unsigned getNumComponents() const { |
||
2515 | return NumComps; |
||
2516 | } |
||
2517 | |||
2518 | Expr* getIndexExpr(unsigned Idx) { |
||
2519 | assert(Idx < NumExprs && "Subscript out of range"); |
||
2520 | return getTrailingObjects<Expr *>()[Idx]; |
||
2521 | } |
||
2522 | |||
2523 | const Expr *getIndexExpr(unsigned Idx) const { |
||
2524 | assert(Idx < NumExprs && "Subscript out of range"); |
||
2525 | return getTrailingObjects<Expr *>()[Idx]; |
||
2526 | } |
||
2527 | |||
2528 | void setIndexExpr(unsigned Idx, Expr* E) { |
||
2529 | assert(Idx < NumComps && "Subscript out of range"); |
||
2530 | getTrailingObjects<Expr *>()[Idx] = E; |
||
2531 | } |
||
2532 | |||
2533 | unsigned getNumExpressions() const { |
||
2534 | return NumExprs; |
||
2535 | } |
||
2536 | |||
2537 | SourceLocation getBeginLoc() const LLVM_READONLY { return OperatorLoc; } |
||
2538 | SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } |
||
2539 | |||
2540 | static bool classof(const Stmt *T) { |
||
2541 | return T->getStmtClass() == OffsetOfExprClass; |
||
2542 | } |
||
2543 | |||
2544 | // Iterators |
||
2545 | child_range children() { |
||
2546 | Stmt **begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>()); |
||
2547 | return child_range(begin, begin + NumExprs); |
||
2548 | } |
||
2549 | const_child_range children() const { |
||
2550 | Stmt *const *begin = |
||
2551 | reinterpret_cast<Stmt *const *>(getTrailingObjects<Expr *>()); |
||
2552 | return const_child_range(begin, begin + NumExprs); |
||
2553 | } |
||
2554 | friend TrailingObjects; |
||
2555 | }; |
||
2556 | |||
2557 | /// UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) |
||
2558 | /// expression operand. Used for sizeof/alignof (C99 6.5.3.4) and |
||
2559 | /// vec_step (OpenCL 1.1 6.11.12). |
||
2560 | class UnaryExprOrTypeTraitExpr : public Expr { |
||
2561 | union { |
||
2562 | TypeSourceInfo *Ty; |
||
2563 | Stmt *Ex; |
||
2564 | } Argument; |
||
2565 | SourceLocation OpLoc, RParenLoc; |
||
2566 | |||
2567 | public: |
||
2568 | UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo, |
||
2569 | QualType resultType, SourceLocation op, |
||
2570 | SourceLocation rp) |
||
2571 | : Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_PRValue, |
||
2572 | OK_Ordinary), |
||
2573 | OpLoc(op), RParenLoc(rp) { |
||
2574 | assert(ExprKind <= UETT_Last && "invalid enum value!"); |
||
2575 | UnaryExprOrTypeTraitExprBits.Kind = ExprKind; |
||
2576 | assert(static_cast<unsigned>(ExprKind) == |
||
2577 | UnaryExprOrTypeTraitExprBits.Kind && |
||
2578 | "UnaryExprOrTypeTraitExprBits.Kind overflow!"); |
||
2579 | UnaryExprOrTypeTraitExprBits.IsType = true; |
||
2580 | Argument.Ty = TInfo; |
||
2581 | setDependence(computeDependence(this)); |
||
2582 | } |
||
2583 | |||
2584 | UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, Expr *E, |
||
2585 | QualType resultType, SourceLocation op, |
||
2586 | SourceLocation rp); |
||
2587 | |||
2588 | /// Construct an empty sizeof/alignof expression. |
||
2589 | explicit UnaryExprOrTypeTraitExpr(EmptyShell Empty) |
||
2590 | : Expr(UnaryExprOrTypeTraitExprClass, Empty) { } |
||
2591 | |||
2592 | UnaryExprOrTypeTrait getKind() const { |
||
2593 | return static_cast<UnaryExprOrTypeTrait>(UnaryExprOrTypeTraitExprBits.Kind); |
||
2594 | } |
||
2595 | void setKind(UnaryExprOrTypeTrait K) { |
||
2596 | assert(K <= UETT_Last && "invalid enum value!"); |
||
2597 | UnaryExprOrTypeTraitExprBits.Kind = K; |
||
2598 | assert(static_cast<unsigned>(K) == UnaryExprOrTypeTraitExprBits.Kind && |
||
2599 | "UnaryExprOrTypeTraitExprBits.Kind overflow!"); |
||
2600 | } |
||
2601 | |||
2602 | bool isArgumentType() const { return UnaryExprOrTypeTraitExprBits.IsType; } |
||
2603 | QualType getArgumentType() const { |
||
2604 | return getArgumentTypeInfo()->getType(); |
||
2605 | } |
||
2606 | TypeSourceInfo *getArgumentTypeInfo() const { |
||
2607 | assert(isArgumentType() && "calling getArgumentType() when arg is expr"); |
||
2608 | return Argument.Ty; |
||
2609 | } |
||
2610 | Expr *getArgumentExpr() { |
||
2611 | assert(!isArgumentType() && "calling getArgumentExpr() when arg is type"); |
||
2612 | return static_cast<Expr*>(Argument.Ex); |
||
2613 | } |
||
2614 | const Expr *getArgumentExpr() const { |
||
2615 | return const_cast<UnaryExprOrTypeTraitExpr*>(this)->getArgumentExpr(); |
||
2616 | } |
||
2617 | |||
2618 | void setArgument(Expr *E) { |
||
2619 | Argument.Ex = E; |
||
2620 | UnaryExprOrTypeTraitExprBits.IsType = false; |
||
2621 | } |
||
2622 | void setArgument(TypeSourceInfo *TInfo) { |
||
2623 | Argument.Ty = TInfo; |
||
2624 | UnaryExprOrTypeTraitExprBits.IsType = true; |
||
2625 | } |
||
2626 | |||
2627 | /// Gets the argument type, or the type of the argument expression, whichever |
||
2628 | /// is appropriate. |
||
2629 | QualType getTypeOfArgument() const { |
||
2630 | return isArgumentType() ? getArgumentType() : getArgumentExpr()->getType(); |
||
2631 | } |
||
2632 | |||
2633 | SourceLocation getOperatorLoc() const { return OpLoc; } |
||
2634 | void setOperatorLoc(SourceLocation L) { OpLoc = L; } |
||
2635 | |||
2636 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
2637 | void setRParenLoc(SourceLocation L) { RParenLoc = L; } |
||
2638 | |||
2639 | SourceLocation getBeginLoc() const LLVM_READONLY { return OpLoc; } |
||
2640 | SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } |
||
2641 | |||
2642 | static bool classof(const Stmt *T) { |
||
2643 | return T->getStmtClass() == UnaryExprOrTypeTraitExprClass; |
||
2644 | } |
||
2645 | |||
2646 | // Iterators |
||
2647 | child_range children(); |
||
2648 | const_child_range children() const; |
||
2649 | }; |
||
2650 | |||
2651 | //===----------------------------------------------------------------------===// |
||
2652 | // Postfix Operators. |
||
2653 | //===----------------------------------------------------------------------===// |
||
2654 | |||
2655 | /// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting. |
||
2656 | class ArraySubscriptExpr : public Expr { |
||
2657 | enum { LHS, RHS, END_EXPR }; |
||
2658 | Stmt *SubExprs[END_EXPR]; |
||
2659 | |||
2660 | bool lhsIsBase() const { return getRHS()->getType()->isIntegerType(); } |
||
2661 | |||
2662 | public: |
||
2663 | ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t, ExprValueKind VK, |
||
2664 | ExprObjectKind OK, SourceLocation rbracketloc) |
||
2665 | : Expr(ArraySubscriptExprClass, t, VK, OK) { |
||
2666 | SubExprs[LHS] = lhs; |
||
2667 | SubExprs[RHS] = rhs; |
||
2668 | ArrayOrMatrixSubscriptExprBits.RBracketLoc = rbracketloc; |
||
2669 | setDependence(computeDependence(this)); |
||
2670 | } |
||
2671 | |||
2672 | /// Create an empty array subscript expression. |
||
2673 | explicit ArraySubscriptExpr(EmptyShell Shell) |
||
2674 | : Expr(ArraySubscriptExprClass, Shell) { } |
||
2675 | |||
2676 | /// An array access can be written A[4] or 4[A] (both are equivalent). |
||
2677 | /// - getBase() and getIdx() always present the normalized view: A[4]. |
||
2678 | /// In this case getBase() returns "A" and getIdx() returns "4". |
||
2679 | /// - getLHS() and getRHS() present the syntactic view. e.g. for |
||
2680 | /// 4[A] getLHS() returns "4". |
||
2681 | /// Note: Because vector element access is also written A[4] we must |
||
2682 | /// predicate the format conversion in getBase and getIdx only on the |
||
2683 | /// the type of the RHS, as it is possible for the LHS to be a vector of |
||
2684 | /// integer type |
||
2685 | Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); } |
||
2686 | const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } |
||
2687 | void setLHS(Expr *E) { SubExprs[LHS] = E; } |
||
2688 | |||
2689 | Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); } |
||
2690 | const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } |
||
2691 | void setRHS(Expr *E) { SubExprs[RHS] = E; } |
||
2692 | |||
2693 | Expr *getBase() { return lhsIsBase() ? getLHS() : getRHS(); } |
||
2694 | const Expr *getBase() const { return lhsIsBase() ? getLHS() : getRHS(); } |
||
2695 | |||
2696 | Expr *getIdx() { return lhsIsBase() ? getRHS() : getLHS(); } |
||
2697 | const Expr *getIdx() const { return lhsIsBase() ? getRHS() : getLHS(); } |
||
2698 | |||
2699 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
2700 | return getLHS()->getBeginLoc(); |
||
2701 | } |
||
2702 | SourceLocation getEndLoc() const { return getRBracketLoc(); } |
||
2703 | |||
2704 | SourceLocation getRBracketLoc() const { |
||
2705 | return ArrayOrMatrixSubscriptExprBits.RBracketLoc; |
||
2706 | } |
||
2707 | void setRBracketLoc(SourceLocation L) { |
||
2708 | ArrayOrMatrixSubscriptExprBits.RBracketLoc = L; |
||
2709 | } |
||
2710 | |||
2711 | SourceLocation getExprLoc() const LLVM_READONLY { |
||
2712 | return getBase()->getExprLoc(); |
||
2713 | } |
||
2714 | |||
2715 | static bool classof(const Stmt *T) { |
||
2716 | return T->getStmtClass() == ArraySubscriptExprClass; |
||
2717 | } |
||
2718 | |||
2719 | // Iterators |
||
2720 | child_range children() { |
||
2721 | return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); |
||
2722 | } |
||
2723 | const_child_range children() const { |
||
2724 | return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); |
||
2725 | } |
||
2726 | }; |
||
2727 | |||
2728 | /// MatrixSubscriptExpr - Matrix subscript expression for the MatrixType |
||
2729 | /// extension. |
||
2730 | /// MatrixSubscriptExpr can be either incomplete (only Base and RowIdx are set |
||
2731 | /// so far, the type is IncompleteMatrixIdx) or complete (Base, RowIdx and |
||
2732 | /// ColumnIdx refer to valid expressions). Incomplete matrix expressions only |
||
2733 | /// exist during the initial construction of the AST. |
||
2734 | class MatrixSubscriptExpr : public Expr { |
||
2735 | enum { BASE, ROW_IDX, COLUMN_IDX, END_EXPR }; |
||
2736 | Stmt *SubExprs[END_EXPR]; |
||
2737 | |||
2738 | public: |
||
2739 | MatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, QualType T, |
||
2740 | SourceLocation RBracketLoc) |
||
2741 | : Expr(MatrixSubscriptExprClass, T, Base->getValueKind(), |
||
2742 | OK_MatrixComponent) { |
||
2743 | SubExprs[BASE] = Base; |
||
2744 | SubExprs[ROW_IDX] = RowIdx; |
||
2745 | SubExprs[COLUMN_IDX] = ColumnIdx; |
||
2746 | ArrayOrMatrixSubscriptExprBits.RBracketLoc = RBracketLoc; |
||
2747 | setDependence(computeDependence(this)); |
||
2748 | } |
||
2749 | |||
2750 | /// Create an empty matrix subscript expression. |
||
2751 | explicit MatrixSubscriptExpr(EmptyShell Shell) |
||
2752 | : Expr(MatrixSubscriptExprClass, Shell) {} |
||
2753 | |||
2754 | bool isIncomplete() const { |
||
2755 | bool IsIncomplete = hasPlaceholderType(BuiltinType::IncompleteMatrixIdx); |
||
2756 | assert((SubExprs[COLUMN_IDX] || IsIncomplete) && |
||
2757 | "expressions without column index must be marked as incomplete"); |
||
2758 | return IsIncomplete; |
||
2759 | } |
||
2760 | Expr *getBase() { return cast<Expr>(SubExprs[BASE]); } |
||
2761 | const Expr *getBase() const { return cast<Expr>(SubExprs[BASE]); } |
||
2762 | void setBase(Expr *E) { SubExprs[BASE] = E; } |
||
2763 | |||
2764 | Expr *getRowIdx() { return cast<Expr>(SubExprs[ROW_IDX]); } |
||
2765 | const Expr *getRowIdx() const { return cast<Expr>(SubExprs[ROW_IDX]); } |
||
2766 | void setRowIdx(Expr *E) { SubExprs[ROW_IDX] = E; } |
||
2767 | |||
2768 | Expr *getColumnIdx() { return cast_or_null<Expr>(SubExprs[COLUMN_IDX]); } |
||
2769 | const Expr *getColumnIdx() const { |
||
2770 | assert(!isIncomplete() && |
||
2771 | "cannot get the column index of an incomplete expression"); |
||
2772 | return cast<Expr>(SubExprs[COLUMN_IDX]); |
||
2773 | } |
||
2774 | void setColumnIdx(Expr *E) { SubExprs[COLUMN_IDX] = E; } |
||
2775 | |||
2776 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
2777 | return getBase()->getBeginLoc(); |
||
2778 | } |
||
2779 | |||
2780 | SourceLocation getEndLoc() const { return getRBracketLoc(); } |
||
2781 | |||
2782 | SourceLocation getExprLoc() const LLVM_READONLY { |
||
2783 | return getBase()->getExprLoc(); |
||
2784 | } |
||
2785 | |||
2786 | SourceLocation getRBracketLoc() const { |
||
2787 | return ArrayOrMatrixSubscriptExprBits.RBracketLoc; |
||
2788 | } |
||
2789 | void setRBracketLoc(SourceLocation L) { |
||
2790 | ArrayOrMatrixSubscriptExprBits.RBracketLoc = L; |
||
2791 | } |
||
2792 | |||
2793 | static bool classof(const Stmt *T) { |
||
2794 | return T->getStmtClass() == MatrixSubscriptExprClass; |
||
2795 | } |
||
2796 | |||
2797 | // Iterators |
||
2798 | child_range children() { |
||
2799 | return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); |
||
2800 | } |
||
2801 | const_child_range children() const { |
||
2802 | return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); |
||
2803 | } |
||
2804 | }; |
||
2805 | |||
2806 | /// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]). |
||
2807 | /// CallExpr itself represents a normal function call, e.g., "f(x, 2)", |
||
2808 | /// while its subclasses may represent alternative syntax that (semantically) |
||
2809 | /// results in a function call. For example, CXXOperatorCallExpr is |
||
2810 | /// a subclass for overloaded operator calls that use operator syntax, e.g., |
||
2811 | /// "str1 + str2" to resolve to a function call. |
||
2812 | class CallExpr : public Expr { |
||
2813 | enum { FN = 0, PREARGS_START = 1 }; |
||
2814 | |||
2815 | /// The number of arguments in the call expression. |
||
2816 | unsigned NumArgs; |
||
2817 | |||
2818 | /// The location of the right parenthese. This has a different meaning for |
||
2819 | /// the derived classes of CallExpr. |
||
2820 | SourceLocation RParenLoc; |
||
2821 | |||
2822 | // CallExpr store some data in trailing objects. However since CallExpr |
||
2823 | // is used a base of other expression classes we cannot use |
||
2824 | // llvm::TrailingObjects. Instead we manually perform the pointer arithmetic |
||
2825 | // and casts. |
||
2826 | // |
||
2827 | // The trailing objects are in order: |
||
2828 | // |
||
2829 | // * A single "Stmt *" for the callee expression. |
||
2830 | // |
||
2831 | // * An array of getNumPreArgs() "Stmt *" for the pre-argument expressions. |
||
2832 | // |
||
2833 | // * An array of getNumArgs() "Stmt *" for the argument expressions. |
||
2834 | // |
||
2835 | // * An optional of type FPOptionsOverride. |
||
2836 | // |
||
2837 | // Note that we store the offset in bytes from the this pointer to the start |
||
2838 | // of the trailing objects. It would be perfectly possible to compute it |
||
2839 | // based on the dynamic kind of the CallExpr. However 1.) we have plenty of |
||
2840 | // space in the bit-fields of Stmt. 2.) It was benchmarked to be faster to |
||
2841 | // compute this once and then load the offset from the bit-fields of Stmt, |
||
2842 | // instead of re-computing the offset each time the trailing objects are |
||
2843 | // accessed. |
||
2844 | |||
2845 | /// Return a pointer to the start of the trailing array of "Stmt *". |
||
2846 | Stmt **getTrailingStmts() { |
||
2847 | return reinterpret_cast<Stmt **>(reinterpret_cast<char *>(this) + |
||
2848 | CallExprBits.OffsetToTrailingObjects); |
||
2849 | } |
||
2850 | Stmt *const *getTrailingStmts() const { |
||
2851 | return const_cast<CallExpr *>(this)->getTrailingStmts(); |
||
2852 | } |
||
2853 | |||
2854 | /// Map a statement class to the appropriate offset in bytes from the |
||
2855 | /// this pointer to the trailing objects. |
||
2856 | static unsigned offsetToTrailingObjects(StmtClass SC); |
||
2857 | |||
2858 | unsigned getSizeOfTrailingStmts() const { |
||
2859 | return (1 + getNumPreArgs() + getNumArgs()) * sizeof(Stmt *); |
||
2860 | } |
||
2861 | |||
2862 | size_t getOffsetOfTrailingFPFeatures() const { |
||
2863 | assert(hasStoredFPFeatures()); |
||
2864 | return CallExprBits.OffsetToTrailingObjects + getSizeOfTrailingStmts(); |
||
2865 | } |
||
2866 | |||
2867 | public: |
||
2868 | enum class ADLCallKind : bool { NotADL, UsesADL }; |
||
2869 | static constexpr ADLCallKind NotADL = ADLCallKind::NotADL; |
||
2870 | static constexpr ADLCallKind UsesADL = ADLCallKind::UsesADL; |
||
2871 | |||
2872 | protected: |
||
2873 | /// Build a call expression, assuming that appropriate storage has been |
||
2874 | /// allocated for the trailing objects. |
||
2875 | CallExpr(StmtClass SC, Expr *Fn, ArrayRef<Expr *> PreArgs, |
||
2876 | ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK, |
||
2877 | SourceLocation RParenLoc, FPOptionsOverride FPFeatures, |
||
2878 | unsigned MinNumArgs, ADLCallKind UsesADL); |
||
2879 | |||
2880 | /// Build an empty call expression, for deserialization. |
||
2881 | CallExpr(StmtClass SC, unsigned NumPreArgs, unsigned NumArgs, |
||
2882 | bool hasFPFeatures, EmptyShell Empty); |
||
2883 | |||
2884 | /// Return the size in bytes needed for the trailing objects. |
||
2885 | /// Used by the derived classes to allocate the right amount of storage. |
||
2886 | static unsigned sizeOfTrailingObjects(unsigned NumPreArgs, unsigned NumArgs, |
||
2887 | bool HasFPFeatures) { |
||
2888 | return (1 + NumPreArgs + NumArgs) * sizeof(Stmt *) + |
||
2889 | HasFPFeatures * sizeof(FPOptionsOverride); |
||
2890 | } |
||
2891 | |||
2892 | Stmt *getPreArg(unsigned I) { |
||
2893 | assert(I < getNumPreArgs() && "Prearg access out of range!"); |
||
2894 | return getTrailingStmts()[PREARGS_START + I]; |
||
2895 | } |
||
2896 | const Stmt *getPreArg(unsigned I) const { |
||
2897 | assert(I < getNumPreArgs() && "Prearg access out of range!"); |
||
2898 | return getTrailingStmts()[PREARGS_START + I]; |
||
2899 | } |
||
2900 | void setPreArg(unsigned I, Stmt *PreArg) { |
||
2901 | assert(I < getNumPreArgs() && "Prearg access out of range!"); |
||
2902 | getTrailingStmts()[PREARGS_START + I] = PreArg; |
||
2903 | } |
||
2904 | |||
2905 | unsigned getNumPreArgs() const { return CallExprBits.NumPreArgs; } |
||
2906 | |||
2907 | /// Return a pointer to the trailing FPOptions |
||
2908 | FPOptionsOverride *getTrailingFPFeatures() { |
||
2909 | assert(hasStoredFPFeatures()); |
||
2910 | return reinterpret_cast<FPOptionsOverride *>( |
||
2911 | reinterpret_cast<char *>(this) + CallExprBits.OffsetToTrailingObjects + |
||
2912 | getSizeOfTrailingStmts()); |
||
2913 | } |
||
2914 | const FPOptionsOverride *getTrailingFPFeatures() const { |
||
2915 | assert(hasStoredFPFeatures()); |
||
2916 | return reinterpret_cast<const FPOptionsOverride *>( |
||
2917 | reinterpret_cast<const char *>(this) + |
||
2918 | CallExprBits.OffsetToTrailingObjects + getSizeOfTrailingStmts()); |
||
2919 | } |
||
2920 | |||
2921 | public: |
||
2922 | /// Create a call expression. |
||
2923 | /// \param Fn The callee expression, |
||
2924 | /// \param Args The argument array, |
||
2925 | /// \param Ty The type of the call expression (which is *not* the return |
||
2926 | /// type in general), |
||
2927 | /// \param VK The value kind of the call expression (lvalue, rvalue, ...), |
||
2928 | /// \param RParenLoc The location of the right parenthesis in the call |
||
2929 | /// expression. |
||
2930 | /// \param FPFeatures Floating-point features associated with the call, |
||
2931 | /// \param MinNumArgs Specifies the minimum number of arguments. The actual |
||
2932 | /// number of arguments will be the greater of Args.size() |
||
2933 | /// and MinNumArgs. This is used in a few places to allocate |
||
2934 | /// enough storage for the default arguments. |
||
2935 | /// \param UsesADL Specifies whether the callee was found through |
||
2936 | /// argument-dependent lookup. |
||
2937 | /// |
||
2938 | /// Note that you can use CreateTemporary if you need a temporary call |
||
2939 | /// expression on the stack. |
||
2940 | static CallExpr *Create(const ASTContext &Ctx, Expr *Fn, |
||
2941 | ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK, |
||
2942 | SourceLocation RParenLoc, |
||
2943 | FPOptionsOverride FPFeatures, unsigned MinNumArgs = 0, |
||
2944 | ADLCallKind UsesADL = NotADL); |
||
2945 | |||
2946 | /// Create a temporary call expression with no arguments in the memory |
||
2947 | /// pointed to by Mem. Mem must points to at least sizeof(CallExpr) |
||
2948 | /// + sizeof(Stmt *) bytes of storage, aligned to alignof(CallExpr): |
||
2949 | /// |
||
2950 | /// \code{.cpp} |
||
2951 | /// alignas(CallExpr) char Buffer[sizeof(CallExpr) + sizeof(Stmt *)]; |
||
2952 | /// CallExpr *TheCall = CallExpr::CreateTemporary(Buffer, etc); |
||
2953 | /// \endcode |
||
2954 | static CallExpr *CreateTemporary(void *Mem, Expr *Fn, QualType Ty, |
||
2955 | ExprValueKind VK, SourceLocation RParenLoc, |
||
2956 | ADLCallKind UsesADL = NotADL); |
||
2957 | |||
2958 | /// Create an empty call expression, for deserialization. |
||
2959 | static CallExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, |
||
2960 | bool HasFPFeatures, EmptyShell Empty); |
||
2961 | |||
2962 | Expr *getCallee() { return cast<Expr>(getTrailingStmts()[FN]); } |
||
2963 | const Expr *getCallee() const { return cast<Expr>(getTrailingStmts()[FN]); } |
||
2964 | void setCallee(Expr *F) { getTrailingStmts()[FN] = F; } |
||
2965 | |||
2966 | ADLCallKind getADLCallKind() const { |
||
2967 | return static_cast<ADLCallKind>(CallExprBits.UsesADL); |
||
2968 | } |
||
2969 | void setADLCallKind(ADLCallKind V = UsesADL) { |
||
2970 | CallExprBits.UsesADL = static_cast<bool>(V); |
||
2971 | } |
||
2972 | bool usesADL() const { return getADLCallKind() == UsesADL; } |
||
2973 | |||
2974 | bool hasStoredFPFeatures() const { return CallExprBits.HasFPFeatures; } |
||
2975 | |||
2976 | Decl *getCalleeDecl() { return getCallee()->getReferencedDeclOfCallee(); } |
||
2977 | const Decl *getCalleeDecl() const { |
||
2978 | return getCallee()->getReferencedDeclOfCallee(); |
||
2979 | } |
||
2980 | |||
2981 | /// If the callee is a FunctionDecl, return it. Otherwise return null. |
||
2982 | FunctionDecl *getDirectCallee() { |
||
2983 | return dyn_cast_or_null<FunctionDecl>(getCalleeDecl()); |
||
2984 | } |
||
2985 | const FunctionDecl *getDirectCallee() const { |
||
2986 | return dyn_cast_or_null<FunctionDecl>(getCalleeDecl()); |
||
2987 | } |
||
2988 | |||
2989 | /// getNumArgs - Return the number of actual arguments to this call. |
||
2990 | unsigned getNumArgs() const { return NumArgs; } |
||
2991 | |||
2992 | /// Retrieve the call arguments. |
||
2993 | Expr **getArgs() { |
||
2994 | return reinterpret_cast<Expr **>(getTrailingStmts() + PREARGS_START + |
||
2995 | getNumPreArgs()); |
||
2996 | } |
||
2997 | const Expr *const *getArgs() const { |
||
2998 | return reinterpret_cast<const Expr *const *>( |
||
2999 | getTrailingStmts() + PREARGS_START + getNumPreArgs()); |
||
3000 | } |
||
3001 | |||
3002 | /// getArg - Return the specified argument. |
||
3003 | Expr *getArg(unsigned Arg) { |
||
3004 | assert(Arg < getNumArgs() && "Arg access out of range!"); |
||
3005 | return getArgs()[Arg]; |
||
3006 | } |
||
3007 | const Expr *getArg(unsigned Arg) const { |
||
3008 | assert(Arg < getNumArgs() && "Arg access out of range!"); |
||
3009 | return getArgs()[Arg]; |
||
3010 | } |
||
3011 | |||
3012 | /// setArg - Set the specified argument. |
||
3013 | /// ! the dependence bits might be stale after calling this setter, it is |
||
3014 | /// *caller*'s responsibility to recompute them by calling |
||
3015 | /// computeDependence(). |
||
3016 | void setArg(unsigned Arg, Expr *ArgExpr) { |
||
3017 | assert(Arg < getNumArgs() && "Arg access out of range!"); |
||
3018 | getArgs()[Arg] = ArgExpr; |
||
3019 | } |
||
3020 | |||
3021 | /// Compute and set dependence bits. |
||
3022 | void computeDependence() { |
||
3023 | setDependence(clang::computeDependence( |
||
3024 | this, llvm::ArrayRef( |
||
3025 | reinterpret_cast<Expr **>(getTrailingStmts() + PREARGS_START), |
||
3026 | getNumPreArgs()))); |
||
3027 | } |
||
3028 | |||
3029 | /// Reduce the number of arguments in this call expression. This is used for |
||
3030 | /// example during error recovery to drop extra arguments. There is no way |
||
3031 | /// to perform the opposite because: 1.) We don't track how much storage |
||
3032 | /// we have for the argument array 2.) This would potentially require growing |
||
3033 | /// the argument array, something we cannot support since the arguments are |
||
3034 | /// stored in a trailing array. |
||
3035 | void shrinkNumArgs(unsigned NewNumArgs) { |
||
3036 | assert((NewNumArgs <= getNumArgs()) && |
||
3037 | "shrinkNumArgs cannot increase the number of arguments!"); |
||
3038 | NumArgs = NewNumArgs; |
||
3039 | } |
||
3040 | |||
3041 | /// Bluntly set a new number of arguments without doing any checks whatsoever. |
||
3042 | /// Only used during construction of a CallExpr in a few places in Sema. |
||
3043 | /// FIXME: Find a way to remove it. |
||
3044 | void setNumArgsUnsafe(unsigned NewNumArgs) { NumArgs = NewNumArgs; } |
||
3045 | |||
3046 | typedef ExprIterator arg_iterator; |
||
3047 | typedef ConstExprIterator const_arg_iterator; |
||
3048 | typedef llvm::iterator_range<arg_iterator> arg_range; |
||
3049 | typedef llvm::iterator_range<const_arg_iterator> const_arg_range; |
||
3050 | |||
3051 | arg_range arguments() { return arg_range(arg_begin(), arg_end()); } |
||
3052 | const_arg_range arguments() const { |
||
3053 | return const_arg_range(arg_begin(), arg_end()); |
||
3054 | } |
||
3055 | |||
3056 | arg_iterator arg_begin() { |
||
3057 | return getTrailingStmts() + PREARGS_START + getNumPreArgs(); |
||
3058 | } |
||
3059 | arg_iterator arg_end() { return arg_begin() + getNumArgs(); } |
||
3060 | |||
3061 | const_arg_iterator arg_begin() const { |
||
3062 | return getTrailingStmts() + PREARGS_START + getNumPreArgs(); |
||
3063 | } |
||
3064 | const_arg_iterator arg_end() const { return arg_begin() + getNumArgs(); } |
||
3065 | |||
3066 | /// This method provides fast access to all the subexpressions of |
||
3067 | /// a CallExpr without going through the slower virtual child_iterator |
||
3068 | /// interface. This provides efficient reverse iteration of the |
||
3069 | /// subexpressions. This is currently used for CFG construction. |
||
3070 | ArrayRef<Stmt *> getRawSubExprs() { |
||
3071 | return llvm::ArrayRef(getTrailingStmts(), |
||
3072 | PREARGS_START + getNumPreArgs() + getNumArgs()); |
||
3073 | } |
||
3074 | |||
3075 | /// Get FPOptionsOverride from trailing storage. |
||
3076 | FPOptionsOverride getStoredFPFeatures() const { |
||
3077 | assert(hasStoredFPFeatures()); |
||
3078 | return *getTrailingFPFeatures(); |
||
3079 | } |
||
3080 | /// Set FPOptionsOverride in trailing storage. Used only by Serialization. |
||
3081 | void setStoredFPFeatures(FPOptionsOverride F) { |
||
3082 | assert(hasStoredFPFeatures()); |
||
3083 | *getTrailingFPFeatures() = F; |
||
3084 | } |
||
3085 | |||
3086 | // Get the FP features status of this operator. Only meaningful for |
||
3087 | // operations on floating point types. |
||
3088 | FPOptions getFPFeaturesInEffect(const LangOptions &LO) const { |
||
3089 | if (hasStoredFPFeatures()) |
||
3090 | return getStoredFPFeatures().applyOverrides(LO); |
||
3091 | return FPOptions::defaultWithoutTrailingStorage(LO); |
||
3092 | } |
||
3093 | |||
3094 | FPOptionsOverride getFPFeatures() const { |
||
3095 | if (hasStoredFPFeatures()) |
||
3096 | return getStoredFPFeatures(); |
||
3097 | return FPOptionsOverride(); |
||
3098 | } |
||
3099 | |||
3100 | /// getBuiltinCallee - If this is a call to a builtin, return the builtin ID |
||
3101 | /// of the callee. If not, return 0. |
||
3102 | unsigned getBuiltinCallee() const; |
||
3103 | |||
3104 | /// Returns \c true if this is a call to a builtin which does not |
||
3105 | /// evaluate side-effects within its arguments. |
||
3106 | bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const; |
||
3107 | |||
3108 | /// getCallReturnType - Get the return type of the call expr. This is not |
||
3109 | /// always the type of the expr itself, if the return type is a reference |
||
3110 | /// type. |
||
3111 | QualType getCallReturnType(const ASTContext &Ctx) const; |
||
3112 | |||
3113 | /// Returns the WarnUnusedResultAttr that is either declared on the called |
||
3114 | /// function, or its return type declaration. |
||
3115 | const Attr *getUnusedResultAttr(const ASTContext &Ctx) const; |
||
3116 | |||
3117 | /// Returns true if this call expression should warn on unused results. |
||
3118 | bool hasUnusedResultAttr(const ASTContext &Ctx) const { |
||
3119 | return getUnusedResultAttr(Ctx) != nullptr; |
||
3120 | } |
||
3121 | |||
3122 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
3123 | void setRParenLoc(SourceLocation L) { RParenLoc = L; } |
||
3124 | |||
3125 | SourceLocation getBeginLoc() const LLVM_READONLY; |
||
3126 | SourceLocation getEndLoc() const LLVM_READONLY; |
||
3127 | |||
3128 | /// Return true if this is a call to __assume() or __builtin_assume() with |
||
3129 | /// a non-value-dependent constant parameter evaluating as false. |
||
3130 | bool isBuiltinAssumeFalse(const ASTContext &Ctx) const; |
||
3131 | |||
3132 | /// Used by Sema to implement MSVC-compatible delayed name lookup. |
||
3133 | /// (Usually Exprs themselves should set dependence). |
||
3134 | void markDependentForPostponedNameLookup() { |
||
3135 | setDependence(getDependence() | ExprDependence::TypeValueInstantiation); |
||
3136 | } |
||
3137 | |||
3138 | bool isCallToStdMove() const; |
||
3139 | |||
3140 | static bool classof(const Stmt *T) { |
||
3141 | return T->getStmtClass() >= firstCallExprConstant && |
||
3142 | T->getStmtClass() <= lastCallExprConstant; |
||
3143 | } |
||
3144 | |||
3145 | // Iterators |
||
3146 | child_range children() { |
||
3147 | return child_range(getTrailingStmts(), getTrailingStmts() + PREARGS_START + |
||
3148 | getNumPreArgs() + getNumArgs()); |
||
3149 | } |
||
3150 | |||
3151 | const_child_range children() const { |
||
3152 | return const_child_range(getTrailingStmts(), |
||
3153 | getTrailingStmts() + PREARGS_START + |
||
3154 | getNumPreArgs() + getNumArgs()); |
||
3155 | } |
||
3156 | }; |
||
3157 | |||
3158 | /// Extra data stored in some MemberExpr objects. |
||
3159 | struct MemberExprNameQualifier { |
||
3160 | /// The nested-name-specifier that qualifies the name, including |
||
3161 | /// source-location information. |
||
3162 | NestedNameSpecifierLoc QualifierLoc; |
||
3163 | |||
3164 | /// The DeclAccessPair through which the MemberDecl was found due to |
||
3165 | /// name qualifiers. |
||
3166 | DeclAccessPair FoundDecl; |
||
3167 | }; |
||
3168 | |||
3169 | /// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F. |
||
3170 | /// |
||
3171 | class MemberExpr final |
||
3172 | : public Expr, |
||
3173 | private llvm::TrailingObjects<MemberExpr, MemberExprNameQualifier, |
||
3174 | ASTTemplateKWAndArgsInfo, |
||
3175 | TemplateArgumentLoc> { |
||
3176 | friend class ASTReader; |
||
3177 | friend class ASTStmtReader; |
||
3178 | friend class ASTStmtWriter; |
||
3179 | friend TrailingObjects; |
||
3180 | |||
3181 | /// Base - the expression for the base pointer or structure references. In |
||
3182 | /// X.F, this is "X". |
||
3183 | Stmt *Base; |
||
3184 | |||
3185 | /// MemberDecl - This is the decl being referenced by the field/member name. |
||
3186 | /// In X.F, this is the decl referenced by F. |
||
3187 | ValueDecl *MemberDecl; |
||
3188 | |||
3189 | /// MemberDNLoc - Provides source/type location info for the |
||
3190 | /// declaration name embedded in MemberDecl. |
||
3191 | DeclarationNameLoc MemberDNLoc; |
||
3192 | |||
3193 | /// MemberLoc - This is the location of the member name. |
||
3194 | SourceLocation MemberLoc; |
||
3195 | |||
3196 | size_t numTrailingObjects(OverloadToken<MemberExprNameQualifier>) const { |
||
3197 | return hasQualifierOrFoundDecl(); |
||
3198 | } |
||
3199 | |||
3200 | size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const { |
||
3201 | return hasTemplateKWAndArgsInfo(); |
||
3202 | } |
||
3203 | |||
3204 | bool hasQualifierOrFoundDecl() const { |
||
3205 | return MemberExprBits.HasQualifierOrFoundDecl; |
||
3206 | } |
||
3207 | |||
3208 | bool hasTemplateKWAndArgsInfo() const { |
||
3209 | return MemberExprBits.HasTemplateKWAndArgsInfo; |
||
3210 | } |
||
3211 | |||
3212 | MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc, |
||
3213 | ValueDecl *MemberDecl, const DeclarationNameInfo &NameInfo, |
||
3214 | QualType T, ExprValueKind VK, ExprObjectKind OK, |
||
3215 | NonOdrUseReason NOUR); |
||
3216 | MemberExpr(EmptyShell Empty) |
||
3217 | : Expr(MemberExprClass, Empty), Base(), MemberDecl() {} |
||
3218 | |||
3219 | public: |
||
3220 | static MemberExpr *Create(const ASTContext &C, Expr *Base, bool IsArrow, |
||
3221 | SourceLocation OperatorLoc, |
||
3222 | NestedNameSpecifierLoc QualifierLoc, |
||
3223 | SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, |
||
3224 | DeclAccessPair FoundDecl, |
||
3225 | DeclarationNameInfo MemberNameInfo, |
||
3226 | const TemplateArgumentListInfo *TemplateArgs, |
||
3227 | QualType T, ExprValueKind VK, ExprObjectKind OK, |
||
3228 | NonOdrUseReason NOUR); |
||
3229 | |||
3230 | /// Create an implicit MemberExpr, with no location, qualifier, template |
||
3231 | /// arguments, and so on. Suitable only for non-static member access. |
||
3232 | static MemberExpr *CreateImplicit(const ASTContext &C, Expr *Base, |
||
3233 | bool IsArrow, ValueDecl *MemberDecl, |
||
3234 | QualType T, ExprValueKind VK, |
||
3235 | ExprObjectKind OK) { |
||
3236 | return Create(C, Base, IsArrow, SourceLocation(), NestedNameSpecifierLoc(), |
||
3237 | SourceLocation(), MemberDecl, |
||
3238 | DeclAccessPair::make(MemberDecl, MemberDecl->getAccess()), |
||
3239 | DeclarationNameInfo(), nullptr, T, VK, OK, NOUR_None); |
||
3240 | } |
||
3241 | |||
3242 | static MemberExpr *CreateEmpty(const ASTContext &Context, bool HasQualifier, |
||
3243 | bool HasFoundDecl, |
||
3244 | bool HasTemplateKWAndArgsInfo, |
||
3245 | unsigned NumTemplateArgs); |
||
3246 | |||
3247 | void setBase(Expr *E) { Base = E; } |
||
3248 | Expr *getBase() const { return cast<Expr>(Base); } |
||
3249 | |||
3250 | /// Retrieve the member declaration to which this expression refers. |
||
3251 | /// |
||
3252 | /// The returned declaration will be a FieldDecl or (in C++) a VarDecl (for |
||
3253 | /// static data members), a CXXMethodDecl, or an EnumConstantDecl. |
||
3254 | ValueDecl *getMemberDecl() const { return MemberDecl; } |
||
3255 | void setMemberDecl(ValueDecl *D); |
||
3256 | |||
3257 | /// Retrieves the declaration found by lookup. |
||
3258 | DeclAccessPair getFoundDecl() const { |
||
3259 | if (!hasQualifierOrFoundDecl()) |
||
3260 | return DeclAccessPair::make(getMemberDecl(), |
||
3261 | getMemberDecl()->getAccess()); |
||
3262 | return getTrailingObjects<MemberExprNameQualifier>()->FoundDecl; |
||
3263 | } |
||
3264 | |||
3265 | /// Determines whether this member expression actually had |
||
3266 | /// a C++ nested-name-specifier prior to the name of the member, e.g., |
||
3267 | /// x->Base::foo. |
||
3268 | bool hasQualifier() const { return getQualifier() != nullptr; } |
||
3269 | |||
3270 | /// If the member name was qualified, retrieves the |
||
3271 | /// nested-name-specifier that precedes the member name, with source-location |
||
3272 | /// information. |
||
3273 | NestedNameSpecifierLoc getQualifierLoc() const { |
||
3274 | if (!hasQualifierOrFoundDecl()) |
||
3275 | return NestedNameSpecifierLoc(); |
||
3276 | return getTrailingObjects<MemberExprNameQualifier>()->QualifierLoc; |
||
3277 | } |
||
3278 | |||
3279 | /// If the member name was qualified, retrieves the |
||
3280 | /// nested-name-specifier that precedes the member name. Otherwise, returns |
||
3281 | /// NULL. |
||
3282 | NestedNameSpecifier *getQualifier() const { |
||
3283 | return getQualifierLoc().getNestedNameSpecifier(); |
||
3284 | } |
||
3285 | |||
3286 | /// Retrieve the location of the template keyword preceding |
||
3287 | /// the member name, if any. |
||
3288 | SourceLocation getTemplateKeywordLoc() const { |
||
3289 | if (!hasTemplateKWAndArgsInfo()) |
||
3290 | return SourceLocation(); |
||
3291 | return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc; |
||
3292 | } |
||
3293 | |||
3294 | /// Retrieve the location of the left angle bracket starting the |
||
3295 | /// explicit template argument list following the member name, if any. |
||
3296 | SourceLocation getLAngleLoc() const { |
||
3297 | if (!hasTemplateKWAndArgsInfo()) |
||
3298 | return SourceLocation(); |
||
3299 | return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc; |
||
3300 | } |
||
3301 | |||
3302 | /// Retrieve the location of the right angle bracket ending the |
||
3303 | /// explicit template argument list following the member name, if any. |
||
3304 | SourceLocation getRAngleLoc() const { |
||
3305 | if (!hasTemplateKWAndArgsInfo()) |
||
3306 | return SourceLocation(); |
||
3307 | return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc; |
||
3308 | } |
||
3309 | |||
3310 | /// Determines whether the member name was preceded by the template keyword. |
||
3311 | bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } |
||
3312 | |||
3313 | /// Determines whether the member name was followed by an |
||
3314 | /// explicit template argument list. |
||
3315 | bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } |
||
3316 | |||
3317 | /// Copies the template arguments (if present) into the given |
||
3318 | /// structure. |
||
3319 | void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { |
||
3320 | if (hasExplicitTemplateArgs()) |
||
3321 | getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto( |
||
3322 | getTrailingObjects<TemplateArgumentLoc>(), List); |
||
3323 | } |
||
3324 | |||
3325 | /// Retrieve the template arguments provided as part of this |
||
3326 | /// template-id. |
||
3327 | const TemplateArgumentLoc *getTemplateArgs() const { |
||
3328 | if (!hasExplicitTemplateArgs()) |
||
3329 | return nullptr; |
||
3330 | |||
3331 | return getTrailingObjects<TemplateArgumentLoc>(); |
||
3332 | } |
||
3333 | |||
3334 | /// Retrieve the number of template arguments provided as part of this |
||
3335 | /// template-id. |
||
3336 | unsigned getNumTemplateArgs() const { |
||
3337 | if (!hasExplicitTemplateArgs()) |
||
3338 | return 0; |
||
3339 | |||
3340 | return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs; |
||
3341 | } |
||
3342 | |||
3343 | ArrayRef<TemplateArgumentLoc> template_arguments() const { |
||
3344 | return {getTemplateArgs(), getNumTemplateArgs()}; |
||
3345 | } |
||
3346 | |||
3347 | /// Retrieve the member declaration name info. |
||
3348 | DeclarationNameInfo getMemberNameInfo() const { |
||
3349 | return DeclarationNameInfo(MemberDecl->getDeclName(), |
||
3350 | MemberLoc, MemberDNLoc); |
||
3351 | } |
||
3352 | |||
3353 | SourceLocation getOperatorLoc() const { return MemberExprBits.OperatorLoc; } |
||
3354 | |||
3355 | bool isArrow() const { return MemberExprBits.IsArrow; } |
||
3356 | void setArrow(bool A) { MemberExprBits.IsArrow = A; } |
||
3357 | |||
3358 | /// getMemberLoc - Return the location of the "member", in X->F, it is the |
||
3359 | /// location of 'F'. |
||
3360 | SourceLocation getMemberLoc() const { return MemberLoc; } |
||
3361 | void setMemberLoc(SourceLocation L) { MemberLoc = L; } |
||
3362 | |||
3363 | SourceLocation getBeginLoc() const LLVM_READONLY; |
||
3364 | SourceLocation getEndLoc() const LLVM_READONLY; |
||
3365 | |||
3366 | SourceLocation getExprLoc() const LLVM_READONLY { return MemberLoc; } |
||
3367 | |||
3368 | /// Determine whether the base of this explicit is implicit. |
||
3369 | bool isImplicitAccess() const { |
||
3370 | return getBase() && getBase()->isImplicitCXXThis(); |
||
3371 | } |
||
3372 | |||
3373 | /// Returns true if this member expression refers to a method that |
||
3374 | /// was resolved from an overloaded set having size greater than 1. |
||
3375 | bool hadMultipleCandidates() const { |
||
3376 | return MemberExprBits.HadMultipleCandidates; |
||
3377 | } |
||
3378 | /// Sets the flag telling whether this expression refers to |
||
3379 | /// a method that was resolved from an overloaded set having size |
||
3380 | /// greater than 1. |
||
3381 | void setHadMultipleCandidates(bool V = true) { |
||
3382 | MemberExprBits.HadMultipleCandidates = V; |
||
3383 | } |
||
3384 | |||
3385 | /// Returns true if virtual dispatch is performed. |
||
3386 | /// If the member access is fully qualified, (i.e. X::f()), virtual |
||
3387 | /// dispatching is not performed. In -fapple-kext mode qualified |
||
3388 | /// calls to virtual method will still go through the vtable. |
||
3389 | bool performsVirtualDispatch(const LangOptions &LO) const { |
||
3390 | return LO.AppleKext || !hasQualifier(); |
||
3391 | } |
||
3392 | |||
3393 | /// Is this expression a non-odr-use reference, and if so, why? |
||
3394 | /// This is only meaningful if the named member is a static member. |
||
3395 | NonOdrUseReason isNonOdrUse() const { |
||
3396 | return static_cast<NonOdrUseReason>(MemberExprBits.NonOdrUseReason); |
||
3397 | } |
||
3398 | |||
3399 | static bool classof(const Stmt *T) { |
||
3400 | return T->getStmtClass() == MemberExprClass; |
||
3401 | } |
||
3402 | |||
3403 | // Iterators |
||
3404 | child_range children() { return child_range(&Base, &Base+1); } |
||
3405 | const_child_range children() const { |
||
3406 | return const_child_range(&Base, &Base + 1); |
||
3407 | } |
||
3408 | }; |
||
3409 | |||
3410 | /// CompoundLiteralExpr - [C99 6.5.2.5] |
||
3411 | /// |
||
3412 | class CompoundLiteralExpr : public Expr { |
||
3413 | /// LParenLoc - If non-null, this is the location of the left paren in a |
||
3414 | /// compound literal like "(int){4}". This can be null if this is a |
||
3415 | /// synthesized compound expression. |
||
3416 | SourceLocation LParenLoc; |
||
3417 | |||
3418 | /// The type as written. This can be an incomplete array type, in |
||
3419 | /// which case the actual expression type will be different. |
||
3420 | /// The int part of the pair stores whether this expr is file scope. |
||
3421 | llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfoAndScope; |
||
3422 | Stmt *Init; |
||
3423 | public: |
||
3424 | CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo, |
||
3425 | QualType T, ExprValueKind VK, Expr *init, bool fileScope) |
||
3426 | : Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary), |
||
3427 | LParenLoc(lparenloc), TInfoAndScope(tinfo, fileScope), Init(init) { |
||
3428 | setDependence(computeDependence(this)); |
||
3429 | } |
||
3430 | |||
3431 | /// Construct an empty compound literal. |
||
3432 | explicit CompoundLiteralExpr(EmptyShell Empty) |
||
3433 | : Expr(CompoundLiteralExprClass, Empty) { } |
||
3434 | |||
3435 | const Expr *getInitializer() const { return cast<Expr>(Init); } |
||
3436 | Expr *getInitializer() { return cast<Expr>(Init); } |
||
3437 | void setInitializer(Expr *E) { Init = E; } |
||
3438 | |||
3439 | bool isFileScope() const { return TInfoAndScope.getInt(); } |
||
3440 | void setFileScope(bool FS) { TInfoAndScope.setInt(FS); } |
||
3441 | |||
3442 | SourceLocation getLParenLoc() const { return LParenLoc; } |
||
3443 | void setLParenLoc(SourceLocation L) { LParenLoc = L; } |
||
3444 | |||
3445 | TypeSourceInfo *getTypeSourceInfo() const { |
||
3446 | return TInfoAndScope.getPointer(); |
||
3447 | } |
||
3448 | void setTypeSourceInfo(TypeSourceInfo *tinfo) { |
||
3449 | TInfoAndScope.setPointer(tinfo); |
||
3450 | } |
||
3451 | |||
3452 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
3453 | // FIXME: Init should never be null. |
||
3454 | if (!Init) |
||
3455 | return SourceLocation(); |
||
3456 | if (LParenLoc.isInvalid()) |
||
3457 | return Init->getBeginLoc(); |
||
3458 | return LParenLoc; |
||
3459 | } |
||
3460 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
3461 | // FIXME: Init should never be null. |
||
3462 | if (!Init) |
||
3463 | return SourceLocation(); |
||
3464 | return Init->getEndLoc(); |
||
3465 | } |
||
3466 | |||
3467 | static bool classof(const Stmt *T) { |
||
3468 | return T->getStmtClass() == CompoundLiteralExprClass; |
||
3469 | } |
||
3470 | |||
3471 | // Iterators |
||
3472 | child_range children() { return child_range(&Init, &Init+1); } |
||
3473 | const_child_range children() const { |
||
3474 | return const_child_range(&Init, &Init + 1); |
||
3475 | } |
||
3476 | }; |
||
3477 | |||
3478 | /// CastExpr - Base class for type casts, including both implicit |
||
3479 | /// casts (ImplicitCastExpr) and explicit casts that have some |
||
3480 | /// representation in the source code (ExplicitCastExpr's derived |
||
3481 | /// classes). |
||
3482 | class CastExpr : public Expr { |
||
3483 | Stmt *Op; |
||
3484 | |||
3485 | bool CastConsistency() const; |
||
3486 | |||
3487 | const CXXBaseSpecifier * const *path_buffer() const { |
||
3488 | return const_cast<CastExpr*>(this)->path_buffer(); |
||
3489 | } |
||
3490 | CXXBaseSpecifier **path_buffer(); |
||
3491 | |||
3492 | friend class ASTStmtReader; |
||
3493 | |||
3494 | protected: |
||
3495 | CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind, |
||
3496 | Expr *op, unsigned BasePathSize, bool HasFPFeatures) |
||
3497 | : Expr(SC, ty, VK, OK_Ordinary), Op(op) { |
||
3498 | CastExprBits.Kind = kind; |
||
3499 | CastExprBits.PartOfExplicitCast = false; |
||
3500 | CastExprBits.BasePathSize = BasePathSize; |
||
3501 | assert((CastExprBits.BasePathSize == BasePathSize) && |
||
3502 | "BasePathSize overflow!"); |
||
3503 | assert(CastConsistency()); |
||
3504 | CastExprBits.HasFPFeatures = HasFPFeatures; |
||
3505 | } |
||
3506 | |||
3507 | /// Construct an empty cast. |
||
3508 | CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize, |
||
3509 | bool HasFPFeatures) |
||
3510 | : Expr(SC, Empty) { |
||
3511 | CastExprBits.PartOfExplicitCast = false; |
||
3512 | CastExprBits.BasePathSize = BasePathSize; |
||
3513 | CastExprBits.HasFPFeatures = HasFPFeatures; |
||
3514 | assert((CastExprBits.BasePathSize == BasePathSize) && |
||
3515 | "BasePathSize overflow!"); |
||
3516 | } |
||
3517 | |||
3518 | /// Return a pointer to the trailing FPOptions. |
||
3519 | /// \pre hasStoredFPFeatures() == true |
||
3520 | FPOptionsOverride *getTrailingFPFeatures(); |
||
3521 | const FPOptionsOverride *getTrailingFPFeatures() const { |
||
3522 | return const_cast<CastExpr *>(this)->getTrailingFPFeatures(); |
||
3523 | } |
||
3524 | |||
3525 | public: |
||
3526 | CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; } |
||
3527 | void setCastKind(CastKind K) { CastExprBits.Kind = K; } |
||
3528 | |||
3529 | static const char *getCastKindName(CastKind CK); |
||
3530 | const char *getCastKindName() const { return getCastKindName(getCastKind()); } |
||
3531 | |||
3532 | Expr *getSubExpr() { return cast<Expr>(Op); } |
||
3533 | const Expr *getSubExpr() const { return cast<Expr>(Op); } |
||
3534 | void setSubExpr(Expr *E) { Op = E; } |
||
3535 | |||
3536 | /// Retrieve the cast subexpression as it was written in the source |
||
3537 | /// code, looking through any implicit casts or other intermediate nodes |
||
3538 | /// introduced by semantic analysis. |
||
3539 | Expr *getSubExprAsWritten(); |
||
3540 | const Expr *getSubExprAsWritten() const { |
||
3541 | return const_cast<CastExpr *>(this)->getSubExprAsWritten(); |
||
3542 | } |
||
3543 | |||
3544 | /// If this cast applies a user-defined conversion, retrieve the conversion |
||
3545 | /// function that it invokes. |
||
3546 | NamedDecl *getConversionFunction() const; |
||
3547 | |||
3548 | typedef CXXBaseSpecifier **path_iterator; |
||
3549 | typedef const CXXBaseSpecifier *const *path_const_iterator; |
||
3550 | bool path_empty() const { return path_size() == 0; } |
||
3551 | unsigned path_size() const { return CastExprBits.BasePathSize; } |
||
3552 | path_iterator path_begin() { return path_buffer(); } |
||
3553 | path_iterator path_end() { return path_buffer() + path_size(); } |
||
3554 | path_const_iterator path_begin() const { return path_buffer(); } |
||
3555 | path_const_iterator path_end() const { return path_buffer() + path_size(); } |
||
3556 | |||
3557 | llvm::iterator_range<path_iterator> path() { |
||
3558 | return llvm::make_range(path_begin(), path_end()); |
||
3559 | } |
||
3560 | llvm::iterator_range<path_const_iterator> path() const { |
||
3561 | return llvm::make_range(path_begin(), path_end()); |
||
3562 | } |
||
3563 | |||
3564 | const FieldDecl *getTargetUnionField() const { |
||
3565 | assert(getCastKind() == CK_ToUnion); |
||
3566 | return getTargetFieldForToUnionCast(getType(), getSubExpr()->getType()); |
||
3567 | } |
||
3568 | |||
3569 | bool hasStoredFPFeatures() const { return CastExprBits.HasFPFeatures; } |
||
3570 | |||
3571 | /// Get FPOptionsOverride from trailing storage. |
||
3572 | FPOptionsOverride getStoredFPFeatures() const { |
||
3573 | assert(hasStoredFPFeatures()); |
||
3574 | return *getTrailingFPFeatures(); |
||
3575 | } |
||
3576 | |||
3577 | // Get the FP features status of this operation. Only meaningful for |
||
3578 | // operations on floating point types. |
||
3579 | FPOptions getFPFeaturesInEffect(const LangOptions &LO) const { |
||
3580 | if (hasStoredFPFeatures()) |
||
3581 | return getStoredFPFeatures().applyOverrides(LO); |
||
3582 | return FPOptions::defaultWithoutTrailingStorage(LO); |
||
3583 | } |
||
3584 | |||
3585 | FPOptionsOverride getFPFeatures() const { |
||
3586 | if (hasStoredFPFeatures()) |
||
3587 | return getStoredFPFeatures(); |
||
3588 | return FPOptionsOverride(); |
||
3589 | } |
||
3590 | |||
3591 | static const FieldDecl *getTargetFieldForToUnionCast(QualType unionType, |
||
3592 | QualType opType); |
||
3593 | static const FieldDecl *getTargetFieldForToUnionCast(const RecordDecl *RD, |
||
3594 | QualType opType); |
||
3595 | |||
3596 | static bool classof(const Stmt *T) { |
||
3597 | return T->getStmtClass() >= firstCastExprConstant && |
||
3598 | T->getStmtClass() <= lastCastExprConstant; |
||
3599 | } |
||
3600 | |||
3601 | // Iterators |
||
3602 | child_range children() { return child_range(&Op, &Op+1); } |
||
3603 | const_child_range children() const { return const_child_range(&Op, &Op + 1); } |
||
3604 | }; |
||
3605 | |||
3606 | /// ImplicitCastExpr - Allows us to explicitly represent implicit type |
||
3607 | /// conversions, which have no direct representation in the original |
||
3608 | /// source code. For example: converting T[]->T*, void f()->void |
||
3609 | /// (*f)(), float->double, short->int, etc. |
||
3610 | /// |
||
3611 | /// In C, implicit casts always produce rvalues. However, in C++, an |
||
3612 | /// implicit cast whose result is being bound to a reference will be |
||
3613 | /// an lvalue or xvalue. For example: |
||
3614 | /// |
||
3615 | /// @code |
||
3616 | /// class Base { }; |
||
3617 | /// class Derived : public Base { }; |
||
3618 | /// Derived &&ref(); |
||
3619 | /// void f(Derived d) { |
||
3620 | /// Base& b = d; // initializer is an ImplicitCastExpr |
||
3621 | /// // to an lvalue of type Base |
||
3622 | /// Base&& r = ref(); // initializer is an ImplicitCastExpr |
||
3623 | /// // to an xvalue of type Base |
||
3624 | /// } |
||
3625 | /// @endcode |
||
3626 | class ImplicitCastExpr final |
||
3627 | : public CastExpr, |
||
3628 | private llvm::TrailingObjects<ImplicitCastExpr, CXXBaseSpecifier *, |
||
3629 | FPOptionsOverride> { |
||
3630 | |||
3631 | ImplicitCastExpr(QualType ty, CastKind kind, Expr *op, |
||
3632 | unsigned BasePathLength, FPOptionsOverride FPO, |
||
3633 | ExprValueKind VK) |
||
3634 | : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength, |
||
3635 | FPO.requiresTrailingStorage()) { |
||
3636 | setDependence(computeDependence(this)); |
||
3637 | if (hasStoredFPFeatures()) |
||
3638 | *getTrailingFPFeatures() = FPO; |
||
3639 | } |
||
3640 | |||
3641 | /// Construct an empty implicit cast. |
||
3642 | explicit ImplicitCastExpr(EmptyShell Shell, unsigned PathSize, |
||
3643 | bool HasFPFeatures) |
||
3644 | : CastExpr(ImplicitCastExprClass, Shell, PathSize, HasFPFeatures) {} |
||
3645 | |||
3646 | unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const { |
||
3647 | return path_size(); |
||
3648 | } |
||
3649 | |||
3650 | public: |
||
3651 | enum OnStack_t { OnStack }; |
||
3652 | ImplicitCastExpr(OnStack_t _, QualType ty, CastKind kind, Expr *op, |
||
3653 | ExprValueKind VK, FPOptionsOverride FPO) |
||
3654 | : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0, |
||
3655 | FPO.requiresTrailingStorage()) { |
||
3656 | if (hasStoredFPFeatures()) |
||
3657 | *getTrailingFPFeatures() = FPO; |
||
3658 | } |
||
3659 | |||
3660 | bool isPartOfExplicitCast() const { return CastExprBits.PartOfExplicitCast; } |
||
3661 | void setIsPartOfExplicitCast(bool PartOfExplicitCast) { |
||
3662 | CastExprBits.PartOfExplicitCast = PartOfExplicitCast; |
||
3663 | } |
||
3664 | |||
3665 | static ImplicitCastExpr *Create(const ASTContext &Context, QualType T, |
||
3666 | CastKind Kind, Expr *Operand, |
||
3667 | const CXXCastPath *BasePath, |
||
3668 | ExprValueKind Cat, FPOptionsOverride FPO); |
||
3669 | |||
3670 | static ImplicitCastExpr *CreateEmpty(const ASTContext &Context, |
||
3671 | unsigned PathSize, bool HasFPFeatures); |
||
3672 | |||
3673 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
3674 | return getSubExpr()->getBeginLoc(); |
||
3675 | } |
||
3676 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
3677 | return getSubExpr()->getEndLoc(); |
||
3678 | } |
||
3679 | |||
3680 | static bool classof(const Stmt *T) { |
||
3681 | return T->getStmtClass() == ImplicitCastExprClass; |
||
3682 | } |
||
3683 | |||
3684 | friend TrailingObjects; |
||
3685 | friend class CastExpr; |
||
3686 | }; |
||
3687 | |||
3688 | /// ExplicitCastExpr - An explicit cast written in the source |
||
3689 | /// code. |
||
3690 | /// |
||
3691 | /// This class is effectively an abstract class, because it provides |
||
3692 | /// the basic representation of an explicitly-written cast without |
||
3693 | /// specifying which kind of cast (C cast, functional cast, static |
||
3694 | /// cast, etc.) was written; specific derived classes represent the |
||
3695 | /// particular style of cast and its location information. |
||
3696 | /// |
||
3697 | /// Unlike implicit casts, explicit cast nodes have two different |
||
3698 | /// types: the type that was written into the source code, and the |
||
3699 | /// actual type of the expression as determined by semantic |
||
3700 | /// analysis. These types may differ slightly. For example, in C++ one |
||
3701 | /// can cast to a reference type, which indicates that the resulting |
||
3702 | /// expression will be an lvalue or xvalue. The reference type, however, |
||
3703 | /// will not be used as the type of the expression. |
||
3704 | class ExplicitCastExpr : public CastExpr { |
||
3705 | /// TInfo - Source type info for the (written) type |
||
3706 | /// this expression is casting to. |
||
3707 | TypeSourceInfo *TInfo; |
||
3708 | |||
3709 | protected: |
||
3710 | ExplicitCastExpr(StmtClass SC, QualType exprTy, ExprValueKind VK, |
||
3711 | CastKind kind, Expr *op, unsigned PathSize, |
||
3712 | bool HasFPFeatures, TypeSourceInfo *writtenTy) |
||
3713 | : CastExpr(SC, exprTy, VK, kind, op, PathSize, HasFPFeatures), |
||
3714 | TInfo(writtenTy) { |
||
3715 | setDependence(computeDependence(this)); |
||
3716 | } |
||
3717 | |||
3718 | /// Construct an empty explicit cast. |
||
3719 | ExplicitCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize, |
||
3720 | bool HasFPFeatures) |
||
3721 | : CastExpr(SC, Shell, PathSize, HasFPFeatures) {} |
||
3722 | |||
3723 | public: |
||
3724 | /// getTypeInfoAsWritten - Returns the type source info for the type |
||
3725 | /// that this expression is casting to. |
||
3726 | TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; } |
||
3727 | void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; } |
||
3728 | |||
3729 | /// getTypeAsWritten - Returns the type that this expression is |
||
3730 | /// casting to, as written in the source code. |
||
3731 | QualType getTypeAsWritten() const { return TInfo->getType(); } |
||
3732 | |||
3733 | static bool classof(const Stmt *T) { |
||
3734 | return T->getStmtClass() >= firstExplicitCastExprConstant && |
||
3735 | T->getStmtClass() <= lastExplicitCastExprConstant; |
||
3736 | } |
||
3737 | }; |
||
3738 | |||
3739 | /// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style |
||
3740 | /// cast in C++ (C++ [expr.cast]), which uses the syntax |
||
3741 | /// (Type)expr. For example: @c (int)f. |
||
3742 | class CStyleCastExpr final |
||
3743 | : public ExplicitCastExpr, |
||
3744 | private llvm::TrailingObjects<CStyleCastExpr, CXXBaseSpecifier *, |
||
3745 | FPOptionsOverride> { |
||
3746 | SourceLocation LPLoc; // the location of the left paren |
||
3747 | SourceLocation RPLoc; // the location of the right paren |
||
3748 | |||
3749 | CStyleCastExpr(QualType exprTy, ExprValueKind vk, CastKind kind, Expr *op, |
||
3750 | unsigned PathSize, FPOptionsOverride FPO, |
||
3751 | TypeSourceInfo *writtenTy, SourceLocation l, SourceLocation r) |
||
3752 | : ExplicitCastExpr(CStyleCastExprClass, exprTy, vk, kind, op, PathSize, |
||
3753 | FPO.requiresTrailingStorage(), writtenTy), |
||
3754 | LPLoc(l), RPLoc(r) { |
||
3755 | if (hasStoredFPFeatures()) |
||
3756 | *getTrailingFPFeatures() = FPO; |
||
3757 | } |
||
3758 | |||
3759 | /// Construct an empty C-style explicit cast. |
||
3760 | explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize, |
||
3761 | bool HasFPFeatures) |
||
3762 | : ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize, HasFPFeatures) {} |
||
3763 | |||
3764 | unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const { |
||
3765 | return path_size(); |
||
3766 | } |
||
3767 | |||
3768 | public: |
||
3769 | static CStyleCastExpr * |
||
3770 | Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, |
||
3771 | Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, |
||
3772 | TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R); |
||
3773 | |||
3774 | static CStyleCastExpr *CreateEmpty(const ASTContext &Context, |
||
3775 | unsigned PathSize, bool HasFPFeatures); |
||
3776 | |||
3777 | SourceLocation getLParenLoc() const { return LPLoc; } |
||
3778 | void setLParenLoc(SourceLocation L) { LPLoc = L; } |
||
3779 | |||
3780 | SourceLocation getRParenLoc() const { return RPLoc; } |
||
3781 | void setRParenLoc(SourceLocation L) { RPLoc = L; } |
||
3782 | |||
3783 | SourceLocation getBeginLoc() const LLVM_READONLY { return LPLoc; } |
||
3784 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
3785 | return getSubExpr()->getEndLoc(); |
||
3786 | } |
||
3787 | |||
3788 | static bool classof(const Stmt *T) { |
||
3789 | return T->getStmtClass() == CStyleCastExprClass; |
||
3790 | } |
||
3791 | |||
3792 | friend TrailingObjects; |
||
3793 | friend class CastExpr; |
||
3794 | }; |
||
3795 | |||
3796 | /// A builtin binary operation expression such as "x + y" or "x <= y". |
||
3797 | /// |
||
3798 | /// This expression node kind describes a builtin binary operation, |
||
3799 | /// such as "x + y" for integer values "x" and "y". The operands will |
||
3800 | /// already have been converted to appropriate types (e.g., by |
||
3801 | /// performing promotions or conversions). |
||
3802 | /// |
||
3803 | /// In C++, where operators may be overloaded, a different kind of |
||
3804 | /// expression node (CXXOperatorCallExpr) is used to express the |
||
3805 | /// invocation of an overloaded operator with operator syntax. Within |
||
3806 | /// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is |
||
3807 | /// used to store an expression "x + y" depends on the subexpressions |
||
3808 | /// for x and y. If neither x or y is type-dependent, and the "+" |
||
3809 | /// operator resolves to a built-in operation, BinaryOperator will be |
||
3810 | /// used to express the computation (x and y may still be |
||
3811 | /// value-dependent). If either x or y is type-dependent, or if the |
||
3812 | /// "+" resolves to an overloaded operator, CXXOperatorCallExpr will |
||
3813 | /// be used to express the computation. |
||
3814 | class BinaryOperator : public Expr { |
||
3815 | enum { LHS, RHS, END_EXPR }; |
||
3816 | Stmt *SubExprs[END_EXPR]; |
||
3817 | |||
3818 | public: |
||
3819 | typedef BinaryOperatorKind Opcode; |
||
3820 | |||
3821 | protected: |
||
3822 | size_t offsetOfTrailingStorage() const; |
||
3823 | |||
3824 | /// Return a pointer to the trailing FPOptions |
||
3825 | FPOptionsOverride *getTrailingFPFeatures() { |
||
3826 | assert(BinaryOperatorBits.HasFPFeatures); |
||
3827 | return reinterpret_cast<FPOptionsOverride *>( |
||
3828 | reinterpret_cast<char *>(this) + offsetOfTrailingStorage()); |
||
3829 | } |
||
3830 | const FPOptionsOverride *getTrailingFPFeatures() const { |
||
3831 | assert(BinaryOperatorBits.HasFPFeatures); |
||
3832 | return reinterpret_cast<const FPOptionsOverride *>( |
||
3833 | reinterpret_cast<const char *>(this) + offsetOfTrailingStorage()); |
||
3834 | } |
||
3835 | |||
3836 | /// Build a binary operator, assuming that appropriate storage has been |
||
3837 | /// allocated for the trailing objects when needed. |
||
3838 | BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc, |
||
3839 | QualType ResTy, ExprValueKind VK, ExprObjectKind OK, |
||
3840 | SourceLocation opLoc, FPOptionsOverride FPFeatures); |
||
3841 | |||
3842 | /// Construct an empty binary operator. |
||
3843 | explicit BinaryOperator(EmptyShell Empty) : Expr(BinaryOperatorClass, Empty) { |
||
3844 | BinaryOperatorBits.Opc = BO_Comma; |
||
3845 | } |
||
3846 | |||
3847 | public: |
||
3848 | static BinaryOperator *CreateEmpty(const ASTContext &C, bool hasFPFeatures); |
||
3849 | |||
3850 | static BinaryOperator *Create(const ASTContext &C, Expr *lhs, Expr *rhs, |
||
3851 | Opcode opc, QualType ResTy, ExprValueKind VK, |
||
3852 | ExprObjectKind OK, SourceLocation opLoc, |
||
3853 | FPOptionsOverride FPFeatures); |
||
3854 | SourceLocation getExprLoc() const { return getOperatorLoc(); } |
||
3855 | SourceLocation getOperatorLoc() const { return BinaryOperatorBits.OpLoc; } |
||
3856 | void setOperatorLoc(SourceLocation L) { BinaryOperatorBits.OpLoc = L; } |
||
3857 | |||
3858 | Opcode getOpcode() const { |
||
3859 | return static_cast<Opcode>(BinaryOperatorBits.Opc); |
||
3860 | } |
||
3861 | void setOpcode(Opcode Opc) { BinaryOperatorBits.Opc = Opc; } |
||
3862 | |||
3863 | Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } |
||
3864 | void setLHS(Expr *E) { SubExprs[LHS] = E; } |
||
3865 | Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } |
||
3866 | void setRHS(Expr *E) { SubExprs[RHS] = E; } |
||
3867 | |||
3868 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
3869 | return getLHS()->getBeginLoc(); |
||
3870 | } |
||
3871 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
3872 | return getRHS()->getEndLoc(); |
||
3873 | } |
||
3874 | |||
3875 | /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it |
||
3876 | /// corresponds to, e.g. "<<=". |
||
3877 | static StringRef getOpcodeStr(Opcode Op); |
||
3878 | |||
3879 | StringRef getOpcodeStr() const { return getOpcodeStr(getOpcode()); } |
||
3880 | |||
3881 | /// Retrieve the binary opcode that corresponds to the given |
||
3882 | /// overloaded operator. |
||
3883 | static Opcode getOverloadedOpcode(OverloadedOperatorKind OO); |
||
3884 | |||
3885 | /// Retrieve the overloaded operator kind that corresponds to |
||
3886 | /// the given binary opcode. |
||
3887 | static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); |
||
3888 | |||
3889 | /// predicates to categorize the respective opcodes. |
||
3890 | static bool isPtrMemOp(Opcode Opc) { |
||
3891 | return Opc == BO_PtrMemD || Opc == BO_PtrMemI; |
||
3892 | } |
||
3893 | bool isPtrMemOp() const { return isPtrMemOp(getOpcode()); } |
||
3894 | |||
3895 | static bool isMultiplicativeOp(Opcode Opc) { |
||
3896 | return Opc >= BO_Mul && Opc <= BO_Rem; |
||
3897 | } |
||
3898 | bool isMultiplicativeOp() const { return isMultiplicativeOp(getOpcode()); } |
||
3899 | static bool isAdditiveOp(Opcode Opc) { return Opc == BO_Add || Opc==BO_Sub; } |
||
3900 | bool isAdditiveOp() const { return isAdditiveOp(getOpcode()); } |
||
3901 | static bool isShiftOp(Opcode Opc) { return Opc == BO_Shl || Opc == BO_Shr; } |
||
3902 | bool isShiftOp() const { return isShiftOp(getOpcode()); } |
||
3903 | |||
3904 | static bool isBitwiseOp(Opcode Opc) { return Opc >= BO_And && Opc <= BO_Or; } |
||
3905 | bool isBitwiseOp() const { return isBitwiseOp(getOpcode()); } |
||
3906 | |||
3907 | static bool isRelationalOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_GE; } |
||
3908 | bool isRelationalOp() const { return isRelationalOp(getOpcode()); } |
||
3909 | |||
3910 | static bool isEqualityOp(Opcode Opc) { return Opc == BO_EQ || Opc == BO_NE; } |
||
3911 | bool isEqualityOp() const { return isEqualityOp(getOpcode()); } |
||
3912 | |||
3913 | static bool isComparisonOp(Opcode Opc) { return Opc >= BO_Cmp && Opc<=BO_NE; } |
||
3914 | bool isComparisonOp() const { return isComparisonOp(getOpcode()); } |
||
3915 | |||
3916 | static bool isCommaOp(Opcode Opc) { return Opc == BO_Comma; } |
||
3917 | bool isCommaOp() const { return isCommaOp(getOpcode()); } |
||
3918 | |||
3919 | static Opcode negateComparisonOp(Opcode Opc) { |
||
3920 | switch (Opc) { |
||
3921 | default: |
||
3922 | llvm_unreachable("Not a comparison operator."); |
||
3923 | case BO_LT: return BO_GE; |
||
3924 | case BO_GT: return BO_LE; |
||
3925 | case BO_LE: return BO_GT; |
||
3926 | case BO_GE: return BO_LT; |
||
3927 | case BO_EQ: return BO_NE; |
||
3928 | case BO_NE: return BO_EQ; |
||
3929 | } |
||
3930 | } |
||
3931 | |||
3932 | static Opcode reverseComparisonOp(Opcode Opc) { |
||
3933 | switch (Opc) { |
||
3934 | default: |
||
3935 | llvm_unreachable("Not a comparison operator."); |
||
3936 | case BO_LT: return BO_GT; |
||
3937 | case BO_GT: return BO_LT; |
||
3938 | case BO_LE: return BO_GE; |
||
3939 | case BO_GE: return BO_LE; |
||
3940 | case BO_EQ: |
||
3941 | case BO_NE: |
||
3942 | return Opc; |
||
3943 | } |
||
3944 | } |
||
3945 | |||
3946 | static bool isLogicalOp(Opcode Opc) { return Opc == BO_LAnd || Opc==BO_LOr; } |
||
3947 | bool isLogicalOp() const { return isLogicalOp(getOpcode()); } |
||
3948 | |||
3949 | static bool isAssignmentOp(Opcode Opc) { |
||
3950 | return Opc >= BO_Assign && Opc <= BO_OrAssign; |
||
3951 | } |
||
3952 | bool isAssignmentOp() const { return isAssignmentOp(getOpcode()); } |
||
3953 | |||
3954 | static bool isCompoundAssignmentOp(Opcode Opc) { |
||
3955 | return Opc > BO_Assign && Opc <= BO_OrAssign; |
||
3956 | } |
||
3957 | bool isCompoundAssignmentOp() const { |
||
3958 | return isCompoundAssignmentOp(getOpcode()); |
||
3959 | } |
||
3960 | static Opcode getOpForCompoundAssignment(Opcode Opc) { |
||
3961 | assert(isCompoundAssignmentOp(Opc)); |
||
3962 | if (Opc >= BO_AndAssign) |
||
3963 | return Opcode(unsigned(Opc) - BO_AndAssign + BO_And); |
||
3964 | else |
||
3965 | return Opcode(unsigned(Opc) - BO_MulAssign + BO_Mul); |
||
3966 | } |
||
3967 | |||
3968 | static bool isShiftAssignOp(Opcode Opc) { |
||
3969 | return Opc == BO_ShlAssign || Opc == BO_ShrAssign; |
||
3970 | } |
||
3971 | bool isShiftAssignOp() const { |
||
3972 | return isShiftAssignOp(getOpcode()); |
||
3973 | } |
||
3974 | |||
3975 | // Return true if a binary operator using the specified opcode and operands |
||
3976 | // would match the 'p = (i8*)nullptr + n' idiom for casting a pointer-sized |
||
3977 | // integer to a pointer. |
||
3978 | static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc, |
||
3979 | Expr *LHS, Expr *RHS); |
||
3980 | |||
3981 | static bool classof(const Stmt *S) { |
||
3982 | return S->getStmtClass() >= firstBinaryOperatorConstant && |
||
3983 | S->getStmtClass() <= lastBinaryOperatorConstant; |
||
3984 | } |
||
3985 | |||
3986 | // Iterators |
||
3987 | child_range children() { |
||
3988 | return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); |
||
3989 | } |
||
3990 | const_child_range children() const { |
||
3991 | return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); |
||
3992 | } |
||
3993 | |||
3994 | /// Set and fetch the bit that shows whether FPFeatures needs to be |
||
3995 | /// allocated in Trailing Storage |
||
3996 | void setHasStoredFPFeatures(bool B) { BinaryOperatorBits.HasFPFeatures = B; } |
||
3997 | bool hasStoredFPFeatures() const { return BinaryOperatorBits.HasFPFeatures; } |
||
3998 | |||
3999 | /// Get FPFeatures from trailing storage |
||
4000 | FPOptionsOverride getStoredFPFeatures() const { |
||
4001 | assert(hasStoredFPFeatures()); |
||
4002 | return *getTrailingFPFeatures(); |
||
4003 | } |
||
4004 | /// Set FPFeatures in trailing storage, used only by Serialization |
||
4005 | void setStoredFPFeatures(FPOptionsOverride F) { |
||
4006 | assert(BinaryOperatorBits.HasFPFeatures); |
||
4007 | *getTrailingFPFeatures() = F; |
||
4008 | } |
||
4009 | |||
4010 | // Get the FP features status of this operator. Only meaningful for |
||
4011 | // operations on floating point types. |
||
4012 | FPOptions getFPFeaturesInEffect(const LangOptions &LO) const { |
||
4013 | if (BinaryOperatorBits.HasFPFeatures) |
||
4014 | return getStoredFPFeatures().applyOverrides(LO); |
||
4015 | return FPOptions::defaultWithoutTrailingStorage(LO); |
||
4016 | } |
||
4017 | |||
4018 | // This is used in ASTImporter |
||
4019 | FPOptionsOverride getFPFeatures() const { |
||
4020 | if (BinaryOperatorBits.HasFPFeatures) |
||
4021 | return getStoredFPFeatures(); |
||
4022 | return FPOptionsOverride(); |
||
4023 | } |
||
4024 | |||
4025 | // Get the FP contractability status of this operator. Only meaningful for |
||
4026 | // operations on floating point types. |
||
4027 | bool isFPContractableWithinStatement(const LangOptions &LO) const { |
||
4028 | return getFPFeaturesInEffect(LO).allowFPContractWithinStatement(); |
||
4029 | } |
||
4030 | |||
4031 | // Get the FENV_ACCESS status of this operator. Only meaningful for |
||
4032 | // operations on floating point types. |
||
4033 | bool isFEnvAccessOn(const LangOptions &LO) const { |
||
4034 | return getFPFeaturesInEffect(LO).getAllowFEnvAccess(); |
||
4035 | } |
||
4036 | |||
4037 | protected: |
||
4038 | BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc, |
||
4039 | QualType ResTy, ExprValueKind VK, ExprObjectKind OK, |
||
4040 | SourceLocation opLoc, FPOptionsOverride FPFeatures, |
||
4041 | bool dead2); |
||
4042 | |||
4043 | /// Construct an empty BinaryOperator, SC is CompoundAssignOperator. |
||
4044 | BinaryOperator(StmtClass SC, EmptyShell Empty) : Expr(SC, Empty) { |
||
4045 | BinaryOperatorBits.Opc = BO_MulAssign; |
||
4046 | } |
||
4047 | |||
4048 | /// Return the size in bytes needed for the trailing objects. |
||
4049 | /// Used to allocate the right amount of storage. |
||
4050 | static unsigned sizeOfTrailingObjects(bool HasFPFeatures) { |
||
4051 | return HasFPFeatures * sizeof(FPOptionsOverride); |
||
4052 | } |
||
4053 | }; |
||
4054 | |||
4055 | /// CompoundAssignOperator - For compound assignments (e.g. +=), we keep |
||
4056 | /// track of the type the operation is performed in. Due to the semantics of |
||
4057 | /// these operators, the operands are promoted, the arithmetic performed, an |
||
4058 | /// implicit conversion back to the result type done, then the assignment takes |
||
4059 | /// place. This captures the intermediate type which the computation is done |
||
4060 | /// in. |
||
4061 | class CompoundAssignOperator : public BinaryOperator { |
||
4062 | QualType ComputationLHSType; |
||
4063 | QualType ComputationResultType; |
||
4064 | |||
4065 | /// Construct an empty CompoundAssignOperator. |
||
4066 | explicit CompoundAssignOperator(const ASTContext &C, EmptyShell Empty, |
||
4067 | bool hasFPFeatures) |
||
4068 | : BinaryOperator(CompoundAssignOperatorClass, Empty) {} |
||
4069 | |||
4070 | protected: |
||
4071 | CompoundAssignOperator(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, |
||
4072 | QualType ResType, ExprValueKind VK, ExprObjectKind OK, |
||
4073 | SourceLocation OpLoc, FPOptionsOverride FPFeatures, |
||
4074 | QualType CompLHSType, QualType CompResultType) |
||
4075 | : BinaryOperator(C, lhs, rhs, opc, ResType, VK, OK, OpLoc, FPFeatures, |
||
4076 | true), |
||
4077 | ComputationLHSType(CompLHSType), ComputationResultType(CompResultType) { |
||
4078 | assert(isCompoundAssignmentOp() && |
||
4079 | "Only should be used for compound assignments"); |
||
4080 | } |
||
4081 | |||
4082 | public: |
||
4083 | static CompoundAssignOperator *CreateEmpty(const ASTContext &C, |
||
4084 | bool hasFPFeatures); |
||
4085 | |||
4086 | static CompoundAssignOperator * |
||
4087 | Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, |
||
4088 | ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, |
||
4089 | FPOptionsOverride FPFeatures, QualType CompLHSType = QualType(), |
||
4090 | QualType CompResultType = QualType()); |
||
4091 | |||
4092 | // The two computation types are the type the LHS is converted |
||
4093 | // to for the computation and the type of the result; the two are |
||
4094 | // distinct in a few cases (specifically, int+=ptr and ptr-=ptr). |
||
4095 | QualType getComputationLHSType() const { return ComputationLHSType; } |
||
4096 | void setComputationLHSType(QualType T) { ComputationLHSType = T; } |
||
4097 | |||
4098 | QualType getComputationResultType() const { return ComputationResultType; } |
||
4099 | void setComputationResultType(QualType T) { ComputationResultType = T; } |
||
4100 | |||
4101 | static bool classof(const Stmt *S) { |
||
4102 | return S->getStmtClass() == CompoundAssignOperatorClass; |
||
4103 | } |
||
4104 | }; |
||
4105 | |||
4106 | inline size_t BinaryOperator::offsetOfTrailingStorage() const { |
||
4107 | assert(BinaryOperatorBits.HasFPFeatures); |
||
4108 | return isa<CompoundAssignOperator>(this) ? sizeof(CompoundAssignOperator) |
||
4109 | : sizeof(BinaryOperator); |
||
4110 | } |
||
4111 | |||
4112 | /// AbstractConditionalOperator - An abstract base class for |
||
4113 | /// ConditionalOperator and BinaryConditionalOperator. |
||
4114 | class AbstractConditionalOperator : public Expr { |
||
4115 | SourceLocation QuestionLoc, ColonLoc; |
||
4116 | friend class ASTStmtReader; |
||
4117 | |||
4118 | protected: |
||
4119 | AbstractConditionalOperator(StmtClass SC, QualType T, ExprValueKind VK, |
||
4120 | ExprObjectKind OK, SourceLocation qloc, |
||
4121 | SourceLocation cloc) |
||
4122 | : Expr(SC, T, VK, OK), QuestionLoc(qloc), ColonLoc(cloc) {} |
||
4123 | |||
4124 | AbstractConditionalOperator(StmtClass SC, EmptyShell Empty) |
||
4125 | : Expr(SC, Empty) { } |
||
4126 | |||
4127 | public: |
||
4128 | // getCond - Return the expression representing the condition for |
||
4129 | // the ?: operator. |
||
4130 | Expr *getCond() const; |
||
4131 | |||
4132 | // getTrueExpr - Return the subexpression representing the value of |
||
4133 | // the expression if the condition evaluates to true. |
||
4134 | Expr *getTrueExpr() const; |
||
4135 | |||
4136 | // getFalseExpr - Return the subexpression representing the value of |
||
4137 | // the expression if the condition evaluates to false. This is |
||
4138 | // the same as getRHS. |
||
4139 | Expr *getFalseExpr() const; |
||
4140 | |||
4141 | SourceLocation getQuestionLoc() const { return QuestionLoc; } |
||
4142 | SourceLocation getColonLoc() const { return ColonLoc; } |
||
4143 | |||
4144 | static bool classof(const Stmt *T) { |
||
4145 | return T->getStmtClass() == ConditionalOperatorClass || |
||
4146 | T->getStmtClass() == BinaryConditionalOperatorClass; |
||
4147 | } |
||
4148 | }; |
||
4149 | |||
4150 | /// ConditionalOperator - The ?: ternary operator. The GNU "missing |
||
4151 | /// middle" extension is a BinaryConditionalOperator. |
||
4152 | class ConditionalOperator : public AbstractConditionalOperator { |
||
4153 | enum { COND, LHS, RHS, END_EXPR }; |
||
4154 | Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. |
||
4155 | |||
4156 | friend class ASTStmtReader; |
||
4157 | public: |
||
4158 | ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs, |
||
4159 | SourceLocation CLoc, Expr *rhs, QualType t, |
||
4160 | ExprValueKind VK, ExprObjectKind OK) |
||
4161 | : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK, QLoc, |
||
4162 | CLoc) { |
||
4163 | SubExprs[COND] = cond; |
||
4164 | SubExprs[LHS] = lhs; |
||
4165 | SubExprs[RHS] = rhs; |
||
4166 | setDependence(computeDependence(this)); |
||
4167 | } |
||
4168 | |||
4169 | /// Build an empty conditional operator. |
||
4170 | explicit ConditionalOperator(EmptyShell Empty) |
||
4171 | : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { } |
||
4172 | |||
4173 | // getCond - Return the expression representing the condition for |
||
4174 | // the ?: operator. |
||
4175 | Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } |
||
4176 | |||
4177 | // getTrueExpr - Return the subexpression representing the value of |
||
4178 | // the expression if the condition evaluates to true. |
||
4179 | Expr *getTrueExpr() const { return cast<Expr>(SubExprs[LHS]); } |
||
4180 | |||
4181 | // getFalseExpr - Return the subexpression representing the value of |
||
4182 | // the expression if the condition evaluates to false. This is |
||
4183 | // the same as getRHS. |
||
4184 | Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); } |
||
4185 | |||
4186 | Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } |
||
4187 | Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } |
||
4188 | |||
4189 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
4190 | return getCond()->getBeginLoc(); |
||
4191 | } |
||
4192 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
4193 | return getRHS()->getEndLoc(); |
||
4194 | } |
||
4195 | |||
4196 | static bool classof(const Stmt *T) { |
||
4197 | return T->getStmtClass() == ConditionalOperatorClass; |
||
4198 | } |
||
4199 | |||
4200 | // Iterators |
||
4201 | child_range children() { |
||
4202 | return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); |
||
4203 | } |
||
4204 | const_child_range children() const { |
||
4205 | return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); |
||
4206 | } |
||
4207 | }; |
||
4208 | |||
4209 | /// BinaryConditionalOperator - The GNU extension to the conditional |
||
4210 | /// operator which allows the middle operand to be omitted. |
||
4211 | /// |
||
4212 | /// This is a different expression kind on the assumption that almost |
||
4213 | /// every client ends up needing to know that these are different. |
||
4214 | class BinaryConditionalOperator : public AbstractConditionalOperator { |
||
4215 | enum { COMMON, COND, LHS, RHS, NUM_SUBEXPRS }; |
||
4216 | |||
4217 | /// - the common condition/left-hand-side expression, which will be |
||
4218 | /// evaluated as the opaque value |
||
4219 | /// - the condition, expressed in terms of the opaque value |
||
4220 | /// - the left-hand-side, expressed in terms of the opaque value |
||
4221 | /// - the right-hand-side |
||
4222 | Stmt *SubExprs[NUM_SUBEXPRS]; |
||
4223 | OpaqueValueExpr *OpaqueValue; |
||
4224 | |||
4225 | friend class ASTStmtReader; |
||
4226 | public: |
||
4227 | BinaryConditionalOperator(Expr *common, OpaqueValueExpr *opaqueValue, |
||
4228 | Expr *cond, Expr *lhs, Expr *rhs, |
||
4229 | SourceLocation qloc, SourceLocation cloc, |
||
4230 | QualType t, ExprValueKind VK, ExprObjectKind OK) |
||
4231 | : AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK, |
||
4232 | qloc, cloc), |
||
4233 | OpaqueValue(opaqueValue) { |
||
4234 | SubExprs[COMMON] = common; |
||
4235 | SubExprs[COND] = cond; |
||
4236 | SubExprs[LHS] = lhs; |
||
4237 | SubExprs[RHS] = rhs; |
||
4238 | assert(OpaqueValue->getSourceExpr() == common && "Wrong opaque value"); |
||
4239 | setDependence(computeDependence(this)); |
||
4240 | } |
||
4241 | |||
4242 | /// Build an empty conditional operator. |
||
4243 | explicit BinaryConditionalOperator(EmptyShell Empty) |
||
4244 | : AbstractConditionalOperator(BinaryConditionalOperatorClass, Empty) { } |
||
4245 | |||
4246 | /// getCommon - Return the common expression, written to the |
||
4247 | /// left of the condition. The opaque value will be bound to the |
||
4248 | /// result of this expression. |
||
4249 | Expr *getCommon() const { return cast<Expr>(SubExprs[COMMON]); } |
||
4250 | |||
4251 | /// getOpaqueValue - Return the opaque value placeholder. |
||
4252 | OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; } |
||
4253 | |||
4254 | /// getCond - Return the condition expression; this is defined |
||
4255 | /// in terms of the opaque value. |
||
4256 | Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } |
||
4257 | |||
4258 | /// getTrueExpr - Return the subexpression which will be |
||
4259 | /// evaluated if the condition evaluates to true; this is defined |
||
4260 | /// in terms of the opaque value. |
||
4261 | Expr *getTrueExpr() const { |
||
4262 | return cast<Expr>(SubExprs[LHS]); |
||
4263 | } |
||
4264 | |||
4265 | /// getFalseExpr - Return the subexpression which will be |
||
4266 | /// evaluated if the condnition evaluates to false; this is |
||
4267 | /// defined in terms of the opaque value. |
||
4268 | Expr *getFalseExpr() const { |
||
4269 | return cast<Expr>(SubExprs[RHS]); |
||
4270 | } |
||
4271 | |||
4272 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
4273 | return getCommon()->getBeginLoc(); |
||
4274 | } |
||
4275 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
4276 | return getFalseExpr()->getEndLoc(); |
||
4277 | } |
||
4278 | |||
4279 | static bool classof(const Stmt *T) { |
||
4280 | return T->getStmtClass() == BinaryConditionalOperatorClass; |
||
4281 | } |
||
4282 | |||
4283 | // Iterators |
||
4284 | child_range children() { |
||
4285 | return child_range(SubExprs, SubExprs + NUM_SUBEXPRS); |
||
4286 | } |
||
4287 | const_child_range children() const { |
||
4288 | return const_child_range(SubExprs, SubExprs + NUM_SUBEXPRS); |
||
4289 | } |
||
4290 | }; |
||
4291 | |||
4292 | inline Expr *AbstractConditionalOperator::getCond() const { |
||
4293 | if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) |
||
4294 | return co->getCond(); |
||
4295 | return cast<BinaryConditionalOperator>(this)->getCond(); |
||
4296 | } |
||
4297 | |||
4298 | inline Expr *AbstractConditionalOperator::getTrueExpr() const { |
||
4299 | if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) |
||
4300 | return co->getTrueExpr(); |
||
4301 | return cast<BinaryConditionalOperator>(this)->getTrueExpr(); |
||
4302 | } |
||
4303 | |||
4304 | inline Expr *AbstractConditionalOperator::getFalseExpr() const { |
||
4305 | if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) |
||
4306 | return co->getFalseExpr(); |
||
4307 | return cast<BinaryConditionalOperator>(this)->getFalseExpr(); |
||
4308 | } |
||
4309 | |||
4310 | /// AddrLabelExpr - The GNU address of label extension, representing &&label. |
||
4311 | class AddrLabelExpr : public Expr { |
||
4312 | SourceLocation AmpAmpLoc, LabelLoc; |
||
4313 | LabelDecl *Label; |
||
4314 | public: |
||
4315 | AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelDecl *L, |
||
4316 | QualType t) |
||
4317 | : Expr(AddrLabelExprClass, t, VK_PRValue, OK_Ordinary), AmpAmpLoc(AALoc), |
||
4318 | LabelLoc(LLoc), Label(L) { |
||
4319 | setDependence(ExprDependence::None); |
||
4320 | } |
||
4321 | |||
4322 | /// Build an empty address of a label expression. |
||
4323 | explicit AddrLabelExpr(EmptyShell Empty) |
||
4324 | : Expr(AddrLabelExprClass, Empty) { } |
||
4325 | |||
4326 | SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; } |
||
4327 | void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; } |
||
4328 | SourceLocation getLabelLoc() const { return LabelLoc; } |
||
4329 | void setLabelLoc(SourceLocation L) { LabelLoc = L; } |
||
4330 | |||
4331 | SourceLocation getBeginLoc() const LLVM_READONLY { return AmpAmpLoc; } |
||
4332 | SourceLocation getEndLoc() const LLVM_READONLY { return LabelLoc; } |
||
4333 | |||
4334 | LabelDecl *getLabel() const { return Label; } |
||
4335 | void setLabel(LabelDecl *L) { Label = L; } |
||
4336 | |||
4337 | static bool classof(const Stmt *T) { |
||
4338 | return T->getStmtClass() == AddrLabelExprClass; |
||
4339 | } |
||
4340 | |||
4341 | // Iterators |
||
4342 | child_range children() { |
||
4343 | return child_range(child_iterator(), child_iterator()); |
||
4344 | } |
||
4345 | const_child_range children() const { |
||
4346 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
4347 | } |
||
4348 | }; |
||
4349 | |||
4350 | /// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}). |
||
4351 | /// The StmtExpr contains a single CompoundStmt node, which it evaluates and |
||
4352 | /// takes the value of the last subexpression. |
||
4353 | /// |
||
4354 | /// A StmtExpr is always an r-value; values "returned" out of a |
||
4355 | /// StmtExpr will be copied. |
||
4356 | class StmtExpr : public Expr { |
||
4357 | Stmt *SubStmt; |
||
4358 | SourceLocation LParenLoc, RParenLoc; |
||
4359 | public: |
||
4360 | StmtExpr(CompoundStmt *SubStmt, QualType T, SourceLocation LParenLoc, |
||
4361 | SourceLocation RParenLoc, unsigned TemplateDepth) |
||
4362 | : Expr(StmtExprClass, T, VK_PRValue, OK_Ordinary), SubStmt(SubStmt), |
||
4363 | LParenLoc(LParenLoc), RParenLoc(RParenLoc) { |
||
4364 | setDependence(computeDependence(this, TemplateDepth)); |
||
4365 | // FIXME: A templated statement expression should have an associated |
||
4366 | // DeclContext so that nested declarations always have a dependent context. |
||
4367 | StmtExprBits.TemplateDepth = TemplateDepth; |
||
4368 | } |
||
4369 | |||
4370 | /// Build an empty statement expression. |
||
4371 | explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { } |
||
4372 | |||
4373 | CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); } |
||
4374 | const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); } |
||
4375 | void setSubStmt(CompoundStmt *S) { SubStmt = S; } |
||
4376 | |||
4377 | SourceLocation getBeginLoc() const LLVM_READONLY { return LParenLoc; } |
||
4378 | SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } |
||
4379 | |||
4380 | SourceLocation getLParenLoc() const { return LParenLoc; } |
||
4381 | void setLParenLoc(SourceLocation L) { LParenLoc = L; } |
||
4382 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
4383 | void setRParenLoc(SourceLocation L) { RParenLoc = L; } |
||
4384 | |||
4385 | unsigned getTemplateDepth() const { return StmtExprBits.TemplateDepth; } |
||
4386 | |||
4387 | static bool classof(const Stmt *T) { |
||
4388 | return T->getStmtClass() == StmtExprClass; |
||
4389 | } |
||
4390 | |||
4391 | // Iterators |
||
4392 | child_range children() { return child_range(&SubStmt, &SubStmt+1); } |
||
4393 | const_child_range children() const { |
||
4394 | return const_child_range(&SubStmt, &SubStmt + 1); |
||
4395 | } |
||
4396 | }; |
||
4397 | |||
4398 | /// ShuffleVectorExpr - clang-specific builtin-in function |
||
4399 | /// __builtin_shufflevector. |
||
4400 | /// This AST node represents a operator that does a constant |
||
4401 | /// shuffle, similar to LLVM's shufflevector instruction. It takes |
||
4402 | /// two vectors and a variable number of constant indices, |
||
4403 | /// and returns the appropriately shuffled vector. |
||
4404 | class ShuffleVectorExpr : public Expr { |
||
4405 | SourceLocation BuiltinLoc, RParenLoc; |
||
4406 | |||
4407 | // SubExprs - the list of values passed to the __builtin_shufflevector |
||
4408 | // function. The first two are vectors, and the rest are constant |
||
4409 | // indices. The number of values in this list is always |
||
4410 | // 2+the number of indices in the vector type. |
||
4411 | Stmt **SubExprs; |
||
4412 | unsigned NumExprs; |
||
4413 | |||
4414 | public: |
||
4415 | ShuffleVectorExpr(const ASTContext &C, ArrayRef<Expr*> args, QualType Type, |
||
4416 | SourceLocation BLoc, SourceLocation RP); |
||
4417 | |||
4418 | /// Build an empty vector-shuffle expression. |
||
4419 | explicit ShuffleVectorExpr(EmptyShell Empty) |
||
4420 | : Expr(ShuffleVectorExprClass, Empty), SubExprs(nullptr) { } |
||
4421 | |||
4422 | SourceLocation getBuiltinLoc() const { return BuiltinLoc; } |
||
4423 | void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } |
||
4424 | |||
4425 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
4426 | void setRParenLoc(SourceLocation L) { RParenLoc = L; } |
||
4427 | |||
4428 | SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } |
||
4429 | SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } |
||
4430 | |||
4431 | static bool classof(const Stmt *T) { |
||
4432 | return T->getStmtClass() == ShuffleVectorExprClass; |
||
4433 | } |
||
4434 | |||
4435 | /// getNumSubExprs - Return the size of the SubExprs array. This includes the |
||
4436 | /// constant expression, the actual arguments passed in, and the function |
||
4437 | /// pointers. |
||
4438 | unsigned getNumSubExprs() const { return NumExprs; } |
||
4439 | |||
4440 | /// Retrieve the array of expressions. |
||
4441 | Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); } |
||
4442 | |||
4443 | /// getExpr - Return the Expr at the specified index. |
||
4444 | Expr *getExpr(unsigned Index) { |
||
4445 | assert((Index < NumExprs) && "Arg access out of range!"); |
||
4446 | return cast<Expr>(SubExprs[Index]); |
||
4447 | } |
||
4448 | const Expr *getExpr(unsigned Index) const { |
||
4449 | assert((Index < NumExprs) && "Arg access out of range!"); |
||
4450 | return cast<Expr>(SubExprs[Index]); |
||
4451 | } |
||
4452 | |||
4453 | void setExprs(const ASTContext &C, ArrayRef<Expr *> Exprs); |
||
4454 | |||
4455 | llvm::APSInt getShuffleMaskIdx(const ASTContext &Ctx, unsigned N) const { |
||
4456 | assert((N < NumExprs - 2) && "Shuffle idx out of range!"); |
||
4457 | return getExpr(N+2)->EvaluateKnownConstInt(Ctx); |
||
4458 | } |
||
4459 | |||
4460 | // Iterators |
||
4461 | child_range children() { |
||
4462 | return child_range(&SubExprs[0], &SubExprs[0]+NumExprs); |
||
4463 | } |
||
4464 | const_child_range children() const { |
||
4465 | return const_child_range(&SubExprs[0], &SubExprs[0] + NumExprs); |
||
4466 | } |
||
4467 | }; |
||
4468 | |||
4469 | /// ConvertVectorExpr - Clang builtin function __builtin_convertvector |
||
4470 | /// This AST node provides support for converting a vector type to another |
||
4471 | /// vector type of the same arity. |
||
4472 | class ConvertVectorExpr : public Expr { |
||
4473 | private: |
||
4474 | Stmt *SrcExpr; |
||
4475 | TypeSourceInfo *TInfo; |
||
4476 | SourceLocation BuiltinLoc, RParenLoc; |
||
4477 | |||
4478 | friend class ASTReader; |
||
4479 | friend class ASTStmtReader; |
||
4480 | explicit ConvertVectorExpr(EmptyShell Empty) : Expr(ConvertVectorExprClass, Empty) {} |
||
4481 | |||
4482 | public: |
||
4483 | ConvertVectorExpr(Expr *SrcExpr, TypeSourceInfo *TI, QualType DstType, |
||
4484 | ExprValueKind VK, ExprObjectKind OK, |
||
4485 | SourceLocation BuiltinLoc, SourceLocation RParenLoc) |
||
4486 | : Expr(ConvertVectorExprClass, DstType, VK, OK), SrcExpr(SrcExpr), |
||
4487 | TInfo(TI), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) { |
||
4488 | setDependence(computeDependence(this)); |
||
4489 | } |
||
4490 | |||
4491 | /// getSrcExpr - Return the Expr to be converted. |
||
4492 | Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); } |
||
4493 | |||
4494 | /// getTypeSourceInfo - Return the destination type. |
||
4495 | TypeSourceInfo *getTypeSourceInfo() const { |
||
4496 | return TInfo; |
||
4497 | } |
||
4498 | void setTypeSourceInfo(TypeSourceInfo *ti) { |
||
4499 | TInfo = ti; |
||
4500 | } |
||
4501 | |||
4502 | /// getBuiltinLoc - Return the location of the __builtin_convertvector token. |
||
4503 | SourceLocation getBuiltinLoc() const { return BuiltinLoc; } |
||
4504 | |||
4505 | /// getRParenLoc - Return the location of final right parenthesis. |
||
4506 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
4507 | |||
4508 | SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } |
||
4509 | SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } |
||
4510 | |||
4511 | static bool classof(const Stmt *T) { |
||
4512 | return T->getStmtClass() == ConvertVectorExprClass; |
||
4513 | } |
||
4514 | |||
4515 | // Iterators |
||
4516 | child_range children() { return child_range(&SrcExpr, &SrcExpr+1); } |
||
4517 | const_child_range children() const { |
||
4518 | return const_child_range(&SrcExpr, &SrcExpr + 1); |
||
4519 | } |
||
4520 | }; |
||
4521 | |||
4522 | /// ChooseExpr - GNU builtin-in function __builtin_choose_expr. |
||
4523 | /// This AST node is similar to the conditional operator (?:) in C, with |
||
4524 | /// the following exceptions: |
||
4525 | /// - the test expression must be a integer constant expression. |
||
4526 | /// - the expression returned acts like the chosen subexpression in every |
||
4527 | /// visible way: the type is the same as that of the chosen subexpression, |
||
4528 | /// and all predicates (whether it's an l-value, whether it's an integer |
||
4529 | /// constant expression, etc.) return the same result as for the chosen |
||
4530 | /// sub-expression. |
||
4531 | class ChooseExpr : public Expr { |
||
4532 | enum { COND, LHS, RHS, END_EXPR }; |
||
4533 | Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. |
||
4534 | SourceLocation BuiltinLoc, RParenLoc; |
||
4535 | bool CondIsTrue; |
||
4536 | public: |
||
4537 | ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, QualType t, |
||
4538 | ExprValueKind VK, ExprObjectKind OK, SourceLocation RP, |
||
4539 | bool condIsTrue) |
||
4540 | : Expr(ChooseExprClass, t, VK, OK), BuiltinLoc(BLoc), RParenLoc(RP), |
||
4541 | CondIsTrue(condIsTrue) { |
||
4542 | SubExprs[COND] = cond; |
||
4543 | SubExprs[LHS] = lhs; |
||
4544 | SubExprs[RHS] = rhs; |
||
4545 | |||
4546 | setDependence(computeDependence(this)); |
||
4547 | } |
||
4548 | |||
4549 | /// Build an empty __builtin_choose_expr. |
||
4550 | explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { } |
||
4551 | |||
4552 | /// isConditionTrue - Return whether the condition is true (i.e. not |
||
4553 | /// equal to zero). |
||
4554 | bool isConditionTrue() const { |
||
4555 | assert(!isConditionDependent() && |
||
4556 | "Dependent condition isn't true or false"); |
||
4557 | return CondIsTrue; |
||
4558 | } |
||
4559 | void setIsConditionTrue(bool isTrue) { CondIsTrue = isTrue; } |
||
4560 | |||
4561 | bool isConditionDependent() const { |
||
4562 | return getCond()->isTypeDependent() || getCond()->isValueDependent(); |
||
4563 | } |
||
4564 | |||
4565 | /// getChosenSubExpr - Return the subexpression chosen according to the |
||
4566 | /// condition. |
||
4567 | Expr *getChosenSubExpr() const { |
||
4568 | return isConditionTrue() ? getLHS() : getRHS(); |
||
4569 | } |
||
4570 | |||
4571 | Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } |
||
4572 | void setCond(Expr *E) { SubExprs[COND] = E; } |
||
4573 | Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } |
||
4574 | void setLHS(Expr *E) { SubExprs[LHS] = E; } |
||
4575 | Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } |
||
4576 | void setRHS(Expr *E) { SubExprs[RHS] = E; } |
||
4577 | |||
4578 | SourceLocation getBuiltinLoc() const { return BuiltinLoc; } |
||
4579 | void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } |
||
4580 | |||
4581 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
4582 | void setRParenLoc(SourceLocation L) { RParenLoc = L; } |
||
4583 | |||
4584 | SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } |
||
4585 | SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } |
||
4586 | |||
4587 | static bool classof(const Stmt *T) { |
||
4588 | return T->getStmtClass() == ChooseExprClass; |
||
4589 | } |
||
4590 | |||
4591 | // Iterators |
||
4592 | child_range children() { |
||
4593 | return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); |
||
4594 | } |
||
4595 | const_child_range children() const { |
||
4596 | return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); |
||
4597 | } |
||
4598 | }; |
||
4599 | |||
4600 | /// GNUNullExpr - Implements the GNU __null extension, which is a name |
||
4601 | /// for a null pointer constant that has integral type (e.g., int or |
||
4602 | /// long) and is the same size and alignment as a pointer. The __null |
||
4603 | /// extension is typically only used by system headers, which define |
||
4604 | /// NULL as __null in C++ rather than using 0 (which is an integer |
||
4605 | /// that may not match the size of a pointer). |
||
4606 | class GNUNullExpr : public Expr { |
||
4607 | /// TokenLoc - The location of the __null keyword. |
||
4608 | SourceLocation TokenLoc; |
||
4609 | |||
4610 | public: |
||
4611 | GNUNullExpr(QualType Ty, SourceLocation Loc) |
||
4612 | : Expr(GNUNullExprClass, Ty, VK_PRValue, OK_Ordinary), TokenLoc(Loc) { |
||
4613 | setDependence(ExprDependence::None); |
||
4614 | } |
||
4615 | |||
4616 | /// Build an empty GNU __null expression. |
||
4617 | explicit GNUNullExpr(EmptyShell Empty) : Expr(GNUNullExprClass, Empty) { } |
||
4618 | |||
4619 | /// getTokenLocation - The location of the __null token. |
||
4620 | SourceLocation getTokenLocation() const { return TokenLoc; } |
||
4621 | void setTokenLocation(SourceLocation L) { TokenLoc = L; } |
||
4622 | |||
4623 | SourceLocation getBeginLoc() const LLVM_READONLY { return TokenLoc; } |
||
4624 | SourceLocation getEndLoc() const LLVM_READONLY { return TokenLoc; } |
||
4625 | |||
4626 | static bool classof(const Stmt *T) { |
||
4627 | return T->getStmtClass() == GNUNullExprClass; |
||
4628 | } |
||
4629 | |||
4630 | // Iterators |
||
4631 | child_range children() { |
||
4632 | return child_range(child_iterator(), child_iterator()); |
||
4633 | } |
||
4634 | const_child_range children() const { |
||
4635 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
4636 | } |
||
4637 | }; |
||
4638 | |||
4639 | /// Represents a call to the builtin function \c __builtin_va_arg. |
||
4640 | class VAArgExpr : public Expr { |
||
4641 | Stmt *Val; |
||
4642 | llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfo; |
||
4643 | SourceLocation BuiltinLoc, RParenLoc; |
||
4644 | public: |
||
4645 | VAArgExpr(SourceLocation BLoc, Expr *e, TypeSourceInfo *TInfo, |
||
4646 | SourceLocation RPLoc, QualType t, bool IsMS) |
||
4647 | : Expr(VAArgExprClass, t, VK_PRValue, OK_Ordinary), Val(e), |
||
4648 | TInfo(TInfo, IsMS), BuiltinLoc(BLoc), RParenLoc(RPLoc) { |
||
4649 | setDependence(computeDependence(this)); |
||
4650 | } |
||
4651 | |||
4652 | /// Create an empty __builtin_va_arg expression. |
||
4653 | explicit VAArgExpr(EmptyShell Empty) |
||
4654 | : Expr(VAArgExprClass, Empty), Val(nullptr), TInfo(nullptr, false) {} |
||
4655 | |||
4656 | const Expr *getSubExpr() const { return cast<Expr>(Val); } |
||
4657 | Expr *getSubExpr() { return cast<Expr>(Val); } |
||
4658 | void setSubExpr(Expr *E) { Val = E; } |
||
4659 | |||
4660 | /// Returns whether this is really a Win64 ABI va_arg expression. |
||
4661 | bool isMicrosoftABI() const { return TInfo.getInt(); } |
||
4662 | void setIsMicrosoftABI(bool IsMS) { TInfo.setInt(IsMS); } |
||
4663 | |||
4664 | TypeSourceInfo *getWrittenTypeInfo() const { return TInfo.getPointer(); } |
||
4665 | void setWrittenTypeInfo(TypeSourceInfo *TI) { TInfo.setPointer(TI); } |
||
4666 | |||
4667 | SourceLocation getBuiltinLoc() const { return BuiltinLoc; } |
||
4668 | void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } |
||
4669 | |||
4670 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
4671 | void setRParenLoc(SourceLocation L) { RParenLoc = L; } |
||
4672 | |||
4673 | SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } |
||
4674 | SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } |
||
4675 | |||
4676 | static bool classof(const Stmt *T) { |
||
4677 | return T->getStmtClass() == VAArgExprClass; |
||
4678 | } |
||
4679 | |||
4680 | // Iterators |
||
4681 | child_range children() { return child_range(&Val, &Val+1); } |
||
4682 | const_child_range children() const { |
||
4683 | return const_child_range(&Val, &Val + 1); |
||
4684 | } |
||
4685 | }; |
||
4686 | |||
4687 | /// Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), |
||
4688 | /// __builtin_FUNCTION(), __builtin_FILE(), or __builtin_source_location(). |
||
4689 | class SourceLocExpr final : public Expr { |
||
4690 | SourceLocation BuiltinLoc, RParenLoc; |
||
4691 | DeclContext *ParentContext; |
||
4692 | |||
4693 | public: |
||
4694 | enum IdentKind { Function, File, Line, Column, SourceLocStruct }; |
||
4695 | |||
4696 | SourceLocExpr(const ASTContext &Ctx, IdentKind Type, QualType ResultTy, |
||
4697 | SourceLocation BLoc, SourceLocation RParenLoc, |
||
4698 | DeclContext *Context); |
||
4699 | |||
4700 | /// Build an empty call expression. |
||
4701 | explicit SourceLocExpr(EmptyShell Empty) : Expr(SourceLocExprClass, Empty) {} |
||
4702 | |||
4703 | /// Return the result of evaluating this SourceLocExpr in the specified |
||
4704 | /// (and possibly null) default argument or initialization context. |
||
4705 | APValue EvaluateInContext(const ASTContext &Ctx, |
||
4706 | const Expr *DefaultExpr) const; |
||
4707 | |||
4708 | /// Return a string representing the name of the specific builtin function. |
||
4709 | StringRef getBuiltinStr() const; |
||
4710 | |||
4711 | IdentKind getIdentKind() const { |
||
4712 | return static_cast<IdentKind>(SourceLocExprBits.Kind); |
||
4713 | } |
||
4714 | |||
4715 | bool isIntType() const { |
||
4716 | switch (getIdentKind()) { |
||
4717 | case File: |
||
4718 | case Function: |
||
4719 | case SourceLocStruct: |
||
4720 | return false; |
||
4721 | case Line: |
||
4722 | case Column: |
||
4723 | return true; |
||
4724 | } |
||
4725 | llvm_unreachable("unknown source location expression kind"); |
||
4726 | } |
||
4727 | |||
4728 | /// If the SourceLocExpr has been resolved return the subexpression |
||
4729 | /// representing the resolved value. Otherwise return null. |
||
4730 | const DeclContext *getParentContext() const { return ParentContext; } |
||
4731 | DeclContext *getParentContext() { return ParentContext; } |
||
4732 | |||
4733 | SourceLocation getLocation() const { return BuiltinLoc; } |
||
4734 | SourceLocation getBeginLoc() const { return BuiltinLoc; } |
||
4735 | SourceLocation getEndLoc() const { return RParenLoc; } |
||
4736 | |||
4737 | child_range children() { |
||
4738 | return child_range(child_iterator(), child_iterator()); |
||
4739 | } |
||
4740 | |||
4741 | const_child_range children() const { |
||
4742 | return const_child_range(child_iterator(), child_iterator()); |
||
4743 | } |
||
4744 | |||
4745 | static bool classof(const Stmt *T) { |
||
4746 | return T->getStmtClass() == SourceLocExprClass; |
||
4747 | } |
||
4748 | |||
4749 | private: |
||
4750 | friend class ASTStmtReader; |
||
4751 | }; |
||
4752 | |||
4753 | /// Describes an C or C++ initializer list. |
||
4754 | /// |
||
4755 | /// InitListExpr describes an initializer list, which can be used to |
||
4756 | /// initialize objects of different types, including |
||
4757 | /// struct/class/union types, arrays, and vectors. For example: |
||
4758 | /// |
||
4759 | /// @code |
||
4760 | /// struct foo x = { 1, { 2, 3 } }; |
||
4761 | /// @endcode |
||
4762 | /// |
||
4763 | /// Prior to semantic analysis, an initializer list will represent the |
||
4764 | /// initializer list as written by the user, but will have the |
||
4765 | /// placeholder type "void". This initializer list is called the |
||
4766 | /// syntactic form of the initializer, and may contain C99 designated |
||
4767 | /// initializers (represented as DesignatedInitExprs), initializations |
||
4768 | /// of subobject members without explicit braces, and so on. Clients |
||
4769 | /// interested in the original syntax of the initializer list should |
||
4770 | /// use the syntactic form of the initializer list. |
||
4771 | /// |
||
4772 | /// After semantic analysis, the initializer list will represent the |
||
4773 | /// semantic form of the initializer, where the initializations of all |
||
4774 | /// subobjects are made explicit with nested InitListExpr nodes and |
||
4775 | /// C99 designators have been eliminated by placing the designated |
||
4776 | /// initializations into the subobject they initialize. Additionally, |
||
4777 | /// any "holes" in the initialization, where no initializer has been |
||
4778 | /// specified for a particular subobject, will be replaced with |
||
4779 | /// implicitly-generated ImplicitValueInitExpr expressions that |
||
4780 | /// value-initialize the subobjects. Note, however, that the |
||
4781 | /// initializer lists may still have fewer initializers than there are |
||
4782 | /// elements to initialize within the object. |
||
4783 | /// |
||
4784 | /// After semantic analysis has completed, given an initializer list, |
||
4785 | /// method isSemanticForm() returns true if and only if this is the |
||
4786 | /// semantic form of the initializer list (note: the same AST node |
||
4787 | /// may at the same time be the syntactic form). |
||
4788 | /// Given the semantic form of the initializer list, one can retrieve |
||
4789 | /// the syntactic form of that initializer list (when different) |
||
4790 | /// using method getSyntacticForm(); the method returns null if applied |
||
4791 | /// to a initializer list which is already in syntactic form. |
||
4792 | /// Similarly, given the syntactic form (i.e., an initializer list such |
||
4793 | /// that isSemanticForm() returns false), one can retrieve the semantic |
||
4794 | /// form using method getSemanticForm(). |
||
4795 | /// Since many initializer lists have the same syntactic and semantic forms, |
||
4796 | /// getSyntacticForm() may return NULL, indicating that the current |
||
4797 | /// semantic initializer list also serves as its syntactic form. |
||
4798 | class InitListExpr : public Expr { |
||
4799 | // FIXME: Eliminate this vector in favor of ASTContext allocation |
||
4800 | typedef ASTVector<Stmt *> InitExprsTy; |
||
4801 | InitExprsTy InitExprs; |
||
4802 | SourceLocation LBraceLoc, RBraceLoc; |
||
4803 | |||
4804 | /// The alternative form of the initializer list (if it exists). |
||
4805 | /// The int part of the pair stores whether this initializer list is |
||
4806 | /// in semantic form. If not null, the pointer points to: |
||
4807 | /// - the syntactic form, if this is in semantic form; |
||
4808 | /// - the semantic form, if this is in syntactic form. |
||
4809 | llvm::PointerIntPair<InitListExpr *, 1, bool> AltForm; |
||
4810 | |||
4811 | /// Either: |
||
4812 | /// If this initializer list initializes an array with more elements than |
||
4813 | /// there are initializers in the list, specifies an expression to be used |
||
4814 | /// for value initialization of the rest of the elements. |
||
4815 | /// Or |
||
4816 | /// If this initializer list initializes a union, specifies which |
||
4817 | /// field within the union will be initialized. |
||
4818 | llvm::PointerUnion<Expr *, FieldDecl *> ArrayFillerOrUnionFieldInit; |
||
4819 | |||
4820 | public: |
||
4821 | InitListExpr(const ASTContext &C, SourceLocation lbraceloc, |
||
4822 | ArrayRef<Expr*> initExprs, SourceLocation rbraceloc); |
||
4823 | |||
4824 | /// Build an empty initializer list. |
||
4825 | explicit InitListExpr(EmptyShell Empty) |
||
4826 | : Expr(InitListExprClass, Empty), AltForm(nullptr, true) { } |
||
4827 | |||
4828 | unsigned getNumInits() const { return InitExprs.size(); } |
||
4829 | |||
4830 | /// Retrieve the set of initializers. |
||
4831 | Expr **getInits() { return reinterpret_cast<Expr **>(InitExprs.data()); } |
||
4832 | |||
4833 | /// Retrieve the set of initializers. |
||
4834 | Expr * const *getInits() const { |
||
4835 | return reinterpret_cast<Expr * const *>(InitExprs.data()); |
||
4836 | } |
||
4837 | |||
4838 | ArrayRef<Expr *> inits() { return llvm::ArrayRef(getInits(), getNumInits()); } |
||
4839 | |||
4840 | ArrayRef<Expr *> inits() const { |
||
4841 | return llvm::ArrayRef(getInits(), getNumInits()); |
||
4842 | } |
||
4843 | |||
4844 | const Expr *getInit(unsigned Init) const { |
||
4845 | assert(Init < getNumInits() && "Initializer access out of range!"); |
||
4846 | return cast_or_null<Expr>(InitExprs[Init]); |
||
4847 | } |
||
4848 | |||
4849 | Expr *getInit(unsigned Init) { |
||
4850 | assert(Init < getNumInits() && "Initializer access out of range!"); |
||
4851 | return cast_or_null<Expr>(InitExprs[Init]); |
||
4852 | } |
||
4853 | |||
4854 | void setInit(unsigned Init, Expr *expr) { |
||
4855 | assert(Init < getNumInits() && "Initializer access out of range!"); |
||
4856 | InitExprs[Init] = expr; |
||
4857 | |||
4858 | if (expr) |
||
4859 | setDependence(getDependence() | expr->getDependence()); |
||
4860 | } |
||
4861 | |||
4862 | /// Mark the semantic form of the InitListExpr as error when the semantic |
||
4863 | /// analysis fails. |
||
4864 | void markError() { |
||
4865 | assert(isSemanticForm()); |
||
4866 | setDependence(getDependence() | ExprDependence::ErrorDependent); |
||
4867 | } |
||
4868 | |||
4869 | /// Reserve space for some number of initializers. |
||
4870 | void reserveInits(const ASTContext &C, unsigned NumInits); |
||
4871 | |||
4872 | /// Specify the number of initializers |
||
4873 | /// |
||
4874 | /// If there are more than @p NumInits initializers, the remaining |
||
4875 | /// initializers will be destroyed. If there are fewer than @p |
||
4876 | /// NumInits initializers, NULL expressions will be added for the |
||
4877 | /// unknown initializers. |
||
4878 | void resizeInits(const ASTContext &Context, unsigned NumInits); |
||
4879 | |||
4880 | /// Updates the initializer at index @p Init with the new |
||
4881 | /// expression @p expr, and returns the old expression at that |
||
4882 | /// location. |
||
4883 | /// |
||
4884 | /// When @p Init is out of range for this initializer list, the |
||
4885 | /// initializer list will be extended with NULL expressions to |
||
4886 | /// accommodate the new entry. |
||
4887 | Expr *updateInit(const ASTContext &C, unsigned Init, Expr *expr); |
||
4888 | |||
4889 | /// If this initializer list initializes an array with more elements |
||
4890 | /// than there are initializers in the list, specifies an expression to be |
||
4891 | /// used for value initialization of the rest of the elements. |
||
4892 | Expr *getArrayFiller() { |
||
4893 | return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>(); |
||
4894 | } |
||
4895 | const Expr *getArrayFiller() const { |
||
4896 | return const_cast<InitListExpr *>(this)->getArrayFiller(); |
||
4897 | } |
||
4898 | void setArrayFiller(Expr *filler); |
||
4899 | |||
4900 | /// Return true if this is an array initializer and its array "filler" |
||
4901 | /// has been set. |
||
4902 | bool hasArrayFiller() const { return getArrayFiller(); } |
||
4903 | |||
4904 | /// If this initializes a union, specifies which field in the |
||
4905 | /// union to initialize. |
||
4906 | /// |
||
4907 | /// Typically, this field is the first named field within the |
||
4908 | /// union. However, a designated initializer can specify the |
||
4909 | /// initialization of a different field within the union. |
||
4910 | FieldDecl *getInitializedFieldInUnion() { |
||
4911 | return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>(); |
||
4912 | } |
||
4913 | const FieldDecl *getInitializedFieldInUnion() const { |
||
4914 | return const_cast<InitListExpr *>(this)->getInitializedFieldInUnion(); |
||
4915 | } |
||
4916 | void setInitializedFieldInUnion(FieldDecl *FD) { |
||
4917 | assert((FD == nullptr |
||
4918 | || getInitializedFieldInUnion() == nullptr |
||
4919 | || getInitializedFieldInUnion() == FD) |
||
4920 | && "Only one field of a union may be initialized at a time!"); |
||
4921 | ArrayFillerOrUnionFieldInit = FD; |
||
4922 | } |
||
4923 | |||
4924 | // Explicit InitListExpr's originate from source code (and have valid source |
||
4925 | // locations). Implicit InitListExpr's are created by the semantic analyzer. |
||
4926 | // FIXME: This is wrong; InitListExprs created by semantic analysis have |
||
4927 | // valid source locations too! |
||
4928 | bool isExplicit() const { |
||
4929 | return LBraceLoc.isValid() && RBraceLoc.isValid(); |
||
4930 | } |
||
4931 | |||
4932 | // Is this an initializer for an array of characters, initialized by a string |
||
4933 | // literal or an @encode? |
||
4934 | bool isStringLiteralInit() const; |
||
4935 | |||
4936 | /// Is this a transparent initializer list (that is, an InitListExpr that is |
||
4937 | /// purely syntactic, and whose semantics are that of the sole contained |
||
4938 | /// initializer)? |
||
4939 | bool isTransparent() const; |
||
4940 | |||
4941 | /// Is this the zero initializer {0} in a language which considers it |
||
4942 | /// idiomatic? |
||
4943 | bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const; |
||
4944 | |||
4945 | SourceLocation getLBraceLoc() const { return LBraceLoc; } |
||
4946 | void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; } |
||
4947 | SourceLocation getRBraceLoc() const { return RBraceLoc; } |
||
4948 | void setRBraceLoc(SourceLocation Loc) { RBraceLoc = Loc; } |
||
4949 | |||
4950 | bool isSemanticForm() const { return AltForm.getInt(); } |
||
4951 | InitListExpr *getSemanticForm() const { |
||
4952 | return isSemanticForm() ? nullptr : AltForm.getPointer(); |
||
4953 | } |
||
4954 | bool isSyntacticForm() const { |
||
4955 | return !AltForm.getInt() || !AltForm.getPointer(); |
||
4956 | } |
||
4957 | InitListExpr *getSyntacticForm() const { |
||
4958 | return isSemanticForm() ? AltForm.getPointer() : nullptr; |
||
4959 | } |
||
4960 | |||
4961 | void setSyntacticForm(InitListExpr *Init) { |
||
4962 | AltForm.setPointer(Init); |
||
4963 | AltForm.setInt(true); |
||
4964 | Init->AltForm.setPointer(this); |
||
4965 | Init->AltForm.setInt(false); |
||
4966 | } |
||
4967 | |||
4968 | bool hadArrayRangeDesignator() const { |
||
4969 | return InitListExprBits.HadArrayRangeDesignator != 0; |
||
4970 | } |
||
4971 | void sawArrayRangeDesignator(bool ARD = true) { |
||
4972 | InitListExprBits.HadArrayRangeDesignator = ARD; |
||
4973 | } |
||
4974 | |||
4975 | SourceLocation getBeginLoc() const LLVM_READONLY; |
||
4976 | SourceLocation getEndLoc() const LLVM_READONLY; |
||
4977 | |||
4978 | static bool classof(const Stmt *T) { |
||
4979 | return T->getStmtClass() == InitListExprClass; |
||
4980 | } |
||
4981 | |||
4982 | // Iterators |
||
4983 | child_range children() { |
||
4984 | const_child_range CCR = const_cast<const InitListExpr *>(this)->children(); |
||
4985 | return child_range(cast_away_const(CCR.begin()), |
||
4986 | cast_away_const(CCR.end())); |
||
4987 | } |
||
4988 | |||
4989 | const_child_range children() const { |
||
4990 | // FIXME: This does not include the array filler expression. |
||
4991 | if (InitExprs.empty()) |
||
4992 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
4993 | return const_child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size()); |
||
4994 | } |
||
4995 | |||
4996 | typedef InitExprsTy::iterator iterator; |
||
4997 | typedef InitExprsTy::const_iterator const_iterator; |
||
4998 | typedef InitExprsTy::reverse_iterator reverse_iterator; |
||
4999 | typedef InitExprsTy::const_reverse_iterator const_reverse_iterator; |
||
5000 | |||
5001 | iterator begin() { return InitExprs.begin(); } |
||
5002 | const_iterator begin() const { return InitExprs.begin(); } |
||
5003 | iterator end() { return InitExprs.end(); } |
||
5004 | const_iterator end() const { return InitExprs.end(); } |
||
5005 | reverse_iterator rbegin() { return InitExprs.rbegin(); } |
||
5006 | const_reverse_iterator rbegin() const { return InitExprs.rbegin(); } |
||
5007 | reverse_iterator rend() { return InitExprs.rend(); } |
||
5008 | const_reverse_iterator rend() const { return InitExprs.rend(); } |
||
5009 | |||
5010 | friend class ASTStmtReader; |
||
5011 | friend class ASTStmtWriter; |
||
5012 | }; |
||
5013 | |||
5014 | /// Represents a C99 designated initializer expression. |
||
5015 | /// |
||
5016 | /// A designated initializer expression (C99 6.7.8) contains one or |
||
5017 | /// more designators (which can be field designators, array |
||
5018 | /// designators, or GNU array-range designators) followed by an |
||
5019 | /// expression that initializes the field or element(s) that the |
||
5020 | /// designators refer to. For example, given: |
||
5021 | /// |
||
5022 | /// @code |
||
5023 | /// struct point { |
||
5024 | /// double x; |
||
5025 | /// double y; |
||
5026 | /// }; |
||
5027 | /// struct point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; |
||
5028 | /// @endcode |
||
5029 | /// |
||
5030 | /// The InitListExpr contains three DesignatedInitExprs, the first of |
||
5031 | /// which covers @c [2].y=1.0. This DesignatedInitExpr will have two |
||
5032 | /// designators, one array designator for @c [2] followed by one field |
||
5033 | /// designator for @c .y. The initialization expression will be 1.0. |
||
5034 | class DesignatedInitExpr final |
||
5035 | : public Expr, |
||
5036 | private llvm::TrailingObjects<DesignatedInitExpr, Stmt *> { |
||
5037 | public: |
||
5038 | /// Forward declaration of the Designator class. |
||
5039 | class Designator; |
||
5040 | |||
5041 | private: |
||
5042 | /// The location of the '=' or ':' prior to the actual initializer |
||
5043 | /// expression. |
||
5044 | SourceLocation EqualOrColonLoc; |
||
5045 | |||
5046 | /// Whether this designated initializer used the GNU deprecated |
||
5047 | /// syntax rather than the C99 '=' syntax. |
||
5048 | unsigned GNUSyntax : 1; |
||
5049 | |||
5050 | /// The number of designators in this initializer expression. |
||
5051 | unsigned NumDesignators : 15; |
||
5052 | |||
5053 | /// The number of subexpressions of this initializer expression, |
||
5054 | /// which contains both the initializer and any additional |
||
5055 | /// expressions used by array and array-range designators. |
||
5056 | unsigned NumSubExprs : 16; |
||
5057 | |||
5058 | /// The designators in this designated initialization |
||
5059 | /// expression. |
||
5060 | Designator *Designators; |
||
5061 | |||
5062 | DesignatedInitExpr(const ASTContext &C, QualType Ty, |
||
5063 | llvm::ArrayRef<Designator> Designators, |
||
5064 | SourceLocation EqualOrColonLoc, bool GNUSyntax, |
||
5065 | ArrayRef<Expr *> IndexExprs, Expr *Init); |
||
5066 | |||
5067 | explicit DesignatedInitExpr(unsigned NumSubExprs) |
||
5068 | : Expr(DesignatedInitExprClass, EmptyShell()), |
||
5069 | NumDesignators(0), NumSubExprs(NumSubExprs), Designators(nullptr) { } |
||
5070 | |||
5071 | public: |
||
5072 | /// A field designator, e.g., ".x". |
||
5073 | struct FieldDesignator { |
||
5074 | /// Refers to the field that is being initialized. The low bit |
||
5075 | /// of this field determines whether this is actually a pointer |
||
5076 | /// to an IdentifierInfo (if 1) or a FieldDecl (if 0). When |
||
5077 | /// initially constructed, a field designator will store an |
||
5078 | /// IdentifierInfo*. After semantic analysis has resolved that |
||
5079 | /// name, the field designator will instead store a FieldDecl*. |
||
5080 | uintptr_t NameOrField; |
||
5081 | |||
5082 | /// The location of the '.' in the designated initializer. |
||
5083 | SourceLocation DotLoc; |
||
5084 | |||
5085 | /// The location of the field name in the designated initializer. |
||
5086 | SourceLocation FieldLoc; |
||
5087 | }; |
||
5088 | |||
5089 | /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". |
||
5090 | struct ArrayOrRangeDesignator { |
||
5091 | /// Location of the first index expression within the designated |
||
5092 | /// initializer expression's list of subexpressions. |
||
5093 | unsigned Index; |
||
5094 | /// The location of the '[' starting the array range designator. |
||
5095 | SourceLocation LBracketLoc; |
||
5096 | /// The location of the ellipsis separating the start and end |
||
5097 | /// indices. Only valid for GNU array-range designators. |
||
5098 | SourceLocation EllipsisLoc; |
||
5099 | /// The location of the ']' terminating the array range designator. |
||
5100 | SourceLocation RBracketLoc; |
||
5101 | }; |
||
5102 | |||
5103 | /// Represents a single C99 designator. |
||
5104 | /// |
||
5105 | /// @todo This class is infuriatingly similar to clang::Designator, |
||
5106 | /// but minor differences (storing indices vs. storing pointers) |
||
5107 | /// keep us from reusing it. Try harder, later, to rectify these |
||
5108 | /// differences. |
||
5109 | class Designator { |
||
5110 | /// The kind of designator this describes. |
||
5111 | enum { |
||
5112 | FieldDesignator, |
||
5113 | ArrayDesignator, |
||
5114 | ArrayRangeDesignator |
||
5115 | } Kind; |
||
5116 | |||
5117 | union { |
||
5118 | /// A field designator, e.g., ".x". |
||
5119 | struct FieldDesignator Field; |
||
5120 | /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". |
||
5121 | struct ArrayOrRangeDesignator ArrayOrRange; |
||
5122 | }; |
||
5123 | friend class DesignatedInitExpr; |
||
5124 | |||
5125 | public: |
||
5126 | Designator() {} |
||
5127 | |||
5128 | /// Initializes a field designator. |
||
5129 | Designator(const IdentifierInfo *FieldName, SourceLocation DotLoc, |
||
5130 | SourceLocation FieldLoc) |
||
5131 | : Kind(FieldDesignator) { |
||
5132 | new (&Field) DesignatedInitExpr::FieldDesignator; |
||
5133 | Field.NameOrField = reinterpret_cast<uintptr_t>(FieldName) | 0x01; |
||
5134 | Field.DotLoc = DotLoc; |
||
5135 | Field.FieldLoc = FieldLoc; |
||
5136 | } |
||
5137 | |||
5138 | /// Initializes an array designator. |
||
5139 | Designator(unsigned Index, SourceLocation LBracketLoc, |
||
5140 | SourceLocation RBracketLoc) |
||
5141 | : Kind(ArrayDesignator) { |
||
5142 | new (&ArrayOrRange) DesignatedInitExpr::ArrayOrRangeDesignator; |
||
5143 | ArrayOrRange.Index = Index; |
||
5144 | ArrayOrRange.LBracketLoc = LBracketLoc; |
||
5145 | ArrayOrRange.EllipsisLoc = SourceLocation(); |
||
5146 | ArrayOrRange.RBracketLoc = RBracketLoc; |
||
5147 | } |
||
5148 | |||
5149 | /// Initializes a GNU array-range designator. |
||
5150 | Designator(unsigned Index, SourceLocation LBracketLoc, |
||
5151 | SourceLocation EllipsisLoc, SourceLocation RBracketLoc) |
||
5152 | : Kind(ArrayRangeDesignator) { |
||
5153 | new (&ArrayOrRange) DesignatedInitExpr::ArrayOrRangeDesignator; |
||
5154 | ArrayOrRange.Index = Index; |
||
5155 | ArrayOrRange.LBracketLoc = LBracketLoc; |
||
5156 | ArrayOrRange.EllipsisLoc = EllipsisLoc; |
||
5157 | ArrayOrRange.RBracketLoc = RBracketLoc; |
||
5158 | } |
||
5159 | |||
5160 | bool isFieldDesignator() const { return Kind == FieldDesignator; } |
||
5161 | bool isArrayDesignator() const { return Kind == ArrayDesignator; } |
||
5162 | bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; } |
||
5163 | |||
5164 | IdentifierInfo *getFieldName() const; |
||
5165 | |||
5166 | FieldDecl *getField() const { |
||
5167 | assert(Kind == FieldDesignator && "Only valid on a field designator"); |
||
5168 | if (Field.NameOrField & 0x01) |
||
5169 | return nullptr; |
||
5170 | else |
||
5171 | return reinterpret_cast<FieldDecl *>(Field.NameOrField); |
||
5172 | } |
||
5173 | |||
5174 | void setField(FieldDecl *FD) { |
||
5175 | assert(Kind == FieldDesignator && "Only valid on a field designator"); |
||
5176 | Field.NameOrField = reinterpret_cast<uintptr_t>(FD); |
||
5177 | } |
||
5178 | |||
5179 | SourceLocation getDotLoc() const { |
||
5180 | assert(Kind == FieldDesignator && "Only valid on a field designator"); |
||
5181 | return Field.DotLoc; |
||
5182 | } |
||
5183 | |||
5184 | SourceLocation getFieldLoc() const { |
||
5185 | assert(Kind == FieldDesignator && "Only valid on a field designator"); |
||
5186 | return Field.FieldLoc; |
||
5187 | } |
||
5188 | |||
5189 | SourceLocation getLBracketLoc() const { |
||
5190 | assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && |
||
5191 | "Only valid on an array or array-range designator"); |
||
5192 | return ArrayOrRange.LBracketLoc; |
||
5193 | } |
||
5194 | |||
5195 | SourceLocation getRBracketLoc() const { |
||
5196 | assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && |
||
5197 | "Only valid on an array or array-range designator"); |
||
5198 | return ArrayOrRange.RBracketLoc; |
||
5199 | } |
||
5200 | |||
5201 | SourceLocation getEllipsisLoc() const { |
||
5202 | assert(Kind == ArrayRangeDesignator && |
||
5203 | "Only valid on an array-range designator"); |
||
5204 | return ArrayOrRange.EllipsisLoc; |
||
5205 | } |
||
5206 | |||
5207 | unsigned getFirstExprIndex() const { |
||
5208 | assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && |
||
5209 | "Only valid on an array or array-range designator"); |
||
5210 | return ArrayOrRange.Index; |
||
5211 | } |
||
5212 | |||
5213 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
5214 | if (Kind == FieldDesignator) |
||
5215 | return getDotLoc().isInvalid()? getFieldLoc() : getDotLoc(); |
||
5216 | else |
||
5217 | return getLBracketLoc(); |
||
5218 | } |
||
5219 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
5220 | return Kind == FieldDesignator ? getFieldLoc() : getRBracketLoc(); |
||
5221 | } |
||
5222 | SourceRange getSourceRange() const LLVM_READONLY { |
||
5223 | return SourceRange(getBeginLoc(), getEndLoc()); |
||
5224 | } |
||
5225 | }; |
||
5226 | |||
5227 | static DesignatedInitExpr *Create(const ASTContext &C, |
||
5228 | llvm::ArrayRef<Designator> Designators, |
||
5229 | ArrayRef<Expr*> IndexExprs, |
||
5230 | SourceLocation EqualOrColonLoc, |
||
5231 | bool GNUSyntax, Expr *Init); |
||
5232 | |||
5233 | static DesignatedInitExpr *CreateEmpty(const ASTContext &C, |
||
5234 | unsigned NumIndexExprs); |
||
5235 | |||
5236 | /// Returns the number of designators in this initializer. |
||
5237 | unsigned size() const { return NumDesignators; } |
||
5238 | |||
5239 | // Iterator access to the designators. |
||
5240 | llvm::MutableArrayRef<Designator> designators() { |
||
5241 | return {Designators, NumDesignators}; |
||
5242 | } |
||
5243 | |||
5244 | llvm::ArrayRef<Designator> designators() const { |
||
5245 | return {Designators, NumDesignators}; |
||
5246 | } |
||
5247 | |||
5248 | Designator *getDesignator(unsigned Idx) { return &designators()[Idx]; } |
||
5249 | const Designator *getDesignator(unsigned Idx) const { |
||
5250 | return &designators()[Idx]; |
||
5251 | } |
||
5252 | |||
5253 | void setDesignators(const ASTContext &C, const Designator *Desigs, |
||
5254 | unsigned NumDesigs); |
||
5255 | |||
5256 | Expr *getArrayIndex(const Designator &D) const; |
||
5257 | Expr *getArrayRangeStart(const Designator &D) const; |
||
5258 | Expr *getArrayRangeEnd(const Designator &D) const; |
||
5259 | |||
5260 | /// Retrieve the location of the '=' that precedes the |
||
5261 | /// initializer value itself, if present. |
||
5262 | SourceLocation getEqualOrColonLoc() const { return EqualOrColonLoc; } |
||
5263 | void setEqualOrColonLoc(SourceLocation L) { EqualOrColonLoc = L; } |
||
5264 | |||
5265 | /// Whether this designated initializer should result in direct-initialization |
||
5266 | /// of the designated subobject (eg, '{.foo{1, 2, 3}}'). |
||
5267 | bool isDirectInit() const { return EqualOrColonLoc.isInvalid(); } |
||
5268 | |||
5269 | /// Determines whether this designated initializer used the |
||
5270 | /// deprecated GNU syntax for designated initializers. |
||
5271 | bool usesGNUSyntax() const { return GNUSyntax; } |
||
5272 | void setGNUSyntax(bool GNU) { GNUSyntax = GNU; } |
||
5273 | |||
5274 | /// Retrieve the initializer value. |
||
5275 | Expr *getInit() const { |
||
5276 | return cast<Expr>(*const_cast<DesignatedInitExpr*>(this)->child_begin()); |
||
5277 | } |
||
5278 | |||
5279 | void setInit(Expr *init) { |
||
5280 | *child_begin() = init; |
||
5281 | } |
||
5282 | |||
5283 | /// Retrieve the total number of subexpressions in this |
||
5284 | /// designated initializer expression, including the actual |
||
5285 | /// initialized value and any expressions that occur within array |
||
5286 | /// and array-range designators. |
||
5287 | unsigned getNumSubExprs() const { return NumSubExprs; } |
||
5288 | |||
5289 | Expr *getSubExpr(unsigned Idx) const { |
||
5290 | assert(Idx < NumSubExprs && "Subscript out of range"); |
||
5291 | return cast<Expr>(getTrailingObjects<Stmt *>()[Idx]); |
||
5292 | } |
||
5293 | |||
5294 | void setSubExpr(unsigned Idx, Expr *E) { |
||
5295 | assert(Idx < NumSubExprs && "Subscript out of range"); |
||
5296 | getTrailingObjects<Stmt *>()[Idx] = E; |
||
5297 | } |
||
5298 | |||
5299 | /// Replaces the designator at index @p Idx with the series |
||
5300 | /// of designators in [First, Last). |
||
5301 | void ExpandDesignator(const ASTContext &C, unsigned Idx, |
||
5302 | const Designator *First, const Designator *Last); |
||
5303 | |||
5304 | SourceRange getDesignatorsSourceRange() const; |
||
5305 | |||
5306 | SourceLocation getBeginLoc() const LLVM_READONLY; |
||
5307 | SourceLocation getEndLoc() const LLVM_READONLY; |
||
5308 | |||
5309 | static bool classof(const Stmt *T) { |
||
5310 | return T->getStmtClass() == DesignatedInitExprClass; |
||
5311 | } |
||
5312 | |||
5313 | // Iterators |
||
5314 | child_range children() { |
||
5315 | Stmt **begin = getTrailingObjects<Stmt *>(); |
||
5316 | return child_range(begin, begin + NumSubExprs); |
||
5317 | } |
||
5318 | const_child_range children() const { |
||
5319 | Stmt * const *begin = getTrailingObjects<Stmt *>(); |
||
5320 | return const_child_range(begin, begin + NumSubExprs); |
||
5321 | } |
||
5322 | |||
5323 | friend TrailingObjects; |
||
5324 | }; |
||
5325 | |||
5326 | /// Represents a place-holder for an object not to be initialized by |
||
5327 | /// anything. |
||
5328 | /// |
||
5329 | /// This only makes sense when it appears as part of an updater of a |
||
5330 | /// DesignatedInitUpdateExpr (see below). The base expression of a DIUE |
||
5331 | /// initializes a big object, and the NoInitExpr's mark the spots within the |
||
5332 | /// big object not to be overwritten by the updater. |
||
5333 | /// |
||
5334 | /// \see DesignatedInitUpdateExpr |
||
5335 | class NoInitExpr : public Expr { |
||
5336 | public: |
||
5337 | explicit NoInitExpr(QualType ty) |
||
5338 | : Expr(NoInitExprClass, ty, VK_PRValue, OK_Ordinary) { |
||
5339 | setDependence(computeDependence(this)); |
||
5340 | } |
||
5341 | |||
5342 | explicit NoInitExpr(EmptyShell Empty) |
||
5343 | : Expr(NoInitExprClass, Empty) { } |
||
5344 | |||
5345 | static bool classof(const Stmt *T) { |
||
5346 | return T->getStmtClass() == NoInitExprClass; |
||
5347 | } |
||
5348 | |||
5349 | SourceLocation getBeginLoc() const LLVM_READONLY { return SourceLocation(); } |
||
5350 | SourceLocation getEndLoc() const LLVM_READONLY { return SourceLocation(); } |
||
5351 | |||
5352 | // Iterators |
||
5353 | child_range children() { |
||
5354 | return child_range(child_iterator(), child_iterator()); |
||
5355 | } |
||
5356 | const_child_range children() const { |
||
5357 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
5358 | } |
||
5359 | }; |
||
5360 | |||
5361 | // In cases like: |
||
5362 | // struct Q { int a, b, c; }; |
||
5363 | // Q *getQ(); |
||
5364 | // void foo() { |
||
5365 | // struct A { Q q; } a = { *getQ(), .q.b = 3 }; |
||
5366 | // } |
||
5367 | // |
||
5368 | // We will have an InitListExpr for a, with type A, and then a |
||
5369 | // DesignatedInitUpdateExpr for "a.q" with type Q. The "base" for this DIUE |
||
5370 | // is the call expression *getQ(); the "updater" for the DIUE is ".q.b = 3" |
||
5371 | // |
||
5372 | class DesignatedInitUpdateExpr : public Expr { |
||
5373 | // BaseAndUpdaterExprs[0] is the base expression; |
||
5374 | // BaseAndUpdaterExprs[1] is an InitListExpr overwriting part of the base. |
||
5375 | Stmt *BaseAndUpdaterExprs[2]; |
||
5376 | |||
5377 | public: |
||
5378 | DesignatedInitUpdateExpr(const ASTContext &C, SourceLocation lBraceLoc, |
||
5379 | Expr *baseExprs, SourceLocation rBraceLoc); |
||
5380 | |||
5381 | explicit DesignatedInitUpdateExpr(EmptyShell Empty) |
||
5382 | : Expr(DesignatedInitUpdateExprClass, Empty) { } |
||
5383 | |||
5384 | SourceLocation getBeginLoc() const LLVM_READONLY; |
||
5385 | SourceLocation getEndLoc() const LLVM_READONLY; |
||
5386 | |||
5387 | static bool classof(const Stmt *T) { |
||
5388 | return T->getStmtClass() == DesignatedInitUpdateExprClass; |
||
5389 | } |
||
5390 | |||
5391 | Expr *getBase() const { return cast<Expr>(BaseAndUpdaterExprs[0]); } |
||
5392 | void setBase(Expr *Base) { BaseAndUpdaterExprs[0] = Base; } |
||
5393 | |||
5394 | InitListExpr *getUpdater() const { |
||
5395 | return cast<InitListExpr>(BaseAndUpdaterExprs[1]); |
||
5396 | } |
||
5397 | void setUpdater(Expr *Updater) { BaseAndUpdaterExprs[1] = Updater; } |
||
5398 | |||
5399 | // Iterators |
||
5400 | // children = the base and the updater |
||
5401 | child_range children() { |
||
5402 | return child_range(&BaseAndUpdaterExprs[0], &BaseAndUpdaterExprs[0] + 2); |
||
5403 | } |
||
5404 | const_child_range children() const { |
||
5405 | return const_child_range(&BaseAndUpdaterExprs[0], |
||
5406 | &BaseAndUpdaterExprs[0] + 2); |
||
5407 | } |
||
5408 | }; |
||
5409 | |||
5410 | /// Represents a loop initializing the elements of an array. |
||
5411 | /// |
||
5412 | /// The need to initialize the elements of an array occurs in a number of |
||
5413 | /// contexts: |
||
5414 | /// |
||
5415 | /// * in the implicit copy/move constructor for a class with an array member |
||
5416 | /// * when a lambda-expression captures an array by value |
||
5417 | /// * when a decomposition declaration decomposes an array |
||
5418 | /// |
||
5419 | /// There are two subexpressions: a common expression (the source array) |
||
5420 | /// that is evaluated once up-front, and a per-element initializer that |
||
5421 | /// runs once for each array element. |
||
5422 | /// |
||
5423 | /// Within the per-element initializer, the common expression may be referenced |
||
5424 | /// via an OpaqueValueExpr, and the current index may be obtained via an |
||
5425 | /// ArrayInitIndexExpr. |
||
5426 | class ArrayInitLoopExpr : public Expr { |
||
5427 | Stmt *SubExprs[2]; |
||
5428 | |||
5429 | explicit ArrayInitLoopExpr(EmptyShell Empty) |
||
5430 | : Expr(ArrayInitLoopExprClass, Empty), SubExprs{} {} |
||
5431 | |||
5432 | public: |
||
5433 | explicit ArrayInitLoopExpr(QualType T, Expr *CommonInit, Expr *ElementInit) |
||
5434 | : Expr(ArrayInitLoopExprClass, T, VK_PRValue, OK_Ordinary), |
||
5435 | SubExprs{CommonInit, ElementInit} { |
||
5436 | setDependence(computeDependence(this)); |
||
5437 | } |
||
5438 | |||
5439 | /// Get the common subexpression shared by all initializations (the source |
||
5440 | /// array). |
||
5441 | OpaqueValueExpr *getCommonExpr() const { |
||
5442 | return cast<OpaqueValueExpr>(SubExprs[0]); |
||
5443 | } |
||
5444 | |||
5445 | /// Get the initializer to use for each array element. |
||
5446 | Expr *getSubExpr() const { return cast<Expr>(SubExprs[1]); } |
||
5447 | |||
5448 | llvm::APInt getArraySize() const { |
||
5449 | return cast<ConstantArrayType>(getType()->castAsArrayTypeUnsafe()) |
||
5450 | ->getSize(); |
||
5451 | } |
||
5452 | |||
5453 | static bool classof(const Stmt *S) { |
||
5454 | return S->getStmtClass() == ArrayInitLoopExprClass; |
||
5455 | } |
||
5456 | |||
5457 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
5458 | return getCommonExpr()->getBeginLoc(); |
||
5459 | } |
||
5460 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
5461 | return getCommonExpr()->getEndLoc(); |
||
5462 | } |
||
5463 | |||
5464 | child_range children() { |
||
5465 | return child_range(SubExprs, SubExprs + 2); |
||
5466 | } |
||
5467 | const_child_range children() const { |
||
5468 | return const_child_range(SubExprs, SubExprs + 2); |
||
5469 | } |
||
5470 | |||
5471 | friend class ASTReader; |
||
5472 | friend class ASTStmtReader; |
||
5473 | friend class ASTStmtWriter; |
||
5474 | }; |
||
5475 | |||
5476 | /// Represents the index of the current element of an array being |
||
5477 | /// initialized by an ArrayInitLoopExpr. This can only appear within the |
||
5478 | /// subexpression of an ArrayInitLoopExpr. |
||
5479 | class ArrayInitIndexExpr : public Expr { |
||
5480 | explicit ArrayInitIndexExpr(EmptyShell Empty) |
||
5481 | : Expr(ArrayInitIndexExprClass, Empty) {} |
||
5482 | |||
5483 | public: |
||
5484 | explicit ArrayInitIndexExpr(QualType T) |
||
5485 | : Expr(ArrayInitIndexExprClass, T, VK_PRValue, OK_Ordinary) { |
||
5486 | setDependence(ExprDependence::None); |
||
5487 | } |
||
5488 | |||
5489 | static bool classof(const Stmt *S) { |
||
5490 | return S->getStmtClass() == ArrayInitIndexExprClass; |
||
5491 | } |
||
5492 | |||
5493 | SourceLocation getBeginLoc() const LLVM_READONLY { return SourceLocation(); } |
||
5494 | SourceLocation getEndLoc() const LLVM_READONLY { return SourceLocation(); } |
||
5495 | |||
5496 | child_range children() { |
||
5497 | return child_range(child_iterator(), child_iterator()); |
||
5498 | } |
||
5499 | const_child_range children() const { |
||
5500 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
5501 | } |
||
5502 | |||
5503 | friend class ASTReader; |
||
5504 | friend class ASTStmtReader; |
||
5505 | }; |
||
5506 | |||
5507 | /// Represents an implicitly-generated value initialization of |
||
5508 | /// an object of a given type. |
||
5509 | /// |
||
5510 | /// Implicit value initializations occur within semantic initializer |
||
5511 | /// list expressions (InitListExpr) as placeholders for subobject |
||
5512 | /// initializations not explicitly specified by the user. |
||
5513 | /// |
||
5514 | /// \see InitListExpr |
||
5515 | class ImplicitValueInitExpr : public Expr { |
||
5516 | public: |
||
5517 | explicit ImplicitValueInitExpr(QualType ty) |
||
5518 | : Expr(ImplicitValueInitExprClass, ty, VK_PRValue, OK_Ordinary) { |
||
5519 | setDependence(computeDependence(this)); |
||
5520 | } |
||
5521 | |||
5522 | /// Construct an empty implicit value initialization. |
||
5523 | explicit ImplicitValueInitExpr(EmptyShell Empty) |
||
5524 | : Expr(ImplicitValueInitExprClass, Empty) { } |
||
5525 | |||
5526 | static bool classof(const Stmt *T) { |
||
5527 | return T->getStmtClass() == ImplicitValueInitExprClass; |
||
5528 | } |
||
5529 | |||
5530 | SourceLocation getBeginLoc() const LLVM_READONLY { return SourceLocation(); } |
||
5531 | SourceLocation getEndLoc() const LLVM_READONLY { return SourceLocation(); } |
||
5532 | |||
5533 | // Iterators |
||
5534 | child_range children() { |
||
5535 | return child_range(child_iterator(), child_iterator()); |
||
5536 | } |
||
5537 | const_child_range children() const { |
||
5538 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
5539 | } |
||
5540 | }; |
||
5541 | |||
5542 | class ParenListExpr final |
||
5543 | : public Expr, |
||
5544 | private llvm::TrailingObjects<ParenListExpr, Stmt *> { |
||
5545 | friend class ASTStmtReader; |
||
5546 | friend TrailingObjects; |
||
5547 | |||
5548 | /// The location of the left and right parentheses. |
||
5549 | SourceLocation LParenLoc, RParenLoc; |
||
5550 | |||
5551 | /// Build a paren list. |
||
5552 | ParenListExpr(SourceLocation LParenLoc, ArrayRef<Expr *> Exprs, |
||
5553 | SourceLocation RParenLoc); |
||
5554 | |||
5555 | /// Build an empty paren list. |
||
5556 | ParenListExpr(EmptyShell Empty, unsigned NumExprs); |
||
5557 | |||
5558 | public: |
||
5559 | /// Create a paren list. |
||
5560 | static ParenListExpr *Create(const ASTContext &Ctx, SourceLocation LParenLoc, |
||
5561 | ArrayRef<Expr *> Exprs, |
||
5562 | SourceLocation RParenLoc); |
||
5563 | |||
5564 | /// Create an empty paren list. |
||
5565 | static ParenListExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumExprs); |
||
5566 | |||
5567 | /// Return the number of expressions in this paren list. |
||
5568 | unsigned getNumExprs() const { return ParenListExprBits.NumExprs; } |
||
5569 | |||
5570 | Expr *getExpr(unsigned Init) { |
||
5571 | assert(Init < getNumExprs() && "Initializer access out of range!"); |
||
5572 | return getExprs()[Init]; |
||
5573 | } |
||
5574 | |||
5575 | const Expr *getExpr(unsigned Init) const { |
||
5576 | return const_cast<ParenListExpr *>(this)->getExpr(Init); |
||
5577 | } |
||
5578 | |||
5579 | Expr **getExprs() { |
||
5580 | return reinterpret_cast<Expr **>(getTrailingObjects<Stmt *>()); |
||
5581 | } |
||
5582 | |||
5583 | ArrayRef<Expr *> exprs() { return llvm::ArrayRef(getExprs(), getNumExprs()); } |
||
5584 | |||
5585 | SourceLocation getLParenLoc() const { return LParenLoc; } |
||
5586 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
5587 | SourceLocation getBeginLoc() const { return getLParenLoc(); } |
||
5588 | SourceLocation getEndLoc() const { return getRParenLoc(); } |
||
5589 | |||
5590 | static bool classof(const Stmt *T) { |
||
5591 | return T->getStmtClass() == ParenListExprClass; |
||
5592 | } |
||
5593 | |||
5594 | // Iterators |
||
5595 | child_range children() { |
||
5596 | return child_range(getTrailingObjects<Stmt *>(), |
||
5597 | getTrailingObjects<Stmt *>() + getNumExprs()); |
||
5598 | } |
||
5599 | const_child_range children() const { |
||
5600 | return const_child_range(getTrailingObjects<Stmt *>(), |
||
5601 | getTrailingObjects<Stmt *>() + getNumExprs()); |
||
5602 | } |
||
5603 | }; |
||
5604 | |||
5605 | /// Represents a C11 generic selection. |
||
5606 | /// |
||
5607 | /// A generic selection (C11 6.5.1.1) contains an unevaluated controlling |
||
5608 | /// expression, followed by one or more generic associations. Each generic |
||
5609 | /// association specifies a type name and an expression, or "default" and an |
||
5610 | /// expression (in which case it is known as a default generic association). |
||
5611 | /// The type and value of the generic selection are identical to those of its |
||
5612 | /// result expression, which is defined as the expression in the generic |
||
5613 | /// association with a type name that is compatible with the type of the |
||
5614 | /// controlling expression, or the expression in the default generic association |
||
5615 | /// if no types are compatible. For example: |
||
5616 | /// |
||
5617 | /// @code |
||
5618 | /// _Generic(X, double: 1, float: 2, default: 3) |
||
5619 | /// @endcode |
||
5620 | /// |
||
5621 | /// The above expression evaluates to 1 if 1.0 is substituted for X, 2 if 1.0f |
||
5622 | /// or 3 if "hello". |
||
5623 | /// |
||
5624 | /// As an extension, generic selections are allowed in C++, where the following |
||
5625 | /// additional semantics apply: |
||
5626 | /// |
||
5627 | /// Any generic selection whose controlling expression is type-dependent or |
||
5628 | /// which names a dependent type in its association list is result-dependent, |
||
5629 | /// which means that the choice of result expression is dependent. |
||
5630 | /// Result-dependent generic associations are both type- and value-dependent. |
||
5631 | class GenericSelectionExpr final |
||
5632 | : public Expr, |
||
5633 | private llvm::TrailingObjects<GenericSelectionExpr, Stmt *, |
||
5634 | TypeSourceInfo *> { |
||
5635 | friend class ASTStmtReader; |
||
5636 | friend class ASTStmtWriter; |
||
5637 | friend TrailingObjects; |
||
5638 | |||
5639 | /// The number of association expressions and the index of the result |
||
5640 | /// expression in the case where the generic selection expression is not |
||
5641 | /// result-dependent. The result index is equal to ResultDependentIndex |
||
5642 | /// if and only if the generic selection expression is result-dependent. |
||
5643 | unsigned NumAssocs, ResultIndex; |
||
5644 | enum : unsigned { |
||
5645 | ResultDependentIndex = std::numeric_limits<unsigned>::max(), |
||
5646 | ControllingIndex = 0, |
||
5647 | AssocExprStartIndex = 1 |
||
5648 | }; |
||
5649 | |||
5650 | /// The location of the "default" and of the right parenthesis. |
||
5651 | SourceLocation DefaultLoc, RParenLoc; |
||
5652 | |||
5653 | // GenericSelectionExpr is followed by several trailing objects. |
||
5654 | // They are (in order): |
||
5655 | // |
||
5656 | // * A single Stmt * for the controlling expression. |
||
5657 | // * An array of getNumAssocs() Stmt * for the association expressions. |
||
5658 | // * An array of getNumAssocs() TypeSourceInfo *, one for each of the |
||
5659 | // association expressions. |
||
5660 | unsigned numTrailingObjects(OverloadToken<Stmt *>) const { |
||
5661 | // Add one to account for the controlling expression; the remainder |
||
5662 | // are the associated expressions. |
||
5663 | return 1 + getNumAssocs(); |
||
5664 | } |
||
5665 | |||
5666 | unsigned numTrailingObjects(OverloadToken<TypeSourceInfo *>) const { |
||
5667 | return getNumAssocs(); |
||
5668 | } |
||
5669 | |||
5670 | template <bool Const> class AssociationIteratorTy; |
||
5671 | /// Bundle together an association expression and its TypeSourceInfo. |
||
5672 | /// The Const template parameter is for the const and non-const versions |
||
5673 | /// of AssociationTy. |
||
5674 | template <bool Const> class AssociationTy { |
||
5675 | friend class GenericSelectionExpr; |
||
5676 | template <bool OtherConst> friend class AssociationIteratorTy; |
||
5677 | using ExprPtrTy = std::conditional_t<Const, const Expr *, Expr *>; |
||
5678 | using TSIPtrTy = |
||
5679 | std::conditional_t<Const, const TypeSourceInfo *, TypeSourceInfo *>; |
||
5680 | ExprPtrTy E; |
||
5681 | TSIPtrTy TSI; |
||
5682 | bool Selected; |
||
5683 | AssociationTy(ExprPtrTy E, TSIPtrTy TSI, bool Selected) |
||
5684 | : E(E), TSI(TSI), Selected(Selected) {} |
||
5685 | |||
5686 | public: |
||
5687 | ExprPtrTy getAssociationExpr() const { return E; } |
||
5688 | TSIPtrTy getTypeSourceInfo() const { return TSI; } |
||
5689 | QualType getType() const { return TSI ? TSI->getType() : QualType(); } |
||
5690 | bool isSelected() const { return Selected; } |
||
5691 | AssociationTy *operator->() { return this; } |
||
5692 | const AssociationTy *operator->() const { return this; } |
||
5693 | }; // class AssociationTy |
||
5694 | |||
5695 | /// Iterator over const and non-const Association objects. The Association |
||
5696 | /// objects are created on the fly when the iterator is dereferenced. |
||
5697 | /// This abstract over how exactly the association expressions and the |
||
5698 | /// corresponding TypeSourceInfo * are stored. |
||
5699 | template <bool Const> |
||
5700 | class AssociationIteratorTy |
||
5701 | : public llvm::iterator_facade_base< |
||
5702 | AssociationIteratorTy<Const>, std::input_iterator_tag, |
||
5703 | AssociationTy<Const>, std::ptrdiff_t, AssociationTy<Const>, |
||
5704 | AssociationTy<Const>> { |
||
5705 | friend class GenericSelectionExpr; |
||
5706 | // FIXME: This iterator could conceptually be a random access iterator, and |
||
5707 | // it would be nice if we could strengthen the iterator category someday. |
||
5708 | // However this iterator does not satisfy two requirements of forward |
||
5709 | // iterators: |
||
5710 | // a) reference = T& or reference = const T& |
||
5711 | // b) If It1 and It2 are both dereferenceable, then It1 == It2 if and only |
||
5712 | // if *It1 and *It2 are bound to the same objects. |
||
5713 | // An alternative design approach was discussed during review; |
||
5714 | // store an Association object inside the iterator, and return a reference |
||
5715 | // to it when dereferenced. This idea was discarded beacuse of nasty |
||
5716 | // lifetime issues: |
||
5717 | // AssociationIterator It = ...; |
||
5718 | // const Association &Assoc = *It++; // Oops, Assoc is dangling. |
||
5719 | using BaseTy = typename AssociationIteratorTy::iterator_facade_base; |
||
5720 | using StmtPtrPtrTy = |
||
5721 | std::conditional_t<Const, const Stmt *const *, Stmt **>; |
||
5722 | using TSIPtrPtrTy = std::conditional_t<Const, const TypeSourceInfo *const *, |
||
5723 | TypeSourceInfo **>; |
||
5724 | StmtPtrPtrTy E; // = nullptr; FIXME: Once support for gcc 4.8 is dropped. |
||
5725 | TSIPtrPtrTy TSI; // Kept in sync with E. |
||
5726 | unsigned Offset = 0, SelectedOffset = 0; |
||
5727 | AssociationIteratorTy(StmtPtrPtrTy E, TSIPtrPtrTy TSI, unsigned Offset, |
||
5728 | unsigned SelectedOffset) |
||
5729 | : E(E), TSI(TSI), Offset(Offset), SelectedOffset(SelectedOffset) {} |
||
5730 | |||
5731 | public: |
||
5732 | AssociationIteratorTy() : E(nullptr), TSI(nullptr) {} |
||
5733 | typename BaseTy::reference operator*() const { |
||
5734 | return AssociationTy<Const>(cast<Expr>(*E), *TSI, |
||
5735 | Offset == SelectedOffset); |
||
5736 | } |
||
5737 | typename BaseTy::pointer operator->() const { return **this; } |
||
5738 | using BaseTy::operator++; |
||
5739 | AssociationIteratorTy &operator++() { |
||
5740 | ++E; |
||
5741 | ++TSI; |
||
5742 | ++Offset; |
||
5743 | return *this; |
||
5744 | } |
||
5745 | bool operator==(AssociationIteratorTy Other) const { return E == Other.E; } |
||
5746 | }; // class AssociationIterator |
||
5747 | |||
5748 | /// Build a non-result-dependent generic selection expression. |
||
5749 | GenericSelectionExpr(const ASTContext &Context, SourceLocation GenericLoc, |
||
5750 | Expr *ControllingExpr, |
||
5751 | ArrayRef<TypeSourceInfo *> AssocTypes, |
||
5752 | ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, |
||
5753 | SourceLocation RParenLoc, |
||
5754 | bool ContainsUnexpandedParameterPack, |
||
5755 | unsigned ResultIndex); |
||
5756 | |||
5757 | /// Build a result-dependent generic selection expression. |
||
5758 | GenericSelectionExpr(const ASTContext &Context, SourceLocation GenericLoc, |
||
5759 | Expr *ControllingExpr, |
||
5760 | ArrayRef<TypeSourceInfo *> AssocTypes, |
||
5761 | ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, |
||
5762 | SourceLocation RParenLoc, |
||
5763 | bool ContainsUnexpandedParameterPack); |
||
5764 | |||
5765 | /// Build an empty generic selection expression for deserialization. |
||
5766 | explicit GenericSelectionExpr(EmptyShell Empty, unsigned NumAssocs); |
||
5767 | |||
5768 | public: |
||
5769 | /// Create a non-result-dependent generic selection expression. |
||
5770 | static GenericSelectionExpr * |
||
5771 | Create(const ASTContext &Context, SourceLocation GenericLoc, |
||
5772 | Expr *ControllingExpr, ArrayRef<TypeSourceInfo *> AssocTypes, |
||
5773 | ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, |
||
5774 | SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, |
||
5775 | unsigned ResultIndex); |
||
5776 | |||
5777 | /// Create a result-dependent generic selection expression. |
||
5778 | static GenericSelectionExpr * |
||
5779 | Create(const ASTContext &Context, SourceLocation GenericLoc, |
||
5780 | Expr *ControllingExpr, ArrayRef<TypeSourceInfo *> AssocTypes, |
||
5781 | ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, |
||
5782 | SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack); |
||
5783 | |||
5784 | /// Create an empty generic selection expression for deserialization. |
||
5785 | static GenericSelectionExpr *CreateEmpty(const ASTContext &Context, |
||
5786 | unsigned NumAssocs); |
||
5787 | |||
5788 | using Association = AssociationTy<false>; |
||
5789 | using ConstAssociation = AssociationTy<true>; |
||
5790 | using AssociationIterator = AssociationIteratorTy<false>; |
||
5791 | using ConstAssociationIterator = AssociationIteratorTy<true>; |
||
5792 | using association_range = llvm::iterator_range<AssociationIterator>; |
||
5793 | using const_association_range = |
||
5794 | llvm::iterator_range<ConstAssociationIterator>; |
||
5795 | |||
5796 | /// The number of association expressions. |
||
5797 | unsigned getNumAssocs() const { return NumAssocs; } |
||
5798 | |||
5799 | /// The zero-based index of the result expression's generic association in |
||
5800 | /// the generic selection's association list. Defined only if the |
||
5801 | /// generic selection is not result-dependent. |
||
5802 | unsigned getResultIndex() const { |
||
5803 | assert(!isResultDependent() && |
||
5804 | "Generic selection is result-dependent but getResultIndex called!"); |
||
5805 | return ResultIndex; |
||
5806 | } |
||
5807 | |||
5808 | /// Whether this generic selection is result-dependent. |
||
5809 | bool isResultDependent() const { return ResultIndex == ResultDependentIndex; } |
||
5810 | |||
5811 | /// Return the controlling expression of this generic selection expression. |
||
5812 | Expr *getControllingExpr() { |
||
5813 | return cast<Expr>(getTrailingObjects<Stmt *>()[ControllingIndex]); |
||
5814 | } |
||
5815 | const Expr *getControllingExpr() const { |
||
5816 | return cast<Expr>(getTrailingObjects<Stmt *>()[ControllingIndex]); |
||
5817 | } |
||
5818 | |||
5819 | /// Return the result expression of this controlling expression. Defined if |
||
5820 | /// and only if the generic selection expression is not result-dependent. |
||
5821 | Expr *getResultExpr() { |
||
5822 | return cast<Expr>( |
||
5823 | getTrailingObjects<Stmt *>()[AssocExprStartIndex + getResultIndex()]); |
||
5824 | } |
||
5825 | const Expr *getResultExpr() const { |
||
5826 | return cast<Expr>( |
||
5827 | getTrailingObjects<Stmt *>()[AssocExprStartIndex + getResultIndex()]); |
||
5828 | } |
||
5829 | |||
5830 | ArrayRef<Expr *> getAssocExprs() const { |
||
5831 | return {reinterpret_cast<Expr *const *>(getTrailingObjects<Stmt *>() + |
||
5832 | AssocExprStartIndex), |
||
5833 | NumAssocs}; |
||
5834 | } |
||
5835 | ArrayRef<TypeSourceInfo *> getAssocTypeSourceInfos() const { |
||
5836 | return {getTrailingObjects<TypeSourceInfo *>(), NumAssocs}; |
||
5837 | } |
||
5838 | |||
5839 | /// Return the Ith association expression with its TypeSourceInfo, |
||
5840 | /// bundled together in GenericSelectionExpr::(Const)Association. |
||
5841 | Association getAssociation(unsigned I) { |
||
5842 | assert(I < getNumAssocs() && |
||
5843 | "Out-of-range index in GenericSelectionExpr::getAssociation!"); |
||
5844 | return Association( |
||
5845 | cast<Expr>(getTrailingObjects<Stmt *>()[AssocExprStartIndex + I]), |
||
5846 | getTrailingObjects<TypeSourceInfo *>()[I], |
||
5847 | !isResultDependent() && (getResultIndex() == I)); |
||
5848 | } |
||
5849 | ConstAssociation getAssociation(unsigned I) const { |
||
5850 | assert(I < getNumAssocs() && |
||
5851 | "Out-of-range index in GenericSelectionExpr::getAssociation!"); |
||
5852 | return ConstAssociation( |
||
5853 | cast<Expr>(getTrailingObjects<Stmt *>()[AssocExprStartIndex + I]), |
||
5854 | getTrailingObjects<TypeSourceInfo *>()[I], |
||
5855 | !isResultDependent() && (getResultIndex() == I)); |
||
5856 | } |
||
5857 | |||
5858 | association_range associations() { |
||
5859 | AssociationIterator Begin(getTrailingObjects<Stmt *>() + |
||
5860 | AssocExprStartIndex, |
||
5861 | getTrailingObjects<TypeSourceInfo *>(), |
||
5862 | /*Offset=*/0, ResultIndex); |
||
5863 | AssociationIterator End(Begin.E + NumAssocs, Begin.TSI + NumAssocs, |
||
5864 | /*Offset=*/NumAssocs, ResultIndex); |
||
5865 | return llvm::make_range(Begin, End); |
||
5866 | } |
||
5867 | |||
5868 | const_association_range associations() const { |
||
5869 | ConstAssociationIterator Begin(getTrailingObjects<Stmt *>() + |
||
5870 | AssocExprStartIndex, |
||
5871 | getTrailingObjects<TypeSourceInfo *>(), |
||
5872 | /*Offset=*/0, ResultIndex); |
||
5873 | ConstAssociationIterator End(Begin.E + NumAssocs, Begin.TSI + NumAssocs, |
||
5874 | /*Offset=*/NumAssocs, ResultIndex); |
||
5875 | return llvm::make_range(Begin, End); |
||
5876 | } |
||
5877 | |||
5878 | SourceLocation getGenericLoc() const { |
||
5879 | return GenericSelectionExprBits.GenericLoc; |
||
5880 | } |
||
5881 | SourceLocation getDefaultLoc() const { return DefaultLoc; } |
||
5882 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
5883 | SourceLocation getBeginLoc() const { return getGenericLoc(); } |
||
5884 | SourceLocation getEndLoc() const { return getRParenLoc(); } |
||
5885 | |||
5886 | static bool classof(const Stmt *T) { |
||
5887 | return T->getStmtClass() == GenericSelectionExprClass; |
||
5888 | } |
||
5889 | |||
5890 | child_range children() { |
||
5891 | return child_range(getTrailingObjects<Stmt *>(), |
||
5892 | getTrailingObjects<Stmt *>() + |
||
5893 | numTrailingObjects(OverloadToken<Stmt *>())); |
||
5894 | } |
||
5895 | const_child_range children() const { |
||
5896 | return const_child_range(getTrailingObjects<Stmt *>(), |
||
5897 | getTrailingObjects<Stmt *>() + |
||
5898 | numTrailingObjects(OverloadToken<Stmt *>())); |
||
5899 | } |
||
5900 | }; |
||
5901 | |||
5902 | //===----------------------------------------------------------------------===// |
||
5903 | // Clang Extensions |
||
5904 | //===----------------------------------------------------------------------===// |
||
5905 | |||
5906 | /// ExtVectorElementExpr - This represents access to specific elements of a |
||
5907 | /// vector, and may occur on the left hand side or right hand side. For example |
||
5908 | /// the following is legal: "V.xy = V.zw" if V is a 4 element extended vector. |
||
5909 | /// |
||
5910 | /// Note that the base may have either vector or pointer to vector type, just |
||
5911 | /// like a struct field reference. |
||
5912 | /// |
||
5913 | class ExtVectorElementExpr : public Expr { |
||
5914 | Stmt *Base; |
||
5915 | IdentifierInfo *Accessor; |
||
5916 | SourceLocation AccessorLoc; |
||
5917 | public: |
||
5918 | ExtVectorElementExpr(QualType ty, ExprValueKind VK, Expr *base, |
||
5919 | IdentifierInfo &accessor, SourceLocation loc) |
||
5920 | : Expr(ExtVectorElementExprClass, ty, VK, |
||
5921 | (VK == VK_PRValue ? OK_Ordinary : OK_VectorComponent)), |
||
5922 | Base(base), Accessor(&accessor), AccessorLoc(loc) { |
||
5923 | setDependence(computeDependence(this)); |
||
5924 | } |
||
5925 | |||
5926 | /// Build an empty vector element expression. |
||
5927 | explicit ExtVectorElementExpr(EmptyShell Empty) |
||
5928 | : Expr(ExtVectorElementExprClass, Empty) { } |
||
5929 | |||
5930 | const Expr *getBase() const { return cast<Expr>(Base); } |
||
5931 | Expr *getBase() { return cast<Expr>(Base); } |
||
5932 | void setBase(Expr *E) { Base = E; } |
||
5933 | |||
5934 | IdentifierInfo &getAccessor() const { return *Accessor; } |
||
5935 | void setAccessor(IdentifierInfo *II) { Accessor = II; } |
||
5936 | |||
5937 | SourceLocation getAccessorLoc() const { return AccessorLoc; } |
||
5938 | void setAccessorLoc(SourceLocation L) { AccessorLoc = L; } |
||
5939 | |||
5940 | /// getNumElements - Get the number of components being selected. |
||
5941 | unsigned getNumElements() const; |
||
5942 | |||
5943 | /// containsDuplicateElements - Return true if any element access is |
||
5944 | /// repeated. |
||
5945 | bool containsDuplicateElements() const; |
||
5946 | |||
5947 | /// getEncodedElementAccess - Encode the elements accessed into an llvm |
||
5948 | /// aggregate Constant of ConstantInt(s). |
||
5949 | void getEncodedElementAccess(SmallVectorImpl<uint32_t> &Elts) const; |
||
5950 | |||
5951 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
5952 | return getBase()->getBeginLoc(); |
||
5953 | } |
||
5954 | SourceLocation getEndLoc() const LLVM_READONLY { return AccessorLoc; } |
||
5955 | |||
5956 | /// isArrow - Return true if the base expression is a pointer to vector, |
||
5957 | /// return false if the base expression is a vector. |
||
5958 | bool isArrow() const; |
||
5959 | |||
5960 | static bool classof(const Stmt *T) { |
||
5961 | return T->getStmtClass() == ExtVectorElementExprClass; |
||
5962 | } |
||
5963 | |||
5964 | // Iterators |
||
5965 | child_range children() { return child_range(&Base, &Base+1); } |
||
5966 | const_child_range children() const { |
||
5967 | return const_child_range(&Base, &Base + 1); |
||
5968 | } |
||
5969 | }; |
||
5970 | |||
5971 | /// BlockExpr - Adaptor class for mixing a BlockDecl with expressions. |
||
5972 | /// ^{ statement-body } or ^(int arg1, float arg2){ statement-body } |
||
5973 | class BlockExpr : public Expr { |
||
5974 | protected: |
||
5975 | BlockDecl *TheBlock; |
||
5976 | public: |
||
5977 | BlockExpr(BlockDecl *BD, QualType ty) |
||
5978 | : Expr(BlockExprClass, ty, VK_PRValue, OK_Ordinary), TheBlock(BD) { |
||
5979 | setDependence(computeDependence(this)); |
||
5980 | } |
||
5981 | |||
5982 | /// Build an empty block expression. |
||
5983 | explicit BlockExpr(EmptyShell Empty) : Expr(BlockExprClass, Empty) { } |
||
5984 | |||
5985 | const BlockDecl *getBlockDecl() const { return TheBlock; } |
||
5986 | BlockDecl *getBlockDecl() { return TheBlock; } |
||
5987 | void setBlockDecl(BlockDecl *BD) { TheBlock = BD; } |
||
5988 | |||
5989 | // Convenience functions for probing the underlying BlockDecl. |
||
5990 | SourceLocation getCaretLocation() const; |
||
5991 | const Stmt *getBody() const; |
||
5992 | Stmt *getBody(); |
||
5993 | |||
5994 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
5995 | return getCaretLocation(); |
||
5996 | } |
||
5997 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
5998 | return getBody()->getEndLoc(); |
||
5999 | } |
||
6000 | |||
6001 | /// getFunctionType - Return the underlying function type for this block. |
||
6002 | const FunctionProtoType *getFunctionType() const; |
||
6003 | |||
6004 | static bool classof(const Stmt *T) { |
||
6005 | return T->getStmtClass() == BlockExprClass; |
||
6006 | } |
||
6007 | |||
6008 | // Iterators |
||
6009 | child_range children() { |
||
6010 | return child_range(child_iterator(), child_iterator()); |
||
6011 | } |
||
6012 | const_child_range children() const { |
||
6013 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
6014 | } |
||
6015 | }; |
||
6016 | |||
6017 | /// Copy initialization expr of a __block variable and a boolean flag that |
||
6018 | /// indicates whether the expression can throw. |
||
6019 | struct BlockVarCopyInit { |
||
6020 | BlockVarCopyInit() = default; |
||
6021 | BlockVarCopyInit(Expr *CopyExpr, bool CanThrow) |
||
6022 | : ExprAndFlag(CopyExpr, CanThrow) {} |
||
6023 | void setExprAndFlag(Expr *CopyExpr, bool CanThrow) { |
||
6024 | ExprAndFlag.setPointerAndInt(CopyExpr, CanThrow); |
||
6025 | } |
||
6026 | Expr *getCopyExpr() const { return ExprAndFlag.getPointer(); } |
||
6027 | bool canThrow() const { return ExprAndFlag.getInt(); } |
||
6028 | llvm::PointerIntPair<Expr *, 1, bool> ExprAndFlag; |
||
6029 | }; |
||
6030 | |||
6031 | /// AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] |
||
6032 | /// This AST node provides support for reinterpreting a type to another |
||
6033 | /// type of the same size. |
||
6034 | class AsTypeExpr : public Expr { |
||
6035 | private: |
||
6036 | Stmt *SrcExpr; |
||
6037 | SourceLocation BuiltinLoc, RParenLoc; |
||
6038 | |||
6039 | friend class ASTReader; |
||
6040 | friend class ASTStmtReader; |
||
6041 | explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {} |
||
6042 | |||
6043 | public: |
||
6044 | AsTypeExpr(Expr *SrcExpr, QualType DstType, ExprValueKind VK, |
||
6045 | ExprObjectKind OK, SourceLocation BuiltinLoc, |
||
6046 | SourceLocation RParenLoc) |
||
6047 | : Expr(AsTypeExprClass, DstType, VK, OK), SrcExpr(SrcExpr), |
||
6048 | BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) { |
||
6049 | setDependence(computeDependence(this)); |
||
6050 | } |
||
6051 | |||
6052 | /// getSrcExpr - Return the Expr to be converted. |
||
6053 | Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); } |
||
6054 | |||
6055 | /// getBuiltinLoc - Return the location of the __builtin_astype token. |
||
6056 | SourceLocation getBuiltinLoc() const { return BuiltinLoc; } |
||
6057 | |||
6058 | /// getRParenLoc - Return the location of final right parenthesis. |
||
6059 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
6060 | |||
6061 | SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } |
||
6062 | SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } |
||
6063 | |||
6064 | static bool classof(const Stmt *T) { |
||
6065 | return T->getStmtClass() == AsTypeExprClass; |
||
6066 | } |
||
6067 | |||
6068 | // Iterators |
||
6069 | child_range children() { return child_range(&SrcExpr, &SrcExpr+1); } |
||
6070 | const_child_range children() const { |
||
6071 | return const_child_range(&SrcExpr, &SrcExpr + 1); |
||
6072 | } |
||
6073 | }; |
||
6074 | |||
6075 | /// PseudoObjectExpr - An expression which accesses a pseudo-object |
||
6076 | /// l-value. A pseudo-object is an abstract object, accesses to which |
||
6077 | /// are translated to calls. The pseudo-object expression has a |
||
6078 | /// syntactic form, which shows how the expression was actually |
||
6079 | /// written in the source code, and a semantic form, which is a series |
||
6080 | /// of expressions to be executed in order which detail how the |
||
6081 | /// operation is actually evaluated. Optionally, one of the semantic |
||
6082 | /// forms may also provide a result value for the expression. |
||
6083 | /// |
||
6084 | /// If any of the semantic-form expressions is an OpaqueValueExpr, |
||
6085 | /// that OVE is required to have a source expression, and it is bound |
||
6086 | /// to the result of that source expression. Such OVEs may appear |
||
6087 | /// only in subsequent semantic-form expressions and as |
||
6088 | /// sub-expressions of the syntactic form. |
||
6089 | /// |
||
6090 | /// PseudoObjectExpr should be used only when an operation can be |
||
6091 | /// usefully described in terms of fairly simple rewrite rules on |
||
6092 | /// objects and functions that are meant to be used by end-developers. |
||
6093 | /// For example, under the Itanium ABI, dynamic casts are implemented |
||
6094 | /// as a call to a runtime function called __dynamic_cast; using this |
||
6095 | /// class to describe that would be inappropriate because that call is |
||
6096 | /// not really part of the user-visible semantics, and instead the |
||
6097 | /// cast is properly reflected in the AST and IR-generation has been |
||
6098 | /// taught to generate the call as necessary. In contrast, an |
||
6099 | /// Objective-C property access is semantically defined to be |
||
6100 | /// equivalent to a particular message send, and this is very much |
||
6101 | /// part of the user model. The name of this class encourages this |
||
6102 | /// modelling design. |
||
6103 | class PseudoObjectExpr final |
||
6104 | : public Expr, |
||
6105 | private llvm::TrailingObjects<PseudoObjectExpr, Expr *> { |
||
6106 | // PseudoObjectExprBits.NumSubExprs - The number of sub-expressions. |
||
6107 | // Always at least two, because the first sub-expression is the |
||
6108 | // syntactic form. |
||
6109 | |||
6110 | // PseudoObjectExprBits.ResultIndex - The index of the |
||
6111 | // sub-expression holding the result. 0 means the result is void, |
||
6112 | // which is unambiguous because it's the index of the syntactic |
||
6113 | // form. Note that this is therefore 1 higher than the value passed |
||
6114 | // in to Create, which is an index within the semantic forms. |
||
6115 | // Note also that ASTStmtWriter assumes this encoding. |
||
6116 | |||
6117 | Expr **getSubExprsBuffer() { return getTrailingObjects<Expr *>(); } |
||
6118 | const Expr * const *getSubExprsBuffer() const { |
||
6119 | return getTrailingObjects<Expr *>(); |
||
6120 | } |
||
6121 | |||
6122 | PseudoObjectExpr(QualType type, ExprValueKind VK, |
||
6123 | Expr *syntactic, ArrayRef<Expr*> semantic, |
||
6124 | unsigned resultIndex); |
||
6125 | |||
6126 | PseudoObjectExpr(EmptyShell shell, unsigned numSemanticExprs); |
||
6127 | |||
6128 | unsigned getNumSubExprs() const { |
||
6129 | return PseudoObjectExprBits.NumSubExprs; |
||
6130 | } |
||
6131 | |||
6132 | public: |
||
6133 | /// NoResult - A value for the result index indicating that there is |
||
6134 | /// no semantic result. |
||
6135 | enum : unsigned { NoResult = ~0U }; |
||
6136 | |||
6137 | static PseudoObjectExpr *Create(const ASTContext &Context, Expr *syntactic, |
||
6138 | ArrayRef<Expr*> semantic, |
||
6139 | unsigned resultIndex); |
||
6140 | |||
6141 | static PseudoObjectExpr *Create(const ASTContext &Context, EmptyShell shell, |
||
6142 | unsigned numSemanticExprs); |
||
6143 | |||
6144 | /// Return the syntactic form of this expression, i.e. the |
||
6145 | /// expression it actually looks like. Likely to be expressed in |
||
6146 | /// terms of OpaqueValueExprs bound in the semantic form. |
||
6147 | Expr *getSyntacticForm() { return getSubExprsBuffer()[0]; } |
||
6148 | const Expr *getSyntacticForm() const { return getSubExprsBuffer()[0]; } |
||
6149 | |||
6150 | /// Return the index of the result-bearing expression into the semantics |
||
6151 | /// expressions, or PseudoObjectExpr::NoResult if there is none. |
||
6152 | unsigned getResultExprIndex() const { |
||
6153 | if (PseudoObjectExprBits.ResultIndex == 0) return NoResult; |
||
6154 | return PseudoObjectExprBits.ResultIndex - 1; |
||
6155 | } |
||
6156 | |||
6157 | /// Return the result-bearing expression, or null if there is none. |
||
6158 | Expr *getResultExpr() { |
||
6159 | if (PseudoObjectExprBits.ResultIndex == 0) |
||
6160 | return nullptr; |
||
6161 | return getSubExprsBuffer()[PseudoObjectExprBits.ResultIndex]; |
||
6162 | } |
||
6163 | const Expr *getResultExpr() const { |
||
6164 | return const_cast<PseudoObjectExpr*>(this)->getResultExpr(); |
||
6165 | } |
||
6166 | |||
6167 | unsigned getNumSemanticExprs() const { return getNumSubExprs() - 1; } |
||
6168 | |||
6169 | typedef Expr * const *semantics_iterator; |
||
6170 | typedef const Expr * const *const_semantics_iterator; |
||
6171 | semantics_iterator semantics_begin() { |
||
6172 | return getSubExprsBuffer() + 1; |
||
6173 | } |
||
6174 | const_semantics_iterator semantics_begin() const { |
||
6175 | return getSubExprsBuffer() + 1; |
||
6176 | } |
||
6177 | semantics_iterator semantics_end() { |
||
6178 | return getSubExprsBuffer() + getNumSubExprs(); |
||
6179 | } |
||
6180 | const_semantics_iterator semantics_end() const { |
||
6181 | return getSubExprsBuffer() + getNumSubExprs(); |
||
6182 | } |
||
6183 | |||
6184 | llvm::iterator_range<semantics_iterator> semantics() { |
||
6185 | return llvm::make_range(semantics_begin(), semantics_end()); |
||
6186 | } |
||
6187 | llvm::iterator_range<const_semantics_iterator> semantics() const { |
||
6188 | return llvm::make_range(semantics_begin(), semantics_end()); |
||
6189 | } |
||
6190 | |||
6191 | Expr *getSemanticExpr(unsigned index) { |
||
6192 | assert(index + 1 < getNumSubExprs()); |
||
6193 | return getSubExprsBuffer()[index + 1]; |
||
6194 | } |
||
6195 | const Expr *getSemanticExpr(unsigned index) const { |
||
6196 | return const_cast<PseudoObjectExpr*>(this)->getSemanticExpr(index); |
||
6197 | } |
||
6198 | |||
6199 | SourceLocation getExprLoc() const LLVM_READONLY { |
||
6200 | return getSyntacticForm()->getExprLoc(); |
||
6201 | } |
||
6202 | |||
6203 | SourceLocation getBeginLoc() const LLVM_READONLY { |
||
6204 | return getSyntacticForm()->getBeginLoc(); |
||
6205 | } |
||
6206 | SourceLocation getEndLoc() const LLVM_READONLY { |
||
6207 | return getSyntacticForm()->getEndLoc(); |
||
6208 | } |
||
6209 | |||
6210 | child_range children() { |
||
6211 | const_child_range CCR = |
||
6212 | const_cast<const PseudoObjectExpr *>(this)->children(); |
||
6213 | return child_range(cast_away_const(CCR.begin()), |
||
6214 | cast_away_const(CCR.end())); |
||
6215 | } |
||
6216 | const_child_range children() const { |
||
6217 | Stmt *const *cs = const_cast<Stmt *const *>( |
||
6218 | reinterpret_cast<const Stmt *const *>(getSubExprsBuffer())); |
||
6219 | return const_child_range(cs, cs + getNumSubExprs()); |
||
6220 | } |
||
6221 | |||
6222 | static bool classof(const Stmt *T) { |
||
6223 | return T->getStmtClass() == PseudoObjectExprClass; |
||
6224 | } |
||
6225 | |||
6226 | friend TrailingObjects; |
||
6227 | friend class ASTStmtReader; |
||
6228 | }; |
||
6229 | |||
6230 | /// AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, |
||
6231 | /// __atomic_load, __atomic_store, and __atomic_compare_exchange_*, for the |
||
6232 | /// similarly-named C++11 instructions, and __c11 variants for <stdatomic.h>, |
||
6233 | /// and corresponding __opencl_atomic_* for OpenCL 2.0. |
||
6234 | /// All of these instructions take one primary pointer, at least one memory |
||
6235 | /// order. The instructions for which getScopeModel returns non-null value |
||
6236 | /// take one synch scope. |
||
6237 | class AtomicExpr : public Expr { |
||
6238 | public: |
||
6239 | enum AtomicOp { |
||
6240 | #define BUILTIN(ID, TYPE, ATTRS) |
||
6241 | #define ATOMIC_BUILTIN(ID, TYPE, ATTRS) AO ## ID, |
||
6242 | #include "clang/Basic/Builtins.def" |
||
6243 | // Avoid trailing comma |
||
6244 | BI_First = 0 |
||
6245 | }; |
||
6246 | |||
6247 | private: |
||
6248 | /// Location of sub-expressions. |
||
6249 | /// The location of Scope sub-expression is NumSubExprs - 1, which is |
||
6250 | /// not fixed, therefore is not defined in enum. |
||
6251 | enum { PTR, ORDER, VAL1, ORDER_FAIL, VAL2, WEAK, END_EXPR }; |
||
6252 | Stmt *SubExprs[END_EXPR + 1]; |
||
6253 | unsigned NumSubExprs; |
||
6254 | SourceLocation BuiltinLoc, RParenLoc; |
||
6255 | AtomicOp Op; |
||
6256 | |||
6257 | friend class ASTStmtReader; |
||
6258 | public: |
||
6259 | AtomicExpr(SourceLocation BLoc, ArrayRef<Expr*> args, QualType t, |
||
6260 | AtomicOp op, SourceLocation RP); |
||
6261 | |||
6262 | /// Determine the number of arguments the specified atomic builtin |
||
6263 | /// should have. |
||
6264 | static unsigned getNumSubExprs(AtomicOp Op); |
||
6265 | |||
6266 | /// Build an empty AtomicExpr. |
||
6267 | explicit AtomicExpr(EmptyShell Empty) : Expr(AtomicExprClass, Empty) { } |
||
6268 | |||
6269 | Expr *getPtr() const { |
||
6270 | return cast<Expr>(SubExprs[PTR]); |
||
6271 | } |
||
6272 | Expr *getOrder() const { |
||
6273 | return cast<Expr>(SubExprs[ORDER]); |
||
6274 | } |
||
6275 | Expr *getScope() const { |
||
6276 | assert(getScopeModel() && "No scope"); |
||
6277 | return cast<Expr>(SubExprs[NumSubExprs - 1]); |
||
6278 | } |
||
6279 | Expr *getVal1() const { |
||
6280 | if (Op == AO__c11_atomic_init || Op == AO__opencl_atomic_init) |
||
6281 | return cast<Expr>(SubExprs[ORDER]); |
||
6282 | assert(NumSubExprs > VAL1); |
||
6283 | return cast<Expr>(SubExprs[VAL1]); |
||
6284 | } |
||
6285 | Expr *getOrderFail() const { |
||
6286 | assert(NumSubExprs > ORDER_FAIL); |
||
6287 | return cast<Expr>(SubExprs[ORDER_FAIL]); |
||
6288 | } |
||
6289 | Expr *getVal2() const { |
||
6290 | if (Op == AO__atomic_exchange) |
||
6291 | return cast<Expr>(SubExprs[ORDER_FAIL]); |
||
6292 | assert(NumSubExprs > VAL2); |
||
6293 | return cast<Expr>(SubExprs[VAL2]); |
||
6294 | } |
||
6295 | Expr *getWeak() const { |
||
6296 | assert(NumSubExprs > WEAK); |
||
6297 | return cast<Expr>(SubExprs[WEAK]); |
||
6298 | } |
||
6299 | QualType getValueType() const; |
||
6300 | |||
6301 | AtomicOp getOp() const { return Op; } |
||
6302 | unsigned getNumSubExprs() const { return NumSubExprs; } |
||
6303 | |||
6304 | Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); } |
||
6305 | const Expr * const *getSubExprs() const { |
||
6306 | return reinterpret_cast<Expr * const *>(SubExprs); |
||
6307 | } |
||
6308 | |||
6309 | bool isVolatile() const { |
||
6310 | return getPtr()->getType()->getPointeeType().isVolatileQualified(); |
||
6311 | } |
||
6312 | |||
6313 | bool isCmpXChg() const { |
||
6314 | return getOp() == AO__c11_atomic_compare_exchange_strong || |
||
6315 | getOp() == AO__c11_atomic_compare_exchange_weak || |
||
6316 | getOp() == AO__hip_atomic_compare_exchange_strong || |
||
6317 | getOp() == AO__opencl_atomic_compare_exchange_strong || |
||
6318 | getOp() == AO__opencl_atomic_compare_exchange_weak || |
||
6319 | getOp() == AO__hip_atomic_compare_exchange_weak || |
||
6320 | getOp() == AO__atomic_compare_exchange || |
||
6321 | getOp() == AO__atomic_compare_exchange_n; |
||
6322 | } |
||
6323 | |||
6324 | bool isOpenCL() const { |
||
6325 | return getOp() >= AO__opencl_atomic_init && |
||
6326 | getOp() <= AO__opencl_atomic_fetch_max; |
||
6327 | } |
||
6328 | |||
6329 | SourceLocation getBuiltinLoc() const { return BuiltinLoc; } |
||
6330 | SourceLocation getRParenLoc() const { return RParenLoc; } |
||
6331 | |||
6332 | SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } |
||
6333 | SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } |
||
6334 | |||
6335 | static bool classof(const Stmt *T) { |
||
6336 | return T->getStmtClass() == AtomicExprClass; |
||
6337 | } |
||
6338 | |||
6339 | // Iterators |
||
6340 | child_range children() { |
||
6341 | return child_range(SubExprs, SubExprs+NumSubExprs); |
||
6342 | } |
||
6343 | const_child_range children() const { |
||
6344 | return const_child_range(SubExprs, SubExprs + NumSubExprs); |
||
6345 | } |
||
6346 | |||
6347 | /// Get atomic scope model for the atomic op code. |
||
6348 | /// \return empty atomic scope model if the atomic op code does not have |
||
6349 | /// scope operand. |
||
6350 | static std::unique_ptr<AtomicScopeModel> getScopeModel(AtomicOp Op) { |
||
6351 | auto Kind = |
||
6352 | (Op >= AO__opencl_atomic_load && Op <= AO__opencl_atomic_fetch_max) |
||
6353 | ? AtomicScopeModelKind::OpenCL |
||
6354 | : (Op >= AO__hip_atomic_load && Op <= AO__hip_atomic_fetch_max) |
||
6355 | ? AtomicScopeModelKind::HIP |
||
6356 | : AtomicScopeModelKind::None; |
||
6357 | return AtomicScopeModel::create(Kind); |
||
6358 | } |
||
6359 | |||
6360 | /// Get atomic scope model. |
||
6361 | /// \return empty atomic scope model if this atomic expression does not have |
||
6362 | /// scope operand. |
||
6363 | std::unique_ptr<AtomicScopeModel> getScopeModel() const { |
||
6364 | return getScopeModel(getOp()); |
||
6365 | } |
||
6366 | }; |
||
6367 | |||
6368 | /// TypoExpr - Internal placeholder for expressions where typo correction |
||
6369 | /// still needs to be performed and/or an error diagnostic emitted. |
||
6370 | class TypoExpr : public Expr { |
||
6371 | // The location for the typo name. |
||
6372 | SourceLocation TypoLoc; |
||
6373 | |||
6374 | public: |
||
6375 | TypoExpr(QualType T, SourceLocation TypoLoc) |
||
6376 | : Expr(TypoExprClass, T, VK_LValue, OK_Ordinary), TypoLoc(TypoLoc) { |
||
6377 | assert(T->isDependentType() && "TypoExpr given a non-dependent type"); |
||
6378 | setDependence(ExprDependence::TypeValueInstantiation | |
||
6379 | ExprDependence::Error); |
||
6380 | } |
||
6381 | |||
6382 | child_range children() { |
||
6383 | return child_range(child_iterator(), child_iterator()); |
||
6384 | } |
||
6385 | const_child_range children() const { |
||
6386 | return const_child_range(const_child_iterator(), const_child_iterator()); |
||
6387 | } |
||
6388 | |||
6389 | SourceLocation getBeginLoc() const LLVM_READONLY { return TypoLoc; } |
||
6390 | SourceLocation getEndLoc() const LLVM_READONLY { return TypoLoc; } |
||
6391 | |||
6392 | static bool classof(const Stmt *T) { |
||
6393 | return T->getStmtClass() == TypoExprClass; |
||
6394 | } |
||
6395 | |||
6396 | }; |
||
6397 | |||
6398 | /// Frontend produces RecoveryExprs on semantic errors that prevent creating |
||
6399 | /// other well-formed expressions. E.g. when type-checking of a binary operator |
||
6400 | /// fails, we cannot produce a BinaryOperator expression. Instead, we can choose |
||
6401 | /// to produce a recovery expression storing left and right operands. |
||
6402 | /// |
||
6403 | /// RecoveryExpr does not have any semantic meaning in C++, it is only useful to |
||
6404 | /// preserve expressions in AST that would otherwise be dropped. It captures |
||
6405 | /// subexpressions of some expression that we could not construct and source |
||
6406 | /// range covered by the expression. |
||
6407 | /// |
||
6408 | /// By default, RecoveryExpr uses dependence-bits to take advantage of existing |
||
6409 | /// machinery to deal with dependent code in C++, e.g. RecoveryExpr is preserved |
||
6410 | /// in `decltype(<broken-expr>)` as part of the `DependentDecltypeType`. In |
||
6411 | /// addition to that, clang does not report most errors on dependent |
||
6412 | /// expressions, so we get rid of bogus errors for free. However, note that |
||
6413 | /// unlike other dependent expressions, RecoveryExpr can be produced in |
||
6414 | /// non-template contexts. |
||
6415 | /// |
||
6416 | /// We will preserve the type in RecoveryExpr when the type is known, e.g. |
||
6417 | /// preserving the return type for a broken non-overloaded function call, a |
||
6418 | /// overloaded call where all candidates have the same return type. In this |
||
6419 | /// case, the expression is not type-dependent (unless the known type is itself |
||
6420 | /// dependent) |
||
6421 | /// |
||
6422 | /// One can also reliably suppress all bogus errors on expressions containing |
||
6423 | /// recovery expressions by examining results of Expr::containsErrors(). |
||
6424 | class RecoveryExpr final : public Expr, |
||
6425 | private llvm::TrailingObjects<RecoveryExpr, Expr *> { |
||
6426 | public: |
||
6427 | static RecoveryExpr *Create(ASTContext &Ctx, QualType T, |
||
6428 | SourceLocation BeginLoc, SourceLocation EndLoc, |
||
6429 | ArrayRef<Expr *> SubExprs); |
||
6430 | static RecoveryExpr *CreateEmpty(ASTContext &Ctx, unsigned NumSubExprs); |
||
6431 | |||
6432 | ArrayRef<Expr *> subExpressions() { |
||
6433 | auto *B = getTrailingObjects<Expr *>(); |
||
6434 | return llvm::ArrayRef(B, B + NumExprs); |
||
6435 | } |
||
6436 | |||
6437 | ArrayRef<const Expr *> subExpressions() const { |
||
6438 | return const_cast<RecoveryExpr *>(this)->subExpressions(); |
||
6439 | } |
||
6440 | |||
6441 | child_range children() { |
||
6442 | Stmt **B = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>()); |
||
6443 | return child_range(B, B + NumExprs); |
||
6444 | } |
||
6445 | |||
6446 | SourceLocation getBeginLoc() const { return BeginLoc; } |
||
6447 | SourceLocation getEndLoc() const { return EndLoc; } |
||
6448 | |||
6449 | static bool classof(const Stmt *T) { |
||
6450 | return T->getStmtClass() == RecoveryExprClass; |
||
6451 | } |
||
6452 | |||
6453 | private: |
||
6454 | RecoveryExpr(ASTContext &Ctx, QualType T, SourceLocation BeginLoc, |
||
6455 | SourceLocation EndLoc, ArrayRef<Expr *> SubExprs); |
||
6456 | RecoveryExpr(EmptyShell Empty, unsigned NumSubExprs) |
||
6457 | : Expr(RecoveryExprClass, Empty), NumExprs(NumSubExprs) {} |
||
6458 | |||
6459 | size_t numTrailingObjects(OverloadToken<Stmt *>) const { return NumExprs; } |
||
6460 | |||
6461 | SourceLocation BeginLoc, EndLoc; |
||
6462 | unsigned NumExprs; |
||
6463 | friend TrailingObjects; |
||
6464 | friend class ASTStmtReader; |
||
6465 | friend class ASTStmtWriter; |
||
6466 | }; |
||
6467 | |||
6468 | } // end namespace clang |
||
6469 | |||
6470 | #endif // LLVM_CLANG_AST_EXPR_H |