https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48463

Martin Liška <marxin at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-08-05
                 CC|                            |marxin at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> ---
I confirm that, it's caused by generated deleting dtor:

virtual ClassB::~ClassB() (struct ClassB * const this)
{
  <bb 2>:
  ClassB::~ClassB (this_2(D));
  operator delete (this_2(D), 8);
  return;

}

The dtor is given the same source line as it's abstract origin and all
statements in the function are given line after the origin. Resulting
in bogus output:
$  gcov -b tc.gcda

...
function _ZN6ClassBD0Ev called 1 returned 100% blocks executed 100%
function _ZN6ClassBD2Ev called 1 returned 100% blocks executed 100%
        3:   10:ClassB::~ClassB()
        -:   11:{
        1:   12:        std::cout << "Bey, ClassB!" << std::endl;
call    0 returned 100%
call    1 returned 100%
        2:   13:}
call    0 returned 100% // ClassB::~ClassB (this_2(D));
call    1 returned 100% // operator delete (this_2(D), 8);
        -:   14:

First idea about how to fix the issues is to ignore all fns with an abstract
origin?

diff --git a/gcc/coverage.c b/gcc/coverage.c
index d4d371e..0cf5ebb 100644
--- a/gcc/coverage.c
+++ b/gcc/coverage.c
@@ -642,6 +642,11 @@ coverage_begin_function (unsigned lineno_checksum,
unsigned cfg_checksum)
   if (no_coverage || !bbg_file_name)
     return 0;

+  /* Do not output any abstract origin function.  */
+  tree abstract = DECL_ABSTRACT_ORIGIN (current_function_decl);
+  if (abstract)
+    return 0;
+
   xloc = expand_location (DECL_SOURCE_LOCATION (current_function_decl));

   /* Announce function */

I'm going to discuss that with Honza.

Reply via email to