xref: /aosp_15_r20/external/clang/test/ARCMT/cxx-checking.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -arcmt-check -verify -triple x86_64-apple-darwin10 -fsyntax-only -fblocks %s
2*67e74705SXin Li
3*67e74705SXin Li// Classes that have an Objective-C object pointer.
4*67e74705SXin Listruct HasObjectMember0 {
5*67e74705SXin Li  id x;
6*67e74705SXin Li};
7*67e74705SXin Li
8*67e74705SXin Listruct HasObjectMember1 {
9*67e74705SXin Li  id x[3];
10*67e74705SXin Li};
11*67e74705SXin Li
12*67e74705SXin Listruct HasObjectMember2 {
13*67e74705SXin Li  id x[3][2];
14*67e74705SXin Li};
15*67e74705SXin Li
16*67e74705SXin Li// Don't complain if the type has non-external linkage
17*67e74705SXin Linamespace {
18*67e74705SXin Li  struct HasObjectMember3 {
19*67e74705SXin Li    id x[3][2];
20*67e74705SXin Li  };
21*67e74705SXin Li}
22*67e74705SXin Li
23*67e74705SXin Li// Don't complain if the Objective-C pointer type was explicitly given
24*67e74705SXin Li// no lifetime.
25*67e74705SXin Listruct HasObjectMember3 {
26*67e74705SXin Li  __unsafe_unretained id x[3][2];
27*67e74705SXin Li};
28*67e74705SXin Li
29*67e74705SXin Listruct HasBlockPointerMember0 {
30*67e74705SXin Li  int (^bp)(int);
31*67e74705SXin Li};
32*67e74705SXin Li
33*67e74705SXin Listruct HasBlockPointerMember1 {
34*67e74705SXin Li  int (^bp[2][3])(int);
35*67e74705SXin Li};
36*67e74705SXin Li
37*67e74705SXin Listruct NonPOD {
38*67e74705SXin Li  NonPOD(const NonPOD&);
39*67e74705SXin Li};
40*67e74705SXin Li
41*67e74705SXin Listruct HasObjectMemberAndNonPOD0 {
42*67e74705SXin Li  id x;
43*67e74705SXin Li  NonPOD np;
44*67e74705SXin Li};
45*67e74705SXin Li
46*67e74705SXin Listruct HasObjectMemberAndNonPOD1 {
47*67e74705SXin Li  NonPOD np;
48*67e74705SXin Li  id x[3];
49*67e74705SXin Li};
50*67e74705SXin Li
51*67e74705SXin Listruct HasObjectMemberAndNonPOD2 {
52*67e74705SXin Li  NonPOD np;
53*67e74705SXin Li  id x[3][2];
54*67e74705SXin Li};
55*67e74705SXin Li
56*67e74705SXin Listruct HasObjectMemberAndNonPOD3 {
57*67e74705SXin Li  HasObjectMemberAndNonPOD3 &operator=(const HasObjectMemberAndNonPOD3&);
58*67e74705SXin Li  ~HasObjectMemberAndNonPOD3();
59*67e74705SXin Li  NonPOD np;
60*67e74705SXin Li  id x[3][2];
61*67e74705SXin Li};
62*67e74705SXin Li
63*67e74705SXin Listruct HasBlockPointerMemberAndNonPOD0 {
64*67e74705SXin Li  NonPOD np;
65*67e74705SXin Li  int (^bp)(int);
66*67e74705SXin Li};
67*67e74705SXin Li
68*67e74705SXin Listruct HasBlockPointerMemberAndNonPOD1 {
69*67e74705SXin Li  NonPOD np;
70*67e74705SXin Li  int (^bp[2][3])(int);
71*67e74705SXin Li};
72*67e74705SXin Li
73*67e74705SXin Liint check_non_pod_objc_pointer0[__is_pod(id)? 1 : -1];
74*67e74705SXin Liint check_non_pod_objc_pointer1[__is_pod(__strong id)? -1 : 1];
75*67e74705SXin Liint check_non_pod_objc_pointer2[__is_pod(__unsafe_unretained id)? 1 : -1];
76*67e74705SXin Liint check_non_pod_objc_pointer3[__is_pod(id[2][3])? 1 : -1];
77*67e74705SXin Liint check_non_pod_objc_pointer4[__is_pod(__unsafe_unretained id[2][3])? 1 : -1];
78*67e74705SXin Liint check_non_pod_block0[__is_pod(int (^)(int))? 1 : -1];
79*67e74705SXin Liint check_non_pod_block1[__is_pod(int (^ __unsafe_unretained)(int))? 1 : -1];
80*67e74705SXin Li
81*67e74705SXin Listruct FlexibleArrayMember0 {
82*67e74705SXin Li  int length;
83*67e74705SXin Li  id array[]; // expected-error{{flexible array member 'array' of type 'id __strong[]' with non-trivial destruction}}
84*67e74705SXin Li};
85*67e74705SXin Li
86*67e74705SXin Listruct FlexibleArrayMember1 {
87*67e74705SXin Li  int length;
88*67e74705SXin Li  __unsafe_unretained id array[];
89*67e74705SXin Li};
90*67e74705SXin Li
91*67e74705SXin Li// It's okay to pass a retainable type through an ellipsis.
92*67e74705SXin Livoid variadic(...);
93*67e74705SXin Livoid test_variadic() {
94*67e74705SXin Li  variadic(1, 17, @"Foo");
95*67e74705SXin Li}
96*67e74705SXin Li
97*67e74705SXin Li// It's okay to create a VLA of retainable types.
98*67e74705SXin Livoid vla(int n) {
99*67e74705SXin Li  id vla[n];
100*67e74705SXin Li}
101