r181598 - Codegen tests for captured statements with templates

Wei Pan wei.pan at intel.com
Fri May 10 07:15:18 PDT 2013


Author: wpan
Date: Fri May 10 09:15:18 2013
New Revision: 181598

URL: http://llvm.org/viewvc/llvm-project?rev=181598&view=rev
Log:
Codegen tests for captured statements with templates

Differential-revision: llvm-reviews.chandlerc.com/D778


Modified:
    cfe/trunk/test/CodeGenCXX/captured-statements.cpp

Modified: cfe/trunk/test/CodeGenCXX/captured-statements.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/captured-statements.cpp?rev=181598&r1=181597&r2=181598&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/captured-statements.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/captured-statements.cpp Fri May 10 09:15:18 2013
@@ -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>();
+}





More information about the cfe-commits mailing list