Skip to content

Commit c83a9b4

Browse files
author
Francois Brodeur
authored
Record update missing fields fix (#314)
Record update missing fields fix for type any
1 parent 2108ccb commit c83a9b4

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

src/typechecker.erl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1513,7 +1513,7 @@ do_type_check_expr(Env, {record, Anno, Expr, Record, Fields}) ->
15131513
RecTy = {type, erl_anno:new(0), record, [{atom, erl_anno:new(0), Record}]},
15141514
{VB1, Cs1} = type_check_expr_in(Env, RecTy, Expr),
15151515
Rec = get_record_fields(Record, Anno, Env#env.tenv),
1516-
{VB2, Cs2} = type_check_fields(Env, Rec, Fields),
1516+
{VB2, Cs2} = type_check_fields_for_update(Env, Rec, Fields),
15171517
{RecTy, union_var_binds(VB1, VB2, Env#env.tenv), constraints:combine(Cs1, Cs2)};
15181518
do_type_check_expr(Env, {record, Anno, Record, Fields}) ->
15191519
RecTy = {type, erl_anno:new(0), record, [{atom, erl_anno:new(0), Record}]},
@@ -1703,6 +1703,9 @@ create_fun_type(Arity, RetTy) when is_integer(Arity) ->
17031703
ParTys = lists:duplicate(Arity, type(any)),
17041704
type('fun', [type(product, ParTys), RetTy]).
17051705

1706+
type_check_fields_for_update(Env, Rec, Fields) ->
1707+
type_check_fields(Env, Rec, Fields, should_not_be_inspected).
1708+
17061709
type_check_fields(Env, Rec, Fields) ->
17071710
UnAssignedFields = get_unassigned_fields(Fields, Rec),
17081711
type_check_fields(Env, Rec, Fields, UnAssignedFields).

test/should_pass/records.erl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,13 @@ record_as_tuple(R) ->
6464

6565
-record(rec_any, {f}).
6666
f(#rec_any{f = F} = R) -> F.
67+
68+
-record(nospec_update_bug, {
69+
a :: integer(),
70+
b :: integer()
71+
}).
72+
73+
nospec_update_bug(Rec) ->
74+
Rec#nospec_update_bug{
75+
b = 0
76+
}.

0 commit comments

Comments
 (0)