// Check no warnings/errors // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=60 -fsyntax-only -verify %s // expected-no-diagnostics // Check AST and unparsing // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=60 -ast-dump %s | FileCheck %s --check-prefix=DUMP // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=60 -ast-print %s | FileCheck %s --check-prefix=PRINT // Check same results after serialization round-trip // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=60 -emit-pch -o %t %s // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=60 -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=60 -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT #ifndef HEADER #define HEADER // placeholder for loop body code. extern "C" void body(...); // PRINT-LABEL: void foo1( // DUMP-LABEL: FunctionDecl {{.*}} foo1 void foo1() { // PRINT: #pragma omp reverse // DUMP: OMPReverseDirective #pragma omp reverse // PRINT: for (int i = 7; i < 17; i += 3) // DUMP-NEXT: ForStmt for (int i = 7; i < 17; i += 3) // PRINT: body(i); // DUMP: CallExpr body(i); } // PRINT-LABEL: void foo2( // DUMP-LABEL: FunctionDecl {{.*}} foo2 void foo2(int start, int end, int step) { // PRINT: #pragma omp reverse // DUMP: OMPReverseDirective #pragma omp reverse // PRINT: for (int i = start; i < end; i += step) // DUMP-NEXT: ForStmt for (int i = start; i < end; i += step) // PRINT: body(i); // DUMP: CallExpr body(i); } // PRINT-LABEL: void foo3( // DUMP-LABEL: FunctionDecl {{.*}} foo3 void foo3() { // PRINT: #pragma omp for // DUMP: OMPForDirective // DUMP-NEXT: CapturedStmt // DUMP-NEXT: CapturedDecl #pragma omp for // PRINT: #pragma omp reverse // DUMP-NEXT: OMPReverseDirective #pragma omp reverse for (int i = 7; i < 17; i += 3) // PRINT: body(i); // DUMP: CallExpr body(i); } // PRINT-LABEL: void foo4( // DUMP-LABEL: FunctionDecl {{.*}} foo4 void foo4() { // PRINT: #pragma omp for collapse(2) // DUMP: OMPForDirective // DUMP-NEXT: OMPCollapseClause // DUMP-NEXT: ConstantExpr // DUMP-NEXT: value: Int 2 // DUMP-NEXT: IntegerLiteral {{.*}} 2 // DUMP-NEXT: CapturedStmt // DUMP-NEXT: CapturedDecl #pragma omp for collapse(2) // PRINT: #pragma omp reverse // DUMP: OMPReverseDirective #pragma omp reverse // PRINT: for (int i = 7; i < 17; i += 1) // DUMP-NEXT: ForStmt for (int i = 7; i < 17; i += 1) // PRINT: for (int j = 7; j < 17; j += 1) // DUMP: ForStmt for (int j = 7; j < 17; j += 1) // PRINT: body(i, j); // DUMP: CallExpr body(i, j); } // PRINT-LABEL: void foo5( // DUMP-LABEL: FunctionDecl {{.*}} foo5 void foo5(int start, int end, int step) { // PRINT: #pragma omp for collapse(2) // DUMP: OMPForDirective // DUMP-NEXT: OMPCollapseClause // DUMP-NEXT: ConstantExpr // DUMP-NEXT: value: Int 2 // DUMP-NEXT: IntegerLiteral {{.*}} 2 // DUMP-NEXT: CapturedStmt // DUMP-NEXT: CapturedDecl #pragma omp for collapse(2) // PRINT: for (int i = 7; i < 17; i += 1) // DUMP-NEXT: ForStmt for (int i = 7; i < 17; i += 1) // PRINT: #pragma omp reverse // DUMP: OMPReverseDirective #pragma omp reverse // PRINT: for (int j = 7; j < 17; j += 1) // DUMP-NEXT: ForStmt for (int j = 7; j < 17; j += 1) // PRINT: body(i, j); // DUMP: CallExpr body(i, j); } // PRINT-LABEL: void foo6( // DUMP-LABEL: FunctionTemplateDecl {{.*}} foo6 template void foo6(T start, T end) { // PRINT: #pragma omp reverse // DUMP: OMPReverseDirective #pragma omp reverse // PRINT-NEXT: for (T i = start; i < end; i += Step) // DUMP-NEXT: ForStmt for (T i = start; i < end; i += Step) // PRINT-NEXT: body(i); // DUMP: CallExpr body(i); } // Also test instantiating the template. void tfoo6() { foo6(0, 42); } // PRINT-LABEL: void foo7( // DUMP-LABEL: FunctionDecl {{.*}} foo7 void foo7() { double arr[128]; // PRINT: #pragma omp reverse // DUMP: OMPReverseDirective #pragma omp reverse // PRINT-NEXT: for (auto &&v : arr) // DUMP-NEXT: CXXForRangeStmt for (auto &&v : arr) // PRINT-NEXT: body(v); // DUMP: CallExpr body(v); } #endif