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