diff options
| author | bors <bors@rust-lang.org> | 2022-07-20 13:36:59 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-07-20 13:36:59 +0000 |
| commit | 14dbfebfa25a0e626ad827526934381b2545cbb4 (patch) | |
| tree | 5da756420888e6037fb4e622111af294e635ad74 /src | |
| parent | d60d88fe5cd55496b9ccb1511a9af4994b7c43d0 (diff) | |
| parent | 17a2832ba0b2596db7b23d55f68b581eb7e80254 (diff) | |
| download | rust-14dbfebfa25a0e626ad827526934381b2545cbb4.tar.gz rust-14dbfebfa25a0e626ad827526934381b2545cbb4.zip | |
Auto merge of #99506 - Dylan-DPC:rollup-q3msucx, r=Dylan-DPC
Rollup of 7 pull requests Successful merges: - #98101 (stdlib support for Apple WatchOS) - #99345 (Do not allow typeck children items to constrain outer RPITs) - #99383 (Formalize defining_use_anchor) - #99436 (Add flag to configure `noalias` on `Box<T>`) - #99483 (Fix a numerical underflow in tuple wrap suggestion) - #99485 (Stop injecting `#[allow(unused_qualifications)]` in generated `derive` implementations) - #99486 (Refactor: remove a string comparison between types in `check_str_addition`) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'src')
22 files changed, 241 insertions, 134 deletions
diff --git a/src/test/codegen/noalias-box-off.rs b/src/test/codegen/noalias-box-off.rs new file mode 100644 index 00000000000..afd17c7c160 --- /dev/null +++ b/src/test/codegen/noalias-box-off.rs @@ -0,0 +1,8 @@ +// compile-flags: -O -Z box-noalias=no + +#![crate_type = "lib"] + +// CHECK-LABEL: @box_should_not_have_noalias_if_disabled( +// CHECK-NOT: noalias +#[no_mangle] +pub fn box_should_not_have_noalias_if_disabled(_b: Box<u8>) {} diff --git a/src/test/codegen/noalias-box.rs b/src/test/codegen/noalias-box.rs new file mode 100644 index 00000000000..a3d1f093d8b --- /dev/null +++ b/src/test/codegen/noalias-box.rs @@ -0,0 +1,8 @@ +// compile-flags: -O + +#![crate_type = "lib"] + +// CHECK-LABEL: @box_should_have_noalias_by_default( +// CHECK: noalias +#[no_mangle] +pub fn box_should_have_noalias_by_default(_b: Box<u8>) {} diff --git a/src/test/rustdoc-ui/z-help.stdout b/src/test/rustdoc-ui/z-help.stdout index 7296b35788a..6f5248f5b18 100644 --- a/src/test/rustdoc-ui/z-help.stdout +++ b/src/test/rustdoc-ui/z-help.stdout @@ -4,6 +4,7 @@ -Z asm-comments=val -- generate comments into the assembly (may change behavior) (default: no) -Z assert-incr-state=val -- assert that the incremental cache is in given state: either `loaded` or `not-loaded`. -Z binary-dep-depinfo=val -- include artifacts (sysroot, crate dependencies) used during compilation in dep-info (default: no) + -Z box-noalias=val -- emit noalias metadata for box (default: yes) -Z branch-protection=val -- set options for branch target identification and pointer authentication on AArch64 -Z cf-protection=val -- instrument control-flow architecture protection -Z cgu-partitioning-strategy=val -- the codegen unit partitioning strategy to use diff --git a/src/test/ui/argument-suggestions/issue-99482.rs b/src/test/ui/argument-suggestions/issue-99482.rs new file mode 100644 index 00000000000..731b863069b --- /dev/null +++ b/src/test/ui/argument-suggestions/issue-99482.rs @@ -0,0 +1,5 @@ +fn main() { + let f = |_: (), f: fn()| f; + let _f = f(main); + //~^ ERROR this function takes 2 arguments but 1 argument was supplied +} diff --git a/src/test/ui/argument-suggestions/issue-99482.stderr b/src/test/ui/argument-suggestions/issue-99482.stderr new file mode 100644 index 00000000000..bc005e82a2c --- /dev/null +++ b/src/test/ui/argument-suggestions/issue-99482.stderr @@ -0,0 +1,19 @@ +error[E0057]: this function takes 2 arguments but 1 argument was supplied + --> $DIR/issue-99482.rs:3:14 + | +LL | let _f = f(main); + | ^ ---- an argument of type `()` is missing + | +note: closure defined here + --> $DIR/issue-99482.rs:2:13 + | +LL | let f = |_: (), f: fn()| f; + | ^^^^^^^^^^^^^^^^ +help: provide the argument + | +LL | let _f = f((), main); + | ~~~~~~~~~~~ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0057`. diff --git a/src/test/ui/deriving/deriving-all-codegen.stdout b/src/test/ui/deriving/deriving-all-codegen.stdout index 542911537be..21fe663f067 100644 --- a/src/test/ui/deriving/deriving-all-codegen.stdout +++ b/src/test/ui/deriving/deriving-all-codegen.stdout @@ -25,42 +25,35 @@ extern crate std; // Empty struct. struct Empty; #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for Empty { #[inline] fn clone(&self) -> Empty { *self } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::marker::Copy for Empty { } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for Empty { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { ::core::fmt::Formatter::write_str(f, "Empty") } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::default::Default for Empty { #[inline] fn default() -> Empty { Empty {} } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for Empty { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {} } impl ::core::marker::StructuralPartialEq for Empty {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for Empty { #[inline] fn eq(&self, other: &Empty) -> bool { true } } impl ::core::marker::StructuralEq for Empty {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for Empty { #[inline] #[doc(hidden)] @@ -68,7 +61,6 @@ impl ::core::cmp::Eq for Empty { fn assert_receiver_is_total_eq(&self) -> () {} } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for Empty { #[inline] fn partial_cmp(&self, other: &Empty) @@ -77,7 +69,6 @@ impl ::core::cmp::PartialOrd for Empty { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for Empty { #[inline] fn cmp(&self, other: &Empty) -> ::core::cmp::Ordering { @@ -91,7 +82,6 @@ struct Point { y: u32, } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for Point { #[inline] fn clone(&self) -> Point { @@ -100,10 +90,8 @@ impl ::core::clone::Clone for Point { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::marker::Copy for Point { } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for Point { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { ::core::fmt::Formatter::debug_struct_field2_finish(f, "Point", "x", @@ -111,7 +99,6 @@ impl ::core::fmt::Debug for Point { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::default::Default for Point { #[inline] fn default() -> Point { @@ -122,7 +109,6 @@ impl ::core::default::Default for Point { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for Point { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { ::core::hash::Hash::hash(&self.x, state); @@ -131,7 +117,6 @@ impl ::core::hash::Hash for Point { } impl ::core::marker::StructuralPartialEq for Point {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for Point { #[inline] fn eq(&self, other: &Point) -> bool { @@ -144,7 +129,6 @@ impl ::core::cmp::PartialEq for Point { } impl ::core::marker::StructuralEq for Point {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for Point { #[inline] #[doc(hidden)] @@ -154,7 +138,6 @@ impl ::core::cmp::Eq for Point { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for Point { #[inline] fn partial_cmp(&self, other: &Point) @@ -167,7 +150,6 @@ impl ::core::cmp::PartialOrd for Point { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for Point { #[inline] fn cmp(&self, other: &Point) -> ::core::cmp::Ordering { @@ -191,7 +173,6 @@ struct Big { b8: u32, } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for Big { #[inline] fn clone(&self) -> Big { @@ -208,7 +189,6 @@ impl ::core::clone::Clone for Big { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for Big { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { let names: &'static _ = @@ -221,7 +201,6 @@ impl ::core::fmt::Debug for Big { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::default::Default for Big { #[inline] fn default() -> Big { @@ -238,7 +217,6 @@ impl ::core::default::Default for Big { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for Big { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { ::core::hash::Hash::hash(&self.b1, state); @@ -253,7 +231,6 @@ impl ::core::hash::Hash for Big { } impl ::core::marker::StructuralPartialEq for Big {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for Big { #[inline] fn eq(&self, other: &Big) -> bool { @@ -272,7 +249,6 @@ impl ::core::cmp::PartialEq for Big { } impl ::core::marker::StructuralEq for Big {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for Big { #[inline] #[doc(hidden)] @@ -282,7 +258,6 @@ impl ::core::cmp::Eq for Big { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for Big { #[inline] fn partial_cmp(&self, other: &Big) @@ -331,7 +306,6 @@ impl ::core::cmp::PartialOrd for Big { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for Big { #[inline] fn cmp(&self, other: &Big) -> ::core::cmp::Ordering { @@ -370,7 +344,6 @@ impl ::core::cmp::Ord for Big { // A struct with an unsized field. Some derives are not usable in this case. struct Unsized([u32]); #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for Unsized { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unsized", @@ -378,7 +351,6 @@ impl ::core::fmt::Debug for Unsized { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for Unsized { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { ::core::hash::Hash::hash(&self.0, state) @@ -386,7 +358,6 @@ impl ::core::hash::Hash for Unsized { } impl ::core::marker::StructuralPartialEq for Unsized {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for Unsized { #[inline] fn eq(&self, other: &Unsized) -> bool { self.0 == other.0 } @@ -395,7 +366,6 @@ impl ::core::cmp::PartialEq for Unsized { } impl ::core::marker::StructuralEq for Unsized {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for Unsized { #[inline] #[doc(hidden)] @@ -405,7 +375,6 @@ impl ::core::cmp::Eq for Unsized { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for Unsized { #[inline] fn partial_cmp(&self, other: &Unsized) @@ -414,7 +383,6 @@ impl ::core::cmp::PartialOrd for Unsized { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for Unsized { #[inline] fn cmp(&self, other: &Unsized) -> ::core::cmp::Ordering { @@ -426,7 +394,6 @@ impl ::core::cmp::Ord for Unsized { #[repr(packed)] struct PackedCopy(u32); #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for PackedCopy { #[inline] fn clone(&self) -> PackedCopy { @@ -435,10 +402,8 @@ impl ::core::clone::Clone for PackedCopy { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::marker::Copy for PackedCopy { } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for PackedCopy { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { ::core::fmt::Formatter::debug_tuple_field1_finish(f, "PackedCopy", @@ -446,7 +411,6 @@ impl ::core::fmt::Debug for PackedCopy { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::default::Default for PackedCopy { #[inline] fn default() -> PackedCopy { @@ -454,7 +418,6 @@ impl ::core::default::Default for PackedCopy { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for PackedCopy { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { ::core::hash::Hash::hash(&{ self.0 }, state) @@ -462,7 +425,6 @@ impl ::core::hash::Hash for PackedCopy { } impl ::core::marker::StructuralPartialEq for PackedCopy {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for PackedCopy { #[inline] fn eq(&self, other: &PackedCopy) -> bool { { self.0 } == { other.0 } } @@ -471,7 +433,6 @@ impl ::core::cmp::PartialEq for PackedCopy { } impl ::core::marker::StructuralEq for PackedCopy {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for PackedCopy { #[inline] #[doc(hidden)] @@ -481,7 +442,6 @@ impl ::core::cmp::Eq for PackedCopy { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for PackedCopy { #[inline] fn partial_cmp(&self, other: &PackedCopy) @@ -490,7 +450,6 @@ impl ::core::cmp::PartialOrd for PackedCopy { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for PackedCopy { #[inline] fn cmp(&self, other: &PackedCopy) -> ::core::cmp::Ordering { @@ -506,7 +465,6 @@ impl ::core::cmp::Ord for PackedCopy { #[repr(packed)] struct PackedNonCopy(u8); #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for PackedNonCopy { #[inline] fn clone(&self) -> PackedNonCopy { @@ -515,7 +473,6 @@ impl ::core::clone::Clone for PackedNonCopy { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for PackedNonCopy { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { let Self(ref __self_0_0) = *self; @@ -524,7 +481,6 @@ impl ::core::fmt::Debug for PackedNonCopy { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::default::Default for PackedNonCopy { #[inline] fn default() -> PackedNonCopy { @@ -532,7 +488,6 @@ impl ::core::default::Default for PackedNonCopy { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for PackedNonCopy { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { let Self(ref __self_0_0) = *self; @@ -541,7 +496,6 @@ impl ::core::hash::Hash for PackedNonCopy { } impl ::core::marker::StructuralPartialEq for PackedNonCopy {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for PackedNonCopy { #[inline] fn eq(&self, other: &PackedNonCopy) -> bool { @@ -558,7 +512,6 @@ impl ::core::cmp::PartialEq for PackedNonCopy { } impl ::core::marker::StructuralEq for PackedNonCopy {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for PackedNonCopy { #[inline] #[doc(hidden)] @@ -568,7 +521,6 @@ impl ::core::cmp::Eq for PackedNonCopy { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for PackedNonCopy { #[inline] fn partial_cmp(&self, other: &PackedNonCopy) @@ -579,7 +531,6 @@ impl ::core::cmp::PartialOrd for PackedNonCopy { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for PackedNonCopy { #[inline] fn cmp(&self, other: &PackedNonCopy) -> ::core::cmp::Ordering { @@ -592,23 +543,19 @@ impl ::core::cmp::Ord for PackedNonCopy { // An empty enum. enum Enum0 {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for Enum0 { #[inline] fn clone(&self) -> Enum0 { *self } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::marker::Copy for Enum0 { } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for Enum0 { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { unsafe { ::core::intrinsics::unreachable() } } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for Enum0 { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { unsafe { ::core::intrinsics::unreachable() } @@ -616,7 +563,6 @@ impl ::core::hash::Hash for Enum0 { } impl ::core::marker::StructuralPartialEq for Enum0 {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for Enum0 { #[inline] fn eq(&self, other: &Enum0) -> bool { @@ -625,7 +571,6 @@ impl ::core::cmp::PartialEq for Enum0 { } impl ::core::marker::StructuralEq for Enum0 {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for Enum0 { #[inline] #[doc(hidden)] @@ -633,7 +578,6 @@ impl ::core::cmp::Eq for Enum0 { fn assert_receiver_is_total_eq(&self) -> () {} } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for Enum0 { #[inline] fn partial_cmp(&self, other: &Enum0) @@ -642,7 +586,6 @@ impl ::core::cmp::PartialOrd for Enum0 { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for Enum0 { #[inline] fn cmp(&self, other: &Enum0) -> ::core::cmp::Ordering { @@ -657,7 +600,6 @@ enum Enum1 { }, } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for Enum1 { #[inline] fn clone(&self) -> Enum1 { @@ -668,7 +610,6 @@ impl ::core::clone::Clone for Enum1 { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for Enum1 { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { match self { @@ -679,7 +620,6 @@ impl ::core::fmt::Debug for Enum1 { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for Enum1 { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { match self { @@ -690,7 +630,6 @@ impl ::core::hash::Hash for Enum1 { } impl ::core::marker::StructuralPartialEq for Enum1 {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for Enum1 { #[inline] fn eq(&self, other: &Enum1) -> bool { @@ -709,7 +648,6 @@ impl ::core::cmp::PartialEq for Enum1 { } impl ::core::marker::StructuralEq for Enum1 {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for Enum1 { #[inline] #[doc(hidden)] @@ -719,7 +657,6 @@ impl ::core::cmp::Eq for Enum1 { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for Enum1 { #[inline] fn partial_cmp(&self, other: &Enum1) @@ -731,7 +668,6 @@ impl ::core::cmp::PartialOrd for Enum1 { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for Enum1 { #[inline] fn cmp(&self, other: &Enum1) -> ::core::cmp::Ordering { @@ -749,39 +685,33 @@ enum Fieldless1 { A, } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for Fieldless1 { #[inline] fn clone(&self) -> Fieldless1 { Fieldless1::A } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for Fieldless1 { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { ::core::fmt::Formatter::write_str(f, "A") } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::default::Default for Fieldless1 { #[inline] fn default() -> Fieldless1 { Self::A } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for Fieldless1 { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {} } impl ::core::marker::StructuralPartialEq for Fieldless1 {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for Fieldless1 { #[inline] fn eq(&self, other: &Fieldless1) -> bool { true } } impl ::core::marker::StructuralEq for Fieldless1 {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for Fieldless1 { #[inline] #[doc(hidden)] @@ -789,7 +719,6 @@ impl ::core::cmp::Eq for Fieldless1 { fn assert_receiver_is_total_eq(&self) -> () {} } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for Fieldless1 { #[inline] fn partial_cmp(&self, other: &Fieldless1) @@ -798,7 +727,6 @@ impl ::core::cmp::PartialOrd for Fieldless1 { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for Fieldless1 { #[inline] fn cmp(&self, other: &Fieldless1) -> ::core::cmp::Ordering { @@ -815,16 +743,13 @@ enum Fieldless { C, } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for Fieldless { #[inline] fn clone(&self) -> Fieldless { *self } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::marker::Copy for Fieldless { } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for Fieldless { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { match self { @@ -835,13 +760,11 @@ impl ::core::fmt::Debug for Fieldless { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::default::Default for Fieldless { #[inline] fn default() -> Fieldless { Self::A } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for Fieldless { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { let __self_tag = ::core::intrinsics::discriminant_value(self); @@ -850,7 +773,6 @@ impl ::core::hash::Hash for Fieldless { } impl ::core::marker::StructuralPartialEq for Fieldless {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for Fieldless { #[inline] fn eq(&self, other: &Fieldless) -> bool { @@ -861,7 +783,6 @@ impl ::core::cmp::PartialEq for Fieldless { } impl ::core::marker::StructuralEq for Fieldless {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for Fieldless { #[inline] #[doc(hidden)] @@ -869,7 +790,6 @@ impl ::core::cmp::Eq for Fieldless { fn assert_receiver_is_total_eq(&self) -> () {} } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for Fieldless { #[inline] fn partial_cmp(&self, other: &Fieldless) @@ -880,7 +800,6 @@ impl ::core::cmp::PartialOrd for Fieldless { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for Fieldless { #[inline] fn cmp(&self, other: &Fieldless) -> ::core::cmp::Ordering { @@ -903,7 +822,6 @@ enum Mixed { }, } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for Mixed { #[inline] fn clone(&self) -> Mixed { @@ -912,10 +830,8 @@ impl ::core::clone::Clone for Mixed { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::marker::Copy for Mixed { } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for Mixed { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { match self { @@ -931,13 +847,11 @@ impl ::core::fmt::Debug for Mixed { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::default::Default for Mixed { #[inline] fn default() -> Mixed { Self::P } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for Mixed { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { let __self_tag = ::core::intrinsics::discriminant_value(self); @@ -954,7 +868,6 @@ impl ::core::hash::Hash for Mixed { } impl ::core::marker::StructuralPartialEq for Mixed {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for Mixed { #[inline] fn eq(&self, other: &Mixed) -> bool { @@ -987,7 +900,6 @@ impl ::core::cmp::PartialEq for Mixed { } impl ::core::marker::StructuralEq for Mixed {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for Mixed { #[inline] #[doc(hidden)] @@ -997,7 +909,6 @@ impl ::core::cmp::Eq for Mixed { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for Mixed { #[inline] fn partial_cmp(&self, other: &Mixed) @@ -1025,7 +936,6 @@ impl ::core::cmp::PartialOrd for Mixed { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for Mixed { #[inline] fn cmp(&self, other: &Mixed) -> ::core::cmp::Ordering { @@ -1054,7 +964,6 @@ impl ::core::cmp::Ord for Mixed { // for this enum. enum Fielded { X(u32), Y(bool), Z(Option<i32>), } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for Fielded { #[inline] fn clone(&self) -> Fielded { @@ -1069,7 +978,6 @@ impl ::core::clone::Clone for Fielded { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::fmt::Debug for Fielded { fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { match self { @@ -1086,7 +994,6 @@ impl ::core::fmt::Debug for Fielded { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::hash::Hash for Fielded { fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { let __self_tag = ::core::intrinsics::discriminant_value(self); @@ -1100,7 +1007,6 @@ impl ::core::hash::Hash for Fielded { } impl ::core::marker::StructuralPartialEq for Fielded {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialEq for Fielded { #[inline] fn eq(&self, other: &Fielded) -> bool { @@ -1135,7 +1041,6 @@ impl ::core::cmp::PartialEq for Fielded { } impl ::core::marker::StructuralEq for Fielded {} #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Eq for Fielded { #[inline] #[doc(hidden)] @@ -1147,7 +1052,6 @@ impl ::core::cmp::Eq for Fielded { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::PartialOrd for Fielded { #[inline] fn partial_cmp(&self, other: &Fielded) @@ -1170,7 +1074,6 @@ impl ::core::cmp::PartialOrd for Fielded { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::cmp::Ord for Fielded { #[inline] fn cmp(&self, other: &Fielded) -> ::core::cmp::Ordering { @@ -1199,7 +1102,6 @@ pub union Union { pub i: i32, } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::clone::Clone for Union { #[inline] fn clone(&self) -> Union { @@ -1208,5 +1110,4 @@ impl ::core::clone::Clone for Union { } } #[automatically_derived] -#[allow(unused_qualifications)] impl ::core::marker::Copy for Union { } diff --git a/src/test/ui/impl-trait/issue-99073-2.rs b/src/test/ui/impl-trait/issue-99073-2.rs new file mode 100644 index 00000000000..bebd8286de9 --- /dev/null +++ b/src/test/ui/impl-trait/issue-99073-2.rs @@ -0,0 +1,17 @@ +use std::fmt::Display; + +fn main() { + test("hi", true); +} + +fn test<T: Display>(t: T, recurse: bool) -> impl Display { + let f = || { + let i: u32 = test::<i32>(-1, false); + //~^ ERROR mismatched types + println!("{i}"); + }; + if recurse { + f(); + } + t +} diff --git a/src/test/ui/impl-trait/issue-99073-2.stderr b/src/test/ui/impl-trait/issue-99073-2.stderr new file mode 100644 index 00000000000..c1e4b823c08 --- /dev/null +++ b/src/test/ui/impl-trait/issue-99073-2.stderr @@ -0,0 +1,15 @@ +error[E0308]: mismatched types + --> $DIR/issue-99073-2.rs:9:22 + | +LL | fn test<T: Display>(t: T, recurse: bool) -> impl Display { + | ------------ the expected opaque type +LL | let f = || { +LL | let i: u32 = test::<i32>(-1, false); + | ^^^^^^^^^^^^^^^^^^^^^^ types differ + | + = note: expected opaque type `impl std::fmt::Display` + found type `u32` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/impl-trait/issue-99073.rs b/src/test/ui/impl-trait/issue-99073.rs new file mode 100644 index 00000000000..1d75f608666 --- /dev/null +++ b/src/test/ui/impl-trait/issue-99073.rs @@ -0,0 +1,8 @@ +fn main() { + let _ = fix(|_: &dyn Fn()| {}); +} + +fn fix<F: Fn(G), G: Fn()>(f: F) -> impl Fn() { + move || f(fix(&f)) + //~^ ERROR mismatched types +} diff --git a/src/test/ui/impl-trait/issue-99073.stderr b/src/test/ui/impl-trait/issue-99073.stderr new file mode 100644 index 00000000000..b35d58093d5 --- /dev/null +++ b/src/test/ui/impl-trait/issue-99073.stderr @@ -0,0 +1,14 @@ +error[E0308]: mismatched types + --> $DIR/issue-99073.rs:6:13 + | +LL | fn fix<F: Fn(G), G: Fn()>(f: F) -> impl Fn() { + | --------- the expected opaque type +LL | move || f(fix(&f)) + | ^^^^^^^^^^ types differ + | + = note: expected opaque type `impl Fn()` + found type parameter `G` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/impl-trait/issues/issue-99348-impl-compatibility.rs b/src/test/ui/impl-trait/issues/issue-99348-impl-compatibility.rs index d29a82f76a7..b05579f2166 100644 --- a/src/test/ui/impl-trait/issues/issue-99348-impl-compatibility.rs +++ b/src/test/ui/impl-trait/issues/issue-99348-impl-compatibility.rs @@ -6,7 +6,7 @@ type Tait = impl Sized; impl Foo for Concrete { type Item = Concrete; - //~^ mismatched types + //~^ type mismatch resolving } impl Bar for Concrete { diff --git a/src/test/ui/impl-trait/issues/issue-99348-impl-compatibility.stderr b/src/test/ui/impl-trait/issues/issue-99348-impl-compatibility.stderr index a25f0cd8761..f0dceb1b11a 100644 --- a/src/test/ui/impl-trait/issues/issue-99348-impl-compatibility.stderr +++ b/src/test/ui/impl-trait/issues/issue-99348-impl-compatibility.stderr @@ -1,15 +1,25 @@ -error[E0308]: mismatched types +error[E0271]: type mismatch resolving `<Concrete as Bar>::Other == Concrete` --> $DIR/issue-99348-impl-compatibility.rs:8:17 | LL | type Tait = impl Sized; - | ---------- the expected opaque type + | ---------- the found opaque type ... LL | type Item = Concrete; - | ^^^^^^^^ types differ + | ^^^^^^^^ type mismatch resolving `<Concrete as Bar>::Other == Concrete` | - = note: expected opaque type `Tait` - found struct `Concrete` +note: expected this to be `Concrete` + --> $DIR/issue-99348-impl-compatibility.rs:13:18 + | +LL | type Other = Tait; + | ^^^^ + = note: expected struct `Concrete` + found opaque type `Tait` +note: required by a bound in `Foo::Item` + --> $DIR/issue-99348-impl-compatibility.rs:17:20 + | +LL | type Item: Bar<Other = Self>; + | ^^^^^^^^^^^^ required by this bound in `Foo::Item` error: aborting due to previous error -For more information about this error, try `rustc --explain E0308`. +For more information about this error, try `rustc --explain E0271`. diff --git a/src/test/ui/lint/auxiliary/add-impl.rs b/src/test/ui/lint/auxiliary/add-impl.rs new file mode 100644 index 00000000000..9d0e3068aed --- /dev/null +++ b/src/test/ui/lint/auxiliary/add-impl.rs @@ -0,0 +1,22 @@ +// force-host +// no-prefer-dynamic + +#![crate_type = "proc-macro"] + +extern crate proc_macro; + +use proc_macro::TokenStream; + +#[proc_macro_derive(AddImpl)] +// Unnecessary qualification `bar::foo` +// https://github.com/rust-lang/rust/issues/71898 +pub fn derive(input: TokenStream) -> TokenStream { + "impl B { + fn foo(&self) { use bar::foo; bar::foo() } + } + + fn foo() {} + + mod bar { pub fn foo() {} } + ".parse().unwrap() +} diff --git a/src/test/ui/lint/unused-qualification-in-derive-expansion.rs b/src/test/ui/lint/unused-qualification-in-derive-expansion.rs new file mode 100644 index 00000000000..c2efbf507fe --- /dev/null +++ b/src/test/ui/lint/unused-qualification-in-derive-expansion.rs @@ -0,0 +1,16 @@ +// run-pass +// aux-build:add-impl.rs + +#![forbid(unused_qualifications)] + +#[macro_use] +extern crate add_impl; + +#[derive(AddImpl)] +struct B; + +fn main() { + B.foo(); + foo(); + bar::foo(); +} diff --git a/src/test/ui/parser/fn-header-semantic-fail.rs b/src/test/ui/parser/fn-header-semantic-fail.rs index c2954868f78..8ff14fb1f30 100644 --- a/src/test/ui/parser/fn-header-semantic-fail.rs +++ b/src/test/ui/parser/fn-header-semantic-fail.rs @@ -27,7 +27,7 @@ fn main() { struct Y; impl X for Y { async fn ft1() {} //~ ERROR functions in traits cannot be declared `async` - //~^ ERROR impl has stricter requirements than trait + //~^ ERROR has an incompatible type for trait unsafe fn ft2() {} // OK. const fn ft3() {} //~ ERROR functions in traits cannot be declared const extern "C" fn ft4() {} @@ -36,7 +36,7 @@ fn main() { //~| ERROR functions in traits cannot be declared const //~| ERROR functions cannot be both `const` and `async` //~| ERROR cycle detected - //~| ERROR impl has stricter requirements than trait + //~| ERROR has an incompatible type for trait } impl Y { diff --git a/src/test/ui/parser/fn-header-semantic-fail.stderr b/src/test/ui/parser/fn-header-semantic-fail.stderr index 75d27c614e2..bc51ba8b8c5 100644 --- a/src/test/ui/parser/fn-header-semantic-fail.stderr +++ b/src/test/ui/parser/fn-header-semantic-fail.stderr @@ -216,23 +216,41 @@ LL | | } LL | | } | |_^ -error[E0276]: impl has stricter requirements than trait - --> $DIR/fn-header-semantic-fail.rs:29:9 +error[E0053]: method `ft1` has an incompatible type for trait + --> $DIR/fn-header-semantic-fail.rs:29:24 | -LL | async fn ft1(); - | --------------- definition of `ft1` from trait -... LL | async fn ft1() {} - | ^^^^^^^^^^^^^^ impl has extra requirement `(): Future` + | ^ + | | + | checked the `Output` of this `async fn`, found opaque type + | expected `()`, found opaque type + | + = note: while checking the return type of the `async fn` +note: type in trait + --> $DIR/fn-header-semantic-fail.rs:17:23 + | +LL | async fn ft1(); + | ^ + = note: expected fn pointer `fn()` + found fn pointer `fn() -> impl Future<Output = ()>` -error[E0276]: impl has stricter requirements than trait - --> $DIR/fn-header-semantic-fail.rs:34:9 +error[E0053]: method `ft5` has an incompatible type for trait + --> $DIR/fn-header-semantic-fail.rs:34:48 | -LL | const async unsafe extern "C" fn ft5(); - | --------------------------------------- definition of `ft5` from trait -... LL | const async unsafe extern "C" fn ft5() {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `(): Future` + | ^ + | | + | checked the `Output` of this `async fn`, found opaque type + | expected `()`, found opaque type + | + = note: while checking the return type of the `async fn` +note: type in trait + --> $DIR/fn-header-semantic-fail.rs:21:47 + | +LL | const async unsafe extern "C" fn ft5(); + | ^ + = note: expected fn pointer `unsafe extern "C" fn()` + found fn pointer `unsafe extern "C" fn() -> impl Future<Output = ()>` error[E0391]: cycle detected when computing type of `main::<impl at $DIR/fn-header-semantic-fail.rs:28:5: 28:17>::ft5::{opaque#0}` --> $DIR/fn-header-semantic-fail.rs:34:48 @@ -308,5 +326,5 @@ LL | | } error: aborting due to 23 previous errors -Some errors have detailed explanations: E0276, E0379, E0391, E0706. -For more information about an error, try `rustc --explain E0276`. +Some errors have detailed explanations: E0053, E0379, E0391, E0706. +For more information about an error, try `rustc --explain E0053`. diff --git a/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.rs b/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.rs index 6facc467f7a..aaf0f7eaef0 100644 --- a/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.rs +++ b/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.rs @@ -14,7 +14,7 @@ trait B { impl B for A { async fn associated(); //~ ERROR without body //~^ ERROR cannot be declared `async` - //~| ERROR impl has stricter requirements than trait + //~| ERROR has an incompatible type for trait } fn main() {} diff --git a/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.stderr b/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.stderr index c144060a859..d3214458eac 100644 --- a/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.stderr +++ b/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.stderr @@ -44,16 +44,25 @@ LL | async fn associated(); = note: `async` trait functions are not currently supported = note: consider using the `async-trait` crate: https://crates.io/crates/async-trait -error[E0276]: impl has stricter requirements than trait - --> $DIR/issue-70736-async-fn-no-body-def-collector.rs:15:5 +error[E0053]: method `associated` has an incompatible type for trait + --> $DIR/issue-70736-async-fn-no-body-def-collector.rs:15:26 | LL | async fn associated(); - | ---------------------- definition of `associated` from trait -... + | ^ + | | + | checked the `Output` of this `async fn`, found opaque type + | expected `()`, found opaque type + | + = note: while checking the return type of the `async fn` +note: type in trait + --> $DIR/issue-70736-async-fn-no-body-def-collector.rs:11:26 + | LL | async fn associated(); - | ^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `(): Future` + | ^ + = note: expected fn pointer `fn()` + found fn pointer `fn() -> impl Future<Output = ()>` error: aborting due to 6 previous errors -Some errors have detailed explanations: E0276, E0706. -For more information about an error, try `rustc --explain E0276`. +Some errors have detailed explanations: E0053, E0706. +For more information about an error, try `rustc --explain E0053`. diff --git a/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.rs b/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.rs index 377ce85e8b2..4a11bb5020e 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.rs +++ b/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.rs @@ -3,7 +3,7 @@ type Foo = impl Fn() -> Foo; fn foo() -> Foo { -//~^ ERROR: overflow evaluating the requirement `fn() -> Foo {foo}: Sized` +//~^ ERROR: overflow evaluating the requirement foo } diff --git a/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.stderr b/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.stderr index d20b1cc6d85..00c682b2193 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-53398-cyclic-types.stderr @@ -1,10 +1,8 @@ -error[E0275]: overflow evaluating the requirement `fn() -> Foo {foo}: Sized` +error[E0275]: overflow evaluating the requirement `<fn() -> Foo {foo} as FnOnce<()>>::Output == fn() -> Foo {foo}` --> $DIR/issue-53398-cyclic-types.rs:5:13 | LL | fn foo() -> Foo { | ^^^ - | - = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_53398_cyclic_types`) error: aborting due to previous error diff --git a/src/test/ui/type-alias-impl-trait/issue-57961.rs b/src/test/ui/type-alias-impl-trait/issue-57961.rs new file mode 100644 index 00000000000..472886c9caa --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57961.rs @@ -0,0 +1,18 @@ +#![feature(type_alias_impl_trait)] + +type X = impl Sized; + +trait Foo { + type Bar: Iterator<Item = X>; +} + +impl Foo for () { + type Bar = std::vec::IntoIter<u32>; + //~^ ERROR type mismatch resolving `<std::vec::IntoIter<u32> as Iterator>::Item == X +} + +fn incoherent() { + let f: X = 22_i32; +} + +fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-57961.stderr b/src/test/ui/type-alias-impl-trait/issue-57961.stderr new file mode 100644 index 00000000000..ed4caf6ce68 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57961.stderr @@ -0,0 +1,20 @@ +error[E0271]: type mismatch resolving `<std::vec::IntoIter<u32> as Iterator>::Item == X` + --> $DIR/issue-57961.rs:10:16 + | +LL | type X = impl Sized; + | ---------- the expected opaque type +... +LL | type Bar = std::vec::IntoIter<u32>; + | ^^^^^^^^^^^^^^^^^^^^^^^ expected opaque type, found `u32` + | + = note: expected opaque type `X` + found type `u32` +note: required by a bound in `Foo::Bar` + --> $DIR/issue-57961.rs:6:24 + | +LL | type Bar: Iterator<Item = X>; + | ^^^^^^^^ required by this bound in `Foo::Bar` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0271`. |
