[code coverage] Skip line that starts with skipped region

This CL fixes a bug that sometimes a uncoverable line is incorrectly
marked as not covered.

Bug: 930360
Change-Id: I122c6009c2294ad6a8db80b0fed58ab9b4b1d10a
Reviewed-on: https://chromium-review.googlesource.com/c/1495395
Reviewed-by: Roberto Carrillo <robertocn@chromium.org>
Commit-Queue: Yuke Liao <liaoyuke@chromium.org>
diff --git a/scripts/slave/recipe_modules/clang_coverage/resources/generate_coverage_metadata.py b/scripts/slave/recipe_modules/clang_coverage/resources/generate_coverage_metadata.py
index a3bc547..7fd6436 100644
--- a/scripts/slave/recipe_modules/clang_coverage/resources/generate_coverage_metadata.py
+++ b/scripts/slave/recipe_modules/clang_coverage/resources/generate_coverage_metadata.py
@@ -84,8 +84,11 @@
 
     line_starts_new_region = any(
         [_is_start_of_region(segment) for segment in current_line_segments])
-    is_coverable = ((wrap_segment and _has_count(wrap_segment)) or
-                    line_starts_new_region)
+    is_start_of_skipped_region = (
+        current_line_segments and not _has_count(current_line_segments[0]) and
+        _is_region_entry(current_line_segments[0]))
+    is_coverable = not is_start_of_skipped_region and (
+        (wrap_segment and _has_count(wrap_segment)) or line_starts_new_region)
     if not is_coverable:
       continue
 
diff --git a/scripts/slave/recipe_modules/clang_coverage/unittests/generate_coverage_metadata_test.py b/scripts/slave/recipe_modules/clang_coverage/unittests/generate_coverage_metadata_test.py
index 8814db2..10c9cec 100755
--- a/scripts/slave/recipe_modules/clang_coverage/unittests/generate_coverage_metadata_test.py
+++ b/scripts/slave/recipe_modules/clang_coverage/unittests/generate_coverage_metadata_test.py
@@ -63,6 +63,33 @@
     self.assertDictEqual(expected_line_data, line_data)
     self.assertDictEqual(expected_block_data, block_data)
 
+  # This test uses the following code, and the segments are based on execution
+  # on Linux platform.
+  #
+  #  1|       |#include "testing/gtest/include/gtest/gtest.h"
+  #  2|       |
+  #  3|      0|TEST(GUIDTest, DISABLED_GUIDGeneratesAllZeroes) {
+  #  4|      0|
+  #  5|       |  #if defined(OS_ANDROID) || defined(OS_CHROMEOS)
+  #  6|       |    EXPECT_EQ(1, 1);
+  #  7|       |  #else
+  #  8|      0|    EXPECT_EQ(2, 2);
+  #  9|      0|  #endif
+  # 10|      0|}
+  #
+  # Where the first column is the line number and the second column is the
+  # expected number of times the line is executed.
+  def test_parse_exported_coverage_json_uncovered_macros(self):
+    segments = [[3, 49, 0, True, True], [5, 3, 0, False, True],
+                [8, 1, 0, True, False], [8, 5, 0, True, True],
+                [8, 14, 0, True, False], [10, 2, 0, False, False]]
+
+    expected_line_data = dict([(3, 0), (4, 0), (8, 0), (9, 0), (10, 0)])
+    expected_block_data = {}
+    line_data, block_data = generator._extract_coverage_info(segments)
+    self.assertDictEqual(expected_line_data, line_data)
+    self.assertDictEqual(expected_block_data, block_data)
+
   # This test uses the following code:
   # 1|      1|int main() {
   # 2|      1|  if ((2 > 1) || (3 > 2)) {