| // RUN: %clang_cc1 -fsyntax-only -verify -triple wasm32 -target-feature +reference-types %s |
| |
| // Note: As WebAssembly references are sizeless types, we don't exhaustively |
| // test for cases covered by sizeless-1.c and similar tests. |
| |
| // Unlike standard sizeless types, reftype globals are supported. |
| __externref_t r1; |
| extern __externref_t r2; |
| static __externref_t r3; |
| |
| __externref_t *t1; // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| __externref_t **t2; // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| __externref_t ******t3; // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| static __externref_t t4[3]; // expected-error {{array has sizeless element type '__externref_t'}} |
| static __externref_t t5[]; // expected-error {{array has sizeless element type '__externref_t'}} |
| static __externref_t t6[] = {0}; // expected-error {{array has sizeless element type '__externref_t'}} |
| __externref_t t7[0]; // expected-error {{array has sizeless element type '__externref_t'}} |
| static __externref_t t8[0][0]; // expected-error {{array has sizeless element type '__externref_t'}} |
| |
| static __externref_t table[0]; // expected-error {{array has sizeless element type '__externref_t'}} |
| |
| struct s { |
| __externref_t f1; // expected-error {{field has sizeless type '__externref_t'}} |
| __externref_t f2[0]; // expected-error {{array has sizeless element type '__externref_t'}} |
| __externref_t f3[]; // expected-error {{array has sizeless element type '__externref_t'}} |
| __externref_t f4[0][0]; // expected-error {{array has sizeless element type '__externref_t'}} |
| __externref_t *f5; // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| __externref_t ****f6; // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| }; |
| |
| union u { |
| __externref_t f1; // expected-error {{field has sizeless type '__externref_t'}} |
| __externref_t f2[0]; // expected-error {{array has sizeless element type '__externref_t'}} |
| __externref_t f3[]; // expected-error {{array has sizeless element type '__externref_t'}} |
| __externref_t f4[0][0]; // expected-error {{array has sizeless element type '__externref_t'}} |
| __externref_t *f5; // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| __externref_t ****f6; // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| }; |
| |
| void illegal_argument_1(__externref_t table[]); // expected-error {{array has sizeless element type '__externref_t'}} |
| void illegal_argument_2(__externref_t table[0][0]); // expected-error {{array has sizeless element type '__externref_t'}} |
| void illegal_argument_3(__externref_t *table); // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| void illegal_argument_4(__externref_t ***table); // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| |
| __externref_t *illegal_return_1(); // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| __externref_t ***illegal_return_2(); // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| |
| void varargs(int, ...); |
| typedef void (*__funcref funcref_t)(); |
| typedef void (*__funcref __funcref funcref_fail_t)(); // expected-warning {{attribute '__funcref' is already applied}} |
| |
| __externref_t func(__externref_t ref) { |
| &ref; // expected-error {{cannot take address of WebAssembly reference}} |
| int foo = 40; |
| (__externref_t *)(&foo); // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| (__externref_t ****)(&foo); // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| sizeof(ref); // expected-error {{invalid application of 'sizeof' to sizeless type '__externref_t'}} |
| sizeof(__externref_t); // expected-error {{invalid application of 'sizeof' to sizeless type '__externref_t'}} |
| sizeof(__externref_t[0]); // expected-error {{array has sizeless element type '__externref_t'}} |
| sizeof(__externref_t[0][0]); // expected-error {{array has sizeless element type '__externref_t'}} |
| sizeof(__externref_t *); // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| sizeof(__externref_t ***); // expected-error {{pointer to WebAssembly reference type is not allowed}}; |
| // expected-warning@+1 {{'_Alignof' applied to an expression is a GNU extension}} |
| _Alignof(ref); // expected-error {{invalid application of 'alignof' to sizeless type '__externref_t'}} |
| _Alignof(__externref_t); // expected-error {{invalid application of 'alignof' to sizeless type '__externref_t'}} |
| _Alignof(__externref_t[]); // expected-error {{array has sizeless element type '__externref_t'}} |
| _Alignof(__externref_t[0][0]); // expected-error {{array has sizeless element type '__externref_t'}} |
| _Alignof(__externref_t *); // expected-error {{pointer to WebAssembly reference type is not allowed}} |
| _Alignof(__externref_t ***); // expected-error {{pointer to WebAssembly reference type is not allowed}}; |
| varargs(1, ref); // expected-error {{cannot pass expression of type '__externref_t' to variadic function}} |
| |
| funcref_t func = __builtin_wasm_ref_null_func(0); // expected-error {{too many arguments to function call, expected 0, have 1}} |
| |
| return ref; |
| } |