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
40 namespace clang {
41 class APValue;
42 class ASTContext;
43 class BlockDecl;
44 class CXXBaseSpecifier;
45 class CXXMemberCallExpr;
46 class CXXOperatorCallExpr;
47 class CastExpr;
48 class Decl;
49 class IdentifierInfo;
50 class MaterializeTemporaryExpr;
51 class NamedDecl;
52 class ObjCPropertyRefExpr;
53 class OpaqueValueExpr;
54 class ParmVarDecl;
55 class StringLiteral;
56 class TargetInfo;
57 class ValueDecl;
58
59 /// A simple array of base specifiers.
60 typedef SmallVector<CXXBaseSpecifier*, 4> CXXCastPath;
61
62 /// An adjustment to be made to the temporary created when emitting a
63 /// reference binding, which accesses a particular subobject of that temporary.
64 struct SubobjectAdjustment {
65 enum {
66 DerivedToBaseAdjustment,
67 FieldAdjustment,
68 MemberPointerAdjustment
69 } Kind;
70
71 struct DTB {
72 const CastExpr *BasePath;
73 const CXXRecordDecl *DerivedClass;
74 };
75
76 struct P {
77 const MemberPointerType *MPT;
78 Expr *RHS;
79 };
80
81 union {
82 struct DTB DerivedToBase;
83 FieldDecl *Field;
84 struct P Ptr;
85 };
86
SubobjectAdjustmentSubobjectAdjustment87 SubobjectAdjustment(const CastExpr *BasePath,
88 const CXXRecordDecl *DerivedClass)
89 : Kind(DerivedToBaseAdjustment) {
90 DerivedToBase.BasePath = BasePath;
91 DerivedToBase.DerivedClass = DerivedClass;
92 }
93
SubobjectAdjustmentSubobjectAdjustment94 SubobjectAdjustment(FieldDecl *Field)
95 : Kind(FieldAdjustment) {
96 this->Field = Field;
97 }
98
SubobjectAdjustmentSubobjectAdjustment99 SubobjectAdjustment(const MemberPointerType *MPT, Expr *RHS)
100 : Kind(MemberPointerAdjustment) {
101 this->Ptr.MPT = MPT;
102 this->Ptr.RHS = RHS;
103 }
104 };
105
106 /// This represents one expression. Note that Expr's are subclasses of Stmt.
107 /// This allows an expression to be transparently used any place a Stmt is
108 /// required.
109 class Expr : public ValueStmt {
110 QualType TR;
111
112 public:
113 Expr() = delete;
114 Expr(const Expr&) = delete;
115 Expr(Expr &&) = delete;
116 Expr &operator=(const Expr&) = delete;
117 Expr &operator=(Expr&&) = delete;
118
119 protected:
Expr(StmtClass SC,QualType T,ExprValueKind VK,ExprObjectKind OK)120 Expr(StmtClass SC, QualType T, ExprValueKind VK, ExprObjectKind OK)
121 : ValueStmt(SC) {
122 ExprBits.Dependent = 0;
123 ExprBits.ValueKind = VK;
124 ExprBits.ObjectKind = OK;
125 assert(ExprBits.ObjectKind == OK && "truncated kind");
126 setType(T);
127 }
128
129 /// Construct an empty expression.
Expr(StmtClass SC,EmptyShell)130 explicit Expr(StmtClass SC, EmptyShell) : ValueStmt(SC) { }
131
132 /// Each concrete expr subclass is expected to compute its dependence and call
133 /// this in the constructor.
setDependence(ExprDependence Deps)134 void setDependence(ExprDependence Deps) {
135 ExprBits.Dependent = static_cast<unsigned>(Deps);
136 }
137 friend class ASTImporter; // Sets dependence dircetly.
138 friend class ASTStmtReader; // Sets dependence dircetly.
139
140 public:
getType()141 QualType getType() const { return TR; }
setType(QualType t)142 void setType(QualType t) {
143 // In C++, the type of an expression is always adjusted so that it
144 // will not have reference type (C++ [expr]p6). Use
145 // QualType::getNonReferenceType() to retrieve the non-reference
146 // type. Additionally, inspect Expr::isLvalue to determine whether
147 // an expression that is adjusted in this manner should be
148 // considered an lvalue.
149 assert((t.isNull() || !t->isReferenceType()) &&
150 "Expressions can't have reference type");
151
152 TR = t;
153 }
154
getDependence()155 ExprDependence getDependence() const {
156 return static_cast<ExprDependence>(ExprBits.Dependent);
157 }
158
159 /// Determines whether the value of this expression depends on
160 /// - a template parameter (C++ [temp.dep.constexpr])
161 /// - or an error, whose resolution is unknown
162 ///
163 /// For example, the array bound of "Chars" in the following example is
164 /// value-dependent.
165 /// @code
166 /// template<int Size, char (&Chars)[Size]> struct meta_string;
167 /// @endcode
isValueDependent()168 bool isValueDependent() const {
169 return static_cast<bool>(getDependence() & ExprDependence::Value);
170 }
171
172 /// Determines whether the type of this expression depends on
173 /// - a template paramter (C++ [temp.dep.expr], which means that its type
174 /// could change from one template instantiation to the next)
175 /// - or an error
176 ///
177 /// For example, the expressions "x" and "x + y" are type-dependent in
178 /// the following code, but "y" is not type-dependent:
179 /// @code
180 /// template<typename T>
181 /// void add(T x, int y) {
182 /// x + y;
183 /// }
184 /// @endcode
isTypeDependent()185 bool isTypeDependent() const {
186 return static_cast<bool>(getDependence() & ExprDependence::Type);
187 }
188
189 /// Whether this expression is instantiation-dependent, meaning that
190 /// it depends in some way on
191 /// - a template parameter (even if neither its type nor (constant) value
192 /// can change due to the template instantiation)
193 /// - or an error
194 ///
195 /// In the following example, the expression \c sizeof(sizeof(T() + T())) is
196 /// instantiation-dependent (since it involves a template parameter \c T), but
197 /// is neither type- nor value-dependent, since the type of the inner
198 /// \c sizeof is known (\c std::size_t) and therefore the size of the outer
199 /// \c sizeof is known.
200 ///
201 /// \code
202 /// template<typename T>
203 /// void f(T x, T y) {
204 /// sizeof(sizeof(T() + T());
205 /// }
206 /// \endcode
207 ///
208 /// \code
209 /// void func(int) {
210 /// func(); // the expression is instantiation-dependent, because it depends
211 /// // on an error.
212 /// }
213 /// \endcode
isInstantiationDependent()214 bool isInstantiationDependent() const {
215 return static_cast<bool>(getDependence() & ExprDependence::Instantiation);
216 }
217
218 /// Whether this expression contains an unexpanded parameter
219 /// pack (for C++11 variadic templates).
220 ///
221 /// Given the following function template:
222 ///
223 /// \code
224 /// template<typename F, typename ...Types>
225 /// void forward(const F &f, Types &&...args) {
226 /// f(static_cast<Types&&>(args)...);
227 /// }
228 /// \endcode
229 ///
230 /// The expressions \c args and \c static_cast<Types&&>(args) both
231 /// contain parameter packs.
containsUnexpandedParameterPack()232 bool containsUnexpandedParameterPack() const {
233 return static_cast<bool>(getDependence() & ExprDependence::UnexpandedPack);
234 }
235
236 /// Whether this expression contains subexpressions which had errors, e.g. a
237 /// TypoExpr.
containsErrors()238 bool containsErrors() const {
239 return static_cast<bool>(getDependence() & ExprDependence::Error);
240 }
241
242 /// getExprLoc - Return the preferred location for the arrow when diagnosing
243 /// a problem with a generic expression.
244 SourceLocation getExprLoc() const LLVM_READONLY;
245
246 /// Determine whether an lvalue-to-rvalue conversion should implicitly be
247 /// applied to this expression if it appears as a discarded-value expression
248 /// in C++11 onwards. This applies to certain forms of volatile glvalues.
249 bool isReadIfDiscardedInCPlusPlus11() const;
250
251 /// isUnusedResultAWarning - Return true if this immediate expression should
252 /// be warned about if the result is unused. If so, fill in expr, location,
253 /// and ranges with expr to warn on and source locations/ranges appropriate
254 /// for a warning.
255 bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc,
256 SourceRange &R1, SourceRange &R2,
257 ASTContext &Ctx) const;
258
259 /// isLValue - True if this expression is an "l-value" according to
260 /// the rules of the current language. C and C++ give somewhat
261 /// different rules for this concept, but in general, the result of
262 /// an l-value expression identifies a specific object whereas the
263 /// result of an r-value expression is a value detached from any
264 /// specific storage.
265 ///
266 /// C++11 divides the concept of "r-value" into pure r-values
267 /// ("pr-values") and so-called expiring values ("x-values"), which
268 /// identify specific objects that can be safely cannibalized for
269 /// their resources.
isLValue()270 bool isLValue() const { return getValueKind() == VK_LValue; }
isPRValue()271 bool isPRValue() const { return getValueKind() == VK_PRValue; }
isXValue()272 bool isXValue() const { return getValueKind() == VK_XValue; }
isGLValue()273 bool isGLValue() const { return getValueKind() != VK_PRValue; }
274
275 enum LValueClassification {
276 LV_Valid,
277 LV_NotObjectType,
278 LV_IncompleteVoidType,
279 LV_DuplicateVectorComponents,
280 LV_InvalidExpression,
281 LV_InvalidMessageExpression,
282 LV_MemberFunction,
283 LV_SubObjCPropertySetting,
284 LV_ClassTemporary,
285 LV_ArrayTemporary
286 };
287 /// Reasons why an expression might not be an l-value.
288 LValueClassification ClassifyLValue(ASTContext &Ctx) const;
289
290 enum isModifiableLvalueResult {
291 MLV_Valid,
292 MLV_NotObjectType,
293 MLV_IncompleteVoidType,
294 MLV_DuplicateVectorComponents,
295 MLV_InvalidExpression,
296 MLV_LValueCast, // Specialized form of MLV_InvalidExpression.
297 MLV_IncompleteType,
298 MLV_ConstQualified,
299 MLV_ConstQualifiedField,
300 MLV_ConstAddrSpace,
301 MLV_ArrayType,
302 MLV_NoSetterProperty,
303 MLV_MemberFunction,
304 MLV_SubObjCPropertySetting,
305 MLV_InvalidMessageExpression,
306 MLV_ClassTemporary,
307 MLV_ArrayTemporary
308 };
309 /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type,
310 /// does not have an incomplete type, does not have a const-qualified type,
311 /// and if it is a structure or union, does not have any member (including,
312 /// recursively, any member or element of all contained aggregates or unions)
313 /// with a const-qualified type.
314 ///
315 /// \param Loc [in,out] - A source location which *may* be filled
316 /// in with the location of the expression making this a
317 /// non-modifiable lvalue, if specified.
318 isModifiableLvalueResult
319 isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc = nullptr) const;
320
321 /// The return type of classify(). Represents the C++11 expression
322 /// taxonomy.
323 class Classification {
324 public:
325 /// The various classification results. Most of these mean prvalue.
326 enum Kinds {
327 CL_LValue,
328 CL_XValue,
329 CL_Function, // Functions cannot be lvalues in C.
330 CL_Void, // Void cannot be an lvalue in C.
331 CL_AddressableVoid, // Void expression whose address can be taken in C.
332 CL_DuplicateVectorComponents, // A vector shuffle with dupes.
333 CL_MemberFunction, // An expression referring to a member function
334 CL_SubObjCPropertySetting,
335 CL_ClassTemporary, // A temporary of class type, or subobject thereof.
336 CL_ArrayTemporary, // A temporary of array type.
337 CL_ObjCMessageRValue, // ObjC message is an rvalue
338 CL_PRValue // A prvalue for any other reason, of any other type
339 };
340 /// The results of modification testing.
341 enum ModifiableType {
342 CM_Untested, // testModifiable was false.
343 CM_Modifiable,
344 CM_RValue, // Not modifiable because it's an rvalue
345 CM_Function, // Not modifiable because it's a function; C++ only
346 CM_LValueCast, // Same as CM_RValue, but indicates GCC cast-as-lvalue ext
347 CM_NoSetterProperty,// Implicit assignment to ObjC property without setter
348 CM_ConstQualified,
349 CM_ConstQualifiedField,
350 CM_ConstAddrSpace,
351 CM_ArrayType,
352 CM_IncompleteType
353 };
354
355 private:
356 friend class Expr;
357
358 unsigned short Kind;
359 unsigned short Modifiable;
360
Classification(Kinds k,ModifiableType m)361 explicit Classification(Kinds k, ModifiableType m)
362 : Kind(k), Modifiable(m)
363 {}
364
365 public:
Classification()366 Classification() {}
367
getKind()368 Kinds getKind() const { return static_cast<Kinds>(Kind); }
getModifiable()369 ModifiableType getModifiable() const {
370 assert(Modifiable != CM_Untested && "Did not test for modifiability.");
371 return static_cast<ModifiableType>(Modifiable);
372 }
isLValue()373 bool isLValue() const { return Kind == CL_LValue; }
isXValue()374 bool isXValue() const { return Kind == CL_XValue; }
isGLValue()375 bool isGLValue() const { return Kind <= CL_XValue; }
isPRValue()376 bool isPRValue() const { return Kind >= CL_Function; }
isRValue()377 bool isRValue() const { return Kind >= CL_XValue; }
isModifiable()378 bool isModifiable() const { return getModifiable() == CM_Modifiable; }
379
380 /// Create a simple, modifiably lvalue
makeSimpleLValue()381 static Classification makeSimpleLValue() {
382 return Classification(CL_LValue, CM_Modifiable);
383 }
384
385 };
386 /// Classify - Classify this expression according to the C++11
387 /// expression taxonomy.
388 ///
389 /// C++11 defines ([basic.lval]) a new taxonomy of expressions to replace the
390 /// old lvalue vs rvalue. This function determines the type of expression this
391 /// is. There are three expression types:
392 /// - lvalues are classical lvalues as in C++03.
393 /// - prvalues are equivalent to rvalues in C++03.
394 /// - xvalues are expressions yielding unnamed rvalue references, e.g. a
395 /// function returning an rvalue reference.
396 /// lvalues and xvalues are collectively referred to as glvalues, while
397 /// prvalues and xvalues together form rvalues.
Classify(ASTContext & Ctx)398 Classification Classify(ASTContext &Ctx) const {
399 return ClassifyImpl(Ctx, nullptr);
400 }
401
402 /// ClassifyModifiable - Classify this expression according to the
403 /// C++11 expression taxonomy, and see if it is valid on the left side
404 /// of an assignment.
405 ///
406 /// This function extends classify in that it also tests whether the
407 /// expression is modifiable (C99 6.3.2.1p1).
408 /// \param Loc A source location that might be filled with a relevant location
409 /// if the expression is not modifiable.
ClassifyModifiable(ASTContext & Ctx,SourceLocation & Loc)410 Classification ClassifyModifiable(ASTContext &Ctx, SourceLocation &Loc) const{
411 return ClassifyImpl(Ctx, &Loc);
412 }
413
414 /// Returns the set of floating point options that apply to this expression.
415 /// Only meaningful for operations on floating point values.
416 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const;
417
418 /// getValueKindForType - Given a formal return or parameter type,
419 /// give its value kind.
getValueKindForType(QualType T)420 static ExprValueKind getValueKindForType(QualType T) {
421 if (const ReferenceType *RT = T->getAs<ReferenceType>())
422 return (isa<LValueReferenceType>(RT)
423 ? VK_LValue
424 : (RT->getPointeeType()->isFunctionType()
425 ? VK_LValue : VK_XValue));
426 return VK_PRValue;
427 }
428
429 /// getValueKind - The value kind that this expression produces.
getValueKind()430 ExprValueKind getValueKind() const {
431 return static_cast<ExprValueKind>(ExprBits.ValueKind);
432 }
433
434 /// getObjectKind - The object kind that this expression produces.
435 /// Object kinds are meaningful only for expressions that yield an
436 /// l-value or x-value.
getObjectKind()437 ExprObjectKind getObjectKind() const {
438 return static_cast<ExprObjectKind>(ExprBits.ObjectKind);
439 }
440
isOrdinaryOrBitFieldObject()441 bool isOrdinaryOrBitFieldObject() const {
442 ExprObjectKind OK = getObjectKind();
443 return (OK == OK_Ordinary || OK == OK_BitField);
444 }
445
446 /// setValueKind - Set the value kind produced by this expression.
setValueKind(ExprValueKind Cat)447 void setValueKind(ExprValueKind Cat) { ExprBits.ValueKind = Cat; }
448
449 /// setObjectKind - Set the object kind produced by this expression.
setObjectKind(ExprObjectKind Cat)450 void setObjectKind(ExprObjectKind Cat) { ExprBits.ObjectKind = Cat; }
451
452 private:
453 Classification ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const;
454
455 public:
456
457 /// Returns true if this expression is a gl-value that
458 /// potentially refers to a bit-field.
459 ///
460 /// In C++, whether a gl-value refers to a bitfield is essentially
461 /// an aspect of the value-kind type system.
refersToBitField()462 bool refersToBitField() const { return getObjectKind() == OK_BitField; }
463
464 /// If this expression refers to a bit-field, retrieve the
465 /// declaration of that bit-field.
466 ///
467 /// Note that this returns a non-null pointer in subtly different
468 /// places than refersToBitField returns true. In particular, this can
469 /// return a non-null pointer even for r-values loaded from
470 /// bit-fields, but it will return null for a conditional bit-field.
471 FieldDecl *getSourceBitField();
472
getSourceBitField()473 const FieldDecl *getSourceBitField() const {
474 return const_cast<Expr*>(this)->getSourceBitField();
475 }
476
477 Decl *getReferencedDeclOfCallee();
getReferencedDeclOfCallee()478 const Decl *getReferencedDeclOfCallee() const {
479 return const_cast<Expr*>(this)->getReferencedDeclOfCallee();
480 }
481
482 /// If this expression is an l-value for an Objective C
483 /// property, find the underlying property reference expression.
484 const ObjCPropertyRefExpr *getObjCProperty() const;
485
486 /// Check if this expression is the ObjC 'self' implicit parameter.
487 bool isObjCSelfExpr() const;
488
489 /// Returns whether this expression refers to a vector element.
490 bool refersToVectorElement() const;
491
492 /// Returns whether this expression refers to a matrix element.
refersToMatrixElement()493 bool refersToMatrixElement() const {
494 return getObjectKind() == OK_MatrixComponent;
495 }
496
497 /// Returns whether this expression refers to a global register
498 /// variable.
499 bool refersToGlobalRegisterVar() const;
500
501 /// Returns whether this expression has a placeholder type.
hasPlaceholderType()502 bool hasPlaceholderType() const {
503 return getType()->isPlaceholderType();
504 }
505
506 /// Returns whether this expression has a specific placeholder type.
hasPlaceholderType(BuiltinType::Kind K)507 bool hasPlaceholderType(BuiltinType::Kind K) const {
508 assert(BuiltinType::isPlaceholderTypeKind(K));
509 if (const BuiltinType *BT = dyn_cast<BuiltinType>(getType()))
510 return BT->getKind() == K;
511 return false;
512 }
513
514 /// isKnownToHaveBooleanValue - Return true if this is an integer expression
515 /// that is known to return 0 or 1. This happens for _Bool/bool expressions
516 /// but also int expressions which are produced by things like comparisons in
517 /// C.
518 ///
519 /// \param Semantic If true, only return true for expressions that are known
520 /// to be semantically boolean, which might not be true even for expressions
521 /// that are known to evaluate to 0/1. For instance, reading an unsigned
522 /// bit-field with width '1' will evaluate to 0/1, but doesn't necessarily
523 /// semantically correspond to a bool.
524 bool isKnownToHaveBooleanValue(bool Semantic = true) const;
525
526 /// isIntegerConstantExpr - Return the value if this expression is a valid
527 /// integer constant expression. If not a valid i-c-e, return None and fill
528 /// in Loc (if specified) with the location of the invalid expression.
529 ///
530 /// Note: This does not perform the implicit conversions required by C++11
531 /// [expr.const]p5.
532 Optional<llvm::APSInt> getIntegerConstantExpr(const ASTContext &Ctx,
533 SourceLocation *Loc = nullptr,
534 bool isEvaluated = true) const;
535 bool isIntegerConstantExpr(const ASTContext &Ctx,
536 SourceLocation *Loc = nullptr) const;
537
538 /// isCXX98IntegralConstantExpr - Return true if this expression is an
539 /// integral constant expression in C++98. Can only be used in C++.
540 bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const;
541
542 /// isCXX11ConstantExpr - Return true if this expression is a constant
543 /// expression in C++11. Can only be used in C++.
544 ///
545 /// Note: This does not perform the implicit conversions required by C++11
546 /// [expr.const]p5.
547 bool isCXX11ConstantExpr(const ASTContext &Ctx, APValue *Result = nullptr,
548 SourceLocation *Loc = nullptr) const;
549
550 /// isPotentialConstantExpr - Return true if this function's definition
551 /// might be usable in a constant expression in C++11, if it were marked
552 /// constexpr. Return false if the function can never produce a constant
553 /// expression, along with diagnostics describing why not.
554 static bool isPotentialConstantExpr(const FunctionDecl *FD,
555 SmallVectorImpl<
556 PartialDiagnosticAt> &Diags);
557
558 /// isPotentialConstantExprUnevaluted - Return true if this expression might
559 /// be usable in a constant expression in C++11 in an unevaluated context, if
560 /// it were in function FD marked constexpr. Return false if the function can
561 /// never produce a constant expression, along with diagnostics describing
562 /// why not.
563 static bool isPotentialConstantExprUnevaluated(Expr *E,
564 const FunctionDecl *FD,
565 SmallVectorImpl<
566 PartialDiagnosticAt> &Diags);
567
568 /// isConstantInitializer - Returns true if this expression can be emitted to
569 /// IR as a constant, and thus can be used as a constant initializer in C.
570 /// If this expression is not constant and Culprit is non-null,
571 /// it is used to store the address of first non constant expr.
572 bool isConstantInitializer(ASTContext &Ctx, bool ForRef,
573 const Expr **Culprit = nullptr) const;
574
575 /// If this expression is an unambiguous reference to a single declaration,
576 /// in the style of __builtin_function_start, return that declaration. Note
577 /// that this may return a non-static member function or field in C++ if this
578 /// expression is a member pointer constant.
579 const ValueDecl *getAsBuiltinConstantDeclRef(const ASTContext &Context) const;
580
581 /// EvalStatus is a struct with detailed info about an evaluation in progress.
582 struct EvalStatus {
583 /// Whether the evaluated expression has side effects.
584 /// For example, (f() && 0) can be folded, but it still has side effects.
585 bool HasSideEffects;
586
587 /// Whether the evaluation hit undefined behavior.
588 /// For example, 1.0 / 0.0 can be folded to Inf, but has undefined behavior.
589 /// Likewise, INT_MAX + 1 can be folded to INT_MIN, but has UB.
590 bool HasUndefinedBehavior;
591
592 /// Diag - If this is non-null, it will be filled in with a stack of notes
593 /// indicating why evaluation failed (or why it failed to produce a constant
594 /// expression).
595 /// If the expression is unfoldable, the notes will indicate why it's not
596 /// foldable. If the expression is foldable, but not a constant expression,
597 /// the notes will describes why it isn't a constant expression. If the
598 /// expression *is* a constant expression, no notes will be produced.
599 SmallVectorImpl<PartialDiagnosticAt> *Diag;
600
EvalStatusEvalStatus601 EvalStatus()
602 : HasSideEffects(false), HasUndefinedBehavior(false), Diag(nullptr) {}
603
604 // hasSideEffects - Return true if the evaluated expression has
605 // side effects.
hasSideEffectsEvalStatus606 bool hasSideEffects() const {
607 return HasSideEffects;
608 }
609 };
610
611 /// EvalResult is a struct with detailed info about an evaluated expression.
612 struct EvalResult : EvalStatus {
613 /// Val - This is the value the expression can be folded to.
614 APValue Val;
615
616 // isGlobalLValue - Return true if the evaluated lvalue expression
617 // is global.
618 bool isGlobalLValue() const;
619 };
620
621 /// EvaluateAsRValue - Return true if this is a constant which we can fold to
622 /// an rvalue using any crazy technique (that has nothing to do with language
623 /// standards) that we want to, even if the expression has side-effects. If
624 /// this function returns true, it returns the folded constant in Result. If
625 /// the expression is a glvalue, an lvalue-to-rvalue conversion will be
626 /// applied.
627 bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx,
628 bool InConstantContext = false) const;
629
630 /// EvaluateAsBooleanCondition - Return true if this is a constant
631 /// which we can fold and convert to a boolean condition using
632 /// any crazy technique that we want to, even if the expression has
633 /// side-effects.
634 bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx,
635 bool InConstantContext = false) const;
636
637 enum SideEffectsKind {
638 SE_NoSideEffects, ///< Strictly evaluate the expression.
639 SE_AllowUndefinedBehavior, ///< Allow UB that we can give a value, but not
640 ///< arbitrary unmodeled side effects.
641 SE_AllowSideEffects ///< Allow any unmodeled side effect.
642 };
643
644 /// EvaluateAsInt - Return true if this is a constant which we can fold and
645 /// convert to an integer, using any crazy technique that we want to.
646 bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx,
647 SideEffectsKind AllowSideEffects = SE_NoSideEffects,
648 bool InConstantContext = false) const;
649
650 /// EvaluateAsFloat - Return true if this is a constant which we can fold and
651 /// convert to a floating point value, using any crazy technique that we
652 /// want to.
653 bool EvaluateAsFloat(llvm::APFloat &Result, const ASTContext &Ctx,
654 SideEffectsKind AllowSideEffects = SE_NoSideEffects,
655 bool InConstantContext = false) const;
656
657 /// EvaluateAsFloat - Return true if this is a constant which we can fold and
658 /// convert to a fixed point value.
659 bool EvaluateAsFixedPoint(EvalResult &Result, const ASTContext &Ctx,
660 SideEffectsKind AllowSideEffects = SE_NoSideEffects,
661 bool InConstantContext = false) const;
662
663 /// isEvaluatable - Call EvaluateAsRValue to see if this expression can be
664 /// constant folded without side-effects, but discard the result.
665 bool isEvaluatable(const ASTContext &Ctx,
666 SideEffectsKind AllowSideEffects = SE_NoSideEffects) const;
667
668 /// HasSideEffects - This routine returns true for all those expressions
669 /// which have any effect other than producing a value. Example is a function
670 /// call, volatile variable read, or throwing an exception. If
671 /// IncludePossibleEffects is false, this call treats certain expressions with
672 /// potential side effects (such as function call-like expressions,
673 /// instantiation-dependent expressions, or invocations from a macro) as not
674 /// having side effects.
675 bool HasSideEffects(const ASTContext &Ctx,
676 bool IncludePossibleEffects = true) const;
677
678 /// Determine whether this expression involves a call to any function
679 /// that is not trivial.
680 bool hasNonTrivialCall(const ASTContext &Ctx) const;
681
682 /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded
683 /// integer. This must be called on an expression that constant folds to an
684 /// integer.
685 llvm::APSInt EvaluateKnownConstInt(
686 const ASTContext &Ctx,
687 SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const;
688
689 llvm::APSInt EvaluateKnownConstIntCheckOverflow(
690 const ASTContext &Ctx,
691 SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const;
692
693 void EvaluateForOverflow(const ASTContext &Ctx) const;
694
695 /// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an
696 /// lvalue with link time known address, with no side-effects.
697 bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx,
698 bool InConstantContext = false) const;
699
700 /// EvaluateAsInitializer - Evaluate an expression as if it were the
701 /// initializer of the given declaration. Returns true if the initializer
702 /// can be folded to a constant, and produces any relevant notes. In C++11,
703 /// notes will be produced if the expression is not a constant expression.
704 bool EvaluateAsInitializer(APValue &Result, const ASTContext &Ctx,
705 const VarDecl *VD,
706 SmallVectorImpl<PartialDiagnosticAt> &Notes,
707 bool IsConstantInitializer) const;
708
709 /// EvaluateWithSubstitution - Evaluate an expression as if from the context
710 /// of a call to the given function with the given arguments, inside an
711 /// unevaluated context. Returns true if the expression could be folded to a
712 /// constant.
713 bool EvaluateWithSubstitution(APValue &Value, ASTContext &Ctx,
714 const FunctionDecl *Callee,
715 ArrayRef<const Expr*> Args,
716 const Expr *This = nullptr) const;
717
718 enum class ConstantExprKind {
719 /// An integer constant expression (an array bound, enumerator, case value,
720 /// bit-field width, or similar) or similar.
721 Normal,
722 /// A non-class template argument. Such a value is only used for mangling,
723 /// not for code generation, so can refer to dllimported functions.
724 NonClassTemplateArgument,
725 /// A class template argument. Such a value is used for code generation.
726 ClassTemplateArgument,
727 /// An immediate invocation. The destruction of the end result of this
728 /// evaluation is not part of the evaluation, but all other temporaries
729 /// are destroyed.
730 ImmediateInvocation,
731 };
732
733 /// Evaluate an expression that is required to be a constant expression. Does
734 /// not check the syntactic constraints for C and C++98 constant expressions.
735 bool EvaluateAsConstantExpr(
736 EvalResult &Result, const ASTContext &Ctx,
737 ConstantExprKind Kind = ConstantExprKind::Normal) const;
738
739 /// If the current Expr is a pointer, this will try to statically
740 /// determine the number of bytes available where the pointer is pointing.
741 /// Returns true if all of the above holds and we were able to figure out the
742 /// size, false otherwise.
743 ///
744 /// \param Type - How to evaluate the size of the Expr, as defined by the
745 /// "type" parameter of __builtin_object_size
746 bool tryEvaluateObjectSize(uint64_t &Result, ASTContext &Ctx,
747 unsigned Type) const;
748
749 /// If the current Expr is a pointer, this will try to statically
750 /// determine the strlen of the string pointed to.
751 /// Returns true if all of the above holds and we were able to figure out the
752 /// strlen, false otherwise.
753 bool tryEvaluateStrLen(uint64_t &Result, ASTContext &Ctx) const;
754
755 /// Enumeration used to describe the kind of Null pointer constant
756 /// returned from \c isNullPointerConstant().
757 enum NullPointerConstantKind {
758 /// Expression is not a Null pointer constant.
759 NPCK_NotNull = 0,
760
761 /// Expression is a Null pointer constant built from a zero integer
762 /// expression that is not a simple, possibly parenthesized, zero literal.
763 /// C++ Core Issue 903 will classify these expressions as "not pointers"
764 /// once it is adopted.
765 /// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903
766 NPCK_ZeroExpression,
767
768 /// Expression is a Null pointer constant built from a literal zero.
769 NPCK_ZeroLiteral,
770
771 /// Expression is a C++11 nullptr.
772 NPCK_CXX11_nullptr,
773
774 /// Expression is a GNU-style __null constant.
775 NPCK_GNUNull
776 };
777
778 /// Enumeration used to describe how \c isNullPointerConstant()
779 /// should cope with value-dependent expressions.
780 enum NullPointerConstantValueDependence {
781 /// Specifies that the expression should never be value-dependent.
782 NPC_NeverValueDependent = 0,
783
784 /// Specifies that a value-dependent expression of integral or
785 /// dependent type should be considered a null pointer constant.
786 NPC_ValueDependentIsNull,
787
788 /// Specifies that a value-dependent expression should be considered
789 /// to never be a null pointer constant.
790 NPC_ValueDependentIsNotNull
791 };
792
793 /// isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to
794 /// a Null pointer constant. The return value can further distinguish the
795 /// kind of NULL pointer constant that was detected.
796 NullPointerConstantKind isNullPointerConstant(
797 ASTContext &Ctx,
798 NullPointerConstantValueDependence NPC) const;
799
800 /// isOBJCGCCandidate - Return true if this expression may be used in a read/
801 /// write barrier.
802 bool isOBJCGCCandidate(ASTContext &Ctx) const;
803
804 /// Returns true if this expression is a bound member function.
805 bool isBoundMemberFunction(ASTContext &Ctx) const;
806
807 /// Given an expression of bound-member type, find the type
808 /// of the member. Returns null if this is an *overloaded* bound
809 /// member expression.
810 static QualType findBoundMemberType(const Expr *expr);
811
812 /// Skip past any invisble AST nodes which might surround this
813 /// statement, such as ExprWithCleanups or ImplicitCastExpr nodes,
814 /// but also injected CXXMemberExpr and CXXConstructExpr which represent
815 /// implicit conversions.
816 Expr *IgnoreUnlessSpelledInSource();
IgnoreUnlessSpelledInSource()817 const Expr *IgnoreUnlessSpelledInSource() const {
818 return const_cast<Expr *>(this)->IgnoreUnlessSpelledInSource();
819 }
820
821 /// Skip past any implicit casts which might surround this expression until
822 /// reaching a fixed point. Skips:
823 /// * ImplicitCastExpr
824 /// * FullExpr
825 Expr *IgnoreImpCasts() LLVM_READONLY;
IgnoreImpCasts()826 const Expr *IgnoreImpCasts() const {
827 return const_cast<Expr *>(this)->IgnoreImpCasts();
828 }
829
830 /// Skip past any casts which might surround this expression until reaching
831 /// a fixed point. Skips:
832 /// * CastExpr
833 /// * FullExpr
834 /// * MaterializeTemporaryExpr
835 /// * SubstNonTypeTemplateParmExpr
836 Expr *IgnoreCasts() LLVM_READONLY;
IgnoreCasts()837 const Expr *IgnoreCasts() const {
838 return const_cast<Expr *>(this)->IgnoreCasts();
839 }
840
841 /// Skip past any implicit AST nodes which might surround this expression
842 /// until reaching a fixed point. Skips:
843 /// * What IgnoreImpCasts() skips
844 /// * MaterializeTemporaryExpr
845 /// * CXXBindTemporaryExpr
846 Expr *IgnoreImplicit() LLVM_READONLY;
IgnoreImplicit()847 const Expr *IgnoreImplicit() const {
848 return const_cast<Expr *>(this)->IgnoreImplicit();
849 }
850
851 /// Skip past any implicit AST nodes which might surround this expression
852 /// until reaching a fixed point. Same as IgnoreImplicit, except that it
853 /// also skips over implicit calls to constructors and conversion functions.
854 ///
855 /// FIXME: Should IgnoreImplicit do this?
856 Expr *IgnoreImplicitAsWritten() LLVM_READONLY;
IgnoreImplicitAsWritten()857 const Expr *IgnoreImplicitAsWritten() const {
858 return const_cast<Expr *>(this)->IgnoreImplicitAsWritten();
859 }
860
861 /// Skip past any parentheses which might surround this expression until
862 /// reaching a fixed point. Skips:
863 /// * ParenExpr
864 /// * UnaryOperator if `UO_Extension`
865 /// * GenericSelectionExpr if `!isResultDependent()`
866 /// * ChooseExpr if `!isConditionDependent()`
867 /// * ConstantExpr
868 Expr *IgnoreParens() LLVM_READONLY;
IgnoreParens()869 const Expr *IgnoreParens() const {
870 return const_cast<Expr *>(this)->IgnoreParens();
871 }
872
873 /// Skip past any parentheses and implicit casts which might surround this
874 /// expression until reaching a fixed point.
875 /// FIXME: IgnoreParenImpCasts really ought to be equivalent to
876 /// IgnoreParens() + IgnoreImpCasts() until reaching a fixed point. However
877 /// this is currently not the case. Instead IgnoreParenImpCasts() skips:
878 /// * What IgnoreParens() skips
879 /// * What IgnoreImpCasts() skips
880 /// * MaterializeTemporaryExpr
881 /// * SubstNonTypeTemplateParmExpr
882 Expr *IgnoreParenImpCasts() LLVM_READONLY;
IgnoreParenImpCasts()883 const Expr *IgnoreParenImpCasts() const {
884 return const_cast<Expr *>(this)->IgnoreParenImpCasts();
885 }
886
887 /// Skip past any parentheses and casts which might surround this expression
888 /// until reaching a fixed point. Skips:
889 /// * What IgnoreParens() skips
890 /// * What IgnoreCasts() skips
891 Expr *IgnoreParenCasts() LLVM_READONLY;
IgnoreParenCasts()892 const Expr *IgnoreParenCasts() const {
893 return const_cast<Expr *>(this)->IgnoreParenCasts();
894 }
895
896 /// Skip conversion operators. If this Expr is a call to a conversion
897 /// operator, return the argument.
898 Expr *IgnoreConversionOperatorSingleStep() LLVM_READONLY;
IgnoreConversionOperatorSingleStep()899 const Expr *IgnoreConversionOperatorSingleStep() const {
900 return const_cast<Expr *>(this)->IgnoreConversionOperatorSingleStep();
901 }
902
903 /// Skip past any parentheses and lvalue casts which might surround this
904 /// expression until reaching a fixed point. Skips:
905 /// * What IgnoreParens() skips
906 /// * What IgnoreCasts() skips, except that only lvalue-to-rvalue
907 /// casts are skipped
908 /// FIXME: This is intended purely as a temporary workaround for code
909 /// that hasn't yet been rewritten to do the right thing about those
910 /// casts, and may disappear along with the last internal use.
911 Expr *IgnoreParenLValueCasts() LLVM_READONLY;
IgnoreParenLValueCasts()912 const Expr *IgnoreParenLValueCasts() const {
913 return const_cast<Expr *>(this)->IgnoreParenLValueCasts();
914 }
915
916 /// Skip past any parenthese and casts which do not change the value
917 /// (including ptr->int casts of the same size) until reaching a fixed point.
918 /// Skips:
919 /// * What IgnoreParens() skips
920 /// * CastExpr which do not change the value
921 /// * SubstNonTypeTemplateParmExpr
922 Expr *IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY;
IgnoreParenNoopCasts(const ASTContext & Ctx)923 const Expr *IgnoreParenNoopCasts(const ASTContext &Ctx) const {
924 return const_cast<Expr *>(this)->IgnoreParenNoopCasts(Ctx);
925 }
926
927 /// Skip past any parentheses and derived-to-base casts until reaching a
928 /// fixed point. Skips:
929 /// * What IgnoreParens() skips
930 /// * CastExpr which represent a derived-to-base cast (CK_DerivedToBase,
931 /// CK_UncheckedDerivedToBase and CK_NoOp)
932 Expr *IgnoreParenBaseCasts() LLVM_READONLY;
IgnoreParenBaseCasts()933 const Expr *IgnoreParenBaseCasts() const {
934 return const_cast<Expr *>(this)->IgnoreParenBaseCasts();
935 }
936
937 /// Determine whether this expression is a default function argument.
938 ///
939 /// Default arguments are implicitly generated in the abstract syntax tree
940 /// by semantic analysis for function calls, object constructions, etc. in
941 /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes;
942 /// this routine also looks through any implicit casts to determine whether
943 /// the expression is a default argument.
944 bool isDefaultArgument() const;
945
946 /// Determine whether the result of this expression is a
947 /// temporary object of the given class type.
948 bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const;
949
950 /// Whether this expression is an implicit reference to 'this' in C++.
951 bool isImplicitCXXThis() const;
952
953 static bool hasAnyTypeDependentArguments(ArrayRef<Expr *> Exprs);
954
955 /// For an expression of class type or pointer to class type,
956 /// return the most derived class decl the expression is known to refer to.
957 ///
958 /// If this expression is a cast, this method looks through it to find the
959 /// most derived decl that can be inferred from the expression.
960 /// This is valid because derived-to-base conversions have undefined
961 /// behavior if the object isn't dynamically of the derived type.
962 const CXXRecordDecl *getBestDynamicClassType() const;
963
964 /// Get the inner expression that determines the best dynamic class.
965 /// If this is a prvalue, we guarantee that it is of the most-derived type
966 /// for the object itself.
967 const Expr *getBestDynamicClassTypeExpr() const;
968
969 /// Walk outwards from an expression we want to bind a reference to and
970 /// find the expression whose lifetime needs to be extended. Record
971 /// the LHSs of comma expressions and adjustments needed along the path.
972 const Expr *skipRValueSubobjectAdjustments(
973 SmallVectorImpl<const Expr *> &CommaLHS,
974 SmallVectorImpl<SubobjectAdjustment> &Adjustments) const;
skipRValueSubobjectAdjustments()975 const Expr *skipRValueSubobjectAdjustments() const {
976 SmallVector<const Expr *, 8> CommaLHSs;
977 SmallVector<SubobjectAdjustment, 8> Adjustments;
978 return skipRValueSubobjectAdjustments(CommaLHSs, Adjustments);
979 }
980
981 /// Checks that the two Expr's will refer to the same value as a comparison
982 /// operand. The caller must ensure that the values referenced by the Expr's
983 /// are not modified between E1 and E2 or the result my be invalid.
984 static bool isSameComparisonOperand(const Expr* E1, const Expr* E2);
985
classof(const Stmt * T)986 static bool classof(const Stmt *T) {
987 return T->getStmtClass() >= firstExprConstant &&
988 T->getStmtClass() <= lastExprConstant;
989 }
990 };
991 // PointerLikeTypeTraits is specialized so it can be used with a forward-decl of
992 // Expr. Verify that we got it right.
993 static_assert(llvm::PointerLikeTypeTraits<Expr *>::NumLowBitsAvailable <=
994 llvm::detail::ConstantLog2<alignof(Expr)>::value,
995 "PointerLikeTypeTraits<Expr*> assumes too much alignment.");
996
997 using ConstantExprKind = Expr::ConstantExprKind;
998
999 //===----------------------------------------------------------------------===//
1000 // Wrapper Expressions.
1001 //===----------------------------------------------------------------------===//
1002
1003 /// FullExpr - Represents a "full-expression" node.
1004 class FullExpr : public Expr {
1005 protected:
1006 Stmt *SubExpr;
1007
FullExpr(StmtClass SC,Expr * subexpr)1008 FullExpr(StmtClass SC, Expr *subexpr)
1009 : Expr(SC, subexpr->getType(), subexpr->getValueKind(),
1010 subexpr->getObjectKind()),
1011 SubExpr(subexpr) {
1012 setDependence(computeDependence(this));
1013 }
FullExpr(StmtClass SC,EmptyShell Empty)1014 FullExpr(StmtClass SC, EmptyShell Empty)
1015 : Expr(SC, Empty) {}
1016 public:
getSubExpr()1017 const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
getSubExpr()1018 Expr *getSubExpr() { return cast<Expr>(SubExpr); }
1019
1020 /// As with any mutator of the AST, be very careful when modifying an
1021 /// existing AST to preserve its invariants.
setSubExpr(Expr * E)1022 void setSubExpr(Expr *E) { SubExpr = E; }
1023
classof(const Stmt * T)1024 static bool classof(const Stmt *T) {
1025 return T->getStmtClass() >= firstFullExprConstant &&
1026 T->getStmtClass() <= lastFullExprConstant;
1027 }
1028 };
1029
1030 /// ConstantExpr - An expression that occurs in a constant context and
1031 /// optionally the result of evaluating the expression.
1032 class ConstantExpr final
1033 : public FullExpr,
1034 private llvm::TrailingObjects<ConstantExpr, APValue, uint64_t> {
1035 static_assert(std::is_same<uint64_t, llvm::APInt::WordType>::value,
1036 "ConstantExpr assumes that llvm::APInt::WordType is uint64_t "
1037 "for tail-allocated storage");
1038 friend TrailingObjects;
1039 friend class ASTStmtReader;
1040 friend class ASTStmtWriter;
1041
1042 public:
1043 /// Describes the kind of result that can be tail-allocated.
1044 enum ResultStorageKind { RSK_None, RSK_Int64, RSK_APValue };
1045
1046 private:
numTrailingObjects(OverloadToken<APValue>)1047 size_t numTrailingObjects(OverloadToken<APValue>) const {
1048 return ConstantExprBits.ResultKind == ConstantExpr::RSK_APValue;
1049 }
numTrailingObjects(OverloadToken<uint64_t>)1050 size_t numTrailingObjects(OverloadToken<uint64_t>) const {
1051 return ConstantExprBits.ResultKind == ConstantExpr::RSK_Int64;
1052 }
1053
Int64Result()1054 uint64_t &Int64Result() {
1055 assert(ConstantExprBits.ResultKind == ConstantExpr::RSK_Int64 &&
1056 "invalid accessor");
1057 return *getTrailingObjects<uint64_t>();
1058 }
Int64Result()1059 const uint64_t &Int64Result() const {
1060 return const_cast<ConstantExpr *>(this)->Int64Result();
1061 }
APValueResult()1062 APValue &APValueResult() {
1063 assert(ConstantExprBits.ResultKind == ConstantExpr::RSK_APValue &&
1064 "invalid accessor");
1065 return *getTrailingObjects<APValue>();
1066 }
APValueResult()1067 APValue &APValueResult() const {
1068 return const_cast<ConstantExpr *>(this)->APValueResult();
1069 }
1070
1071 ConstantExpr(Expr *SubExpr, ResultStorageKind StorageKind,
1072 bool IsImmediateInvocation);
1073 ConstantExpr(EmptyShell Empty, ResultStorageKind StorageKind);
1074
1075 public:
1076 static ConstantExpr *Create(const ASTContext &Context, Expr *E,
1077 const APValue &Result);
1078 static ConstantExpr *Create(const ASTContext &Context, Expr *E,
1079 ResultStorageKind Storage = RSK_None,
1080 bool IsImmediateInvocation = false);
1081 static ConstantExpr *CreateEmpty(const ASTContext &Context,
1082 ResultStorageKind StorageKind);
1083
1084 static ResultStorageKind getStorageKind(const APValue &Value);
1085 static ResultStorageKind getStorageKind(const Type *T,
1086 const ASTContext &Context);
1087
getBeginLoc()1088 SourceLocation getBeginLoc() const LLVM_READONLY {
1089 return SubExpr->getBeginLoc();
1090 }
getEndLoc()1091 SourceLocation getEndLoc() const LLVM_READONLY {
1092 return SubExpr->getEndLoc();
1093 }
1094
classof(const Stmt * T)1095 static bool classof(const Stmt *T) {
1096 return T->getStmtClass() == ConstantExprClass;
1097 }
1098
SetResult(APValue Value,const ASTContext & Context)1099 void SetResult(APValue Value, const ASTContext &Context) {
1100 MoveIntoResult(Value, Context);
1101 }
1102 void MoveIntoResult(APValue &Value, const ASTContext &Context);
1103
getResultAPValueKind()1104 APValue::ValueKind getResultAPValueKind() const {
1105 return static_cast<APValue::ValueKind>(ConstantExprBits.APValueKind);
1106 }
getResultStorageKind()1107 ResultStorageKind getResultStorageKind() const {
1108 return static_cast<ResultStorageKind>(ConstantExprBits.ResultKind);
1109 }
isImmediateInvocation()1110 bool isImmediateInvocation() const {
1111 return ConstantExprBits.IsImmediateInvocation;
1112 }
hasAPValueResult()1113 bool hasAPValueResult() const {
1114 return ConstantExprBits.APValueKind != APValue::None;
1115 }
1116 APValue getAPValueResult() const;
getResultAsAPValue()1117 APValue &getResultAsAPValue() const { return APValueResult(); }
1118 llvm::APSInt getResultAsAPSInt() const;
1119 // Iterators
children()1120 child_range children() { return child_range(&SubExpr, &SubExpr+1); }
children()1121 const_child_range children() const {
1122 return const_child_range(&SubExpr, &SubExpr + 1);
1123 }
1124 };
1125
1126 //===----------------------------------------------------------------------===//
1127 // Primary Expressions.
1128 //===----------------------------------------------------------------------===//
1129
1130 /// OpaqueValueExpr - An expression referring to an opaque object of a
1131 /// fixed type and value class. These don't correspond to concrete
1132 /// syntax; instead they're used to express operations (usually copy
1133 /// operations) on values whose source is generally obvious from
1134 /// context.
1135 class OpaqueValueExpr : public Expr {
1136 friend class ASTStmtReader;
1137 Expr *SourceExpr;
1138
1139 public:
1140 OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK,
1141 ExprObjectKind OK = OK_Ordinary, Expr *SourceExpr = nullptr)
Expr(OpaqueValueExprClass,T,VK,OK)1142 : Expr(OpaqueValueExprClass, T, VK, OK), SourceExpr(SourceExpr) {
1143 setIsUnique(false);
1144 OpaqueValueExprBits.Loc = Loc;
1145 setDependence(computeDependence(this));
1146 }
1147
1148 /// Given an expression which invokes a copy constructor --- i.e. a
1149 /// CXXConstructExpr, possibly wrapped in an ExprWithCleanups ---
1150 /// find the OpaqueValueExpr that's the source of the construction.
1151 static const OpaqueValueExpr *findInCopyConstruct(const Expr *expr);
1152
OpaqueValueExpr(EmptyShell Empty)1153 explicit OpaqueValueExpr(EmptyShell Empty)
1154 : Expr(OpaqueValueExprClass, Empty) {}
1155
1156 /// Retrieve the location of this expression.
getLocation()1157 SourceLocation getLocation() const { return OpaqueValueExprBits.Loc; }
1158
getBeginLoc()1159 SourceLocation getBeginLoc() const LLVM_READONLY {
1160 return SourceExpr ? SourceExpr->getBeginLoc() : getLocation();
1161 }
getEndLoc()1162 SourceLocation getEndLoc() const LLVM_READONLY {
1163 return SourceExpr ? SourceExpr->getEndLoc() : getLocation();
1164 }
getExprLoc()1165 SourceLocation getExprLoc() const LLVM_READONLY {
1166 return SourceExpr ? SourceExpr->getExprLoc() : getLocation();
1167 }
1168
children()1169 child_range children() {
1170 return child_range(child_iterator(), child_iterator());
1171 }
1172
children()1173 const_child_range children() const {
1174 return const_child_range(const_child_iterator(), const_child_iterator());
1175 }
1176
1177 /// The source expression of an opaque value expression is the
1178 /// expression which originally generated the value. This is
1179 /// provided as a convenience for analyses that don't wish to
1180 /// precisely model the execution behavior of the program.
1181 ///
1182 /// The source expression is typically set when building the
1183 /// expression which binds the opaque value expression in the first
1184 /// place.
getSourceExpr()1185 Expr *getSourceExpr() const { return SourceExpr; }
1186
setIsUnique(bool V)1187 void setIsUnique(bool V) {
1188 assert((!V || SourceExpr) &&
1189 "unique OVEs are expected to have source expressions");
1190 OpaqueValueExprBits.IsUnique = V;
1191 }
1192
isUnique()1193 bool isUnique() const { return OpaqueValueExprBits.IsUnique; }
1194
classof(const Stmt * T)1195 static bool classof(const Stmt *T) {
1196 return T->getStmtClass() == OpaqueValueExprClass;
1197 }
1198 };
1199
1200 /// A reference to a declared variable, function, enum, etc.
1201 /// [C99 6.5.1p2]
1202 ///
1203 /// This encodes all the information about how a declaration is referenced
1204 /// within an expression.
1205 ///
1206 /// There are several optional constructs attached to DeclRefExprs only when
1207 /// they apply in order to conserve memory. These are laid out past the end of
1208 /// the object, and flags in the DeclRefExprBitfield track whether they exist:
1209 ///
1210 /// DeclRefExprBits.HasQualifier:
1211 /// Specifies when this declaration reference expression has a C++
1212 /// nested-name-specifier.
1213 /// DeclRefExprBits.HasFoundDecl:
1214 /// Specifies when this declaration reference expression has a record of
1215 /// a NamedDecl (different from the referenced ValueDecl) which was found
1216 /// during name lookup and/or overload resolution.
1217 /// DeclRefExprBits.HasTemplateKWAndArgsInfo:
1218 /// Specifies when this declaration reference expression has an explicit
1219 /// C++ template keyword and/or template argument list.
1220 /// DeclRefExprBits.RefersToEnclosingVariableOrCapture
1221 /// Specifies when this declaration reference expression (validly)
1222 /// refers to an enclosed local or a captured variable.
1223 class DeclRefExpr final
1224 : public Expr,
1225 private llvm::TrailingObjects<DeclRefExpr, NestedNameSpecifierLoc,
1226 NamedDecl *, ASTTemplateKWAndArgsInfo,
1227 TemplateArgumentLoc> {
1228 friend class ASTStmtReader;
1229 friend class ASTStmtWriter;
1230 friend TrailingObjects;
1231
1232 /// The declaration that we are referencing.
1233 ValueDecl *D;
1234
1235 /// Provides source/type location info for the declaration name
1236 /// embedded in D.
1237 DeclarationNameLoc DNLoc;
1238
numTrailingObjects(OverloadToken<NestedNameSpecifierLoc>)1239 size_t numTrailingObjects(OverloadToken<NestedNameSpecifierLoc>) const {
1240 return hasQualifier();
1241 }
1242
numTrailingObjects(OverloadToken<NamedDecl * >)1243 size_t numTrailingObjects(OverloadToken<NamedDecl *>) const {
1244 return hasFoundDecl();
1245 }
1246
numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>)1247 size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
1248 return hasTemplateKWAndArgsInfo();
1249 }
1250
1251 /// Test whether there is a distinct FoundDecl attached to the end of
1252 /// this DRE.
hasFoundDecl()1253 bool hasFoundDecl() const { return DeclRefExprBits.HasFoundDecl; }
1254
1255 DeclRefExpr(const ASTContext &Ctx, NestedNameSpecifierLoc QualifierLoc,
1256 SourceLocation TemplateKWLoc, ValueDecl *D,
1257 bool RefersToEnlosingVariableOrCapture,
1258 const DeclarationNameInfo &NameInfo, NamedDecl *FoundD,
1259 const TemplateArgumentListInfo *TemplateArgs, QualType T,
1260 ExprValueKind VK, NonOdrUseReason NOUR);
1261
1262 /// Construct an empty declaration reference expression.
DeclRefExpr(EmptyShell Empty)1263 explicit DeclRefExpr(EmptyShell Empty) : Expr(DeclRefExprClass, Empty) {}
1264
1265 public:
1266 DeclRefExpr(const ASTContext &Ctx, ValueDecl *D,
1267 bool RefersToEnclosingVariableOrCapture, QualType T,
1268 ExprValueKind VK, SourceLocation L,
1269 const DeclarationNameLoc &LocInfo = DeclarationNameLoc(),
1270 NonOdrUseReason NOUR = NOUR_None);
1271
1272 static DeclRefExpr *
1273 Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
1274 SourceLocation TemplateKWLoc, ValueDecl *D,
1275 bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc,
1276 QualType T, ExprValueKind VK, NamedDecl *FoundD = nullptr,
1277 const TemplateArgumentListInfo *TemplateArgs = nullptr,
1278 NonOdrUseReason NOUR = NOUR_None);
1279
1280 static DeclRefExpr *
1281 Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
1282 SourceLocation TemplateKWLoc, ValueDecl *D,
1283 bool RefersToEnclosingVariableOrCapture,
1284 const DeclarationNameInfo &NameInfo, QualType T, ExprValueKind VK,
1285 NamedDecl *FoundD = nullptr,
1286 const TemplateArgumentListInfo *TemplateArgs = nullptr,
1287 NonOdrUseReason NOUR = NOUR_None);
1288
1289 /// Construct an empty declaration reference expression.
1290 static DeclRefExpr *CreateEmpty(const ASTContext &Context, bool HasQualifier,
1291 bool HasFoundDecl,
1292 bool HasTemplateKWAndArgsInfo,
1293 unsigned NumTemplateArgs);
1294
getDecl()1295 ValueDecl *getDecl() { return D; }
getDecl()1296 const ValueDecl *getDecl() const { return D; }
1297 void setDecl(ValueDecl *NewD);
1298
getNameInfo()1299 DeclarationNameInfo getNameInfo() const {
1300 return DeclarationNameInfo(getDecl()->getDeclName(), getLocation(), DNLoc);
1301 }
1302
getLocation()1303 SourceLocation getLocation() const { return DeclRefExprBits.Loc; }
setLocation(SourceLocation L)1304 void setLocation(SourceLocation L) { DeclRefExprBits.Loc = L; }
1305 SourceLocation getBeginLoc() const LLVM_READONLY;
1306 SourceLocation getEndLoc() const LLVM_READONLY;
1307
1308 /// Determine whether this declaration reference was preceded by a
1309 /// C++ nested-name-specifier, e.g., \c N::foo.
hasQualifier()1310 bool hasQualifier() const { return DeclRefExprBits.HasQualifier; }
1311
1312 /// If the name was qualified, retrieves the nested-name-specifier
1313 /// that precedes the name, with source-location information.
getQualifierLoc()1314 NestedNameSpecifierLoc getQualifierLoc() const {
1315 if (!hasQualifier())
1316 return NestedNameSpecifierLoc();
1317 return *getTrailingObjects<NestedNameSpecifierLoc>();
1318 }
1319
1320 /// If the name was qualified, retrieves the nested-name-specifier
1321 /// that precedes the name. Otherwise, returns NULL.
getQualifier()1322 NestedNameSpecifier *getQualifier() const {
1323 return getQualifierLoc().getNestedNameSpecifier();
1324 }
1325
1326 /// Get the NamedDecl through which this reference occurred.
1327 ///
1328 /// This Decl may be different from the ValueDecl actually referred to in the
1329 /// presence of using declarations, etc. It always returns non-NULL, and may
1330 /// simple return the ValueDecl when appropriate.
1331
getFoundDecl()1332 NamedDecl *getFoundDecl() {
1333 return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D;
1334 }
1335
1336 /// Get the NamedDecl through which this reference occurred.
1337 /// See non-const variant.
getFoundDecl()1338 const NamedDecl *getFoundDecl() const {
1339 return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D;
1340 }
1341
hasTemplateKWAndArgsInfo()1342 bool hasTemplateKWAndArgsInfo() const {
1343 return DeclRefExprBits.HasTemplateKWAndArgsInfo;
1344 }
1345
1346 /// Retrieve the location of the template keyword preceding
1347 /// this name, if any.
getTemplateKeywordLoc()1348 SourceLocation getTemplateKeywordLoc() const {
1349 if (!hasTemplateKWAndArgsInfo())
1350 return SourceLocation();
1351 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
1352 }
1353
1354 /// Retrieve the location of the left angle bracket starting the
1355 /// explicit template argument list following the name, if any.
getLAngleLoc()1356 SourceLocation getLAngleLoc() const {
1357 if (!hasTemplateKWAndArgsInfo())
1358 return SourceLocation();
1359 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
1360 }
1361
1362 /// Retrieve the location of the right angle bracket ending the
1363 /// explicit template argument list following the name, if any.
getRAngleLoc()1364 SourceLocation getRAngleLoc() const {
1365 if (!hasTemplateKWAndArgsInfo())
1366 return SourceLocation();
1367 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
1368 }
1369
1370 /// Determines whether the name in this declaration reference
1371 /// was preceded by the template keyword.
hasTemplateKeyword()1372 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
1373
1374 /// Determines whether this declaration reference was followed by an
1375 /// explicit template argument list.
hasExplicitTemplateArgs()1376 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
1377
1378 /// Copies the template arguments (if present) into the given
1379 /// structure.
copyTemplateArgumentsInto(TemplateArgumentListInfo & List)1380 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
1381 if (hasExplicitTemplateArgs())
1382 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
1383 getTrailingObjects<TemplateArgumentLoc>(), List);
1384 }
1385
1386 /// Retrieve the template arguments provided as part of this
1387 /// template-id.
getTemplateArgs()1388 const TemplateArgumentLoc *getTemplateArgs() const {
1389 if (!hasExplicitTemplateArgs())
1390 return nullptr;
1391 return getTrailingObjects<TemplateArgumentLoc>();
1392 }
1393
1394 /// Retrieve the number of template arguments provided as part of this
1395 /// template-id.
getNumTemplateArgs()1396 unsigned getNumTemplateArgs() const {
1397 if (!hasExplicitTemplateArgs())
1398 return 0;
1399 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
1400 }
1401
template_arguments()1402 ArrayRef<TemplateArgumentLoc> template_arguments() const {
1403 return {getTemplateArgs(), getNumTemplateArgs()};
1404 }
1405
1406 /// Returns true if this expression refers to a function that
1407 /// was resolved from an overloaded set having size greater than 1.
hadMultipleCandidates()1408 bool hadMultipleCandidates() const {
1409 return DeclRefExprBits.HadMultipleCandidates;
1410 }
1411 /// Sets the flag telling whether this expression refers to
1412 /// a function that was resolved from an overloaded set having size
1413 /// greater than 1.
1414 void setHadMultipleCandidates(bool V = true) {
1415 DeclRefExprBits.HadMultipleCandidates = V;
1416 }
1417
1418 /// Is this expression a non-odr-use reference, and if so, why?
isNonOdrUse()1419 NonOdrUseReason isNonOdrUse() const {
1420 return static_cast<NonOdrUseReason>(DeclRefExprBits.NonOdrUseReason);
1421 }
1422
1423 /// Does this DeclRefExpr refer to an enclosing local or a captured
1424 /// variable?
refersToEnclosingVariableOrCapture()1425 bool refersToEnclosingVariableOrCapture() const {
1426 return DeclRefExprBits.RefersToEnclosingVariableOrCapture;
1427 }
1428
classof(const Stmt * T)1429 static bool classof(const Stmt *T) {
1430 return T->getStmtClass() == DeclRefExprClass;
1431 }
1432
1433 // Iterators
children()1434 child_range children() {
1435 return child_range(child_iterator(), child_iterator());
1436 }
1437
children()1438 const_child_range children() const {
1439 return const_child_range(const_child_iterator(), const_child_iterator());
1440 }
1441 };
1442
1443 /// Used by IntegerLiteral/FloatingLiteral to store the numeric without
1444 /// leaking memory.
1445 ///
1446 /// For large floats/integers, APFloat/APInt will allocate memory from the heap
1447 /// to represent these numbers. Unfortunately, when we use a BumpPtrAllocator
1448 /// to allocate IntegerLiteral/FloatingLiteral nodes the memory associated with
1449 /// the APFloat/APInt values will never get freed. APNumericStorage uses
1450 /// ASTContext's allocator for memory allocation.
1451 class APNumericStorage {
1452 union {
1453 uint64_t VAL; ///< Used to store the <= 64 bits integer value.
1454 uint64_t *pVal; ///< Used to store the >64 bits integer value.
1455 };
1456 unsigned BitWidth;
1457
hasAllocation()1458 bool hasAllocation() const { return llvm::APInt::getNumWords(BitWidth) > 1; }
1459
1460 APNumericStorage(const APNumericStorage &) = delete;
1461 void operator=(const APNumericStorage &) = delete;
1462
1463 protected:
APNumericStorage()1464 APNumericStorage() : VAL(0), BitWidth(0) { }
1465
getIntValue()1466 llvm::APInt getIntValue() const {
1467 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
1468 if (NumWords > 1)
1469 return llvm::APInt(BitWidth, NumWords, pVal);
1470 else
1471 return llvm::APInt(BitWidth, VAL);
1472 }
1473 void setIntValue(const ASTContext &C, const llvm::APInt &Val);
1474 };
1475
1476 class APIntStorage : private APNumericStorage {
1477 public:
getValue()1478 llvm::APInt getValue() const { return getIntValue(); }
setValue(const ASTContext & C,const llvm::APInt & Val)1479 void setValue(const ASTContext &C, const llvm::APInt &Val) {
1480 setIntValue(C, Val);
1481 }
1482 };
1483
1484 class APFloatStorage : private APNumericStorage {
1485 public:
getValue(const llvm::fltSemantics & Semantics)1486 llvm::APFloat getValue(const llvm::fltSemantics &Semantics) const {
1487 return llvm::APFloat(Semantics, getIntValue());
1488 }
setValue(const ASTContext & C,const llvm::APFloat & Val)1489 void setValue(const ASTContext &C, const llvm::APFloat &Val) {
1490 setIntValue(C, Val.bitcastToAPInt());
1491 }
1492 };
1493
1494 class IntegerLiteral : public Expr, public APIntStorage {
1495 SourceLocation Loc;
1496
1497 /// Construct an empty integer literal.
IntegerLiteral(EmptyShell Empty)1498 explicit IntegerLiteral(EmptyShell Empty)
1499 : Expr(IntegerLiteralClass, Empty) { }
1500
1501 public:
1502 // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy,
1503 // or UnsignedLongLongTy
1504 IntegerLiteral(const ASTContext &C, const llvm::APInt &V, QualType type,
1505 SourceLocation l);
1506
1507 /// Returns a new integer literal with value 'V' and type 'type'.
1508 /// \param type - either IntTy, LongTy, LongLongTy, UnsignedIntTy,
1509 /// UnsignedLongTy, or UnsignedLongLongTy which should match the size of V
1510 /// \param V - the value that the returned integer literal contains.
1511 static IntegerLiteral *Create(const ASTContext &C, const llvm::APInt &V,
1512 QualType type, SourceLocation l);
1513 /// Returns a new empty integer literal.
1514 static IntegerLiteral *Create(const ASTContext &C, EmptyShell Empty);
1515
getBeginLoc()1516 SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
getEndLoc()1517 SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }
1518
1519 /// Retrieve the location of the literal.
getLocation()1520 SourceLocation getLocation() const { return Loc; }
1521
setLocation(SourceLocation Location)1522 void setLocation(SourceLocation Location) { Loc = Location; }
1523
classof(const Stmt * T)1524 static bool classof(const Stmt *T) {
1525 return T->getStmtClass() == IntegerLiteralClass;
1526 }
1527
1528 // Iterators
children()1529 child_range children() {
1530 return child_range(child_iterator(), child_iterator());
1531 }
children()1532 const_child_range children() const {
1533 return const_child_range(const_child_iterator(), const_child_iterator());
1534 }
1535 };
1536
1537 class FixedPointLiteral : public Expr, public APIntStorage {
1538 SourceLocation Loc;
1539 unsigned Scale;
1540
1541 /// \brief Construct an empty fixed-point literal.
FixedPointLiteral(EmptyShell Empty)1542 explicit FixedPointLiteral(EmptyShell Empty)
1543 : Expr(FixedPointLiteralClass, Empty) {}
1544
1545 public:
1546 FixedPointLiteral(const ASTContext &C, const llvm::APInt &V, QualType type,
1547 SourceLocation l, unsigned Scale);
1548
1549 // Store the int as is without any bit shifting.
1550 static FixedPointLiteral *CreateFromRawInt(const ASTContext &C,
1551 const llvm::APInt &V,
1552 QualType type, SourceLocation l,
1553 unsigned Scale);
1554
1555 /// Returns an empty fixed-point literal.
1556 static FixedPointLiteral *Create(const ASTContext &C, EmptyShell Empty);
1557
getBeginLoc()1558 SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
getEndLoc()1559 SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }
1560
1561 /// \brief Retrieve the location of the literal.
getLocation()1562 SourceLocation getLocation() const { return Loc; }
1563
setLocation(SourceLocation Location)1564 void setLocation(SourceLocation Location) { Loc = Location; }
1565
getScale()1566 unsigned getScale() const { return Scale; }
setScale(unsigned S)1567 void setScale(unsigned S) { Scale = S; }
1568
classof(const Stmt * T)1569 static bool classof(const Stmt *T) {
1570 return T->getStmtClass() == FixedPointLiteralClass;
1571 }
1572
1573 std::string getValueAsString(unsigned Radix) const;
1574
1575 // Iterators
children()1576 child_range children() {
1577 return child_range(child_iterator(), child_iterator());
1578 }
children()1579 const_child_range children() const {
1580 return const_child_range(const_child_iterator(), const_child_iterator());
1581 }
1582 };
1583
1584 class CharacterLiteral : public Expr {
1585 public:
1586 enum CharacterKind {
1587 Ascii,
1588 Wide,
1589 UTF8,
1590 UTF16,
1591 UTF32
1592 };
1593
1594 private:
1595 unsigned Value;
1596 SourceLocation Loc;
1597 public:
1598 // type should be IntTy
CharacterLiteral(unsigned value,CharacterKind kind,QualType type,SourceLocation l)1599 CharacterLiteral(unsigned value, CharacterKind kind, QualType type,
1600 SourceLocation l)
1601 : Expr(CharacterLiteralClass, type, VK_PRValue, OK_Ordinary),
1602 Value(value), Loc(l) {
1603 CharacterLiteralBits.Kind = kind;
1604 setDependence(ExprDependence::None);
1605 }
1606
1607 /// Construct an empty character literal.
CharacterLiteral(EmptyShell Empty)1608 CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { }
1609
getLocation()1610 SourceLocation getLocation() const { return Loc; }
getKind()1611 CharacterKind getKind() const {
1612 return static_cast<CharacterKind>(CharacterLiteralBits.Kind);
1613 }
1614
getBeginLoc()1615 SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
getEndLoc()1616 SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }
1617
getValue()1618 unsigned getValue() const { return Value; }
1619
setLocation(SourceLocation Location)1620 void setLocation(SourceLocation Location) { Loc = Location; }
setKind(CharacterKind kind)1621 void setKind(CharacterKind kind) { CharacterLiteralBits.Kind = kind; }
setValue(unsigned Val)1622 void setValue(unsigned Val) { Value = Val; }
1623
classof(const Stmt * T)1624 static bool classof(const Stmt *T) {
1625 return T->getStmtClass() == CharacterLiteralClass;
1626 }
1627
1628 static void print(unsigned val, CharacterKind Kind, raw_ostream &OS);
1629
1630 // Iterators
children()1631 child_range children() {
1632 return child_range(child_iterator(), child_iterator());
1633 }
children()1634 const_child_range children() const {
1635 return const_child_range(const_child_iterator(), const_child_iterator());
1636 }
1637 };
1638
1639 class FloatingLiteral : public Expr, private APFloatStorage {
1640 SourceLocation Loc;
1641
1642 FloatingLiteral(const ASTContext &C, const llvm::APFloat &V, bool isexact,
1643 QualType Type, SourceLocation L);
1644
1645 /// Construct an empty floating-point literal.
1646 explicit FloatingLiteral(const ASTContext &C, EmptyShell Empty);
1647
1648 public:
1649 static FloatingLiteral *Create(const ASTContext &C, const llvm::APFloat &V,
1650 bool isexact, QualType Type, SourceLocation L);
1651 static FloatingLiteral *Create(const ASTContext &C, EmptyShell Empty);
1652
getValue()1653 llvm::APFloat getValue() const {
1654 return APFloatStorage::getValue(getSemantics());
1655 }
setValue(const ASTContext & C,const llvm::APFloat & Val)1656 void setValue(const ASTContext &C, const llvm::APFloat &Val) {
1657 assert(&getSemantics() == &Val.getSemantics() && "Inconsistent semantics");
1658 APFloatStorage::setValue(C, Val);
1659 }
1660
1661 /// Get a raw enumeration value representing the floating-point semantics of
1662 /// this literal (32-bit IEEE, x87, ...), suitable for serialisation.
getRawSemantics()1663 llvm::APFloatBase::Semantics getRawSemantics() const {
1664 return static_cast<llvm::APFloatBase::Semantics>(
1665 FloatingLiteralBits.Semantics);
1666 }
1667
1668 /// Set the raw enumeration value representing the floating-point semantics of
1669 /// this literal (32-bit IEEE, x87, ...), suitable for serialisation.
setRawSemantics(llvm::APFloatBase::Semantics Sem)1670 void setRawSemantics(llvm::APFloatBase::Semantics Sem) {
1671 FloatingLiteralBits.Semantics = Sem;
1672 }
1673
1674 /// Return the APFloat semantics this literal uses.
getSemantics()1675 const llvm::fltSemantics &getSemantics() const {
1676 return llvm::APFloatBase::EnumToSemantics(
1677 static_cast<llvm::APFloatBase::Semantics>(
1678 FloatingLiteralBits.Semantics));
1679 }
1680
1681 /// Set the APFloat semantics this literal uses.
setSemantics(const llvm::fltSemantics & Sem)1682 void setSemantics(const llvm::fltSemantics &Sem) {
1683 FloatingLiteralBits.Semantics = llvm::APFloatBase::SemanticsToEnum(Sem);
1684 }
1685
isExact()1686 bool isExact() const { return FloatingLiteralBits.IsExact; }
setExact(bool E)1687 void setExact(bool E) { FloatingLiteralBits.IsExact = E; }
1688
1689 /// getValueAsApproximateDouble - This returns the value as an inaccurate
1690 /// double. Note that this may cause loss of precision, but is useful for
1691 /// debugging dumps, etc.
1692 double getValueAsApproximateDouble() const;
1693
getLocation()1694 SourceLocation getLocation() const { return Loc; }
setLocation(SourceLocation L)1695 void setLocation(SourceLocation L) { Loc = L; }
1696
getBeginLoc()1697 SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
getEndLoc()1698 SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }
1699
classof(const Stmt * T)1700 static bool classof(const Stmt *T) {
1701 return T->getStmtClass() == FloatingLiteralClass;
1702 }
1703
1704 // Iterators
children()1705 child_range children() {
1706 return child_range(child_iterator(), child_iterator());
1707 }
children()1708 const_child_range children() const {
1709 return const_child_range(const_child_iterator(), const_child_iterator());
1710 }
1711 };
1712
1713 /// ImaginaryLiteral - We support imaginary integer and floating point literals,
1714 /// like "1.0i". We represent these as a wrapper around FloatingLiteral and
1715 /// IntegerLiteral classes. Instances of this class always have a Complex type
1716 /// whose element type matches the subexpression.
1717 ///
1718 class ImaginaryLiteral : public Expr {
1719 Stmt *Val;
1720 public:
ImaginaryLiteral(Expr * val,QualType Ty)1721 ImaginaryLiteral(Expr *val, QualType Ty)
1722 : Expr(ImaginaryLiteralClass, Ty, VK_PRValue, OK_Ordinary), Val(val) {
1723 setDependence(ExprDependence::None);
1724 }
1725
1726 /// Build an empty imaginary literal.
ImaginaryLiteral(EmptyShell Empty)1727 explicit ImaginaryLiteral(EmptyShell Empty)
1728 : Expr(ImaginaryLiteralClass, Empty) { }
1729
getSubExpr()1730 const Expr *getSubExpr() const { return cast<Expr>(Val); }
getSubExpr()1731 Expr *getSubExpr() { return cast<Expr>(Val); }
setSubExpr(Expr * E)1732 void setSubExpr(Expr *E) { Val = E; }
1733
getBeginLoc()1734 SourceLocation getBeginLoc() const LLVM_READONLY {
1735 return Val->getBeginLoc();
1736 }
getEndLoc()1737 SourceLocation getEndLoc() const LLVM_READONLY { return Val->getEndLoc(); }
1738
classof(const Stmt * T)1739 static bool classof(const Stmt *T) {
1740 return T->getStmtClass() == ImaginaryLiteralClass;
1741 }
1742
1743 // Iterators
children()1744 child_range children() { return child_range(&Val, &Val+1); }
children()1745 const_child_range children() const {
1746 return const_child_range(&Val, &Val + 1);
1747 }
1748 };
1749
1750 /// StringLiteral - This represents a string literal expression, e.g. "foo"
1751 /// or L"bar" (wide strings). The actual string data can be obtained with
1752 /// getBytes() and is NOT null-terminated. The length of the string data is
1753 /// determined by calling getByteLength().
1754 ///
1755 /// The C type for a string is always a ConstantArrayType. In C++, the char
1756 /// type is const qualified, in C it is not.
1757 ///
1758 /// Note that strings in C can be formed by concatenation of multiple string
1759 /// literal pptokens in translation phase #6. This keeps track of the locations
1760 /// of each of these pieces.
1761 ///
1762 /// Strings in C can also be truncated and extended by assigning into arrays,
1763 /// e.g. with constructs like:
1764 /// char X[2] = "foobar";
1765 /// In this case, getByteLength() will return 6, but the string literal will
1766 /// have type "char[2]".
1767 class StringLiteral final
1768 : public Expr,
1769 private llvm::TrailingObjects<StringLiteral, unsigned, SourceLocation,
1770 char> {
1771 friend class ASTStmtReader;
1772 friend TrailingObjects;
1773
1774 /// StringLiteral is followed by several trailing objects. They are in order:
1775 ///
1776 /// * A single unsigned storing the length in characters of this string. The
1777 /// length in bytes is this length times the width of a single character.
1778 /// Always present and stored as a trailing objects because storing it in
1779 /// StringLiteral would increase the size of StringLiteral by sizeof(void *)
1780 /// due to alignment requirements. If you add some data to StringLiteral,
1781 /// consider moving it inside StringLiteral.
1782 ///
1783 /// * An array of getNumConcatenated() SourceLocation, one for each of the
1784 /// token this string is made of.
1785 ///
1786 /// * An array of getByteLength() char used to store the string data.
1787
1788 public:
1789 enum StringKind { Ordinary, Wide, UTF8, UTF16, UTF32 };
1790
1791 private:
numTrailingObjects(OverloadToken<unsigned>)1792 unsigned numTrailingObjects(OverloadToken<unsigned>) const { return 1; }
numTrailingObjects(OverloadToken<SourceLocation>)1793 unsigned numTrailingObjects(OverloadToken<SourceLocation>) const {
1794 return getNumConcatenated();
1795 }
1796
numTrailingObjects(OverloadToken<char>)1797 unsigned numTrailingObjects(OverloadToken<char>) const {
1798 return getByteLength();
1799 }
1800
getStrDataAsChar()1801 char *getStrDataAsChar() { return getTrailingObjects<char>(); }
getStrDataAsChar()1802 const char *getStrDataAsChar() const { return getTrailingObjects<char>(); }
1803
getStrDataAsUInt16()1804 const uint16_t *getStrDataAsUInt16() const {
1805 return reinterpret_cast<const uint16_t *>(getTrailingObjects<char>());
1806 }
1807
getStrDataAsUInt32()1808 const uint32_t *getStrDataAsUInt32() const {
1809 return reinterpret_cast<const uint32_t *>(getTrailingObjects<char>());
1810 }
1811
1812 /// Build a string literal.
1813 StringLiteral(const ASTContext &Ctx, StringRef Str, StringKind Kind,
1814 bool Pascal, QualType Ty, const SourceLocation *Loc,
1815 unsigned NumConcatenated);
1816
1817 /// Build an empty string literal.
1818 StringLiteral(EmptyShell Empty, unsigned NumConcatenated, unsigned Length,
1819 unsigned CharByteWidth);
1820
1821 /// Map a target and string kind to the appropriate character width.
1822 static unsigned mapCharByteWidth(TargetInfo const &Target, StringKind SK);
1823
1824 /// Set one of the string literal token.
setStrTokenLoc(unsigned TokNum,SourceLocation L)1825 void setStrTokenLoc(unsigned TokNum, SourceLocation L) {
1826 assert(TokNum < getNumConcatenated() && "Invalid tok number");
1827 getTrailingObjects<SourceLocation>()[TokNum] = L;
1828 }
1829
1830 public:
1831 /// This is the "fully general" constructor that allows representation of
1832 /// strings formed from multiple concatenated tokens.
1833 static StringLiteral *Create(const ASTContext &Ctx, StringRef Str,
1834 StringKind Kind, bool Pascal, QualType Ty,
1835 const SourceLocation *Loc,
1836 unsigned NumConcatenated);
1837
1838 /// Simple constructor for string literals made from one token.
Create(const ASTContext & Ctx,StringRef Str,StringKind Kind,bool Pascal,QualType Ty,SourceLocation Loc)1839 static StringLiteral *Create(const ASTContext &Ctx, StringRef Str,
1840 StringKind Kind, bool Pascal, QualType Ty,
1841 SourceLocation Loc) {
1842 return Create(Ctx, Str, Kind, Pascal, Ty, &Loc, 1);
1843 }
1844
1845 /// Construct an empty string literal.
1846 static StringLiteral *CreateEmpty(const ASTContext &Ctx,
1847 unsigned NumConcatenated, unsigned Length,
1848 unsigned CharByteWidth);
1849
getString()1850 StringRef getString() const {
1851 assert(getCharByteWidth() == 1 &&
1852 "This function is used in places that assume strings use char");
1853 return StringRef(getStrDataAsChar(), getByteLength());
1854 }
1855
1856 /// Allow access to clients that need the byte representation, such as
1857 /// ASTWriterStmt::VisitStringLiteral().
getBytes()1858 StringRef getBytes() const {
1859 // FIXME: StringRef may not be the right type to use as a result for this.
1860 return StringRef(getStrDataAsChar(), getByteLength());
1861 }
1862
1863 void outputString(raw_ostream &OS) const;
1864
getCodeUnit(size_t i)1865 uint32_t getCodeUnit(size_t i) const {
1866 assert(i < getLength() && "out of bounds access");
1867 switch (getCharByteWidth()) {
1868 case 1:
1869 return static_cast<unsigned char>(getStrDataAsChar()[i]);
1870 case 2:
1871 return getStrDataAsUInt16()[i];
1872 case 4:
1873 return getStrDataAsUInt32()[i];
1874 }
1875 llvm_unreachable("Unsupported character width!");
1876 }
1877
getByteLength()1878 unsigned getByteLength() const { return getCharByteWidth() * getLength(); }
getLength()1879 unsigned getLength() const { return *getTrailingObjects<unsigned>(); }
getCharByteWidth()1880 unsigned getCharByteWidth() const { return StringLiteralBits.CharByteWidth; }
1881
getKind()1882 StringKind getKind() const {
1883 return static_cast<StringKind>(StringLiteralBits.Kind);
1884 }
1885
isOrdinary()1886 bool isOrdinary() const { return getKind() == Ordinary; }
isWide()1887 bool isWide() const { return getKind() == Wide; }
isUTF8()1888 bool isUTF8() const { return getKind() == UTF8; }
isUTF16()1889 bool isUTF16() const { return getKind() == UTF16; }
isUTF32()1890 bool isUTF32() const { return getKind() == UTF32; }
isPascal()1891 bool isPascal() const { return StringLiteralBits.IsPascal; }
1892
containsNonAscii()1893 bool containsNonAscii() const {
1894 for (auto c : getString())
1895 if (!isASCII(c))
1896 return true;
1897 return false;
1898 }
1899
containsNonAsciiOrNull()1900 bool containsNonAsciiOrNull() const {
1901 for (auto c : getString())
1902 if (!isASCII(c) || !c)
1903 return true;
1904 return false;
1905 }
1906
1907 /// getNumConcatenated - Get the number of string literal tokens that were
1908 /// concatenated in translation phase #6 to form this string literal.
getNumConcatenated()1909 unsigned getNumConcatenated() const {
1910 return StringLiteralBits.NumConcatenated;
1911 }
1912
1913 /// Get one of the string literal token.
getStrTokenLoc(unsigned TokNum)1914 SourceLocation getStrTokenLoc(unsigned TokNum) const {
1915 assert(TokNum < getNumConcatenated() && "Invalid tok number");
1916 return getTrailingObjects<SourceLocation>()[TokNum];
1917 }
1918
1919 /// getLocationOfByte - Return a source location that points to the specified
1920 /// byte of this string literal.
1921 ///
1922 /// Strings are amazingly complex. They can be formed from multiple tokens
1923 /// and can have escape sequences in them in addition to the usual trigraph
1924 /// and escaped newline business. This routine handles this complexity.
1925 ///
1926 SourceLocation
1927 getLocationOfByte(unsigned ByteNo, const SourceManager &SM,
1928 const LangOptions &Features, const TargetInfo &Target,
1929 unsigned *StartToken = nullptr,
1930 unsigned *StartTokenByteOffset = nullptr) const;
1931
1932 typedef const SourceLocation *tokloc_iterator;
1933
tokloc_begin()1934 tokloc_iterator tokloc_begin() const {
1935 return getTrailingObjects<SourceLocation>();
1936 }
1937
tokloc_end()1938 tokloc_iterator tokloc_end() const {
1939 return getTrailingObjects<SourceLocation>() + getNumConcatenated();
1940 }
1941
getBeginLoc()1942 SourceLocation getBeginLoc() const LLVM_READONLY { return *tokloc_begin(); }
getEndLoc()1943 SourceLocation getEndLoc() const LLVM_READONLY { return *(tokloc_end() - 1); }
1944
classof(const Stmt * T)1945 static bool classof(const Stmt *T) {
1946 return T->getStmtClass() == StringLiteralClass;
1947 }
1948
1949 // Iterators
children()1950 child_range children() {
1951 return child_range(child_iterator(), child_iterator());
1952 }
children()1953 const_child_range children() const {
1954 return const_child_range(const_child_iterator(), const_child_iterator());
1955 }
1956 };
1957
1958 /// [C99 6.4.2.2] - A predefined identifier such as __func__.
1959 class PredefinedExpr final
1960 : public Expr,
1961 private llvm::TrailingObjects<PredefinedExpr, Stmt *> {
1962 friend class ASTStmtReader;
1963 friend TrailingObjects;
1964
1965 // PredefinedExpr is optionally followed by a single trailing
1966 // "Stmt *" for the predefined identifier. It is present if and only if
1967 // hasFunctionName() is true and is always a "StringLiteral *".
1968
1969 public:
1970 enum IdentKind {
1971 Func,
1972 Function,
1973 LFunction, // Same as Function, but as wide string.
1974 FuncDName,
1975 FuncSig,
1976 LFuncSig, // Same as FuncSig, but as as wide string
1977 PrettyFunction,
1978 /// The same as PrettyFunction, except that the
1979 /// 'virtual' keyword is omitted for virtual member functions.
1980 PrettyFunctionNoVirtual
1981 };
1982
1983 private:
1984 PredefinedExpr(SourceLocation L, QualType FNTy, IdentKind IK,
1985 StringLiteral *SL);
1986
1987 explicit PredefinedExpr(EmptyShell Empty, bool HasFunctionName);
1988
1989 /// True if this PredefinedExpr has storage for a function name.
hasFunctionName()1990 bool hasFunctionName() const { return PredefinedExprBits.HasFunctionName; }
1991
setFunctionName(StringLiteral * SL)1992 void setFunctionName(StringLiteral *SL) {
1993 assert(hasFunctionName() &&
1994 "This PredefinedExpr has no storage for a function name!");
1995 *getTrailingObjects<Stmt *>() = SL;
1996 }
1997
1998 public:
1999 /// Create a PredefinedExpr.
2000 static PredefinedExpr *Create(const ASTContext &Ctx, SourceLocation L,
2001 QualType FNTy, IdentKind IK, StringLiteral *SL);
2002
2003 /// Create an empty PredefinedExpr.
2004 static PredefinedExpr *CreateEmpty(const ASTContext &Ctx,
2005 bool HasFunctionName);
2006
getIdentKind()2007 IdentKind getIdentKind() const {
2008 return static_cast<IdentKind>(PredefinedExprBits.Kind);
2009 }
2010
getLocation()2011 SourceLocation getLocation() const { return PredefinedExprBits.Loc; }
setLocation(SourceLocation L)2012 void setLocation(SourceLocation L) { PredefinedExprBits.Loc = L; }
2013
getFunctionName()2014 StringLiteral *getFunctionName() {
2015 return hasFunctionName()
2016 ? static_cast<StringLiteral *>(*getTrailingObjects<Stmt *>())
2017 : nullptr;
2018 }
2019
getFunctionName()2020 const StringLiteral *getFunctionName() const {
2021 return hasFunctionName()
2022 ? static_cast<StringLiteral *>(*getTrailingObjects<Stmt *>())
2023 : nullptr;
2024 }
2025
2026 static StringRef getIdentKindName(IdentKind IK);
getIdentKindName()2027 StringRef getIdentKindName() const {
2028 return getIdentKindName(getIdentKind());
2029 }
2030
2031 static std::string ComputeName(IdentKind IK, const Decl *CurrentDecl);
2032
getBeginLoc()2033 SourceLocation getBeginLoc() const { return getLocation(); }
getEndLoc()2034 SourceLocation getEndLoc() const { return getLocation(); }
2035
classof(const Stmt * T)2036 static bool classof(const Stmt *T) {
2037 return T->getStmtClass() == PredefinedExprClass;
2038 }
2039
2040 // Iterators
children()2041 child_range children() {
2042 return child_range(getTrailingObjects<Stmt *>(),
2043 getTrailingObjects<Stmt *>() + hasFunctionName());
2044 }
2045
children()2046 const_child_range children() const {
2047 return const_child_range(getTrailingObjects<Stmt *>(),
2048 getTrailingObjects<Stmt *>() + hasFunctionName());
2049 }
2050 };
2051
2052 // This represents a use of the __builtin_sycl_unique_stable_name, which takes a
2053 // type-id, and at CodeGen time emits a unique string representation of the
2054 // type in a way that permits us to properly encode information about the SYCL
2055 // kernels.
2056 class SYCLUniqueStableNameExpr final : public Expr {
2057 friend class ASTStmtReader;
2058 SourceLocation OpLoc, LParen, RParen;
2059 TypeSourceInfo *TypeInfo;
2060
2061 SYCLUniqueStableNameExpr(EmptyShell Empty, QualType ResultTy);
2062 SYCLUniqueStableNameExpr(SourceLocation OpLoc, SourceLocation LParen,
2063 SourceLocation RParen, QualType ResultTy,
2064 TypeSourceInfo *TSI);
2065
setTypeSourceInfo(TypeSourceInfo * Ty)2066 void setTypeSourceInfo(TypeSourceInfo *Ty) { TypeInfo = Ty; }
2067
setLocation(SourceLocation L)2068 void setLocation(SourceLocation L) { OpLoc = L; }
setLParenLocation(SourceLocation L)2069 void setLParenLocation(SourceLocation L) { LParen = L; }
setRParenLocation(SourceLocation L)2070 void setRParenLocation(SourceLocation L) { RParen = L; }
2071
2072 public:
getTypeSourceInfo()2073 TypeSourceInfo *getTypeSourceInfo() { return TypeInfo; }
2074
getTypeSourceInfo()2075 const TypeSourceInfo *getTypeSourceInfo() const { return TypeInfo; }
2076
2077 static SYCLUniqueStableNameExpr *
2078 Create(const ASTContext &Ctx, SourceLocation OpLoc, SourceLocation LParen,
2079 SourceLocation RParen, TypeSourceInfo *TSI);
2080
2081 static SYCLUniqueStableNameExpr *CreateEmpty(const ASTContext &Ctx);
2082
getBeginLoc()2083 SourceLocation getBeginLoc() const { return getLocation(); }
getEndLoc()2084 SourceLocation getEndLoc() const { return RParen; }
getLocation()2085 SourceLocation getLocation() const { return OpLoc; }
getLParenLocation()2086 SourceLocation getLParenLocation() const { return LParen; }
getRParenLocation()2087 SourceLocation getRParenLocation() const { return RParen; }
2088
classof(const Stmt * T)2089 static bool classof(const Stmt *T) {
2090 return T->getStmtClass() == SYCLUniqueStableNameExprClass;
2091 }
2092
2093 // Iterators
children()2094 child_range children() {
2095 return child_range(child_iterator(), child_iterator());
2096 }
2097
children()2098 const_child_range children() const {
2099 return const_child_range(const_child_iterator(), const_child_iterator());
2100 }
2101
2102 // Convenience function to generate the name of the currently stored type.
2103 std::string ComputeName(ASTContext &Context) const;
2104
2105 // Get the generated name of the type. Note that this only works after all
2106 // kernels have been instantiated.
2107 static std::string ComputeName(ASTContext &Context, QualType Ty);
2108 };
2109
2110 /// ParenExpr - This represents a parethesized expression, e.g. "(1)". This
2111 /// AST node is only formed if full location information is requested.
2112 class ParenExpr : public Expr {
2113 SourceLocation L, R;
2114 Stmt *Val;
2115 public:
ParenExpr(SourceLocation l,SourceLocation r,Expr * val)2116 ParenExpr(SourceLocation l, SourceLocation r, Expr *val)
2117 : Expr(ParenExprClass, val->getType(), val->getValueKind(),
2118 val->getObjectKind()),
2119 L(l), R(r), Val(val) {
2120 setDependence(computeDependence(this));
2121 }
2122
2123 /// Construct an empty parenthesized expression.
ParenExpr(EmptyShell Empty)2124 explicit ParenExpr(EmptyShell Empty)
2125 : Expr(ParenExprClass, Empty) { }
2126
getSubExpr()2127 const Expr *getSubExpr() const { return cast<Expr>(Val); }
getSubExpr()2128 Expr *getSubExpr() { return cast<Expr>(Val); }
setSubExpr(Expr * E)2129 void setSubExpr(Expr *E) { Val = E; }
2130
getBeginLoc()2131 SourceLocation getBeginLoc() const LLVM_READONLY { return L; }
getEndLoc()2132 SourceLocation getEndLoc() const LLVM_READONLY { return R; }
2133
2134 /// Get the location of the left parentheses '('.
getLParen()2135 SourceLocation getLParen() const { return L; }
setLParen(SourceLocation Loc)2136 void setLParen(SourceLocation Loc) { L = Loc; }
2137
2138 /// Get the location of the right parentheses ')'.
getRParen()2139 SourceLocation getRParen() const { return R; }
setRParen(SourceLocation Loc)2140 void setRParen(SourceLocation Loc) { R = Loc; }
2141
classof(const Stmt * T)2142 static bool classof(const Stmt *T) {
2143 return T->getStmtClass() == ParenExprClass;
2144 }
2145
2146 // Iterators
children()2147 child_range children() { return child_range(&Val, &Val+1); }
children()2148 const_child_range children() const {
2149 return const_child_range(&Val, &Val + 1);
2150 }
2151 };
2152
2153 /// UnaryOperator - This represents the unary-expression's (except sizeof and
2154 /// alignof), the postinc/postdec operators from postfix-expression, and various
2155 /// extensions.
2156 ///
2157 /// Notes on various nodes:
2158 ///
2159 /// Real/Imag - These return the real/imag part of a complex operand. If
2160 /// applied to a non-complex value, the former returns its operand and the
2161 /// later returns zero in the type of the operand.
2162 ///
2163 class UnaryOperator final
2164 : public Expr,
2165 private llvm::TrailingObjects<UnaryOperator, FPOptionsOverride> {
2166 Stmt *Val;
2167
numTrailingObjects(OverloadToken<FPOptionsOverride>)2168 size_t numTrailingObjects(OverloadToken<FPOptionsOverride>) const {
2169 return UnaryOperatorBits.HasFPFeatures ? 1 : 0;
2170 }
2171
getTrailingFPFeatures()2172 FPOptionsOverride &getTrailingFPFeatures() {
2173 assert(UnaryOperatorBits.HasFPFeatures);
2174 return *getTrailingObjects<FPOptionsOverride>();
2175 }
2176
getTrailingFPFeatures()2177 const FPOptionsOverride &getTrailingFPFeatures() const {
2178 assert(UnaryOperatorBits.HasFPFeatures);
2179 return *getTrailingObjects<FPOptionsOverride>();
2180 }
2181
2182 public:
2183 typedef UnaryOperatorKind Opcode;
2184
2185 protected:
2186 UnaryOperator(const ASTContext &Ctx, Expr *input, Opcode opc, QualType type,
2187 ExprValueKind VK, ExprObjectKind OK, SourceLocation l,
2188 bool CanOverflow, FPOptionsOverride FPFeatures);
2189
2190 /// Build an empty unary operator.
UnaryOperator(bool HasFPFeatures,EmptyShell Empty)2191 explicit UnaryOperator(bool HasFPFeatures, EmptyShell Empty)
2192 : Expr(UnaryOperatorClass, Empty) {
2193 UnaryOperatorBits.Opc = UO_AddrOf;
2194 UnaryOperatorBits.HasFPFeatures = HasFPFeatures;
2195 }
2196
2197 public:
2198 static UnaryOperator *CreateEmpty(const ASTContext &C, bool hasFPFeatures);
2199
2200 static UnaryOperator *Create(const ASTContext &C, Expr *input, Opcode opc,
2201 QualType type, ExprValueKind VK,
2202 ExprObjectKind OK, SourceLocation l,
2203 bool CanOverflow, FPOptionsOverride FPFeatures);
2204
getOpcode()2205 Opcode getOpcode() const {
2206 return static_cast<Opcode>(UnaryOperatorBits.Opc);
2207 }
setOpcode(Opcode Opc)2208 void setOpcode(Opcode Opc) { UnaryOperatorBits.Opc = Opc; }
2209
getSubExpr()2210 Expr *getSubExpr() const { return cast<Expr>(Val); }
setSubExpr(Expr * E)2211 void setSubExpr(Expr *E) { Val = E; }
2212
2213 /// getOperatorLoc - Return the location of the operator.
getOperatorLoc()2214 SourceLocation getOperatorLoc() const { return UnaryOperatorBits.Loc; }
setOperatorLoc(SourceLocation L)2215 void setOperatorLoc(SourceLocation L) { UnaryOperatorBits.Loc = L; }
2216
2217 /// Returns true if the unary operator can cause an overflow. For instance,
2218 /// signed int i = INT_MAX; i++;
2219 /// signed char c = CHAR_MAX; c++;
2220 /// Due to integer promotions, c++ is promoted to an int before the postfix
2221 /// increment, and the result is an int that cannot overflow. However, i++
2222 /// can overflow.
canOverflow()2223 bool canOverflow() const { return UnaryOperatorBits.CanOverflow; }
setCanOverflow(bool C)2224 void setCanOverflow(bool C) { UnaryOperatorBits.CanOverflow = C; }
2225
2226 // Get the FP contractability status of this operator. Only meaningful for
2227 // operations on floating point types.
isFPContractableWithinStatement(const LangOptions & LO)2228 bool isFPContractableWithinStatement(const LangOptions &LO) const {
2229 return getFPFeaturesInEffect(LO).allowFPContractWithinStatement();
2230 }
2231
2232 // Get the FENV_ACCESS status of this operator. Only meaningful for
2233 // operations on floating point types.
isFEnvAccessOn(const LangOptions & LO)2234 bool isFEnvAccessOn(const LangOptions &LO) const {
2235 return getFPFeaturesInEffect(LO).getAllowFEnvAccess();
2236 }
2237
2238 /// isPostfix - Return true if this is a postfix operation, like x++.
isPostfix(Opcode Op)2239 static bool isPostfix(Opcode Op) {
2240 return Op == UO_PostInc || Op == UO_PostDec;
2241 }
2242
2243 /// isPrefix - Return true if this is a prefix operation, like --x.
isPrefix(Opcode Op)2244 static bool isPrefix(Opcode Op) {
2245 return Op == UO_PreInc || Op == UO_PreDec;
2246 }
2247
isPrefix()2248 bool isPrefix() const { return isPrefix(getOpcode()); }
isPostfix()2249 bool isPostfix() const { return isPostfix(getOpcode()); }
2250
isIncrementOp(Opcode Op)2251 static bool isIncrementOp(Opcode Op) {
2252 return Op == UO_PreInc || Op == UO_PostInc;
2253 }
isIncrementOp()2254 bool isIncrementOp() const {
2255 return isIncrementOp(getOpcode());
2256 }
2257
isDecrementOp(Opcode Op)2258 static bool isDecrementOp(Opcode Op) {
2259 return Op == UO_PreDec || Op == UO_PostDec;
2260 }
isDecrementOp()2261 bool isDecrementOp() const {
2262 return isDecrementOp(getOpcode());
2263 }
2264
isIncrementDecrementOp(Opcode Op)2265 static bool isIncrementDecrementOp(Opcode Op) { return Op <= UO_PreDec; }
isIncrementDecrementOp()2266 bool isIncrementDecrementOp() const {
2267 return isIncrementDecrementOp(getOpcode());
2268 }
2269
isArithmeticOp(Opcode Op)2270 static bool isArithmeticOp(Opcode Op) {
2271 return Op >= UO_Plus && Op <= UO_LNot;
2272 }
isArithmeticOp()2273 bool isArithmeticOp() const { return isArithmeticOp(getOpcode()); }
2274
2275 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
2276 /// corresponds to, e.g. "sizeof" or "[pre]++"
2277 static StringRef getOpcodeStr(Opcode Op);
2278
2279 /// Retrieve the unary opcode that corresponds to the given
2280 /// overloaded operator.
2281 static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix);
2282
2283 /// Retrieve the overloaded operator kind that corresponds to
2284 /// the given unary opcode.
2285 static OverloadedOperatorKind getOverloadedOperator(Opcode Opc);
2286
getBeginLoc()2287 SourceLocation getBeginLoc() const LLVM_READONLY {
2288 return isPostfix() ? Val->getBeginLoc() : getOperatorLoc();
2289 }
getEndLoc()2290 SourceLocation getEndLoc() const LLVM_READONLY {
2291 return isPostfix() ? getOperatorLoc() : Val->getEndLoc();
2292 }
getExprLoc()2293 SourceLocation getExprLoc() const { return getOperatorLoc(); }
2294
classof(const Stmt * T)2295 static bool classof(const Stmt *T) {
2296 return T->getStmtClass() == UnaryOperatorClass;
2297 }
2298
2299 // Iterators
children()2300 child_range children() { return child_range(&Val, &Val+1); }
children()2301 const_child_range children() const {
2302 return const_child_range(&Val, &Val + 1);
2303 }
2304
2305 /// Is FPFeatures in Trailing Storage?
hasStoredFPFeatures()2306 bool hasStoredFPFeatures() const { return UnaryOperatorBits.HasFPFeatures; }
2307
2308 /// Get FPFeatures from trailing storage.
getStoredFPFeatures()2309 FPOptionsOverride getStoredFPFeatures() const {
2310 return getTrailingFPFeatures();
2311 }
2312
2313 protected:
2314 /// Set FPFeatures in trailing storage, used only by Serialization
setStoredFPFeatures(FPOptionsOverride F)2315 void setStoredFPFeatures(FPOptionsOverride F) { getTrailingFPFeatures() = F; }
2316
2317 public:
2318 // Get the FP features status of this operator. Only meaningful for
2319 // operations on floating point types.
getFPFeaturesInEffect(const LangOptions & LO)2320 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const {
2321 if (UnaryOperatorBits.HasFPFeatures)
2322 return getStoredFPFeatures().applyOverrides(LO);
2323 return FPOptions::defaultWithoutTrailingStorage(LO);
2324 }
getFPOptionsOverride()2325 FPOptionsOverride getFPOptionsOverride() const {
2326 if (UnaryOperatorBits.HasFPFeatures)
2327 return getStoredFPFeatures();
2328 return FPOptionsOverride();
2329 }
2330
2331 friend TrailingObjects;
2332 friend class ASTReader;
2333 friend class ASTStmtReader;
2334 friend class ASTStmtWriter;
2335 };
2336
2337 /// Helper class for OffsetOfExpr.
2338
2339 // __builtin_offsetof(type, identifier(.identifier|[expr])*)
2340 class OffsetOfNode {
2341 public:
2342 /// The kind of offsetof node we have.
2343 enum Kind {
2344 /// An index into an array.
2345 Array = 0x00,
2346 /// A field.
2347 Field = 0x01,
2348 /// A field in a dependent type, known only by its name.
2349 Identifier = 0x02,
2350 /// An implicit indirection through a C++ base class, when the
2351 /// field found is in a base class.
2352 Base = 0x03
2353 };
2354
2355 private:
2356 enum { MaskBits = 2, Mask = 0x03 };
2357
2358 /// The source range that covers this part of the designator.
2359 SourceRange Range;
2360
2361 /// The data describing the designator, which comes in three
2362 /// different forms, depending on the lower two bits.
2363 /// - An unsigned index into the array of Expr*'s stored after this node
2364 /// in memory, for [constant-expression] designators.
2365 /// - A FieldDecl*, for references to a known field.
2366 /// - An IdentifierInfo*, for references to a field with a given name
2367 /// when the class type is dependent.
2368 /// - A CXXBaseSpecifier*, for references that look at a field in a
2369 /// base class.
2370 uintptr_t Data;
2371
2372 public:
2373 /// Create an offsetof node that refers to an array element.
OffsetOfNode(SourceLocation LBracketLoc,unsigned Index,SourceLocation RBracketLoc)2374 OffsetOfNode(SourceLocation LBracketLoc, unsigned Index,
2375 SourceLocation RBracketLoc)
2376 : Range(LBracketLoc, RBracketLoc), Data((Index << 2) | Array) {}
2377
2378 /// Create an offsetof node that refers to a field.
OffsetOfNode(SourceLocation DotLoc,FieldDecl * Field,SourceLocation NameLoc)2379 OffsetOfNode(SourceLocation DotLoc, FieldDecl *Field, SourceLocation NameLoc)
2380 : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc),
2381 Data(reinterpret_cast<uintptr_t>(Field) | OffsetOfNode::Field) {}
2382
2383 /// Create an offsetof node that refers to an identifier.
OffsetOfNode(SourceLocation DotLoc,IdentifierInfo * Name,SourceLocation NameLoc)2384 OffsetOfNode(SourceLocation DotLoc, IdentifierInfo *Name,
2385 SourceLocation NameLoc)
2386 : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc),
2387 Data(reinterpret_cast<uintptr_t>(Name) | Identifier) {}
2388
2389 /// Create an offsetof node that refers into a C++ base class.
OffsetOfNode(const CXXBaseSpecifier * Base)2390 explicit OffsetOfNode(const CXXBaseSpecifier *Base)
2391 : Data(reinterpret_cast<uintptr_t>(Base) | OffsetOfNode::Base) {}
2392
2393 /// Determine what kind of offsetof node this is.
getKind()2394 Kind getKind() const { return static_cast<Kind>(Data & Mask); }
2395
2396 /// For an array element node, returns the index into the array
2397 /// of expressions.
getArrayExprIndex()2398 unsigned getArrayExprIndex() const {
2399 assert(getKind() == Array);
2400 return Data >> 2;
2401 }
2402
2403 /// For a field offsetof node, returns the field.
getField()2404 FieldDecl *getField() const {
2405 assert(getKind() == Field);
2406 return reinterpret_cast<FieldDecl *>(Data & ~(uintptr_t)Mask);
2407 }
2408
2409 /// For a field or identifier offsetof node, returns the name of
2410 /// the field.
2411 IdentifierInfo *getFieldName() const;
2412
2413 /// For a base class node, returns the base specifier.
getBase()2414 CXXBaseSpecifier *getBase() const {
2415 assert(getKind() == Base);
2416 return reinterpret_cast<CXXBaseSpecifier *>(Data & ~(uintptr_t)Mask);
2417 }
2418
2419 /// Retrieve the source range that covers this offsetof node.
2420 ///
2421 /// For an array element node, the source range contains the locations of
2422 /// the square brackets. For a field or identifier node, the source range
2423 /// contains the location of the period (if there is one) and the
2424 /// identifier.
getSourceRange()2425 SourceRange getSourceRange() const LLVM_READONLY { return Range; }
getBeginLoc()2426 SourceLocation getBeginLoc() const LLVM_READONLY { return Range.getBegin(); }
getEndLoc()2427 SourceLocation getEndLoc() const LLVM_READONLY { return Range.getEnd(); }
2428 };
2429
2430 /// OffsetOfExpr - [C99 7.17] - This represents an expression of the form
2431 /// offsetof(record-type, member-designator). For example, given:
2432 /// @code
2433 /// struct S {
2434 /// float f;
2435 /// double d;
2436 /// };
2437 /// struct T {
2438 /// int i;
2439 /// struct S s[10];
2440 /// };
2441 /// @endcode
2442 /// we can represent and evaluate the expression @c offsetof(struct T, s[2].d).
2443
2444 class OffsetOfExpr final
2445 : public Expr,
2446 private llvm::TrailingObjects<OffsetOfExpr, OffsetOfNode, Expr *> {
2447 SourceLocation OperatorLoc, RParenLoc;
2448 // Base type;
2449 TypeSourceInfo *TSInfo;
2450 // Number of sub-components (i.e. instances of OffsetOfNode).
2451 unsigned NumComps;
2452 // Number of sub-expressions (i.e. array subscript expressions).
2453 unsigned NumExprs;
2454
numTrailingObjects(OverloadToken<OffsetOfNode>)2455 size_t numTrailingObjects(OverloadToken<OffsetOfNode>) const {
2456 return NumComps;
2457 }
2458
2459 OffsetOfExpr(const ASTContext &C, QualType type,
2460 SourceLocation OperatorLoc, TypeSourceInfo *tsi,
2461 ArrayRef<OffsetOfNode> comps, ArrayRef<Expr*> exprs,
2462 SourceLocation RParenLoc);
2463
OffsetOfExpr(unsigned numComps,unsigned numExprs)2464 explicit OffsetOfExpr(unsigned numComps, unsigned numExprs)
2465 : Expr(OffsetOfExprClass, EmptyShell()),
2466 TSInfo(nullptr), NumComps(numComps), NumExprs(numExprs) {}
2467
2468 public:
2469
2470 static OffsetOfExpr *Create(const ASTContext &C, QualType type,
2471 SourceLocation OperatorLoc, TypeSourceInfo *tsi,
2472 ArrayRef<OffsetOfNode> comps,
2473 ArrayRef<Expr*> exprs, SourceLocation RParenLoc);
2474
2475 static OffsetOfExpr *CreateEmpty(const ASTContext &C,
2476 unsigned NumComps, unsigned NumExprs);
2477
2478 /// getOperatorLoc - Return the location of the operator.
getOperatorLoc()2479 SourceLocation getOperatorLoc() const { return OperatorLoc; }
setOperatorLoc(SourceLocation L)2480 void setOperatorLoc(SourceLocation L) { OperatorLoc = L; }
2481
2482 /// Return the location of the right parentheses.
getRParenLoc()2483 SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation R)2484 void setRParenLoc(SourceLocation R) { RParenLoc = R; }
2485
getTypeSourceInfo()2486 TypeSourceInfo *getTypeSourceInfo() const {
2487 return TSInfo;
2488 }
setTypeSourceInfo(TypeSourceInfo * tsi)2489 void setTypeSourceInfo(TypeSourceInfo *tsi) {
2490 TSInfo = tsi;
2491 }
2492
getComponent(unsigned Idx)2493 const OffsetOfNode &getComponent(unsigned Idx) const {
2494 assert(Idx < NumComps && "Subscript out of range");
2495 return getTrailingObjects<OffsetOfNode>()[Idx];
2496 }
2497
setComponent(unsigned Idx,OffsetOfNode ON)2498 void setComponent(unsigned Idx, OffsetOfNode ON) {
2499 assert(Idx < NumComps && "Subscript out of range");
2500 getTrailingObjects<OffsetOfNode>()[Idx] = ON;
2501 }
2502
getNumComponents()2503 unsigned getNumComponents() const {
2504 return NumComps;
2505 }
2506
getIndexExpr(unsigned Idx)2507 Expr* getIndexExpr(unsigned Idx) {
2508 assert(Idx < NumExprs && "Subscript out of range");
2509 return getTrailingObjects<Expr *>()[Idx];
2510 }
2511
getIndexExpr(unsigned Idx)2512 const Expr *getIndexExpr(unsigned Idx) const {
2513 assert(Idx < NumExprs && "Subscript out of range");
2514 return getTrailingObjects<Expr *>()[Idx];
2515 }
2516
setIndexExpr(unsigned Idx,Expr * E)2517 void setIndexExpr(unsigned Idx, Expr* E) {
2518 assert(Idx < NumComps && "Subscript out of range");
2519 getTrailingObjects<Expr *>()[Idx] = E;
2520 }
2521
getNumExpressions()2522 unsigned getNumExpressions() const {
2523 return NumExprs;
2524 }
2525
getBeginLoc()2526 SourceLocation getBeginLoc() const LLVM_READONLY { return OperatorLoc; }
getEndLoc()2527 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
2528
classof(const Stmt * T)2529 static bool classof(const Stmt *T) {
2530 return T->getStmtClass() == OffsetOfExprClass;
2531 }
2532
2533 // Iterators
children()2534 child_range children() {
2535 Stmt **begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>());
2536 return child_range(begin, begin + NumExprs);
2537 }
children()2538 const_child_range children() const {
2539 Stmt *const *begin =
2540 reinterpret_cast<Stmt *const *>(getTrailingObjects<Expr *>());
2541 return const_child_range(begin, begin + NumExprs);
2542 }
2543 friend TrailingObjects;
2544 };
2545
2546 /// UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated)
2547 /// expression operand. Used for sizeof/alignof (C99 6.5.3.4) and
2548 /// vec_step (OpenCL 1.1 6.11.12).
2549 class UnaryExprOrTypeTraitExpr : public Expr {
2550 union {
2551 TypeSourceInfo *Ty;
2552 Stmt *Ex;
2553 } Argument;
2554 SourceLocation OpLoc, RParenLoc;
2555
2556 public:
UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind,TypeSourceInfo * TInfo,QualType resultType,SourceLocation op,SourceLocation rp)2557 UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo,
2558 QualType resultType, SourceLocation op,
2559 SourceLocation rp)
2560 : Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_PRValue,
2561 OK_Ordinary),
2562 OpLoc(op), RParenLoc(rp) {
2563 assert(ExprKind <= UETT_Last && "invalid enum value!");
2564 UnaryExprOrTypeTraitExprBits.Kind = ExprKind;
2565 assert(static_cast<unsigned>(ExprKind) ==
2566 UnaryExprOrTypeTraitExprBits.Kind &&
2567 "UnaryExprOrTypeTraitExprBits.Kind overflow!");
2568 UnaryExprOrTypeTraitExprBits.IsType = true;
2569 Argument.Ty = TInfo;
2570 setDependence(computeDependence(this));
2571 }
2572
2573 UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, Expr *E,
2574 QualType resultType, SourceLocation op,
2575 SourceLocation rp);
2576
2577 /// Construct an empty sizeof/alignof expression.
UnaryExprOrTypeTraitExpr(EmptyShell Empty)2578 explicit UnaryExprOrTypeTraitExpr(EmptyShell Empty)
2579 : Expr(UnaryExprOrTypeTraitExprClass, Empty) { }
2580
getKind()2581 UnaryExprOrTypeTrait getKind() const {
2582 return static_cast<UnaryExprOrTypeTrait>(UnaryExprOrTypeTraitExprBits.Kind);
2583 }
setKind(UnaryExprOrTypeTrait K)2584 void setKind(UnaryExprOrTypeTrait K) {
2585 assert(K <= UETT_Last && "invalid enum value!");
2586 UnaryExprOrTypeTraitExprBits.Kind = K;
2587 assert(static_cast<unsigned>(K) == UnaryExprOrTypeTraitExprBits.Kind &&
2588 "UnaryExprOrTypeTraitExprBits.Kind overflow!");
2589 }
2590
isArgumentType()2591 bool isArgumentType() const { return UnaryExprOrTypeTraitExprBits.IsType; }
getArgumentType()2592 QualType getArgumentType() const {
2593 return getArgumentTypeInfo()->getType();
2594 }
getArgumentTypeInfo()2595 TypeSourceInfo *getArgumentTypeInfo() const {
2596 assert(isArgumentType() && "calling getArgumentType() when arg is expr");
2597 return Argument.Ty;
2598 }
getArgumentExpr()2599 Expr *getArgumentExpr() {
2600 assert(!isArgumentType() && "calling getArgumentExpr() when arg is type");
2601 return static_cast<Expr*>(Argument.Ex);
2602 }
getArgumentExpr()2603 const Expr *getArgumentExpr() const {
2604 return const_cast<UnaryExprOrTypeTraitExpr*>(this)->getArgumentExpr();
2605 }
2606
setArgument(Expr * E)2607 void setArgument(Expr *E) {
2608 Argument.Ex = E;
2609 UnaryExprOrTypeTraitExprBits.IsType = false;
2610 }
setArgument(TypeSourceInfo * TInfo)2611 void setArgument(TypeSourceInfo *TInfo) {
2612 Argument.Ty = TInfo;
2613 UnaryExprOrTypeTraitExprBits.IsType = true;
2614 }
2615
2616 /// Gets the argument type, or the type of the argument expression, whichever
2617 /// is appropriate.
getTypeOfArgument()2618 QualType getTypeOfArgument() const {
2619 return isArgumentType() ? getArgumentType() : getArgumentExpr()->getType();
2620 }
2621
getOperatorLoc()2622 SourceLocation getOperatorLoc() const { return OpLoc; }
setOperatorLoc(SourceLocation L)2623 void setOperatorLoc(SourceLocation L) { OpLoc = L; }
2624
getRParenLoc()2625 SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation L)2626 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
2627
getBeginLoc()2628 SourceLocation getBeginLoc() const LLVM_READONLY { return OpLoc; }
getEndLoc()2629 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
2630
classof(const Stmt * T)2631 static bool classof(const Stmt *T) {
2632 return T->getStmtClass() == UnaryExprOrTypeTraitExprClass;
2633 }
2634
2635 // Iterators
2636 child_range children();
2637 const_child_range children() const;
2638 };
2639
2640 //===----------------------------------------------------------------------===//
2641 // Postfix Operators.
2642 //===----------------------------------------------------------------------===//
2643
2644 /// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
2645 class ArraySubscriptExpr : public Expr {
2646 enum { LHS, RHS, END_EXPR };
2647 Stmt *SubExprs[END_EXPR];
2648
lhsIsBase()2649 bool lhsIsBase() const { return getRHS()->getType()->isIntegerType(); }
2650
2651 public:
ArraySubscriptExpr(Expr * lhs,Expr * rhs,QualType t,ExprValueKind VK,ExprObjectKind OK,SourceLocation rbracketloc)2652 ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t, ExprValueKind VK,
2653 ExprObjectKind OK, SourceLocation rbracketloc)
2654 : Expr(ArraySubscriptExprClass, t, VK, OK) {
2655 SubExprs[LHS] = lhs;
2656 SubExprs[RHS] = rhs;
2657 ArrayOrMatrixSubscriptExprBits.RBracketLoc = rbracketloc;
2658 setDependence(computeDependence(this));
2659 }
2660
2661 /// Create an empty array subscript expression.
ArraySubscriptExpr(EmptyShell Shell)2662 explicit ArraySubscriptExpr(EmptyShell Shell)
2663 : Expr(ArraySubscriptExprClass, Shell) { }
2664
2665 /// An array access can be written A[4] or 4[A] (both are equivalent).
2666 /// - getBase() and getIdx() always present the normalized view: A[4].
2667 /// In this case getBase() returns "A" and getIdx() returns "4".
2668 /// - getLHS() and getRHS() present the syntactic view. e.g. for
2669 /// 4[A] getLHS() returns "4".
2670 /// Note: Because vector element access is also written A[4] we must
2671 /// predicate the format conversion in getBase and getIdx only on the
2672 /// the type of the RHS, as it is possible for the LHS to be a vector of
2673 /// integer type
getLHS()2674 Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); }
getLHS()2675 const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
setLHS(Expr * E)2676 void setLHS(Expr *E) { SubExprs[LHS] = E; }
2677
getRHS()2678 Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); }
getRHS()2679 const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
setRHS(Expr * E)2680 void setRHS(Expr *E) { SubExprs[RHS] = E; }
2681
getBase()2682 Expr *getBase() { return lhsIsBase() ? getLHS() : getRHS(); }
getBase()2683 const Expr *getBase() const { return lhsIsBase() ? getLHS() : getRHS(); }
2684
getIdx()2685 Expr *getIdx() { return lhsIsBase() ? getRHS() : getLHS(); }
getIdx()2686 const Expr *getIdx() const { return lhsIsBase() ? getRHS() : getLHS(); }
2687
getBeginLoc()2688 SourceLocation getBeginLoc() const LLVM_READONLY {
2689 return getLHS()->getBeginLoc();
2690 }
getEndLoc()2691 SourceLocation getEndLoc() const { return getRBracketLoc(); }
2692
getRBracketLoc()2693 SourceLocation getRBracketLoc() const {
2694 return ArrayOrMatrixSubscriptExprBits.RBracketLoc;
2695 }
setRBracketLoc(SourceLocation L)2696 void setRBracketLoc(SourceLocation L) {
2697 ArrayOrMatrixSubscriptExprBits.RBracketLoc = L;
2698 }
2699
getExprLoc()2700 SourceLocation getExprLoc() const LLVM_READONLY {
2701 return getBase()->getExprLoc();
2702 }
2703
classof(const Stmt * T)2704 static bool classof(const Stmt *T) {
2705 return T->getStmtClass() == ArraySubscriptExprClass;
2706 }
2707
2708 // Iterators
children()2709 child_range children() {
2710 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
2711 }
children()2712 const_child_range children() const {
2713 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2714 }
2715 };
2716
2717 /// MatrixSubscriptExpr - Matrix subscript expression for the MatrixType
2718 /// extension.
2719 /// MatrixSubscriptExpr can be either incomplete (only Base and RowIdx are set
2720 /// so far, the type is IncompleteMatrixIdx) or complete (Base, RowIdx and
2721 /// ColumnIdx refer to valid expressions). Incomplete matrix expressions only
2722 /// exist during the initial construction of the AST.
2723 class MatrixSubscriptExpr : public Expr {
2724 enum { BASE, ROW_IDX, COLUMN_IDX, END_EXPR };
2725 Stmt *SubExprs[END_EXPR];
2726
2727 public:
MatrixSubscriptExpr(Expr * Base,Expr * RowIdx,Expr * ColumnIdx,QualType T,SourceLocation RBracketLoc)2728 MatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, QualType T,
2729 SourceLocation RBracketLoc)
2730 : Expr(MatrixSubscriptExprClass, T, Base->getValueKind(),
2731 OK_MatrixComponent) {
2732 SubExprs[BASE] = Base;
2733 SubExprs[ROW_IDX] = RowIdx;
2734 SubExprs[COLUMN_IDX] = ColumnIdx;
2735 ArrayOrMatrixSubscriptExprBits.RBracketLoc = RBracketLoc;
2736 setDependence(computeDependence(this));
2737 }
2738
2739 /// Create an empty matrix subscript expression.
MatrixSubscriptExpr(EmptyShell Shell)2740 explicit MatrixSubscriptExpr(EmptyShell Shell)
2741 : Expr(MatrixSubscriptExprClass, Shell) {}
2742
isIncomplete()2743 bool isIncomplete() const {
2744 bool IsIncomplete = hasPlaceholderType(BuiltinType::IncompleteMatrixIdx);
2745 assert((SubExprs[COLUMN_IDX] || IsIncomplete) &&
2746 "expressions without column index must be marked as incomplete");
2747 return IsIncomplete;
2748 }
getBase()2749 Expr *getBase() { return cast<Expr>(SubExprs[BASE]); }
getBase()2750 const Expr *getBase() const { return cast<Expr>(SubExprs[BASE]); }
setBase(Expr * E)2751 void setBase(Expr *E) { SubExprs[BASE] = E; }
2752
getRowIdx()2753 Expr *getRowIdx() { return cast<Expr>(SubExprs[ROW_IDX]); }
getRowIdx()2754 const Expr *getRowIdx() const { return cast<Expr>(SubExprs[ROW_IDX]); }
setRowIdx(Expr * E)2755 void setRowIdx(Expr *E) { SubExprs[ROW_IDX] = E; }
2756
getColumnIdx()2757 Expr *getColumnIdx() { return cast_or_null<Expr>(SubExprs[COLUMN_IDX]); }
getColumnIdx()2758 const Expr *getColumnIdx() const {
2759 assert(!isIncomplete() &&
2760 "cannot get the column index of an incomplete expression");
2761 return cast<Expr>(SubExprs[COLUMN_IDX]);
2762 }
setColumnIdx(Expr * E)2763 void setColumnIdx(Expr *E) { SubExprs[COLUMN_IDX] = E; }
2764
getBeginLoc()2765 SourceLocation getBeginLoc() const LLVM_READONLY {
2766 return getBase()->getBeginLoc();
2767 }
2768
getEndLoc()2769 SourceLocation getEndLoc() const { return getRBracketLoc(); }
2770
getExprLoc()2771 SourceLocation getExprLoc() const LLVM_READONLY {
2772 return getBase()->getExprLoc();
2773 }
2774
getRBracketLoc()2775 SourceLocation getRBracketLoc() const {
2776 return ArrayOrMatrixSubscriptExprBits.RBracketLoc;
2777 }
setRBracketLoc(SourceLocation L)2778 void setRBracketLoc(SourceLocation L) {
2779 ArrayOrMatrixSubscriptExprBits.RBracketLoc = L;
2780 }
2781
classof(const Stmt * T)2782 static bool classof(const Stmt *T) {
2783 return T->getStmtClass() == MatrixSubscriptExprClass;
2784 }
2785
2786 // Iterators
children()2787 child_range children() {
2788 return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2789 }
children()2790 const_child_range children() const {
2791 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2792 }
2793 };
2794
2795 /// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
2796 /// CallExpr itself represents a normal function call, e.g., "f(x, 2)",
2797 /// while its subclasses may represent alternative syntax that (semantically)
2798 /// results in a function call. For example, CXXOperatorCallExpr is
2799 /// a subclass for overloaded operator calls that use operator syntax, e.g.,
2800 /// "str1 + str2" to resolve to a function call.
2801 class CallExpr : public Expr {
2802 enum { FN = 0, PREARGS_START = 1 };
2803
2804 /// The number of arguments in the call expression.
2805 unsigned NumArgs;
2806
2807 /// The location of the right parenthese. This has a different meaning for
2808 /// the derived classes of CallExpr.
2809 SourceLocation RParenLoc;
2810
2811 // CallExpr store some data in trailing objects. However since CallExpr
2812 // is used a base of other expression classes we cannot use
2813 // llvm::TrailingObjects. Instead we manually perform the pointer arithmetic
2814 // and casts.
2815 //
2816 // The trailing objects are in order:
2817 //
2818 // * A single "Stmt *" for the callee expression.
2819 //
2820 // * An array of getNumPreArgs() "Stmt *" for the pre-argument expressions.
2821 //
2822 // * An array of getNumArgs() "Stmt *" for the argument expressions.
2823 //
2824 // * An optional of type FPOptionsOverride.
2825 //
2826 // Note that we store the offset in bytes from the this pointer to the start
2827 // of the trailing objects. It would be perfectly possible to compute it
2828 // based on the dynamic kind of the CallExpr. However 1.) we have plenty of
2829 // space in the bit-fields of Stmt. 2.) It was benchmarked to be faster to
2830 // compute this once and then load the offset from the bit-fields of Stmt,
2831 // instead of re-computing the offset each time the trailing objects are
2832 // accessed.
2833
2834 /// Return a pointer to the start of the trailing array of "Stmt *".
getTrailingStmts()2835 Stmt **getTrailingStmts() {
2836 return reinterpret_cast<Stmt **>(reinterpret_cast<char *>(this) +
2837 CallExprBits.OffsetToTrailingObjects);
2838 }
getTrailingStmts()2839 Stmt *const *getTrailingStmts() const {
2840 return const_cast<CallExpr *>(this)->getTrailingStmts();
2841 }
2842
2843 /// Map a statement class to the appropriate offset in bytes from the
2844 /// this pointer to the trailing objects.
2845 static unsigned offsetToTrailingObjects(StmtClass SC);
2846
getSizeOfTrailingStmts()2847 unsigned getSizeOfTrailingStmts() const {
2848 return (1 + getNumPreArgs() + getNumArgs()) * sizeof(Stmt *);
2849 }
2850
getOffsetOfTrailingFPFeatures()2851 size_t getOffsetOfTrailingFPFeatures() const {
2852 assert(hasStoredFPFeatures());
2853 return CallExprBits.OffsetToTrailingObjects + getSizeOfTrailingStmts();
2854 }
2855
2856 public:
2857 enum class ADLCallKind : bool { NotADL, UsesADL };
2858 static constexpr ADLCallKind NotADL = ADLCallKind::NotADL;
2859 static constexpr ADLCallKind UsesADL = ADLCallKind::UsesADL;
2860
2861 protected:
2862 /// Build a call expression, assuming that appropriate storage has been
2863 /// allocated for the trailing objects.
2864 CallExpr(StmtClass SC, Expr *Fn, ArrayRef<Expr *> PreArgs,
2865 ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
2866 SourceLocation RParenLoc, FPOptionsOverride FPFeatures,
2867 unsigned MinNumArgs, ADLCallKind UsesADL);
2868
2869 /// Build an empty call expression, for deserialization.
2870 CallExpr(StmtClass SC, unsigned NumPreArgs, unsigned NumArgs,
2871 bool hasFPFeatures, EmptyShell Empty);
2872
2873 /// Return the size in bytes needed for the trailing objects.
2874 /// Used by the derived classes to allocate the right amount of storage.
sizeOfTrailingObjects(unsigned NumPreArgs,unsigned NumArgs,bool HasFPFeatures)2875 static unsigned sizeOfTrailingObjects(unsigned NumPreArgs, unsigned NumArgs,
2876 bool HasFPFeatures) {
2877 return (1 + NumPreArgs + NumArgs) * sizeof(Stmt *) +
2878 HasFPFeatures * sizeof(FPOptionsOverride);
2879 }
2880
getPreArg(unsigned I)2881 Stmt *getPreArg(unsigned I) {
2882 assert(I < getNumPreArgs() && "Prearg access out of range!");
2883 return getTrailingStmts()[PREARGS_START + I];
2884 }
getPreArg(unsigned I)2885 const Stmt *getPreArg(unsigned I) const {
2886 assert(I < getNumPreArgs() && "Prearg access out of range!");
2887 return getTrailingStmts()[PREARGS_START + I];
2888 }
setPreArg(unsigned I,Stmt * PreArg)2889 void setPreArg(unsigned I, Stmt *PreArg) {
2890 assert(I < getNumPreArgs() && "Prearg access out of range!");
2891 getTrailingStmts()[PREARGS_START + I] = PreArg;
2892 }
2893
getNumPreArgs()2894 unsigned getNumPreArgs() const { return CallExprBits.NumPreArgs; }
2895
2896 /// Return a pointer to the trailing FPOptions
getTrailingFPFeatures()2897 FPOptionsOverride *getTrailingFPFeatures() {
2898 assert(hasStoredFPFeatures());
2899 return reinterpret_cast<FPOptionsOverride *>(
2900 reinterpret_cast<char *>(this) + CallExprBits.OffsetToTrailingObjects +
2901 getSizeOfTrailingStmts());
2902 }
getTrailingFPFeatures()2903 const FPOptionsOverride *getTrailingFPFeatures() const {
2904 assert(hasStoredFPFeatures());
2905 return reinterpret_cast<const FPOptionsOverride *>(
2906 reinterpret_cast<const char *>(this) +
2907 CallExprBits.OffsetToTrailingObjects + getSizeOfTrailingStmts());
2908 }
2909
2910 public:
2911 /// Create a call expression.
2912 /// \param Fn The callee expression,
2913 /// \param Args The argument array,
2914 /// \param Ty The type of the call expression (which is *not* the return
2915 /// type in general),
2916 /// \param VK The value kind of the call expression (lvalue, rvalue, ...),
2917 /// \param RParenLoc The location of the right parenthesis in the call
2918 /// expression.
2919 /// \param FPFeatures Floating-point features associated with the call,
2920 /// \param MinNumArgs Specifies the minimum number of arguments. The actual
2921 /// number of arguments will be the greater of Args.size()
2922 /// and MinNumArgs. This is used in a few places to allocate
2923 /// enough storage for the default arguments.
2924 /// \param UsesADL Specifies whether the callee was found through
2925 /// argument-dependent lookup.
2926 ///
2927 /// Note that you can use CreateTemporary if you need a temporary call
2928 /// expression on the stack.
2929 static CallExpr *Create(const ASTContext &Ctx, Expr *Fn,
2930 ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
2931 SourceLocation RParenLoc,
2932 FPOptionsOverride FPFeatures, unsigned MinNumArgs = 0,
2933 ADLCallKind UsesADL = NotADL);
2934
2935 /// Create a temporary call expression with no arguments in the memory
2936 /// pointed to by Mem. Mem must points to at least sizeof(CallExpr)
2937 /// + sizeof(Stmt *) bytes of storage, aligned to alignof(CallExpr):
2938 ///
2939 /// \code{.cpp}
2940 /// alignas(CallExpr) char Buffer[sizeof(CallExpr) + sizeof(Stmt *)];
2941 /// CallExpr *TheCall = CallExpr::CreateTemporary(Buffer, etc);
2942 /// \endcode
2943 static CallExpr *CreateTemporary(void *Mem, Expr *Fn, QualType Ty,
2944 ExprValueKind VK, SourceLocation RParenLoc,
2945 ADLCallKind UsesADL = NotADL);
2946
2947 /// Create an empty call expression, for deserialization.
2948 static CallExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumArgs,
2949 bool HasFPFeatures, EmptyShell Empty);
2950
getCallee()2951 Expr *getCallee() { return cast<Expr>(getTrailingStmts()[FN]); }
getCallee()2952 const Expr *getCallee() const { return cast<Expr>(getTrailingStmts()[FN]); }
setCallee(Expr * F)2953 void setCallee(Expr *F) { getTrailingStmts()[FN] = F; }
2954
getADLCallKind()2955 ADLCallKind getADLCallKind() const {
2956 return static_cast<ADLCallKind>(CallExprBits.UsesADL);
2957 }
2958 void setADLCallKind(ADLCallKind V = UsesADL) {
2959 CallExprBits.UsesADL = static_cast<bool>(V);
2960 }
usesADL()2961 bool usesADL() const { return getADLCallKind() == UsesADL; }
2962
hasStoredFPFeatures()2963 bool hasStoredFPFeatures() const { return CallExprBits.HasFPFeatures; }
2964
getCalleeDecl()2965 Decl *getCalleeDecl() { return getCallee()->getReferencedDeclOfCallee(); }
getCalleeDecl()2966 const Decl *getCalleeDecl() const {
2967 return getCallee()->getReferencedDeclOfCallee();
2968 }
2969
2970 /// If the callee is a FunctionDecl, return it. Otherwise return null.
getDirectCallee()2971 FunctionDecl *getDirectCallee() {
2972 return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
2973 }
getDirectCallee()2974 const FunctionDecl *getDirectCallee() const {
2975 return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
2976 }
2977
2978 /// getNumArgs - Return the number of actual arguments to this call.
getNumArgs()2979 unsigned getNumArgs() const { return NumArgs; }
2980
2981 /// Retrieve the call arguments.
getArgs()2982 Expr **getArgs() {
2983 return reinterpret_cast<Expr **>(getTrailingStmts() + PREARGS_START +
2984 getNumPreArgs());
2985 }
getArgs()2986 const Expr *const *getArgs() const {
2987 return reinterpret_cast<const Expr *const *>(
2988 getTrailingStmts() + PREARGS_START + getNumPreArgs());
2989 }
2990
2991 /// getArg - Return the specified argument.
getArg(unsigned Arg)2992 Expr *getArg(unsigned Arg) {
2993 assert(Arg < getNumArgs() && "Arg access out of range!");
2994 return getArgs()[Arg];
2995 }
getArg(unsigned Arg)2996 const Expr *getArg(unsigned Arg) const {
2997 assert(Arg < getNumArgs() && "Arg access out of range!");
2998 return getArgs()[Arg];
2999 }
3000
3001 /// setArg - Set the specified argument.
3002 /// ! the dependence bits might be stale after calling this setter, it is
3003 /// *caller*'s responsibility to recompute them by calling
3004 /// computeDependence().
setArg(unsigned Arg,Expr * ArgExpr)3005 void setArg(unsigned Arg, Expr *ArgExpr) {
3006 assert(Arg < getNumArgs() && "Arg access out of range!");
3007 getArgs()[Arg] = ArgExpr;
3008 }
3009
3010 /// Compute and set dependence bits.
computeDependence()3011 void computeDependence() {
3012 setDependence(clang::computeDependence(
3013 this, llvm::makeArrayRef(
3014 reinterpret_cast<Expr **>(getTrailingStmts() + PREARGS_START),
3015 getNumPreArgs())));
3016 }
3017
3018 /// Reduce the number of arguments in this call expression. This is used for
3019 /// example during error recovery to drop extra arguments. There is no way
3020 /// to perform the opposite because: 1.) We don't track how much storage
3021 /// we have for the argument array 2.) This would potentially require growing
3022 /// the argument array, something we cannot support since the arguments are
3023 /// stored in a trailing array.
shrinkNumArgs(unsigned NewNumArgs)3024 void shrinkNumArgs(unsigned NewNumArgs) {
3025 assert((NewNumArgs <= getNumArgs()) &&
3026 "shrinkNumArgs cannot increase the number of arguments!");
3027 NumArgs = NewNumArgs;
3028 }
3029
3030 /// Bluntly set a new number of arguments without doing any checks whatsoever.
3031 /// Only used during construction of a CallExpr in a few places in Sema.
3032 /// FIXME: Find a way to remove it.
setNumArgsUnsafe(unsigned NewNumArgs)3033 void setNumArgsUnsafe(unsigned NewNumArgs) { NumArgs = NewNumArgs; }
3034
3035 typedef ExprIterator arg_iterator;
3036 typedef ConstExprIterator const_arg_iterator;
3037 typedef llvm::iterator_range<arg_iterator> arg_range;
3038 typedef llvm::iterator_range<const_arg_iterator> const_arg_range;
3039
arguments()3040 arg_range arguments() { return arg_range(arg_begin(), arg_end()); }
arguments()3041 const_arg_range arguments() const {
3042 return const_arg_range(arg_begin(), arg_end());
3043 }
3044
arg_begin()3045 arg_iterator arg_begin() {
3046 return getTrailingStmts() + PREARGS_START + getNumPreArgs();
3047 }
arg_end()3048 arg_iterator arg_end() { return arg_begin() + getNumArgs(); }
3049
arg_begin()3050 const_arg_iterator arg_begin() const {
3051 return getTrailingStmts() + PREARGS_START + getNumPreArgs();
3052 }
arg_end()3053 const_arg_iterator arg_end() const { return arg_begin() + getNumArgs(); }
3054
3055 /// This method provides fast access to all the subexpressions of
3056 /// a CallExpr without going through the slower virtual child_iterator
3057 /// interface. This provides efficient reverse iteration of the
3058 /// subexpressions. This is currently used for CFG construction.
getRawSubExprs()3059 ArrayRef<Stmt *> getRawSubExprs() {
3060 return llvm::makeArrayRef(getTrailingStmts(),
3061 PREARGS_START + getNumPreArgs() + getNumArgs());
3062 }
3063
3064 /// getNumCommas - Return the number of commas that must have been present in
3065 /// this function call.
getNumCommas()3066 unsigned getNumCommas() const { return getNumArgs() ? getNumArgs() - 1 : 0; }
3067
3068 /// Get FPOptionsOverride from trailing storage.
getStoredFPFeatures()3069 FPOptionsOverride getStoredFPFeatures() const {
3070 assert(hasStoredFPFeatures());
3071 return *getTrailingFPFeatures();
3072 }
3073 /// Set FPOptionsOverride in trailing storage. Used only by Serialization.
setStoredFPFeatures(FPOptionsOverride F)3074 void setStoredFPFeatures(FPOptionsOverride F) {
3075 assert(hasStoredFPFeatures());
3076 *getTrailingFPFeatures() = F;
3077 }
3078
3079 // Get the FP features status of this operator. Only meaningful for
3080 // operations on floating point types.
getFPFeaturesInEffect(const LangOptions & LO)3081 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const {
3082 if (hasStoredFPFeatures())
3083 return getStoredFPFeatures().applyOverrides(LO);
3084 return FPOptions::defaultWithoutTrailingStorage(LO);
3085 }
3086
getFPFeatures()3087 FPOptionsOverride getFPFeatures() const {
3088 if (hasStoredFPFeatures())
3089 return getStoredFPFeatures();
3090 return FPOptionsOverride();
3091 }
3092
3093 /// getBuiltinCallee - If this is a call to a builtin, return the builtin ID
3094 /// of the callee. If not, return 0.
3095 unsigned getBuiltinCallee() const;
3096
3097 /// Returns \c true if this is a call to a builtin which does not
3098 /// evaluate side-effects within its arguments.
3099 bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const;
3100
3101 /// getCallReturnType - Get the return type of the call expr. This is not
3102 /// always the type of the expr itself, if the return type is a reference
3103 /// type.
3104 QualType getCallReturnType(const ASTContext &Ctx) const;
3105
3106 /// Returns the WarnUnusedResultAttr that is either declared on the called
3107 /// function, or its return type declaration.
3108 const Attr *getUnusedResultAttr(const ASTContext &Ctx) const;
3109
3110 /// Returns true if this call expression should warn on unused results.
hasUnusedResultAttr(const ASTContext & Ctx)3111 bool hasUnusedResultAttr(const ASTContext &Ctx) const {
3112 return getUnusedResultAttr(Ctx) != nullptr;
3113 }
3114
getRParenLoc()3115 SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation L)3116 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
3117
3118 SourceLocation getBeginLoc() const LLVM_READONLY;
3119 SourceLocation getEndLoc() const LLVM_READONLY;
3120
3121 /// Return true if this is a call to __assume() or __builtin_assume() with
3122 /// a non-value-dependent constant parameter evaluating as false.
3123 bool isBuiltinAssumeFalse(const ASTContext &Ctx) const;
3124
3125 /// Used by Sema to implement MSVC-compatible delayed name lookup.
3126 /// (Usually Exprs themselves should set dependence).
markDependentForPostponedNameLookup()3127 void markDependentForPostponedNameLookup() {
3128 setDependence(getDependence() | ExprDependence::TypeValueInstantiation);
3129 }
3130
3131 bool isCallToStdMove() const;
3132
classof(const Stmt * T)3133 static bool classof(const Stmt *T) {
3134 return T->getStmtClass() >= firstCallExprConstant &&
3135 T->getStmtClass() <= lastCallExprConstant;
3136 }
3137
3138 // Iterators
children()3139 child_range children() {
3140 return child_range(getTrailingStmts(), getTrailingStmts() + PREARGS_START +
3141 getNumPreArgs() + getNumArgs());
3142 }
3143
children()3144 const_child_range children() const {
3145 return const_child_range(getTrailingStmts(),
3146 getTrailingStmts() + PREARGS_START +
3147 getNumPreArgs() + getNumArgs());
3148 }
3149 };
3150
3151 /// Extra data stored in some MemberExpr objects.
3152 struct MemberExprNameQualifier {
3153 /// The nested-name-specifier that qualifies the name, including
3154 /// source-location information.
3155 NestedNameSpecifierLoc QualifierLoc;
3156
3157 /// The DeclAccessPair through which the MemberDecl was found due to
3158 /// name qualifiers.
3159 DeclAccessPair FoundDecl;
3160 };
3161
3162 /// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F.
3163 ///
3164 class MemberExpr final
3165 : public Expr,
3166 private llvm::TrailingObjects<MemberExpr, MemberExprNameQualifier,
3167 ASTTemplateKWAndArgsInfo,
3168 TemplateArgumentLoc> {
3169 friend class ASTReader;
3170 friend class ASTStmtReader;
3171 friend class ASTStmtWriter;
3172 friend TrailingObjects;
3173
3174 /// Base - the expression for the base pointer or structure references. In
3175 /// X.F, this is "X".
3176 Stmt *Base;
3177
3178 /// MemberDecl - This is the decl being referenced by the field/member name.
3179 /// In X.F, this is the decl referenced by F.
3180 ValueDecl *MemberDecl;
3181
3182 /// MemberDNLoc - Provides source/type location info for the
3183 /// declaration name embedded in MemberDecl.
3184 DeclarationNameLoc MemberDNLoc;
3185
3186 /// MemberLoc - This is the location of the member name.
3187 SourceLocation MemberLoc;
3188
numTrailingObjects(OverloadToken<MemberExprNameQualifier>)3189 size_t numTrailingObjects(OverloadToken<MemberExprNameQualifier>) const {
3190 return hasQualifierOrFoundDecl();
3191 }
3192
numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>)3193 size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
3194 return hasTemplateKWAndArgsInfo();
3195 }
3196
hasQualifierOrFoundDecl()3197 bool hasQualifierOrFoundDecl() const {
3198 return MemberExprBits.HasQualifierOrFoundDecl;
3199 }
3200
hasTemplateKWAndArgsInfo()3201 bool hasTemplateKWAndArgsInfo() const {
3202 return MemberExprBits.HasTemplateKWAndArgsInfo;
3203 }
3204
3205 MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
3206 ValueDecl *MemberDecl, const DeclarationNameInfo &NameInfo,
3207 QualType T, ExprValueKind VK, ExprObjectKind OK,
3208 NonOdrUseReason NOUR);
MemberExpr(EmptyShell Empty)3209 MemberExpr(EmptyShell Empty)
3210 : Expr(MemberExprClass, Empty), Base(), MemberDecl() {}
3211
3212 public:
3213 static MemberExpr *Create(const ASTContext &C, Expr *Base, bool IsArrow,
3214 SourceLocation OperatorLoc,
3215 NestedNameSpecifierLoc QualifierLoc,
3216 SourceLocation TemplateKWLoc, ValueDecl *MemberDecl,
3217 DeclAccessPair FoundDecl,
3218 DeclarationNameInfo MemberNameInfo,
3219 const TemplateArgumentListInfo *TemplateArgs,
3220 QualType T, ExprValueKind VK, ExprObjectKind OK,
3221 NonOdrUseReason NOUR);
3222
3223 /// Create an implicit MemberExpr, with no location, qualifier, template
3224 /// arguments, and so on. Suitable only for non-static member access.
CreateImplicit(const ASTContext & C,Expr * Base,bool IsArrow,ValueDecl * MemberDecl,QualType T,ExprValueKind VK,ExprObjectKind OK)3225 static MemberExpr *CreateImplicit(const ASTContext &C, Expr *Base,
3226 bool IsArrow, ValueDecl *MemberDecl,
3227 QualType T, ExprValueKind VK,
3228 ExprObjectKind OK) {
3229 return Create(C, Base, IsArrow, SourceLocation(), NestedNameSpecifierLoc(),
3230 SourceLocation(), MemberDecl,
3231 DeclAccessPair::make(MemberDecl, MemberDecl->getAccess()),
3232 DeclarationNameInfo(), nullptr, T, VK, OK, NOUR_None);
3233 }
3234
3235 static MemberExpr *CreateEmpty(const ASTContext &Context, bool HasQualifier,
3236 bool HasFoundDecl,
3237 bool HasTemplateKWAndArgsInfo,
3238 unsigned NumTemplateArgs);
3239
setBase(Expr * E)3240 void setBase(Expr *E) { Base = E; }
getBase()3241 Expr *getBase() const { return cast<Expr>(Base); }
3242
3243 /// Retrieve the member declaration to which this expression refers.
3244 ///
3245 /// The returned declaration will be a FieldDecl or (in C++) a VarDecl (for
3246 /// static data members), a CXXMethodDecl, or an EnumConstantDecl.
getMemberDecl()3247 ValueDecl *getMemberDecl() const { return MemberDecl; }
3248 void setMemberDecl(ValueDecl *D);
3249
3250 /// Retrieves the declaration found by lookup.
getFoundDecl()3251 DeclAccessPair getFoundDecl() const {
3252 if (!hasQualifierOrFoundDecl())
3253 return DeclAccessPair::make(getMemberDecl(),
3254 getMemberDecl()->getAccess());
3255 return getTrailingObjects<MemberExprNameQualifier>()->FoundDecl;
3256 }
3257
3258 /// Determines whether this member expression actually had
3259 /// a C++ nested-name-specifier prior to the name of the member, e.g.,
3260 /// x->Base::foo.
hasQualifier()3261 bool hasQualifier() const { return getQualifier() != nullptr; }
3262
3263 /// If the member name was qualified, retrieves the
3264 /// nested-name-specifier that precedes the member name, with source-location
3265 /// information.
getQualifierLoc()3266 NestedNameSpecifierLoc getQualifierLoc() const {
3267 if (!hasQualifierOrFoundDecl())
3268 return NestedNameSpecifierLoc();
3269 return getTrailingObjects<MemberExprNameQualifier>()->QualifierLoc;
3270 }
3271
3272 /// If the member name was qualified, retrieves the
3273 /// nested-name-specifier that precedes the member name. Otherwise, returns
3274 /// NULL.
getQualifier()3275 NestedNameSpecifier *getQualifier() const {
3276 return getQualifierLoc().getNestedNameSpecifier();
3277 }
3278
3279 /// Retrieve the location of the template keyword preceding
3280 /// the member name, if any.
getTemplateKeywordLoc()3281 SourceLocation getTemplateKeywordLoc() const {
3282 if (!hasTemplateKWAndArgsInfo())
3283 return SourceLocation();
3284 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
3285 }
3286
3287 /// Retrieve the location of the left angle bracket starting the
3288 /// explicit template argument list following the member name, if any.
getLAngleLoc()3289 SourceLocation getLAngleLoc() const {
3290 if (!hasTemplateKWAndArgsInfo())
3291 return SourceLocation();
3292 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
3293 }
3294
3295 /// Retrieve the location of the right angle bracket ending the
3296 /// explicit template argument list following the member name, if any.
getRAngleLoc()3297 SourceLocation getRAngleLoc() const {
3298 if (!hasTemplateKWAndArgsInfo())
3299 return SourceLocation();
3300 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
3301 }
3302
3303 /// Determines whether the member name was preceded by the template keyword.
hasTemplateKeyword()3304 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3305
3306 /// Determines whether the member name was followed by an
3307 /// explicit template argument list.
hasExplicitTemplateArgs()3308 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3309
3310 /// Copies the template arguments (if present) into the given
3311 /// structure.
copyTemplateArgumentsInto(TemplateArgumentListInfo & List)3312 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
3313 if (hasExplicitTemplateArgs())
3314 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
3315 getTrailingObjects<TemplateArgumentLoc>(), List);
3316 }
3317
3318 /// Retrieve the template arguments provided as part of this
3319 /// template-id.
getTemplateArgs()3320 const TemplateArgumentLoc *getTemplateArgs() const {
3321 if (!hasExplicitTemplateArgs())
3322 return nullptr;
3323
3324 return getTrailingObjects<TemplateArgumentLoc>();
3325 }
3326
3327 /// Retrieve the number of template arguments provided as part of this
3328 /// template-id.
getNumTemplateArgs()3329 unsigned getNumTemplateArgs() const {
3330 if (!hasExplicitTemplateArgs())
3331 return 0;
3332
3333 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
3334 }
3335
template_arguments()3336 ArrayRef<TemplateArgumentLoc> template_arguments() const {
3337 return {getTemplateArgs(), getNumTemplateArgs()};
3338 }
3339
3340 /// Retrieve the member declaration name info.
getMemberNameInfo()3341 DeclarationNameInfo getMemberNameInfo() const {
3342 return DeclarationNameInfo(MemberDecl->getDeclName(),
3343 MemberLoc, MemberDNLoc);
3344 }
3345
getOperatorLoc()3346 SourceLocation getOperatorLoc() const { return MemberExprBits.OperatorLoc; }
3347
isArrow()3348 bool isArrow() const { return MemberExprBits.IsArrow; }
setArrow(bool A)3349 void setArrow(bool A) { MemberExprBits.IsArrow = A; }
3350
3351 /// getMemberLoc - Return the location of the "member", in X->F, it is the
3352 /// location of 'F'.
getMemberLoc()3353 SourceLocation getMemberLoc() const { return MemberLoc; }
setMemberLoc(SourceLocation L)3354 void setMemberLoc(SourceLocation L) { MemberLoc = L; }
3355
3356 SourceLocation getBeginLoc() const LLVM_READONLY;
3357 SourceLocation getEndLoc() const LLVM_READONLY;
3358
getExprLoc()3359 SourceLocation getExprLoc() const LLVM_READONLY { return MemberLoc; }
3360
3361 /// Determine whether the base of this explicit is implicit.
isImplicitAccess()3362 bool isImplicitAccess() const {
3363 return getBase() && getBase()->isImplicitCXXThis();
3364 }
3365
3366 /// Returns true if this member expression refers to a method that
3367 /// was resolved from an overloaded set having size greater than 1.
hadMultipleCandidates()3368 bool hadMultipleCandidates() const {
3369 return MemberExprBits.HadMultipleCandidates;
3370 }
3371 /// Sets the flag telling whether this expression refers to
3372 /// a method that was resolved from an overloaded set having size
3373 /// greater than 1.
3374 void setHadMultipleCandidates(bool V = true) {
3375 MemberExprBits.HadMultipleCandidates = V;
3376 }
3377
3378 /// Returns true if virtual dispatch is performed.
3379 /// If the member access is fully qualified, (i.e. X::f()), virtual
3380 /// dispatching is not performed. In -fapple-kext mode qualified
3381 /// calls to virtual method will still go through the vtable.
performsVirtualDispatch(const LangOptions & LO)3382 bool performsVirtualDispatch(const LangOptions &LO) const {
3383 return LO.AppleKext || !hasQualifier();
3384 }
3385
3386 /// Is this expression a non-odr-use reference, and if so, why?
3387 /// This is only meaningful if the named member is a static member.
isNonOdrUse()3388 NonOdrUseReason isNonOdrUse() const {
3389 return static_cast<NonOdrUseReason>(MemberExprBits.NonOdrUseReason);
3390 }
3391
classof(const Stmt * T)3392 static bool classof(const Stmt *T) {
3393 return T->getStmtClass() == MemberExprClass;
3394 }
3395
3396 // Iterators
children()3397 child_range children() { return child_range(&Base, &Base+1); }
children()3398 const_child_range children() const {
3399 return const_child_range(&Base, &Base + 1);
3400 }
3401 };
3402
3403 /// CompoundLiteralExpr - [C99 6.5.2.5]
3404 ///
3405 class CompoundLiteralExpr : public Expr {
3406 /// LParenLoc - If non-null, this is the location of the left paren in a
3407 /// compound literal like "(int){4}". This can be null if this is a
3408 /// synthesized compound expression.
3409 SourceLocation LParenLoc;
3410
3411 /// The type as written. This can be an incomplete array type, in
3412 /// which case the actual expression type will be different.
3413 /// The int part of the pair stores whether this expr is file scope.
3414 llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfoAndScope;
3415 Stmt *Init;
3416 public:
CompoundLiteralExpr(SourceLocation lparenloc,TypeSourceInfo * tinfo,QualType T,ExprValueKind VK,Expr * init,bool fileScope)3417 CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo,
3418 QualType T, ExprValueKind VK, Expr *init, bool fileScope)
3419 : Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary),
3420 LParenLoc(lparenloc), TInfoAndScope(tinfo, fileScope), Init(init) {
3421 setDependence(computeDependence(this));
3422 }
3423
3424 /// Construct an empty compound literal.
CompoundLiteralExpr(EmptyShell Empty)3425 explicit CompoundLiteralExpr(EmptyShell Empty)
3426 : Expr(CompoundLiteralExprClass, Empty) { }
3427
getInitializer()3428 const Expr *getInitializer() const { return cast<Expr>(Init); }
getInitializer()3429 Expr *getInitializer() { return cast<Expr>(Init); }
setInitializer(Expr * E)3430 void setInitializer(Expr *E) { Init = E; }
3431
isFileScope()3432 bool isFileScope() const { return TInfoAndScope.getInt(); }
setFileScope(bool FS)3433 void setFileScope(bool FS) { TInfoAndScope.setInt(FS); }
3434
getLParenLoc()3435 SourceLocation getLParenLoc() const { return LParenLoc; }
setLParenLoc(SourceLocation L)3436 void setLParenLoc(SourceLocation L) { LParenLoc = L; }
3437
getTypeSourceInfo()3438 TypeSourceInfo *getTypeSourceInfo() const {
3439 return TInfoAndScope.getPointer();
3440 }
setTypeSourceInfo(TypeSourceInfo * tinfo)3441 void setTypeSourceInfo(TypeSourceInfo *tinfo) {
3442 TInfoAndScope.setPointer(tinfo);
3443 }
3444
getBeginLoc()3445 SourceLocation getBeginLoc() const LLVM_READONLY {
3446 // FIXME: Init should never be null.
3447 if (!Init)
3448 return SourceLocation();
3449 if (LParenLoc.isInvalid())
3450 return Init->getBeginLoc();
3451 return LParenLoc;
3452 }
getEndLoc()3453 SourceLocation getEndLoc() const LLVM_READONLY {
3454 // FIXME: Init should never be null.
3455 if (!Init)
3456 return SourceLocation();
3457 return Init->getEndLoc();
3458 }
3459
classof(const Stmt * T)3460 static bool classof(const Stmt *T) {
3461 return T->getStmtClass() == CompoundLiteralExprClass;
3462 }
3463
3464 // Iterators
children()3465 child_range children() { return child_range(&Init, &Init+1); }
children()3466 const_child_range children() const {
3467 return const_child_range(&Init, &Init + 1);
3468 }
3469 };
3470
3471 /// CastExpr - Base class for type casts, including both implicit
3472 /// casts (ImplicitCastExpr) and explicit casts that have some
3473 /// representation in the source code (ExplicitCastExpr's derived
3474 /// classes).
3475 class CastExpr : public Expr {
3476 Stmt *Op;
3477
3478 bool CastConsistency() const;
3479
path_buffer()3480 const CXXBaseSpecifier * const *path_buffer() const {
3481 return const_cast<CastExpr*>(this)->path_buffer();
3482 }
3483 CXXBaseSpecifier **path_buffer();
3484
3485 friend class ASTStmtReader;
3486
3487 protected:
CastExpr(StmtClass SC,QualType ty,ExprValueKind VK,const CastKind kind,Expr * op,unsigned BasePathSize,bool HasFPFeatures)3488 CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind,
3489 Expr *op, unsigned BasePathSize, bool HasFPFeatures)
3490 : Expr(SC, ty, VK, OK_Ordinary), Op(op) {
3491 CastExprBits.Kind = kind;
3492 CastExprBits.PartOfExplicitCast = false;
3493 CastExprBits.BasePathSize = BasePathSize;
3494 assert((CastExprBits.BasePathSize == BasePathSize) &&
3495 "BasePathSize overflow!");
3496 assert(CastConsistency());
3497 CastExprBits.HasFPFeatures = HasFPFeatures;
3498 }
3499
3500 /// Construct an empty cast.
CastExpr(StmtClass SC,EmptyShell Empty,unsigned BasePathSize,bool HasFPFeatures)3501 CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize,
3502 bool HasFPFeatures)
3503 : Expr(SC, Empty) {
3504 CastExprBits.PartOfExplicitCast = false;
3505 CastExprBits.BasePathSize = BasePathSize;
3506 CastExprBits.HasFPFeatures = HasFPFeatures;
3507 assert((CastExprBits.BasePathSize == BasePathSize) &&
3508 "BasePathSize overflow!");
3509 }
3510
3511 /// Return a pointer to the trailing FPOptions.
3512 /// \pre hasStoredFPFeatures() == true
3513 FPOptionsOverride *getTrailingFPFeatures();
getTrailingFPFeatures()3514 const FPOptionsOverride *getTrailingFPFeatures() const {
3515 return const_cast<CastExpr *>(this)->getTrailingFPFeatures();
3516 }
3517
3518 public:
getCastKind()3519 CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; }
setCastKind(CastKind K)3520 void setCastKind(CastKind K) { CastExprBits.Kind = K; }
3521
3522 static const char *getCastKindName(CastKind CK);
getCastKindName()3523 const char *getCastKindName() const { return getCastKindName(getCastKind()); }
3524
getSubExpr()3525 Expr *getSubExpr() { return cast<Expr>(Op); }
getSubExpr()3526 const Expr *getSubExpr() const { return cast<Expr>(Op); }
setSubExpr(Expr * E)3527 void setSubExpr(Expr *E) { Op = E; }
3528
3529 /// Retrieve the cast subexpression as it was written in the source
3530 /// code, looking through any implicit casts or other intermediate nodes
3531 /// introduced by semantic analysis.
3532 Expr *getSubExprAsWritten();
getSubExprAsWritten()3533 const Expr *getSubExprAsWritten() const {
3534 return const_cast<CastExpr *>(this)->getSubExprAsWritten();
3535 }
3536
3537 /// If this cast applies a user-defined conversion, retrieve the conversion
3538 /// function that it invokes.
3539 NamedDecl *getConversionFunction() const;
3540
3541 typedef CXXBaseSpecifier **path_iterator;
3542 typedef const CXXBaseSpecifier *const *path_const_iterator;
path_empty()3543 bool path_empty() const { return path_size() == 0; }
path_size()3544 unsigned path_size() const { return CastExprBits.BasePathSize; }
path_begin()3545 path_iterator path_begin() { return path_buffer(); }
path_end()3546 path_iterator path_end() { return path_buffer() + path_size(); }
path_begin()3547 path_const_iterator path_begin() const { return path_buffer(); }
path_end()3548 path_const_iterator path_end() const { return path_buffer() + path_size(); }
3549
path()3550 llvm::iterator_range<path_iterator> path() {
3551 return llvm::make_range(path_begin(), path_end());
3552 }
path()3553 llvm::iterator_range<path_const_iterator> path() const {
3554 return llvm::make_range(path_begin(), path_end());
3555 }
3556
getTargetUnionField()3557 const FieldDecl *getTargetUnionField() const {
3558 assert(getCastKind() == CK_ToUnion);
3559 return getTargetFieldForToUnionCast(getType(), getSubExpr()->getType());
3560 }
3561
hasStoredFPFeatures()3562 bool hasStoredFPFeatures() const { return CastExprBits.HasFPFeatures; }
3563
3564 /// Get FPOptionsOverride from trailing storage.
getStoredFPFeatures()3565 FPOptionsOverride getStoredFPFeatures() const {
3566 assert(hasStoredFPFeatures());
3567 return *getTrailingFPFeatures();
3568 }
3569
3570 // Get the FP features status of this operation. Only meaningful for
3571 // operations on floating point types.
getFPFeaturesInEffect(const LangOptions & LO)3572 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const {
3573 if (hasStoredFPFeatures())
3574 return getStoredFPFeatures().applyOverrides(LO);
3575 return FPOptions::defaultWithoutTrailingStorage(LO);
3576 }
3577
getFPFeatures()3578 FPOptionsOverride getFPFeatures() const {
3579 if (hasStoredFPFeatures())
3580 return getStoredFPFeatures();
3581 return FPOptionsOverride();
3582 }
3583
3584 static const FieldDecl *getTargetFieldForToUnionCast(QualType unionType,
3585 QualType opType);
3586 static const FieldDecl *getTargetFieldForToUnionCast(const RecordDecl *RD,
3587 QualType opType);
3588
classof(const Stmt * T)3589 static bool classof(const Stmt *T) {
3590 return T->getStmtClass() >= firstCastExprConstant &&
3591 T->getStmtClass() <= lastCastExprConstant;
3592 }
3593
3594 // Iterators
children()3595 child_range children() { return child_range(&Op, &Op+1); }
children()3596 const_child_range children() const { return const_child_range(&Op, &Op + 1); }
3597 };
3598
3599 /// ImplicitCastExpr - Allows us to explicitly represent implicit type
3600 /// conversions, which have no direct representation in the original
3601 /// source code. For example: converting T[]->T*, void f()->void
3602 /// (*f)(), float->double, short->int, etc.
3603 ///
3604 /// In C, implicit casts always produce rvalues. However, in C++, an
3605 /// implicit cast whose result is being bound to a reference will be
3606 /// an lvalue or xvalue. For example:
3607 ///
3608 /// @code
3609 /// class Base { };
3610 /// class Derived : public Base { };
3611 /// Derived &&ref();
3612 /// void f(Derived d) {
3613 /// Base& b = d; // initializer is an ImplicitCastExpr
3614 /// // to an lvalue of type Base
3615 /// Base&& r = ref(); // initializer is an ImplicitCastExpr
3616 /// // to an xvalue of type Base
3617 /// }
3618 /// @endcode
3619 class ImplicitCastExpr final
3620 : public CastExpr,
3621 private llvm::TrailingObjects<ImplicitCastExpr, CXXBaseSpecifier *,
3622 FPOptionsOverride> {
3623
ImplicitCastExpr(QualType ty,CastKind kind,Expr * op,unsigned BasePathLength,FPOptionsOverride FPO,ExprValueKind VK)3624 ImplicitCastExpr(QualType ty, CastKind kind, Expr *op,
3625 unsigned BasePathLength, FPOptionsOverride FPO,
3626 ExprValueKind VK)
3627 : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength,
3628 FPO.requiresTrailingStorage()) {
3629 setDependence(computeDependence(this));
3630 if (hasStoredFPFeatures())
3631 *getTrailingFPFeatures() = FPO;
3632 }
3633
3634 /// Construct an empty implicit cast.
ImplicitCastExpr(EmptyShell Shell,unsigned PathSize,bool HasFPFeatures)3635 explicit ImplicitCastExpr(EmptyShell Shell, unsigned PathSize,
3636 bool HasFPFeatures)
3637 : CastExpr(ImplicitCastExprClass, Shell, PathSize, HasFPFeatures) {}
3638
numTrailingObjects(OverloadToken<CXXBaseSpecifier * >)3639 unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const {
3640 return path_size();
3641 }
3642
3643 public:
3644 enum OnStack_t { OnStack };
ImplicitCastExpr(OnStack_t _,QualType ty,CastKind kind,Expr * op,ExprValueKind VK,FPOptionsOverride FPO)3645 ImplicitCastExpr(OnStack_t _, QualType ty, CastKind kind, Expr *op,
3646 ExprValueKind VK, FPOptionsOverride FPO)
3647 : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0,
3648 FPO.requiresTrailingStorage()) {
3649 if (hasStoredFPFeatures())
3650 *getTrailingFPFeatures() = FPO;
3651 }
3652
isPartOfExplicitCast()3653 bool isPartOfExplicitCast() const { return CastExprBits.PartOfExplicitCast; }
setIsPartOfExplicitCast(bool PartOfExplicitCast)3654 void setIsPartOfExplicitCast(bool PartOfExplicitCast) {
3655 CastExprBits.PartOfExplicitCast = PartOfExplicitCast;
3656 }
3657
3658 static ImplicitCastExpr *Create(const ASTContext &Context, QualType T,
3659 CastKind Kind, Expr *Operand,
3660 const CXXCastPath *BasePath,
3661 ExprValueKind Cat, FPOptionsOverride FPO);
3662
3663 static ImplicitCastExpr *CreateEmpty(const ASTContext &Context,
3664 unsigned PathSize, bool HasFPFeatures);
3665
getBeginLoc()3666 SourceLocation getBeginLoc() const LLVM_READONLY {
3667 return getSubExpr()->getBeginLoc();
3668 }
getEndLoc()3669 SourceLocation getEndLoc() const LLVM_READONLY {
3670 return getSubExpr()->getEndLoc();
3671 }
3672
classof(const Stmt * T)3673 static bool classof(const Stmt *T) {
3674 return T->getStmtClass() == ImplicitCastExprClass;
3675 }
3676
3677 friend TrailingObjects;
3678 friend class CastExpr;
3679 };
3680
3681 /// ExplicitCastExpr - An explicit cast written in the source
3682 /// code.
3683 ///
3684 /// This class is effectively an abstract class, because it provides
3685 /// the basic representation of an explicitly-written cast without
3686 /// specifying which kind of cast (C cast, functional cast, static
3687 /// cast, etc.) was written; specific derived classes represent the
3688 /// particular style of cast and its location information.
3689 ///
3690 /// Unlike implicit casts, explicit cast nodes have two different
3691 /// types: the type that was written into the source code, and the
3692 /// actual type of the expression as determined by semantic
3693 /// analysis. These types may differ slightly. For example, in C++ one
3694 /// can cast to a reference type, which indicates that the resulting
3695 /// expression will be an lvalue or xvalue. The reference type, however,
3696 /// will not be used as the type of the expression.
3697 class ExplicitCastExpr : public CastExpr {
3698 /// TInfo - Source type info for the (written) type
3699 /// this expression is casting to.
3700 TypeSourceInfo *TInfo;
3701
3702 protected:
ExplicitCastExpr(StmtClass SC,QualType exprTy,ExprValueKind VK,CastKind kind,Expr * op,unsigned PathSize,bool HasFPFeatures,TypeSourceInfo * writtenTy)3703 ExplicitCastExpr(StmtClass SC, QualType exprTy, ExprValueKind VK,
3704 CastKind kind, Expr *op, unsigned PathSize,
3705 bool HasFPFeatures, TypeSourceInfo *writtenTy)
3706 : CastExpr(SC, exprTy, VK, kind, op, PathSize, HasFPFeatures),
3707 TInfo(writtenTy) {
3708 setDependence(computeDependence(this));
3709 }
3710
3711 /// Construct an empty explicit cast.
ExplicitCastExpr(StmtClass SC,EmptyShell Shell,unsigned PathSize,bool HasFPFeatures)3712 ExplicitCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize,
3713 bool HasFPFeatures)
3714 : CastExpr(SC, Shell, PathSize, HasFPFeatures) {}
3715
3716 public:
3717 /// getTypeInfoAsWritten - Returns the type source info for the type
3718 /// that this expression is casting to.
getTypeInfoAsWritten()3719 TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; }
setTypeInfoAsWritten(TypeSourceInfo * writtenTy)3720 void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; }
3721
3722 /// getTypeAsWritten - Returns the type that this expression is
3723 /// casting to, as written in the source code.
getTypeAsWritten()3724 QualType getTypeAsWritten() const { return TInfo->getType(); }
3725
classof(const Stmt * T)3726 static bool classof(const Stmt *T) {
3727 return T->getStmtClass() >= firstExplicitCastExprConstant &&
3728 T->getStmtClass() <= lastExplicitCastExprConstant;
3729 }
3730 };
3731
3732 /// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style
3733 /// cast in C++ (C++ [expr.cast]), which uses the syntax
3734 /// (Type)expr. For example: @c (int)f.
3735 class CStyleCastExpr final
3736 : public ExplicitCastExpr,
3737 private llvm::TrailingObjects<CStyleCastExpr, CXXBaseSpecifier *,
3738 FPOptionsOverride> {
3739 SourceLocation LPLoc; // the location of the left paren
3740 SourceLocation RPLoc; // the location of the right paren
3741
CStyleCastExpr(QualType exprTy,ExprValueKind vk,CastKind kind,Expr * op,unsigned PathSize,FPOptionsOverride FPO,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation r)3742 CStyleCastExpr(QualType exprTy, ExprValueKind vk, CastKind kind, Expr *op,
3743 unsigned PathSize, FPOptionsOverride FPO,
3744 TypeSourceInfo *writtenTy, SourceLocation l, SourceLocation r)
3745 : ExplicitCastExpr(CStyleCastExprClass, exprTy, vk, kind, op, PathSize,
3746 FPO.requiresTrailingStorage(), writtenTy),
3747 LPLoc(l), RPLoc(r) {
3748 if (hasStoredFPFeatures())
3749 *getTrailingFPFeatures() = FPO;
3750 }
3751
3752 /// Construct an empty C-style explicit cast.
CStyleCastExpr(EmptyShell Shell,unsigned PathSize,bool HasFPFeatures)3753 explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize,
3754 bool HasFPFeatures)
3755 : ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize, HasFPFeatures) {}
3756
numTrailingObjects(OverloadToken<CXXBaseSpecifier * >)3757 unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const {
3758 return path_size();
3759 }
3760
3761 public:
3762 static CStyleCastExpr *
3763 Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K,
3764 Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO,
3765 TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R);
3766
3767 static CStyleCastExpr *CreateEmpty(const ASTContext &Context,
3768 unsigned PathSize, bool HasFPFeatures);
3769
getLParenLoc()3770 SourceLocation getLParenLoc() const { return LPLoc; }
setLParenLoc(SourceLocation L)3771 void setLParenLoc(SourceLocation L) { LPLoc = L; }
3772
getRParenLoc()3773 SourceLocation getRParenLoc() const { return RPLoc; }
setRParenLoc(SourceLocation L)3774 void setRParenLoc(SourceLocation L) { RPLoc = L; }
3775
getBeginLoc()3776 SourceLocation getBeginLoc() const LLVM_READONLY { return LPLoc; }
getEndLoc()3777 SourceLocation getEndLoc() const LLVM_READONLY {
3778 return getSubExpr()->getEndLoc();
3779 }
3780
classof(const Stmt * T)3781 static bool classof(const Stmt *T) {
3782 return T->getStmtClass() == CStyleCastExprClass;
3783 }
3784
3785 friend TrailingObjects;
3786 friend class CastExpr;
3787 };
3788
3789 /// A builtin binary operation expression such as "x + y" or "x <= y".
3790 ///
3791 /// This expression node kind describes a builtin binary operation,
3792 /// such as "x + y" for integer values "x" and "y". The operands will
3793 /// already have been converted to appropriate types (e.g., by
3794 /// performing promotions or conversions).
3795 ///
3796 /// In C++, where operators may be overloaded, a different kind of
3797 /// expression node (CXXOperatorCallExpr) is used to express the
3798 /// invocation of an overloaded operator with operator syntax. Within
3799 /// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is
3800 /// used to store an expression "x + y" depends on the subexpressions
3801 /// for x and y. If neither x or y is type-dependent, and the "+"
3802 /// operator resolves to a built-in operation, BinaryOperator will be
3803 /// used to express the computation (x and y may still be
3804 /// value-dependent). If either x or y is type-dependent, or if the
3805 /// "+" resolves to an overloaded operator, CXXOperatorCallExpr will
3806 /// be used to express the computation.
3807 class BinaryOperator : public Expr {
3808 enum { LHS, RHS, END_EXPR };
3809 Stmt *SubExprs[END_EXPR];
3810
3811 public:
3812 typedef BinaryOperatorKind Opcode;
3813
3814 protected:
3815 size_t offsetOfTrailingStorage() const;
3816
3817 /// Return a pointer to the trailing FPOptions
getTrailingFPFeatures()3818 FPOptionsOverride *getTrailingFPFeatures() {
3819 assert(BinaryOperatorBits.HasFPFeatures);
3820 return reinterpret_cast<FPOptionsOverride *>(
3821 reinterpret_cast<char *>(this) + offsetOfTrailingStorage());
3822 }
getTrailingFPFeatures()3823 const FPOptionsOverride *getTrailingFPFeatures() const {
3824 assert(BinaryOperatorBits.HasFPFeatures);
3825 return reinterpret_cast<const FPOptionsOverride *>(
3826 reinterpret_cast<const char *>(this) + offsetOfTrailingStorage());
3827 }
3828
3829 /// Build a binary operator, assuming that appropriate storage has been
3830 /// allocated for the trailing objects when needed.
3831 BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc,
3832 QualType ResTy, ExprValueKind VK, ExprObjectKind OK,
3833 SourceLocation opLoc, FPOptionsOverride FPFeatures);
3834
3835 /// Construct an empty binary operator.
BinaryOperator(EmptyShell Empty)3836 explicit BinaryOperator(EmptyShell Empty) : Expr(BinaryOperatorClass, Empty) {
3837 BinaryOperatorBits.Opc = BO_Comma;
3838 }
3839
3840 public:
3841 static BinaryOperator *CreateEmpty(const ASTContext &C, bool hasFPFeatures);
3842
3843 static BinaryOperator *Create(const ASTContext &C, Expr *lhs, Expr *rhs,
3844 Opcode opc, QualType ResTy, ExprValueKind VK,
3845 ExprObjectKind OK, SourceLocation opLoc,
3846 FPOptionsOverride FPFeatures);
getExprLoc()3847 SourceLocation getExprLoc() const { return getOperatorLoc(); }
getOperatorLoc()3848 SourceLocation getOperatorLoc() const { return BinaryOperatorBits.OpLoc; }
setOperatorLoc(SourceLocation L)3849 void setOperatorLoc(SourceLocation L) { BinaryOperatorBits.OpLoc = L; }
3850
getOpcode()3851 Opcode getOpcode() const {
3852 return static_cast<Opcode>(BinaryOperatorBits.Opc);
3853 }
setOpcode(Opcode Opc)3854 void setOpcode(Opcode Opc) { BinaryOperatorBits.Opc = Opc; }
3855
getLHS()3856 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
setLHS(Expr * E)3857 void setLHS(Expr *E) { SubExprs[LHS] = E; }
getRHS()3858 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
setRHS(Expr * E)3859 void setRHS(Expr *E) { SubExprs[RHS] = E; }
3860
getBeginLoc()3861 SourceLocation getBeginLoc() const LLVM_READONLY {
3862 return getLHS()->getBeginLoc();
3863 }
getEndLoc()3864 SourceLocation getEndLoc() const LLVM_READONLY {
3865 return getRHS()->getEndLoc();
3866 }
3867
3868 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
3869 /// corresponds to, e.g. "<<=".
3870 static StringRef getOpcodeStr(Opcode Op);
3871
getOpcodeStr()3872 StringRef getOpcodeStr() const { return getOpcodeStr(getOpcode()); }
3873
3874 /// Retrieve the binary opcode that corresponds to the given
3875 /// overloaded operator.
3876 static Opcode getOverloadedOpcode(OverloadedOperatorKind OO);
3877
3878 /// Retrieve the overloaded operator kind that corresponds to
3879 /// the given binary opcode.
3880 static OverloadedOperatorKind getOverloadedOperator(Opcode Opc);
3881
3882 /// predicates to categorize the respective opcodes.
isPtrMemOp(Opcode Opc)3883 static bool isPtrMemOp(Opcode Opc) {
3884 return Opc == BO_PtrMemD || Opc == BO_PtrMemI;
3885 }
isPtrMemOp()3886 bool isPtrMemOp() const { return isPtrMemOp(getOpcode()); }
3887
isMultiplicativeOp(Opcode Opc)3888 static bool isMultiplicativeOp(Opcode Opc) {
3889 return Opc >= BO_Mul && Opc <= BO_Rem;
3890 }
isMultiplicativeOp()3891 bool isMultiplicativeOp() const { return isMultiplicativeOp(getOpcode()); }
isAdditiveOp(Opcode Opc)3892 static bool isAdditiveOp(Opcode Opc) { return Opc == BO_Add || Opc==BO_Sub; }
isAdditiveOp()3893 bool isAdditiveOp() const { return isAdditiveOp(getOpcode()); }
isShiftOp(Opcode Opc)3894 static bool isShiftOp(Opcode Opc) { return Opc == BO_Shl || Opc == BO_Shr; }
isShiftOp()3895 bool isShiftOp() const { return isShiftOp(getOpcode()); }
3896
isBitwiseOp(Opcode Opc)3897 static bool isBitwiseOp(Opcode Opc) { return Opc >= BO_And && Opc <= BO_Or; }
isBitwiseOp()3898 bool isBitwiseOp() const { return isBitwiseOp(getOpcode()); }
3899
isRelationalOp(Opcode Opc)3900 static bool isRelationalOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_GE; }
isRelationalOp()3901 bool isRelationalOp() const { return isRelationalOp(getOpcode()); }
3902
isEqualityOp(Opcode Opc)3903 static bool isEqualityOp(Opcode Opc) { return Opc == BO_EQ || Opc == BO_NE; }
isEqualityOp()3904 bool isEqualityOp() const { return isEqualityOp(getOpcode()); }
3905
isComparisonOp(Opcode Opc)3906 static bool isComparisonOp(Opcode Opc) { return Opc >= BO_Cmp && Opc<=BO_NE; }
isComparisonOp()3907 bool isComparisonOp() const { return isComparisonOp(getOpcode()); }
3908
isCommaOp(Opcode Opc)3909 static bool isCommaOp(Opcode Opc) { return Opc == BO_Comma; }
isCommaOp()3910 bool isCommaOp() const { return isCommaOp(getOpcode()); }
3911
negateComparisonOp(Opcode Opc)3912 static Opcode negateComparisonOp(Opcode Opc) {
3913 switch (Opc) {
3914 default:
3915 llvm_unreachable("Not a comparison operator.");
3916 case BO_LT: return BO_GE;
3917 case BO_GT: return BO_LE;
3918 case BO_LE: return BO_GT;
3919 case BO_GE: return BO_LT;
3920 case BO_EQ: return BO_NE;
3921 case BO_NE: return BO_EQ;
3922 }
3923 }
3924
reverseComparisonOp(Opcode Opc)3925 static Opcode reverseComparisonOp(Opcode Opc) {
3926 switch (Opc) {
3927 default:
3928 llvm_unreachable("Not a comparison operator.");
3929 case BO_LT: return BO_GT;
3930 case BO_GT: return BO_LT;
3931 case BO_LE: return BO_GE;
3932 case BO_GE: return BO_LE;
3933 case BO_EQ:
3934 case BO_NE:
3935 return Opc;
3936 }
3937 }
3938
isLogicalOp(Opcode Opc)3939 static bool isLogicalOp(Opcode Opc) { return Opc == BO_LAnd || Opc==BO_LOr; }
isLogicalOp()3940 bool isLogicalOp() const { return isLogicalOp(getOpcode()); }
3941
isAssignmentOp(Opcode Opc)3942 static bool isAssignmentOp(Opcode Opc) {
3943 return Opc >= BO_Assign && Opc <= BO_OrAssign;
3944 }
isAssignmentOp()3945 bool isAssignmentOp() const { return isAssignmentOp(getOpcode()); }
3946
isCompoundAssignmentOp(Opcode Opc)3947 static bool isCompoundAssignmentOp(Opcode Opc) {
3948 return Opc > BO_Assign && Opc <= BO_OrAssign;
3949 }
isCompoundAssignmentOp()3950 bool isCompoundAssignmentOp() const {
3951 return isCompoundAssignmentOp(getOpcode());
3952 }
getOpForCompoundAssignment(Opcode Opc)3953 static Opcode getOpForCompoundAssignment(Opcode Opc) {
3954 assert(isCompoundAssignmentOp(Opc));
3955 if (Opc >= BO_AndAssign)
3956 return Opcode(unsigned(Opc) - BO_AndAssign + BO_And);
3957 else
3958 return Opcode(unsigned(Opc) - BO_MulAssign + BO_Mul);
3959 }
3960
isShiftAssignOp(Opcode Opc)3961 static bool isShiftAssignOp(Opcode Opc) {
3962 return Opc == BO_ShlAssign || Opc == BO_ShrAssign;
3963 }
isShiftAssignOp()3964 bool isShiftAssignOp() const {
3965 return isShiftAssignOp(getOpcode());
3966 }
3967
3968 // Return true if a binary operator using the specified opcode and operands
3969 // would match the 'p = (i8*)nullptr + n' idiom for casting a pointer-sized
3970 // integer to a pointer.
3971 static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc,
3972 Expr *LHS, Expr *RHS);
3973
classof(const Stmt * S)3974 static bool classof(const Stmt *S) {
3975 return S->getStmtClass() >= firstBinaryOperatorConstant &&
3976 S->getStmtClass() <= lastBinaryOperatorConstant;
3977 }
3978
3979 // Iterators
children()3980 child_range children() {
3981 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
3982 }
children()3983 const_child_range children() const {
3984 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
3985 }
3986
3987 /// Set and fetch the bit that shows whether FPFeatures needs to be
3988 /// allocated in Trailing Storage
setHasStoredFPFeatures(bool B)3989 void setHasStoredFPFeatures(bool B) { BinaryOperatorBits.HasFPFeatures = B; }
hasStoredFPFeatures()3990 bool hasStoredFPFeatures() const { return BinaryOperatorBits.HasFPFeatures; }
3991
3992 /// Get FPFeatures from trailing storage
getStoredFPFeatures()3993 FPOptionsOverride getStoredFPFeatures() const {
3994 assert(hasStoredFPFeatures());
3995 return *getTrailingFPFeatures();
3996 }
3997 /// Set FPFeatures in trailing storage, used only by Serialization
setStoredFPFeatures(FPOptionsOverride F)3998 void setStoredFPFeatures(FPOptionsOverride F) {
3999 assert(BinaryOperatorBits.HasFPFeatures);
4000 *getTrailingFPFeatures() = F;
4001 }
4002
4003 // Get the FP features status of this operator. Only meaningful for
4004 // operations on floating point types.
getFPFeaturesInEffect(const LangOptions & LO)4005 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const {
4006 if (BinaryOperatorBits.HasFPFeatures)
4007 return getStoredFPFeatures().applyOverrides(LO);
4008 return FPOptions::defaultWithoutTrailingStorage(LO);
4009 }
4010
4011 // This is used in ASTImporter
getFPFeatures(const LangOptions & LO)4012 FPOptionsOverride getFPFeatures(const LangOptions &LO) const {
4013 if (BinaryOperatorBits.HasFPFeatures)
4014 return getStoredFPFeatures();
4015 return FPOptionsOverride();
4016 }
4017
4018 // Get the FP contractability status of this operator. Only meaningful for
4019 // operations on floating point types.
isFPContractableWithinStatement(const LangOptions & LO)4020 bool isFPContractableWithinStatement(const LangOptions &LO) const {
4021 return getFPFeaturesInEffect(LO).allowFPContractWithinStatement();
4022 }
4023
4024 // Get the FENV_ACCESS status of this operator. Only meaningful for
4025 // operations on floating point types.
isFEnvAccessOn(const LangOptions & LO)4026 bool isFEnvAccessOn(const LangOptions &LO) const {
4027 return getFPFeaturesInEffect(LO).getAllowFEnvAccess();
4028 }
4029
4030 protected:
4031 BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc,
4032 QualType ResTy, ExprValueKind VK, ExprObjectKind OK,
4033 SourceLocation opLoc, FPOptionsOverride FPFeatures,
4034 bool dead2);
4035
4036 /// Construct an empty BinaryOperator, SC is CompoundAssignOperator.
BinaryOperator(StmtClass SC,EmptyShell Empty)4037 BinaryOperator(StmtClass SC, EmptyShell Empty) : Expr(SC, Empty) {
4038 BinaryOperatorBits.Opc = BO_MulAssign;
4039 }
4040
4041 /// Return the size in bytes needed for the trailing objects.
4042 /// Used to allocate the right amount of storage.
sizeOfTrailingObjects(bool HasFPFeatures)4043 static unsigned sizeOfTrailingObjects(bool HasFPFeatures) {
4044 return HasFPFeatures * sizeof(FPOptionsOverride);
4045 }
4046 };
4047
4048 /// CompoundAssignOperator - For compound assignments (e.g. +=), we keep
4049 /// track of the type the operation is performed in. Due to the semantics of
4050 /// these operators, the operands are promoted, the arithmetic performed, an
4051 /// implicit conversion back to the result type done, then the assignment takes
4052 /// place. This captures the intermediate type which the computation is done
4053 /// in.
4054 class CompoundAssignOperator : public BinaryOperator {
4055 QualType ComputationLHSType;
4056 QualType ComputationResultType;
4057
4058 /// Construct an empty CompoundAssignOperator.
CompoundAssignOperator(const ASTContext & C,EmptyShell Empty,bool hasFPFeatures)4059 explicit CompoundAssignOperator(const ASTContext &C, EmptyShell Empty,
4060 bool hasFPFeatures)
4061 : BinaryOperator(CompoundAssignOperatorClass, Empty) {}
4062
4063 protected:
CompoundAssignOperator(const ASTContext & C,Expr * lhs,Expr * rhs,Opcode opc,QualType ResType,ExprValueKind VK,ExprObjectKind OK,SourceLocation OpLoc,FPOptionsOverride FPFeatures,QualType CompLHSType,QualType CompResultType)4064 CompoundAssignOperator(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc,
4065 QualType ResType, ExprValueKind VK, ExprObjectKind OK,
4066 SourceLocation OpLoc, FPOptionsOverride FPFeatures,
4067 QualType CompLHSType, QualType CompResultType)
4068 : BinaryOperator(C, lhs, rhs, opc, ResType, VK, OK, OpLoc, FPFeatures,
4069 true),
4070 ComputationLHSType(CompLHSType), ComputationResultType(CompResultType) {
4071 assert(isCompoundAssignmentOp() &&
4072 "Only should be used for compound assignments");
4073 }
4074
4075 public:
4076 static CompoundAssignOperator *CreateEmpty(const ASTContext &C,
4077 bool hasFPFeatures);
4078
4079 static CompoundAssignOperator *
4080 Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy,
4081 ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc,
4082 FPOptionsOverride FPFeatures, QualType CompLHSType = QualType(),
4083 QualType CompResultType = QualType());
4084
4085 // The two computation types are the type the LHS is converted
4086 // to for the computation and the type of the result; the two are
4087 // distinct in a few cases (specifically, int+=ptr and ptr-=ptr).
getComputationLHSType()4088 QualType getComputationLHSType() const { return ComputationLHSType; }
setComputationLHSType(QualType T)4089 void setComputationLHSType(QualType T) { ComputationLHSType = T; }
4090
getComputationResultType()4091 QualType getComputationResultType() const { return ComputationResultType; }
setComputationResultType(QualType T)4092 void setComputationResultType(QualType T) { ComputationResultType = T; }
4093
classof(const Stmt * S)4094 static bool classof(const Stmt *S) {
4095 return S->getStmtClass() == CompoundAssignOperatorClass;
4096 }
4097 };
4098
offsetOfTrailingStorage()4099 inline size_t BinaryOperator::offsetOfTrailingStorage() const {
4100 assert(BinaryOperatorBits.HasFPFeatures);
4101 return isa<CompoundAssignOperator>(this) ? sizeof(CompoundAssignOperator)
4102 : sizeof(BinaryOperator);
4103 }
4104
4105 /// AbstractConditionalOperator - An abstract base class for
4106 /// ConditionalOperator and BinaryConditionalOperator.
4107 class AbstractConditionalOperator : public Expr {
4108 SourceLocation QuestionLoc, ColonLoc;
4109 friend class ASTStmtReader;
4110
4111 protected:
AbstractConditionalOperator(StmtClass SC,QualType T,ExprValueKind VK,ExprObjectKind OK,SourceLocation qloc,SourceLocation cloc)4112 AbstractConditionalOperator(StmtClass SC, QualType T, ExprValueKind VK,
4113 ExprObjectKind OK, SourceLocation qloc,
4114 SourceLocation cloc)
4115 : Expr(SC, T, VK, OK), QuestionLoc(qloc), ColonLoc(cloc) {}
4116
AbstractConditionalOperator(StmtClass SC,EmptyShell Empty)4117 AbstractConditionalOperator(StmtClass SC, EmptyShell Empty)
4118 : Expr(SC, Empty) { }
4119
4120 public:
4121 // getCond - Return the expression representing the condition for
4122 // the ?: operator.
4123 Expr *getCond() const;
4124
4125 // getTrueExpr - Return the subexpression representing the value of
4126 // the expression if the condition evaluates to true.
4127 Expr *getTrueExpr() const;
4128
4129 // getFalseExpr - Return the subexpression representing the value of
4130 // the expression if the condition evaluates to false. This is
4131 // the same as getRHS.
4132 Expr *getFalseExpr() const;
4133
getQuestionLoc()4134 SourceLocation getQuestionLoc() const { return QuestionLoc; }
getColonLoc()4135 SourceLocation getColonLoc() const { return ColonLoc; }
4136
classof(const Stmt * T)4137 static bool classof(const Stmt *T) {
4138 return T->getStmtClass() == ConditionalOperatorClass ||
4139 T->getStmtClass() == BinaryConditionalOperatorClass;
4140 }
4141 };
4142
4143 /// ConditionalOperator - The ?: ternary operator. The GNU "missing
4144 /// middle" extension is a BinaryConditionalOperator.
4145 class ConditionalOperator : public AbstractConditionalOperator {
4146 enum { COND, LHS, RHS, END_EXPR };
4147 Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
4148
4149 friend class ASTStmtReader;
4150 public:
ConditionalOperator(Expr * cond,SourceLocation QLoc,Expr * lhs,SourceLocation CLoc,Expr * rhs,QualType t,ExprValueKind VK,ExprObjectKind OK)4151 ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs,
4152 SourceLocation CLoc, Expr *rhs, QualType t,
4153 ExprValueKind VK, ExprObjectKind OK)
4154 : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK, QLoc,
4155 CLoc) {
4156 SubExprs[COND] = cond;
4157 SubExprs[LHS] = lhs;
4158 SubExprs[RHS] = rhs;
4159 setDependence(computeDependence(this));
4160 }
4161
4162 /// Build an empty conditional operator.
ConditionalOperator(EmptyShell Empty)4163 explicit ConditionalOperator(EmptyShell Empty)
4164 : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { }
4165
4166 // getCond - Return the expression representing the condition for
4167 // the ?: operator.
getCond()4168 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
4169
4170 // getTrueExpr - Return the subexpression representing the value of
4171 // the expression if the condition evaluates to true.
getTrueExpr()4172 Expr *getTrueExpr() const { return cast<Expr>(SubExprs[LHS]); }
4173
4174 // getFalseExpr - Return the subexpression representing the value of
4175 // the expression if the condition evaluates to false. This is
4176 // the same as getRHS.
getFalseExpr()4177 Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); }
4178
getLHS()4179 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
getRHS()4180 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
4181
getBeginLoc()4182 SourceLocation getBeginLoc() const LLVM_READONLY {
4183 return getCond()->getBeginLoc();
4184 }
getEndLoc()4185 SourceLocation getEndLoc() const LLVM_READONLY {
4186 return getRHS()->getEndLoc();
4187 }
4188
classof(const Stmt * T)4189 static bool classof(const Stmt *T) {
4190 return T->getStmtClass() == ConditionalOperatorClass;
4191 }
4192
4193 // Iterators
children()4194 child_range children() {
4195 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
4196 }
children()4197 const_child_range children() const {
4198 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
4199 }
4200 };
4201
4202 /// BinaryConditionalOperator - The GNU extension to the conditional
4203 /// operator which allows the middle operand to be omitted.
4204 ///
4205 /// This is a different expression kind on the assumption that almost
4206 /// every client ends up needing to know that these are different.
4207 class BinaryConditionalOperator : public AbstractConditionalOperator {
4208 enum { COMMON, COND, LHS, RHS, NUM_SUBEXPRS };
4209
4210 /// - the common condition/left-hand-side expression, which will be
4211 /// evaluated as the opaque value
4212 /// - the condition, expressed in terms of the opaque value
4213 /// - the left-hand-side, expressed in terms of the opaque value
4214 /// - the right-hand-side
4215 Stmt *SubExprs[NUM_SUBEXPRS];
4216 OpaqueValueExpr *OpaqueValue;
4217
4218 friend class ASTStmtReader;
4219 public:
BinaryConditionalOperator(Expr * common,OpaqueValueExpr * opaqueValue,Expr * cond,Expr * lhs,Expr * rhs,SourceLocation qloc,SourceLocation cloc,QualType t,ExprValueKind VK,ExprObjectKind OK)4220 BinaryConditionalOperator(Expr *common, OpaqueValueExpr *opaqueValue,
4221 Expr *cond, Expr *lhs, Expr *rhs,
4222 SourceLocation qloc, SourceLocation cloc,
4223 QualType t, ExprValueKind VK, ExprObjectKind OK)
4224 : AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK,
4225 qloc, cloc),
4226 OpaqueValue(opaqueValue) {
4227 SubExprs[COMMON] = common;
4228 SubExprs[COND] = cond;
4229 SubExprs[LHS] = lhs;
4230 SubExprs[RHS] = rhs;
4231 assert(OpaqueValue->getSourceExpr() == common && "Wrong opaque value");
4232 setDependence(computeDependence(this));
4233 }
4234
4235 /// Build an empty conditional operator.
BinaryConditionalOperator(EmptyShell Empty)4236 explicit BinaryConditionalOperator(EmptyShell Empty)
4237 : AbstractConditionalOperator(BinaryConditionalOperatorClass, Empty) { }
4238
4239 /// getCommon - Return the common expression, written to the
4240 /// left of the condition. The opaque value will be bound to the
4241 /// result of this expression.
getCommon()4242 Expr *getCommon() const { return cast<Expr>(SubExprs[COMMON]); }
4243
4244 /// getOpaqueValue - Return the opaque value placeholder.
getOpaqueValue()4245 OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; }
4246
4247 /// getCond - Return the condition expression; this is defined
4248 /// in terms of the opaque value.
getCond()4249 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
4250
4251 /// getTrueExpr - Return the subexpression which will be
4252 /// evaluated if the condition evaluates to true; this is defined
4253 /// in terms of the opaque value.
getTrueExpr()4254 Expr *getTrueExpr() const {
4255 return cast<Expr>(SubExprs[LHS]);
4256 }
4257
4258 /// getFalseExpr - Return the subexpression which will be
4259 /// evaluated if the condnition evaluates to false; this is
4260 /// defined in terms of the opaque value.
getFalseExpr()4261 Expr *getFalseExpr() const {
4262 return cast<Expr>(SubExprs[RHS]);
4263 }
4264
getBeginLoc()4265 SourceLocation getBeginLoc() const LLVM_READONLY {
4266 return getCommon()->getBeginLoc();
4267 }
getEndLoc()4268 SourceLocation getEndLoc() const LLVM_READONLY {
4269 return getFalseExpr()->getEndLoc();
4270 }
4271
classof(const Stmt * T)4272 static bool classof(const Stmt *T) {
4273 return T->getStmtClass() == BinaryConditionalOperatorClass;
4274 }
4275
4276 // Iterators
children()4277 child_range children() {
4278 return child_range(SubExprs, SubExprs + NUM_SUBEXPRS);
4279 }
children()4280 const_child_range children() const {
4281 return const_child_range(SubExprs, SubExprs + NUM_SUBEXPRS);
4282 }
4283 };
4284
getCond()4285 inline Expr *AbstractConditionalOperator::getCond() const {
4286 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
4287 return co->getCond();
4288 return cast<BinaryConditionalOperator>(this)->getCond();
4289 }
4290
getTrueExpr()4291 inline Expr *AbstractConditionalOperator::getTrueExpr() const {
4292 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
4293 return co->getTrueExpr();
4294 return cast<BinaryConditionalOperator>(this)->getTrueExpr();
4295 }
4296
getFalseExpr()4297 inline Expr *AbstractConditionalOperator::getFalseExpr() const {
4298 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
4299 return co->getFalseExpr();
4300 return cast<BinaryConditionalOperator>(this)->getFalseExpr();
4301 }
4302
4303 /// AddrLabelExpr - The GNU address of label extension, representing &&label.
4304 class AddrLabelExpr : public Expr {
4305 SourceLocation AmpAmpLoc, LabelLoc;
4306 LabelDecl *Label;
4307 public:
AddrLabelExpr(SourceLocation AALoc,SourceLocation LLoc,LabelDecl * L,QualType t)4308 AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelDecl *L,
4309 QualType t)
4310 : Expr(AddrLabelExprClass, t, VK_PRValue, OK_Ordinary), AmpAmpLoc(AALoc),
4311 LabelLoc(LLoc), Label(L) {
4312 setDependence(ExprDependence::None);
4313 }
4314
4315 /// Build an empty address of a label expression.
AddrLabelExpr(EmptyShell Empty)4316 explicit AddrLabelExpr(EmptyShell Empty)
4317 : Expr(AddrLabelExprClass, Empty) { }
4318
getAmpAmpLoc()4319 SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; }
setAmpAmpLoc(SourceLocation L)4320 void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; }
getLabelLoc()4321 SourceLocation getLabelLoc() const { return LabelLoc; }
setLabelLoc(SourceLocation L)4322 void setLabelLoc(SourceLocation L) { LabelLoc = L; }
4323
getBeginLoc()4324 SourceLocation getBeginLoc() const LLVM_READONLY { return AmpAmpLoc; }
getEndLoc()4325 SourceLocation getEndLoc() const LLVM_READONLY { return LabelLoc; }
4326
getLabel()4327 LabelDecl *getLabel() const { return Label; }
setLabel(LabelDecl * L)4328 void setLabel(LabelDecl *L) { Label = L; }
4329
classof(const Stmt * T)4330 static bool classof(const Stmt *T) {
4331 return T->getStmtClass() == AddrLabelExprClass;
4332 }
4333
4334 // Iterators
children()4335 child_range children() {
4336 return child_range(child_iterator(), child_iterator());
4337 }
children()4338 const_child_range children() const {
4339 return const_child_range(const_child_iterator(), const_child_iterator());
4340 }
4341 };
4342
4343 /// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
4344 /// The StmtExpr contains a single CompoundStmt node, which it evaluates and
4345 /// takes the value of the last subexpression.
4346 ///
4347 /// A StmtExpr is always an r-value; values "returned" out of a
4348 /// StmtExpr will be copied.
4349 class StmtExpr : public Expr {
4350 Stmt *SubStmt;
4351 SourceLocation LParenLoc, RParenLoc;
4352 public:
StmtExpr(CompoundStmt * SubStmt,QualType T,SourceLocation LParenLoc,SourceLocation RParenLoc,unsigned TemplateDepth)4353 StmtExpr(CompoundStmt *SubStmt, QualType T, SourceLocation LParenLoc,
4354 SourceLocation RParenLoc, unsigned TemplateDepth)
4355 : Expr(StmtExprClass, T, VK_PRValue, OK_Ordinary), SubStmt(SubStmt),
4356 LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4357 setDependence(computeDependence(this, TemplateDepth));
4358 // FIXME: A templated statement expression should have an associated
4359 // DeclContext so that nested declarations always have a dependent context.
4360 StmtExprBits.TemplateDepth = TemplateDepth;
4361 }
4362
4363 /// Build an empty statement expression.
StmtExpr(EmptyShell Empty)4364 explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { }
4365
getSubStmt()4366 CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); }
getSubStmt()4367 const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); }
setSubStmt(CompoundStmt * S)4368 void setSubStmt(CompoundStmt *S) { SubStmt = S; }
4369
getBeginLoc()4370 SourceLocation getBeginLoc() const LLVM_READONLY { return LParenLoc; }
getEndLoc()4371 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
4372
getLParenLoc()4373 SourceLocation getLParenLoc() const { return LParenLoc; }
setLParenLoc(SourceLocation L)4374 void setLParenLoc(SourceLocation L) { LParenLoc = L; }
getRParenLoc()4375 SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation L)4376 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4377
getTemplateDepth()4378 unsigned getTemplateDepth() const { return StmtExprBits.TemplateDepth; }
4379
classof(const Stmt * T)4380 static bool classof(const Stmt *T) {
4381 return T->getStmtClass() == StmtExprClass;
4382 }
4383
4384 // Iterators
children()4385 child_range children() { return child_range(&SubStmt, &SubStmt+1); }
children()4386 const_child_range children() const {
4387 return const_child_range(&SubStmt, &SubStmt + 1);
4388 }
4389 };
4390
4391 /// ShuffleVectorExpr - clang-specific builtin-in function
4392 /// __builtin_shufflevector.
4393 /// This AST node represents a operator that does a constant
4394 /// shuffle, similar to LLVM's shufflevector instruction. It takes
4395 /// two vectors and a variable number of constant indices,
4396 /// and returns the appropriately shuffled vector.
4397 class ShuffleVectorExpr : public Expr {
4398 SourceLocation BuiltinLoc, RParenLoc;
4399
4400 // SubExprs - the list of values passed to the __builtin_shufflevector
4401 // function. The first two are vectors, and the rest are constant
4402 // indices. The number of values in this list is always
4403 // 2+the number of indices in the vector type.
4404 Stmt **SubExprs;
4405 unsigned NumExprs;
4406
4407 public:
4408 ShuffleVectorExpr(const ASTContext &C, ArrayRef<Expr*> args, QualType Type,
4409 SourceLocation BLoc, SourceLocation RP);
4410
4411 /// Build an empty vector-shuffle expression.
ShuffleVectorExpr(EmptyShell Empty)4412 explicit ShuffleVectorExpr(EmptyShell Empty)
4413 : Expr(ShuffleVectorExprClass, Empty), SubExprs(nullptr) { }
4414
getBuiltinLoc()4415 SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
setBuiltinLoc(SourceLocation L)4416 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
4417
getRParenLoc()4418 SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation L)4419 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4420
getBeginLoc()4421 SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; }
getEndLoc()4422 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
4423
classof(const Stmt * T)4424 static bool classof(const Stmt *T) {
4425 return T->getStmtClass() == ShuffleVectorExprClass;
4426 }
4427
4428 /// getNumSubExprs - Return the size of the SubExprs array. This includes the
4429 /// constant expression, the actual arguments passed in, and the function
4430 /// pointers.
getNumSubExprs()4431 unsigned getNumSubExprs() const { return NumExprs; }
4432
4433 /// Retrieve the array of expressions.
getSubExprs()4434 Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); }
4435
4436 /// getExpr - Return the Expr at the specified index.
getExpr(unsigned Index)4437 Expr *getExpr(unsigned Index) {
4438 assert((Index < NumExprs) && "Arg access out of range!");
4439 return cast<Expr>(SubExprs[Index]);
4440 }
getExpr(unsigned Index)4441 const Expr *getExpr(unsigned Index) const {
4442 assert((Index < NumExprs) && "Arg access out of range!");
4443 return cast<Expr>(SubExprs[Index]);
4444 }
4445
4446 void setExprs(const ASTContext &C, ArrayRef<Expr *> Exprs);
4447
getShuffleMaskIdx(const ASTContext & Ctx,unsigned N)4448 llvm::APSInt getShuffleMaskIdx(const ASTContext &Ctx, unsigned N) const {
4449 assert((N < NumExprs - 2) && "Shuffle idx out of range!");
4450 return getExpr(N+2)->EvaluateKnownConstInt(Ctx);
4451 }
4452
4453 // Iterators
children()4454 child_range children() {
4455 return child_range(&SubExprs[0], &SubExprs[0]+NumExprs);
4456 }
children()4457 const_child_range children() const {
4458 return const_child_range(&SubExprs[0], &SubExprs[0] + NumExprs);
4459 }
4460 };
4461
4462 /// ConvertVectorExpr - Clang builtin function __builtin_convertvector
4463 /// This AST node provides support for converting a vector type to another
4464 /// vector type of the same arity.
4465 class ConvertVectorExpr : public Expr {
4466 private:
4467 Stmt *SrcExpr;
4468 TypeSourceInfo *TInfo;
4469 SourceLocation BuiltinLoc, RParenLoc;
4470
4471 friend class ASTReader;
4472 friend class ASTStmtReader;
ConvertVectorExpr(EmptyShell Empty)4473 explicit ConvertVectorExpr(EmptyShell Empty) : Expr(ConvertVectorExprClass, Empty) {}
4474
4475 public:
ConvertVectorExpr(Expr * SrcExpr,TypeSourceInfo * TI,QualType DstType,ExprValueKind VK,ExprObjectKind OK,SourceLocation BuiltinLoc,SourceLocation RParenLoc)4476 ConvertVectorExpr(Expr *SrcExpr, TypeSourceInfo *TI, QualType DstType,
4477 ExprValueKind VK, ExprObjectKind OK,
4478 SourceLocation BuiltinLoc, SourceLocation RParenLoc)
4479 : Expr(ConvertVectorExprClass, DstType, VK, OK), SrcExpr(SrcExpr),
4480 TInfo(TI), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {
4481 setDependence(computeDependence(this));
4482 }
4483
4484 /// getSrcExpr - Return the Expr to be converted.
getSrcExpr()4485 Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); }
4486
4487 /// getTypeSourceInfo - Return the destination type.
getTypeSourceInfo()4488 TypeSourceInfo *getTypeSourceInfo() const {
4489 return TInfo;
4490 }
setTypeSourceInfo(TypeSourceInfo * ti)4491 void setTypeSourceInfo(TypeSourceInfo *ti) {
4492 TInfo = ti;
4493 }
4494
4495 /// getBuiltinLoc - Return the location of the __builtin_convertvector token.
getBuiltinLoc()4496 SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
4497
4498 /// getRParenLoc - Return the location of final right parenthesis.
getRParenLoc()4499 SourceLocation getRParenLoc() const { return RParenLoc; }
4500
getBeginLoc()4501 SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; }
getEndLoc()4502 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
4503
classof(const Stmt * T)4504 static bool classof(const Stmt *T) {
4505 return T->getStmtClass() == ConvertVectorExprClass;
4506 }
4507
4508 // Iterators
children()4509 child_range children() { return child_range(&SrcExpr, &SrcExpr+1); }
children()4510 const_child_range children() const {
4511 return const_child_range(&SrcExpr, &SrcExpr + 1);
4512 }
4513 };
4514
4515 /// ChooseExpr - GNU builtin-in function __builtin_choose_expr.
4516 /// This AST node is similar to the conditional operator (?:) in C, with
4517 /// the following exceptions:
4518 /// - the test expression must be a integer constant expression.
4519 /// - the expression returned acts like the chosen subexpression in every
4520 /// visible way: the type is the same as that of the chosen subexpression,
4521 /// and all predicates (whether it's an l-value, whether it's an integer
4522 /// constant expression, etc.) return the same result as for the chosen
4523 /// sub-expression.
4524 class ChooseExpr : public Expr {
4525 enum { COND, LHS, RHS, END_EXPR };
4526 Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
4527 SourceLocation BuiltinLoc, RParenLoc;
4528 bool CondIsTrue;
4529 public:
ChooseExpr(SourceLocation BLoc,Expr * cond,Expr * lhs,Expr * rhs,QualType t,ExprValueKind VK,ExprObjectKind OK,SourceLocation RP,bool condIsTrue)4530 ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, QualType t,
4531 ExprValueKind VK, ExprObjectKind OK, SourceLocation RP,
4532 bool condIsTrue)
4533 : Expr(ChooseExprClass, t, VK, OK), BuiltinLoc(BLoc), RParenLoc(RP),
4534 CondIsTrue(condIsTrue) {
4535 SubExprs[COND] = cond;
4536 SubExprs[LHS] = lhs;
4537 SubExprs[RHS] = rhs;
4538
4539 setDependence(computeDependence(this));
4540 }
4541
4542 /// Build an empty __builtin_choose_expr.
ChooseExpr(EmptyShell Empty)4543 explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { }
4544
4545 /// isConditionTrue - Return whether the condition is true (i.e. not
4546 /// equal to zero).
isConditionTrue()4547 bool isConditionTrue() const {
4548 assert(!isConditionDependent() &&
4549 "Dependent condition isn't true or false");
4550 return CondIsTrue;
4551 }
setIsConditionTrue(bool isTrue)4552 void setIsConditionTrue(bool isTrue) { CondIsTrue = isTrue; }
4553
isConditionDependent()4554 bool isConditionDependent() const {
4555 return getCond()->isTypeDependent() || getCond()->isValueDependent();
4556 }
4557
4558 /// getChosenSubExpr - Return the subexpression chosen according to the
4559 /// condition.
getChosenSubExpr()4560 Expr *getChosenSubExpr() const {
4561 return isConditionTrue() ? getLHS() : getRHS();
4562 }
4563
getCond()4564 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
setCond(Expr * E)4565 void setCond(Expr *E) { SubExprs[COND] = E; }
getLHS()4566 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
setLHS(Expr * E)4567 void setLHS(Expr *E) { SubExprs[LHS] = E; }
getRHS()4568 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
setRHS(Expr * E)4569 void setRHS(Expr *E) { SubExprs[RHS] = E; }
4570
getBuiltinLoc()4571 SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
setBuiltinLoc(SourceLocation L)4572 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
4573
getRParenLoc()4574 SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation L)4575 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4576
getBeginLoc()4577 SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; }
getEndLoc()4578 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
4579
classof(const Stmt * T)4580 static bool classof(const Stmt *T) {
4581 return T->getStmtClass() == ChooseExprClass;
4582 }
4583
4584 // Iterators
children()4585 child_range children() {
4586 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
4587 }
children()4588 const_child_range children() const {
4589 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
4590 }
4591 };
4592
4593 /// GNUNullExpr - Implements the GNU __null extension, which is a name
4594 /// for a null pointer constant that has integral type (e.g., int or
4595 /// long) and is the same size and alignment as a pointer. The __null
4596 /// extension is typically only used by system headers, which define
4597 /// NULL as __null in C++ rather than using 0 (which is an integer
4598 /// that may not match the size of a pointer).
4599 class GNUNullExpr : public Expr {
4600 /// TokenLoc - The location of the __null keyword.
4601 SourceLocation TokenLoc;
4602
4603 public:
GNUNullExpr(QualType Ty,SourceLocation Loc)4604 GNUNullExpr(QualType Ty, SourceLocation Loc)
4605 : Expr(GNUNullExprClass, Ty, VK_PRValue, OK_Ordinary), TokenLoc(Loc) {
4606 setDependence(ExprDependence::None);
4607 }
4608
4609 /// Build an empty GNU __null expression.
GNUNullExpr(EmptyShell Empty)4610 explicit GNUNullExpr(EmptyShell Empty) : Expr(GNUNullExprClass, Empty) { }
4611
4612 /// getTokenLocation - The location of the __null token.
getTokenLocation()4613 SourceLocation getTokenLocation() const { return TokenLoc; }
setTokenLocation(SourceLocation L)4614 void setTokenLocation(SourceLocation L) { TokenLoc = L; }
4615
getBeginLoc()4616 SourceLocation getBeginLoc() const LLVM_READONLY { return TokenLoc; }
getEndLoc()4617 SourceLocation getEndLoc() const LLVM_READONLY { return TokenLoc; }
4618
classof(const Stmt * T)4619 static bool classof(const Stmt *T) {
4620 return T->getStmtClass() == GNUNullExprClass;
4621 }
4622
4623 // Iterators
children()4624 child_range children() {
4625 return child_range(child_iterator(), child_iterator());
4626 }
children()4627 const_child_range children() const {
4628 return const_child_range(const_child_iterator(), const_child_iterator());
4629 }
4630 };
4631
4632 /// Represents a call to the builtin function \c __builtin_va_arg.
4633 class VAArgExpr : public Expr {
4634 Stmt *Val;
4635 llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfo;
4636 SourceLocation BuiltinLoc, RParenLoc;
4637 public:
VAArgExpr(SourceLocation BLoc,Expr * e,TypeSourceInfo * TInfo,SourceLocation RPLoc,QualType t,bool IsMS)4638 VAArgExpr(SourceLocation BLoc, Expr *e, TypeSourceInfo *TInfo,
4639 SourceLocation RPLoc, QualType t, bool IsMS)
4640 : Expr(VAArgExprClass, t, VK_PRValue, OK_Ordinary), Val(e),
4641 TInfo(TInfo, IsMS), BuiltinLoc(BLoc), RParenLoc(RPLoc) {
4642 setDependence(computeDependence(this));
4643 }
4644
4645 /// Create an empty __builtin_va_arg expression.
VAArgExpr(EmptyShell Empty)4646 explicit VAArgExpr(EmptyShell Empty)
4647 : Expr(VAArgExprClass, Empty), Val(nullptr), TInfo(nullptr, false) {}
4648
getSubExpr()4649 const Expr *getSubExpr() const { return cast<Expr>(Val); }
getSubExpr()4650 Expr *getSubExpr() { return cast<Expr>(Val); }
setSubExpr(Expr * E)4651 void setSubExpr(Expr *E) { Val = E; }
4652
4653 /// Returns whether this is really a Win64 ABI va_arg expression.
isMicrosoftABI()4654 bool isMicrosoftABI() const { return TInfo.getInt(); }
setIsMicrosoftABI(bool IsMS)4655 void setIsMicrosoftABI(bool IsMS) { TInfo.setInt(IsMS); }
4656
getWrittenTypeInfo()4657 TypeSourceInfo *getWrittenTypeInfo() const { return TInfo.getPointer(); }
setWrittenTypeInfo(TypeSourceInfo * TI)4658 void setWrittenTypeInfo(TypeSourceInfo *TI) { TInfo.setPointer(TI); }
4659
getBuiltinLoc()4660 SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
setBuiltinLoc(SourceLocation L)4661 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
4662
getRParenLoc()4663 SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation L)4664 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
4665
getBeginLoc()4666 SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; }
getEndLoc()4667 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
4668
classof(const Stmt * T)4669 static bool classof(const Stmt *T) {
4670 return T->getStmtClass() == VAArgExprClass;
4671 }
4672
4673 // Iterators
children()4674 child_range children() { return child_range(&Val, &Val+1); }
children()4675 const_child_range children() const {
4676 return const_child_range(&Val, &Val + 1);
4677 }
4678 };
4679
4680 /// Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(),
4681 /// __builtin_FUNCTION(), __builtin_FILE(), or __builtin_source_location().
4682 class SourceLocExpr final : public Expr {
4683 SourceLocation BuiltinLoc, RParenLoc;
4684 DeclContext *ParentContext;
4685
4686 public:
4687 enum IdentKind { Function, File, Line, Column, SourceLocStruct };
4688
4689 SourceLocExpr(const ASTContext &Ctx, IdentKind Type, QualType ResultTy,
4690 SourceLocation BLoc, SourceLocation RParenLoc,
4691 DeclContext *Context);
4692
4693 /// Build an empty call expression.
SourceLocExpr(EmptyShell Empty)4694 explicit SourceLocExpr(EmptyShell Empty) : Expr(SourceLocExprClass, Empty) {}
4695
4696 /// Return the result of evaluating this SourceLocExpr in the specified
4697 /// (and possibly null) default argument or initialization context.
4698 APValue EvaluateInContext(const ASTContext &Ctx,
4699 const Expr *DefaultExpr) const;
4700
4701 /// Return a string representing the name of the specific builtin function.
4702 StringRef getBuiltinStr() const;
4703
getIdentKind()4704 IdentKind getIdentKind() const {
4705 return static_cast<IdentKind>(SourceLocExprBits.Kind);
4706 }
4707
isIntType()4708 bool isIntType() const {
4709 switch (getIdentKind()) {
4710 case File:
4711 case Function:
4712 case SourceLocStruct:
4713 return false;
4714 case Line:
4715 case Column:
4716 return true;
4717 }
4718 llvm_unreachable("unknown source location expression kind");
4719 }
4720
4721 /// If the SourceLocExpr has been resolved return the subexpression
4722 /// representing the resolved value. Otherwise return null.
getParentContext()4723 const DeclContext *getParentContext() const { return ParentContext; }
getParentContext()4724 DeclContext *getParentContext() { return ParentContext; }
4725
getLocation()4726 SourceLocation getLocation() const { return BuiltinLoc; }
getBeginLoc()4727 SourceLocation getBeginLoc() const { return BuiltinLoc; }
getEndLoc()4728 SourceLocation getEndLoc() const { return RParenLoc; }
4729
children()4730 child_range children() {
4731 return child_range(child_iterator(), child_iterator());
4732 }
4733
children()4734 const_child_range children() const {
4735 return const_child_range(child_iterator(), child_iterator());
4736 }
4737
classof(const Stmt * T)4738 static bool classof(const Stmt *T) {
4739 return T->getStmtClass() == SourceLocExprClass;
4740 }
4741
4742 private:
4743 friend class ASTStmtReader;
4744 };
4745
4746 /// Describes an C or C++ initializer list.
4747 ///
4748 /// InitListExpr describes an initializer list, which can be used to
4749 /// initialize objects of different types, including
4750 /// struct/class/union types, arrays, and vectors. For example:
4751 ///
4752 /// @code
4753 /// struct foo x = { 1, { 2, 3 } };
4754 /// @endcode
4755 ///
4756 /// Prior to semantic analysis, an initializer list will represent the
4757 /// initializer list as written by the user, but will have the
4758 /// placeholder type "void". This initializer list is called the
4759 /// syntactic form of the initializer, and may contain C99 designated
4760 /// initializers (represented as DesignatedInitExprs), initializations
4761 /// of subobject members without explicit braces, and so on. Clients
4762 /// interested in the original syntax of the initializer list should
4763 /// use the syntactic form of the initializer list.
4764 ///
4765 /// After semantic analysis, the initializer list will represent the
4766 /// semantic form of the initializer, where the initializations of all
4767 /// subobjects are made explicit with nested InitListExpr nodes and
4768 /// C99 designators have been eliminated by placing the designated
4769 /// initializations into the subobject they initialize. Additionally,
4770 /// any "holes" in the initialization, where no initializer has been
4771 /// specified for a particular subobject, will be replaced with
4772 /// implicitly-generated ImplicitValueInitExpr expressions that
4773 /// value-initialize the subobjects. Note, however, that the
4774 /// initializer lists may still have fewer initializers than there are
4775 /// elements to initialize within the object.
4776 ///
4777 /// After semantic analysis has completed, given an initializer list,
4778 /// method isSemanticForm() returns true if and only if this is the
4779 /// semantic form of the initializer list (note: the same AST node
4780 /// may at the same time be the syntactic form).
4781 /// Given the semantic form of the initializer list, one can retrieve
4782 /// the syntactic form of that initializer list (when different)
4783 /// using method getSyntacticForm(); the method returns null if applied
4784 /// to a initializer list which is already in syntactic form.
4785 /// Similarly, given the syntactic form (i.e., an initializer list such
4786 /// that isSemanticForm() returns false), one can retrieve the semantic
4787 /// form using method getSemanticForm().
4788 /// Since many initializer lists have the same syntactic and semantic forms,
4789 /// getSyntacticForm() may return NULL, indicating that the current
4790 /// semantic initializer list also serves as its syntactic form.
4791 class InitListExpr : public Expr {
4792 // FIXME: Eliminate this vector in favor of ASTContext allocation
4793 typedef ASTVector<Stmt *> InitExprsTy;
4794 InitExprsTy InitExprs;
4795 SourceLocation LBraceLoc, RBraceLoc;
4796
4797 /// The alternative form of the initializer list (if it exists).
4798 /// The int part of the pair stores whether this initializer list is
4799 /// in semantic form. If not null, the pointer points to:
4800 /// - the syntactic form, if this is in semantic form;
4801 /// - the semantic form, if this is in syntactic form.
4802 llvm::PointerIntPair<InitListExpr *, 1, bool> AltForm;
4803
4804 /// Either:
4805 /// If this initializer list initializes an array with more elements than
4806 /// there are initializers in the list, specifies an expression to be used
4807 /// for value initialization of the rest of the elements.
4808 /// Or
4809 /// If this initializer list initializes a union, specifies which
4810 /// field within the union will be initialized.
4811 llvm::PointerUnion<Expr *, FieldDecl *> ArrayFillerOrUnionFieldInit;
4812
4813 public:
4814 InitListExpr(const ASTContext &C, SourceLocation lbraceloc,
4815 ArrayRef<Expr*> initExprs, SourceLocation rbraceloc);
4816
4817 /// Build an empty initializer list.
InitListExpr(EmptyShell Empty)4818 explicit InitListExpr(EmptyShell Empty)
4819 : Expr(InitListExprClass, Empty), AltForm(nullptr, true) { }
4820
getNumInits()4821 unsigned getNumInits() const { return InitExprs.size(); }
4822
4823 /// Retrieve the set of initializers.
getInits()4824 Expr **getInits() { return reinterpret_cast<Expr **>(InitExprs.data()); }
4825
4826 /// Retrieve the set of initializers.
getInits()4827 Expr * const *getInits() const {
4828 return reinterpret_cast<Expr * const *>(InitExprs.data());
4829 }
4830
inits()4831 ArrayRef<Expr *> inits() {
4832 return llvm::makeArrayRef(getInits(), getNumInits());
4833 }
4834
inits()4835 ArrayRef<Expr *> inits() const {
4836 return llvm::makeArrayRef(getInits(), getNumInits());
4837 }
4838
getInit(unsigned Init)4839 const Expr *getInit(unsigned Init) const {
4840 assert(Init < getNumInits() && "Initializer access out of range!");
4841 return cast_or_null<Expr>(InitExprs[Init]);
4842 }
4843
getInit(unsigned Init)4844 Expr *getInit(unsigned Init) {
4845 assert(Init < getNumInits() && "Initializer access out of range!");
4846 return cast_or_null<Expr>(InitExprs[Init]);
4847 }
4848
setInit(unsigned Init,Expr * expr)4849 void setInit(unsigned Init, Expr *expr) {
4850 assert(Init < getNumInits() && "Initializer access out of range!");
4851 InitExprs[Init] = expr;
4852
4853 if (expr)
4854 setDependence(getDependence() | expr->getDependence());
4855 }
4856
4857 /// Mark the semantic form of the InitListExpr as error when the semantic
4858 /// analysis fails.
markError()4859 void markError() {
4860 assert(isSemanticForm());
4861 setDependence(getDependence() | ExprDependence::ErrorDependent);
4862 }
4863
4864 /// Reserve space for some number of initializers.
4865 void reserveInits(const ASTContext &C, unsigned NumInits);
4866
4867 /// Specify the number of initializers
4868 ///
4869 /// If there are more than @p NumInits initializers, the remaining
4870 /// initializers will be destroyed. If there are fewer than @p
4871 /// NumInits initializers, NULL expressions will be added for the
4872 /// unknown initializers.
4873 void resizeInits(const ASTContext &Context, unsigned NumInits);
4874
4875 /// Updates the initializer at index @p Init with the new
4876 /// expression @p expr, and returns the old expression at that
4877 /// location.
4878 ///
4879 /// When @p Init is out of range for this initializer list, the
4880 /// initializer list will be extended with NULL expressions to
4881 /// accommodate the new entry.
4882 Expr *updateInit(const ASTContext &C, unsigned Init, Expr *expr);
4883
4884 /// If this initializer list initializes an array with more elements
4885 /// than there are initializers in the list, specifies an expression to be
4886 /// used for value initialization of the rest of the elements.
getArrayFiller()4887 Expr *getArrayFiller() {
4888 return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>();
4889 }
getArrayFiller()4890 const Expr *getArrayFiller() const {
4891 return const_cast<InitListExpr *>(this)->getArrayFiller();
4892 }
4893 void setArrayFiller(Expr *filler);
4894
4895 /// Return true if this is an array initializer and its array "filler"
4896 /// has been set.
hasArrayFiller()4897 bool hasArrayFiller() const { return getArrayFiller(); }
4898
4899 /// If this initializes a union, specifies which field in the
4900 /// union to initialize.
4901 ///
4902 /// Typically, this field is the first named field within the
4903 /// union. However, a designated initializer can specify the
4904 /// initialization of a different field within the union.
getInitializedFieldInUnion()4905 FieldDecl *getInitializedFieldInUnion() {
4906 return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>();
4907 }
getInitializedFieldInUnion()4908 const FieldDecl *getInitializedFieldInUnion() const {
4909 return const_cast<InitListExpr *>(this)->getInitializedFieldInUnion();
4910 }
setInitializedFieldInUnion(FieldDecl * FD)4911 void setInitializedFieldInUnion(FieldDecl *FD) {
4912 assert((FD == nullptr
4913 || getInitializedFieldInUnion() == nullptr
4914 || getInitializedFieldInUnion() == FD)
4915 && "Only one field of a union may be initialized at a time!");
4916 ArrayFillerOrUnionFieldInit = FD;
4917 }
4918
4919 // Explicit InitListExpr's originate from source code (and have valid source
4920 // locations). Implicit InitListExpr's are created by the semantic analyzer.
4921 // FIXME: This is wrong; InitListExprs created by semantic analysis have
4922 // valid source locations too!
isExplicit()4923 bool isExplicit() const {
4924 return LBraceLoc.isValid() && RBraceLoc.isValid();
4925 }
4926
4927 // Is this an initializer for an array of characters, initialized by a string
4928 // literal or an @encode?
4929 bool isStringLiteralInit() const;
4930
4931 /// Is this a transparent initializer list (that is, an InitListExpr that is
4932 /// purely syntactic, and whose semantics are that of the sole contained
4933 /// initializer)?
4934 bool isTransparent() const;
4935
4936 /// Is this the zero initializer {0} in a language which considers it
4937 /// idiomatic?
4938 bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const;
4939
getLBraceLoc()4940 SourceLocation getLBraceLoc() const { return LBraceLoc; }
setLBraceLoc(SourceLocation Loc)4941 void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; }
getRBraceLoc()4942 SourceLocation getRBraceLoc() const { return RBraceLoc; }
setRBraceLoc(SourceLocation Loc)4943 void setRBraceLoc(SourceLocation Loc) { RBraceLoc = Loc; }
4944
isSemanticForm()4945 bool isSemanticForm() const { return AltForm.getInt(); }
getSemanticForm()4946 InitListExpr *getSemanticForm() const {
4947 return isSemanticForm() ? nullptr : AltForm.getPointer();
4948 }
isSyntacticForm()4949 bool isSyntacticForm() const {
4950 return !AltForm.getInt() || !AltForm.getPointer();
4951 }
getSyntacticForm()4952 InitListExpr *getSyntacticForm() const {
4953 return isSemanticForm() ? AltForm.getPointer() : nullptr;
4954 }
4955
setSyntacticForm(InitListExpr * Init)4956 void setSyntacticForm(InitListExpr *Init) {
4957 AltForm.setPointer(Init);
4958 AltForm.setInt(true);
4959 Init->AltForm.setPointer(this);
4960 Init->AltForm.setInt(false);
4961 }
4962
hadArrayRangeDesignator()4963 bool hadArrayRangeDesignator() const {
4964 return InitListExprBits.HadArrayRangeDesignator != 0;
4965 }
4966 void sawArrayRangeDesignator(bool ARD = true) {
4967 InitListExprBits.HadArrayRangeDesignator = ARD;
4968 }
4969
4970 SourceLocation getBeginLoc() const LLVM_READONLY;
4971 SourceLocation getEndLoc() const LLVM_READONLY;
4972
classof(const Stmt * T)4973 static bool classof(const Stmt *T) {
4974 return T->getStmtClass() == InitListExprClass;
4975 }
4976
4977 // Iterators
children()4978 child_range children() {
4979 const_child_range CCR = const_cast<const InitListExpr *>(this)->children();
4980 return child_range(cast_away_const(CCR.begin()),
4981 cast_away_const(CCR.end()));
4982 }
4983
children()4984 const_child_range children() const {
4985 // FIXME: This does not include the array filler expression.
4986 if (InitExprs.empty())
4987 return const_child_range(const_child_iterator(), const_child_iterator());
4988 return const_child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size());
4989 }
4990
4991 typedef InitExprsTy::iterator iterator;
4992 typedef InitExprsTy::const_iterator const_iterator;
4993 typedef InitExprsTy::reverse_iterator reverse_iterator;
4994 typedef InitExprsTy::const_reverse_iterator const_reverse_iterator;
4995
begin()4996 iterator begin() { return InitExprs.begin(); }
begin()4997