diff --git a/examples/basic/test1.ngr b/examples/basic/test0001.ngr similarity index 100% rename from examples/basic/test1.ngr rename to examples/basic/test0001.ngr diff --git a/examples/basic/test2.ngr b/examples/basic/test0002.ngr similarity index 100% rename from examples/basic/test2.ngr rename to examples/basic/test0002.ngr diff --git a/examples/basic/test0003.ngr b/examples/basic/test0003.ngr new file mode 100644 index 0000000..fb4df05 --- /dev/null +++ b/examples/basic/test0003.ngr @@ -0,0 +1 @@ +v = -2370389138213399653i64; \ No newline at end of file diff --git a/examples/basic/test0004.ngr b/examples/basic/test0004.ngr new file mode 100644 index 0000000..cc0deb6 --- /dev/null +++ b/examples/basic/test0004.ngr @@ -0,0 +1,4 @@ +function u (t,h,z,u,a,f,c) 27u8; +function s (p,y,k) 10318938949979263534u64; +o = -98i8; +print o; \ No newline at end of file diff --git a/src/type_infer/solve.rs b/src/type_infer/solve.rs index e0b69a7..b18d284 100644 --- a/src/type_infer/solve.rs +++ b/src/type_infer/solve.rs @@ -847,22 +847,39 @@ pub fn solve_constraints( if !changed_something { let mut addendums = vec![]; - new_constraints.retain(|x| { - if let Constraint::ConstantNumericType(loc, t) = x { + macro_rules! default_type { + ($addendums: ident, $loc: ident, $t: ident) => { let resty = TypeOrVar::Primitive(PrimitiveType::U64); - addendums.push(Constraint::Equivalent( - loc.clone(), - t.clone(), + $addendums.push(Constraint::Equivalent( + $loc.clone(), + $t.clone(), resty.clone(), )); - warnings.push(TypeInferenceWarning::DefaultedTo(loc.clone(), resty)); + warnings.push(TypeInferenceWarning::DefaultedTo($loc.clone(), resty)); tracing::trace!("Adding number equivalence"); + }; + } + + new_constraints.retain(|x| { + if let Constraint::ConstantNumericType(loc, t) = x { + default_type!(addendums, loc, t); false } else { true } }); + if addendums.is_empty() { + new_constraints.retain(|x| { + if let Constraint::IsSomething(loc, t) = x { + default_type!(addendums, loc, t); + false + } else { + true + } + }); + } + if addendums.is_empty() { if errors.is_empty() { errors = new_constraints