ForeignMod,
Expression,
Statement,
+ Closure,
Other,
}
self.check_repr(item, target);
}
- /// Check if an `#[inline]` is applied to a function.
+ /// Check if an `#[inline]` is applied to a function or a closure.
fn check_inline(&self, attr: &hir::Attribute, span: &Span, target: Target) {
- if target != Target::Fn {
+ if target != Target::Fn && target != Target::Closure {
struct_span_err!(self.tcx.sess,
attr.span,
E0518,
- "attribute should be applied to function")
- .span_label(*span, "not a function")
+ "attribute should be applied to function or closure")
+ .span_label(*span, "not a function or closure")
.emit();
}
}
}
fn check_expr_attributes(&self, expr: &hir::Expr) {
+ let target = match expr.node {
+ hir::ExprClosure(..) => Target::Closure,
+ _ => Target::Expression,
+ };
for attr in expr.attrs.iter() {
if attr.check_name("inline") {
- self.check_inline(attr, &expr.span, Target::Expression);
+ self.check_inline(attr, &expr.span, target);
}
if attr.check_name("repr") {
self.emit_repr_error(
#[inline]
fn f() {}
-#[inline] //~ ERROR: attribute should be applied to function
+#[inline] //~ ERROR: attribute should be applied to function or closure
struct S;
fn main() {}
// except according to those terms.
fn main() {
- #[inline] struct Foo; //~ ERROR attribute should be applied to function
+ #[inline] struct Foo; //~ ERROR attribute should be applied to function or closure
#[repr(C)] fn foo() {} //~ ERROR attribute should be applied to struct, enum or union
}
#[inline]
let _a = 4;
- //~^^ ERROR attribute should be applied to function
+ //~^^ ERROR attribute should be applied to function or closure
#[inline(XYZ)]
let _b = 4;
- //~^^ ERROR attribute should be applied to function
+ //~^^ ERROR attribute should be applied to function or closure
#[repr(nothing)]
let _x = 0;
#[inline(ABC)]
foo();
- //~^^ ERROR attribute should be applied to function
+ //~^^ ERROR attribute should be applied to function or closure
let _z = #[repr] 1;
//~^ ERROR attribute should not be applied to an expression
--- /dev/null
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(stmt_expr_attributes)]
+
+pub fn main() {
+ let _x = #[inline(always)] || {};
+ let _y = #[inline(never)] || {};
+ let _z = #[inline] || {};
+}
-error[E0518]: attribute should be applied to function
+error[E0518]: attribute should be applied to function or closure
--> $DIR/E0518.rs:11:1
|
LL | #[inline(always)] //~ ERROR: E0518
| ^^^^^^^^^^^^^^^^^
LL | struct Foo;
- | ----------- not a function
+ | ----------- not a function or closure
-error[E0518]: attribute should be applied to function
+error[E0518]: attribute should be applied to function or closure
--> $DIR/E0518.rs:14:1
|
LL | #[inline(never)] //~ ERROR: E0518
| ^^^^^^^^^^^^^^^^
LL | / impl Foo {
LL | | }
- | |_- not a function
+ | |_- not a function or closure
error: aborting due to 2 previous errors
#![inline = "2100"]
#[inline = "2100"]
-//~^ ERROR attribute should be applied to function
+//~^ ERROR attribute should be applied to function or closure
mod inline {
mod inner { #![inline="2100"] }
- //~^ ERROR attribute should be applied to function
+ //~^ ERROR attribute should be applied to function or closure
#[inline = "2100"] fn f() { }
#[inline = "2100"] struct S;
- //~^ ERROR attribute should be applied to function
+ //~^ ERROR attribute should be applied to function or closure
#[inline = "2100"] type T = S;
- //~^ ERROR attribute should be applied to function
+ //~^ ERROR attribute should be applied to function or closure
#[inline = "2100"] impl S { }
- //~^ ERROR attribute should be applied to function
+ //~^ ERROR attribute should be applied to function or closure
}
fn main() {}
-error[E0518]: attribute should be applied to function
+error[E0518]: attribute should be applied to function or closure
--> $DIR/issue-43106-gating-of-inline.rs:21:1
|
LL | #[inline = "2100"]
| ^^^^^^^^^^^^^^^^^^
-LL | //~^ ERROR attribute should be applied to function
+LL | //~^ ERROR attribute should be applied to function or closure
LL | / mod inline {
LL | | mod inner { #![inline="2100"] }
-LL | | //~^ ERROR attribute should be applied to function
+LL | | //~^ ERROR attribute should be applied to function or closure
LL | |
... |
-LL | | //~^ ERROR attribute should be applied to function
+LL | | //~^ ERROR attribute should be applied to function or closure
LL | | }
- | |_- not a function
+ | |_- not a function or closure
-error[E0518]: attribute should be applied to function
+error[E0518]: attribute should be applied to function or closure
--> $DIR/issue-43106-gating-of-inline.rs:24:17
|
LL | mod inner { #![inline="2100"] }
- | ------------^^^^^^^^^^^^^^^^^-- not a function
+ | ------------^^^^^^^^^^^^^^^^^-- not a function or closure
-error[E0518]: attribute should be applied to function
+error[E0518]: attribute should be applied to function or closure
--> $DIR/issue-43106-gating-of-inline.rs:29:5
|
LL | #[inline = "2100"] struct S;
- | ^^^^^^^^^^^^^^^^^^ --------- not a function
+ | ^^^^^^^^^^^^^^^^^^ --------- not a function or closure
-error[E0518]: attribute should be applied to function
+error[E0518]: attribute should be applied to function or closure
--> $DIR/issue-43106-gating-of-inline.rs:32:5
|
LL | #[inline = "2100"] type T = S;
- | ^^^^^^^^^^^^^^^^^^ ----------- not a function
+ | ^^^^^^^^^^^^^^^^^^ ----------- not a function or closure
-error[E0518]: attribute should be applied to function
+error[E0518]: attribute should be applied to function or closure
--> $DIR/issue-43106-gating-of-inline.rs:35:5
|
LL | #[inline = "2100"] impl S { }
- | ^^^^^^^^^^^^^^^^^^ ---------- not a function
+ | ^^^^^^^^^^^^^^^^^^ ---------- not a function or closure
error: aborting due to 5 previous errors