From 44a5ce6f75f03e0ef8975104ab7a8d6129adaa71 Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Tue, 10 Jan 2023 11:23:58 +0000 Subject: [PATCH] Test that we cannot use trait impl methods arguments as defining uses --- .../type-alias-impl-trait/unnameable_type.rs | 24 ++++++++++++++ .../unnameable_type.stderr | 31 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 tests/ui/type-alias-impl-trait/unnameable_type.rs create mode 100644 tests/ui/type-alias-impl-trait/unnameable_type.stderr diff --git a/tests/ui/type-alias-impl-trait/unnameable_type.rs b/tests/ui/type-alias-impl-trait/unnameable_type.rs new file mode 100644 index 0000000000000..1739ab0063fa9 --- /dev/null +++ b/tests/ui/type-alias-impl-trait/unnameable_type.rs @@ -0,0 +1,24 @@ +#![feature(type_alias_impl_trait)] + +// This test ensures that unnameable types stay unnameable +// https://github.com/rust-lang/rust/issues/63063#issuecomment-1360053614 + +// library +mod private { + pub struct Private; + pub trait Trait { + fn dont_define_this(_private: Private) {} + } +} + +use private::Trait; + +// downstream +type MyPrivate = impl Sized; +//~^ ERROR: unconstrained opaque type +impl Trait for u32 { + fn dont_define_this(_private: MyPrivate) {} + //~^ ERROR: incompatible type for trait +} + +fn main() {} diff --git a/tests/ui/type-alias-impl-trait/unnameable_type.stderr b/tests/ui/type-alias-impl-trait/unnameable_type.stderr new file mode 100644 index 0000000000000..7dc6efc4b1b6b --- /dev/null +++ b/tests/ui/type-alias-impl-trait/unnameable_type.stderr @@ -0,0 +1,31 @@ +error: unconstrained opaque type + --> $DIR/unnameable_type.rs:17:18 + | +LL | type MyPrivate = impl Sized; + | ^^^^^^^^^^ + | + = note: `MyPrivate` must be used in combination with a concrete type within the same module + +error[E0053]: method `dont_define_this` has an incompatible type for trait + --> $DIR/unnameable_type.rs:20:35 + | +LL | type MyPrivate = impl Sized; + | ---------- the found opaque type +... +LL | fn dont_define_this(_private: MyPrivate) {} + | ^^^^^^^^^ + | | + | expected struct `Private`, found opaque type + | help: change the parameter type to match the trait: `Private` + | +note: type in trait + --> $DIR/unnameable_type.rs:10:39 + | +LL | fn dont_define_this(_private: Private) {} + | ^^^^^^^ + = note: expected signature `fn(Private)` + found signature `fn(MyPrivate)` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0053`.