nicer error message when you try to `.=` into a scalar (#61672)
closes https://github.com/JuliaLang/julia/issues/45086
original MWE
old:
```julia
julia> a = 2; b = 4; a .= b
ERROR: MethodError: no method matching copyto!(::Int64, ::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Tuple{}, typeof(identity), Tuple{Int64}})
The function `copyto!` exists, but no method is defined for this combination of argument types.
Closest candidates are:
copyto!(::Base.MPFR.BigFloatData, ::Any)
@ Base mpfr.jl:243
copyto!(::AbstractArray, ::Base.Broadcast.Broadcasted{<:Base.Broadcast.AbstractArrayStyle{0}})
@ Base broadcast.jl:953
copyto!(::AbstractArray, ::Base.Broadcast.Broadcasted)
@ Base broadcast.jl:950
...
Stacktrace:
[1] materialize!
@ ./broadcast.jl:908 [inlined]
[2] materialize!(dest::Int64, bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Nothing, typeof(identity), Tuple{Int64}})
@ Base.Broadcast ./broadcast.jl:905
[3] top-level scope
@ REPL[1]:1
```
new
```julia
julia> a = 2; b = 4; a .= b
ERROR: ArgumentError: cannot broadcast-assign (`.=`) into a value of type Int64
Stacktrace:
[1] _throw_unwritable_dest(dest::Any)
@ Base.Broadcast ~/Documents/code/julia_pr/usr/share/julia/base/broadcast.jl:964
[2] copyto!(dest::Int64, bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Tuple{}, typeof(identity), Tuple{Int64}})
@ Base.Broadcast ~/Documents/code/julia_pr/usr/share/julia/base/broadcast.jl:962
[3] materialize!
@ ~/Documents/code/julia_pr/usr/share/julia/base/broadcast.jl:923 [inlined]
[4] materialize!(dest::Int64, bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Nothing, typeof(identity), Tuple{Int64}})
@ Base.Broadcast ~/Documents/code/julia_pr/usr/share/julia/base/broadcast.jl:910
[5] top-level scope
@ REPL[19]:1
```
or old
```julia
julia> caeser_cipher(i) = s -> map(c -> c + i, s);
julia> str = "Hello, World!";
julia> str .= caeser_cipher(10)(str)
ERROR: MethodError: no method matching ndims(::Type{String})
The function `ndims` exists, but no method is defined for this combination of argument types.
Closest candidates are:
ndims(::Type{Union{}}, Any...)
@ Base abstractarray.jl:280
ndims(::Type{<:Number})
@ Base number.jl:92
ndims(::Type{<:Ref})
@ Base refpointer.jl:104
...
Stacktrace:
[1] Base.Broadcast.BroadcastStyle(::Type{String})
@ Base.Broadcast ./broadcast.jl:103
[2] combine_styles(c::String)
@ Base.Broadcast ./broadcast.jl:430
[3] combine_styles(c1::String, c2::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Nothing, typeof(identity), Tuple{Base.RefValue{String}}})
@ Base.Broadcast ./broadcast.jl:435
[4] materialize!(dest::String, bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Nothing, typeof(identity), Tuple{Base.RefValue{String}}})
@ Base.Broadcast ./broadcast.jl:905
[5] top-level scope
@ REPL[13]:1
```
new
```julia
julia> str .= caeser_cipher(10)(str)
ERROR: ArgumentError: cannot broadcast-assign (`.=`) into a value of type String
Stacktrace:
[1] _throw_unwritable_dest(dest::Any)
@ Base.Broadcast ~/Documents/code/julia_pr/usr/share/julia/base/broadcast.jl:964
[2] copyto!(dest::String, bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Tuple{}, typeof(identity), Tuple{Base.RefValue{String}}})
@ Base.Broadcast ~/Documents/code/julia_pr/usr/share/julia/base/broadcast.jl:962
[3] materialize!
@ ~/Documents/code/julia_pr/usr/share/julia/base/broadcast.jl:923 [inlined]
[4] materialize!(dest::String, bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Nothing, typeof(identity), Tuple{Base.RefValue{String}}})
@ Base.Broadcast ~/Documents/code/julia_pr/usr/share/julia/base/broadcast.jl:910
[5] top-level scope
@ REPL[36]:1
``` A
Andy Dienes committed
c26f5d43da7961b9ead912a886af20fc78fb8ef9
Parent: 29bcd2e
Committed by GitHub <noreply@github.com>
on 4/28/2026, 4:43:53 PM