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