| /* Inspired by 'gcc.target/nvptx/abi-struct-arg.c', 'gcc.target/nvptx/abi-struct-ret.c'. */ |
| |
| /* See also '../libgomp.c-c++-common/target-abi-struct-1.c'. */ |
| |
| /* To exercise PR119835 (if optimizations enabled): disable inlining, so that |
| GIMPLE passes still see the functions that return aggregate types. */ |
| #pragma GCC optimize "-fno-inline" |
| |
| typedef struct {} empty; /* See 'gcc/doc/extend.texi', "Empty Structures". */ |
| typedef struct {char a;} schar; |
| typedef struct {short a;} sshort; |
| typedef struct {int a;} sint; |
| typedef struct {long long a;} slonglong; |
| typedef struct {int a, b[12];} sint_13; |
| |
| #pragma omp declare target |
| |
| #define M(T) ({T t; t.a = sizeof t; t;}) |
| |
| static __SIZE_TYPE__ empty_a; |
| #pragma acc declare create(empty_a) |
| #pragma acc routine |
| static empty rempty(void) |
| { |
| return ({empty t; empty_a = sizeof t; t;}); |
| } |
| |
| #pragma acc routine |
| static schar rschar(void) |
| { |
| return M(schar); |
| } |
| |
| #pragma acc routine |
| static sshort rsshort(void) |
| { |
| return M(sshort); |
| } |
| |
| #pragma acc routine |
| static sint rsint(void) |
| { |
| return M(sint); |
| } |
| |
| #pragma acc routine |
| static slonglong rslonglong(void) |
| { |
| return M(slonglong); |
| } |
| |
| #pragma acc routine |
| static sint_13 rsint_13(void) |
| { |
| return M(sint_13); |
| } |
| |
| #pragma acc routine |
| static void aempty(empty empty) |
| { |
| (void) empty; |
| |
| __SIZE_TYPE__ empty_a_exp; |
| #ifndef __cplusplus |
| empty_a_exp = 0; |
| #else |
| empty_a_exp = sizeof (char); |
| #endif |
| if (empty_a != empty_a_exp) |
| __builtin_abort(); |
| } |
| |
| #pragma acc routine |
| static void aschar(schar schar) |
| { |
| if (schar.a != sizeof (char)) |
| __builtin_abort(); |
| } |
| |
| #pragma acc routine |
| static void asshort(sshort sshort) |
| { |
| if (sshort.a != sizeof (short)) |
| __builtin_abort(); |
| } |
| |
| #pragma acc routine |
| static void asint(sint sint) |
| { |
| if (sint.a != sizeof (int)) |
| __builtin_abort(); |
| } |
| |
| #pragma acc routine |
| static void aslonglong(slonglong slonglong) |
| { |
| if (slonglong.a != sizeof (long long)) |
| __builtin_abort(); |
| } |
| |
| #pragma acc routine |
| static void asint_13(sint_13 sint_13) |
| { |
| if (sint_13.a != (sizeof (int) * 13)) |
| __builtin_abort(); |
| } |
| |
| #pragma omp end declare target |
| |
| int main() |
| { |
| #pragma omp target |
| #pragma acc serial |
| /* { dg-bogus {using 'vector_length \(32\)', ignoring 1} {} { target openacc_nvidia_accel_selected xfail *-*-* } .-1 } */ |
| { |
| aempty(rempty()); |
| aschar(rschar()); |
| asshort(rsshort()); |
| asint(rsint()); |
| aslonglong(rslonglong()); |
| asint_13(rsint_13()); |
| } |
| |
| return 0; |
| } |