From 63ee5209162f0567beb7ca548fa2785a2d02bba0 Mon Sep 17 00:00:00 2001 From: Shuhei Kadowaki Date: Sat, 27 Jan 2024 13:13:51 +0900 Subject: [PATCH] add comment and tests --- base/views.jl | 3 +++ test/subarray.jl | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/base/views.jl b/base/views.jl index 0792c10088302..6898abdda1471 100644 --- a/base/views.jl +++ b/base/views.jl @@ -126,6 +126,9 @@ macro view(ex) Meta.isexpr(ex, :ref) || throw(ArgumentError( "Invalid use of @view macro: argument must be a reference expression A[...].")) ex = replace_ref_begin_end!(ex) + # NOTE We embed `view` as a function object itself directly into the AST. + # By doing this, we prevent the creation of function definitions like + # `view(A, idx) = xxx` in cases such as `@view(A[idx]) = xxx.` if Meta.isexpr(ex, :ref) ex = Expr(:call, view, ex.args...) elseif Meta.isexpr(ex, :let) && (arg2 = ex.args[2]; Meta.isexpr(arg2, :ref)) diff --git a/test/subarray.jl b/test/subarray.jl index ad68496e38245..40877d842df76 100644 --- a/test/subarray.jl +++ b/test/subarray.jl @@ -937,3 +937,21 @@ end v = view(1:2, r) @test v == view(1:2, collect(r)) end + +# https://github.com/JuliaLang/julia/pull/53064 +# `@view(A[idx]) = xxx` should raise syntax error always +@test try + Core.eval(@__MODULE__, :(@view(A[idx]) = 2)) + false +catch err + err isa ErrorException && startswith(err.msg, "syntax:") +end +module Issue53064 +import Base: view +end +@test try + Core.eval(Issue53064, :(@view(A[idx]) = 2)) + false +catch err + err isa ErrorException && startswith(err.msg, "syntax:") +end