From 4891396ea81841ac88ff80a2def57cd093809ffa Mon Sep 17 00:00:00 2001 From: Simon Byrne Date: Mon, 24 Sep 2018 10:12:24 -0700 Subject: [PATCH] fix precompile and more tests, from @mauro3 --- base/util.jl | 50 +++++++++++++++++++--------------- contrib/generate_precompile.jl | 1 + test/misc.jl | 27 ++++++++++++++++++ 3 files changed, 56 insertions(+), 22 deletions(-) diff --git a/base/util.jl b/base/util.jl index fb1859440d750..f05bcc617eead 100644 --- a/base/util.jl +++ b/base/util.jl @@ -697,31 +697,37 @@ end function _kwdef!(blk, params_args, call_args) for i in eachindex(blk.args) ei = blk.args[i] - if isa(ei, Symbol) + if ei isa Symbol + # var push!(params_args, ei) push!(call_args, ei) - elseif !isa(ei, Expr) - continue - elseif ei.head == :(=) - # var::Typ = defexpr - dec = ei.args[1] # var::Typ - if isa(dec, Expr) && dec.head == :(::) - var = dec.args[1] - else - var = dec + elseif ei isa Expr + if ei.head == :(=) + lhs = ei.args[1] + if lhs isa Symbol + # var = defexpr + var = lhs + elseif lhs isa Expr && lhs.head == :(::) && lhs.args[1] isa Symbol + # var::T = defexpr + var = lhs.args[1] + else + # something else, e.g. inline inner constructor + # F(...) = ... + continue + end + defexpr = ei.args[2] # defexpr + push!(params_args, Expr(:kw, var, defexpr)) + push!(call_args, var) + blk.args[i] = lhs + elseif ei.head == :(::) && ei.args[1] isa Symbol + # var::Typ + var = ei.args[1] + push!(params_args, var) + push!(call_args, var) + elseif ei.head == :block + # can arise with use of @static inside type decl + _kwdef!(ei, params_args, call_args) end - def = ei.args[2] # defexpr - push!(params_args, Expr(:kw, var, def)) - push!(call_args, var) - blk.args[i] = dec - elseif ei.head == :(::) - dec = ei # var::Typ - var = dec.args[1] # var - push!(params_args, var) - push!(call_args, var) - elseif ei.head == :block - # can arise with use of @static inside type decl - _kwdef!(ei, params_args, call_args) end end blk diff --git a/contrib/generate_precompile.jl b/contrib/generate_precompile.jl index c3d52f4f65142..4691b86114b5a 100644 --- a/contrib/generate_precompile.jl +++ b/contrib/generate_precompile.jl @@ -163,6 +163,7 @@ function generate_precompile_statements() # println(statement) # Work around #28808 occursin("\"YYYY-mm-dd\\THH:MM:SS\"", statement) && continue + statement == "precompile(Tuple{typeof(Base.show), Base.IOContext{Base.TTY}, Type{Vararg{Any, N} where N}})" && continue try Base.include_string(PrecompileStagingArea, statement) catch ex diff --git a/test/misc.jl b/test/misc.jl index 2ef63c2d2ba84..64236b20b6fcd 100644 --- a/test/misc.jl +++ b/test/misc.jl @@ -691,6 +691,33 @@ end @test Test29307{UInt32}(a=0x03) == Test29307{UInt32}(0x03) end +@kwdef struct TestInnerConstructor + a = 1 + TestInnerConstructor(a::Int) = (@assert a>0; new(a)) + function TestInnerConstructor(a::String) + @assert length(a) > 0 + new(a) + end +end + +@testset "@kwdef inner constructor" begin + @test TestInnerConstructor() == TestInnerConstructor(1) + @test TestInnerConstructor(a=2) == TestInnerConstructor(2) + @test_throws AssertionError TestInnerConstructor(a=0) + @test TestInnerConstructor(a="2") == TestInnerConstructor("2") + @test_throws AssertionError TestInnerConstructor(a="") +end + + +const outsidevar = 7 +@kwdef struct TestOutsideVar + a::Int=outsidevar +end +@test TestOutsideVar() == TestOutsideVar(7) + + + + @testset "exports of modules" begin for (_, mod) in Base.loaded_modules for v in names(mod)