#ifndef HEADER #define HEADER // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -verify %s #define NNN 50 int aaa[NNN]; int aaa2[NNN][NNN]; void parallel_loop() { #pragma omp parallel { #pragma omp loop for (int j = 0 ; j < NNN ; j++) { aaa[j] = j*NNN; } } #pragma omp parallel for for (int i = 0 ; i < NNN ; i++) { #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} for (int j = 0 ; j < NNN ; j++) { aaa2[i][j] = i+j; } } #pragma omp parallel #pragma omp for nowait for (int i = 0 ; i < NNN ; i++) { #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} for (int j = 0 ; j < NNN ; j++) { aaa2[i][j] = i+j; } } #pragma omp parallel for for (int i = 0 ; i < NNN ; i++) { #pragma omp nothing #pragma omp loop for (int j = 0 ; j < NNN ; j++) { aaa2[i][j] = i+j; } } #pragma omp target teams distribute parallel for for (int i = 0 ; i < NNN ; i++) { #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'target teams distribute parallel for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} for (int j = 0 ; j < NNN ; j++) { aaa2[i][j] = i+j; } } #pragma omp target parallel for (int i = 0 ; i < NNN ; i++) { #pragma omp loop bind(parallel) for (int j = 0 ; j < NNN ; j++) { aaa2[i][j] = i+j; } } #pragma omp parallel for for (int i = 0; i < 100; ++i) { #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} for (int i = 0 ; i < NNN ; i++) { #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'loop' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} for (int j = 0 ; j < NNN ; j++) { aaa[j] = j*NNN; } } } #pragma omp parallel { #pragma omp sections { for (int i = 0 ; i < NNN ; i++) { #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} for (int j = 0 ; j < NNN ; j++) { aaa2[i][j] = i+j; } } #pragma omp section { aaa[NNN-1] = NNN; } } } } void teams_loop() { int var1; int total = 0; #pragma omp teams { #pragma omp loop bind(teams) for (int j = 0 ; j < NNN ; j++) { aaa[j] = j*NNN; } #pragma omp loop bind(teams) collapse(2) private(var1) for (int i = 0 ; i < 3 ; i++) { for (int j = 0 ; j < NNN ; j++) { var1 += aaa[j]; } } } #pragma omp target teams for (int i = 0 ; i < NNN ; i++) { #pragma omp loop bind(teams) for (int j = 0 ; j < NNN ; j++) { aaa2[i][j] = i+j; } } #pragma omp target teams distribute parallel for for (int i = 0 ; i < NNN ; i++) { #pragma omp loop bind(teams) // expected-error{{region cannot be closely nested inside 'target teams distribute parallel for' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}} for (int j = 0 ; j < NNN ; j++) { aaa2[i][j] = i+j; } } #pragma omp teams { #pragma omp loop bind(teams) for (int j = 0 ; j < NNN ; j++) { aaa[j] = j*NNN; } #pragma omp loop bind(teams) reduction(+:total) // expected-error{{'reduction' clause not allowed with '#pragma omp loop bind(teams)'}} for (int j = 0 ; j < NNN ; j++) { total+=aaa[j]; } } #pragma omp teams num_teams(8) thread_limit(256) #pragma omp distribute parallel for dist_schedule(static, 1024) \ schedule(static, 64) for (int i = 0; i < NNN; i++) { #pragma omp loop bind(teams) // expected-error{{'distribute parallel for' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}} for (int j = 0; j < NNN; j++) { aaa2[i][j] = i+j; } } #pragma omp teams for (int i = 0; i < NNN; i++) { #pragma omp loop bind(thread) for (int j = 0 ; j < NNN ; j++) { aaa[i] = i+i*NNN; } } #pragma omp teams loop for (int i = 0; i < NNN; i++) { #pragma omp loop for (int j = 0 ; j < NNN ; j++) { aaa[i] = i+i*NNN; } } #pragma omp teams loop for (int i = 0; i < NNN; i++) { #pragma omp loop bind(teams) // expected-error{{region cannot be closely nested inside 'teams loop' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}} for (int j = 0 ; j < NNN ; j++) { aaa[i] = i+i*NNN; } } } void thread_loop() { #pragma omp parallel for (int i = 0; i < NNN; i++) { #pragma omp loop bind(thread) for (int j = 0 ; j < NNN ; j++) { aaa[i] = i+i*NNN; } } #pragma omp teams for (int i = 0; i < NNN; i++) { #pragma omp loop bind(thread) for (int j = 0 ; j < NNN ; j++) { aaa[i] = i+i*NNN; } } } void parallel_for_with_loop_teams_bind(){ #pragma omp parallel for for (int i = 0; i < NNN; i++) { #pragma omp loop bind(teams) // expected-error{{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}} for (int j = 0 ; j < NNN ; j++) { aaa[i] = i+i*NNN; } } } void orphan_loops() { #pragma omp loop // expected-error{{expected 'bind' clause for 'loop' construct without an enclosing OpenMP construct}} for (int j = 0 ; j < NNN ; j++) { aaa[j] = j*NNN; } #pragma omp loop bind(parallel) for (int j = 0 ; j < NNN ; j++) { aaa[j] = j*NNN; } #pragma omp loop bind(teams) for (int i = 0; i < NNN; i++) { aaa[i] = i+i*NNN; } #pragma omp loop bind(thread) for (int i = 0; i < NNN; i++) { aaa[i] = i+i*NNN; } } int main(int argc, char *argv[]) { parallel_loop(); teams_loop(); thread_loop(); parallel_for_with_loop_teams_bind(); orphan_loops(); } #endif