diff options
| author | Jorge Aparicio <jorge@japaric.io> | 2019-02-23 22:35:29 +0100 |
|---|---|---|
| committer | Jorge Aparicio <jorge@japaric.io> | 2019-02-23 22:35:29 +0100 |
| commit | 73529ea650573196762ee4135a37682845501255 (patch) | |
| tree | 078c047e4605c79da7c50aa919e5ca7f588d31b0 | |
| parent | 6b61cd2e3ff26d96615a7bfc386077ccf6505c28 (diff) | |
reject duplicate arguments in #[interrupt] and #[exception]
This program was being accepted:
``` rust
#[task(
capacity = 1,
capacity = 2,
priority = 1,
priority = 2,
)]
fn foo() {}
```
now it will trigger a compiler error
| -rw-r--r-- | macros/src/syntax.rs | 14 | ||||
| -rw-r--r-- | tests/cfail/duplicate-args-2.rs | 24 | ||||
| -rw-r--r-- | tests/cfail/duplicate-args.rs | 24 |
3 files changed, 62 insertions, 0 deletions
diff --git a/macros/src/syntax.rs b/macros/src/syntax.rs index 581eb83..9771ea9 100644 --- a/macros/src/syntax.rs +++ b/macros/src/syntax.rs @@ -937,6 +937,13 @@ fn parse_args(input: ParseStream<'_>, accept_capacity: bool) -> parse::Result<Ta let ident_s = ident.to_string(); match &*ident_s { "capacity" if accept_capacity => { + if capacity.is_some() { + return Err(parse::Error::new( + ident.span(), + "argument appears more than once", + )); + } + // #lit let lit: LitInt = content.parse()?; @@ -958,6 +965,13 @@ fn parse_args(input: ParseStream<'_>, accept_capacity: bool) -> parse::Result<Ta capacity = Some(value as u8); } "priority" => { + if priority.is_some() { + return Err(parse::Error::new( + ident.span(), + "argument appears more than once", + )); + } + // #lit let lit: LitInt = content.parse()?; diff --git a/tests/cfail/duplicate-args-2.rs b/tests/cfail/duplicate-args-2.rs new file mode 100644 index 0000000..1a196e9 --- /dev/null +++ b/tests/cfail/duplicate-args-2.rs @@ -0,0 +1,24 @@ +#![no_main] +#![no_std] + +extern crate lm3s6965; +extern crate panic_halt; +extern crate rtfm; + +use rtfm::app; + +#[app(device = lm3s6965)] +const APP: () = { + #[init] + fn init() {} + + #[task( + priority = 1, + priority = 2, //~ ERROR argument appears more than once + )] + fn foo() {} + + extern "C" { + fn UART0(); + } +}; diff --git a/tests/cfail/duplicate-args.rs b/tests/cfail/duplicate-args.rs new file mode 100644 index 0000000..a946bae --- /dev/null +++ b/tests/cfail/duplicate-args.rs @@ -0,0 +1,24 @@ +#![no_main] +#![no_std] + +extern crate lm3s6965; +extern crate panic_halt; +extern crate rtfm; + +use rtfm::app; + +#[app(device = lm3s6965)] +const APP: () = { + #[init] + fn init() {} + + #[task( + capacity = 1, + capacity = 2, //~ ERROR argument appears more than once + )] + fn foo() {} + + extern "C" { + fn UART0(); + } +}; |
