fix: should not check args.is_empty()

This commit is contained in:
rvcas 2020-12-22 09:05:58 -05:00
parent e91fc2f1ff
commit b734b3de58
3 changed files with 25 additions and 18 deletions

View file

@ -12,7 +12,6 @@ use roc_module::ident::{Ident, Lowercase};
use roc_module::symbol::{ModuleId, Symbol}; use roc_module::symbol::{ModuleId, Symbol};
use roc_region::all::{Located, Region}; use roc_region::all::{Located, Region};
use roc_types::boolean_algebra::Bool; use roc_types::boolean_algebra::Bool;
use roc_types::builtin_aliases;
use roc_types::subs::{VarStore, Variable}; use roc_types::subs::{VarStore, Variable};
use roc_types::types::AnnotationSource::{self, *}; use roc_types::types::AnnotationSource::{self, *};
use roc_types::types::Type::{self, *}; use roc_types::types::Type::{self, *};
@ -167,9 +166,9 @@ fn constrain_pattern(
} }
NumLiteral(inner_var, _) => { NumLiteral(inner_var, _) => {
let (num_uvar, val_uvar, num_type, num_var) = unique_unbound_num(*inner_var, var_store); let (num_var, num_type) = unique_unbound_num(*inner_var, var_store);
state.constraints.push(exists( state.constraints.push(exists(
vec![val_uvar, num_uvar, num_var, *inner_var], vec![num_var, *inner_var],
Constraint::Pattern(pattern.region, PatternCategory::Num, num_type, expected), Constraint::Pattern(pattern.region, PatternCategory::Num, num_type, expected),
)); ));
} }
@ -407,21 +406,16 @@ fn constrain_pattern(
} }
} }
fn unique_unbound_num( fn unique_unbound_num(inner_var: Variable, var_store: &mut VarStore) -> (Variable, Type) {
inner_var: Variable,
var_store: &mut VarStore,
) -> (Variable, Variable, Type, Variable) {
let num_var = var_store.fresh(); let num_var = var_store.fresh();
let num_uvar = var_store.fresh();
let val_uvar = var_store.fresh();
let val_type = Type::Variable(inner_var); let val_type = Type::Variable(inner_var);
let val_utype = attr_type(Bool::variable(val_uvar), val_type); let val_utype = attr_type(Bool::variable(num_var), val_type);
let num_utype = num_num(val_utype); let num_utype = num_num(val_utype);
let num_type = attr_type(Bool::variable(num_uvar), num_utype); let num_type = attr_type(Bool::variable(num_var), num_utype);
(num_uvar, val_uvar, num_type, num_var) (num_var, num_type)
} }
fn unique_int(var_store: &mut VarStore) -> (Variable, Type) { fn unique_int(var_store: &mut VarStore) -> (Variable, Type) {
@ -464,10 +458,10 @@ pub fn constrain_expr(
match expr { match expr {
Num(inner_var, _) => { Num(inner_var, _) => {
let var = var_store.fresh(); let var = var_store.fresh();
let (num_uvar, val_uvar, num_type, num_var) = unique_unbound_num(*inner_var, var_store); let (num_var, num_type) = unique_unbound_num(*inner_var, var_store);
exists( exists(
vec![var, *inner_var, val_uvar, num_uvar, num_var], vec![var, *inner_var, num_var],
And(vec![ And(vec![
Eq( Eq(
Type::Variable(var), Type::Variable(var),

View file

@ -1643,6 +1643,17 @@ fn to_diff<'b>(
ErrorType::Type(Symbol::NUM_F64, _) => true, ErrorType::Type(Symbol::NUM_F64, _) => true,
ErrorType::Alias(Symbol::NUM_F64, _, _) => true, ErrorType::Alias(Symbol::NUM_F64, _, _) => true,
ErrorType::Type(Symbol::NUM_NUM, args) => match &args.get(0) {
Some(ErrorType::Type(Symbol::NUM_FLOATINGPOINT, _)) => true,
Some(ErrorType::Alias(Symbol::NUM_FLOATINGPOINT, _, _)) => true,
_ => false,
},
ErrorType::Alias(Symbol::NUM_NUM, args, _) => match &args.get(0) {
Some((_, ErrorType::Type(Symbol::NUM_FLOATINGPOINT, _))) => true,
Some((_, ErrorType::Alias(Symbol::NUM_FLOATINGPOINT, _, _))) => true,
_ => false,
},
_ => false, _ => false,
}; };

View file

@ -77,6 +77,8 @@ fn find_names_needed(
use crate::subs::Content::*; use crate::subs::Content::*;
use crate::subs::FlatType::*; use crate::subs::FlatType::*;
dbg!(variable);
while let Some((recursive, _chain)) = subs.occurs(variable) { while let Some((recursive, _chain)) = subs.occurs(variable) {
let content = subs.get_without_compacting(recursive).content; let content = subs.get_without_compacting(recursive).content;
match content { match content {
@ -753,10 +755,10 @@ fn write_apply(
match &arg_content { match &arg_content {
Content::Structure(FlatType::Apply(symbol, nested_args)) => match *symbol { Content::Structure(FlatType::Apply(symbol, nested_args)) => match *symbol {
Symbol::NUM_INTEGER if nested_args.is_empty() => { Symbol::NUM_INTEGER if nested_args.len() == 1 => {
buf.push_str("I64"); buf.push_str("I64");
} }
Symbol::NUM_FLOATINGPOINT if nested_args.is_empty() => { Symbol::NUM_FLOATINGPOINT if nested_args.len() == 1 => {
buf.push_str("F64"); buf.push_str("F64");
} }
Symbol::ATTR_ATTR => match nested_args Symbol::ATTR_ATTR => match nested_args
@ -767,10 +769,10 @@ fn write_apply(
double_nested_symbol, double_nested_symbol,
double_nested_args, double_nested_args,
))) => match double_nested_symbol { ))) => match double_nested_symbol {
Symbol::NUM_INTEGER if double_nested_args.is_empty() => { Symbol::NUM_INTEGER if double_nested_args.len() == 1 => {
buf.push_str("I64"); buf.push_str("I64");
} }
Symbol::NUM_FLOATINGPOINT if double_nested_args.is_empty() => { Symbol::NUM_FLOATINGPOINT if double_nested_args.len() == 1 => {
buf.push_str("F64"); buf.push_str("F64");
} }
_ => default_case(subs, arg_content), _ => default_case(subs, arg_content),