blob: 10aefc9aa04ee1d27810a5c0a04867f2fcdc5184 [file] [log] [blame]
// 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;
}