From 0baa07cdf2754748bbc2d969bf83f08c0976fb78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Mon, 15 Aug 2016 15:34:06 +0200 Subject: Fix overridden BIFs The filters in a list comprehension can be guard expressions or an ordinary expressions. If a guard expression is used as a filter, an exception will basically mean the same as 'false': t() -> L = [{some_tag,42},an_atom], [X || X <- L, element(1, X) =:= some_tag] %% Returns [{some_tag,42}] On the other hand, if an ordinary expression is used as a filter, there will be an exception: my_element(N, T) -> element(N, T). t() -> L = [{some_tag,42},an_atom], [X || X <- L, my_element(1, X) =:= some_tag] %% Causes a 'badarg' exception when element(1, an_atom) is evaluated It has been allowed for several releases to override a BIF with a local function. Thus, if we define a function called element/2, it will be called instead of the BIF element/2 within the module. We must use the "erlang:" prefix to call the BIF. Therefore, the following code is expected to work the same way as in our second example above: -compile({no_auto_import,[element/2]}). element(N, T) -> erlang:element(N, T). t() -> L = [{some_tag,42},an_atom], [X || X <- L, element(1, X) =:= some_tag]. %% Causes a 'badarg' exception when element(1, an_atom) is evaluated But the compiler refuses to compile the code with the following diagnostic: call to local/imported function element/2 is illegal in guard --- lib/debugger/test/Makefile | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/debugger/test/Makefile') diff --git a/lib/debugger/test/Makefile b/lib/debugger/test/Makefile index 125abcacda..efb6d9ed8b 100644 --- a/lib/debugger/test/Makefile +++ b/lib/debugger/test/Makefile @@ -46,6 +46,7 @@ MODULES= \ lc_SUITE \ line_number_SUITE \ map_SUITE \ + overridden_bif_SUITE \ record_SUITE \ trycatch_SUITE \ test_lib \ -- cgit v1.2.3