]> granicus.if.org Git - clang/commitdiff
InstrProf: Make sure counts in lambdas don't escape to the parent scope
authorJustin Bogner <mail@justinbogner.com>
Tue, 24 Feb 2015 04:13:56 +0000 (04:13 +0000)
committerJustin Bogner <mail@justinbogner.com>
Tue, 24 Feb 2015 04:13:56 +0000 (04:13 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@230304 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CoverageMappingGen.cpp
test/CoverageMapping/lambda.cpp [new file with mode: 0644]

index 4bd4eb6da2e273542544bd83cd0b0cf9871d88ed..55e7334acc2113f39607e633670b1497c1850b0f 100644 (file)
@@ -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/test/CoverageMapping/lambda.cpp b/test/CoverageMapping/lambda.cpp
new file mode 100644 (file)
index 0000000..fb018e6
--- /dev/null
@@ -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;
+}