[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