Improve error message for unsupported exponents (#4852)
authorGereon Kremer <gereon.kremer@cs.rwth-aachen.de>
Wed, 5 Aug 2020 18:55:00 +0000 (20:55 +0200)
committerGitHub <noreply@github.com>
Wed, 5 Aug 2020 18:55:00 +0000 (13:55 -0500)
We have had a few issues where essentially users misinterpreted the error message about which types of exponents are supported for (^ base exp). Given that this is rewritten to a multiplication of length exp, we only support reasonably small natural numbers.
This PR improves the error message.
Fixes #4692

src/theory/arith/arith_rewriter.cpp
test/regress/CMakeLists.txt
test/regress/regress1/arith/bug716.1.cvc
test/regress/regress1/arith/bug716.2.cvc [new file with mode: 0644]

index 188ef47e6f664512844c1a9afc643a0301f92909..f0e0487a0e3b59963e9562de77b33aa9b56f8eb8 100644 (file)
@@ -229,8 +229,9 @@ RewriteResponse ArithRewriter::postRewriteTerm(TNode t){
           if(exp.sgn() == 0){
             return RewriteResponse(REWRITE_DONE, mkRationalNode(Rational(1)));
           }else if(exp.sgn() > 0 && exp.isIntegral()){
-            CVC4::Rational r(INT_MAX);
-            if( exp<r ){
+            CVC4::Rational r(expr::NodeValue::MAX_CHILDREN);
+            if (exp <= r)
+            {
               unsigned num = exp.getNumerator().toUnsignedInt();
               if( num==1 ){
                 return RewriteResponse(REWRITE_AGAIN, base);
@@ -249,8 +250,10 @@ RewriteResponse ArithRewriter::postRewriteTerm(TNode t){
 
         // Todo improve the exception thrown
         std::stringstream ss;
-        ss << "The POW(^) operator can only be used with a natural number ";
-        ss << "in the exponent.  Exception occurred in:" << std::endl;
+        ss << "The exponent of the POW(^) operator can only be a positive "
+              "integral constant below "
+           << (expr::NodeValue::MAX_CHILDREN + 1) << ". ";
+        ss << "Exception occurred in:" << std::endl;
         ss << "  " << t;
         throw LogicException(ss.str());
       }
index f9840e5524402132056e98cb5b2720ef9d8073d5..0b0da8e93a15954d4a7fcba7b24db5cd5917e059 100644 (file)
@@ -1247,6 +1247,7 @@ set(regress_1_tests
   regress1/arith/bug547.1.smt2
   regress1/arith/bug716.0.smt2
   regress1/arith/bug716.1.cvc
+  regress1/arith/bug716.2.cvc
   regress1/arith/div.03.smt2
   regress1/arith/div.06.smt2
   regress1/arith/div.08.smt2
index d9330c7277267cdaf479e2d6a6c7da87286bffb1..854062bebeabf6fa5de484e884a0f2485f6c27c8 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: The POW(^) operator can only be used with a natural number in the exponent.  Exception occurred in:
+% EXPECT: The exponent of the POW(^) operator can only be a positive integral constant below 67108864. Exception occurred in:
 % EXPECT:   2 ^ x
 % EXIT: 1
 x: INT;
diff --git a/test/regress/regress1/arith/bug716.2.cvc b/test/regress/regress1/arith/bug716.2.cvc
new file mode 100644 (file)
index 0000000..eb9b733
--- /dev/null
@@ -0,0 +1,6 @@
+% EXPECT: The exponent of the POW(^) operator can only be a positive integral constant below 67108864. Exception occurred in:
+% EXPECT:   x ^ 67108864
+% EXIT: 1
+x: INT;
+ASSERT x^67108864 = 8;
+QUERY x=3;