use errors::{Applicability, Handler};
use syntax_pos::{symbol::Symbol, Span};
-use super::{list_contains_name, mark_used, MetaItemKind};
+use super::{mark_used, MetaItemKind};
enum AttrError {
MultipleItem(Name),
/// Determine what `#[unwind]` attribute is present in `attrs`, if any.
pub fn find_unwind_attr(diagnostic: Option<&Handler>, attrs: &[Attribute]) -> Option<UnwindAttr> {
- let syntax_error = |attr: &Attribute| {
- mark_used(attr);
- diagnostic.map(|d| {
- span_err!(d, attr.span, E0633, "malformed `#[unwind]` attribute");
- });
- None
- };
-
attrs.iter().fold(None, |ia, attr| {
- if attr.path != "unwind" {
- return ia;
- }
- let meta = match attr.meta() {
- Some(meta) => meta.node,
- None => return ia,
- };
- match meta {
- MetaItemKind::Word => {
- syntax_error(attr)
- }
- MetaItemKind::List(ref items) => {
- mark_used(attr);
- if items.len() != 1 {
- syntax_error(attr)
- } else if list_contains_name(&items[..], "allowed") {
- Some(UnwindAttr::Allowed)
- } else if list_contains_name(&items[..], "aborts") {
- Some(UnwindAttr::Aborts)
- } else {
- syntax_error(attr)
+ if attr.check_name("unwind") {
+ if let Some(meta) = attr.meta() {
+ if let MetaItemKind::List(items) = meta.node {
+ if items.len() == 1 {
+ if items[0].check_name("allowed") {
+ return Some(UnwindAttr::Allowed);
+ } else if items[0].check_name("aborts") {
+ return Some(UnwindAttr::Aborts);
+ }
+ }
+
+ diagnostic.map(|d| {
+ span_err!(d, attr.span, E0633, "malformed `#[unwind]` attribute");
+ });
}
}
- _ => ia,
}
+
+ ia
})
}
"dropck_eyepatch",
"may_dangle has unstable semantics and may be removed in the future",
cfg_fn!(dropck_eyepatch))),
- ("unwind", Whitelisted, template!(List: "allowed"), Gated(Stability::Unstable,
+ ("unwind", Whitelisted, template!(List: "allowed|aborts"), Gated(Stability::Unstable,
"unwind_attributes",
"#[unwind] is experimental",
cfg_fn!(unwind_attributes))),
--- /dev/null
+error[E0633]: malformed `#[unwind]` attribute
+ --> $DIR/malformed-unwind-2.rs:3:1
+ |
+LL | #[unwind(allowed, aborts)]
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0633]: malformed `#[unwind]` attribute
+ --> $DIR/malformed-unwind-2.rs:7:1
+ |
+LL | #[unwind(unsupported)]
+ | ^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0633`.