in src/bindgen/language_backend/clike.rs [642:706]
fn write_union<W: Write>(&mut self, out: &mut SourceWriter<W>, u: &Union) {
let condition = u.cfg.to_condition(self.config);
condition.write_before(self.config, out);
self.write_documentation(out, &u.documentation);
self.write_generic_param(out, &u.generic_params);
// The following results in
// C++ or C with Tag as style:
// union Name {
// C with Type only style:
// typedef union {
// C with Both as style:
// typedef union Name {
if self.generate_typedef() {
out.write("typedef ");
}
out.write("union");
if let Some(align) = u.alignment {
match align {
ReprAlign::Packed => {
if let Some(ref anno) = self.config.layout.packed {
write!(out, " {}", anno);
}
}
ReprAlign::Align(n) => {
if let Some(ref anno) = self.config.layout.aligned_n {
write!(out, " {}({})", anno, n);
}
}
}
}
if self.config.language != Language::C || self.config.style.generate_tag() {
write!(out, " {}", u.export_name);
}
out.open_brace();
// Emit the pre_body section, if relevant
if let Some(body) = self.config.export.pre_body(&u.path) {
out.write_raw_block(body);
out.new_line();
}
out.write_vertical_source_list(self, &u.fields, ListType::Cap(";"), Self::write_field);
// Emit the post_body section, if relevant
if let Some(body) = self.config.export.post_body(&u.path) {
out.new_line();
out.write_raw_block(body);
}
if self.generate_typedef() {
out.close_brace(false);
write!(out, " {};", u.export_name);
} else {
out.close_brace(true);
}
condition.write_after(self.config, out);
}