xref: /aosp_15_r20/external/clang/test/CodeGenObjC/objc2-write-barrier-2.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 -fobjc-gc -emit-llvm -o %t %s
2*67e74705SXin Li// RUN: grep -F '@objc_assign_global' %t  | count 7
3*67e74705SXin Li// RUN: grep -F '@objc_assign_ivar' %t  | count 5
4*67e74705SXin Li// RUN: grep -F '@objc_assign_strongCast' %t  | count 8
5*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 -fobjc-gc -emit-llvm -o %t %s
6*67e74705SXin Li// RUN: grep -F '@objc_assign_global' %t  | count 7
7*67e74705SXin Li// RUN: grep -F '@objc_assign_ivar' %t  | count 5
8*67e74705SXin Li// RUN: grep -F '@objc_assign_strongCast' %t  | count 8
9*67e74705SXin Li
10*67e74705SXin Liextern id **somefunc(void);
11*67e74705SXin Liextern id *somefunc2(void);
12*67e74705SXin Li
13*67e74705SXin Li
14*67e74705SXin Li// Globals
15*67e74705SXin Li
16*67e74705SXin Liid W, *X, **Y;
17*67e74705SXin Li
18*67e74705SXin Livoid func(id a, id *b, id **c) {
19*67e74705SXin Li   static id w, *x, **y;
20*67e74705SXin Li   W = a;
21*67e74705SXin Li   w = a;
22*67e74705SXin Li   X = b;
23*67e74705SXin Li   x = b;
24*67e74705SXin Li   Y = c;
25*67e74705SXin Li   y = c;
26*67e74705SXin Li}
27*67e74705SXin Li
28*67e74705SXin Li// Instances
29*67e74705SXin Li
30*67e74705SXin Li@interface something {
31*67e74705SXin Li    id w, *x, **y;
32*67e74705SXin Li}
33*67e74705SXin Li@end
34*67e74705SXin Li
35*67e74705SXin Li@implementation something
36*67e74705SXin Li- (void)amethod {
37*67e74705SXin Li    id badIdea = *somefunc2();
38*67e74705SXin Li    w = badIdea;
39*67e74705SXin Li    x = &badIdea;
40*67e74705SXin Li    y = &x;
41*67e74705SXin Li}
42*67e74705SXin Li@end
43*67e74705SXin Li
44*67e74705SXin Litypedef struct {
45*67e74705SXin Li    int junk;
46*67e74705SXin Li    id  alfred;
47*67e74705SXin Li} AStruct;
48*67e74705SXin Li
49*67e74705SXin Livoid funct2(AStruct *aptr) {
50*67e74705SXin Li    id **ppptr = somefunc();
51*67e74705SXin Li    aptr->alfred = 0;
52*67e74705SXin Li    **ppptr = aptr->alfred;
53*67e74705SXin Li    *ppptr = somefunc2();
54*67e74705SXin Li}
55*67e74705SXin Li
56*67e74705SXin Litypedef const struct __CFString * CFStringRef;
57*67e74705SXin Li@interface DSATextSearch {
58*67e74705SXin Li__strong CFStringRef *_documentNames;
59*67e74705SXin Li  struct {
60*67e74705SXin Li    id *innerNames;
61*67e74705SXin Li    struct {
62*67e74705SXin Li      id *nestedDeeperNames;
63*67e74705SXin Li      struct I {
64*67e74705SXin Li         id *is1;
65*67e74705SXin Li         id is2[5];
66*67e74705SXin Li      } arrI [3];
67*67e74705SXin Li    } inner_most;
68*67e74705SXin Li  } inner;
69*67e74705SXin Li
70*67e74705SXin Li}
71*67e74705SXin Li- filter;
72*67e74705SXin Li@end
73*67e74705SXin Li@implementation DSATextSearch
74*67e74705SXin Li- filter {
75*67e74705SXin Li  int filteredPos = 0;
76*67e74705SXin Li  _documentNames[filteredPos] = 0; // storing into an element of array ivar. objc_assign_strongCast is needed.
77*67e74705SXin Li  inner.innerNames[filteredPos] = 0;
78*67e74705SXin Li  inner.inner_most.nestedDeeperNames[filteredPos] = 0;
79*67e74705SXin Li  inner.inner_most.arrI[3].is1[5] = 0;
80*67e74705SXin Li  inner.inner_most.arrI[3].is2[5] = 0;
81*67e74705SXin Li}
82*67e74705SXin Li@end
83*67e74705SXin Li
84