target: Target,
item: Option<ItemLike<'_>>,
) -> bool {
- if let Target::Fn | Target::Method(..) | Target::ForeignFn = target {
- let mut invalid_args = vec![];
- for meta in attr.meta_item_list().expect("no meta item list") {
- if let Some(LitKind::Int(val, _)) = meta.literal().map(|lit| &lit.kind) {
- if let Some(ItemLike::Item(Item {
- kind: ItemKind::Fn(FnSig { decl, .. }, ..),
- ..
- }))
- | Some(ItemLike::ForeignItem(ForeignItem {
- kind: ForeignItemKind::Fn(decl, ..),
- ..
- })) = item
- {
- let arg_count = decl.inputs.len() as u128;
- if *val >= arg_count {
- let span = meta.span();
- self.tcx
- .sess
- .struct_span_err(span, "index exceeds number of arguments")
- .span_label(
- span,
- format!(
- "there {} only {} argument{}",
- if arg_count != 1 { "are" } else { "is" },
- arg_count,
- pluralize!(arg_count)
- ),
- )
- .emit();
- return false;
- }
- } else {
- bug!("should be a function item");
+ let is_function = matches!(target, Target::Fn | Target::Method(..) | Target::ForeignFn);
+ if !is_function {
+ self.tcx
+ .sess
+ .struct_span_err(attr.span, "attribute should be applied to a function")
+ .span_label(*span, "not a function")
+ .emit();
+ return false;
+ }
+
+ let list = match attr.meta_item_list() {
+ // The attribute form is validated on AST.
+ None => return false,
+ Some(it) => it,
+ };
+
+ let mut invalid_args = vec![];
+ for meta in list {
+ if let Some(LitKind::Int(val, _)) = meta.literal().map(|lit| &lit.kind) {
+ if let Some(ItemLike::Item(Item {
+ kind: ItemKind::Fn(FnSig { decl, .. }, ..),
+ ..
+ }))
+ | Some(ItemLike::ForeignItem(ForeignItem {
+ kind: ForeignItemKind::Fn(decl, ..),
+ ..
+ })) = item
+ {
+ let arg_count = decl.inputs.len() as u128;
+ if *val >= arg_count {
+ let span = meta.span();
+ self.tcx
+ .sess
+ .struct_span_err(span, "index exceeds number of arguments")
+ .span_label(
+ span,
+ format!(
+ "there {} only {} argument{}",
+ if arg_count != 1 { "are" } else { "is" },
+ arg_count,
+ pluralize!(arg_count)
+ ),
+ )
+ .emit();
+ return false;
}
} else {
- invalid_args.push(meta.span());
+ bug!("should be a function item");
}
- }
- if !invalid_args.is_empty() {
- self.tcx
- .sess
- .struct_span_err(invalid_args, "arguments should be non-negative integers")
- .emit();
- false
} else {
- true
+ invalid_args.push(meta.span());
}
- } else {
+ }
+
+ if !invalid_args.is_empty() {
self.tcx
.sess
- .struct_span_err(attr.span, "attribute should be applied to a function")
- .span_label(*span, "not a function")
+ .struct_span_err(invalid_args, "arguments should be non-negative integers")
.emit();
false
+ } else {
+ true
}
}
|
= help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.)
+error: malformed `rustc_args_required_const` attribute input
+ --> $DIR/invalid-rustc_args_required_const-arguments.rs:26:1
+ |
+LL | #[rustc_args_required_const]
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: must be of the form: `#[rustc_args_required_const(N)]`
+
+error: malformed `rustc_args_required_const` attribute input
+ --> $DIR/invalid-rustc_args_required_const-arguments.rs:29:1
+ |
+LL | #[rustc_args_required_const = 1]
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: must be of the form: `#[rustc_args_required_const(N)]`
+
error: index exceeds number of arguments
--> $DIR/invalid-rustc_args_required_const-arguments.rs:3:29
|
LL | #[rustc_args_required_const(1)]
| ^ there is only 1 argument
-error: aborting due to 7 previous errors
+error: aborting due to 9 previous errors