diff options
author | Anthony Ramine <[email protected]> | 2014-03-25 03:00:15 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2014-03-25 04:34:24 +0100 |
commit | 7a72ebab6811bea482ae0ad9fc25c7f4820226fe (patch) | |
tree | b086da6562d03ba74e7fb872b46210ab8b12b8cf /lib/compiler/test | |
parent | c2b4eab25c907f453a394d382c04cd04e6c06b49 (diff) | |
download | otp-7a72ebab6811bea482ae0ad9fc25c7f4820226fe.tar.gz otp-7a72ebab6811bea482ae0ad9fc25c7f4820226fe.tar.bz2 otp-7a72ebab6811bea482ae0ad9fc25c7f4820226fe.zip |
Correctly handle non-matching patterns against literal values
The pass sys_core_fold did not correctly handle non-matching patterns in code
such as:
0 = case <<>> of
<<>> -> 0;
a -> 1
end.
Function case_opt_lit/3 is rewritten in two passes to first remove any
non-matching clause and only then potentially remove the related patterns
in each clause.
Reported-by: Ulf Norell
Diffstat (limited to 'lib/compiler/test')
-rw-r--r-- | lib/compiler/test/core_fold_SUITE.erl | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/compiler/test/core_fold_SUITE.erl b/lib/compiler/test/core_fold_SUITE.erl index 9c986576d5..6a7036d728 100644 --- a/lib/compiler/test/core_fold_SUITE.erl +++ b/lib/compiler/test/core_fold_SUITE.erl @@ -23,7 +23,7 @@ t_element/1,setelement/1,t_length/1,append/1,t_apply/1,bifs/1, eq/1,nested_call_in_case/1,guard_try_catch/1,coverage/1, unused_multiple_values_error/1,unused_multiple_values/1, - multiple_aliases/1,redundant_boolean_clauses/1]). + multiple_aliases/1,redundant_boolean_clauses/1,mixed_matching_clauses/1]). -export([foo/0,foo/1,foo/2,foo/3]). @@ -40,7 +40,7 @@ groups() -> [t_element,setelement,t_length,append,t_apply,bifs, eq,nested_call_in_case,guard_try_catch,coverage, unused_multiple_values_error,unused_multiple_values, - multiple_aliases,redundant_boolean_clauses]}]. + multiple_aliases,redundant_boolean_clauses,mixed_matching_clauses]}]. init_per_suite(Config) -> @@ -373,5 +373,15 @@ redundant_boolean_clauses(Config) when is_list(Config) -> true -> yes end. +mixed_matching_clauses(Config) when is_list(Config) -> + 0 = case #{} of + #{} -> 0; + a -> 1 + end, + 0 = case <<>> of + <<>> -> 0; + a -> 1 + end, + ok. id(I) -> I. |