From c8dad091855ade2001f4fdd3c0295c8befaa5ee0 Mon Sep 17 00:00:00 2001 From: ajreynol Date: Fri, 21 Jul 2023 12:26:54 -0500 Subject: [PATCH] More robust --- src/type_checker.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/type_checker.cpp b/src/type_checker.cpp index 0389277..1b36930 100644 --- a/src/type_checker.cpp +++ b/src/type_checker.cpp @@ -34,7 +34,7 @@ TypeChecker::TypeChecker(State& s) : d_state(s) // initialize literal kinds for (Kind k : d_literalKinds) { - d_literalTypeRules[k] = d_state.mkBuiltinType(k); + d_literalTypeRules[k] = nullptr; } } @@ -51,6 +51,12 @@ void TypeChecker::setTypeRule(Kind k, const Expr& t) ss << "TypeChecker::setTypeRule: cannot set type rule for kind " << k; Error::reportError(ss.str()); } + else if (it->second!=nullptr && it->second!=t) + { + std::stringstream ss; + ss << "TypeChecker::setTypeRule: cannot set type rule for kind " << k << " to " << t << ", since its type was already set to " << it->second; + Error::reportError(ss.str()); + } it->second = t; } @@ -213,8 +219,18 @@ Expr TypeChecker::getTypeInternal(Expr& e, std::ostream& out) case Kind::HEXADECIMAL: case Kind::BINARY: case Kind::STRING: + { + Kind k = e->getKind(); // use the literal type rule - return d_literalTypeRules[e->getKind()]; + Expr t = d_literalTypeRules[k]; + if (t==nullptr) + { + t = d_state.mkBuiltinType(k); + d_literalTypeRules[k] = t; + } + return t; + } + break; default: break; }