Skip to content

Commit

Permalink
rustc: fix check_attr() for methods, closures and foreign functions
Browse files Browse the repository at this point in the history
UI tests are updated with additional error messages that were missing
before.
  • Loading branch information
neocturne committed Apr 16, 2020
1 parent df768c5 commit 9a2bca6
Show file tree
Hide file tree
Showing 9 changed files with 75 additions and 20 deletions.
5 changes: 4 additions & 1 deletion src/librustc_passes/check_attr.rs
Expand Up @@ -76,7 +76,7 @@ impl CheckAttrVisitor<'tcx> {
return;
}

if target == Target::Fn {
if matches!(target, Target::Fn | Target::Method(_) | Target::ForeignFn) {
self.tcx.codegen_fn_attrs(self.tcx.hir().local_def_id(hir_id));
}

Expand Down Expand Up @@ -391,6 +391,9 @@ impl CheckAttrVisitor<'tcx> {
);
}
}
if target == Target::Closure {
self.tcx.codegen_fn_attrs(self.tcx.hir().local_def_id(expr.hir_id));
}
}

fn check_used(&self, attrs: &'hir [Attribute], target: Target) {
Expand Down
Expand Up @@ -8,24 +8,28 @@
struct Foo;
impl Fn<()> for Foo {
//~^ ERROR the precise format of `Fn`-family traits' type parameters is subject to change
//~| ERROR manual implementations of `Fn` are experimental
extern "rust-call" fn call(self, args: ()) -> () {}
//~^ ERROR rust-call ABI is subject to change
}
struct Foo1;
impl FnOnce() for Foo1 {
//~^ ERROR associated type bindings are not allowed here
//~| ERROR manual implementations of `FnOnce` are experimental
extern "rust-call" fn call_once(self, args: ()) -> () {}
//~^ ERROR rust-call ABI is subject to change
}
struct Bar;
impl FnMut<()> for Bar {
//~^ ERROR the precise format of `Fn`-family traits' type parameters is subject to change
//~| ERROR manual implementations of `FnMut` are experimental
extern "rust-call" fn call_mut(&self, args: ()) -> () {}
//~^ ERROR rust-call ABI is subject to change
}
struct Baz;
impl FnOnce<()> for Baz {
//~^ ERROR the precise format of `Fn`-family traits' type parameters is subject to change
//~| ERROR manual implementations of `FnOnce` are experimental
extern "rust-call" fn call_once(&self, args: ()) -> () {}
//~^ ERROR rust-call ABI is subject to change
}
Expand Down
@@ -1,5 +1,5 @@
error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:11:12
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:12:12
|
LL | extern "rust-call" fn call(self, args: ()) -> () {}
| ^^^^^^^^^^^
Expand All @@ -8,7 +8,7 @@ LL | extern "rust-call" fn call(self, args: ()) -> () {}
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:17:12
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:19:12
|
LL | extern "rust-call" fn call_once(self, args: ()) -> () {}
| ^^^^^^^^^^^
Expand All @@ -17,7 +17,7 @@ LL | extern "rust-call" fn call_once(self, args: ()) -> () {}
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:23:12
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:26:12
|
LL | extern "rust-call" fn call_mut(&self, args: ()) -> () {}
| ^^^^^^^^^^^
Expand All @@ -26,7 +26,7 @@ LL | extern "rust-call" fn call_mut(&self, args: ()) -> () {}
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:29:12
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:33:12
|
LL | extern "rust-call" fn call_once(&self, args: ()) -> () {}
| ^^^^^^^^^^^
Expand All @@ -44,13 +44,13 @@ LL | impl Fn<()> for Foo {
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error[E0229]: associated type bindings are not allowed here
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:15:6
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:16:6
|
LL | impl FnOnce() for Foo1 {
| ^^^^^^^^ associated type not allowed here

error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:21:6
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:23:6
|
LL | impl FnMut<()> for Bar {
| ^^^^^^^^^ help: use parenthetical notation instead: `FnMut() -> ()`
Expand All @@ -59,15 +59,47 @@ LL | impl FnMut<()> for Bar {
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:27:6
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:30:6
|
LL | impl FnOnce<()> for Baz {
| ^^^^^^^^^^ help: use parenthetical notation instead: `FnOnce() -> ()`
|
= note: see issue #29625 <https://github.com/rust-lang/rust/issues/29625> for more information
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error: aborting due to 8 previous errors
error[E0183]: manual implementations of `Fn` are experimental
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:9:1
|
LL | impl Fn<()> for Foo {
| ^^^^^^^^^^^^^^^^^^^ manual implementations of `Fn` are experimental
|
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error[E0183]: manual implementations of `FnMut` are experimental
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:23:1
|
LL | impl FnMut<()> for Bar {
| ^^^^^^^^^^^^^^^^^^^^^^ manual implementations of `FnMut` are experimental
|
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error[E0183]: manual implementations of `FnOnce` are experimental
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:16:1
|
LL | impl FnOnce() for Foo1 {
| ^^^^^^^^^^^^^^^^^^^^^^ manual implementations of `FnOnce` are experimental
|
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error[E0183]: manual implementations of `FnOnce` are experimental
--> $DIR/feature-gate-unboxed-closures-manual-impls.rs:30:1
|
LL | impl FnOnce<()> for Baz {
| ^^^^^^^^^^^^^^^^^^^^^^^ manual implementations of `FnOnce` are experimental
|
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error: aborting due to 12 previous errors

Some errors have detailed explanations: E0229, E0658.
For more information about an error, try `rustc --explain E0229`.
1 change: 1 addition & 0 deletions src/test/ui/feature-gates/feature-gate-unboxed-closures.rs
Expand Up @@ -4,6 +4,7 @@ struct Test;

impl FnOnce<(u32, u32)> for Test {
//~^ ERROR the precise format of `Fn`-family traits' type parameters is subject to change
//~| ERROR manual implementations of `FnOnce` are experimental
type Output = u32;

extern "rust-call" fn call_once(self, (a, b): (u32, u32)) -> u32 {
Expand Down
12 changes: 10 additions & 2 deletions src/test/ui/feature-gates/feature-gate-unboxed-closures.stderr
@@ -1,5 +1,5 @@
error[E0658]: rust-call ABI is subject to change
--> $DIR/feature-gate-unboxed-closures.rs:9:12
--> $DIR/feature-gate-unboxed-closures.rs:10:12
|
LL | extern "rust-call" fn call_once(self, (a, b): (u32, u32)) -> u32 {
| ^^^^^^^^^^^
Expand All @@ -16,6 +16,14 @@ LL | impl FnOnce<(u32, u32)> for Test {
= note: see issue #29625 <https://github.com/rust-lang/rust/issues/29625> for more information
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error: aborting due to 2 previous errors
error[E0183]: manual implementations of `FnOnce` are experimental
--> $DIR/feature-gate-unboxed-closures.rs:5:1
|
LL | impl FnOnce<(u32, u32)> for Test {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ manual implementations of `FnOnce` are experimental
|
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable

error: aborting due to 3 previous errors

For more information about this error, try `rustc --explain E0658`.
3 changes: 3 additions & 0 deletions src/test/ui/issues/issue-3214.rs
@@ -1,10 +1,13 @@
// ignore-tidy-linelength

fn foo<T>() {
struct Foo {
x: T, //~ ERROR can't use generic parameters from outer function
}

impl<T> Drop for Foo<T> {
//~^ ERROR wrong number of type arguments
//~| ERROR the type parameter `T` is not constrained by the impl trait, self type, or predicates
fn drop(&mut self) {}
}
}
Expand Down
14 changes: 10 additions & 4 deletions src/test/ui/issues/issue-3214.stderr
@@ -1,5 +1,5 @@
error[E0401]: can't use generic parameters from outer function
--> $DIR/issue-3214.rs:3:12
--> $DIR/issue-3214.rs:5:12
|
LL | fn foo<T>() {
| --- - type parameter from outer function
Expand All @@ -10,12 +10,18 @@ LL | x: T,
| ^ use of generic parameter from outer function

error[E0107]: wrong number of type arguments: expected 0, found 1
--> $DIR/issue-3214.rs:6:26
--> $DIR/issue-3214.rs:8:26
|
LL | impl<T> Drop for Foo<T> {
| ^ unexpected type argument

error: aborting due to 2 previous errors
error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates
--> $DIR/issue-3214.rs:8:10
|
LL | impl<T> Drop for Foo<T> {
| ^ unconstrained type parameter

error: aborting due to 3 previous errors

Some errors have detailed explanations: E0107, E0401.
Some errors have detailed explanations: E0107, E0207, E0401.
For more information about an error, try `rustc --explain E0107`.
2 changes: 0 additions & 2 deletions src/test/ui/macros/issue-68060.rs
@@ -1,5 +1,3 @@
// build-fail

#![feature(track_caller)]

fn main() {
Expand Down
6 changes: 3 additions & 3 deletions src/test/ui/macros/issue-68060.stderr
@@ -1,5 +1,5 @@
error: `#[target_feature(..)]` can only be applied to `unsafe` functions
--> $DIR/issue-68060.rs:8:13
--> $DIR/issue-68060.rs:6:13
|
LL | #[target_feature(enable = "")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can only be applied to `unsafe` functions
Expand All @@ -8,13 +8,13 @@ LL | |_| (),
| ------ not an `unsafe` function

error: the feature named `` is not valid for this target
--> $DIR/issue-68060.rs:8:30
--> $DIR/issue-68060.rs:6:30
|
LL | #[target_feature(enable = "")]
| ^^^^^^^^^^^ `` is not valid for this target

error[E0737]: `#[track_caller]` requires Rust ABI
--> $DIR/issue-68060.rs:11:13
--> $DIR/issue-68060.rs:9:13
|
LL | #[track_caller]
| ^^^^^^^^^^^^^^^
Expand Down

0 comments on commit 9a2bca6

Please sign in to comment.