Skip to content

Commit 8062ff6

Browse files
authored
fix: enum discriminant overflow (#1185)
1 parent 3579738 commit 8062ff6

File tree

5 files changed

+546
-5
lines changed

5 files changed

+546
-5
lines changed

packages/fuels-macros/src/derive/utils.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@ pub(crate) fn extract_variants(
6060
contents: impl IntoIterator<Item = Variant>,
6161
fuels_core_path: TokenStream,
6262
) -> Result<ExtractedVariants> {
63-
let mut discriminant = 0;
6463
let variants = contents
6564
.into_iter()
66-
.map(|variant| -> Result<_> {
65+
.enumerate()
66+
.map(|(discriminant, variant)| -> Result<_> {
6767
let is_unit = matches!(variant.fields, Fields::Unit);
6868
if has_ignore_attr(&variant.attrs) {
6969
Ok(ExtractedVariant::Ignored {
@@ -75,15 +75,16 @@ pub(crate) fn extract_variants(
7575
} else {
7676
validate_variant_type(&variant)?;
7777

78-
let current_discriminant = discriminant;
79-
discriminant += 1;
78+
let discriminant = discriminant.try_into().map_err(|_| {
79+
Error::new_spanned(&variant.ident, "Enums can not have more than 256 variants")
80+
})?;
8081

8182
Ok(ExtractedVariant::Normal {
8283
info: VariantInfo {
8384
name: variant.ident,
8485
is_unit,
8586
},
86-
discriminant: current_discriminant,
87+
discriminant,
8788
})
8889
}
8990
})
Lines changed: 264 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
1+
use fuels_macros::Tokenizable;
2+
3+
#[derive(Tokenizable)]
4+
enum MaxedOutVariantsEnum {
5+
Variant0(u8),
6+
Variant1(u8),
7+
Variant2(u8),
8+
Variant3(u8),
9+
Variant4(u8),
10+
Variant5(u8),
11+
Variant6(u8),
12+
Variant7(u8),
13+
Variant8(u8),
14+
Variant9(u8),
15+
Variant10(u8),
16+
Variant11(u8),
17+
Variant12(u8),
18+
Variant13(u8),
19+
Variant14(u8),
20+
Variant15(u8),
21+
Variant16(u8),
22+
Variant17(u8),
23+
Variant18(u8),
24+
Variant19(u8),
25+
Variant20(u8),
26+
Variant21(u8),
27+
Variant22(u8),
28+
Variant23(u8),
29+
Variant24(u8),
30+
Variant25(u8),
31+
Variant26(u8),
32+
Variant27(u8),
33+
Variant28(u8),
34+
Variant29(u8),
35+
Variant30(u8),
36+
Variant31(u8),
37+
Variant32(u8),
38+
Variant33(u8),
39+
Variant34(u8),
40+
Variant35(u8),
41+
Variant36(u8),
42+
Variant37(u8),
43+
Variant38(u8),
44+
Variant39(u8),
45+
Variant40(u8),
46+
Variant41(u8),
47+
Variant42(u8),
48+
Variant43(u8),
49+
Variant44(u8),
50+
Variant45(u8),
51+
Variant46(u8),
52+
Variant47(u8),
53+
Variant48(u8),
54+
Variant49(u8),
55+
Variant50(u8),
56+
Variant51(u8),
57+
Variant52(u8),
58+
Variant53(u8),
59+
Variant54(u8),
60+
Variant55(u8),
61+
Variant56(u8),
62+
Variant57(u8),
63+
Variant58(u8),
64+
Variant59(u8),
65+
Variant60(u8),
66+
Variant61(u8),
67+
Variant62(u8),
68+
Variant63(u8),
69+
Variant64(u8),
70+
Variant65(u8),
71+
Variant66(u8),
72+
Variant67(u8),
73+
Variant68(u8),
74+
Variant69(u8),
75+
Variant70(u8),
76+
Variant71(u8),
77+
Variant72(u8),
78+
Variant73(u8),
79+
Variant74(u8),
80+
Variant75(u8),
81+
Variant76(u8),
82+
Variant77(u8),
83+
Variant78(u8),
84+
Variant79(u8),
85+
Variant80(u8),
86+
Variant81(u8),
87+
Variant82(u8),
88+
Variant83(u8),
89+
Variant84(u8),
90+
Variant85(u8),
91+
Variant86(u8),
92+
Variant87(u8),
93+
Variant88(u8),
94+
Variant89(u8),
95+
Variant90(u8),
96+
Variant91(u8),
97+
Variant92(u8),
98+
Variant93(u8),
99+
Variant94(u8),
100+
Variant95(u8),
101+
Variant96(u8),
102+
Variant97(u8),
103+
Variant98(u8),
104+
Variant99(u8),
105+
Variant100(u8),
106+
Variant101(u8),
107+
Variant102(u8),
108+
Variant103(u8),
109+
Variant104(u8),
110+
Variant105(u8),
111+
Variant106(u8),
112+
Variant107(u8),
113+
Variant108(u8),
114+
Variant109(u8),
115+
Variant110(u8),
116+
Variant111(u8),
117+
Variant112(u8),
118+
Variant113(u8),
119+
Variant114(u8),
120+
Variant115(u8),
121+
Variant116(u8),
122+
Variant117(u8),
123+
Variant118(u8),
124+
Variant119(u8),
125+
Variant120(u8),
126+
Variant121(u8),
127+
Variant122(u8),
128+
Variant123(u8),
129+
Variant124(u8),
130+
Variant125(u8),
131+
Variant126(u8),
132+
Variant127(u8),
133+
Variant128(u8),
134+
Variant129(u8),
135+
Variant130(u8),
136+
Variant131(u8),
137+
Variant132(u8),
138+
Variant133(u8),
139+
Variant134(u8),
140+
Variant135(u8),
141+
Variant136(u8),
142+
Variant137(u8),
143+
Variant138(u8),
144+
Variant139(u8),
145+
Variant140(u8),
146+
Variant141(u8),
147+
Variant142(u8),
148+
Variant143(u8),
149+
Variant144(u8),
150+
Variant145(u8),
151+
Variant146(u8),
152+
Variant147(u8),
153+
Variant148(u8),
154+
Variant149(u8),
155+
Variant150(u8),
156+
Variant151(u8),
157+
Variant152(u8),
158+
Variant153(u8),
159+
Variant154(u8),
160+
Variant155(u8),
161+
Variant156(u8),
162+
Variant157(u8),
163+
Variant158(u8),
164+
Variant159(u8),
165+
Variant160(u8),
166+
Variant161(u8),
167+
Variant162(u8),
168+
Variant163(u8),
169+
Variant164(u8),
170+
Variant165(u8),
171+
Variant166(u8),
172+
Variant167(u8),
173+
Variant168(u8),
174+
Variant169(u8),
175+
Variant170(u8),
176+
Variant171(u8),
177+
Variant172(u8),
178+
Variant173(u8),
179+
Variant174(u8),
180+
Variant175(u8),
181+
Variant176(u8),
182+
Variant177(u8),
183+
Variant178(u8),
184+
Variant179(u8),
185+
Variant180(u8),
186+
Variant181(u8),
187+
Variant182(u8),
188+
Variant183(u8),
189+
Variant184(u8),
190+
Variant185(u8),
191+
Variant186(u8),
192+
Variant187(u8),
193+
Variant188(u8),
194+
Variant189(u8),
195+
Variant190(u8),
196+
Variant191(u8),
197+
Variant192(u8),
198+
Variant193(u8),
199+
Variant194(u8),
200+
Variant195(u8),
201+
Variant196(u8),
202+
Variant197(u8),
203+
Variant198(u8),
204+
Variant199(u8),
205+
Variant200(u8),
206+
Variant201(u8),
207+
Variant202(u8),
208+
Variant203(u8),
209+
Variant204(u8),
210+
Variant205(u8),
211+
Variant206(u8),
212+
Variant207(u8),
213+
Variant208(u8),
214+
Variant209(u8),
215+
Variant210(u8),
216+
Variant211(u8),
217+
Variant212(u8),
218+
Variant213(u8),
219+
Variant214(u8),
220+
Variant215(u8),
221+
Variant216(u8),
222+
Variant217(u8),
223+
Variant218(u8),
224+
Variant219(u8),
225+
Variant220(u8),
226+
Variant221(u8),
227+
Variant222(u8),
228+
Variant223(u8),
229+
Variant224(u8),
230+
Variant225(u8),
231+
Variant226(u8),
232+
Variant227(u8),
233+
Variant228(u8),
234+
Variant229(u8),
235+
Variant230(u8),
236+
Variant231(u8),
237+
Variant232(u8),
238+
Variant233(u8),
239+
Variant234(u8),
240+
Variant235(u8),
241+
Variant236(u8),
242+
Variant237(u8),
243+
Variant238(u8),
244+
Variant239(u8),
245+
Variant240(u8),
246+
Variant241(u8),
247+
Variant242(u8),
248+
Variant243(u8),
249+
Variant244(u8),
250+
Variant245(u8),
251+
Variant246(u8),
252+
Variant247(u8),
253+
Variant248(u8),
254+
Variant249(u8),
255+
Variant250(u8),
256+
Variant251(u8),
257+
Variant252(u8),
258+
Variant253(u8),
259+
Variant254(u8),
260+
Variant255(u8),
261+
Variant256(u8),
262+
}
263+
264+
fn main() {}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
error: Enums can not have more than 256 variants
2+
--> tests/ui/derive/tokenizable/enum_size_not_supported.rs:261:5
3+
|
4+
261 | Variant256(u8),
5+
| ^^^^^^^^^^

0 commit comments

Comments
 (0)