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