LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File 0561-sys_core_fold_lists-Propagate-annotations-in-expansi.patch of Package erlang (Project home:Ledest:erlang:20)

From adebeb157080af1f686a5ba844fb687cab093676 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Fri, 1 Feb 2019 05:22:28 +0100
Subject: [PATCH 3/5] sys_core_fold_lists: Propagate annotations in expansion
 of lists functions

There could be a warning with a `no_file` atom instead of filename
and line number.
---
 lib/compiler/src/sys_core_fold_lists.erl | 101 +++++++++++++++++++------------
 1 file changed, 61 insertions(+), 40 deletions(-)

diff --git a/lib/compiler/src/sys_core_fold_lists.erl b/lib/compiler/src/sys_core_fold_lists.erl
index 9867fab46a..e93b435011 100644
--- a/lib/compiler/src/sys_core_fold_lists.erl
+++ b/lib/compiler/src/sys_core_fold_lists.erl
@@ -37,22 +37,27 @@ call(#c_call{anno=Anno}, lists, all, [Arg1,Arg2]) ->
     Xs = #c_var{name='Xs'},
     X = #c_var{name='X'},
     Err1 = #c_tuple{es=[#c_literal{val='case_clause'}, X]},
-    CC1 = #c_clause{pats=[#c_literal{val=true}], guard=#c_literal{val=true},
+    CC1 = #c_clause{anno=Anno,
+                    pats=[#c_literal{val=true}], guard=#c_literal{val=true},
 		    body=#c_apply{anno=Anno, op=Loop, args=[Xs]}},
-    CC2 = #c_clause{pats=[#c_literal{val=false}], guard=#c_literal{val=true},
+    CC2 = #c_clause{anno=Anno,
+                    pats=[#c_literal{val=false}], guard=#c_literal{val=true},
 		    body=#c_literal{val=false}},
-    CC3 = #c_clause{pats=[X], guard=#c_literal{val=true},
+    CC3 = #c_clause{anno=Anno,
+                    pats=[X], guard=#c_literal{val=true},
 		    body=match_fail(Anno, Err1)},
-    C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
+    C1 = #c_clause{anno=Anno,
+                   pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
 		   body=#c_case{arg=#c_apply{anno=Anno, op=F, args=[X]},
 				clauses = [CC1, CC2, CC3]}},
-    C2 = #c_clause{pats=[#c_literal{val=[]}],
+    C2 = #c_clause{anno=Anno,
+                   pats=[#c_literal{val=[]}],
 		   guard=#c_call{module=#c_literal{val=erlang},
 				 name=#c_literal{val=is_function},
 				 args=[F, #c_literal{val=1}]},
 		   body=#c_literal{val=true}},
     Err2 = #c_tuple{es=[#c_literal{val='function_clause'}, F, Xs]},
-    C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
+    C3 = #c_clause{anno=Anno, pats=[Xs], guard=#c_literal{val=true},
 		   body=match_fail([{function_name,{'lists^all',1}}|Anno], Err2)},
     Fun = #c_fun{vars=[Xs],
 		 body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
@@ -66,16 +71,21 @@ call(#c_call{anno=Anno}, lists, any, [Arg1,Arg2]) ->
     Xs = #c_var{name='Xs'},
     X = #c_var{name='X'},
     Err1 = #c_tuple{es=[#c_literal{val='case_clause'}, X]},
-    CC1 = #c_clause{pats=[#c_literal{val=true}], guard=#c_literal{val=true},
+    CC1 = #c_clause{anno=Anno,
+                    pats=[#c_literal{val=true}], guard=#c_literal{val=true},
 		    body=#c_literal{val=true}},
-    CC2 = #c_clause{pats=[#c_literal{val=false}], guard=#c_literal{val=true},
+    CC2 = #c_clause{anno=Anno,
+                    pats=[#c_literal{val=false}], guard=#c_literal{val=true},
 		    body=#c_apply{anno=Anno, op=Loop, args=[Xs]}},
-    CC3 = #c_clause{pats=[X], guard=#c_literal{val=true},
+    CC3 = #c_clause{anno=Anno,
+                    pats=[X], guard=#c_literal{val=true},
 		    body=match_fail(Anno, Err1)},
-    C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
+    C1 = #c_clause{anno=Anno,
+                   pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
 		   body=#c_case{arg=#c_apply{anno=Anno, op=F, args=[X]},
 				clauses = [CC1, CC2, CC3]}},
-    C2 = #c_clause{pats=[#c_literal{val=[]}],
+    C2 = #c_clause{anno=Anno,
+                   pats=[#c_literal{val=[]}],
 		   guard=#c_call{module=#c_literal{val=erlang},
 				 name=#c_literal{val=is_function},
 				 args=[F, #c_literal{val=1}]},
@@ -94,16 +104,17 @@ call(#c_call{anno=Anno}, lists, foreach, [Arg1,Arg2]) ->
     F = #c_var{name='F'},
     Xs = #c_var{name='Xs'},
     X = #c_var{name='X'},
-    C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
+    C1 = #c_clause{anno=Anno,
+                   pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
 		   body=#c_seq{arg=#c_apply{anno=Anno, op=F, args=[X]},
 			       body=#c_apply{anno=Anno, op=Loop, args=[Xs]}}},
-    C2 = #c_clause{pats=[#c_literal{val=[]}],
+    C2 = #c_clause{anno=Anno, pats=[#c_literal{val=[]}],
 		   guard=#c_call{module=#c_literal{val=erlang},
 				 name=#c_literal{val=is_function},
 				 args=[F, #c_literal{val=1}]},
 		   body=#c_literal{val=ok}},
     Err = #c_tuple{es=[#c_literal{val='function_clause'}, F, Xs]},
-    C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
+    C3 = #c_clause{anno=Anno, pats=[Xs], guard=#c_literal{val=true},
 		   body=match_fail([{function_name,{'lists^foreach',1}}|Anno], Err)},
     Fun = #c_fun{vars=[Xs],
 		 body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
@@ -117,7 +128,8 @@ call(#c_call{anno=Anno}, lists, map, [Arg1,Arg2]) ->
     Xs = #c_var{name='Xs'},
     X = #c_var{name='X'},
     H = #c_var{name='H'},
-    C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
+    C1 = #c_clause{anno=Anno,
+                   pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
 		   body=#c_let{vars=[H], arg=#c_apply{anno=Anno,
 						      op=F,
 						      args=[X]},
@@ -126,7 +138,7 @@ call(#c_call{anno=Anno}, lists, map, [Arg1,Arg2]) ->
 					    tl=#c_apply{anno=Anno,
 							op=Loop,
 							args=[Xs]}}}},
-    C2 = #c_clause{pats=[#c_literal{val=[]}],
+    C2 = #c_clause{anno=Anno, pats=[#c_literal{val=[]}],
 		   guard=#c_call{module=#c_literal{val=erlang},
 				 name=#c_literal{val=is_function},
 				 args=[F, #c_literal{val=1}]},
@@ -146,7 +158,8 @@ call(#c_call{anno=Anno}, lists, flatmap, [Arg1,Arg2]) ->
     Xs = #c_var{name='Xs'},
     X = #c_var{name='X'},
     H = #c_var{name='H'},
-    C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
+    C1 = #c_clause{anno=Anno,
+                   pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
 		   body=#c_let{vars=[H],
 			       arg=#c_apply{anno=Anno, op=F, args=[X]},
 			       body=#c_call{anno=[compiler_generated|Anno],
@@ -156,13 +169,13 @@ call(#c_call{anno=Anno}, lists, flatmap, [Arg1,Arg2]) ->
 						  #c_apply{anno=Anno,
 							   op=Loop,
 							   args=[Xs]}]}}},
-    C2 = #c_clause{pats=[#c_literal{val=[]}],
+    C2 = #c_clause{anno=Anno, pats=[#c_literal{val=[]}],
 		   guard=#c_call{module=#c_literal{val=erlang},
 				 name=#c_literal{val=is_function},
 				 args=[F, #c_literal{val=1}]},
 		   body=#c_literal{val=[]}},
     Err = #c_tuple{es=[#c_literal{val='function_clause'}, F, Xs]},
-    C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
+    C3 = #c_clause{anno=Anno, pats=[Xs], guard=#c_literal{val=true},
 		   body=match_fail([{function_name,{'lists^flatmap',1}}|Anno], Err)},
     Fun = #c_fun{vars=[Xs],
 		 body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
@@ -177,11 +190,13 @@ call(#c_call{anno=Anno}, lists, filter, [Arg1,Arg2]) ->
     X = #c_var{name='X'},
     B = #c_var{name='B'},
     Err1 = #c_tuple{es=[#c_literal{val='case_clause'}, X]},
-    CC1 = #c_clause{pats=[#c_literal{val=true}], guard=#c_literal{val=true},
+    CC1 = #c_clause{anno=Anno,
+                    pats=[#c_literal{val=true}], guard=#c_literal{val=true},
 		    body=#c_cons{anno=[compiler_generated], hd=X, tl=Xs}},
-    CC2 = #c_clause{pats=[#c_literal{val=false}], guard=#c_literal{val=true},
+    CC2 = #c_clause{anno=Anno,
+                    pats=[#c_literal{val=false}], guard=#c_literal{val=true},
 		    body=Xs},
-    CC3 = #c_clause{pats=[X], guard=#c_literal{val=true},
+    CC3 = #c_clause{anno=Anno, pats=[X], guard=#c_literal{val=true},
 		    body=match_fail(Anno, Err1)},
     Case = #c_case{arg=B, clauses = [CC1, CC2, CC3]},
     C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
@@ -192,13 +207,15 @@ call(#c_call{anno=Anno}, lists, filter, [Arg1,Arg2]) ->
 							op=Loop,
 							args=[Xs]},
 					   body=Case}}},
-    C2 = #c_clause{pats=[#c_literal{val=[]}],
+    C2 = #c_clause{anno=Anno,
+                   pats=[#c_literal{val=[]}],
 		   guard=#c_call{module=#c_literal{val=erlang},
 				 name=#c_literal{val=is_function},
 				 args=[F, #c_literal{val=1}]},
 		   body=#c_literal{val=[]}},
     Err2 = #c_tuple{es=[#c_literal{val='function_clause'}, F, Xs]},
-    C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
+    C3 = #c_clause{anno=Anno,
+                   pats=[Xs], guard=#c_literal{val=true},
 		   body=match_fail([{function_name,{'lists^filter',1}}|Anno], Err2)},
     Fun = #c_fun{vars=[Xs],
 		 body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
@@ -212,19 +229,20 @@ call(#c_call{anno=Anno}, lists, foldl, [Arg1,Arg2,Arg3]) ->
     Xs = #c_var{name='Xs'},
     X = #c_var{name='X'},
     A = #c_var{name='A'},
-    C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
+    C1 = #c_clause{anno=Anno,
+                   pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
 		   body=#c_apply{anno=Anno,
 				 op=Loop,
 				 args=[Xs, #c_apply{anno=Anno,
 						    op=F,
 						    args=[X, A]}]}},
-    C2 = #c_clause{pats=[#c_literal{val=[]}],
+    C2 = #c_clause{anno=Anno, pats=[#c_literal{val=[]}],
 		   guard=#c_call{module=#c_literal{val=erlang},
 				 name=#c_literal{val=is_function},
 				 args=[F, #c_literal{val=2}]},
 		   body=A},
     Err = #c_tuple{es=[#c_literal{val='function_clause'}, F, A, Xs]},
-    C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
+    C3 = #c_clause{anno=Anno, pats=[Xs], guard=#c_literal{val=true},
 		   body=match_fail([{function_name,{'lists^foldl',2}}|Anno], Err)},
     Fun = #c_fun{vars=[Xs, A],
 		 body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
@@ -238,19 +256,20 @@ call(#c_call{anno=Anno}, lists, foldr, [Arg1,Arg2,Arg3]) ->
     Xs = #c_var{name='Xs'},
     X = #c_var{name='X'},
     A = #c_var{name='A'},
-    C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
+    C1 = #c_clause{anno=Anno,
+                   pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
 		   body=#c_apply{anno=Anno,
 				 op=F,
 				 args=[X, #c_apply{anno=Anno,
 						   op=Loop,
 						   args=[Xs, A]}]}},
-    C2 = #c_clause{pats=[#c_literal{val=[]}],
+    C2 = #c_clause{anno=Anno, pats=[#c_literal{val=[]}],
 		   guard=#c_call{module=#c_literal{val=erlang},
 				 name=#c_literal{val=is_function},
 				 args=[F, #c_literal{val=2}]},
 		   body=A},
     Err = #c_tuple{es=[#c_literal{val='function_clause'}, F, A, Xs]},
-    C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
+    C3 = #c_clause{anno=Anno, pats=[Xs], guard=#c_literal{val=true},
 		   body=match_fail([{function_name,{'lists^foldr',2}}|Anno], Err)},
     Fun = #c_fun{vars=[Xs, A],
 		 body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
@@ -266,13 +285,14 @@ call(#c_call{anno=Anno}, lists, mapfoldl, [Arg1,Arg2,Arg3]) ->
     Avar = #c_var{name='A'},
     Match =
 	fun (A, P, E) ->
-		C1 = #c_clause{pats=[P], guard=#c_literal{val=true}, body=E},
+		C1 = #c_clause{anno=Anno, pats=[P], guard=#c_literal{val=true}, body=E},
 		Err = #c_tuple{es=[#c_literal{val='badmatch'}, X]},
-		C2 = #c_clause{pats=[X], guard=#c_literal{val=true},
+		C2 = #c_clause{anno=Anno, pats=[X], guard=#c_literal{val=true},
 			       body=match_fail(Anno, Err)},
 		#c_case{arg=A, clauses=[C1, C2]}
 	end,
-    C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
+    C1 = #c_clause{anno=Anno,
+                   pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
 		   body=Match(#c_apply{anno=Anno, op=F, args=[X, Avar]},
 			      #c_tuple{es=[X, Avar]},
 %%% Tuple passing version
@@ -292,7 +312,7 @@ call(#c_call{anno=Anno}, lists, mapfoldl, [Arg1,Arg2,Arg3]) ->
 %%% 				     body=#c_values{es=[#c_cons{hd=X, tl=Xs},
 %%% 							A]}}
 			     )},
-    C2 = #c_clause{pats=[#c_literal{val=[]}],
+    C2 = #c_clause{anno=Anno, pats=[#c_literal{val=[]}],
 		   guard=#c_call{module=#c_literal{val=erlang},
 				 name=#c_literal{val=is_function},
 				 args=[F, #c_literal{val=2}]},
@@ -302,7 +322,7 @@ call(#c_call{anno=Anno}, lists, mapfoldl, [Arg1,Arg2,Arg3]) ->
 %%% Multiple-value version
 %%% 		   body=#c_values{es=[#c_literal{val=[]}, A]}},
     Err = #c_tuple{es=[#c_literal{val='function_clause'}, F, Avar, Xs]},
-    C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
+    C3 = #c_clause{anno=Anno, pats=[Xs], guard=#c_literal{val=true},
 		   body=match_fail([{function_name,{'lists^mapfoldl',2}}|Anno], Err)},
     Fun = #c_fun{vars=[Xs, Avar],
 		 body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
@@ -326,13 +346,13 @@ call(#c_call{anno=Anno}, lists, mapfoldr, [Arg1,Arg2,Arg3]) ->
     Avar = #c_var{name='A'},
     Match =
 	fun (A, P, E) ->
-		C1 = #c_clause{pats=[P], guard=#c_literal{val=true}, body=E},
+		C1 = #c_clause{anno=Anno, pats=[P], guard=#c_literal{val=true}, body=E},
 		Err = #c_tuple{es=[#c_literal{val='badmatch'}, X]},
-		C2 = #c_clause{pats=[X], guard=#c_literal{val=true},
+		C2 = #c_clause{anno=Anno, pats=[X], guard=#c_literal{val=true},
 			       body=match_fail(Anno, Err)},
 		#c_case{arg=A, clauses=[C1, C2]}
 	end,
-    C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
+    C1 = #c_clause{anno=Anno, pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
 %%% Tuple passing version
 		   body=Match(#c_apply{anno=Anno,
 				       op=Loop,
@@ -352,7 +372,8 @@ call(#c_call{anno=Anno}, lists, mapfoldr, [Arg1,Arg2,Arg3]) ->
 %%% 					  #c_values{es=[#c_cons{hd=X, tl=Xs},
 %%% 						        A]})}
 		  },
-    C2 = #c_clause{pats=[#c_literal{val=[]}],
+    C2 = #c_clause{anno=Anno,
+                   pats=[#c_literal{val=[]}],
 		   guard=#c_call{module=#c_literal{val=erlang},
 				 name=#c_literal{val=is_function},
 				 args=[F, #c_literal{val=2}]},
@@ -362,7 +383,7 @@ call(#c_call{anno=Anno}, lists, mapfoldr, [Arg1,Arg2,Arg3]) ->
 %%% Multiple-value version
 %%% 		   body=#c_values{es=[#c_literal{val=[]}, A]}},
     Err = #c_tuple{es=[#c_literal{val='function_clause'}, F, Avar, Xs]},
-    C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
+    C3 = #c_clause{anno=Anno, pats=[Xs], guard=#c_literal{val=true},
 		   body=match_fail([{function_name,{'lists^mapfoldr',2}}|Anno], Err)},
     Fun = #c_fun{vars=[Xs, Avar],
 		 body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
-- 
2.16.4