Hi,
I’m belatedly getting around to updating some private packages to 0.7 (and then to 1.0). I ran into some instances of implicit globals in the package tests and I’ve mostly gotten rid of them and gotten my head round all the scoping changes. However, I still have a few places where I’m getting implicit global variables warning that I can’t understand. The warnings all look like
Warning: Deprecated syntax `implicit assignment to global variable `x1``.
│ Use `global x1` instead.
└ @ none:0
for a few different variable names. The test structure for the package (which consists of an umbrella module with a few submodules) is as follows:
@testset "master testset" begin
@testset "submodule1" begin
include("submodule1_tests.jl")
end
@testset "submodule2" begin
include("submodule2_tests.jl")
end
.
.
.
end
where the tests for each submodule might contain nested @testset
s. All my remaining implicit global variable warnings come from cases where a variable is created inside a testset in one submodule and then the same variable name is reused inside another testset. For example I might have
x1 = foo()
@test x1==1
inside the submodule1 tests and then never refer to x again inside that testset. Then in another submodule’s tests I might do
x1 = bar()
@test x1 == 4.5
with x1
not being used anywhere else in any of the tests. If I change x1
to a new name in the second testset, the implicit global warning goes away. I’m confused as to why this is happening. As far as I understand, @testset
introduces a new local scope, so the two uses of x1
above should have nothing to do with each other. Unfortunately I haven’t been able to reduce this to a MWE, which is doubly confusing as the following (which I thought was equivalent to my actual use case in terms of scoping) runs without warnings in 0.7
julia> using Test
julia> @testset "master" begin
@test 1 == 1
@testset "inner1" begin
y = ones(10)
@test y == ones(10)
@testset "inner2" begin
y = zeros(2)
@test y == zeros(2)
end
end
@testset "inner3" begin
y = [1;2;3]
@test y == [1;2;3]
end
end
Test Summary: | Pass Total
master | 4 4
Test.DefaultTestSet("master", Any[DefaultTestSet("inner1", Any[DefaultTestSet("inner2", Any[], 1, false)], 1, false), DefaultTestSet("inner3", Any[], 1, false)], 1, false)
Anyone have any idea what’s going on here? I’m stumped.
Thanks!