1// RUN: mlir-opt --allow-unregistered-dialect -split-input-file -verify-diagnostics %s
2
3func.func @array_of_void() {
4  // expected-error @+1 {{invalid array element type}}
5  "some.op"() : () -> !llvm.array<4 x void>
6}
7
8// -----
9
10func.func @function_returning_function() {
11  // expected-error @+1 {{invalid function result type}}
12  "some.op"() : () -> !llvm.func<func<void ()> ()>
13}
14
15// -----
16
17func.func @function_taking_function() {
18  // expected-error @+1 {{invalid function argument type}}
19  "some.op"() : () -> !llvm.func<void (func<void ()>)>
20}
21
22// -----
23
24func.func @void_pointer() {
25  // expected-error @+1 {{invalid pointer element type}}
26  "some.op"() : () -> !llvm.ptr<void>
27}
28
29// -----
30
31func.func @repeated_struct_name() {
32  "some.op"() : () -> !llvm.struct<"a", (ptr<struct<"a">>)>
33  // expected-error @+1 {{identified type already used with a different body}}
34  "some.op"() : () -> !llvm.struct<"a", (i32)>
35}
36
37// -----
38
39func.func @repeated_struct_name_packed() {
40  "some.op"() : () -> !llvm.struct<"a", packed (i32)>
41  // expected-error @+1 {{identified type already used with a different body}}
42  "some.op"() : () -> !llvm.struct<"a", (i32)>
43}
44
45// -----
46
47func.func @repeated_struct_opaque() {
48  "some.op"() : () -> !llvm.struct<"a", opaque>
49  // expected-error @+1 {{identified type already used with a different body}}
50  "some.op"() : () -> !llvm.struct<"a", ()>
51}
52
53// -----
54
55func.func @repeated_struct_opaque_non_empty() {
56  "some.op"() : () -> !llvm.struct<"a", opaque>
57  // expected-error @+1 {{identified type already used with a different body}}
58  "some.op"() : () -> !llvm.struct<"a", (i32, i32)>
59}
60
61// -----
62
63func.func @repeated_struct_opaque_redefinition() {
64  "some.op"() : () -> !llvm.struct<"a", ()>
65  // expected-error @+1 {{redeclaring defined struct as opaque}}
66  "some.op"() : () -> !llvm.struct<"a", opaque>
67}
68
69// -----
70
71func.func @struct_literal_opaque() {
72  // expected-error @+1 {{only identified structs can be opaque}}
73  "some.op"() : () -> !llvm.struct<opaque>
74}
75
76// -----
77
78func.func @unexpected_type() {
79  // expected-error @+1 {{unexpected type, expected keyword}}
80  "some.op"() : () -> !llvm.tensor<*xf32>
81}
82
83// -----
84
85func.func @unexpected_type() {
86  // expected-error @+1 {{unknown LLVM type}}
87  "some.op"() : () -> !llvm.ifoo
88}
89
90// -----
91
92func.func @explicitly_opaque_struct() {
93  "some.op"() : () -> !llvm.struct<"a", opaque>
94  // expected-error @+1 {{identified type already used with a different body}}
95  "some.op"() : () -> !llvm.struct<"a", ()>
96}
97
98// -----
99
100func.func @literal_struct_with_void() {
101  // expected-error @+1 {{invalid LLVM structure element type}}
102  "some.op"() : () -> !llvm.struct<(void)>
103}
104
105// -----
106
107func.func @identified_struct_with_void() {
108  // expected-error @+1 {{invalid LLVM structure element type}}
109  "some.op"() : () -> !llvm.struct<"a", (void)>
110}
111
112// -----
113
114func.func @dynamic_vector() {
115  // expected-error @+1 {{expected '? x <integer> x <type>' or '<integer> x <type>'}}
116  "some.op"() : () -> !llvm.vec<? x ptr<f32>>
117}
118
119// -----
120
121func.func @dynamic_scalable_vector() {
122  // expected-error @+1 {{expected '? x <integer> x <type>' or '<integer> x <type>'}}
123  "some.op"() : () -> !llvm.vec<?x? x ptr<f32>>
124}
125
126// -----
127
128func.func @unscalable_vector() {
129  // expected-error @+1 {{expected '? x <integer> x <type>' or '<integer> x <type>'}}
130  "some.op"() : () -> !llvm.vec<4x4 x ptr<i32>>
131}
132
133// -----
134
135func.func @zero_vector() {
136  // expected-error @+1 {{the number of vector elements must be positive}}
137  "some.op"() : () -> !llvm.vec<0 x ptr<i32>>
138}
139
140// -----
141
142func.func @nested_vector() {
143  // expected-error @+1 {{invalid vector element type}}
144  "some.op"() : () -> !llvm.vec<2 x vector<2xi32>>
145}
146
147// -----
148
149func.func @scalable_void_vector() {
150  // expected-error @+1 {{invalid vector element type}}
151  "some.op"() : () -> !llvm.vec<?x4 x void>
152}
153
154// -----
155
156// expected-error @+1 {{unexpected type, expected keyword}}
157func.func private @unexpected_type() -> !llvm.tensor<*xf32>
158
159// -----
160
161// expected-error @+1 {{unexpected type, expected keyword}}
162func.func private @unexpected_type() -> !llvm.f32
163
164// -----
165
166// expected-error @below {{cannot use !llvm.vec for built-in primitives, use 'vector' instead}}
167func.func private @llvm_vector_primitive() -> !llvm.vec<4 x f32>
168