Accepted some patches from the Multicore Programming Group at Imperial College London...
authorMorgan Deters <mdeters@gmail.com>
Tue, 4 Sep 2012 22:22:41 +0000 (22:22 +0000)
committerMorgan Deters <mdeters@gmail.com>
Tue, 4 Sep 2012 22:22:41 +0000 (22:22 +0000)
cvc4-0001-Look-for-cxxtestgen-as-well-as-cxxtestgen.pl-and-cxx.patch
* better checking for cxxtest
cvc4-0002-Do-not-read-an-additional-command-after-failure.patch
* more correct failure behavior for interactive tools
cvc4-0003-Only-exit-when-encountering-a-CommandFailure.patch
* don't consider "unsupported" as a failure (accepted with modifications)
cvc4-0004-Produce-SMT-LIB-v2-conformant-output-for-get-info.patch
* better get-info responses (accepted with modifications)

These patches will help the group build Boogie support for CVC4.

(this commit was certified error- and warning-free by the test-and-commit script.)

configure.ac
src/expr/command.cpp
src/expr/command.h
src/main/driver.cpp

index 0eebd62d1d100afff4caf5a0638d35e1ee553eeb..1c14f8c6e4614e86a2275416c3b8125828d04e6a 100644 (file)
@@ -783,12 +783,15 @@ AC_PATH_PROG(CXXTESTGEN, cxxtestgen.pl, [], [$CXXTEST:$PATH])
 if test -z "$CXXTESTGEN"; then
   AC_PATH_PROG(CXXTESTGEN, cxxtestgen.py, [], [$CXXTEST:$PATH])
 fi
+if test -z "$CXXTESTGEN"; then
+  AC_PATH_PROG(CXXTESTGEN, cxxtestgen, [], [$CXXTEST:$PATH])
+fi
 if test "$enable_unit_testing" = "no"; then
   AC_MSG_NOTICE([unit tests disabled by user request.])
   CXXTESTGEN=
   CXXTEST=
 elif test -z "$CXXTESTGEN"; then
-  AC_MSG_NOTICE([unit tests disabled, neither cxxtestgen.pl nor cxxtestgen.py found.])
+  AC_MSG_NOTICE([unit tests disabled, could not find cxxtestgen.pl or cxxtestgen.py or cxxtestgen])
 elif test -z "$CXXTEST"; then
   CXXTEST=`dirname "$CXXTESTGEN"`
   AC_MSG_CHECKING([for location of CxxTest headers])
index 648c64388dd8217ecc4aa3561283a5a0e0617792..b058292f33d220cdce0ab17e1364ebfb2d0e19fc 100644 (file)
@@ -91,6 +91,10 @@ bool Command::ok() const throw() {
   return d_commandStatus == NULL || dynamic_cast<const CommandSuccess*>(d_commandStatus) != NULL;
 }
 
+bool Command::fail() const throw() {
+  return d_commandStatus != NULL && dynamic_cast<const CommandFailure*>(d_commandStatus) != NULL;
+}
+
 void Command::invoke(SmtEngine* smtEngine, std::ostream& out) throw() {
   invoke(smtEngine);
   printResult(out);
@@ -1048,11 +1052,11 @@ std::string GetInfoCommand::getFlag() const throw() {
 
 void GetInfoCommand::invoke(SmtEngine* smtEngine) throw() {
   try {
-    SExpr response = smtEngine->getInfo(d_flag);
+    vector<SExpr> v;
+    v.push_back(SExpr(SExpr::Keyword(string(":") + d_flag)));
+    v.push_back(smtEngine->getInfo(d_flag));
     stringstream ss;
-    ss << SExpr(SExpr::Keyword(d_flag))
-       << ' '
-       << response;
+    ss << SExpr(v);
     d_result = ss.str();
     d_commandStatus = CommandSuccess::instance();
   } catch(UnrecognizedOptionException&) {
@@ -1136,7 +1140,6 @@ void GetOptionCommand::invoke(SmtEngine* smtEngine) throw() {
     v.push_back(SExpr(SExpr::Keyword(string(":") + d_flag)));
     v.push_back(smtEngine->getOption(d_flag));
     stringstream ss;
-
     ss << SExpr(v);
     d_result = ss.str();
     d_commandStatus = CommandSuccess::instance();
index 4657755e7d809f52757dd473c82470ae54384237..0f517e7f24fca46bfdf5aa9bc7e9796a3fa1d981 100644 (file)
@@ -211,9 +211,18 @@ public:
 
   std::string toString() const throw();
 
-  /** Either the command hasn't run yet, or it completed successfully. */
+  /**
+   * Either the command hasn't run yet, or it completed successfully
+   * (CommandSuccess, not CommandUnsupported or CommandFailure).
+   */
   bool ok() const throw();
 
+  /**
+   * The command completed in a failure state (CommandFailure, not
+   * CommandSuccess or CommandUnsupported).
+   */
+  bool fail() const throw();
+
   /** Get the command status (it's NULL if we haven't run yet). */
   const CommandStatus* getCommandStatus() const throw() { return d_commandStatus; }
 
index ca5dfad93bedab189a5f0e6a8644f9152bf93a0e..1e6f87d2406b783cca63a0f5fb5e5a79419d0604 100644 (file)
@@ -293,12 +293,12 @@ int runCvc4(int argc, char* argv[], Options& opts) {
       // have the replay parser use the file's declarations
       replayParser->useDeclarationsFrom(parser);
     }
-    while((cmd = parser->nextCommand()) && status) {
+    while(status && (cmd = parser->nextCommand())) {
       if(dynamic_cast<QuitCommand*>(cmd) != NULL) {
         delete cmd;
         break;
       }
-      status = doCommand(smt, cmd, opts) && status;
+      status = doCommand(smt, cmd, opts);
       delete cmd;
     }
     // Remove the parser
@@ -352,16 +352,18 @@ static bool doCommand(SmtEngine& smt, Command* cmd, Options& opts) {
     return true;
   }
 
-  // assume no error
-  bool status = true;
-
   CommandSequence *seq = dynamic_cast<CommandSequence*>(cmd);
   if(seq != NULL) {
+    // assume no error
+    bool status = true;
+
     for(CommandSequence::iterator subcmd = seq->begin();
-        subcmd != seq->end();
+        status && subcmd != seq->end();
         ++subcmd) {
-      status = doCommand(smt, *subcmd, opts) && status;
+      status = doCommand(smt, *subcmd, opts);
     }
+
+    return status;
   } else {
     if(opts[options::verbosity] > 0) {
       *opts[options::out] << "Invoking: " << *cmd << endl;
@@ -372,8 +374,6 @@ static bool doCommand(SmtEngine& smt, Command* cmd, Options& opts) {
     } else {
       cmd->invoke(&smt);
     }
-    status = status && cmd->ok();
+    return !cmd->fail();
   }
-
-  return status;
 }