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