From 9430e6e0223f8d9ae592f8062a50285d23becd5a Mon Sep 17 00:00:00 2001
From: Anthony Ramine <n.oxyde@gmail.com>
Date: Sat, 27 Sep 2014 15:29:52 +0200
Subject: Fix miscompilation when module contains multiple named funs

A module containing two named funs bearing the same name and arity could be
miscompiled.

Reported-by: Sam Chapin
---
 lib/compiler/src/v3_core.erl    |  4 ++--
 lib/compiler/test/fun_SUITE.erl | 19 +++++++++++++++----
 2 files changed, 17 insertions(+), 6 deletions(-)

(limited to 'lib/compiler')

diff --git a/lib/compiler/src/v3_core.erl b/lib/compiler/src/v3_core.erl
index 83cf76f241..caf5298d38 100644
--- a/lib/compiler/src/v3_core.erl
+++ b/lib/compiler/src/v3_core.erl
@@ -647,8 +647,8 @@ expr({'fun',L,{clauses,Cs},Id}, St) ->
     fun_tq(Id, Cs, L, St, unnamed);
 expr({named_fun,L,'_',Cs,Id}, St) ->
     fun_tq(Id, Cs, L, St, unnamed);
-expr({named_fun,L,Name,Cs,{Index,Uniq,_Fname}}, St) ->
-    fun_tq({Index,Uniq,Name}, Cs, L, St, {named, Name});
+expr({named_fun,L,Name,Cs,Id}, St) ->
+    fun_tq(Id, Cs, L, St, {named,Name});
 expr({call,L,{remote,_,M,F},As0}, #core{wanted=Wanted}=St0) ->
     {[M1,F1|As1],Aps,St1} = safe_list([M,F|As0], St0),
     Lanno = lineno_anno(L, St1),
diff --git a/lib/compiler/test/fun_SUITE.erl b/lib/compiler/test/fun_SUITE.erl
index 25b7f677b5..a3e9b7fe4e 100644
--- a/lib/compiler/test/fun_SUITE.erl
+++ b/lib/compiler/test/fun_SUITE.erl
@@ -21,10 +21,10 @@
 -export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, 
 	 init_per_group/2,end_per_group/2,
 	 test1/1,overwritten_fun/1,otp_7202/1,bif_fun/1,
-	 external/1,eep37/1,badarity/1]).
+         external/1,eep37/1,eep37_dup/1,badarity/1]).
 
-%% Internal export.
--export([call_me/1]).
+%% Internal exports.
+-export([call_me/1,dup1/0,dup2/0]).
 
 -include_lib("test_server/include/test_server.hrl").
 
@@ -32,7 +32,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}].
 
 all() -> 
     test_lib:recompile(?MODULE),
-    [test1,overwritten_fun,otp_7202,bif_fun,external,eep37,badarity].
+    [test1,overwritten_fun,otp_7202,bif_fun,external,eep37,eep37_dup,badarity].
 
 groups() -> 
     [].
@@ -206,6 +206,17 @@ eep37(Config) when is_list(Config) ->
     50 = UnusedName(8),
     ok.
 
+eep37_dup(Config) when is_list(Config) ->
+    dup1 = (dup1())(),
+    dup2 = (dup2())(),
+    ok.
+
+dup1() ->
+    fun _F() -> dup1 end.
+
+dup2() ->
+    fun _F() -> dup2 end.
+
 badarity(Config) when is_list(Config) ->
     {'EXIT',{{badarity,{_,[]}},_}} = (catch (fun badarity/1)()),
     ok.
-- 
cgit v1.2.3