diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-04-29 22:17:41 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-04-29 22:17:41 +0000 |
commit | 718c4f7b3ff713c3ebee46553d687bde63e5666f (patch) | |
tree | aeb2f3877956ce8c59a70d6925b933133655d906 /lib/Analysis/RValues.cpp | |
parent | 1b8bd4d71c2098126041b4de4267175a82f0103c (diff) |
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
Diffstat (limited to 'lib/Analysis/RValues.cpp')
-rw-r--r-- | lib/Analysis/RValues.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/Analysis/RValues.cpp b/lib/Analysis/RValues.cpp index 5e161f34a5..ab1cf6a420 100644 --- a/lib/Analysis/RValues.cpp +++ b/lib/Analysis/RValues.cpp @@ -25,6 +25,9 @@ using llvm::APSInt; //===----------------------------------------------------------------------===// 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 @@ RVal::symbol_iterator RVal::symbol_begin() const { 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 @@ void LVal::print(std::ostream& Out) const { << "\""; 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; |