+ codegen_fn_attrs.inline = attrs.iter().fold(InlineAttr::None, |ia, attr| {
+ if attr.path != "inline" {
+ return ia;
+ }
+ match attr.meta().map(|i| i.node) {
+ Some(MetaItemKind::Word) => {
+ mark_used(attr);
+ InlineAttr::Hint
+ }
+ Some(MetaItemKind::List(ref items)) => {
+ mark_used(attr);
+ inline_span = Some(attr.span);
+ if items.len() != 1 {
+ span_err!(
+ tcx.sess.diagnostic(),
+ attr.span,
+ E0534,
+ "expected one argument"
+ );
+ InlineAttr::None
+ } else if list_contains_name(&items[..], "always") {
+ InlineAttr::Always
+ } else if list_contains_name(&items[..], "never") {
+ InlineAttr::Never
+ } else {
+ span_err!(
+ tcx.sess.diagnostic(),
+ items[0].span,
+ E0535,
+ "invalid argument"
+ );
+
+ InlineAttr::None
+ }
+ }
+ Some(MetaItemKind::NameValue(_)) => ia,
+ None => ia,
+ }
+ });
+
+ codegen_fn_attrs.optimize = attrs.iter().fold(OptimizeAttr::None, |ia, attr| {
+ if attr.path != "optimize" {
+ return ia;
+ }
+ let err = |sp, s| span_err!(tcx.sess.diagnostic(), sp, E0722, "{}", s);
+ match attr.meta().map(|i| i.node) {
+ Some(MetaItemKind::Word) => {
+ err(attr.span, "expected one argument");
+ ia
+ }
+ Some(MetaItemKind::List(ref items)) => {
+ mark_used(attr);
+ inline_span = Some(attr.span);
+ if items.len() != 1 {
+ err(attr.span, "expected one argument");
+ OptimizeAttr::None
+ } else if list_contains_name(&items[..], "size") {
+ OptimizeAttr::Size
+ } else if list_contains_name(&items[..], "speed") {
+ OptimizeAttr::Speed
+ } else {
+ err(items[0].span, "invalid argument");
+ OptimizeAttr::None
+ }
+ }
+ Some(MetaItemKind::NameValue(_)) => ia,
+ None => ia,
+ }
+ });
+