Skip to content

Commit 7e44b88

Browse files
committed
Raise for is_record guards, closes #10436
1 parent 5c52598 commit 7e44b88

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

lib/elixir/src/elixir_rewrite.erl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,10 @@ guard_rewrite(Receiver, DotMeta, Right, Meta, Args) ->
327327
_ -> {error, {invalid_guard, Receiver, Right, length(Args)}}
328328
end.
329329

330+
%% erlang:is_record/2-3 are compiler guards in Erlang which we
331+
%% need to explicitly forbid as they are allowed in erl_internal.
332+
allowed_guard(is_record, 2) -> false;
333+
allowed_guard(is_record, 3) -> false;
330334
allowed_guard(Right, Arity) ->
331335
erl_internal:guard_bif(Right, Arity) orelse elixir_utils:guard_op(Right, Arity).
332336

lib/elixir/test/elixir/kernel/guard_test.exs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,22 @@ defmodule Kernel.GuardTest do
310310
end
311311
end
312312

313+
assert_raise CompileError,
314+
~r"cannot invoke remote function :erlang\.is_record/2 inside guards",
315+
fn ->
316+
defmodule IsRecord2Usage do
317+
defguard foo(rec) when :erlang.is_record(rec, :tag)
318+
end
319+
end
320+
321+
assert_raise CompileError,
322+
~r"cannot invoke remote function :erlang\.is_record/3 inside guards",
323+
fn ->
324+
defmodule IsRecord3Usage do
325+
defguard foo(rec) when :erlang.is_record(rec, :tag, 7)
326+
end
327+
end
328+
313329
assert_raise CompileError,
314330
~r"cannot invoke remote function :erlang\.\+\+/2 inside guards",
315331
fn ->

0 commit comments

Comments
 (0)