diff --git a/src/codegen.cpp b/src/codegen.cpp index e117f89fbbe77..56bbb69525d84 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -5956,6 +5956,13 @@ static std::pair, jl_llvm_functions_t> Value *sync_bytes = nullptr; if (do_malloc_log(true)) sync_bytes = ctx.builder.CreateCall(prepare_call(diff_gc_total_bytes_func), {}); + { // coverage for the function definition line number + const auto &topinfo = linetable.at(0); + if (topinfo == linetable.at(1)) + current_lineinfo.push_back(1); + if (do_coverage(topinfo.is_user_code)) + coverageVisitLine(ctx, topinfo.file, topinfo.line); + } find_next_stmt(0); while (cursor != -1) { diff --git a/test/cmdlineargs.jl b/test/cmdlineargs.jl index 5bb6ec3b9a8d9..6cacdee5d7348 100644 --- a/test/cmdlineargs.jl +++ b/test/cmdlineargs.jl @@ -256,7 +256,9 @@ let exename = `$(Base.julia_cmd()) --startup-file=no` mktempdir() do dir helperdir = joinpath(@__DIR__, "testhelpers") inputfile = joinpath(helperdir, "coverage_file.jl") - expected = replace(read(joinpath(helperdir, "coverage_file.info"), String), + expected = replace(read(joinpath(helperdir, "coverage_file.info.bad"), String), + "" => realpath(inputfile)) + expected_good = replace(read(joinpath(helperdir, "coverage_file.info"), String), "" => realpath(inputfile)) covfile = replace(joinpath(dir, "coverage.info"), "%" => "%%") @test !isfile(covfile) @@ -274,18 +276,21 @@ let exename = `$(Base.julia_cmd()) --startup-file=no` got = read(covfile, String) rm(covfile) @test occursin(expected, got) || (expected, got) + @test_broken occursin(expected_good, got) @test readchomp(`$exename -E "Base.JLOptions().code_coverage" -L $inputfile --code-coverage=$covfile --code-coverage=user`) == "1" @test isfile(covfile) got = read(covfile, String) rm(covfile) @test occursin(expected, got) || (expected, got) + @test_broken occursin(expected_good, got) @test readchomp(`$exename -E "Base.JLOptions().code_coverage" -L $inputfile --code-coverage=$covfile --code-coverage=all`) == "2" @test isfile(covfile) got = read(covfile, String) rm(covfile) @test occursin(expected, got) || (expected, got) + @test_broken occursin(expected_good, got) end # --track-allocation diff --git a/test/testhelpers/coverage_file.info b/test/testhelpers/coverage_file.info index 5b7b72789bf73..9b4b1c1f2f96e 100644 --- a/test/testhelpers/coverage_file.info +++ b/test/testhelpers/coverage_file.info @@ -1,4 +1,5 @@ SF: +DA:3,1 DA:4,1 DA:5,0 DA:7,1 @@ -8,6 +9,9 @@ DA:11,1 DA:12,1 DA:14,0 DA:17,1 -LH:7 -LF:9 +DA:19,1 +DA:20,1 +DA:22,1 +LH:10 +LF:13 end_of_record diff --git a/test/testhelpers/coverage_file.info.bad b/test/testhelpers/coverage_file.info.bad new file mode 100644 index 0000000000000..44e33a9df68c7 --- /dev/null +++ b/test/testhelpers/coverage_file.info.bad @@ -0,0 +1,19 @@ +SF: +DA:3,1 +DA:4,1 +DA:5,0 +DA:7,1 +DA:8,1 +DA:9,5 +DA:11,1 +DA:12,1 +DA:14,0 +DA:17,1 +DA:18,0 +DA:19,1 +DA:20,1 +DA:22,1 +DA:1234,0 +LH:11 +LF:15 +end_of_record diff --git a/test/testhelpers/coverage_file.jl b/test/testhelpers/coverage_file.jl index 986aaeec9f300..e8e0355952d80 100644 --- a/test/testhelpers/coverage_file.jl +++ b/test/testhelpers/coverage_file.jl @@ -14,7 +14,13 @@ function code_coverage_test() not_reached end -short_form_func_coverage_test(x) = x*x +@eval short_form_func_coverage_test(x) = begin + $(Expr(:line, 1234)) + y() = begin + x + end + x * y() +end success = code_coverage_test() == [1, 2, 3] && short_form_func_coverage_test(2) == 4