Skip to content

Commit

Permalink
Add new tests and bless old tests
Browse files Browse the repository at this point in the history
  • Loading branch information
LeSeulArtichaut committed May 1, 2020
1 parent f9b9ba5 commit 8d9f73a
Show file tree
Hide file tree
Showing 12 changed files with 286 additions and 12 deletions.
10 changes: 7 additions & 3 deletions src/test/ui/macros/issue-68060.stderr
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
error: `#[target_feature(..)]` can only be applied to `unsafe` functions
error[E0658]: `#[target_feature(..)]` can only be applied to `unsafe` functions
--> $DIR/issue-68060.rs:6:13
|
LL | #[target_feature(enable = "")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can only be applied to `unsafe` functions
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
LL | |_| (),
| ------ not an `unsafe` function
|
= note: see issue #69098 <https://github.com/rust-lang/rust/issues/69098> for more information
= help: add `#![feature(target_feature_11)]` to the crate attributes to enable

error: the feature named `` is not valid for this target
--> $DIR/issue-68060.rs:6:30
Expand All @@ -21,4 +24,5 @@ LL | #[track_caller]

error: aborting due to 3 previous errors

For more information about this error, try `rustc --explain E0737`.
Some errors have detailed explanations: E0658, E0737.
For more information about an error, try `rustc --explain E0658`.
50 changes: 50 additions & 0 deletions src/test/ui/rfcs/rfc-2396-target_feature-11/check-pass.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Tests the new rules added by RFC 2396, including:
// - applying `#[target_feature]` to safe functions is allowed
// - calling functions with `#[target_feature]` is allowed in
// functions which have (at least) the same features
// - calling functions with `#[target_feature]` is allowed in
// unsafe contexts
// - functions with `#[target_feature]` can coerce to unsafe fn pointers

// check-pass
// only-x86_64

#![feature(target_feature_11)]

#[target_feature(enable = "sse2")]
const fn sse2() {}

#[cfg(target_feature = "sse2")]
const SSE2_ONLY: () = unsafe {
sse2();
};

#[target_feature(enable = "sse2")]
fn also_sse2() {
sse2();
}

#[target_feature(enable = "sse2")]
#[target_feature(enable = "avx")]
fn sse2_and_avx() {
sse2();
}

struct Foo;

impl Foo {
#[target_feature(enable = "sse2")]
fn sse2(&self) {
sse2();
}
}

fn main() {
if cfg!(target_feature = "sse2") {
unsafe {
sse2();
Foo.sse2();
}
}
let sse2_ptr: unsafe fn() = sse2;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// only-x86_64

#[target_feature(enable = "sse2")] //~ ERROR can only be applied to `unsafe` functions
fn foo() {}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error[E0658]: `#[target_feature(..)]` can only be applied to `unsafe` functions
--> $DIR/feature-gate-target_feature_11.rs:3:1
|
LL | #[target_feature(enable = "sse2")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | fn foo() {}
| ----------- not an `unsafe` function
|
= note: see issue #69098 <https://github.com/rust-lang/rust/issues/69098> for more information
= help: add `#![feature(target_feature_11)]` to the crate attributes to enable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0658`.
10 changes: 10 additions & 0 deletions src/test/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// only-x86_64

#![feature(target_feature_11)]

#[target_feature(enable = "sse2")]
fn foo() {}

fn main() {
let foo: fn() = foo; //~ ERROR mismatched types
}
18 changes: 18 additions & 0 deletions src/test/ui/rfcs/rfc-2396-target_feature-11/fn-ptr.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
error[E0308]: mismatched types
--> $DIR/fn-ptr.rs:9:21
|
LL | #[target_feature(enable = "sse2")]
| ---------------------------------- `#[target_feature]` added here
...
LL | let foo: fn() = foo;
| ---- ^^^ cannot coerce functions with `#[target_feature]` to safe function pointers
| |
| expected due to this
|
= note: expected fn pointer `fn()`
found fn item `fn() {foo}`
= note: functions with `#[target_feature]` can only be coerced to `unsafe` function pointers

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
47 changes: 47 additions & 0 deletions src/test/ui/rfcs/rfc-2396-target_feature-11/safe-calls.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// only-x86_64

#![feature(target_feature_11)]

#[target_feature(enable = "sse2")]
const fn sse2() {}

#[target_feature(enable = "avx")]
#[target_feature(enable = "bmi2")]
fn avx_bmi2() {}

struct Quux;

impl Quux {
#[target_feature(enable = "avx")]
#[target_feature(enable = "bmi2")]
fn avx_bmi2(&self) {}
}

fn foo() {
sse2(); //~ ERROR call to function with `#[target_feature]` is unsafe
avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe
Quux.avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe
}

#[target_feature(enable = "sse2")]
fn bar() {
avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe
Quux.avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe
}

#[target_feature(enable = "avx")]
fn baz() {
sse2(); //~ ERROR call to function with `#[target_feature]` is unsafe
avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe
Quux.avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe
}

#[target_feature(enable = "avx")]
#[target_feature(enable = "bmi2")]
fn qux() {
sse2(); //~ ERROR call to function with `#[target_feature]` is unsafe
}

const name: () = sse2(); //~ ERROR call to function with `#[target_feature]` is unsafe

fn main() {}
83 changes: 83 additions & 0 deletions src/test/ui/rfcs/rfc-2396-target_feature-11/safe-calls.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block
--> $DIR/safe-calls.rs:21:5
|
LL | sse2();
| ^^^^^^ call to function with `#[target_feature]`
|
= note: can only be called if the required target features are available

error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block
--> $DIR/safe-calls.rs:22:5
|
LL | avx_bmi2();
| ^^^^^^^^^^ call to function with `#[target_feature]`
|
= note: can only be called if the required target features are available

error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block
--> $DIR/safe-calls.rs:23:5
|
LL | Quux.avx_bmi2();
| ^^^^^^^^^^^^^^^ call to function with `#[target_feature]`
|
= note: can only be called if the required target features are available

error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block
--> $DIR/safe-calls.rs:28:5
|
LL | avx_bmi2();
| ^^^^^^^^^^ call to function with `#[target_feature]`
|
= note: can only be called if the required target features are available

error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block
--> $DIR/safe-calls.rs:29:5
|
LL | Quux.avx_bmi2();
| ^^^^^^^^^^^^^^^ call to function with `#[target_feature]`
|
= note: can only be called if the required target features are available

error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block
--> $DIR/safe-calls.rs:34:5
|
LL | sse2();
| ^^^^^^ call to function with `#[target_feature]`
|
= note: can only be called if the required target features are available

error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block
--> $DIR/safe-calls.rs:35:5
|
LL | avx_bmi2();
| ^^^^^^^^^^ call to function with `#[target_feature]`
|
= note: can only be called if the required target features are available

error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block
--> $DIR/safe-calls.rs:36:5
|
LL | Quux.avx_bmi2();
| ^^^^^^^^^^^^^^^ call to function with `#[target_feature]`
|
= note: can only be called if the required target features are available

error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block
--> $DIR/safe-calls.rs:42:5
|
LL | sse2();
| ^^^^^^ call to function with `#[target_feature]`
|
= note: can only be called if the required target features are available

error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block
--> $DIR/safe-calls.rs:45:18
|
LL | const name: () = sse2();
| ^^^^^^ call to function with `#[target_feature]`
|
= note: can only be called if the required target features are available

error: aborting due to 10 previous errors

For more information about this error, try `rustc --explain E0133`.
21 changes: 21 additions & 0 deletions src/test/ui/rfcs/rfc-2396-target_feature-11/trait-impl.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// only-x86_64

#![feature(target_feature_11)]

trait Foo {
fn foo(&self);
unsafe fn unsf_foo(&self);
}

struct Bar;

impl Foo for Bar {
#[target_feature(enable = "sse2")]
//~^ ERROR cannot be applied to safe trait method
fn foo(&self) {}

#[target_feature(enable = "sse2")]
unsafe fn unsf_foo(&self) {}
}

fn main() {}
11 changes: 11 additions & 0 deletions src/test/ui/rfcs/rfc-2396-target_feature-11/trait-impl.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error: `#[target_feature(..)]` cannot be applied to safe trait method
--> $DIR/trait-impl.rs:13:5
|
LL | #[target_feature(enable = "sse2")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot be applied to safe trait method
LL |
LL | fn foo(&self) {}
| ---------------- not an `unsafe` function

error: aborting due to previous error

6 changes: 3 additions & 3 deletions src/test/ui/target-feature/invalid-attribute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ unsafe fn foo() {}

#[target_feature(enable = "sse2")]
//~^ ERROR `#[target_feature(..)]` can only be applied to `unsafe` functions
//~| NOTE can only be applied to `unsafe` functions
//~| NOTE see issue #69098
fn bar() {}
//~^ NOTE not an `unsafe` function

Expand Down Expand Up @@ -72,7 +72,7 @@ trait Quux {
impl Quux for Foo {
#[target_feature(enable = "sse2")]
//~^ ERROR `#[target_feature(..)]` can only be applied to `unsafe` functions
//~| NOTE can only be applied to `unsafe` functions
//~| NOTE see issue #69098
fn foo() {}
//~^ NOTE not an `unsafe` function
}
Expand All @@ -84,7 +84,7 @@ fn main() {
}
#[target_feature(enable = "sse2")]
//~^ ERROR `#[target_feature(..)]` can only be applied to `unsafe` functions
//~| NOTE can only be applied to `unsafe` functions
//~| NOTE see issue #69098
|| {};
//~^ NOTE not an `unsafe` function
}
22 changes: 16 additions & 6 deletions src/test/ui/target-feature/invalid-attribute.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,17 @@ error: malformed `target_feature` attribute input
LL | #[target_feature(disable = "baz")]
| ^^^^^^^^^^^^^^^ help: must be of the form: `enable = ".."`

error: `#[target_feature(..)]` can only be applied to `unsafe` functions
error[E0658]: `#[target_feature(..)]` can only be applied to `unsafe` functions
--> $DIR/invalid-attribute.rs:27:1
|
LL | #[target_feature(enable = "sse2")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can only be applied to `unsafe` functions
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
LL | fn bar() {}
| ----------- not an `unsafe` function
|
= note: see issue #69098 <https://github.com/rust-lang/rust/issues/69098> for more information
= help: add `#![feature(target_feature_11)]` to the crate attributes to enable

error: attribute should be applied to a function
--> $DIR/invalid-attribute.rs:33:1
Expand Down Expand Up @@ -91,23 +94,30 @@ error: cannot use `#[inline(always)]` with `#[target_feature]`
LL | #[inline(always)]
| ^^^^^^^^^^^^^^^^^

error: `#[target_feature(..)]` can only be applied to `unsafe` functions
error[E0658]: `#[target_feature(..)]` can only be applied to `unsafe` functions
--> $DIR/invalid-attribute.rs:85:5
|
LL | #[target_feature(enable = "sse2")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can only be applied to `unsafe` functions
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
LL | || {};
| ----- not an `unsafe` function
|
= note: see issue #69098 <https://github.com/rust-lang/rust/issues/69098> for more information
= help: add `#![feature(target_feature_11)]` to the crate attributes to enable

error: `#[target_feature(..)]` can only be applied to `unsafe` functions
error[E0658]: `#[target_feature(..)]` can only be applied to `unsafe` functions
--> $DIR/invalid-attribute.rs:73:5
|
LL | #[target_feature(enable = "sse2")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can only be applied to `unsafe` functions
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
LL | fn foo() {}
| ----------- not an `unsafe` function
|
= note: see issue #69098 <https://github.com/rust-lang/rust/issues/69098> for more information
= help: add `#![feature(target_feature_11)]` to the crate attributes to enable

error: aborting due to 14 previous errors

For more information about this error, try `rustc --explain E0658`.

0 comments on commit 8d9f73a

Please sign in to comment.