diff options
author | Justin Bogner <mail@justinbogner.com> | 2015-02-24 04:13:56 +0000 |
---|---|---|
committer | Justin Bogner <mail@justinbogner.com> | 2015-02-24 04:13:56 +0000 |
commit | c109102ecb80c06375688d374fdc17c04cd7d562 (patch) | |
tree | 44640375a792629400dc47d26deeda120a9d1a75 | |
parent | 7d7dee753dc91b24fee3f39af37b2432e9fe41a2 (diff) | |
download | bcm5719-llvm-c109102ecb80c06375688d374fdc17c04cd7d562.tar.gz bcm5719-llvm-c109102ecb80c06375688d374fdc17c04cd7d562.zip |
InstrProf: Make sure counts in lambdas don't escape to the parent scope
When generating coverage maps, we were traversing the body as if it
were part of the parent function, but this doesn't make sense since
we're currently counting lambdas as separate functions.
llvm-svn: 230304
-rw-r--r-- | clang/lib/CodeGen/CoverageMappingGen.cpp | 5 | ||||
-rw-r--r-- | clang/test/CoverageMapping/lambda.cpp | 17 |
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 4bd4eb6da2e..55e7334acc2 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -850,6 +850,11 @@ struct CounterCoverageMappingBuilder extendRegion(E->getRHS()); propagateCounts(getRegionCounter(E), E->getRHS()); } + + void VisitLambdaExpr(const LambdaExpr *LE) { + // Lambdas are treated as their own functions for now, so we shouldn't + // propagate counts into them. + } }; } diff --git a/clang/test/CoverageMapping/lambda.cpp b/clang/test/CoverageMapping/lambda.cpp new file mode 100644 index 00000000000..fb018e6b477 --- /dev/null +++ b/clang/test/CoverageMapping/lambda.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -x c++ -std=c++11 -triple %itanium_abi_triple -fprofile-instr-generate -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only %s -main-file-name lambda.cpp | FileCheck %s + +// CHECK-LABEL: _Z3fooi: +void foo(int i) { // CHECK: File 0, [[@LINE]]:17 -> {{[0-9]+}}:2 = #0 + auto f = [](int x) { + return x + 1; + }; + + f(i); + // Make sure the zero region after the return doesn't escape the lambda. + // CHECK-NOT: File 0, {{[0-9:]+}} -> [[@LINE+1]]:2 = 0 +} + +int main(int argc, const char *argv[]) { + foo(1); + return 0; +} |