378 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -verify -Wopenacc-extension2 3int *Global;4int GlobalArray[5];5int GlobalArray2[5];6// expected-error@+1{{no valid clauses specified in OpenACC 'declare' directive}}7#pragma acc declare8namespace NS {9int *NSVar;10int NSArray[5];11// expected-error@+2{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}12// expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}13#pragma acc declare create(Global, GlobalArray)14// Ok, correct scope.15#pragma acc declare create(NSVar, NSArray)16 17// expected-error@+4{{variable referenced in 'create' clause of OpenACC 'declare' directive was already referenced}}18// expected-note@-3{{previous reference is here}}19// expected-error@+2{{variable referenced in 'copyin' clause of OpenACC 'declare' directive was already referenced}}20// expected-note@-5{{previous reference is here}}21#pragma acc declare create(NSVar) copyin(NSVar)22 23// expected-error@+1{{no valid clauses specified in OpenACC 'declare' directive}}24#pragma acc declare25 26int NSVar1, NSVar2, NSVar3, NSVar4, NSVar5, *NSVar6, NSVar7, NSVar8;27 28// Only create, copyin, deviceptr, device-resident, link at NS scope.29// expected-error@+3{{OpenACC 'copy' clause on a 'declare' directive is not allowed at global or namespace scope}}30// expected-error@+2{{OpenACC 'copyout' clause on a 'declare' directive is not allowed at global or namespace scope}}31// expected-error@+1{{OpenACC 'present' clause on a 'declare' directive is not allowed at global or namespace scope}}32#pragma acc declare copy(NSVar1) copyin(NSVar2), copyout(NSVar3), create(NSVar4), present(NSVar5), deviceptr(NSVar6), device_resident(NSVar7), link(NSVar8)33 34extern "C" {35 int ExternVar, ExternVar1, ExternVar2, ExternVar3, ExternVar4, *ExternVar5, ExternVar6, ExternVar7;36 // Only create, copyin, deviceptr, device-resident, link at NS scope.37 // expected-error@+3{{OpenACC 'copy' clause on a 'declare' directive is not allowed at global or namespace scope}}38 // expected-error@+2{{OpenACC 'copyout' clause on a 'declare' directive is not allowed at global or namespace scope}}39 // expected-error@+1{{OpenACC 'present' clause on a 'declare' directive is not allowed at global or namespace scope}}40#pragma acc declare copy(ExternVar) copyin(ExternVar1), copyout(ExternVar2), create(ExternVar3), present(ExternVar4), deviceptr(ExternVar5), device_resident(ExternVar6), link(ExternVar7)41 }42}43// expected-error@+2{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}44// expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}45#pragma acc declare create(NS::NSVar, NS::NSArray)46 47struct Struct {48 static const int StaticMem = 5;49 static const int StaticMem2 = 5;50 int NonStaticMem;51// expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}52#pragma acc declare create(Global)53 // OK, same scope.54#pragma acc declare create(StaticMem, StaticMem2)55// expected-error@+4{{variable referenced in 'create' clause of OpenACC 'declare' directive was already referenced}}56// expected-note@-2{{previous reference is here}}57// expected-error@+2{{variable referenced in 'copyin' clause of OpenACC 'declare' directive was already referenced}}58// expected-note@-4{{previous reference is here}}59#pragma acc declare create(StaticMem) copyin(StaticMem)60// expected-error@+1{{no valid clauses specified in OpenACC 'declare' directive}}61#pragma acc declare62 63 void Inline(int Arg) {64// expected-error@+1{{no valid clauses specified in OpenACC 'declare' directive}}65#pragma acc declare66// expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}67#pragma acc declare create(StaticMem)68 69 int Local, Local2, Local3, Local4;70 // OK, same scope.71#pragma acc declare create(Local, Arg)72// expected-error@+2{{variable referenced in 'copyin' clause of OpenACC 'declare' directive was already referenced}}73// expected-note@+1{{previous reference is here}}74#pragma acc declare create(Local2) copyin(Local2)75 76 for (int I = 0; I < 5; ++I) {77 int Other;78 // FIXME: We don't catch this because we use decl-context instead of scope.79#pragma acc declare create(Local3, Local4)80 // OK, same scope.81#pragma acc declare create(I, Other)82// expected-error@+4 2{{variable referenced in 'create' clause of OpenACC 'declare' directive was already referenced}}83// expected-note@-2 2{{previous reference is here}}84// expected-error@+2 2{{variable referenced in 'copyin' clause of OpenACC 'declare' directive was already referenced}}85// expected-note@-4 2{{previous reference is here}}86#pragma acc declare create(I, Other) copyin(I, Other)87 88// expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}89#pragma acc declare create(NonStaticMem)90 }91 }92 93 void OutOfLine(int Arg, int Arg2);94};95 96void Struct::OutOfLine(int Arg, int Arg2) {97// expected-error@+1{{no valid clauses specified in OpenACC 'declare' directive}}98#pragma acc declare99// expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}100#pragma acc declare create(StaticMem)101 102 int Local, Local2;103// OK, same scope.104#pragma acc declare create(Local, Arg)105// expected-error@+4{{variable referenced in 'create' clause of OpenACC 'declare' directive was already referenced}}106// expected-note@-2{{previous reference is here}}107// expected-error@+2{{variable referenced in 'copyin' clause of OpenACC 'declare' directive was already referenced}}108// expected-note@-4{{previous reference is here}}109#pragma acc declare create(Local) copyin(Local)110 111 for (int I = 0; I < 5; ++I) {112 int Other;113 // FIXME: We don't catch this because we use decl-context instead of scope.114#pragma acc declare create(Local2, Arg2)115 // OK, same scope.116#pragma acc declare create(I, Other)117// expected-error@+4 2{{variable referenced in 'create' clause of OpenACC 'declare' directive was already referenced}}118// expected-note@-2 2{{previous reference is here}}119// expected-error@+2 2{{variable referenced in 'copyin' clause of OpenACC 'declare' directive was already referenced}}120// expected-note@-4 2{{previous reference is here}}121#pragma acc declare create(I, Other) copyin(I, Other)122 }123// expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}124#pragma acc declare create(NonStaticMem)125}126 127template<typename T>128struct DepStruct {129 static const T DepStaticMem = 5;130 static const int StaticMem = 5;131 int NonStaticMem;132// expected-error@+1{{no valid clauses specified in OpenACC 'declare' directive}}133#pragma acc declare134// expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}135#pragma acc declare create(Global)136 // OK, same scope.137#pragma acc declare create(DepStaticMem)138 // OK, same scope.139#pragma acc declare create(StaticMem)140// expected-error@+4{{variable referenced in 'create' clause of OpenACC 'declare' directive was already referenced}}141// expected-note@-2{{previous reference is here}}142// expected-error@+2{{variable referenced in 'copyin' clause of OpenACC 'declare' directive was already referenced}}143// expected-note@-4{{previous reference is here}}144#pragma acc declare create(StaticMem) copyin(StaticMem)145// expected-error@+4{{variable referenced in 'create' clause of OpenACC 'declare' directive was already referenced}}146// expected-note@-9{{previous reference is here}}147// expected-error@+2{{variable referenced in 'copyin' clause of OpenACC 'declare' directive was already referenced}}148// expected-note@-11{{previous reference is here}}149#pragma acc declare create(DepStaticMem) copyin(DepStaticMem)150 151 void Inline(int Arg) {152// expected-error@+1{{no valid clauses specified in OpenACC 'declare' directive}}153#pragma acc declare154// expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}155#pragma acc declare create(DepStaticMem)156// expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}157#pragma acc declare create(StaticMem)158 159 T Local, Local2;160 // OK, same scope.161#pragma acc declare create(Local, Arg)162// expected-error@+2 2{{variable referenced in 'create' clause of OpenACC 'declare' directive was already referenced}}163// expected-note@-2 2{{previous reference is here}}164#pragma acc declare create(Local, Local)165 166 for (int I = 0; I < 5; ++I) {167 int Other;168 // FIXME: Since we approximate this as a decl-context, we can't check169 // scope here.170#pragma acc declare create(Local2)171 // OK, same scope.172#pragma acc declare create(I, Other)173 // expected-error@+2 3{{variable referenced in 'create' clause of OpenACC 'declare' directive was already referenced}}174 // expected-note@-2 3{{previous reference is here}}175#pragma acc declare create(I, Other, I)176 }177 // expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}178#pragma acc declare create(NonStaticMem)179 }180 181 void OutOfLine(int Arg);182 183 template<typename U>184 void TemplInline(U Arg, U Arg2) {185// expected-error@+1{{no valid clauses specified in OpenACC 'declare' directive}}186#pragma acc declare187 // expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}188#pragma acc declare create(DepStaticMem)189 // expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}190#pragma acc declare create(StaticMem)191 192 T Local, Local2, Local3;193 // OK, same scope.194#pragma acc declare create(Local, Arg)195// expected-error@+4{{variable referenced in 'create' clause of OpenACC 'declare' directive was already referenced}}196// expected-note@-2{{previous reference is here}}197// expected-error@+2{{variable referenced in 'present' clause of OpenACC 'declare' directive was already referenced}}198// expected-note@-4{{previous reference is here}}199#pragma acc declare create(Local2, Arg) present(Local, Arg2)200 {201 // FIXME: We don't catch this, since we check decl-context not scopes.202#pragma acc declare create(Local3)203 204 // expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}205#pragma acc declare create(NonStaticMem)206 }207 }208 template<typename U>209 void TemplOutline(U Arg);210};211 212template<typename T>213void DepStruct<T>::OutOfLine(int Arg) {214 // expected-error@+1{{no valid clauses specified in OpenACC 'declare' directive}}215#pragma acc declare216 // expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}217#pragma acc declare create(StaticMem)218 219 T Local, Local2;220// OK, same scope.221#pragma acc declare create(Local, Arg)222 223 for (int I = 0; I < 5; ++I) {224 int Other;225 // FIXME: We don't catch this because we use decl-context instead of scope.226#pragma acc declare create(Local2)227 // OK, same scope.228#pragma acc declare create(I, Other)229 }230 // expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}231#pragma acc declare create(NonStaticMem)232}233template<typename T>234template<typename U>235void DepStruct<T>::TemplOutline(U Arg) {236// expected-error@+1{{no valid clauses specified in OpenACC 'declare' directive}}237#pragma acc declare238 // expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}239#pragma acc declare create(DepStaticMem)240 // expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}241#pragma acc declare create(StaticMem)242 243 T Local, Local2;244// OK, same scope.245#pragma acc declare create(Local, Arg)246 247 {248 // FIXME: We could potentially fix this someday, but as we don't have249 // 'scope' information like this during template instantiation, we have to250 // permit this.251#pragma acc declare create(Local2)252 }253 // expected-error@+1{{variable appearing in 'create' clause of OpenACC 'declare' directive must be in the same scope as the directive}}254#pragma acc declare create(NonStaticMem)255}256 257void use() {258 DepStruct<int> DS;259 DS.Inline(1);260 DS.OutOfLine(1);261 DS.TemplInline(1, 2);262 DS.TemplOutline(1);263}264 265// Only variable or array name.266 267// expected-error@+1{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}268#pragma acc declare create(GlobalArray[0])269// expected-warning@+1{{sub-array as a variable on 'declare' construct is not a valid variable name or array name}}270#pragma acc declare create(GlobalArray[0: 1]) // #GLOBALARRAYREF271 272struct S { int I; };273// expected-error@+1{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}274#pragma acc declare create(S{}.I)275 276int GS1, GS2, GS3, GS4, GS5, *GS6, GS7, GS8;277 278// Only create, copyin, deviceptr, device-resident, link at NS scope.279// expected-error@+3{{OpenACC 'copy' clause on a 'declare' directive is not allowed at global or namespace scope}}280// expected-error@+2{{OpenACC 'copyout' clause on a 'declare' directive is not allowed at global or namespace scope}}281// expected-error@+1{{OpenACC 'present' clause on a 'declare' directive is not allowed at global or namespace scope}}282#pragma acc declare copy(GS1) copyin(GS2), copyout(GS3), create(GS4), present(GS5), deviceptr(GS6), device_resident(GS7), link(GS8)283 284void ExternVar() {285 extern int I, I2, I3, I4, I5, *I6, I7, I8;286// expected-error@+3{{'extern' variable may not be referenced by 'copy' clause on an OpenACC 'declare' directive}}287// expected-error@+2{{'extern' variable may not be referenced by 'copyout' clause on an OpenACC 'declare' directive}}288// expected-error@+1{{'extern' variable may not be referenced by 'present' clause on an OpenACC 'declare' directive}}289#pragma acc declare copy(I) copyin(I2), copyout(I3), create(I4), present(I5), deviceptr(I6), device_resident(I7), link(I8)290}291 292// expected-error@+2{{variable referenced in 'link' clause of OpenACC 'declare' directive was already referenced}}293// expected-note@#GLOBALARRAYREF{{previous reference is here}}294#pragma acc declare link(GlobalArray)295 296// Link can only have global, namespace, or extern vars.297#pragma acc declare link(Global, GlobalArray2)298 299struct Struct2 {300 static const int StaticMem = 5;301 // expected-error@+1{{variable referenced by 'link' clause not in global or namespace scope must be marked 'extern'}}302#pragma acc declare link(StaticMem)303 304 void MemFunc(int I) {305 int Local;306 extern int ExternLocal;307 308 // expected-error@+2{{variable referenced by 'link' clause not in global or namespace scope must be marked 'extern'}}309 // expected-error@+1{{variable referenced by 'link' clause not in global or namespace scope must be marked 'extern'}}310#pragma acc declare link(I, Local, ExternLocal)311 312 int Local2[5];313 int Local3[5];314 // expected-error@+3{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}315 // expected-warning@+2{{sub-array as a variable on 'declare' construct is not a valid variable name or array name}}316 // expected-error@+1{{variable referenced by 'link' clause not in global or namespace scope must be marked 'extern'}}317#pragma acc declare link(Local2[1], Local3[1:1])318}319};320 321void ModList() {322 int V1, V2, V3, V4, V4B, V5, V6, V7, V7B, V8, V9, V10,323 V11, V11B, V12, V13, V14, V15, V16, V17, V18, V19;324 // expected-error@+2{{OpenACC 'readonly' modifier not valid on 'copy' clause}}325 // expected-error@+1{{OpenACC 'zero' modifier not valid on 'copy' clause}}326#pragma acc declare copy(always, alwaysin, alwaysout, zero, readonly: V1)327 // expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copy' clause}}328#pragma acc declare copy(readonly: V2)329 // expected-error@+1{{OpenACC 'zero' modifier not valid on 'copy' clause}}330#pragma acc declare copy(zero: V3)331#pragma acc declare copy(capture: V4)332#pragma acc declare copy(always, alwaysin, alwaysout, capture: V4B)333 334 // expected-error@+2{{OpenACC 'alwaysout' modifier not valid on 'copyin' clause}}335 // expected-error@+1{{OpenACC 'zero' modifier not valid on 'copyin' clause}}336#pragma acc declare copyin(always, alwaysin, alwaysout, zero, readonly: V5)337 // expected-error@+1{{OpenACC 'alwaysout' modifier not valid on 'copyin' clause}}338#pragma acc declare copyin(alwaysout: V6)339 // expected-error@+1{{OpenACC 'zero' modifier not valid on 'copyin' clause}}340#pragma acc declare copyin(zero: V7)341 // expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyin' clause}}342#pragma acc declare copyin(capture: V7B)343 // expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyin' clause}}344#pragma acc declare copyin(always, alwaysin, readonly, capture: V8)345 346 // expected-error@+2{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}347 // expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}348#pragma acc declare copyout(always, alwaysin, alwaysout, zero, readonly: V9)349 // expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}350#pragma acc declare copyout(alwaysin: V10)351 // expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}352#pragma acc declare copyout(readonly: V11)353 // expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyout' clause}}354#pragma acc declare copyout(capture: V11B)355 // expected-error@+2{{OpenACC 'alwaysin' modifier not valid on 'copyout' clause}}356 // expected-error@+1{{OpenACC 'capture' modifier not valid on 'copyout' clause}}357#pragma acc declare copyout(always, alwaysin, alwaysout, zero, capture: V12)358 359 // expected-error@+5{{OpenACC 'always' modifier not valid on 'create' clause}}360 // expected-error@+4{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}361 // expected-error@+3{{OpenACC 'alwaysout' modifier not valid on 'create' clause}}362 // expected-error@+2{{OpenACC 'readonly' modifier not valid on 'create' clause}}363 // expected-error@+1{{OpenACC 'capture' modifier not valid on 'create' clause}}364#pragma acc declare create(always, alwaysin, alwaysout, zero, readonly, capture: V13)365 // expected-error@+1{{OpenACC 'always' modifier not valid on 'create' clause}}366#pragma acc declare create(always: V14)367 // expected-error@+1{{OpenACC 'alwaysin' modifier not valid on 'create' clause}}368#pragma acc declare create(alwaysin: V15)369 // expected-error@+1{{OpenACC 'alwaysout' modifier not valid on 'create' clause}}370#pragma acc declare create(alwaysout: V16)371 // expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}372#pragma acc declare create(readonly: V17)373 374#pragma acc declare create(zero: V18)375 // expected-error@+1{{OpenACC 'capture' modifier not valid on 'create' clause}}376#pragma acc declare create(capture: V19)377}378