if let Some(path) = types.maybe_resolve_path(&trait_bound.path, None) {
if types.skip_path(&path) { continue; }
if path == "Sized" { continue; }
+ if path == "core::fmt::Debug" {
+ // #[derive(Debug)] will add Debug bounds on each genericin the
+ // auto-generated impl. In cases where the existing generic
+ // bound already requires Debug this is redundant and should be
+ // ignored (which we do here). However, in cases where this is
+ // not redundant, this may cause spurious Debug impls which may
+ // fail to compile.
+ continue;
+ }
if non_lifetimes_processed { return false; }
non_lifetimes_processed = true;
if path != "std::ops::Deref" && path != "core::ops::Deref" &&
// Note that no !is_ref types can map to an array because Rust and C's call semantics
// for arrays are different (https://github.com/eqrion/cbindgen/issues/528)
+ "[u8; 33]" if !is_ref => Some("crate::c_types::ThirtyThreeBytes"),
"[u8; 32]" if !is_ref => Some("crate::c_types::ThirtyTwoBytes"),
"[u8; 20]" if !is_ref => Some("crate::c_types::TwentyBytes"),
"[u8; 16]" if !is_ref => Some("crate::c_types::SixteenBytes"),
"Option" if is_ref => Some("&local_"),
"Option" => Some("local_"),
+ "[u8; 33]" if !is_ref => Some(""),
"[u8; 32]" if is_ref => Some("unsafe { &*"),
"[u8; 32]" if !is_ref => Some(""),
"[u8; 20]" if !is_ref => Some(""),
"Option" => Some(""),
"Result" if !is_ref => Some(""),
+ "[u8; 33]" if !is_ref => Some(".data"),
"[u8; 32]" if is_ref => Some("}"),
"[u8; 32]" if !is_ref => Some(".data"),
"[u8; 20]" if !is_ref => Some(".data"),
"Vec" if !is_ref => Some("local_"),
"Option" => Some("local_"),
+ "[u8; 33]" if is_ref => Some(""),
"[u8; 32]" if !is_ref => Some("crate::c_types::ThirtyTwoBytes { data: "),
"[u8; 32]" if is_ref => Some(""),
"[u8; 20]" if !is_ref => Some("crate::c_types::TwentyBytes { data: "),
"Vec" if !is_ref => Some(".into()"),
"Option" => Some(""),
+ "[u8; 33]" if is_ref => Some(""),
"[u8; 32]" if !is_ref => Some(" }"),
"[u8; 32]" if is_ref => Some(""),
"[u8; 20]" if !is_ref => Some(" }"),