From 11dcf7d2998d38755fbd1f91f19263fec48442a3 Mon Sep 17 00:00:00 2001 From: Trubnikov Sergey Date: Wed, 23 Nov 2022 07:28:55 +0000 Subject: [PATCH] misk: Add more checks for enum --- --- a/crates/evm-coder/procedural/src/abi_derive.rs +++ b/crates/evm-coder/procedural/src/abi_derive.rs @@ -58,9 +58,26 @@ }) } syn::Data::Enum(de) => { - let _ = check_repr_u8(name, &ast.attrs)?; + check_repr_u8(name, &ast.attrs)?; - // dbg!(de); + dbg!(&de); + for f in de.variants.iter().filter_map(|v| { + if !v.fields.is_empty() { + Some(Err(syn::Error::new( + v.ident.span(), + "Enumeration parameters should not have fields", + ))) + } else if v.discriminant.is_some() { + Some(Err(syn::Error::new( + v.ident.span(), + "Enumeration options should not have an explicit specified value", + ))) + } else { + None + } + }) { + f?; + } Ok(quote!()) } syn::Data::Union(_) => Err(syn::Error::new(name.span(), "Unions not supported")), --- a/crates/evm-coder/tests/abi_derive_generation.rs +++ b/crates/evm-coder/tests/abi_derive_generation.rs @@ -5,7 +5,7 @@ #[test] fn empty_struct() { let t = trybuild::TestCases::new(); - t.compile_fail("tests/build_failed/abi_derive_generation.rs"); + t.compile_fail("tests/build_failed/abi_derive_struct_generation.rs"); } #[derive(AbiCoder, PartialEq, Debug)] @@ -744,9 +744,15 @@ enum Color { Red, Green, - Blue = 255, + Blue, } #[test] fn empty() {} + + #[test] + fn bad_enums() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/build_failed/abi_derive_enum_generation.rs"); + } } --- /dev/null +++ b/crates/evm-coder/tests/build_failed/abi_derive_enum_generation.rs @@ -0,0 +1,36 @@ +use evm_coder_procedural::AbiCoder; + +#[derive(AbiCoder)] +enum NonRepr { + A, + B, + C, +} + +#[derive(AbiCoder)] +#[repr(u32)] +enum NonReprU8 { + A, + B, + C, +} + +#[derive(AbiCoder)] +#[repr(u8)] +enum RustEnum { + A(u128), + B, + C, +} + +#[derive(AbiCoder)] +#[repr(u8)] +enum WithExplicit { + A = 128, + B, + C, +} + +fn main() { + assert!(false); +} --- /dev/null +++ b/crates/evm-coder/tests/build_failed/abi_derive_enum_generation.stderr @@ -0,0 +1,23 @@ +error: Enum is not "repr(u8)" + --> tests/build_failed/abi_derive_enum_generation.rs:4:6 + | +4 | enum NonRepr { + | ^^^^^^^ + +error: Enum is not "repr(u8)" + --> tests/build_failed/abi_derive_enum_generation.rs:12:6 + | +12 | enum NonReprU8 { + | ^^^^^^^^^ + +error: Enumeration parameters should not have fields + --> tests/build_failed/abi_derive_enum_generation.rs:21:2 + | +21 | A(u128), + | ^ + +error: Enumeration options should not have an explicit specified value + --> tests/build_failed/abi_derive_enum_generation.rs:29:2 + | +29 | A = 128, + | ^ --- a/crates/evm-coder/tests/build_failed/abi_derive_generation.rs +++ /dev/null @@ -1,11 +0,0 @@ -use evm_coder_procedural::AbiCoder; - -#[derive(AbiCoder, PartialEq, Debug)] -struct EmptyStruct {} - -#[derive(AbiCoder, PartialEq, Debug)] -struct EmptyTupleStruct(); - -fn main() { - assert!(false); -} --- a/crates/evm-coder/tests/build_failed/abi_derive_generation.stderr +++ /dev/null @@ -1,11 +0,0 @@ -error: Empty structs not supported - --> tests/build_failed/abi_derive_generation.rs:4:8 - | -4 | struct EmptyStruct {} - | ^^^^^^^^^^^ - -error: Empty structs not supported - --> tests/build_failed/abi_derive_generation.rs:7:8 - | -7 | struct EmptyTupleStruct(); - | ^^^^^^^^^^^^^^^^ --- /dev/null +++ b/crates/evm-coder/tests/build_failed/abi_derive_struct_generation.rs @@ -0,0 +1,11 @@ +use evm_coder_procedural::AbiCoder; + +#[derive(AbiCoder, PartialEq, Debug)] +struct EmptyStruct {} + +#[derive(AbiCoder, PartialEq, Debug)] +struct EmptyTupleStruct(); + +fn main() { + assert!(false); +} --- /dev/null +++ b/crates/evm-coder/tests/build_failed/abi_derive_struct_generation.stderr @@ -0,0 +1,11 @@ +error: Empty structs not supported + --> tests/build_failed/abi_derive_struct_generation.rs:4:8 + | +4 | struct EmptyStruct {} + | ^^^^^^^^^^^ + +error: Empty structs not supported + --> tests/build_failed/abi_derive_struct_generation.rs:7:8 + | +7 | struct EmptyTupleStruct(); + | ^^^^^^^^^^^^^^^^ -- gitstuff