1use crate::gen::out::{Content, OutFile};
2use std::collections::BTreeSet;
3
4#[derive(#[automatically_derived]
impl<'a> ::core::default::Default for Pragma<'a> {
#[inline]
fn default() -> Pragma<'a> {
Pragma {
gnu_diagnostic_ignore: ::core::default::Default::default(),
clang_diagnostic_ignore: ::core::default::Default::default(),
dollar_in_identifier: ::core::default::Default::default(),
mismatched_new_delete: ::core::default::Default::default(),
missing_declarations: ::core::default::Default::default(),
return_type_c_linkage: ::core::default::Default::default(),
begin: ::core::default::Default::default(),
end: ::core::default::Default::default(),
}
}
}Default)]
5pub(crate) struct Pragma<'a> {
6 pub gnu_diagnostic_ignore: BTreeSet<&'a str>,
7 pub clang_diagnostic_ignore: BTreeSet<&'a str>,
8 pub dollar_in_identifier: bool,
9 pub mismatched_new_delete: bool,
10 pub missing_declarations: bool,
11 pub return_type_c_linkage: bool,
12 pub begin: Content<'a>,
13 pub end: Content<'a>,
14}
15
16impl<'a> Pragma<'a> {
17 pub fn new() -> Self {
18 Pragma::default()
19 }
20}
21
22pub(super) fn write(out: &mut OutFile) {
23 let Pragma {
24 ref mut gnu_diagnostic_ignore,
25 ref mut clang_diagnostic_ignore,
26 dollar_in_identifier,
27 mismatched_new_delete,
28 missing_declarations,
29 return_type_c_linkage,
30 ref mut begin,
31 ref mut end,
32 } = out.pragma;
33
34 if dollar_in_identifier {
35 clang_diagnostic_ignore.insert("-Wdollar-in-identifier-extension");
36 }
37 if mismatched_new_delete {
38 gnu_diagnostic_ignore.insert("-Wmismatched-new-delete");
39 }
40 if missing_declarations {
41 gnu_diagnostic_ignore.insert("-Wmissing-declarations");
42 }
43 if return_type_c_linkage {
44 clang_diagnostic_ignore.insert("-Wreturn-type-c-linkage");
45 }
46 let gnu_diagnostic_ignore = &*gnu_diagnostic_ignore;
47 let clang_diagnostic_ignore = &*clang_diagnostic_ignore;
48
49 if !gnu_diagnostic_ignore.is_empty() {
50 begin.write_fmt(format_args!("#ifdef __GNUC__\n"));writeln!(begin, "#ifdef __GNUC__");
51 if out.header {
52 begin.write_fmt(format_args!("#pragma GCC diagnostic push\n"));writeln!(begin, "#pragma GCC diagnostic push");
53 }
54 for diag in gnu_diagnostic_ignore {
55 begin.write_fmt(format_args!("#pragma GCC diagnostic ignored \"{0}\"\n",
diag));writeln!(begin, "#pragma GCC diagnostic ignored \"{diag}\"");
56 }
57 }
58 if !clang_diagnostic_ignore.is_empty() {
59 begin.write_fmt(format_args!("#ifdef __clang__\n"));writeln!(begin, "#ifdef __clang__");
60 if out.header && gnu_diagnostic_ignore.is_empty() {
61 begin.write_fmt(format_args!("#pragma clang diagnostic push\n"));writeln!(begin, "#pragma clang diagnostic push");
62 }
63 for diag in clang_diagnostic_ignore {
64 begin.write_fmt(format_args!("#pragma clang diagnostic ignored \"{0}\"\n",
diag));writeln!(begin, "#pragma clang diagnostic ignored \"{diag}\"");
65 }
66 begin.write_fmt(format_args!("#endif // __clang__\n"));writeln!(begin, "#endif // __clang__");
67 }
68 if !gnu_diagnostic_ignore.is_empty() {
69 begin.write_fmt(format_args!("#endif // __GNUC__\n"));writeln!(begin, "#endif // __GNUC__");
70 }
71
72 if out.header {
73 if !gnu_diagnostic_ignore.is_empty() {
74 end.write_fmt(format_args!("#ifdef __GNUC__\n"));writeln!(end, "#ifdef __GNUC__");
75 end.write_fmt(format_args!("#pragma GCC diagnostic pop\n"));writeln!(end, "#pragma GCC diagnostic pop");
76 end.write_fmt(format_args!("#endif // __GNUC__\n"));writeln!(end, "#endif // __GNUC__");
77 } else if !clang_diagnostic_ignore.is_empty() {
78 end.write_fmt(format_args!("#ifdef __clang__\n"));writeln!(end, "#ifdef __clang__");
79 end.write_fmt(format_args!("#pragma clang diagnostic pop\n"));writeln!(end, "#pragma clang diagnostic pop");
80 end.write_fmt(format_args!("#endif // __clang__\n"));writeln!(end, "#endif // __clang__");
81 }
82 }
83}