]> granicus.if.org Git - clang/commitdiff
Codegen tests for captured statements with templates
authorWei Pan <wei.pan@intel.com>
Fri, 10 May 2013 14:15:18 +0000 (14:15 +0000)
committerWei Pan <wei.pan@intel.com>
Fri, 10 May 2013 14:15:18 +0000 (14:15 +0000)
Differential-revision: llvm-reviews.chandlerc.com/D778

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

test/CodeGenCXX/captured-statements.cpp

index 389d8d0e0e12a03b28cf1444dc3d8b7ec118c014..91c7ff28f07abaccf4c6b00f070c7dd64fae7a97 100644 (file)
@@ -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 <typename T, int id>
+void touch(const T &) {}
+
+template <typename T, unsigned id>
+void template_capture_var() {
+  T x;
+  #pragma clang __debug captured
+  {
+    touch<T, id>(x);
+  }
+}
+
+template <typename T, int id>
+class Val {
+  T v;
+public:
+  void set() {
+    #pragma clang __debug captured
+    {
+      touch<T, id>(v);
+    }
+  }
+
+  template <typename U, int id2>
+  void foo(U u) {
+    #pragma clang __debug captured
+    {
+      touch<U, id + id2>(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<int, 201>();
+
+  // 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<float, 202> 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<double, 203>(1.0);
+}
+
+template <typename T>
+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<int>();
+}