summaryrefslogtreecommitdiffstats
path: root/src/test/ui/associated-types/defaults-unsound-62211-1.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/associated-types/defaults-unsound-62211-1.rs')
-rw-r--r--src/test/ui/associated-types/defaults-unsound-62211-1.rs54
1 files changed, 0 insertions, 54 deletions
diff --git a/src/test/ui/associated-types/defaults-unsound-62211-1.rs b/src/test/ui/associated-types/defaults-unsound-62211-1.rs
deleted file mode 100644
index fa6a208b4..000000000
--- a/src/test/ui/associated-types/defaults-unsound-62211-1.rs
+++ /dev/null
@@ -1,54 +0,0 @@
-//! Regression test for https://github.com/rust-lang/rust/issues/62211
-//!
-//! The old implementation of defaults did not check whether the provided
-//! default actually fulfills all bounds on the assoc. type, leading to
-//! unsoundness, demonstrated here as a use-after-free.
-//!
-//! Note that the underlying cause of this is still not yet fixed.
-//! See: https://github.com/rust-lang/rust/issues/33017
-
-#![feature(associated_type_defaults)]
-
-use std::{
- fmt::Display,
- ops::{AddAssign, Deref},
-};
-
-trait UncheckedCopy: Sized {
- // This Output is said to be Copy. Yet we default to Self
- // and it's accepted, not knowing if Self ineed is Copy
- type Output: Copy + Deref<Target = str> + AddAssign<&'static str> + From<Self> + Display = Self;
- //~^ ERROR the trait bound `Self: Copy` is not satisfied
- //~| ERROR the trait bound `Self: Deref` is not satisfied
- //~| ERROR cannot add-assign `&'static str` to `Self`
- //~| ERROR `Self` doesn't implement `std::fmt::Display`
-
- // We said the Output type was Copy, so we can Copy it freely!
- fn unchecked_copy(other: &Self::Output) -> Self::Output {
- (*other)
- }
-
- fn make_origin(s: Self) -> Self::Output {
- s.into()
- }
-}
-
-impl<T> UncheckedCopy for T {}
-
-fn bug<T: UncheckedCopy>(origin: T) {
- let origin = T::make_origin(origin);
- let mut copy = T::unchecked_copy(&origin);
-
- // assert we indeed have 2 strings pointing to the same buffer.
- assert_eq!(origin.as_ptr(), copy.as_ptr());
-
- // Drop the origin. Any use of `copy` is UB.
- drop(origin);
-
- copy += "This is invalid!";
- println!("{}", copy);
-}
-
-fn main() {
- bug(String::from("hello!"));
-}