diff options
author | Morgan Deters <mdeters@gmail.com> | 2012-10-10 21:20:40 +0000 |
---|---|---|
committer | Morgan Deters <mdeters@gmail.com> | 2012-10-10 21:20:40 +0000 |
commit | 7b2dd1927731b894f5ef610528649a2d1fc555f2 (patch) | |
tree | 6d8ad29a1ec8783601787f4b9216fa6409bb9780 /src/expr | |
parent | 318e836ed5f6bd76d378dfce1c707b9908a1c5e1 (diff) |
Abstract values for SMT-LIB.
Also fix bug 421 relating to incrementality and models.
(this commit was certified error- and warning-free by the test-and-commit script.)
Diffstat (limited to 'src/expr')
-rw-r--r-- | src/expr/node.cpp | 5 | ||||
-rw-r--r-- | src/expr/node.h | 7 | ||||
-rw-r--r-- | src/expr/node_builder.h | 9 |
3 files changed, 20 insertions, 1 deletions
diff --git a/src/expr/node.cpp b/src/expr/node.cpp index e303a9e58..f6c2250b1 100644 --- a/src/expr/node.cpp +++ b/src/expr/node.cpp @@ -43,4 +43,9 @@ NodeTemplate<true> TypeCheckingExceptionPrivate::getNode() const throw() { return *d_node; } +UnknownTypeException::UnknownTypeException(TNode n) throw() : + TypeCheckingExceptionPrivate(n, "this expression contains an element of unknown type (such as an abstract value);" + " its type cannot be computed until it is substituted away") { +} + }/* CVC4 namespace */ diff --git a/src/expr/node.h b/src/expr/node.h index b7c4b3ad8..1c0646556 100644 --- a/src/expr/node.h +++ b/src/expr/node.h @@ -100,6 +100,13 @@ public: };/* class TypeCheckingExceptionPrivate */ +class UnknownTypeException : public TypeCheckingExceptionPrivate { +public: + + UnknownTypeException(NodeTemplate<false> node) throw(); + +};/* class UnknownTypeException */ + /** * \typedef NodeTemplate<true> Node; * diff --git a/src/expr/node_builder.h b/src/expr/node_builder.h index 0c8ac40f8..351cf3639 100644 --- a/src/expr/node_builder.h +++ b/src/expr/node_builder.h @@ -1305,7 +1305,14 @@ inline void NodeBuilder<nchild_thresh>::maybeCheckType(const TNode n) const kind::MetaKind mk = n.getMetaKind(); if( mk != kind::metakind::VARIABLE && mk != kind::metakind::CONSTANT ) { - d_nm->getType(n, true); + try { + d_nm->getType(n, true); + } catch(UnknownTypeException&) { + // Ignore the error; this expression doesn't have a type, + // because it has an abstract value in it. If the user + // depends on the type of this expression, he should get an + // exception, but so far he's only constructed it. + } } } } |