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