Code change:
let diagnostic = &sess.span_diagnostic; 'outer: for attr in attrs_iter { <del> if attr.path != "deprecated" { continue </del> <ins> if !attr.check_name("deprecated") { continue; </ins> } <del> mark_used(attr); </del> if depr.is_some() { span_err!(diagnostic, item_sp, E0550, "multiple deprecated attributes"); break } <del> depr = if let Some(metas) = attr.meta_item_list() { let get = |meta: &MetaItem, item: &mut Option<Symbol>| { if item.is_some() { handle_errors(sess, meta.span, AttrError::MultipleItem(meta.name())); return false } if let Some(v) = meta.value_str() { *item = Some(v); true } else { if let Some(lit) = meta.name_value_literal() { handle_errors( sess, lit.span, AttrError::UnsupportedLiteral( "literal in `deprecated`  value must be a string", lit.node.is_bytestr() ), ); } else { span_err!(diagnostic, meta.span, E0551, "incorrect meta item"); </del> <ins> let meta = attr.meta().unwrap(); depr = match &meta.node { MetaItemKind::Word => Some(Deprecation { since: None, note: None }), MetaItemKind::NameValue(..) => { meta.value_str().map(|note| { Deprecation { since: None, note: Some(note) } }) } MetaItemKind::List(list) => { let get = |meta: &MetaItem, item: &mut Option<Symbol>| { if item.is_some() { handle_errors(sess, meta.span, AttrError::MultipleItem(meta.name())); return false </ins> } <ins> if let Some(v) = meta.value_str() { *item = Some(v); true } else { if let Some(lit) = meta.name_value_literal() { handle_errors( sess, lit.span, AttrError::UnsupportedLiteral( "literal in `deprecated`  value must be a string", lit.node.is_bytestr() ), ); } else { span_err!(diagnostic, meta.span, E0551, "incorrect meta item"); } </ins> <del> false } }; </del> <ins> false } }; </ins> <del> let mut since = None; let mut note = None; for meta in metas { match &meta.node { NestedMetaItemKind::MetaItem(mi) => { match &*mi.name().as_str() { "since" => if !get(mi, &mut since) { continue 'outer }, "note" => if !get(mi, &mut note) { continue 'outer }, _ => { handle_errors( sess, meta.span, AttrError::UnknownMetaItem(mi.name(), &["since", "note"]), ); continue 'outer </del> <ins> let mut since = None; let mut note = None; for meta in list { match &meta.node { NestedMetaItemKind::MetaItem(mi) => { match &*mi.name().as_str() { "since" => if !get(mi, &mut since) { continue 'outer }, "note" => if !get(mi, &mut note) { continue 'outer }, _ => { handle_errors( sess, meta.span, AttrError::UnknownMetaItem(mi.name(), &["since", "note"]), ); continue 'outer } </ins> } } <del> } NestedMetaItemKind::Literal(lit) => { handle_errors( sess, lit.span, AttrError::UnsupportedLiteral( "item in `deprecated` must be a key/value pair", false, ), ); continue 'outer </del> <ins> NestedMetaItemKind::Literal(lit) => { handle_errors( sess, lit.span, AttrError::UnsupportedLiteral( "item in `deprecated` must be a key/value pair", false, ), ); continue 'outer } </ins> } } <del> } Some(Deprecation {since: since, note: note}) } else { Some(Deprecation{since: None, note: None}) } </del> <ins> Some(Deprecation { since, note }) } }; </ins> } depr

Related discussion:
text: Look for example to It is deprecated, and in source code there is hint what should be used instead: but in generated html documentation there is no hint about
isn't the correct syntax for the attribute. It should be . You can see it work: . This isn't a rustdoc issue. It's an issue with rustc that it doesn't reject .