Don't add path instructions for newtypes that decay into their args

This commit is contained in:
Ayaz Hafiz 2022-07-21 14:57:17 -04:00 committed by Folkert
parent d4ad981448
commit eee13a4aa3
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
5 changed files with 44 additions and 11 deletions

View file

@ -977,9 +977,16 @@ fn needs_tests(pattern: &Pattern) -> bool {
match pattern {
Identifier(_) | Underscore => false,
NewtypeDestructure { arguments, .. } => {
// Newtypes that only have one argument decay immediately into that argument, so no
// test for them is needed.
//
// Newtypes with > 1 argument decay into a struct of those arguments, and we'll need to
// read the appropriate argument in the struct when constructing the decision tree.
arguments.len() != 1
}
RecordDestructure(_, _)
| NewtypeDestructure { .. }
| AppliedTag { .. }
| OpaqueUnwrap { .. }
| BitLiteral { .. }

View file

@ -7418,7 +7418,9 @@ mod solve_expr {
Wrapper (AlternatePayload str) -> str
"#
),
&[r#"Wrapper (Payload "err") : [Wrapper [AlternatePayload Str, Payload Str]]"#,]
@r###"
Wrapper (Payload "err") : [Wrapper [AlternatePayload Str, Payload Str]]
"###
)
}
}

View file

@ -1805,3 +1805,19 @@ fn instantiate_annotated_as_recursive_alias_multiple_polymorphic_expr() {
i64
)
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn issue_3560_nested_tag_constructor_is_newtype() {
assert_evals_to!(
indoc!(
r#"
when Wrapper (Payload "err") is
Wrapper (Payload str) -> str
Wrapper (AlternatePayload str) -> str
"#
),
RocStr::from("err"),
RocStr
)
}

View file

@ -0,0 +1,13 @@
procedure Test.0 ():
let Test.10 : Str = "err";
let Test.9 : [C Str, C Str] = TagId(1) Test.10;
joinpoint Test.8:
let Test.4 : Str = UnionAtIndex (Id 0) (Index 0) Test.9;
inc Test.4;
dec Test.9;
ret Test.4;
in
let Test.3 : Str = UnionAtIndex (Id 1) (Index 0) Test.9;
inc Test.3;
dec Test.9;
ret Test.3;

View file

@ -1886,17 +1886,12 @@ fn encode_derived_tag_two_payloads_string() {
}
#[mono_test]
fn issue_3560_nested_tag_union() {
fn issue_3560_nested_tag_constructor_is_newtype() {
indoc!(
r#"
app "test"
imports [Encode.{ toEncoder }, Json]
provides [main] to "./platform"
main =
when Wrapper (Payload "err") is
Wrapper (Payload str) -> str
Wrapper (AlternatePayload str) -> str
when Wrapper (Payload "err") is
Wrapper (Payload str) -> str
Wrapper (AlternatePayload str) -> str
"#
)
}