310 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s2// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s3// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck %s4 5// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s6// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s7// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck %s8 9// RUN: %clang_cc1 -DOMP51 -DOMPX -verify -fopenmp -fopenmp-extensions -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s10// RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s11// RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp -fopenmp-extensions -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s12 13// RUN: %clang_cc1 -DOMP51 -DOMPX -verify -fopenmp-simd -fopenmp-extensions -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s14// RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp-simd -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s15// RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp-simd -fopenmp-extensions -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s16 17// RUN: %clang_cc1 -DOMP60 -verify -fopenmp -fopenmp-version=60 -fopenmp-extensions -ast-print %s | FileCheck -check-prefixes=CHECK,OMP60 %s18// RUN: %clang_cc1 -DOMP60 -fopenmp -fopenmp-version=60 -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s19// RUN: %clang_cc1 -DOMP60 -fopenmp -fopenmp-version=60 -fopenmp-extensions -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP60 %s20 21// RUN: %clang_cc1 -DOMP60 -verify -fopenmp-simd -fopenmp -fopenmp-version=60 -fopenmp-extensions -ast-print %s | FileCheck -check-prefixes=CHECK,OMP60 %s22// RUN: %clang_cc1 -DOMP60 -fopenmp-simd -fopenmp -fopenmp-version=60 -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s23// RUN: %clang_cc1 -DOMP60 -fopenmp-simd -fopenmp -fopenmp-version=60 -fopenmp-extensions -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP60 %s24// expected-no-diagnostics25 26#ifndef HEADER27#define HEADER28 29void foo() {}30 31template <typename T, int C>32T tmain(T argc, T *argv) {33 T i, j, b, c, d, e, x[20];34 35#pragma omp target data map(to: c)36 i = argc;37 38#pragma omp target data map(to: c) if (target data: j > 0)39 foo();40 41#pragma omp target data map(to: c) if (b)42 foo();43 44#pragma omp target data map(c)45 foo();46 47#pragma omp target data map(c) if(b>e)48 foo();49 50#pragma omp target data map(x[0:10], c)51 foo();52 53#pragma omp target data map(to: c) map(from: d)54 foo();55 56#pragma omp target data map(always,alloc: e)57 foo();58 59#pragma omp target data map(close,alloc: e)60 foo();61 62#ifdef OMP6063#pragma omp target data map(self,alloc: e)64 foo();65#endif66 67#ifdef OMP5168#pragma omp target data map(present,alloc: e)69 foo();70#endif71 72#ifdef OMPX73#pragma omp target data map(ompx_hold,alloc: e)74 foo();75#endif76 77// nesting a target region78#pragma omp target data map(e)79{80 #pragma omp target map(always, alloc: e)81 foo();82 #pragma omp target map(close, alloc: e)83 foo();84#ifdef OMP6085 #pragma omp target map(self,alloc: e)86 foo();87#endif88#ifdef OMP5189 #pragma omp target map(present, alloc: e)90 foo();91#endif92#ifdef OMPX93 #pragma omp target map(ompx_hold, alloc: e)94 foo();95#endif96}97 98 return 0;99}100 101// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {102// CHECK-NEXT: T i, j, b, c, d, e, x[20];103// CHECK-NEXT: #pragma omp target data map(to: c){{$}}104// CHECK-NEXT: i = argc;105// CHECK-NEXT: #pragma omp target data map(to: c) if(target{{[ _]}}data: j > 0)106// CHECK-NEXT: foo();107// CHECK-NEXT: #pragma omp target data map(to: c) if(b)108// CHECK-NEXT: foo();109// CHECK-NEXT: #pragma omp target data map(tofrom: c)110// CHECK-NEXT: foo();111// CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)112// CHECK-NEXT: foo();113// CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)114// CHECK-NEXT: foo();115// CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)116// CHECK-NEXT: foo();117// CHECK-NEXT: #pragma omp target data map(always,alloc: e)118// CHECK-NEXT: foo();119// CHECK-NEXT: #pragma omp target data map(close,alloc: e)120// CHECK-NEXT: foo();121// OMP60-NEXT: #pragma omp target data map(self,alloc: e)122// OMP60-NEXT: foo();123// OMP51-NEXT: #pragma omp target data map(present,alloc: e)124// OMP51-NEXT: foo();125// OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e)126// OMPX-NEXT: foo();127// CHECK-NEXT: #pragma omp target data map(tofrom: e)128// CHECK-NEXT: {129// CHECK-NEXT: #pragma omp target map(always,alloc: e)130// CHECK-NEXT: foo();131// CHECK-NEXT: #pragma omp target map(close,alloc: e)132// CHECK-NEXT: foo();133// OMP60-NEXT: #pragma omp target map(self,alloc: e)134// OMP60-NEXT: foo();135// OMP51-NEXT: #pragma omp target map(present,alloc: e)136// OMP51-NEXT: foo();137// OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: e)138// OMPX-NEXT: foo();139// CHECK: template<> int tmain<int, 5>(int argc, int *argv) {140// CHECK-NEXT: int i, j, b, c, d, e, x[20];141// CHECK-NEXT: #pragma omp target data map(to: c)142// CHECK-NEXT: i = argc;143// CHECK-NEXT: #pragma omp target data map(to: c) if(target{{[ _]}}data: j > 0)144// CHECK-NEXT: foo();145// CHECK-NEXT: #pragma omp target data map(to: c) if(b)146// CHECK-NEXT: foo();147// CHECK-NEXT: #pragma omp target data map(tofrom: c)148// CHECK-NEXT: foo();149// CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)150// CHECK-NEXT: foo();151// CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)152// CHECK-NEXT: foo();153// CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)154// CHECK-NEXT: foo();155// CHECK-NEXT: #pragma omp target data map(always,alloc: e)156// CHECK-NEXT: foo();157// CHECK-NEXT: #pragma omp target data map(close,alloc: e)158// CHECK-NEXT: foo();159// OMP60-NEXT: #pragma omp target data map(self,alloc: e)160// OMP60-NEXT: foo();161// OMP51-NEXT: #pragma omp target data map(present,alloc: e)162// OMP51-NEXT: foo();163// OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e)164// OMPX-NEXT: foo();165// CHECK-NEXT: #pragma omp target data map(tofrom: e)166// CHECK-NEXT: {167// CHECK-NEXT: #pragma omp target map(always,alloc: e)168// CHECK-NEXT: foo();169// CHECK-NEXT: #pragma omp target map(close,alloc: e)170// CHECK-NEXT: foo();171// OMP60-NEXT: #pragma omp target map(self,alloc: e)172// OMP60-NEXT: foo();173// OMP51-NEXT: #pragma omp target map(present,alloc: e)174// OMP51-NEXT: foo();175// OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: e)176// OMPX-NEXT: foo();177// CHECK: template<> char tmain<char, 1>(char argc, char *argv) {178// CHECK-NEXT: char i, j, b, c, d, e, x[20];179// CHECK-NEXT: #pragma omp target data map(to: c)180// CHECK-NEXT: i = argc;181// CHECK-NEXT: #pragma omp target data map(to: c) if(target{{[ _]}}data: j > 0)182// CHECK-NEXT: foo();183// CHECK-NEXT: #pragma omp target data map(to: c) if(b)184// CHECK-NEXT: foo();185// CHECK-NEXT: #pragma omp target data map(tofrom: c)186// CHECK-NEXT: foo();187// CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e)188// CHECK-NEXT: foo();189// CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)190// CHECK-NEXT: foo();191// CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)192// CHECK-NEXT: foo();193// CHECK-NEXT: #pragma omp target data map(always,alloc: e)194// CHECK-NEXT: foo();195// CHECK-NEXT: #pragma omp target data map(close,alloc: e)196// CHECK-NEXT: foo();197// OMP60-NEXT: #pragma omp target data map(self,alloc: e)198// OMP60-NEXT: foo();199// OMP51-NEXT: #pragma omp target data map(present,alloc: e)200// OMP51-NEXT: foo();201// OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e)202// OMPX-NEXT: foo();203// CHECK-NEXT: #pragma omp target data map(tofrom: e)204// CHECK-NEXT: {205// CHECK-NEXT: #pragma omp target map(always,alloc: e)206// CHECK-NEXT: foo();207// CHECK-NEXT: #pragma omp target map(close,alloc: e)208// CHECK-NEXT: foo();209// OMP60-NEXT: #pragma omp target map(self,alloc: e)210// OMP60-NEXT: foo();211// OMP51-NEXT: #pragma omp target map(present,alloc: e)212// OMP51-NEXT: foo();213// OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: e)214// OMPX-NEXT: foo();215 216int main (int argc, char **argv) {217 int b = argc, c, d, e, f, g, x[20];218 static int a;219// CHECK: static int a;220 221#pragma omp target data map(to: ([argc][3][a])argv)222 // CHECK: #pragma omp target data map(to: ([argc][3][a])argv)223#pragma omp target data map(to: c)224// CHECK: #pragma omp target data map(to: c)225 a=2;226// CHECK-NEXT: a = 2;227#pragma omp target data map(to: c) if (target data: b)228// CHECK: #pragma omp target data map(to: c) if(target{{[ _]}}data: b)229 foo();230// CHECK-NEXT: foo();231 232#pragma omp target data map(to: c) if (b > g)233// CHECK: #pragma omp target data map(to: c) if(b > g)234 foo();235// CHECK-NEXT: foo();236 237#pragma omp target data map(c)238// CHECK-NEXT: #pragma omp target data map(tofrom: c)239 foo();240// CHECK-NEXT: foo();241 242#pragma omp target data map(c) if(b>g)243// CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > g)244 foo();245// CHECK-NEXT: foo();246 247#pragma omp target data map(x[0:10], c)248// CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c)249 foo();250// CHECK-NEXT: foo();251 252#pragma omp target data map(to: c) map(from: d)253// CHECK-NEXT: #pragma omp target data map(to: c) map(from: d)254 foo();255// CHECK-NEXT: foo();256 257#pragma omp target data map(always,alloc: e)258// CHECK-NEXT: #pragma omp target data map(always,alloc: e)259 foo();260// CHECK-NEXT: foo();261 262#pragma omp target data map(close,alloc: e)263// CHECK-NEXT: #pragma omp target data map(close,alloc: e)264 foo();265// CHECK-NEXT: foo();266 267// OMP60-NEXT: #pragma omp target data map(self,alloc: e)268// OMP60-NEXT: foo();269#ifdef OMP60270#pragma omp target data map(self,alloc: e)271 foo();272#endif273 274// OMP51-NEXT: #pragma omp target data map(present,alloc: e)275// OMP51-NEXT: foo();276#ifdef OMP51277#pragma omp target data map(present,alloc: e)278 foo();279#endif280 281// OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e)282// OMPX-NEXT: foo();283#ifdef OMPX284#pragma omp target data map(ompx_hold,alloc: e)285 foo();286#endif287 288// nesting a target region289#pragma omp target data map(e)290// CHECK-NEXT: #pragma omp target data map(tofrom: e)291{292// CHECK-NEXT: {293 #pragma omp target map(always, alloc: e)294// CHECK-NEXT: #pragma omp target map(always,alloc: e)295 foo();296// CHECK-NEXT: foo();297#pragma omp target map(close, alloc: e)298// CHECK-NEXT: #pragma omp target map(close,alloc: e)299 foo();300// CHECK-NEXT: foo();301#pragma omp target map(always, alloc: e)302// CHECK-NEXT: #pragma omp target map(always,alloc: e)303 foo();304}305 306 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);307}308 309#endif310