diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm index ab0de6074d0ab..4850d81cbea1f 100644 --- a/src/julia-syntax.scm +++ b/src/julia-syntax.scm @@ -4616,9 +4616,9 @@ f(x) = yt(x) (let ((e1 (if (and arg-map (symbol? e)) (get arg-map e e) e))) - (if (and value (or (underscore-symbol? e) - (and (pair? e) (eq? (car e) 'globalref) - (underscore-symbol? (cadr e))))) + (if (or (underscore-symbol? e) + (and (pair? e) (eq? (car e) 'globalref) + (underscore-symbol? (cadr e)))) (error (string "all-underscore identifiers are write-only and their values cannot be used in expressions" (format-loc current-loc)))) (cond (tail (emit-return tail e1)) (value e1) diff --git a/src/method.c b/src/method.c index ffd33645310f3..fa738182d9181 100644 --- a/src/method.c +++ b/src/method.c @@ -45,7 +45,8 @@ static jl_value_t *resolve_definition_effects(jl_value_t *expr, jl_module_t *mod int binding_effects, int eager_resolve) { if (jl_is_symbol(expr)) { - jl_error("Found raw symbol in code returned from lowering. Expected all symbols to have been resolved to GlobalRef or slots."); + jl_errorf("Found raw symbol %s in code returned from lowering. Expected all symbols to have been resolved to GlobalRef or slots.", + jl_symbol_name((jl_sym_t*)expr)); } if (jl_is_globalref(expr)) { jl_maybe_add_binding_backedge((jl_globalref_t*)expr, module, binding_edge); diff --git a/test/syntax.jl b/test/syntax.jl index 90b37403290d9..1867084163d6e 100644 --- a/test/syntax.jl +++ b/test/syntax.jl @@ -2819,6 +2819,20 @@ end @m38386 @test isempty(methods(f38386)) +@testset "non-lhs all-underscore vars should fail in lowering" begin + # OK + @test (_ = 1) === 1 + @test ((_, _) = (1, 2)) == (1, 2) + @test Meta.isexpr(Meta.lower(Main, :(for _ in 1:2; 1; end)), :thunk) + @test (try; throw(1); catch _; 2; end) === 2 + @test (let _ = 1; 2; end) === 2 + # ERROR: syntax: all-underscore identifiers are write-only and their values cannot be used in expressions + @test Meta.isexpr(Meta.lower(Main, :(_ = 1; a = _)), :error) + @test Meta.isexpr(Meta.lower(Main, :(let; function f(); _; end; end)), :error) + @test Meta.isexpr(Meta.lower(Main, :(let; function f(); _; 1; end; end)), :error) + @test Meta.isexpr(Meta.lower(Main, :(begin; _; 1; end)), :error) +end + @testset "all-underscore varargs on the rhs" begin @test ncalls_in_lowered(quote _..., = a end, GlobalRef(Base, :rest)) == 0 @test ncalls_in_lowered(quote ___..., = a end, GlobalRef(Base, :rest)) == 0