diff options
| author | bors <bors@rust-lang.org> | 2021-01-18 20:54:36 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-01-18 20:54:36 +0000 |
| commit | d98d2f57d9b98325ff075c343d2c7695b66dfa7d (patch) | |
| tree | 88e9284491c7a5856c5135c28839bb1146d88372 /src/test | |
| parent | 73f233b3ad68b54f854c0aea918fc496a35502cf (diff) | |
| parent | 5bac1c9229331105bab558f7d3be1685a76d110c (diff) | |
| download | rust-d98d2f57d9b98325ff075c343d2c7695b66dfa7d.tar.gz rust-d98d2f57d9b98325ff075c343d2c7695b66dfa7d.zip | |
Auto merge of #80707 - oli-obk:stability_hole_const_intrinsics, r=RalfJung
Stability oddity with const intrinsics cc `@RalfJung` In https://github.com/rust-lang/rust/pull/80699#discussion_r551495670 `@usbalbin` realized we accepted some intrinsics as `const` without a `#[rustc_const_(un)stable]` attribute. I did some digging, and that example works because intrinsics inherit their stability from their parents... including `#[rustc_const_(un)stable]` attributes. While we may want to fix that (not sure, wasn't there just a MCPed PR that caused this on purpose?), we definitely want tests for it, thus this PR adding tests and some fun tracing statements.
Diffstat (limited to 'src/test')
4 files changed, 50 insertions, 0 deletions
diff --git a/src/test/ui/consts/intrinsic_without_const_stab.rs b/src/test/ui/consts/intrinsic_without_const_stab.rs new file mode 100644 index 00000000000..810158a2957 --- /dev/null +++ b/src/test/ui/consts/intrinsic_without_const_stab.rs @@ -0,0 +1,17 @@ +#![feature(intrinsics, staged_api, const_intrinsic_copy)] +#![stable(feature = "core", since = "1.6.0")] + +#[stable(feature = "rust1", since = "1.0.0")] +#[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] +#[inline] +pub const unsafe fn copy<T>(src: *const T, dst: *mut T, count: usize) { + // Const stability attributes are not inherited from parent items. + extern "rust-intrinsic" { + fn copy<T>(src: *const T, dst: *mut T, count: usize); + } + + unsafe { copy(src, dst, count) } + //~^ ERROR calls in constant functions are limited to constant functions +} + +fn main() {} diff --git a/src/test/ui/consts/intrinsic_without_const_stab.stderr b/src/test/ui/consts/intrinsic_without_const_stab.stderr new file mode 100644 index 00000000000..5a42823a605 --- /dev/null +++ b/src/test/ui/consts/intrinsic_without_const_stab.stderr @@ -0,0 +1,9 @@ +error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants + --> $DIR/intrinsic_without_const_stab.rs:13:14 + | +LL | unsafe { copy(src, dst, count) } + | ^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0015`. diff --git a/src/test/ui/consts/intrinsic_without_const_stab_fail.rs b/src/test/ui/consts/intrinsic_without_const_stab_fail.rs new file mode 100644 index 00000000000..bf2c44169d4 --- /dev/null +++ b/src/test/ui/consts/intrinsic_without_const_stab_fail.rs @@ -0,0 +1,15 @@ +#![feature(intrinsics, staged_api, const_intrinsic_copy)] +#![stable(feature = "core", since = "1.6.0")] + +extern "rust-intrinsic" { + fn copy<T>(src: *const T, dst: *mut T, count: usize); +} + +#[stable(feature = "rust1", since = "1.0.0")] +#[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] +#[inline] +pub const unsafe fn stuff<T>(src: *const T, dst: *mut T, count: usize) { + unsafe { copy(src, dst, count) } //~ ERROR calls in constant functions are limited +} + +fn main() {} diff --git a/src/test/ui/consts/intrinsic_without_const_stab_fail.stderr b/src/test/ui/consts/intrinsic_without_const_stab_fail.stderr new file mode 100644 index 00000000000..d4a2989e785 --- /dev/null +++ b/src/test/ui/consts/intrinsic_without_const_stab_fail.stderr @@ -0,0 +1,9 @@ +error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants + --> $DIR/intrinsic_without_const_stab_fail.rs:12:14 + | +LL | unsafe { copy(src, dst, count) } + | ^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0015`. |
