diff --git a/crates/compiler/solve/src/ability.rs b/crates/compiler/solve/src/ability.rs index dc88e6a877..cf6c2af381 100644 --- a/crates/compiler/solve/src/ability.rs +++ b/crates/compiler/solve/src/ability.rs @@ -584,7 +584,15 @@ trait DerivableVisitor { let descend = Self::visit_record(var)?; if descend.0 { push_var_slice!(fields.variables()); - stack.push(ext); + if !matches!( + subs.get_content_without_compacting(ext), + Content::FlexVar(_) | Content::RigidVar(_) + ) { + // TODO: currently, just we suppose the presence of a flex var may + // include more or less things which we can derive. But, we should + // instead recurse here, and add a `t ~ u | u has Decode` constraint as needed. + stack.push(ext); + } } } TagUnion(tags, ext) => { diff --git a/crates/compiler/test_gen/src/gen_abilities.rs b/crates/compiler/test_gen/src/gen_abilities.rs index 600261c4ab..391f61e359 100644 --- a/crates/compiler/test_gen/src/gen_abilities.rs +++ b/crates/compiler/test_gen/src/gen_abilities.rs @@ -954,11 +954,7 @@ fn encode_then_decode_list_of_lists_of_strings() { } #[test] -#[cfg(all( - any(feature = "gen-llvm"), // currently fails on gen-wasm - not(feature = "gen-llvm-wasm") // hits a stack limit in wasm3 -))] -#[ignore] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn decode_record_two_fields() { assert_evals_to!( indoc!( @@ -967,11 +963,11 @@ fn decode_record_two_fields() { main = when Str.toUtf8 "{\"first\":\"ab\",\"second\":\"cd\"}" |> Decode.fromBytes Json.fromUtf8 is - Ok { first, second } -> Str.concat first second + Ok {first: "ab", second: "cd"} -> "abcd" _ -> "something went wrong" "# ), - RocStr::from("ab "), + RocStr::from("abcd"), RocStr ) }