================
@@ -1737,22 +1733,95 @@ class BuildLockset : public
ConstStmtVisitor<BuildLockset> {
FactSet FSet;
// The fact set for the function on exit.
const FactSet &FunctionExitFSet;
- LocalVariableMap::Context LVarCtx;
- unsigned CtxIndex;
+
+ /// A `LocalVariableMap::Context` wrapper that groups a context 'Q' with its
+ /// immediate predecessor 'P' for a program point. If the program point is
+ /// right after a Stmt 'S', 'P' is the pre-context of 'S' and 'Q' is the
+ /// post-context of 'S'. Otherwise, 'P' == 'Q'.
+ ///
+ /// A DualLocalVarContext sets the global context for VarDefinition lookup to
+ /// the post-context 'Q', once CREATED or UPDATED to the next program
+ /// point. One can temporarily switch the global context to either 'P' or
'Q'
+ /// using `switchToContextForScope`. The lifetime of the global context
+ /// switching is bound to the enclosing scope. The global context will be set
+ /// back to the prior state by the end of the scope. This is done by the
+ /// returned ContextSwitchScope object.
+ ///
+ /// Note: The pre- and post-context of a Stmt are distinct only in Beta mode
+ /// (i.e., `Analyzer.Handler.issueBetaWarnings()`) because of the
+ /// out-parameter validation. If not in Beta mode, the global context for
+ /// VarDefinition lookup is invisible, thus this wrapper has no impact on the
+ /// analysis.
+ class DualLocalVarContext {
+ public:
+ enum Point : char { Pre = 0, Post = 1 };
+
+ struct [[nodiscard]] ContextSwitchScope {
----------------
melver wrote:
Should have:
```
ContextSwitchScope(const ContextSwitchScope &) = delete;
ContextSwitchScope &operator=(const ContextSwitchScope &) = delete;
```
https://github.com/llvm/llvm-project/pull/210219
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits