diff options
author | Martin Liska <mliska@suse.cz> | 2018-11-19 09:16:17 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-11-19 08:16:17 +0000 |
commit | 390e529e2b98983de392b3d9b9b57c4a1258b080 (patch) | |
tree | 82e44c5460111671c6f34fa52668334ee91c8496 | |
parent | ca44d7f40afa39b40cfa2ac85521a65d1743ef7a (diff) | |
download | gcc-390e529e2b98983de392b3d9b9b57c4a1258b080.zip gcc-390e529e2b98983de392b3d9b9b57c4a1258b080.tar.gz gcc-390e529e2b98983de392b3d9b9b57c4a1258b080.tar.bz2 |
Strenghten assumption about function start and end line (PR gcov-profile/88045).
2018-11-19 Martin Liska <mliska@suse.cz>
PR gcov-profile/88045
* coverage.c (coverage_begin_function): Add assert.
2018-11-19 Martin Liska <mliska@suse.cz>
PR gcov-profile/88045
* g++.dg/gcov/pr88045.C: New test.
From-SVN: r266262
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/coverage.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gcov/pr88045.C | 90 |
4 files changed, 103 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd7984c..dbabb6c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-11-19 Martin Liska <mliska@suse.cz> + + PR gcov-profile/88045 + * coverage.c (coverage_begin_function): Add assert. + 2018-11-18 Sandra Loosemore <sandra@codesourcery.com> PR other/40498 diff --git a/gcc/coverage.c b/gcc/coverage.c index 599a3bb..f0cbc1e 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 ffd271a..4db7144 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-11-19 Martin Liska <mliska@suse.cz> + + PR gcov-profile/88045 + * g++.dg/gcov/pr88045.C: New test. + 2018-11-18 Thomas Koenig <tkoenig@gcc.gnu.org> 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 0000000..1b077a5 --- /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 <numeric> +#include <vector> +#include <stdlib.h> + +struct Foo { + size_t size() const { return n; }; + const size_t n; + explicit Foo(size_t a_n) : n{a_n} {}; +}; + +template<template<typename...> class C, typename Head, typename... Tail> +struct make_with_tail { + using type = C<Tail...>; +}; + +template<template<typename...> class C, typename T, typename Head, typename... Tail> +struct make_with_tail_1 { +using type = C<T, Tail...>; +}; + +template<typename Head, typename... Tail> +struct head { + using type = Head; +}; +template<typename... Ts> +struct Tree { + using root_type = typename head<Ts...>::type; + using branch_type = typename make_with_tail<Tree, Ts...>::type; + Tree(root_type a_root, std::vector<branch_type> 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<branch_type> branches; +}; + +template<> +struct Tree<> { +}; + +template<typename... Axes> +size_t size(const Tree<Axes...>& tree) +{ + return std::accumulate( + tree.branches.begin(), + tree.branches.end(), + 0, + [](const size_t& count, const typename make_with_tail<Tree, Axes...>::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, Foo, Foo>{Foo{4}, {Tree<Foo, Foo>{Foo{2}, {Tree<Foo>{Foo{205}}, + Tree<Foo>{Foo{261}}}}, + Tree<Foo, Foo>{Foo{4}, {Tree<Foo>{Foo{875}}, + Tree<Foo>{Foo{492}}, + Tree<Foo>{Foo{398}}, + Tree<Foo>{Foo{302}}}}, + Tree<Foo, Foo>{Foo{6}, {Tree<Foo>{Foo{111}}, + Tree<Foo>{Foo{436}}, + Tree<Foo>{Foo{388}}, + Tree<Foo>{Foo{879}}, + Tree<Foo>{Foo{783}}, + Tree<Foo>{Foo{735}}}}, + Tree<Foo, Foo>{Foo{3}, {Tree<Foo>{Foo{791}}, + Tree<Foo>{Foo{ 5}}, + Tree<Foo>{Foo{841}}}}}}); + + return 0; +} + +// { dg-final { run-gcov pr88045.C } } |