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 | 0d2ccffa83b60d6745d1390127373a394321e28a (patch) | |
tree | 6073c0e9876629c9365cb37a67f2c03b0937a458 /clang/lib/Analysis/RValues.cpp | |
parent | 663f5fccd4332b14c853f8b5d7cd16c60623a012 (diff) | |
download | bcm5719-llvm-0d2ccffa83b60d6745d1390127373a394321e28a.tar.gz bcm5719-llvm-0d2ccffa83b60d6745d1390127373a394321e28a.zip |
Added lval::FieldOffset, which represents symbolic lvalues for field offsets from other Lvalues.
This removes the failure in null-deref-ps.c (test suite).
llvm-svn: 50449
Diffstat (limited to 'clang/lib/Analysis/RValues.cpp')
-rw-r--r-- | clang/lib/Analysis/RValues.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/Analysis/RValues.cpp b/clang/lib/Analysis/RValues.cpp index 5e161f34a5c..ab1cf6a4207 100644 --- a/clang/lib/Analysis/RValues.cpp +++ b/clang/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; |