https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110827
--- Comment #10 from Michael Duggan <mwd at md5i dot com> --- To sum up what I have figured out, C++ transforms the coroutine "function" into a trio of functions: a ramp function, an actor function, and a destruction function. The ramp function acts as the actual function (by name). The actor function contains the original body of the written function (with some transformations), and thus contains the code associated with most of the lines that need coverage information. Since the actor function is generated artificially, it is marked as artificial. The gcov program explicitly ignores functions that are marked as artificial. Also, even if that were not the case, it looks to me like the line coverage information for the actor function only includes the initial line of the function. This seems to be due to the way the artificial function gets inserted into the list of functions of the program. In order to solve this problem, we would need to at least the following: Find a way to not ignore the actor function. This would involve either not marking it as artificial or by marking it in some other way that would be recognized by gcov. Ensure that the actor function properly includes the line number information from the original coroutine body. Most of this work would probably need to be done in the c++ code (where the coroutine transformation happens) rather than in the coverage code. Should this be reassigned to the c++ component?