Browse Source

Prevent case compilation from crashing and burning.

search
Danila Fedorin 2 years ago
parent
commit
56f0dbd02f
  1. 10
      code/compiler/13/ast.cpp

10
code/compiler/13/ast.cpp

@ -204,10 +204,6 @@ type_ptr ast_case::typecheck(type_mgr& mgr, type_env_ptr& env) {
input_type = mgr.resolve(case_type, var);
type_app* app_type;
// if(!(app_type = dynamic_cast<type_app*>(input_type.get())) ||
// !dynamic_cast<type_data*>(app_type->constructor.get())) {
// throw type_error("attempting case analysis of non-data type", of->loc);
// }
return branch_type;
}
@ -407,17 +403,17 @@ void ast_case::compile(const env_ptr& env, std::vector<instruction_ptr>& into) c
of->compile(env, into);
into.push_back(instruction_ptr(new instruction_eval()));
if((data = dynamic_cast<type_data*>(app_type->constructor.get()))) {
if(app_type && (data = dynamic_cast<type_data*>(app_type->constructor.get()))) {
compile_case<case_strategy_data>(*this, env, data, into);
return;
} else if((internal = dynamic_cast<type_internal*>(app_type->constructor.get()))) {
} else if(app_type && (internal = dynamic_cast<type_internal*>(app_type->constructor.get()))) {
if(internal->name == "Bool") {
compile_case<case_strategy_bool>(*this, env, data, into);
return;
}
}
throw std::runtime_error("no known way to compile case expression");
throw type_error("attempting unsupported case analysis", of->loc);
}
void ast_let::print(int indent, std::ostream& to) const {

Loading…
Cancel
Save