#pragma once #include #include #include "type.hpp" #include "location.hh" #include "parse_driver.hpp" using maybe_location = std::optional; struct type_error : std::exception { std::string description; std::optional loc; type_error(std::string d, maybe_location l = std::nullopt) : description(std::move(d)), loc(std::move(l)) {} const char* what() const noexcept override; void pretty_print(std::ostream& to, parse_driver& drv); }; struct unification_error : public type_error { type_ptr left; type_ptr right; unification_error(type_ptr l, type_ptr r, maybe_location loc = std::nullopt) : left(std::move(l)), right(std::move(r)), type_error("failed to unify types", std::move(loc)) {} void pretty_print(std::ostream& to, parse_driver& drv, type_mgr& mgr); };