Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: don't eagerly error on cast expressions (#5635)
# Description ## Problem Resolves #4994 ## Summary Before this PR, if you had something like: ```rust x as Field ``` and x's type was an unbound type variable, the compiler would immediately produce an error. In this PR that check is delayed. In order to do that, the cast can only succeed if `x` is an integer, a field... or a bool. We don't have a polymorphic type that's one of those, so this PR introduces that. (note: I think what I'm doing here is correct, but let me know if it's not!) Then, because we now have three different polymorphic types, I put them all into an enum, mainly because some of this polymorphic handling was sometimes duplicated, or almost the same with slight changes. ## Additional Context I'm not sure I covered all the scenarios where `IntegerOrFieldOrBool` should be handled. I'm not even sure I handled correctly the cases I needed to handle. This code now works fine: ```rust fn main() { let a: [u8; 10] = [1; 10]; let b: [Field; 10] = a.map(|x| x as Field); } ``` Also this one: ```rust fn main() { let a: [u8; 10] = [true; 10]; let b: [Field; 10] = a.map(|x| x as Field); } ``` However, this code correctly fails to compile, but the error is a bit strange: ```rust fn main() { let a = ["a"; 10]; let b: [Field; 10] = a.map(|x| x as Field); } ``` The error is: ``` error: Expected type fn(str<1>) -> _ with env _, found type fn(Integer | Field | bool) -> Field ┌─ src/main.nr:3:32 │ 3 │ let b: [Field; 10] = a.map(|x| x as Field); │ -------------- ``` but maybe that's expected? (I also don't know what type we could show here instead of `Integer | Field | bool`) ## Documentation\* Check one: - [x] No documentation needed. - [ ] Documentation included in this PR. - [ ] **[For Experimental Features]** Documentation to be submitted in a separate PR. # PR Checklist\* - [x] I have tested the changes locally. - [x] I have formatted the changes with [Prettier](https://prettier.io/) and/or `cargo fmt` on default settings. --------- Co-authored-by: jfecher <jake@aztecprotocol.com>
- Loading branch information