From 8e58fec53e1bc9f1b9349a235e2ad76bda4d9dd9 Mon Sep 17 00:00:00 2001 From: Andres Noetzli Date: Mon, 22 Oct 2018 09:12:47 -0700 Subject: [PATCH] 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. --- src/smt/command.cpp | 4 ++++ src/smt/smt_engine.cpp | 5 +++-- test/regress/CMakeLists.txt | 1 + test/regress/regress0/smtlib/reason-unknown.smt2 | 5 +++++ 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 test/regress/regress0/smtlib/reason-unknown.smt2 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) -- 2.30.2