lambda-expressions.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++11 | FileCheck %s
  2. // CHECK-NOT: @unused
  3. auto unused = [](int i) { return i+1; };
  4. // CHECK: @used = internal global
  5. auto used = [](int i) { return i+1; };
  6. void *use = &used;
  7. // CHECK: @cvar = global
  8. extern "C" auto cvar = []{};
  9. int a() { return []{ return 1; }(); }
  10. // CHECK-LABEL: define i32 @_Z1av
  11. // CHECK: call i32 @"_ZZ1avENK3$_0clEv"
  12. // CHECK-LABEL: define internal i32 @"_ZZ1avENK3$_0clEv"
  13. // CHECK: ret i32 1
  14. int b(int x) { return [x]{return x;}(); }
  15. // CHECK-LABEL: define i32 @_Z1bi
  16. // CHECK: store i32
  17. // CHECK: load i32, i32*
  18. // CHECK: store i32
  19. // CHECK: call i32 @"_ZZ1biENK3$_1clEv"
  20. // CHECK-LABEL: define internal i32 @"_ZZ1biENK3$_1clEv"
  21. // CHECK: load i32, i32*
  22. // CHECK: ret i32
  23. int c(int x) { return [&x]{return x;}(); }
  24. // CHECK-LABEL: define i32 @_Z1ci
  25. // CHECK: store i32
  26. // CHECK: store i32*
  27. // CHECK: call i32 @"_ZZ1ciENK3$_2clEv"
  28. // CHECK-LABEL: define internal i32 @"_ZZ1ciENK3$_2clEv"
  29. // CHECK: load i32*, i32**
  30. // CHECK: load i32, i32*
  31. // CHECK: ret i32
  32. struct D { D(); D(const D&); int x; };
  33. int d(int x) { D y[10]; [x,y] { return y[x].x; }(); }
  34. // CHECK-LABEL: define i32 @_Z1di
  35. // CHECK: call void @_ZN1DC1Ev
  36. // CHECK: icmp ult i64 %{{.*}}, 10
  37. // CHECK: call void @_ZN1DC1ERKS_
  38. // CHECK: call i32 @"_ZZ1diENK3$_3clEv"
  39. // CHECK-LABEL: define internal i32 @"_ZZ1diENK3$_3clEv"
  40. // CHECK: load i32, i32*
  41. // CHECK: load i32, i32*
  42. // CHECK: ret i32
  43. struct E { E(); E(const E&); ~E(); int x; };
  44. int e(E a, E b, bool cond) { [a,b,cond](){ return (cond ? a : b).x; }(); }
  45. // CHECK-LABEL: define i32 @_Z1e1ES_b
  46. // CHECK: call void @_ZN1EC1ERKS_
  47. // CHECK: invoke void @_ZN1EC1ERKS_
  48. // CHECK: invoke i32 @"_ZZ1e1ES_bENK3$_4clEv"
  49. // CHECK: call void @"_ZZ1e1ES_bEN3$_4D1Ev"
  50. // CHECK: call void @"_ZZ1e1ES_bEN3$_4D1Ev"
  51. // CHECK-LABEL: define internal i32 @"_ZZ1e1ES_bENK3$_4clEv"
  52. // CHECK: trunc i8
  53. // CHECK: load i32, i32*
  54. // CHECK: ret i32
  55. void f() {
  56. // CHECK-LABEL: define void @_Z1fv()
  57. // CHECK: @"_ZZ1fvENK3$_5cvPFiiiEEv"
  58. // CHECK-NEXT: store i32 (i32, i32)*
  59. // CHECK-NEXT: ret void
  60. int (*fp)(int, int) = [](int x, int y){ return x + y; };
  61. }
  62. static int k;
  63. int g() {
  64. int &r = k;
  65. // CHECK-LABEL: define internal i32 @"_ZZ1gvENK3$_6clEv"(
  66. // CHECK-NOT: }
  67. // CHECK: load i32, i32* @_ZL1k,
  68. return [] { return r; } ();
  69. };
  70. // PR14773
  71. // CHECK: [[ARRVAL:%[0-9a-zA-Z]*]] = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @_ZZ14staticarrayrefvE5array, i64 0, i64 0), align 4
  72. // CHECK-NEXT: store i32 [[ARRVAL]]
  73. void staticarrayref(){
  74. static int array[] = {};
  75. (void)[](){
  76. int (&xxx)[0] = array;
  77. int y = xxx[0];
  78. }();
  79. }
  80. // CHECK-LABEL: define internal i32* @"_ZZ11PR22071_funvENK3$_8clEv"
  81. // CHECK: ret i32* @PR22071_var
  82. int PR22071_var;
  83. int *PR22071_fun() {
  84. constexpr int &y = PR22071_var;
  85. return [&] { return &y; }();
  86. }
  87. // CHECK-LABEL: define internal void @"_ZZ1e1ES_bEN3$_4D2Ev"
  88. // CHECK-LABEL: define internal i32 @"_ZZ1fvEN3$_58__invokeEii"
  89. // CHECK: store i32
  90. // CHECK-NEXT: store i32
  91. // CHECK-NEXT: load i32, i32*
  92. // CHECK-NEXT: load i32, i32*
  93. // CHECK-NEXT: call i32 @"_ZZ1fvENK3$_5clEii"
  94. // CHECK-NEXT: ret i32
  95. // CHECK-LABEL: define internal void @"_ZZ1hvEN3$_98__invokeEv"(%struct.A* noalias sret %agg.result) {{.*}} {
  96. // CHECK-NOT: =
  97. // CHECK: call void @"_ZZ1hvENK3$_9clEv"(%struct.A* sret %agg.result,
  98. // CHECK-NEXT: ret void
  99. struct A { ~A(); };
  100. void h() {
  101. A (*h)() = [] { return A(); };
  102. }
  103. // <rdar://problem/12778708>
  104. struct XXX {};
  105. void nestedCapture () {
  106. XXX localKey;
  107. ^() {
  108. [&]() {
  109. ^{ XXX k = localKey; };
  110. };
  111. };
  112. }
  113. // Ensure we don't assert here.
  114. struct CaptureArrayAndThis {
  115. CaptureArrayAndThis() {
  116. char array[] = "floop";
  117. [array, this] {};
  118. }
  119. } capture_array_and_this;