Skip to content

Commit 16ea29d

Browse files
committed
Properly escape fields passed to defrecord (#6086)
1 parent 16a90ce commit 16ea29d

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

lib/elixir/lib/record.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ defmodule Record do
316316
Keyword.keyword?(args) ->
317317
create(atom, fields, args, caller)
318318
true ->
319+
fields = Macro.escape(fields)
319320
case Macro.expand(args, caller) do
320321
{:{}, _, [^atom | list]} when length(list) == length(fields) ->
321322
record = List.to_tuple([atom | list])

lib/elixir/test/elixir/record_test.exs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ defmodule RecordTest do
136136
binary: <<1, 2, 3>>,
137137
charlist: 'abc'
138138

139-
test "records with literal defaults" do
139+
test "records with literal defaults and on-the-fly record" do
140140
assert defaults(defaults()) == [
141141
struct: ~D[2016-01-01],
142142
map: %{},
@@ -163,6 +163,35 @@ defmodule RecordTest do
163163
assert defaults(defaults(), :charlist) == 'abc'
164164
end
165165

166+
test "records with literal defaults and record in a variable" do
167+
defaults = defaults()
168+
169+
assert defaults(defaults) == [
170+
struct: ~D[2016-01-01],
171+
map: %{},
172+
tuple_zero: {},
173+
tuple_one: {1},
174+
tuple_two: {1, 2},
175+
tuple_three: {1, 2, 3},
176+
list: [1, 2, 3],
177+
call: MapSet.new,
178+
string: "abc",
179+
binary: <<1, 2, 3>>,
180+
charlist: 'abc'
181+
]
182+
assert defaults(defaults, :struct) == ~D[2016-01-01]
183+
assert defaults(defaults, :map) == %{}
184+
assert defaults(defaults, :tuple_zero) == {}
185+
assert defaults(defaults, :tuple_one) == {1}
186+
assert defaults(defaults, :tuple_two) == {1, 2}
187+
assert defaults(defaults, :tuple_three) == {1, 2, 3}
188+
assert defaults(defaults, :list) == [1, 2, 3]
189+
assert defaults(defaults, :call) == MapSet.new
190+
assert defaults(defaults, :string) == "abc"
191+
assert defaults(defaults, :binary) == <<1, 2, 3>>
192+
assert defaults(defaults, :charlist) == 'abc'
193+
end
194+
166195
test "records with dynamic arguments" do
167196
record = file_info()
168197
assert file_info(record, :size) == :undefined

0 commit comments

Comments
 (0)