diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index e62b1a870..e498d2b26 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -618,12 +618,18 @@ impl CodeGenerator for Var { return; } + let mut attrs = vec![]; + if let Some(comment) = item.comment(ctx) { + attrs.push(attributes::doc(comment)); + } + let ty = self.ty().to_rust_ty_or_opaque(ctx, &()); if let Some(val) = self.val() { match *val { VarType::Bool(val) => { result.push(quote! { + #(#attrs)* pub const #canonical_ident : #ty = #val ; }); } @@ -643,6 +649,7 @@ impl CodeGenerator for Var { helpers::ast_ty::uint_expr(val as _) }; result.push(quote! { + #(#attrs)* pub const #canonical_ident : #ty = #val ; }); } @@ -660,12 +667,14 @@ impl CodeGenerator for Var { Ok(string) => { let cstr = helpers::ast_ty::cstr_expr(string); result.push(quote! { + #(#attrs)* pub const #canonical_ident : &'static #ty = #cstr ; }); } Err(..) => { let bytes = helpers::ast_ty::byte_array_expr(bytes); result.push(quote! { + #(#attrs)* pub const #canonical_ident : #ty = #bytes ; }); } @@ -674,6 +683,7 @@ impl CodeGenerator for Var { VarType::Float(f) => { match helpers::ast_ty::float_expr(ctx, f) { Ok(expr) => result.push(quote! { + #(#attrs)* pub const #canonical_ident : #ty = #expr ; }), Err(..) => return, @@ -681,13 +691,12 @@ impl CodeGenerator for Var { } VarType::Char(c) => { result.push(quote! { + #(#attrs)* pub const #canonical_ident : #ty = #c ; }); } } } else { - let mut attrs = vec![]; - // If necessary, apply a `#[link_name]` attribute let link_name = self.mangled_name().unwrap_or(self.name()); if !utils::names_will_be_identical_after_mangling( diff --git a/tests/expectations/tests/issue-1995.rs b/tests/expectations/tests/issue-1995.rs new file mode 100644 index 000000000..58e11eb29 --- /dev/null +++ b/tests/expectations/tests/issue-1995.rs @@ -0,0 +1,37 @@ +#![allow( + dead_code, + non_snake_case, + non_camel_case_types, + non_upper_case_globals +)] + +/// This is a constant that has a docstring +/// +/// And expected to be found in generated bindings code too. +pub const FOO: ::std::os::raw::c_int = 1; +/// This is a constant that has a docstring +/// +/// And expected to be found in generated bindings code too. +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct Bar { + pub baz: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_Bar() { + assert_eq!( + ::std::mem::size_of::(), + 4usize, + concat!("Size of: ", stringify!(Bar)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(Bar)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).baz as *const _ as usize }, + 0usize, + concat!("Offset of field: ", stringify!(Bar), "::", stringify!(baz)) + ); +} diff --git a/tests/headers/issue-1995.h b/tests/headers/issue-1995.h new file mode 100644 index 000000000..619f67354 --- /dev/null +++ b/tests/headers/issue-1995.h @@ -0,0 +1,12 @@ +/// This is a constant that has a docstring +/// +/// And expected to be found in generated bindings code too. +const int FOO = 1; + +/// This is a constant that has a docstring +/// +/// And expected to be found in generated bindings code too. +struct Bar +{ + int baz; +}; \ No newline at end of file