Added lval::FieldOffset, which represents symbolic lvalues for field offsets from other Lvalues.
This removes the failure in null-deref-ps.c (test suite).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50449 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/RValues.cpp b/lib/Analysis/RValues.cpp
index 5e161f3..ab1cf6a 100644
--- a/lib/Analysis/RValues.cpp
+++ b/lib/Analysis/RValues.cpp
@@ -25,6 +25,9 @@
 //===----------------------------------------------------------------------===//
 
 RVal::symbol_iterator RVal::symbol_begin() const {
+  
+  // FIXME: This is a rat's nest.  Cleanup.
+
   if (isa<lval::SymbolVal>(this))
     return (symbol_iterator) (&Data);
   else if (isa<nonlval::SymbolVal>(this))
@@ -39,7 +42,10 @@
     const nonlval::LValAsInteger& V = cast<nonlval::LValAsInteger>(*this);
     return  V.getPersistentLVal().symbol_begin();
   }
-  
+  else if (isa<lval::FieldOffset>(this)) {
+    const lval::FieldOffset& V = cast<lval::FieldOffset>(*this);
+    return V.getPersistentBase().symbol_begin();
+  }
   return NULL;
 }
 
@@ -402,6 +408,13 @@
           << "\"";
       break;
       
+    case lval::FieldOffsetKind: {
+      const lval::FieldOffset& C = *cast<lval::FieldOffset>(this);
+      C.getBase().print(Out);
+      Out << "." << C.getFieldDecl()->getName() << " (field LVal)";
+      break;
+    }
+      
     default:
       assert (false && "Pretty-printing not implemented for this LVal.");
       break;