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