// Check no warnings/errors // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fsyntax-only -verify %s // expected-no-diagnostics // Check AST and unparsing // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -ast-dump %s | FileCheck %s --check-prefix=DUMP // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -ast-print %s | FileCheck %s --check-prefix=PRINT --match-full-lines // Check same results after serialization round-trip // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -emit-pch -o %t %s // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT --match-full-lines #ifndef HEADER #define HEADER // placeholder for loop body code. void body(...); // PRINT-LABEL: void func_unroll() { // DUMP-LABEL: FunctionDecl {{.*}} func_unroll void func_unroll() { // PRINT: #pragma omp unroll // DUMP: OMPUnrollDirective #pragma omp unroll // PRINT-NEXT: for (int i = 7; i < 17; i += 3) // DUMP-NEXT: ForStmt for (int i = 7; i < 17; i += 3) // PRINT-NEXT: body(i); // DUMP: CallExpr body(i); } // PRINT-LABEL: void func_unroll_full() { // DUMP-LABEL: FunctionDecl {{.*}} func_unroll_full void func_unroll_full() { // PRINT: #pragma omp unroll full // DUMP: OMPUnrollDirective // DUMP-NEXT: OMPFullClause #pragma omp unroll full // PRINT-NEXT: for (int i = 7; i < 17; i += 3) // DUMP-NEXT: ForStmt for (int i = 7; i < 17; i += 3) // PRINT-NEXT: body(i); // DUMP: CallExpr body(i); } // PRINT-LABEL: void func_unroll_partial() { // DUMP-LABEL: FunctionDecl {{.*}} func_unroll_partial void func_unroll_partial() { // PRINT: #pragma omp unroll partial // DUMP: OMPUnrollDirective // DUMP-NEXT: OMPPartialClause // DUMP-NEXT: <<>> #pragma omp unroll partial // PRINT-NEXT: 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 func_unroll_partial_factor() { // DUMP-LABEL: FunctionDecl {{.*}} func_unroll_partial_factor void func_unroll_partial_factor() { // PRINT: #pragma omp unroll partial(4) // DUMP: OMPUnrollDirective // DUMP-NEXT: OMPPartialClause // DUMP-NEXT: ConstantExpr // DUMP-NEXT: value: Int 4 // DUMP-NEXT: IntegerLiteral {{.*}} 4 #pragma omp unroll partial(4) // PRINT-NEXT: for (int i = 7; i < 17; i += 3) // DUMP-NEXT: ForStmt for (int i = 7; i < 17; i += 3) // PRINT-NEXT: body(i); // DUMP: CallExpr body(i); } // PRINT-LABEL: void func_unroll_partial_factor_for() { // DUMP-LABEL: FunctionDecl {{.*}} func_unroll_partial_factor_for void func_unroll_partial_factor_for() { // PRINT: #pragma omp for // DUMP: OMPForDirective #pragma omp for // PRINT: #pragma omp unroll partial(2) // DUMP: OMPUnrollDirective // DUMP-NEXT: OMPPartialClause #pragma omp unroll partial(2) // PRINT-NEXT: for (int i = 7; i < 17; i += 3) // DUMP: ForStmt for (int i = 7; i < 17; i += 3) // PRINT-NEXT: body(i); // DUMP: CallExpr body(i); } // PRINT-LABEL: template void unroll_templated() { // DUMP-LABEL: FunctionTemplateDecl {{.*}} unroll_templated template void unroll_templated() { // PRINT: #pragma omp unroll partial(Factor) // DUMP: OMPUnrollDirective // DUMP-NEXT: OMPPartialClause // DUMP-NEXT: DeclRefExpr {{.*}} 'Factor' 'int' #pragma omp unroll partial(Factor) // 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); } void unroll_template() { unroll_templated(); } // PRINT-LABEL: template void unroll_templated_factor(int start, int stop, int step) { // DUMP-LABEL: FunctionTemplateDecl {{.*}} unroll_templated_factor template void unroll_templated_factor(int start, int stop, int step) { // PRINT: #pragma omp unroll partial(Factor) // DUMP: OMPUnrollDirective // DUMP-NEXT: OMPPartialClause // DUMP-NEXT: DeclRefExpr {{.*}} 'Factor' 'int' #pragma omp unroll partial(Factor) // PRINT-NEXT: for (int i = start; i < stop; i += step) // DUMP-NEXT: ForStmt for (int i = start; i < stop; i += step) // PRINT-NEXT: body(i); // DUMP: CallExpr body(i); } void unroll_template_factor() { unroll_templated_factor<4>(0, 42, 2); } #endif