about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/librustdoc/html/format.rs2
-rw-r--r--src/test/ui/consts/const-eval/issue-49296.rs13
-rw-r--r--src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst-opt-out.rs4
-rw-r--r--src/test/ui/rfc-2632-const-trait-impl/tilde-const-on-non-const-fn.rs12
-rw-r--r--src/test/ui/rfc-2632-const-trait-impl/tilde-const-on-non-const-fn.stderr18
-rw-r--r--src/tools/rustfmt/src/types.rs4
-rw-r--r--src/tools/rustfmt/tests/target/type.rs22
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)
     }
 }