Skip to content

Commit

Permalink
Merge pull request #7178 from JRI98/fix_6240
Browse files Browse the repository at this point in the history
Fix #6240
  • Loading branch information
lukewilliamboswell authored Oct 24, 2024
2 parents 0b0ed3c + 511308d commit 06996d8
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 3 deletions.
72 changes: 72 additions & 0 deletions crates/compiler/load/tests/test_reporting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14426,4 +14426,76 @@ All branches in an `if` must have the same type!
// ),
// @r""
// );

test_report!(
issue_6240_1,
indoc!(
r"
{}.abcde
"
),
@r###"
── TYPE MISMATCH in /code/proj/Main.roc ────────────────────────────────────────
This record doesn’t have a `abcde` field:
4│ {}.abcde
^^^^^^^^
In fact, it’s a record with no fields at all!
"###
);

test_report!(
issue_6240_2,
indoc!(
r#"
("", "").abcde
"#
),
@r###"
── TYPE MISMATCH in /code/proj/Main.roc ────────────────────────────────────────
This expression is used in an unexpected way:
4│ ("", "").abcde
^^^^^^^^^^^^^^
It is a tuple of type:
(
Str,
Str,
)a
But you are trying to use it as:
{ abcde : * }b
"###
);

test_report!(
issue_6240_3,
indoc!(
r"
{}.0
"
),
@r###"
── TYPE MISMATCH in /code/proj/Main.roc ────────────────────────────────────────
This expression is used in an unexpected way:
4│ {}.0
^^^^
It is a record of type:
{}
But you are trying to use it as:
(*)b
"###
);
}
19 changes: 16 additions & 3 deletions crates/compiler/mono/src/ir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4978,12 +4978,17 @@ pub fn with_hole<'a>(
}
}

let struct_index = match index {
Some(index) => index,
None => return runtime_error(env, "No such field in record"),
};

compile_struct_like_access(
env,
procs,
layout_cache,
field_layouts,
index.expect("field not in its own type") as _,
struct_index,
*loc_expr,
record_var,
hole,
Expand Down Expand Up @@ -5076,12 +5081,17 @@ pub fn with_hole<'a>(
}
}

let tuple_index = match final_index {
Some(index) => index as u64,
None => return runtime_error(env, "No such index in tuple"),
};

compile_struct_like_access(
env,
procs,
layout_cache,
field_layouts,
final_index.expect("elem not in its own type") as u64,
tuple_index,
*loc_expr,
tuple_var,
hole,
Expand Down Expand Up @@ -8055,7 +8065,10 @@ fn can_reuse_symbol<'a>(
.enumerate()
.find_map(|(current, (label, _, _))| (label == *field).then_some(current));

let struct_index = index.expect("field not in its own type");
let struct_index = match index {
Some(index) => index as u64,
None => return NotASymbol,
};

let struct_symbol = possible_reuse_symbol_or_specialize(
env,
Expand Down

0 comments on commit 06996d8

Please sign in to comment.