From: Ted Kremenek Date: Mon, 25 Feb 2008 18:34:45 +0000 (+0000) Subject: Added hack to transfer function logic to handle the case where a DeclRefExpr X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3bca92bab58a217a2db4bb7109f246667cabf284;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47548 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Analysis/ValueState.cpp b/Analysis/ValueState.cpp index 7cd89fdd7e..3cbcd88d25 100644 --- a/Analysis/ValueState.cpp +++ b/Analysis/ValueState.cpp @@ -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(D)) return lval::FuncVal(FD);