diff options
| -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 f4f5c3f361..ed8f609082 100644 --- a/lib/compiler/src/sys_core_fold.erl +++ b/lib/compiler/src/sys_core_fold.erl @@ -1229,6 +1229,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 9c7e97a1bf..2de17e7653 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. | 
