cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
394 lines
13 KiB
C++
394 lines
13 KiB
C++
// RUN: %clang_cc1 %s -fopenacc -verify
|
|
|
|
template<unsigned Val>
|
|
void depth_too_high_templ() {
|
|
// expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc parallel loop collapse(Val)
|
|
for(unsigned i = 0; i < 5; ++i)
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
}
|
|
constexpr int three() { return 3; }
|
|
struct ConvertsThree{
|
|
constexpr ConvertsThree(){};
|
|
|
|
constexpr operator int(){ return 3; }
|
|
};
|
|
|
|
void depth_too_high() {
|
|
depth_too_high_templ<3>(); // expected-note{{in instantiation of function template specialization}}
|
|
|
|
// expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc serial loop collapse(3)
|
|
for(unsigned i = 0; i < 5; ++i)
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
|
|
// expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc kernels loop collapse(three())
|
|
for(unsigned i = 0; i < 5; ++i)
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
|
|
// expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc parallel loop collapse(ConvertsThree{})
|
|
for(unsigned i = 0; i < 5; ++i)
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
}
|
|
|
|
template<typename T, unsigned Three>
|
|
void not_single_loop_templ() {
|
|
T Arr[5];
|
|
// expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
// expected-note@+1 2{{active 'collapse' clause defined here}}
|
|
#pragma acc parallel loop collapse(3)
|
|
for(auto x : Arr) {
|
|
for(auto y : Arr){
|
|
do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'parallel loop' with a 'collapse' clause}}
|
|
}
|
|
}
|
|
|
|
// expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
// expected-note@+1 2{{active 'collapse' clause defined here}}
|
|
#pragma acc serial loop collapse(Three)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'serial loop' with a 'collapse' clause}}
|
|
}
|
|
}
|
|
|
|
#pragma acc kernels loop collapse(Three)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
for(unsigned k = 0; k < 5;++k) {
|
|
do{}while(true);
|
|
}
|
|
}
|
|
}
|
|
// expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
// expected-note@+1 2{{active 'collapse' clause defined here}}
|
|
#pragma acc parallel loop collapse(Three)
|
|
for(auto x : Arr) {
|
|
for(auto y: Arr) {
|
|
do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'parallel loop' with a 'collapse' clause}}
|
|
}
|
|
}
|
|
|
|
#pragma acc serial loop collapse(Three)
|
|
for(auto x : Arr) {
|
|
for(auto y: Arr) {
|
|
for(auto z: Arr) {
|
|
do{}while(true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void not_single_loop() {
|
|
not_single_loop_templ<int, 3>(); // expected-note{{in instantiation of function template}}
|
|
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc kernels loop collapse(3)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
for(unsigned k = 0; k < 5;++k);
|
|
}
|
|
while(true); // expected-error{{while loop cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}}
|
|
}
|
|
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc parallel loop collapse(3)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
for(unsigned k = 0; k < 5;++k);
|
|
}
|
|
do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'parallel loop' with a 'collapse' clause}}
|
|
}
|
|
|
|
// expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
// expected-note@+1 2{{active 'collapse' clause defined here}}
|
|
#pragma acc serial loop collapse(3)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
while(true); // expected-error{{while loop cannot appear in intervening code of a 'serial loop' with a 'collapse' clause}}
|
|
}
|
|
}
|
|
// expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
// expected-note@+1 2{{active 'collapse' clause defined here}}
|
|
#pragma acc kernels loop collapse(3)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}}
|
|
}
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
do{}while(true);
|
|
}
|
|
}
|
|
#pragma acc serial loop collapse(2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
while(true);
|
|
}
|
|
}
|
|
|
|
int Arr[5];
|
|
// expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
// expected-note@+1 2{{active 'collapse' clause defined here}}
|
|
#pragma acc kernels loop collapse(3)
|
|
for(auto x : Arr) {
|
|
for(auto y : Arr){
|
|
do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}}
|
|
}
|
|
}
|
|
|
|
// expected-note@+1 {{active 'collapse' clause defined here}}
|
|
#pragma acc parallel loop collapse(3)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
for(unsigned k = 0; k < 5;++k);
|
|
}
|
|
// expected-error@+1{{more than one for-loop in a loop associated with OpenACC 'parallel loop' construct with a 'collapse' clause}}
|
|
for(unsigned k = 0; k < 5;++k);
|
|
}
|
|
|
|
// expected-note@+1 {{active 'collapse' clause defined here}}
|
|
#pragma acc serial loop collapse(3)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
for(unsigned k = 0; k < 5;++k);
|
|
// expected-error@+1{{more than one for-loop in a loop associated with OpenACC 'serial loop' construct with a 'collapse' clause}}
|
|
for(unsigned k = 0; k < 5;++k);
|
|
}
|
|
}
|
|
|
|
for(unsigned k = 0; k < 5;++k);
|
|
#pragma acc kernels loop collapse(3)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
for(unsigned k = 0; k < 5;++k);
|
|
}
|
|
}
|
|
}
|
|
|
|
template<unsigned Two, unsigned Three>
|
|
void no_other_directives() {
|
|
#pragma acc parallel loop collapse(Two)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {// last loop associated with the top level.
|
|
// expected-error@+1{{'collapse' clause specifies a loop count greater than the number of available loops}}
|
|
#pragma acc serial loop collapse(Three) // expected-note 2{{active 'collapse' clause defined here}}
|
|
for(unsigned k = 0; k < 6;++k) {
|
|
for(unsigned l = 0; l < 5; ++l) {
|
|
// expected-error@+1{{OpenACC 'serial' construct cannot appear in intervening code of a 'serial loop' with a 'collapse' clause}}
|
|
#pragma acc serial
|
|
;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#pragma acc kernels loop collapse(Two)// expected-note{{active 'collapse' clause defined here}}
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {// last loop associated with the top level.
|
|
#pragma acc parallel loop collapse(Three)
|
|
for(unsigned k = 0; k < 6;++k) {
|
|
for(unsigned l = 0; l < 5; ++l) {
|
|
for(unsigned m = 0; m < 5; ++m);
|
|
}
|
|
}
|
|
}
|
|
// expected-error@+1{{OpenACC 'serial' construct cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}}
|
|
#pragma acc serial
|
|
;
|
|
}
|
|
}
|
|
|
|
void no_other_directives() {
|
|
no_other_directives<2,3>(); // expected-note{{in instantiation of function template specialization}}
|
|
|
|
// Ok, not inside the intervening list
|
|
#pragma acc serial loop collapse(2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
// expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}
|
|
#pragma acc data
|
|
;
|
|
}
|
|
}
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc kernels loop collapse(2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
// expected-error@+2{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}
|
|
// expected-error@+1{{OpenACC 'data' construct cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}}
|
|
#pragma acc data
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
}
|
|
}
|
|
}
|
|
|
|
void call();
|
|
|
|
template<unsigned Two>
|
|
void intervening_without_force_templ() {
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc parallel loop collapse(2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
// expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'parallel loop' construct}}
|
|
call();
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
}
|
|
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc serial loop collapse(Two)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
// expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'serial loop' construct}}
|
|
call();
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
}
|
|
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc kernels loop collapse(2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
// expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'kernels loop' construct}}
|
|
call();
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(force:2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
call();
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(force:Two)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
call();
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
}
|
|
|
|
|
|
#pragma acc parallel loop collapse(force:2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
call();
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(force:Two)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
call();
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(Two)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
call();
|
|
}
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(Two)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
{
|
|
{
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
call();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(force:Two)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
call();
|
|
}
|
|
}
|
|
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc parallel loop collapse(Two)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
// expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'parallel loop' construct}}
|
|
call();
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(2)
|
|
// expected-error@+2{{OpenACC 'parallel loop' construct must have a terminating condition}}
|
|
// expected-note@-2{{'parallel loop' construct is here}}
|
|
for(int i = 0;;++i)
|
|
// expected-error@+2{{OpenACC 'parallel loop' construct must have a terminating condition}}
|
|
// expected-note@-5{{'parallel loop' construct is here}}
|
|
for(int j = 0;;++j)
|
|
for(;;);
|
|
}
|
|
|
|
void intervening_without_force() {
|
|
intervening_without_force_templ<2>(); // expected-note{{in instantiation of function template specialization}}
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc parallel loop collapse(2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
// expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'parallel loop' construct}}
|
|
call();
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
}
|
|
|
|
// expected-note@+1{{active 'collapse' clause defined here}}
|
|
#pragma acc parallel loop collapse(2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
// expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'parallel loop' construct}}
|
|
call();
|
|
}
|
|
|
|
// The below two are fine, as they use the 'force' tag.
|
|
#pragma acc parallel loop collapse(force:2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
call();
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(force:2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j);
|
|
call();
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
call();
|
|
}
|
|
}
|
|
#pragma acc parallel loop collapse(2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
{
|
|
{
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
call();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(force:2)
|
|
for(unsigned i = 0; i < 5; ++i) {
|
|
for(unsigned j = 0; j < 5; ++j) {
|
|
call();
|
|
}
|
|
}
|
|
|
|
#pragma acc parallel loop collapse(2)
|
|
// expected-error@+2{{OpenACC 'parallel loop' construct must have a terminating condition}}
|
|
// expected-note@-2{{'parallel loop' construct is here}}
|
|
for(int i = 0;;++i)
|
|
// expected-error@+2{{OpenACC 'parallel loop' construct must have a terminating condition}}
|
|
// expected-note@-5{{'parallel loop' construct is here}}
|
|
for(int j = 0;;++j)
|
|
for(;;);
|
|
}
|
|
|