Prevent case compilation from crashing and burning.
This commit is contained in:
parent
b03e68bb28
commit
87b51819e8
10
13/ast.cpp
10
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);
|
input_type = mgr.resolve(case_type, var);
|
||||||
type_app* app_type;
|
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;
|
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);
|
of->compile(env, into);
|
||||||
into.push_back(instruction_ptr(new instruction_eval()));
|
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);
|
compile_case<case_strategy_data>(*this, env, data, into);
|
||||||
return;
|
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") {
|
if(internal->name == "Bool") {
|
||||||
compile_case<case_strategy_bool>(*this, env, data, into);
|
compile_case<case_strategy_bool>(*this, env, data, into);
|
||||||
return;
|
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 {
|
void ast_let::print(int indent, std::ostream& to) const {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user