From 3d8e0804bc22a8706caf2fb7251792e1c84e0efc Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Mon, 15 Apr 2024 15:28:06 -0700 Subject: [PATCH] Add more defaulting --- examples/basic/{test1.ngr => test0001.ngr} | 0 examples/basic/{test2.ngr => test0002.ngr} | 0 examples/basic/test0003.ngr | 1 + examples/basic/test0004.ngr | 4 +++ src/type_infer/solve.rs | 29 +++++++++++++++++----- 5 files changed, 28 insertions(+), 6 deletions(-) rename examples/basic/{test1.ngr => test0001.ngr} (100%) rename examples/basic/{test2.ngr => test0002.ngr} (100%) create mode 100644 examples/basic/test0003.ngr create mode 100644 examples/basic/test0004.ngr 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