Auto merge of #14788 - HKalbasi:derive-impl-f, r=Veykril

Use double reference in debug derive

fix #14768
This commit is contained in:
bors 2023-05-12 09:14:55 +00:00
commit 884dd8c966
4 changed files with 91 additions and 8 deletions

View File

@ -387,7 +387,7 @@ fn fmt(&self , f: &mut core::fmt::Formatter) -> core::fmt::Result {
Command::Move { Command::Move {
x: x, y: y, x: x, y: y,
} }
=>f.debug_struct("Move").field("x", x).field("y", y).finish(), Command::Do(f0, )=>f.debug_tuple("Do").field(f0).finish(), Command::Jump=>f.write_str("Jump"), =>f.debug_struct("Move").field("x", &x).field("y", &y).finish(), Command::Do(f0, )=>f.debug_tuple("Do").field(&f0).finish(), Command::Jump=>f.write_str("Jump"),
} }
} }
}"#]], }"#]],

View File

@ -519,7 +519,7 @@ fn debug_expand(
let for_fields = fields.iter().map(|x| { let for_fields = fields.iter().map(|x| {
let x_string = x.to_string(); let x_string = x.to_string();
quote! { quote! {
.field(#x_string, #x) .field(#x_string, & #x)
} }
}); });
quote! { quote! {
@ -529,7 +529,7 @@ fn debug_expand(
VariantShape::Tuple(n) => { VariantShape::Tuple(n) => {
let for_fields = tuple_field_iterator(*n).map(|x| { let for_fields = tuple_field_iterator(*n).map(|x| {
quote! { quote! {
.field(#x) .field( & #x)
} }
}); });
quote! { quote! {

View File

@ -658,6 +658,26 @@ fn f() {
//^ error: expected (), found i32 //^ error: expected (), found i32
} }
} }
"#,
);
}
#[test]
fn regression_14768() {
check_diagnostics(
r#"
//- minicore: derive, fmt, slice, coerce_unsized, builtin_impls
use core::fmt::Debug;
#[derive(Debug)]
struct Foo(u8, u16, [u8]);
#[derive(Debug)]
struct Bar {
f1: u8,
f2: &[u16],
f3: dyn Debug,
}
"#, "#,
); );
} }

View File

@ -766,6 +766,38 @@ pub mod fmt {
pub struct Error; pub struct Error;
pub type Result = Result<(), Error>; pub type Result = Result<(), Error>;
pub struct Formatter<'a>; pub struct Formatter<'a>;
pub struct DebugTuple;
pub struct DebugStruct;
impl Formatter<'_> {
pub fn debug_tuple(&mut self, name: &str) -> DebugTuple {
DebugTuple
}
pub fn debug_struct(&mut self, name: &str) -> DebugStruct {
DebugStruct
}
}
impl DebugTuple {
pub fn field(&mut self, value: &dyn Debug) -> &mut Self {
self
}
pub fn finish(&mut self) -> Result {
Ok(())
}
}
impl DebugStruct {
pub fn field(&mut self, name: &str, value: &dyn Debug) -> &mut Self {
self
}
pub fn finish(&mut self) -> Result {
Ok(())
}
}
pub trait Debug { pub trait Debug {
fn fmt(&self, f: &mut Formatter<'_>) -> Result; fn fmt(&self, f: &mut Formatter<'_>) -> Result;
} }
@ -777,6 +809,39 @@ pub trait Display {
#[rustc_builtin_macro] #[rustc_builtin_macro]
pub macro Debug($item:item) {} pub macro Debug($item:item) {}
// endregion:derive // endregion:derive
// region:builtin_impls
macro_rules! impl_debug {
($($t:ty)*) => {
$(
impl const Debug for $t {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
Ok(())
}
}
)*
}
}
impl_debug! {
usize u8 u16 u32 u64 u128
isize i8 i16 i32 i64 i128
f32 f64
bool char
}
impl<T: Debug> Debug for [T] {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
Ok(())
}
}
impl<T: Debug + ?Sized> Debug for &T {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
(&**self).fmt(f)
}
}
// endregion:builtin_impls
} }
// endregion:fmt // endregion:fmt
@ -1075,10 +1140,8 @@ fn next(&mut self) -> Option<T> {
// region:panic // region:panic
mod panic { mod panic {
pub macro panic_2021 { pub macro panic_2021($($t:tt)+) {
($($t:tt)+) => ( /* Nothing yet */
/* Nothing yet */
),
} }
} }
// endregion:panic // endregion:panic
@ -1158,8 +1221,8 @@ pub mod v1 {
ops::Drop, // :drop ops::Drop, // :drop
ops::{Fn, FnMut, FnOnce}, // :fn ops::{Fn, FnMut, FnOnce}, // :fn
option::Option::{self, None, Some}, // :option option::Option::{self, None, Some}, // :option
result::Result::{self, Err, Ok}, // :result
panic, // :panic panic, // :panic
result::Result::{self, Err, Ok}, // :result
}; };
} }