295 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -verify2 3struct ImplicitCtorDtor{};4 5struct ImplDeletedCtor{6 ImplDeletedCtor(int i);7};8 9struct DefaultedCtor {10 DefaultedCtor() = default;11};12 13struct ImpledCtor {14 ImpledCtor();15};16 17 18struct DeletedCtor {19 DeletedCtor() = delete;20 DeletedCtor(int i);21};22 23struct ImpledDtor {24 ~ImpledDtor();25};26 27struct DefaultedDtor {28 ~DefaultedDtor() = default;29};30 31struct DeletedDtor {32 ~DeletedDtor() = delete;33};34 35struct ImplicitDelDtor {36 DeletedDtor d;37};38 39struct DeletedCopy {40 DeletedCopy();41 DeletedCopy(const DeletedCopy&) = delete;42};43 44struct DefaultedCopy {45 DefaultedCopy();46 DefaultedCopy(const DefaultedCopy&) = default;47};48struct UserCopy {49 UserCopy();50 UserCopy(const UserCopy&);51};52 53void private_uses(ImplicitCtorDtor &CDT, ImplDeletedCtor &IDC,54 DefaultedCtor &DefC, ImpledCtor &IC, DeletedCtor &DelC,55 ImpledDtor &ID, DefaultedDtor &DefD, DeletedDtor &DelD,56 ImplicitDelDtor &IDD) {57 58#pragma acc parallel private(CDT)59 ;60 61 // expected-error@+1{{variable of type 'ImplDeletedCtor' referenced in OpenACC 'private' clause does not have a default constructor; reference has no effect}}62#pragma acc parallel private(IDC)63 ;64 65#pragma acc parallel private(DefC)66 ;67 68#pragma acc parallel private(IC)69 ;70 71 // expected-error@+1{{variable of type 'DeletedCtor' referenced in OpenACC 'private' clause does not have a default constructor; reference has no effect}}72#pragma acc parallel private(DelC)73 ;74 75#pragma acc parallel private(ID)76 ;77 78#pragma acc parallel private(DefD)79 ;80 81 // expected-error@+1{{variable of type 'DeletedDtor' referenced in OpenACC 'private' clause does not have a}}82#pragma acc parallel private(DelD)83 ;84 85 // expected-error@+1{{variable of type 'ImplicitDelDtor' referenced in OpenACC 'private' clause does not have a destructor; reference has no effect}}86#pragma acc parallel private(IDD)87 ;88 89}90 91template<typename T>92void private_templ(T& t) {93#pragma acc parallel private(t) // #PRIV94 ;95}96 97void inst(ImplicitCtorDtor &CDT, ImplDeletedCtor &IDC,98 DefaultedCtor &DefC, ImpledCtor &IC, DeletedCtor &DelC,99 ImpledDtor &ID, DefaultedDtor &DefD, DeletedDtor &DelD,100 ImplicitDelDtor &IDD) {101 private_templ(CDT);102 // expected-error@#PRIV{{variable of type 'ImplDeletedCtor' referenced in OpenACC 'private' clause does not have a default constructor; reference has no effect}}103 // expected-note@+1{{in instantiation}}104 private_templ(IDC);105 private_templ(DefC);106 private_templ(IC);107 // expected-error@#PRIV{{variable of type 'DeletedCtor' referenced in OpenACC 'private' clause does not have a default constructor; reference has no effect}}108 // expected-note@+1{{in instantiation}}109 private_templ(DelC);110 private_templ(ID);111 private_templ(DefD);112 // expected-error@#PRIV{{variable of type 'DeletedDtor' referenced in OpenACC 'private' clause does not have a destructor; reference has no effect}}113 // expected-note@+1{{in instantiation}}114 private_templ(DelD);115 // expected-error@#PRIV{{variable of type 'ImplicitDelDtor' referenced in OpenACC 'private' clause does not have a destructor; reference has no effect}}116 // expected-note@+1{{in instantiation}}117 private_templ(IDD);118}119 120void private_arrays() {121 char *ptr;122 ImplicitCtorDtor CDTArr[5];123 ImplDeletedCtor IDCArr[5]{1,2,3,4,5};124 DefaultedCtor DefCArr[5];125 ImpledCtor ICArr[5];126 DeletedCtor DelCArr[5]{1,2,3,4,5};127 ImpledDtor IDArr[5];128 DefaultedDtor DefDArr[5];129 using DelDArrTy = DeletedDtor[5];130 DelDArrTy &DelDArr = *((DelDArrTy*)ptr);131 using IDDArrTy = ImplicitDelDtor[5];132 IDDArrTy &IDDArr = *((IDDArrTy*)ptr);133 134 135#pragma acc parallel private(CDTArr)136 ;137 // expected-error@+1{{variable of type 'ImplDeletedCtor' referenced in OpenACC 'private' clause does not have a default constructor; reference has no effect}}138#pragma acc parallel private(IDCArr)139 ;140#pragma acc parallel private(DefCArr)141 ;142#pragma acc parallel private(ICArr)143 ;144 // expected-error@+1{{variable of type 'DeletedCtor' referenced in OpenACC 'private' clause does not have a default constructor; reference has no effect}}145#pragma acc parallel private(DelCArr)146 ;147#pragma acc parallel private(IDArr)148 ;149#pragma acc parallel private(DefDArr)150 ;151 // expected-error@+1{{variable of type 'DeletedDtor' referenced in OpenACC 'private' clause does not have a destructor; reference has no effect}}152#pragma acc parallel private(DelDArr)153 ;154 // expected-error@+1{{variable of type 'ImplicitDelDtor' referenced in OpenACC 'private' clause does not have a destructor; reference has no effect}}155#pragma acc parallel private(IDDArr)156 ;157}158 159void firstprivate_uses(ImplicitCtorDtor &CDT, ImplDeletedCtor &IDC,160 DefaultedCtor &DefC, ImpledCtor &IC, DeletedCtor &DelC,161 ImpledDtor &ID, DefaultedDtor &DefD, DeletedDtor &DelD,162 ImplicitDelDtor &IDD, DeletedCopy &DelCopy,163 DefaultedCopy &DefCopy, UserCopy &UDCopy) {164#pragma acc parallel firstprivate(CDT)165 ;166 167#pragma acc parallel firstprivate(IDC)168 ;169 170#pragma acc parallel firstprivate(DefC)171 ;172 173#pragma acc parallel firstprivate(IC)174 ;175 176#pragma acc parallel firstprivate(DelC)177 ;178 179#pragma acc parallel firstprivate(ID)180 ;181 182#pragma acc parallel firstprivate(DefD)183 ;184 185 // expected-error@+1{{variable of type 'DeletedDtor' referenced in OpenACC 'firstprivate' clause does not have a destructor; reference has no effect}}186#pragma acc parallel firstprivate(DelD)187 ;188 189 // expected-error@+1{{variable of type 'ImplicitDelDtor' referenced in OpenACC 'firstprivate' clause does not have a copy constructor; reference has no effect}}190#pragma acc parallel firstprivate(IDD)191 ;192 193 // expected-error@+1{{variable of type 'DeletedCopy' referenced in OpenACC 'firstprivate' clause does not have a copy constructor; reference has no effect}}194#pragma acc parallel firstprivate(DelCopy)195 ;196#pragma acc parallel firstprivate(DefCopy)197 ;198#pragma acc parallel firstprivate(UDCopy)199 ;200}201 202template<typename T>203void firstprivate_template(T& t) {204#pragma acc parallel firstprivate(t) // #FIRSTPRIV205 ;206}207 208void firstprivate_inst(ImplicitCtorDtor &CDT, ImplDeletedCtor &IDC,209 DefaultedCtor &DefC, ImpledCtor &IC, DeletedCtor &DelC,210 ImpledDtor &ID, DefaultedDtor &DefD, DeletedDtor &DelD,211 ImplicitDelDtor &IDD, DeletedCopy &DelCopy,212 DefaultedCopy &DefCopy, UserCopy &UDCopy) {213 firstprivate_template(CDT);214 firstprivate_template(IDC);215 firstprivate_template(DefC);216 firstprivate_template(IC);217 firstprivate_template(DelC);218 firstprivate_template(ID);219 firstprivate_template(DefD);220 // expected-error@#FIRSTPRIV{{variable of type 'DeletedDtor' referenced in OpenACC 'firstprivate' clause does not have a destructor; reference has no effect}}221 // expected-note@+1{{in instantiation}}222 firstprivate_template(DelD);223 // expected-error@#FIRSTPRIV{{variable of type 'ImplicitDelDtor' referenced in OpenACC 'firstprivate' clause does not have a copy constructor; reference has no effect}}224 // expected-note@+1{{in instantiation}}225 firstprivate_template(IDD);226 // expected-error@#FIRSTPRIV{{variable of type 'DeletedCopy' referenced in OpenACC 'firstprivate' clause does not have a copy constructor; reference has no effect}}227 // expected-note@+1{{in instantiation}}228 firstprivate_template(DelCopy);229 firstprivate_template(DefCopy);230 firstprivate_template(UDCopy);231}232 233void firstprivate_arrays() {234 char *ptr;235 ImplicitCtorDtor CDTArr[5];236 ImplDeletedCtor IDCArr[5]{1,2,3,4,5};237 DefaultedCtor DefCArr[5];238 ImpledCtor ICArr[5];239 DeletedCtor DelCArr[5]{1,2,3,4,5};240 ImpledDtor IDArr[5];241 DefaultedDtor DefDArr[5];242 using DelDArrTy = DeletedDtor[5];243 DelDArrTy &DelDArr = *((DelDArrTy*)ptr);244 using IDDArrTy = ImplicitDelDtor[5];245 IDDArrTy &IDDArr = *((IDDArrTy*)ptr);246 DeletedCopy DelCopyArr[5]{};247 DefaultedCopy DefCopyArr[5]{};248 UserCopy UDCopyArr[5]{};249 250#pragma acc parallel firstprivate(CDTArr)251 ;252#pragma acc parallel firstprivate(IDCArr)253 ;254#pragma acc parallel firstprivate(DefCArr)255 ;256#pragma acc parallel firstprivate(ICArr)257 ;258#pragma acc parallel firstprivate(DelCArr)259 ;260#pragma acc parallel firstprivate(IDArr)261 ;262#pragma acc parallel firstprivate(DefDArr)263 ;264 // expected-error@+1{{variable of type 'DeletedDtor' referenced in OpenACC 'firstprivate' clause does not have a destructor; reference has no effect}}265#pragma acc parallel firstprivate(DelDArr)266 ;267 // expected-error@+1{{variable of type 'ImplicitDelDtor' referenced in OpenACC 'firstprivate' clause does not have a copy constructor; reference has no effect}}268#pragma acc parallel firstprivate(IDDArr)269 ;270 // expected-error@+1{{variable of type 'DeletedCopy' referenced in OpenACC 'firstprivate' clause does not have a copy constructor; reference has no effect}}271#pragma acc parallel firstprivate(DelCopyArr)272 ;273#pragma acc parallel firstprivate(DefCopyArr)274 ;275#pragma acc parallel firstprivate(UDCopyArr)276 ;277}278 279template<unsigned I>280void non_const_array_templ() {281 int CArr[I];282 283#pragma acc parallel firstprivate(CArr)284 ;285}286 287void non_const_arrays(int I) {288 non_const_array_templ<5>();289 290 int NCArr[I];291 // expected-warning@+1{{variable of array type 'int[I]' referenced in OpenACC 'firstprivate' clause does not have constant bounds; initialization will happen after decay to pointer}}292#pragma acc parallel firstprivate(NCArr)293 ;294}295