From db748659ba87335ef004df855e3f1b297cdbd052 Mon Sep 17 00:00:00 2001 From: Marcos Henrich Date: Tue, 17 Sep 2024 12:40:18 +0100 Subject: [PATCH] Fixes unreachable on invalid cfg attribute arg. (#6553) ## Description We now throw an error that enforces cfg arg to be a valid one. Fixes #6326 ## Checklist - [x] I have linked to any relevant issues. - [x] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [x] I have added tests that prove my fix is effective or that my feature works. - [x] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [x] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [x] I have requested a review from the relevant team or maintainers. --- .../src/transform/to_parsed_lang/convert_parse_tree.rs | 9 +++++++-- sway-error/src/convert_parse_tree_error.rs | 3 +++ .../should_fail/invalid_cfg_arg/Forc.lock | 3 +++ .../should_fail/invalid_cfg_arg/Forc.toml | 6 ++++++ .../should_fail/invalid_cfg_arg/src/main.sw | 2 ++ .../should_fail/invalid_cfg_arg/test.toml | 10 ++++++++++ 6 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/Forc.lock create mode 100644 test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/Forc.toml create mode 100644 test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/src/main.sw create mode 100644 test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/test.toml diff --git a/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs b/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs index 642badfeadf..4144d0b085c 100644 --- a/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs +++ b/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs @@ -4943,8 +4943,13 @@ pub fn cfg_eval( } }, _ => { - // Already checked with `AttributeKind::expected_args_*` - unreachable!("cfg attribute should only have the `target` or the `program_type` argument"); + return Err(handler.emit_err( + ConvertParseTreeError::InvalidCfgArg { + span: arg.span(), + value: arg.name.as_str().to_string(), + } + .into(), + )); } } } diff --git a/sway-error/src/convert_parse_tree_error.rs b/sway-error/src/convert_parse_tree_error.rs index 2fdfdc58d75..6c909e2016e 100644 --- a/sway-error/src/convert_parse_tree_error.rs +++ b/sway-error/src/convert_parse_tree_error.rs @@ -119,6 +119,8 @@ pub enum ConvertParseTreeError { ExpectedCfgProgramTypeArgValue { span: Span }, #[error("Expected \"true\" or \"false\" for experimental_new_encoding")] ExpectedExperimentalNewEncodingArgValue { span: Span }, + #[error("Unexpected attribute value: \"{value}\" for attribute: \"cfg\"")] + InvalidCfgArg { span: Span, value: String }, } impl Spanned for ConvertParseTreeError { @@ -182,6 +184,7 @@ impl Spanned for ConvertParseTreeError { ConvertParseTreeError::InvalidCfgProgramTypeArgValue { span, .. } => span.clone(), ConvertParseTreeError::ExpectedCfgProgramTypeArgValue { span } => span.clone(), ConvertParseTreeError::ExpectedExperimentalNewEncodingArgValue { span } => span.clone(), + ConvertParseTreeError::InvalidCfgArg { span, .. } => span.clone(), } } } diff --git a/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/Forc.lock b/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/Forc.lock new file mode 100644 index 00000000000..1cef6b3f7a1 --- /dev/null +++ b/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/Forc.lock @@ -0,0 +1,3 @@ +[[package]] +name = "invalid_cfg_arg" +source = "member" diff --git a/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/Forc.toml b/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/Forc.toml new file mode 100644 index 00000000000..582fa8b5e47 --- /dev/null +++ b/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/Forc.toml @@ -0,0 +1,6 @@ +[project] +name = "invalid_cfg_arg" +authors = ["Fuel Labs "] +entry = "main.sw" +license = "Apache-2.0" +implicit-std = false diff --git a/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/src/main.sw new file mode 100644 index 00000000000..c9ad0835d76 --- /dev/null +++ b/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/src/main.sw @@ -0,0 +1,2 @@ +predicate; +#[cfg(c)] a diff --git a/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/test.toml b/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/test.toml new file mode 100644 index 00000000000..1f48bdf0556 --- /dev/null +++ b/test/src/e2e_vm_tests/test_programs/should_fail/invalid_cfg_arg/test.toml @@ -0,0 +1,10 @@ +category = "fail" + +# check: $()#[cfg(c)] a +# nextln: $()Unexpected attribute value: "c" for attribute: "cfg" expected value "target" or "program_type" or "experimental_new_encoding" + +# check: $()#[cfg(c)] a +# nextln: $()Expected an item. + +# check: $()#[cfg(c)] a +# nextln: $()Unexpected attribute value: "c" for attribute: "cfg" \ No newline at end of file