diff options
Diffstat (limited to 'src')
7 files changed, 46 insertions, 29 deletions
diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index eb7c12d13c3..54be830bf42 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -387,7 +387,7 @@ impl clean::GenericBound { let modifier_str = match modifier { hir::TraitBoundModifier::None => "", hir::TraitBoundModifier::Maybe => "?", - hir::TraitBoundModifier::MaybeConst => "?const", + hir::TraitBoundModifier::MaybeConst => "~const", }; if f.alternate() { write!(f, "{}{:#}", modifier_str, ty.print(cx)) diff --git a/src/test/ui/consts/const-eval/issue-49296.rs b/src/test/ui/consts/const-eval/issue-49296.rs index bb8113e53f9..80f6bbec2a1 100644 --- a/src/test/ui/consts/const-eval/issue-49296.rs +++ b/src/test/ui/consts/const-eval/issue-49296.rs @@ -1,22 +1,13 @@ // issue-49296: Unsafe shenigans in constants can result in missing errors #![feature(const_fn_trait_bound)] -#![feature(const_trait_bound_opt_out)] -#![allow(incomplete_features)] -const unsafe fn transmute<T: ?const Copy, U: ?const Copy>(t: T) -> U { - #[repr(C)] - union Transmute<T: Copy, U: Copy> { - from: T, - to: U, - } - - Transmute { from: t }.to -} +use std::mem::transmute; const fn wat(x: u64) -> &'static u64 { unsafe { transmute(&x) } } + const X: u64 = *wat(42); //~^ ERROR evaluation of constant value failed diff --git a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst-opt-out.rs b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst-opt-out.rs index 1fc2c4fe445..8a0f39acf25 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst-opt-out.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst-opt-out.rs @@ -13,12 +13,10 @@ impl PartialEq for S { } } -const fn equals_self<T: ?const PartialEq>(t: &T) -> bool { +const fn equals_self<T: PartialEq>(t: &T) -> bool { true } pub const EQ: bool = equals_self(&S); -// Calling `equals_self` with a type that only has a non-const impl is fine, because we opted out. - fn main() {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/tilde-const-on-non-const-fn.rs b/src/test/ui/rfc-2632-const-trait-impl/tilde-const-on-non-const-fn.rs new file mode 100644 index 00000000000..cde5233d4c8 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/tilde-const-on-non-const-fn.rs @@ -0,0 +1,12 @@ +#![feature(const_trait_impl)] +fn a<T: ~const From<u8>>() {} +//~^ ERROR: `~const` is not allowed + +struct S; + +impl S { + fn b<T: ~const From<u8>>() {} + //~^ ERROR: `~const` is not allowed +} + +fn main() {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/tilde-const-on-non-const-fn.stderr b/src/test/ui/rfc-2632-const-trait-impl/tilde-const-on-non-const-fn.stderr new file mode 100644 index 00000000000..4f81a607f6e --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/tilde-const-on-non-const-fn.stderr @@ -0,0 +1,18 @@ +error: `~const` is not allowed here + --> $DIR/tilde-const-on-non-const-fn.rs:2:9 + | +LL | fn a<T: ~const From<u8>>() {} + | ^^^^^^^^^^^^^^^ + | + = note: only allowed on bounds on traits' associated types, const fns, const impls and its associated functions + +error: `~const` is not allowed here + --> $DIR/tilde-const-on-non-const-fn.rs:8:13 + | +LL | fn b<T: ~const From<u8>>() {} + | ^^^^^^^^^^^^^^^ + | + = note: only allowed on bounds on traits' associated types, const fns, const impls and its associated functions + +error: aborting due to 2 previous errors + diff --git a/src/tools/rustfmt/src/types.rs b/src/tools/rustfmt/src/types.rs index c6f89c31065..640d127e860 100644 --- a/src/tools/rustfmt/src/types.rs +++ b/src/tools/rustfmt/src/types.rs @@ -537,10 +537,10 @@ impl Rewrite for ast::GenericBound { .map(|s| format!("?{}", s)), ast::TraitBoundModifier::MaybeConst => poly_trait_ref .rewrite(context, shape.offset_left(7)?) - .map(|s| format!("?const {}", s)), + .map(|s| format!("~const {}", s)), ast::TraitBoundModifier::MaybeConstMaybe => poly_trait_ref .rewrite(context, shape.offset_left(8)?) - .map(|s| format!("?const ?{}", s)), + .map(|s| format!("~const ?{}", s)), }; rewrite.map(|s| if has_paren { format!("({})", s) } else { s }) } diff --git a/src/tools/rustfmt/tests/target/type.rs b/src/tools/rustfmt/tests/target/type.rs index e7761251688..9ab66944c8c 100644 --- a/src/tools/rustfmt/tests/target/type.rs +++ b/src/tools/rustfmt/tests/target/type.rs @@ -145,35 +145,33 @@ type MyFn = fn( b: SomeOtherLongComplexType, ) -> Box<Future<Item = AnotherLongType, Error = ALongErrorType>>; -// Const opt-out +// Const bound -trait T: ?const Super {} +trait T: ~const Super {} -const fn maybe_const<S: ?const T>() -> i32 { +const fn not_quite_const<S: ~const T>() -> i32 { <S as T>::CONST } -struct S<T: ?const ?Sized>(std::marker::PhantomData<T>); +struct S<T: ~const ?Sized>(std::marker::PhantomData<T>); -impl ?const T {} +impl ~const T {} -fn trait_object() -> &'static dyn ?const T { +fn trait_object() -> &'static dyn ~const T { &S } -fn i(_: impl IntoIterator<Item = Box<dyn ?const T>>) {} +fn i(_: impl IntoIterator<Item = Box<dyn ~const T>>) {} -fn apit(_: impl ?const T) {} +fn apit(_: impl ~const T) {} -fn rpit() -> impl ?const T { +fn rpit() -> impl ~const T { S } pub struct Foo<T: Trait>(T); -impl<T: ?const Trait> Foo<T> { +impl<T: ~const Trait> Foo<T> { fn new(t: T) -> Self { - // not calling methods on `t`, so we opt out of requiring - // `<T as Trait>` to have const methods via `?const` Self(t) } } |
