1package foo:foo;
2
3interface variants {
4  enum e1 {
5      a,
6  }
7
8  e1-arg: func(x: e1);
9  e1-result: func() -> e1;
10
11  record empty {}
12
13  variant v1 {
14      a,
15      c(e1),
16      d(string),
17      e(empty),
18      f,
19      g(u32),
20  }
21
22  v1-arg: func(x: v1);
23  v1-result: func() -> v1;
24
25  bool-arg: func(x: bool);
26  bool-result: func() -> bool;
27
28  option-arg: func(
29    a: option<bool>,
30    b: option<tuple<>>,
31    c: option<u32>,
32    d: option<e1>,
33    e: option<f32>,
34    g: option<option<bool>>,
35  );
36  option-result: func() -> tuple<
37    option<bool>,
38    option<tuple<>>,
39    option<u32>,
40    option<e1>,
41    option<f32>,
42    option<option<bool>>,
43  >;
44
45  variant casts1 {
46    a(s32),
47    b(f32),
48  }
49
50  variant casts2 {
51    a(f64),
52    b(f32),
53  }
54
55  variant casts3 {
56    a(f64),
57    b(u64),
58  }
59
60  variant casts4 {
61    a(u32),
62    b(s64),
63  }
64
65  variant casts5 {
66    a(f32),
67    b(s64),
68  }
69
70  variant casts6 {
71    a(tuple<f32, u32>),
72    b(tuple<u32, u32>),
73  }
74
75  casts: func(
76    a: casts1,
77    b: casts2,
78    c: casts3,
79    d: casts4,
80    e: casts5,
81    f: casts6,
82  ) -> tuple<
83    casts1,
84    casts2,
85    casts3,
86    casts4,
87    casts5,
88    casts6,
89  >;
90
91  result-arg: func(
92    a: result,
93    b: result<_, e1>,
94    c: result<e1>,
95    d: result<tuple<>, tuple<>>,
96    e: result<u32, v1>,
97    f: result<string, list<u8>>,
98  );
99  result-result: func() -> tuple<
100    result,
101    result<_, e1>,
102    result<e1>,
103    result<tuple<>, tuple<>>,
104    result<u32, v1>,
105    result<string, list<u8>>,
106  >;
107
108  enum my-errno {
109    bad1,
110    bad2,
111  }
112
113  return-result-sugar: func() -> result<s32, my-errno>;
114  return-result-sugar2: func() -> result<_, my-errno>;
115  return-result-sugar3: func() -> result<my-errno, my-errno>;
116  return-result-sugar4: func() -> result<tuple<s32, u32>, my-errno>;
117  return-option-sugar: func() -> option<s32>;
118  return-option-sugar2: func() -> option<my-errno>;
119
120  result-simple: func() -> result<u32, s32>;
121
122  record is-clone {
123    v1: v1,
124  }
125
126  is-clone-arg: func(a: is-clone);
127  is-clone-return: func() -> is-clone;
128}
129
130world my-world {
131  import variants;
132  export variants;
133}
134