]> git.lizzy.rs Git - rust.git/commitdiff
Test that we cannot use trait impl methods arguments as defining uses
authorOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>
Tue, 10 Jan 2023 11:23:58 +0000 (11:23 +0000)
committerDavid Tolnay <dtolnay@gmail.com>
Wed, 11 Jan 2023 22:00:25 +0000 (14:00 -0800)
tests/ui/type-alias-impl-trait/unnameable_type.rs [new file with mode: 0644]
tests/ui/type-alias-impl-trait/unnameable_type.stderr [new file with mode: 0644]

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 (file)
index 0000000..1739ab0
--- /dev/null
@@ -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 (file)
index 0000000..7dc6efc
--- /dev/null
@@ -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`.