// RUN: %clang_cc1 -triple arm64-apple-ios11 -fptrauth-calls -fptrauth-intrinsics -std=c++11 -fobjc-arc -emit-llvm -o - %s | FileCheck %s #define AQ __ptrauth(1,1,50) struct AddrDiscStrong0 { int * AQ f0; // Signed using address discrimination. __strong id f1; }; struct AddrDiscStrong1 { AddrDiscStrong1(const AddrDiscStrong1 &); int * AQ f0; // Signed using address discrimination. __strong id f1; }; // Check that AddrDiscStrong0 is destructed in the callee. // CHECK: define void @_Z24testParamAddrDiscStrong015AddrDiscStrong0(ptr dead_on_return noundef %[[A:.*]]) // CHECK: call noundef ptr @_ZN15AddrDiscStrong0D1Ev(ptr noundef nonnull align {{[0-9]+}} dereferenceable(16) %[[A]]) // CHECK: ret void // CHECK: define linkonce_odr noundef ptr @_ZN15AddrDiscStrong0D1Ev( void testParamAddrDiscStrong0(AddrDiscStrong0 a) { } // Check that AddrDiscStrong1 is not destructed in the callee because it has a // non-trivial copy constructor. // CHECK: define void @_Z24testParamAddrDiscStrong115AddrDiscStrong1(ptr noundef %{{.*}}) // CHECK-NOT: call // CHECK: ret void void testParamAddrDiscStrong1(AddrDiscStrong1 a) { }