1251e1488SMichael Kruse // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s 2251e1488SMichael Kruse // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++98 %s 3251e1488SMichael Kruse // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 %s 4251e1488SMichael Kruse 5251e1488SMichael Kruse // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s 6251e1488SMichael Kruse // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++98 %s 7251e1488SMichael Kruse // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++11 %s 8251e1488SMichael Kruse 9251e1488SMichael Kruse int temp; // expected-note {{'temp' declared here}} 10251e1488SMichael Kruse 11c972f6fdSAlexey Bataev class vec { 12251e1488SMichael Kruse private: 13251e1488SMichael Kruse int p; // expected-note {{declared private here}} 14251e1488SMichael Kruse public: 15251e1488SMichael Kruse int len; 16c972f6fdSAlexey Bataev #pragma omp declare mapper(id: vec v) map(v.len) 17251e1488SMichael Kruse double *data; 18251e1488SMichael Kruse }; 19251e1488SMichael Kruse 20251e1488SMichael Kruse #pragma omp declare mapper // expected-error {{expected '(' after 'declare mapper'}} 21251e1488SMichael Kruse #pragma omp declare mapper { // expected-error {{expected '(' after 'declare mapper'}} 22251e1488SMichael Kruse #pragma omp declare mapper( // expected-error {{expected a type}} expected-error {{expected declarator on 'omp declare mapper' directive}} 23251e1488SMichael Kruse #pragma omp declare mapper(# // expected-error {{expected a type}} expected-error {{expected declarator on 'omp declare mapper' directive}} 24251e1488SMichael Kruse #pragma omp declare mapper(v // expected-error {{unknown type name 'v'}} expected-error {{expected declarator on 'omp declare mapper' directive}} 25251e1488SMichael Kruse #pragma omp declare mapper(vec // expected-error {{expected declarator on 'omp declare mapper' directive}} 26251e1488SMichael Kruse #pragma omp declare mapper(S v // expected-error {{unknown type name 'S'}} 27251e1488SMichael Kruse #pragma omp declare mapper(vec v // expected-error {{expected ')'}} expected-note {{to match this '('}} 28251e1488SMichael Kruse #pragma omp declare mapper(aa: vec v) // expected-error {{expected at least one clause on '#pragma omp declare mapper' directive}} 29251e1488SMichael Kruse #pragma omp declare mapper(bb: vec v) private(v) // expected-error {{expected at least one clause on '#pragma omp declare mapper' directive}} // expected-error {{unexpected OpenMP clause 'private' in directive '#pragma omp declare mapper'}} 30251e1488SMichael Kruse #pragma omp declare mapper(cc: vec v) map(v) ( // expected-warning {{extra tokens at the end of '#pragma omp declare mapper' are ignored}} 31251e1488SMichael Kruse 3201f670dfSMichael Kruse #pragma omp declare mapper(++: vec v) map(v.len) // expected-error {{illegal OpenMP user-defined mapper identifier}} 33*0af7835eSAlexey Bataev #pragma omp declare mapper(id1: vec v) map(v.len, temp) // expected-error {{only variable 'v' is allowed in map clauses of this 'omp declare mapper' directive}} 34251e1488SMichael Kruse #pragma omp declare mapper(default : vec kk) map(kk.data[0:2]) // expected-note {{previous definition is here}} 35251e1488SMichael Kruse #pragma omp declare mapper(vec v) map(v.len) // expected-error {{redefinition of user-defined mapper for type 'vec' with name 'default'}} 36251e1488SMichael Kruse #pragma omp declare mapper(int v) map(v) // expected-error {{mapper type must be of struct, union or class type}} 37251e1488SMichael Kruse #pragma omp declare mapper(id2: vec v) map(v.len, v.p) // expected-error {{'p' is a private member of 'vec'}} 38251e1488SMichael Kruse 39251e1488SMichael Kruse namespace N1 { 40251e1488SMichael Kruse template <class T> 41251e1488SMichael Kruse class stack { // expected-note {{template is declared here}} 42251e1488SMichael Kruse public: 43251e1488SMichael Kruse int len; 44251e1488SMichael Kruse T *data; 45251e1488SMichael Kruse #pragma omp declare mapper(id: vec v) map(v.len) // expected-note {{previous definition is here}} 46251e1488SMichael Kruse #pragma omp declare mapper(id: vec v) map(v.len) // expected-error {{redefinition of user-defined mapper for type 'vec' with name 'id'}} 47251e1488SMichael Kruse }; 48251e1488SMichael Kruse }; 49251e1488SMichael Kruse 50251e1488SMichael Kruse #pragma omp declare mapper(default : N1::stack s) map(s.len) // expected-error {{use of class template 'N1::stack' requires template arguments}} 51251e1488SMichael Kruse #pragma omp declare mapper(id1: N1::stack<int> s) map(s.data) 52251e1488SMichael Kruse #pragma omp declare mapper(default : S<int> s) map(s.len) // expected-error {{no template named 'S'}} 53251e1488SMichael Kruse 54251e1488SMichael Kruse template <class T> foo(T a)55251e1488SMichael KruseT foo(T a) { 56251e1488SMichael Kruse #pragma omp declare mapper(id: vec v) map(v.len) // expected-note {{previous definition is here}} 57251e1488SMichael Kruse #pragma omp declare mapper(id: vec v) map(v.len) // expected-error {{redefinition of user-defined mapper for type 'vec' with name 'id'}} 58251e1488SMichael Kruse } 59251e1488SMichael Kruse fun(int arg)60251e1488SMichael Kruseint fun(int arg) { 61251e1488SMichael Kruse #pragma omp declare mapper(id: vec v) map(v.len) 62251e1488SMichael Kruse { 63251e1488SMichael Kruse #pragma omp declare mapper(id: vec v) map(v.len) // expected-note {{previous definition is here}} 64251e1488SMichael Kruse { 65251e1488SMichael Kruse #pragma omp declare mapper(id: vec v) map(v.len) 664304e9d1SMichael Kruse vec vv, v1; 67945249b5SMichael Kruse vec arr[10]; 684304e9d1SMichael Kruse #pragma omp target map(mapper) // expected-error {{use of undeclared identifier 'mapper'}} 694304e9d1SMichael Kruse {} 704304e9d1SMichael Kruse #pragma omp target map(mapper:vv) // expected-error {{expected '(' after 'mapper'}} 714304e9d1SMichael Kruse {} 724304e9d1SMichael Kruse #pragma omp target map(mapper( :vv) // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 734304e9d1SMichael Kruse {} 744304e9d1SMichael Kruse #pragma omp target map(mapper(aa :vv) // expected-error {{use of undeclared identifier 'aa'}} expected-error {{expected ')'}} expected-note {{to match this '('}} 754304e9d1SMichael Kruse {} 764304e9d1SMichael Kruse #pragma omp target map(mapper(ab) :vv) // expected-error {{missing map type}} expected-error {{cannot find a valid user-defined mapper for type 'vec' with name 'ab'}} 774304e9d1SMichael Kruse {} 7801f670dfSMichael Kruse #pragma omp target map(mapper(N2::) :vv) // expected-error {{use of undeclared identifier 'N2'}} expected-error {{illegal OpenMP user-defined mapper identifier}} 794304e9d1SMichael Kruse {} 8001f670dfSMichael Kruse #pragma omp target map(mapper(N1::) :vv) // expected-error {{illegal OpenMP user-defined mapper identifier}} 814304e9d1SMichael Kruse {} 824304e9d1SMichael Kruse #pragma omp target map(mapper(aa) :vv) // expected-error {{missing map type}} 834304e9d1SMichael Kruse {} 844304e9d1SMichael Kruse #pragma omp target map(mapper(N1::aa) alloc:vv) // expected-error {{cannot find a valid user-defined mapper for type 'vec' with name 'aa'}} 854304e9d1SMichael Kruse {} 86945249b5SMichael Kruse #pragma omp target map(mapper(N1::aa) alloc:arr[0:2]) // expected-error {{cannot find a valid user-defined mapper for type 'vec' with name 'aa'}} 87945249b5SMichael Kruse {} 88945249b5SMichael Kruse #pragma omp target map(mapper(aa) to:vv) map(close mapper(aa) from:v1) map(mapper(aa) to:arr[0]) 894304e9d1SMichael Kruse {} 904304e9d1SMichael Kruse #pragma omp target map(mapper(N1::stack<int>::id) to:vv) 914304e9d1SMichael Kruse {} 9201f670dfSMichael Kruse 9301f670dfSMichael Kruse #pragma omp target update to(mapper) // expected-error {{expected '(' after 'mapper'}} expected-error {{expected expression}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 9401f670dfSMichael Kruse #pragma omp target update to(mapper() // expected-error {{illegal OpenMP user-defined mapper identifier}} expected-error {{expected expression}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 9501f670dfSMichael Kruse #pragma omp target update to(mapper:vv) // expected-error {{expected '(' after 'mapper'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 9601f670dfSMichael Kruse #pragma omp target update to(mapper(:vv) // expected-error {{illegal OpenMP user-defined mapper identifier}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 9701f670dfSMichael Kruse #pragma omp target update to(mapper(aa :vv) // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 9801f670dfSMichael Kruse #pragma omp target update to(mapper(N2:: :vv) // expected-error {{use of undeclared identifier 'N2'}} expected-error {{illegal OpenMP user-defined mapper identifier}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 9901f670dfSMichael Kruse #pragma omp target update to(mapper(N1:: :vv) // expected-error {{illegal OpenMP user-defined mapper identifier}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 10001f670dfSMichael Kruse #pragma omp target update to(mapper(N1::aa) :vv) // expected-error {{cannot find a valid user-defined mapper for type 'vec' with name 'aa'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 10101f670dfSMichael Kruse #pragma omp target update to(mapper(ab):vv) // expected-error {{cannot find a valid user-defined mapper for type 'vec' with name 'ab'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 102945249b5SMichael Kruse #pragma omp target update to(mapper(ab):arr[0:2]) // expected-error {{cannot find a valid user-defined mapper for type 'vec' with name 'ab'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 10301f670dfSMichael Kruse #pragma omp target update to(mapper(aa) a:vv) // expected-warning {{missing ':' after ) - ignoring}} 104945249b5SMichael Kruse #pragma omp target update to(mapper(aa):vv) to(mapper(aa):arr[0]) 10501f670dfSMichael Kruse #pragma omp target update to(mapper(N1::stack<int>::id) :vv) 1060336c75cSMichael Kruse 1070336c75cSMichael Kruse #pragma omp target update from(mapper) // expected-error {{expected '(' after 'mapper'}} expected-error {{expected expression}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 1080336c75cSMichael Kruse #pragma omp target update from(mapper() // expected-error {{illegal OpenMP user-defined mapper identifier}} expected-error {{expected expression}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 1090336c75cSMichael Kruse #pragma omp target update from(mapper:vv) // expected-error {{expected '(' after 'mapper'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 1100336c75cSMichael Kruse #pragma omp target update from(mapper(:vv) // expected-error {{illegal OpenMP user-defined mapper identifier}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 1110336c75cSMichael Kruse #pragma omp target update from(mapper(aa :vv) // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 1120336c75cSMichael Kruse #pragma omp target update from(mapper(N2:: :vv) // expected-error {{use of undeclared identifier 'N2'}} expected-error {{illegal OpenMP user-defined mapper identifier}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 1130336c75cSMichael Kruse #pragma omp target update from(mapper(N1:: :vv) // expected-error {{illegal OpenMP user-defined mapper identifier}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 1140336c75cSMichael Kruse #pragma omp target update from(mapper(N1::aa) :vv) // expected-error {{cannot find a valid user-defined mapper for type 'vec' with name 'aa'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 1150336c75cSMichael Kruse #pragma omp target update from(mapper(ab):vv) // expected-error {{cannot find a valid user-defined mapper for type 'vec' with name 'ab'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 116945249b5SMichael Kruse #pragma omp target update from(mapper(ab):arr[0:2]) // expected-error {{cannot find a valid user-defined mapper for type 'vec' with name 'ab'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 1170336c75cSMichael Kruse #pragma omp target update from(mapper(aa) a:vv) // expected-warning {{missing ':' after ) - ignoring}} 118945249b5SMichael Kruse #pragma omp target update from(mapper(aa):vv) from(mapper(aa):arr[0]) 1190336c75cSMichael Kruse #pragma omp target update from(mapper(N1::stack<int>::id) :vv) 120251e1488SMichael Kruse } 121251e1488SMichael Kruse #pragma omp declare mapper(id: vec v) map(v.len) // expected-error {{redefinition of user-defined mapper for type 'vec' with name 'id'}} 122251e1488SMichael Kruse } 123251e1488SMichael Kruse return arg; 124251e1488SMichael Kruse } 125