brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.0 KiB · 916d15f Raw
249 lines · cpp
1// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -std=c++11 -o - %s2// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -std=c++11 \3// RUN:  -DNO_INTEROP_T_DEF -o - %s4// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -std=c++11 -o - %s5// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=60 -Wno-strict-prototypes -DC -x c -o - %s6// RUN: %clang_cc1 -verify -triple x86_64-pc-windows-msvc -fms-compatibility \7// RUN:  -fopenmp -fopenmp-version=60 -Wno-strict-prototypes -DC -DWIN -x c -o - %s8 9#ifdef NO_INTEROP_T_DEF10void foo_v1(float *, void *);11// expected-error@+1 {{'omp_interop_t' must be defined when 'append_args' clause is used; include <omp.h>}}12#pragma omp declare variant(foo_v1) append_args(interop(target)) \13  match(construct={dispatch})14void foo_v1(float *);15#else16typedef void *omp_interop_t;17 18int Other;19 20#if _OPENMP >= 202011  // At least OpenMP 5.121#ifdef __cplusplus22class A {23public:24  void memberfoo_v0(float *A, float *B, int *I);25  void memberfoo_v1(float *A, float *B, int *I, omp_interop_t IOp);26 27  // expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (A::*)(float *, float *, int *)' is incompatible with type 'void (A::*)(float *, float *, int *, omp_interop_t)' with appended arguments}}28  #pragma omp declare variant(memberfoo_v0) match(construct={dispatch}) \29                        append_args(interop(target))30 31  // expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (A::*)(float *, float *, int *, omp_interop_t)' is incompatible with type 'void (A::*)(float *, float *, int *, omp_interop_t, omp_interop_t)' with appended arguments}}32  #pragma omp declare variant(memberfoo_v1) match(construct={dispatch}) \33                        append_args(interop(target),interop(target))34  void memberbar(float *A, float *B, int *I) { return; }35 36  static void smemberfoo_v0(float *A, float *B, int *I);37  static void smemberfoo_v1(float *A, float *B, int *I, omp_interop_t IOp);38 39  // expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (float *, float *, int *)' is incompatible with type 'void (float *, float *, int *)' with appended arguments}}40  #pragma omp declare variant(smemberfoo_v0) match(construct={dispatch}) \41                        append_args(interop(target))42 43  // expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (float *, float *, int *, omp_interop_t)' (aka 'void (float *, float *, int *, void *)') is incompatible with type 'void (float *, float *, int *)' with appended arguments}}44  #pragma omp declare variant(smemberfoo_v1) match(construct={dispatch}) \45                        append_args(interop(target),interop(target))46  static void smemberbar(float *A, float *B, int *I) { return; }47 48  virtual void vmemberfoo_v0(float *A, float *B, int *I);49  virtual void vmemberfoo_v1(float *A, float *B, int *I, omp_interop_t IOp);50 51  // expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (A::*)(float *, float *, int *)' is incompatible with type 'void (A::*)(float *, float *, int *, omp_interop_t)' with appended arguments}}52  #pragma omp declare variant(vmemberfoo_v0) match(construct={dispatch}) \53    append_args(interop(target))54 55  #pragma omp declare variant(vmemberfoo_v1) match(construct={dispatch}) \56    append_args(interop(target))57 58  // expected-error@+1 {{'#pragma omp declare variant' does not support virtual functions}}59  virtual void vmemberbar(float *A, float *B, int *I) { return; }60 61  virtual void pvmemberfoo_v0(float *A, float *B, int *I) = 0;62  virtual void pvmemberfoo_v1(float *A, float *B, int *I, omp_interop_t IOp) = 0;63 64  // expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (A::*)(float *, float *, int *)' is incompatible with type 'void (A::*)(float *, float *, int *, omp_interop_t)' with appended arguments}}65  #pragma omp declare variant(pvmemberfoo_v0) match(construct={dispatch}) \66    append_args(interop(target))67 68  #pragma omp declare variant(pvmemberfoo_v1) match(construct={dispatch}) \69    append_args(interop(target))70 71  // expected-error@+1 {{'#pragma omp declare variant' does not support virtual functions}}72  virtual void pvmemberbar(float *A, float *B, int *I) = 0;73};74 75template <typename T> void templatefoo_v0(const T& t);76template <typename T> void templatefoo_v1(const T& t, omp_interop_t I);77template <typename T> void templatebar(const T& t) {}78 79// expected-error@+1 {{variant in '#pragma omp declare variant' with type '<overloaded function type>' is incompatible with type 'void (const int &)' with appended arguments}}80#pragma omp declare variant(templatefoo_v0<int>) match(construct={dispatch}) \81                        append_args(interop(target))82 83// expected-error@+1 {{variant in '#pragma omp declare variant' with type '<overloaded function type>' is incompatible with type 'void (const int &)' with appended arguments}}84#pragma omp declare variant(templatefoo_v1<int>) match(construct={dispatch}) \85                        append_args(interop(target),interop(target))86void templatebar(const int &t) {}87#endif // __cplusplus88#endif // _OPENMP >= 20201189 90void foo_v1(float *AAA, float *BBB, int *I) { return; }91void foo_v2(float *AAA, float *BBB, int *I) { return; }92void foo_v3(float *AAA, float *BBB, int *I) { return; }93void foo_v4(float *AAA, float *BBB, int *I, omp_interop_t IOp) { return; }94void foo_v5(float *AAA, float *BBB, int I) { return; }95 96#if _OPENMP >= 202011 // At least OpenMP 5.197void vararg_foo(const char *fmt, omp_interop_t it, ...);98// expected-error@+3 {{'append_args' is not allowed with varargs functions}}99#pragma omp declare variant(vararg_foo) match(construct={dispatch}) \100                                        append_args(interop(target))101void vararg_bar(const char *fmt, ...) { return; }102 103// expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (const char *, omp_interop_t, ...)' (aka 'void (const char *, void *, ...)') is incompatible with type 'void (const char *)' with appended arguments}}104#pragma omp declare variant(vararg_foo) match(construct={dispatch}) \105                                        append_args(interop(target))106void vararg_bar2(const char *fmt) { return; }107 108// expected-error@+3 {{'adjust_arg' argument 'AAA' used in multiple clauses}}109#pragma omp declare variant(foo_v1)                          \110   match(construct={dispatch}, device={arch(arm)})           \111   adjust_args(need_device_ptr:AAA,BBB) adjust_args(need_device_ptr:AAA)112 113// expected-error@+3 {{'adjust_arg' argument 'AAA' used in multiple clauses}}114#pragma omp declare variant(foo_v1)                          \115   match(construct={dispatch}, device={arch(ppc)}),          \116   adjust_args(need_device_ptr:AAA) adjust_args(nothing:AAA)117 118// expected-error@+3 {{'adjust_arg' argument 'AAA' used in multiple clauses}}119#pragma omp declare variant(foo_v1)                          \120   match(construct={dispatch}, device={arch(arm)})           \121   adjust_args(need_device_ptr:AAA,BBB) adjust_args(need_device_addr:AAA)122 123// expected-error@+3 {{'adjust_arg' argument 'AAA' used in multiple clauses}}124#pragma omp declare variant(foo_v1)                          \125   match(construct={dispatch}, device={arch(ppc)}),          \126   adjust_args(need_device_addr:AAA) adjust_args(nothing:AAA)127 128// expected-error@+2 {{use of undeclared identifier 'J'}}129#pragma omp declare variant(foo_v1)                          \130   adjust_args(nothing:J)                                    \131   match(construct={dispatch}, device={arch(x86,x86_64)})132 133// expected-error@+2 {{expected reference type argument on 'adjust_args' clause with 'need_device_addr' modifier}}134#pragma omp declare variant(foo_v1)                          \135   adjust_args(need_device_addr:AAA)                         \136   match(construct={dispatch}, device={arch(x86,x86_64)})137 138// expected-error@+2 {{expected reference to one of the parameters of function 'foo'}}139#pragma omp declare variant(foo_v3)                          \140   adjust_args(nothing:Other)                                \141   match(construct={dispatch}, device={arch(x86,x86_64)})142 143// expected-error@+2 {{'adjust_args' clause requires 'dispatch' context selector}}144#pragma omp declare variant(foo_v3)                          \145   adjust_args(nothing:BBB) match(construct={target}, device={arch(arm)})146 147// expected-error@+2 {{'adjust_args' clause requires 'dispatch' context selector}}148#pragma omp declare variant(foo_v3)                          \149   adjust_args(nothing:BBB) match(device={arch(ppc)})150 151// expected-error@+1 {{expected 'match', 'adjust_args', or 'append_args' clause on 'omp declare variant' directive}}152#pragma omp declare variant(foo_v1)153 154// expected-error@+1 {{expected 'match', 'adjust_args', or 'append_args' clause on 'omp declare variant' directive}}155#pragma omp declare variant(foo_v1) other156 157// expected-error@+2 {{unexpected operation specified in 'append_args' clause, expected 'interop'}}158#pragma omp declare variant(foo_v1) match(construct={dispatch}) \159                                    append_args(foobar(target))160 161// expected-error@+2 {{directive '#pragma omp declare_variant' cannot contain more than one 'append_args' clause}}162#pragma omp declare variant(foo_v1) match(construct={dispatch}) \163                                    append_args(interop(target)) \164                                    append_args(interop(targetsync))165 166// expected-error@+2 {{'append_args' clause requires 'dispatch' context selector}}167#pragma omp declare variant(foo_v4)                          \168                    append_args(interop(target)) match(construct={target})169 170// expected-error@+2 {{'append_args' clause requires 'dispatch' context selector}}171#pragma omp declare variant(foo_v4)                          \172                    match(construct={target}) append_args(interop(target))173 174// expected-warning@+2 {{interop type 'target' cannot be specified more than once}}175#pragma omp declare variant(foo_v4) match(construct={dispatch}) \176                                    append_args(interop(target,target))177 178// expected-warning@+2 {{interop type 'targetsync' cannot be specified more than once}}179#pragma omp declare variant(foo_v4) match(construct={dispatch}) \180                                    append_args(interop(targetsync,targetsync))181 182// expected-error@+2 {{expected interop type: 'target' and/or 'targetsync'}}183#pragma omp declare variant(foo_v4) match(construct={dispatch}) \184                                    append_args(interop())185 186// expected-error@+2 {{expected interop type: 'target' and/or 'targetsync'}}187#pragma omp declare variant(foo_v4) match(construct={dispatch}) \188                                    append_args(interop(somethingelse))189 190// expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (float *, float *, int *)' is incompatible with type 'void (float *, float *, int *)' with appended arguments}}191#pragma omp declare variant(foo_v1) match(construct={dispatch}) \192                                    append_args(interop(target))193 194// expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (float *, float *, int *)' is incompatible with type 'void (float *, float *, int *)' with appended arguments}}195#pragma omp declare variant(foo_v1) match(construct={dispatch}) \196                                    append_args(interop(target),interop(targetsync))197 198// expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (float *, float *, int *, omp_interop_t)' (aka 'void (float *, float *, int *, void *)') is incompatible with type 'void (float *, float *, int *)' with appended arguments}}199#pragma omp declare variant(foo_v4) match(construct={dispatch}) \200                                    append_args(interop(target),interop(targetsync))201 202// expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (float *, float *, int *, omp_interop_t)' (aka 'void (float *, float *, int *, void *)') is incompatible with type 'void (float *, float *, int *)'}}203#pragma omp declare variant(foo_v4) match(construct={dispatch})204 205// expected-error@+3 {{incorrect 'adjust_args' type, expected 'need_device_ptr', 'need_device_addr', or 'nothing'}}206#pragma omp declare variant(foo_v1)                        \207   match(construct={dispatch}, device={arch(arm)})         \208   adjust_args(badaaop:AAA,BBB)209 210// expected-error@+3 {{incorrect 'adjust_args' type, expected 'need_device_ptr', 'need_device_addr', or 'nothing'}}211#pragma omp declare variant(foo_v1)                        \212   match(construct={dispatch}, device={arch(arm)})         \213   adjust_args(badaaop AAA,BBB)214 215#endif // _OPENMP >= 202011216#if _OPENMP < 202011  // OpenMP 5.0 or lower217// expected-error@+2 {{expected 'match' clause on 'omp declare variant' directive}}218#pragma omp declare variant(foo_v1)                            \219   adjust_args(need_device_ptr:AAA) match(device={arch(arm)})220// expected-error@+2 {{expected 'match' clause on 'omp declare variant' directive}}221#pragma omp declare variant(foo_v1)                            \222   append_args(interop(target)) match(device={arch(arm)})223#endif // _OPENMP < 202011224 225void foo(float *AAA, float *BBB, int *I) { return; }226 227// expected-error@+2 {{expected reference type argument on 'adjust_args' clause with 'need_device_addr' modifier}}228#pragma omp declare variant(foo_v5)                          \229   adjust_args(need_device_addr:I)                         \230   match(construct={dispatch}, device={arch(x86,x86_64)})231void foo5(float *AAA, float *BBB, int I) { return; }232 233#endif // NO_INTEROP_T_DEF234 235#ifdef C236void c_variant(omp_interop_t);237// expected-error@+3 {{function with '#pragma omp declare variant' must have a prototype when 'append_args' is used}}238#pragma omp declare variant(c_variant)                         \239   append_args(interop(target)) match(construct={dispatch})240void c_base() {}241#ifdef WIN242void _cdecl win_c_variant(omp_interop_t);243// expected-error@+3 {{function with '#pragma omp declare variant' must have a prototype when 'append_args' is used}}244#pragma omp declare variant(win_c_variant)                     \245   append_args(interop(target)) match(construct={dispatch})246void _cdecl win_c_base() {}247#endif // WIN248#endif249