1 //===- ScopeInfo.h - Information about a semantic context -------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines FunctionScopeInfo and its subclasses, which contain
11 // information about a single function, block, lambda, or method body.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_CLANG_SEMA_SCOPEINFO_H
16 #define LLVM_CLANG_SEMA_SCOPEINFO_H
17
18 #include "clang/AST/Expr.h"
19 #include "clang/AST/Type.h"
20 #include "clang/Basic/CapturedStmt.h"
21 #include "clang/Basic/LLVM.h"
22 #include "clang/Basic/PartialDiagnostic.h"
23 #include "clang/Basic/SourceLocation.h"
24 #include "clang/Sema/CleanupInfo.h"
25 #include "llvm/ADT/DenseMap.h"
26 #include "llvm/ADT/DenseMapInfo.h"
27 #include "llvm/ADT/MapVector.h"
28 #include "llvm/ADT/PointerIntPair.h"
29 #include "llvm/ADT/SmallPtrSet.h"
30 #include "llvm/ADT/SmallSet.h"
31 #include "llvm/ADT/SmallVector.h"
32 #include "llvm/ADT/StringRef.h"
33 #include "llvm/ADT/StringSwitch.h"
34 #include "llvm/ADT/TinyPtrVector.h"
35 #include "llvm/Support/Casting.h"
36 #include "llvm/Support/ErrorHandling.h"
37 #include <algorithm>
38 #include <cassert>
39 #include <utility>
40
41 namespace clang {
42
43 class BlockDecl;
44 class CapturedDecl;
45 class CXXMethodDecl;
46 class CXXRecordDecl;
47 class ImplicitParamDecl;
48 class NamedDecl;
49 class ObjCIvarRefExpr;
50 class ObjCMessageExpr;
51 class ObjCPropertyDecl;
52 class ObjCPropertyRefExpr;
53 class ParmVarDecl;
54 class RecordDecl;
55 class ReturnStmt;
56 class Scope;
57 class Stmt;
58 class SwitchStmt;
59 class TemplateParameterList;
60 class TemplateTypeParmDecl;
61 class VarDecl;
62
63 namespace sema {
64
65 /// Contains information about the compound statement currently being
66 /// parsed.
67 class CompoundScopeInfo {
68 public:
69 /// Whether this compound stamement contains `for' or `while' loops
70 /// with empty bodies.
71 bool HasEmptyLoopBodies = false;
72
73 /// Whether this compound statement corresponds to a GNU statement
74 /// expression.
75 bool IsStmtExpr;
76
CompoundScopeInfo(bool IsStmtExpr)77 CompoundScopeInfo(bool IsStmtExpr) : IsStmtExpr(IsStmtExpr) {}
78
setHasEmptyLoopBodies()79 void setHasEmptyLoopBodies() {
80 HasEmptyLoopBodies = true;
81 }
82 };
83
84 class PossiblyUnreachableDiag {
85 public:
86 PartialDiagnostic PD;
87 SourceLocation Loc;
88 const Stmt *stmt;
89
PossiblyUnreachableDiag(const PartialDiagnostic & PD,SourceLocation Loc,const Stmt * stmt)90 PossiblyUnreachableDiag(const PartialDiagnostic &PD, SourceLocation Loc,
91 const Stmt *stmt)
92 : PD(PD), Loc(Loc), stmt(stmt) {}
93 };
94
95 /// Retains information about a function, method, or block that is
96 /// currently being parsed.
97 class FunctionScopeInfo {
98 protected:
99 enum ScopeKind {
100 SK_Function,
101 SK_Block,
102 SK_Lambda,
103 SK_CapturedRegion
104 };
105
106 public:
107 /// What kind of scope we are describing.
108 ScopeKind Kind : 3;
109
110 /// Whether this function contains a VLA, \@try, try, C++
111 /// initializer, or anything else that can't be jumped past.
112 bool HasBranchProtectedScope : 1;
113
114 /// Whether this function contains any switches or direct gotos.
115 bool HasBranchIntoScope : 1;
116
117 /// Whether this function contains any indirect gotos.
118 bool HasIndirectGoto : 1;
119
120 /// Whether a statement was dropped because it was invalid.
121 bool HasDroppedStmt : 1;
122
123 /// True if current scope is for OpenMP declare reduction combiner.
124 bool HasOMPDeclareReductionCombiner : 1;
125
126 /// Whether there is a fallthrough statement in this function.
127 bool HasFallthroughStmt : 1;
128
129 /// Whether we make reference to a declaration that could be
130 /// unavailable.
131 bool HasPotentialAvailabilityViolations : 1;
132
133 /// A flag that is set when parsing a method that must call super's
134 /// implementation, such as \c -dealloc, \c -finalize, or any method marked
135 /// with \c __attribute__((objc_requires_super)).
136 bool ObjCShouldCallSuper : 1;
137
138 /// True when this is a method marked as a designated initializer.
139 bool ObjCIsDesignatedInit : 1;
140
141 /// This starts true for a method marked as designated initializer and will
142 /// be set to false if there is an invocation to a designated initializer of
143 /// the super class.
144 bool ObjCWarnForNoDesignatedInitChain : 1;
145
146 /// True when this is an initializer method not marked as a designated
147 /// initializer within a class that has at least one initializer marked as a
148 /// designated initializer.
149 bool ObjCIsSecondaryInit : 1;
150
151 /// This starts true for a secondary initializer method and will be set to
152 /// false if there is an invocation of an initializer on 'self'.
153 bool ObjCWarnForNoInitDelegation : 1;
154
155 /// True only when this function has not already built, or attempted
156 /// to build, the initial and final coroutine suspend points
157 bool NeedsCoroutineSuspends : 1;
158
159 /// An enumeration represeting the kind of the first coroutine statement
160 /// in the function. One of co_return, co_await, or co_yield.
161 unsigned char FirstCoroutineStmtKind : 2;
162
163 /// First coroutine statement in the current function.
164 /// (ex co_return, co_await, co_yield)
165 SourceLocation FirstCoroutineStmtLoc;
166
167 /// First 'return' statement in the current function.
168 SourceLocation FirstReturnLoc;
169
170 /// First C++ 'try' statement in the current function.
171 SourceLocation FirstCXXTryLoc;
172
173 /// First SEH '__try' statement in the current function.
174 SourceLocation FirstSEHTryLoc;
175
176 /// Used to determine if errors occurred in this function or block.
177 DiagnosticErrorTrap ErrorTrap;
178
179 /// A SwitchStmt, along with a flag indicating if its list of case statements
180 /// is incomplete (because we dropped an invalid one while parsing).
181 using SwitchInfo = llvm::PointerIntPair<SwitchStmt*, 1, bool>;
182
183 /// SwitchStack - This is the current set of active switch statements in the
184 /// block.
185 SmallVector<SwitchInfo, 8> SwitchStack;
186
187 /// The list of return statements that occur within the function or
188 /// block, if there is any chance of applying the named return value
189 /// optimization, or if we need to infer a return type.
190 SmallVector<ReturnStmt*, 4> Returns;
191
192 /// The promise object for this coroutine, if any.
193 VarDecl *CoroutinePromise = nullptr;
194
195 /// A mapping between the coroutine function parameters that were moved
196 /// to the coroutine frame, and their move statements.
197 llvm::SmallMapVector<ParmVarDecl *, Stmt *, 4> CoroutineParameterMoves;
198
199 /// The initial and final coroutine suspend points.
200 std::pair<Stmt *, Stmt *> CoroutineSuspends;
201
202 /// The stack of currently active compound stamement scopes in the
203 /// function.
204 SmallVector<CompoundScopeInfo, 4> CompoundScopes;
205
206 /// The set of blocks that are introduced in this function.
207 llvm::SmallPtrSet<const BlockDecl *, 1> Blocks;
208
209 /// The set of __block variables that are introduced in this function.
210 llvm::TinyPtrVector<VarDecl *> ByrefBlockVars;
211
212 /// A list of PartialDiagnostics created but delayed within the
213 /// current function scope. These diagnostics are vetted for reachability
214 /// prior to being emitted.
215 SmallVector<PossiblyUnreachableDiag, 4> PossiblyUnreachableDiags;
216
217 /// A list of parameters which have the nonnull attribute and are
218 /// modified in the function.
219 llvm::SmallPtrSet<const ParmVarDecl *, 8> ModifiedNonNullParams;
220
221 public:
222 /// Represents a simple identification of a weak object.
223 ///
224 /// Part of the implementation of -Wrepeated-use-of-weak.
225 ///
226 /// This is used to determine if two weak accesses refer to the same object.
227 /// Here are some examples of how various accesses are "profiled":
228 ///
229 /// Access Expression | "Base" Decl | "Property" Decl
230 /// :---------------: | :-----------------: | :------------------------------:
231 /// self.property | self (VarDecl) | property (ObjCPropertyDecl)
232 /// self.implicitProp | self (VarDecl) | -implicitProp (ObjCMethodDecl)
233 /// self->ivar.prop | ivar (ObjCIvarDecl) | prop (ObjCPropertyDecl)
234 /// cxxObj.obj.prop | obj (FieldDecl) | prop (ObjCPropertyDecl)
235 /// [self foo].prop | 0 (unknown) | prop (ObjCPropertyDecl)
236 /// self.prop1.prop2 | prop1 (ObjCPropertyDecl) | prop2 (ObjCPropertyDecl)
237 /// MyClass.prop | MyClass (ObjCInterfaceDecl) | -prop (ObjCMethodDecl)
238 /// MyClass.foo.prop | +foo (ObjCMethodDecl) | -prop (ObjCPropertyDecl)
239 /// weakVar | 0 (known) | weakVar (VarDecl)
240 /// self->weakIvar | self (VarDecl) | weakIvar (ObjCIvarDecl)
241 ///
242 /// Objects are identified with only two Decls to make it reasonably fast to
243 /// compare them.
244 class WeakObjectProfileTy {
245 /// The base object decl, as described in the class documentation.
246 ///
247 /// The extra flag is "true" if the Base and Property are enough to uniquely
248 /// identify the object in memory.
249 ///
250 /// \sa isExactProfile()
251 using BaseInfoTy = llvm::PointerIntPair<const NamedDecl *, 1, bool>;
252 BaseInfoTy Base;
253
254 /// The "property" decl, as described in the class documentation.
255 ///
256 /// Note that this may not actually be an ObjCPropertyDecl, e.g. in the
257 /// case of "implicit" properties (regular methods accessed via dot syntax).
258 const NamedDecl *Property = nullptr;
259
260 /// Used to find the proper base profile for a given base expression.
261 static BaseInfoTy getBaseInfo(const Expr *BaseE);
262
263 inline WeakObjectProfileTy();
264 static inline WeakObjectProfileTy getSentinel();
265
266 public:
267 WeakObjectProfileTy(const ObjCPropertyRefExpr *RE);
268 WeakObjectProfileTy(const Expr *Base, const ObjCPropertyDecl *Property);
269 WeakObjectProfileTy(const DeclRefExpr *RE);
270 WeakObjectProfileTy(const ObjCIvarRefExpr *RE);
271
getBase()272 const NamedDecl *getBase() const { return Base.getPointer(); }
getProperty()273 const NamedDecl *getProperty() const { return Property; }
274
275 /// Returns true if the object base specifies a known object in memory,
276 /// rather than, say, an instance variable or property of another object.
277 ///
278 /// Note that this ignores the effects of aliasing; that is, \c foo.bar is
279 /// considered an exact profile if \c foo is a local variable, even if
280 /// another variable \c foo2 refers to the same object as \c foo.
281 ///
282 /// For increased precision, accesses with base variables that are
283 /// properties or ivars of 'self' (e.g. self.prop1.prop2) are considered to
284 /// be exact, though this is not true for arbitrary variables
285 /// (foo.prop1.prop2).
isExactProfile()286 bool isExactProfile() const {
287 return Base.getInt();
288 }
289
290 bool operator==(const WeakObjectProfileTy &Other) const {
291 return Base == Other.Base && Property == Other.Property;
292 }
293
294 // For use in DenseMap.
295 // We can't specialize the usual llvm::DenseMapInfo at the end of the file
296 // because by that point the DenseMap in FunctionScopeInfo has already been
297 // instantiated.
298 class DenseMapInfo {
299 public:
getEmptyKey()300 static inline WeakObjectProfileTy getEmptyKey() {
301 return WeakObjectProfileTy();
302 }
303
getTombstoneKey()304 static inline WeakObjectProfileTy getTombstoneKey() {
305 return WeakObjectProfileTy::getSentinel();
306 }
307
getHashValue(const WeakObjectProfileTy & Val)308 static unsigned getHashValue(const WeakObjectProfileTy &Val) {
309 using Pair = std::pair<BaseInfoTy, const NamedDecl *>;
310
311 return llvm::DenseMapInfo<Pair>::getHashValue(Pair(Val.Base,
312 Val.Property));
313 }
314
isEqual(const WeakObjectProfileTy & LHS,const WeakObjectProfileTy & RHS)315 static bool isEqual(const WeakObjectProfileTy &LHS,
316 const WeakObjectProfileTy &RHS) {
317 return LHS == RHS;
318 }
319 };
320 };
321
322 /// Represents a single use of a weak object.
323 ///
324 /// Stores both the expression and whether the access is potentially unsafe
325 /// (i.e. it could potentially be warned about).
326 ///
327 /// Part of the implementation of -Wrepeated-use-of-weak.
328 class WeakUseTy {
329 llvm::PointerIntPair<const Expr *, 1, bool> Rep;
330
331 public:
WeakUseTy(const Expr * Use,bool IsRead)332 WeakUseTy(const Expr *Use, bool IsRead) : Rep(Use, IsRead) {}
333
getUseExpr()334 const Expr *getUseExpr() const { return Rep.getPointer(); }
isUnsafe()335 bool isUnsafe() const { return Rep.getInt(); }
markSafe()336 void markSafe() { Rep.setInt(false); }
337
338 bool operator==(const WeakUseTy &Other) const {
339 return Rep == Other.Rep;
340 }
341 };
342
343 /// Used to collect uses of a particular weak object in a function body.
344 ///
345 /// Part of the implementation of -Wrepeated-use-of-weak.
346 using WeakUseVector = SmallVector<WeakUseTy, 4>;
347
348 /// Used to collect all uses of weak objects in a function body.
349 ///
350 /// Part of the implementation of -Wrepeated-use-of-weak.
351 using WeakObjectUseMap =
352 llvm::SmallDenseMap<WeakObjectProfileTy, WeakUseVector, 8,
353 WeakObjectProfileTy::DenseMapInfo>;
354
355 private:
356 /// Used to collect all uses of weak objects in this function body.
357 ///
358 /// Part of the implementation of -Wrepeated-use-of-weak.
359 WeakObjectUseMap WeakObjectUses;
360
361 protected:
362 FunctionScopeInfo(const FunctionScopeInfo&) = default;
363
364 public:
FunctionScopeInfo(DiagnosticsEngine & Diag)365 FunctionScopeInfo(DiagnosticsEngine &Diag)
366 : Kind(SK_Function), HasBranchProtectedScope(false),
367 HasBranchIntoScope(false), HasIndirectGoto(false),
368 HasDroppedStmt(false), HasOMPDeclareReductionCombiner(false),
369 HasFallthroughStmt(false), HasPotentialAvailabilityViolations(false),
370 ObjCShouldCallSuper(false), ObjCIsDesignatedInit(false),
371 ObjCWarnForNoDesignatedInitChain(false), ObjCIsSecondaryInit(false),
372 ObjCWarnForNoInitDelegation(false), NeedsCoroutineSuspends(true),
373 ErrorTrap(Diag) {}
374
375 virtual ~FunctionScopeInfo();
376
377 /// Record that a weak object was accessed.
378 ///
379 /// Part of the implementation of -Wrepeated-use-of-weak.
380 template <typename ExprT>
381 inline void recordUseOfWeak(const ExprT *E, bool IsRead = true);
382
383 void recordUseOfWeak(const ObjCMessageExpr *Msg,
384 const ObjCPropertyDecl *Prop);
385
386 /// Record that a given expression is a "safe" access of a weak object (e.g.
387 /// assigning it to a strong variable.)
388 ///
389 /// Part of the implementation of -Wrepeated-use-of-weak.
390 void markSafeWeakUse(const Expr *E);
391
getWeakObjectUses()392 const WeakObjectUseMap &getWeakObjectUses() const {
393 return WeakObjectUses;
394 }
395
setHasBranchIntoScope()396 void setHasBranchIntoScope() {
397 HasBranchIntoScope = true;
398 }
399
setHasBranchProtectedScope()400 void setHasBranchProtectedScope() {
401 HasBranchProtectedScope = true;
402 }
403
setHasIndirectGoto()404 void setHasIndirectGoto() {
405 HasIndirectGoto = true;
406 }
407
setHasDroppedStmt()408 void setHasDroppedStmt() {
409 HasDroppedStmt = true;
410 }
411
setHasOMPDeclareReductionCombiner()412 void setHasOMPDeclareReductionCombiner() {
413 HasOMPDeclareReductionCombiner = true;
414 }
415
setHasFallthroughStmt()416 void setHasFallthroughStmt() {
417 HasFallthroughStmt = true;
418 }
419
setHasCXXTry(SourceLocation TryLoc)420 void setHasCXXTry(SourceLocation TryLoc) {
421 setHasBranchProtectedScope();
422 FirstCXXTryLoc = TryLoc;
423 }
424
setHasSEHTry(SourceLocation TryLoc)425 void setHasSEHTry(SourceLocation TryLoc) {
426 setHasBranchProtectedScope();
427 FirstSEHTryLoc = TryLoc;
428 }
429
NeedsScopeChecking()430 bool NeedsScopeChecking() const {
431 return !HasDroppedStmt &&
432 (HasIndirectGoto ||
433 (HasBranchProtectedScope && HasBranchIntoScope));
434 }
435
436 // Add a block introduced in this function.
addBlock(const BlockDecl * BD)437 void addBlock(const BlockDecl *BD) {
438 Blocks.insert(BD);
439 }
440
441 // Add a __block variable introduced in this function.
addByrefBlockVar(VarDecl * VD)442 void addByrefBlockVar(VarDecl *VD) {
443 ByrefBlockVars.push_back(VD);
444 }
445
isCoroutine()446 bool isCoroutine() const { return !FirstCoroutineStmtLoc.isInvalid(); }
447
setFirstCoroutineStmt(SourceLocation Loc,StringRef Keyword)448 void setFirstCoroutineStmt(SourceLocation Loc, StringRef Keyword) {
449 assert(FirstCoroutineStmtLoc.isInvalid() &&
450 "first coroutine statement location already set");
451 FirstCoroutineStmtLoc = Loc;
452 FirstCoroutineStmtKind = llvm::StringSwitch<unsigned char>(Keyword)
453 .Case("co_return", 0)
454 .Case("co_await", 1)
455 .Case("co_yield", 2);
456 }
457
getFirstCoroutineStmtKeyword()458 StringRef getFirstCoroutineStmtKeyword() const {
459 assert(FirstCoroutineStmtLoc.isValid()
460 && "no coroutine statement available");
461 switch (FirstCoroutineStmtKind) {
462 case 0: return "co_return";
463 case 1: return "co_await";
464 case 2: return "co_yield";
465 default:
466 llvm_unreachable("FirstCoroutineStmtKind has an invalid value");
467 };
468 }
469
470 void setNeedsCoroutineSuspends(bool value = true) {
471 assert((!value || CoroutineSuspends.first == nullptr) &&
472 "we already have valid suspend points");
473 NeedsCoroutineSuspends = value;
474 }
475
hasInvalidCoroutineSuspends()476 bool hasInvalidCoroutineSuspends() const {
477 return !NeedsCoroutineSuspends && CoroutineSuspends.first == nullptr;
478 }
479
setCoroutineSuspends(Stmt * Initial,Stmt * Final)480 void setCoroutineSuspends(Stmt *Initial, Stmt *Final) {
481 assert(Initial && Final && "suspend points cannot be null");
482 assert(CoroutineSuspends.first == nullptr && "suspend points already set");
483 NeedsCoroutineSuspends = false;
484 CoroutineSuspends.first = Initial;
485 CoroutineSuspends.second = Final;
486 }
487
488 /// Clear out the information in this function scope, making it
489 /// suitable for reuse.
490 void Clear();
491 };
492
493 class Capture {
494 // There are three categories of capture: capturing 'this', capturing
495 // local variables, and C++1y initialized captures (which can have an
496 // arbitrary initializer, and don't really capture in the traditional
497 // sense at all).
498 //
499 // There are three ways to capture a local variable:
500 // - capture by copy in the C++11 sense,
501 // - capture by reference in the C++11 sense, and
502 // - __block capture.
503 // Lambdas explicitly specify capture by copy or capture by reference.
504 // For blocks, __block capture applies to variables with that annotation,
505 // variables of reference type are captured by reference, and other
506 // variables are captured by copy.
507 enum CaptureKind {
508 Cap_ByCopy, Cap_ByRef, Cap_Block, Cap_VLA
509 };
510 enum {
511 IsNestedCapture = 0x1,
512 IsThisCaptured = 0x2
513 };
514
515 /// The variable being captured (if we are not capturing 'this') and whether
516 /// this is a nested capture, and whether we are capturing 'this'
517 llvm::PointerIntPair<VarDecl*, 2> VarAndNestedAndThis;
518
519 /// Expression to initialize a field of the given type, and the kind of
520 /// capture (if this is a capture and not an init-capture). The expression
521 /// is only required if we are capturing ByVal and the variable's type has
522 /// a non-trivial copy constructor.
523 llvm::PointerIntPair<void *, 2, CaptureKind> InitExprAndCaptureKind;
524
525 /// The source location at which the first capture occurred.
526 SourceLocation Loc;
527
528 /// The location of the ellipsis that expands a parameter pack.
529 SourceLocation EllipsisLoc;
530
531 /// The type as it was captured, which is in effect the type of the
532 /// non-static data member that would hold the capture.
533 QualType CaptureType;
534
535 /// Whether an explicit capture has been odr-used in the body of the
536 /// lambda.
537 bool ODRUsed = false;
538
539 /// Whether an explicit capture has been non-odr-used in the body of
540 /// the lambda.
541 bool NonODRUsed = false;
542
543 public:
Capture(VarDecl * Var,bool Block,bool ByRef,bool IsNested,SourceLocation Loc,SourceLocation EllipsisLoc,QualType CaptureType,Expr * Cpy)544 Capture(VarDecl *Var, bool Block, bool ByRef, bool IsNested,
545 SourceLocation Loc, SourceLocation EllipsisLoc,
546 QualType CaptureType, Expr *Cpy)
547 : VarAndNestedAndThis(Var, IsNested ? IsNestedCapture : 0),
548 InitExprAndCaptureKind(
549 Cpy, !Var ? Cap_VLA : Block ? Cap_Block : ByRef ? Cap_ByRef
550 : Cap_ByCopy),
551 Loc(Loc), EllipsisLoc(EllipsisLoc), CaptureType(CaptureType) {}
552
553 enum IsThisCapture { ThisCapture };
Capture(IsThisCapture,bool IsNested,SourceLocation Loc,QualType CaptureType,Expr * Cpy,const bool ByCopy)554 Capture(IsThisCapture, bool IsNested, SourceLocation Loc,
555 QualType CaptureType, Expr *Cpy, const bool ByCopy)
556 : VarAndNestedAndThis(
557 nullptr, (IsThisCaptured | (IsNested ? IsNestedCapture : 0))),
558 InitExprAndCaptureKind(Cpy, ByCopy ? Cap_ByCopy : Cap_ByRef),
559 Loc(Loc), CaptureType(CaptureType) {}
560
isThisCapture()561 bool isThisCapture() const {
562 return VarAndNestedAndThis.getInt() & IsThisCaptured;
563 }
564
isVariableCapture()565 bool isVariableCapture() const {
566 return !isThisCapture() && !isVLATypeCapture();
567 }
568
isCopyCapture()569 bool isCopyCapture() const {
570 return InitExprAndCaptureKind.getInt() == Cap_ByCopy;
571 }
572
isReferenceCapture()573 bool isReferenceCapture() const {
574 return InitExprAndCaptureKind.getInt() == Cap_ByRef;
575 }
576
isBlockCapture()577 bool isBlockCapture() const {
578 return InitExprAndCaptureKind.getInt() == Cap_Block;
579 }
580
isVLATypeCapture()581 bool isVLATypeCapture() const {
582 return InitExprAndCaptureKind.getInt() == Cap_VLA;
583 }
584
isNested()585 bool isNested() const {
586 return VarAndNestedAndThis.getInt() & IsNestedCapture;
587 }
588
isODRUsed()589 bool isODRUsed() const { return ODRUsed; }
isNonODRUsed()590 bool isNonODRUsed() const { return NonODRUsed; }
markUsed(bool IsODRUse)591 void markUsed(bool IsODRUse) { (IsODRUse ? ODRUsed : NonODRUsed) = true; }
592
getVariable()593 VarDecl *getVariable() const {
594 assert(isVariableCapture());
595 return VarAndNestedAndThis.getPointer();
596 }
597
598 /// Retrieve the location at which this variable was captured.
getLocation()599 SourceLocation getLocation() const { return Loc; }
600
601 /// Retrieve the source location of the ellipsis, whose presence
602 /// indicates that the capture is a pack expansion.
getEllipsisLoc()603 SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
604
605 /// Retrieve the capture type for this capture, which is effectively
606 /// the type of the non-static data member in the lambda/block structure
607 /// that would store this capture.
getCaptureType()608 QualType getCaptureType() const {
609 assert(!isThisCapture());
610 return CaptureType;
611 }
612
getInitExpr()613 Expr *getInitExpr() const {
614 assert(!isVLATypeCapture() && "no init expression for type capture");
615 return static_cast<Expr *>(InitExprAndCaptureKind.getPointer());
616 }
617 };
618
619 class CapturingScopeInfo : public FunctionScopeInfo {
620 protected:
621 CapturingScopeInfo(const CapturingScopeInfo&) = default;
622
623 public:
624 enum ImplicitCaptureStyle {
625 ImpCap_None, ImpCap_LambdaByval, ImpCap_LambdaByref, ImpCap_Block,
626 ImpCap_CapturedRegion
627 };
628
629 ImplicitCaptureStyle ImpCaptureStyle;
630
CapturingScopeInfo(DiagnosticsEngine & Diag,ImplicitCaptureStyle Style)631 CapturingScopeInfo(DiagnosticsEngine &Diag, ImplicitCaptureStyle Style)
632 : FunctionScopeInfo(Diag), ImpCaptureStyle(Style) {}
633
634 /// CaptureMap - A map of captured variables to (index+1) into Captures.
635 llvm::DenseMap<VarDecl*, unsigned> CaptureMap;
636
637 /// CXXThisCaptureIndex - The (index+1) of the capture of 'this';
638 /// zero if 'this' is not captured.
639 unsigned CXXThisCaptureIndex = 0;
640
641 /// Captures - The captures.
642 SmallVector<Capture, 4> Captures;
643
644 /// - Whether the target type of return statements in this context
645 /// is deduced (e.g. a lambda or block with omitted return type).
646 bool HasImplicitReturnType = false;
647
648 /// ReturnType - The target type of return statements in this context,
649 /// or null if unknown.
650 QualType ReturnType;
651
addCapture(VarDecl * Var,bool isBlock,bool isByref,bool isNested,SourceLocation Loc,SourceLocation EllipsisLoc,QualType CaptureType,Expr * Cpy)652 void addCapture(VarDecl *Var, bool isBlock, bool isByref, bool isNested,
653 SourceLocation Loc, SourceLocation EllipsisLoc,
654 QualType CaptureType, Expr *Cpy) {
655 Captures.push_back(Capture(Var, isBlock, isByref, isNested, Loc,
656 EllipsisLoc, CaptureType, Cpy));
657 CaptureMap[Var] = Captures.size();
658 }
659
addVLATypeCapture(SourceLocation Loc,QualType CaptureType)660 void addVLATypeCapture(SourceLocation Loc, QualType CaptureType) {
661 Captures.push_back(Capture(/*Var*/ nullptr, /*isBlock*/ false,
662 /*isByref*/ false, /*isNested*/ false, Loc,
663 /*EllipsisLoc*/ SourceLocation(), CaptureType,
664 /*Cpy*/ nullptr));
665 }
666
667 // Note, we do not need to add the type of 'this' since that is always
668 // retrievable from Sema::getCurrentThisType - and is also encoded within the
669 // type of the corresponding FieldDecl.
670 void addThisCapture(bool isNested, SourceLocation Loc,
671 Expr *Cpy, bool ByCopy);
672
673 /// Determine whether the C++ 'this' is captured.
isCXXThisCaptured()674 bool isCXXThisCaptured() const { return CXXThisCaptureIndex != 0; }
675
676 /// Retrieve the capture of C++ 'this', if it has been captured.
getCXXThisCapture()677 Capture &getCXXThisCapture() {
678 assert(isCXXThisCaptured() && "this has not been captured");
679 return Captures[CXXThisCaptureIndex - 1];
680 }
681
682 /// Determine whether the given variable has been captured.
isCaptured(VarDecl * Var)683 bool isCaptured(VarDecl *Var) const {
684 return CaptureMap.count(Var);
685 }
686
687 /// Determine whether the given variable-array type has been captured.
688 bool isVLATypeCaptured(const VariableArrayType *VAT) const;
689
690 /// Retrieve the capture of the given variable, if it has been
691 /// captured already.
getCapture(VarDecl * Var)692 Capture &getCapture(VarDecl *Var) {
693 assert(isCaptured(Var) && "Variable has not been captured");
694 return Captures[CaptureMap[Var] - 1];
695 }
696
getCapture(VarDecl * Var)697 const Capture &getCapture(VarDecl *Var) const {
698 llvm::DenseMap<VarDecl*, unsigned>::const_iterator Known
699 = CaptureMap.find(Var);
700 assert(Known != CaptureMap.end() && "Variable has not been captured");
701 return Captures[Known->second - 1];
702 }
703
classof(const FunctionScopeInfo * FSI)704 static bool classof(const FunctionScopeInfo *FSI) {
705 return FSI->Kind == SK_Block || FSI->Kind == SK_Lambda
706 || FSI->Kind == SK_CapturedRegion;
707 }
708 };
709
710 /// Retains information about a block that is currently being parsed.
711 class BlockScopeInfo final : public CapturingScopeInfo {
712 public:
713 BlockDecl *TheDecl;
714
715 /// TheScope - This is the scope for the block itself, which contains
716 /// arguments etc.
717 Scope *TheScope;
718
719 /// BlockType - The function type of the block, if one was given.
720 /// Its return type may be BuiltinType::Dependent.
721 QualType FunctionType;
722
BlockScopeInfo(DiagnosticsEngine & Diag,Scope * BlockScope,BlockDecl * Block)723 BlockScopeInfo(DiagnosticsEngine &Diag, Scope *BlockScope, BlockDecl *Block)
724 : CapturingScopeInfo(Diag, ImpCap_Block), TheDecl(Block),
725 TheScope(BlockScope) {
726 Kind = SK_Block;
727 }
728
729 ~BlockScopeInfo() override;
730
classof(const FunctionScopeInfo * FSI)731 static bool classof(const FunctionScopeInfo *FSI) {
732 return FSI->Kind == SK_Block;
733 }
734 };
735
736 /// Retains information about a captured region.
737 class CapturedRegionScopeInfo final : public CapturingScopeInfo {
738 public:
739 /// The CapturedDecl for this statement.
740 CapturedDecl *TheCapturedDecl;
741
742 /// The captured record type.
743 RecordDecl *TheRecordDecl;
744
745 /// This is the enclosing scope of the captured region.
746 Scope *TheScope;
747
748 /// The implicit parameter for the captured variables.
749 ImplicitParamDecl *ContextParam;
750
751 /// The kind of captured region.
752 unsigned short CapRegionKind;
753
754 unsigned short OpenMPLevel;
755
CapturedRegionScopeInfo(DiagnosticsEngine & Diag,Scope * S,CapturedDecl * CD,RecordDecl * RD,ImplicitParamDecl * Context,CapturedRegionKind K,unsigned OpenMPLevel)756 CapturedRegionScopeInfo(DiagnosticsEngine &Diag, Scope *S, CapturedDecl *CD,
757 RecordDecl *RD, ImplicitParamDecl *Context,
758 CapturedRegionKind K, unsigned OpenMPLevel)
759 : CapturingScopeInfo(Diag, ImpCap_CapturedRegion),
760 TheCapturedDecl(CD), TheRecordDecl(RD), TheScope(S),
761 ContextParam(Context), CapRegionKind(K), OpenMPLevel(OpenMPLevel) {
762 Kind = SK_CapturedRegion;
763 }
764
765 ~CapturedRegionScopeInfo() override;
766
767 /// A descriptive name for the kind of captured region this is.
getRegionName()768 StringRef getRegionName() const {
769 switch (CapRegionKind) {
770 case CR_Default:
771 return "default captured statement";
772 case CR_ObjCAtFinally:
773 return "Objective-C @finally statement";
774 case CR_OpenMP:
775 return "OpenMP region";
776 }
777 llvm_unreachable("Invalid captured region kind!");
778 }
779
classof(const FunctionScopeInfo * FSI)780 static bool classof(const FunctionScopeInfo *FSI) {
781 return FSI->Kind == SK_CapturedRegion;
782 }
783 };
784
785 class LambdaScopeInfo final : public CapturingScopeInfo {
786 public:
787 /// The class that describes the lambda.
788 CXXRecordDecl *Lambda = nullptr;
789
790 /// The lambda's compiler-generated \c operator().
791 CXXMethodDecl *CallOperator = nullptr;
792
793 /// Source range covering the lambda introducer [...].
794 SourceRange IntroducerRange;
795
796 /// Source location of the '&' or '=' specifying the default capture
797 /// type, if any.
798 SourceLocation CaptureDefaultLoc;
799
800 /// The number of captures in the \c Captures list that are
801 /// explicit captures.
802 unsigned NumExplicitCaptures = 0;
803
804 /// Whether this is a mutable lambda.
805 bool Mutable = false;
806
807 /// Whether the (empty) parameter list is explicit.
808 bool ExplicitParams = false;
809
810 /// Whether any of the capture expressions requires cleanups.
811 CleanupInfo Cleanup;
812
813 /// Whether the lambda contains an unexpanded parameter pack.
814 bool ContainsUnexpandedParameterPack = false;
815
816 /// If this is a generic lambda, use this as the depth of
817 /// each 'auto' parameter, during initial AST construction.
818 unsigned AutoTemplateParameterDepth = 0;
819
820 /// Store the list of the auto parameters for a generic lambda.
821 /// If this is a generic lambda, store the list of the auto
822 /// parameters converted into TemplateTypeParmDecls into a vector
823 /// that can be used to construct the generic lambda's template
824 /// parameter list, during initial AST construction.
825 SmallVector<TemplateTypeParmDecl*, 4> AutoTemplateParams;
826
827 /// If this is a generic lambda, and the template parameter
828 /// list has been created (from the AutoTemplateParams) then
829 /// store a reference to it (cache it to avoid reconstructing it).
830 TemplateParameterList *GLTemplateParameterList = nullptr;
831
832 /// Contains all variable-referring-expressions (i.e. DeclRefExprs
833 /// or MemberExprs) that refer to local variables in a generic lambda
834 /// or a lambda in a potentially-evaluated-if-used context.
835 ///
836 /// Potentially capturable variables of a nested lambda that might need
837 /// to be captured by the lambda are housed here.
838 /// This is specifically useful for generic lambdas or
839 /// lambdas within a potentially evaluated-if-used context.
840 /// If an enclosing variable is named in an expression of a lambda nested
841 /// within a generic lambda, we don't always know know whether the variable
842 /// will truly be odr-used (i.e. need to be captured) by that nested lambda,
843 /// until its instantiation. But we still need to capture it in the
844 /// enclosing lambda if all intervening lambdas can capture the variable.
845 llvm::SmallVector<Expr*, 4> PotentiallyCapturingExprs;
846
847 /// Contains all variable-referring-expressions that refer
848 /// to local variables that are usable as constant expressions and
849 /// do not involve an odr-use (they may still need to be captured
850 /// if the enclosing full-expression is instantiation dependent).
851 llvm::SmallSet<Expr *, 8> NonODRUsedCapturingExprs;
852
853 /// A map of explicit capture indices to their introducer source ranges.
854 llvm::DenseMap<unsigned, SourceRange> ExplicitCaptureRanges;
855
856 /// Contains all of the variables defined in this lambda that shadow variables
857 /// that were defined in parent contexts. Used to avoid warnings when the
858 /// shadowed variables are uncaptured by this lambda.
859 struct ShadowedOuterDecl {
860 const VarDecl *VD;
861 const VarDecl *ShadowedDecl;
862 };
863 llvm::SmallVector<ShadowedOuterDecl, 4> ShadowingDecls;
864
865 SourceLocation PotentialThisCaptureLocation;
866
LambdaScopeInfo(DiagnosticsEngine & Diag)867 LambdaScopeInfo(DiagnosticsEngine &Diag)
868 : CapturingScopeInfo(Diag, ImpCap_None) {
869 Kind = SK_Lambda;
870 }
871
872 /// Note when all explicit captures have been added.
finishedExplicitCaptures()873 void finishedExplicitCaptures() {
874 NumExplicitCaptures = Captures.size();
875 }
876
classof(const FunctionScopeInfo * FSI)877 static bool classof(const FunctionScopeInfo *FSI) {
878 return FSI->Kind == SK_Lambda;
879 }
880
881 /// Is this scope known to be for a generic lambda? (This will be false until
882 /// we parse the first 'auto'-typed parameter.
isGenericLambda()883 bool isGenericLambda() const {
884 return !AutoTemplateParams.empty() || GLTemplateParameterList;
885 }
886
887 /// Add a variable that might potentially be captured by the
888 /// lambda and therefore the enclosing lambdas.
889 ///
890 /// This is also used by enclosing lambda's to speculatively capture
891 /// variables that nested lambda's - depending on their enclosing
892 /// specialization - might need to capture.
893 /// Consider:
894 /// void f(int, int); <-- don't capture
895 /// void f(const int&, double); <-- capture
896 /// void foo() {
897 /// const int x = 10;
898 /// auto L = [=](auto a) { // capture 'x'
899 /// return [=](auto b) {
900 /// f(x, a); // we may or may not need to capture 'x'
901 /// };
902 /// };
903 /// }
addPotentialCapture(Expr * VarExpr)904 void addPotentialCapture(Expr *VarExpr) {
905 assert(isa<DeclRefExpr>(VarExpr) || isa<MemberExpr>(VarExpr));
906 PotentiallyCapturingExprs.push_back(VarExpr);
907 }
908
addPotentialThisCapture(SourceLocation Loc)909 void addPotentialThisCapture(SourceLocation Loc) {
910 PotentialThisCaptureLocation = Loc;
911 }
912
hasPotentialThisCapture()913 bool hasPotentialThisCapture() const {
914 return PotentialThisCaptureLocation.isValid();
915 }
916
917 /// Mark a variable's reference in a lambda as non-odr using.
918 ///
919 /// For generic lambdas, if a variable is named in a potentially evaluated
920 /// expression, where the enclosing full expression is dependent then we
921 /// must capture the variable (given a default capture).
922 /// This is accomplished by recording all references to variables
923 /// (DeclRefExprs or MemberExprs) within said nested lambda in its array of
924 /// PotentialCaptures. All such variables have to be captured by that lambda,
925 /// except for as described below.
926 /// If that variable is usable as a constant expression and is named in a
927 /// manner that does not involve its odr-use (e.g. undergoes
928 /// lvalue-to-rvalue conversion, or discarded) record that it is so. Upon the
929 /// act of analyzing the enclosing full expression (ActOnFinishFullExpr)
930 /// if we can determine that the full expression is not instantiation-
931 /// dependent, then we can entirely avoid its capture.
932 ///
933 /// const int n = 0;
934 /// [&] (auto x) {
935 /// (void)+n + x;
936 /// };
937 /// Interestingly, this strategy would involve a capture of n, even though
938 /// it's obviously not odr-used here, because the full-expression is
939 /// instantiation-dependent. It could be useful to avoid capturing such
940 /// variables, even when they are referred to in an instantiation-dependent
941 /// expression, if we can unambiguously determine that they shall never be
942 /// odr-used. This would involve removal of the variable-referring-expression
943 /// from the array of PotentialCaptures during the lvalue-to-rvalue
944 /// conversions. But per the working draft N3797, (post-chicago 2013) we must
945 /// capture such variables.
946 /// Before anyone is tempted to implement a strategy for not-capturing 'n',
947 /// consider the insightful warning in:
948 /// /cfe-commits/Week-of-Mon-20131104/092596.html
949 /// "The problem is that the set of captures for a lambda is part of the ABI
950 /// (since lambda layout can be made visible through inline functions and the
951 /// like), and there are no guarantees as to which cases we'll manage to build
952 /// an lvalue-to-rvalue conversion in, when parsing a template -- some
953 /// seemingly harmless change elsewhere in Sema could cause us to start or stop
954 /// building such a node. So we need a rule that anyone can implement and get
955 /// exactly the same result".
markVariableExprAsNonODRUsed(Expr * CapturingVarExpr)956 void markVariableExprAsNonODRUsed(Expr *CapturingVarExpr) {
957 assert(isa<DeclRefExpr>(CapturingVarExpr)
958 || isa<MemberExpr>(CapturingVarExpr));
959 NonODRUsedCapturingExprs.insert(CapturingVarExpr);
960 }
isVariableExprMarkedAsNonODRUsed(Expr * CapturingVarExpr)961 bool isVariableExprMarkedAsNonODRUsed(Expr *CapturingVarExpr) const {
962 assert(isa<DeclRefExpr>(CapturingVarExpr)
963 || isa<MemberExpr>(CapturingVarExpr));
964 return NonODRUsedCapturingExprs.count(CapturingVarExpr);
965 }
removePotentialCapture(Expr * E)966 void removePotentialCapture(Expr *E) {
967 PotentiallyCapturingExprs.erase(
968 std::remove(PotentiallyCapturingExprs.begin(),
969 PotentiallyCapturingExprs.end(), E),
970 PotentiallyCapturingExprs.end());
971 }
clearPotentialCaptures()972 void clearPotentialCaptures() {
973 PotentiallyCapturingExprs.clear();
974 PotentialThisCaptureLocation = SourceLocation();
975 }
getNumPotentialVariableCaptures()976 unsigned getNumPotentialVariableCaptures() const {
977 return PotentiallyCapturingExprs.size();
978 }
979
hasPotentialCaptures()980 bool hasPotentialCaptures() const {
981 return getNumPotentialVariableCaptures() ||
982 PotentialThisCaptureLocation.isValid();
983 }
984
985 // When passed the index, returns the VarDecl and Expr associated
986 // with the index.
987 void getPotentialVariableCapture(unsigned Idx, VarDecl *&VD, Expr *&E) const;
988 };
989
WeakObjectProfileTy()990 FunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy()
991 : Base(nullptr, false) {}
992
993 FunctionScopeInfo::WeakObjectProfileTy
getSentinel()994 FunctionScopeInfo::WeakObjectProfileTy::getSentinel() {
995 FunctionScopeInfo::WeakObjectProfileTy Result;
996 Result.Base.setInt(true);
997 return Result;
998 }
999
1000 template <typename ExprT>
recordUseOfWeak(const ExprT * E,bool IsRead)1001 void FunctionScopeInfo::recordUseOfWeak(const ExprT *E, bool IsRead) {
1002 assert(E);
1003 WeakUseVector &Uses = WeakObjectUses[WeakObjectProfileTy(E)];
1004 Uses.push_back(WeakUseTy(E, IsRead));
1005 }
1006
1007 inline void
addThisCapture(bool isNested,SourceLocation Loc,Expr * Cpy,const bool ByCopy)1008 CapturingScopeInfo::addThisCapture(bool isNested, SourceLocation Loc,
1009 Expr *Cpy,
1010 const bool ByCopy) {
1011 Captures.push_back(Capture(Capture::ThisCapture, isNested, Loc, QualType(),
1012 Cpy, ByCopy));
1013 CXXThisCaptureIndex = Captures.size();
1014 }
1015
1016 } // namespace sema
1017
1018 } // namespace clang
1019
1020 #endif // LLVM_CLANG_SEMA_SCOPEINFO_H
1021