Skip to content

Commit

Permalink
Adds function return type unification. (#6490)
Browse files Browse the repository at this point in the history
## Description

The function return type unification was missing, leading to generic
functions not being resolved based on the return type.

## Checklist

- [x] I have linked to any relevant issues.
- [x] I have commented my code, particularly in hard-to-understand
areas.
- [ ] I have updated the documentation where relevant (API docs, the
reference, and the Sway book).
- [ ] If my change requires substantial documentation changes, I have
[requested support from the DevRel
team](https://github.com/FuelLabs/devrel-requests/issues/new/choose)
- [x] I have added tests that prove my fix is effective or that my
feature works.
- [x] I have added (or requested a maintainer to add) the necessary
`Breaking*` or `New Feature` labels where relevant.
- [x] I have done my best to ensure that my PR adheres to [the Fuel Labs
Code Review
Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md).
- [x] I have requested a review from the relevant team or maintainers.

---------

Co-authored-by: Joshua Batty <[email protected]>
Co-authored-by: IGI-111 <[email protected]>
  • Loading branch information
3 people authored Sep 4, 2024
1 parent 253330d commit a81c42e
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,17 @@ pub(crate) fn instantiate_function_application(
&function_decl.parameters,
)?;

// unify function return type with current ctx.type_annotation().
engines.te().unify_with_generic(
handler,
engines,
function_decl.return_type.type_id,
ctx.type_annotation(),
&call_path_binding.span(),
"Function return type does not match up with local type annotation.",
None,
);

let mut function_return_type_id = function_decl.return_type.type_id;

let function_ident: IdentUnique = function_decl.name.clone().into();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
category = "fail"

# check: let _g: u32 = three_generics(true, "foo", 10);
# nextln: $()Mismatched types.
# nextln: $()expected: u32
# nextln: $()found: str.
# nextln: $()help: Function return type does not match up with local type annotation.

# check: let _g: u32 = three_generics(true, "foo", 10);
# nextln: $()Mismatched types.
# nextln: $()expected: u32
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,4 +188,4 @@ category = "fail"
#check: $()error
#check: $()This path must return a value of type "u64" from function "items_2_trait_function", but it does not.

#check: $()Aborting due to 40 errors.
#check: $()Aborting due to 42 errors.
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
category = "fail"

# check: $()error
# check: $()MyOption::Some::<V>(foo::<V>(value))
# nextln: $()Mismatched types.
# nextln: $()expected: V
# nextln: $()found: MyOption<V>.
# nextln: $()Function return type does not match up with local type annotation.

# check: $()error
# check: $()MyOption::Some::<V>(foo::<V>(value))
# nextln: $()Mismatched types.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
out
target
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[[package]]
name = "core"
source = "path+from-root-D73E65B1F4E48513"

[[package]]
name = "function_return_type_unification"
source = "member"
dependencies = ["std"]

[[package]]
name = "std"
source = "path+from-root-D73E65B1F4E48513"
dependencies = ["core"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[project]
name = "function_return_type_unification"
authors = ["Fuel Labs <[email protected]>"]
entry = "main.sw"
license = "Apache-2.0"

[dependencies]
std = { path = "../../../../reduced_std_libs/sway-lib-std-assert" }
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
script;

trait Build {
fn build() -> Self;
}

impl Build for u32 {
fn build() -> Self {
31
}
}

impl Build for u64 {
fn build() -> Self {
63
}
}

fn produce<T>() -> T
where T: Build,
{
T::build()
}

fn main() -> bool {
let _:u32 = produce();

true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
category = "run"
expected_result = { action = "return", value = 1 }
expected_result_new_encoding = { action = "return_data", value = "01" }
validate_abi = false

0 comments on commit a81c42e

Please sign in to comment.