1 //===--- ExprCXX.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 /// \file
11 /// \brief Defines the clang::Expr interface and subclasses for C++ expressions.
12 ///
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_CLANG_AST_EXPRCXX_H
16 #define LLVM_CLANG_AST_EXPRCXX_H
17
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/Expr.h"
20 #include "clang/AST/LambdaCapture.h"
21 #include "clang/AST/TemplateBase.h"
22 #include "clang/AST/UnresolvedSet.h"
23 #include "clang/Basic/ExpressionTraits.h"
24 #include "clang/Basic/TypeTraits.h"
25 #include "llvm/Support/Compiler.h"
26
27 namespace clang {
28
29 class CXXConstructorDecl;
30 class CXXDestructorDecl;
31 class CXXMethodDecl;
32 class CXXTemporary;
33 class MSPropertyDecl;
34 class TemplateArgumentListInfo;
35 class UuidAttr;
36
37 //===--------------------------------------------------------------------===//
38 // C++ Expressions.
39 //===--------------------------------------------------------------------===//
40
41 /// \brief A call to an overloaded operator written using operator
42 /// syntax.
43 ///
44 /// Represents a call to an overloaded operator written using operator
45 /// syntax, e.g., "x + y" or "*p". While semantically equivalent to a
46 /// normal call, this AST node provides better information about the
47 /// syntactic representation of the call.
48 ///
49 /// In a C++ template, this expression node kind will be used whenever
50 /// any of the arguments are type-dependent. In this case, the
51 /// function itself will be a (possibly empty) set of functions and
52 /// function templates that were found by name lookup at template
53 /// definition time.
54 class CXXOperatorCallExpr : public CallExpr {
55 /// \brief The overloaded operator.
56 OverloadedOperatorKind Operator;
57 SourceRange Range;
58
59 // Record the FP_CONTRACT state that applies to this operator call. Only
60 // meaningful for floating point types. For other types this value can be
61 // set to false.
62 unsigned FPContractable : 1;
63
64 SourceRange getSourceRangeImpl() const LLVM_READONLY;
65 public:
CXXOperatorCallExpr(ASTContext & C,OverloadedOperatorKind Op,Expr * fn,ArrayRef<Expr * > args,QualType t,ExprValueKind VK,SourceLocation operatorloc,bool fpContractable)66 CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn,
67 ArrayRef<Expr*> args, QualType t, ExprValueKind VK,
68 SourceLocation operatorloc, bool fpContractable)
69 : CallExpr(C, CXXOperatorCallExprClass, fn, 0, args, t, VK,
70 operatorloc),
71 Operator(Op), FPContractable(fpContractable) {
72 Range = getSourceRangeImpl();
73 }
CXXOperatorCallExpr(ASTContext & C,EmptyShell Empty)74 explicit CXXOperatorCallExpr(ASTContext& C, EmptyShell Empty) :
75 CallExpr(C, CXXOperatorCallExprClass, Empty) { }
76
77
78 /// \brief Returns the kind of overloaded operator that this
79 /// expression refers to.
getOperator()80 OverloadedOperatorKind getOperator() const { return Operator; }
81
82 /// \brief Returns the location of the operator symbol in the expression.
83 ///
84 /// When \c getOperator()==OO_Call, this is the location of the right
85 /// parentheses; when \c getOperator()==OO_Subscript, this is the location
86 /// of the right bracket.
getOperatorLoc()87 SourceLocation getOperatorLoc() const { return getRParenLoc(); }
88
getExprLoc()89 SourceLocation getExprLoc() const LLVM_READONLY {
90 return (Operator < OO_Plus || Operator >= OO_Arrow ||
91 Operator == OO_PlusPlus || Operator == OO_MinusMinus)
92 ? getLocStart()
93 : getOperatorLoc();
94 }
95
getLocStart()96 SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
getLocEnd()97 SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
getSourceRange()98 SourceRange getSourceRange() const { return Range; }
99
classof(const Stmt * T)100 static bool classof(const Stmt *T) {
101 return T->getStmtClass() == CXXOperatorCallExprClass;
102 }
103
104 // Set the FP contractability status of this operator. Only meaningful for
105 // operations on floating point types.
setFPContractable(bool FPC)106 void setFPContractable(bool FPC) { FPContractable = FPC; }
107
108 // Get the FP contractability status of this operator. Only meaningful for
109 // operations on floating point types.
isFPContractable()110 bool isFPContractable() const { return FPContractable; }
111
112 friend class ASTStmtReader;
113 friend class ASTStmtWriter;
114 };
115
116 /// Represents a call to a member function that
117 /// may be written either with member call syntax (e.g., "obj.func()"
118 /// or "objptr->func()") or with normal function-call syntax
119 /// ("func()") within a member function that ends up calling a member
120 /// function. The callee in either case is a MemberExpr that contains
121 /// both the object argument and the member function, while the
122 /// arguments are the arguments within the parentheses (not including
123 /// the object argument).
124 class CXXMemberCallExpr : public CallExpr {
125 public:
CXXMemberCallExpr(ASTContext & C,Expr * fn,ArrayRef<Expr * > args,QualType t,ExprValueKind VK,SourceLocation RP)126 CXXMemberCallExpr(ASTContext &C, Expr *fn, ArrayRef<Expr*> args,
127 QualType t, ExprValueKind VK, SourceLocation RP)
128 : CallExpr(C, CXXMemberCallExprClass, fn, 0, args, t, VK, RP) {}
129
CXXMemberCallExpr(ASTContext & C,EmptyShell Empty)130 CXXMemberCallExpr(ASTContext &C, EmptyShell Empty)
131 : CallExpr(C, CXXMemberCallExprClass, Empty) { }
132
133 /// \brief Retrieves the implicit object argument for the member call.
134 ///
135 /// For example, in "x.f(5)", this returns the sub-expression "x".
136 Expr *getImplicitObjectArgument() const;
137
138 /// \brief Retrieves the declaration of the called method.
139 CXXMethodDecl *getMethodDecl() const;
140
141 /// \brief Retrieves the CXXRecordDecl for the underlying type of
142 /// the implicit object argument.
143 ///
144 /// Note that this is may not be the same declaration as that of the class
145 /// context of the CXXMethodDecl which this function is calling.
146 /// FIXME: Returns 0 for member pointer call exprs.
147 CXXRecordDecl *getRecordDecl() const;
148
classof(const Stmt * T)149 static bool classof(const Stmt *T) {
150 return T->getStmtClass() == CXXMemberCallExprClass;
151 }
152 };
153
154 /// \brief Represents a call to a CUDA kernel function.
155 class CUDAKernelCallExpr : public CallExpr {
156 private:
157 enum { CONFIG, END_PREARG };
158
159 public:
CUDAKernelCallExpr(ASTContext & C,Expr * fn,CallExpr * Config,ArrayRef<Expr * > args,QualType t,ExprValueKind VK,SourceLocation RP)160 CUDAKernelCallExpr(ASTContext &C, Expr *fn, CallExpr *Config,
161 ArrayRef<Expr*> args, QualType t, ExprValueKind VK,
162 SourceLocation RP)
163 : CallExpr(C, CUDAKernelCallExprClass, fn, END_PREARG, args, t, VK, RP) {
164 setConfig(Config);
165 }
166
CUDAKernelCallExpr(ASTContext & C,EmptyShell Empty)167 CUDAKernelCallExpr(ASTContext &C, EmptyShell Empty)
168 : CallExpr(C, CUDAKernelCallExprClass, END_PREARG, Empty) { }
169
getConfig()170 const CallExpr *getConfig() const {
171 return cast_or_null<CallExpr>(getPreArg(CONFIG));
172 }
getConfig()173 CallExpr *getConfig() { return cast_or_null<CallExpr>(getPreArg(CONFIG)); }
setConfig(CallExpr * E)174 void setConfig(CallExpr *E) { setPreArg(CONFIG, E); }
175
classof(const Stmt * T)176 static bool classof(const Stmt *T) {
177 return T->getStmtClass() == CUDAKernelCallExprClass;
178 }
179 };
180
181 /// \brief Abstract class common to all of the C++ "named"/"keyword" casts.
182 ///
183 /// This abstract class is inherited by all of the classes
184 /// representing "named" casts: CXXStaticCastExpr for \c static_cast,
185 /// CXXDynamicCastExpr for \c dynamic_cast, CXXReinterpretCastExpr for
186 /// reinterpret_cast, and CXXConstCastExpr for \c const_cast.
187 class CXXNamedCastExpr : public ExplicitCastExpr {
188 private:
189 SourceLocation Loc; // the location of the casting op
190 SourceLocation RParenLoc; // the location of the right parenthesis
191 SourceRange AngleBrackets; // range for '<' '>'
192
193 protected:
CXXNamedCastExpr(StmtClass SC,QualType ty,ExprValueKind VK,CastKind kind,Expr * op,unsigned PathSize,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation RParenLoc,SourceRange AngleBrackets)194 CXXNamedCastExpr(StmtClass SC, QualType ty, ExprValueKind VK,
195 CastKind kind, Expr *op, unsigned PathSize,
196 TypeSourceInfo *writtenTy, SourceLocation l,
197 SourceLocation RParenLoc,
198 SourceRange AngleBrackets)
199 : ExplicitCastExpr(SC, ty, VK, kind, op, PathSize, writtenTy), Loc(l),
200 RParenLoc(RParenLoc), AngleBrackets(AngleBrackets) {}
201
CXXNamedCastExpr(StmtClass SC,EmptyShell Shell,unsigned PathSize)202 explicit CXXNamedCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize)
203 : ExplicitCastExpr(SC, Shell, PathSize) { }
204
205 friend class ASTStmtReader;
206
207 public:
208 const char *getCastName() const;
209
210 /// \brief Retrieve the location of the cast operator keyword, e.g.,
211 /// \c static_cast.
getOperatorLoc()212 SourceLocation getOperatorLoc() const { return Loc; }
213
214 /// \brief Retrieve the location of the closing parenthesis.
getRParenLoc()215 SourceLocation getRParenLoc() const { return RParenLoc; }
216
getLocStart()217 SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()218 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
getAngleBrackets()219 SourceRange getAngleBrackets() const LLVM_READONLY { return AngleBrackets; }
220
classof(const Stmt * T)221 static bool classof(const Stmt *T) {
222 switch (T->getStmtClass()) {
223 case CXXStaticCastExprClass:
224 case CXXDynamicCastExprClass:
225 case CXXReinterpretCastExprClass:
226 case CXXConstCastExprClass:
227 return true;
228 default:
229 return false;
230 }
231 }
232 };
233
234 /// \brief A C++ \c static_cast expression (C++ [expr.static.cast]).
235 ///
236 /// This expression node represents a C++ static cast, e.g.,
237 /// \c static_cast<int>(1.0).
238 class CXXStaticCastExpr : public CXXNamedCastExpr {
CXXStaticCastExpr(QualType ty,ExprValueKind vk,CastKind kind,Expr * op,unsigned pathSize,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation RParenLoc,SourceRange AngleBrackets)239 CXXStaticCastExpr(QualType ty, ExprValueKind vk, CastKind kind, Expr *op,
240 unsigned pathSize, TypeSourceInfo *writtenTy,
241 SourceLocation l, SourceLocation RParenLoc,
242 SourceRange AngleBrackets)
243 : CXXNamedCastExpr(CXXStaticCastExprClass, ty, vk, kind, op, pathSize,
244 writtenTy, l, RParenLoc, AngleBrackets) {}
245
CXXStaticCastExpr(EmptyShell Empty,unsigned PathSize)246 explicit CXXStaticCastExpr(EmptyShell Empty, unsigned PathSize)
247 : CXXNamedCastExpr(CXXStaticCastExprClass, Empty, PathSize) { }
248
249 public:
250 static CXXStaticCastExpr *Create(const ASTContext &Context, QualType T,
251 ExprValueKind VK, CastKind K, Expr *Op,
252 const CXXCastPath *Path,
253 TypeSourceInfo *Written, SourceLocation L,
254 SourceLocation RParenLoc,
255 SourceRange AngleBrackets);
256 static CXXStaticCastExpr *CreateEmpty(const ASTContext &Context,
257 unsigned PathSize);
258
classof(const Stmt * T)259 static bool classof(const Stmt *T) {
260 return T->getStmtClass() == CXXStaticCastExprClass;
261 }
262 };
263
264 /// \brief A C++ @c dynamic_cast expression (C++ [expr.dynamic.cast]).
265 ///
266 /// This expression node represents a dynamic cast, e.g.,
267 /// \c dynamic_cast<Derived*>(BasePtr). Such a cast may perform a run-time
268 /// check to determine how to perform the type conversion.
269 class CXXDynamicCastExpr : public CXXNamedCastExpr {
CXXDynamicCastExpr(QualType ty,ExprValueKind VK,CastKind kind,Expr * op,unsigned pathSize,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation RParenLoc,SourceRange AngleBrackets)270 CXXDynamicCastExpr(QualType ty, ExprValueKind VK, CastKind kind,
271 Expr *op, unsigned pathSize, TypeSourceInfo *writtenTy,
272 SourceLocation l, SourceLocation RParenLoc,
273 SourceRange AngleBrackets)
274 : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, VK, kind, op, pathSize,
275 writtenTy, l, RParenLoc, AngleBrackets) {}
276
CXXDynamicCastExpr(EmptyShell Empty,unsigned pathSize)277 explicit CXXDynamicCastExpr(EmptyShell Empty, unsigned pathSize)
278 : CXXNamedCastExpr(CXXDynamicCastExprClass, Empty, pathSize) { }
279
280 public:
281 static CXXDynamicCastExpr *Create(const ASTContext &Context, QualType T,
282 ExprValueKind VK, CastKind Kind, Expr *Op,
283 const CXXCastPath *Path,
284 TypeSourceInfo *Written, SourceLocation L,
285 SourceLocation RParenLoc,
286 SourceRange AngleBrackets);
287
288 static CXXDynamicCastExpr *CreateEmpty(const ASTContext &Context,
289 unsigned pathSize);
290
291 bool isAlwaysNull() const;
292
classof(const Stmt * T)293 static bool classof(const Stmt *T) {
294 return T->getStmtClass() == CXXDynamicCastExprClass;
295 }
296 };
297
298 /// \brief A C++ @c reinterpret_cast expression (C++ [expr.reinterpret.cast]).
299 ///
300 /// This expression node represents a reinterpret cast, e.g.,
301 /// @c reinterpret_cast<int>(VoidPtr).
302 ///
303 /// A reinterpret_cast provides a differently-typed view of a value but
304 /// (in Clang, as in most C++ implementations) performs no actual work at
305 /// run time.
306 class CXXReinterpretCastExpr : public CXXNamedCastExpr {
CXXReinterpretCastExpr(QualType ty,ExprValueKind vk,CastKind kind,Expr * op,unsigned pathSize,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation RParenLoc,SourceRange AngleBrackets)307 CXXReinterpretCastExpr(QualType ty, ExprValueKind vk, CastKind kind,
308 Expr *op, unsigned pathSize,
309 TypeSourceInfo *writtenTy, SourceLocation l,
310 SourceLocation RParenLoc,
311 SourceRange AngleBrackets)
312 : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, vk, kind, op,
313 pathSize, writtenTy, l, RParenLoc, AngleBrackets) {}
314
CXXReinterpretCastExpr(EmptyShell Empty,unsigned pathSize)315 CXXReinterpretCastExpr(EmptyShell Empty, unsigned pathSize)
316 : CXXNamedCastExpr(CXXReinterpretCastExprClass, Empty, pathSize) { }
317
318 public:
319 static CXXReinterpretCastExpr *Create(const ASTContext &Context, QualType T,
320 ExprValueKind VK, CastKind Kind,
321 Expr *Op, const CXXCastPath *Path,
322 TypeSourceInfo *WrittenTy, SourceLocation L,
323 SourceLocation RParenLoc,
324 SourceRange AngleBrackets);
325 static CXXReinterpretCastExpr *CreateEmpty(const ASTContext &Context,
326 unsigned pathSize);
327
classof(const Stmt * T)328 static bool classof(const Stmt *T) {
329 return T->getStmtClass() == CXXReinterpretCastExprClass;
330 }
331 };
332
333 /// \brief A C++ \c const_cast expression (C++ [expr.const.cast]).
334 ///
335 /// This expression node represents a const cast, e.g.,
336 /// \c const_cast<char*>(PtrToConstChar).
337 ///
338 /// A const_cast can remove type qualifiers but does not change the underlying
339 /// value.
340 class CXXConstCastExpr : public CXXNamedCastExpr {
CXXConstCastExpr(QualType ty,ExprValueKind VK,Expr * op,TypeSourceInfo * writtenTy,SourceLocation l,SourceLocation RParenLoc,SourceRange AngleBrackets)341 CXXConstCastExpr(QualType ty, ExprValueKind VK, Expr *op,
342 TypeSourceInfo *writtenTy, SourceLocation l,
343 SourceLocation RParenLoc, SourceRange AngleBrackets)
344 : CXXNamedCastExpr(CXXConstCastExprClass, ty, VK, CK_NoOp, op,
345 0, writtenTy, l, RParenLoc, AngleBrackets) {}
346
CXXConstCastExpr(EmptyShell Empty)347 explicit CXXConstCastExpr(EmptyShell Empty)
348 : CXXNamedCastExpr(CXXConstCastExprClass, Empty, 0) { }
349
350 public:
351 static CXXConstCastExpr *Create(const ASTContext &Context, QualType T,
352 ExprValueKind VK, Expr *Op,
353 TypeSourceInfo *WrittenTy, SourceLocation L,
354 SourceLocation RParenLoc,
355 SourceRange AngleBrackets);
356 static CXXConstCastExpr *CreateEmpty(const ASTContext &Context);
357
classof(const Stmt * T)358 static bool classof(const Stmt *T) {
359 return T->getStmtClass() == CXXConstCastExprClass;
360 }
361 };
362
363 /// \brief A call to a literal operator (C++11 [over.literal])
364 /// written as a user-defined literal (C++11 [lit.ext]).
365 ///
366 /// Represents a user-defined literal, e.g. "foo"_bar or 1.23_xyz. While this
367 /// is semantically equivalent to a normal call, this AST node provides better
368 /// information about the syntactic representation of the literal.
369 ///
370 /// Since literal operators are never found by ADL and can only be declared at
371 /// namespace scope, a user-defined literal is never dependent.
372 class UserDefinedLiteral : public CallExpr {
373 /// \brief The location of a ud-suffix within the literal.
374 SourceLocation UDSuffixLoc;
375
376 public:
UserDefinedLiteral(const ASTContext & C,Expr * Fn,ArrayRef<Expr * > Args,QualType T,ExprValueKind VK,SourceLocation LitEndLoc,SourceLocation SuffixLoc)377 UserDefinedLiteral(const ASTContext &C, Expr *Fn, ArrayRef<Expr*> Args,
378 QualType T, ExprValueKind VK, SourceLocation LitEndLoc,
379 SourceLocation SuffixLoc)
380 : CallExpr(C, UserDefinedLiteralClass, Fn, 0, Args, T, VK, LitEndLoc),
381 UDSuffixLoc(SuffixLoc) {}
UserDefinedLiteral(const ASTContext & C,EmptyShell Empty)382 explicit UserDefinedLiteral(const ASTContext &C, EmptyShell Empty)
383 : CallExpr(C, UserDefinedLiteralClass, Empty) {}
384
385 /// The kind of literal operator which is invoked.
386 enum LiteralOperatorKind {
387 LOK_Raw, ///< Raw form: operator "" X (const char *)
388 LOK_Template, ///< Raw form: operator "" X<cs...> ()
389 LOK_Integer, ///< operator "" X (unsigned long long)
390 LOK_Floating, ///< operator "" X (long double)
391 LOK_String, ///< operator "" X (const CharT *, size_t)
392 LOK_Character ///< operator "" X (CharT)
393 };
394
395 /// \brief Returns the kind of literal operator invocation
396 /// which this expression represents.
397 LiteralOperatorKind getLiteralOperatorKind() const;
398
399 /// \brief If this is not a raw user-defined literal, get the
400 /// underlying cooked literal (representing the literal with the suffix
401 /// removed).
402 Expr *getCookedLiteral();
getCookedLiteral()403 const Expr *getCookedLiteral() const {
404 return const_cast<UserDefinedLiteral*>(this)->getCookedLiteral();
405 }
406
getLocStart()407 SourceLocation getLocStart() const {
408 if (getLiteralOperatorKind() == LOK_Template)
409 return getRParenLoc();
410 return getArg(0)->getLocStart();
411 }
getLocEnd()412 SourceLocation getLocEnd() const { return getRParenLoc(); }
413
414
415 /// \brief Returns the location of a ud-suffix in the expression.
416 ///
417 /// For a string literal, there may be multiple identical suffixes. This
418 /// returns the first.
getUDSuffixLoc()419 SourceLocation getUDSuffixLoc() const { return UDSuffixLoc; }
420
421 /// \brief Returns the ud-suffix specified for this literal.
422 const IdentifierInfo *getUDSuffix() const;
423
classof(const Stmt * S)424 static bool classof(const Stmt *S) {
425 return S->getStmtClass() == UserDefinedLiteralClass;
426 }
427
428 friend class ASTStmtReader;
429 friend class ASTStmtWriter;
430 };
431
432 /// \brief A boolean literal, per ([C++ lex.bool] Boolean literals).
433 ///
434 class CXXBoolLiteralExpr : public Expr {
435 bool Value;
436 SourceLocation Loc;
437 public:
CXXBoolLiteralExpr(bool val,QualType Ty,SourceLocation l)438 CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) :
439 Expr(CXXBoolLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
440 false, false),
441 Value(val), Loc(l) {}
442
CXXBoolLiteralExpr(EmptyShell Empty)443 explicit CXXBoolLiteralExpr(EmptyShell Empty)
444 : Expr(CXXBoolLiteralExprClass, Empty) { }
445
getValue()446 bool getValue() const { return Value; }
setValue(bool V)447 void setValue(bool V) { Value = V; }
448
getLocStart()449 SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()450 SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
451
getLocation()452 SourceLocation getLocation() const { return Loc; }
setLocation(SourceLocation L)453 void setLocation(SourceLocation L) { Loc = L; }
454
classof(const Stmt * T)455 static bool classof(const Stmt *T) {
456 return T->getStmtClass() == CXXBoolLiteralExprClass;
457 }
458
459 // Iterators
children()460 child_range children() { return child_range(); }
461 };
462
463 /// \brief The null pointer literal (C++11 [lex.nullptr])
464 ///
465 /// Introduced in C++11, the only literal of type \c nullptr_t is \c nullptr.
466 class CXXNullPtrLiteralExpr : public Expr {
467 SourceLocation Loc;
468 public:
CXXNullPtrLiteralExpr(QualType Ty,SourceLocation l)469 CXXNullPtrLiteralExpr(QualType Ty, SourceLocation l) :
470 Expr(CXXNullPtrLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
471 false, false),
472 Loc(l) {}
473
CXXNullPtrLiteralExpr(EmptyShell Empty)474 explicit CXXNullPtrLiteralExpr(EmptyShell Empty)
475 : Expr(CXXNullPtrLiteralExprClass, Empty) { }
476
getLocStart()477 SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()478 SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
479
getLocation()480 SourceLocation getLocation() const { return Loc; }
setLocation(SourceLocation L)481 void setLocation(SourceLocation L) { Loc = L; }
482
classof(const Stmt * T)483 static bool classof(const Stmt *T) {
484 return T->getStmtClass() == CXXNullPtrLiteralExprClass;
485 }
486
children()487 child_range children() { return child_range(); }
488 };
489
490 /// \brief Implicit construction of a std::initializer_list<T> object from an
491 /// array temporary within list-initialization (C++11 [dcl.init.list]p5).
492 class CXXStdInitializerListExpr : public Expr {
493 Stmt *SubExpr;
494
CXXStdInitializerListExpr(EmptyShell Empty)495 CXXStdInitializerListExpr(EmptyShell Empty)
496 : Expr(CXXStdInitializerListExprClass, Empty), SubExpr(nullptr) {}
497
498 public:
CXXStdInitializerListExpr(QualType Ty,Expr * SubExpr)499 CXXStdInitializerListExpr(QualType Ty, Expr *SubExpr)
500 : Expr(CXXStdInitializerListExprClass, Ty, VK_RValue, OK_Ordinary,
501 Ty->isDependentType(), SubExpr->isValueDependent(),
502 SubExpr->isInstantiationDependent(),
503 SubExpr->containsUnexpandedParameterPack()),
504 SubExpr(SubExpr) {}
505
getSubExpr()506 Expr *getSubExpr() { return static_cast<Expr*>(SubExpr); }
getSubExpr()507 const Expr *getSubExpr() const { return static_cast<const Expr*>(SubExpr); }
508
getLocStart()509 SourceLocation getLocStart() const LLVM_READONLY {
510 return SubExpr->getLocStart();
511 }
getLocEnd()512 SourceLocation getLocEnd() const LLVM_READONLY {
513 return SubExpr->getLocEnd();
514 }
getSourceRange()515 SourceRange getSourceRange() const LLVM_READONLY {
516 return SubExpr->getSourceRange();
517 }
518
classof(const Stmt * S)519 static bool classof(const Stmt *S) {
520 return S->getStmtClass() == CXXStdInitializerListExprClass;
521 }
522
children()523 child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
524
525 friend class ASTReader;
526 friend class ASTStmtReader;
527 };
528
529 /// A C++ \c typeid expression (C++ [expr.typeid]), which gets
530 /// the \c type_info that corresponds to the supplied type, or the (possibly
531 /// dynamic) type of the supplied expression.
532 ///
533 /// This represents code like \c typeid(int) or \c typeid(*objPtr)
534 class CXXTypeidExpr : public Expr {
535 private:
536 llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
537 SourceRange Range;
538
539 public:
CXXTypeidExpr(QualType Ty,TypeSourceInfo * Operand,SourceRange R)540 CXXTypeidExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
541 : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary,
542 // typeid is never type-dependent (C++ [temp.dep.expr]p4)
543 false,
544 // typeid is value-dependent if the type or expression are dependent
545 Operand->getType()->isDependentType(),
546 Operand->getType()->isInstantiationDependentType(),
547 Operand->getType()->containsUnexpandedParameterPack()),
548 Operand(Operand), Range(R) { }
549
CXXTypeidExpr(QualType Ty,Expr * Operand,SourceRange R)550 CXXTypeidExpr(QualType Ty, Expr *Operand, SourceRange R)
551 : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary,
552 // typeid is never type-dependent (C++ [temp.dep.expr]p4)
553 false,
554 // typeid is value-dependent if the type or expression are dependent
555 Operand->isTypeDependent() || Operand->isValueDependent(),
556 Operand->isInstantiationDependent(),
557 Operand->containsUnexpandedParameterPack()),
558 Operand(Operand), Range(R) { }
559
CXXTypeidExpr(EmptyShell Empty,bool isExpr)560 CXXTypeidExpr(EmptyShell Empty, bool isExpr)
561 : Expr(CXXTypeidExprClass, Empty) {
562 if (isExpr)
563 Operand = (Expr*)nullptr;
564 else
565 Operand = (TypeSourceInfo*)nullptr;
566 }
567
568 /// Determine whether this typeid has a type operand which is potentially
569 /// evaluated, per C++11 [expr.typeid]p3.
570 bool isPotentiallyEvaluated() const;
571
isTypeOperand()572 bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
573
574 /// \brief Retrieves the type operand of this typeid() expression after
575 /// various required adjustments (removing reference types, cv-qualifiers).
576 QualType getTypeOperand(ASTContext &Context) const;
577
578 /// \brief Retrieve source information for the type operand.
getTypeOperandSourceInfo()579 TypeSourceInfo *getTypeOperandSourceInfo() const {
580 assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
581 return Operand.get<TypeSourceInfo *>();
582 }
583
setTypeOperandSourceInfo(TypeSourceInfo * TSI)584 void setTypeOperandSourceInfo(TypeSourceInfo *TSI) {
585 assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
586 Operand = TSI;
587 }
588
getExprOperand()589 Expr *getExprOperand() const {
590 assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
591 return static_cast<Expr*>(Operand.get<Stmt *>());
592 }
593
setExprOperand(Expr * E)594 void setExprOperand(Expr *E) {
595 assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
596 Operand = E;
597 }
598
getLocStart()599 SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
getLocEnd()600 SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
getSourceRange()601 SourceRange getSourceRange() const LLVM_READONLY { return Range; }
setSourceRange(SourceRange R)602 void setSourceRange(SourceRange R) { Range = R; }
603
classof(const Stmt * T)604 static bool classof(const Stmt *T) {
605 return T->getStmtClass() == CXXTypeidExprClass;
606 }
607
608 // Iterators
children()609 child_range children() {
610 if (isTypeOperand()) return child_range();
611 Stmt **begin = reinterpret_cast<Stmt**>(&Operand);
612 return child_range(begin, begin + 1);
613 }
614 };
615
616 /// \brief A member reference to an MSPropertyDecl.
617 ///
618 /// This expression always has pseudo-object type, and therefore it is
619 /// typically not encountered in a fully-typechecked expression except
620 /// within the syntactic form of a PseudoObjectExpr.
621 class MSPropertyRefExpr : public Expr {
622 Expr *BaseExpr;
623 MSPropertyDecl *TheDecl;
624 SourceLocation MemberLoc;
625 bool IsArrow;
626 NestedNameSpecifierLoc QualifierLoc;
627
628 public:
MSPropertyRefExpr(Expr * baseExpr,MSPropertyDecl * decl,bool isArrow,QualType ty,ExprValueKind VK,NestedNameSpecifierLoc qualifierLoc,SourceLocation nameLoc)629 MSPropertyRefExpr(Expr *baseExpr, MSPropertyDecl *decl, bool isArrow,
630 QualType ty, ExprValueKind VK,
631 NestedNameSpecifierLoc qualifierLoc,
632 SourceLocation nameLoc)
633 : Expr(MSPropertyRefExprClass, ty, VK, OK_Ordinary,
634 /*type-dependent*/ false, baseExpr->isValueDependent(),
635 baseExpr->isInstantiationDependent(),
636 baseExpr->containsUnexpandedParameterPack()),
637 BaseExpr(baseExpr), TheDecl(decl),
638 MemberLoc(nameLoc), IsArrow(isArrow),
639 QualifierLoc(qualifierLoc) {}
640
MSPropertyRefExpr(EmptyShell Empty)641 MSPropertyRefExpr(EmptyShell Empty) : Expr(MSPropertyRefExprClass, Empty) {}
642
getSourceRange()643 SourceRange getSourceRange() const LLVM_READONLY {
644 return SourceRange(getLocStart(), getLocEnd());
645 }
isImplicitAccess()646 bool isImplicitAccess() const {
647 return getBaseExpr() && getBaseExpr()->isImplicitCXXThis();
648 }
getLocStart()649 SourceLocation getLocStart() const {
650 if (!isImplicitAccess())
651 return BaseExpr->getLocStart();
652 else if (QualifierLoc)
653 return QualifierLoc.getBeginLoc();
654 else
655 return MemberLoc;
656 }
getLocEnd()657 SourceLocation getLocEnd() const { return getMemberLoc(); }
658
children()659 child_range children() {
660 return child_range((Stmt**)&BaseExpr, (Stmt**)&BaseExpr + 1);
661 }
classof(const Stmt * T)662 static bool classof(const Stmt *T) {
663 return T->getStmtClass() == MSPropertyRefExprClass;
664 }
665
getBaseExpr()666 Expr *getBaseExpr() const { return BaseExpr; }
getPropertyDecl()667 MSPropertyDecl *getPropertyDecl() const { return TheDecl; }
isArrow()668 bool isArrow() const { return IsArrow; }
getMemberLoc()669 SourceLocation getMemberLoc() const { return MemberLoc; }
getQualifierLoc()670 NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
671
672 friend class ASTStmtReader;
673 };
674
675 /// A Microsoft C++ @c __uuidof expression, which gets
676 /// the _GUID that corresponds to the supplied type or expression.
677 ///
678 /// This represents code like @c __uuidof(COMTYPE) or @c __uuidof(*comPtr)
679 class CXXUuidofExpr : public Expr {
680 private:
681 llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
682 SourceRange Range;
683
684 public:
CXXUuidofExpr(QualType Ty,TypeSourceInfo * Operand,SourceRange R)685 CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
686 : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
687 false, Operand->getType()->isDependentType(),
688 Operand->getType()->isInstantiationDependentType(),
689 Operand->getType()->containsUnexpandedParameterPack()),
690 Operand(Operand), Range(R) { }
691
CXXUuidofExpr(QualType Ty,Expr * Operand,SourceRange R)692 CXXUuidofExpr(QualType Ty, Expr *Operand, SourceRange R)
693 : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
694 false, Operand->isTypeDependent(),
695 Operand->isInstantiationDependent(),
696 Operand->containsUnexpandedParameterPack()),
697 Operand(Operand), Range(R) { }
698
CXXUuidofExpr(EmptyShell Empty,bool isExpr)699 CXXUuidofExpr(EmptyShell Empty, bool isExpr)
700 : Expr(CXXUuidofExprClass, Empty) {
701 if (isExpr)
702 Operand = (Expr*)nullptr;
703 else
704 Operand = (TypeSourceInfo*)nullptr;
705 }
706
isTypeOperand()707 bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
708
709 /// \brief Retrieves the type operand of this __uuidof() expression after
710 /// various required adjustments (removing reference types, cv-qualifiers).
711 QualType getTypeOperand(ASTContext &Context) const;
712
713 /// \brief Retrieve source information for the type operand.
getTypeOperandSourceInfo()714 TypeSourceInfo *getTypeOperandSourceInfo() const {
715 assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
716 return Operand.get<TypeSourceInfo *>();
717 }
718
setTypeOperandSourceInfo(TypeSourceInfo * TSI)719 void setTypeOperandSourceInfo(TypeSourceInfo *TSI) {
720 assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
721 Operand = TSI;
722 }
723
getExprOperand()724 Expr *getExprOperand() const {
725 assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
726 return static_cast<Expr*>(Operand.get<Stmt *>());
727 }
728
setExprOperand(Expr * E)729 void setExprOperand(Expr *E) {
730 assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
731 Operand = E;
732 }
733
734 StringRef getUuidAsStringRef(ASTContext &Context) const;
735
getLocStart()736 SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
getLocEnd()737 SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
getSourceRange()738 SourceRange getSourceRange() const LLVM_READONLY { return Range; }
setSourceRange(SourceRange R)739 void setSourceRange(SourceRange R) { Range = R; }
740
classof(const Stmt * T)741 static bool classof(const Stmt *T) {
742 return T->getStmtClass() == CXXUuidofExprClass;
743 }
744
745 /// Grabs __declspec(uuid()) off a type, or returns 0 if we cannot resolve to
746 /// a single GUID.
747 static const UuidAttr *GetUuidAttrOfType(QualType QT,
748 bool *HasMultipleGUIDsPtr = nullptr);
749
750 // Iterators
children()751 child_range children() {
752 if (isTypeOperand()) return child_range();
753 Stmt **begin = reinterpret_cast<Stmt**>(&Operand);
754 return child_range(begin, begin + 1);
755 }
756 };
757
758 /// \brief Represents the \c this expression in C++.
759 ///
760 /// This is a pointer to the object on which the current member function is
761 /// executing (C++ [expr.prim]p3). Example:
762 ///
763 /// \code
764 /// class Foo {
765 /// public:
766 /// void bar();
767 /// void test() { this->bar(); }
768 /// };
769 /// \endcode
770 class CXXThisExpr : public Expr {
771 SourceLocation Loc;
772 bool Implicit : 1;
773
774 public:
CXXThisExpr(SourceLocation L,QualType Type,bool isImplicit)775 CXXThisExpr(SourceLocation L, QualType Type, bool isImplicit)
776 : Expr(CXXThisExprClass, Type, VK_RValue, OK_Ordinary,
777 // 'this' is type-dependent if the class type of the enclosing
778 // member function is dependent (C++ [temp.dep.expr]p2)
779 Type->isDependentType(), Type->isDependentType(),
780 Type->isInstantiationDependentType(),
781 /*ContainsUnexpandedParameterPack=*/false),
782 Loc(L), Implicit(isImplicit) { }
783
CXXThisExpr(EmptyShell Empty)784 CXXThisExpr(EmptyShell Empty) : Expr(CXXThisExprClass, Empty) {}
785
getLocation()786 SourceLocation getLocation() const { return Loc; }
setLocation(SourceLocation L)787 void setLocation(SourceLocation L) { Loc = L; }
788
getLocStart()789 SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()790 SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
791
isImplicit()792 bool isImplicit() const { return Implicit; }
setImplicit(bool I)793 void setImplicit(bool I) { Implicit = I; }
794
classof(const Stmt * T)795 static bool classof(const Stmt *T) {
796 return T->getStmtClass() == CXXThisExprClass;
797 }
798
799 // Iterators
children()800 child_range children() { return child_range(); }
801 };
802
803 /// \brief A C++ throw-expression (C++ [except.throw]).
804 ///
805 /// This handles 'throw' (for re-throwing the current exception) and
806 /// 'throw' assignment-expression. When assignment-expression isn't
807 /// present, Op will be null.
808 class CXXThrowExpr : public Expr {
809 Stmt *Op;
810 SourceLocation ThrowLoc;
811 /// \brief Whether the thrown variable (if any) is in scope.
812 unsigned IsThrownVariableInScope : 1;
813
814 friend class ASTStmtReader;
815
816 public:
817 // \p Ty is the void type which is used as the result type of the
818 // expression. The \p l is the location of the throw keyword. \p expr
819 // can by null, if the optional expression to throw isn't present.
CXXThrowExpr(Expr * expr,QualType Ty,SourceLocation l,bool IsThrownVariableInScope)820 CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l,
821 bool IsThrownVariableInScope) :
822 Expr(CXXThrowExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
823 expr && expr->isInstantiationDependent(),
824 expr && expr->containsUnexpandedParameterPack()),
825 Op(expr), ThrowLoc(l), IsThrownVariableInScope(IsThrownVariableInScope) {}
CXXThrowExpr(EmptyShell Empty)826 CXXThrowExpr(EmptyShell Empty) : Expr(CXXThrowExprClass, Empty) {}
827
getSubExpr()828 const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); }
getSubExpr()829 Expr *getSubExpr() { return cast_or_null<Expr>(Op); }
830
getThrowLoc()831 SourceLocation getThrowLoc() const { return ThrowLoc; }
832
833 /// \brief Determines whether the variable thrown by this expression (if any!)
834 /// is within the innermost try block.
835 ///
836 /// This information is required to determine whether the NRVO can apply to
837 /// this variable.
isThrownVariableInScope()838 bool isThrownVariableInScope() const { return IsThrownVariableInScope; }
839
getLocStart()840 SourceLocation getLocStart() const LLVM_READONLY { return ThrowLoc; }
getLocEnd()841 SourceLocation getLocEnd() const LLVM_READONLY {
842 if (!getSubExpr())
843 return ThrowLoc;
844 return getSubExpr()->getLocEnd();
845 }
846
classof(const Stmt * T)847 static bool classof(const Stmt *T) {
848 return T->getStmtClass() == CXXThrowExprClass;
849 }
850
851 // Iterators
children()852 child_range children() {
853 return child_range(&Op, Op ? &Op+1 : &Op);
854 }
855 };
856
857 /// \brief A default argument (C++ [dcl.fct.default]).
858 ///
859 /// This wraps up a function call argument that was created from the
860 /// corresponding parameter's default argument, when the call did not
861 /// explicitly supply arguments for all of the parameters.
862 class CXXDefaultArgExpr : public Expr {
863 /// \brief The parameter whose default is being used.
864 ///
865 /// When the bit is set, the subexpression is stored after the
866 /// CXXDefaultArgExpr itself. When the bit is clear, the parameter's
867 /// actual default expression is the subexpression.
868 llvm::PointerIntPair<ParmVarDecl *, 1, bool> Param;
869
870 /// \brief The location where the default argument expression was used.
871 SourceLocation Loc;
872
CXXDefaultArgExpr(StmtClass SC,SourceLocation Loc,ParmVarDecl * param)873 CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param)
874 : Expr(SC,
875 param->hasUnparsedDefaultArg()
876 ? param->getType().getNonReferenceType()
877 : param->getDefaultArg()->getType(),
878 param->getDefaultArg()->getValueKind(),
879 param->getDefaultArg()->getObjectKind(), false, false, false, false),
880 Param(param, false), Loc(Loc) { }
881
CXXDefaultArgExpr(StmtClass SC,SourceLocation Loc,ParmVarDecl * param,Expr * SubExpr)882 CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param,
883 Expr *SubExpr)
884 : Expr(SC, SubExpr->getType(),
885 SubExpr->getValueKind(), SubExpr->getObjectKind(),
886 false, false, false, false),
887 Param(param, true), Loc(Loc) {
888 *reinterpret_cast<Expr **>(this + 1) = SubExpr;
889 }
890
891 public:
CXXDefaultArgExpr(EmptyShell Empty)892 CXXDefaultArgExpr(EmptyShell Empty) : Expr(CXXDefaultArgExprClass, Empty) {}
893
894 // \p Param is the parameter whose default argument is used by this
895 // expression.
Create(const ASTContext & C,SourceLocation Loc,ParmVarDecl * Param)896 static CXXDefaultArgExpr *Create(const ASTContext &C, SourceLocation Loc,
897 ParmVarDecl *Param) {
898 return new (C) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param);
899 }
900
901 // \p Param is the parameter whose default argument is used by this
902 // expression, and \p SubExpr is the expression that will actually be used.
903 static CXXDefaultArgExpr *Create(const ASTContext &C, SourceLocation Loc,
904 ParmVarDecl *Param, Expr *SubExpr);
905
906 // Retrieve the parameter that the argument was created from.
getParam()907 const ParmVarDecl *getParam() const { return Param.getPointer(); }
getParam()908 ParmVarDecl *getParam() { return Param.getPointer(); }
909
910 // Retrieve the actual argument to the function call.
getExpr()911 const Expr *getExpr() const {
912 if (Param.getInt())
913 return *reinterpret_cast<Expr const * const*> (this + 1);
914 return getParam()->getDefaultArg();
915 }
getExpr()916 Expr *getExpr() {
917 if (Param.getInt())
918 return *reinterpret_cast<Expr **> (this + 1);
919 return getParam()->getDefaultArg();
920 }
921
922 /// \brief Retrieve the location where this default argument was actually
923 /// used.
getUsedLocation()924 SourceLocation getUsedLocation() const { return Loc; }
925
926 /// Default argument expressions have no representation in the
927 /// source, so they have an empty source range.
getLocStart()928 SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); }
getLocEnd()929 SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); }
930
getExprLoc()931 SourceLocation getExprLoc() const LLVM_READONLY { return Loc; }
932
classof(const Stmt * T)933 static bool classof(const Stmt *T) {
934 return T->getStmtClass() == CXXDefaultArgExprClass;
935 }
936
937 // Iterators
children()938 child_range children() { return child_range(); }
939
940 friend class ASTStmtReader;
941 friend class ASTStmtWriter;
942 };
943
944 /// \brief A use of a default initializer in a constructor or in aggregate
945 /// initialization.
946 ///
947 /// This wraps a use of a C++ default initializer (technically,
948 /// a brace-or-equal-initializer for a non-static data member) when it
949 /// is implicitly used in a mem-initializer-list in a constructor
950 /// (C++11 [class.base.init]p8) or in aggregate initialization
951 /// (C++1y [dcl.init.aggr]p7).
952 class CXXDefaultInitExpr : public Expr {
953 /// \brief The field whose default is being used.
954 FieldDecl *Field;
955
956 /// \brief The location where the default initializer expression was used.
957 SourceLocation Loc;
958
959 CXXDefaultInitExpr(const ASTContext &C, SourceLocation Loc, FieldDecl *Field,
960 QualType T);
961
CXXDefaultInitExpr(EmptyShell Empty)962 CXXDefaultInitExpr(EmptyShell Empty) : Expr(CXXDefaultInitExprClass, Empty) {}
963
964 public:
965 /// \p Field is the non-static data member whose default initializer is used
966 /// by this expression.
Create(const ASTContext & C,SourceLocation Loc,FieldDecl * Field)967 static CXXDefaultInitExpr *Create(const ASTContext &C, SourceLocation Loc,
968 FieldDecl *Field) {
969 return new (C) CXXDefaultInitExpr(C, Loc, Field, Field->getType());
970 }
971
972 /// \brief Get the field whose initializer will be used.
getField()973 FieldDecl *getField() { return Field; }
getField()974 const FieldDecl *getField() const { return Field; }
975
976 /// \brief Get the initialization expression that will be used.
getExpr()977 const Expr *getExpr() const {
978 assert(Field->getInClassInitializer() && "initializer hasn't been parsed");
979 return Field->getInClassInitializer();
980 }
getExpr()981 Expr *getExpr() {
982 assert(Field->getInClassInitializer() && "initializer hasn't been parsed");
983 return Field->getInClassInitializer();
984 }
985
getLocStart()986 SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()987 SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
988
classof(const Stmt * T)989 static bool classof(const Stmt *T) {
990 return T->getStmtClass() == CXXDefaultInitExprClass;
991 }
992
993 // Iterators
children()994 child_range children() { return child_range(); }
995
996 friend class ASTReader;
997 friend class ASTStmtReader;
998 };
999
1000 /// \brief Represents a C++ temporary.
1001 class CXXTemporary {
1002 /// \brief The destructor that needs to be called.
1003 const CXXDestructorDecl *Destructor;
1004
CXXTemporary(const CXXDestructorDecl * destructor)1005 explicit CXXTemporary(const CXXDestructorDecl *destructor)
1006 : Destructor(destructor) { }
1007
1008 public:
1009 static CXXTemporary *Create(const ASTContext &C,
1010 const CXXDestructorDecl *Destructor);
1011
getDestructor()1012 const CXXDestructorDecl *getDestructor() const { return Destructor; }
setDestructor(const CXXDestructorDecl * Dtor)1013 void setDestructor(const CXXDestructorDecl *Dtor) {
1014 Destructor = Dtor;
1015 }
1016 };
1017
1018 /// \brief Represents binding an expression to a temporary.
1019 ///
1020 /// This ensures the destructor is called for the temporary. It should only be
1021 /// needed for non-POD, non-trivially destructable class types. For example:
1022 ///
1023 /// \code
1024 /// struct S {
1025 /// S() { } // User defined constructor makes S non-POD.
1026 /// ~S() { } // User defined destructor makes it non-trivial.
1027 /// };
1028 /// void test() {
1029 /// const S &s_ref = S(); // Requires a CXXBindTemporaryExpr.
1030 /// }
1031 /// \endcode
1032 class CXXBindTemporaryExpr : public Expr {
1033 CXXTemporary *Temp;
1034
1035 Stmt *SubExpr;
1036
CXXBindTemporaryExpr(CXXTemporary * temp,Expr * SubExpr)1037 CXXBindTemporaryExpr(CXXTemporary *temp, Expr* SubExpr)
1038 : Expr(CXXBindTemporaryExprClass, SubExpr->getType(),
1039 VK_RValue, OK_Ordinary, SubExpr->isTypeDependent(),
1040 SubExpr->isValueDependent(),
1041 SubExpr->isInstantiationDependent(),
1042 SubExpr->containsUnexpandedParameterPack()),
1043 Temp(temp), SubExpr(SubExpr) { }
1044
1045 public:
CXXBindTemporaryExpr(EmptyShell Empty)1046 CXXBindTemporaryExpr(EmptyShell Empty)
1047 : Expr(CXXBindTemporaryExprClass, Empty), Temp(nullptr), SubExpr(nullptr) {}
1048
1049 static CXXBindTemporaryExpr *Create(const ASTContext &C, CXXTemporary *Temp,
1050 Expr* SubExpr);
1051
getTemporary()1052 CXXTemporary *getTemporary() { return Temp; }
getTemporary()1053 const CXXTemporary *getTemporary() const { return Temp; }
setTemporary(CXXTemporary * T)1054 void setTemporary(CXXTemporary *T) { Temp = T; }
1055
getSubExpr()1056 const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
getSubExpr()1057 Expr *getSubExpr() { return cast<Expr>(SubExpr); }
setSubExpr(Expr * E)1058 void setSubExpr(Expr *E) { SubExpr = E; }
1059
getLocStart()1060 SourceLocation getLocStart() const LLVM_READONLY {
1061 return SubExpr->getLocStart();
1062 }
getLocEnd()1063 SourceLocation getLocEnd() const LLVM_READONLY { return SubExpr->getLocEnd();}
1064
1065 // Implement isa/cast/dyncast/etc.
classof(const Stmt * T)1066 static bool classof(const Stmt *T) {
1067 return T->getStmtClass() == CXXBindTemporaryExprClass;
1068 }
1069
1070 // Iterators
children()1071 child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
1072 };
1073
1074 /// \brief Represents a call to a C++ constructor.
1075 class CXXConstructExpr : public Expr {
1076 public:
1077 enum ConstructionKind {
1078 CK_Complete,
1079 CK_NonVirtualBase,
1080 CK_VirtualBase,
1081 CK_Delegating
1082 };
1083
1084 private:
1085 CXXConstructorDecl *Constructor;
1086
1087 SourceLocation Loc;
1088 SourceRange ParenOrBraceRange;
1089 unsigned NumArgs : 16;
1090 bool Elidable : 1;
1091 bool HadMultipleCandidates : 1;
1092 bool ListInitialization : 1;
1093 bool StdInitListInitialization : 1;
1094 bool ZeroInitialization : 1;
1095 unsigned ConstructKind : 2;
1096 Stmt **Args;
1097
1098 protected:
1099 CXXConstructExpr(const ASTContext &C, StmtClass SC, QualType T,
1100 SourceLocation Loc,
1101 CXXConstructorDecl *d, bool elidable,
1102 ArrayRef<Expr *> Args,
1103 bool HadMultipleCandidates,
1104 bool ListInitialization,
1105 bool StdInitListInitialization,
1106 bool ZeroInitialization,
1107 ConstructionKind ConstructKind,
1108 SourceRange ParenOrBraceRange);
1109
1110 /// \brief Construct an empty C++ construction expression.
CXXConstructExpr(StmtClass SC,EmptyShell Empty)1111 CXXConstructExpr(StmtClass SC, EmptyShell Empty)
1112 : Expr(SC, Empty), Constructor(nullptr), NumArgs(0), Elidable(false),
1113 HadMultipleCandidates(false), ListInitialization(false),
1114 ZeroInitialization(false), ConstructKind(0), Args(nullptr)
1115 { }
1116
1117 public:
1118 /// \brief Construct an empty C++ construction expression.
CXXConstructExpr(EmptyShell Empty)1119 explicit CXXConstructExpr(EmptyShell Empty)
1120 : Expr(CXXConstructExprClass, Empty), Constructor(nullptr),
1121 NumArgs(0), Elidable(false), HadMultipleCandidates(false),
1122 ListInitialization(false), ZeroInitialization(false),
1123 ConstructKind(0), Args(nullptr)
1124 { }
1125
1126 static CXXConstructExpr *Create(const ASTContext &C, QualType T,
1127 SourceLocation Loc,
1128 CXXConstructorDecl *D, bool Elidable,
1129 ArrayRef<Expr *> Args,
1130 bool HadMultipleCandidates,
1131 bool ListInitialization,
1132 bool StdInitListInitialization,
1133 bool ZeroInitialization,
1134 ConstructionKind ConstructKind,
1135 SourceRange ParenOrBraceRange);
1136
getConstructor()1137 CXXConstructorDecl *getConstructor() const { return Constructor; }
setConstructor(CXXConstructorDecl * C)1138 void setConstructor(CXXConstructorDecl *C) { Constructor = C; }
1139
getLocation()1140 SourceLocation getLocation() const { return Loc; }
setLocation(SourceLocation Loc)1141 void setLocation(SourceLocation Loc) { this->Loc = Loc; }
1142
1143 /// \brief Whether this construction is elidable.
isElidable()1144 bool isElidable() const { return Elidable; }
setElidable(bool E)1145 void setElidable(bool E) { Elidable = E; }
1146
1147 /// \brief Whether the referred constructor was resolved from
1148 /// an overloaded set having size greater than 1.
hadMultipleCandidates()1149 bool hadMultipleCandidates() const { return HadMultipleCandidates; }
setHadMultipleCandidates(bool V)1150 void setHadMultipleCandidates(bool V) { HadMultipleCandidates = V; }
1151
1152 /// \brief Whether this constructor call was written as list-initialization.
isListInitialization()1153 bool isListInitialization() const { return ListInitialization; }
setListInitialization(bool V)1154 void setListInitialization(bool V) { ListInitialization = V; }
1155
1156 /// \brief Whether this constructor call was written as list-initialization,
1157 /// but was interpreted as forming a std::initializer_list<T> from the list
1158 /// and passing that as a single constructor argument.
1159 /// See C++11 [over.match.list]p1 bullet 1.
isStdInitListInitialization()1160 bool isStdInitListInitialization() const { return StdInitListInitialization; }
setStdInitListInitialization(bool V)1161 void setStdInitListInitialization(bool V) { StdInitListInitialization = V; }
1162
1163 /// \brief Whether this construction first requires
1164 /// zero-initialization before the initializer is called.
requiresZeroInitialization()1165 bool requiresZeroInitialization() const { return ZeroInitialization; }
setRequiresZeroInitialization(bool ZeroInit)1166 void setRequiresZeroInitialization(bool ZeroInit) {
1167 ZeroInitialization = ZeroInit;
1168 }
1169
1170 /// \brief Determine whether this constructor is actually constructing
1171 /// a base class (rather than a complete object).
getConstructionKind()1172 ConstructionKind getConstructionKind() const {
1173 return (ConstructionKind)ConstructKind;
1174 }
setConstructionKind(ConstructionKind CK)1175 void setConstructionKind(ConstructionKind CK) {
1176 ConstructKind = CK;
1177 }
1178
1179 typedef ExprIterator arg_iterator;
1180 typedef ConstExprIterator const_arg_iterator;
1181 typedef llvm::iterator_range<arg_iterator> arg_range;
1182 typedef llvm::iterator_range<const_arg_iterator> arg_const_range;
1183
arguments()1184 arg_range arguments() { return arg_range(arg_begin(), arg_end()); }
arguments()1185 arg_const_range arguments() const {
1186 return arg_const_range(arg_begin(), arg_end());
1187 }
1188
arg_begin()1189 arg_iterator arg_begin() { return Args; }
arg_end()1190 arg_iterator arg_end() { return Args + NumArgs; }
arg_begin()1191 const_arg_iterator arg_begin() const { return Args; }
arg_end()1192 const_arg_iterator arg_end() const { return Args + NumArgs; }
1193
getArgs()1194 Expr **getArgs() { return reinterpret_cast<Expr **>(Args); }
getArgs()1195 const Expr *const *getArgs() const {
1196 return const_cast<CXXConstructExpr *>(this)->getArgs();
1197 }
getNumArgs()1198 unsigned getNumArgs() const { return NumArgs; }
1199
1200 /// \brief Return the specified argument.
getArg(unsigned Arg)1201 Expr *getArg(unsigned Arg) {
1202 assert(Arg < NumArgs && "Arg access out of range!");
1203 return cast<Expr>(Args[Arg]);
1204 }
getArg(unsigned Arg)1205 const Expr *getArg(unsigned Arg) const {
1206 assert(Arg < NumArgs && "Arg access out of range!");
1207 return cast<Expr>(Args[Arg]);
1208 }
1209
1210 /// \brief Set the specified argument.
setArg(unsigned Arg,Expr * ArgExpr)1211 void setArg(unsigned Arg, Expr *ArgExpr) {
1212 assert(Arg < NumArgs && "Arg access out of range!");
1213 Args[Arg] = ArgExpr;
1214 }
1215
1216 SourceLocation getLocStart() const LLVM_READONLY;
1217 SourceLocation getLocEnd() const LLVM_READONLY;
getParenOrBraceRange()1218 SourceRange getParenOrBraceRange() const { return ParenOrBraceRange; }
setParenOrBraceRange(SourceRange Range)1219 void setParenOrBraceRange(SourceRange Range) { ParenOrBraceRange = Range; }
1220
classof(const Stmt * T)1221 static bool classof(const Stmt *T) {
1222 return T->getStmtClass() == CXXConstructExprClass ||
1223 T->getStmtClass() == CXXTemporaryObjectExprClass;
1224 }
1225
1226 // Iterators
children()1227 child_range children() {
1228 return child_range(&Args[0], &Args[0]+NumArgs);
1229 }
1230
1231 friend class ASTStmtReader;
1232 };
1233
1234 /// \brief Represents an explicit C++ type conversion that uses "functional"
1235 /// notation (C++ [expr.type.conv]).
1236 ///
1237 /// Example:
1238 /// \code
1239 /// x = int(0.5);
1240 /// \endcode
1241 class CXXFunctionalCastExpr : public ExplicitCastExpr {
1242 SourceLocation LParenLoc;
1243 SourceLocation RParenLoc;
1244
CXXFunctionalCastExpr(QualType ty,ExprValueKind VK,TypeSourceInfo * writtenTy,CastKind kind,Expr * castExpr,unsigned pathSize,SourceLocation lParenLoc,SourceLocation rParenLoc)1245 CXXFunctionalCastExpr(QualType ty, ExprValueKind VK,
1246 TypeSourceInfo *writtenTy,
1247 CastKind kind, Expr *castExpr, unsigned pathSize,
1248 SourceLocation lParenLoc, SourceLocation rParenLoc)
1249 : ExplicitCastExpr(CXXFunctionalCastExprClass, ty, VK, kind,
1250 castExpr, pathSize, writtenTy),
1251 LParenLoc(lParenLoc), RParenLoc(rParenLoc) {}
1252
CXXFunctionalCastExpr(EmptyShell Shell,unsigned PathSize)1253 explicit CXXFunctionalCastExpr(EmptyShell Shell, unsigned PathSize)
1254 : ExplicitCastExpr(CXXFunctionalCastExprClass, Shell, PathSize) { }
1255
1256 public:
1257 static CXXFunctionalCastExpr *Create(const ASTContext &Context, QualType T,
1258 ExprValueKind VK,
1259 TypeSourceInfo *Written,
1260 CastKind Kind, Expr *Op,
1261 const CXXCastPath *Path,
1262 SourceLocation LPLoc,
1263 SourceLocation RPLoc);
1264 static CXXFunctionalCastExpr *CreateEmpty(const ASTContext &Context,
1265 unsigned PathSize);
1266
getLParenLoc()1267 SourceLocation getLParenLoc() const { return LParenLoc; }
setLParenLoc(SourceLocation L)1268 void setLParenLoc(SourceLocation L) { LParenLoc = L; }
getRParenLoc()1269 SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation L)1270 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
1271
1272 SourceLocation getLocStart() const LLVM_READONLY;
1273 SourceLocation getLocEnd() const LLVM_READONLY;
1274
classof(const Stmt * T)1275 static bool classof(const Stmt *T) {
1276 return T->getStmtClass() == CXXFunctionalCastExprClass;
1277 }
1278 };
1279
1280 /// @brief Represents a C++ functional cast expression that builds a
1281 /// temporary object.
1282 ///
1283 /// This expression type represents a C++ "functional" cast
1284 /// (C++[expr.type.conv]) with N != 1 arguments that invokes a
1285 /// constructor to build a temporary object. With N == 1 arguments the
1286 /// functional cast expression will be represented by CXXFunctionalCastExpr.
1287 /// Example:
1288 /// \code
1289 /// struct X { X(int, float); }
1290 ///
1291 /// X create_X() {
1292 /// return X(1, 3.14f); // creates a CXXTemporaryObjectExpr
1293 /// };
1294 /// \endcode
1295 class CXXTemporaryObjectExpr : public CXXConstructExpr {
1296 TypeSourceInfo *Type;
1297
1298 public:
1299 CXXTemporaryObjectExpr(const ASTContext &C, CXXConstructorDecl *Cons,
1300 TypeSourceInfo *Type,
1301 ArrayRef<Expr *> Args,
1302 SourceRange ParenOrBraceRange,
1303 bool HadMultipleCandidates,
1304 bool ListInitialization,
1305 bool StdInitListInitialization,
1306 bool ZeroInitialization);
CXXTemporaryObjectExpr(EmptyShell Empty)1307 explicit CXXTemporaryObjectExpr(EmptyShell Empty)
1308 : CXXConstructExpr(CXXTemporaryObjectExprClass, Empty), Type() { }
1309
getTypeSourceInfo()1310 TypeSourceInfo *getTypeSourceInfo() const { return Type; }
1311
1312 SourceLocation getLocStart() const LLVM_READONLY;
1313 SourceLocation getLocEnd() const LLVM_READONLY;
1314
classof(const Stmt * T)1315 static bool classof(const Stmt *T) {
1316 return T->getStmtClass() == CXXTemporaryObjectExprClass;
1317 }
1318
1319 friend class ASTStmtReader;
1320 };
1321
1322 /// \brief A C++ lambda expression, which produces a function object
1323 /// (of unspecified type) that can be invoked later.
1324 ///
1325 /// Example:
1326 /// \code
1327 /// void low_pass_filter(std::vector<double> &values, double cutoff) {
1328 /// values.erase(std::remove_if(values.begin(), values.end(),
1329 /// [=](double value) { return value > cutoff; });
1330 /// }
1331 /// \endcode
1332 ///
1333 /// C++11 lambda expressions can capture local variables, either by copying
1334 /// the values of those local variables at the time the function
1335 /// object is constructed (not when it is called!) or by holding a
1336 /// reference to the local variable. These captures can occur either
1337 /// implicitly or can be written explicitly between the square
1338 /// brackets ([...]) that start the lambda expression.
1339 ///
1340 /// C++1y introduces a new form of "capture" called an init-capture that
1341 /// includes an initializing expression (rather than capturing a variable),
1342 /// and which can never occur implicitly.
1343 class LambdaExpr : public Expr {
1344 /// \brief The source range that covers the lambda introducer ([...]).
1345 SourceRange IntroducerRange;
1346
1347 /// \brief The source location of this lambda's capture-default ('=' or '&').
1348 SourceLocation CaptureDefaultLoc;
1349
1350 /// \brief The number of captures.
1351 unsigned NumCaptures : 16;
1352
1353 /// \brief The default capture kind, which is a value of type
1354 /// LambdaCaptureDefault.
1355 unsigned CaptureDefault : 2;
1356
1357 /// \brief Whether this lambda had an explicit parameter list vs. an
1358 /// implicit (and empty) parameter list.
1359 unsigned ExplicitParams : 1;
1360
1361 /// \brief Whether this lambda had the result type explicitly specified.
1362 unsigned ExplicitResultType : 1;
1363
1364 /// \brief Whether there are any array index variables stored at the end of
1365 /// this lambda expression.
1366 unsigned HasArrayIndexVars : 1;
1367
1368 /// \brief The location of the closing brace ('}') that completes
1369 /// the lambda.
1370 ///
1371 /// The location of the brace is also available by looking up the
1372 /// function call operator in the lambda class. However, it is
1373 /// stored here to improve the performance of getSourceRange(), and
1374 /// to avoid having to deserialize the function call operator from a
1375 /// module file just to determine the source range.
1376 SourceLocation ClosingBrace;
1377
1378 // Note: The capture initializers are stored directly after the lambda
1379 // expression, along with the index variables used to initialize by-copy
1380 // array captures.
1381
1382 typedef LambdaCapture Capture;
1383
1384 /// \brief Construct a lambda expression.
1385 LambdaExpr(QualType T, SourceRange IntroducerRange,
1386 LambdaCaptureDefault CaptureDefault,
1387 SourceLocation CaptureDefaultLoc,
1388 ArrayRef<Capture> Captures,
1389 bool ExplicitParams,
1390 bool ExplicitResultType,
1391 ArrayRef<Expr *> CaptureInits,
1392 ArrayRef<VarDecl *> ArrayIndexVars,
1393 ArrayRef<unsigned> ArrayIndexStarts,
1394 SourceLocation ClosingBrace,
1395 bool ContainsUnexpandedParameterPack);
1396
1397 /// \brief Construct an empty lambda expression.
LambdaExpr(EmptyShell Empty,unsigned NumCaptures,bool HasArrayIndexVars)1398 LambdaExpr(EmptyShell Empty, unsigned NumCaptures, bool HasArrayIndexVars)
1399 : Expr(LambdaExprClass, Empty),
1400 NumCaptures(NumCaptures), CaptureDefault(LCD_None), ExplicitParams(false),
1401 ExplicitResultType(false), HasArrayIndexVars(true) {
1402 getStoredStmts()[NumCaptures] = nullptr;
1403 }
1404
getStoredStmts()1405 Stmt **getStoredStmts() const {
1406 return reinterpret_cast<Stmt **>(const_cast<LambdaExpr *>(this) + 1);
1407 }
1408
1409 /// \brief Retrieve the mapping from captures to the first array index
1410 /// variable.
getArrayIndexStarts()1411 unsigned *getArrayIndexStarts() const {
1412 return reinterpret_cast<unsigned *>(getStoredStmts() + NumCaptures + 1);
1413 }
1414
1415 /// \brief Retrieve the complete set of array-index variables.
getArrayIndexVars()1416 VarDecl **getArrayIndexVars() const {
1417 unsigned ArrayIndexSize = llvm::RoundUpToAlignment(
1418 sizeof(unsigned) * (NumCaptures + 1), llvm::alignOf<VarDecl *>());
1419 return reinterpret_cast<VarDecl **>(
1420 reinterpret_cast<char *>(getArrayIndexStarts()) + ArrayIndexSize);
1421 }
1422
1423 public:
1424 /// \brief Construct a new lambda expression.
1425 static LambdaExpr *Create(const ASTContext &C,
1426 CXXRecordDecl *Class,
1427 SourceRange IntroducerRange,
1428 LambdaCaptureDefault CaptureDefault,
1429 SourceLocation CaptureDefaultLoc,
1430 ArrayRef<Capture> Captures,
1431 bool ExplicitParams,
1432 bool ExplicitResultType,
1433 ArrayRef<Expr *> CaptureInits,
1434 ArrayRef<VarDecl *> ArrayIndexVars,
1435 ArrayRef<unsigned> ArrayIndexStarts,
1436 SourceLocation ClosingBrace,
1437 bool ContainsUnexpandedParameterPack);
1438
1439 /// \brief Construct a new lambda expression that will be deserialized from
1440 /// an external source.
1441 static LambdaExpr *CreateDeserialized(const ASTContext &C,
1442 unsigned NumCaptures,
1443 unsigned NumArrayIndexVars);
1444
1445 /// \brief Determine the default capture kind for this lambda.
getCaptureDefault()1446 LambdaCaptureDefault getCaptureDefault() const {
1447 return static_cast<LambdaCaptureDefault>(CaptureDefault);
1448 }
1449
1450 /// \brief Retrieve the location of this lambda's capture-default, if any.
getCaptureDefaultLoc()1451 SourceLocation getCaptureDefaultLoc() const {
1452 return CaptureDefaultLoc;
1453 }
1454
1455 /// \brief Determine whether one of this lambda's captures is an init-capture.
1456 bool isInitCapture(const LambdaCapture *Capture) const;
1457
1458 /// \brief An iterator that walks over the captures of the lambda,
1459 /// both implicit and explicit.
1460 typedef const Capture *capture_iterator;
1461
1462 /// \brief An iterator over a range of lambda captures.
1463 typedef llvm::iterator_range<capture_iterator> capture_range;
1464
1465 /// \brief Retrieve this lambda's captures.
1466 capture_range captures() const;
1467
1468 /// \brief Retrieve an iterator pointing to the first lambda capture.
1469 capture_iterator capture_begin() const;
1470
1471 /// \brief Retrieve an iterator pointing past the end of the
1472 /// sequence of lambda captures.
1473 capture_iterator capture_end() const;
1474
1475 /// \brief Determine the number of captures in this lambda.
capture_size()1476 unsigned capture_size() const { return NumCaptures; }
1477
1478 /// \brief Retrieve this lambda's explicit captures.
1479 capture_range explicit_captures() const;
1480
1481 /// \brief Retrieve an iterator pointing to the first explicit
1482 /// lambda capture.
1483 capture_iterator explicit_capture_begin() const;
1484
1485 /// \brief Retrieve an iterator pointing past the end of the sequence of
1486 /// explicit lambda captures.
1487 capture_iterator explicit_capture_end() const;
1488
1489 /// \brief Retrieve this lambda's implicit captures.
1490 capture_range implicit_captures() const;
1491
1492 /// \brief Retrieve an iterator pointing to the first implicit
1493 /// lambda capture.
1494 capture_iterator implicit_capture_begin() const;
1495
1496 /// \brief Retrieve an iterator pointing past the end of the sequence of
1497 /// implicit lambda captures.
1498 capture_iterator implicit_capture_end() const;
1499
1500 /// \brief Iterator that walks over the capture initialization
1501 /// arguments.
1502 typedef Expr **capture_init_iterator;
1503
1504 /// \brief Retrieve the initialization expressions for this lambda's captures.
capture_inits()1505 llvm::iterator_range<capture_init_iterator> capture_inits() const {
1506 return llvm::iterator_range<capture_init_iterator>(capture_init_begin(),
1507 capture_init_end());
1508 }
1509
1510 /// \brief Retrieve the first initialization argument for this
1511 /// lambda expression (which initializes the first capture field).
capture_init_begin()1512 capture_init_iterator capture_init_begin() const {
1513 return reinterpret_cast<Expr **>(getStoredStmts());
1514 }
1515
1516 /// \brief Retrieve the iterator pointing one past the last
1517 /// initialization argument for this lambda expression.
capture_init_end()1518 capture_init_iterator capture_init_end() const {
1519 return capture_init_begin() + NumCaptures;
1520 }
1521
1522 /// \brief Retrieve the set of index variables used in the capture
1523 /// initializer of an array captured by copy.
1524 ///
1525 /// \param Iter The iterator that points at the capture initializer for
1526 /// which we are extracting the corresponding index variables.
1527 ArrayRef<VarDecl *> getCaptureInitIndexVars(capture_init_iterator Iter) const;
1528
1529 /// \brief Retrieve the source range covering the lambda introducer,
1530 /// which contains the explicit capture list surrounded by square
1531 /// brackets ([...]).
getIntroducerRange()1532 SourceRange getIntroducerRange() const { return IntroducerRange; }
1533
1534 /// \brief Retrieve the class that corresponds to the lambda.
1535 ///
1536 /// This is the "closure type" (C++1y [expr.prim.lambda]), and stores the
1537 /// captures in its fields and provides the various operations permitted
1538 /// on a lambda (copying, calling).
1539 CXXRecordDecl *getLambdaClass() const;
1540
1541 /// \brief Retrieve the function call operator associated with this
1542 /// lambda expression.
1543 CXXMethodDecl *getCallOperator() const;
1544
1545 /// \brief If this is a generic lambda expression, retrieve the template
1546 /// parameter list associated with it, or else return null.
1547 TemplateParameterList *getTemplateParameterList() const;
1548
1549 /// \brief Whether this is a generic lambda.
isGenericLambda()1550 bool isGenericLambda() const { return getTemplateParameterList(); }
1551
1552 /// \brief Retrieve the body of the lambda.
1553 CompoundStmt *getBody() const;
1554
1555 /// \brief Determine whether the lambda is mutable, meaning that any
1556 /// captures values can be modified.
1557 bool isMutable() const;
1558
1559 /// \brief Determine whether this lambda has an explicit parameter
1560 /// list vs. an implicit (empty) parameter list.
hasExplicitParameters()1561 bool hasExplicitParameters() const { return ExplicitParams; }
1562
1563 /// \brief Whether this lambda had its result type explicitly specified.
hasExplicitResultType()1564 bool hasExplicitResultType() const { return ExplicitResultType; }
1565
classof(const Stmt * T)1566 static bool classof(const Stmt *T) {
1567 return T->getStmtClass() == LambdaExprClass;
1568 }
1569
getLocStart()1570 SourceLocation getLocStart() const LLVM_READONLY {
1571 return IntroducerRange.getBegin();
1572 }
getLocEnd()1573 SourceLocation getLocEnd() const LLVM_READONLY { return ClosingBrace; }
1574
children()1575 child_range children() {
1576 return child_range(getStoredStmts(), getStoredStmts() + NumCaptures + 1);
1577 }
1578
1579 friend class ASTStmtReader;
1580 friend class ASTStmtWriter;
1581 };
1582
1583 /// An expression "T()" which creates a value-initialized rvalue of type
1584 /// T, which is a non-class type. See (C++98 [5.2.3p2]).
1585 class CXXScalarValueInitExpr : public Expr {
1586 SourceLocation RParenLoc;
1587 TypeSourceInfo *TypeInfo;
1588
1589 friend class ASTStmtReader;
1590
1591 public:
1592 /// \brief Create an explicitly-written scalar-value initialization
1593 /// expression.
CXXScalarValueInitExpr(QualType Type,TypeSourceInfo * TypeInfo,SourceLocation rParenLoc)1594 CXXScalarValueInitExpr(QualType Type, TypeSourceInfo *TypeInfo,
1595 SourceLocation rParenLoc)
1596 : Expr(CXXScalarValueInitExprClass, Type, VK_RValue, OK_Ordinary,
1597 false, false, Type->isInstantiationDependentType(),
1598 Type->containsUnexpandedParameterPack()),
1599 RParenLoc(rParenLoc), TypeInfo(TypeInfo) {}
1600
CXXScalarValueInitExpr(EmptyShell Shell)1601 explicit CXXScalarValueInitExpr(EmptyShell Shell)
1602 : Expr(CXXScalarValueInitExprClass, Shell) { }
1603
getTypeSourceInfo()1604 TypeSourceInfo *getTypeSourceInfo() const {
1605 return TypeInfo;
1606 }
1607
getRParenLoc()1608 SourceLocation getRParenLoc() const { return RParenLoc; }
1609
1610 SourceLocation getLocStart() const LLVM_READONLY;
getLocEnd()1611 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
1612
classof(const Stmt * T)1613 static bool classof(const Stmt *T) {
1614 return T->getStmtClass() == CXXScalarValueInitExprClass;
1615 }
1616
1617 // Iterators
children()1618 child_range children() { return child_range(); }
1619 };
1620
1621 /// \brief Represents a new-expression for memory allocation and constructor
1622 /// calls, e.g: "new CXXNewExpr(foo)".
1623 class CXXNewExpr : public Expr {
1624 /// Contains an optional array size expression, an optional initialization
1625 /// expression, and any number of optional placement arguments, in that order.
1626 Stmt **SubExprs;
1627 /// \brief Points to the allocation function used.
1628 FunctionDecl *OperatorNew;
1629 /// \brief Points to the deallocation function used in case of error. May be
1630 /// null.
1631 FunctionDecl *OperatorDelete;
1632
1633 /// \brief The allocated type-source information, as written in the source.
1634 TypeSourceInfo *AllocatedTypeInfo;
1635
1636 /// \brief If the allocated type was expressed as a parenthesized type-id,
1637 /// the source range covering the parenthesized type-id.
1638 SourceRange TypeIdParens;
1639
1640 /// \brief Range of the entire new expression.
1641 SourceRange Range;
1642
1643 /// \brief Source-range of a paren-delimited initializer.
1644 SourceRange DirectInitRange;
1645
1646 /// Was the usage ::new, i.e. is the global new to be used?
1647 bool GlobalNew : 1;
1648 /// Do we allocate an array? If so, the first SubExpr is the size expression.
1649 bool Array : 1;
1650 /// If this is an array allocation, does the usual deallocation
1651 /// function for the allocated type want to know the allocated size?
1652 bool UsualArrayDeleteWantsSize : 1;
1653 /// The number of placement new arguments.
1654 unsigned NumPlacementArgs : 13;
1655 /// What kind of initializer do we have? Could be none, parens, or braces.
1656 /// In storage, we distinguish between "none, and no initializer expr", and
1657 /// "none, but an implicit initializer expr".
1658 unsigned StoredInitializationStyle : 2;
1659
1660 friend class ASTStmtReader;
1661 friend class ASTStmtWriter;
1662 public:
1663 enum InitializationStyle {
1664 NoInit, ///< New-expression has no initializer as written.
1665 CallInit, ///< New-expression has a C++98 paren-delimited initializer.
1666 ListInit ///< New-expression has a C++11 list-initializer.
1667 };
1668
1669 CXXNewExpr(const ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
1670 FunctionDecl *operatorDelete, bool usualArrayDeleteWantsSize,
1671 ArrayRef<Expr*> placementArgs,
1672 SourceRange typeIdParens, Expr *arraySize,
1673 InitializationStyle initializationStyle, Expr *initializer,
1674 QualType ty, TypeSourceInfo *AllocatedTypeInfo,
1675 SourceRange Range, SourceRange directInitRange);
CXXNewExpr(EmptyShell Shell)1676 explicit CXXNewExpr(EmptyShell Shell)
1677 : Expr(CXXNewExprClass, Shell), SubExprs(nullptr) { }
1678
1679 void AllocateArgsArray(const ASTContext &C, bool isArray,
1680 unsigned numPlaceArgs, bool hasInitializer);
1681
getAllocatedType()1682 QualType getAllocatedType() const {
1683 assert(getType()->isPointerType());
1684 return getType()->getAs<PointerType>()->getPointeeType();
1685 }
1686
getAllocatedTypeSourceInfo()1687 TypeSourceInfo *getAllocatedTypeSourceInfo() const {
1688 return AllocatedTypeInfo;
1689 }
1690
1691 /// \brief True if the allocation result needs to be null-checked.
1692 ///
1693 /// C++11 [expr.new]p13:
1694 /// If the allocation function returns null, initialization shall
1695 /// not be done, the deallocation function shall not be called,
1696 /// and the value of the new-expression shall be null.
1697 ///
1698 /// C++ DR1748:
1699 /// If the allocation function is a reserved placement allocation
1700 /// function that returns null, the behavior is undefined.
1701 ///
1702 /// An allocation function is not allowed to return null unless it
1703 /// has a non-throwing exception-specification. The '03 rule is
1704 /// identical except that the definition of a non-throwing
1705 /// exception specification is just "is it throw()?".
1706 bool shouldNullCheckAllocation(const ASTContext &Ctx) const;
1707
getOperatorNew()1708 FunctionDecl *getOperatorNew() const { return OperatorNew; }
setOperatorNew(FunctionDecl * D)1709 void setOperatorNew(FunctionDecl *D) { OperatorNew = D; }
getOperatorDelete()1710 FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
setOperatorDelete(FunctionDecl * D)1711 void setOperatorDelete(FunctionDecl *D) { OperatorDelete = D; }
1712
isArray()1713 bool isArray() const { return Array; }
getArraySize()1714 Expr *getArraySize() {
1715 return Array ? cast<Expr>(SubExprs[0]) : nullptr;
1716 }
getArraySize()1717 const Expr *getArraySize() const {
1718 return Array ? cast<Expr>(SubExprs[0]) : nullptr;
1719 }
1720
getNumPlacementArgs()1721 unsigned getNumPlacementArgs() const { return NumPlacementArgs; }
getPlacementArgs()1722 Expr **getPlacementArgs() {
1723 return reinterpret_cast<Expr **>(SubExprs + Array + hasInitializer());
1724 }
1725
getPlacementArg(unsigned i)1726 Expr *getPlacementArg(unsigned i) {
1727 assert(i < NumPlacementArgs && "Index out of range");
1728 return getPlacementArgs()[i];
1729 }
getPlacementArg(unsigned i)1730 const Expr *getPlacementArg(unsigned i) const {
1731 assert(i < NumPlacementArgs && "Index out of range");
1732 return const_cast<CXXNewExpr*>(this)->getPlacementArg(i);
1733 }
1734
isParenTypeId()1735 bool isParenTypeId() const { return TypeIdParens.isValid(); }
getTypeIdParens()1736 SourceRange getTypeIdParens() const { return TypeIdParens; }
1737
isGlobalNew()1738 bool isGlobalNew() const { return GlobalNew; }
1739
1740 /// \brief Whether this new-expression has any initializer at all.
hasInitializer()1741 bool hasInitializer() const { return StoredInitializationStyle > 0; }
1742
1743 /// \brief The kind of initializer this new-expression has.
getInitializationStyle()1744 InitializationStyle getInitializationStyle() const {
1745 if (StoredInitializationStyle == 0)
1746 return NoInit;
1747 return static_cast<InitializationStyle>(StoredInitializationStyle-1);
1748 }
1749
1750 /// \brief The initializer of this new-expression.
getInitializer()1751 Expr *getInitializer() {
1752 return hasInitializer() ? cast<Expr>(SubExprs[Array]) : nullptr;
1753 }
getInitializer()1754 const Expr *getInitializer() const {
1755 return hasInitializer() ? cast<Expr>(SubExprs[Array]) : nullptr;
1756 }
1757
1758 /// \brief Returns the CXXConstructExpr from this new-expression, or null.
getConstructExpr()1759 const CXXConstructExpr* getConstructExpr() const {
1760 return dyn_cast_or_null<CXXConstructExpr>(getInitializer());
1761 }
1762
1763 /// Answers whether the usual array deallocation function for the
1764 /// allocated type expects the size of the allocation as a
1765 /// parameter.
doesUsualArrayDeleteWantSize()1766 bool doesUsualArrayDeleteWantSize() const {
1767 return UsualArrayDeleteWantsSize;
1768 }
1769
1770 typedef ExprIterator arg_iterator;
1771 typedef ConstExprIterator const_arg_iterator;
1772
placement_arg_begin()1773 arg_iterator placement_arg_begin() {
1774 return SubExprs + Array + hasInitializer();
1775 }
placement_arg_end()1776 arg_iterator placement_arg_end() {
1777 return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
1778 }
placement_arg_begin()1779 const_arg_iterator placement_arg_begin() const {
1780 return SubExprs + Array + hasInitializer();
1781 }
placement_arg_end()1782 const_arg_iterator placement_arg_end() const {
1783 return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
1784 }
1785
1786 typedef Stmt **raw_arg_iterator;
raw_arg_begin()1787 raw_arg_iterator raw_arg_begin() { return SubExprs; }
raw_arg_end()1788 raw_arg_iterator raw_arg_end() {
1789 return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
1790 }
raw_arg_begin()1791 const_arg_iterator raw_arg_begin() const { return SubExprs; }
raw_arg_end()1792 const_arg_iterator raw_arg_end() const {
1793 return SubExprs + Array + hasInitializer() + getNumPlacementArgs();
1794 }
1795
getStartLoc()1796 SourceLocation getStartLoc() const { return Range.getBegin(); }
getEndLoc()1797 SourceLocation getEndLoc() const { return Range.getEnd(); }
1798
getDirectInitRange()1799 SourceRange getDirectInitRange() const { return DirectInitRange; }
1800
getSourceRange()1801 SourceRange getSourceRange() const LLVM_READONLY {
1802 return Range;
1803 }
getLocStart()1804 SourceLocation getLocStart() const LLVM_READONLY { return getStartLoc(); }
getLocEnd()1805 SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); }
1806
classof(const Stmt * T)1807 static bool classof(const Stmt *T) {
1808 return T->getStmtClass() == CXXNewExprClass;
1809 }
1810
1811 // Iterators
children()1812 child_range children() {
1813 return child_range(raw_arg_begin(), raw_arg_end());
1814 }
1815 };
1816
1817 /// \brief Represents a \c delete expression for memory deallocation and
1818 /// destructor calls, e.g. "delete[] pArray".
1819 class CXXDeleteExpr : public Expr {
1820 /// Points to the operator delete overload that is used. Could be a member.
1821 FunctionDecl *OperatorDelete;
1822 /// The pointer expression to be deleted.
1823 Stmt *Argument;
1824 /// Location of the expression.
1825 SourceLocation Loc;
1826 /// Is this a forced global delete, i.e. "::delete"?
1827 bool GlobalDelete : 1;
1828 /// Is this the array form of delete, i.e. "delete[]"?
1829 bool ArrayForm : 1;
1830 /// ArrayFormAsWritten can be different from ArrayForm if 'delete' is applied
1831 /// to pointer-to-array type (ArrayFormAsWritten will be false while ArrayForm
1832 /// will be true).
1833 bool ArrayFormAsWritten : 1;
1834 /// Does the usual deallocation function for the element type require
1835 /// a size_t argument?
1836 bool UsualArrayDeleteWantsSize : 1;
1837 public:
CXXDeleteExpr(QualType ty,bool globalDelete,bool arrayForm,bool arrayFormAsWritten,bool usualArrayDeleteWantsSize,FunctionDecl * operatorDelete,Expr * arg,SourceLocation loc)1838 CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm,
1839 bool arrayFormAsWritten, bool usualArrayDeleteWantsSize,
1840 FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc)
1841 : Expr(CXXDeleteExprClass, ty, VK_RValue, OK_Ordinary, false, false,
1842 arg->isInstantiationDependent(),
1843 arg->containsUnexpandedParameterPack()),
1844 OperatorDelete(operatorDelete), Argument(arg), Loc(loc),
1845 GlobalDelete(globalDelete),
1846 ArrayForm(arrayForm), ArrayFormAsWritten(arrayFormAsWritten),
1847 UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize) { }
CXXDeleteExpr(EmptyShell Shell)1848 explicit CXXDeleteExpr(EmptyShell Shell)
1849 : Expr(CXXDeleteExprClass, Shell), OperatorDelete(nullptr),
1850 Argument(nullptr) {}
1851
isGlobalDelete()1852 bool isGlobalDelete() const { return GlobalDelete; }
isArrayForm()1853 bool isArrayForm() const { return ArrayForm; }
isArrayFormAsWritten()1854 bool isArrayFormAsWritten() const { return ArrayFormAsWritten; }
1855
1856 /// Answers whether the usual array deallocation function for the
1857 /// allocated type expects the size of the allocation as a
1858 /// parameter. This can be true even if the actual deallocation
1859 /// function that we're using doesn't want a size.
doesUsualArrayDeleteWantSize()1860 bool doesUsualArrayDeleteWantSize() const {
1861 return UsualArrayDeleteWantsSize;
1862 }
1863
getOperatorDelete()1864 FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
1865
getArgument()1866 Expr *getArgument() { return cast<Expr>(Argument); }
getArgument()1867 const Expr *getArgument() const { return cast<Expr>(Argument); }
1868
1869 /// \brief Retrieve the type being destroyed.
1870 ///
1871 /// If the type being destroyed is a dependent type which may or may not
1872 /// be a pointer, return an invalid type.
1873 QualType getDestroyedType() const;
1874
getLocStart()1875 SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()1876 SourceLocation getLocEnd() const LLVM_READONLY {return Argument->getLocEnd();}
1877
classof(const Stmt * T)1878 static bool classof(const Stmt *T) {
1879 return T->getStmtClass() == CXXDeleteExprClass;
1880 }
1881
1882 // Iterators
children()1883 child_range children() { return child_range(&Argument, &Argument+1); }
1884
1885 friend class ASTStmtReader;
1886 };
1887
1888 /// \brief Stores the type being destroyed by a pseudo-destructor expression.
1889 class PseudoDestructorTypeStorage {
1890 /// \brief Either the type source information or the name of the type, if
1891 /// it couldn't be resolved due to type-dependence.
1892 llvm::PointerUnion<TypeSourceInfo *, IdentifierInfo *> Type;
1893
1894 /// \brief The starting source location of the pseudo-destructor type.
1895 SourceLocation Location;
1896
1897 public:
PseudoDestructorTypeStorage()1898 PseudoDestructorTypeStorage() { }
1899
PseudoDestructorTypeStorage(IdentifierInfo * II,SourceLocation Loc)1900 PseudoDestructorTypeStorage(IdentifierInfo *II, SourceLocation Loc)
1901 : Type(II), Location(Loc) { }
1902
1903 PseudoDestructorTypeStorage(TypeSourceInfo *Info);
1904
getTypeSourceInfo()1905 TypeSourceInfo *getTypeSourceInfo() const {
1906 return Type.dyn_cast<TypeSourceInfo *>();
1907 }
1908
getIdentifier()1909 IdentifierInfo *getIdentifier() const {
1910 return Type.dyn_cast<IdentifierInfo *>();
1911 }
1912
getLocation()1913 SourceLocation getLocation() const { return Location; }
1914 };
1915
1916 /// \brief Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
1917 ///
1918 /// A pseudo-destructor is an expression that looks like a member access to a
1919 /// destructor of a scalar type, except that scalar types don't have
1920 /// destructors. For example:
1921 ///
1922 /// \code
1923 /// typedef int T;
1924 /// void f(int *p) {
1925 /// p->T::~T();
1926 /// }
1927 /// \endcode
1928 ///
1929 /// Pseudo-destructors typically occur when instantiating templates such as:
1930 ///
1931 /// \code
1932 /// template<typename T>
1933 /// void destroy(T* ptr) {
1934 /// ptr->T::~T();
1935 /// }
1936 /// \endcode
1937 ///
1938 /// for scalar types. A pseudo-destructor expression has no run-time semantics
1939 /// beyond evaluating the base expression.
1940 class CXXPseudoDestructorExpr : public Expr {
1941 /// \brief The base expression (that is being destroyed).
1942 Stmt *Base;
1943
1944 /// \brief Whether the operator was an arrow ('->'); otherwise, it was a
1945 /// period ('.').
1946 bool IsArrow : 1;
1947
1948 /// \brief The location of the '.' or '->' operator.
1949 SourceLocation OperatorLoc;
1950
1951 /// \brief The nested-name-specifier that follows the operator, if present.
1952 NestedNameSpecifierLoc QualifierLoc;
1953
1954 /// \brief The type that precedes the '::' in a qualified pseudo-destructor
1955 /// expression.
1956 TypeSourceInfo *ScopeType;
1957
1958 /// \brief The location of the '::' in a qualified pseudo-destructor
1959 /// expression.
1960 SourceLocation ColonColonLoc;
1961
1962 /// \brief The location of the '~'.
1963 SourceLocation TildeLoc;
1964
1965 /// \brief The type being destroyed, or its name if we were unable to
1966 /// resolve the name.
1967 PseudoDestructorTypeStorage DestroyedType;
1968
1969 friend class ASTStmtReader;
1970
1971 public:
1972 CXXPseudoDestructorExpr(const ASTContext &Context,
1973 Expr *Base, bool isArrow, SourceLocation OperatorLoc,
1974 NestedNameSpecifierLoc QualifierLoc,
1975 TypeSourceInfo *ScopeType,
1976 SourceLocation ColonColonLoc,
1977 SourceLocation TildeLoc,
1978 PseudoDestructorTypeStorage DestroyedType);
1979
CXXPseudoDestructorExpr(EmptyShell Shell)1980 explicit CXXPseudoDestructorExpr(EmptyShell Shell)
1981 : Expr(CXXPseudoDestructorExprClass, Shell),
1982 Base(nullptr), IsArrow(false), QualifierLoc(), ScopeType(nullptr) { }
1983
getBase()1984 Expr *getBase() const { return cast<Expr>(Base); }
1985
1986 /// \brief Determines whether this member expression actually had
1987 /// a C++ nested-name-specifier prior to the name of the member, e.g.,
1988 /// x->Base::foo.
hasQualifier()1989 bool hasQualifier() const { return QualifierLoc.hasQualifier(); }
1990
1991 /// \brief Retrieves the nested-name-specifier that qualifies the type name,
1992 /// with source-location information.
getQualifierLoc()1993 NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
1994
1995 /// \brief If the member name was qualified, retrieves the
1996 /// nested-name-specifier that precedes the member name. Otherwise, returns
1997 /// null.
getQualifier()1998 NestedNameSpecifier *getQualifier() const {
1999 return QualifierLoc.getNestedNameSpecifier();
2000 }
2001
2002 /// \brief Determine whether this pseudo-destructor expression was written
2003 /// using an '->' (otherwise, it used a '.').
isArrow()2004 bool isArrow() const { return IsArrow; }
2005
2006 /// \brief Retrieve the location of the '.' or '->' operator.
getOperatorLoc()2007 SourceLocation getOperatorLoc() const { return OperatorLoc; }
2008
2009 /// \brief Retrieve the scope type in a qualified pseudo-destructor
2010 /// expression.
2011 ///
2012 /// Pseudo-destructor expressions can have extra qualification within them
2013 /// that is not part of the nested-name-specifier, e.g., \c p->T::~T().
2014 /// Here, if the object type of the expression is (or may be) a scalar type,
2015 /// \p T may also be a scalar type and, therefore, cannot be part of a
2016 /// nested-name-specifier. It is stored as the "scope type" of the pseudo-
2017 /// destructor expression.
getScopeTypeInfo()2018 TypeSourceInfo *getScopeTypeInfo() const { return ScopeType; }
2019
2020 /// \brief Retrieve the location of the '::' in a qualified pseudo-destructor
2021 /// expression.
getColonColonLoc()2022 SourceLocation getColonColonLoc() const { return ColonColonLoc; }
2023
2024 /// \brief Retrieve the location of the '~'.
getTildeLoc()2025 SourceLocation getTildeLoc() const { return TildeLoc; }
2026
2027 /// \brief Retrieve the source location information for the type
2028 /// being destroyed.
2029 ///
2030 /// This type-source information is available for non-dependent
2031 /// pseudo-destructor expressions and some dependent pseudo-destructor
2032 /// expressions. Returns null if we only have the identifier for a
2033 /// dependent pseudo-destructor expression.
getDestroyedTypeInfo()2034 TypeSourceInfo *getDestroyedTypeInfo() const {
2035 return DestroyedType.getTypeSourceInfo();
2036 }
2037
2038 /// \brief In a dependent pseudo-destructor expression for which we do not
2039 /// have full type information on the destroyed type, provides the name
2040 /// of the destroyed type.
getDestroyedTypeIdentifier()2041 IdentifierInfo *getDestroyedTypeIdentifier() const {
2042 return DestroyedType.getIdentifier();
2043 }
2044
2045 /// \brief Retrieve the type being destroyed.
2046 QualType getDestroyedType() const;
2047
2048 /// \brief Retrieve the starting location of the type being destroyed.
getDestroyedTypeLoc()2049 SourceLocation getDestroyedTypeLoc() const {
2050 return DestroyedType.getLocation();
2051 }
2052
2053 /// \brief Set the name of destroyed type for a dependent pseudo-destructor
2054 /// expression.
setDestroyedType(IdentifierInfo * II,SourceLocation Loc)2055 void setDestroyedType(IdentifierInfo *II, SourceLocation Loc) {
2056 DestroyedType = PseudoDestructorTypeStorage(II, Loc);
2057 }
2058
2059 /// \brief Set the destroyed type.
setDestroyedType(TypeSourceInfo * Info)2060 void setDestroyedType(TypeSourceInfo *Info) {
2061 DestroyedType = PseudoDestructorTypeStorage(Info);
2062 }
2063
getLocStart()2064 SourceLocation getLocStart() const LLVM_READONLY {return Base->getLocStart();}
2065 SourceLocation getLocEnd() const LLVM_READONLY;
2066
classof(const Stmt * T)2067 static bool classof(const Stmt *T) {
2068 return T->getStmtClass() == CXXPseudoDestructorExprClass;
2069 }
2070
2071 // Iterators
children()2072 child_range children() { return child_range(&Base, &Base + 1); }
2073 };
2074
2075 /// \brief A type trait used in the implementation of various C++11 and
2076 /// Library TR1 trait templates.
2077 ///
2078 /// \code
2079 /// __is_pod(int) == true
2080 /// __is_enum(std::string) == false
2081 /// __is_trivially_constructible(vector<int>, int*, int*)
2082 /// \endcode
2083 class TypeTraitExpr : public Expr {
2084 /// \brief The location of the type trait keyword.
2085 SourceLocation Loc;
2086
2087 /// \brief The location of the closing parenthesis.
2088 SourceLocation RParenLoc;
2089
2090 // Note: The TypeSourceInfos for the arguments are allocated after the
2091 // TypeTraitExpr.
2092
2093 TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind,
2094 ArrayRef<TypeSourceInfo *> Args,
2095 SourceLocation RParenLoc,
2096 bool Value);
2097
TypeTraitExpr(EmptyShell Empty)2098 TypeTraitExpr(EmptyShell Empty) : Expr(TypeTraitExprClass, Empty) { }
2099
2100 /// \brief Retrieve the argument types.
getTypeSourceInfos()2101 TypeSourceInfo **getTypeSourceInfos() {
2102 return reinterpret_cast<TypeSourceInfo **>(this+1);
2103 }
2104
2105 /// \brief Retrieve the argument types.
getTypeSourceInfos()2106 TypeSourceInfo * const *getTypeSourceInfos() const {
2107 return reinterpret_cast<TypeSourceInfo * const*>(this+1);
2108 }
2109
2110 public:
2111 /// \brief Create a new type trait expression.
2112 static TypeTraitExpr *Create(const ASTContext &C, QualType T,
2113 SourceLocation Loc, TypeTrait Kind,
2114 ArrayRef<TypeSourceInfo *> Args,
2115 SourceLocation RParenLoc,
2116 bool Value);
2117
2118 static TypeTraitExpr *CreateDeserialized(const ASTContext &C,
2119 unsigned NumArgs);
2120
2121 /// \brief Determine which type trait this expression uses.
getTrait()2122 TypeTrait getTrait() const {
2123 return static_cast<TypeTrait>(TypeTraitExprBits.Kind);
2124 }
2125
getValue()2126 bool getValue() const {
2127 assert(!isValueDependent());
2128 return TypeTraitExprBits.Value;
2129 }
2130
2131 /// \brief Determine the number of arguments to this type trait.
getNumArgs()2132 unsigned getNumArgs() const { return TypeTraitExprBits.NumArgs; }
2133
2134 /// \brief Retrieve the Ith argument.
getArg(unsigned I)2135 TypeSourceInfo *getArg(unsigned I) const {
2136 assert(I < getNumArgs() && "Argument out-of-range");
2137 return getArgs()[I];
2138 }
2139
2140 /// \brief Retrieve the argument types.
getArgs()2141 ArrayRef<TypeSourceInfo *> getArgs() const {
2142 return llvm::makeArrayRef(getTypeSourceInfos(), getNumArgs());
2143 }
2144
2145 typedef TypeSourceInfo **arg_iterator;
arg_begin()2146 arg_iterator arg_begin() {
2147 return getTypeSourceInfos();
2148 }
arg_end()2149 arg_iterator arg_end() {
2150 return getTypeSourceInfos() + getNumArgs();
2151 }
2152
2153 typedef TypeSourceInfo const * const *arg_const_iterator;
arg_begin()2154 arg_const_iterator arg_begin() const { return getTypeSourceInfos(); }
arg_end()2155 arg_const_iterator arg_end() const {
2156 return getTypeSourceInfos() + getNumArgs();
2157 }
2158
getLocStart()2159 SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()2160 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
2161
classof(const Stmt * T)2162 static bool classof(const Stmt *T) {
2163 return T->getStmtClass() == TypeTraitExprClass;
2164 }
2165
2166 // Iterators
children()2167 child_range children() { return child_range(); }
2168
2169 friend class ASTStmtReader;
2170 friend class ASTStmtWriter;
2171
2172 };
2173
2174 /// \brief An Embarcadero array type trait, as used in the implementation of
2175 /// __array_rank and __array_extent.
2176 ///
2177 /// Example:
2178 /// \code
2179 /// __array_rank(int[10][20]) == 2
2180 /// __array_extent(int, 1) == 20
2181 /// \endcode
2182 class ArrayTypeTraitExpr : public Expr {
2183 virtual void anchor();
2184
2185 /// \brief The trait. An ArrayTypeTrait enum in MSVC compat unsigned.
2186 unsigned ATT : 2;
2187
2188 /// \brief The value of the type trait. Unspecified if dependent.
2189 uint64_t Value;
2190
2191 /// \brief The array dimension being queried, or -1 if not used.
2192 Expr *Dimension;
2193
2194 /// \brief The location of the type trait keyword.
2195 SourceLocation Loc;
2196
2197 /// \brief The location of the closing paren.
2198 SourceLocation RParen;
2199
2200 /// \brief The type being queried.
2201 TypeSourceInfo *QueriedType;
2202
2203 public:
ArrayTypeTraitExpr(SourceLocation loc,ArrayTypeTrait att,TypeSourceInfo * queried,uint64_t value,Expr * dimension,SourceLocation rparen,QualType ty)2204 ArrayTypeTraitExpr(SourceLocation loc, ArrayTypeTrait att,
2205 TypeSourceInfo *queried, uint64_t value,
2206 Expr *dimension, SourceLocation rparen, QualType ty)
2207 : Expr(ArrayTypeTraitExprClass, ty, VK_RValue, OK_Ordinary,
2208 false, queried->getType()->isDependentType(),
2209 (queried->getType()->isInstantiationDependentType() ||
2210 (dimension && dimension->isInstantiationDependent())),
2211 queried->getType()->containsUnexpandedParameterPack()),
2212 ATT(att), Value(value), Dimension(dimension),
2213 Loc(loc), RParen(rparen), QueriedType(queried) { }
2214
2215
ArrayTypeTraitExpr(EmptyShell Empty)2216 explicit ArrayTypeTraitExpr(EmptyShell Empty)
2217 : Expr(ArrayTypeTraitExprClass, Empty), ATT(0), Value(false),
2218 QueriedType() { }
2219
~ArrayTypeTraitExpr()2220 virtual ~ArrayTypeTraitExpr() { }
2221
getLocStart()2222 SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()2223 SourceLocation getLocEnd() const LLVM_READONLY { return RParen; }
2224
getTrait()2225 ArrayTypeTrait getTrait() const { return static_cast<ArrayTypeTrait>(ATT); }
2226
getQueriedType()2227 QualType getQueriedType() const { return QueriedType->getType(); }
2228
getQueriedTypeSourceInfo()2229 TypeSourceInfo *getQueriedTypeSourceInfo() const { return QueriedType; }
2230
getValue()2231 uint64_t getValue() const { assert(!isTypeDependent()); return Value; }
2232
getDimensionExpression()2233 Expr *getDimensionExpression() const { return Dimension; }
2234
classof(const Stmt * T)2235 static bool classof(const Stmt *T) {
2236 return T->getStmtClass() == ArrayTypeTraitExprClass;
2237 }
2238
2239 // Iterators
children()2240 child_range children() { return child_range(); }
2241
2242 friend class ASTStmtReader;
2243 };
2244
2245 /// \brief An expression trait intrinsic.
2246 ///
2247 /// Example:
2248 /// \code
2249 /// __is_lvalue_expr(std::cout) == true
2250 /// __is_lvalue_expr(1) == false
2251 /// \endcode
2252 class ExpressionTraitExpr : public Expr {
2253 /// \brief The trait. A ExpressionTrait enum in MSVC compatible unsigned.
2254 unsigned ET : 31;
2255 /// \brief The value of the type trait. Unspecified if dependent.
2256 bool Value : 1;
2257
2258 /// \brief The location of the type trait keyword.
2259 SourceLocation Loc;
2260
2261 /// \brief The location of the closing paren.
2262 SourceLocation RParen;
2263
2264 /// \brief The expression being queried.
2265 Expr* QueriedExpression;
2266 public:
ExpressionTraitExpr(SourceLocation loc,ExpressionTrait et,Expr * queried,bool value,SourceLocation rparen,QualType resultType)2267 ExpressionTraitExpr(SourceLocation loc, ExpressionTrait et,
2268 Expr *queried, bool value,
2269 SourceLocation rparen, QualType resultType)
2270 : Expr(ExpressionTraitExprClass, resultType, VK_RValue, OK_Ordinary,
2271 false, // Not type-dependent
2272 // Value-dependent if the argument is type-dependent.
2273 queried->isTypeDependent(),
2274 queried->isInstantiationDependent(),
2275 queried->containsUnexpandedParameterPack()),
2276 ET(et), Value(value), Loc(loc), RParen(rparen),
2277 QueriedExpression(queried) { }
2278
ExpressionTraitExpr(EmptyShell Empty)2279 explicit ExpressionTraitExpr(EmptyShell Empty)
2280 : Expr(ExpressionTraitExprClass, Empty), ET(0), Value(false),
2281 QueriedExpression() { }
2282
getLocStart()2283 SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
getLocEnd()2284 SourceLocation getLocEnd() const LLVM_READONLY { return RParen; }
2285
getTrait()2286 ExpressionTrait getTrait() const { return static_cast<ExpressionTrait>(ET); }
2287
getQueriedExpression()2288 Expr *getQueriedExpression() const { return QueriedExpression; }
2289
getValue()2290 bool getValue() const { return Value; }
2291
classof(const Stmt * T)2292 static bool classof(const Stmt *T) {
2293 return T->getStmtClass() == ExpressionTraitExprClass;
2294 }
2295
2296 // Iterators
children()2297 child_range children() { return child_range(); }
2298
2299 friend class ASTStmtReader;
2300 };
2301
2302
2303 /// \brief A reference to an overloaded function set, either an
2304 /// \c UnresolvedLookupExpr or an \c UnresolvedMemberExpr.
2305 class OverloadExpr : public Expr {
2306 /// \brief The common name of these declarations.
2307 DeclarationNameInfo NameInfo;
2308
2309 /// \brief The nested-name-specifier that qualifies the name, if any.
2310 NestedNameSpecifierLoc QualifierLoc;
2311
2312 /// The results. These are undesugared, which is to say, they may
2313 /// include UsingShadowDecls. Access is relative to the naming
2314 /// class.
2315 // FIXME: Allocate this data after the OverloadExpr subclass.
2316 DeclAccessPair *Results;
2317 unsigned NumResults;
2318
2319 protected:
2320 /// \brief Whether the name includes info for explicit template
2321 /// keyword and arguments.
2322 bool HasTemplateKWAndArgsInfo;
2323
2324 /// \brief Return the optional template keyword and arguments info.
2325 ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo(); // defined far below.
2326
2327 /// \brief Return the optional template keyword and arguments info.
getTemplateKWAndArgsInfo()2328 const ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() const {
2329 return const_cast<OverloadExpr*>(this)->getTemplateKWAndArgsInfo();
2330 }
2331
2332 OverloadExpr(StmtClass K, const ASTContext &C,
2333 NestedNameSpecifierLoc QualifierLoc,
2334 SourceLocation TemplateKWLoc,
2335 const DeclarationNameInfo &NameInfo,
2336 const TemplateArgumentListInfo *TemplateArgs,
2337 UnresolvedSetIterator Begin, UnresolvedSetIterator End,
2338 bool KnownDependent,
2339 bool KnownInstantiationDependent,
2340 bool KnownContainsUnexpandedParameterPack);
2341
OverloadExpr(StmtClass K,EmptyShell Empty)2342 OverloadExpr(StmtClass K, EmptyShell Empty)
2343 : Expr(K, Empty), QualifierLoc(), Results(nullptr), NumResults(0),
2344 HasTemplateKWAndArgsInfo(false) { }
2345
2346 void initializeResults(const ASTContext &C,
2347 UnresolvedSetIterator Begin,
2348 UnresolvedSetIterator End);
2349
2350 public:
2351 struct FindResult {
2352 OverloadExpr *Expression;
2353 bool IsAddressOfOperand;
2354 bool HasFormOfMemberPointer;
2355 };
2356
2357 /// \brief Finds the overloaded expression in the given expression \p E of
2358 /// OverloadTy.
2359 ///
2360 /// \return the expression (which must be there) and true if it has
2361 /// the particular form of a member pointer expression
find(Expr * E)2362 static FindResult find(Expr *E) {
2363 assert(E->getType()->isSpecificBuiltinType(BuiltinType::Overload));
2364
2365 FindResult Result;
2366
2367 E = E->IgnoreParens();
2368 if (isa<UnaryOperator>(E)) {
2369 assert(cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf);
2370 E = cast<UnaryOperator>(E)->getSubExpr();
2371 OverloadExpr *Ovl = cast<OverloadExpr>(E->IgnoreParens());
2372
2373 Result.HasFormOfMemberPointer = (E == Ovl && Ovl->getQualifier());
2374 Result.IsAddressOfOperand = true;
2375 Result.Expression = Ovl;
2376 } else {
2377 Result.HasFormOfMemberPointer = false;
2378 Result.IsAddressOfOperand = false;
2379 Result.Expression = cast<OverloadExpr>(E);
2380 }
2381
2382 return Result;
2383 }
2384
2385 /// \brief Gets the naming class of this lookup, if any.
2386 CXXRecordDecl *getNamingClass() const;
2387
2388 typedef UnresolvedSetImpl::iterator decls_iterator;
decls_begin()2389 decls_iterator decls_begin() const { return UnresolvedSetIterator(Results); }
decls_end()2390 decls_iterator decls_end() const {
2391 return UnresolvedSetIterator(Results + NumResults);
2392 }
decls()2393 llvm::iterator_range<decls_iterator> decls() const {
2394 return llvm::iterator_range<decls_iterator>(decls_begin(), decls_end());
2395 }
2396
2397 /// \brief Gets the number of declarations in the unresolved set.
getNumDecls()2398 unsigned getNumDecls() const { return NumResults; }
2399
2400 /// \brief Gets the full name info.
getNameInfo()2401 const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
2402
2403 /// \brief Gets the name looked up.
getName()2404 DeclarationName getName() const { return NameInfo.getName(); }
2405
2406 /// \brief Gets the location of the name.
getNameLoc()2407 SourceLocation getNameLoc() const { return NameInfo.getLoc(); }
2408
2409 /// \brief Fetches the nested-name qualifier, if one was given.
getQualifier()2410 NestedNameSpecifier *getQualifier() const {
2411 return QualifierLoc.getNestedNameSpecifier();
2412 }
2413
2414 /// \brief Fetches the nested-name qualifier with source-location
2415 /// information, if one was given.
getQualifierLoc()2416 NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
2417
2418 /// \brief Retrieve the location of the template keyword preceding
2419 /// this name, if any.
getTemplateKeywordLoc()2420 SourceLocation getTemplateKeywordLoc() const {
2421 if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2422 return getTemplateKWAndArgsInfo()->getTemplateKeywordLoc();
2423 }
2424
2425 /// \brief Retrieve the location of the left angle bracket starting the
2426 /// explicit template argument list following the name, if any.
getLAngleLoc()2427 SourceLocation getLAngleLoc() const {
2428 if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2429 return getTemplateKWAndArgsInfo()->LAngleLoc;
2430 }
2431
2432 /// \brief Retrieve the location of the right angle bracket ending the
2433 /// explicit template argument list following the name, if any.
getRAngleLoc()2434 SourceLocation getRAngleLoc() const {
2435 if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2436 return getTemplateKWAndArgsInfo()->RAngleLoc;
2437 }
2438
2439 /// \brief Determines whether the name was preceded by the template keyword.
hasTemplateKeyword()2440 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
2441
2442 /// \brief Determines whether this expression had explicit template arguments.
hasExplicitTemplateArgs()2443 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
2444
2445 // Note that, inconsistently with the explicit-template-argument AST
2446 // nodes, users are *forbidden* from calling these methods on objects
2447 // without explicit template arguments.
2448
getExplicitTemplateArgs()2449 ASTTemplateArgumentListInfo &getExplicitTemplateArgs() {
2450 assert(hasExplicitTemplateArgs());
2451 return *getTemplateKWAndArgsInfo();
2452 }
2453
getExplicitTemplateArgs()2454 const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
2455 return const_cast<OverloadExpr*>(this)->getExplicitTemplateArgs();
2456 }
2457
getTemplateArgs()2458 TemplateArgumentLoc const *getTemplateArgs() const {
2459 return getExplicitTemplateArgs().getTemplateArgs();
2460 }
2461
getNumTemplateArgs()2462 unsigned getNumTemplateArgs() const {
2463 return getExplicitTemplateArgs().NumTemplateArgs;
2464 }
2465
2466 /// \brief Copies the template arguments into the given structure.
copyTemplateArgumentsInto(TemplateArgumentListInfo & List)2467 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
2468 getExplicitTemplateArgs().copyInto(List);
2469 }
2470
2471 /// \brief Retrieves the optional explicit template arguments.
2472 ///
2473 /// This points to the same data as getExplicitTemplateArgs(), but
2474 /// returns null if there are no explicit template arguments.
getOptionalExplicitTemplateArgs()2475 const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() const {
2476 if (!hasExplicitTemplateArgs()) return nullptr;
2477 return &getExplicitTemplateArgs();
2478 }
2479
classof(const Stmt * T)2480 static bool classof(const Stmt *T) {
2481 return T->getStmtClass() == UnresolvedLookupExprClass ||
2482 T->getStmtClass() == UnresolvedMemberExprClass;
2483 }
2484
2485 friend class ASTStmtReader;
2486 friend class ASTStmtWriter;
2487 };
2488
2489 /// \brief A reference to a name which we were able to look up during
2490 /// parsing but could not resolve to a specific declaration.
2491 ///
2492 /// This arises in several ways:
2493 /// * we might be waiting for argument-dependent lookup;
2494 /// * the name might resolve to an overloaded function;
2495 /// and eventually:
2496 /// * the lookup might have included a function template.
2497 ///
2498 /// These never include UnresolvedUsingValueDecls, which are always class
2499 /// members and therefore appear only in UnresolvedMemberLookupExprs.
2500 class UnresolvedLookupExpr : public OverloadExpr {
2501 /// True if these lookup results should be extended by
2502 /// argument-dependent lookup if this is the operand of a function
2503 /// call.
2504 bool RequiresADL;
2505
2506 /// True if these lookup results are overloaded. This is pretty
2507 /// trivially rederivable if we urgently need to kill this field.
2508 bool Overloaded;
2509
2510 /// The naming class (C++ [class.access.base]p5) of the lookup, if
2511 /// any. This can generally be recalculated from the context chain,
2512 /// but that can be fairly expensive for unqualified lookups. If we
2513 /// want to improve memory use here, this could go in a union
2514 /// against the qualified-lookup bits.
2515 CXXRecordDecl *NamingClass;
2516
UnresolvedLookupExpr(const ASTContext & C,CXXRecordDecl * NamingClass,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,bool RequiresADL,bool Overloaded,const TemplateArgumentListInfo * TemplateArgs,UnresolvedSetIterator Begin,UnresolvedSetIterator End)2517 UnresolvedLookupExpr(const ASTContext &C,
2518 CXXRecordDecl *NamingClass,
2519 NestedNameSpecifierLoc QualifierLoc,
2520 SourceLocation TemplateKWLoc,
2521 const DeclarationNameInfo &NameInfo,
2522 bool RequiresADL, bool Overloaded,
2523 const TemplateArgumentListInfo *TemplateArgs,
2524 UnresolvedSetIterator Begin, UnresolvedSetIterator End)
2525 : OverloadExpr(UnresolvedLookupExprClass, C, QualifierLoc, TemplateKWLoc,
2526 NameInfo, TemplateArgs, Begin, End, false, false, false),
2527 RequiresADL(RequiresADL),
2528 Overloaded(Overloaded), NamingClass(NamingClass)
2529 {}
2530
UnresolvedLookupExpr(EmptyShell Empty)2531 UnresolvedLookupExpr(EmptyShell Empty)
2532 : OverloadExpr(UnresolvedLookupExprClass, Empty),
2533 RequiresADL(false), Overloaded(false), NamingClass(nullptr)
2534 {}
2535
2536 friend class ASTStmtReader;
2537
2538 public:
Create(const ASTContext & C,CXXRecordDecl * NamingClass,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,bool ADL,bool Overloaded,UnresolvedSetIterator Begin,UnresolvedSetIterator End)2539 static UnresolvedLookupExpr *Create(const ASTContext &C,
2540 CXXRecordDecl *NamingClass,
2541 NestedNameSpecifierLoc QualifierLoc,
2542 const DeclarationNameInfo &NameInfo,
2543 bool ADL, bool Overloaded,
2544 UnresolvedSetIterator Begin,
2545 UnresolvedSetIterator End) {
2546 return new(C) UnresolvedLookupExpr(C, NamingClass, QualifierLoc,
2547 SourceLocation(), NameInfo,
2548 ADL, Overloaded, nullptr, Begin, End);
2549 }
2550
2551 static UnresolvedLookupExpr *Create(const ASTContext &C,
2552 CXXRecordDecl *NamingClass,
2553 NestedNameSpecifierLoc QualifierLoc,
2554 SourceLocation TemplateKWLoc,
2555 const DeclarationNameInfo &NameInfo,
2556 bool ADL,
2557 const TemplateArgumentListInfo *Args,
2558 UnresolvedSetIterator Begin,
2559 UnresolvedSetIterator End);
2560
2561 static UnresolvedLookupExpr *CreateEmpty(const ASTContext &C,
2562 bool HasTemplateKWAndArgsInfo,
2563 unsigned NumTemplateArgs);
2564
2565 /// True if this declaration should be extended by
2566 /// argument-dependent lookup.
requiresADL()2567 bool requiresADL() const { return RequiresADL; }
2568
2569 /// True if this lookup is overloaded.
isOverloaded()2570 bool isOverloaded() const { return Overloaded; }
2571
2572 /// Gets the 'naming class' (in the sense of C++0x
2573 /// [class.access.base]p5) of the lookup. This is the scope
2574 /// that was looked in to find these results.
getNamingClass()2575 CXXRecordDecl *getNamingClass() const { return NamingClass; }
2576
getLocStart()2577 SourceLocation getLocStart() const LLVM_READONLY {
2578 if (NestedNameSpecifierLoc l = getQualifierLoc())
2579 return l.getBeginLoc();
2580 return getNameInfo().getLocStart();
2581 }
getLocEnd()2582 SourceLocation getLocEnd() const LLVM_READONLY {
2583 if (hasExplicitTemplateArgs())
2584 return getRAngleLoc();
2585 return getNameInfo().getLocEnd();
2586 }
2587
children()2588 child_range children() { return child_range(); }
2589
classof(const Stmt * T)2590 static bool classof(const Stmt *T) {
2591 return T->getStmtClass() == UnresolvedLookupExprClass;
2592 }
2593 };
2594
2595 /// \brief A qualified reference to a name whose declaration cannot
2596 /// yet be resolved.
2597 ///
2598 /// DependentScopeDeclRefExpr is similar to DeclRefExpr in that
2599 /// it expresses a reference to a declaration such as
2600 /// X<T>::value. The difference, however, is that an
2601 /// DependentScopeDeclRefExpr node is used only within C++ templates when
2602 /// the qualification (e.g., X<T>::) refers to a dependent type. In
2603 /// this case, X<T>::value cannot resolve to a declaration because the
2604 /// declaration will differ from one instantiation of X<T> to the
2605 /// next. Therefore, DependentScopeDeclRefExpr keeps track of the
2606 /// qualifier (X<T>::) and the name of the entity being referenced
2607 /// ("value"). Such expressions will instantiate to a DeclRefExpr once the
2608 /// declaration can be found.
2609 class DependentScopeDeclRefExpr : public Expr {
2610 /// \brief The nested-name-specifier that qualifies this unresolved
2611 /// declaration name.
2612 NestedNameSpecifierLoc QualifierLoc;
2613
2614 /// \brief The name of the entity we will be referencing.
2615 DeclarationNameInfo NameInfo;
2616
2617 /// \brief Whether the name includes info for explicit template
2618 /// keyword and arguments.
2619 bool HasTemplateKWAndArgsInfo;
2620
2621 /// \brief Return the optional template keyword and arguments info.
getTemplateKWAndArgsInfo()2622 ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() {
2623 if (!HasTemplateKWAndArgsInfo) return nullptr;
2624 return reinterpret_cast<ASTTemplateKWAndArgsInfo*>(this + 1);
2625 }
2626 /// \brief Return the optional template keyword and arguments info.
getTemplateKWAndArgsInfo()2627 const ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() const {
2628 return const_cast<DependentScopeDeclRefExpr*>(this)
2629 ->getTemplateKWAndArgsInfo();
2630 }
2631
2632 DependentScopeDeclRefExpr(QualType T,
2633 NestedNameSpecifierLoc QualifierLoc,
2634 SourceLocation TemplateKWLoc,
2635 const DeclarationNameInfo &NameInfo,
2636 const TemplateArgumentListInfo *Args);
2637
2638 public:
2639 static DependentScopeDeclRefExpr *Create(const ASTContext &C,
2640 NestedNameSpecifierLoc QualifierLoc,
2641 SourceLocation TemplateKWLoc,
2642 const DeclarationNameInfo &NameInfo,
2643 const TemplateArgumentListInfo *TemplateArgs);
2644
2645 static DependentScopeDeclRefExpr *CreateEmpty(const ASTContext &C,
2646 bool HasTemplateKWAndArgsInfo,
2647 unsigned NumTemplateArgs);
2648
2649 /// \brief Retrieve the name that this expression refers to.
getNameInfo()2650 const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
2651
2652 /// \brief Retrieve the name that this expression refers to.
getDeclName()2653 DeclarationName getDeclName() const { return NameInfo.getName(); }
2654
2655 /// \brief Retrieve the location of the name within the expression.
2656 ///
2657 /// For example, in "X<T>::value" this is the location of "value".
getLocation()2658 SourceLocation getLocation() const { return NameInfo.getLoc(); }
2659
2660 /// \brief Retrieve the nested-name-specifier that qualifies the
2661 /// name, with source location information.
getQualifierLoc()2662 NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
2663
2664 /// \brief Retrieve the nested-name-specifier that qualifies this
2665 /// declaration.
getQualifier()2666 NestedNameSpecifier *getQualifier() const {
2667 return QualifierLoc.getNestedNameSpecifier();
2668 }
2669
2670 /// \brief Retrieve the location of the template keyword preceding
2671 /// this name, if any.
getTemplateKeywordLoc()2672 SourceLocation getTemplateKeywordLoc() const {
2673 if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2674 return getTemplateKWAndArgsInfo()->getTemplateKeywordLoc();
2675 }
2676
2677 /// \brief Retrieve the location of the left angle bracket starting the
2678 /// explicit template argument list following the name, if any.
getLAngleLoc()2679 SourceLocation getLAngleLoc() const {
2680 if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2681 return getTemplateKWAndArgsInfo()->LAngleLoc;
2682 }
2683
2684 /// \brief Retrieve the location of the right angle bracket ending the
2685 /// explicit template argument list following the name, if any.
getRAngleLoc()2686 SourceLocation getRAngleLoc() const {
2687 if (!HasTemplateKWAndArgsInfo) return SourceLocation();
2688 return getTemplateKWAndArgsInfo()->RAngleLoc;
2689 }
2690
2691 /// Determines whether the name was preceded by the template keyword.
hasTemplateKeyword()2692 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
2693
2694 /// Determines whether this lookup had explicit template arguments.
hasExplicitTemplateArgs()2695 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
2696
2697 // Note that, inconsistently with the explicit-template-argument AST
2698 // nodes, users are *forbidden* from calling these methods on objects
2699 // without explicit template arguments.
2700
getExplicitTemplateArgs()2701 ASTTemplateArgumentListInfo &getExplicitTemplateArgs() {
2702 assert(hasExplicitTemplateArgs());
2703 return *reinterpret_cast<ASTTemplateArgumentListInfo*>(this + 1);
2704 }
2705
2706 /// Gets a reference to the explicit template argument list.
getExplicitTemplateArgs()2707 const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
2708 assert(hasExplicitTemplateArgs());
2709 return *reinterpret_cast<const ASTTemplateArgumentListInfo*>(this + 1);
2710 }
2711
2712 /// \brief Retrieves the optional explicit template arguments.
2713 ///
2714 /// This points to the same data as getExplicitTemplateArgs(), but
2715 /// returns null if there are no explicit template arguments.
getOptionalExplicitTemplateArgs()2716 const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() const {
2717 if (!hasExplicitTemplateArgs()) return nullptr;
2718 return &getExplicitTemplateArgs();
2719 }
2720
2721 /// \brief Copies the template arguments (if present) into the given
2722 /// structure.
copyTemplateArgumentsInto(TemplateArgumentListInfo & List)2723 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
2724 getExplicitTemplateArgs().copyInto(List);
2725 }
2726
getTemplateArgs()2727 TemplateArgumentLoc const *getTemplateArgs() const {
2728 return getExplicitTemplateArgs().getTemplateArgs();
2729 }
2730
getNumTemplateArgs()2731 unsigned getNumTemplateArgs() const {
2732 return getExplicitTemplateArgs().NumTemplateArgs;
2733 }
2734
2735 /// Note: getLocStart() is the start of the whole DependentScopeDeclRefExpr,
2736 /// and differs from getLocation().getStart().
getLocStart()2737 SourceLocation getLocStart() const LLVM_READONLY {
2738 return QualifierLoc.getBeginLoc();
2739 }
getLocEnd()2740 SourceLocation getLocEnd() const LLVM_READONLY {
2741 if (hasExplicitTemplateArgs())
2742 return getRAngleLoc();
2743 return getLocation();
2744 }
2745
classof(const Stmt * T)2746 static bool classof(const Stmt *T) {
2747 return T->getStmtClass() == DependentScopeDeclRefExprClass;
2748 }
2749
children()2750 child_range children() { return child_range(); }
2751
2752 friend class ASTStmtReader;
2753 friend class ASTStmtWriter;
2754 };
2755
2756 /// Represents an expression -- generally a full-expression -- that
2757 /// introduces cleanups to be run at the end of the sub-expression's
2758 /// evaluation. The most common source of expression-introduced
2759 /// cleanups is temporary objects in C++, but several other kinds of
2760 /// expressions can create cleanups, including basically every
2761 /// call in ARC that returns an Objective-C pointer.
2762 ///
2763 /// This expression also tracks whether the sub-expression contains a
2764 /// potentially-evaluated block literal. The lifetime of a block
2765 /// literal is the extent of the enclosing scope.
2766 class ExprWithCleanups : public Expr {
2767 public:
2768 /// The type of objects that are kept in the cleanup.
2769 /// It's useful to remember the set of blocks; we could also
2770 /// remember the set of temporaries, but there's currently
2771 /// no need.
2772 typedef BlockDecl *CleanupObject;
2773
2774 private:
2775 Stmt *SubExpr;
2776
2777 ExprWithCleanups(EmptyShell, unsigned NumObjects);
2778 ExprWithCleanups(Expr *SubExpr, ArrayRef<CleanupObject> Objects);
2779
getObjectsBuffer()2780 CleanupObject *getObjectsBuffer() {
2781 return reinterpret_cast<CleanupObject*>(this + 1);
2782 }
getObjectsBuffer()2783 const CleanupObject *getObjectsBuffer() const {
2784 return reinterpret_cast<const CleanupObject*>(this + 1);
2785 }
2786 friend class ASTStmtReader;
2787
2788 public:
2789 static ExprWithCleanups *Create(const ASTContext &C, EmptyShell empty,
2790 unsigned numObjects);
2791
2792 static ExprWithCleanups *Create(const ASTContext &C, Expr *subexpr,
2793 ArrayRef<CleanupObject> objects);
2794
getObjects()2795 ArrayRef<CleanupObject> getObjects() const {
2796 return llvm::makeArrayRef(getObjectsBuffer(), getNumObjects());
2797 }
2798
getNumObjects()2799 unsigned getNumObjects() const { return ExprWithCleanupsBits.NumObjects; }
2800
getObject(unsigned i)2801 CleanupObject getObject(unsigned i) const {
2802 assert(i < getNumObjects() && "Index out of range");
2803 return getObjects()[i];
2804 }
2805
getSubExpr()2806 Expr *getSubExpr() { return cast<Expr>(SubExpr); }
getSubExpr()2807 const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
2808
2809 /// As with any mutator of the AST, be very careful
2810 /// when modifying an existing AST to preserve its invariants.
setSubExpr(Expr * E)2811 void setSubExpr(Expr *E) { SubExpr = E; }
2812
getLocStart()2813 SourceLocation getLocStart() const LLVM_READONLY {
2814 return SubExpr->getLocStart();
2815 }
getLocEnd()2816 SourceLocation getLocEnd() const LLVM_READONLY { return SubExpr->getLocEnd();}
2817
2818 // Implement isa/cast/dyncast/etc.
classof(const Stmt * T)2819 static bool classof(const Stmt *T) {
2820 return T->getStmtClass() == ExprWithCleanupsClass;
2821 }
2822
2823 // Iterators
children()2824 child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
2825 };
2826
2827 /// \brief Describes an explicit type conversion that uses functional
2828 /// notion but could not be resolved because one or more arguments are
2829 /// type-dependent.
2830 ///
2831 /// The explicit type conversions expressed by
2832 /// CXXUnresolvedConstructExpr have the form <tt>T(a1, a2, ..., aN)</tt>,
2833 /// where \c T is some type and \c a1, \c a2, ..., \c aN are values, and
2834 /// either \c T is a dependent type or one or more of the <tt>a</tt>'s is
2835 /// type-dependent. For example, this would occur in a template such
2836 /// as:
2837 ///
2838 /// \code
2839 /// template<typename T, typename A1>
2840 /// inline T make_a(const A1& a1) {
2841 /// return T(a1);
2842 /// }
2843 /// \endcode
2844 ///
2845 /// When the returned expression is instantiated, it may resolve to a
2846 /// constructor call, conversion function call, or some kind of type
2847 /// conversion.
2848 class CXXUnresolvedConstructExpr : public Expr {
2849 /// \brief The type being constructed.
2850 TypeSourceInfo *Type;
2851
2852 /// \brief The location of the left parentheses ('(').
2853 SourceLocation LParenLoc;
2854
2855 /// \brief The location of the right parentheses (')').
2856 SourceLocation RParenLoc;
2857
2858 /// \brief The number of arguments used to construct the type.
2859 unsigned NumArgs;
2860
2861 CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
2862 SourceLocation LParenLoc,
2863 ArrayRef<Expr*> Args,
2864 SourceLocation RParenLoc);
2865
CXXUnresolvedConstructExpr(EmptyShell Empty,unsigned NumArgs)2866 CXXUnresolvedConstructExpr(EmptyShell Empty, unsigned NumArgs)
2867 : Expr(CXXUnresolvedConstructExprClass, Empty), Type(), NumArgs(NumArgs) { }
2868
2869 friend class ASTStmtReader;
2870
2871 public:
2872 static CXXUnresolvedConstructExpr *Create(const ASTContext &C,
2873 TypeSourceInfo *Type,
2874 SourceLocation LParenLoc,
2875 ArrayRef<Expr*> Args,
2876 SourceLocation RParenLoc);
2877
2878 static CXXUnresolvedConstructExpr *CreateEmpty(const ASTContext &C,
2879 unsigned NumArgs);
2880
2881 /// \brief Retrieve the type that is being constructed, as specified
2882 /// in the source code.
getTypeAsWritten()2883 QualType getTypeAsWritten() const { return Type->getType(); }
2884
2885 /// \brief Retrieve the type source information for the type being
2886 /// constructed.
getTypeSourceInfo()2887 TypeSourceInfo *getTypeSourceInfo() const { return Type; }
2888
2889 /// \brief Retrieve the location of the left parentheses ('(') that
2890 /// precedes the argument list.
getLParenLoc()2891 SourceLocation getLParenLoc() const { return LParenLoc; }
setLParenLoc(SourceLocation L)2892 void setLParenLoc(SourceLocation L) { LParenLoc = L; }
2893
2894 /// \brief Retrieve the location of the right parentheses (')') that
2895 /// follows the argument list.
getRParenLoc()2896 SourceLocation getRParenLoc() const { return RParenLoc; }
setRParenLoc(SourceLocation L)2897 void setRParenLoc(SourceLocation L) { RParenLoc = L; }
2898
2899 /// \brief Retrieve the number of arguments.
arg_size()2900 unsigned arg_size() const { return NumArgs; }
2901
2902 typedef Expr** arg_iterator;
arg_begin()2903 arg_iterator arg_begin() { return reinterpret_cast<Expr**>(this + 1); }
arg_end()2904 arg_iterator arg_end() { return arg_begin() + NumArgs; }
2905
2906 typedef const Expr* const * const_arg_iterator;
arg_begin()2907 const_arg_iterator arg_begin() const {
2908 return reinterpret_cast<const Expr* const *>(this + 1);
2909 }
arg_end()2910 const_arg_iterator arg_end() const {
2911 return arg_begin() + NumArgs;
2912 }
2913
getArg(unsigned I)2914 Expr *getArg(unsigned I) {
2915 assert(I < NumArgs && "Argument index out-of-range");
2916 return *(arg_begin() + I);
2917 }
2918
getArg(unsigned I)2919 const Expr *getArg(unsigned I) const {
2920 assert(I < NumArgs && "Argument index out-of-range");
2921 return *(arg_begin() + I);
2922 }
2923
setArg(unsigned I,Expr * E)2924 void setArg(unsigned I, Expr *E) {
2925 assert(I < NumArgs && "Argument index out-of-range");
2926 *(arg_begin() + I) = E;
2927 }
2928
2929 SourceLocation getLocStart() const LLVM_READONLY;
getLocEnd()2930 SourceLocation getLocEnd() const LLVM_READONLY {
2931 if (!RParenLoc.isValid() && NumArgs > 0)
2932 return getArg(NumArgs - 1)->getLocEnd();
2933 return RParenLoc;
2934 }
2935
classof(const Stmt * T)2936 static bool classof(const Stmt *T) {
2937 return T->getStmtClass() == CXXUnresolvedConstructExprClass;
2938 }
2939
2940 // Iterators
children()2941 child_range children() {
2942 Stmt **begin = reinterpret_cast<Stmt**>(this+1);
2943 return child_range(begin, begin + NumArgs);
2944 }
2945 };
2946
2947 /// \brief Represents a C++ member access expression where the actual
2948 /// member referenced could not be resolved because the base
2949 /// expression or the member name was dependent.
2950 ///
2951 /// Like UnresolvedMemberExprs, these can be either implicit or
2952 /// explicit accesses. It is only possible to get one of these with
2953 /// an implicit access if a qualifier is provided.
2954 class CXXDependentScopeMemberExpr : public Expr {
2955 /// \brief The expression for the base pointer or class reference,
2956 /// e.g., the \c x in x.f. Can be null in implicit accesses.
2957 Stmt *Base;
2958
2959 /// \brief The type of the base expression. Never null, even for
2960 /// implicit accesses.
2961 QualType BaseType;
2962
2963 /// \brief Whether this member expression used the '->' operator or
2964 /// the '.' operator.
2965 bool IsArrow : 1;
2966
2967 /// \brief Whether this member expression has info for explicit template
2968 /// keyword and arguments.
2969 bool HasTemplateKWAndArgsInfo : 1;
2970
2971 /// \brief The location of the '->' or '.' operator.
2972 SourceLocation OperatorLoc;
2973
2974 /// \brief The nested-name-specifier that precedes the member name, if any.
2975 NestedNameSpecifierLoc QualifierLoc;
2976
2977 /// \brief In a qualified member access expression such as t->Base::f, this
2978 /// member stores the resolves of name lookup in the context of the member
2979 /// access expression, to be used at instantiation time.
2980 ///
2981 /// FIXME: This member, along with the QualifierLoc, could
2982 /// be stuck into a structure that is optionally allocated at the end of
2983 /// the CXXDependentScopeMemberExpr, to save space in the common case.
2984 NamedDecl *FirstQualifierFoundInScope;
2985
2986 /// \brief The member to which this member expression refers, which
2987 /// can be name, overloaded operator, or destructor.
2988 ///
2989 /// FIXME: could also be a template-id
2990 DeclarationNameInfo MemberNameInfo;
2991
2992 /// \brief Return the optional template keyword and arguments info.
getTemplateKWAndArgsInfo()2993 ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() {
2994 if (!HasTemplateKWAndArgsInfo) return nullptr;
2995 return reinterpret_cast<ASTTemplateKWAndArgsInfo*>(this + 1);
2996 }
2997 /// \brief Return the optional template keyword and arguments info.
getTemplateKWAndArgsInfo()2998 const ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() const {
2999 return const_cast<CXXDependentScopeMemberExpr*>(this)
3000 ->getTemplateKWAndArgsInfo();
3001 }
3002
3003 CXXDependentScopeMemberExpr(const ASTContext &C, Expr *Base,
3004 QualType BaseType, bool IsArrow,
3005 SourceLocation OperatorLoc,
3006 NestedNameSpecifierLoc QualifierLoc,
3007 SourceLocation TemplateKWLoc,
3008 NamedDecl *FirstQualifierFoundInScope,
3009 DeclarationNameInfo MemberNameInfo,
3010 const TemplateArgumentListInfo *TemplateArgs);
3011
3012 public:
3013 CXXDependentScopeMemberExpr(const ASTContext &C, Expr *Base,
3014 QualType BaseType, bool IsArrow,
3015 SourceLocation OperatorLoc,
3016 NestedNameSpecifierLoc QualifierLoc,
3017 NamedDecl *FirstQualifierFoundInScope,
3018 DeclarationNameInfo MemberNameInfo);
3019
3020 static CXXDependentScopeMemberExpr *
3021 Create(const ASTContext &C, Expr *Base, QualType BaseType, bool IsArrow,
3022 SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
3023 SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
3024 DeclarationNameInfo MemberNameInfo,
3025 const TemplateArgumentListInfo *TemplateArgs);
3026
3027 static CXXDependentScopeMemberExpr *
3028 CreateEmpty(const ASTContext &C, bool HasTemplateKWAndArgsInfo,
3029 unsigned NumTemplateArgs);
3030
3031 /// \brief True if this is an implicit access, i.e. one in which the
3032 /// member being accessed was not written in the source. The source
3033 /// location of the operator is invalid in this case.
3034 bool isImplicitAccess() const;
3035
3036 /// \brief Retrieve the base object of this member expressions,
3037 /// e.g., the \c x in \c x.m.
getBase()3038 Expr *getBase() const {
3039 assert(!isImplicitAccess());
3040 return cast<Expr>(Base);
3041 }
3042
getBaseType()3043 QualType getBaseType() const { return BaseType; }
3044
3045 /// \brief Determine whether this member expression used the '->'
3046 /// operator; otherwise, it used the '.' operator.
isArrow()3047 bool isArrow() const { return IsArrow; }
3048
3049 /// \brief Retrieve the location of the '->' or '.' operator.
getOperatorLoc()3050 SourceLocation getOperatorLoc() const { return OperatorLoc; }
3051
3052 /// \brief Retrieve the nested-name-specifier that qualifies the member
3053 /// name.
getQualifier()3054 NestedNameSpecifier *getQualifier() const {
3055 return QualifierLoc.getNestedNameSpecifier();
3056 }
3057
3058 /// \brief Retrieve the nested-name-specifier that qualifies the member
3059 /// name, with source location information.
getQualifierLoc()3060 NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3061
3062
3063 /// \brief Retrieve the first part of the nested-name-specifier that was
3064 /// found in the scope of the member access expression when the member access
3065 /// was initially parsed.
3066 ///
3067 /// This function only returns a useful result when member access expression
3068 /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration
3069 /// returned by this function describes what was found by unqualified name
3070 /// lookup for the identifier "Base" within the scope of the member access
3071 /// expression itself. At template instantiation time, this information is
3072 /// combined with the results of name lookup into the type of the object
3073 /// expression itself (the class type of x).
getFirstQualifierFoundInScope()3074 NamedDecl *getFirstQualifierFoundInScope() const {
3075 return FirstQualifierFoundInScope;
3076 }
3077
3078 /// \brief Retrieve the name of the member that this expression
3079 /// refers to.
getMemberNameInfo()3080 const DeclarationNameInfo &getMemberNameInfo() const {
3081 return MemberNameInfo;
3082 }
3083
3084 /// \brief Retrieve the name of the member that this expression
3085 /// refers to.
getMember()3086 DeclarationName getMember() const { return MemberNameInfo.getName(); }
3087
3088 // \brief Retrieve the location of the name of the member that this
3089 // expression refers to.
getMemberLoc()3090 SourceLocation getMemberLoc() const { return MemberNameInfo.getLoc(); }
3091
3092 /// \brief Retrieve the location of the template keyword preceding the
3093 /// member name, if any.
getTemplateKeywordLoc()3094 SourceLocation getTemplateKeywordLoc() const {
3095 if (!HasTemplateKWAndArgsInfo) return SourceLocation();
3096 return getTemplateKWAndArgsInfo()->getTemplateKeywordLoc();
3097 }
3098
3099 /// \brief Retrieve the location of the left angle bracket starting the
3100 /// explicit template argument list following the member name, if any.
getLAngleLoc()3101 SourceLocation getLAngleLoc() const {
3102 if (!HasTemplateKWAndArgsInfo) return SourceLocation();
3103 return getTemplateKWAndArgsInfo()->LAngleLoc;
3104 }
3105
3106 /// \brief Retrieve the location of the right angle bracket ending the
3107 /// explicit template argument list following the member name, if any.
getRAngleLoc()3108 SourceLocation getRAngleLoc() const {
3109 if (!HasTemplateKWAndArgsInfo) return SourceLocation();
3110 return getTemplateKWAndArgsInfo()->RAngleLoc;
3111 }
3112
3113 /// Determines whether the member name was preceded by the template keyword.
hasTemplateKeyword()3114 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
3115
3116 /// \brief Determines whether this member expression actually had a C++
3117 /// template argument list explicitly specified, e.g., x.f<int>.
hasExplicitTemplateArgs()3118 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); }
3119
3120 /// \brief Retrieve the explicit template argument list that followed the
3121 /// member template name, if any.
getExplicitTemplateArgs()3122 ASTTemplateArgumentListInfo &getExplicitTemplateArgs() {
3123 assert(hasExplicitTemplateArgs());
3124 return *reinterpret_cast<ASTTemplateArgumentListInfo *>(this + 1);
3125 }
3126
3127 /// \brief Retrieve the explicit template argument list that followed the
3128 /// member template name, if any.
getExplicitTemplateArgs()3129 const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const {
3130 return const_cast<CXXDependentScopeMemberExpr *>(this)
3131 ->getExplicitTemplateArgs();
3132 }
3133
3134 /// \brief Retrieves the optional explicit template arguments.
3135 ///
3136 /// This points to the same data as getExplicitTemplateArgs(), but
3137 /// returns null if there are no explicit template arguments.
getOptionalExplicitTemplateArgs()3138 const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() const {
3139 if (!hasExplicitTemplateArgs()) return nullptr;
3140 return &getExplicitTemplateArgs();
3141 }
3142
3143 /// \brief Copies the template arguments (if present) into the given
3144 /// structure.
copyTemplateArgumentsInto(TemplateArgumentListInfo & List)3145 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
3146 getExplicitTemplateArgs().copyInto(List);
3147 }
3148
3149 /// \brief Initializes the template arguments using the given structure.
initializeTemplateArgumentsFrom(const TemplateArgumentListInfo & List)3150 void initializeTemplateArgumentsFrom(const TemplateArgumentListInfo &List) {
3151 getExplicitTemplateArgs().initializeFrom(List);
3152 }
3153
3154 /// \brief Retrieve the template arguments provided as part of this
3155 /// template-id.
getTemplateArgs()3156 const TemplateArgumentLoc *getTemplateArgs() const {
3157 return getExplicitTemplateArgs().getTemplateArgs();
3158 }
3159
3160 /// \brief Retrieve the number of template arguments provided as part of this
3161 /// template-id.
getNumTemplateArgs()3162 unsigned getNumTemplateArgs() const {
3163 return getExplicitTemplateArgs().NumTemplateArgs;
3164 }
3165
getLocStart()3166 SourceLocation getLocStart() const LLVM_READONLY {
3167 if (!isImplicitAccess())
3168 return Base->getLocStart();
3169 if (getQualifier())
3170 return getQualifierLoc().getBeginLoc();
3171 return MemberNameInfo.getBeginLoc();
3172
3173 }
getLocEnd()3174 SourceLocation getLocEnd() const LLVM_READONLY {
3175 if (hasExplicitTemplateArgs())
3176 return getRAngleLoc();
3177 return MemberNameInfo.getEndLoc();
3178 }
3179
classof(const Stmt * T)3180 static bool classof(const Stmt *T) {
3181 return T->getStmtClass() == CXXDependentScopeMemberExprClass;
3182 }
3183
3184 // Iterators
children()3185 child_range children() {
3186 if (isImplicitAccess()) return child_range();
3187 return child_range(&Base, &Base + 1);
3188 }
3189
3190 friend class ASTStmtReader;
3191 friend class ASTStmtWriter;
3192 };
3193
3194 /// \brief Represents a C++ member access expression for which lookup
3195 /// produced a set of overloaded functions.
3196 ///
3197 /// The member access may be explicit or implicit:
3198 /// \code
3199 /// struct A {
3200 /// int a, b;
3201 /// int explicitAccess() { return this->a + this->A::b; }
3202 /// int implicitAccess() { return a + A::b; }
3203 /// };
3204 /// \endcode
3205 ///
3206 /// In the final AST, an explicit access always becomes a MemberExpr.
3207 /// An implicit access may become either a MemberExpr or a
3208 /// DeclRefExpr, depending on whether the member is static.
3209 class UnresolvedMemberExpr : public OverloadExpr {
3210 /// \brief Whether this member expression used the '->' operator or
3211 /// the '.' operator.
3212 bool IsArrow : 1;
3213
3214 /// \brief Whether the lookup results contain an unresolved using
3215 /// declaration.
3216 bool HasUnresolvedUsing : 1;
3217
3218 /// \brief The expression for the base pointer or class reference,
3219 /// e.g., the \c x in x.f.
3220 ///
3221 /// This can be null if this is an 'unbased' member expression.
3222 Stmt *Base;
3223
3224 /// \brief The type of the base expression; never null.
3225 QualType BaseType;
3226
3227 /// \brief The location of the '->' or '.' operator.
3228 SourceLocation OperatorLoc;
3229
3230 UnresolvedMemberExpr(const ASTContext &C, bool HasUnresolvedUsing,
3231 Expr *Base, QualType BaseType, bool IsArrow,
3232 SourceLocation OperatorLoc,
3233 NestedNameSpecifierLoc QualifierLoc,
3234 SourceLocation TemplateKWLoc,
3235 const DeclarationNameInfo &MemberNameInfo,
3236 const TemplateArgumentListInfo *TemplateArgs,
3237 UnresolvedSetIterator Begin, UnresolvedSetIterator End);
3238
UnresolvedMemberExpr(EmptyShell Empty)3239 UnresolvedMemberExpr(EmptyShell Empty)
3240 : OverloadExpr(UnresolvedMemberExprClass, Empty), IsArrow(false),
3241 HasUnresolvedUsing(false), Base(nullptr) { }
3242
3243 friend class ASTStmtReader;
3244
3245 public:
3246 static UnresolvedMemberExpr *
3247 Create(const ASTContext &C, bool HasUnresolvedUsing,
3248 Expr *Base, QualType BaseType, bool IsArrow,
3249 SourceLocation OperatorLoc,
3250 NestedNameSpecifierLoc QualifierLoc,
3251 SourceLocation TemplateKWLoc,
3252 const DeclarationNameInfo &MemberNameInfo,
3253 const TemplateArgumentListInfo *TemplateArgs,
3254 UnresolvedSetIterator Begin, UnresolvedSetIterator End);
3255
3256 static UnresolvedMemberExpr *
3257 CreateEmpty(const ASTContext &C, bool HasTemplateKWAndArgsInfo,
3258 unsigned NumTemplateArgs);
3259
3260 /// \brief True if this is an implicit access, i.e., one in which the
3261 /// member being accessed was not written in the source.
3262 ///
3263 /// The source location of the operator is invalid in this case.
3264 bool isImplicitAccess() const;
3265
3266 /// \brief Retrieve the base object of this member expressions,
3267 /// e.g., the \c x in \c x.m.
getBase()3268 Expr *getBase() {
3269 assert(!isImplicitAccess());
3270 return cast<Expr>(Base);
3271 }
getBase()3272 const Expr *getBase() const {
3273 assert(!isImplicitAccess());
3274 return cast<Expr>(Base);
3275 }
3276
getBaseType()3277 QualType getBaseType() const { return BaseType; }
3278
3279 /// \brief Determine whether the lookup results contain an unresolved using
3280 /// declaration.
hasUnresolvedUsing()3281 bool hasUnresolvedUsing() const { return HasUnresolvedUsing; }
3282
3283 /// \brief Determine whether this member expression used the '->'
3284 /// operator; otherwise, it used the '.' operator.
isArrow()3285 bool isArrow() const { return IsArrow; }
3286
3287 /// \brief Retrieve the location of the '->' or '.' operator.
getOperatorLoc()3288 SourceLocation getOperatorLoc() const { return OperatorLoc; }
3289
3290 /// \brief Retrieve the naming class of this lookup.
3291 CXXRecordDecl *getNamingClass() const;
3292
3293 /// \brief Retrieve the full name info for the member that this expression
3294 /// refers to.
getMemberNameInfo()3295 const DeclarationNameInfo &getMemberNameInfo() const { return getNameInfo(); }
3296
3297 /// \brief Retrieve the name of the member that this expression
3298 /// refers to.
getMemberName()3299 DeclarationName getMemberName() const { return getName(); }
3300
3301 // \brief Retrieve the location of the name of the member that this
3302 // expression refers to.
getMemberLoc()3303 SourceLocation getMemberLoc() const { return getNameLoc(); }
3304
3305 // \brief Return the preferred location (the member name) for the arrow when
3306 // diagnosing a problem with this expression.
getExprLoc()3307 SourceLocation getExprLoc() const LLVM_READONLY { return getMemberLoc(); }
3308
getLocStart()3309 SourceLocation getLocStart() const LLVM_READONLY {
3310 if (!isImplicitAccess())
3311 return Base->getLocStart();
3312 if (NestedNameSpecifierLoc l = getQualifierLoc())
3313 return l.getBeginLoc();
3314 return getMemberNameInfo().getLocStart();
3315 }
getLocEnd()3316 SourceLocation getLocEnd() const LLVM_READONLY {
3317 if (hasExplicitTemplateArgs())
3318 return getRAngleLoc();
3319 return getMemberNameInfo().getLocEnd();
3320 }
3321
classof(const Stmt * T)3322 static bool classof(const Stmt *T) {
3323 return T->getStmtClass() == UnresolvedMemberExprClass;
3324 }
3325
3326 // Iterators
children()3327 child_range children() {
3328 if (isImplicitAccess()) return child_range();
3329 return child_range(&Base, &Base + 1);
3330 }
3331 };
3332
3333 /// \brief Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
3334 ///
3335 /// The noexcept expression tests whether a given expression might throw. Its
3336 /// result is a boolean constant.
3337 class CXXNoexceptExpr : public Expr {
3338 bool Value : 1;
3339 Stmt *Operand;
3340 SourceRange Range;
3341
3342 friend class ASTStmtReader;
3343
3344 public:
CXXNoexceptExpr(QualType Ty,Expr * Operand,CanThrowResult Val,SourceLocation Keyword,SourceLocation RParen)3345 CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val,
3346 SourceLocation Keyword, SourceLocation RParen)
3347 : Expr(CXXNoexceptExprClass, Ty, VK_RValue, OK_Ordinary,
3348 /*TypeDependent*/false,
3349 /*ValueDependent*/Val == CT_Dependent,
3350 Val == CT_Dependent || Operand->isInstantiationDependent(),
3351 Operand->containsUnexpandedParameterPack()),
3352 Value(Val == CT_Cannot), Operand(Operand), Range(Keyword, RParen)
3353 { }
3354
CXXNoexceptExpr(EmptyShell Empty)3355 CXXNoexceptExpr(EmptyShell Empty)
3356 : Expr(CXXNoexceptExprClass, Empty)
3357 { }
3358
getOperand()3359 Expr *getOperand() const { return static_cast<Expr*>(Operand); }
3360
getLocStart()3361 SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
getLocEnd()3362 SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
getSourceRange()3363 SourceRange getSourceRange() const LLVM_READONLY { return Range; }
3364
getValue()3365 bool getValue() const { return Value; }
3366
classof(const Stmt * T)3367 static bool classof(const Stmt *T) {
3368 return T->getStmtClass() == CXXNoexceptExprClass;
3369 }
3370
3371 // Iterators
children()3372 child_range children() { return child_range(&Operand, &Operand + 1); }
3373 };
3374
3375 /// \brief Represents a C++11 pack expansion that produces a sequence of
3376 /// expressions.
3377 ///
3378 /// A pack expansion expression contains a pattern (which itself is an
3379 /// expression) followed by an ellipsis. For example:
3380 ///
3381 /// \code
3382 /// template<typename F, typename ...Types>
3383 /// void forward(F f, Types &&...args) {
3384 /// f(static_cast<Types&&>(args)...);
3385 /// }
3386 /// \endcode
3387 ///
3388 /// Here, the argument to the function object \c f is a pack expansion whose
3389 /// pattern is \c static_cast<Types&&>(args). When the \c forward function
3390 /// template is instantiated, the pack expansion will instantiate to zero or
3391 /// or more function arguments to the function object \c f.
3392 class PackExpansionExpr : public Expr {
3393 SourceLocation EllipsisLoc;
3394
3395 /// \brief The number of expansions that will be produced by this pack
3396 /// expansion expression, if known.
3397 ///
3398 /// When zero, the number of expansions is not known. Otherwise, this value
3399 /// is the number of expansions + 1.
3400 unsigned NumExpansions;
3401
3402 Stmt *Pattern;
3403
3404 friend class ASTStmtReader;
3405 friend class ASTStmtWriter;
3406
3407 public:
PackExpansionExpr(QualType T,Expr * Pattern,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)3408 PackExpansionExpr(QualType T, Expr *Pattern, SourceLocation EllipsisLoc,
3409 Optional<unsigned> NumExpansions)
3410 : Expr(PackExpansionExprClass, T, Pattern->getValueKind(),
3411 Pattern->getObjectKind(), /*TypeDependent=*/true,
3412 /*ValueDependent=*/true, /*InstantiationDependent=*/true,
3413 /*ContainsUnexpandedParameterPack=*/false),
3414 EllipsisLoc(EllipsisLoc),
3415 NumExpansions(NumExpansions? *NumExpansions + 1 : 0),
3416 Pattern(Pattern) { }
3417
PackExpansionExpr(EmptyShell Empty)3418 PackExpansionExpr(EmptyShell Empty) : Expr(PackExpansionExprClass, Empty) { }
3419
3420 /// \brief Retrieve the pattern of the pack expansion.
getPattern()3421 Expr *getPattern() { return reinterpret_cast<Expr *>(Pattern); }
3422
3423 /// \brief Retrieve the pattern of the pack expansion.
getPattern()3424 const Expr *getPattern() const { return reinterpret_cast<Expr *>(Pattern); }
3425
3426 /// \brief Retrieve the location of the ellipsis that describes this pack
3427 /// expansion.
getEllipsisLoc()3428 SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
3429
3430 /// \brief Determine the number of expansions that will be produced when
3431 /// this pack expansion is instantiated, if already known.
getNumExpansions()3432 Optional<unsigned> getNumExpansions() const {
3433 if (NumExpansions)
3434 return NumExpansions - 1;
3435
3436 return None;
3437 }
3438
getLocStart()3439 SourceLocation getLocStart() const LLVM_READONLY {
3440 return Pattern->getLocStart();
3441 }
getLocEnd()3442 SourceLocation getLocEnd() const LLVM_READONLY { return EllipsisLoc; }
3443
classof(const Stmt * T)3444 static bool classof(const Stmt *T) {
3445 return T->getStmtClass() == PackExpansionExprClass;
3446 }
3447
3448 // Iterators
children()3449 child_range children() {
3450 return child_range(&Pattern, &Pattern + 1);
3451 }
3452 };
3453
getTemplateKWAndArgsInfo()3454 inline ASTTemplateKWAndArgsInfo *OverloadExpr::getTemplateKWAndArgsInfo() {
3455 if (!HasTemplateKWAndArgsInfo) return nullptr;
3456 if (isa<UnresolvedLookupExpr>(this))
3457 return reinterpret_cast<ASTTemplateKWAndArgsInfo*>
3458 (cast<UnresolvedLookupExpr>(this) + 1);
3459 else
3460 return reinterpret_cast<ASTTemplateKWAndArgsInfo*>
3461 (cast<UnresolvedMemberExpr>(this) + 1);
3462 }
3463
3464 /// \brief Represents an expression that computes the length of a parameter
3465 /// pack.
3466 ///
3467 /// \code
3468 /// template<typename ...Types>
3469 /// struct count {
3470 /// static const unsigned value = sizeof...(Types);
3471 /// };
3472 /// \endcode
3473 class SizeOfPackExpr : public Expr {
3474 /// \brief The location of the \c sizeof keyword.
3475 SourceLocation OperatorLoc;
3476
3477 /// \brief The location of the name of the parameter pack.
3478 SourceLocation PackLoc;
3479
3480 /// \brief The location of the closing parenthesis.
3481 SourceLocation RParenLoc;
3482
3483 /// \brief The length of the parameter pack, if known.
3484 ///
3485 /// When this expression is value-dependent, the length of the parameter pack
3486 /// is unknown. When this expression is not value-dependent, the length is
3487 /// known.
3488 unsigned Length;
3489
3490 /// \brief The parameter pack itself.
3491 NamedDecl *Pack;
3492
3493 friend class ASTStmtReader;
3494 friend class ASTStmtWriter;
3495
3496 public:
3497 /// \brief Create a value-dependent expression that computes the length of
3498 /// the given parameter pack.
SizeOfPackExpr(QualType SizeType,SourceLocation OperatorLoc,NamedDecl * Pack,SourceLocation PackLoc,SourceLocation RParenLoc)3499 SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack,
3500 SourceLocation PackLoc, SourceLocation RParenLoc)
3501 : Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary,
3502 /*TypeDependent=*/false, /*ValueDependent=*/true,
3503 /*InstantiationDependent=*/true,
3504 /*ContainsUnexpandedParameterPack=*/false),
3505 OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
3506 Length(0), Pack(Pack) { }
3507
3508 /// \brief Create an expression that computes the length of
3509 /// the given parameter pack, which is already known.
SizeOfPackExpr(QualType SizeType,SourceLocation OperatorLoc,NamedDecl * Pack,SourceLocation PackLoc,SourceLocation RParenLoc,unsigned Length)3510 SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack,
3511 SourceLocation PackLoc, SourceLocation RParenLoc,
3512 unsigned Length)
3513 : Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary,
3514 /*TypeDependent=*/false, /*ValueDependent=*/false,
3515 /*InstantiationDependent=*/false,
3516 /*ContainsUnexpandedParameterPack=*/false),
3517 OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
3518 Length(Length), Pack(Pack) { }
3519
3520 /// \brief Create an empty expression.
SizeOfPackExpr(EmptyShell Empty)3521 SizeOfPackExpr(EmptyShell Empty) : Expr(SizeOfPackExprClass, Empty) { }
3522
3523 /// \brief Determine the location of the 'sizeof' keyword.
getOperatorLoc()3524 SourceLocation getOperatorLoc() const { return OperatorLoc; }
3525
3526 /// \brief Determine the location of the parameter pack.
getPackLoc()3527 SourceLocation getPackLoc() const { return PackLoc; }
3528
3529 /// \brief Determine the location of the right parenthesis.
getRParenLoc()3530 SourceLocation getRParenLoc() const { return RParenLoc; }
3531
3532 /// \brief Retrieve the parameter pack.
getPack()3533 NamedDecl *getPack() const { return Pack; }
3534
3535 /// \brief Retrieve the length of the parameter pack.
3536 ///
3537 /// This routine may only be invoked when the expression is not
3538 /// value-dependent.
getPackLength()3539 unsigned getPackLength() const {
3540 assert(!isValueDependent() &&
3541 "Cannot get the length of a value-dependent pack size expression");
3542 return Length;
3543 }
3544
getLocStart()3545 SourceLocation getLocStart() const LLVM_READONLY { return OperatorLoc; }
getLocEnd()3546 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
3547
classof(const Stmt * T)3548 static bool classof(const Stmt *T) {
3549 return T->getStmtClass() == SizeOfPackExprClass;
3550 }
3551
3552 // Iterators
children()3553 child_range children() { return child_range(); }
3554 };
3555
3556 /// \brief Represents a reference to a non-type template parameter
3557 /// that has been substituted with a template argument.
3558 class SubstNonTypeTemplateParmExpr : public Expr {
3559 /// \brief The replaced parameter.
3560 NonTypeTemplateParmDecl *Param;
3561
3562 /// \brief The replacement expression.
3563 Stmt *Replacement;
3564
3565 /// \brief The location of the non-type template parameter reference.
3566 SourceLocation NameLoc;
3567
3568 friend class ASTReader;
3569 friend class ASTStmtReader;
SubstNonTypeTemplateParmExpr(EmptyShell Empty)3570 explicit SubstNonTypeTemplateParmExpr(EmptyShell Empty)
3571 : Expr(SubstNonTypeTemplateParmExprClass, Empty) { }
3572
3573 public:
SubstNonTypeTemplateParmExpr(QualType type,ExprValueKind valueKind,SourceLocation loc,NonTypeTemplateParmDecl * param,Expr * replacement)3574 SubstNonTypeTemplateParmExpr(QualType type,
3575 ExprValueKind valueKind,
3576 SourceLocation loc,
3577 NonTypeTemplateParmDecl *param,
3578 Expr *replacement)
3579 : Expr(SubstNonTypeTemplateParmExprClass, type, valueKind, OK_Ordinary,
3580 replacement->isTypeDependent(), replacement->isValueDependent(),
3581 replacement->isInstantiationDependent(),
3582 replacement->containsUnexpandedParameterPack()),
3583 Param(param), Replacement(replacement), NameLoc(loc) {}
3584
getNameLoc()3585 SourceLocation getNameLoc() const { return NameLoc; }
getLocStart()3586 SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; }
getLocEnd()3587 SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; }
3588
getReplacement()3589 Expr *getReplacement() const { return cast<Expr>(Replacement); }
3590
getParameter()3591 NonTypeTemplateParmDecl *getParameter() const { return Param; }
3592
classof(const Stmt * s)3593 static bool classof(const Stmt *s) {
3594 return s->getStmtClass() == SubstNonTypeTemplateParmExprClass;
3595 }
3596
3597 // Iterators
children()3598 child_range children() { return child_range(&Replacement, &Replacement+1); }
3599 };
3600
3601 /// \brief Represents a reference to a non-type template parameter pack that
3602 /// has been substituted with a non-template argument pack.
3603 ///
3604 /// When a pack expansion in the source code contains multiple parameter packs
3605 /// and those parameter packs correspond to different levels of template
3606 /// parameter lists, this node is used to represent a non-type template
3607 /// parameter pack from an outer level, which has already had its argument pack
3608 /// substituted but that still lives within a pack expansion that itself
3609 /// could not be instantiated. When actually performing a substitution into
3610 /// that pack expansion (e.g., when all template parameters have corresponding
3611 /// arguments), this type will be replaced with the appropriate underlying
3612 /// expression at the current pack substitution index.
3613 class SubstNonTypeTemplateParmPackExpr : public Expr {
3614 /// \brief The non-type template parameter pack itself.
3615 NonTypeTemplateParmDecl *Param;
3616
3617 /// \brief A pointer to the set of template arguments that this
3618 /// parameter pack is instantiated with.
3619 const TemplateArgument *Arguments;
3620
3621 /// \brief The number of template arguments in \c Arguments.
3622 unsigned NumArguments;
3623
3624 /// \brief The location of the non-type template parameter pack reference.
3625 SourceLocation NameLoc;
3626
3627 friend class ASTReader;
3628 friend class ASTStmtReader;
SubstNonTypeTemplateParmPackExpr(EmptyShell Empty)3629 explicit SubstNonTypeTemplateParmPackExpr(EmptyShell Empty)
3630 : Expr(SubstNonTypeTemplateParmPackExprClass, Empty) { }
3631
3632 public:
3633 SubstNonTypeTemplateParmPackExpr(QualType T,
3634 NonTypeTemplateParmDecl *Param,
3635 SourceLocation NameLoc,
3636 const TemplateArgument &ArgPack);
3637
3638 /// \brief Retrieve the non-type template parameter pack being substituted.
getParameterPack()3639 NonTypeTemplateParmDecl *getParameterPack() const { return Param; }
3640
3641 /// \brief Retrieve the location of the parameter pack name.
getParameterPackLocation()3642 SourceLocation getParameterPackLocation() const { return NameLoc; }
3643
3644 /// \brief Retrieve the template argument pack containing the substituted
3645 /// template arguments.
3646 TemplateArgument getArgumentPack() const;
3647
getLocStart()3648 SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; }
getLocEnd()3649 SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; }
3650
classof(const Stmt * T)3651 static bool classof(const Stmt *T) {
3652 return T->getStmtClass() == SubstNonTypeTemplateParmPackExprClass;
3653 }
3654
3655 // Iterators
children()3656 child_range children() { return child_range(); }
3657 };
3658
3659 /// \brief Represents a reference to a function parameter pack that has been
3660 /// substituted but not yet expanded.
3661 ///
3662 /// When a pack expansion contains multiple parameter packs at different levels,
3663 /// this node is used to represent a function parameter pack at an outer level
3664 /// which we have already substituted to refer to expanded parameters, but where
3665 /// the containing pack expansion cannot yet be expanded.
3666 ///
3667 /// \code
3668 /// template<typename...Ts> struct S {
3669 /// template<typename...Us> auto f(Ts ...ts) -> decltype(g(Us(ts)...));
3670 /// };
3671 /// template struct S<int, int>;
3672 /// \endcode
3673 class FunctionParmPackExpr : public Expr {
3674 /// \brief The function parameter pack which was referenced.
3675 ParmVarDecl *ParamPack;
3676
3677 /// \brief The location of the function parameter pack reference.
3678 SourceLocation NameLoc;
3679
3680 /// \brief The number of expansions of this pack.
3681 unsigned NumParameters;
3682
3683 FunctionParmPackExpr(QualType T, ParmVarDecl *ParamPack,
3684 SourceLocation NameLoc, unsigned NumParams,
3685 Decl * const *Params);
3686
3687 friend class ASTReader;
3688 friend class ASTStmtReader;
3689
3690 public:
3691 static FunctionParmPackExpr *Create(const ASTContext &Context, QualType T,
3692 ParmVarDecl *ParamPack,
3693 SourceLocation NameLoc,
3694 ArrayRef<Decl *> Params);
3695 static FunctionParmPackExpr *CreateEmpty(const ASTContext &Context,
3696 unsigned NumParams);
3697
3698 /// \brief Get the parameter pack which this expression refers to.
getParameterPack()3699 ParmVarDecl *getParameterPack() const { return ParamPack; }
3700
3701 /// \brief Get the location of the parameter pack.
getParameterPackLocation()3702 SourceLocation getParameterPackLocation() const { return NameLoc; }
3703
3704 /// \brief Iterators over the parameters which the parameter pack expanded
3705 /// into.
3706 typedef ParmVarDecl * const *iterator;
begin()3707 iterator begin() const { return reinterpret_cast<iterator>(this+1); }
end()3708 iterator end() const { return begin() + NumParameters; }
3709
3710 /// \brief Get the number of parameters in this parameter pack.
getNumExpansions()3711 unsigned getNumExpansions() const { return NumParameters; }
3712
3713 /// \brief Get an expansion of the parameter pack by index.
getExpansion(unsigned I)3714 ParmVarDecl *getExpansion(unsigned I) const { return begin()[I]; }
3715
getLocStart()3716 SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; }
getLocEnd()3717 SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; }
3718
classof(const Stmt * T)3719 static bool classof(const Stmt *T) {
3720 return T->getStmtClass() == FunctionParmPackExprClass;
3721 }
3722
children()3723 child_range children() { return child_range(); }
3724 };
3725
3726 /// \brief Represents a prvalue temporary that is written into memory so that
3727 /// a reference can bind to it.
3728 ///
3729 /// Prvalue expressions are materialized when they need to have an address
3730 /// in memory for a reference to bind to. This happens when binding a
3731 /// reference to the result of a conversion, e.g.,
3732 ///
3733 /// \code
3734 /// const int &r = 1.0;
3735 /// \endcode
3736 ///
3737 /// Here, 1.0 is implicitly converted to an \c int. That resulting \c int is
3738 /// then materialized via a \c MaterializeTemporaryExpr, and the reference
3739 /// binds to the temporary. \c MaterializeTemporaryExprs are always glvalues
3740 /// (either an lvalue or an xvalue, depending on the kind of reference binding
3741 /// to it), maintaining the invariant that references always bind to glvalues.
3742 ///
3743 /// Reference binding and copy-elision can both extend the lifetime of a
3744 /// temporary. When either happens, the expression will also track the
3745 /// declaration which is responsible for the lifetime extension.
3746 class MaterializeTemporaryExpr : public Expr {
3747 private:
3748 struct ExtraState {
3749 /// \brief The temporary-generating expression whose value will be
3750 /// materialized.
3751 Stmt *Temporary;
3752
3753 /// \brief The declaration which lifetime-extended this reference, if any.
3754 /// Either a VarDecl, or (for a ctor-initializer) a FieldDecl.
3755 const ValueDecl *ExtendingDecl;
3756
3757 unsigned ManglingNumber;
3758 };
3759 llvm::PointerUnion<Stmt *, ExtraState *> State;
3760
3761 friend class ASTStmtReader;
3762 friend class ASTStmtWriter;
3763
3764 void initializeExtraState(const ValueDecl *ExtendedBy,
3765 unsigned ManglingNumber);
3766
3767 public:
MaterializeTemporaryExpr(QualType T,Expr * Temporary,bool BoundToLvalueReference)3768 MaterializeTemporaryExpr(QualType T, Expr *Temporary,
3769 bool BoundToLvalueReference)
3770 : Expr(MaterializeTemporaryExprClass, T,
3771 BoundToLvalueReference? VK_LValue : VK_XValue, OK_Ordinary,
3772 Temporary->isTypeDependent(), Temporary->isValueDependent(),
3773 Temporary->isInstantiationDependent(),
3774 Temporary->containsUnexpandedParameterPack()),
3775 State(Temporary) {}
3776
MaterializeTemporaryExpr(EmptyShell Empty)3777 MaterializeTemporaryExpr(EmptyShell Empty)
3778 : Expr(MaterializeTemporaryExprClass, Empty) { }
3779
getTemporary()3780 Stmt *getTemporary() const {
3781 return State.is<Stmt *>() ? State.get<Stmt *>()
3782 : State.get<ExtraState *>()->Temporary;
3783 }
3784
3785 /// \brief Retrieve the temporary-generating subexpression whose value will
3786 /// be materialized into a glvalue.
GetTemporaryExpr()3787 Expr *GetTemporaryExpr() const { return static_cast<Expr *>(getTemporary()); }
3788
3789 /// \brief Retrieve the storage duration for the materialized temporary.
getStorageDuration()3790 StorageDuration getStorageDuration() const {
3791 const ValueDecl *ExtendingDecl = getExtendingDecl();
3792 if (!ExtendingDecl)
3793 return SD_FullExpression;
3794 // FIXME: This is not necessarily correct for a temporary materialized
3795 // within a default initializer.
3796 if (isa<FieldDecl>(ExtendingDecl))
3797 return SD_Automatic;
3798 return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
3799 }
3800
3801 /// \brief Get the declaration which triggered the lifetime-extension of this
3802 /// temporary, if any.
getExtendingDecl()3803 const ValueDecl *getExtendingDecl() const {
3804 return State.is<Stmt *>() ? nullptr
3805 : State.get<ExtraState *>()->ExtendingDecl;
3806 }
3807
3808 void setExtendingDecl(const ValueDecl *ExtendedBy, unsigned ManglingNumber);
3809
getManglingNumber()3810 unsigned getManglingNumber() const {
3811 return State.is<Stmt *>() ? 0 : State.get<ExtraState *>()->ManglingNumber;
3812 }
3813
3814 /// \brief Determine whether this materialized temporary is bound to an
3815 /// lvalue reference; otherwise, it's bound to an rvalue reference.
isBoundToLvalueReference()3816 bool isBoundToLvalueReference() const {
3817 return getValueKind() == VK_LValue;
3818 }
3819
getLocStart()3820 SourceLocation getLocStart() const LLVM_READONLY {
3821 return getTemporary()->getLocStart();
3822 }
getLocEnd()3823 SourceLocation getLocEnd() const LLVM_READONLY {
3824 return getTemporary()->getLocEnd();
3825 }
3826
classof(const Stmt * T)3827 static bool classof(const Stmt *T) {
3828 return T->getStmtClass() == MaterializeTemporaryExprClass;
3829 }
3830
3831 // Iterators
children()3832 child_range children() {
3833 if (State.is<Stmt *>())
3834 return child_range(State.getAddrOfPtr1(), State.getAddrOfPtr1() + 1);
3835
3836 auto ES = State.get<ExtraState *>();
3837 return child_range(&ES->Temporary, &ES->Temporary + 1);
3838 }
3839 };
3840
3841 /// \brief Represents a folding of a pack over an operator.
3842 ///
3843 /// This expression is always dependent and represents a pack expansion of the
3844 /// forms:
3845 ///
3846 /// ( expr op ... )
3847 /// ( ... op expr )
3848 /// ( expr op ... op expr )
3849 class CXXFoldExpr : public Expr {
3850 SourceLocation LParenLoc;
3851 SourceLocation EllipsisLoc;
3852 SourceLocation RParenLoc;
3853 Stmt *SubExprs[2];
3854 BinaryOperatorKind Opcode;
3855
3856 friend class ASTStmtReader;
3857 friend class ASTStmtWriter;
3858 public:
CXXFoldExpr(QualType T,SourceLocation LParenLoc,Expr * LHS,BinaryOperatorKind Opcode,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation RParenLoc)3859 CXXFoldExpr(QualType T, SourceLocation LParenLoc, Expr *LHS,
3860 BinaryOperatorKind Opcode, SourceLocation EllipsisLoc, Expr *RHS,
3861 SourceLocation RParenLoc)
3862 : Expr(CXXFoldExprClass, T, VK_RValue, OK_Ordinary,
3863 /*Dependent*/ true, true, true,
3864 /*ContainsUnexpandedParameterPack*/ false),
3865 LParenLoc(LParenLoc), EllipsisLoc(EllipsisLoc), RParenLoc(RParenLoc),
3866 Opcode(Opcode) {
3867 SubExprs[0] = LHS;
3868 SubExprs[1] = RHS;
3869 }
CXXFoldExpr(EmptyShell Empty)3870 CXXFoldExpr(EmptyShell Empty) : Expr(CXXFoldExprClass, Empty) {}
3871
getLHS()3872 Expr *getLHS() const { return static_cast<Expr*>(SubExprs[0]); }
getRHS()3873 Expr *getRHS() const { return static_cast<Expr*>(SubExprs[1]); }
3874
3875 /// Does this produce a right-associated sequence of operators?
isRightFold()3876 bool isRightFold() const {
3877 return getLHS() && getLHS()->containsUnexpandedParameterPack();
3878 }
3879 /// Does this produce a left-associated sequence of operators?
isLeftFold()3880 bool isLeftFold() const { return !isRightFold(); }
3881 /// Get the pattern, that is, the operand that contains an unexpanded pack.
getPattern()3882 Expr *getPattern() const { return isLeftFold() ? getRHS() : getLHS(); }
3883 /// Get the operand that doesn't contain a pack, for a binary fold.
getInit()3884 Expr *getInit() const { return isLeftFold() ? getLHS() : getRHS(); }
3885
getEllipsisLoc()3886 SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
getOperator()3887 BinaryOperatorKind getOperator() const { return Opcode; }
3888
getLocStart()3889 SourceLocation getLocStart() const LLVM_READONLY {
3890 return LParenLoc;
3891 }
getLocEnd()3892 SourceLocation getLocEnd() const LLVM_READONLY {
3893 return RParenLoc;
3894 }
3895
classof(const Stmt * T)3896 static bool classof(const Stmt *T) {
3897 return T->getStmtClass() == CXXFoldExprClass;
3898 }
3899
3900 // Iterators
children()3901 child_range children() { return child_range(SubExprs, SubExprs + 2); }
3902 };
3903
3904 } // end namespace clang
3905
3906 #endif
3907