diff options
author | Dan Liew <delcypher@gmail.com> | 2014-05-12 22:06:13 +0100 |
---|---|---|
committer | Dan Liew <delcypher@gmail.com> | 2014-05-12 22:06:13 +0100 |
commit | 5d8db05524f5216900e952c3e1fc2aac9c424391 (patch) | |
tree | e7951ee650645b1a0c7aed4afa09f371db90de7f | |
parent | d10513097420196493b4a408c6cf75cbd53b8351 (diff) | |
parent | abd13a505e64b061a53b6c0562fa74857aba6104 (diff) | |
download | klee-5d8db05524f5216900e952c3e1fc2aac9c424391.tar.gz |
Merge pull request #124 from pcc/sort
Fix the logic in ExprSMTLIBPrinter::getSort
-rw-r--r-- | lib/Expr/ExprSMTLIBPrinter.cpp | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/lib/Expr/ExprSMTLIBPrinter.cpp b/lib/Expr/ExprSMTLIBPrinter.cpp index c32b5bf9..cff5abfe 100644 --- a/lib/Expr/ExprSMTLIBPrinter.cpp +++ b/lib/Expr/ExprSMTLIBPrinter.cpp @@ -663,23 +663,36 @@ void ExprSMTLIBPrinter::printQuery() { } ExprSMTLIBPrinter::SMTLIB_SORT ExprSMTLIBPrinter::getSort(const ref<Expr> &e) { - /* We could handle every operator in a large switch statement, - * but this seems more elegant. - */ + switch (e->getKind()) { + case Expr::NotOptimized: + return getSort(e->getKid(0)); - if (e->getKind() == Expr::Extract) { - /* This is a special corner case. In most cases if a node in the expression - * tree - * is of width 1 it should be considered as SORT_BOOL. However it is - * possible to - * perform an extract operation on a SORT_BITVECTOR and produce a - * SORT_BITVECTOR of length 1. - * The ((_ extract i j) () ) operation in SMTLIBv2 always produces - * SORT_BITVECTOR - */ + // The relational operators are bools. + case Expr::Eq: + case Expr::Ne: + case Expr::Slt: + case Expr::Sle: + case Expr::Sgt: + case Expr::Sge: + case Expr::Ult: + case Expr::Ule: + case Expr::Ugt: + case Expr::Uge: + return SORT_BOOL; + + // These may be bitvectors or bools depending on their width (see + // printConstant and printLogicalOrBitVectorExpr). + case Expr::Constant: + case Expr::And: + case Expr::Not: + case Expr::Or: + case Expr::Xor: + return e->getWidth() == Expr::Bool ? SORT_BOOL : SORT_BITVECTOR; + + // Everything else is a bitvector. + default: return SORT_BITVECTOR; - } else - return (e->getWidth() == Expr::Bool) ? (SORT_BOOL) : (SORT_BITVECTOR); + } } void ExprSMTLIBPrinter::printCastToSort(const ref<Expr> &e, |