aboutsummaryrefslogtreecommitdiff
path: root/include/clang/Analysis/Support/ExprDeclBitVector.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang/Analysis/Support/ExprDeclBitVector.h')
-rw-r--r--include/clang/Analysis/Support/ExprDeclBitVector.h36
1 files changed, 29 insertions, 7 deletions
diff --git a/include/clang/Analysis/Support/ExprDeclBitVector.h b/include/clang/Analysis/Support/ExprDeclBitVector.h
index dc634df5ed..558331e32e 100644
--- a/include/clang/Analysis/Support/ExprDeclBitVector.h
+++ b/include/clang/Analysis/Support/ExprDeclBitVector.h
@@ -28,6 +28,21 @@ namespace clang {
struct DeclBitVector_Types {
+ class Idx {
+ unsigned I;
+ public:
+ Idx(unsigned i) : I(i) {}
+ explicit Idx() : I(~0U) {}
+
+ bool isValid() const {
+ return I != ~0U;
+ }
+ operator unsigned() const {
+ assert (isValid());
+ return I;
+ }
+ };
+
//===--------------------------------------------------------------------===//
// AnalysisDataTy - Whole-function meta data.
//===--------------------------------------------------------------------===//
@@ -48,10 +63,9 @@ struct DeclBitVector_Types {
bool isTracked(const ScopedDecl* SD) { return DMap.find(SD) != DMap.end(); }
- unsigned getIdx(const ScopedDecl* SD) const {
+ Idx getIdx(const ScopedDecl* SD) const {
DMapTy::const_iterator I = DMap.find(SD);
- assert (I != DMap.end());
- return I->second;
+ return I == DMap.end() ? Idx() : Idx(I->second);
}
unsigned getNumDecls() const { return NDecls; }
@@ -84,13 +98,21 @@ struct DeclBitVector_Types {
void copyValues(const ValTy& RHS) { DeclBV = RHS.DeclBV; }
+ llvm::BitVector::reference getBit(unsigned i) {
+ return DeclBV[i];
+ }
+
+ const bool getBit(unsigned i) const {
+ return DeclBV[i];
+ }
+
llvm::BitVector::reference
operator()(const ScopedDecl* SD, const AnalysisDataTy& AD) {
- return DeclBV[AD.getIdx(SD)];
+ return getBit(AD.getIdx(SD));
}
- const llvm::BitVector::reference
- operator()(const ScopedDecl* SD, const AnalysisDataTy& AD) const {
- return const_cast<ValTy&>(*this)(SD,AD);
+
+ bool operator()(const ScopedDecl* SD, const AnalysisDataTy& AD) const {
+ return getBit(AD.getIdx(SD));
}
llvm::BitVector::reference getDeclBit(unsigned i) { return DeclBV[i]; }