Implicitly expand argument packs when performing template argument
[clang.git] / include / clang / Checker / PathSensitive / GRExprEngineBuilders.h
blob5503412f7e45661562c4c1088ea970dc02099895
1 //===-- GRExprEngineBuilders.h - "Builder" classes for GRExprEngine -*- 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 smart builder "references" which are used to marshal
11 // builders between GRExprEngine objects and their related components.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_ANALYSIS_GREXPRENGINE_BUILDERS
16 #define LLVM_CLANG_ANALYSIS_GREXPRENGINE_BUILDERS
17 #include "clang/Checker/PathSensitive/GRExprEngine.h"
18 #include "clang/Analysis/Support/SaveAndRestore.h"
20 namespace clang {
22 class GRStmtNodeBuilderRef {
23 ExplodedNodeSet &Dst;
24 GRStmtNodeBuilder &B;
25 GRExprEngine& Eng;
26 ExplodedNode* Pred;
27 const GRState* state;
28 const Stmt* stmt;
29 const unsigned OldSize;
30 const bool AutoCreateNode;
31 SaveAndRestore<bool> OldSink;
32 SaveAndRestore<const void*> OldTag;
33 SaveOr OldHasGen;
35 private:
36 friend class GRExprEngine;
38 GRStmtNodeBuilderRef(); // do not implement
39 void operator=(const GRStmtNodeBuilderRef&); // do not implement
41 GRStmtNodeBuilderRef(ExplodedNodeSet &dst,
42 GRStmtNodeBuilder &builder,
43 GRExprEngine& eng,
44 ExplodedNode* pred,
45 const GRState *st,
46 const Stmt* s, bool auto_create_node)
47 : Dst(dst), B(builder), Eng(eng), Pred(pred),
48 state(st), stmt(s), OldSize(Dst.size()), AutoCreateNode(auto_create_node),
49 OldSink(B.BuildSinks), OldTag(B.Tag), OldHasGen(B.HasGeneratedNode) {}
51 public:
53 ~GRStmtNodeBuilderRef() {
54 // Handle the case where no nodes where generated. Auto-generate that
55 // contains the updated state if we aren't generating sinks.
56 if (!B.BuildSinks && Dst.size() == OldSize && !B.HasGeneratedNode) {
57 if (AutoCreateNode)
58 B.MakeNode(Dst, const_cast<Stmt*>(stmt), Pred, state);
59 else
60 Dst.Add(Pred);
64 const GRState *getState() { return state; }
66 GRStateManager& getStateManager() {
67 return Eng.getStateManager();
70 ExplodedNode* MakeNode(const GRState* state) {
71 return B.MakeNode(Dst, const_cast<Stmt*>(stmt), Pred, state);
75 } // end clang namespace
76 #endif