aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/RValues.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-29 22:17:41 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-29 22:17:41 +0000
commit718c4f7b3ff713c3ebee46553d687bde63e5666f (patch)
treeaeb2f3877956ce8c59a70d6925b933133655d906 /lib/Analysis/RValues.cpp
parent1b8bd4d71c2098126041b4de4267175a82f0103c (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.cpp15
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;