Erlang/OTP 28 [erts-16.4.0.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit]
defmodule A do
def foo do
[first | _] = URI.__info__(:struct)
Map.get(first, :required)
end
end
warning: incompatible types given to Map.get/2:
Map.get(first, :required)
the map:
%{default: if_set(term()), field: atom()}
does not have all required keys:
:required
therefore this function will always return nil
where "first" was given the type:
# type: %{default: if_set(term()), field: atom()}
# from: iex:6
[first | _] = URI.__info__(:struct)
└─ iex:7: A.foo/0
[first | _] = URI.__info__(:struct)
[
%{default: nil, field: :scheme, required: false},
%{default: nil, field: :authority, required: false},
%{default: nil, field: :userinfo, required: false},
%{default: nil, field: :host, required: false},
%{default: nil, field: :port, required: false},
%{default: nil, field: :path, required: false},
%{default: nil, field: :query, required: false},
%{default: nil, field: :fragment, required: false}
]
iex(3)> Map.get(first, :required)
false
Existing issue
Elixir and Erlang/OTP versions
Erlang/OTP 28 [erts-16.4.0.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit]
Elixir 1.20.0 (compiled with Erlang/OTP 28)
Operating system
any
Current behavior
Repro:
Yet it's easy to show the key exists and the code works
Expected behavior
Correct type inferred