SIGN IN SIGN UP

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