Skip to content

Commit a093a77

Browse files
committed
Precommit test for nonnull extern ref
1 parent 44582c9 commit a093a77

File tree

2 files changed

+127
-0
lines changed

2 files changed

+127
-0
lines changed

clang/test/CodeGen/WebAssembly/wasm-externref.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
// RUN: %clang_cc1 -triple wasm32-unknown-unknown -target-feature +reference-types -o - -emit-llvm %s | FileCheck %s
33

44
typedef __externref_t externref_t;
5+
typedef __non_null_externref_t nn_externref_t;
56

67
void helper(externref_t);
8+
void helper_2(nn_externref_t);
79

810
// CHECK-LABEL: @handle(
911
// CHECK-NEXT: entry:
@@ -16,3 +18,48 @@ void helper(externref_t);
1618
void handle(externref_t obj) {
1719
helper(obj);
1820
}
21+
22+
23+
// CHECK-LABEL: @handle_2(
24+
// CHECK-NEXT: entry:
25+
// CHECK-NEXT: [[OBJ_ADDR:%.*]] = alloca ptr addrspace(11), align 1
26+
// CHECK-NEXT: store ptr addrspace(11) [[OBJ:%.*]], ptr [[OBJ_ADDR]], align 1
27+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(11), ptr [[OBJ_ADDR]], align 1
28+
// CHECK-NEXT: call void @helper_2(ptr addrspace(11) [[TMP0]])
29+
// CHECK-NEXT: ret void
30+
//
31+
void handle_2(nn_externref_t obj) {
32+
helper_2(obj);
33+
}
34+
35+
36+
nn_externref_t socketpair_js_concat(nn_externref_t, nn_externref_t)
37+
__attribute__((import_module("wasm:js-string"), import_name("concat")));
38+
39+
nn_externref_t get_string_ref(const char *s);
40+
void print_string_ref(nn_externref_t);
41+
42+
// CHECK-LABEL: @socketpair_example(
43+
// CHECK-NEXT: entry:
44+
// CHECK-NEXT: [[STR1:%.*]] = alloca ptr addrspace(11), align 1
45+
// CHECK-NEXT: [[STR2:%.*]] = alloca ptr addrspace(11), align 1
46+
// CHECK-NEXT: [[RESULT:%.*]] = alloca ptr addrspace(11), align 1
47+
// CHECK-NEXT: [[CALL:%.*]] = call ptr addrspace(11) @get_string_ref(ptr noundef @.str)
48+
// CHECK-NEXT: store ptr addrspace(11) [[CALL]], ptr [[STR1]], align 1
49+
// CHECK-NEXT: [[CALL1:%.*]] = call ptr addrspace(11) @get_string_ref(ptr noundef @.str.1)
50+
// CHECK-NEXT: store ptr addrspace(11) [[CALL1]], ptr [[STR2]], align 1
51+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(11), ptr [[STR1]], align 1
52+
// CHECK-NEXT: [[TMP1:%.*]] = load ptr addrspace(11), ptr [[STR2]], align 1
53+
// CHECK-NEXT: [[CALL2:%.*]] = call ptr addrspace(11) @socketpair_js_concat(ptr addrspace(11) [[TMP0]], ptr addrspace(11) [[TMP1]])
54+
// CHECK-NEXT: store ptr addrspace(11) [[CALL2]], ptr [[RESULT]], align 1
55+
// CHECK-NEXT: [[TMP2:%.*]] = load ptr addrspace(11), ptr [[RESULT]], align 1
56+
// CHECK-NEXT: call void @print_string_ref(ptr addrspace(11) [[TMP2]])
57+
// CHECK-NEXT: ret void
58+
//
59+
void socketpair_example() {
60+
nn_externref_t str1 = get_string_ref("Hello, ");
61+
nn_externref_t str2 = get_string_ref("world!");
62+
nn_externref_t result = socketpair_js_concat(str1, str2);
63+
print_string_ref(result);
64+
}
65+

clang/test/Sema/wasm-refs-and-tables.c

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
12
// RUN: %clang_cc1 -fsyntax-only -verify=expected,conly -triple wasm32 -Wno-unused-value -target-feature +reference-types %s
23
// RUN: %clang_cc1 -x c++ -std=c++17 -fsyntax-only -verify=expected,cpp -triple wasm32 -Wno-unused-value -target-feature +reference-types %s
34

@@ -9,6 +10,10 @@ __externref_t r1;
910
extern __externref_t r2;
1011
static __externref_t r3;
1112

13+
__non_null_externref_t nn_r1; // expected-error {{unknown type name '__non_null_externref_t'}}
14+
extern __non_null_externref_t nn_r2; // expected-error {{unknown type name '__non_null_externref_t'}}
15+
static __non_null_externref_t nn_r3; // expected-error {{unknown type name '__non_null_externref_t'}}
16+
1217
__externref_t *t1; // expected-error {{pointer to WebAssembly reference type is not allowed}}
1318
__externref_t **t2; // expected-error {{pointer to WebAssembly reference type is not allowed}}
1419
__externref_t ******t3; // expected-error {{pointer to WebAssembly reference type is not allowed}}
@@ -19,10 +24,28 @@ __externref_t t7[0]; // expected-error {{WebAssembly table must be s
1924
static __externref_t t8[0][0]; // expected-error {{multi-dimensional arrays of WebAssembly references are not allowed}}
2025
static __externref_t (*t9)[0]; // expected-error {{cannot form a pointer to a WebAssembly table}}
2126

27+
__non_null_externref_t *nn_t1; // expected-error {{unknown type name '__non_null_externref_t'}}
28+
__non_null_externref_t **nn_t2; // expected-error {{unknown type name '__non_null_externref_t'}}
29+
__non_null_externref_t ******nn_t3; // expected-error {{unknown type name '__non_null_externref_t'}}
30+
static __non_null_externref_t nn_t4[3]; // expected-error {{unknown type name '__non_null_externref_t'}}
31+
static __non_null_externref_t nn_t5[]; // expected-error {{unknown type name '__non_null_externref_t'}} \
32+
// cpp-error {{definition of variable with array type needs an explicit size or an initializer}}
33+
static __non_null_externref_t nn_t6[] = {0}; // expected-error {{unknown type name '__non_null_externref_t'}}
34+
__non_null_externref_t nn_t7[0]; // expected-error {{unknown type name '__non_null_externref_t'}}
35+
static __non_null_externref_t nn_t8[0][0]; // expected-error {{unknown type name '__non_null_externref_t'}}
36+
static __non_null_externref_t (*nn_t9)[0]; // conly-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit in}} \
37+
// conly-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit in}} \
38+
// conly-error {{function cannot return array type 'int[0]'}} \
39+
// cpp-error {{unknown type name '__non_null_externref_t'}}
40+
2241
static __externref_t table[0];
2342
static __externref_t other_table[0] = {};
2443
static __externref_t another_table[] = {}; // expected-error {{only zero-length WebAssembly tables are currently supported}}
2544

45+
static __non_null_externref_t nn_table[0]; // expected-error {{unknown type name '__non_null_externref_t'}}
46+
static __non_null_externref_t nn_other_table[0] = {}; // expected-error {{unknown type name '__non_null_externref_t'}}
47+
static __non_null_externref_t nn_another_table[] = {}; // expected-error {{unknown type name '__non_null_externref_t'}}
48+
2649
struct s {
2750
__externref_t f1; // expected-error {{field has sizeless type '__externref_t'}}
2851
__externref_t f2[0]; // expected-error {{field has sizeless type '__externref_t'}}
@@ -33,6 +56,19 @@ struct s {
3356
__externref_t (*f7)[0]; // expected-error {{cannot form a pointer to a WebAssembly table}}
3457
};
3558

59+
60+
struct nn_s {
61+
__non_null_externref_t nn_f1; // expected-error {{unknown type name '__non_null_externref_t'}}
62+
__non_null_externref_t nn_f2[0]; // expected-error {{unknown type name '__non_null_externref_t'}}
63+
__non_null_externref_t nn_f3[]; // expected-error {{unknown type name '__non_null_externref_t'}}
64+
__non_null_externref_t nn_f4[0][0]; // expected-error {{unknown type name '__non_null_externref_t'}}
65+
__non_null_externref_t *nn_f5; // expected-error {{unknown type name '__non_null_externref_t'}}
66+
__non_null_externref_t ****nn_f6; // expected-error {{unknown type name '__non_null_externref_t'}}
67+
__non_null_externref_t (*nn_f7)[0]; // conly-error {{type name requires a specifier or qualifier}} \
68+
// conly-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} \
69+
// cpp-error {{unknown type name '__non_null_externref_t'}}
70+
};
71+
3672
union u {
3773
__externref_t f1; // expected-error {{field has sizeless type '__externref_t'}}
3874
__externref_t f2[0]; // expected-error {{field has sizeless type '__externref_t'}}
@@ -43,17 +79,48 @@ union u {
4379
__externref_t (*f7)[0]; // expected-error {{cannot form a pointer to a WebAssembly table}}
4480
};
4581

82+
83+
union nn_u {
84+
__non_null_externref_t nn_f1; // expected-error {{unknown type name '__non_null_externref_t'}}
85+
__non_null_externref_t nn_f2[0]; // expected-error {{unknown type name '__non_null_externref_t'}}
86+
__non_null_externref_t nn_f3[]; // expected-error {{unknown type name '__non_null_externref_t'}}
87+
__non_null_externref_t nn_f4[0][0]; // expected-error {{unknown type name '__non_null_externref_t'}}
88+
__non_null_externref_t *nn_f5; // expected-error {{unknown type name '__non_null_externref_t'}}
89+
__non_null_externref_t ****nn_f6; // expected-error {{unknown type name '__non_null_externref_t'}}
90+
__non_null_externref_t (*f7)[0]; // conly-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} \
91+
// conly-error {{type name requires a specifier or qualifier}} \
92+
// cpp-error {{unknown type name '__non_null_externref_t'}}
93+
};
94+
4695
void illegal_argument_1(__externref_t table[]); // expected-error {{cannot use WebAssembly table as a function parameter}}
4796
void illegal_argument_2(__externref_t table[0][0]); // expected-error {{multi-dimensional arrays of WebAssembly references are not allowed}}
4897
void illegal_argument_3(__externref_t *table); // expected-error {{pointer to WebAssembly reference type is not allowed}}
4998
void illegal_argument_4(__externref_t ***table); // expected-error {{pointer to WebAssembly reference type is not allowed}}
5099
void illegal_argument_5(__externref_t (*table)[0]); // expected-error {{cannot form a pointer to a WebAssembly table}}
51100
void illegal_argument_6(__externref_t table[0]); // expected-error {{cannot use WebAssembly table as a function parameter}}
52101

102+
void illegal_nn_argument_1(__non_null_externref_t table[]); // expected-error {{unknown type name '__non_null_externref_t'}}
103+
void illegal_nn_argument_2(__non_null_externref_t table[0][0]); // expected-error {{unknown type name '__non_null_externref_t'}}
104+
void illegal_nn_argument_3(__non_null_externref_t *table); // expected-error {{unknown type name '__non_null_externref_t'}}
105+
void illegal_nn_argument_4(__non_null_externref_t ***table); // expected-error {{unknown type name '__non_null_externref_t'}}
106+
void illegal_nn_argument_5(__non_null_externref_t (*table)[0]); // conly-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit in}} \
107+
// conly-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit in}} \
108+
// conly-error {{function cannot return array type 'int[0]'}} \
109+
// cpp-error {{variable has incomplete type 'void'}} \
110+
// cpp-error {{use of undeclared identifier '__non_null_externref_t'}}
111+
void illegal_nn_argument_6(__non_null_externref_t table[0]); // expected-error {{unknown type name '__non_null_externref_t'}}
112+
53113
__externref_t *illegal_return_1(); // expected-error {{pointer to WebAssembly reference type is not allowed}}
54114
__externref_t ***illegal_return_2(); // expected-error {{pointer to WebAssembly reference type is not allowed}}
55115
__externref_t (*illegal_return_3())[0]; // expected-error {{cannot form a pointer to a WebAssembly table}}
56116

117+
__non_null_externref_t *illegal_nn_return_1(); // expected-error {{unknown type name '__non_null_externref_t'}}
118+
__non_null_externref_t ***illegal_nn_return_2(); // expected-error {{unknown type name '__non_null_externref_t'}}
119+
__non_null_externref_t (*illegal_nn_return_3())[0]; // conly-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit in}} \
120+
// conly-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit in}} \
121+
// conly-error {{function cannot return array type 'int[0]'}} \
122+
// cpp-error {{unknown type name '__non_null_externref_t'}}
123+
57124
void varargs(int, ...);
58125
typedef void (*__funcref funcref_t)();
59126
typedef void (*__funcref __funcref funcref_fail_t)(); // expected-warning {{attribute '__funcref' is already applied}}
@@ -133,3 +200,16 @@ void foo() {
133200
void *ret_void_ptr() {
134201
return table; // expected-error {{cannot return a WebAssembly table}}
135202
}
203+
204+
// checks all related assignment from extern ref to non null extern ref and vice versa
205+
void externref_assignment(__externref_t er, __non_null_externref_t nn_er) { // expected-error {{unknown type name '__non_null_externref_t'}}
206+
__externref_t asg_1 = er;
207+
__externref_t asg_2 = nn_er;
208+
209+
__non_null_externref_t nn_asg_1 = er; // conly-error {{expected ';' after expression}} \
210+
// conly-error {{use of undeclared identifier 'nn_asg_1'}} \
211+
// cpp-error {{unknown type name '__non_null_externref_t'}}
212+
__non_null_externref_t nn_asg_2 = nn_er; // conly-error {{expected ';' after expression}} \
213+
// conly-error {{use of undeclared identifier 'nn_asg_2'}} \
214+
// cpp-error {{unknown type name '__non_null_externref_t'}}
215+
}

0 commit comments

Comments
 (0)