forked from OSchip/llvm-project
Added hack to transfer function logic to handle the case where a DeclRefExpr
wrapping an EnumConstantDecl evaluates to an integer type that has a different signedness than the APSInt stored in the EnumConstantDecl. Will file a Bugzilla report. llvm-svn: 47548
This commit is contained in:
parent
6f92e2294a
commit
b23cc7191f
|
@ -236,7 +236,15 @@ RVal ValueStateManager::GetRVal(ValueState St, Expr* E, bool* hasVal) {
|
|||
// already has persistent storage? We do this because we
|
||||
// are comparing states using pointer equality. Perhaps there is
|
||||
// a better way, since APInts are fairly lightweight.
|
||||
return nonlval::ConcreteInt(ValMgr.getValue(ED->getInitVal()));
|
||||
llvm::APSInt X = ED->getInitVal();
|
||||
|
||||
// FIXME: This is a hack. The APSInt inside the EnumConstantDecl
|
||||
// might not match the signedness of the DeclRefExpr. We hack
|
||||
// a workaround here. Should be fixed elsewhere.
|
||||
if (E->getType()->isUnsignedIntegerType() != X.isUnsigned())
|
||||
X.setIsUnsigned(!X.isUnsigned());
|
||||
|
||||
return nonlval::ConcreteInt(ValMgr.getValue(X));
|
||||
}
|
||||
else if (FunctionDecl* FD = dyn_cast<FunctionDecl>(D))
|
||||
return lval::FuncVal(FD);
|
||||
|
|
Loading…
Reference in New Issue