1111
1212parallel_match (Meta , Expr , S , #{context := match } = E ) ->
1313 # elixir_ex {vars = {_Read , Write }} = S ,
14- Matches = unpack_match (Expr , Meta , []),
14+ Matches = unpack_match (Expr , Meta , [], E ),
1515
1616 {[{_ , EHead } | ETail ], EWrites , SM , EM } =
1717 lists :foldl (fun ({EMeta , Match }, {AccMatches , AccWrites , SI , EI }) ->
@@ -31,9 +31,13 @@ parallel_match(Meta, Expr, S, #{context := match} = E) ->
3131 VWrite = (Write /= false ) andalso elixir_env :merge_vars (Write , PWrites ),
3232 {EMatch , SM # elixir_ex {vars = {VRead , VWrite }, prematch = {PRead , PCycles , PInfo }}, EM }.
3333
34- unpack_match ({'=' , Meta , [Left , Right ]}, _Meta , Acc ) ->
35- unpack_match (Left , Meta , unpack_match (Right , Meta , Acc ));
36- unpack_match (Node , Meta , Acc ) ->
34+ unpack_match ({'=' , Meta , [{_ , VarMeta , _ } = Node , Node ]}, _Meta , Acc , E ) ->
35+ % % TODO: remove this clause on Elixir v1.23
36+ file_warn (VarMeta , ? key (E , file ), ? MODULE , {duplicate_match , Node }),
37+ unpack_match (Node , Meta , Acc , E );
38+ unpack_match ({'=' , Meta , [Left , Right ]}, _Meta , Acc , E ) ->
39+ unpack_match (Left , Meta , unpack_match (Right , Meta , Acc , E ), E );
40+ unpack_match (Node , Meta , Acc , _E ) ->
3741 [{Meta , Node } | Acc ].
3842
3943store_cycles ([Write | Writes ], {Cycles , SkipList }, Acc ) ->
@@ -532,6 +536,13 @@ origin(Meta, Default) ->
532536 false -> Default
533537 end .
534538
539+ format_error ({duplicate_match , Expr }) ->
540+ String = 'Elixir.Macro' :to_string (Expr ),
541+ io_lib :format (
542+ " this pattern is matched against itself inside a match: ~ts = ~ts " ,
543+ [String , String ]
544+ );
545+
535546format_error ({recursive , Vars , TypeExpr }) ->
536547 Code =
537548 case TypeExpr of
0 commit comments