1*1eddce41SErich Keane // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm --std=c++17 %s -o - | FileCheck %s 2*1eddce41SErich Keane 3*1eddce41SErich Keane struct stream { 4*1eddce41SErich Keane friend const stream &operator<<(const stream &, const float &); 5*1eddce41SErich Keane }; 6*1eddce41SErich Keane 7*1eddce41SErich Keane void foo() { 8*1eddce41SErich Keane constexpr float f_zero = 0.0f; 9*1eddce41SErich Keane constexpr float f_one = 1.0f; 10*1eddce41SErich Keane constexpr float f_two = 2.0f; 11*1eddce41SErich Keane 12*1eddce41SErich Keane stream s; 13*1eddce41SErich Keane [=]() { 14*1eddce41SErich Keane s << f_zero << f_one << f_two; 15*1eddce41SErich Keane }(); 16*1eddce41SErich Keane } 17*1eddce41SErich Keane 18*1eddce41SErich Keane // CHECK: define void @_Z3foov 19*1eddce41SErich Keane // CHECK: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 0 20*1eddce41SErich Keane // CHECK-NEXT: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 21*1eddce41SErich Keane // CHECK-NEXT: store float 0.000 22*1eddce41SErich Keane // CHECK-NEXT: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 2 23*1eddce41SErich Keane // CHECK-NEXT: store float 1.000 24*1eddce41SErich Keane // CHECK-NEXT: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 3 25*1eddce41SErich Keane // CHECK-NEXT: store float 2.000 26*1eddce41SErich Keane 27*1eddce41SErich Keane // The lambda body. Reverse iteration when the captures aren't deterministic 28*1eddce41SErich Keane // causes these to be laid out differently in the lambda. 29*1eddce41SErich Keane // CHECK: define internal void 30*1eddce41SErich Keane // CHECK: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 0 31*1eddce41SErich Keane // CHECK: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 1 32*1eddce41SErich Keane // CHECK: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 2 33*1eddce41SErich Keane // CHECK: getelementptr inbounds %{{.+}}, %{{.+}}* %{{.+}}, i32 0, i32 3 34