[cfe-commits] r46471 - /cfe/trunk/Analysis/GRConstants.cpp
Ted Kremenek
kremenek at apple.com
Mon Jan 28 14:51:57 PST 2008
Author: kremenek
Date: Mon Jan 28 16:51:57 2008
New Revision: 46471
URL: http://llvm.org/viewvc/llvm-project?rev=46471&view=rev
Log:
Added RValue class "UninitializedValue".
Modified:
cfe/trunk/Analysis/GRConstants.cpp
Modified: cfe/trunk/Analysis/GRConstants.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRConstants.cpp?rev=46471&r1=46470&r2=46471&view=diff
==============================================================================
--- cfe/trunk/Analysis/GRConstants.cpp (original)
+++ cfe/trunk/Analysis/GRConstants.cpp Mon Jan 28 16:51:57 2008
@@ -203,8 +203,8 @@
class VISIBILITY_HIDDEN RValue {
public:
- enum BaseKind { InvalidKind=0x0, LValueKind=0x1, NonLValueKind=0x2,
- BaseFlags = 0x3 };
+ enum BaseKind { LValueKind=0x0, NonLValueKind=0x1,
+ UninitializedKind=0x2, InvalidKind=0x3, BaseFlags = 0x3 };
private:
void* Data;
@@ -215,8 +215,8 @@
: Data(const_cast<void*>(d)),
Kind((isLValue ? LValueKind : NonLValueKind) | (ValKind << 2)) {}
- explicit RValue()
- : Data(0), Kind(InvalidKind) {}
+ explicit RValue(BaseKind k)
+ : Data(0), Kind(k) {}
void* getRawPtr() const {
return reinterpret_cast<void*>(Data);
@@ -252,12 +252,21 @@
class VISIBILITY_HIDDEN InvalidValue : public RValue {
public:
- InvalidValue() {}
+ InvalidValue() : RValue(InvalidKind) {}
static inline bool classof(const RValue* V) {
return V->getBaseKind() == InvalidKind;
}
};
+
+class VISIBILITY_HIDDEN UninitializedValue : public RValue {
+public:
+ UninitializedValue() : RValue(UninitializedKind) {}
+
+ static inline bool classof(const RValue* V) {
+ return V->getBaseKind() == UninitializedKind;
+ }
+};
class VISIBILITY_HIDDEN LValue : public RValue {
protected:
@@ -289,7 +298,7 @@
// Implement isa<T> support.
static inline bool classof(const RValue* V) {
- return V->getBaseKind() == NonLValueKind;
+ return V->getBaseKind() >= NonLValueKind;
}
};
@@ -425,6 +434,9 @@
switch (getSubKind()*NumNonLValueKind+RHS.getSubKind()){\
RVALUE_DISPATCH_CASE(ConcreteInt,ConcreteInt,Op)\
default:\
+ if (getBaseKind() == UninitializedKind ||\
+ RHS.getBaseKind() == UninitializedKind)\
+ return cast<NonLValue>(UninitializedValue());\
assert (!isValid() || !RHS.isValid() && "Missing case.");\
break;\
}\
@@ -485,6 +497,10 @@
assert (false && "FIXME: LValue printing not implemented.");
break;
+ case UninitializedKind:
+ Out << "Uninitialized";
+ break;
+
default:
assert (false && "Invalid RValue.");
}
@@ -866,8 +882,11 @@
StateTy St = Pred->getState();
for (const ScopedDecl* D = DS->getDecl(); D; D = D->getNextDeclarator())
- if (const VarDecl* VD = dyn_cast<VarDecl>(D))
- St = SetValue(St, LValueDecl(VD), GetValue(St, VD->getInit()));
+ if (const VarDecl* VD = dyn_cast<VarDecl>(D)) {
+ const Expr* E = VD->getInit();
+ St = SetValue(St, LValueDecl(VD),
+ E ? GetValue(St, E) : UninitializedValue());
+ }
Nodify(Dst, DS, Pred, St);
More information about the cfe-commits
mailing list