From: Wei Pan Date: Fri, 10 May 2013 14:15:18 +0000 (+0000) Subject: Codegen tests for captured statements with templates X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0b6d8469aa202d79e5eca116e2598a0673253ce2;p=clang Codegen tests for captured statements with templates Differential-revision: llvm-reviews.chandlerc.com/D778 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181598 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/CodeGenCXX/captured-statements.cpp b/test/CodeGenCXX/captured-statements.cpp index 389d8d0e0e..91c7ff28f0 100644 --- a/test/CodeGenCXX/captured-statements.cpp +++ b/test/CodeGenCXX/captured-statements.cpp @@ -3,6 +3,8 @@ // RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-2 // RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-3 // RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-4 +// RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-5 +// RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-6 struct Foo { int x; @@ -95,3 +97,81 @@ void test4() { // CHECK-4: store i32 5, i32* // CHECK-4: call {{.*}}FooD1Ev } + +template +void touch(const T &) {} + +template +void template_capture_var() { + T x; + #pragma clang __debug captured + { + touch(x); + } +} + +template +class Val { + T v; +public: + void set() { + #pragma clang __debug captured + { + touch(v); + } + } + + template + void foo(U u) { + #pragma clang __debug captured + { + touch(u); + } + } +}; + +void test_capture_var() { + // CHECK-5: define {{.*}} void @_Z20template_capture_varIiLj201EEvv + // CHECK-5-NOT: } + // CHECK-5: store i32* + // CHECK-5: call void @__captured_stmt + // CHECK-5-NEXT: ret void + template_capture_var(); + + // CHECK-5: define {{.*}} void @_ZN3ValIfLi202EE3setEv + // CHECK-5-NOT: } + // CHECK-5: store %class.Val* + // CHECK-5: call void @__captured_stmt + // CHECK-5-NEXT: ret void + Val Obj; + Obj.set(); + + // CHECK-5: define {{.*}} void @_ZN3ValIfLi202EE3fooIdLi203EEEvT_ + // CHECK-5-NOT: } + // CHECK-5: store %class.Val* + // CHECK-5: store double + // CHECK-5: call void @__captured_stmt + // CHECK-5-NEXT: ret void + Obj.foo(1.0); +} + +template +void template_capture_lambda() { + T x, y; + [=, &y]() { + #pragma clang __debug captured + { + y += x; + } + }(); +} + +void test_capture_lambda() { + // CHECK-6: define {{.*}} void @_ZZ23template_capture_lambdaIiEvvENKS_IiEUlvE_clEv + // CHECK-6-NOT: } + // CHECK-6: store i32* + // CHECK-6: store i32* + // CHECK-6: call void @__captured_stmt + // CHECK-6-NEXT: ret void + template_capture_lambda(); +}