diff options
author | Björn Gustavsson <[email protected]> | 2015-02-05 09:50:01 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2015-02-05 09:50:01 +0100 |
commit | 431c196486ebc3d6cc684419d8594eb26deaf846 (patch) | |
tree | bb7406385d38d3ce172559c52d532174c5377a65 /lib/compiler | |
parent | c1e8eefea2822145100ce05453e8054ea29f4672 (diff) | |
parent | f3a8efa2e4fa6f3f64ee38939103bfd55e78bc51 (diff) | |
download | otp-431c196486ebc3d6cc684419d8594eb26deaf846.tar.gz otp-431c196486ebc3d6cc684419d8594eb26deaf846.tar.bz2 otp-431c196486ebc3d6cc684419d8594eb26deaf846.zip |
Merge branch 'maint'
* maint:
Update primary bootstrap
Correct unsafe optimization of '==' and '/='
Conflicts:
bootstrap/lib/compiler/ebin/sys_core_fold.beam
Diffstat (limited to 'lib/compiler')
-rw-r--r-- | lib/compiler/src/sys_core_fold.erl | 5 | ||||
-rw-r--r-- | lib/compiler/test/core_fold_SUITE.erl | 10 |
2 files changed, 15 insertions, 0 deletions
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl index 7066cebb2b..604c65f9b3 100644 --- a/lib/compiler/src/sys_core_fold.erl +++ b/lib/compiler/src/sys_core_fold.erl @@ -1221,6 +1221,11 @@ is_non_numeric([H|T]) -> is_non_numeric(H) andalso is_non_numeric(T); is_non_numeric(Tuple) when is_tuple(Tuple) -> is_non_numeric_tuple(Tuple, tuple_size(Tuple)); +is_non_numeric(Map) when is_map(Map) -> + %% Note that 17.x and 18.x compare keys in different ways. + %% Be very conservative -- require that both keys and values + %% are non-numeric. + is_non_numeric(maps:to_list(Map)); is_non_numeric(Num) when is_number(Num) -> false; is_non_numeric(_) -> true. diff --git a/lib/compiler/test/core_fold_SUITE.erl b/lib/compiler/test/core_fold_SUITE.erl index ce1aea5de0..1358e002e2 100644 --- a/lib/compiler/test/core_fold_SUITE.erl +++ b/lib/compiler/test/core_fold_SUITE.erl @@ -210,6 +210,16 @@ eq(Config) when is_list(Config) -> ?line ?CMP_DIFF(a, [a]), ?line ?CMP_DIFF(a, {1,2,3}), + ?CMP_SAME(#{a=>1.0,b=>2}, #{b=>2.0,a=>1}), + ?CMP_SAME(#{a=>[1.0],b=>[2]}, #{b=>[2.0],a=>[1]}), + + %% The rule for comparing keys are different in 17.x and 18.x. + %% Just test that the results are consistent. + Bool = id(#{1=>a}) == id(#{1.0=>a}), %Unoptimizable. + Bool = id(#{1=>a}) == #{1.0=>a}, %Optimizable. + Bool = #{1=>a} == #{1.0=>a}, %Optimizable. + io:format("Bool = ~p\n", [Bool]), + ok. %% OTP-7117. |