diff options
author | Vedant Kumar <vsk@apple.com> | 2016-05-19 23:44:02 +0000 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2016-05-19 23:44:02 +0000 |
commit | b384460fc34b2d2134efc649f3ac087126533ba9 (patch) | |
tree | 85037a70ea5c4c3e4d978da6089e00c7324a595e /test/CoverageMapping | |
parent | 23d62c03a7d342acec33d43091e70d1b60ec5b0a (diff) |
[Lexer] Don't merge macro args from different macro files
The lexer sets the end location of macro arguments incorrectly *if*,
while merging consecutive args to fit into a single SLocEntry, it finds
args which come from different macro files.
Fix the issue by using separate SLocEntries in this situation.
This fixes a code coverage crasher (rdar://problem/26181005). Because
the lexer reported end locations for certain macro args incorrectly, we
would generate bogus coverage mappings with negative line offsets.
Reviewed-by: akyrtzi
Differential Revision: http://reviews.llvm.org/D20401
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@270160 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CoverageMapping')
-rw-r--r-- | test/CoverageMapping/Inputs/macros.h | 13 | ||||
-rw-r--r-- | test/CoverageMapping/include-macros.c | 18 |
2 files changed, 31 insertions, 0 deletions
diff --git a/test/CoverageMapping/Inputs/macros.h b/test/CoverageMapping/Inputs/macros.h new file mode 100644 index 0000000000..0a2dadd1b8 --- /dev/null +++ b/test/CoverageMapping/Inputs/macros.h @@ -0,0 +1,13 @@ +// Assorted macros to help test #include behavior across file boundaries. + +#define helper1 0 + +void helper2(const char *, ...); + +#define M1(a, ...) helper2(a, ##__VA_ARGS__); + +// Note: M2 stresses vararg macro functions with macro arguments. The spelling +// locations of the args used to be set to the expansion site, leading to +// crashes (region LineEnd < LineStart). The regression test requires M2's line +// number to be greater than the line number containing the expansion. +#define M2(a, ...) M1(a, helper1, ##__VA_ARGS__); diff --git a/test/CoverageMapping/include-macros.c b/test/CoverageMapping/include-macros.c new file mode 100644 index 0000000000..113721c21a --- /dev/null +++ b/test/CoverageMapping/include-macros.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name include-macros.c %s | FileCheck %s + +#include "Inputs/macros.h" + +void f1() { + M2("a", "b"); +} + +// CHECK-LABEL: f1: +// CHECK-NEXT: File 0, 5:11 -> 7:2 = #0 +// CHECK-NEXT: Expansion,File 0, 6:3 -> 6:5 = #0 (Expanded file = 1) +// CHECK-NEXT: File 1, 13:20 -> 13:50 = #0 +// CHECK-NEXT: Expansion,File 1, 13:20 -> 13:22 = #0 (Expanded file = 2) +// CHECK-NEXT: File 2, 7:20 -> 7:46 = #0 +// CHECK-NEXT: Expansion,File 2, 7:33 -> 7:44 = #0 (Expanded file = 3) +// CHECK-NEXT: File 3, 13:26 -> 13:34 = #0 +// CHECK-NEXT: Expansion,File 3, 13:26 -> 13:33 = #0 (Expanded file = 4) +// CHECK-NEXT: File 4, 3:17 -> 3:18 = #0 |