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