Fix type checks for relation operators
authorAndres Noetzli <noetzli@stanford.edu>
Mon, 15 May 2017 17:09:45 +0000 (10:09 -0700)
committerAndres Noetzli <noetzli@stanford.edu>
Mon, 15 May 2017 17:09:45 +0000 (10:09 -0700)
This commit fixes an assertion error when applying transpose or transitive
closure to a set instead of a relation. Instead it now prints a parse error.

src/theory/sets/theory_sets_type_rules.h

index b8c0a80559391986f161c2fbf27b741fb2b1087b..a5a78e69109689e743f9da3b2793285e2aebfe5f 100644 (file)
@@ -277,8 +277,8 @@ struct RelTransposeTypeRule {
     throw (TypeCheckingExceptionPrivate, AssertionException) {
     Assert(n.getKind() == kind::TRANSPOSE);
     TypeNode setType = n[0].getType(check);
-    if(check && !setType.isSet() && !setType.getSetElementType().isTuple()) {
-        throw TypeCheckingExceptionPrivate(n, "relation transpose operats on non-relation");
+    if(check && (!setType.isSet() || !setType.getSetElementType().isTuple())) {
+        throw TypeCheckingExceptionPrivate(n, "relation transpose operates on non-relation");
     }
     std::vector<TypeNode> tupleTypes = setType[0].getTupleTypes();
     std::reverse(tupleTypes.begin(), tupleTypes.end());
@@ -296,7 +296,7 @@ struct RelTransClosureTypeRule {
     Assert(n.getKind() == kind::TCLOSURE);
     TypeNode setType = n[0].getType(check);
     if(check) {
-      if(!setType.isSet() && !setType.getSetElementType().isTuple()) {
+      if(!setType.isSet() || !setType.getSetElementType().isTuple()) {
         throw TypeCheckingExceptionPrivate(n, " transitive closure operates on non-relation");
       }
       std::vector<TypeNode> tupleTypes = setType[0].getTupleTypes();