Strenghten assumption about function start and end line (PR gcov-profile/88045).
authorMartin Liska <mliska@suse.cz>
Mon, 19 Nov 2018 08:16:17 +0000 (09:16 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 19 Nov 2018 08:16:17 +0000 (08:16 +0000)
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

gcc/ChangeLog
gcc/coverage.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gcov/pr88045.C [new file with mode: 0644]

index dd7984c741891c5ac1345cd3acc0d4980c001409..dbabb6c315021c42aeb3d9a7284316042476e408 100644 (file)
@@ -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
index 599a3bb9aeb60c440775cd601bf40265a9a508ec..f0cbc1e46efec05a6df4838446ad4428a53e074d 100644 (file)
@@ -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 ();
index ffd271a8c3f31a35d007a0ee83b89ce9661a258b..4db71445888504acd61bb293191a08abd963ee26 100644 (file)
@@ -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 (file)
index 0000000..1b077a5
--- /dev/null
@@ -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 } }