1 // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -O0 %s -o - 2>&1 -std=c++11 | FileCheck %s 2 3 int gi; 4 5 namespace lambdas { 6 // CHECK-LABEL: define void @_ZN7lambdas7LambdasEPc 7 void Lambdas(char *ptr) { 8 auto L1 = [](void *const p __attribute__((pass_object_size(0)))) { 9 return __builtin_object_size(p, 0); 10 }; 11 12 int i = 0; 13 auto L2 = [&i](void *const p __attribute__((pass_object_size(0)))) { 14 return __builtin_object_size(p, 0) + i; 15 }; 16 17 // CHECK: @llvm.objectsize 18 gi = L1(ptr); 19 // CHECK: @llvm.objectsize 20 gi = L2(ptr); 21 } 22 23 // CHECK-DAG: define internal i64 @"_ZZN7lambdas7LambdasEPcENK3$_0clEPvU17pass_object_size0" 24 // CHECK-NOT: call i64 @llvm.objectsize 25 // CHECK-DAG: define internal i64 @"_ZZN7lambdas7LambdasEPcENK3$_1clEPvU17pass_object_size0" 26 // CHECK-NOT: call i64 @llvm.objectsize 27 } 28 29 // This is here instead of in Sema/ because we need to check to make sure the 30 // proper function is called. If it's not, we'll end up with assertion errors. 31 namespace addrof { 32 void OvlFoo(void *const __attribute__((pass_object_size(0)))) {} 33 void OvlFoo(int *const) {} 34 35 // CHECK: define void @_ZN6addrof4TestEv 36 void Test() { 37 // Treating parens-only calls as though they were direct is consistent with 38 // how we handle other implicitly unaddressable functions (e.g. builtins). 39 // CHECK: call void @_ZN6addrof6OvlFooEPvU17pass_object_size0 40 (OvlFoo)(nullptr); 41 42 // CHECK: call void @_ZN6addrof6OvlFooEPi 43 (&OvlFoo)(nullptr); 44 } 45 } 46