From: Martin Liska Date: Mon, 19 Nov 2018 08:16:17 +0000 (+0100) Subject: Strenghten assumption about function start and end line (PR gcov-profile/88045). X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=390e529e2b98983de392b3d9b9b57c4a1258b080;p=gcc.git Strenghten assumption about function start and end line (PR gcov-profile/88045). 2018-11-19 Martin Liska PR gcov-profile/88045 * coverage.c (coverage_begin_function): Add assert. 2018-11-19 Martin Liska PR gcov-profile/88045 * g++.dg/gcov/pr88045.C: New test. From-SVN: r266262 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd7984c7418..dbabb6c3150 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-11-19 Martin Liska + + PR gcov-profile/88045 + * coverage.c (coverage_begin_function): Add assert. + 2018-11-18 Sandra Loosemore PR other/40498 diff --git a/gcc/coverage.c b/gcc/coverage.c index 599a3bb9aeb..f0cbc1e46ef 100644 --- a/gcc/coverage.c +++ b/gcc/coverage.c @@ -639,7 +639,9 @@ coverage_begin_function (unsigned lineno_checksum, unsigned cfg_checksum) expanded_location endloc = expand_location (cfun->function_end_locus); /* Function can start in a single file and end in another one. */ - gcov_write_unsigned (endloc.file == xloc.file ? endloc.line : xloc.line); + int end_line = endloc.file == xloc.file ? endloc.line : xloc.line; + gcc_assert (xloc.line <= end_line); + gcov_write_unsigned (end_line); gcov_write_length (offset); return !gcov_is_error (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ffd271a8c3f..4db71445888 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-11-19 Martin Liska + + PR gcov-profile/88045 + * g++.dg/gcov/pr88045.C: New test. + 2018-11-18 Thomas Koenig PR fortran/88073 diff --git a/gcc/testsuite/g++.dg/gcov/pr88045.C b/gcc/testsuite/g++.dg/gcov/pr88045.C new file mode 100644 index 00000000000..1b077a5e61a --- /dev/null +++ b/gcc/testsuite/g++.dg/gcov/pr88045.C @@ -0,0 +1,90 @@ +// PR gcov-profile/88045 +// { dg-options "-fprofile-arcs -ftest-coverage -std=c++11" } +// { dg-do run { target native } } + +#include +#include +#include + +struct Foo { + size_t size() const { return n; }; + const size_t n; + explicit Foo(size_t a_n) : n{a_n} {}; +}; + +template class C, typename Head, typename... Tail> +struct make_with_tail { + using type = C; +}; + +template class C, typename T, typename Head, typename... Tail> +struct make_with_tail_1 { +using type = C; +}; + +template +struct head { + using type = Head; +}; +template +struct Tree { + using root_type = typename head::type; + using branch_type = typename make_with_tail::type; + Tree(root_type a_root, std::vector a_branches) : + root{std::move(a_root)}, + branches{std::move(a_branches)} + { + } + + explicit Tree(root_type a_root) : root{std::move(a_root)}, branches{root.size()} + { + } + + root_type root; + std::vector branches; +}; + +template<> +struct Tree<> { +}; + +template +size_t size(const Tree& tree) +{ + return std::accumulate( + tree.branches.begin(), + tree.branches.end(), + 0, + [](const size_t& count, const typename make_with_tail::type& branch) { + return count + size(branch); + }); +} + +template<> +inline size_t size(const Tree<>& /* empty tree */) +{ + return 1; +} + +int main(int argc, char *argv[]) +{ + size(Tree{Foo{4}, {Tree{Foo{2}, {Tree{Foo{205}}, + Tree{Foo{261}}}}, + Tree{Foo{4}, {Tree{Foo{875}}, + Tree{Foo{492}}, + Tree{Foo{398}}, + Tree{Foo{302}}}}, + Tree{Foo{6}, {Tree{Foo{111}}, + Tree{Foo{436}}, + Tree{Foo{388}}, + Tree{Foo{879}}, + Tree{Foo{783}}, + Tree{Foo{735}}}}, + Tree{Foo{3}, {Tree{Foo{791}}, + Tree{Foo{ 5}}, + Tree{Foo{841}}}}}}); + + return 0; +} + +// { dg-final { run-gcov pr88045.C } }