1 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 \ 2 // RUN: -ferror-limit 100 %s -Wuninitialized 3 // RUN: %clang_cc1 -verify=expected,omp51 -fopenmp -fopenmp-version=51 \ 4 // RUN: -ferror-limit 100 %s -Wuninitialized 5 6 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 \ 7 // RUN: -ferror-limit 100 %s -Wuninitialized 8 // RUN: %clang_cc1 -verify=expected,omp51 -fopenmp-simd -fopenmp-version=51 \ 9 // RUN: -ferror-limit 100 %s -Wuninitialized 10 11 struct S1 { // expected-note 2 {{declared here}} 12 int a; 13 } s; 14 15 #pragma omp depobj(0) depend(in:s) // expected-error {{unexpected OpenMP directive '#pragma omp depobj'}} 16 void foo() { 17 #pragma omp depobj(0) depend(in:s) // expected-error {{'omp_depend_t' type not found; include <omp.h>}} expected-error {{expected lvalue expression}}} 18 } 19 20 typedef void *omp_depend_t; 21 22 template <class T> 23 T tmain(T argc) { 24 omp_depend_t x; 25 #pragma omp depobj() allocate(argc) // expected-error {{expected expression}} expected-error {{expected depobj expression}} expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp depobj'}} 26 ; 27 #pragma omp depobj(x) untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp depobj'}} 28 #pragma omp depobj(x) unknown // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} 29 if (argc) 30 #pragma omp depobj(x) destroy // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 31 if (argc) { 32 #pragma omp depobj(x) depend(in:s) 33 } 34 while (argc) 35 #pragma omp depobj(x)update(inout) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 36 while (argc) { 37 #pragma omp depobj(x) depend(in:s) 38 } 39 do 40 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 41 while (argc) 42 ; 43 do { 44 #pragma omp depobj(x) depend(in:s) 45 } while (argc); 46 switch (argc) 47 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 48 switch (argc) 49 case 1: 50 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 51 switch (argc) 52 case 1: { 53 #pragma omp depobj(x) depend(in:s) 54 } 55 switch (argc) { 56 #pragma omp depobj(x) depend(in:s) 57 case 1: 58 #pragma omp depobj(x) depend(in:s) 59 break; 60 default: { 61 #pragma omp depobj(x) depend(in:s) 62 } break; 63 } 64 for (;;) 65 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 66 for (;;) { 67 #pragma omp depobj(x) depend(in:s) 68 } 69 label: 70 #pragma omp depobj(x) depend(in:s) 71 label1 : { 72 #pragma omp depobj(x) depend(in:s) 73 } 74 75 #pragma omp depobj // expected-error {{expected depobj expression}} 76 #pragma omp depobj( // expected-error {{expected expression}} expected-error {{expected depobj expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 77 #pragma omp depobj() // expected-error {{expected expression}} expected-error {{expected depobj expression}} 78 #pragma omp depobj(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}} 79 #pragma omp depobj(argc, // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}} 80 #pragma omp depobj(argc) // expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}} 81 #pragma omp depobj(S1) // expected-error {{'S1' does not refer to a value}} expected-error {{expected depobj expression}} 82 #pragma omp depobj(argc) depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}} 83 #pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}} 84 ; 85 return T(); 86 } 87 88 int main(int argc, char **argv) { 89 omp_depend_t x; 90 #pragma omp depobj(x) depend(in:s) 91 ; 92 #pragma omp depobj(x) untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp depobj'}} 93 #pragma omp depobj(x) unknown // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} 94 if (argc) 95 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 96 if (argc) { 97 #pragma omp depobj(x) depend(in:s) 98 } 99 while (argc) 100 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 101 while (argc) { 102 #pragma omp depobj(x) depend(in:s) 103 } 104 do 105 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 106 while (argc) 107 ; 108 do { 109 #pragma omp depobj(x) depend(in:s) 110 } while (argc); 111 switch (argc) 112 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 113 switch (argc) 114 case 1: 115 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 116 switch (argc) 117 case 1: { 118 #pragma omp depobj(x) depend(in:s) 119 } 120 switch (argc) { 121 #pragma omp depobj(x) depend(in:s) 122 case 1: 123 #pragma omp depobj(x) depend(in:s) 124 break; 125 default: { 126 #pragma omp depobj(x) depend(in:s) 127 } break; 128 } 129 for (;;) 130 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} 131 for (;;) { 132 #pragma omp depobj(x) depend(in:s) 133 } 134 label: 135 #pragma omp depobj(x) depend(in:s) 136 label1 : { 137 #pragma omp depobj(x) depend(in:s) 138 } 139 140 #pragma omp depobj // expected-error {{expected depobj expression}} 141 #pragma omp depobj( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected depobj expression}} 142 #pragma omp depobj() // expected-error {{expected expression}} expected-error {{expected depobj expression}} 143 #pragma omp depobj(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}} 144 #pragma omp depobj(argc, // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}} 145 #pragma omp depobj(argc) // expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}} 146 #pragma omp depobj(S1) // expected-error {{'S1' does not refer to a value}} expected-error {{expected depobj expression}} 147 #pragma omp depobj(argc) depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}} 148 #pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}} 149 ; 150 #pragma omp depobj(x) seq_cst // expected-error {{unexpected OpenMP clause 'seq_cst' in directive '#pragma omp depobj'}} 151 #pragma omp depobj(x) depend(source: x) // omp51-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'depend'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} 152 #pragma omp depobj(x) update // expected-error {{expected '(' after 'update'}} 153 #pragma omp depobj(x) update( // expected-error {{expected ')'}} expected-note {{to match this '('}} omp51-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} omp50-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}} 154 #pragma omp depobj(x) update(sink // expected-error {{expected ')'}} expected-note {{to match this '('}} omp51-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} omp50-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}} 155 #pragma omp depobj(x) destroy destroy // expected-error {{directive '#pragma omp depobj' cannot contain more than one 'destroy' clause}} 156 #pragma omp depobj(x) update(in) update(in) // expected-error {{directive '#pragma omp depobj' cannot contain more than one 'update' clause}} 157 #pragma omp depobj(x) depend(in: argc) destroy // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} 158 #pragma omp depobj(x) destroy depend(in: argc) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} 159 #pragma omp depobj(x) depend(in: argc) update(mutexinoutset) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} 160 #pragma omp depobj(x) update(inout) destroy // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} 161 #pragma omp depobj(x) (x) depend(in: x) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} 162 #pragma omp depobj(x) (x) update(in) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} 163 #pragma omp depobj(x) depend(in: argc) depend(out:argc) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} 164 #pragma omp depend(out:x) depobj(x) // expected-error {{expected an OpenMP directive}} 165 #pragma omp destroy depobj(x) // expected-error {{expected an OpenMP directive}} 166 #pragma omp update(out) depobj(x) // expected-error {{expected an OpenMP directive}} 167 #pragma omp depobj depend(in:x) (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} expected-error {{expected addressable lvalue expression, array element, array section or array shaping expression of non 'omp_depend_t' type}} 168 #pragma omp depobj destroy (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} 169 #pragma omp depobj update(in) (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} 170 return tmain(argc); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}} 171 } 172