Add TypedViewRegion::isBoundable() to indicate whether or not the

TypedViewRegion has a valid rvalue type. Also renamed instance variable 'T' to
'LvalueType' to make it unambiguous of its purpose.

This fixes some crashes I was seeing after:

http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20090309/013771.html

This is because 'isBoundable()' is defined in TypedRegion (the parent class) in
terms of the rvalue type (which could be null), while for TypedViewRegion it
should be defined in terms of the lvalue type.

llvm-svn: 66712
This commit is contained in:
Ted Kremenek 2009-03-11 21:57:34 +00:00
parent 99bee42be2
commit 0f4b0d27f8
2 changed files with 12 additions and 7 deletions

View File

@ -239,10 +239,10 @@ public:
class TypedViewRegion : public TypedRegion {
friend class MemRegionManager;
QualType T;
QualType LValueType;
TypedViewRegion(QualType t, const MemRegion* sreg)
: TypedRegion(sreg, TypedViewRegionKind), T(t) {}
TypedViewRegion(QualType lvalueType, const MemRegion* sreg)
: TypedRegion(sreg, TypedViewRegionKind), LValueType(lvalueType) {}
static void ProfileRegion(llvm::FoldingSetNodeID& ID, QualType T,
const MemRegion* superRegion);
@ -252,13 +252,17 @@ public:
void print(llvm::raw_ostream& os) const;
QualType getRValueType(ASTContext&) const {
const PointerType* PTy = T->getAsPointerType();
const PointerType* PTy = LValueType->getAsPointerType();
assert(PTy);
return PTy->getPointeeType();
}
bool isBoundable(ASTContext &C) const {
return isa<PointerType>(LValueType);
}
void Profile(llvm::FoldingSetNodeID& ID) const {
ProfileRegion(ID, T, superRegion);
ProfileRegion(ID, LValueType, superRegion);
}
static bool classof(const MemRegion* R) {
@ -561,7 +565,8 @@ public:
ObjCIvarRegion* getObjCIvarRegion(const ObjCIvarDecl* ivd,
const MemRegion* superRegion);
TypedViewRegion* getTypedViewRegion(QualType t, const MemRegion* superRegion);
TypedViewRegion* getTypedViewRegion(QualType LValueType,
const MemRegion* superRegion);
bool hasStackStorage(const MemRegion* R);

View File

@ -172,7 +172,7 @@ void AllocaRegion::print(llvm::raw_ostream& os) const {
}
void TypedViewRegion::print(llvm::raw_ostream& os) const {
os << "typed_view{" << T.getAsString() << ',';
os << "typed_view{" << LValueType.getAsString() << ',';
getSuperRegion()->print(os);
os << '}';
}