[erlang-patches] EEP37: Funs with names

Anthony Ramine <>
Mon Oct 28 00:26:54 CET 2013


With DEBUG and DEBUG_PP defined in dialyzer_dataflow:

$ bin/dialyzer --plt .dialyzer_plt lib/dialyzer/test/small_SUITE_data/src/eep37.erl
  Checking whether the PLT .dialyzer_plt is up-to-date... yes
  Proceeding with analysis…
module 'eep37' ['fact'/0, 'module_info'/0,
		'module_info'/1, 'self'/0]
  attributes ['spec' = [{{'self', 0},
			 [{'type', 5, 'fun',
			   [{'type', 5, 'product', []},
			    {'type', 5, 'fun',
			     [{'type', 5, 'product', []},
			      {'type', 5, 'fun', []}]}]}]}]]
  ('self'/0 -| [{'label', 0}]) =
      (fun () ->
	   case <> of
	     <> when 'true' ->
		 letrec
		   ('Self'/0 -| [{'label', 5}]) =
		       (fun () ->
			    let (Self -| [{'label', 6}]) =
				('Self'/0 -| [{'label', 5}])
			    in case <> of
				 <> when 'true' -> (Self -| [{'label', 6}])
				 <> when 'true' ->
				     primop
				       'match_fail'({'function_clause'})
			       end
			 -| [{'label', 13}])
		 in ('Self'/0 -| [{'label', 5}])
	     <> when 'true' ->
		 primop 'match_fail'({'function_clause'})
	   end
	-| [{'label', 19}])
  ('fact'/0 -| [{'label', 1}]) =
      (fun () ->
	   case <> of
	     <> when 'true' ->
		 letrec
		   ('Fact'/1 -| [{'label', 21}]) =
		       (fun ((_cor2 -| [{'label', 22}])) ->
			    let (Fact -| [{'label', 23}]) =
				('Fact'/1 -| [{'label', 21}])
			    in case (_cor2 -| [{'label', 22}]) of
				 (N -| [{'label', 24}])
				   when call 'erlang':'>'((N -| [{'label',
								  24}]),
							  0)
				   ->
				     let (_cor0 -| [{'label', 27}]) =
					 call 'erlang':'-'((N -| [{'label',
								   24}]),
							   1) in
				     let (_cor1 -| [{'label', 29}]) =
					 apply (Fact -| [{'label',
							  23}])((_cor0
								  -| [{'label',
								       27}]))
				     in call 'erlang':'*'((N -| [{'label',
								  24}]),
							  (_cor1
							    -| [{'label',
								 29}]))
				 0 when 'true' -> 1
				 (_cor3 -| [{'label', 35}]) when 'true' ->
				     primop 'match_fail'({'function_clause',
							  (_cor3
							    -| [{'label',
								 35}])})
			       end
			 -| [{'label', 41}])
		 in ('Fact'/1 -| [{'label', 21}])
	     <> when 'true' ->
		 primop 'match_fail'({'function_clause'})
	   end
	-| [{'label', 47}])
  ('module_info'/0 -| [{'label', 2}]) =
      (fun () ->
	   case <> of
	     <> when 'true' ->
		 call 'erlang':'get_module_info'('eep37')
	     <> when 'true' ->
		 primop 'match_fail'({'function_clause'})
	   end
	-| [{'label', 54}])
  ('module_info'/1 -| [{'label', 3}]) =
      (fun ((_cor0 -| [{'label', 55}])) ->
	   case (_cor0 -| [{'label', 55}]) of
	     (X -| [{'label', 56}]) when 'true' ->
		 call 'erlang':'get_module_info'('eep37',
						 (X -| [{'label', 56}]))
	     (_cor1 -| [{'label', 59}]) when 'true' ->
		 primop 'match_fail'({'function_clause',
				      (_cor1 -| [{'label', 59}])})
	   end
	-| [{'label', 64}])
end
DICT:[{64,{[any],unit}},
      {top,{[],none}},
      {19,{[],unit}},
      {54,{[],unit}},
      {41,{[any],unit}},
      {47,{[],unit}},
      {13,{[],unit}}]
FunType 64:{ok,{[any],unit}}
Handling fun {eep37,module_info,1}: fun((_) -> no_return())
Entering 55 :: any()
Handling 'case'
Handling var
Looking up unknown variable: {c_var,
                                 [{label,55},
                                  0,
                                  {file,
                                      "/Users/nox/src/otp/lib/dialyzer/test/small_SUITE_data/src/eep37.erl"}],
                                 cor0}
Entering 56 :: any()
Subst: storing 55 = 56
Binding pat: var to any()
Entering 56 :: any()
Binding pat: var to any()
Binding 55 to 56
Entering 56 :: any()
Handling pos guard: 'true'
Handling call
Handling literal
Handling literal
Handling literal
Handling var
Looking up unknown variable: {c_var,
                                 [{label,56},
                                  0,
                                  {file,
                                      "/Users/nox/src/otp/lib/dialyzer/test/small_SUITE_data/src/eep37.erl"}],
                                 'X'}
--------------------------------------------------------
Fun: {erlang,get_module_info,2}
Args: <'eep37',_>
NewArgsSig: <'eep37',_>
NewArgsContract: <'eep37','attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'>
NewArgsBif: <'eep37',_>
NewArgTypes: <'eep37','attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'>
RetWithoutContr: any()
RetWithoutLocal: atom() | [{atom(),_} | {atom(),byte(),integer()}]
BifRet: any()
ContrRet: atom() | [{atom(),_} | {atom(),byte(),integer()}]
SigRet: any()
NewAccRet: atom() | [{atom(),_} | {atom(),byte(),integer()}]
Entering 56 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Entering 55 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Entering 55 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Map:
	55 :: any()
Done analyzing: {eep37,module_info,1}:fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
New Entry for {eep37,module_info,1}: fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
done adding stuff for {eep37,module_info,1}
FunType 19:{ok,{[],unit}}
Handling fun {eep37,self,0}: fun(() -> no_return())
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 13:{ok,{[],unit}}
Entering 5 :: fun(() -> no_return())
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Map:
Done analyzing: {eep37,self,0}:fun(() -> fun(() -> no_return()))
New Entry for {eep37,self,0}: fun(() -> fun(() -> no_return()))
{eep37,self,0}: Will try to add:[13]
done adding stuff for {eep37,self,0}
FunType 54:{ok,{[],unit}}
Handling fun {eep37,module_info,0}: fun(() -> no_return())
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling call
Handling literal
Handling literal
Handling literal
--------------------------------------------------------
Fun: {erlang,get_module_info,1}
Args: 'eep37'
NewArgsSig: 'eep37'
NewArgsContract: 'eep37'
NewArgsBif: 'eep37'
NewArgTypes: 'eep37'
RetWithoutContr: any()
RetWithoutLocal: [{atom(),[{atom(),_}]}]
BifRet: any()
ContrRet: [{atom(),[{atom(),_}]}]
SigRet: any()
NewAccRet: [{atom(),[{atom(),_}]}]
Map:
Done analyzing: {eep37,module_info,0}:fun(() -> [{atom(),[{atom(),_}]}])
New Entry for {eep37,module_info,0}: fun(() -> [{atom(),[any()]}])
done adding stuff for {eep37,module_info,0}
FunType 41:{ok,{[any],unit}}
Handling fun 41: fun((_) -> no_return())
Entering 22 :: any()
Handling 'let'
Subst: storing 23 = 21
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Done analyzing: 41:fun((_) -> none())
New Entry for 41: fun((_) -> none())
41: Will try to add:[41,{eep37,fact,0}]
done adding stuff for 41
FunType 47:{ok,{[],unit}}
Handling fun {eep37,fact,0}: fun(() -> no_return())
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 41:{ok,{[any],none}}
Entering 21 :: fun((_) -> none())
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Map:
Done analyzing: {eep37,fact,0}:fun(() -> fun((_) -> none()))
New Entry for {eep37,fact,0}: fun(() -> fun((non_neg_integer()) -> none()))
{eep37,fact,0}: Will try to add:[41]
done adding stuff for {eep37,fact,0}
FunType 13:{ok,{[],unit}}
Handling fun 13: fun(() -> no_return())
Handling 'let'
Subst: storing 6 = 5
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Done analyzing: 13:fun(() -> none())
New Entry for 13: fun(() -> none())
13: Will try to add:[{eep37,self,0},13]
done adding stuff for 13
FunType 41:{ok,{[any],none}}
Handling fun 41: fun((_) -> none())
Entering 22 :: any()
Handling 'let'
Subst: storing 23 = 21
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Done analyzing: 41:fun((_) -> none())
Fixpoint for 41: fun((_) -> none())
done adding stuff for 41
FunType 19:{ok,{[],{c,function,[{c,product,[],unknown},unit],unknown}}}
Handling fun {eep37,self,0}: fun(() -> fun(() -> no_return()))
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 13:{ok,{[],none}}
Entering 5 :: fun(() -> none())
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Map:
Done analyzing: {eep37,self,0}:fun(() -> fun(() -> none()))
New Entry for {eep37,self,0}: fun(() -> fun(() -> none()))
{eep37,self,0}: Will try to add:[13]
done adding stuff for {eep37,self,0}
FunType 13:{ok,{[],none}}
Handling fun 13: fun(() -> none())
Handling 'let'
Subst: storing 6 = 5
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Done analyzing: 13:fun(() -> none())
Fixpoint for 13: fun(() -> none())
done adding stuff for 13
module 'eep37' ['fact'/0, 'module_info'/0,
		'module_info'/1, 'self'/0]
  attributes ['spec' = [{{'self', 0},
			 [{'type', 5, 'fun',
			   [{'type', 5, 'product', []},
			    {'type', 5, 'fun',
			     [{'type', 5, 'product', []},
			      {'type', 5, 'fun', []}]}]}]}]]
  ('self'/0 -| [{'label', 0}]) =
      (fun () ->
	   case <> of
	     <> when 'true' ->
		 letrec
		   ('Self'/0 -| [{'label', 5}]) =
		       (fun () ->
			    let (Self -| [{'label', 6}]) =
				('Self'/0 -| [{'label', 5}])
			    in case <> of
				 <> when 'true' -> (Self -| [{'label', 6}])
				 <> when 'true' ->
				     primop
				       'match_fail'({'function_clause'})
			       end
			 -| [{'label', 13}])
		 in ('Self'/0 -| [{'label', 5}])
	     <> when 'true' ->
		 primop 'match_fail'({'function_clause'})
	   end
	-| [{'label', 19}])
  ('fact'/0 -| [{'label', 1}]) =
      (fun () ->
	   case <> of
	     <> when 'true' ->
		 letrec
		   ('Fact'/1 -| [{'label', 21}]) =
		       (fun ((_cor2 -| [{'label', 22}])) ->
			    let (Fact -| [{'label', 23}]) =
				('Fact'/1 -| [{'label', 21}])
			    in case (_cor2 -| [{'label', 22}]) of
				 (N -| [{'label', 24}])
				   when call 'erlang':'>'((N -| [{'label',
								  24}]),
							  0)
				   ->
				     let (_cor0 -| [{'label', 27}]) =
					 call 'erlang':'-'((N -| [{'label',
								   24}]),
							   1) in
				     let (_cor1 -| [{'label', 29}]) =
					 apply (Fact -| [{'label',
							  23}])((_cor0
								  -| [{'label',
								       27}]))
				     in call 'erlang':'*'((N -| [{'label',
								  24}]),
							  (_cor1
							    -| [{'label',
								 29}]))
				 0 when 'true' -> 1
				 (_cor3 -| [{'label', 35}]) when 'true' ->
				     primop 'match_fail'({'function_clause',
							  (_cor3
							    -| [{'label',
								 35}])})
			       end
			 -| [{'label', 41}])
		 in ('Fact'/1 -| [{'label', 21}])
	     <> when 'true' ->
		 primop 'match_fail'({'function_clause'})
	   end
	-| [{'label', 47}])
  ('module_info'/0 -| [{'label', 2}]) =
      (fun () ->
	   case <> of
	     <> when 'true' ->
		 call 'erlang':'get_module_info'('eep37')
	     <> when 'true' ->
		 primop 'match_fail'({'function_clause'})
	   end
	-| [{'label', 54}])
  ('module_info'/1 -| [{'label', 3}]) =
      (fun ((_cor0 -| [{'label', 55}])) ->
	   case (_cor0 -| [{'label', 55}]) of
	     (X -| [{'label', 56}]) when 'true' ->
		 call 'erlang':'get_module_info'('eep37',
						 (X -| [{'label', 56}]))
	     (_cor1 -| [{'label', 59}]) when 'true' ->
		 primop 'match_fail'({'function_clause',
				      (_cor1 -| [{'label', 59}])})
	   end
	-| [{'label', 64}])
end
DICT:[{64,{[any],unit}},
      {top,{[],none}},
      {19,{[],unit}},
      {54,{[],unit}},
      {41,{[any],unit}},
      {47,{[],unit}},
      {13,{[],unit}}]
FunType 64:{ok,{[any],unit}}
Handling fun {eep37,module_info,1}: fun((_) -> no_return())
Entering 55 :: any()
Handling 'case'
Handling var
Looking up unknown variable: {c_var,
                                 [{label,55},
                                  0,
                                  {file,
                                      "/Users/nox/src/otp/lib/dialyzer/test/small_SUITE_data/src/eep37.erl"}],
                                 cor0}
Entering 56 :: any()
Subst: storing 55 = 56
Binding pat: var to any()
Entering 56 :: any()
Binding pat: var to any()
Binding 55 to 56
Entering 56 :: any()
Handling pos guard: 'true'
Handling call
Handling literal
Handling literal
Handling literal
Handling var
Looking up unknown variable: {c_var,
                                 [{label,56},
                                  0,
                                  {file,
                                      "/Users/nox/src/otp/lib/dialyzer/test/small_SUITE_data/src/eep37.erl"}],
                                 'X'}
--------------------------------------------------------
Fun: {erlang,get_module_info,2}
Args: <'eep37',_>
NewArgsSig: <'eep37',_>
NewArgsContract: <'eep37','attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'>
NewArgsBif: <'eep37',_>
NewArgTypes: <'eep37','attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'>
RetWithoutContr: any()
RetWithoutLocal: atom() | [{atom(),_} | {atom(),byte(),integer()}]
BifRet: any()
ContrRet: atom() | [{atom(),_} | {atom(),byte(),integer()}]
SigRet: any()
NewAccRet: atom() | [{atom(),_} | {atom(),byte(),integer()}]
Entering 56 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Entering 55 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Entering 55 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Map:
	55 :: any()
Done analyzing: {eep37,module_info,1}:fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
New Entry for {eep37,module_info,1}: fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
done adding stuff for {eep37,module_info,1}
FunType 19:{ok,{[],unit}}
Handling fun {eep37,self,0}: fun(() -> no_return())
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 13:{ok,{[],unit}}
Entering 5 :: fun(() -> no_return())
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Map:
Done analyzing: {eep37,self,0}:fun(() -> fun(() -> no_return()))
New Entry for {eep37,self,0}: fun(() -> fun(() -> none()))
{eep37,self,0}: Will try to add:[13]
done adding stuff for {eep37,self,0}
FunType 54:{ok,{[],unit}}
Handling fun {eep37,module_info,0}: fun(() -> no_return())
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling call
Handling literal
Handling literal
Handling literal
--------------------------------------------------------
Fun: {erlang,get_module_info,1}
Args: 'eep37'
NewArgsSig: 'eep37'
NewArgsContract: 'eep37'
NewArgsBif: 'eep37'
NewArgTypes: 'eep37'
RetWithoutContr: any()
RetWithoutLocal: [{atom(),[{atom(),_}]}]
BifRet: any()
ContrRet: [{atom(),[{atom(),_}]}]
SigRet: any()
NewAccRet: [{atom(),[{atom(),_}]}]
Map:
Done analyzing: {eep37,module_info,0}:fun(() -> [{atom(),[{atom(),_}]}])
New Entry for {eep37,module_info,0}: fun(() -> [{atom(),[any()]}])
done adding stuff for {eep37,module_info,0}
FunType 41:{ok,{[any],unit}}
Handling fun 41: fun((_) -> no_return())
Entering 22 :: any()
Handling 'let'
Subst: storing 23 = 21
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Done analyzing: 41:fun((_) -> none())
New Entry for 41: fun((_) -> none())
41: Will try to add:[41,{eep37,fact,0}]
done adding stuff for 41
FunType 47:{ok,{[],unit}}
Handling fun {eep37,fact,0}: fun(() -> no_return())
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 41:{ok,{[any],none}}
Entering 21 :: fun((_) -> none())
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Map:
Done analyzing: {eep37,fact,0}:fun(() -> fun((_) -> none()))
New Entry for {eep37,fact,0}: fun(() -> fun((0) -> none()))
{eep37,fact,0}: Will try to add:[41]
done adding stuff for {eep37,fact,0}
FunType 13:{ok,{[],unit}}
Handling fun 13: fun(() -> no_return())
Handling 'let'
Subst: storing 6 = 5
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Done analyzing: 13:fun(() -> none())
New Entry for 13: fun(() -> none())
13: Will try to add:[{eep37,self,0},13]
done adding stuff for 13
FunType 41:{ok,{[any],none}}
Handling fun 41: fun((_) -> none())
Entering 22 :: any()
Handling 'let'
Subst: storing 23 = 21
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Done analyzing: 41:fun((_) -> none())
Fixpoint for 41: fun((_) -> none())
done adding stuff for 41
FunType 19:{ok,{[],{c,function,[{c,product,[],unknown},none],unknown}}}
Handling fun {eep37,self,0}: fun(() -> fun(() -> none()))
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 13:{ok,{[],none}}
Entering 5 :: fun(() -> none())
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Map:
Done analyzing: {eep37,self,0}:fun(() -> fun(() -> none()))
Fixpoint for {eep37,self,0}: fun(() -> fun(() -> none()))
done adding stuff for {eep37,self,0}
FunType 13:{ok,{[],none}}
Handling fun 13: fun(() -> none())
Handling 'let'
Subst: storing 6 = 5
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Done analyzing: 13:fun(() -> none())
Fixpoint for 13: fun(() -> none())
done adding stuff for 13
module 'eep37' ['fact'/0, 'module_info'/0,
		'module_info'/1, 'self'/0]
  attributes ['spec' = [{{'self', 0},
			 [{'type', 5, 'fun',
			   [{'type', 5, 'product', []},
			    {'type', 5, 'fun',
			     [{'type', 5, 'product', []},
			      {'type', 5, 'fun', []}]}]}]}]]
  ('self'/0 -| [{'label', 0}]) =
      (fun () ->
	   case <> of
	     <> when 'true' ->
		 letrec
		   ('Self'/0 -| [{'label', 5}]) =
		       (fun () ->
			    let (Self -| [{'label', 6}]) =
				('Self'/0 -| [{'label', 5}])
			    in case <> of
				 <> when 'true' -> (Self -| [{'label', 6}])
				 <> when 'true' ->
				     primop
				       'match_fail'({'function_clause'})
			       end
			 -| [{'label', 13}])
		 in ('Self'/0 -| [{'label', 5}])
	     <> when 'true' ->
		 primop 'match_fail'({'function_clause'})
	   end
	-| [{'label', 19}])
  ('fact'/0 -| [{'label', 1}]) =
      (fun () ->
	   case <> of
	     <> when 'true' ->
		 letrec
		   ('Fact'/1 -| [{'label', 21}]) =
		       (fun ((_cor2 -| [{'label', 22}])) ->
			    let (Fact -| [{'label', 23}]) =
				('Fact'/1 -| [{'label', 21}])
			    in case (_cor2 -| [{'label', 22}]) of
				 (N -| [{'label', 24}])
				   when call 'erlang':'>'((N -| [{'label',
								  24}]),
							  0)
				   ->
				     let (_cor0 -| [{'label', 27}]) =
					 call 'erlang':'-'((N -| [{'label',
								   24}]),
							   1) in
				     let (_cor1 -| [{'label', 29}]) =
					 apply (Fact -| [{'label',
							  23}])((_cor0
								  -| [{'label',
								       27}]))
				     in call 'erlang':'*'((N -| [{'label',
								  24}]),
							  (_cor1
							    -| [{'label',
								 29}]))
				 0 when 'true' -> 1
				 (_cor3 -| [{'label', 35}]) when 'true' ->
				     primop 'match_fail'({'function_clause',
							  (_cor3
							    -| [{'label',
								 35}])})
			       end
			 -| [{'label', 41}])
		 in ('Fact'/1 -| [{'label', 21}])
	     <> when 'true' ->
		 primop 'match_fail'({'function_clause'})
	   end
	-| [{'label', 47}])
  ('module_info'/0 -| [{'label', 2}]) =
      (fun () ->
	   case <> of
	     <> when 'true' ->
		 call 'erlang':'get_module_info'('eep37')
	     <> when 'true' ->
		 primop 'match_fail'({'function_clause'})
	   end
	-| [{'label', 54}])
  ('module_info'/1 -| [{'label', 3}]) =
      (fun ((_cor0 -| [{'label', 55}])) ->
	   case (_cor0 -| [{'label', 55}]) of
	     (X -| [{'label', 56}]) when 'true' ->
		 call 'erlang':'get_module_info'('eep37',
						 (X -| [{'label', 56}]))
	     (_cor1 -| [{'label', 59}]) when 'true' ->
		 primop 'match_fail'({'function_clause',
				      (_cor1 -| [{'label', 59}])})
	   end
	-| [{'label', 64}])
end
DICT:[{64,{[any],unit}},
      {top,{[],none}},
      {19,{[],unit}},
      {54,{[],unit}},
      {41,{[any],unit}},
      {47,{[],unit}},
      {13,{[],unit}}]
FunType 64:{ok,{[any],unit}}
Handling fun {eep37,module_info,1}: fun((_) -> no_return())
Entering 55 :: any()
Handling 'case'
Handling var
Looking up unknown variable: {c_var,
                                 [{label,55},
                                  0,
                                  {file,
                                      "/Users/nox/src/otp/lib/dialyzer/test/small_SUITE_data/src/eep37.erl"}],
                                 cor0}
Entering 56 :: any()
Subst: storing 55 = 56
Binding pat: var to any()
Entering 56 :: any()
Binding pat: var to any()
Binding 55 to 56
Entering 56 :: any()
Handling pos guard: 'true'
Handling call
Handling literal
Handling literal
Handling literal
Handling var
Looking up unknown variable: {c_var,
                                 [{label,56},
                                  0,
                                  {file,
                                      "/Users/nox/src/otp/lib/dialyzer/test/small_SUITE_data/src/eep37.erl"}],
                                 'X'}
--------------------------------------------------------
Fun: {erlang,get_module_info,2}
Args: <'eep37',_>
NewArgsSig: <'eep37',_>
NewArgsContract: <'eep37','attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'>
NewArgsBif: <'eep37',_>
NewArgTypes: <'eep37','attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'>
RetWithoutContr: any()
RetWithoutLocal: atom() | [{atom(),_} | {atom(),byte(),integer()}]
BifRet: any()
ContrRet: atom() | [{atom(),_} | {atom(),byte(),integer()}]
SigRet: any()
NewAccRet: atom() | [{atom(),_} | {atom(),byte(),integer()}]
Entering 56 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Entering 55 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Entering 55 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Map:
	55 :: any()
Done analyzing: {eep37,module_info,1}:fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
New Entry for {eep37,module_info,1}: fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
done adding stuff for {eep37,module_info,1}
FunType 19:{ok,{[],unit}}
Handling fun {eep37,self,0}: fun(() -> no_return())
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 13:{ok,{[],unit}}
Entering 5 :: fun(() -> no_return())
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Map:
Done analyzing: {eep37,self,0}:fun(() -> fun(() -> no_return()))
New Entry for {eep37,self,0}: fun(() -> fun(() -> none()))
{eep37,self,0}: Will try to add:[13]
done adding stuff for {eep37,self,0}
FunType 54:{ok,{[],unit}}
Handling fun {eep37,module_info,0}: fun(() -> no_return())
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling call
Handling literal
Handling literal
Handling literal
--------------------------------------------------------
Fun: {erlang,get_module_info,1}
Args: 'eep37'
NewArgsSig: 'eep37'
NewArgsContract: 'eep37'
NewArgsBif: 'eep37'
NewArgTypes: 'eep37'
RetWithoutContr: any()
RetWithoutLocal: [{atom(),[{atom(),_}]}]
BifRet: any()
ContrRet: [{atom(),[{atom(),_}]}]
SigRet: any()
NewAccRet: [{atom(),[{atom(),_}]}]
Map:
Done analyzing: {eep37,module_info,0}:fun(() -> [{atom(),[{atom(),_}]}])
New Entry for {eep37,module_info,0}: fun(() -> [{atom(),[any()]}])
done adding stuff for {eep37,module_info,0}
FunType 41:{ok,{[any],unit}}
Handling fun 41: fun((_) -> no_return())
Entering 22 :: any()
Handling 'let'
Subst: storing 23 = 21
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Done analyzing: 41:fun((_) -> none())
New Entry for 41: fun((_) -> none())
41: Will try to add:[41,{eep37,fact,0}]
done adding stuff for 41
FunType 47:{ok,{[],unit}}
Handling fun {eep37,fact,0}: fun(() -> no_return())
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 41:{ok,{[any],none}}
Entering 21 :: fun((_) -> none())
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Map:
Done analyzing: {eep37,fact,0}:fun(() -> fun((_) -> none()))
New Entry for {eep37,fact,0}: fun(() -> fun((0) -> none()))
{eep37,fact,0}: Will try to add:[41]
done adding stuff for {eep37,fact,0}
FunType 13:{ok,{[],unit}}
Handling fun 13: fun(() -> no_return())
Handling 'let'
Subst: storing 6 = 5
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Done analyzing: 13:fun(() -> none())
New Entry for 13: fun(() -> none())
13: Will try to add:[{eep37,self,0},13]
done adding stuff for 13
FunType 41:{ok,{[any],none}}
Handling fun 41: fun((_) -> none())
Entering 22 :: any()
Handling 'let'
Subst: storing 23 = 21
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Done analyzing: 41:fun((_) -> none())
Fixpoint for 41: fun((_) -> none())
done adding stuff for 41
FunType 19:{ok,{[],{c,function,[{c,product,[],unknown},none],unknown}}}
Handling fun {eep37,self,0}: fun(() -> fun(() -> none()))
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 13:{ok,{[],none}}
Entering 5 :: fun(() -> none())
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Map:
Done analyzing: {eep37,self,0}:fun(() -> fun(() -> none()))
Fixpoint for {eep37,self,0}: fun(() -> fun(() -> none()))
done adding stuff for {eep37,self,0}
FunType 13:{ok,{[],none}}
Handling fun 13: fun(() -> none())
Handling 'let'
Subst: storing 6 = 5
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Done analyzing: 13:fun(() -> none())
Fixpoint for 13: fun(() -> none())
done adding stuff for 13
==========
Starting warning pass
==========
FunType top:{ok,{[],none}}
Handling fun top: fun(() -> none())
Handling module
Handling letrec
Handling 'fun'
FunType 19:{ok,{[],{c,function,[{c,product,[],unknown},none],unknown}}}
Entering 0 :: fun(() -> fun(() -> none()))
Handling 'fun'
FunType 47:{ok,{[],
                {c,function,
                   [{c,product,[{c,number,{int_set,[0]},integer}],unknown},
                    none],
                   unknown}}}
Entering 1 :: fun(() -> fun((0) -> none()))
Handling 'fun'
FunType 54:{ok,{[],
                {c,list,
                   [{c,tuple,
                       [{c,atom,any,unknown},
                        {c,list,[any,{c,nil,[],unknown}],unknown}],
                       {2,any}},
                    {c,nil,[],unknown}],
                   unknown}}}
Entering 2 :: fun(() -> [{atom(),[any()]}])
Handling 'fun'
FunType 64:{ok,{[any],
                {c,union,
                   [{c,atom,any,unknown},
                    none,none,none,
                    {c,list,
                       [{c,tuple_set,
                           [{2,[{c,tuple,[{c,atom,any,unknown},any],{2,any}}]},
                            {3,
                             [{c,tuple,
                                 [{c,atom,any,unknown},
                                  {c,number,{int_rng,0,255},integer},
                                  {c,number,any,integer}],
                                 {3,any}}]}],
                           unknown},
                        {c,nil,[],unknown}],
                       unknown},
                    none,none,none,none,none],
                   unknown}}}
Entering 3 :: fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
Handling literal
FunType 19:{ok,{[],{c,function,[{c,product,[],unknown},none],unknown}}}
FunType 47:{ok,{[],
                {c,function,
                   [{c,product,[{c,number,{int_set,[0]},integer}],unknown},
                    none],
                   unknown}}}
FunType 54:{ok,{[],
                {c,list,
                   [{c,tuple,
                       [{c,atom,any,unknown},
                        {c,list,[any,{c,nil,[],unknown}],unknown}],
                       {2,any}},
                    {c,nil,[],unknown}],
                   unknown}}}
FunType 64:{ok,{[any],
                {c,union,
                   [{c,atom,any,unknown},
                    none,none,none,
                    {c,list,
                       [{c,tuple_set,
                           [{2,[{c,tuple,[{c,atom,any,unknown},any],{2,any}}]},
                            {3,
                             [{c,tuple,
                                 [{c,atom,any,unknown},
                                  {c,number,{int_rng,0,255},integer},
                                  {c,number,any,integer}],
                                 {3,any}}]}],
                           unknown},
                        {c,nil,[],unknown}],
                       unknown},
                    none,none,none,none,none],
                   unknown}}}
Entering 0 :: fun(() -> fun(() -> none()))
Entering 1 :: fun(() -> fun((0) -> none()))
Entering 2 :: fun(() -> [{atom(),[any()]}])
Entering 3 :: fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
Done analyzing: top:fun(() -> any())
New Entry for top: fun(() -> any())
done adding stuff for top
FunType 64:{ok,{[any],
                {c,union,
                   [{c,atom,any,unknown},
                    none,none,none,
                    {c,list,
                       [{c,tuple_set,
                           [{2,[{c,tuple,[{c,atom,any,unknown},any],{2,any}}]},
                            {3,
                             [{c,tuple,
                                 [{c,atom,any,unknown},
                                  {c,number,{int_rng,0,255},integer},
                                  {c,number,any,integer}],
                                 {3,any}}]}],
                           unknown},
                        {c,nil,[],unknown}],
                       unknown},
                    none,none,none,none,none],
                   unknown}}}
Handling fun {eep37,module_info,1}: fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
Entering 55 :: any()
Handling 'case'
Handling var
Looking up unknown variable: {c_var,
                                 [{label,55},
                                  0,
                                  {file,
                                      "/Users/nox/src/otp/lib/dialyzer/test/small_SUITE_data/src/eep37.erl"}],
                                 cor0}
Entering 56 :: any()
Subst: storing 55 = 56
Binding pat: var to any()
Entering 56 :: any()
Binding pat: var to any()
Binding 55 to 56
Entering 56 :: any()
Handling pos guard: 'true'
Handling call
Handling literal
Handling literal
Handling literal
Handling var
Looking up unknown variable: {c_var,
                                 [{label,56},
                                  0,
                                  {file,
                                      "/Users/nox/src/otp/lib/dialyzer/test/small_SUITE_data/src/eep37.erl"}],
                                 'X'}
--------------------------------------------------------
Fun: {erlang,get_module_info,2}
Args: <'eep37',_>
NewArgsSig: <'eep37',_>
NewArgsContract: <'eep37','attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'>
NewArgsBif: <'eep37',_>
NewArgTypes: <'eep37','attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'>
RetWithoutContr: any()
RetWithoutLocal: atom() | [{atom(),_} | {atom(),byte(),integer()}]
BifRet: any()
ContrRet: atom() | [{atom(),_} | {atom(),byte(),integer()}]
SigRet: any()
NewAccRet: atom() | [{atom(),_} | {atom(),byte(),integer()}]
Entering 56 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Entering 55 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Entering 55 :: 'attributes' | 'compile' | 'exports' | 'functions' | 'imports' | 'module' | 'native_addresses'
Map:
	55 :: any()
Done analyzing: {eep37,module_info,1}:fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
Fixpoint for {eep37,module_info,1}: fun((_) -> atom() | [{atom(),_} | {atom(),byte(),integer()}])
done adding stuff for {eep37,module_info,1}
FunType 19:{ok,{[],{c,function,[{c,product,[],unknown},none],unknown}}}
Handling fun {eep37,self,0}: fun(() -> fun(() -> none()))
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 13:{ok,{[],none}}
Entering 5 :: fun(() -> none())
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Map:
Done analyzing: {eep37,self,0}:fun(() -> fun(() -> none()))
Fixpoint for {eep37,self,0}: fun(() -> fun(() -> none()))
done adding stuff for {eep37,self,0}
FunType 54:{ok,{[],
                {c,list,
                   [{c,tuple,
                       [{c,atom,any,unknown},
                        {c,list,[any,{c,nil,[],unknown}],unknown}],
                       {2,any}},
                    {c,nil,[],unknown}],
                   unknown}}}
Handling fun {eep37,module_info,0}: fun(() -> [{atom(),[any()]}])
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling call
Handling literal
Handling literal
Handling literal
--------------------------------------------------------
Fun: {erlang,get_module_info,1}
Args: 'eep37'
NewArgsSig: 'eep37'
NewArgsContract: 'eep37'
NewArgsBif: 'eep37'
NewArgTypes: 'eep37'
RetWithoutContr: any()
RetWithoutLocal: [{atom(),[{atom(),_}]}]
BifRet: any()
ContrRet: [{atom(),[{atom(),_}]}]
SigRet: any()
NewAccRet: [{atom(),[{atom(),_}]}]
Map:
Done analyzing: {eep37,module_info,0}:fun(() -> [{atom(),[{atom(),_}]}])
Fixpoint for {eep37,module_info,0}: fun(() -> [{atom(),[any()]}])
done adding stuff for {eep37,module_info,0}
FunType 41:{ok,{[any],none}}
Handling fun 41: fun((_) -> none())
Entering 22 :: any()
Handling 'let'
Subst: storing 23 = 21
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Done analyzing: 41:fun((_) -> none())
Fixpoint for 41: fun((_) -> none())
done adding stuff for 41
FunType 47:{ok,{[],
                {c,function,
                   [{c,product,[{c,number,{int_set,[0]},integer}],unknown},
                    none],
                   unknown}}}
Handling fun {eep37,fact,0}: fun(() -> fun((0) -> none()))
Handling 'case'
Handling values
Binding pat: values to <>
Handling pos guard: 'true'
Handling letrec
Handling 'fun'
FunType 41:{ok,{[any],none}}
Entering 21 :: fun((_) -> none())
Handling var
Looking up unknown variable: {c_var,[{label,21}],{'Fact',1}}
Map:
Done analyzing: {eep37,fact,0}:fun(() -> fun((_) -> none()))
Fixpoint for {eep37,fact,0}: fun(() -> fun((0) -> none()))
done adding stuff for {eep37,fact,0}
FunType 13:{ok,{[],none}}
Handling fun 13: fun(() -> none())
Handling 'let'
Subst: storing 6 = 5
Handling var
Looking up unknown variable: {c_var,[{label,5}],{'Self',0}}
Done analyzing: 13:fun(() -> none())
Fixpoint for 13: fun(() -> none())
done adding stuff for 13

eep37.erl:7: The created fun has no local return
eep37.erl:11: The created fun has no local return
 done in 0m0.46s
done (warnings were emitted)


Regards,

-- 
Anthony Ramine

Le 27 oct. 2013 à 21:29, Anthony Ramine <> a écrit :

> I’ve added tests for named funs in every place you asked for except syntax_tools.
> 
> The Dialyzer test doesn’t pass and I haven’t found a fix for it yet, Cc’ing Kostis.
> 
> If I give "fact() -> fun Fact(N) when N > 0 -> N * Fact(N - 1); Fact(0) -> 1 end" to typer, the following spec is computed:
> 
> -spec fact() -> fun((0) -> none()).
> 
> Please refetch.
> 
> -- 
> Anthony Ramine
> 
> Le 23 oct. 2013 à 15:04, Björn Gustavsson <> a écrit :
> 
>> The new test cases are insufficient for an extension of the language. Each
>> application that have updates should have test cases to ensure that new or
>> updated code is covered. The following applications should have test cases
>> for named funs: compiler, tools (xref and cover), stdlib (qlc, erl_eval, ms_transform),
>> dialyzer, debugger, and syntax_tools.
>> 
> 



More information about the erlang-patches mailing list