erlang: backport ERL-490 patch.
Fixes building ejabberd: https://github.com/processone/ejabberd/issues/2032 Closes #9095.
This commit is contained in:
parent
4e93930be2
commit
443d68863c
2 changed files with 102 additions and 1 deletions
101
srcpkgs/erlang/patches/ERL-490.patch
Normal file
101
srcpkgs/erlang/patches/ERL-490.patch
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
From 7715f437ab9a789e0500873b6002a49bfe69009c Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
|
||||||
|
Date: Fri, 29 Sep 2017 07:17:01 +0200
|
||||||
|
Subject: [PATCH] Fix incorrect internal consistency failure for binary
|
||||||
|
matching code
|
||||||
|
|
||||||
|
4c31fd0b9665 made the merging of match contexts stricter;
|
||||||
|
in fact, a little bit too strict.
|
||||||
|
|
||||||
|
Two match contexts with different number of slots would
|
||||||
|
be downgraded to the 'term' type. The correct way is to
|
||||||
|
keep the match context but set the number of slots to the
|
||||||
|
lowest number of slots of the two match contexts.
|
||||||
|
|
||||||
|
https://bugs.erlang.org/browse/ERL-490
|
||||||
|
---
|
||||||
|
lib/compiler/src/beam_validator.erl | 6 +++---
|
||||||
|
lib/compiler/test/bs_match_SUITE.erl | 38 ++++++++++++++++++++++++++++++++++--
|
||||||
|
2 files changed, 39 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
--- lib/compiler/src/beam_validator.erl
|
||||||
|
+++ lib/compiler/src/beam_validator.erl
|
||||||
|
@@ -1430,13 +1430,13 @@ merge_types(bool, {atom,A}) ->
|
||||||
|
merge_bool(A);
|
||||||
|
merge_types({atom,A}, bool) ->
|
||||||
|
merge_bool(A);
|
||||||
|
-merge_types(#ms{id=Id1,valid=B0,slots=Slots},
|
||||||
|
- #ms{id=Id2,valid=B1,slots=Slots}) ->
|
||||||
|
+merge_types(#ms{id=Id1,valid=B1,slots=Slots1},
|
||||||
|
+ #ms{id=Id2,valid=B2,slots=Slots2}) ->
|
||||||
|
Id = if
|
||||||
|
Id1 =:= Id2 -> Id1;
|
||||||
|
true -> make_ref()
|
||||||
|
end,
|
||||||
|
- #ms{id=Id,valid=B0 band B1,slots=Slots};
|
||||||
|
+ #ms{id=Id,valid=B1 band B2,slots=min(Slots1, Slots2)};
|
||||||
|
merge_types(T1, T2) when T1 =/= T2 ->
|
||||||
|
%% Too different. All we know is that the type is a 'term'.
|
||||||
|
term.
|
||||||
|
diff --git a/lib/compiler/test/bs_match_SUITE.erl b/lib/compiler/test/bs_match_SUITE.erl
|
||||||
|
--- lib/compiler/test/bs_match_SUITE.erl
|
||||||
|
+++ lib/compiler/test/bs_match_SUITE.erl
|
||||||
|
@@ -39,7 +39,7 @@
|
||||||
|
match_string_opt/1,select_on_integer/1,
|
||||||
|
map_and_binary/1,unsafe_branch_caching/1,
|
||||||
|
bad_literals/1,good_literals/1,constant_propagation/1,
|
||||||
|
- parse_xml/1,get_payload/1]).
|
||||||
|
+ parse_xml/1,get_payload/1,num_slots_different/1]).
|
||||||
|
|
||||||
|
-export([coverage_id/1,coverage_external_ignore/2]).
|
||||||
|
|
||||||
|
@@ -71,7 +71,7 @@ groups() ->
|
||||||
|
match_string_opt,select_on_integer,
|
||||||
|
map_and_binary,unsafe_branch_caching,
|
||||||
|
bad_literals,good_literals,constant_propagation,parse_xml,
|
||||||
|
- get_payload]}].
|
||||||
|
+ get_payload,num_slots_different]}].
|
||||||
|
|
||||||
|
|
||||||
|
init_per_suite(Config) ->
|
||||||
|
@@ -1524,6 +1524,40 @@ do_get_payload(ExtHdr) ->
|
||||||
|
<<_:13,_:35>> = ExtHdr#ext_header.ext_hdr_opts,
|
||||||
|
ExtHdrOptions.
|
||||||
|
|
||||||
|
+%% ERL-490
|
||||||
|
+num_slots_different(_Config) ->
|
||||||
|
+ Ts = [{<<"de">>, <<"default">>, <<"Remove">>, <<"a">>},
|
||||||
|
+ {<<"de">>, <<"default">>, <<"Remove from list">>, <<"a">>},
|
||||||
|
+ {<<"de">>, <<"default">>, <<"Remove from the list">>, <<"a">>},
|
||||||
|
+ {<<"de">>, <<"default">>, <<"Results">>, <<"Ergebnisse">>},
|
||||||
|
+ {<<"de">>, <<"default">>, <<"Reservatio">>, <<"a">>},
|
||||||
|
+ {<<"de">>, <<"navigation">>, <<"Results">>, <<"Ergebnisse">>},
|
||||||
|
+ {<<"de">>, <<"navigation">>, <<"Resources">>, <<"Ressourcen">>}],
|
||||||
|
+ _ = [{ok,Res} = lgettext(A, B, C) || {A,B,C,Res} <- Ts],
|
||||||
|
+
|
||||||
|
+ {'EXIT',_} = (catch lgettext(<<"d">>, <<"default">>, <<"Remove">>)),
|
||||||
|
+ {'EXIT',_} = (catch lgettext("", <<"default">>, <<"Remove">>)),
|
||||||
|
+ {'EXIT',_} = (catch lgettext(<<"de">>, <<"def">>, <<"Remove">>)),
|
||||||
|
+ {'EXIT',_} = (catch lgettext(<<"de">>, <<"default">>, <<"Res">>)),
|
||||||
|
+ ok.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+lgettext(<<"de">>, <<"default">>, <<"Remove">>) ->
|
||||||
|
+ {ok, <<"a">>};
|
||||||
|
+lgettext(<<"de">>, <<"default">>, <<"Remove from list">>) ->
|
||||||
|
+ {ok, <<"a">>};
|
||||||
|
+lgettext(<<"de">>, <<"default">>, <<"Remove from the list">>) ->
|
||||||
|
+ {ok, <<"a">>};
|
||||||
|
+lgettext(<<"de">>, <<"default">>, <<"Results">>) ->
|
||||||
|
+ {ok, <<"Ergebnisse">>};
|
||||||
|
+lgettext(<<"de">>, <<"default">>, <<"Reservatio">>) ->
|
||||||
|
+ {ok, <<"a">>};
|
||||||
|
+lgettext(<<"de">>, <<"navigation">>, <<"Results">>) ->
|
||||||
|
+ {ok, <<"Ergebnisse">>};
|
||||||
|
+lgettext(<<"de">>, <<"navigation">>, <<"Resources">>) ->
|
||||||
|
+ {ok, <<"Ressourcen">>}.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
check(F, R) ->
|
||||||
|
R = F().
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Template file for 'erlang'
|
# Template file for 'erlang'
|
||||||
pkgname=erlang
|
pkgname=erlang
|
||||||
version=20.1
|
version=20.1
|
||||||
revision=3
|
revision=4
|
||||||
create_wrksrc=yes
|
create_wrksrc=yes
|
||||||
build_wrksrc=otp_src_${version}
|
build_wrksrc=otp_src_${version}
|
||||||
build_style=gnu-configure
|
build_style=gnu-configure
|
||||||
|
|
Loading…
Reference in a new issue