summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Noetzli <andres.noetzli@gmail.com>2018-10-22 09:12:47 -0700
committerGitHub <noreply@github.com>2018-10-22 09:12:47 -0700
commit8e58fec53e1bc9f1b9349a235e2ad76bda4d9dd9 (patch)
treecad404d821e33fdaf7218584adc67b62b368380f
parent0b515de430771d9bdc15fc29d41b391f1cc7c1fd (diff)
Recover from wrong use of get-info :reason-unknown (#2667)
Fixes #2584. Currently, we are immediately terminating CVC4 if the user issues a `(get-info :reason-unknown)` command if it didn't succeed a `(check-sat)` call returning `unknown`. This commit changes the behavior to return an `(error ...)` but continue executing afterwards. It turns the `ModalException` thrown in this case into a `RecoverableModalException` and adds a check in `GetInfoCommand::invoke()` to turn it into a `CommandRecoverableFailure`, which solves the issue.
-rw-r--r--src/smt/command.cpp4
-rw-r--r--src/smt/smt_engine.cpp5
-rw-r--r--test/regress/CMakeLists.txt1
-rw-r--r--test/regress/regress0/smtlib/reason-unknown.smt25
4 files changed, 13 insertions, 2 deletions
diff --git a/src/smt/command.cpp b/src/smt/command.cpp
index 51cb6663f..5198ea2d1 100644
--- a/src/smt/command.cpp
+++ b/src/smt/command.cpp
@@ -2438,6 +2438,10 @@ void GetInfoCommand::invoke(SmtEngine* smtEngine)
{
d_commandStatus = new CommandUnsupported();
}
+ catch (RecoverableModalException& e)
+ {
+ d_commandStatus = new CommandRecoverableFailure(e.what());
+ }
catch (exception& e)
{
d_commandStatus = new CommandFailure(e.what());
diff --git a/src/smt/smt_engine.cpp b/src/smt/smt_engine.cpp
index 149d8bb35..9a0d969d8 100644
--- a/src/smt/smt_engine.cpp
+++ b/src/smt/smt_engine.cpp
@@ -2412,8 +2412,9 @@ CVC4::SExpr SmtEngine::getInfo(const std::string& key) const {
transform(s.begin(), s.end(), s.begin(), ::tolower);
return SExpr(SExpr::Keyword(s));
} else {
- throw ModalException("Can't get-info :reason-unknown when the "
- "last result wasn't unknown!");
+ throw RecoverableModalException(
+ "Can't get-info :reason-unknown when the "
+ "last result wasn't unknown!");
}
} else if(key == "assertion-stack-levels") {
AlwaysAssert(d_userLevels.size() <=
diff --git a/test/regress/CMakeLists.txt b/test/regress/CMakeLists.txt
index e489d2e21..5aea954e3 100644
--- a/test/regress/CMakeLists.txt
+++ b/test/regress/CMakeLists.txt
@@ -801,6 +801,7 @@ set(regress_0_tests
regress0/smallcnf.cvc
regress0/smt2output.smt2
regress0/smtlib/get-unsat-assumptions.smt2
+ regress0/smtlib/reason-unknown.smt2
regress0/strings/bug001.smt2
regress0/strings/bug002.smt2
regress0/strings/bug612.smt2
diff --git a/test/regress/regress0/smtlib/reason-unknown.smt2 b/test/regress/regress0/smtlib/reason-unknown.smt2
new file mode 100644
index 000000000..a4eecf220
--- /dev/null
+++ b/test/regress/regress0/smtlib/reason-unknown.smt2
@@ -0,0 +1,5 @@
+; EXPECT: (error "Can't get-info :reason-unknown when the last result wasn't unknown!")
+; EXPECT: sat
+(set-logic QF_SAT)
+(get-info :reason-unknown)
+(check-sat)
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback