From 0d2ccffa83b60d6745d1390127373a394321e28a Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 29 Apr 2008 22:17:41 +0000 Subject: 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 --- clang/lib/Analysis/RValues.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'clang/lib/Analysis/RValues.cpp') 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(this)) return (symbol_iterator) (&Data); else if (isa(this)) @@ -39,7 +42,10 @@ RVal::symbol_iterator RVal::symbol_begin() const { const nonlval::LValAsInteger& V = cast(*this); return V.getPersistentLVal().symbol_begin(); } - + else if (isa(this)) { + const lval::FieldOffset& V = cast(*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(this); + C.getBase().print(Out); + Out << "." << C.getFieldDecl()->getName() << " (field LVal)"; + break; + } + default: assert (false && "Pretty-printing not implemented for this LVal."); break; -- cgit v1.2.3