xref: /aosp_15_r20/external/clang/test/Rewriter/rewrite-modern-struct-ivar-1.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fblocks -rewrite-objc -fms-extensions %s -o %t-rw.cpp
2*67e74705SXin Li// RUN: %clang_cc1 -Werror -fsyntax-only -Wno-address-of-temporary -Wno-c++11-narrowing -std=c++11 -D"Class=void*" -D"id=void*" -D"SEL=void*" -U__declspec -D"__declspec(X)=" %t-rw.cpp
3*67e74705SXin Li// rdar://11323187
4*67e74705SXin Li
5*67e74705SXin Litypedef unsigned long NSUInteger;
6*67e74705SXin Li
7*67e74705SXin Litypedef struct _NSRange {
8*67e74705SXin Li    NSUInteger location;
9*67e74705SXin Li    NSUInteger length;
10*67e74705SXin Li} NSRange;
11*67e74705SXin Li
12*67e74705SXin Litypedef struct {
13*67e74705SXin Li    NSUInteger _capacity;
14*67e74705SXin Li    NSRange _ranges[0];
15*67e74705SXin Li} _NSRangeInfo;
16*67e74705SXin Li
17*67e74705SXin Li@interface Foo{
18*67e74705SXin Li    @protected
19*67e74705SXin Li    struct _bar {
20*67e74705SXin Li        int x:1;
21*67e74705SXin Li        int y:1;
22*67e74705SXin Li    } bar;
23*67e74705SXin Li    union {
24*67e74705SXin Li        struct {
25*67e74705SXin Li            NSRange _range;
26*67e74705SXin Li        } _singleRange;
27*67e74705SXin Li        struct {
28*67e74705SXin Li            void *  _data;
29*67e74705SXin Li            void *_reserved;
30*67e74705SXin Li        } _multipleRanges;
31*67e74705SXin Li    } _internal;
32*67e74705SXin Li}
33*67e74705SXin Li@end
34*67e74705SXin Li@implementation Foo
35*67e74705SXin Li- (void)x:(Foo *)other {
36*67e74705SXin Li  bar.x = 0;
37*67e74705SXin Li  bar.y = 1;
38*67e74705SXin Li  self->_internal._singleRange._range = (( other ->bar.x) ? &( other ->_internal._singleRange._range) : ((NSRange *)(&(((_NSRangeInfo *)( other ->_internal._multipleRanges._data))->_ranges))))[0];
39*67e74705SXin Li}
40*67e74705SXin Li@end
41*67e74705SXin Li@interface FooS : Foo
42*67e74705SXin Li@end
43*67e74705SXin Li@implementation FooS
44*67e74705SXin Li- (void)y {
45*67e74705SXin Li
46*67e74705SXin Li  NSUInteger asdf =  (( self ->bar.x) ? 1 : ((_NSRangeInfo *)( self ->_internal._multipleRanges._data))->_capacity );
47*67e74705SXin Li}
48*67e74705SXin Li@end
49