xref: /llvm-project/clang/test/SemaObjCXX/attr-trivial-abi.mm (revision a707da4728dea51c1446cf582a46fb271f3969c3)
102914dc1SAkira Hatanaka// RUN: %clang_cc1 -std=c++11 -fobjc-runtime-has-weak -fobjc-weak -fobjc-arc -fsyntax-only -verify %s
202914dc1SAkira Hatanaka
302914dc1SAkira Hatanakavoid __attribute__((trivial_abi)) foo(); // expected-warning {{'trivial_abi' attribute only applies to classes}}
402914dc1SAkira Hatanaka
502914dc1SAkira Hatanakastruct [[clang::trivial_abi]] S0 {
602914dc1SAkira Hatanaka  int a;
702914dc1SAkira Hatanaka};
802914dc1SAkira Hatanaka
902914dc1SAkira Hatanakastruct __attribute__((trivial_abi)) S1 {
1002914dc1SAkira Hatanaka  int a;
1102914dc1SAkira Hatanaka};
1202914dc1SAkira Hatanaka
13f466f0beSAkira Hatanakastruct __attribute__((trivial_abi)) S2 { // expected-warning {{'trivial_abi' cannot be applied to 'S2'}} expected-note {{has a __weak field}}
1402914dc1SAkira Hatanaka  __weak id a;
1502914dc1SAkira Hatanaka};
1602914dc1SAkira Hatanaka
17f466f0beSAkira Hatanakastruct __attribute__((trivial_abi)) S3 { // expected-warning {{'trivial_abi' cannot be applied to 'S3'}} expected-note {{is polymorphic}}
1802914dc1SAkira Hatanaka  virtual void m();
1902914dc1SAkira Hatanaka};
2002914dc1SAkira Hatanaka
21ea798aa7SAkira Hatanakastruct S3_2 {
22ea798aa7SAkira Hatanaka  virtual void m();
23f466f0beSAkira Hatanaka} __attribute__((trivial_abi)); // expected-warning {{'trivial_abi' cannot be applied to 'S3_2'}} expected-note {{is polymorphic}}
24ea798aa7SAkira Hatanaka
2502914dc1SAkira Hatanakastruct S4 {
2602914dc1SAkira Hatanaka  int a;
2702914dc1SAkira Hatanaka};
2802914dc1SAkira Hatanaka
29f466f0beSAkira Hatanakastruct __attribute__((trivial_abi)) S5 : public virtual S4 { // expected-warning {{'trivial_abi' cannot be applied to 'S5'}} expected-note {{has a virtual base}}
3002914dc1SAkira Hatanaka};
3102914dc1SAkira Hatanaka
3202914dc1SAkira Hatanakastruct __attribute__((trivial_abi)) S9 : public S4 {
3302914dc1SAkira Hatanaka};
3402914dc1SAkira Hatanaka
3502914dc1SAkira Hatanakastruct S6 {
3602914dc1SAkira Hatanaka  __weak id a;
3702914dc1SAkira Hatanaka};
3802914dc1SAkira Hatanaka
39f466f0beSAkira Hatanakastruct __attribute__((trivial_abi)) S12 { // expected-warning {{'trivial_abi' cannot be applied to 'S12'}} expected-note {{has a __weak field}}
4002914dc1SAkira Hatanaka  __weak id a;
4102914dc1SAkira Hatanaka};
4202914dc1SAkira Hatanaka
43f466f0beSAkira Hatanakastruct __attribute__((trivial_abi)) S13 { // expected-warning {{'trivial_abi' cannot be applied to 'S13'}} expected-note {{has a __weak field}}
4402914dc1SAkira Hatanaka  __weak id a[2];
4502914dc1SAkira Hatanaka};
4602914dc1SAkira Hatanaka
47f466f0beSAkira Hatanakastruct __attribute__((trivial_abi)) S7 { // expected-warning {{'trivial_abi' cannot be applied to 'S7'}} expected-note {{has a field of a non-trivial class type}}
4802914dc1SAkira Hatanaka  S6 a;
4902914dc1SAkira Hatanaka};
5002914dc1SAkira Hatanaka
51f466f0beSAkira Hatanakastruct __attribute__((trivial_abi)) S11 { // expected-warning {{'trivial_abi' cannot be applied to 'S11'}} expected-note {{has a field of a non-trivial class type}}
5202914dc1SAkira Hatanaka  S6 a[2];
5302914dc1SAkira Hatanaka};
5402914dc1SAkira Hatanaka
5502914dc1SAkira Hatanakastruct __attribute__((trivial_abi(1))) S8 { // expected-error {{'trivial_abi' attribute takes no arguments}}
5602914dc1SAkira Hatanaka  int a;
5702914dc1SAkira Hatanaka};
5802914dc1SAkira Hatanaka
5902914dc1SAkira Hatanaka// Do not warn when 'trivial_abi' is used to annotate a template class.
6002914dc1SAkira Hatanakatemplate <class T>
6102914dc1SAkira Hatanakastruct __attribute__((trivial_abi)) S10 {
6202914dc1SAkira Hatanaka  T p;
6302914dc1SAkira Hatanaka};
6402914dc1SAkira Hatanaka
6502914dc1SAkira HatanakaS10<int *> p1;
6602914dc1SAkira HatanakaS10<__weak id> p2;
6702914dc1SAkira Hatanaka
6802914dc1SAkira Hatanakatemplate<>
69f466f0beSAkira Hatanakastruct __attribute__((trivial_abi)) S10<id> { // expected-warning {{'trivial_abi' cannot be applied to 'S10<id>'}} expected-note {{has a __weak field}}
7002914dc1SAkira Hatanaka  __weak id a;
7102914dc1SAkira Hatanaka};
7202914dc1SAkira Hatanaka
7302914dc1SAkira Hatanakatemplate<class T>
7402914dc1SAkira Hatanakastruct S14 {
7502914dc1SAkira Hatanaka  T a;
7602914dc1SAkira Hatanaka  __weak id b;
7702914dc1SAkira Hatanaka};
7802914dc1SAkira Hatanaka
7902914dc1SAkira Hatanakatemplate <class T>
8002914dc1SAkira Hatanakastruct __attribute__((trivial_abi)) S15 : S14<T> {
8102914dc1SAkira Hatanaka};
8202914dc1SAkira Hatanaka
8302914dc1SAkira HatanakaS15<int> s15;
8402914dc1SAkira Hatanaka
8502914dc1SAkira Hatanakatemplate <class T>
8602914dc1SAkira Hatanakastruct __attribute__((trivial_abi)) S16 {
8702914dc1SAkira Hatanaka  S14<T> a;
8802914dc1SAkira Hatanaka};
8902914dc1SAkira Hatanaka
9002914dc1SAkira HatanakaS16<int> s16;
9102914dc1SAkira Hatanaka
9202914dc1SAkira Hatanakatemplate <class T>
93f466f0beSAkira Hatanakastruct __attribute__((trivial_abi)) S17 { // expected-warning {{'trivial_abi' cannot be applied to 'S17'}} expected-note {{has a __weak field}}
94*a707da47SVy Nguyen  S17();
95*a707da47SVy Nguyen  S17(S17 &&);
96*a707da47SVy Nguyen  __weak id a;
97*a707da47SVy Nguyen};
98*a707da47SVy Nguyen
99*a707da47SVy Nguyenstruct __attribute__((trivial_abi)) S18 { // expected-warning {{'trivial_abi' cannot be applied to 'S18'}} expected-note {{has a __weak field}}
10002914dc1SAkira Hatanaka  __weak id a;
10102914dc1SAkira Hatanaka};
10202914dc1SAkira Hatanaka
10302914dc1SAkira HatanakaS17<int> s17;
104f466f0beSAkira Hatanaka
105f466f0beSAkira Hatanakanamespace deletedCopyMoveConstructor {
106f466f0beSAkira Hatanaka  struct __attribute__((trivial_abi)) CopyMoveDeleted { // expected-warning {{'trivial_abi' cannot be applied to 'CopyMoveDeleted'}} expected-note {{copy constructors and move constructors are all deleted}}
107f466f0beSAkira Hatanaka    CopyMoveDeleted(const CopyMoveDeleted &) = delete;
108f466f0beSAkira Hatanaka    CopyMoveDeleted(CopyMoveDeleted &&) = delete;
109f466f0beSAkira Hatanaka  };
110f466f0beSAkira Hatanaka
111f466f0beSAkira Hatanaka  struct __attribute__((trivial_abi)) S18 { // expected-warning {{'trivial_abi' cannot be applied to 'S18'}} expected-note {{copy constructors and move constructors are all deleted}}
112f466f0beSAkira Hatanaka    CopyMoveDeleted a;
113f466f0beSAkira Hatanaka  };
114f466f0beSAkira Hatanaka
115f466f0beSAkira Hatanaka  struct __attribute__((trivial_abi)) CopyDeleted {
116f466f0beSAkira Hatanaka    CopyDeleted(const CopyDeleted &) = delete;
117f466f0beSAkira Hatanaka    CopyDeleted(CopyDeleted &&) = default;
118f466f0beSAkira Hatanaka  };
119f466f0beSAkira Hatanaka
120f466f0beSAkira Hatanaka  struct __attribute__((trivial_abi)) MoveDeleted {
121f466f0beSAkira Hatanaka    MoveDeleted(const MoveDeleted &) = default;
122f466f0beSAkira Hatanaka    MoveDeleted(MoveDeleted &&) = delete;
123f466f0beSAkira Hatanaka  };
124f466f0beSAkira Hatanaka
125f466f0beSAkira Hatanaka  struct __attribute__((trivial_abi)) S19 { // expected-warning {{'trivial_abi' cannot be applied to 'S19'}} expected-note {{copy constructors and move constructors are all deleted}}
126f466f0beSAkira Hatanaka    CopyDeleted a;
127f466f0beSAkira Hatanaka    MoveDeleted b;
128f466f0beSAkira Hatanaka  };
129f466f0beSAkira Hatanaka
130f466f0beSAkira Hatanaka  // This is fine since the move constructor isn't deleted.
131f466f0beSAkira Hatanaka  struct __attribute__((trivial_abi)) S20 {
132f466f0beSAkira Hatanaka    int &&a; // a member of rvalue reference type deletes the copy constructor.
133f466f0beSAkira Hatanaka  };
134f466f0beSAkira Hatanaka}
135