Skip to content

Commit ba85d13

Browse files
author
José Valim
committed
Always use in_context definition for struct expansion, closes #6409
1 parent 039ca64 commit ba85d13

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

lib/elixir/src/elixir_map.erl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,7 @@ validate_struct(_, _) -> false.
121121

122122
load_struct(Meta, Name, Args, InContext, E) ->
123123
Arity = length(Args),
124-
125-
Local =
126-
not(ensure_loaded(Name)) andalso
127-
(InContext orelse wait_for_struct(Name)),
124+
Local = InContext orelse (not(ensure_loaded(Name)) andalso wait_for_struct(Name)),
128125

129126
try
130127
case Local andalso elixir_def:local_for(Name, '__struct__', Arity, [def]) of

lib/elixir/test/elixir/map_test.exs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ defmodule MapTest do
216216
end
217217
end
218218

219-
test "defstruct allow keys to be enforced" do
219+
test "defstruct allows keys to be enforced" do
220220
message = "the following keys must also be given when building struct TestMod: [:foo]"
221221
assert_raise ArgumentError, message, fn ->
222222
Code.eval_string("""
@@ -243,6 +243,26 @@ defmodule MapTest do
243243
end
244244
end
245245

246+
test "struct always expands context module" do
247+
Code.compiler_options(ignore_module_conflict: true)
248+
249+
defmodule LocalPoint do
250+
defstruct x: 0
251+
def new, do: %LocalPoint{}
252+
end
253+
254+
assert LocalPoint.new == %{__struct__: LocalPoint, x: 0}
255+
256+
defmodule LocalPoint do
257+
defstruct x: 0, y: 0
258+
def new, do: %LocalPoint{}
259+
end
260+
261+
assert LocalPoint.new == %{__struct__: LocalPoint, x: 0, y: 0}
262+
after
263+
Code.compiler_options(ignore_module_conflict: false)
264+
end
265+
246266
defmodule LocalUser do
247267
defmodule NestedUser do
248268
defstruct []

0 commit comments

Comments
 (0)