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