From 737d6449eb1b476af10e6a98058ed79b5421215f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 1 Nov 2016 15:20:22 +0100 Subject: [PATCH 0001/2291] tests: Get rid of feature-specific tests. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The only difference in bindings is because the methods were inlined, so with llvm 3.9 we can skip those. Signed-off-by: Emilio Cobos Álvarez --- tests/headers/class_with_typedef.hpp | 10 ++++------ tests/tools/run-bindgen.py | 30 +++++++--------------------- 2 files changed, 11 insertions(+), 29 deletions(-) diff --git a/tests/headers/class_with_typedef.hpp b/tests/headers/class_with_typedef.hpp index 8e09e8db36..8707cffefb 100644 --- a/tests/headers/class_with_typedef.hpp +++ b/tests/headers/class_with_typedef.hpp @@ -1,5 +1,3 @@ -// bindgen-features: llvm_stable - typedef int AnotherInt; class C { @@ -12,10 +10,10 @@ class C { AnotherInt d; AnotherInt* other_ptr; - void method(MyInt c) {}; - void methodRef(MyInt& c) {}; - void complexMethodRef(Lookup& c) {}; - void anotherMethod(AnotherInt c) {}; + void method(MyInt c); + void methodRef(MyInt& c); + void complexMethodRef(Lookup& c); + void anotherMethod(AnotherInt c); }; class D: public C { diff --git a/tests/tools/run-bindgen.py b/tests/tools/run-bindgen.py index ddd5d11baa..258a60e5c3 100755 --- a/tests/tools/run-bindgen.py +++ b/tests/tools/run-bindgen.py @@ -10,7 +10,6 @@ import tempfile BINDGEN_FLAGS_PREFIX = "// bindgen-flags: " -BINDGEN_FEATURES_PREFIX = "// bindgen-features: " COMMON_PRELUDE = """ #![allow(non_snake_case)] @@ -78,15 +77,10 @@ def make_bindgen_env(): return env -def get_bindgen_flags_and_features(header_path): +def get_bindgen_flags(header_path): """ - Return the bindgen flags and features required for this header as a tuple - (flags, features). + Return the bindgen flags required for this header """ - found_flags = False - found_features = False - - features = [] flags = ["--no-unstable-rust"] for line in COMMON_PRELUDE.split("\n"): flags.append("--raw-line") @@ -94,18 +88,11 @@ def get_bindgen_flags_and_features(header_path): with open(header_path) as f: for line in f: - if not found_flags and line.startswith(BINDGEN_FLAGS_PREFIX): + if line.startswith(BINDGEN_FLAGS_PREFIX): flags.extend(line.strip().split(BINDGEN_FLAGS_PREFIX)[1].split(" ")) - found_flags = True - - if not found_features and line.startswith(BINDGEN_FEATURES_PREFIX): - features.extend(line.strip().split(BINDGEN_FEATURES_PREFIX)[1].split(" ")) - found_features = True - - if found_flags and found_features: break - return (flags, features) + return flags def get_expected_bindings(rust_bindings_path): """ @@ -163,7 +150,7 @@ def check_actual_vs_expected(expected_bindings, rust_bindings_path): def to_diffable(s): return map(lambda l: l + "\n", s.split("\n")) - + diff = difflib.unified_diff(to_diffable(expected_bindings), to_diffable(actual_bindings), fromfile="expected_bindings.rs", @@ -172,14 +159,11 @@ def to_diffable(s): sys.stderr.write("\n") sys.exit(1) - + def main(): args = parse_args() - (test_flags, test_features) = get_bindgen_flags_and_features(args.header) - if not all(f in args.features for f in test_features): - sys.exit(0) - + test_flags = get_bindgen_flags(args.header) expected_bindings = get_expected_bindings(args.rust_bindings) generate_bindings(args.bindgen, test_flags, args.header, args.rust_bindings) test_generated_bindings(args.rust_bindings) From 010e191295b2dba65dff47362b23bfdd66e1e608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 1 Nov 2016 12:27:18 +0100 Subject: [PATCH 0002/2291] Add rustfmt.toml --- rustfmt.toml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 rustfmt.toml diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000000..6677939bce --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,11 @@ +max_width = 80 +format_strings = false +wrap_comments = true +fn_brace_style = "SameLineWhere" +item_brace_style = "SameLineWhere" +struct_lit_multiline_style = "ForceMulti" +where_trailing_comma = true +reorder_imports = true +reorder_imported_names = true +normalize_comments = false +write_mode = "Overwrite" From b67acd3e035fe171d61dfb0abc7d9607217615d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 1 Nov 2016 12:28:24 +0100 Subject: [PATCH 0003/2291] Don't auto-format generated files. --- src/clangll.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/clangll.rs b/src/clangll.rs index 272fa5741c..b89c07569f 100644 --- a/src/clangll.rs +++ b/src/clangll.rs @@ -5,6 +5,7 @@ #![allow(unused_attributes)] #![allow(non_snake_case)] #![allow(non_upper_case_globals)] +#![cfg_attr(rustfmt, rustfmt_skip)] use ::std::os::raw::{ c_char, c_int, c_long, c_longlong, c_uint, c_ulong, c_ulonglong, c_void}; From bac243c5879a7487dffb4108770e97649b67b8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 1 Nov 2016 12:39:37 +0100 Subject: [PATCH 0004/2291] Refactor how doc_mod works so rustfmt finds those modules easily. --- src/lib.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 19ecb6c9a3..e297186eaa 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -42,22 +42,29 @@ extern crate lazy_static; // undocumented. Normal builds, however, will leave the module private, so that // we don't expose internals to library consumers. macro_rules! doc_mod { - ($m:ident) => { + ($m:ident, $doc_mod_name:ident) => { cfg_if! { if #[cfg(feature = "_docs")] { - pub mod $m; + pub mod $doc_mod_name { + //! Autogenerated documentation module. + pub use super::$m::*; + } } else { - mod $m; } } }; } mod clangll; -doc_mod!(clang); -doc_mod!(ir); -doc_mod!(parse); -doc_mod!(regex_set); +mod clang; +mod ir; +mod parse; +mod regex_set; + +doc_mod!(clang, clang_docs); +doc_mod!(ir, ir_docs); +doc_mod!(parse, parse_docs); +doc_mod!(regex_set, regex_set_docs); mod codegen { include!(concat!(env!("OUT_DIR"), "/codegen.rs")); From 7bc41e5b6271d3f916511b5dc9e099da1778fb51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 1 Nov 2016 12:46:12 +0100 Subject: [PATCH 0005/2291] Convert mod comment to a proper comment to avoid hitting https://github.com/rust-lang-nursery/rustfmt/issues/1184 --- src/codegen/helpers.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codegen/helpers.rs b/src/codegen/helpers.rs index e82d5c59de..234dcbcc0c 100644 --- a/src/codegen/helpers.rs +++ b/src/codegen/helpers.rs @@ -1,4 +1,4 @@ -/// Helpers for code generation that don't need macro expansion. +//! Helpers for code generation that don't need macro expansion. use aster; use ir::layout::Layout; From 163848e82c692db951ed301b0a9e3fee9d45338c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 1 Nov 2016 12:47:32 +0100 Subject: [PATCH 0006/2291] Let rustfmt find the codegen module. --- src/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index e297186eaa..4f12667226 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -61,6 +61,9 @@ mod ir; mod parse; mod regex_set; +#[cfg(rustfmt)] +mod codegen; + doc_mod!(clang, clang_docs); doc_mod!(ir, ir_docs); doc_mod!(parse, parse_docs); From f226fef4c8e0c97d674a2426eb8bd7f1ad0141e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 1 Nov 2016 12:56:14 +0100 Subject: [PATCH 0007/2291] Run `cargo fmt`. --- src/bin/bindgen.rs | 52 +++-- src/clang.rs | 461 ++++++++++++++++++++++---------------- src/codegen/mod.rs | 506 +++++++++++++++++++++++++----------------- src/ir/annotations.rs | 23 +- src/ir/comp.rs | 152 +++++++------ src/ir/context.rs | 190 +++++++++------- src/ir/enum_ty.rs | 25 ++- src/ir/function.rs | 61 +++-- src/ir/int.rs | 12 +- src/ir/item.rs | 253 +++++++++++++-------- src/ir/module.rs | 14 +- src/ir/ty.rs | 248 ++++++++++++--------- src/ir/var.rs | 76 ++++--- src/lib.rs | 38 ++-- src/parse.rs | 45 ++-- src/regex_set.rs | 10 +- 16 files changed, 1286 insertions(+), 880 deletions(-) diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index 119776bdf5..2a7995e799 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -8,13 +8,13 @@ extern crate log; extern crate clang_sys; extern crate rustc_serialize; -use bindgen::{Bindings, BindgenOptions, LinkType}; +use bindgen::{BindgenOptions, Bindings, LinkType}; use std::default::Default; +use std::env; +use std::fs; use std::io; use std::path; use std::process; -use std::env; -use std::fs; const USAGE: &'static str = " Usage: @@ -119,7 +119,8 @@ fn parse_args_or_exit(args: Vec) -> (BindgenOptions, Box) { options.links.push((lib, LinkType::Static)); } "--framework-link" => { - let lib = iter.next().expect("--framework-link needs an argument"); + let lib = iter.next() + .expect("--framework-link needs an argument"); options.links.push((lib, LinkType::Framework)); } "--raw-line" => { @@ -127,23 +128,28 @@ fn parse_args_or_exit(args: Vec) -> (BindgenOptions, Box) { options.raw_lines.push(line); } "--opaque-type" => { - let ty_canonical_name = iter.next().expect("--opaque-type expects a type"); + let ty_canonical_name = iter.next() + .expect("--opaque-type expects a type"); options.opaque_types.insert(ty_canonical_name); } "--blacklist-type" => { - let ty_canonical_name = iter.next().expect("--blacklist-type expects a type"); + let ty_canonical_name = iter.next() + .expect("--blacklist-type expects a type"); options.hidden_types.insert(ty_canonical_name); } "--whitelist-type" => { - let ty_pat = iter.next().expect("--whitelist-type expects a type pattern"); + let ty_pat = iter.next() + .expect("--whitelist-type expects a type pattern"); options.whitelisted_types.insert(&ty_pat); } "--whitelist-function" => { - let function_pat = iter.next().expect("--whitelist-function expects a pattern"); + let function_pat = iter.next() + .expect("--whitelist-function expects a pattern"); options.whitelisted_functions.insert(&function_pat); } "--whitelist-var" => { - let var_pat = iter.next().expect("--whitelist-var expects a pattern"); + let var_pat = iter.next() + .expect("--whitelist-var expects a pattern"); options.whitelisted_vars.insert(&var_pat); } "--" => { @@ -202,25 +208,31 @@ fn parse_args_or_exit(args: Vec) -> (BindgenOptions, Box) { pub fn main() { log::set_logger(|max_log_level| { - use env_logger::Logger; - let env_logger = Logger::new(); - max_log_level.set(env_logger.filter()); - Box::new(env_logger) - }).expect("Failed to set logger."); + use env_logger::Logger; + let env_logger = Logger::new(); + max_log_level.set(env_logger.filter()); + Box::new(env_logger) + }) + .expect("Failed to set logger."); let mut bind_args: Vec<_> = env::args().collect(); if let Some(clang) = clang_sys::support::Clang::find(None) { - let has_clang_args = bind_args.iter().rposition(|arg| *arg == "--").is_some(); + let has_clang_args = + bind_args.iter().rposition(|arg| *arg == "--").is_some(); if !has_clang_args { bind_args.push("--".to_owned()); } - // If --target is specified, assume caller knows what they're doing and don't mess with + // If --target is specified, assume caller knows what they're doing and + // don't mess with // include paths for them - let has_target_arg = bind_args.iter().rposition(|arg| arg.starts_with("--target")).is_some(); + let has_target_arg = bind_args.iter() + .rposition(|arg| arg.starts_with("--target")) + .is_some(); if !has_target_arg { - // TODO: distinguish C and C++ paths? C++'s should be enough, I guess. + // TODO: distinguish C and C++ paths? C++'s should be enough, I + // guess. for path in clang.cpp_search_paths.into_iter() { if let Ok(path) = path.into_os_string().into_string() { bind_args.push("-isystem".to_owned()); @@ -233,8 +245,8 @@ pub fn main() { let (options, out) = parse_args_or_exit(bind_args); let bindings = Bindings::generate(options, None) - .expect("Unable to generate bindings"); + .expect("Unable to generate bindings"); bindings.write(out) - .expect("Unable to write bindings to file."); + .expect("Unable to write bindings to file."); } diff --git a/src/clang.rs b/src/clang.rs index ba6fc7f68f..24d9e45e8a 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -3,27 +3,31 @@ #![allow(non_upper_case_globals, dead_code)] -use std::os::raw::{c_uint, c_char, c_int, c_ulong, c_longlong}; + +use clangll::*; use std::{mem, ptr}; +use std::ffi::{CStr, CString}; use std::fmt; use std::hash::Hash; use std::hash::Hasher; -use std::ffi::{CString, CStr}; - -use clangll::*; +use std::os::raw::{c_char, c_int, c_longlong, c_uint, c_ulong}; /// A cursor into the Clang AST, pointing to an AST node. /// /// We call the AST node pointed to by the cursor the cursor's "referent". #[derive(Copy, Clone)] pub struct Cursor { - x: CXCursor + x: CXCursor, } impl fmt::Debug for Cursor { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - write!(fmt, "Cursor({} kind: {}, loc: {}, usr: {:?})", - self.spelling(), kind_to_str(self.kind()), self.location(), self.usr()) + write!(fmt, + "Cursor({} kind: {}, loc: {}, usr: {:?})", + self.spelling(), + kind_to_str(self.kind()), + self.location(), + self.usr()) } } @@ -32,7 +36,8 @@ impl fmt::Debug for Cursor { /// The first argument is the AST node currently being visited. The second /// argument is the parent of the AST node currently being visited. The return /// value informs how traversal should proceed. -pub type CursorVisitor<'s> = for<'a, 'b> FnMut(&'a Cursor, &'b Cursor) -> Enum_CXChildVisitResult + 's; +pub type CursorVisitor<'s> = for<'a, 'b> FnMut(&'a Cursor, &'b Cursor) + -> Enum_CXChildVisitResult + 's; impl Cursor { /// Get the Unified Symbol Resolution for this cursor's referent, if @@ -40,12 +45,11 @@ impl Cursor { /// /// The USR can be used to compare entities across translation units. pub fn usr(&self) -> Option { - let s = String_ { x: unsafe { clang_getCursorUSR(self.x) } }.to_string(); - if s.is_empty() { - None - } else { - Some(s) - } + let s = String_ { + x: unsafe { clang_getCursorUSR(self.x) }, + } + .to_string(); + if s.is_empty() { None } else { Some(s) } } /// Is this cursor's referent a declaration? @@ -55,13 +59,18 @@ impl Cursor { /// Get the null cursor, which has no referent. pub fn null() -> Self { - Cursor { x: unsafe { clang_getNullCursor() } } + Cursor { + x: unsafe { clang_getNullCursor() }, + } } /// Get this cursor's referent's spelling. pub fn spelling(&self) -> String { unsafe { - String_ { x: clang_getCursorSpelling(self.x) }.to_string() + String_ { + x: clang_getCursorSpelling(self.x), + } + .to_string() } } @@ -71,14 +80,20 @@ impl Cursor { /// information, such as parameters for a function, etc. pub fn display_name(&self) -> String { unsafe { - String_ { x: clang_getCursorDisplayName(self.x) }.to_string() + String_ { + x: clang_getCursorDisplayName(self.x), + } + .to_string() } } /// Get the mangled name of this cursor's referent. pub fn mangling(&self) -> String { unsafe { - String_ { x: clang_Cursor_getMangling(self.x) }.to_string() + String_ { + x: clang_Cursor_getMangling(self.x), + } + .to_string() } } @@ -101,7 +116,9 @@ impl Cursor { /// ``` pub fn lexical_parent(&self) -> Cursor { unsafe { - Cursor { x: clang_getCursorLexicalParent(self.x) } + Cursor { + x: clang_getCursorLexicalParent(self.x), + } } } @@ -123,7 +140,9 @@ impl Cursor { /// lexical parents. pub fn semantic_parent(&self) -> Cursor { unsafe { - Cursor { x: clang_getCursorSemanticParent(self.x) } + Cursor { + x: clang_getCursorSemanticParent(self.x), + } } } @@ -131,7 +150,7 @@ impl Cursor { /// if the referent is either a template specialization or /// declaration. Returns -1 otherwise. pub fn num_template_args(&self) -> Option { - let n : c_int = unsafe { clang_Cursor_getNumTemplateArguments(self.x) }; + let n: c_int = unsafe { clang_Cursor_getNumTemplateArguments(self.x) }; if n >= 0 { Some(n as u32) @@ -165,8 +184,7 @@ impl Cursor { while semantic_parent.kind() == CXCursor_Namespace || semantic_parent.kind() == CXCursor_NamespaceAlias || - semantic_parent.kind() == CXCursor_NamespaceRef - { + semantic_parent.kind() == CXCursor_NamespaceRef { semantic_parent = semantic_parent.semantic_parent(); } @@ -177,16 +195,12 @@ impl Cursor { /// Get the kind of referent this cursor is pointing to. pub fn kind(&self) -> Enum_CXCursorKind { - unsafe { - clang_getCursorKind(self.x) - } + unsafe { clang_getCursorKind(self.x) } } /// Is the referent an anonymous record definition? pub fn is_anonymous(&self) -> bool { - unsafe { - clang_Cursor_isAnonymous(self.x) != 0 - } + unsafe { clang_Cursor_isAnonymous(self.x) != 0 } } /// Is the referent a template specialization? @@ -208,34 +222,35 @@ impl Cursor { } let parent = self.semantic_parent(); (parent.is_template() && !parent.is_fully_specialized_template()) || - parent.is_in_non_fully_specialized_template() + parent.is_in_non_fully_specialized_template() } /// Is this cursor pointing a valid referent? pub fn is_valid(&self) -> bool { - unsafe { - clang_isInvalid(self.kind()) == 0 - } + unsafe { clang_isInvalid(self.kind()) == 0 } } /// Get the source location for the referent. pub fn location(&self) -> SourceLocation { unsafe { - SourceLocation { x: clang_getCursorLocation(self.x) } + SourceLocation { + x: clang_getCursorLocation(self.x), + } } } /// Get the source location range for the referent. pub fn extent(&self) -> CXSourceRange { - unsafe { - clang_getCursorExtent(self.x) - } + unsafe { clang_getCursorExtent(self.x) } } /// Get the raw declaration comment for this referent, if one exists. pub fn raw_comment(&self) -> Option { let s = unsafe { - String_ { x: clang_Cursor_getRawCommentText(self.x) }.to_string() + String_ { + x: clang_Cursor_getRawCommentText(self.x), + } + .to_string() }; if s.is_empty() { None } else { Some(s) } } @@ -243,14 +258,18 @@ impl Cursor { /// Get the referent's parsed comment. pub fn comment(&self) -> Comment { unsafe { - Comment { x: clang_Cursor_getParsedComment(self.x) } + Comment { + x: clang_Cursor_getParsedComment(self.x), + } } } /// Get the referent's type. pub fn cur_type(&self) -> Type { unsafe { - Type { x: clang_getCursorType(self.x) } + Type { + x: clang_getCursorType(self.x), + } } } @@ -259,7 +278,9 @@ impl Cursor { /// the declared thing. pub fn definition(&self) -> Cursor { unsafe { - Cursor { x: clang_getCursorDefinition(self.x) } + Cursor { + x: clang_getCursorDefinition(self.x), + } } } @@ -267,7 +288,9 @@ impl Cursor { /// pointing to the referenced type. pub fn referenced(&self) -> Cursor { unsafe { - Cursor { x: clang_getCursorReferenced(self.x) } + Cursor { + x: clang_getCursorReferenced(self.x), + } } } @@ -278,7 +301,9 @@ impl Cursor { /// referent type. pub fn canonical(&self) -> Cursor { unsafe { - Cursor { x: clang_getCanonicalCursor(self.x) } + Cursor { + x: clang_getCanonicalCursor(self.x), + } } } @@ -286,7 +311,9 @@ impl Cursor { /// pointing to the template definition that is being specialized. pub fn specialized(&self) -> Cursor { unsafe { - Cursor { x: clang_getSpecializedCursorTemplate(self.x) } + Cursor { + x: clang_getSpecializedCursorTemplate(self.x), + } } } @@ -302,10 +329,15 @@ impl Cursor { /// for details on arguments passed to the function and how its return value /// is interpreted. pub fn visit(&self, func: F) - where F: for<'a, 'b> FnMut(&'a Cursor, &'b Cursor) -> Enum_CXChildVisitResult + where F: for<'a, 'b> FnMut(&'a Cursor, &'b Cursor) + -> Enum_CXChildVisitResult, { let mut data: Box = Box::new(func); - let opt_visit = Some(visit_children as extern "C" fn(CXCursor, CXCursor, CXClientData) -> Enum_CXChildVisitResult); + let opt_visit = + Some(visit_children as extern "C" fn(CXCursor, + CXCursor, + CXClientData) + -> Enum_CXChildVisitResult); unsafe { clang_visitChildren(self.x, opt_visit, mem::transmute(&mut data)); } @@ -332,11 +364,7 @@ impl Cursor { pub fn bit_width(&self) -> Option { unsafe { let w = clang_getFieldDeclBitWidth(self.x); - if w == -1 { - None - } else { - Some(w as u32) - } + if w == -1 { None } else { Some(w as u32) } } } @@ -344,7 +372,9 @@ impl Cursor { /// enum type. pub fn enum_type(&self) -> Type { unsafe { - Type { x: clang_getEnumDeclIntegerType(self.x) } + Type { + x: clang_getEnumDeclIntegerType(self.x), + } } } @@ -354,9 +384,7 @@ impl Cursor { /// which is also a valid enum value, so callers should check the cursor /// kind before calling this method (see issue #127). pub fn enum_val_signed(&self) -> i64 { - unsafe { - clang_getEnumConstantDeclValue(self.x) as i64 - } + unsafe { clang_getEnumConstantDeclValue(self.x) as i64 } } /// Get the unsigned constant value for this cursor's enum variant referent. @@ -365,16 +393,16 @@ impl Cursor { /// which is also a valid enum value, so callers should check the cursor /// kind before calling this method (see issue #128). pub fn enum_val_unsigned(&self) -> u64 { - unsafe { - clang_getEnumConstantDeclUnsignedValue(self.x) as u64 - } + unsafe { clang_getEnumConstantDeclUnsignedValue(self.x) as u64 } } /// Given that this cursor's referent is a `typedef`, get the `Type` that is /// being aliased. pub fn typedef_type(&self) -> Type { unsafe { - Type { x: clang_getTypedefDeclUnderlyingType(self.x) } + Type { + x: clang_getTypedefDeclUnderlyingType(self.x), + } } } @@ -382,16 +410,12 @@ impl Cursor { /// /// This only applies to functions and variables. pub fn linkage(&self) -> Enum_CXLinkageKind { - unsafe { - clang_getCursorLinkage(self.x) - } + unsafe { clang_getCursorLinkage(self.x) } } /// Get the visibility of this cursor's referent. pub fn visibility(&self) -> Enum_CXVisibilityKind { - unsafe { - clang_getCursorVisibility(self.x) - } + unsafe { clang_getCursorVisibility(self.x) } } /// Given that this cursor's referent is a function, return cursors to its @@ -401,7 +425,9 @@ impl Cursor { let num = self.num_args().expect("expected value, got none") as u32; let mut args = vec![]; for i in 0..num { - args.push(Cursor { x: clang_Cursor_getArgument(self.x, i as c_uint) }); + args.push(Cursor { + x: clang_Cursor_getArgument(self.x, i as c_uint), + }); } args } @@ -411,7 +437,9 @@ impl Cursor { /// declaration, return a cursor to its return type. pub fn ret_type(&self) -> Type { unsafe { - Type { x: clang_getCursorResultType(self.x) } + Type { + x: clang_getCursorResultType(self.x), + } } } @@ -423,55 +451,39 @@ impl Cursor { pub fn num_args(&self) -> Result { unsafe { let w = clang_Cursor_getNumArguments(self.x); - if w == -1 { - Err(()) - } else { - Ok(w as u32) - } + if w == -1 { Err(()) } else { Ok(w as u32) } } } /// Get the access specifier for this cursor's referent. pub fn access_specifier(&self) -> Enum_CX_CXXAccessSpecifier { - unsafe { - clang_getCXXAccessSpecifier(self.x) - } + unsafe { clang_getCXXAccessSpecifier(self.x) } } /// Is this cursor's referent a field declaration that is marked as /// `mutable`? pub fn is_mutable_field(&self) -> bool { - unsafe { - clang_CXXField_isMutable(self.x) != 0 - } + unsafe { clang_CXXField_isMutable(self.x) != 0 } } /// Is this cursor's referent a member function that is declared `static`? pub fn method_is_static(&self) -> bool { - unsafe { - clang_CXXMethod_isStatic(self.x) != 0 - } + unsafe { clang_CXXMethod_isStatic(self.x) != 0 } } /// Is this cursor's referent a member function that is declared `const`? pub fn method_is_const(&self) -> bool { - unsafe { - clang_CXXMethod_isConst(self.x) != 0 - } + unsafe { clang_CXXMethod_isConst(self.x) != 0 } } /// Is this cursor's referent a member function that is declared `const`? pub fn method_is_virtual(&self) -> bool { - unsafe { - clang_CXXMethod_isVirtual(self.x) != 0 - } + unsafe { clang_CXXMethod_isVirtual(self.x) != 0 } } /// Is this cursor's referent a struct or class with virtual members? pub fn is_virtual_base(&self) -> bool { - unsafe { - clang_isVirtualBase(self.x) != 0 - } + unsafe { clang_isVirtualBase(self.x) != 0 } } /// Given that this cursor's referent is a template specialization or @@ -480,32 +492,33 @@ impl Cursor { /// If the referent is not a template or `i` is out of bounds, an invalid /// kind is returned. pub fn template_arg_kind(&self, i: c_int) -> CXTemplateArgumentKind { - unsafe { - clang_Cursor_getTemplateArgumentKind(self.x, i as c_uint) - } + unsafe { clang_Cursor_getTemplateArgumentKind(self.x, i as c_uint) } } /// Given that this cursor's referent is a template specialization, and that /// the `i`th template argument is an integral, get the `i`th template /// argument value. pub fn template_arg_value(&self, i: c_int) -> c_longlong { - unsafe { - clang_Cursor_getTemplateArgumentValue(self.x, i as c_uint) - } + unsafe { clang_Cursor_getTemplateArgumentValue(self.x, i as c_uint) } } } -extern fn visit_children(cur: CXCursor, parent: CXCursor, - data: CXClientData) -> Enum_CXChildVisitResult { +extern "C" fn visit_children(cur: CXCursor, + parent: CXCursor, + data: CXClientData) + -> Enum_CXChildVisitResult { let func: &mut Box = unsafe { mem::transmute(data) }; - (*func)(&Cursor { x : cur }, &Cursor { x: parent }) + (*func)(&Cursor { + x: cur, + }, + &Cursor { + x: parent, + }) } impl PartialEq for Cursor { fn eq(&self, other: &Cursor) -> bool { - unsafe { - clang_equalCursors(self.x, other.x) == 1 - } + unsafe { clang_equalCursors(self.x, other.x) == 1 } } } @@ -520,14 +533,12 @@ impl Hash for Cursor { /// The type of a node in clang's AST. #[derive(Clone, Hash)] pub struct Type { - x: CXType + x: CXType, } impl PartialEq for Type { fn eq(&self, other: &Self) -> bool { - unsafe { - clang_equalTypes(self.x, other.x) != 0 - } + unsafe { clang_equalTypes(self.x, other.x) != 0 } } } @@ -535,8 +546,11 @@ impl Eq for Type {} impl fmt::Debug for Type { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - write!(fmt, "Type({}, kind: {}, decl: {:?}, canon: {:?})", - self.spelling(), type_to_str(self.kind()), self.declaration(), + write!(fmt, + "Type({}, kind: {}, decl: {:?}, canon: {:?})", + self.spelling(), + type_to_str(self.kind()), + self.declaration(), self.declaration().canonical()) } } @@ -582,22 +596,25 @@ impl Type { /// Get a cursor pointing to this type's declaration. pub fn declaration(&self) -> Cursor { unsafe { - Cursor { x: clang_getTypeDeclaration(self.x) } + Cursor { + x: clang_getTypeDeclaration(self.x), + } } } /// Get a raw display name for this type. pub fn spelling(&self) -> String { unsafe { - String_ { x: clang_getTypeSpelling(self.x) }.to_string() + String_ { + x: clang_getTypeSpelling(self.x), + } + .to_string() } } /// Is this type const qualified? pub fn is_const(&self) -> bool { - unsafe { - clang_isConstQualifiedType(self.x) != 0 - } + unsafe { clang_isConstQualifiedType(self.x) != 0 } } /// What is the size of this type? Paper over invalid types by returning `0` @@ -657,7 +674,7 @@ impl Type { Some(TypeTemplateArgIterator { x: self.x, length: n as u32, - index: 0 + index: 0, }) } else { debug_assert_eq!(n, -1); @@ -669,14 +686,18 @@ impl Type { /// to. pub fn pointee_type(&self) -> Type { unsafe { - Type { x: clang_getPointeeType(self.x) } + Type { + x: clang_getPointeeType(self.x), + } } } /// Given that this type is an array, vector, or complex type, return the /// type of its elements. pub fn elem_type(&self) -> Option { - let current_type = Type { x: unsafe { clang_getElementType(self.x) } }; + let current_type = Type { + x: unsafe { clang_getElementType(self.x) }, + }; if current_type.kind() != CXType_Invalid { Some(current_type) } else { @@ -699,15 +720,15 @@ impl Type { /// aliases to get the underlying, canonical type. pub fn canonical_type(&self) -> Type { unsafe { - Type { x: clang_getCanonicalType(self.x) } + Type { + x: clang_getCanonicalType(self.x), + } } } /// Is this type a variadic function type? pub fn is_variadic(&self) -> bool { - unsafe { - clang_isFunctionTypeVariadic(self.x) != 0 - } + unsafe { clang_isFunctionTypeVariadic(self.x) != 0 } } /// Given that this type is a function type, get the types of its @@ -715,9 +736,11 @@ impl Type { pub fn arg_types(&self) -> Vec { unsafe { let num = clang_getNumArgTypes(self.x) as usize; - let mut args = vec!(); + let mut args = vec![]; for i in 0..num { - args.push(Type { x: clang_getArgType(self.x, i as c_uint) }); + args.push(Type { + x: clang_getArgType(self.x, i as c_uint), + }); } args } @@ -726,7 +749,9 @@ impl Type { /// Given that this type is a function type, get the type of its return /// value. pub fn ret_type(&self) -> Option { - let rt = Type { x: unsafe { clang_getResultType(self.x) } }; + let rt = Type { + x: unsafe { clang_getResultType(self.x) }, + }; if rt.kind() == CXType_Invalid { None } else { @@ -737,9 +762,7 @@ impl Type { /// Given that this type is a function type, get its calling convention. If /// this is not a function type, `CXCallingConv_Invalid` is returned. pub fn call_conv(&self) -> Enum_CXCallingConv { - unsafe { - clang_getFunctionTypeCallingConv(self.x) - } + unsafe { clang_getFunctionTypeCallingConv(self.x) } } /// For elaborated types (types which use `class`, `struct`, or `union` to @@ -747,7 +770,9 @@ impl Type { #[cfg(not(feature="llvm_stable"))] pub fn named(&self) -> Type { unsafe { - Type { x: clang_Type_getNamedType(self.x) } + Type { + x: clang_Type_getNamedType(self.x), + } } } } @@ -756,7 +781,7 @@ impl Type { pub struct TypeTemplateArgIterator { x: CXType, length: u32, - index: u32 + index: u32, } impl Iterator for TypeTemplateArgIterator { @@ -765,7 +790,9 @@ impl Iterator for TypeTemplateArgIterator { if self.index < self.length { let idx = self.index as c_int; self.index += 1; - Some(Type { x: unsafe { clang_Type_getTemplateArgumentAsType(self.x, idx) } }) + Some(Type { + x: unsafe { clang_Type_getTemplateArgumentAsType(self.x, idx) }, + }) } else { None } @@ -782,7 +809,7 @@ impl ExactSizeIterator for TypeTemplateArgIterator { /// A `SourceLocation` is a file, line, column, and byte offset location for /// some source text. pub struct SourceLocation { - x: CXSourceLocation + x: CXSourceLocation, } impl SourceLocation { @@ -794,8 +821,17 @@ impl SourceLocation { let mut line = 0; let mut col = 0; let mut off = 0; - clang_getSpellingLocation(self.x, &mut file, &mut line, &mut col, &mut off); - (File { x: file }, line as usize, col as usize, off as usize) + clang_getSpellingLocation(self.x, + &mut file, + &mut line, + &mut col, + &mut off); + (File { + x: file, + }, + line as usize, + col as usize, + off as usize) } } } @@ -815,15 +851,13 @@ impl fmt::Display for SourceLocation { /// /// Comments are sort of parsed by Clang, and have a tree structure. pub struct Comment { - x: CXComment + x: CXComment, } impl Comment { /// What kind of comment is this? pub fn kind(&self) -> Enum_CXCommentKind { - unsafe { - clang_Comment_getKind(self.x) - } + unsafe { clang_Comment_getKind(self.x) } } /// Get this comment's children comment @@ -831,7 +865,7 @@ impl Comment { CommentChildrenIterator { parent: self.x, length: unsafe { clang_Comment_getNumChildren(self.x) }, - index: 0 + index: 0, } } @@ -839,7 +873,10 @@ impl Comment { /// name. pub fn get_tag_name(&self) -> String { unsafe { - String_ { x: clang_HTMLTagComment_getTagName(self.x) }.to_string() + String_ { + x: clang_HTMLTagComment_getTagName(self.x), + } + .to_string() } } @@ -848,7 +885,7 @@ impl Comment { CommentAttributesIterator { x: self.x, length: unsafe { clang_HTMLStartTag_getNumAttrs(self.x) }, - index: 0 + index: 0, } } } @@ -857,7 +894,7 @@ impl Comment { pub struct CommentChildrenIterator { parent: CXComment, length: c_uint, - index: c_uint + index: c_uint, } impl Iterator for CommentChildrenIterator { @@ -866,7 +903,9 @@ impl Iterator for CommentChildrenIterator { if self.index < self.length { let idx = self.index; self.index += 1; - Some( Comment { x: unsafe { clang_Comment_getChild(self.parent, idx) } } ) + Some(Comment { + x: unsafe { clang_Comment_getChild(self.parent, idx) }, + }) } else { None } @@ -878,14 +917,14 @@ pub struct CommentAttribute { /// HTML start tag attribute name pub name: String, /// HTML start tag attribute value - pub value: String + pub value: String, } /// An iterator for a comment's attributes pub struct CommentAttributesIterator { x: CXComment, length: c_uint, - index: c_uint + index: c_uint, } impl Iterator for CommentAttributesIterator { @@ -894,9 +933,19 @@ impl Iterator for CommentAttributesIterator { if self.index < self.length { let idx = self.index; self.index += 1; - Some( CommentAttribute { - name: String_ { x: unsafe { clang_HTMLStartTag_getAttrName(self.x, idx) } }.to_string(), - value: String_ { x: unsafe { clang_HTMLStartTag_getAttrValue(self.x, idx) } }.to_string() + Some(CommentAttribute { + name: String_ { + x: unsafe { + clang_HTMLStartTag_getAttrName(self.x, idx) + }, + } + .to_string(), + value: String_ { + x: unsafe { + clang_HTMLStartTag_getAttrValue(self.x, idx) + }, + } + .to_string(), }) } else { None @@ -906,7 +955,7 @@ impl Iterator for CommentAttributesIterator { /// A source file. pub struct File { - x: CXFile + x: CXFile, } impl File { @@ -916,14 +965,17 @@ impl File { return None; } unsafe { - Some(String_ { x: clang_getFileName(self.x) }.to_string()) + Some(String_ { + x: clang_getFileName(self.x), + } + .to_string()) } } } /// A Clang string. pub struct String_ { - x: CXString + x: CXString, } impl fmt::Display for String_ { @@ -942,7 +994,7 @@ impl fmt::Display for String_ { /// An `Index` is an environment for a set of translation units that will /// typically end up linked together in one final binary. pub struct Index { - x: CXIndex + x: CXIndex, } impl Index { @@ -954,7 +1006,9 @@ impl Index { /// The `diag` parameter controls whether debugging diagnostics are enabled. pub fn new(pch: bool, diag: bool) -> Index { unsafe { - Index { x: clang_createIndex(pch as c_int, diag as c_int) } + Index { + x: clang_createIndex(pch as c_int, diag as c_int), + } } } } @@ -984,7 +1038,7 @@ pub struct Token { /// A translation unit (or "compilation unit"). pub struct TranslationUnit { - x: CXTranslationUnit + x: CXTranslationUnit, } impl fmt::Debug for TranslationUnit { @@ -995,14 +1049,22 @@ impl fmt::Debug for TranslationUnit { impl TranslationUnit { /// Parse a source file into a translation unit. - pub fn parse(ix: &Index, file: &str, cmd_args: &[String], - unsaved: &[UnsavedFile], opts: ::libc::c_uint) -> Option { + pub fn parse(ix: &Index, + file: &str, + cmd_args: &[String], + unsaved: &[UnsavedFile], + opts: ::libc::c_uint) + -> Option { let fname = CString::new(file).unwrap(); - let _c_args: Vec = cmd_args.iter().map(|s| CString::new(s.clone()).unwrap()).collect(); - let c_args: Vec<*const c_char> = _c_args.iter().map(|s| s.as_ptr()).collect(); - let mut c_unsaved: Vec = unsaved.iter().map(|f| f.x).collect(); + let _c_args: Vec = + cmd_args.iter().map(|s| CString::new(s.clone()).unwrap()).collect(); + let c_args: Vec<*const c_char> = + _c_args.iter().map(|s| s.as_ptr()).collect(); + let mut c_unsaved: Vec = + unsaved.iter().map(|f| f.x).collect(); let tu = unsafe { - clang_parseTranslationUnit(ix.x, fname.as_ptr(), + clang_parseTranslationUnit(ix.x, + fname.as_ptr(), c_args.as_ptr(), c_args.len() as c_int, c_unsaved.as_mut_ptr(), @@ -1012,14 +1074,17 @@ impl TranslationUnit { if tu.is_null() { None } else { - Some(TranslationUnit { x: tu }) + Some(TranslationUnit { + x: tu, + }) } } /// Reparse this translation unit, maybe because the file changed on disk or /// something like that. pub fn reparse(&self, unsaved: &[UnsavedFile], opts: usize) -> bool { - let mut c_unsaved: Vec = unsaved.iter().map(|f| f.x).collect(); + let mut c_unsaved: Vec = + unsaved.iter().map(|f| f.x).collect(); unsafe { clang_reparseTranslationUnit(self.x, @@ -1034,9 +1099,11 @@ impl TranslationUnit { pub fn diags(&self) -> Vec { unsafe { let num = clang_getNumDiagnostics(self.x) as usize; - let mut diags = vec!(); + let mut diags = vec![]; for i in 0..num { - diags.push(Diagnostic { x: clang_getDiagnostic(self.x, i as c_uint) }); + diags.push(Diagnostic { + x: clang_getDiagnostic(self.x, i as c_uint), + }); } diags } @@ -1045,7 +1112,9 @@ impl TranslationUnit { /// Get a cursor pointing to the root of this translation unit's AST. pub fn cursor(&self) -> Cursor { unsafe { - Cursor { x: clang_getTranslationUnitCursor(self.x) } + Cursor { + x: clang_getTranslationUnitCursor(self.x), + } } } @@ -1061,16 +1130,23 @@ impl TranslationUnit { let mut tokens = vec![]; unsafe { let mut token_ptr = ::std::ptr::null_mut(); - let mut num_tokens : c_uint = 0; + let mut num_tokens: c_uint = 0; clang_tokenize(self.x, range, &mut token_ptr, &mut num_tokens); if token_ptr.is_null() { return None; } - let token_array = ::std::slice::from_raw_parts(token_ptr, num_tokens as usize); + let token_array = ::std::slice::from_raw_parts(token_ptr, + num_tokens as usize); for &token in token_array.iter() { let kind = clang_getTokenKind(token); - let spelling = String_ { x: clang_getTokenSpelling(self.x, token) }.to_string(); - tokens.push(Token { kind: kind, spelling: spelling }); + let spelling = String_ { + x: clang_getTokenSpelling(self.x, token), + } + .to_string(); + tokens.push(Token { + kind: kind, + spelling: spelling, + }); } clang_disposeTokens(self.x, token_ptr, num_tokens); } @@ -1089,30 +1165,29 @@ impl Drop for TranslationUnit { /// A diagnostic message generated while parsing a translation unit. pub struct Diagnostic { - x: CXDiagnostic + x: CXDiagnostic, } impl Diagnostic { /// Get the default diagnostic display option bit flags. pub fn default_opts() -> usize { - unsafe { - clang_defaultDiagnosticDisplayOptions() as usize - } + unsafe { clang_defaultDiagnosticDisplayOptions() as usize } } /// Format this diagnostic message as a string, using the given option bit /// flags. pub fn format(&self, opts: usize) -> String { unsafe { - String_ { x: clang_formatDiagnostic(self.x, opts as c_uint) }.to_string() + String_ { + x: clang_formatDiagnostic(self.x, opts as c_uint), + } + .to_string() } } /// What is the severity of this diagnostic message? pub fn severity(&self) -> Enum_CXDiagnosticSeverity { - unsafe { - clang_getDiagnosticSeverity(self.x) - } + unsafe { clang_getDiagnosticSeverity(self.x) } } } @@ -1129,7 +1204,7 @@ impl Drop for Diagnostic { pub struct UnsavedFile { x: Struct_CXUnsavedFile, name: CString, - contents: CString + contents: CString, } impl UnsavedFile { @@ -1145,7 +1220,7 @@ impl UnsavedFile { UnsavedFile { x: x, name: name, - contents: contents + contents: contents, } } } @@ -1310,8 +1385,8 @@ pub fn kind_to_str(x: Enum_CXCursorKind) -> &'static str { CXCursor_MacroExpansion => "MacroExpansion", // CXCursor_MacroInstantiation => "MacroInstantiation", CXCursor_InclusionDirective => "InclusionDirective", - //CXCursor_FirstPreprocessing => "FirstPreprocessing", - //CXCursor_LastPreprocessing => "LastPreprocessing", + // CXCursor_FirstPreprocessing => "FirstPreprocessing", + // CXCursor_LastPreprocessing => "LastPreprocessing", CXCursor_PackedAttr => "PackedAttr", CXCursor_ModuleImportDecl => "ModuleImportDecl", CXCursor_TypeAliasTemplateDecl => "TypeAliasTemplateDecl", @@ -1327,15 +1402,15 @@ pub fn type_to_str(x: Enum_CXTypeKind) -> &'static str { CXType_Unexposed => "Unexposed", CXType_Void => "Void", CXType_Bool => "Bool", - CXType_Char_U => "Char_U", + CXType_Char_U => "Char_U", CXType_UChar => "UChar", - CXType_Char16=> "Char16", - CXType_Char32=> "Char32", + CXType_Char16 => "Char16", + CXType_Char32 => "Char32", CXType_UShort => "UShort", CXType_UInt => "UInt", CXType_ULong => "ULong", CXType_ULongLong => "ULongLong", - CXType_UInt128=>"UInt128", + CXType_UInt128 => "UInt128", CXType_Char_S => "Char_S", CXType_SChar => "SChar", CXType_WChar => "WChar", @@ -1343,7 +1418,7 @@ pub fn type_to_str(x: Enum_CXTypeKind) -> &'static str { CXType_Int => "Int", CXType_Long => "Long", CXType_LongLong => "LongLong", - CXType_Int128=>"Int128", + CXType_Int128 => "Int128", CXType_Float => "Float", CXType_Double => "Double", CXType_LongDouble => "LongDouble", @@ -1377,12 +1452,12 @@ pub fn type_to_str(x: Enum_CXTypeKind) -> &'static str { CXType_Auto => "Auto", #[cfg(not(feature="llvm_stable"))] CXType_Elaborated => "Elaborated", - _ => "?" + _ => "?", } } /// Dump the Clang AST to stdout for debugging purposes. -pub fn ast_dump(c: &Cursor, depth: isize)-> Enum_CXVisitorResult { +pub fn ast_dump(c: &Cursor, depth: isize) -> Enum_CXVisitorResult { fn print_indent(depth: isize, s: &str) { let mut i = 0; while i < depth { @@ -1392,14 +1467,12 @@ pub fn ast_dump(c: &Cursor, depth: isize)-> Enum_CXVisitorResult { println!("{}", s); } let ct = c.cur_type().kind(); - print_indent(depth, &format!("({} {} {}", - kind_to_str(c.kind()), - c.spelling(), - type_to_str(ct)) - ); - c.visit(| s, _: &Cursor| { - ast_dump(s, depth + 1) - }); + print_indent(depth, + &format!("({} {} {}", + kind_to_str(c.kind()), + c.spelling(), + type_to_str(ct))); + c.visit(|s, _: &Cursor| ast_dump(s, depth + 1)); print_indent(depth, ")"); CXChildVisit_Continue } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index a656c2c13a..a4d717d331 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1,32 +1,32 @@ mod helpers; -use self::helpers::{attributes, BlobTyBuilder}; +use aster; +use ir::annotations::FieldAccessorKind; +use ir::comp::{CompInfo, CompKind, Field, Method}; use ir::context::BindgenContext; -use ir::item::{Item, ItemId, ItemCanonicalName, ItemCanonicalPath}; -use ir::ty::{Type, TypeKind}; -use ir::int::IntKind; -use ir::module::Module; -use ir::var::Var; use ir::enum_ty::Enum; use ir::function::{Function, FunctionSig}; +use ir::int::IntKind; +use ir::item::{Item, ItemCanonicalName, ItemCanonicalPath, ItemId}; use ir::item_kind::ItemKind; -use ir::comp::{CompKind, CompInfo, Field, Method}; use ir::layout::Layout; -use ir::annotations::FieldAccessorKind; +use ir::module::Module; +use ir::ty::{Type, TypeKind}; use ir::type_collector::{ItemSet, TypeCollector}; - -use std::ops; +use ir::var::Var; +use self::helpers::{BlobTyBuilder, attributes}; use std::borrow::Cow; -use std::mem; use std::collections::HashSet; -use std::collections::hash_map::{HashMap, Entry}; +use std::collections::hash_map::{Entry, HashMap}; +use std::mem; + +use std::ops; use syntax::abi::Abi; use syntax::ast; use syntax::codemap::{Span, respan}; use syntax::ptr::P; -use aster; fn root_import(ctx: &BindgenContext) -> P { assert!(ctx.options().enable_cxx_namespaces, "Somebody messed it up"); @@ -39,7 +39,8 @@ struct CodegenResult { items: Vec>, saw_union: bool, items_seen: HashSet, - /// The set of generated function/var names, needed because in C/C++ is legal to + /// The set of generated function/var names, needed because in C/C++ is + /// legal to /// do something like: /// /// ```c++ @@ -99,7 +100,7 @@ impl CodegenResult { } fn inner(&mut self, cb: F) -> Vec> - where F: FnOnce(&mut Self) + where F: FnOnce(&mut Self), { let mut new = Self::new(); @@ -135,7 +136,7 @@ impl ForeignModBuilder { inner: ast::ForeignMod { abi: abi, items: vec![], - } + }, } } @@ -146,7 +147,7 @@ impl ForeignModBuilder { #[allow(dead_code)] fn with_foreign_items(mut self, items: I) -> Self - where I: IntoIterator + where I: IntoIterator, { self.inner.items.extend(items.into_iter()); self @@ -182,7 +183,7 @@ impl ToPtr for P { ast::Mutability::Immutable } else { ast::Mutability::Mutable - } + }, }); P(ast::Ty { id: ast::DUMMY_NODE_ID, @@ -217,20 +218,21 @@ impl CodeGenerator for Item { match *self.kind() { ItemKind::Module(ref module) => { - if !ctx.options().enable_cxx_namespaces && self.id() == ctx.root_module() { + if !ctx.options().enable_cxx_namespaces && + self.id() == ctx.root_module() { return; } module.codegen(ctx, result, self); - }, + } ItemKind::Function(ref fun) => { if !ctx.options().ignore_functions { fun.codegen(ctx, result, self); } - }, + } ItemKind::Var(ref var) => { var.codegen(ctx, result, self); - }, + } ItemKind::Type(ref ty) => { ty.codegen(ctx, result, self); } @@ -265,8 +267,10 @@ impl CodeGenerator for Module { }); let name = item.canonical_name(ctx); - let item = aster::AstBuilder::new().item().pub_() - .build_item_kind(name, module); + let item = aster::AstBuilder::new() + .item() + .pub_() + .build_item_kind(name, module); result.push(item); } @@ -288,9 +292,13 @@ impl CodeGenerator for Var { let ty = self.ty().to_rust_ty(ctx); if let Some(val) = self.val() { - let const_item = aster::AstBuilder::new().item().pub_() - .const_(canonical_name) - .expr().int(val).build(ty); + let const_item = aster::AstBuilder::new() + .item() + .pub_() + .const_(canonical_name) + .expr() + .int(val) + .build(ty); result.push(const_item) } else { let mut attrs = vec![]; @@ -310,8 +318,8 @@ impl CodeGenerator for Var { }; let item = ForeignModBuilder::new(Abi::C) - .with_foreign_item(item) - .build(ctx); + .with_foreign_item(item) + .build(ctx); result.push(item); } } @@ -368,7 +376,8 @@ impl CodeGenerator for Type { return; } - let mut applicable_template_args = item.applicable_template_args(ctx); + let mut applicable_template_args = + item.applicable_template_args(ctx); let inner_rust_type = if item.is_opaque(ctx) { applicable_template_args.clear(); // Pray if there's no layout. @@ -394,7 +403,8 @@ impl CodeGenerator for Type { error!("Item contained `typename`'d template param: {:?}", item); return; } - generics = generics.ty_param_id(template_arg.name().unwrap()); + generics = + generics.ty_param_id(template_arg.name().unwrap()); } } @@ -402,8 +412,9 @@ impl CodeGenerator for Type { result.push(typedef) } TypeKind::Enum(ref ei) => ei.codegen(ctx, result, item), - ref u @ TypeKind::UnresolvedTypeRef(..) - => unreachable!("Should have been resolved after parsing {:?}!", u), + ref u @ TypeKind::UnresolvedTypeRef(..) => { + unreachable!("Should have been resolved after parsing {:?}!", u) + } } } } @@ -417,7 +428,10 @@ struct Vtable<'a> { } impl<'a> Vtable<'a> { - fn new(item_id: ItemId, methods: &'a [Method], base_classes: &'a [ItemId]) -> Self { + fn new(item_id: ItemId, + methods: &'a [Method], + base_classes: &'a [ItemId]) + -> Self { Vtable { item_id: item_id, methods: methods, @@ -436,10 +450,12 @@ impl<'a> CodeGenerator for Vtable<'a> { assert_eq!(item.id(), self.item_id); // For now, generate an empty struct, later we should generate function // pointers and whatnot. - let vtable = aster::AstBuilder::new().item().pub_() - .with_attr(attributes::repr("C")) - .struct_(self.canonical_name(ctx)) - .build(); + let vtable = aster::AstBuilder::new() + .item() + .pub_() + .with_attr(attributes::repr("C")) + .struct_(self.canonical_name(ctx)) + .build(); result.push(vtable); } } @@ -475,8 +491,9 @@ impl<'a> Bitfield<'a> { methods: &mut Vec) { use aster::struct_field::StructFieldBuilder; use std::cmp; - let mut total_width = self.fields.iter() - .fold(0u32, |acc, f| acc + f.bitfield().unwrap()); + let mut total_width = self.fields + .iter() + .fold(0u32, |acc, f| acc + f.bitfield().unwrap()); if !total_width.is_power_of_two() || total_width < 8 { total_width = cmp::max(8, total_width.next_power_of_two()); @@ -485,11 +502,14 @@ impl<'a> Bitfield<'a> { let total_width_in_bytes = total_width as usize / 8; let bitfield_type = - BlobTyBuilder::new(Layout::new(total_width_in_bytes, total_width_in_bytes)).build(); + BlobTyBuilder::new(Layout::new(total_width_in_bytes, + total_width_in_bytes)) + .build(); let field_name = format!("_bitfield_{}", self.index); let field_ident = ctx.ext_cx().ident_of(&field_name); - let field = StructFieldBuilder::named(&field_name).pub_() - .build_ty(bitfield_type.clone()); + let field = StructFieldBuilder::named(&field_name) + .pub_() + .build_ty(bitfield_type.clone()); fields.push(field); @@ -497,19 +517,21 @@ impl<'a> Bitfield<'a> { for field in self.fields { let width = field.bitfield().unwrap(); let field_name = field.name() - .map(ToOwned::to_owned) - .unwrap_or_else(|| format!("at_offset_{}", offset)); + .map(ToOwned::to_owned) + .unwrap_or_else(|| format!("at_offset_{}", offset)); let field_item = ctx.resolve_item(field.ty()); - let field_ty_layout = field_item.kind().expect_type() - .layout(ctx) - .expect("Bitfield without layout? Gah!"); + let field_ty_layout = field_item.kind() + .expect_type() + .layout(ctx) + .expect("Bitfield without layout? Gah!"); let field_type = field_item.to_rust_ty(ctx); let int_type = BlobTyBuilder::new(field_ty_layout).build(); let getter_name = ctx.ext_cx().ident_of(&field_name); - let setter_name = ctx.ext_cx().ident_of(&format!("set_{}", &field_name)); + let setter_name = ctx.ext_cx() + .ident_of(&format!("set_{}", &field_name)); let mask = ((1usize << width) - 1) << offset; // The transmute is unfortunate, but it's needed for enums in // bitfields. @@ -555,7 +577,8 @@ impl CodeGenerator for CompInfo { // also don't output template specializations, neither total or partial. // // TODO: Generate layout tests for template specializations, yay! - if self.has_non_type_template_params() || self.is_template_specialization() { + if self.has_non_type_template_params() || + self.is_template_specialization() { return; } @@ -598,16 +621,21 @@ impl CodeGenerator for CompInfo { attributes.push(attributes::derives(&derives)) } - let mut template_args_used = vec![false; applicable_template_args.len()]; + let mut template_args_used = + vec![false; applicable_template_args.len()]; let canonical_name = item.canonical_name(ctx); let builder = if is_union && ctx.options().unstable_rust { - aster::AstBuilder::new().item().pub_() - .with_attrs(attributes) - .union_(&canonical_name) + aster::AstBuilder::new() + .item() + .pub_() + .with_attrs(attributes) + .union_(&canonical_name) } else { - aster::AstBuilder::new().item().pub_() - .with_attrs(attributes) - .struct_(&canonical_name) + aster::AstBuilder::new() + .item() + .pub_() + .with_attrs(attributes) + .struct_(&canonical_name) }; // Generate the vtable from the method list if appropriate. @@ -623,15 +651,15 @@ impl CodeGenerator for CompInfo { // the parent too. let mut fields = vec![]; if self.needs_explicit_vtable(ctx) { - let vtable = Vtable::new(item.id(), - self.methods(), - self.base_members()); + let vtable = + Vtable::new(item.id(), self.methods(), self.base_members()); vtable.codegen(ctx, result, item); let vtable_type = vtable.to_rust_ty(ctx).to_ptr(true, ctx.span()); - let vtable_field = StructFieldBuilder::named("vtable_").pub_() - .build_ty(vtable_type); + let vtable_field = StructFieldBuilder::named("vtable_") + .pub_() + .build_ty(vtable_type); fields.push(vtable_field); } @@ -663,7 +691,8 @@ impl CodeGenerator for CompInfo { }; let field = StructFieldBuilder::named(field_name) - .pub_().build_ty(inner); + .pub_() + .build_ty(inner); fields.push(field); } if is_union { @@ -678,11 +707,11 @@ impl CodeGenerator for CompInfo { let mut bitfield_count = 0; let struct_fields = self.fields(); let fields_should_be_private = item.annotations() - .private_fields() - .unwrap_or(false); + .private_fields() + .unwrap_or(false); let struct_accessor_kind = item.annotations() - .accessor_kind() - .unwrap_or(FieldAccessorKind::None); + .accessor_kind() + .unwrap_or(FieldAccessorKind::None); let mut methods = vec![]; let mut anonymous_field_count = 0; @@ -695,15 +724,16 @@ impl CodeGenerator for CompInfo { let field_ty = ctx.resolve_type(field.ty()); // Try to catch a bitfield contination early. - if let (Some(ref mut bitfield_width), Some(width)) = (current_bitfield_width, field.bitfield()) { + if let (Some(ref mut bitfield_width), Some(width)) = + (current_bitfield_width, field.bitfield()) { let layout = current_bitfield_layout.unwrap(); debug!("Testing bitfield continuation {} {} {:?}", *bitfield_width, width, layout); - if *bitfield_width + width <= (layout.size * 8) as u32 { - *bitfield_width += width; - current_bitfield_fields.push(field); - continue; - } + if *bitfield_width + width <= (layout.size * 8) as u32 { + *bitfield_width += width; + current_bitfield_fields.push(field); + continue; + } } // Flush the current bitfield. @@ -721,7 +751,7 @@ impl CodeGenerator for CompInfo { if let Some(width) = field.bitfield() { let layout = field_ty.layout(ctx) - .expect("Bitfield type without layout?"); + .expect("Bitfield type without layout?"); current_bitfield_width = Some(width); current_bitfield_layout = Some(layout); current_bitfield_fields.push(field); @@ -756,12 +786,12 @@ impl CodeGenerator for CompInfo { }; let is_private = field.annotations() - .private_fields() - .unwrap_or(fields_should_be_private); + .private_fields() + .unwrap_or(fields_should_be_private); let accessor_kind = field.annotations() - .accessor_kind() - .unwrap_or(struct_accessor_kind); + .accessor_kind() + .unwrap_or(struct_accessor_kind); let mut field = StructFieldBuilder::named(&field_name); @@ -770,7 +800,7 @@ impl CodeGenerator for CompInfo { } let field = field.with_attrs(attrs) - .build_ty(ty.clone()); + .build_ty(ty.clone()); fields.push(field); @@ -830,9 +860,10 @@ impl CodeGenerator for CompInfo { }; match accessor_methods_impl.unwrap().node { - ast::ItemKind::Impl(_, _, _, _, _, ref items) - => methods.extend(items.clone()), - _ => unreachable!() + ast::ItemKind::Impl(_, _, _, _, _, ref items) => { + methods.extend(items.clone()) + } + _ => unreachable!(), } } @@ -842,7 +873,8 @@ impl CodeGenerator for CompInfo { // FIXME: May need to pass current_bitfield_layout too. if current_bitfield_width.is_some() { debug_assert!(!current_bitfield_fields.is_empty()); - let bitfield_fields = mem::replace(&mut current_bitfield_fields, vec![]); + let bitfield_fields = mem::replace(&mut current_bitfield_fields, + vec![]); bitfield_count += 1; Bitfield::new(bitfield_count, bitfield_fields) .codegen_fields(ctx, &mut fields, &mut methods); @@ -852,8 +884,9 @@ impl CodeGenerator for CompInfo { if is_union && !ctx.options().unstable_rust { let layout = layout.expect("Unable to get layout information?"); let ty = BlobTyBuilder::new(layout).build(); - let field = StructFieldBuilder::named("bindgen_union_field").pub_() - .build_ty(ty); + let field = StructFieldBuilder::named("bindgen_union_field") + .pub_() + .build_ty(ty); fields.push(field); } @@ -868,8 +901,10 @@ impl CodeGenerator for CompInfo { match layout { Some(l) => { let ty = BlobTyBuilder::new(l).build(); - let field = StructFieldBuilder::named("_bindgen_opaque_blob").pub_() - .build_ty(ty); + let field = + StructFieldBuilder::named("_bindgen_opaque_blob") + .pub_() + .build_ty(ty); fields.push(field); } None => { @@ -885,8 +920,9 @@ impl CodeGenerator for CompInfo { // may add for unused template parameters. if self.is_unsized(ctx) { let ty = BlobTyBuilder::new(Layout::new(1, 1)).build(); - let field = StructFieldBuilder::named("_address").pub_() - .build_ty(ty); + let field = StructFieldBuilder::named("_address") + .pub_() + .build_ty(ty); fields.push(field); } @@ -918,7 +954,8 @@ impl CodeGenerator for CompInfo { let generics = generics.build(); let rust_struct = builder.with_generics(generics.clone()) - .with_fields(fields).build(); + .with_fields(fields) + .build(); result.push(rust_struct); // Generate the inner types and all that stuff. @@ -957,19 +994,25 @@ impl CodeGenerator for CompInfo { fn $fn_name() { assert_eq!($size_of_expr, $size); assert_eq!($align_of_expr, $align); - }).unwrap(); + }) + .unwrap(); result.push(item); } let mut method_names = Default::default(); for method in self.methods() { - method.codegen_method(ctx, &mut methods, &mut method_names, result, item); + method.codegen_method(ctx, + &mut methods, + &mut method_names, + result, + item); } } // NB: We can't use to_rust_ty here since for opaque types this tries to // use the specialization knowledge to generate a blob field. - let ty_for_impl = aster::AstBuilder::new().ty().path().id(&canonical_name).build(); + let ty_for_impl = + aster::AstBuilder::new().ty().path().id(&canonical_name).build(); if needs_clone_impl { let impl_ = quote_item!(ctx.ext_cx(), impl X { @@ -982,22 +1025,26 @@ impl CodeGenerator for CompInfo { _ => unreachable!(), }; - let clone_impl = - aster::AstBuilder::new().item().impl_() - .trait_().id("Clone").build() - .with_generics(generics.clone()) - .with_items(impl_) - .build_ty(ty_for_impl.clone()); + let clone_impl = aster::AstBuilder::new() + .item() + .impl_() + .trait_() + .id("Clone") + .build() + .with_generics(generics.clone()) + .with_items(impl_) + .build_ty(ty_for_impl.clone()); result.push(clone_impl); } if !methods.is_empty() { - let methods = - aster::AstBuilder::new().item().impl_() - .with_generics(generics) - .with_items(methods) - .build_ty(ty_for_impl); + let methods = aster::AstBuilder::new() + .item() + .impl_() + .with_generics(generics) + .with_items(methods) + .build_ty(ty_for_impl); result.push(methods); } } @@ -1040,7 +1087,7 @@ impl MethodCodegen for Method { let count = { let mut count = method_names.entry(name.clone()) - .or_insert(0); + .or_insert(0); *count += 1; *count - 1 }; @@ -1050,7 +1097,8 @@ impl MethodCodegen for Method { } let function_name = function_item.canonical_name(ctx); - let mut fndecl = utils::rust_fndecl_from_signature(ctx, signature_item).unwrap(); + let mut fndecl = utils::rust_fndecl_from_signature(ctx, signature_item) + .unwrap(); if !self.is_static() { let mutability = if self.is_const() { ast::Mutability::Immutable @@ -1095,16 +1143,19 @@ impl MethodCodegen for Method { // TODO: We need to keep in sync the argument names, so we should unify // this with the other loop that decides them. let mut unnamed_arguments = 0; - let mut exprs = signature.argument_types().iter().map(|&(ref name, _ty)| { - let arg_name = match *name { - Some(ref name) => ctx.rust_mangle(name).into_owned(), - None => { - unnamed_arguments += 1; - format!("arg{}", unnamed_arguments) - } - }; - aster::expr::ExprBuilder::new().id(arg_name) - }).collect::>(); + let mut exprs = signature.argument_types() + .iter() + .map(|&(ref name, _ty)| { + let arg_name = match *name { + Some(ref name) => ctx.rust_mangle(name).into_owned(), + None => { + unnamed_arguments += 1; + format!("arg{}", unnamed_arguments) + } + }; + aster::expr::ExprBuilder::new().id(arg_name) + }) + .collect::>(); if !self.is_static() { assert!(!exprs.is_empty()); @@ -1115,10 +1166,11 @@ impl MethodCodegen for Method { }; }; - let call = aster::expr::ExprBuilder::new().call() - .id(function_name) - .with_args(exprs) - .build(); + let call = aster::expr::ExprBuilder::new() + .call() + .id(function_name) + .with_args(exprs) + .build(); let block = ast::Block { stmts: vec![ @@ -1164,10 +1216,12 @@ impl CodeGenerator for Enum { let repr = self.repr().map(|repr| ctx.resolve_type(repr)); let repr = match repr { - Some(repr) => match *repr.canonical_type(ctx).kind() { - TypeKind::Int(int_kind) => int_kind, - _ => panic!("Unexpected type as enum repr"), - }, + Some(repr) => { + match *repr.canonical_type(ctx).kind() { + TypeKind::Int(int_kind) => int_kind, + _ => panic!("Unexpected type as enum repr"), + } + } None => { warn!("Guessing type of enum! Forward declarations of enums shouldn't be legal!"); IntKind::Int @@ -1203,8 +1257,12 @@ impl CodeGenerator for Enum { builder = builder.with_attr(attributes::doc(comment)); } - let derives = - attributes::derives(&["Debug", "Copy", "Clone", "PartialEq", "Eq", "Hash"]); + let derives = attributes::derives(&["Debug", + "Copy", + "Clone", + "PartialEq", + "Eq", + "Hash"]); builder = builder.with_attr(derives); @@ -1213,7 +1271,8 @@ impl CodeGenerator for Enum { fn add_constant(enum_: &Type, // Only to avoid recomputing every time. enum_canonical_name: &str, - // May be the same as "variant" if it's because the enum + // May be the same as "variant" if it's because the + // enum // is unnamed and we still haven't seen the value. variant_name: &str, referenced_name: &str, @@ -1225,11 +1284,15 @@ impl CodeGenerator for Enum { variant_name.into() }; - let constant = aster::AstBuilder::new().item().pub_() - .const_(constant_name) - .expr().path() - .ids(&[&*enum_canonical_name, referenced_name]) - .build().build(enum_rust_ty); + let constant = aster::AstBuilder::new() + .item() + .pub_() + .const_(constant_name) + .expr() + .path() + .ids(&[&*enum_canonical_name, referenced_name]) + .build() + .build(enum_rust_ty); result.push(constant); } @@ -1245,8 +1308,11 @@ impl CodeGenerator for Enum { Entry::Occupied(ref entry) => { let existing_variant_name = entry.get(); let variant_name = ctx.rust_mangle(variant.name()); - add_constant(enum_ty, &name, &*variant_name, - existing_variant_name, enum_rust_ty.clone(), + add_constant(enum_ty, + &name, + &*variant_name, + existing_variant_name, + enum_rust_ty.clone(), result); } Entry::Vacant(entry) => { @@ -1272,7 +1338,8 @@ impl CodeGenerator for Enum { variant_name.clone() } else { if parent_canonical_name.is_none() { - parent_canonical_name = Some(item.parent_id().canonical_name(ctx)); + parent_canonical_name = Some(item.parent_id() + .canonical_name(ctx)); } Cow::Owned( @@ -1280,8 +1347,11 @@ impl CodeGenerator for Enum { variant_name)) }; - add_constant(enum_ty, &name, &mangled_name, - &variant_name, enum_rust_ty.clone(), + add_constant(enum_ty, + &name, + &mangled_name, + &variant_name, + enum_rust_ty.clone(), result); } @@ -1298,7 +1368,10 @@ impl CodeGenerator for Enum { trait ToRustTy { type Extra; - fn to_rust_ty(&self, ctx: &BindgenContext, extra: &Self::Extra) -> P; + fn to_rust_ty(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> P; } trait ItemToRustTy { @@ -1336,7 +1409,9 @@ impl ToRustTy for Type { TypeKind::Void => raw!(c_void), // TODO: we should do something smart with nullptr, or maybe *const // c_void is enough? - TypeKind::NullPtr => quote_ty!(ctx.ext_cx(), *const ::std::os::raw::c_void), + TypeKind::NullPtr => { + quote_ty!(ctx.ext_cx(), *const ::std::os::raw::c_void) + } TypeKind::Int(ik) => { match ik { IntKind::Bool => aster::ty::TyBuilder::new().bool(), @@ -1355,8 +1430,9 @@ impl ToRustTy for Type { // FIXME: This doesn't generate the proper alignment, but we // can't do better right now. We should be able to use // i128/u128 when they're available. - IntKind::U128 | - IntKind::I128 => aster::ty::TyBuilder::new().array(2).u64(), + IntKind::U128 | IntKind::I128 => { + aster::ty::TyBuilder::new().array(2).u64() + } } } TypeKind::Float(fk) => { @@ -1365,8 +1441,9 @@ impl ToRustTy for Type { // account? match fk { FloatKind::Float => aster::ty::TyBuilder::new().f32(), - FloatKind::Double | - FloatKind::LongDouble => aster::ty::TyBuilder::new().f64(), + FloatKind::Double | FloatKind::LongDouble => { + aster::ty::TyBuilder::new().f64() + } } } TypeKind::Function(ref fs) => { @@ -1407,7 +1484,9 @@ impl ToRustTy for Type { // Pray if there's no available layout. let layout = self.layout(ctx).unwrap_or_else(Layout::zero); BlobTyBuilder::new(layout).build() - } else if let Some(ty) = utils::type_from_named(ctx, spelling, inner) { + } else if let Some(ty) = utils::type_from_named(ctx, + spelling, + inner) { ty } else { utils::build_templated_path(item, ctx, true) @@ -1416,22 +1495,22 @@ impl ToRustTy for Type { TypeKind::Comp(ref info) => { if item.is_opaque(ctx) || info.has_non_type_template_params() { return match self.layout(ctx) { - Some(layout) => { - BlobTyBuilder::new(layout).build() - } + Some(layout) => BlobTyBuilder::new(layout).build(), None => { warn!("Couldn't compute layout for a type with non \ type template params or opaque, expect dragons!"); aster::AstBuilder::new().ty().unit() } - } + }; } utils::build_templated_path(item, ctx, false) } TypeKind::BlockPointer => { let void = raw!(c_void); - void.to_ptr(/* is_const = */ false, ctx.span()) + void.to_ptr(/* is_const = */ + false, + ctx.span()) } TypeKind::Pointer(inner) | TypeKind::Reference(inner) => { @@ -1444,7 +1523,8 @@ impl ToRustTy for Type { if inner_ty.canonical_type(ctx).is_function() { ty } else { - let is_const = self.is_const() || inner.expect_type().is_const(); + let is_const = self.is_const() || + inner.expect_type().is_const(); ty.to_ptr(is_const, ctx.span()) } } @@ -1453,8 +1533,9 @@ impl ToRustTy for Type { let ident = ctx.rust_ident(&name); quote_ty!(ctx.ext_cx(), $ident) } - ref u @ TypeKind::UnresolvedTypeRef(..) - => unreachable!("Should have been resolved after parsing {:?}!", u), + ref u @ TypeKind::UnresolvedTypeRef(..) => { + unreachable!("Should have been resolved after parsing {:?}!", u) + } } } } @@ -1465,11 +1546,12 @@ impl ToRustTy for FunctionSig { fn to_rust_ty(&self, ctx: &BindgenContext, _item: &Item) -> P { // TODO: we might want to consider ignoring the reference return value. let return_item = ctx.resolve_item(self.return_type()); - let ret = if let TypeKind::Void = *return_item.kind().expect_type().kind() { - ast::FunctionRetTy::Default(ctx.span()) - } else { - ast::FunctionRetTy::Ty(return_item.to_rust_ty(ctx)) - }; + let ret = + if let TypeKind::Void = *return_item.kind().expect_type().kind() { + ast::FunctionRetTy::Default(ctx.span()) + } else { + ast::FunctionRetTy::Ty(return_item.to_rust_ty(ctx)) + }; let mut unnamed_arguments = 0; let arguments = self.argument_types().iter().map(|&(ref name, ty)| { @@ -1566,15 +1648,14 @@ impl CodeGenerator for Function { let foreign_item_kind = ast::ForeignItemKind::Fn(fndecl, ast::Generics::default()); - let foreign_item = - ast::ForeignItem { - ident: ctx.rust_ident_raw(&canonical_name), - attrs: attributes, - node: foreign_item_kind, - id: ast::DUMMY_NODE_ID, - span: ctx.span(), - vis: ast::Visibility::Public, - }; + let foreign_item = ast::ForeignItem { + ident: ctx.rust_ident_raw(&canonical_name), + attrs: attributes, + node: foreign_item_kind, + id: ast::DUMMY_NODE_ID, + span: ctx.span(), + vis: ast::Visibility::Public, + }; let item = ForeignModBuilder::new(signature.abi()) .with_foreign_item(foreign_item) @@ -1596,7 +1677,8 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { context.options().whitelisted_functions.is_empty() && context.options().whitelisted_vars.is_empty() { for (_item_id, item) in context.items() { - // Non-toplevel item parents are the responsible one for generating + // Non-toplevel item parents are the responsible one for + // generating // them. if item.is_toplevel(context) { item.codegen(context, &mut result, &()); @@ -1629,17 +1711,24 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { if let TypeKind::Enum(ref enum_) = *ty.kind() { if ty.name().is_none() { if enum_.variants().iter().any(|variant| { - context.options().whitelisted_vars.matches(&variant.name()) + context.options() + .whitelisted_vars + .matches(&variant.name()) }) { - item.collect_types(context, &mut items, &()); + item.collect_types(context, + &mut items, + &()); } } } } ItemKind::Function(ref fun) => { - if context.options().whitelisted_functions.matches(&name) { + if context.options() + .whitelisted_functions + .matches(&name) { items.insert(item.id()); - fun.signature().collect_types(context, &mut items, &()); + fun.signature() + .collect_types(context, &mut items, &()); } } ItemKind::Var(ref var) => { @@ -1652,7 +1741,10 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { } } - fn contains_parent(ctx: &BindgenContext, types: &ItemSet, id: ItemId) -> bool { + fn contains_parent(ctx: &BindgenContext, + types: &ItemSet, + id: ItemId) + -> bool { let item = ctx.resolve_item(id); let mut last = id; let mut current = item.parent_id(); @@ -1670,7 +1762,8 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { for item_id in items.iter() { let item = context.resolve_item(*item_id); - if item.is_toplevel(context) || !contains_parent(context, &items, *item_id) { + if item.is_toplevel(context) || + !contains_parent(context, &items, *item_id) { item.codegen(context, &mut result, &()); } } @@ -1685,21 +1778,23 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { } mod utils { + use aster; use ir::context::BindgenContext; use ir::item::{Item, ItemCanonicalPath, ItemId}; use ir::ty::TypeKind; - use syntax::ast; - use syntax::ptr::P; use std::mem; use super::ItemToRustTy; - use aster; + use syntax::ast; + use syntax::ptr::P; - pub fn prepend_union_types(ctx: &BindgenContext, result: &mut Vec>) { + pub fn prepend_union_types(ctx: &BindgenContext, + result: &mut Vec>) { let union_field_decl = quote_item!(ctx.ext_cx(), #[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); - ).unwrap(); + ) + .unwrap(); let union_field_impl = quote_item!(&ctx.ext_cx(), impl __BindgenUnionField { @@ -1718,7 +1813,8 @@ mod utils { ::std::mem::transmute(self) } } - ).unwrap(); + ) + .unwrap(); let union_field_default_impl = quote_item!(&ctx.ext_cx(), impl ::std::default::Default for __BindgenUnionField { @@ -1727,7 +1823,8 @@ mod utils { Self::new() } } - ).unwrap(); + ) + .unwrap(); let union_field_clone_impl = quote_item!(&ctx.ext_cx(), impl ::std::clone::Clone for __BindgenUnionField { @@ -1736,11 +1833,13 @@ mod utils { Self::new() } } - ).unwrap(); + ) + .unwrap(); let union_field_copy_impl = quote_item!(&ctx.ext_cx(), impl ::std::marker::Copy for __BindgenUnionField {} - ).unwrap(); + ) + .unwrap(); let items = vec![ union_field_decl, union_field_impl, @@ -1754,26 +1853,32 @@ mod utils { } - pub fn build_templated_path(item: &Item, ctx: &BindgenContext, only_named: bool) -> P { + pub fn build_templated_path(item: &Item, + ctx: &BindgenContext, + only_named: bool) + -> P { let path = item.canonical_path(ctx); let builder = aster::AstBuilder::new().ty().path(); let template_args = if only_named { - item.applicable_template_args(ctx).iter().filter(|arg| { - ctx.resolve_type(**arg).is_named() - }).map(|arg| { - arg.to_rust_ty(ctx) - }).collect::>() + item.applicable_template_args(ctx) + .iter() + .filter(|arg| ctx.resolve_type(**arg).is_named()) + .map(|arg| arg.to_rust_ty(ctx)) + .collect::>() } else { - item.applicable_template_args(ctx).iter().map(|arg| { - arg.to_rust_ty(ctx) - }).collect::>() + item.applicable_template_args(ctx) + .iter() + .map(|arg| arg.to_rust_ty(ctx)) + .collect::>() }; // XXX: I suck at aster. if path.len() == 1 { return builder.segment(&path[0]) - .with_tys(template_args).build().build(); + .with_tys(template_args) + .build() + .build(); } let mut builder = builder.id(&path[0]); @@ -1782,7 +1887,8 @@ mod utils { builder = if i == path.len() - 2 { // XXX Extra clone courtesy of the borrow checker. builder.segment(&segment) - .with_tys(template_args.clone()).build() + .with_tys(template_args.clone()) + .build() } else { builder.segment(&segment).build() } @@ -1798,7 +1904,8 @@ mod utils { pub fn type_from_named(ctx: &BindgenContext, name: &str, - _inner: ItemId) -> Option> { + _inner: ItemId) + -> Option> { // FIXME: We could use the inner item to check this is really a // primitive type but, who the heck overrides these anyway? macro_rules! ty { @@ -1816,17 +1923,16 @@ mod utils { "int64_t" => ty!(i64), "uint64_t" => ty!(u64), - "uintptr_t" | - "size_t" => ty!(usize), + "uintptr_t" | "size_t" => ty!(usize), - "intptr_t" | - "ptrdiff_t" | - "ssize_t" => ty!(isize), + "intptr_t" | "ptrdiff_t" | "ssize_t" => ty!(isize), _ => return None, }) } - pub fn rust_fndecl_from_signature(ctx: &BindgenContext, sig: &Item) -> P { + pub fn rust_fndecl_from_signature(ctx: &BindgenContext, + sig: &Item) + -> P { use codegen::ToRustTy; let signature = sig.kind().expect_type(); diff --git a/src/ir/annotations.rs b/src/ir/annotations.rs index 0ceb676d31..58308d6dde 100644 --- a/src/ir/annotations.rs +++ b/src/ir/annotations.rs @@ -58,7 +58,7 @@ impl Default for Annotations { use_instead_of: None, disallow_copy: false, private_fields: None, - accessor_kind: None + accessor_kind: None, } } } @@ -71,11 +71,7 @@ impl Annotations { let mut matched_one = false; anno.parse(&cursor.comment(), &mut matched_one); - if matched_one { - Some(anno) - } else { - None - } + if matched_one { Some(anno) } else { None } } /// Should this type be hidden? @@ -133,7 +129,9 @@ impl Annotations { use clangll::CXComment_HTMLStartTag; if comment.kind() == CXComment_HTMLStartTag && comment.get_tag_name() == "div" && - comment.get_tag_attrs().next().map_or(false, |attr| attr.name == "rustbindgen") { + comment.get_tag_attrs() + .next() + .map_or(false, |attr| attr.name == "rustbindgen") { *matched = true; for attr in comment.get_tag_attrs() { match attr.name.as_str() { @@ -141,10 +139,13 @@ impl Annotations { "hide" => self.hide = true, "nocopy" => self.disallow_copy = true, "replaces" => self.use_instead_of = Some(attr.value), - "private" => self.private_fields = Some(attr.value != "false"), - "accessor" - => self.accessor_kind = Some(parse_accessor(&attr.value)), - _ => {}, + "private" => { + self.private_fields = Some(attr.value != "false") + } + "accessor" => { + self.accessor_kind = Some(parse_accessor(&attr.value)) + } + _ => {} } } } diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 98003936b5..27094003c6 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -1,15 +1,15 @@ //! Compound types (unions and structs) in our intermediate representation. +use clang; +use parse::{ClangItemParser, ParseError}; +use std::cell::Cell; +use std::cmp; use super::annotations::Annotations; use super::context::BindgenContext; -use super::layout::Layout; use super::item::{Item, ItemId}; -use super::ty::{Type, RUST_DERIVE_IN_ARRAY_LIMIT}; +use super::layout::Layout; +use super::ty::{RUST_DERIVE_IN_ARRAY_LIMIT, Type}; use super::type_collector::{ItemSet, TypeCollector}; -use std::cell::Cell; -use std::cmp; -use parse::{ClangItemParser, ParseError}; -use clang; /// The kind of compound type. #[derive(Debug, Copy, Clone, PartialEq)] @@ -103,7 +103,8 @@ impl Field { comment: Option, annotations: Option, bitfield: Option, - mutable: bool) -> Field { + mutable: bool) + -> Field { Field { name: name, ty: ty, @@ -199,7 +200,8 @@ pub struct CompInfo { /// TODO: We should be able to compute this. has_nonempty_base: bool, - /// If this type has a template parameter which is not a type (e.g.: a size_t) + /// If this type has a template parameter which is not a type (e.g.: a + /// size_t) has_non_type_template_params: bool, /// Whether this struct layout is packed. @@ -250,7 +252,10 @@ impl CompInfo { } /// Can we derive the `Debug` trait for this compound type? - pub fn can_derive_debug(&self, ctx: &BindgenContext, layout: Option) -> bool { + pub fn can_derive_debug(&self, + ctx: &BindgenContext, + layout: Option) + -> bool { // We can reach here recursively via template parameters of a member, // for example. if self.detect_derive_debug_cycle.get() { @@ -258,7 +263,7 @@ impl CompInfo { return true; } - if self.kind == CompKind::Union { + if self.kind == CompKind::Union { if ctx.options().unstable_rust { return false; } @@ -270,23 +275,22 @@ impl CompInfo { self.detect_derive_debug_cycle.set(true); - let can_derive_debug = - self.base_members.iter().all(|ty| { - ctx.resolve_type(*ty) - .can_derive_debug(ctx) - }) && - self.template_args.iter().all(|ty| { - ctx.resolve_type(*ty) - .can_derive_debug(ctx) - }) && - self.fields.iter().all(|field| { - ctx.resolve_type(field.ty) - .can_derive_debug(ctx) - }) && - self.ref_template.map_or(true, |template| { - ctx.resolve_type(template) - .can_derive_debug(ctx) - }); + let can_derive_debug = self.base_members.iter().all(|ty| { + ctx.resolve_type(*ty) + .can_derive_debug(ctx) + }) && + self.template_args.iter().all(|ty| { + ctx.resolve_type(*ty) + .can_derive_debug(ctx) + }) && + self.fields.iter().all(|field| { + ctx.resolve_type(field.ty) + .can_derive_debug(ctx) + }) && + self.ref_template.map_or(true, |template| { + ctx.resolve_type(template) + .can_derive_debug(ctx) + }); self.detect_derive_debug_cycle.set(false); @@ -296,15 +300,13 @@ impl CompInfo { /// Is this compound type unsized? pub fn is_unsized(&self, ctx: &BindgenContext) -> bool { !self.has_vtable(ctx) && self.fields.is_empty() && - self.base_members.iter().all(|base| { - ctx - .resolve_type(*base) - .canonical_type(ctx) - .is_unsized(ctx) - }) && - self.ref_template.map_or(true, |template| { - ctx.resolve_type(template).is_unsized(ctx) - }) + self.base_members.iter().all(|base| { + ctx.resolve_type(*base) + .canonical_type(ctx) + .is_unsized(ctx) + }) && + self.ref_template + .map_or(true, |template| ctx.resolve_type(template).is_unsized(ctx)) } /// Does this compound type have a destructor? @@ -317,7 +319,8 @@ impl CompInfo { self.detect_has_destructor_cycle.set(true); - let has_destructor = self.has_destructor || match self.kind { + let has_destructor = self.has_destructor || + match self.kind { CompKind::Union => false, CompKind::Struct => { // NB: We can't rely on a type with type parameters @@ -327,15 +330,15 @@ impl CompInfo { self.ref_template.as_ref().map_or(false, |t| { ctx.resolve_type(*t).has_destructor(ctx) }) || - self.template_args.iter().any(|t| { - ctx.resolve_type(*t).has_destructor(ctx) - }) || - self.base_members.iter().any(|t| { - ctx.resolve_type(*t).has_destructor(ctx) - }) || + self.template_args + .iter() + .any(|t| ctx.resolve_type(*t).has_destructor(ctx)) || + self.base_members + .iter() + .any(|t| ctx.resolve_type(*t).has_destructor(ctx)) || self.fields.iter().any(|field| { ctx.resolve_type(field.ty) - .has_destructor(ctx) + .has_destructor(ctx) }) } }; @@ -360,24 +363,23 @@ impl CompInfo { } // https://github.com/rust-lang/rust/issues/36640 - if !self.template_args.is_empty() || - self.ref_template.is_some() || - !item.applicable_template_args(ctx).is_empty() { + if !self.template_args.is_empty() || self.ref_template.is_some() || + !item.applicable_template_args(ctx).is_empty() { return false; } } // With template args, use a safe subset of the types, // since copyability depends on the types itself. - self.ref_template.as_ref().map_or(true, |t| { - ctx.resolve_item(*t).can_derive_copy(ctx) - }) && - self.base_members.iter().all(|t| { - ctx.resolve_item(*t).can_derive_copy(ctx) - }) && + self.ref_template + .as_ref() + .map_or(true, |t| ctx.resolve_item(*t).can_derive_copy(ctx)) && + self.base_members + .iter() + .all(|t| ctx.resolve_item(*t).can_derive_copy(ctx)) && self.fields.iter().all(|field| { ctx.resolve_item(field.ty) - .can_derive_copy(ctx) + .can_derive_copy(ctx) }) } @@ -411,7 +413,7 @@ impl CompInfo { let mut max_align = 0; for field in &self.fields { let field_layout = ctx.resolve_type(field.ty) - .layout(ctx); + .layout(ctx); if let Some(layout) = field_layout { max_size = cmp::max(max_size, layout.size); @@ -441,11 +443,12 @@ impl CompInfo { /// Does this type have a virtual table? pub fn has_vtable(&self, ctx: &BindgenContext) -> bool { - self.has_vtable || self.base_members().iter().any(|base| { - ctx - .resolve_type(*base) + self.has_vtable || + self.base_members().iter().any(|base| { + ctx.resolve_type(*base) .has_vtable(ctx) - }) || self.ref_template.map_or(false, |template| { + }) || + self.ref_template.map_or(false, |template| { ctx.resolve_type(template).has_vtable(ctx) }) } @@ -469,7 +472,8 @@ impl CompInfo { pub fn from_ty(potential_id: ItemId, ty: &clang::Type, location: Option, - ctx: &mut BindgenContext) -> Result { + ctx: &mut BindgenContext) + -> Result { use clangll::*; // Sigh... For class templates we want the location, for // specialisations, we want the declaration... So just try both. @@ -491,14 +495,15 @@ impl CompInfo { let mut ci = CompInfo::new(kind); ci.is_anonymous = cursor.is_anonymous(); ci.template_args = match ty.template_args() { - // In forward declarations and not specializations, etc, they are in - // the ast, we'll meet them in CXCursor_TemplateTypeParameter + // In forward declarations and not specializations, + // etc, they are in + // the ast, we'll meet them in + // CXCursor_TemplateTypeParameter None => vec![], Some(arg_types) => { let num_arg_types = arg_types.len(); - let args = arg_types - .filter(|t| t.kind() != CXType_Invalid) + let args = arg_types.filter(|t| t.kind() != CXType_Invalid) .map(|t| Item::from_ty_or_ref(t, None, None, ctx)) .collect::>(); @@ -724,7 +729,8 @@ impl CompInfo { Ok(ci) } - fn kind_from_cursor(cursor: &clang::Cursor) -> Result { + fn kind_from_cursor(cursor: &clang::Cursor) + -> Result { use clangll::*; Ok(match cursor.kind() { CXCursor_UnionDecl => CompKind::Union, @@ -750,7 +756,8 @@ impl CompInfo { /// See also documentation for `ir::Item::signature_contains_named_type`. pub fn signature_contains_named_type(&self, ctx: &BindgenContext, - ty: &Type) -> bool { + ty: &Type) + -> bool { // We don't generate these, so rather don't make the codegen step to // think we got it covered. if self.has_non_type_template_params() { @@ -758,7 +765,7 @@ impl CompInfo { } self.template_args.iter().any(|arg| { ctx.resolve_type(*arg) - .signature_contains_named_type(ctx, ty) + .signature_contains_named_type(ctx, ty) }) } @@ -787,19 +794,18 @@ impl CompInfo { /// Returns whether this type needs an explicit vtable because it has /// virtual methods and none of its base classes has already a vtable. pub fn needs_explicit_vtable(&self, ctx: &BindgenContext) -> bool { - self.has_vtable(ctx) && !self.base_members.iter().any(|base| { + self.has_vtable(ctx) && + !self.base_members.iter().any(|base| { // NB: Ideally, we could rely in all these types being `comp`, and // life would be beautiful. // // Unfortunately, given the way we implement --match-pat, and also // that you can inherit from templated types, we need to handle // other cases here too. - ctx - .resolve_type(*base) + ctx.resolve_type(*base) .canonical_type(ctx) - .as_comp().map_or(false, |ci| { - ci.has_vtable(ctx) - }) + .as_comp() + .map_or(false, |ci| ci.has_vtable(ctx)) }) } } diff --git a/src/ir/context.rs b/src/ir/context.rs index 729a1c02b5..5e29e0c980 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -1,20 +1,20 @@ //! Common context that is passed around during parsing and codegen. -use super::ty::{Type, TypeKind, FloatKind}; -use super::item::{Item, ItemCanonicalName, ItemId}; -use super::item_kind::ItemKind; -use super::int::IntKind; -use super::module::Module; +use BindgenOptions; use clang::{self, Cursor}; -use std::borrow::{Cow, Borrow}; +use parse::ClangItemParser; +use std::borrow::{Borrow, Cow}; +use std::collections::{HashMap, HashSet}; use std::collections::btree_map::{self, BTreeMap}; -use std::collections::{HashSet, HashMap}; use std::fmt; +use super::int::IntKind; +use super::item::{Item, ItemCanonicalName, ItemId}; +use super::item_kind::ItemKind; +use super::module::Module; +use super::ty::{FloatKind, Type, TypeKind}; use syntax::ast::Ident; use syntax::codemap::{DUMMY_SP, Span}; use syntax::ext::base::ExtCtxt; -use parse::ClangItemParser; -use BindgenOptions; /// A key used to index a resolved type, so we only process it once. /// @@ -141,8 +141,12 @@ impl<'ctx> BindgenContext<'ctx> { item: Item, declaration: Option, location: Option) { - use clangll::{CXCursor_ClassTemplate, CXCursor_ClassTemplatePartialSpecialization}; - debug!("BindgenContext::add_item({:?}, declaration: {:?}, loc: {:?}", item, declaration, location); + use clangll::{CXCursor_ClassTemplate, + CXCursor_ClassTemplatePartialSpecialization}; + debug!("BindgenContext::add_item({:?}, declaration: {:?}, loc: {:?}", + item, + declaration, + location); debug_assert!(declaration.is_some() || !item.kind().is_type() || item.kind().expect_type().is_builtin_or_named(), "Adding a type without declaration?"); @@ -161,7 +165,8 @@ impl<'ctx> BindgenContext<'ctx> { if !declaration.is_valid() { if let Some(location) = location { if location.kind() == CXCursor_ClassTemplate || - location.kind() == CXCursor_ClassTemplatePartialSpecialization { + location.kind() == + CXCursor_ClassTemplatePartialSpecialization { declaration = location; } } @@ -174,7 +179,8 @@ impl<'ctx> BindgenContext<'ctx> { // Fortunately, we don't care about those types being // duplicated, so we can just ignore them. debug!("Invalid declaration {:?} found for type {:?}", - declaration, self.items.get(&id).unwrap().kind().expect_type()); + declaration, + self.items.get(&id).unwrap().kind().expect_type()); return; } @@ -183,7 +189,9 @@ impl<'ctx> BindgenContext<'ctx> { } else if let Some(usr) = declaration.usr() { TypeKey::USR(usr) } else { - error!("Valid declaration with no USR: {:?}, {:?}", declaration, location); + error!("Valid declaration with no USR: {:?}, {:?}", + declaration, + location); return; }; @@ -209,18 +217,15 @@ impl<'ctx> BindgenContext<'ctx> { use syntax::parse::token; let ident = self.rust_ident_raw(&name); let token = token::Ident(ident); - if token.is_any_keyword() || - name.contains("@") || - name.contains("?") || - name.contains("$") || - "bool" == name - { + if token.is_any_keyword() || name.contains("@") || + name.contains("?") || name.contains("$") || + "bool" == name { let mut s = name.to_owned(); s = s.replace("@", "_"); s = s.replace("?", "_"); s = s.replace("$", "_"); s.push_str("_"); - return Cow::Owned(s) + return Cow::Owned(s); } Cow::Borrowed(name) } @@ -248,7 +253,9 @@ impl<'ctx> BindgenContext<'ctx> { } /// Gather all the unresolved type references. - fn collect_typerefs(&mut self) -> Vec<(ItemId, clang::Type, Option, Option)> { + fn collect_typerefs + (&mut self) + -> Vec<(ItemId, clang::Type, Option, Option)> { debug_assert!(!self.collected_typerefs); self.collected_typerefs = true; let mut typerefs = vec![]; @@ -263,7 +270,7 @@ impl<'ctx> BindgenContext<'ctx> { TypeKind::UnresolvedTypeRef(ref ty, loc, parent_id) => { typerefs.push((*id, ty.clone(), loc, parent_id)); } - _ => {}, + _ => {} }; } typerefs @@ -276,7 +283,7 @@ impl<'ctx> BindgenContext<'ctx> { for (id, ty, loc, parent_id) in typerefs { let _resolved = { let resolved = Item::from_ty(&ty, loc, parent_id, self) - .expect("What happened?"); + .expect("What happened?"); let mut item = self.items.get_mut(&id).unwrap(); *item.kind_mut().as_type_mut().unwrap().kind_mut() = @@ -321,7 +328,8 @@ impl<'ctx> BindgenContext<'ctx> { continue; } - if let Some(replacement) = self.replacements.get(&item.canonical_name(self)) { + if let Some(replacement) = self.replacements + .get(&item.canonical_name(self)) { if replacement != id { // We set this just after parsing the annotation. It's // very unlikely, but this can happen. @@ -342,7 +350,7 @@ impl<'ctx> BindgenContext<'ctx> { /// Enter the code generation phase, invoke the given callback `cb`, and /// leave the code generation phase. pub fn gen(&mut self, cb: F) -> Out - where F: FnOnce(&Self) -> Out + where F: FnOnce(&Self) -> Out, { use syntax::ext::expand::ExpansionConfig; use syntax::codemap::{ExpnInfo, MacroBang, NameAndSpan}; @@ -361,8 +369,8 @@ impl<'ctx> BindgenContext<'ctx> { callee: NameAndSpan { format: MacroBang(parse::token::intern("")), allow_internal_unstable: false, - span: None - } + span: None, + }, }); // FIXME: This is evil, we should move code generation to use a wrapper @@ -471,7 +479,8 @@ impl<'ctx> BindgenContext<'ctx> { wrapping: ItemId, parent_id: ItemId, ty: &clang::Type, - location: clang::Cursor) -> ItemId { + location: clang::Cursor) + -> ItemId { use clangll::*; let mut args = vec![]; let mut found_invalid_template_ref = false; @@ -481,8 +490,10 @@ impl<'ctx> BindgenContext<'ctx> { found_invalid_template_ref = true; } if c.kind() == CXCursor_TypeRef { - let new_ty = - Item::from_ty_or_ref(c.cur_type(), Some(*c), Some(with_id), self); + let new_ty = Item::from_ty_or_ref(c.cur_type(), + Some(*c), + Some(with_id), + self); args.push(new_ty); } CXChildVisit_Continue @@ -527,7 +538,10 @@ impl<'ctx> BindgenContext<'ctx> { let type_kind = TypeKind::TemplateRef(wrapping, args); let name = ty.spelling(); let name = if name.is_empty() { None } else { Some(name) }; - let ty = Type::new(name, ty.fallible_layout().ok(), type_kind, ty.is_const()); + let ty = Type::new(name, + ty.fallible_layout().ok(), + type_kind, + ty.is_const()); Item::new(with_id, None, None, parent_id, ItemKind::Type(ty)) }; @@ -542,32 +556,40 @@ impl<'ctx> BindgenContext<'ctx> { with_id: ItemId, parent_id: Option, ty: &clang::Type, - location: Option) -> Option { - use clangll::{CXCursor_ClassTemplate, CXCursor_ClassTemplatePartialSpecialization}; - debug!("builtin_or_resolved_ty: {:?}, {:?}, {:?}", ty, location, parent_id); + location: Option) + -> Option { + use clangll::{CXCursor_ClassTemplate, + CXCursor_ClassTemplatePartialSpecialization}; + debug!("builtin_or_resolved_ty: {:?}, {:?}, {:?}", + ty, + location, + parent_id); let mut declaration = ty.declaration(); if !declaration.is_valid() { if let Some(location) = location { if location.kind() == CXCursor_ClassTemplate || - location.kind() == CXCursor_ClassTemplatePartialSpecialization { + location.kind() == + CXCursor_ClassTemplatePartialSpecialization { declaration = location; } } } let canonical_declaration = declaration.canonical(); if canonical_declaration.is_valid() { - let id = - self.types.get(&TypeKey::Declaration(canonical_declaration)) - .map(|id| *id) - .or_else(|| { - canonical_declaration.usr().and_then(|usr| { - self.types.get(&TypeKey::USR(usr)) - }) + let id = self.types + .get(&TypeKey::Declaration(canonical_declaration)) + .map(|id| *id) + .or_else(|| { + canonical_declaration.usr() + .and_then(|usr| self.types.get(&TypeKey::USR(usr))) .map(|id| *id) - }); + }); if let Some(id) = id { debug!("Already resolved ty {:?}, {:?}, {:?} {:?}", - id, declaration, ty, location); + id, + declaration, + ty, + location); // If the declaration existed, we *might* be done, but it's not // the case for class templates, where the template arguments @@ -580,13 +602,16 @@ impl<'ctx> BindgenContext<'ctx> { // location for building the new arguments, the template // argument names don't matter in the global context. if (declaration.kind() == CXCursor_ClassTemplate || - declaration.kind() == CXCursor_ClassTemplatePartialSpecialization) && + declaration.kind() == + CXCursor_ClassTemplatePartialSpecialization) && *ty != canonical_declaration.cur_type() && - location.is_some() && parent_id.is_some() { - return Some( - self.build_template_wrapper(with_id, id, - parent_id.unwrap(), ty, - location.unwrap())); + location.is_some() && + parent_id.is_some() { + return Some(self.build_template_wrapper(with_id, + id, + parent_id.unwrap(), + ty, + location.unwrap())); } return Some(self.build_ty_wrapper(with_id, id, parent_id, ty)); @@ -608,21 +633,26 @@ impl<'ctx> BindgenContext<'ctx> { with_id: ItemId, wrapped_id: ItemId, parent_id: Option, - ty: &clang::Type) -> ItemId { + ty: &clang::Type) + -> ItemId { let spelling = ty.spelling(); let is_const = ty.is_const(); let layout = ty.fallible_layout().ok(); let type_kind = TypeKind::ResolvedTypeRef(wrapped_id); let ty = Type::new(Some(spelling), layout, type_kind, is_const); - let item = Item::new(with_id, None, None, - parent_id.unwrap_or(self.current_module), ItemKind::Type(ty)); + let item = Item::new(with_id, + None, + None, + parent_id.unwrap_or(self.current_module), + ItemKind::Type(ty)); self.add_builtin_item(item); with_id } fn build_builtin_ty(&mut self, ty: &clang::Type, - _declaration: Cursor) -> Option { + _declaration: Cursor) + -> Option { use clangll::*; let type_kind = match ty.kind() { CXType_NullPtr => TypeKind::NullPtr, @@ -630,14 +660,11 @@ impl<'ctx> BindgenContext<'ctx> { CXType_Bool => TypeKind::Int(IntKind::Bool), CXType_Int => TypeKind::Int(IntKind::Int), CXType_UInt => TypeKind::Int(IntKind::UInt), - CXType_SChar | - CXType_Char_S => TypeKind::Int(IntKind::Char), - CXType_UChar | - CXType_Char_U => TypeKind::Int(IntKind::UChar), + CXType_SChar | CXType_Char_S => TypeKind::Int(IntKind::Char), + CXType_UChar | CXType_Char_U => TypeKind::Int(IntKind::UChar), CXType_Short => TypeKind::Int(IntKind::Short), CXType_UShort => TypeKind::Int(IntKind::UShort), - CXType_WChar | - CXType_Char16 => TypeKind::Int(IntKind::U16), + CXType_WChar | CXType_Char16 => TypeKind::Int(IntKind::U16), CXType_Char32 => TypeKind::Int(IntKind::U32), CXType_Long => TypeKind::Int(IntKind::Long), CXType_ULong => TypeKind::Int(IntKind::ULong), @@ -656,7 +683,8 @@ impl<'ctx> BindgenContext<'ctx> { let layout = ty.fallible_layout().ok(); let ty = Type::new(Some(spelling), layout, type_kind, is_const); let id = ItemId::next(); - let item = Item::new(id, None, None, self.root_module, ItemKind::Type(ty)); + let item = + Item::new(id, None, None, self.root_module, ItemKind::Type(ty)); self.add_builtin_item(item); Some(id) } @@ -697,7 +725,7 @@ impl<'ctx> BindgenContext<'ctx> { debug_assert!(self.in_codegen_phase(), "You're not supposed to call this yet"); self.options.hidden_types.contains(name) || - self.is_replaced_type(name, id) + self.is_replaced_type(name, id) } /// Has the item with the given `name` and `id` been replaced by another @@ -733,19 +761,23 @@ impl<'ctx> BindgenContext<'ctx> { }; let module_name = self.translation_unit - .tokens(&cursor).and_then(|tokens| { - if tokens.len() <= 1 { - None - } else { - match &*tokens[1].spelling { - "{" => None, - s => Some(s.to_owned()), + .tokens(&cursor) + .and_then(|tokens| { + if tokens.len() <= 1 { + None + } else { + match &*tokens[1].spelling { + "{" => None, + s => Some(s.to_owned()), + } } - } - }); + }); let module = Module::new(module_name); - let module = Item::new(module_id, None, None, self.current_module, + let module = Item::new(module_id, + None, + None, + self.current_module, ItemKind::Module(module)); self.add_item(module, None, None); @@ -756,7 +788,7 @@ impl<'ctx> BindgenContext<'ctx> { /// Start traversing the module with the given `module_id`, invoke the /// callback `cb`, and then return to traversing the original module. pub fn with_module(&mut self, module_id: ItemId, cb: F) - where F: FnOnce(&mut Self, &mut Vec) + where F: FnOnce(&mut Self, &mut Vec), { debug_assert!(self.resolve_item(module_id).kind().is_module(), "Wat"); @@ -766,9 +798,13 @@ impl<'ctx> BindgenContext<'ctx> { let mut children = vec![]; cb(self, &mut children); - self.items.get_mut(&module_id).unwrap() - .as_module_mut().expect("Not a module?") - .children_mut().extend(children.into_iter()); + self.items + .get_mut(&module_id) + .unwrap() + .as_module_mut() + .expect("Not a module?") + .children_mut() + .extend(children.into_iter()); self.current_module = previous_id; } diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index aff5130bcb..fd7dbb4562 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -1,10 +1,10 @@ //! Intermediate representation for C/C++ enumerations. +use clang; +use parse::{ClangItemParser, ParseError}; +use super::context::BindgenContext; use super::item::{Item, ItemId}; use super::ty::TypeKind; -use super::context::BindgenContext; -use parse::{ClangItemParser, ParseError}; -use clang; /// A C/C++ enumeration. #[derive(Debug)] @@ -41,14 +41,16 @@ impl Enum { /// Construct an enumeration from the given Clang type. pub fn from_ty(ty: &clang::Type, - ctx: &mut BindgenContext) -> Result { + ctx: &mut BindgenContext) + -> Result { use clangll::*; if ty.kind() != CXType_Enum { return Err(ParseError::Continue); } let declaration = ty.declaration().canonical(); - let repr = Item::from_ty(&declaration.enum_type(), None, None, ctx).ok(); + let repr = Item::from_ty(&declaration.enum_type(), None, None, ctx) + .ok(); let mut variants = vec![]; let is_signed = match repr { @@ -56,10 +58,14 @@ impl Enum { let repr_type = ctx.resolve_type(repr); match *repr_type.canonical_type(ctx).kind() { TypeKind::Int(ref int_kind) => int_kind.is_signed(), - ref other => panic!("Since when enums can be non-integers? {:?}", other), + ref other => { + panic!("Since when enums can be non-integers? {:?}", + other) + } } } - // Assume signedness since the default type by the C standard is an + // Assume signedness since the default type by the C + // standard is an // int. None => true, }; @@ -107,7 +113,10 @@ pub enum EnumVariantValue { impl EnumVariant { /// Construct a new enumeration variant from the given parts. - pub fn new(name: String, comment: Option, val: EnumVariantValue) -> Self { + pub fn new(name: String, + comment: Option, + val: EnumVariantValue) + -> Self { EnumVariant { name: name, comment: comment, diff --git a/src/ir/function.rs b/src/ir/function.rs index e9fd4a2505..c2e6ffd076 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -1,13 +1,13 @@ //! Intermediate representation for C/C++ functions and methods. +use clang; +use clangll::Enum_CXCallingConv; +use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use super::context::BindgenContext; use super::item::{Item, ItemId}; use super::ty::TypeKind; use super::type_collector::{ItemSet, TypeCollector}; use syntax::abi; -use clang; -use clangll::Enum_CXCallingConv; -use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; /// A function declaration, with a signature, arguments, and argument names. /// @@ -33,7 +33,8 @@ impl Function { pub fn new(name: String, mangled_name: Option, sig: ItemId, - comment: Option) -> Self { + comment: Option) + -> Self { Function { name: name, mangled_name: mangled_name, @@ -115,7 +116,8 @@ impl FunctionSig { pub fn new(return_type: ItemId, arguments: Vec<(Option, ItemId)>, is_variadic: bool, - abi: abi::Abi) -> Self { + abi: abi::Abi) + -> Self { FunctionSig { return_type: return_type, argument_types: arguments, @@ -127,7 +129,8 @@ impl FunctionSig { /// Construct a new function signature from the given Clang type. pub fn from_ty(ty: &clang::Type, cursor: &clang::Cursor, - ctx: &mut BindgenContext) -> Result { + ctx: &mut BindgenContext) + -> Result { use clangll::*; debug!("FunctionSig::from_ty {:?} {:?}", ty, cursor); @@ -147,14 +150,18 @@ impl FunctionSig { CXCursor_CXXMethod => { // For CXCursor_FunctionDecl, cursor.args() is the reliable way // to get parameter names and types. - cursor.args().iter().map(|arg| { - let arg_ty = arg.cur_type(); - let name = arg.spelling(); - let name = if name.is_empty() { None } else { Some(name) }; - let ty = Item::from_ty(&arg_ty, Some(*arg), None, ctx) - .expect("Argument?"); - (name, ty) - }).collect() + cursor.args() + .iter() + .map(|arg| { + let arg_ty = arg.cur_type(); + let name = arg.spelling(); + let name = + if name.is_empty() { None } else { Some(name) }; + let ty = Item::from_ty(&arg_ty, Some(*arg), None, ctx) + .expect("Argument?"); + (name, ty) + }) + .collect() } _ => { // For non-CXCursor_FunctionDecl, visiting the cursor's children @@ -162,10 +169,12 @@ impl FunctionSig { let mut args = vec![]; cursor.visit(|c, _| { if c.kind() == CXCursor_ParmDecl { - let ty = Item::from_ty(&c.cur_type(), Some(*c), None, ctx) - .expect("ParmDecl?"); + let ty = + Item::from_ty(&c.cur_type(), Some(*c), None, ctx) + .expect("ParmDecl?"); let name = c.spelling(); - let name = if name.is_empty() { None } else { Some(name) }; + let name = + if name.is_empty() { None } else { Some(name) }; args.push((name, ty)); } CXChildVisit_Continue @@ -180,12 +189,14 @@ impl FunctionSig { let is_static = cursor.method_is_static(); if !is_static && !is_virtual { let class = Item::parse(cursor.semantic_parent(), None, ctx) - .expect("Expected to parse the class"); - let ptr = Item::builtin_type(TypeKind::Pointer(class), is_const, ctx); + .expect("Expected to parse the class"); + let ptr = + Item::builtin_type(TypeKind::Pointer(class), is_const, ctx); args.insert(0, (Some("this".into()), ptr)); } else if is_virtual { let void = Item::builtin_type(TypeKind::Void, false, ctx); - let ptr = Item::builtin_type(TypeKind::Pointer(void), false, ctx); + let ptr = + Item::builtin_type(TypeKind::Pointer(void), false, ctx); args.insert(0, (Some("this".into()), ptr)); } } @@ -223,18 +234,22 @@ impl FunctionSig { impl ClangSubItemParser for Function { fn parse(cursor: clang::Cursor, - context: &mut BindgenContext) -> Result, ParseError> { + context: &mut BindgenContext) + -> Result, ParseError> { use clangll::*; match cursor.kind() { CXCursor_FunctionDecl | - CXCursor_CXXMethod => {}, + CXCursor_CXXMethod => {} _ => return Err(ParseError::Continue), }; debug!("Function::parse({:?}, {:?})", cursor, cursor.cur_type()); // Grab the signature using Item::from_ty. - let sig = try!(Item::from_ty(&cursor.cur_type(), Some(cursor), None, context)); + let sig = try!(Item::from_ty(&cursor.cur_type(), + Some(cursor), + None, + context)); let name = cursor.spelling(); assert!(!name.is_empty(), "Empty function name?"); diff --git a/src/ir/int.rs b/src/ir/int.rs index ed26acc4cb..a18e4c588a 100644 --- a/src/ir/int.rs +++ b/src/ir/int.rs @@ -46,9 +46,8 @@ pub enum IntKind { I128, /// A `uint128_t`. - U128, - - // Though now we're at it we could add equivalents for the rust types... + U128, /* Though now we're at it we could add equivalents for the rust + * types... */ } impl IntKind { @@ -56,11 +55,10 @@ impl IntKind { pub fn is_signed(&self) -> bool { use self::IntKind::*; match *self { - Bool | UChar | UShort | - UInt | ULong | ULongLong | U16 | U32 | U128 => false, + Bool | UChar | UShort | UInt | ULong | ULongLong | U16 | U32 | + U128 => false, - Char | Short | Int | - Long | LongLong | I128 => true, + Char | Short | Int | Long | LongLong | I128 => true, } } } diff --git a/src/ir/item.rs b/src/ir/item.rs index a6d15cd7c6..6857bc7085 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -1,17 +1,17 @@ //! Bindgen's core intermediate representation type. +use clang; +use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use regex::Regex; +use std::cell::{Cell, RefCell}; +use std::sync::atomic::{ATOMIC_USIZE_INIT, AtomicUsize, Ordering}; +use super::annotations::Annotations; use super::context::BindgenContext; +use super::function::Function; use super::item_kind::ItemKind; +use super::module::Module; use super::ty::{Type, TypeKind}; use super::type_collector::{ItemSet, TypeCollector}; -use super::function::Function; -use super::module::Module; -use super::annotations::Annotations; -use std::cell::{Cell, RefCell}; -use std::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering}; -use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; -use clang; /// A trait to get the canonical name from an item. /// @@ -105,7 +105,7 @@ impl TypeCollector for Item { ty.collect_types(context, types, self); } } - _ => {}, // FIXME. + _ => {} // FIXME. } } } @@ -171,7 +171,8 @@ impl Item { comment: Option, annotations: Option, parent_id: ItemId, - kind: ItemKind) -> Self { + kind: ItemKind) + -> Self { debug_assert!(id != parent_id || kind.is_module()); Item { id: id, @@ -248,8 +249,7 @@ impl Item { pub fn is_toplevel(&self, ctx: &BindgenContext) -> bool { // FIXME: Workaround for some types falling behind when parsing weird // stl classes, for example. - if ctx.options().enable_cxx_namespaces && - self.kind().is_module() && + if ctx.options().enable_cxx_namespaces && self.kind().is_module() && self.id() != ctx.root_module() { return false; } @@ -263,7 +263,8 @@ impl Item { if parent_item.id() == ctx.root_module() { return true; - } else if ctx.options().enable_cxx_namespaces || !parent_item.kind().is_module() { + } else if ctx.options().enable_cxx_namespaces || + !parent_item.kind().is_module() { return false; } @@ -328,16 +329,20 @@ impl Item { /// Normally we could do this check just in the `Type` kind, but we also /// need to check the `applicable_template_args` more generally, since we /// could need a type transitively from our parent, see the test added in - /// + /// /// /// It's kind of unfortunate (in the sense that it's a sort of complex /// process), but I think it should get all the cases. - fn signature_contains_named_type(&self, ctx: &BindgenContext, ty: &Type) -> bool { + fn signature_contains_named_type(&self, + ctx: &BindgenContext, + ty: &Type) + -> bool { debug_assert!(ty.is_named()); self.expect_type().signature_contains_named_type(ctx, ty) || - self.applicable_template_args(ctx).iter().any(|template| { - ctx.resolve_type(*template).signature_contains_named_type(ctx, ty) - }) + self.applicable_template_args(ctx).iter().any(|template| { + ctx.resolve_type(*template).signature_contains_named_type(ctx, ty) + }) } /// Returns the template arguments that apply to a struct. This is a concept @@ -373,7 +378,9 @@ impl Item { /// the template parameter type `T`, and that's exactly what this method /// represents. The unused template parameters get stripped in the /// `signature_contains_named_type` check. - pub fn applicable_template_args(&self, ctx: &BindgenContext) -> Vec { + pub fn applicable_template_args(&self, + ctx: &BindgenContext) + -> Vec { let ty = match *self.kind() { ItemKind::Type(ref ty) => ty, _ => return vec![], @@ -381,12 +388,14 @@ impl Item { fn parent_contains(ctx: &BindgenContext, parent_template_args: &[ItemId], - item: ItemId) -> bool { + item: ItemId) + -> bool { let item_ty = ctx.resolve_type(item); parent_template_args.iter().any(|parent_item| { let parent_ty = ctx.resolve_type(*parent_item); match (parent_ty.kind(), item_ty.kind()) { - (&TypeKind::Named(ref n, _), &TypeKind::Named(ref i, _)) => n == i, + (&TypeKind::Named(ref n, _), + &TypeKind::Named(ref i, _)) => n == i, _ => false, } }) @@ -402,21 +411,23 @@ impl Item { } TypeKind::Alias(_, inner) => { let parent_args = ctx.resolve_item(self.parent_id()) - .applicable_template_args(ctx); + .applicable_template_args(ctx); let inner = ctx.resolve_item(inner); // Avoid unused type parameters, sigh. - parent_args.iter().cloned().filter(|arg| { - let arg = ctx.resolve_type(*arg); - arg.is_named() && inner.signature_contains_named_type(ctx, arg) - }).collect() + parent_args.iter() + .cloned() + .filter(|arg| { + let arg = ctx.resolve_type(*arg); + arg.is_named() && + inner.signature_contains_named_type(ctx, arg) + }) + .collect() } // XXX Is this completely correct? Partial template specialization // is hard anyways, sigh... TypeKind::TemplateAlias(_, ref args) | - TypeKind::TemplateRef(_, ref args) => { - args.clone() - } + TypeKind::TemplateRef(_, ref args) => args.clone(), // In a template specialization we've got all we want. TypeKind::Comp(ref ci) if ci.is_template_specialization() => { ci.template_args().iter().cloned().collect() @@ -424,7 +435,7 @@ impl Item { TypeKind::Comp(ref ci) => { let mut parent_template_args = ctx.resolve_item(self.parent_id()) - .applicable_template_args(ctx); + .applicable_template_args(ctx); for ty in ci.template_args() { if !parent_contains(ctx, &parent_template_args, *ty) { @@ -457,7 +468,7 @@ impl Item { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); self.annotations.hide() || - ctx.hidden_by_name(&self.real_canonical_name(ctx, false, true), self.id) + ctx.hidden_by_name(&self.real_canonical_name(ctx, false, true), self.id) } /// Is this item opaque? @@ -465,7 +476,7 @@ impl Item { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); self.annotations.opaque() || - ctx.opaque_by_name(&self.real_canonical_name(ctx, false, true)) + ctx.opaque_by_name(&self.real_canonical_name(ctx, false, true)) } /// Get the canonical name without taking into account the replaces @@ -482,7 +493,8 @@ impl Item { fn real_canonical_name(&self, ctx: &BindgenContext, count_namespaces: bool, - for_name_checking: bool) -> String { + for_name_checking: bool) + -> String { let base_name = match *self.kind() { ItemKind::Type(ref ty) => { match *ty.kind() { @@ -538,7 +550,7 @@ impl Item { break; } let fun = ctx.resolve_item(method.signature()) - .expect_function(); + .expect_function(); if fun.name() == base { count += 1; } @@ -552,9 +564,7 @@ impl Item { } Some(base) } - ItemKind::Var(ref var) => { - Some(var.name().to_owned()) - } + ItemKind::Var(ref var) => Some(var.name().to_owned()), ItemKind::Module(ref module) => { module.name().map(ToOwned::to_owned) } @@ -595,7 +605,8 @@ impl Item { fn make_exposed_name(&self, parent_name: Option, base_name: Option, - ctx: &BindgenContext) -> String { + ctx: &BindgenContext) + -> String { lazy_static! { static ref RE_ENDS_WITH_BINDGEN_TY: Regex = Regex::new(r"_bindgen_ty(_\d+)+$").unwrap(); static ref RE_ENDS_WITH_BINDGEN_MOD: Regex = Regex::new(r"_bindgen_mod(_\d+)+$").unwrap(); @@ -606,18 +617,24 @@ impl Item { _ => (&*RE_ENDS_WITH_BINDGEN_TY, "ty"), }; - let parent_name = parent_name.and_then(|n| if n.is_empty() { None } else { Some(n) }); + let parent_name = + parent_name.and_then(|n| if n.is_empty() { None } else { Some(n) }); match (parent_name, base_name) { (Some(parent), Some(base)) => format!("{}_{}", parent, base), (Some(parent), None) => { if re.is_match(parent.as_str()) { format!("{}_{}", parent, self.exposed_id(ctx)) } else { - format!("{}__bindgen_{}_{}", parent, kind, self.exposed_id(ctx)) + format!("{}__bindgen_{}_{}", + parent, + kind, + self.exposed_id(ctx)) } } (None, Some(base)) => base, - (None, None) => format!("_bindgen_{}_{}", kind, self.exposed_id(ctx)), + (None, None) => { + format!("_bindgen_{}_{}", kind, self.exposed_id(ctx)) + } } } @@ -645,13 +662,16 @@ impl Item { } impl ClangItemParser for Item { - fn builtin_type(kind: TypeKind, is_const: bool, ctx: &mut BindgenContext) -> ItemId { + fn builtin_type(kind: TypeKind, + is_const: bool, + ctx: &mut BindgenContext) + -> ItemId { // Feel free to add more here, I'm just lazy. match kind { TypeKind::Void | TypeKind::Int(..) | TypeKind::Pointer(..) | - TypeKind::Float(..) => {}, + TypeKind::Float(..) => {} _ => panic!("Unsupported builtin type"), } @@ -659,14 +679,16 @@ impl ClangItemParser for Item { let id = ItemId::next(); let module = ctx.root_module(); ctx.add_item(Item::new(id, None, None, module, ItemKind::Type(ty)), - None, None); + None, + None); id } fn parse(cursor: clang::Cursor, parent_id: Option, - context: &mut BindgenContext) -> Result { + context: &mut BindgenContext) + -> Result { use ir::function::Function; use ir::module::Module; use ir::var::Var; @@ -723,11 +745,12 @@ impl ClangItemParser for Item { cursor }; match Self::from_ty(&applicable_cursor.cur_type(), - Some(applicable_cursor), parent_id, context) - { + Some(applicable_cursor), + parent_id, + context) { Ok(ty) => return Ok(ty), Err(ParseError::Recurse) => return Err(ParseError::Recurse), - Err(ParseError::Continue) => {}, + Err(ParseError::Continue) => {} } } @@ -741,11 +764,13 @@ impl ClangItemParser for Item { CXCursor_MacroDefinition | CXCursor_InclusionDirective => { debug!("Unhandled cursor kind {:?}: {:?}", - cursor.kind(), cursor); - }, - _ =>{ + cursor.kind(), + cursor); + } + _ => { error!("Unhandled cursor kind {:?}: {:?}", - cursor.kind(), cursor); + cursor.kind(), + cursor); } } @@ -756,8 +781,13 @@ impl ClangItemParser for Item { fn from_ty_or_ref(ty: clang::Type, location: Option, parent_id: Option, - context: &mut BindgenContext) -> ItemId { - Self::from_ty_or_ref_with_id(ItemId::next(), ty, location, parent_id, context) + context: &mut BindgenContext) + -> ItemId { + Self::from_ty_or_ref_with_id(ItemId::next(), + ty, + location, + parent_id, + context) } /// Parse a C++ type. If we find a reference to a type that has not been @@ -774,13 +804,22 @@ impl ClangItemParser for Item { ty: clang::Type, location: Option, parent_id: Option, - context: &mut BindgenContext) -> ItemId { - debug!("from_ty_or_ref_with_id: {:?} {:?}, {:?}, {:?}", potential_id, ty, location, parent_id); + context: &mut BindgenContext) + -> ItemId { + debug!("from_ty_or_ref_with_id: {:?} {:?}, {:?}, {:?}", + potential_id, + ty, + location, + parent_id); if context.collected_typerefs() { debug!("refs already collected, resolving directly"); - return Self::from_ty_with_id(potential_id, &ty, location, parent_id, context) - .expect("Unable to resolve type"); + return Self::from_ty_with_id(potential_id, + &ty, + location, + parent_id, + context) + .expect("Unable to resolve type"); } if let Some(ty) = context.builtin_or_resolved_ty(potential_id, @@ -795,9 +834,14 @@ impl ClangItemParser for Item { let is_const = ty.is_const(); let kind = TypeKind::UnresolvedTypeRef(ty, location, parent_id); let current_module = context.current_module(); - context.add_item(Item::new(potential_id, None, None, + context.add_item(Item::new(potential_id, + None, + None, parent_id.unwrap_or(current_module), - ItemKind::Type(Type::new(None, None, kind, is_const))), + ItemKind::Type(Type::new(None, + None, + kind, + is_const))), Some(clang::Cursor::null()), None); potential_id @@ -807,7 +851,8 @@ impl ClangItemParser for Item { fn from_ty(ty: &clang::Type, location: Option, parent_id: Option, - context: &mut BindgenContext) -> Result { + context: &mut BindgenContext) + -> Result { Self::from_ty_with_id(ItemId::next(), ty, location, parent_id, context) } @@ -823,7 +868,8 @@ impl ClangItemParser for Item { ty: &clang::Type, location: Option, parent_id: Option, - context: &mut BindgenContext) -> Result { + context: &mut BindgenContext) + -> Result { use clangll::*; let decl = { @@ -836,19 +882,18 @@ impl ClangItemParser for Item { } }; - let comment = - decl.raw_comment() - .or_else(|| location.as_ref().and_then(|l| l.raw_comment())); - let annotations = - Annotations::new(&decl) - .or_else(|| location.as_ref().and_then(|l| Annotations::new(l))); + let comment = decl.raw_comment() + .or_else(|| location.as_ref().and_then(|l| l.raw_comment())); + let annotations = Annotations::new(&decl) + .or_else(|| location.as_ref().and_then(|l| Annotations::new(l))); - if let Some(ref replaced) = annotations.as_ref().and_then(|a| a.use_instead_of()) { + if let Some(ref replaced) = annotations.as_ref() + .and_then(|a| a.use_instead_of()) { context.replace(replaced, id); } - if let Some(ty) = context.builtin_or_resolved_ty(id, parent_id, - ty, location) { + if let Some(ty) = + context.builtin_or_resolved_ty(id, parent_id, ty, location) { return Ok(ty); } @@ -856,7 +901,9 @@ impl ClangItemParser for Item { let mut valid_decl = decl.kind() != CXCursor_NoDeclFound; let declaration_to_look_for = if valid_decl { decl.canonical() - } else if location.is_some() && location.unwrap().kind() == CXCursor_ClassTemplate { + } else if location.is_some() && + location.unwrap().kind() == + CXCursor_ClassTemplate { valid_decl = true; location.unwrap() } else { @@ -864,7 +911,9 @@ impl ClangItemParser for Item { }; if valid_decl { - if let Some(&(_, item_id)) = context.currently_parsed_types.iter().find(|&&(d, _)| d == declaration_to_look_for) { + if let Some(&(_, item_id)) = context.currently_parsed_types + .iter() + .find(|&&(d, _)| d == declaration_to_look_for) { debug!("Avoiding recursion parsing type: {:?}", ty); return Ok(item_id); } @@ -879,11 +928,13 @@ impl ClangItemParser for Item { let ret = match result { Ok(ParseResult::AlreadyResolved(ty)) => Ok(ty), Ok(ParseResult::New(item, declaration)) => { - context.add_item(Item::new(id, comment, annotations, - parent_id.unwrap_or(current_module), - ItemKind::Type(item)), - declaration, - location); + context.add_item(Item::new(id, + comment, + annotations, + parent_id.unwrap_or(current_module), + ItemKind::Type(item)), + declaration, + location); Ok(id) } Err(ParseError::Continue) => Err(ParseError::Continue), @@ -897,13 +948,18 @@ impl ClangItemParser for Item { // declaration_to_look_for suspiciously shares a lot of // logic with ir::context, so we should refactor that. if valid_decl { - let (popped_decl, _) = context.currently_parsed_types.pop().unwrap(); + let (popped_decl, _) = + context.currently_parsed_types.pop().unwrap(); assert_eq!(popped_decl, declaration_to_look_for); } location.visit(|cur, _other| { use clangll::*; - result = Item::from_ty_with_id(id, ty, Some(*cur), parent_id, context); + result = Item::from_ty_with_id(id, + ty, + Some(*cur), + parent_id, + context); match result { Ok(..) => CXChildVisit_Break, Err(ParseError::Recurse) => CXChildVisit_Recurse, @@ -912,7 +968,8 @@ impl ClangItemParser for Item { }); if valid_decl { - context.currently_parsed_types.push((declaration_to_look_for, id)); + context.currently_parsed_types + .push((declaration_to_look_for, id)); } } // If we have recursed into the AST all we know, and we still @@ -936,7 +993,8 @@ impl ClangItemParser for Item { }; if valid_decl { - let (popped_decl, _) = context.currently_parsed_types.pop().unwrap(); + let (popped_decl, _) = + context.currently_parsed_types.pop().unwrap(); assert_eq!(popped_decl, declaration_to_look_for); } @@ -954,14 +1012,18 @@ impl ClangItemParser for Item { name: S, default: Option, parent_id: ItemId, - context: &mut BindgenContext) -> ItemId - where S: Into + context: &mut BindgenContext) + -> ItemId + where S: Into, { // see tests/headers/const_tparam.hpp // and tests/headers/variadic_tname.hpp let name = name.into().replace("const ", "").replace(".", ""); - context.add_item(Item::new(id, None, None, parent_id, + context.add_item(Item::new(id, + None, + None, + parent_id, ItemKind::Type(Type::named(name, default))), None, None); @@ -972,10 +1034,15 @@ impl ClangItemParser for Item { fn named_type(name: S, default: Option, parent_id: ItemId, - context: &mut BindgenContext) -> ItemId - where S: Into + context: &mut BindgenContext) + -> ItemId + where S: Into, { - Self::named_type_with_id(ItemId::next(), name, default, parent_id, context) + Self::named_type_with_id(ItemId::next(), + name, + default, + parent_id, + context) } } @@ -989,7 +1056,8 @@ impl ItemCanonicalName for Item { if self.canonical_name_cache.borrow().is_none() { *self.canonical_name_cache.borrow_mut() = Some(self.real_canonical_name(ctx, - ctx.options().enable_cxx_namespaces, + ctx.options() + .enable_cxx_namespaces, false)); } return self.canonical_name_cache.borrow().as_ref().unwrap().clone(); @@ -1015,8 +1083,10 @@ impl ItemCanonicalPath for Item { if let ItemKind::Type(ref ty) = *self.kind() { match *ty.kind() { TypeKind::Comp(ref ci) if ci.is_template_specialization() => { - return ci.specialized_template().unwrap().canonical_path(ctx); - }, + return ci.specialized_template() + .unwrap() + .canonical_path(ctx); + } TypeKind::ResolvedTypeRef(inner) | TypeKind::TemplateRef(inner, _) => { return inner.canonical_path(ctx); @@ -1029,7 +1099,8 @@ impl ItemCanonicalPath for Item { } let mut parent_path = self.parent_id().canonical_path(&ctx); - if parent_path.last().map_or(false, |parent_name| parent_name.is_empty()) { + if parent_path.last() + .map_or(false, |parent_name| parent_name.is_empty()) { // This only happens (or should only happen) when we're an alias, // and our parent is a templated alias, in which case the last // component of the path will be empty. diff --git a/src/ir/module.rs b/src/ir/module.rs index 591a4e3af8..c582d3eb8a 100644 --- a/src/ir/module.rs +++ b/src/ir/module.rs @@ -1,10 +1,10 @@ //! Intermediate representation for modules (AKA C++ namespaces). -use super::context::BindgenContext; -use super::item::ItemId; use clang; use parse::{ClangSubItemParser, ParseError, ParseResult}; use parse_one; +use super::context::BindgenContext; +use super::item::ItemId; /// A module, as in, a C++ namespace. #[derive(Clone, Debug)] @@ -41,18 +41,22 @@ impl Module { } impl ClangSubItemParser for Module { - fn parse(cursor: clang::Cursor, ctx: &mut BindgenContext) -> Result, ParseError> { + fn parse(cursor: clang::Cursor, + ctx: &mut BindgenContext) + -> Result, ParseError> { use clangll::*; match cursor.kind() { CXCursor_Namespace => { let module_id = ctx.module(cursor); ctx.with_module(module_id, |ctx, children| { - cursor.visit(|cursor, _| parse_one(ctx, *cursor, Some(module_id), children)) + cursor.visit(|cursor, _| { + parse_one(ctx, *cursor, Some(module_id), children) + }) }); Ok(ParseResult::AlreadyResolved(module_id)) } - _ => Err(ParseError::Continue) + _ => Err(ParseError::Continue), } } } diff --git a/src/ir/ty.rs b/src/ir/ty.rs index a914ce14ff..bab500246b 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1,15 +1,15 @@ //! Everything related to types in our intermediate representation. +use clang::{self, Cursor}; +use parse::{ClangItemParser, ParseError, ParseResult}; use super::comp::CompInfo; +use super::context::BindgenContext; use super::enum_ty::Enum; use super::function::FunctionSig; -use super::item::{Item, ItemId}; use super::int::IntKind; +use super::item::{Item, ItemId}; use super::layout::Layout; -use super::context::BindgenContext; use super::type_collector::{ItemSet, TypeCollector}; -use parse::{ClangItemParser, ParseResult, ParseError}; -use clang::{self, Cursor}; /// The base representation of a type in bindgen. /// @@ -49,7 +49,8 @@ impl Type { pub fn new(name: Option, layout: Option, kind: TypeKind, - is_const: bool) -> Self { + is_const: bool) + -> Self { Type { name: name, layout: layout, @@ -141,15 +142,17 @@ impl Type { self.layout.or_else(|| { match self.kind { - TypeKind::Comp(ref ci) - => ci.layout(ctx), + TypeKind::Comp(ref ci) => ci.layout(ctx), // FIXME(emilio): This is a hack for anonymous union templates. // Use the actual pointer size! TypeKind::Pointer(..) | - TypeKind::BlockPointer - => Some(Layout::new(mem::size_of::<*mut ()>(), mem::align_of::<*mut ()>())), - TypeKind::ResolvedTypeRef(inner) - => ctx.resolve_type(inner).layout(ctx), + TypeKind::BlockPointer => { + Some(Layout::new(mem::size_of::<*mut ()>(), + mem::align_of::<*mut ()>())) + } + TypeKind::ResolvedTypeRef(inner) => { + ctx.resolve_type(inner).layout(ctx) + } _ => None, } }) @@ -168,9 +171,7 @@ impl Type { } TypeKind::ResolvedTypeRef(t) | TypeKind::TemplateAlias(t, _) | - TypeKind::Alias(_, t) => { - ctx.resolve_type(t).can_derive_debug(ctx) - } + TypeKind::Alias(_, t) => ctx.resolve_type(t).can_derive_debug(ctx), TypeKind::Comp(ref info) => { info.can_derive_debug(ctx, self.layout(ctx)) } @@ -200,14 +201,17 @@ impl Type { /// is an error. /// /// That's the whole point of the existence of `can_derive_copy_in_array`. - pub fn can_derive_copy_in_array(&self, ctx: &BindgenContext, item: &Item) -> bool { + pub fn can_derive_copy_in_array(&self, + ctx: &BindgenContext, + item: &Item) + -> bool { match self.kind { TypeKind::ResolvedTypeRef(t) | TypeKind::TemplateAlias(t, _) | TypeKind::Alias(_, t) | TypeKind::Array(t, _) => { ctx.resolve_item(t) - .can_derive_copy_in_array(ctx) + .can_derive_copy_in_array(ctx) } TypeKind::Named(..) => false, _ => self.can_derive_copy(ctx, item), @@ -225,12 +229,8 @@ impl Type { TypeKind::ResolvedTypeRef(t) | TypeKind::TemplateAlias(t, _) | TypeKind::TemplateRef(t, _) | - TypeKind::Alias(_, t) => { - ctx.resolve_item(t).can_derive_copy(ctx) - } - TypeKind::Comp(ref info) => { - info.can_derive_copy(ctx, item) - } + TypeKind::Alias(_, t) => ctx.resolve_item(t).can_derive_copy(ctx), + TypeKind::Comp(ref info) => info.can_derive_copy(ctx, item), _ => true, } } @@ -242,12 +242,8 @@ impl Type { TypeKind::TemplateRef(t, _) | TypeKind::TemplateAlias(t, _) | TypeKind::Alias(_, t) | - TypeKind::ResolvedTypeRef(t) => { - ctx.resolve_type(t).has_vtable(ctx) - } - TypeKind::Comp(ref info) => { - info.has_vtable(ctx) - } + TypeKind::ResolvedTypeRef(t) => ctx.resolve_type(t).has_vtable(ctx), + TypeKind::Comp(ref info) => info.has_vtable(ctx), _ => false, } @@ -262,9 +258,7 @@ impl Type { TypeKind::ResolvedTypeRef(t) => { ctx.resolve_type(t).has_destructor(ctx) } - TypeKind::Comp(ref info) => { - info.has_destructor(ctx) - } + TypeKind::Comp(ref info) => info.has_destructor(ctx), _ => false, } } @@ -272,7 +266,8 @@ impl Type { /// See the comment in `Item::signature_contains_named_type`. pub fn signature_contains_named_type(&self, ctx: &BindgenContext, - ty: &Type) -> bool { + ty: &Type) + -> bool { debug_assert!(ty.is_named()); let name = match *ty.kind() { TypeKind::Named(ref name, _) => name, @@ -280,38 +275,40 @@ impl Type { }; match self.kind { - TypeKind::Named(ref this_name, _) - => this_name == name, + TypeKind::Named(ref this_name, _) => this_name == name, TypeKind::ResolvedTypeRef(t) | TypeKind::Array(t, _) | TypeKind::Pointer(t) | - TypeKind::Alias(_, t) - => ctx.resolve_type(t) - .signature_contains_named_type(ctx, ty), + TypeKind::Alias(_, t) => { + ctx.resolve_type(t) + .signature_contains_named_type(ctx, ty) + } TypeKind::Function(ref sig) => { sig.argument_types().iter().any(|&(_, arg)| { ctx.resolve_type(arg) - .signature_contains_named_type(ctx, ty) + .signature_contains_named_type(ctx, ty) }) || ctx.resolve_type(sig.return_type()) - .signature_contains_named_type(ctx, ty) - }, + .signature_contains_named_type(ctx, ty) + } TypeKind::TemplateAlias(_, ref template_args) | TypeKind::TemplateRef(_, ref template_args) => { template_args.iter().any(|arg| { ctx.resolve_type(*arg) - .signature_contains_named_type(ctx, ty) + .signature_contains_named_type(ctx, ty) }) } - TypeKind::Comp(ref ci) - => ci.signature_contains_named_type(ctx, ty), - _ => false, + TypeKind::Comp(ref ci) => ci.signature_contains_named_type(ctx, ty), + _ => false, } } /// See safe_canonical_type. - pub fn canonical_type<'tr>(&'tr self, ctx: &'tr BindgenContext) -> &'tr Type { - self.safe_canonical_type(ctx).expect("Should have been resolved after parsing!") + pub fn canonical_type<'tr>(&'tr self, + ctx: &'tr BindgenContext) + -> &'tr Type { + self.safe_canonical_type(ctx) + .expect("Should have been resolved after parsing!") } /// Returns the canonical type of this type, that is, the "inner type". @@ -319,7 +316,9 @@ impl Type { /// For example, for a `typedef`, the canonical type would be the /// `typedef`ed type, for a template specialization, would be the template /// its specializing, and so on. Return None if the type is unresolved. - pub fn safe_canonical_type<'tr>(&'tr self, ctx: &'tr BindgenContext) -> Option<&'tr Type> { + pub fn safe_canonical_type<'tr>(&'tr self, + ctx: &'tr BindgenContext) + -> Option<&'tr Type> { match self.kind { TypeKind::Named(..) | TypeKind::Array(..) | @@ -337,8 +336,9 @@ impl Type { TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(_, inner) | TypeKind::TemplateAlias(inner, _) | - TypeKind::TemplateRef(inner, _) - => ctx.resolve_type(inner).safe_canonical_type(ctx), + TypeKind::TemplateRef(inner, _) => { + ctx.resolve_type(inner).safe_canonical_type(ctx) + } TypeKind::UnresolvedTypeRef(..) => None, } @@ -413,7 +413,10 @@ pub enum TypeKind { /// already known types, and are converted to ResolvedTypeRef. /// /// see tests/headers/typeref.hpp to see somewhere where this is a problem. - UnresolvedTypeRef(clang::Type, Option, /* parent_id */ Option), + UnresolvedTypeRef(clang::Type, + Option, + /* parent_id */ + Option), /// An indirection to another type. /// @@ -438,14 +441,14 @@ impl Type { TypeKind::Void => true, TypeKind::Comp(ref ci) => ci.is_unsized(ctx), TypeKind::Array(inner, size) => { - size == 0 || - ctx.resolve_type(inner).is_unsized(ctx) + size == 0 || ctx.resolve_type(inner).is_unsized(ctx) } TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(_, inner) | TypeKind::TemplateAlias(inner, _) | - TypeKind::TemplateRef(inner, _) - => ctx.resolve_type(inner).is_unsized(ctx), + TypeKind::TemplateRef(inner, _) => { + ctx.resolve_type(inner).is_unsized(ctx) + } TypeKind::Named(..) | TypeKind::Int(..) | TypeKind::Float(..) | @@ -456,8 +459,9 @@ impl Type { TypeKind::BlockPointer | TypeKind::Pointer(..) => false, - TypeKind::UnresolvedTypeRef(..) - => unreachable!("Should have been resolved after parsing!"), + TypeKind::UnresolvedTypeRef(..) => { + unreachable!("Should have been resolved after parsing!") + } } } @@ -470,10 +474,11 @@ impl Type { ty: &clang::Type, location: Option, parent_id: Option, - ctx: &mut BindgenContext) -> Result, ParseError> { + ctx: &mut BindgenContext) + -> Result, ParseError> { use clangll::*; - if let Some(ty) = ctx.builtin_or_resolved_ty(potential_id, parent_id, - ty, location) { + if let Some(ty) = + ctx.builtin_or_resolved_ty(potential_id, parent_id, ty, location) { debug!("{:?} already resolved: {:?}", ty, location); return Ok(ParseResult::AlreadyResolved(ty)); } @@ -490,11 +495,13 @@ impl Type { CXType_Unexposed if *ty != canonical_ty && canonical_ty.kind() != CXType_Invalid => { debug!("Looking for canonical type: {:?}", canonical_ty); - return Self::from_clang_ty(potential_id, &canonical_ty, - location, parent_id, ctx); + return Self::from_clang_ty(potential_id, + &canonical_ty, + location, + parent_id, + ctx); } - CXType_Unexposed | - CXType_Invalid => { + CXType_Unexposed | CXType_Invalid => { // For some reason Clang doesn't give us any hint // in some situations where we should generate a // function pointer (see @@ -505,22 +512,25 @@ impl Type { let signature = try!(FunctionSig::from_ty(ty, &location.unwrap_or(cursor), ctx)); TypeKind::Function(signature) - // Same here, with template specialisations we can safely assume - // this is a Comp(..) + // Same here, with template specialisations we can safely + // assume + // this is a Comp(..) } else if ty.template_args().map_or(false, |x| x.len() > 0) { debug!("Template specialization: {:?}", ty); let complex = CompInfo::from_ty(potential_id, ty, location, ctx) - .expect("C'mon"); + .expect("C'mon"); TypeKind::Comp(complex) } else if let Some(location) = location { match location.kind() { CXCursor_ClassTemplatePartialSpecialization | CXCursor_ClassTemplate => { name = location.spelling(); - let complex = - CompInfo::from_ty(potential_id, ty, Some(location), ctx) - .expect("C'mon"); + let complex = CompInfo::from_ty(potential_id, + ty, + Some(location), + ctx) + .expect("C'mon"); TypeKind::Comp(complex) } CXCursor_TypeAliasTemplateDecl => { @@ -633,40 +643,49 @@ impl Type { return Err(ParseError::Continue); } } - // NOTE: We don't resolve pointers eagerly because the pointee type - // might not have been parsed, and if it contains templates or - // something else we might get confused, see the comment inside + // NOTE: We don't resolve pointers eagerly because the + // pointee type + // might not have been parsed, and if it contains templates + // or + // something else we might get confused, see the comment + // inside // TypeRef. // - // We might need to, though, if the context is already in the + // We might need to, though, if the context is already in + // the // process of resolving them. CXType_MemberPointer | CXType_Pointer => { - let inner = - Item::from_ty_or_ref(ty.pointee_type(), location, - parent_id, ctx); + let inner = Item::from_ty_or_ref(ty.pointee_type(), + location, + parent_id, + ctx); TypeKind::Pointer(inner) } - CXType_BlockPointer => { - TypeKind::BlockPointer - } - // XXX: RValueReference is most likely wrong, but I don't think we + CXType_BlockPointer => TypeKind::BlockPointer, + // XXX: RValueReference is most likely wrong, but I don't + // think we // can even add bindings for that, so huh. CXType_RValueReference | CXType_LValueReference => { - let inner = - Item::from_ty_or_ref(ty.pointee_type(), location, - parent_id, ctx); + let inner = Item::from_ty_or_ref(ty.pointee_type(), + location, + parent_id, + ctx); TypeKind::Reference(inner) } // XXX DependentSizedArray is wrong CXType_VariableArray | CXType_DependentSizedArray | CXType_IncompleteArray => { - let inner = Item::from_ty(ty.elem_type().as_ref() - .expect("Not an appropriate type?"), - location, parent_id, ctx) - .expect("Not able to resolve array element?"); + let inner = + Item::from_ty(ty.elem_type() + .as_ref() + .expect("Not an appropriate type?"), + location, + parent_id, + ctx) + .expect("Not able to resolve array element?"); TypeKind::Pointer(inner) } CXType_FunctionNoProto | @@ -681,41 +700,55 @@ impl Type { TypeKind::Alias(ty.spelling(), inner) } CXType_Enum => { - let enum_ = Enum::from_ty(ty, ctx) - .expect("Not an enum?"); + let enum_ = Enum::from_ty(ty, ctx).expect("Not an enum?"); TypeKind::Enum(enum_) } CXType_Record => { - let complex = CompInfo::from_ty(potential_id, ty, location, ctx) - .expect("Not a complex type?"); + let complex = + CompInfo::from_ty(potential_id, ty, location, ctx) + .expect("Not a complex type?"); TypeKind::Comp(complex) } - // FIXME: We stub vectors as arrays since in 99% of the cases the - // layout is going to be correct, and there's no way we can generate + // FIXME: We stub vectors as arrays since in 99% of the + // cases the + // layout is going to be correct, and there's no way we can + // generate // vector types properly in Rust for now. // // That being said, that should be fixed eventually. CXType_Vector | CXType_ConstantArray => { - let inner = Item::from_ty(ty.elem_type().as_ref() - .expect("Not an appropriate type?"), - location, parent_id, ctx) - .expect("Not able to resolve array element?"); + let inner = + Item::from_ty(ty.elem_type() + .as_ref() + .expect("Not an appropriate type?"), + location, + parent_id, + ctx) + .expect("Not able to resolve array element?"); TypeKind::Array(inner, ty.num_elements().unwrap()) } - // A complex number is always a real and an imaginary part, so + // A complex number is always a real and an imaginary part, + // so // represent that as a two-item array. CXType_Complex => { - let inner = Item::from_ty(ty.elem_type().as_ref() - .expect("Not an appropriate type?"), - location, parent_id, ctx) - .expect("Not able to resolve array element?"); + let inner = + Item::from_ty(ty.elem_type() + .as_ref() + .expect("Not an appropriate type?"), + location, + parent_id, + ctx) + .expect("Not able to resolve array element?"); TypeKind::Array(inner, 2) } #[cfg(not(feature="llvm_stable"))] CXType_Elaborated => { - return Self::from_clang_ty(potential_id, &ty.named(), - location, parent_id, ctx); + return Self::from_clang_ty(potential_id, + &ty.named(), + location, + parent_id, + ctx); } _ => { error!("unsupported type {:?} at {:?}", ty, location); @@ -746,8 +779,9 @@ impl TypeCollector for Type { TypeKind::TemplateAlias(inner, _) | TypeKind::Alias(_, inner) | TypeKind::Named(_, Some(inner)) | - TypeKind::ResolvedTypeRef(inner) - => inner.collect_types(context, types, &()), + TypeKind::ResolvedTypeRef(inner) => { + inner.collect_types(context, types, &()) + } TypeKind::TemplateRef(inner, ref template_args) => { inner.collect_types(context, types, &()); @@ -762,7 +796,7 @@ impl TypeCollector for Type { // FIXME: Pending types! ref other @ _ => { debug!("Ignoring: {:?}", other); - }, + } } } } diff --git a/src/ir/var.rs b/src/ir/var.rs index e9245e1a7e..6d9b61e122 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -1,12 +1,12 @@ //! Intermediate representation of variables. -use super::item::{Item, ItemId}; +use clang; +use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use super::context::BindgenContext; -use super::ty::TypeKind; -use super::int::IntKind; use super::function::cursor_mangling; -use parse::{ClangItemParser, ClangSubItemParser, ParseResult, ParseError}; -use clang; +use super::int::IntKind; +use super::item::{Item, ItemId}; +use super::ty::TypeKind; /// A `Var` is our intermediate representation of a variable. #[derive(Debug)] @@ -30,7 +30,8 @@ impl Var { mangled: Option, ty: ItemId, val: Option, - is_const: bool) -> Var { + is_const: bool) + -> Var { assert!(!name.is_empty()); Var { name: name, @@ -69,7 +70,8 @@ impl Var { impl ClangSubItemParser for Var { fn parse(cursor: clang::Cursor, - context: &mut BindgenContext) -> Result, ParseError> { + context: &mut BindgenContext) + -> Result, ParseError> { use clangll::*; match cursor.kind() { CXCursor_MacroDefinition => { @@ -91,14 +93,25 @@ impl ClangSubItemParser for Var { context.note_parsed_macro(name.clone()); let ty = if value < 0 { - Item::builtin_type(TypeKind::Int(IntKind::Int), true, context) - } else if value.abs() > u32::max_value() as i64 { - Item::builtin_type(TypeKind::Int(IntKind::ULongLong), true, context) + Item::builtin_type(TypeKind::Int(IntKind::Int), + true, + context) + } else if value.abs() > u32::max_value() as i64 { + Item::builtin_type(TypeKind::Int(IntKind::ULongLong), + true, + context) } else { - Item::builtin_type(TypeKind::Int(IntKind::UInt), true, context) + Item::builtin_type(TypeKind::Int(IntKind::UInt), + true, + context) }; - Ok(ParseResult::New(Var::new(name, None, ty, Some(value), true), Some(cursor))) + Ok(ParseResult::New(Var::new(name, + None, + ty, + Some(value), + true), + Some(cursor))) } CXCursor_VarDecl => { let name = cursor.spelling(); @@ -113,7 +126,7 @@ impl ClangSubItemParser for Var { let is_const = ty.is_const(); let ty = Item::from_ty(&ty, Some(cursor), None, context) - .expect("Unable to resolve constant type?"); + .expect("Unable to resolve constant type?"); // Note: Ty might not be totally resolved yet, see // tests/headers/inner_const.hpp @@ -144,7 +157,8 @@ impl ClangSubItemParser for Var { /// Try and parse the immediately found tokens from an unit (if any) to integers fn parse_int_literal_tokens(cursor: &clang::Cursor, - unit: &clang::TranslationUnit) -> Option { + unit: &clang::TranslationUnit) + -> Option { use clangll::{CXToken_Literal, CXToken_Punctuation}; let tokens = match unit.tokens(cursor) { @@ -158,11 +172,11 @@ fn parse_int_literal_tokens(cursor: &clang::Cursor, match token.kind { CXToken_Punctuation if token.spelling == "-" => { negate = !negate; - }, + } CXToken_Literal => { literal = Some(token.spelling); - break - }, + break; + } _ => { // Reset values if we found anything else negate = false; @@ -172,21 +186,23 @@ fn parse_int_literal_tokens(cursor: &clang::Cursor, } literal.and_then(|lit| { - if lit.starts_with("0x") { - // TODO: try to preserve hex literals? - i64::from_str_radix(&lit[2..], 16).ok() - } else if lit == "0" { - Some(0) - } else if lit.starts_with("0") { - i64::from_str_radix(&lit[1..], 8).ok() - } else { - lit.parse().ok() - } - }).map(|lit| if negate { -lit } else { lit }) + if lit.starts_with("0x") { + // TODO: try to preserve hex literals? + i64::from_str_radix(&lit[2..], 16).ok() + } else if lit == "0" { + Some(0) + } else if lit.starts_with("0") { + i64::from_str_radix(&lit[1..], 8).ok() + } else { + lit.parse().ok() + } + }) + .map(|lit| if negate { -lit } else { lit }) } fn get_integer_literal_from_cursor(cursor: &clang::Cursor, - unit: &clang::TranslationUnit) -> Option { + unit: &clang::TranslationUnit) + -> Option { use clangll::*; let mut value = None; cursor.visit(|c, _| { @@ -198,7 +214,7 @@ fn get_integer_literal_from_cursor(cursor: &clang::Cursor, CXCursor_UnexposedExpr => { value = get_integer_literal_from_cursor(&c, unit); } - _ => () + _ => (), } if value.is_some() { CXChildVisit_Break diff --git a/src/lib.rs b/src/lib.rs index 4f12667226..1592c275df 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -73,23 +73,23 @@ mod codegen { include!(concat!(env!("OUT_DIR"), "/codegen.rs")); } + +use ir::context::BindgenContext; +use ir::item::{Item, ItemId}; +use parse::{ClangItemParser, ParseError}; +use regex_set::RegexSet; use std::borrow::Borrow; -use std::io::{self, Write}; +use std::collections::HashSet; use std::fs::OpenOptions; +use std::io::{self, Write}; use std::path::Path; -use std::collections::HashSet; use syntax::ast; use syntax::codemap::{DUMMY_SP, Span}; -use syntax::print::pprust; use syntax::print::pp::eof; +use syntax::print::pprust; use syntax::ptr::P; -use ir::context::BindgenContext; -use ir::item::{Item, ItemId}; -use parse::{ClangItemParser, ParseError}; -use regex_set::RegexSet; - /// Configure and generate Rust bindings for a C/C++ header. /// /// This is the main entry point to the library. @@ -310,7 +310,7 @@ pub enum LinkType { /// Use static linking. Static, /// The library is an OSX framework. - Framework + Framework, } /// Generated Rust bindings. @@ -325,7 +325,9 @@ impl Bindings { /// /// Deprecated - use a `Builder` instead #[deprecated] - pub fn generate(options: BindgenOptions, span: Option) -> Result { + pub fn generate(options: BindgenOptions, + span: Option) + -> Result { let span = span.unwrap_or(DUMMY_SP); let mut context = BindgenContext::new(options); @@ -359,7 +361,11 @@ impl Bindings { /// Write these bindings as source text to a file. pub fn write_to_file>(&self, path: P) -> io::Result<()> { - let file = try!(OpenOptions::new().write(true).truncate(true).create(true).open(path)); + let file = try!(OpenOptions::new() + .write(true) + .truncate(true) + .create(true) + .open(path)); self.write(Box::new(file)) } @@ -367,7 +373,8 @@ impl Bindings { // https://github.com/Manishearth/rust-clippy/issues/740 #[cfg_attr(feature = "clippy", allow(needless_lifetimes))] pub fn write<'a>(&self, mut writer: Box) -> io::Result<()> { - try!(writer.write("/* automatically generated by rust-bindgen */\n\n".as_bytes())); + try!(writer.write("/* automatically generated by rust-bindgen */\n\n" + .as_bytes())); for line in self.raw_lines.iter() { try!(writer.write(line.as_bytes())); @@ -400,15 +407,16 @@ fn filter_builtins(ctx: &BindgenContext, cursor: &clang::Cursor) -> bool { pub fn parse_one(ctx: &mut BindgenContext, cursor: clang::Cursor, parent: Option, - children: &mut Vec) -> clangll::Enum_CXVisitorResult { + children: &mut Vec) + -> clangll::Enum_CXVisitorResult { if !filter_builtins(ctx, &cursor) { - return CXChildVisit_Continue + return CXChildVisit_Continue; } use clangll::CXChildVisit_Continue; match Item::parse(cursor, parent, ctx) { Ok(id) => children.push(id), - Err(ParseError::Continue) => {}, + Err(ParseError::Continue) => {} Err(ParseError::Recurse) => { cursor.visit(|child, _| parse_one(ctx, *child, parent, children)); } diff --git a/src/parse.rs b/src/parse.rs index 1f5566437f..98cf6b13e8 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -1,9 +1,9 @@ //! Common traits and types related to parsing our IR from Clang cursors. use clang; -use ir::ty::TypeKind; -use ir::item::ItemId; use ir::context::BindgenContext; +use ir::item::ItemId; +use ir::ty::TypeKind; /// Not so much an error in the traditional sense, but a control flow message /// when walking over Clang's AST with a cursor. @@ -30,12 +30,14 @@ pub enum ParseResult { /// An intermediate representation "sub-item" (i.e. one of the types contained /// inside an `ItemKind` variant) that can be parsed from a Clang cursor. -pub trait ClangSubItemParser : Sized { +pub trait ClangSubItemParser: Sized { /// Attempt to parse this type from the given cursor. /// /// The fact that is a reference guarantees it's held by the context, and /// allow returning already existing types. - fn parse(cursor: clang::Cursor, context: &mut BindgenContext) -> Result, ParseError>; + fn parse(cursor: clang::Cursor, + context: &mut BindgenContext) + -> Result, ParseError>; } /// An intermediate representation item that can be parsed from a Clang cursor. @@ -43,13 +45,15 @@ pub trait ClangItemParser: Sized { /// Parse this item from the given Clang cursor. fn parse(cursor: clang::Cursor, parent: Option, - context: &mut BindgenContext) -> Result; + context: &mut BindgenContext) + -> Result; /// Parse this item from the given Clang type. fn from_ty(ty: &clang::Type, location: Option, parent: Option, - ctx: &mut BindgenContext) -> Result; + ctx: &mut BindgenContext) + -> Result; /// Identical to `from_ty`, but use the given `id` as the `ItemId` for the /// newly parsed item. @@ -57,14 +61,16 @@ pub trait ClangItemParser: Sized { ty: &clang::Type, location: Option, parent: Option, - ctx: &mut BindgenContext) -> Result; + ctx: &mut BindgenContext) + -> Result; /// Parse this item from the given Clang type, or if we haven't resolved all /// the other items this one depends on, an unresolved reference. fn from_ty_or_ref(ty: clang::Type, location: Option, parent_id: Option, - context: &mut BindgenContext) -> ItemId; + context: &mut BindgenContext) + -> ItemId; /// Identical to `from_ty_or_ref`, but use the given `potential_id` as the /// `ItemId` for the newly parsed item. @@ -72,19 +78,30 @@ pub trait ClangItemParser: Sized { ty: clang::Type, location: Option, parent_id: Option, - context: &mut BindgenContext) -> ItemId; + context: &mut BindgenContext) + -> ItemId; /// Create a named template type. - fn named_type(name: S, default: Option, parent: ItemId, - context: &mut BindgenContext) -> ItemId + fn named_type(name: S, + default: Option, + parent: ItemId, + context: &mut BindgenContext) + -> ItemId where S: Into; /// Identical to `named_type`, but use `id` as the resulting item's /// `ItemId`. - fn named_type_with_id(id: ItemId, name: S, default: Option, - parent: ItemId, context: &mut BindgenContext) -> ItemId + fn named_type_with_id(id: ItemId, + name: S, + default: Option, + parent: ItemId, + context: &mut BindgenContext) + -> ItemId where S: Into; /// Create a builtin type. - fn builtin_type(kind: TypeKind, is_const: bool, context: &mut BindgenContext) -> ItemId; + fn builtin_type(kind: TypeKind, + is_const: bool, + context: &mut BindgenContext) + -> ItemId; } diff --git a/src/regex_set.rs b/src/regex_set.rs index ff899d78db..9313059023 100644 --- a/src/regex_set.rs +++ b/src/regex_set.rs @@ -1,7 +1,7 @@ //! A type that represents the union of a set of regular expressions. -use std::borrow::Borrow; use regex::Regex; +use std::borrow::Borrow; // Yeah, I'm aware this is sorta crappy, should be cheaper to compile a regex // ORing all the patterns, I guess... @@ -9,7 +9,7 @@ use regex::Regex; /// A dynamic set of regular expressions. #[derive(Debug)] pub struct RegexSet { - items: Vec + items: Vec, } impl RegexSet { @@ -20,7 +20,7 @@ impl RegexSet { /// Extend this set with every regex in the iterator. pub fn extend(&mut self, iter: I) - where I: IntoIterator + where I: IntoIterator, { for s in iter.into_iter() { self.insert(&s) @@ -29,7 +29,7 @@ impl RegexSet { /// Insert a new regex into this set. pub fn insert(&mut self, string: &S) - where S: Borrow + where S: Borrow, { let s = string.borrow(); match Regex::new(&format!("^{}$", s)) { @@ -44,7 +44,7 @@ impl RegexSet { /// Does the given `string` match any of the regexes in this set? pub fn matches(&self, string: &S) -> bool - where S: Borrow + where S: Borrow, { let s = string.borrow(); for r in &self.items { From b57b767112b16726794bf0d5fbe503d99f822097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 1 Nov 2016 12:57:34 +0100 Subject: [PATCH 0008/2291] Manual fixups, some of them pretty lame, and don't let rustfmt rewrap comments. --- rustfmt.toml | 1 - src/clang.rs | 7 +- src/codegen/mod.rs | 104 +++++++++++++++++----------- src/ir/comp.rs | 112 ++++++++++++++++++------------ src/ir/context.rs | 14 ++-- src/ir/item.rs | 169 ++++++++++++++++++++++++--------------------- src/ir/ty.rs | 155 ++++++++++++++++++++++------------------- src/ir/var.rs | 38 +++++----- 8 files changed, 340 insertions(+), 260 deletions(-) diff --git a/rustfmt.toml b/rustfmt.toml index 6677939bce..96d4ae474d 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,6 +1,5 @@ max_width = 80 format_strings = false -wrap_comments = true fn_brace_style = "SameLineWhere" item_brace_style = "SameLineWhere" struct_lit_multiline_style = "ForceMulti" diff --git a/src/clang.rs b/src/clang.rs index 24d9e45e8a..e1bb105921 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -1259,7 +1259,12 @@ pub fn kind_to_str(x: Enum_CXCursorKind) -> &'static str { CXCursor_TemplateTemplateParameter => "TemplateTemplateParameter", CXCursor_FunctionTemplate => "FunctionTemplate", CXCursor_ClassTemplate => "ClassTemplate", - CXCursor_ClassTemplatePartialSpecialization => "ClassTemplatePartialSpecialization", + CXCursor_ClassTemplatePartialSpecialization => { + // FIXME: Ugly hack for rustfmt, should go away! + // + // I plan to convert this into an enum right away anyway, though. + return "ClassTemplatePartialSpecialization"; + } CXCursor_NamespaceAlias => "NamespaceAlias", CXCursor_UsingDirective => "UsingDirective", CXCursor_UsingDeclaration => "UsingDeclaration", diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index a4d717d331..5717390401 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1,9 +1,10 @@ mod helpers; + use aster; + use ir::annotations::FieldAccessorKind; use ir::comp::{CompInfo, CompKind, Field, Method}; - use ir::context::BindgenContext; use ir::enum_ty::Enum; use ir::function::{Function, FunctionSig}; @@ -16,13 +17,12 @@ use ir::ty::{Type, TypeKind}; use ir::type_collector::{ItemSet, TypeCollector}; use ir::var::Var; use self::helpers::{BlobTyBuilder, attributes}; + use std::borrow::Cow; use std::collections::HashSet; use std::collections::hash_map::{Entry, HashMap}; use std::mem; - use std::ops; - use syntax::abi::Abi; use syntax::ast; use syntax::codemap::{Span, respan}; @@ -40,8 +40,7 @@ struct CodegenResult { saw_union: bool, items_seen: HashSet, /// The set of generated function/var names, needed because in C/C++ is - /// legal to - /// do something like: + /// legal to do something like: /// /// ```c++ /// extern "C" { @@ -400,7 +399,8 @@ impl CodeGenerator for Type { if template_arg.is_named() { let name = template_arg.name().unwrap(); if name.contains("typename ") { - error!("Item contained `typename`'d template param: {:?}", item); + error!("Item contained `typename`'d template \ + parameter: {:?}", item); return; } generics = @@ -541,18 +541,25 @@ impl<'a> Bitfield<'a> { pub fn $getter_name(&self) -> $field_type { unsafe { ::std::mem::transmute( - ((self.$field_ident & ($mask as $bitfield_type)) >> $offset) - as $int_type) + ( + (self.$field_ident & + ($mask as $bitfield_type)) + >> $offset + ) as $int_type + ) } } #[inline] pub fn $setter_name(&mut self, val: $field_type) { self.$field_ident &= !($mask as $bitfield_type); - self.$field_ident |= (val as $int_type as $bitfield_type << $offset) & ($mask as $bitfield_type); + self.$field_ident |= + (val as $int_type as $bitfield_type << $offset) & + ($mask as $bitfield_type); } } - ).unwrap(); + ) + .unwrap(); let items = match item.unwrap().node { ast::ItemKind::Impl(_, _, _, _, _, items) => items, @@ -639,6 +646,7 @@ impl CodeGenerator for CompInfo { }; // Generate the vtable from the method list if appropriate. + // // TODO: I don't know how this could play with virtual methods that are // not in the list of methods found by us, we'll see. Also, could the // order of the vtable pointers vary? @@ -677,8 +685,9 @@ impl CodeGenerator for CompInfo { continue; } - for (i, ty) in applicable_template_args.iter().enumerate() { - if base_ty.signature_contains_named_type(ctx, ctx.resolve_type(*ty)) { + for (i, ty_id) in applicable_template_args.iter().enumerate() { + let template_arg_ty = ctx.resolve_type(*ty_id); + if base_ty.signature_contains_named_type(ctx, template_arg_ty) { template_args_used[i] = true; } } @@ -758,8 +767,9 @@ impl CodeGenerator for CompInfo { continue; } - for (i, ty) in applicable_template_args.iter().enumerate() { - if field_ty.signature_contains_named_type(ctx, ctx.resolve_type(*ty)) { + for (i, ty_id) in applicable_template_args.iter().enumerate() { + let template_arg = ctx.resolve_type(*ty_id); + if field_ty.signature_contains_named_type(ctx, template_arg) { template_args_used[i] = true; } } @@ -841,7 +851,8 @@ impl CodeGenerator for CompInfo { } #[inline] - pub unsafe fn $mutable_getter_name(&mut self) -> &mut $ty { + pub unsafe fn $mutable_getter_name(&mut self) + -> &mut $ty { &mut self.$field_name } } @@ -931,9 +942,12 @@ impl CodeGenerator for CompInfo { if !template_args_used[i] { let name = ctx.resolve_type(*ty).name().unwrap(); let ident = ctx.rust_ident(name); + let phantom = quote_ty!(ctx.ext_cx(), + ::std::marker::PhantomData<$ident>); let field = - StructFieldBuilder::named(format!("_phantom_{}", i)).pub_() - .build_ty(quote_ty!(ctx.ext_cx(), ::std::marker::PhantomData<$ident>)); + StructFieldBuilder::named(format!("_phantom_{}", i)) + .pub_() + .build_ty(phantom); fields.push(field) } } @@ -972,16 +986,18 @@ impl CodeGenerator for CompInfo { // affect layout, so we're bad and pray to the gods for avoid sending // all the tests to shit when parsing things like max_align_t. if self.found_unknown_attr() { - warn!("Type {} has an unkown attribute that may affect layout", canonical_name); + warn!("Type {} has an unkown attribute that may affect layout", + canonical_name); } + if applicable_template_args.is_empty() && !self.found_unknown_attr() { for var in self.inner_vars() { ctx.resolve_item(*var).codegen(ctx, result, &()); } if let Some(layout) = layout { - let fn_name = - ctx.rust_ident_raw(&format!("bindgen_test_layout_{}", canonical_name)); + let fn_name = format!("bindgen_test_layout_{}", canonical_name); + let fn_name = ctx.rust_ident_raw(&fn_name); let ident = ctx.rust_ident_raw(&canonical_name); let size_of_expr = quote_expr!(ctx.ext_cx(), ::std::mem::size_of::<$ident>()); @@ -1107,6 +1123,7 @@ impl MethodCodegen for Method { }; assert!(!fndecl.inputs.is_empty()); + // FIXME: use aster here. fndecl.inputs[0] = ast::Arg { ty: P(ast::Ty { @@ -1123,9 +1140,11 @@ impl MethodCodegen for Method { }), pat: P(ast::Pat { id: ast::DUMMY_NODE_ID, - node: ast::PatKind::Ident(ast::BindingMode::ByValue(ast::Mutability::Immutable), - respan(ctx.span(), ctx.ext_cx().ident_of("self")), - None), + node: ast::PatKind::Ident( + ast::BindingMode::ByValue(ast::Mutability::Immutable), + respan(ctx.span(), ctx.ext_cx().ident_of("self")), + None + ), span: ctx.span(), }), id: ast::DUMMY_NODE_ID, @@ -1223,7 +1242,8 @@ impl CodeGenerator for Enum { } } None => { - warn!("Guessing type of enum! Forward declarations of enums shouldn't be legal!"); + warn!("Guessing type of enum! Forward declarations of enums \ + shouldn't be legal!"); IntKind::Int } }; @@ -1272,8 +1292,7 @@ impl CodeGenerator for Enum { // Only to avoid recomputing every time. enum_canonical_name: &str, // May be the same as "variant" if it's because the - // enum - // is unnamed and we still haven't seen the value. + // enum is unnamed and we still haven't seen the value. variant_name: &str, referenced_name: &str, enum_rust_ty: P, @@ -1342,9 +1361,11 @@ impl CodeGenerator for Enum { .canonical_name(ctx)); } + let parent_name = parent_canonical_name.as_ref() + .unwrap(); + Cow::Owned( - format!("{}_{}", parent_canonical_name.as_ref().unwrap(), - variant_name)) + format!("{}_{}", parent_name, variant_name)) }; add_constant(enum_ty, @@ -1464,13 +1485,15 @@ impl ToRustTy for Type { let mut inner_ty = inner.to_rust_ty(ctx).unwrap(); if let ast::TyKind::Path(_, ref mut path) = inner_ty.node { + let template_args = template_args.iter() + .map(|arg| arg.to_rust_ty(ctx)) + .collect(); + path.segments.last_mut().unwrap().parameters = ast::PathParameters::AngleBracketed( ast::AngleBracketedParameterData { lifetimes: vec![], - types: P::from_vec(template_args.iter().map(|arg| { - arg.to_rust_ty(ctx) - }).collect()), + types: P::from_vec(template_args), bindings: P::from_vec(vec![]), } ); @@ -1498,7 +1521,8 @@ impl ToRustTy for Type { Some(layout) => BlobTyBuilder::new(layout).build(), None => { warn!("Couldn't compute layout for a type with non \ - type template params or opaque, expect dragons!"); + type template params or opaque, expect \ + dragons!"); aster::AstBuilder::new().ty().unit() } }; @@ -1558,11 +1582,14 @@ impl ToRustTy for FunctionSig { let arg_item = ctx.resolve_item(ty); let arg_ty = arg_item.kind().expect_type(); - // From the C90 standard (http://c0x.coding-guidelines.com/6.7.5.3.html) - // 1598 - A declaration of a parameter as “array of type” shall be - // adjusted to “qualified pointer to type”, where the type qualifiers - // (if any) are those specified within the [ and ] of the array type - // derivation. + // From the C90 standard[1]: + // + // A declaration of a parameter as "array of type" shall be + // adjusted to "qualified pointer to type", where the type + // qualifiers (if any) are those specified within the [ and ] of + // the array type derivation. + // + // [1]: http://c0x.coding-guidelines.com/6.7.5.3.html let arg_ty = if let TypeKind::Array(t, _) = *arg_ty.kind() { t.to_rust_ty(ctx).to_ptr(arg_ty.is_const(), ctx.span()) } else { @@ -1678,8 +1705,7 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { context.options().whitelisted_vars.is_empty() { for (_item_id, item) in context.items() { // Non-toplevel item parents are the responsible one for - // generating - // them. + // generating them. if item.is_toplevel(context) { item.codegen(context, &mut result, &()); } diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 27094003c6..d55c24ca16 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -275,22 +275,20 @@ impl CompInfo { self.detect_derive_debug_cycle.set(true); - let can_derive_debug = self.base_members.iter().all(|ty| { - ctx.resolve_type(*ty) - .can_derive_debug(ctx) - }) && - self.template_args.iter().all(|ty| { - ctx.resolve_type(*ty) - .can_derive_debug(ctx) - }) && - self.fields.iter().all(|field| { - ctx.resolve_type(field.ty) - .can_derive_debug(ctx) - }) && - self.ref_template.map_or(true, |template| { - ctx.resolve_type(template) - .can_derive_debug(ctx) - }); + let can_derive_debug = { + self.base_members + .iter() + .all(|ty| ctx.resolve_type(*ty).can_derive_debug(ctx)) && + self.template_args + .iter() + .all(|ty| ctx.resolve_type(*ty).can_derive_debug(ctx)) && + self.fields + .iter() + .all(|f| ctx.resolve_type(f.ty).can_derive_debug(ctx)) && + self.ref_template.map_or(true, |template| { + ctx.resolve_type(template).can_derive_debug(ctx) + }) + }; self.detect_derive_debug_cycle.set(false); @@ -301,9 +299,7 @@ impl CompInfo { pub fn is_unsized(&self, ctx: &BindgenContext) -> bool { !self.has_vtable(ctx) && self.fields.is_empty() && self.base_members.iter().all(|base| { - ctx.resolve_type(*base) - .canonical_type(ctx) - .is_unsized(ctx) + ctx.resolve_type(*base).canonical_type(ctx).is_unsized(ctx) }) && self.ref_template .map_or(true, |template| ctx.resolve_type(template).is_unsized(ctx)) @@ -521,7 +517,7 @@ impl CompInfo { let mut maybe_anonymous_struct_field = None; cursor.visit(|cur, _other| { if cur.kind() != CXCursor_FieldDecl { - if let Some((ty, ref _clang_ty)) = maybe_anonymous_struct_field { + if let Some((ty, _)) = maybe_anonymous_struct_field { let field = Field::new(None, ty, None, None, None, false); ci.fields.push(field); } @@ -540,16 +536,24 @@ impl CompInfo { CXChildVisit_Continue }); if !used { - let field = Field::new(None, ty, None, None, None, false); + let field = Field::new(None, + ty, + None, + None, + None, + false); ci.fields.push(field); } - }, + } None => {} } let bit_width = cur.bit_width(); - let field_type = - Item::from_ty_or_ref(cur.cur_type(), Some(*cur), Some(potential_id), ctx); + let field_type = Item::from_ty_or_ref(cur.cur_type(), + Some(*cur), + Some(potential_id), + ctx); + let comment = cur.raw_comment(); let annotations = Annotations::new(cur); let name = cur.spelling(); @@ -562,8 +566,12 @@ impl CompInfo { let name = if name.is_empty() { None } else { Some(name) }; - let field = Field::new(name, field_type, comment, - annotations, bit_width, is_mutable); + let field = Field::new(name, + field_type, + comment, + annotations, + bit_width, + is_mutable); ci.fields.push(field); // No we look for things like attributes and stuff. @@ -586,14 +594,16 @@ impl CompInfo { CXCursor_ClassTemplate | CXCursor_ClassDecl => { let inner = Item::parse(*cur, Some(potential_id), ctx) - .expect("Inner ClassDecl"); + .expect("Inner ClassDecl"); if !ci.inner_types.contains(&inner) { ci.inner_types.push(inner); } // A declaration of an union or a struct without name could // also be an unnamed field, unfortunately. - if cur.spelling().is_empty() && cur.kind() != CXCursor_EnumDecl { - maybe_anonymous_struct_field = Some((inner, cur.cur_type())); + if cur.spelling().is_empty() && + cur.kind() != CXCursor_EnumDecl { + let ty = cur.cur_type(); + maybe_anonymous_struct_field = Some((inner, ty)); } } CXCursor_PackedAttr => { @@ -608,18 +618,24 @@ impl CompInfo { return CXChildVisit_Continue; } - let default_type = - Item::from_ty(&cur.cur_type(), Some(*cur), Some(potential_id), ctx).ok(); - let param = Item::named_type(cur.spelling(), default_type, - potential_id, ctx); + let default_type = Item::from_ty(&cur.cur_type(), + Some(*cur), + Some(potential_id), + ctx) + .ok(); + let param = Item::named_type(cur.spelling(), + default_type, + potential_id, + ctx); ci.template_args.push(param); } CXCursor_CXXBaseSpecifier => { if !ci.has_vtable { ci.has_vtable = cur.is_virtual_base(); } - let type_id = Item::from_ty(&cur.cur_type(), None, None, ctx) - .expect("BaseSpecifier"); + let type_id = + Item::from_ty(&cur.cur_type(), None, None, ctx) + .expect("BaseSpecifier"); ci.base_members.push(type_id); } CXCursor_CXXMethod => { @@ -668,9 +684,12 @@ impl CompInfo { return CXChildVisit_Continue; } - // NB: This gets us an owned `Function`, not a `FunctionSig`. - let method_signature = Item::parse(*cur, Some(potential_id), ctx) - .expect("CXXMethod"); + // NB: This gets us an owned `Function`, not a + // `FunctionSig`. + let method_signature = + Item::parse(*cur, Some(potential_id), ctx) + .expect("CXXMethod"); + let is_const = cur.method_is_const(); let method_kind = if is_static { MethodKind::Static @@ -679,7 +698,11 @@ impl CompInfo { } else { MethodKind::Normal }; - ci.methods.push(Method::new(method_kind, method_signature, is_const)); + + let method = + Method::new(method_kind, method_signature, is_const); + + ci.methods.push(method); } CXCursor_Destructor => { if cur.method_is_virtual() { @@ -693,7 +716,8 @@ impl CompInfo { } CXCursor_VarDecl => { let linkage = cur.linkage(); - if linkage != CXLinkage_External && linkage != CXLinkage_UniqueExternal { + if linkage != CXLinkage_External && + linkage != CXLinkage_UniqueExternal { return CXChildVisit_Continue; } @@ -703,7 +727,7 @@ impl CompInfo { } let item = Item::parse(*cur, Some(potential_id), ctx) - .expect("VarDecl"); + .expect("VarDecl"); ci.inner_vars.push(item); } // Intentionally not handled @@ -713,8 +737,10 @@ impl CompInfo { CXCursor_FunctionTemplate | CXCursor_ConversionFunction => {} _ => { - warn!("unhandled composite member `{}` (kind {}) in `{}` ({})", - cur.spelling(), cur.kind(), cursor.spelling(), + warn!("unhandled comp member `{}` (kind {}) in `{}` ({})", + cur.spelling(), + cur.kind(), + cursor.spelling(), cur.location()); } } diff --git a/src/ir/context.rs b/src/ir/context.rs index 5e29e0c980..273dc3e319 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -105,10 +105,15 @@ impl<'ctx> BindgenContext<'ctx> { let index = clang::Index::new(false, true); + let parse_options = + clangll::CXTranslationUnit_DetailedPreprocessingRecord; let translation_unit = - clang::TranslationUnit::parse(&index, "", &options.clang_args, &[], - clangll::CXTranslationUnit_DetailedPreprocessingRecord) - .expect("null TranslationUnit received from `clang::TranslationUnit::parse`"); + clang::TranslationUnit::parse(&index, + "", + &options.clang_args, + &[], + parse_options) + .expect("TranslationUnit::parse"); let root_module = Self::build_root_module(); let mut me = BindgenContext { @@ -531,7 +536,8 @@ impl<'ctx> BindgenContext<'ctx> { // That being said, this is not so common, so just error! and hope // for the best, returning the previous type, who knows. if old_args.len() != args.len() { - error!("Found partial template specialization, expect dragons!"); + error!("Found partial template specialization, \ + expect dragons!"); return wrapping; } diff --git a/src/ir/item.rs b/src/ir/item.rs index 6857bc7085..4e893e357b 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -80,10 +80,10 @@ impl TypeCollector for ItemId { type Extra = (); fn collect_types(&self, - context: &BindgenContext, + ctx: &BindgenContext, types: &mut ItemSet, extra: &()) { - context.resolve_item(*self).collect_types(context, types, extra); + ctx.resolve_item(*self).collect_types(ctx, types, extra); } } @@ -91,18 +91,18 @@ impl TypeCollector for Item { type Extra = (); fn collect_types(&self, - context: &BindgenContext, + ctx: &BindgenContext, types: &mut ItemSet, _extra: &()) { - if self.is_hidden(context) || types.contains(&self.id()) { + if self.is_hidden(ctx) || types.contains(&self.id()) { return; } match *self.kind() { ItemKind::Type(ref ty) => { types.insert(self.id()); - if !self.is_opaque(context) { - ty.collect_types(context, types, self); + if !self.is_opaque(ctx) { + ty.collect_types(ctx, types, self); } } _ => {} // FIXME. @@ -329,8 +329,7 @@ impl Item { /// Normally we could do this check just in the `Type` kind, but we also /// need to check the `applicable_template_args` more generally, since we /// could need a type transitively from our parent, see the test added in - /// + /// commit 2a3f93074dd2898669dbbce6e97e5cc4405d7cb1. /// /// It's kind of unfortunate (in the sense that it's a sort of complex /// process), but I think it should get all the cases. @@ -498,9 +497,12 @@ impl Item { let base_name = match *self.kind() { ItemKind::Type(ref ty) => { match *ty.kind() { - // If we're a template specialization, our name is our parent's - TypeKind::Comp(ref ci) if ci.is_template_specialization() => { - return ci.specialized_template().unwrap().canonical_name(ctx); + // If we're a template specialization, our name is our + // parent's. + TypeKind::Comp(ref ci) + if ci.is_template_specialization() => { + return ci.specialized_template().unwrap() + .canonical_name(ctx); }, // Same as above TypeKind::ResolvedTypeRef(inner) | @@ -524,7 +526,10 @@ impl Item { // would be needed. TypeKind::TemplateAlias(inner, _) => { if for_name_checking { - return ctx.resolve_item(inner).real_canonical_name(ctx, count_namespaces, false); + return ctx.resolve_item(inner) + .real_canonical_name(ctx, + count_namespaces, + false); } Some("") } @@ -608,8 +613,11 @@ impl Item { ctx: &BindgenContext) -> String { lazy_static! { - static ref RE_ENDS_WITH_BINDGEN_TY: Regex = Regex::new(r"_bindgen_ty(_\d+)+$").unwrap(); - static ref RE_ENDS_WITH_BINDGEN_MOD: Regex = Regex::new(r"_bindgen_mod(_\d+)+$").unwrap(); + static ref RE_ENDS_WITH_BINDGEN_TY: Regex = + Regex::new(r"_bindgen_ty(_\d+)+$").unwrap(); + + static ref RE_ENDS_WITH_BINDGEN_MOD: Regex = + Regex::new(r"_bindgen_mod(_\d+)+$").unwrap(); } let (re, kind) = match *self.kind() { @@ -687,7 +695,7 @@ impl ClangItemParser for Item { fn parse(cursor: clang::Cursor, parent_id: Option, - context: &mut BindgenContext) + ctx: &mut BindgenContext) -> Result { use ir::function::Function; use ir::module::Module; @@ -701,15 +709,18 @@ impl ClangItemParser for Item { let comment = cursor.raw_comment(); let annotations = Annotations::new(&cursor); - let current_module = context.current_module(); + let current_module = ctx.current_module(); + let relevant_parent_id = parent_id.unwrap_or(current_module); + macro_rules! try_parse { ($what:ident) => { - match $what::parse(cursor, context) { + match $what::parse(cursor, ctx) { Ok(ParseResult::New(item, declaration)) => { let id = ItemId::next(); - context.add_item(Item::new(id, comment, annotations, - parent_id.unwrap_or(current_module), - ItemKind::$what(item)), + + ctx.add_item(Item::new(id, comment, annotations, + relevant_parent_id, + ItemKind::$what(item)), declaration, Some(cursor)); return Ok(id); @@ -747,7 +758,7 @@ impl ClangItemParser for Item { match Self::from_ty(&applicable_cursor.cur_type(), Some(applicable_cursor), parent_id, - context) { + ctx) { Ok(ty) => return Ok(ty), Err(ParseError::Recurse) => return Err(ParseError::Recurse), Err(ParseError::Continue) => {} @@ -781,13 +792,13 @@ impl ClangItemParser for Item { fn from_ty_or_ref(ty: clang::Type, location: Option, parent_id: Option, - context: &mut BindgenContext) + ctx: &mut BindgenContext) -> ItemId { Self::from_ty_or_ref_with_id(ItemId::next(), ty, location, parent_id, - context) + ctx) } /// Parse a C++ type. If we find a reference to a type that has not been @@ -804,7 +815,7 @@ impl ClangItemParser for Item { ty: clang::Type, location: Option, parent_id: Option, - context: &mut BindgenContext) + ctx: &mut BindgenContext) -> ItemId { debug!("from_ty_or_ref_with_id: {:?} {:?}, {:?}, {:?}", potential_id, @@ -812,19 +823,19 @@ impl ClangItemParser for Item { location, parent_id); - if context.collected_typerefs() { + if ctx.collected_typerefs() { debug!("refs already collected, resolving directly"); return Self::from_ty_with_id(potential_id, &ty, location, parent_id, - context) + ctx) .expect("Unable to resolve type"); } - if let Some(ty) = context.builtin_or_resolved_ty(potential_id, - parent_id, &ty, - location) { + if let Some(ty) = ctx.builtin_or_resolved_ty(potential_id, + parent_id, &ty, + location) { debug!("{:?} already resolved: {:?}", ty, location); return ty; } @@ -833,17 +844,17 @@ impl ClangItemParser for Item { let is_const = ty.is_const(); let kind = TypeKind::UnresolvedTypeRef(ty, location, parent_id); - let current_module = context.current_module(); - context.add_item(Item::new(potential_id, - None, - None, - parent_id.unwrap_or(current_module), - ItemKind::Type(Type::new(None, - None, - kind, - is_const))), - Some(clang::Cursor::null()), - None); + let current_module = ctx.current_module(); + ctx.add_item(Item::new(potential_id, + None, + None, + parent_id.unwrap_or(current_module), + ItemKind::Type(Type::new(None, + None, + kind, + is_const))), + Some(clang::Cursor::null()), + None); potential_id } @@ -851,9 +862,9 @@ impl ClangItemParser for Item { fn from_ty(ty: &clang::Type, location: Option, parent_id: Option, - context: &mut BindgenContext) + ctx: &mut BindgenContext) -> Result { - Self::from_ty_with_id(ItemId::next(), ty, location, parent_id, context) + Self::from_ty_with_id(ItemId::next(), ty, location, parent_id, ctx) } /// This is one of the trickiest methods you'll find (probably along with @@ -868,7 +879,7 @@ impl ClangItemParser for Item { ty: &clang::Type, location: Option, parent_id: Option, - context: &mut BindgenContext) + ctx: &mut BindgenContext) -> Result { use clangll::*; @@ -887,13 +898,14 @@ impl ClangItemParser for Item { let annotations = Annotations::new(&decl) .or_else(|| location.as_ref().and_then(|l| Annotations::new(l))); - if let Some(ref replaced) = annotations.as_ref() - .and_then(|a| a.use_instead_of()) { - context.replace(replaced, id); + if let Some(ref annotations) = annotations { + if let Some(ref replaced) = annotations.use_instead_of() { + ctx.replace(replaced, id); + } } if let Some(ty) = - context.builtin_or_resolved_ty(id, parent_id, ty, location) { + ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { return Ok(ty); } @@ -911,7 +923,7 @@ impl ClangItemParser for Item { }; if valid_decl { - if let Some(&(_, item_id)) = context.currently_parsed_types + if let Some(&(_, item_id)) = ctx.currently_parsed_types .iter() .find(|&&(d, _)| d == declaration_to_look_for) { debug!("Avoiding recursion parsing type: {:?}", ty); @@ -919,22 +931,23 @@ impl ClangItemParser for Item { } } - let current_module = context.current_module(); + let current_module = ctx.current_module(); if valid_decl { - context.currently_parsed_types.push((declaration_to_look_for, id)); + ctx.currently_parsed_types.push((declaration_to_look_for, id)); } - let result = Type::from_clang_ty(id, ty, location, parent_id, context); + let result = Type::from_clang_ty(id, ty, location, parent_id, ctx); + let relevant_parent_id = parent_id.unwrap_or(current_module); let ret = match result { Ok(ParseResult::AlreadyResolved(ty)) => Ok(ty), Ok(ParseResult::New(item, declaration)) => { - context.add_item(Item::new(id, - comment, - annotations, - parent_id.unwrap_or(current_module), - ItemKind::Type(item)), - declaration, - location); + ctx.add_item(Item::new(id, + comment, + annotations, + relevant_parent_id, + ItemKind::Type(item)), + declaration, + location); Ok(id) } Err(ParseError::Continue) => Err(ParseError::Continue), @@ -949,7 +962,7 @@ impl ClangItemParser for Item { // logic with ir::context, so we should refactor that. if valid_decl { let (popped_decl, _) = - context.currently_parsed_types.pop().unwrap(); + ctx.currently_parsed_types.pop().unwrap(); assert_eq!(popped_decl, declaration_to_look_for); } @@ -959,7 +972,7 @@ impl ClangItemParser for Item { ty, Some(*cur), parent_id, - context); + ctx); match result { Ok(..) => CXChildVisit_Break, Err(ParseError::Recurse) => CXChildVisit_Recurse, @@ -968,7 +981,7 @@ impl ClangItemParser for Item { }); if valid_decl { - context.currently_parsed_types + ctx.currently_parsed_types .push((declaration_to_look_for, id)); } } @@ -982,10 +995,11 @@ impl ClangItemParser for Item { // It's harmless, but if we restrict that, then // tests/headers/nsStyleAutoArray.hpp crashes. if let Err(ParseError::Recurse) = result { - Ok(Self::named_type_with_id(id, ty.spelling(), + Ok(Self::named_type_with_id(id, + ty.spelling(), None, - parent_id.unwrap_or(context.current_module()), - context)) + relevant_parent_id, + ctx)) } else { result } @@ -993,8 +1007,7 @@ impl ClangItemParser for Item { }; if valid_decl { - let (popped_decl, _) = - context.currently_parsed_types.pop().unwrap(); + let (popped_decl, _) = ctx.currently_parsed_types.pop().unwrap(); assert_eq!(popped_decl, declaration_to_look_for); } @@ -1012,7 +1025,7 @@ impl ClangItemParser for Item { name: S, default: Option, parent_id: ItemId, - context: &mut BindgenContext) + ctx: &mut BindgenContext) -> ItemId where S: Into, { @@ -1020,13 +1033,13 @@ impl ClangItemParser for Item { // and tests/headers/variadic_tname.hpp let name = name.into().replace("const ", "").replace(".", ""); - context.add_item(Item::new(id, - None, - None, - parent_id, - ItemKind::Type(Type::named(name, default))), - None, - None); + ctx.add_item(Item::new(id, + None, + None, + parent_id, + ItemKind::Type(Type::named(name, default))), + None, + None); id } @@ -1034,15 +1047,11 @@ impl ClangItemParser for Item { fn named_type(name: S, default: Option, parent_id: ItemId, - context: &mut BindgenContext) + ctx: &mut BindgenContext) -> ItemId where S: Into, { - Self::named_type_with_id(ItemId::next(), - name, - default, - parent_id, - context) + Self::named_type_with_id(ItemId::next(), name, default, parent_id, ctx) } } diff --git a/src/ir/ty.rs b/src/ir/ty.rs index bab500246b..4d26cdff49 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -460,7 +460,7 @@ impl Type { TypeKind::Pointer(..) => false, TypeKind::UnresolvedTypeRef(..) => { - unreachable!("Should have been resolved after parsing!") + unreachable!("Should have been resolved after parsing!"); } } } @@ -477,17 +477,26 @@ impl Type { ctx: &mut BindgenContext) -> Result, ParseError> { use clangll::*; - if let Some(ty) = - ctx.builtin_or_resolved_ty(potential_id, parent_id, ty, location) { - debug!("{:?} already resolved: {:?}", ty, location); - return Ok(ParseResult::AlreadyResolved(ty)); + { + let already_resolved = + ctx.builtin_or_resolved_ty(potential_id, + parent_id, + ty, + location); + if let Some(ty) = already_resolved { + debug!("{:?} already resolved: {:?}", ty, location); + return Ok(ParseResult::AlreadyResolved(ty)); + } } let layout = ty.fallible_layout().ok(); let cursor = ty.declaration(); let mut name = cursor.spelling(); - debug!("from_clang_ty: {:?}, ty: {:?}, loc: {:?}", potential_id, ty, location); + debug!("from_clang_ty: {:?}, ty: {:?}, loc: {:?}", + potential_id, + ty, + location); debug!("currently_parsed_types: {:?}", ctx.currently_parsed_types); let canonical_ty = ty.canonical_type(); @@ -502,19 +511,17 @@ impl Type { ctx); } CXType_Unexposed | CXType_Invalid => { - // For some reason Clang doesn't give us any hint - // in some situations where we should generate a - // function pointer (see - // tests/headers/func_ptr_in_struct.h), so we do a - // guess here trying to see if it has a valid return - // type. + // For some reason Clang doesn't give us any hint in some + // situations where we should generate a function pointer (see + // tests/headers/func_ptr_in_struct.h), so we do a guess here + // trying to see if it has a valid return type. if ty.ret_type().is_some() { - let signature = - try!(FunctionSig::from_ty(ty, &location.unwrap_or(cursor), ctx)); + let signature = try!(FunctionSig::from_ty(ty, + &location.unwrap_or(cursor), + ctx)); TypeKind::Function(signature) // Same here, with template specialisations we can safely - // assume - // this is a Comp(..) + // assume this is a Comp(..) } else if ty.template_args().map_or(false, |x| x.len() > 0) { debug!("Template specialization: {:?}", ty); let complex = @@ -543,11 +550,13 @@ impl Type { location.visit(|cur, _| { match cur.kind() { CXCursor_TypeAliasDecl => { - debug_assert!(cur.cur_type().kind() == CXType_Typedef); - inner = Item::from_ty(&cur.cur_type(), - Some(*cur), - Some(potential_id), - ctx); + debug_assert!(cur.cur_type().kind() == + CXType_Typedef); + inner = + Item::from_ty(&cur.cur_type(), + Some(*cur), + Some(potential_id), + ctx); } CXCursor_TemplateTypeParameter => { // See the comment in src/ir/comp.rs @@ -560,11 +569,13 @@ impl Type { Item::from_ty(&cur.cur_type(), Some(*cur), Some(potential_id), - ctx).ok(); + ctx) + .ok(); let param = Item::named_type(cur.spelling(), default_type, - potential_id, ctx); + potential_id, + ctx); args.push(param); } _ => {} @@ -573,7 +584,8 @@ impl Type { }); if inner.is_err() { - error!("Failed to parse templated type alias {:?}", location); + error!("Failed to parse templated alias {:?}", + location); return Err(ParseError::Continue); } @@ -592,24 +604,37 @@ impl Type { } CXCursor_TemplateRef => { let referenced = location.referenced(); + let referenced_ty = referenced.cur_type(); + let referenced_declaration = + Some(referenced_ty.declaration()); + return Self::from_clang_ty(potential_id, - &referenced.cur_type(), - Some(referenced.cur_type().declaration()), + &referenced_ty, + referenced_declaration, parent_id, ctx); } CXCursor_TypeRef => { let referenced = location.referenced(); - return Ok(ParseResult::AlreadyResolved( - Item::from_ty_or_ref_with_id(potential_id, - referenced.cur_type(), - Some(referenced.cur_type().declaration()), - parent_id, - ctx))); + let referenced_ty = referenced.cur_type(); + let referenced_declaration = + Some(referenced_ty.declaration()); + + let item = + Item::from_ty_or_ref_with_id( + potential_id, + referenced_ty, + referenced_declaration, + parent_id, + ctx); + return Ok(ParseResult::AlreadyResolved(item)); } _ => { if ty.kind() == CXType_Unexposed { - warn!("Unexposed type {:?}, recursing inside, loc: {:?}", ty, location); + warn!("Unexposed type {:?}, recursing inside, \ + loc: {:?}", + ty, + location); return Err(ParseError::Recurse); } @@ -643,16 +668,12 @@ impl Type { return Err(ParseError::Continue); } } - // NOTE: We don't resolve pointers eagerly because the - // pointee type - // might not have been parsed, and if it contains templates - // or - // something else we might get confused, see the comment - // inside + // NOTE: We don't resolve pointers eagerly because the pointee type + // might not have been parsed, and if it contains templates or + // something else we might get confused, see the comment inside // TypeRef. // - // We might need to, though, if the context is already in - // the + // We might need to, though, if the context is already in the // process of resolving them. CXType_MemberPointer | CXType_Pointer => { @@ -663,8 +684,7 @@ impl Type { TypeKind::Pointer(inner) } CXType_BlockPointer => TypeKind::BlockPointer, - // XXX: RValueReference is most likely wrong, but I don't - // think we + // XXX: RValueReference is most likely wrong, but I don't think we // can even add bindings for that, so huh. CXType_RValueReference | CXType_LValueReference => { @@ -678,19 +698,18 @@ impl Type { CXType_VariableArray | CXType_DependentSizedArray | CXType_IncompleteArray => { - let inner = - Item::from_ty(ty.elem_type() - .as_ref() - .expect("Not an appropriate type?"), - location, - parent_id, - ctx) - .expect("Not able to resolve array element?"); + let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), + location, + parent_id, + ctx) + .expect("Not able to resolve array element?"); TypeKind::Pointer(inner) } CXType_FunctionNoProto | CXType_FunctionProto => { - let signature = try!(FunctionSig::from_ty(ty, &location.unwrap_or(cursor), ctx)); + let signature = try!(FunctionSig::from_ty(ty, + &location.unwrap_or(cursor), + ctx)); TypeKind::Function(signature) } CXType_Typedef => { @@ -709,37 +728,29 @@ impl Type { .expect("Not a complex type?"); TypeKind::Comp(complex) } - // FIXME: We stub vectors as arrays since in 99% of the - // cases the - // layout is going to be correct, and there's no way we can - // generate + // FIXME: We stub vectors as arrays since in 99% of the cases the + // layout is going to be correct, and there's no way we can generate // vector types properly in Rust for now. // // That being said, that should be fixed eventually. CXType_Vector | CXType_ConstantArray => { - let inner = - Item::from_ty(ty.elem_type() - .as_ref() - .expect("Not an appropriate type?"), - location, - parent_id, - ctx) - .expect("Not able to resolve array element?"); + let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), + location, + parent_id, + ctx) + .expect("Not able to resolve array element?"); TypeKind::Array(inner, ty.num_elements().unwrap()) } // A complex number is always a real and an imaginary part, // so // represent that as a two-item array. CXType_Complex => { - let inner = - Item::from_ty(ty.elem_type() - .as_ref() - .expect("Not an appropriate type?"), - location, - parent_id, - ctx) - .expect("Not able to resolve array element?"); + let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), + location, + parent_id, + ctx) + .expect("Not able to resolve array element?"); TypeKind::Array(inner, 2) } #[cfg(not(feature="llvm_stable"))] diff --git a/src/ir/var.rs b/src/ir/var.rs index 6d9b61e122..216d818577 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -70,14 +70,17 @@ impl Var { impl ClangSubItemParser for Var { fn parse(cursor: clang::Cursor, - context: &mut BindgenContext) + ctx: &mut BindgenContext) -> Result, ParseError> { use clangll::*; match cursor.kind() { CXCursor_MacroDefinition => { - let value = match parse_int_literal_tokens(&cursor, context.translation_unit()) { - None => return Err(ParseError::Continue), + let value = parse_int_literal_tokens(&cursor, + ctx.translation_unit()); + + let value = match value { Some(v) => v, + None => return Err(ParseError::Continue), }; let name = cursor.spelling(); @@ -86,24 +89,20 @@ impl ClangSubItemParser for Var { return Err(ParseError::Continue); } - if context.parsed_macro(&name) { + if ctx.parsed_macro(&name) { warn!("Duplicated macro definition: {}", name); return Err(ParseError::Continue); } - context.note_parsed_macro(name.clone()); + ctx.note_parsed_macro(name.clone()); let ty = if value < 0 { - Item::builtin_type(TypeKind::Int(IntKind::Int), - true, - context) + Item::builtin_type(TypeKind::Int(IntKind::Int), true, ctx) } else if value.abs() > u32::max_value() as i64 { Item::builtin_type(TypeKind::Int(IntKind::ULongLong), true, - context) + ctx) } else { - Item::builtin_type(TypeKind::Int(IntKind::UInt), - true, - context) + Item::builtin_type(TypeKind::Int(IntKind::UInt), true, ctx) }; Ok(ParseResult::New(Var::new(name, @@ -125,20 +124,19 @@ impl ClangSubItemParser for Var { // XXX this is redundant, remove! let is_const = ty.is_const(); - let ty = Item::from_ty(&ty, Some(cursor), None, context) + let ty = Item::from_ty(&ty, Some(cursor), None, ctx) .expect("Unable to resolve constant type?"); // Note: Ty might not be totally resolved yet, see // tests/headers/inner_const.hpp // // That's fine because in that case we know it's not a literal. - let value = context.safe_resolve_type(ty) - .and_then(|t| t.safe_canonical_type(context)).and_then(|t| { - if t.is_integer() { - get_integer_literal_from_cursor(&cursor, context.translation_unit()) - } else { - None - } + let value = ctx.safe_resolve_type(ty) + .and_then(|t| t.safe_canonical_type(ctx)) + .and_then(|t| if t.is_integer() { Some(t) } else { None }) + .and_then(|_| { + get_integer_literal_from_cursor(&cursor, + ctx.translation_unit()) }); let mangling = cursor_mangling(&cursor); From 011044fd7c22e25743f9cebdf0aaa32ccbdec987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 1 Nov 2016 14:55:08 +0100 Subject: [PATCH 0009/2291] Get rid of `String_`, use Into for CXString. --- src/clang.rs | 105 ++++++++++++--------------------------------------- 1 file changed, 25 insertions(+), 80 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index e1bb105921..d69c8b14b5 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -45,10 +45,7 @@ impl Cursor { /// /// The USR can be used to compare entities across translation units. pub fn usr(&self) -> Option { - let s = String_ { - x: unsafe { clang_getCursorUSR(self.x) }, - } - .to_string(); + let s: String = unsafe { clang_getCursorUSR(self.x) }.into(); if s.is_empty() { None } else { Some(s) } } @@ -66,12 +63,7 @@ impl Cursor { /// Get this cursor's referent's spelling. pub fn spelling(&self) -> String { - unsafe { - String_ { - x: clang_getCursorSpelling(self.x), - } - .to_string() - } + unsafe { clang_getCursorSpelling(self.x).into() } } /// Get this cursor's referent's display name. @@ -79,22 +71,12 @@ impl Cursor { /// This is not necessarily a valid identifier. It includes extra /// information, such as parameters for a function, etc. pub fn display_name(&self) -> String { - unsafe { - String_ { - x: clang_getCursorDisplayName(self.x), - } - .to_string() - } + unsafe { clang_getCursorDisplayName(self.x).into() } } /// Get the mangled name of this cursor's referent. pub fn mangling(&self) -> String { - unsafe { - String_ { - x: clang_Cursor_getMangling(self.x), - } - .to_string() - } + unsafe { clang_Cursor_getMangling(self.x).into() } } /// Get the `Cursor` for this cursor's referent's lexical parent. @@ -246,12 +228,8 @@ impl Cursor { /// Get the raw declaration comment for this referent, if one exists. pub fn raw_comment(&self) -> Option { - let s = unsafe { - String_ { - x: clang_Cursor_getRawCommentText(self.x), - } - .to_string() - }; + let s: String = + unsafe { clang_Cursor_getRawCommentText(self.x).into() }; if s.is_empty() { None } else { Some(s) } } @@ -604,12 +582,7 @@ impl Type { /// Get a raw display name for this type. pub fn spelling(&self) -> String { - unsafe { - String_ { - x: clang_getTypeSpelling(self.x), - } - .to_string() - } + unsafe { clang_getTypeSpelling(self.x).into() } } /// Is this type const qualified? @@ -872,12 +845,7 @@ impl Comment { /// Given that this comment is the start or end of an HTML tag, get its tag /// name. pub fn get_tag_name(&self) -> String { - unsafe { - String_ { - x: clang_HTMLTagComment_getTagName(self.x), - } - .to_string() - } + unsafe { clang_HTMLTagComment_getTagName(self.x).into() } } /// Given that this comment is an HTML start tag, get its attributes. @@ -934,18 +902,12 @@ impl Iterator for CommentAttributesIterator { let idx = self.index; self.index += 1; Some(CommentAttribute { - name: String_ { - x: unsafe { - clang_HTMLStartTag_getAttrName(self.x, idx) - }, - } - .to_string(), - value: String_ { - x: unsafe { - clang_HTMLStartTag_getAttrValue(self.x, idx) - }, - } - .to_string(), + name: unsafe { + clang_HTMLStartTag_getAttrName(self.x, idx).into() + }, + value: unsafe { + clang_HTMLStartTag_getAttrValue(self.x, idx).into() + }, }) } else { None @@ -964,29 +926,18 @@ impl File { if self.x.is_null() { return None; } - unsafe { - Some(String_ { - x: clang_getFileName(self.x), - } - .to_string()) - } + unsafe { Some(clang_getFileName(self.x).into()) } } } -/// A Clang string. -pub struct String_ { - x: CXString, -} - -impl fmt::Display for String_ { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - if self.x.data.is_null() { - return "".fmt(f); +impl Into for CXString { + fn into(self) -> String { + if self.data.is_null() { + return "".to_owned(); } unsafe { - let c_str = clang_getCString(self.x) as *const c_char; - let p = c_str as *const _; - f.write_str(&String::from_utf8_lossy(CStr::from_ptr(p).to_bytes())) + let c_str = CStr::from_ptr(clang_getCString(self) as *const _); + c_str.to_string_lossy().into_owned() } } } @@ -1139,10 +1090,9 @@ impl TranslationUnit { num_tokens as usize); for &token in token_array.iter() { let kind = clang_getTokenKind(token); - let spelling = String_ { - x: clang_getTokenSpelling(self.x, token), - } - .to_string(); + let spelling: String = clang_getTokenSpelling(self.x, token) + .into(); + tokens.push(Token { kind: kind, spelling: spelling, @@ -1177,12 +1127,7 @@ impl Diagnostic { /// Format this diagnostic message as a string, using the given option bit /// flags. pub fn format(&self, opts: usize) -> String { - unsafe { - String_ { - x: clang_formatDiagnostic(self.x, opts as c_uint), - } - .to_string() - } + unsafe { clang_formatDiagnostic(self.x, opts as c_uint).into() } } /// What is the severity of this diagnostic message? From 7e6a0ab7586f66ff421ddb46fa381b59c34742ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 1 Nov 2016 15:07:28 +0100 Subject: [PATCH 0010/2291] Add a section about automatic code formatting in CONTRIBUTING.md --- CONTRIBUTING.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 001ad0e2be..c7e5198c9f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,6 +12,7 @@ yourself. * [Running All Tests](#tests-all) * [Running a Single, Specific Test](#tests-one) * [Authoring New Tests](#tests-new) +* [Automatic Code Formatting](#formatting) * [Debug Logging](#logs) ## Code of Conduct @@ -95,6 +96,27 @@ specify the required features at the top of the test header in a similar manner: // bingden-features: llvm_stable ``` +## Automatic code formatting + +There's a `rustfmt.toml` file in the repo. Ideally changes should be consistent +with the style, though that's not enforced right now. + +[`rustfmt`](https://github.com/rust-lang-nursery/rustfmt) can catch and fix +automatically all the coding style issues it finds. In order to use it it +suffices to do: + +``` +$ cargo fmt +``` + +For it to work, you need to have `rustfmt` installed. To do so: + +``` +$ cargo install rustfmt +``` + +And ensure `~/.cargo/bin` is on your path. + ## Debug Logging To help debug what `bindgen` is doing, you can define the environment variable From a22b762111c99f40c643d8634dec67a7f33568ed Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 31 Oct 2016 17:21:30 -0700 Subject: [PATCH 0011/2291] Always run tests with RUST_BACKTRACE=1 --- tests/tools/run-bindgen.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/tools/run-bindgen.py b/tests/tools/run-bindgen.py index 258a60e5c3..bc8b567b99 100755 --- a/tests/tools/run-bindgen.py +++ b/tests/tools/run-bindgen.py @@ -69,6 +69,7 @@ def parse_args(): def make_bindgen_env(): """Build the environment to run bindgen in.""" env = os.environ.copy() + env["RUST_BACKTRACE"] = "1" # El Capitan likes to unset dyld variables # https://forums.developer.apple.com/thread/9233 From fcc7b57bf498ea66f030fda54bc6012fc228aa59 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 31 Oct 2016 16:23:32 -0700 Subject: [PATCH 0012/2291] Add a method for iterating over whitelisted items This commit adds the `BindgenContext::whitelisted_items` method and `WhitelistedItemsIter` iterator. Together, they can be used to iterate over whielisted items' transitive closure. --- src/ir/context.rs | 116 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/src/ir/context.rs b/src/ir/context.rs index 273dc3e319..7e824be13d 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -12,6 +12,7 @@ use super::item::{Item, ItemCanonicalName, ItemId}; use super::item_kind::ItemKind; use super::module::Module; use super::ty::{FloatKind, Type, TypeKind}; +use super::type_collector::{ItemSet, TypeCollector}; use syntax::ast::Ident; use syntax::codemap::{DUMMY_SP, Span}; use syntax::ext::base::ExtCtxt; @@ -814,4 +815,119 @@ impl<'ctx> BindgenContext<'ctx> { self.current_module = previous_id; } + + /// Iterate over all (explicitly or transitively) whitelisted items. + /// + /// If no items are explicitly whitelisted, then all items are considered + /// whitelisted. + pub fn whitelisted_items<'me>(&'me self) + -> WhitelistedItemsIter<'me, 'ctx> { + assert!(self.in_codegen_phase()); + assert!(self.current_module == self.root_module); + + let roots = self.items() + .filter(|&(_, item)| { + // If nothing is explicitly whitelisted, then everything is fair + // game. + if self.options().whitelisted_types.is_empty() && + self.options().whitelisted_functions.is_empty() && + self.options().whitelisted_vars.is_empty() { + return true; + } + + let name = item.canonical_name(self); + match *item.kind() { + ItemKind::Module(..) => false, + ItemKind::Function(_) => { + self.options().whitelisted_functions.matches(&name) + } + ItemKind::Var(_) => { + self.options().whitelisted_vars.matches(&name) + } + ItemKind::Type(ref ty) => { + if self.options().whitelisted_types.matches(&name) { + return true; + } + + // Unnamed top-level enums are special and we whitelist + // them via the `whitelisted_vars` filter, since they're + // effectively top-level constants, and there's no way + // for them to be referenced consistently. + if let TypeKind::Enum(ref enum_) = *ty.kind() { + if ty.name().is_none() && + enum_.variants().iter().any(|variant| { + self.options() + .whitelisted_vars + .matches(&variant.name()) + }) { + return true; + } + } + + false + } + } + }) + .map(|(&id, _)| id); + + let seen: ItemSet = roots.collect(); + + // The .rev() preserves the expected ordering traversal, resulting in + // more stable-ish bindgen-generated names for anonymous types (like + // unions). + let to_iterate = seen.iter().cloned().rev().collect(); + + WhitelistedItemsIter { + ctx: self, + seen: seen, + to_iterate: to_iterate, + } + } +} + +/// An iterator over whitelisted items. +/// +/// See `BindgenContext::whitelisted_items` for more information. +pub struct WhitelistedItemsIter<'ctx, 'gen> + where 'gen: 'ctx, +{ + ctx: &'ctx BindgenContext<'gen>, + + // The set of whitelisted items we have seen. If you think of traversing + // whitelisted items like GC tracing, this is the mark bits, and contains + // both black and gray items. + seen: ItemSet, + + // The set of whitelisted items that we have seen but have yet to iterate + // over and collect transitive references from. To return to the GC analogy, + // this is the mark stack, containing the set of gray items which we have + // not finished tracing yet. + to_iterate: Vec, +} + +impl<'ctx, 'gen> Iterator for WhitelistedItemsIter<'ctx, 'gen> + where 'gen: 'ctx, +{ + type Item = ItemId; + + fn next(&mut self) -> Option { + let id = match self.to_iterate.pop() { + None => return None, + Some(id) => id, + }; + + debug_assert!(self.seen.contains(&id)); + + let mut sub_types = ItemSet::new(); + id.collect_types(self.ctx, &mut sub_types, &()); + + for id in sub_types { + if !self.seen.contains(&id) { + self.to_iterate.push(id); + self.seen.insert(id); + } + } + + Some(id) + } } From 5691cab0362a9aff6395291ae6eb1e9feccf3c35 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 1 Nov 2016 09:26:23 -0700 Subject: [PATCH 0013/2291] Use `BindgenContext::whitelisted_items` in code generation This replaces the manual gathering and traversal of the transitive closure of whitelisted items with the new canonical method. --- src/codegen/mod.rs | 126 +++++++------------------ tests/expectations/type_alias_empty.rs | 2 +- 2 files changed, 34 insertions(+), 94 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 5717390401..e7fa62eeab 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -14,7 +14,7 @@ use ir::item_kind::ItemKind; use ir::layout::Layout; use ir::module::Module; use ir::ty::{Type, TypeKind}; -use ir::type_collector::{ItemSet, TypeCollector}; +use ir::type_collector::ItemSet; use ir::var::Var; use self::helpers::{BlobTyBuilder, attributes}; @@ -1692,108 +1692,48 @@ impl CodeGenerator for Function { } } +// Return true if any of the ancestors of `id` are in the whitelisted items set, +// false otherwise. +fn ancestor_is_whitelisted(ctx: &BindgenContext, + whitelisted_items: &ItemSet, + id: ItemId) + -> bool { + let item = ctx.resolve_item(id); + let mut last = id; + let mut current = item.parent_id(); + + while last != current { + if whitelisted_items.contains(¤t) { + return true; + } + last = current; + current = ctx.resolve_item(current).parent_id(); + } + + false +} + pub fn codegen(context: &mut BindgenContext) -> Vec> { context.gen(|context| { let mut result = CodegenResult::new(); debug!("codegen: {:?}", context.options()); - // If the whitelisted types and functions sets are empty, just generate - // everything. - if context.options().whitelisted_types.is_empty() && - context.options().whitelisted_functions.is_empty() && - context.options().whitelisted_vars.is_empty() { - for (_item_id, item) in context.items() { - // Non-toplevel item parents are the responsible one for - // generating them. - if item.is_toplevel(context) { - item.codegen(context, &mut result, &()); - } - } - } else { - // Recursively collect all the types dependent on the whitelisted - // types, then generate them. - // - // FIXME(emilio): This pass is probably slow, but it can't be faster - // than docopt anyway :) - let mut items = ItemSet::new(); - for (_item_id, item) in context.items() { - // FIXME(emilio): This probably should look only at whether the - // parent is a module. - if !item.is_toplevel(context) { - continue; - } - - let name = item.canonical_name(context); - match *item.kind() { - ItemKind::Type(ref ty) => { - if context.options().whitelisted_types.matches(&name) { - item.collect_types(context, &mut items, &()); - } - // Unnamed top-level enums are special and we whitelist - // them via the whitelisted_vars filter, since they're - // effectively top-level constants, and there's no way - // for them to be referenced consistently. - if let TypeKind::Enum(ref enum_) = *ty.kind() { - if ty.name().is_none() { - if enum_.variants().iter().any(|variant| { - context.options() - .whitelisted_vars - .matches(&variant.name()) - }) { - item.collect_types(context, - &mut items, - &()); - } - } - } - } - ItemKind::Function(ref fun) => { - if context.options() - .whitelisted_functions - .matches(&name) { - items.insert(item.id()); - fun.signature() - .collect_types(context, &mut items, &()); - } - } - ItemKind::Var(ref var) => { - if context.options().whitelisted_vars.matches(&name) { - items.insert(item.id()); - var.ty().collect_types(context, &mut items, &()); - } - } - ItemKind::Module(..) => {} - } - } - - fn contains_parent(ctx: &BindgenContext, - types: &ItemSet, - id: ItemId) - -> bool { - let item = ctx.resolve_item(id); - let mut last = id; - let mut current = item.parent_id(); - - while last != current { - if types.contains(¤t) { - return true; - } - last = current; - current = ctx.resolve_item(current).parent_id(); - } + let whitelisted_items: ItemSet = context.whitelisted_items().collect(); - false - } + for &id in whitelisted_items.iter() { + let item = context.resolve_item(id); - for item_id in items.iter() { - let item = context.resolve_item(*item_id); - if item.is_toplevel(context) || - !contains_parent(context, &items, *item_id) { - item.codegen(context, &mut result, &()); - } + // Non-toplevel items' parents are responsible one for generating + // their children. However, if we find an orphaned reference to a + // non-toplevel item whose parent is not in our whitelisted set, we + // need to take responsibility for generating it. + if item.is_toplevel(context) || + !ancestor_is_whitelisted(context, &whitelisted_items, id) { + item.codegen(context, &mut result, &()); } } + let saw_union = result.saw_union; let mut result = result.items; if saw_union && !context.options().unstable_rust { diff --git a/tests/expectations/type_alias_empty.rs b/tests/expectations/type_alias_empty.rs index b4b7b2bcee..47e36006e4 100644 --- a/tests/expectations/type_alias_empty.rs +++ b/tests/expectations/type_alias_empty.rs @@ -4,4 +4,4 @@ #![allow(non_snake_case)] - +pub type bool_constant = (); From 68f497c962a5c9468f78eed0a78d10b5bb1c3354 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 1 Nov 2016 11:25:15 -0700 Subject: [PATCH 0014/2291] Avoid an extra lookup when finding new whitelisted items to traverse --- src/ir/context.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ir/context.rs b/src/ir/context.rs index 7e824be13d..6c56eefe69 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -922,9 +922,8 @@ impl<'ctx, 'gen> Iterator for WhitelistedItemsIter<'ctx, 'gen> id.collect_types(self.ctx, &mut sub_types, &()); for id in sub_types { - if !self.seen.contains(&id) { + if self.seen.insert(id) { self.to_iterate.push(id); - self.seen.insert(id); } } From 3a6d82529afdbd90654ee12e458799dc1cd6d378 Mon Sep 17 00:00:00 2001 From: oldmanmike Date: Tue, 1 Nov 2016 17:10:55 -0500 Subject: [PATCH 0015/2291] Add logging of Clang version --- src/bin/bindgen.rs | 12 +++++++++++- src/clang.rs | 6 ++++++ src/lib.rs | 12 ++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index 2a7995e799..c66a374481 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -8,7 +8,7 @@ extern crate log; extern crate clang_sys; extern crate rustc_serialize; -use bindgen::{BindgenOptions, Bindings, LinkType}; +use bindgen::{BindgenOptions, Bindings, LinkType, clang_version}; use std::default::Default; use std::env; use std::fs; @@ -217,6 +217,16 @@ pub fn main() { let mut bind_args: Vec<_> = env::args().collect(); + let clang_version = clang_version(); + + if cfg!(feature = "llvm_stable") { + assert_eq!(clang_version, "3.8.0"); + } else { + assert_eq!(clang_version, "3.9.0"); + } + + debug!("Using Clang Version: {}", clang_version); + if let Some(clang) = clang_sys::support::Clang::find(None) { let has_clang_args = bind_args.iter().rposition(|arg| *arg == "--").is_some(); diff --git a/src/clang.rs b/src/clang.rs index d69c8b14b5..a8e4fdf2ac 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -1426,3 +1426,9 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> Enum_CXVisitorResult { print_indent(depth, ")"); CXChildVisit_Continue } + +pub fn extract_clang_version() -> Option { + let s: String = + unsafe { clang_getClangVersion().into() }; + if s.is_empty() { None } else { Some(s) } +} diff --git a/src/lib.rs b/src/lib.rs index 1592c275df..5124c41742 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -448,3 +448,15 @@ fn parse(context: &mut BindgenContext) { assert!(context.current_module() == context.root_module(), "How did this happen?"); } + +/// Get the version number (e.g. 3.9.0) of Clang in String form +pub fn clang_version() -> String { + clang::extract_clang_version() + .expect("Could not retrieve Clang version!") + .split(' ') + .nth(2) + .expect("Could not parse Clang version!") + .to_string() +} + + From 6d7d5dbd5da687cae29e525dcf2744eba85ab64d Mon Sep 17 00:00:00 2001 From: oldmanmike Date: Tue, 1 Nov 2016 23:31:42 -0500 Subject: [PATCH 0016/2291] Fix version logging and add ClangVersion struct --- src/bin/bindgen.rs | 31 +++++++++++++++++++++---------- src/clang.rs | 1 + src/lib.rs | 35 +++++++++++++++++++++++++++-------- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index c66a374481..4c884448ba 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -8,7 +8,7 @@ extern crate log; extern crate clang_sys; extern crate rustc_serialize; -use bindgen::{BindgenOptions, Bindings, LinkType, clang_version}; +use bindgen::{BindgenOptions, Bindings, LinkType, ClangVersion, clang_version}; use std::default::Default; use std::env; use std::fs; @@ -217,15 +217,26 @@ pub fn main() { let mut bind_args: Vec<_> = env::args().collect(); - let clang_version = clang_version(); - - if cfg!(feature = "llvm_stable") { - assert_eq!(clang_version, "3.8.0"); - } else { - assert_eq!(clang_version, "3.9.0"); - } - - debug!("Using Clang Version: {}", clang_version); + match clang_version() { + None => { + error!("Could not retrieve Clang version...") + }, + Some(v) => { + if cfg!(feature = "llvm_stable") { + if (v.major,v.minor) != (3,8) { + error!("Got Clang {}.{}, expected 3.8", v.major, v.minor) + } else { + info!("Using: {}", v.full) + } + } else { + if (v.major, v.minor) != (3,9) { + error!("Got Clang {}.{}, expected 3.9", v.major, v.minor) + } else { + info!("Using: {}", v.full) + } + } + } + }; if let Some(clang) = clang_sys::support::Clang::find(None) { let has_clang_args = diff --git a/src/clang.rs b/src/clang.rs index a8e4fdf2ac..437c3f1586 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -1427,6 +1427,7 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> Enum_CXVisitorResult { CXChildVisit_Continue } +/// Try to extract the clang version to a string pub fn extract_clang_version() -> Option { let s: String = unsafe { clang_getClangVersion().into() }; diff --git a/src/lib.rs b/src/lib.rs index 5124c41742..c3e9203b24 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -449,14 +449,33 @@ fn parse(context: &mut BindgenContext) { "How did this happen?"); } -/// Get the version number (e.g. 3.9.0) of Clang in String form -pub fn clang_version() -> String { - clang::extract_clang_version() - .expect("Could not retrieve Clang version!") - .split(' ') - .nth(2) - .expect("Could not parse Clang version!") - .to_string() +/// Extracted Clang version data +#[derive(Debug)] +pub struct ClangVersion { + /// major semvar + pub major: u32, + /// minor semvar + pub minor: u32, + /// full version string + pub full: String, +} + +/// Get the major and the minor semvar numbers of Clang's version +pub fn clang_version() -> Option { + let raw_v: String = match clang::extract_clang_version() { + None => return None, + Some(v) => v, + }; + let split_v: Vec<&str> = match raw_v.split_whitespace().nth(2) { + None => return None, + Some(v) => v.split_terminator('.').collect(), + }; + let maybe_major = split_v[0].parse::(); + let maybe_minor = split_v[1].parse::(); + match (maybe_major,maybe_minor) { + (Ok(major),Ok(minor)) => Some(ClangVersion { major: major, minor: minor, full: raw_v.clone() }), + _ => None, + } } From e5dd02c7375771a5072543817d853835022197d1 Mon Sep 17 00:00:00 2001 From: Romain Loisel Date: Wed, 2 Nov 2016 12:38:48 +0000 Subject: [PATCH 0017/2291] Fix #140 clang::Type::arg_types should return Option> --- src/clang.rs | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index d69c8b14b5..bc3d511f27 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -704,21 +704,6 @@ impl Type { unsafe { clang_isFunctionTypeVariadic(self.x) != 0 } } - /// Given that this type is a function type, get the types of its - /// parameters. - pub fn arg_types(&self) -> Vec { - unsafe { - let num = clang_getNumArgTypes(self.x) as usize; - let mut args = vec![]; - for i in 0..num { - args.push(Type { - x: clang_getArgType(self.x, i as c_uint), - }); - } - args - } - } - /// Given that this type is a function type, get the type of its return /// value. pub fn ret_type(&self) -> Option { From 5f92d86a3c88c47817e061bb2870e917757a738c Mon Sep 17 00:00:00 2001 From: Ethan Glasser-Camp Date: Wed, 2 Nov 2016 12:41:35 -0400 Subject: [PATCH 0018/2291] Make clang::Cursor::specialized return an Option Fixes #122. --- src/clang.rs | 12 ++++++++---- src/ir/comp.rs | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index d69c8b14b5..bbe0648d0f 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -187,7 +187,7 @@ impl Cursor { /// Is the referent a template specialization? pub fn is_template(&self) -> bool { - self.specialized().is_valid() + self.specialized().map_or(false, |c| c.is_valid()) } /// Is the referent a fully specialized template specialization without any @@ -287,11 +287,15 @@ impl Cursor { /// Given that this cursor points to a template specialization, get a cursor /// pointing to the template definition that is being specialized. - pub fn specialized(&self) -> Cursor { + pub fn specialized(&self) -> Option { + if !self.is_valid() { + return None; + } + unsafe { - Cursor { + Some(Cursor { x: clang_getSpecializedCursorTemplate(self.x), - } + }) } } diff --git a/src/ir/comp.rs b/src/ir/comp.rs index d55c24ca16..91be2ecac5 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -512,7 +512,8 @@ impl CompInfo { } }; - ci.ref_template = Item::parse(cursor.specialized(), None, ctx).ok(); + ci.ref_template = cursor.specialized() + .and_then(|c| Item::parse(c, None, ctx).ok()); let mut maybe_anonymous_struct_field = None; cursor.visit(|cur, _other| { From 08a34a1eb5b8b21981cde35af1897cc9269e5a8e Mon Sep 17 00:00:00 2001 From: Ethan Glasser-Camp Date: Wed, 2 Nov 2016 13:05:22 -0400 Subject: [PATCH 0019/2291] Check resulting Cursor instead of the existing one Thanks @fitzgen for the correction. This also allows us to simplify the is_template method. Thanks @emilio for the suggestion. --- src/clang.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index bbe0648d0f..3f23cbb606 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -187,7 +187,7 @@ impl Cursor { /// Is the referent a template specialization? pub fn is_template(&self) -> bool { - self.specialized().map_or(false, |c| c.is_valid()) + self.specialized().is_some() } /// Is the referent a fully specialized template specialization without any @@ -288,14 +288,15 @@ impl Cursor { /// Given that this cursor points to a template specialization, get a cursor /// pointing to the template definition that is being specialized. pub fn specialized(&self) -> Option { - if !self.is_valid() { - return None; - } - unsafe { - Some(Cursor { - x: clang_getSpecializedCursorTemplate(self.x), - }) + let clang_specialized = clang_getSpecializedCursorTemplate(self.x); + if clang_isInvalid(clang_getCursorKind(clang_specialized)) == 0 { + Some(Cursor { + x: clang_specialized, + }) + } else { + None + } } } From 58e70a3aae57f3cef4ede3baab65a9cf8fed0fd2 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 31 Oct 2016 16:29:02 -0700 Subject: [PATCH 0020/2291] Add a method to generate dummy C/C++ uses of whitelisted types for testing A part of #151. --- src/bin/bindgen.rs | 20 ++++++++- src/ir/context.rs | 6 ++- src/ir/item.rs | 54 +++++++++++++++++++++++- src/lib.rs | 65 ++++++++++++++++++++++++----- src/uses.rs | 102 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 231 insertions(+), 16 deletions(-) create mode 100644 src/uses.rs diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index 2a7995e799..17385d85f2 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -84,6 +84,10 @@ Options: matching . Same behavior on emptyness than the type whitelisting. + --dummy-uses= For testing purposes, generate a C/C++ file + containing dummy uses of all types defined in + the input header. + Options other than stated above are passed directly through to clang. "; @@ -182,6 +186,11 @@ fn parse_args_or_exit(args: Vec) -> (BindgenOptions, Box) { "--use-msvc-mangling" => { options.msvc_mangling = true; } + "--dummy-uses" => { + let dummy_path = iter.next() + .expect("--dummy-uses expects a file path"); + options.dummy_uses = Some(dummy_path); + } other if source_file.is_none() => { source_file = Some(other.into()); } @@ -193,6 +202,12 @@ fn parse_args_or_exit(args: Vec) -> (BindgenOptions, Box) { if let Some(source_file) = source_file.take() { options.clang_args.push(source_file); + options.input_header = options.clang_args.last().cloned(); + } else { + options.input_header = options.clang_args + .iter() + .find(|arg| arg.ends_with(".h") || arg.ends_with(".hpp")) + .cloned(); } let out = if let Some(ref path_name) = dest_file { @@ -244,9 +259,12 @@ pub fn main() { let (options, out) = parse_args_or_exit(bind_args); - let bindings = Bindings::generate(options, None) + let mut bindings = Bindings::generate(options, None) .expect("Unable to generate bindings"); + bindings.write_dummy_uses() + .expect("Unable to write dummy uses to file."); + bindings.write(out) .expect("Unable to write bindings to file."); } diff --git a/src/ir/context.rs b/src/ir/context.rs index 6c56eefe69..beccc514fd 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -384,8 +384,10 @@ impl<'ctx> BindgenContext<'ctx> { // because we remove it before the end of this function. self.gen_ctx = Some(unsafe { mem::transmute(&ctx) }); - self.resolve_typerefs(); - self.process_replacements(); + if !self.collected_typerefs() { + self.resolve_typerefs(); + self.process_replacements(); + } let ret = cb(self); self.gen_ctx = None; diff --git a/src/ir/item.rs b/src/ir/item.rs index 4e893e357b..690f42226a 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -38,13 +38,44 @@ pub trait ItemCanonicalName { /// } /// ``` /// -/// For bar, the canonical path is `foo::BAR`, while the canonical name is just -/// `BAR`. +/// For bar, the canonical path is `vec!["foo", "BAR"]`, while the canonical +/// name is just `"BAR"`. pub trait ItemCanonicalPath { /// Get the canonical path for this item. fn canonical_path(&self, ctx: &BindgenContext) -> Vec; } +/// A trait for iterating over an item and its parents and up its ancestor chain +/// up to (but not including) the implicit root module. +pub trait ItemAncestors { + /// Get an iterable over this item's ancestors. + fn ancestors<'a, 'b>(&self, ctx: &'a BindgenContext<'b>) -> ItemAncestorsIter<'a, 'b>; +} + +/// An iterator over an item and its ancestors. +pub struct ItemAncestorsIter<'a, 'b> + where 'b: 'a, +{ + item: ItemId, + ctx: &'a BindgenContext<'b>, +} + +impl<'a, 'b> Iterator for ItemAncestorsIter<'a, 'b> + where 'b: 'a, +{ + type Item = ItemId; + + fn next(&mut self) -> Option { + let item = self.ctx.resolve_item(self.item); + if item.parent_id() == self.item { + None + } else { + self.item = item.parent_id(); + Some(item.id()) + } + } +} + /// A single identifier for an item. /// /// TODO: Build stronger abstractions on top of this, like TypeId(ItemId)? @@ -76,6 +107,25 @@ impl ItemCanonicalPath for ItemId { } } +impl ItemAncestors for ItemId { + fn ancestors<'a, 'b>(&self, + ctx: &'a BindgenContext<'b>) + -> ItemAncestorsIter<'a, 'b> { + ItemAncestorsIter { + item: *self, + ctx: ctx, + } + } +} + +impl ItemAncestors for Item { + fn ancestors<'a, 'b>(&self, + ctx: &'a BindgenContext<'b>) + -> ItemAncestorsIter<'a, 'b> { + self.id().ancestors(ctx) + } +} + impl TypeCollector for ItemId { type Extra = (); diff --git a/src/lib.rs b/src/lib.rs index 1592c275df..1e84024639 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -60,6 +60,7 @@ mod clang; mod ir; mod parse; mod regex_set; +mod uses; #[cfg(rustfmt)] mod codegen; @@ -68,16 +69,17 @@ doc_mod!(clang, clang_docs); doc_mod!(ir, ir_docs); doc_mod!(parse, parse_docs); doc_mod!(regex_set, regex_set_docs); +doc_mod!(uses, uses_docs); mod codegen { include!(concat!(env!("OUT_DIR"), "/codegen.rs")); } - use ir::context::BindgenContext; use ir::item::{Item, ItemId}; use parse::{ClangItemParser, ParseError}; use regex_set::RegexSet; + use std::borrow::Borrow; use std::collections::HashSet; use std::fs::OpenOptions; @@ -118,10 +120,19 @@ pub fn builder() -> Builder { impl Builder { /// Set the input C/C++ header. - pub fn header>(self, header: T) -> Builder { + pub fn header>(mut self, header: T) -> Builder { + let header = header.into(); + self.options.input_header = Some(header.clone()); self.clang_arg(header) } + /// Generate a C/C++ file that includes the header and has dummy uses of + /// every type defined in the header. + pub fn dummy_uses>(mut self, dummy_uses: T) -> Builder { + self.options.dummy_uses = Some(dummy_uses.into()); + self + } + /// Hide the given type from the generated bindings. pub fn hide_type>(mut self, arg: T) -> Builder { self.options.hidden_types.insert(arg.into()); @@ -200,7 +211,7 @@ impl Builder { } /// Generate the Rust bindings using the options built up thus far. - pub fn generate(self) -> Result { + pub fn generate<'ctx>(self) -> Result, ()> { Bindings::generate(self.options, None) } } @@ -274,6 +285,13 @@ pub struct BindgenOptions { /// The set of arguments to pass straight through to Clang. pub clang_args: Vec, + + /// The input header file. + pub input_header: Option, + + /// Generate a dummy C/C++ file that includes the header and has dummy uses + /// of all types defined therein. See the `uses` module for more. + pub dummy_uses: Option, } impl Default for BindgenOptions { @@ -296,6 +314,8 @@ impl Default for BindgenOptions { msvc_mangling: false, raw_lines: vec![], clang_args: vec![], + input_header: None, + dummy_uses: None, } } } @@ -314,20 +334,20 @@ pub enum LinkType { } /// Generated Rust bindings. -#[derive(Debug, Clone)] -pub struct Bindings { +#[derive(Debug)] +pub struct Bindings<'ctx> { + context: BindgenContext<'ctx>, module: ast::Mod, - raw_lines: Vec, } -impl Bindings { +impl<'ctx> Bindings<'ctx> { /// Generate bindings for the given options. /// /// Deprecated - use a `Builder` instead #[deprecated] pub fn generate(options: BindgenOptions, span: Option) - -> Result { + -> Result, ()> { let span = span.unwrap_or(DUMMY_SP); let mut context = BindgenContext::new(options); @@ -339,8 +359,8 @@ impl Bindings { }; Ok(Bindings { + context: context, module: module, - raw_lines: context.options().raw_lines.clone(), }) } @@ -376,11 +396,11 @@ impl Bindings { try!(writer.write("/* automatically generated by rust-bindgen */\n\n" .as_bytes())); - for line in self.raw_lines.iter() { + for line in self.context.options().raw_lines.iter() { try!(writer.write(line.as_bytes())); try!(writer.write("\n".as_bytes())); } - if !self.raw_lines.is_empty() { + if !self.context.options().raw_lines.is_empty() { try!(writer.write("\n".as_bytes())); } @@ -390,6 +410,29 @@ impl Bindings { try!(eof(&mut ps.s)); ps.s.out.flush() } + + /// Generate and write dummy uses of all the types we parsed, if we've been + /// requested to do so in the options. + /// + /// See the `uses` module for more information. + pub fn write_dummy_uses(&mut self) -> io::Result<()> { + let file = + if let Some(ref dummy_path) = self.context.options().dummy_uses { + Some(try!(OpenOptions::new() + .write(true) + .truncate(true) + .create(true) + .open(dummy_path))) + } else { + None + }; + + if let Some(file) = file { + try!(uses::generate_dummy_uses(&mut self.context, file)); + } + + Ok(()) + } } /// Determines whether the given cursor is in any of the files matched by the diff --git a/src/uses.rs b/src/uses.rs new file mode 100644 index 0000000000..47f72da6fb --- /dev/null +++ b/src/uses.rs @@ -0,0 +1,102 @@ +//! Take in our IR and output a C/C++ file with dummy uses of each IR type. +//! +//! Say that we had this C++ header, `header.hpp`: +//! +//! ```c++ +//! class Point { +//! int x; +//! int y; +//! } +//! +//! enum Bar { +//! THIS, +//! THAT, +//! OTHER +//! } +//! ``` +//! +//! If we generated dummy uses for this header, we would get a `.cpp` file like +//! this: +//! +//! ```c++ +//! #include "header.hpp" +//! +//! void dummy(Point*) {} +//! void dummy(Bar*) {} +//! ``` +//! +//! This is useful because we can compile this `.cpp` file into an object file, +//! and then compare its debugging information to the debugging information +//! generated for our Rust bindings. These two sets of debugging information had +//! better agree on the C/C++ types' physical layout, or else our bindings are +//! incorrect! +//! +//! "But you still haven't explained why we have to generate the dummy uses" you +//! complain. Well if the types are never used, then they are elided when the +//! C/C++ compiler generates debugging information. + +use ir::context::BindgenContext; +use ir::item::{Item, ItemAncestors, ItemCanonicalName}; +use std::io; + +// Like `canonical_path`, except we always take namespaces into account, ignore +// the generated names of anonymous items, and return a `String`. +// +// TODO: Would it be easier to try and demangle the USR? +fn namespaced_name(ctx: &BindgenContext, item: &Item) -> String { + let mut names: Vec<_> = item.ancestors(ctx) + .map(|id| ctx.resolve_item(id).canonical_name(ctx)) + .filter(|name| !name.starts_with("_bindgen_")) + .collect(); + names.reverse(); + names.join("::") +} + +/// Generate the dummy uses for all the items in the given context, and write +/// the dummy uses to `dest`. +pub fn generate_dummy_uses(ctx: &mut BindgenContext, + mut dest: W) + -> io::Result<()> + where W: io::Write, +{ + ctx.gen(|ctx| { + let input_header = ctx.options() + .input_header + .as_ref() + .expect("Should not generate dummy uses without an input header"); + + try!(writeln!(dest, "/* automatically generated by rust-bindgen */")); + try!(writeln!(dest, "")); + try!(writeln!(dest, "#include \"{}\"", input_header)); + try!(writeln!(dest, "")); + + let type_items = ctx.whitelisted_items() + .map(|id| ctx.resolve_item(id)) + .filter(|item| { + // We only want type items. + if let Some(ty) = item.kind().as_type() { + // However, we don't want anonymous types, as we can't + // generate dummy uses for them. + ty.name().is_some() && + // Nor do we want builtin types or named template type + // arguments. Again, we can't generate dummy uses for + // these. + !ty.is_builtin_or_named() && + // And finally, we won't be creating any dummy + // specializations, so ignore template declarations and + // partial specializations. + item.applicable_template_args(ctx).is_empty() + } else { + false + } + }) + .map(|item| namespaced_name(ctx, item)) + .enumerate(); + + for (idx, name) in type_items { + try!(writeln!(dest, "void dummy{}({}*) {{ }}", idx, name)); + } + + Ok(()) + }) +} From cd2754c4c75501a6b2f1f0e2a96c70dde39d3433 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 2 Nov 2016 11:21:24 -0700 Subject: [PATCH 0021/2291] Generate dummy uses when running our test suite This extends the test runner to generate dummy C/C++ uses of the whitelisted types in a test header in the tests/uses/ directory. It does not yet compile the dummy uses into an object file whose DWARF debug info can be compared against our Rust bindings' DWARF debug info. Part of #151. --- tests/tests.rs | 80 ++++++++++++++++++++++++-------------- tests/tools/run-bindgen.py | 14 ++++++- tests/uses/.gitignore | 2 + 3 files changed, 65 insertions(+), 31 deletions(-) create mode 100644 tests/uses/.gitignore diff --git a/tests/tests.rs b/tests/tests.rs index addaa5ad7f..4954ac6fa7 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -12,10 +12,13 @@ use std::process; const TEST_BATCH_DEFAULT_SIZE: usize = 16; -fn spawn_run_bindgen(run_bindgen: P, bindgen: Q, header: R) -> process::Child +fn spawn_run_bindgen(run_bindgen: P, + bindgen: Q, + header: R) + -> process::Child where P: AsRef, Q: AsRef, - R: AsRef + R: AsRef, { let run_bindgen = run_bindgen.as_ref(); let bindgen = bindgen.as_ref(); @@ -36,19 +39,34 @@ fn spawn_run_bindgen(run_bindgen: P, bindgen: Q, header: R) -> process: expected.push(file_name); expected.set_extension("rs"); - let mut cmd = process::Command::new(run_bindgen); - cmd.stdout(process::Stdio::piped()) + // And the same style conversion as above, but for the dummy uses. We assume + // that .hpp means we should generate a .cpp uses file, and .h means we + // should generate a .c file. + + let mut dummy_uses = PathBuf::from(header); + let file_name = dummy_uses.file_name() + .expect("Should still have filename") + .to_os_string(); + dummy_uses.pop(); + dummy_uses.pop(); + dummy_uses.push("uses"); + dummy_uses.push(file_name); + dummy_uses.set_extension(if header.extension().and_then(|s| s.to_str()) == + Some("hpp") { + "cpp" + } else { + "c" + }); + + process::Command::new(run_bindgen) + .stdout(process::Stdio::piped()) .stderr(process::Stdio::piped()) .arg(bindgen) .arg(header) - .arg(expected); - - if cfg!(feature = "llvm_stable") { - cmd.arg("--feature") - .arg("llvm_stable"); - } - - cmd.spawn() + .arg(expected) + .arg("--dummy-uses") + .arg(dummy_uses) + .spawn() .expect("Should be able to spawn run-bindgen.py child process") } @@ -84,12 +102,12 @@ fn run_bindgen_tests() { .map(|result| result.expect("Should read directory entry")); let tests = entries.filter(|entry| { - match entry.path().extension().map(|s| s.to_str()) { - Some(Some("h")) | - Some(Some("hpp")) => true, - _ => false, - } - }).collect::>(); + match entry.path().extension().and_then(|s| s.to_str()) { + Some("h") | Some("hpp") => true, + _ => false, + } + }) + .collect::>(); let batch_size = env::var("BINDGEN_TEST_BATCH_SIZE") .ok() @@ -101,22 +119,26 @@ fn run_bindgen_tests() { // consumed when testing, so that we don't overload the system. let children = tests.chunks(batch_size).map(|x| { - x.iter().map(|entry| { - let child = spawn_run_bindgen(run_bindgen.clone(), bindgen.clone(), entry.path()); - (entry.path(), child) - }).collect::>() + x.iter() + .map(|entry| { + let child = spawn_run_bindgen(run_bindgen.clone(), + bindgen.clone(), + entry.path()); + (entry.path(), child) + }) + .collect::>() }); let failures: Vec<_> = children.flat_map(|x| { - x.into_iter().filter_map(|(path, mut child)| { - let passed = child.wait() - .expect("Should wait on child process") - .success(); + x.into_iter().filter_map(|(path, mut child)| { + let passed = child.wait() + .expect("Should wait on child process") + .success(); - if passed { None } else { Some((path, child)) } + if passed { None } else { Some((path, child)) } + }) }) - }) - .collect(); + .collect(); let num_failures = failures.len(); diff --git a/tests/tools/run-bindgen.py b/tests/tools/run-bindgen.py index bc8b567b99..1f5f504e2b 100755 --- a/tests/tools/run-bindgen.py +++ b/tests/tools/run-bindgen.py @@ -41,6 +41,10 @@ def make_parser(): nargs=1, help="Run tests that depend on bindgen being built with \ the given feature.") + parser.add_argument("--dummy-uses", + dest="dummy_uses", + help="The path to generate dummy C/C++ uses of the \ + whitelisted types from the input header at.") return parser def usage_and_exit(*args): @@ -117,9 +121,11 @@ def run_cmd(command, **kwargs): print("run-bindgen.py: running", command) subprocess.check_call(command, **kwargs) -def generate_bindings(bindgen, flags, header, output): +def generate_bindings(bindgen, dummy_uses, flags, header, output): """Generate the rust bindings.""" command = [bindgen, "-o", output] + if dummy_uses: + command.extend(["--dummy-uses", dummy_uses]) command.extend(flags) command.append(header) run_cmd(command, cwd=os.getcwd(), env=make_bindgen_env()) @@ -166,7 +172,11 @@ def main(): test_flags = get_bindgen_flags(args.header) expected_bindings = get_expected_bindings(args.rust_bindings) - generate_bindings(args.bindgen, test_flags, args.header, args.rust_bindings) + generate_bindings(args.bindgen, + args.dummy_uses, + test_flags, + args.header, + args.rust_bindings) test_generated_bindings(args.rust_bindings) check_actual_vs_expected(expected_bindings, args.rust_bindings) sys.exit(0) diff --git a/tests/uses/.gitignore b/tests/uses/.gitignore new file mode 100644 index 0000000000..40d7cb4cc1 --- /dev/null +++ b/tests/uses/.gitignore @@ -0,0 +1,2 @@ +*.c +*.cpp From ef59d9ed1eeb45494a183c6363069ec492969b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 2 Nov 2016 22:54:32 +0100 Subject: [PATCH 0022/2291] clang: Some partially specialized templates return no template argument count. --- src/clang.rs | 5 ++++- tests/expectations/base-to-derived.rs | 19 +++++++++++++++++++ tests/headers/base-to-derived.hpp | 19 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/base-to-derived.rs create mode 100644 tests/headers/base-to-derived.hpp diff --git a/src/clang.rs b/src/clang.rs index bc3d511f27..b58cf01791 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -131,6 +131,9 @@ impl Cursor { /// Return the number of template arguments used by this cursor's referent, /// if the referent is either a template specialization or /// declaration. Returns -1 otherwise. + /// + /// NOTE: This may not return `Some` for some non-fully specialized + /// templates, see #193 and #194. pub fn num_template_args(&self) -> Option { let n: c_int = unsafe { clang_Cursor_getNumTemplateArguments(self.x) }; @@ -193,7 +196,7 @@ impl Cursor { /// Is the referent a fully specialized template specialization without any /// remaining free template arguments? pub fn is_fully_specialized_template(&self) -> bool { - self.is_template() && self.num_template_args().unwrap() > 0 + self.is_template() && self.num_template_args().unwrap_or(0) > 0 } /// Is the referent a template specialization that still has remaining free diff --git a/tests/expectations/base-to-derived.rs b/tests/expectations/base-to-derived.rs new file mode 100644 index 0000000000..c2af2c4380 --- /dev/null +++ b/tests/expectations/base-to-derived.rs @@ -0,0 +1,19 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct false_type { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_false_type() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for false_type { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/base-to-derived.hpp b/tests/headers/base-to-derived.hpp new file mode 100644 index 0000000000..ea31e0f258 --- /dev/null +++ b/tests/headers/base-to-derived.hpp @@ -0,0 +1,19 @@ +// bindgen-flags: -- -std=c++11 + +struct false_type {}; + +template +struct __is_base_to_derived_ref; + +template +struct __is_base_to_derived_ref<_From, _To, true> +{ + typedef _To type; + + static constexpr bool value = type::value; +}; + +template +struct __is_base_to_derived_ref<_From, _To, false> +: public false_type +{ }; From a9d52d1d4764ba9bfc5106d64388ab1380388461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 2 Nov 2016 23:22:27 +0100 Subject: [PATCH 0023/2291] clang: Remove stupid `match` blocks and change them for well-supported functions. --- src/clang.rs | 234 +-------------------------------------------------- 1 file changed, 4 insertions(+), 230 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index bc3d511f27..d6626165ca 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -1156,239 +1156,13 @@ impl UnsavedFile { } /// Convert a cursor kind into a static string. -pub fn kind_to_str(x: Enum_CXCursorKind) -> &'static str { - match x { - CXCursor_UnexposedDecl => "UnexposedDecl", - CXCursor_StructDecl => "StructDecl", - CXCursor_UnionDecl => "UnionDecl", - CXCursor_ClassDecl => "ClassDecl", - CXCursor_EnumDecl => "EnumDecl", - CXCursor_FieldDecl => "FieldDecl", - CXCursor_EnumConstantDecl => "EnumConstantDecl", - CXCursor_FunctionDecl => "FunctionDecl", - CXCursor_VarDecl => "VarDecl", - CXCursor_ParmDecl => "ParmDecl", - CXCursor_ObjCInterfaceDecl => "ObjCInterfaceDecl", - CXCursor_ObjCCategoryDecl => "ObjCCategoryDecl", - CXCursor_ObjCProtocolDecl => "ObjCProtocolDecl", - CXCursor_ObjCPropertyDecl => "ObjCPropertyDecl", - CXCursor_ObjCIvarDecl => "ObjCIvarDecl", - CXCursor_ObjCInstanceMethodDecl => "ObjCInstanceMethodDecl", - CXCursor_ObjCClassMethodDecl => "ObjCClassMethodDecl", - CXCursor_ObjCImplementationDecl => "ObjCImplementationDecl", - CXCursor_ObjCCategoryImplDecl => "ObjCCategoryImplDecl", - CXCursor_TypedefDecl => "TypedefDecl", - CXCursor_CXXMethod => "CXXMethod", - CXCursor_Namespace => "Namespace", - CXCursor_LinkageSpec => "LinkageSpec", - CXCursor_Constructor => "Constructor", - CXCursor_Destructor => "Destructor", - CXCursor_ConversionFunction => "ConversionFunction", - CXCursor_TemplateTypeParameter => "TemplateTypeParameter", - CXCursor_NonTypeTemplateParameter => "NonTypeTemplateParameter", - CXCursor_TemplateTemplateParameter => "TemplateTemplateParameter", - CXCursor_FunctionTemplate => "FunctionTemplate", - CXCursor_ClassTemplate => "ClassTemplate", - CXCursor_ClassTemplatePartialSpecialization => { - // FIXME: Ugly hack for rustfmt, should go away! - // - // I plan to convert this into an enum right away anyway, though. - return "ClassTemplatePartialSpecialization"; - } - CXCursor_NamespaceAlias => "NamespaceAlias", - CXCursor_UsingDirective => "UsingDirective", - CXCursor_UsingDeclaration => "UsingDeclaration", - CXCursor_TypeAliasDecl => "TypeAliasDecl", - CXCursor_ObjCSynthesizeDecl => "ObjCSynthesizeDecl", - CXCursor_ObjCDynamicDecl => "ObjCDynamicDecl", - CXCursor_CXXAccessSpecifier => "CXXAccessSpecifier", - // CXCursor_FirstDecl => "FirstDecl", - // CXCursor_LastDecl => "LastDecl", - CXCursor_FirstRef => "FirstRef", - // CXCursor_ObjCSuperClassRef => "ObjCSuperClassRef", - CXCursor_ObjCProtocolRef => "ObjCProtocolRef", - CXCursor_ObjCClassRef => "ObjCClassRef", - CXCursor_TypeRef => "TypeRef", - CXCursor_CXXBaseSpecifier => "CXXBaseSpecifier", - CXCursor_TemplateRef => "TemplateRef", - CXCursor_NamespaceRef => "NamespaceRef", - CXCursor_MemberRef => "MemberRef", - // CXCursor_LabelRef => "LabelRef", - CXCursor_OverloadedDeclRef => "OverloadedDeclRef", - CXCursor_VariableRef => "VariableRef", - // CXCursor_LastRef => "LastRef", - CXCursor_FirstInvalid => "FirstInvalid", - // CXCursor_InvalidFile => "InvalidFile", - CXCursor_NoDeclFound => "NoDeclFound", - CXCursor_NotImplemented => "NotImplemented", - CXCursor_InvalidCode => "InvalidCode", - // CXCursor_LastInvalid => "LastInvalid", - CXCursor_FirstExpr => "FirstExpr", - // CXCursor_UnexposedExpr => "UnexposedExpr", - CXCursor_DeclRefExpr => "DeclRefExpr", - CXCursor_MemberRefExpr => "MemberRefExpr", - CXCursor_CallExpr => "CallExpr", - CXCursor_ObjCMessageExpr => "ObjCMessageExpr", - CXCursor_BlockExpr => "BlockExpr", - CXCursor_IntegerLiteral => "IntegerLiteral", - CXCursor_FloatingLiteral => "FloatingLiteral", - CXCursor_ImaginaryLiteral => "ImaginaryLiteral", - CXCursor_StringLiteral => "StringLiteral", - CXCursor_CharacterLiteral => "CharacterLiteral", - CXCursor_ParenExpr => "ParenExpr", - CXCursor_UnaryOperator => "UnaryOperator", - CXCursor_ArraySubscriptExpr => "ArraySubscriptExpr", - CXCursor_BinaryOperator => "BinaryOperator", - CXCursor_CompoundAssignOperator => "CompoundAssignOperator", - CXCursor_ConditionalOperator => "ConditionalOperator", - CXCursor_CStyleCastExpr => "CStyleCastExpr", - CXCursor_CompoundLiteralExpr => "CompoundLiteralExpr", - CXCursor_InitListExpr => "InitListExpr", - CXCursor_AddrLabelExpr => "AddrLabelExpr", - CXCursor_StmtExpr => "StmtExpr", - CXCursor_GenericSelectionExpr => "GenericSelectionExpr", - CXCursor_GNUNullExpr => "GNUNullExpr", - CXCursor_CXXStaticCastExpr => "CXXStaticCastExpr", - CXCursor_CXXDynamicCastExpr => "CXXDynamicCastExpr", - CXCursor_CXXReinterpretCastExpr => "CXXReinterpretCastExpr", - CXCursor_CXXConstCastExpr => "CXXConstCastExpr", - CXCursor_CXXFunctionalCastExpr => "CXXFunctionalCastExpr", - CXCursor_CXXTypeidExpr => "CXXTypeidExpr", - CXCursor_CXXBoolLiteralExpr => "CXXBoolLiteralExpr", - CXCursor_CXXNullPtrLiteralExpr => "CXXNullPtrLiteralExpr", - CXCursor_CXXThisExpr => "CXXThisExpr", - CXCursor_CXXThrowExpr => "CXXThrowExpr", - CXCursor_CXXNewExpr => "CXXNewExpr", - CXCursor_CXXDeleteExpr => "CXXDeleteExpr", - CXCursor_UnaryExpr => "UnaryExpr", - CXCursor_ObjCStringLiteral => "ObjCStringLiteral", - CXCursor_ObjCEncodeExpr => "ObjCEncodeExpr", - CXCursor_ObjCSelectorExpr => "ObjCSelectorExpr", - CXCursor_ObjCProtocolExpr => "ObjCProtocolExpr", - CXCursor_ObjCBridgedCastExpr => "ObjCBridgedCastExpr", - CXCursor_PackExpansionExpr => "PackExpansionExpr", - CXCursor_SizeOfPackExpr => "SizeOfPackExpr", - CXCursor_LambdaExpr => "LambdaExpr", - CXCursor_ObjCBoolLiteralExpr => "ObjCBoolLiteralExpr", - // CXCursor_LastExpr => "LastExpr", - CXCursor_FirstStmt => "FirstStmt", - // CXCursor_UnexposedStmt => "UnexposedStmt", - CXCursor_LabelStmt => "LabelStmt", - CXCursor_CompoundStmt => "CompoundStmt", - CXCursor_CaseStmt => "CaseStmt", - CXCursor_DefaultStmt => "DefaultStmt", - CXCursor_IfStmt => "IfStmt", - CXCursor_SwitchStmt => "SwitchStmt", - CXCursor_WhileStmt => "WhileStmt", - CXCursor_DoStmt => "DoStmt", - CXCursor_ForStmt => "ForStmt", - CXCursor_GotoStmt => "GotoStmt", - CXCursor_IndirectGotoStmt => "IndirectGotoStmt", - CXCursor_ContinueStmt => "ContinueStmt", - CXCursor_BreakStmt => "BreakStmt", - CXCursor_ReturnStmt => "ReturnStmt", - CXCursor_AsmStmt => "AsmStmt", - CXCursor_ObjCAtTryStmt => "ObjCAtTryStmt", - CXCursor_ObjCAtCatchStmt => "ObjCAtCatchStmt", - CXCursor_ObjCAtFinallyStmt => "ObjCAtFinallyStmt", - CXCursor_ObjCAtThrowStmt => "ObjCAtThrowStmt", - CXCursor_ObjCAtSynchronizedStmt => "ObjCAtSynchronizedStmt", - CXCursor_ObjCAutoreleasePoolStmt => "ObjCAutoreleasePoolStmt", - CXCursor_ObjCForCollectionStmt => "ObjCForCollectionStmt", - CXCursor_CXXCatchStmt => "CXXCatchStmt", - CXCursor_CXXTryStmt => "CXXTryStmt", - CXCursor_CXXForRangeStmt => "CXXForRangeStmt", - CXCursor_SEHTryStmt => "SEHTryStmt", - CXCursor_SEHExceptStmt => "SEHExceptStmt", - CXCursor_SEHFinallyStmt => "SEHFinallyStmt", - CXCursor_NullStmt => "NullStmt", - CXCursor_DeclStmt => "DeclStmt", - // CXCursor_LastStmt => "LastStmt", - CXCursor_TranslationUnit => "TranslationUnit", - CXCursor_FirstAttr => "FirstAttr", - // CXCursor_UnexposedAttr => "UnexposedAttr", - CXCursor_IBActionAttr => "IBActionAttr", - CXCursor_IBOutletAttr => "IBOutletAttr", - CXCursor_IBOutletCollectionAttr => "IBOutletCollectionAttr", - CXCursor_CXXFinalAttr => "CXXFinalAttr", - CXCursor_CXXOverrideAttr => "CXXOverrideAttr", - CXCursor_AnnotateAttr => "AnnotateAttr", - CXCursor_AsmLabelAttr => "AsmLabelAttr", - // CXCursor_LastAttr => "LastAttr", - CXCursor_PreprocessingDirective => "PreprocessingDirective", - CXCursor_MacroDefinition => "MacroDefinition", - CXCursor_MacroExpansion => "MacroExpansion", - // CXCursor_MacroInstantiation => "MacroInstantiation", - CXCursor_InclusionDirective => "InclusionDirective", - // CXCursor_FirstPreprocessing => "FirstPreprocessing", - // CXCursor_LastPreprocessing => "LastPreprocessing", - CXCursor_PackedAttr => "PackedAttr", - CXCursor_ModuleImportDecl => "ModuleImportDecl", - CXCursor_TypeAliasTemplateDecl => "TypeAliasTemplateDecl", - CXCursor_StaticAssert => "StaticAssert", - _ => "?", - } +pub fn kind_to_str(x: Enum_CXCursorKind) -> String { + unsafe { clang_getCursorKindSpelling(x) }.into() } /// Convert a type kind to a static string. -pub fn type_to_str(x: Enum_CXTypeKind) -> &'static str { - match x { - CXType_Invalid => "Invalid", - CXType_Unexposed => "Unexposed", - CXType_Void => "Void", - CXType_Bool => "Bool", - CXType_Char_U => "Char_U", - CXType_UChar => "UChar", - CXType_Char16 => "Char16", - CXType_Char32 => "Char32", - CXType_UShort => "UShort", - CXType_UInt => "UInt", - CXType_ULong => "ULong", - CXType_ULongLong => "ULongLong", - CXType_UInt128 => "UInt128", - CXType_Char_S => "Char_S", - CXType_SChar => "SChar", - CXType_WChar => "WChar", - CXType_Short => "Short", - CXType_Int => "Int", - CXType_Long => "Long", - CXType_LongLong => "LongLong", - CXType_Int128 => "Int128", - CXType_Float => "Float", - CXType_Double => "Double", - CXType_LongDouble => "LongDouble", - CXType_NullPtr => "NullPtr", - CXType_Overload => "Overload", - CXType_Dependent => "Dependent", - CXType_ObjCId => "ObjCId", - CXType_ObjCClass => "ObjCClass", - CXType_ObjCSel => "ObjCSel", - // CXType_FirstBuiltin => "FirstBuiltin", - // CXType_LastBuiltin => "LastBuiltin", - CXType_Complex => "Complex", - CXType_Pointer => "Pointer", - CXType_BlockPointer => "BlockPointer", - CXType_LValueReference => "LValueReference", - CXType_RValueReference => "RValueReference", - CXType_Record => "Record", - CXType_Enum => "Enum", - CXType_Typedef => "Typedef", - CXType_ObjCInterface => "ObjCInterface", - CXType_ObjCObjectPointer => "ObjCObjectPointer", - CXType_FunctionNoProto => "FunctionNoProto", - CXType_FunctionProto => "FunctionProto", - CXType_ConstantArray => "ConstantArray", - CXType_Vector => "Vector", - CXType_IncompleteArray => "IncompleteArray", - CXType_VariableArray => "VariableArray", - CXType_DependentSizedArray => "DependentSizedArray", - CXType_MemberPointer => "MemberPointer", - #[cfg(not(feature="llvm_stable"))] - CXType_Auto => "Auto", - #[cfg(not(feature="llvm_stable"))] - CXType_Elaborated => "Elaborated", - _ => "?", - } +pub fn type_to_str(x: Enum_CXTypeKind) -> String { + unsafe { clang_getTypeKindSpelling(x).into() } } /// Dump the Clang AST to stdout for debugging purposes. From 94136d22aae3b92ef66f7673641f7935b76fd98d Mon Sep 17 00:00:00 2001 From: Ethan Glasser-Camp Date: Wed, 2 Nov 2016 20:01:50 -0400 Subject: [PATCH 0024/2291] Reuse Cursor::is_valid() Thanks @emilio for the suggestion. --- src/clang.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 3f23cbb606..f8aac1c1ff 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -289,14 +289,10 @@ impl Cursor { /// pointing to the template definition that is being specialized. pub fn specialized(&self) -> Option { unsafe { - let clang_specialized = clang_getSpecializedCursorTemplate(self.x); - if clang_isInvalid(clang_getCursorKind(clang_specialized)) == 0 { - Some(Cursor { - x: clang_specialized, - }) - } else { - None - } + let ret = Cursor { + x: clang_getSpecializedCursorTemplate(self.x) + }; + if ret.is_valid() { Some(ret) } else { None } } } From 3fa7228c192e468d0730888aaa37acc02bb28d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 2 Nov 2016 23:48:10 +0100 Subject: [PATCH 0025/2291] clang: Simplify visiting code. It has always been a mess. --- src/clang.rs | 52 +++++++++++++++++----------------------------- src/ir/comp.rs | 18 ++++++++-------- src/ir/context.rs | 4 ++-- src/ir/enum_ty.rs | 2 +- src/ir/function.rs | 4 ++-- src/ir/item.rs | 4 ++-- src/ir/module.rs | 4 ++-- src/ir/ty.rs | 6 +++--- src/ir/var.rs | 2 +- src/lib.rs | 6 +++--- 10 files changed, 44 insertions(+), 58 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index bc3d511f27..af19424277 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -31,14 +31,6 @@ impl fmt::Debug for Cursor { } } -/// A cursor visitor function. -/// -/// The first argument is the AST node currently being visited. The second -/// argument is the parent of the AST node currently being visited. The return -/// value informs how traversal should proceed. -pub type CursorVisitor<'s> = for<'a, 'b> FnMut(&'a Cursor, &'b Cursor) - -> Enum_CXChildVisitResult + 's; - impl Cursor { /// Get the Unified Symbol Resolution for this cursor's referent, if /// available. @@ -303,21 +295,14 @@ impl Cursor { /// Traverse this cursor's referent and its children. /// - /// Call the given function on each AST node traversed. See `CursorVisitor` - /// for details on arguments passed to the function and how its return value - /// is interpreted. - pub fn visit(&self, func: F) - where F: for<'a, 'b> FnMut(&'a Cursor, &'b Cursor) - -> Enum_CXChildVisitResult, + /// Call the given function on each AST node traversed. + pub fn visit(&self, mut visitor: Visitor) + where Visitor: FnMut(Cursor) -> Enum_CXChildVisitResult, { - let mut data: Box = Box::new(func); - let opt_visit = - Some(visit_children as extern "C" fn(CXCursor, - CXCursor, - CXClientData) - -> Enum_CXChildVisitResult); unsafe { - clang_visitChildren(self.x, opt_visit, mem::transmute(&mut data)); + clang_visitChildren(self.x, + Some(visit_children::), + mem::transmute(&mut visitor)); } } @@ -481,17 +466,18 @@ impl Cursor { } } -extern "C" fn visit_children(cur: CXCursor, - parent: CXCursor, - data: CXClientData) - -> Enum_CXChildVisitResult { - let func: &mut Box = unsafe { mem::transmute(data) }; - (*func)(&Cursor { - x: cur, - }, - &Cursor { - x: parent, - }) +extern "C" fn visit_children(cur: CXCursor, + _parent: CXCursor, + data: CXClientData) + -> Enum_CXChildVisitResult + where Visitor: FnMut(Cursor) -> Enum_CXChildVisitResult, +{ + let func: &mut Visitor = unsafe { mem::transmute(data) }; + let child = Cursor { + x: cur, + }; + + (*func)(child) } impl PartialEq for Cursor { @@ -1407,7 +1393,7 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> Enum_CXVisitorResult { kind_to_str(c.kind()), c.spelling(), type_to_str(ct))); - c.visit(|s, _: &Cursor| ast_dump(s, depth + 1)); + c.visit(|s| ast_dump(&s, depth + 1)); print_indent(depth, ")"); CXChildVisit_Continue } diff --git a/src/ir/comp.rs b/src/ir/comp.rs index d55c24ca16..2208277291 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -515,7 +515,7 @@ impl CompInfo { ci.ref_template = Item::parse(cursor.specialized(), None, ctx).ok(); let mut maybe_anonymous_struct_field = None; - cursor.visit(|cur, _other| { + cursor.visit(|cur| { if cur.kind() != CXCursor_FieldDecl { if let Some((ty, _)) = maybe_anonymous_struct_field { let field = Field::new(None, ty, None, None, None, false); @@ -529,7 +529,7 @@ impl CompInfo { match maybe_anonymous_struct_field.take() { Some((ty, clang_ty)) => { let mut used = false; - cur.visit(|child, _| { + cur.visit(|child| { if child.cur_type() == clang_ty { used = true; } @@ -550,12 +550,12 @@ impl CompInfo { let bit_width = cur.bit_width(); let field_type = Item::from_ty_or_ref(cur.cur_type(), - Some(*cur), + Some(cur), Some(potential_id), ctx); let comment = cur.raw_comment(); - let annotations = Annotations::new(cur); + let annotations = Annotations::new(&cur); let name = cur.spelling(); let is_mutable = cursor.is_mutable_field(); @@ -575,7 +575,7 @@ impl CompInfo { ci.fields.push(field); // No we look for things like attributes and stuff. - cur.visit(|cur, _| { + cur.visit(|cur| { if cur.kind() == CXCursor_UnexposedAttr { ci.found_unknown_attr = true; } @@ -593,7 +593,7 @@ impl CompInfo { CXCursor_UnionDecl | CXCursor_ClassTemplate | CXCursor_ClassDecl => { - let inner = Item::parse(*cur, Some(potential_id), ctx) + let inner = Item::parse(cur, Some(potential_id), ctx) .expect("Inner ClassDecl"); if !ci.inner_types.contains(&inner) { ci.inner_types.push(inner); @@ -619,7 +619,7 @@ impl CompInfo { } let default_type = Item::from_ty(&cur.cur_type(), - Some(*cur), + Some(cur), Some(potential_id), ctx) .ok(); @@ -687,7 +687,7 @@ impl CompInfo { // NB: This gets us an owned `Function`, not a // `FunctionSig`. let method_signature = - Item::parse(*cur, Some(potential_id), ctx) + Item::parse(cur, Some(potential_id), ctx) .expect("CXXMethod"); let is_const = cur.method_is_const(); @@ -726,7 +726,7 @@ impl CompInfo { return CXChildVisit_Continue; } - let item = Item::parse(*cur, Some(potential_id), ctx) + let item = Item::parse(cur, Some(potential_id), ctx) .expect("VarDecl"); ci.inner_vars.push(item); } diff --git a/src/ir/context.rs b/src/ir/context.rs index 6c56eefe69..b7e9696415 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -490,14 +490,14 @@ impl<'ctx> BindgenContext<'ctx> { use clangll::*; let mut args = vec![]; let mut found_invalid_template_ref = false; - location.visit(|c, _| { + location.visit(|c| { if c.kind() == CXCursor_TemplateRef && c.cur_type().kind() == CXType_Invalid { found_invalid_template_ref = true; } if c.kind() == CXCursor_TypeRef { let new_ty = Item::from_ty_or_ref(c.cur_type(), - Some(*c), + Some(c), Some(with_id), self); args.push(new_ty); diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index fd7dbb4562..e78184e7c5 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -70,7 +70,7 @@ impl Enum { None => true, }; - declaration.visit(|cursor, _| { + declaration.visit(|cursor| { if cursor.kind() == CXCursor_EnumConstantDecl { let name = cursor.spelling(); let comment = cursor.raw_comment(); diff --git a/src/ir/function.rs b/src/ir/function.rs index c2e6ffd076..163e303972 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -167,10 +167,10 @@ impl FunctionSig { // For non-CXCursor_FunctionDecl, visiting the cursor's children // is the only reliable way to get parameter names. let mut args = vec![]; - cursor.visit(|c, _| { + cursor.visit(|c| { if c.kind() == CXCursor_ParmDecl { let ty = - Item::from_ty(&c.cur_type(), Some(*c), None, ctx) + Item::from_ty(&c.cur_type(), Some(c), None, ctx) .expect("ParmDecl?"); let name = c.spelling(); let name = diff --git a/src/ir/item.rs b/src/ir/item.rs index 4e893e357b..c58fa81f2d 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -966,11 +966,11 @@ impl ClangItemParser for Item { assert_eq!(popped_decl, declaration_to_look_for); } - location.visit(|cur, _other| { + location.visit(|cur| { use clangll::*; result = Item::from_ty_with_id(id, ty, - Some(*cur), + Some(cur), parent_id, ctx); match result { diff --git a/src/ir/module.rs b/src/ir/module.rs index c582d3eb8a..42175b920e 100644 --- a/src/ir/module.rs +++ b/src/ir/module.rs @@ -49,8 +49,8 @@ impl ClangSubItemParser for Module { CXCursor_Namespace => { let module_id = ctx.module(cursor); ctx.with_module(module_id, |ctx, children| { - cursor.visit(|cursor, _| { - parse_one(ctx, *cursor, Some(module_id), children) + cursor.visit(|cursor| { + parse_one(ctx, cursor, Some(module_id), children) }) }); diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 4d26cdff49..812120299f 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -547,14 +547,14 @@ impl Type { let mut inner = Err(ParseError::Continue); let mut args = vec![]; - location.visit(|cur, _| { + location.visit(|cur| { match cur.kind() { CXCursor_TypeAliasDecl => { debug_assert!(cur.cur_type().kind() == CXType_Typedef); inner = Item::from_ty(&cur.cur_type(), - Some(*cur), + Some(cur), Some(potential_id), ctx); } @@ -567,7 +567,7 @@ impl Type { let default_type = Item::from_ty(&cur.cur_type(), - Some(*cur), + Some(cur), Some(potential_id), ctx) .ok(); diff --git a/src/ir/var.rs b/src/ir/var.rs index 216d818577..33e5624267 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -203,7 +203,7 @@ fn get_integer_literal_from_cursor(cursor: &clang::Cursor, -> Option { use clangll::*; let mut value = None; - cursor.visit(|c, _| { + cursor.visit(|c| { match c.kind() { CXCursor_IntegerLiteral | CXCursor_UnaryOperator => { diff --git a/src/lib.rs b/src/lib.rs index 1592c275df..1aaeaa2025 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -418,7 +418,7 @@ pub fn parse_one(ctx: &mut BindgenContext, Ok(id) => children.push(id), Err(ParseError::Continue) => {} Err(ParseError::Recurse) => { - cursor.visit(|child, _| parse_one(ctx, *child, parent, children)); + cursor.visit(|child| parse_one(ctx, child, parent, children)); } } CXChildVisit_Continue @@ -437,12 +437,12 @@ fn parse(context: &mut BindgenContext) { let cursor = context.translation_unit().cursor(); if context.options().emit_ast { - cursor.visit(|cur, _| clang::ast_dump(cur, 0)); + cursor.visit(|cur| clang::ast_dump(&cur, 0)); } let root = context.root_module(); context.with_module(root, |context, children| { - cursor.visit(|cursor, _| parse_one(context, *cursor, None, children)) + cursor.visit(|cursor| parse_one(context, cursor, None, children)) }); assert!(context.current_module() == context.root_module(), From 20b6a6f79997c178c8952eb5321558b10d6b5e4e Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Fri, 4 Nov 2016 00:03:31 +0800 Subject: [PATCH 0026/2291] Fix link to stylo script in README.md The scripts were moved in https://github.com/servo/servo/pull/13372 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 47e7dd53a0..97488b6b71 100644 --- a/README.md +++ b/README.md @@ -149,4 +149,4 @@ This mode isn't actively maintained, so no promises are made around it. Check out the upstream documentation for info about how it *should* work. [sm-script]: https://github.com/servo/rust-mozjs/blob/master/etc/bindings.sh -[stylo-scripts]: https://github.com/servo/servo/tree/master/ports/geckolib/gecko_bindings/tools +[stylo-scripts]: https://github.com/servo/servo/tree/master/components/style/binding_tools From eff92920d42eb87a9dedc5fb32c02aac382a51c5 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 3 Nov 2016 11:23:11 -0700 Subject: [PATCH 0027/2291] Do not overwrite existing replacements It turns out that we can end up overwriting existing replacements. This commit embeds the assumption that the first replacement definition is the correct one, and warns on all attempts to overwrite the first replacement definition with a new one. Additionally, it adds some debug logging about replacements. --- src/ir/context.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/ir/context.rs b/src/ir/context.rs index beccc514fd..b51a2cb9f8 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -4,7 +4,7 @@ use BindgenOptions; use clang::{self, Cursor}; use parse::ClangItemParser; use std::borrow::{Borrow, Cow}; -use std::collections::{HashMap, HashSet}; +use std::collections::{HashMap, HashSet, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; use super::int::IntKind; @@ -308,6 +308,7 @@ impl<'ctx> BindgenContext<'ctx> { /// `replaces="SomeType"` annotation with the replacement type. fn process_replacements(&mut self) { if self.replacements.is_empty() { + debug!("No replacements to process"); return; } @@ -347,6 +348,8 @@ impl<'ctx> BindgenContext<'ctx> { } for (id, replacement) in replacements { + debug!("Replacing {:?} with {:?}", id, replacement); + let mut item = self.items.get_mut(&id).unwrap(); *item.kind_mut().as_type_mut().unwrap().kind_mut() = TypeKind::ResolvedTypeRef(replacement); @@ -725,7 +728,21 @@ impl<'ctx> BindgenContext<'ctx> { /// Replacement types are declared using the `replaces="xxx"` annotation, /// and implies that the original type is hidden. pub fn replace(&mut self, name: &str, potential_ty: ItemId) { - self.replacements.insert(name.into(), potential_ty); + match self.replacements.entry(name.into()) { + hash_map::Entry::Vacant(entry) => { + debug!("Defining replacement for {} as {:?}", + name, + potential_ty); + entry.insert(potential_ty); + } + hash_map::Entry::Occupied(occupied) => { + warn!("Replacement for {} already defined as {:?}; \ + ignoring duplicate replacement definition as {:?}}}", + name, + occupied.get(), + potential_ty); + } + } } /// Is the item with the given `name` hidden? Or is the item with the given From 59468b998549012e55007808cac3b90517291357 Mon Sep 17 00:00:00 2001 From: oldmanmike Date: Thu, 3 Nov 2016 13:28:33 -0500 Subject: [PATCH 0028/2291] Add bounds checks to version parsing --- src/bin/bindgen.rs | 30 +++++++++++------------------- src/clang.rs | 6 ++---- src/lib.rs | 39 +++++++++++++++++++++------------------ 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index 4c884448ba..3f3ff377f8 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -217,26 +217,18 @@ pub fn main() { let mut bind_args: Vec<_> = env::args().collect(); - match clang_version() { - None => { - error!("Could not retrieve Clang version...") - }, - Some(v) => { - if cfg!(feature = "llvm_stable") { - if (v.major,v.minor) != (3,8) { - error!("Got Clang {}.{}, expected 3.8", v.major, v.minor) - } else { - info!("Using: {}", v.full) - } - } else { - if (v.major, v.minor) != (3,9) { - error!("Got Clang {}.{}, expected 3.9", v.major, v.minor) - } else { - info!("Using: {}", v.full) - } - } + let version = clang_version(); + let expected_version = if cfg!(feature = "llvm_stable") { (3,8) } else { (3,9) }; + + info!("Clang Version: {}", version.full); + + match version.parsed { + None => warn!("Couldn't parse libclang version"), + Some(version) if version != expected_version => { + error!("Using clang {:?}, expected {:?}", version, expected_version); } - }; + _ => {} + } if let Some(clang) = clang_sys::support::Clang::find(None) { let has_clang_args = diff --git a/src/clang.rs b/src/clang.rs index 437c3f1586..495e461e11 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -1428,8 +1428,6 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> Enum_CXVisitorResult { } /// Try to extract the clang version to a string -pub fn extract_clang_version() -> Option { - let s: String = - unsafe { clang_getClangVersion().into() }; - if s.is_empty() { None } else { Some(s) } +pub fn extract_clang_version() -> String { + unsafe { clang_getClangVersion().into() } } diff --git a/src/lib.rs b/src/lib.rs index c3e9203b24..7b4d4e4b17 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -452,30 +452,33 @@ fn parse(context: &mut BindgenContext) { /// Extracted Clang version data #[derive(Debug)] pub struct ClangVersion { - /// major semvar - pub major: u32, - /// minor semvar - pub minor: u32, + /// Major and minor semvar, if parsing was successful + pub parsed: Option<(u32,u32)>, /// full version string pub full: String, } /// Get the major and the minor semvar numbers of Clang's version -pub fn clang_version() -> Option { - let raw_v: String = match clang::extract_clang_version() { - None => return None, - Some(v) => v, - }; - let split_v: Vec<&str> = match raw_v.split_whitespace().nth(2) { - None => return None, - Some(v) => v.split_terminator('.').collect(), +pub fn clang_version() -> ClangVersion { + let raw_v: String = clang::extract_clang_version(); + let split_v: Option> = raw_v + .split_whitespace() + .nth(2) + .map(|v| v.split('.').collect()); + match split_v { + Some(v) => { + if v.len() >= 2 { + let maybe_major = v[0].parse::(); + let maybe_minor = v[1].parse::(); + match (maybe_major,maybe_minor) { + (Ok(major),Ok(minor)) => return ClangVersion { parsed: Some((major,minor)), full: raw_v.clone() }, + _ => {}, + } + } + }, + None => {}, }; - let maybe_major = split_v[0].parse::(); - let maybe_minor = split_v[1].parse::(); - match (maybe_major,maybe_minor) { - (Ok(major),Ok(minor)) => Some(ClangVersion { major: major, minor: minor, full: raw_v.clone() }), - _ => None, - } + ClangVersion { parsed: None, full: raw_v.clone() } } From 8041ebfdbcf11fc327b6b4bfd56a243a16fc80d7 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 3 Nov 2016 13:01:41 -0700 Subject: [PATCH 0029/2291] Allow template aliases to be considered for replacement --- src/ir/context.rs | 24 ++++++++++++-------- src/ir/item.rs | 10 ++++---- tests/expectations/replace_template_alias.rs | 15 ++++++++++++ tests/headers/replace_template_alias.hpp | 23 +++++++++++++++++++ 4 files changed, 57 insertions(+), 15 deletions(-) create mode 100644 tests/expectations/replace_template_alias.rs create mode 100644 tests/headers/replace_template_alias.hpp diff --git a/src/ir/context.rs b/src/ir/context.rs index b51a2cb9f8..9ffb1b7ae7 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -320,23 +320,27 @@ impl<'ctx> BindgenContext<'ctx> { let mut replacements = vec![]; for (id, item) in self.items.iter() { + // Calls to `canonical_name` are expensive, so eagerly filter out + // items that cannot be replaced. let ty = match item.kind().as_type() { Some(ty) => ty, None => continue, }; - // canonical_name calls are expensive. - let ci = match ty.as_comp() { - Some(ci) => ci, - None => continue, - }; - - if ci.is_template_specialization() { - continue; + match *ty.kind() { + TypeKind::Comp(ref ci) if !ci.is_template_specialization() => {} + TypeKind::TemplateAlias(_, _) | + TypeKind::Alias(_, _) => {} + _ => continue, } - if let Some(replacement) = self.replacements - .get(&item.canonical_name(self)) { + let name = item.real_canonical_name(self, + self.options() + .enable_cxx_namespaces, + true); + let replacement = self.replacements.get(&name); + + if let Some(replacement) = replacement { if replacement != id { // We set this just after parsing the annotation. It's // very unlikely, but this can happen. diff --git a/src/ir/item.rs b/src/ir/item.rs index 690f42226a..d986bb32e1 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -539,11 +539,11 @@ impl Item { /// /// This name should be derived from the immutable state contained in the /// type and the parent chain, since it should be consistent. - fn real_canonical_name(&self, - ctx: &BindgenContext, - count_namespaces: bool, - for_name_checking: bool) - -> String { + pub fn real_canonical_name(&self, + ctx: &BindgenContext, + count_namespaces: bool, + for_name_checking: bool) + -> String { let base_name = match *self.kind() { ItemKind::Type(ref ty) => { match *ty.kind() { diff --git a/tests/expectations/replace_template_alias.rs b/tests/expectations/replace_template_alias.rs new file mode 100644 index 0000000000..61a2fbccea --- /dev/null +++ b/tests/expectations/replace_template_alias.rs @@ -0,0 +1,15 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Rooted { + pub ptr: MaybeWrapped, +} +/// But the replacement type does use T! +/// +///
+pub type MaybeWrapped = T; diff --git a/tests/headers/replace_template_alias.hpp b/tests/headers/replace_template_alias.hpp new file mode 100644 index 0000000000..6ceae4e517 --- /dev/null +++ b/tests/headers/replace_template_alias.hpp @@ -0,0 +1,23 @@ +// bindgen-flags: -- --std=c++14 + +namespace JS { +namespace detail { + +/// Notice how this doesn't use T. +template +using MaybeWrapped = int; + +} + +template +class Rooted { + detail::MaybeWrapped ptr; +}; + +} + +/// But the replacement type does use T! +/// +///
+template +using replaces_MaybeWrapped = T; From b49bfea05b9cd4986a0f535e3193f2889e9db93b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20HUBSCHER?= Date: Fri, 4 Nov 2016 16:31:28 +0100 Subject: [PATCH 0030/2291] =?UTF-8?q?Make=20clang::Cursor::ret=5Ftype=20re?= =?UTF-8?q?turn=20an=20Option=20=E2=80=94=20Fixes=20#131?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clang.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index b335a58555..dd4bcdf8f2 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -402,11 +402,12 @@ impl Cursor { /// Given that this cursor's referent is a function/method call or /// declaration, return a cursor to its return type. - pub fn ret_type(&self) -> Type { + pub fn ret_type(&self) -> Option { unsafe { - Type { + let ret = Type { x: clang_getCursorResultType(self.x), - } + }; + if true { Some(ret) } else { None } } } From 904970ec849d60613be9b46a510ccba7e16b6a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20HUBSCHER?= Date: Fri, 4 Nov 2016 16:34:36 +0100 Subject: [PATCH 0031/2291] Some cargo-fmt corrections. --- src/bin/bindgen.rs | 12 +++++++++--- src/clang.rs | 2 +- src/ir/item.rs | 4 +++- src/lib.rs | 27 ++++++++++++++++----------- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index 2127ea4913..c906efee27 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -8,7 +8,7 @@ extern crate log; extern crate clang_sys; extern crate rustc_serialize; -use bindgen::{BindgenOptions, Bindings, LinkType, ClangVersion, clang_version}; +use bindgen::{BindgenOptions, Bindings, ClangVersion, LinkType, clang_version}; use std::default::Default; use std::env; use std::fs; @@ -233,14 +233,20 @@ pub fn main() { let mut bind_args: Vec<_> = env::args().collect(); let version = clang_version(); - let expected_version = if cfg!(feature = "llvm_stable") { (3,8) } else { (3,9) }; + let expected_version = if cfg!(feature = "llvm_stable") { + (3, 8) + } else { + (3, 9) + }; info!("Clang Version: {}", version.full); match version.parsed { None => warn!("Couldn't parse libclang version"), Some(version) if version != expected_version => { - error!("Using clang {:?}, expected {:?}", version, expected_version); + error!("Using clang {:?}, expected {:?}", + version, + expected_version); } _ => {} } diff --git a/src/clang.rs b/src/clang.rs index b335a58555..7702c66036 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -285,7 +285,7 @@ impl Cursor { pub fn specialized(&self) -> Option { unsafe { let ret = Cursor { - x: clang_getSpecializedCursorTemplate(self.x) + x: clang_getSpecializedCursorTemplate(self.x), }; if ret.is_valid() { Some(ret) } else { None } } diff --git a/src/ir/item.rs b/src/ir/item.rs index 230907393e..a9b625f20d 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -49,7 +49,9 @@ pub trait ItemCanonicalPath { /// up to (but not including) the implicit root module. pub trait ItemAncestors { /// Get an iterable over this item's ancestors. - fn ancestors<'a, 'b>(&self, ctx: &'a BindgenContext<'b>) -> ItemAncestorsIter<'a, 'b>; + fn ancestors<'a, 'b>(&self, + ctx: &'a BindgenContext<'b>) + -> ItemAncestorsIter<'a, 'b>; } /// An iterator over an item and its ancestors. diff --git a/src/lib.rs b/src/lib.rs index 7fa8cf5133..a0eba4c088 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -496,7 +496,7 @@ fn parse(context: &mut BindgenContext) { #[derive(Debug)] pub struct ClangVersion { /// Major and minor semvar, if parsing was successful - pub parsed: Option<(u32,u32)>, + pub parsed: Option<(u32, u32)>, /// full version string pub full: String, } @@ -504,8 +504,7 @@ pub struct ClangVersion { /// Get the major and the minor semvar numbers of Clang's version pub fn clang_version() -> ClangVersion { let raw_v: String = clang::extract_clang_version(); - let split_v: Option> = raw_v - .split_whitespace() + let split_v: Option> = raw_v.split_whitespace() .nth(2) .map(|v| v.split('.').collect()); match split_v { @@ -513,15 +512,21 @@ pub fn clang_version() -> ClangVersion { if v.len() >= 2 { let maybe_major = v[0].parse::(); let maybe_minor = v[1].parse::(); - match (maybe_major,maybe_minor) { - (Ok(major),Ok(minor)) => return ClangVersion { parsed: Some((major,minor)), full: raw_v.clone() }, - _ => {}, + match (maybe_major, maybe_minor) { + (Ok(major), Ok(minor)) => { + return ClangVersion { + parsed: Some((major, minor)), + full: raw_v.clone(), + } + } + _ => {} } } - }, - None => {}, + } + None => {} }; - ClangVersion { parsed: None, full: raw_v.clone() } + ClangVersion { + parsed: None, + full: raw_v.clone(), + } } - - From 2523bf49939dc876b00c9f0c2de2b5bdf328a25c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20HUBSCHER?= Date: Fri, 4 Nov 2016 16:37:28 +0100 Subject: [PATCH 0032/2291] Rip it out please. --- src/clang.rs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index dd4bcdf8f2..85d0914fb7 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -400,17 +400,6 @@ impl Cursor { } } - /// Given that this cursor's referent is a function/method call or - /// declaration, return a cursor to its return type. - pub fn ret_type(&self) -> Option { - unsafe { - let ret = Type { - x: clang_getCursorResultType(self.x), - }; - if true { Some(ret) } else { None } - } - } - /// Given that this cursor's referent is a function/method call or /// declaration, return the number of arguments it takes. /// From 42f1078e1ca06c9cfb264307ce8eeca59b05f5fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20HUBSCHER?= Date: Fri, 4 Nov 2016 17:24:53 +0100 Subject: [PATCH 0033/2291] =?UTF-8?q?clang::Cursor::definition=20should=20?= =?UTF-8?q?return=20Option=20=E2=80=94=20Fixes=20#123?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Paired with @glasserc --- src/clang.rs | 8 +++++--- src/ir/item.rs | 14 ++------------ 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 045c49877f..94e74d875e 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -249,11 +249,13 @@ impl Cursor { /// Given that this cursor's referent is a reference to another type, or is /// a declaration, get the cursor pointing to the referenced type or type of /// the declared thing. - pub fn definition(&self) -> Cursor { + pub fn definition(&self) -> Option { unsafe { - Cursor { + let ret = Cursor { x: clang_getCursorDefinition(self.x), - } + }; + + if ret.is_valid() { Some(ret) } else { None } } } diff --git a/src/ir/item.rs b/src/ir/item.rs index a9b625f20d..6eff60c980 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -801,12 +801,7 @@ impl ClangItemParser for Item { // Types are sort of special, so to avoid parsing template classes // twice, handle them separately. { - let definition = cursor.definition(); - let applicable_cursor = if definition.is_valid() { - definition - } else { - cursor - }; + let applicable_cursor = cursor.definition().unwrap_or(cursor); match Self::from_ty(&applicable_cursor.cur_type(), Some(applicable_cursor), parent_id, @@ -937,12 +932,7 @@ impl ClangItemParser for Item { let decl = { let decl = ty.declaration(); - let definition = decl.definition(); - if definition.is_valid() { - definition - } else { - decl - } + decl.definition().unwrap_or(decl) }; let comment = decl.raw_comment() From 0afbe48131359d2091734bac1bf6a1d54d48b914 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 4 Nov 2016 11:03:01 -0700 Subject: [PATCH 0034/2291] Use a temporary for the return value in IteId::next() This adds a temporary binding for the newly allocated id so that we can use it in conditional breakpoints when debugging dangling `ItemId` references. I believe that we will want the ability to set conditional breakpoints in this method every single time we end up debugging dangling references, so it is worth landing in master. --- src/ir/item.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ir/item.rs b/src/ir/item.rs index 230907393e..ecb86374b9 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -86,7 +86,8 @@ impl ItemId { /// Allocate the next `ItemId`. pub fn next() -> Self { static NEXT_ITEM_ID: AtomicUsize = ATOMIC_USIZE_INIT; - ItemId(NEXT_ITEM_ID.fetch_add(1, Ordering::Relaxed)) + let next_id = NEXT_ITEM_ID.fetch_add(1, Ordering::Relaxed); + ItemId(next_id) } } From d14b602c4ee12e7f6efbbaa825124b7b774ac890 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 4 Nov 2016 11:05:21 -0700 Subject: [PATCH 0035/2291] Use a known-resolved ItemId as a parent in partial specialization children The `with_id` id will potentially end up unused if we find we already have an item (with its own distinct `ItemId`) for the type, so if we pass `with_id` as the parent id when parsing children it is potentially a dangling reference. Instead, use the canonical template declaration as the parent. It is already parsed and has a known-resolvable `ItemId`. --- src/ir/context.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ir/context.rs b/src/ir/context.rs index c5c321c409..fc06375cc4 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -505,9 +505,15 @@ impl<'ctx> BindgenContext<'ctx> { found_invalid_template_ref = true; } if c.kind() == CXCursor_TypeRef { + // The `with_id` id will potentially end up unused if we give up + // on this type (for example, its a tricky partial template + // specialization), so if we pass `with_id` as the parent, it is + // potentially a dangling reference. Instead, use the canonical + // template declaration as the parent. It is already parsed and + // has a known-resolvable `ItemId`. let new_ty = Item::from_ty_or_ref(c.cur_type(), Some(c), - Some(with_id), + Some(wrapping), self); args.push(new_ty); } From 6e0099d6a6c29b05ce1a2ed5243f3cd6cd29ccc6 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 4 Nov 2016 13:56:49 -0700 Subject: [PATCH 0036/2291] Don't be loud about ignoring macro expansion cursors --- src/ir/item.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ir/item.rs b/src/ir/item.rs index 6d2d4b021b..d046599a69 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -821,6 +821,7 @@ impl ClangItemParser for Item { // too noisy about this. match cursor.kind() { CXCursor_MacroDefinition | + CXCursor_MacroExpansion | CXCursor_InclusionDirective => { debug!("Unhandled cursor kind {:?}: {:?}", cursor.kind(), From bc2f3e99f43d8d256bf1c8004e1a00d0859d0871 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 4 Nov 2016 14:30:44 -0700 Subject: [PATCH 0037/2291] Don't be loud about ignoring `using` and `static_assert` cursors --- src/ir/item.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ir/item.rs b/src/ir/item.rs index d046599a69..a07ee1f36f 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -822,6 +822,8 @@ impl ClangItemParser for Item { match cursor.kind() { CXCursor_MacroDefinition | CXCursor_MacroExpansion | + CXCursor_UsingDeclaration | + CXCursor_StaticAssert | CXCursor_InclusionDirective => { debug!("Unhandled cursor kind {:?}: {:?}", cursor.kind(), From 45dd2aec4ac82d0c7e84ef831b6fc146d34fa9e6 Mon Sep 17 00:00:00 2001 From: Rohan Prinja Date: Fri, 4 Nov 2016 05:31:44 -0400 Subject: [PATCH 0038/2291] change return value of Type::pointee_type() to Option --- src/clang.rs | 16 ++++++++++++---- src/ir/ty.rs | 14 ++++++-------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index b335a58555..11fe51d02a 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -647,11 +647,19 @@ impl Type { /// Given that this type is a pointer type, return the type that it points /// to. - pub fn pointee_type(&self) -> Type { - unsafe { - Type { - x: clang_getPointeeType(self.x), + pub fn pointee_type(&self) -> Option { + match self.kind() { + CXType_Pointer | + CXType_RValueReference | + CXType_LValueReference | + CXType_MemberPointer => { + let ret = Type { + x: unsafe { clang_getPointeeType(self.x) }, + }; + debug_assert!(ret.kind() != CXType_Invalid); + Some(ret) } + _ => None, } } diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 812120299f..be74926816 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -677,10 +677,9 @@ impl Type { // process of resolving them. CXType_MemberPointer | CXType_Pointer => { - let inner = Item::from_ty_or_ref(ty.pointee_type(), - location, - parent_id, - ctx); + let inner = + Item::from_ty_or_ref(ty.pointee_type().unwrap(), location, + parent_id, ctx); TypeKind::Pointer(inner) } CXType_BlockPointer => TypeKind::BlockPointer, @@ -688,10 +687,9 @@ impl Type { // can even add bindings for that, so huh. CXType_RValueReference | CXType_LValueReference => { - let inner = Item::from_ty_or_ref(ty.pointee_type(), - location, - parent_id, - ctx); + let inner = + Item::from_ty_or_ref(ty.pointee_type().unwrap(), location, + parent_id, ctx); TypeKind::Reference(inner) } // XXX DependentSizedArray is wrong From eaff2fc8afd10c4351f0939d708d917dc60c7963 Mon Sep 17 00:00:00 2001 From: Kyle Mayes Date: Thu, 3 Nov 2016 07:03:38 -0400 Subject: [PATCH 0039/2291] Rework CI and add macOS builds --- .travis.yml | 57 +++++++++++++++++--------------------------- ci/before_install.sh | 39 ++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 35 deletions(-) create mode 100644 ci/before_install.sh diff --git a/.travis.yml b/.travis.yml index 5d3395e592..28ffd0d706 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,52 +1,39 @@ language: rust + addons: - apt: - sources: - - llvm-toolchain-precise-3.8 - - ubuntu-toolchain-r-test - packages: - - libclang-3.8-dev - - llvm-3.8-dev -env: - - LLVM_VERSION=3.8 + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-5 + +os: + - linux + - osx + rust: - stable - nightly + +env: + - LLVM_VERSION=3.8 BINDGEN_FEATURES=llvm_stable + - LLVM_VERSION=3.9 BINDGEN_FEATURES= + cache: directories: - $HOME/.cargo -before_install: - - - if [ "${TRAVIS_OS_NAME}" = "osx" ]; then - if [ "${LLVM_VERSION}" != "devtools" ]; then - brew update >/dev/null; - brew install llvm3${LLVM_VERSION#3.}; - fi - fi - -before_script: - - - if [ "${TRAVIS_OS_NAME}" = "linux" ]; then - export LIBCLANG_PATH=/usr/lib/llvm-${LLVM_VERSION}/lib; - elif [ "${TRAVIS_OS_NAME}" = "osx" ]; then - if [ "${LLVM_VERSION}" = "devtools" ]; then - export LIBCLANG_PATH=/Library/Developer/CommandLineTools/usr/lib; - else - export LIBCLANG_PATH=`brew --prefix llvm3${LLVM_VERSION#3.}`/lib/llvm-${LLVM_VERSION}/lib; - fi - fi - - echo $LIBCLANG_PATH +before_install: . ./ci/before_install.sh script: - - cargo build --verbose --features llvm_stable - - cargo test --features llvm_stable - - cargo build --release --verbose --features llvm_stable - - cargo test --release --features llvm_stable + - cargo build --verbose --features "$BINDGEN_FEATURES" + - cargo test --features "$BINDGEN_FEATURES" + - cargo build --release --verbose --features "$BINDGEN_FEATURES" + - cargo test --release --features "$BINDGEN_FEATURES" - git add -A - git diff @ - git diff-index --quiet HEAD - - cargo build --features "llvm_stable _docs" + - cargo build --features "$BINDGEN_FEATURES _docs" notifications: webhooks: http://build.servo.org:54856/travis diff --git a/ci/before_install.sh b/ci/before_install.sh new file mode 100644 index 0000000000..ebe4f4fb94 --- /dev/null +++ b/ci/before_install.sh @@ -0,0 +1,39 @@ +set -e +pushd ~ + +# Workaround for Travis CI macOS bug (https://github.com/travis-ci/travis-ci/issues/6307) +if [ "${TRAVIS_OS_NAME}" == "osx" ]; then + rvm get head || true +fi + +function llvm_version_triple() { + if [ "$1" == "3.8" ]; then + echo "3.8.0" + elif [ "$1" == "3.9" ]; then + echo "3.9.0" + fi +} + +function llvm_download() { + export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}` + export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-x86_64-$1 + + wget http://llvm.org/releases/${LLVM_VERSION_TRIPLE}/${LLVM}.tar.xz + mkdir llvm + tar -xf ${LLVM}.tar.xz -C llvm --strip-components=1 + + export LLVM_CONFIG_PATH=`pwd`/llvm/bin/llvm-config + if [ "${TRAVIS_OS_NAME}" == "osx" ]; then + cp llvm/lib/libclang.dylib /usr/local/lib/libclang.dylib + fi +} + + +if [ "${TRAVIS_OS_NAME}" == "linux" ]; then + llvm_download linux-gnu-ubuntu-14.04 +else + llvm_download apple-darwin +fi + +popd +set +e From 2866ab506f0bf1946e7732b0b57567508fd62d28 Mon Sep 17 00:00:00 2001 From: Jean-Philippe DUFRAIGNE Date: Sat, 5 Nov 2016 09:44:24 +0000 Subject: [PATCH 0040/2291] Speed up integration tests (move building expectations) Speed up running 'cargo test': -Before: 2'17s -After: 30s Update to use new path: Makefile, .travis.yml, CONTRIBUTING.md, tests/tests.rs Delete unused expectation that fail to compile: tests/expectations/moar_bitfields.rs tests/expectations/variadic_template_args.rs For every 'cargo test' run, the bindgen output where built. We already test that the bindgen output match expectations/*.rs, so there is no need to check it build unless the expectation is updated. Move tests/expectations/*.rs to tests/expectations/tests/*.rs and make tests/expectations a new dev-dependency package. This allow running: - cargo test -p tests_expectations In addition to the speed up, we also get a clean output for the build and test run. In particular, a number of warnings are generated that should probably be silenced, and eventually enforced modifying travis to build: - RUSTFLAGS='-D warnings' cargo test -p tests_expectations The benefit of having it as a new package is that it avoid polluting the 'cargo test' output that should focus on bindgen. --- .travis.yml | 1 + CONTRIBUTING.md | 10 +++- Cargo.toml | 3 ++ Makefile | 6 +-- tests/expectations/Cargo.toml | 11 +++++ tests/expectations/moar_bitfields.rs | 48 ------------------- tests/expectations/src/lib.rs | 0 tests/expectations/{ => tests}/accessors.rs | 0 .../{ => tests}/annotation_hide.rs | 0 tests/expectations/{ => tests}/anon_enum.rs | 0 .../{ => tests}/anon_enum_whitelist.rs | 0 tests/expectations/{ => tests}/anon_union.rs | 0 tests/expectations/{ => tests}/arg_keyword.rs | 0 .../{ => tests}/base-to-derived.rs | 0 tests/expectations/{ => tests}/blocks.rs | 0 tests/expectations/{ => tests}/class.rs | 0 .../expectations/{ => tests}/class_nested.rs | 0 .../{ => tests}/class_no_members.rs | 0 .../expectations/{ => tests}/class_static.rs | 0 .../{ => tests}/class_static_const.rs | 0 .../expectations/{ => tests}/class_use_as.rs | 0 .../{ => tests}/class_with_dtor.rs | 0 .../{ => tests}/class_with_inner_struct.rs | 0 .../{ => tests}/class_with_typedef.rs | 0 tests/expectations/{ => tests}/complex.rs | 0 .../{ => tests}/const_enum_unnamed.rs | 0 tests/expectations/{ => tests}/const_ptr.rs | 0 .../{ => tests}/const_resolved_ty.rs | 0 .../expectations/{ => tests}/const_tparam.rs | 0 tests/expectations/{ => tests}/crtp.rs | 0 .../{ => tests}/decl_extern_int_twice.rs | 0 .../{ => tests}/decl_ptr_to_array.rs | 0 .../{ => tests}/duplicated_constants_in_ns.rs | 0 tests/expectations/{ => tests}/elaborated.rs | 0 .../{ => tests}/empty_template_param_name.rs | 0 tests/expectations/{ => tests}/enum.rs | 0 tests/expectations/{ => tests}/enum_alias.rs | 0 .../{ => tests}/enum_and_vtable_mangling.rs | 0 tests/expectations/{ => tests}/enum_dupe.rs | 0 .../{ => tests}/enum_explicit_type.rs | 0 .../expectations/{ => tests}/enum_negative.rs | 0 tests/expectations/{ => tests}/enum_packed.rs | 0 tests/expectations/{ => tests}/extern.rs | 0 .../{ => tests}/forward_declared_struct.rs | 0 tests/expectations/{ => tests}/func_proto.rs | 0 tests/expectations/{ => tests}/func_ptr.rs | 0 .../{ => tests}/func_ptr_in_struct.rs | 0 .../{ => tests}/func_with_array_arg.rs | 0 .../{ => tests}/func_with_func_ptr_arg.rs | 0 .../{ => tests}/in_class_typedef.rs | 0 .../expectations/{ => tests}/inherit_named.rs | 0 .../{ => tests}/inherit_typedef.rs | 0 tests/expectations/{ => tests}/inner_const.rs | 0 .../{ => tests}/inner_template_self.rs | 0 tests/expectations/{ => tests}/int128_t.rs | 0 .../{ => tests}/jsval_layout_opaque.rs | 0 tests/expectations/{ => tests}/keywords.rs | 0 tests/expectations/{ => tests}/mutable.rs | 0 tests/expectations/{ => tests}/namespace.rs | 0 tests/expectations/{ => tests}/nested.rs | 0 .../expectations/{ => tests}/nested_vtable.rs | 0 tests/expectations/{ => tests}/no_copy.rs | 0 .../{ => tests}/nsStyleAutoArray.rs | 0 .../{ => tests}/only_bitfields.rs | 0 .../{ => tests}/opaque_in_struct.rs | 0 .../{ => tests}/opaque_pointer.rs | 0 .../{ => tests}/opaque_typedef.rs | 0 .../{ => tests}/overflowed_enum.rs | 0 tests/expectations/{ => tests}/private.rs | 0 .../expectations/{ => tests}/redeclaration.rs | 0 .../{ => tests}/ref_argument_array.rs | 0 .../{ => tests}/replace_template_alias.rs | 0 .../{ => tests}/replaces_double.rs | 0 .../{ => tests}/size_t_template.rs | 0 ...ruct_containing_forward_declared_struct.rs | 0 .../{ => tests}/struct_with_anon_struct.rs | 0 .../struct_with_anon_struct_array.rs | 0 .../struct_with_anon_struct_pointer.rs | 0 .../{ => tests}/struct_with_anon_union.rs | 0 .../struct_with_anon_unnamed_struct.rs | 0 .../struct_with_anon_unnamed_union.rs | 0 .../{ => tests}/struct_with_bitfields.rs | 0 .../{ => tests}/struct_with_derive_debug.rs | 0 .../{ => tests}/struct_with_nesting.rs | 0 .../{ => tests}/struct_with_packing.rs | 0 .../{ => tests}/struct_with_struct.rs | 0 .../struct_with_typedef_template_arg.rs | 0 tests/expectations/{ => tests}/template.rs | 0 .../{ => tests}/template_alias.rs | 0 .../{ => tests}/template_alias_basic.rs | 0 .../{ => tests}/template_alias_namespace.rs | 0 .../template_typedef_transitive_param.rs | 0 .../{ => tests}/template_typedefs.rs | 0 .../{ => tests}/type_alias_empty.rs | 0 tests/expectations/{ => tests}/typeref.rs | 0 tests/expectations/{ => tests}/union_dtor.rs | 0 .../expectations/{ => tests}/union_fields.rs | 0 .../{ => tests}/union_template.rs | 0 .../{ => tests}/union_with_anon_struct.rs | 0 .../union_with_anon_struct_bitfield.rs | 0 .../{ => tests}/union_with_anon_union.rs | 0 .../union_with_anon_unnamed_struct.rs | 0 .../union_with_anon_unnamed_union.rs | 0 .../{ => tests}/union_with_big_member.rs | 0 .../{ => tests}/union_with_nesting.rs | 0 .../expectations/{ => tests}/unknown_attr.rs | 0 tests/expectations/{ => tests}/using.rs | 0 tests/expectations/{ => tests}/vector.rs | 0 .../expectations/{ => tests}/virtual_dtor.rs | 0 .../{ => tests}/virtual_overloaded.rs | 0 .../{ => tests}/vtable_recursive_sig.rs | 0 .../{ => tests}/weird_bitfields.rs | 0 .../{ => tests}/what_is_going_on.rs | 0 .../{ => tests}/whitelist_basic.rs | 0 .../{ => tests}/whitelist_vars.rs | 0 tests/expectations/variadic_template_args.rs | 21 -------- tests/tests.rs | 5 +- tests/tools/run-bindgen.py | 11 ----- 118 files changed, 29 insertions(+), 87 deletions(-) create mode 100644 tests/expectations/Cargo.toml delete mode 100644 tests/expectations/moar_bitfields.rs create mode 100644 tests/expectations/src/lib.rs rename tests/expectations/{ => tests}/accessors.rs (100%) rename tests/expectations/{ => tests}/annotation_hide.rs (100%) rename tests/expectations/{ => tests}/anon_enum.rs (100%) rename tests/expectations/{ => tests}/anon_enum_whitelist.rs (100%) rename tests/expectations/{ => tests}/anon_union.rs (100%) rename tests/expectations/{ => tests}/arg_keyword.rs (100%) rename tests/expectations/{ => tests}/base-to-derived.rs (100%) rename tests/expectations/{ => tests}/blocks.rs (100%) rename tests/expectations/{ => tests}/class.rs (100%) rename tests/expectations/{ => tests}/class_nested.rs (100%) rename tests/expectations/{ => tests}/class_no_members.rs (100%) rename tests/expectations/{ => tests}/class_static.rs (100%) rename tests/expectations/{ => tests}/class_static_const.rs (100%) rename tests/expectations/{ => tests}/class_use_as.rs (100%) rename tests/expectations/{ => tests}/class_with_dtor.rs (100%) rename tests/expectations/{ => tests}/class_with_inner_struct.rs (100%) rename tests/expectations/{ => tests}/class_with_typedef.rs (100%) rename tests/expectations/{ => tests}/complex.rs (100%) rename tests/expectations/{ => tests}/const_enum_unnamed.rs (100%) rename tests/expectations/{ => tests}/const_ptr.rs (100%) rename tests/expectations/{ => tests}/const_resolved_ty.rs (100%) rename tests/expectations/{ => tests}/const_tparam.rs (100%) rename tests/expectations/{ => tests}/crtp.rs (100%) rename tests/expectations/{ => tests}/decl_extern_int_twice.rs (100%) rename tests/expectations/{ => tests}/decl_ptr_to_array.rs (100%) rename tests/expectations/{ => tests}/duplicated_constants_in_ns.rs (100%) rename tests/expectations/{ => tests}/elaborated.rs (100%) rename tests/expectations/{ => tests}/empty_template_param_name.rs (100%) rename tests/expectations/{ => tests}/enum.rs (100%) rename tests/expectations/{ => tests}/enum_alias.rs (100%) rename tests/expectations/{ => tests}/enum_and_vtable_mangling.rs (100%) rename tests/expectations/{ => tests}/enum_dupe.rs (100%) rename tests/expectations/{ => tests}/enum_explicit_type.rs (100%) rename tests/expectations/{ => tests}/enum_negative.rs (100%) rename tests/expectations/{ => tests}/enum_packed.rs (100%) rename tests/expectations/{ => tests}/extern.rs (100%) rename tests/expectations/{ => tests}/forward_declared_struct.rs (100%) rename tests/expectations/{ => tests}/func_proto.rs (100%) rename tests/expectations/{ => tests}/func_ptr.rs (100%) rename tests/expectations/{ => tests}/func_ptr_in_struct.rs (100%) rename tests/expectations/{ => tests}/func_with_array_arg.rs (100%) rename tests/expectations/{ => tests}/func_with_func_ptr_arg.rs (100%) rename tests/expectations/{ => tests}/in_class_typedef.rs (100%) rename tests/expectations/{ => tests}/inherit_named.rs (100%) rename tests/expectations/{ => tests}/inherit_typedef.rs (100%) rename tests/expectations/{ => tests}/inner_const.rs (100%) rename tests/expectations/{ => tests}/inner_template_self.rs (100%) rename tests/expectations/{ => tests}/int128_t.rs (100%) rename tests/expectations/{ => tests}/jsval_layout_opaque.rs (100%) rename tests/expectations/{ => tests}/keywords.rs (100%) rename tests/expectations/{ => tests}/mutable.rs (100%) rename tests/expectations/{ => tests}/namespace.rs (100%) rename tests/expectations/{ => tests}/nested.rs (100%) rename tests/expectations/{ => tests}/nested_vtable.rs (100%) rename tests/expectations/{ => tests}/no_copy.rs (100%) rename tests/expectations/{ => tests}/nsStyleAutoArray.rs (100%) rename tests/expectations/{ => tests}/only_bitfields.rs (100%) rename tests/expectations/{ => tests}/opaque_in_struct.rs (100%) rename tests/expectations/{ => tests}/opaque_pointer.rs (100%) rename tests/expectations/{ => tests}/opaque_typedef.rs (100%) rename tests/expectations/{ => tests}/overflowed_enum.rs (100%) rename tests/expectations/{ => tests}/private.rs (100%) rename tests/expectations/{ => tests}/redeclaration.rs (100%) rename tests/expectations/{ => tests}/ref_argument_array.rs (100%) rename tests/expectations/{ => tests}/replace_template_alias.rs (100%) rename tests/expectations/{ => tests}/replaces_double.rs (100%) rename tests/expectations/{ => tests}/size_t_template.rs (100%) rename tests/expectations/{ => tests}/struct_containing_forward_declared_struct.rs (100%) rename tests/expectations/{ => tests}/struct_with_anon_struct.rs (100%) rename tests/expectations/{ => tests}/struct_with_anon_struct_array.rs (100%) rename tests/expectations/{ => tests}/struct_with_anon_struct_pointer.rs (100%) rename tests/expectations/{ => tests}/struct_with_anon_union.rs (100%) rename tests/expectations/{ => tests}/struct_with_anon_unnamed_struct.rs (100%) rename tests/expectations/{ => tests}/struct_with_anon_unnamed_union.rs (100%) rename tests/expectations/{ => tests}/struct_with_bitfields.rs (100%) rename tests/expectations/{ => tests}/struct_with_derive_debug.rs (100%) rename tests/expectations/{ => tests}/struct_with_nesting.rs (100%) rename tests/expectations/{ => tests}/struct_with_packing.rs (100%) rename tests/expectations/{ => tests}/struct_with_struct.rs (100%) rename tests/expectations/{ => tests}/struct_with_typedef_template_arg.rs (100%) rename tests/expectations/{ => tests}/template.rs (100%) rename tests/expectations/{ => tests}/template_alias.rs (100%) rename tests/expectations/{ => tests}/template_alias_basic.rs (100%) rename tests/expectations/{ => tests}/template_alias_namespace.rs (100%) rename tests/expectations/{ => tests}/template_typedef_transitive_param.rs (100%) rename tests/expectations/{ => tests}/template_typedefs.rs (100%) rename tests/expectations/{ => tests}/type_alias_empty.rs (100%) rename tests/expectations/{ => tests}/typeref.rs (100%) rename tests/expectations/{ => tests}/union_dtor.rs (100%) rename tests/expectations/{ => tests}/union_fields.rs (100%) rename tests/expectations/{ => tests}/union_template.rs (100%) rename tests/expectations/{ => tests}/union_with_anon_struct.rs (100%) rename tests/expectations/{ => tests}/union_with_anon_struct_bitfield.rs (100%) rename tests/expectations/{ => tests}/union_with_anon_union.rs (100%) rename tests/expectations/{ => tests}/union_with_anon_unnamed_struct.rs (100%) rename tests/expectations/{ => tests}/union_with_anon_unnamed_union.rs (100%) rename tests/expectations/{ => tests}/union_with_big_member.rs (100%) rename tests/expectations/{ => tests}/union_with_nesting.rs (100%) rename tests/expectations/{ => tests}/unknown_attr.rs (100%) rename tests/expectations/{ => tests}/using.rs (100%) rename tests/expectations/{ => tests}/vector.rs (100%) rename tests/expectations/{ => tests}/virtual_dtor.rs (100%) rename tests/expectations/{ => tests}/virtual_overloaded.rs (100%) rename tests/expectations/{ => tests}/vtable_recursive_sig.rs (100%) rename tests/expectations/{ => tests}/weird_bitfields.rs (100%) rename tests/expectations/{ => tests}/what_is_going_on.rs (100%) rename tests/expectations/{ => tests}/whitelist_basic.rs (100%) rename tests/expectations/{ => tests}/whitelist_vars.rs (100%) delete mode 100644 tests/expectations/variadic_template_args.rs diff --git a/.travis.yml b/.travis.yml index 28ffd0d706..36bafd7ad4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,6 +33,7 @@ script: - git add -A - git diff @ - git diff-index --quiet HEAD + - cargo test -p tests_expectations - cargo build --features "$BINDGEN_FEATURES _docs" notifications: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c7e5198c9f..fb3208ff54 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,9 +49,9 @@ $ cargo build --features "llvm_stable _docs" ### Overview Input C/C++ test headers reside in the `tests/headers` directory. The expected -output rust bindings live in `tests/expectations`; for example, +output rust bindings live in `tests/expectations/tests`; for example, `tests/headers/my_header.h`'s expected generated rust bindings would be -`tests/expectations/my_header.rs`. +`tests/expectations/tests/my_header.rs`. The `tests/tools/run-bindgen.py` script runs `bindgen` on the test headers and compares the results to the expectations. @@ -96,6 +96,12 @@ specify the required features at the top of the test header in a similar manner: // bingden-features: llvm_stable ``` +Then verify the new rust bindings compile and its tests pass: + +``` +$ cargo test -p tests_expectations +``` + ## Automatic code formatting There's a `rustfmt.toml` file in the repo. Ideally changes should be consistent diff --git a/Cargo.toml b/Cargo.toml index 65a8033b8d..4e455fa9a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,5 +54,8 @@ _docs = [] name = "bindgen" path = "src/lib.rs" +[dev-dependencies.tests_expectations] +path = "tests/expectations" + [[test]] name = "tests" diff --git a/Makefile b/Makefile index 384ce323c7..90281f7b61 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ TEST_HEADERS := $(wildcard tests/headers/*.h) $(wildcard tests/headers/*.hpp) TEST_TARGETS := $(TEST_HEADERS:.h=.rs) TEST_TARGETS := $(TEST_TARGETS:.hpp=.rs) -TEST_TARGETS := $(patsubst tests/headers/%, tests/expectations/%, $(TEST_TARGETS)) +TEST_TARGETS := $(patsubst tests/headers/%, tests/expectations/tests/%, $(TEST_TARGETS)) BINDGEN := ./target/debug/bindgen @@ -25,10 +25,10 @@ clean-tests: $(RM) $(TEST_TARGETS) # TODO: Add options to add flags and whatnot -tests/expectations/%.rs: tests/headers/%.h +tests/expectations/tests/%.rs: tests/headers/%.h @mkdir -p $(dir $@) ./tests/tools/run-bindgen.py $(BINDGEN) $< $@ -tests/expectations/%.rs: tests/headers/%.hpp +tests/expectations/tests/%.rs: tests/headers/%.hpp @mkdir -p $(dir $@) ./tests/tools/run-bindgen.py $(BINDGEN) $< $@ diff --git a/tests/expectations/Cargo.toml b/tests/expectations/Cargo.toml new file mode 100644 index 0000000000..53f1b14f46 --- /dev/null +++ b/tests/expectations/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "tests_expectations" +description = "bindgen results when ran on ../headers/*" +version = "0.1.0" +authors = [ + "Jyun-Yan You ", + "Emilio Cobos Álvarez ", + "The Servo project developers", +] + +[dependencies] diff --git a/tests/expectations/moar_bitfields.rs b/tests/expectations/moar_bitfields.rs deleted file mode 100644 index 7c034120f0..0000000000 --- a/tests/expectations/moar_bitfields.rs +++ /dev/null @@ -1,48 +0,0 @@ -/* automatically generated by rust-bindgen */ - - -#![allow(non_snake_case)] - - -#[repr(u32)] -pub enum WhenToScroll { - SCROLL_ALWAYS = 0, - SCROLL_IF_NOT_VISIBLE = 1, - SCROLL_IF_NOT_FULLY_VISIBLE = 2, -} -#[repr(C)] -pub struct ScrollAxis { - pub mWhereToScroll: ::std::os::raw::c_short, - pub _bitfield_1: u16, -} -#[test] -fn bindgen_test_layout_ScrollAxis() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); -} -impl ScrollAxis { - #[inline] - pub fn mWhenToScroll(&self) -> WhenToScroll { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (255usize as u16)) >> - 0u32) as u32) - } - } - #[inline] - pub fn set_mWhenToScroll(&mut self, val: WhenToScroll) { - self._bitfield_1 &= !(255usize as u16); - self._bitfield_1 |= ((val as u32 as u16) << 0u32) & (255usize as u16); - } - #[inline] - pub fn mOnlyIfPerceivedScrollableDirection(&self) -> bool { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (256usize as u16)) >> - 8u32) as u8) - } - } - #[inline] - pub fn set_mOnlyIfPerceivedScrollableDirection(&mut self, val: bool) { - self._bitfield_1 &= !(256usize as u16); - self._bitfield_1 |= ((val as u8 as u16) << 8u32) & (256usize as u16); - } -} diff --git a/tests/expectations/src/lib.rs b/tests/expectations/src/lib.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/expectations/accessors.rs b/tests/expectations/tests/accessors.rs similarity index 100% rename from tests/expectations/accessors.rs rename to tests/expectations/tests/accessors.rs diff --git a/tests/expectations/annotation_hide.rs b/tests/expectations/tests/annotation_hide.rs similarity index 100% rename from tests/expectations/annotation_hide.rs rename to tests/expectations/tests/annotation_hide.rs diff --git a/tests/expectations/anon_enum.rs b/tests/expectations/tests/anon_enum.rs similarity index 100% rename from tests/expectations/anon_enum.rs rename to tests/expectations/tests/anon_enum.rs diff --git a/tests/expectations/anon_enum_whitelist.rs b/tests/expectations/tests/anon_enum_whitelist.rs similarity index 100% rename from tests/expectations/anon_enum_whitelist.rs rename to tests/expectations/tests/anon_enum_whitelist.rs diff --git a/tests/expectations/anon_union.rs b/tests/expectations/tests/anon_union.rs similarity index 100% rename from tests/expectations/anon_union.rs rename to tests/expectations/tests/anon_union.rs diff --git a/tests/expectations/arg_keyword.rs b/tests/expectations/tests/arg_keyword.rs similarity index 100% rename from tests/expectations/arg_keyword.rs rename to tests/expectations/tests/arg_keyword.rs diff --git a/tests/expectations/base-to-derived.rs b/tests/expectations/tests/base-to-derived.rs similarity index 100% rename from tests/expectations/base-to-derived.rs rename to tests/expectations/tests/base-to-derived.rs diff --git a/tests/expectations/blocks.rs b/tests/expectations/tests/blocks.rs similarity index 100% rename from tests/expectations/blocks.rs rename to tests/expectations/tests/blocks.rs diff --git a/tests/expectations/class.rs b/tests/expectations/tests/class.rs similarity index 100% rename from tests/expectations/class.rs rename to tests/expectations/tests/class.rs diff --git a/tests/expectations/class_nested.rs b/tests/expectations/tests/class_nested.rs similarity index 100% rename from tests/expectations/class_nested.rs rename to tests/expectations/tests/class_nested.rs diff --git a/tests/expectations/class_no_members.rs b/tests/expectations/tests/class_no_members.rs similarity index 100% rename from tests/expectations/class_no_members.rs rename to tests/expectations/tests/class_no_members.rs diff --git a/tests/expectations/class_static.rs b/tests/expectations/tests/class_static.rs similarity index 100% rename from tests/expectations/class_static.rs rename to tests/expectations/tests/class_static.rs diff --git a/tests/expectations/class_static_const.rs b/tests/expectations/tests/class_static_const.rs similarity index 100% rename from tests/expectations/class_static_const.rs rename to tests/expectations/tests/class_static_const.rs diff --git a/tests/expectations/class_use_as.rs b/tests/expectations/tests/class_use_as.rs similarity index 100% rename from tests/expectations/class_use_as.rs rename to tests/expectations/tests/class_use_as.rs diff --git a/tests/expectations/class_with_dtor.rs b/tests/expectations/tests/class_with_dtor.rs similarity index 100% rename from tests/expectations/class_with_dtor.rs rename to tests/expectations/tests/class_with_dtor.rs diff --git a/tests/expectations/class_with_inner_struct.rs b/tests/expectations/tests/class_with_inner_struct.rs similarity index 100% rename from tests/expectations/class_with_inner_struct.rs rename to tests/expectations/tests/class_with_inner_struct.rs diff --git a/tests/expectations/class_with_typedef.rs b/tests/expectations/tests/class_with_typedef.rs similarity index 100% rename from tests/expectations/class_with_typedef.rs rename to tests/expectations/tests/class_with_typedef.rs diff --git a/tests/expectations/complex.rs b/tests/expectations/tests/complex.rs similarity index 100% rename from tests/expectations/complex.rs rename to tests/expectations/tests/complex.rs diff --git a/tests/expectations/const_enum_unnamed.rs b/tests/expectations/tests/const_enum_unnamed.rs similarity index 100% rename from tests/expectations/const_enum_unnamed.rs rename to tests/expectations/tests/const_enum_unnamed.rs diff --git a/tests/expectations/const_ptr.rs b/tests/expectations/tests/const_ptr.rs similarity index 100% rename from tests/expectations/const_ptr.rs rename to tests/expectations/tests/const_ptr.rs diff --git a/tests/expectations/const_resolved_ty.rs b/tests/expectations/tests/const_resolved_ty.rs similarity index 100% rename from tests/expectations/const_resolved_ty.rs rename to tests/expectations/tests/const_resolved_ty.rs diff --git a/tests/expectations/const_tparam.rs b/tests/expectations/tests/const_tparam.rs similarity index 100% rename from tests/expectations/const_tparam.rs rename to tests/expectations/tests/const_tparam.rs diff --git a/tests/expectations/crtp.rs b/tests/expectations/tests/crtp.rs similarity index 100% rename from tests/expectations/crtp.rs rename to tests/expectations/tests/crtp.rs diff --git a/tests/expectations/decl_extern_int_twice.rs b/tests/expectations/tests/decl_extern_int_twice.rs similarity index 100% rename from tests/expectations/decl_extern_int_twice.rs rename to tests/expectations/tests/decl_extern_int_twice.rs diff --git a/tests/expectations/decl_ptr_to_array.rs b/tests/expectations/tests/decl_ptr_to_array.rs similarity index 100% rename from tests/expectations/decl_ptr_to_array.rs rename to tests/expectations/tests/decl_ptr_to_array.rs diff --git a/tests/expectations/duplicated_constants_in_ns.rs b/tests/expectations/tests/duplicated_constants_in_ns.rs similarity index 100% rename from tests/expectations/duplicated_constants_in_ns.rs rename to tests/expectations/tests/duplicated_constants_in_ns.rs diff --git a/tests/expectations/elaborated.rs b/tests/expectations/tests/elaborated.rs similarity index 100% rename from tests/expectations/elaborated.rs rename to tests/expectations/tests/elaborated.rs diff --git a/tests/expectations/empty_template_param_name.rs b/tests/expectations/tests/empty_template_param_name.rs similarity index 100% rename from tests/expectations/empty_template_param_name.rs rename to tests/expectations/tests/empty_template_param_name.rs diff --git a/tests/expectations/enum.rs b/tests/expectations/tests/enum.rs similarity index 100% rename from tests/expectations/enum.rs rename to tests/expectations/tests/enum.rs diff --git a/tests/expectations/enum_alias.rs b/tests/expectations/tests/enum_alias.rs similarity index 100% rename from tests/expectations/enum_alias.rs rename to tests/expectations/tests/enum_alias.rs diff --git a/tests/expectations/enum_and_vtable_mangling.rs b/tests/expectations/tests/enum_and_vtable_mangling.rs similarity index 100% rename from tests/expectations/enum_and_vtable_mangling.rs rename to tests/expectations/tests/enum_and_vtable_mangling.rs diff --git a/tests/expectations/enum_dupe.rs b/tests/expectations/tests/enum_dupe.rs similarity index 100% rename from tests/expectations/enum_dupe.rs rename to tests/expectations/tests/enum_dupe.rs diff --git a/tests/expectations/enum_explicit_type.rs b/tests/expectations/tests/enum_explicit_type.rs similarity index 100% rename from tests/expectations/enum_explicit_type.rs rename to tests/expectations/tests/enum_explicit_type.rs diff --git a/tests/expectations/enum_negative.rs b/tests/expectations/tests/enum_negative.rs similarity index 100% rename from tests/expectations/enum_negative.rs rename to tests/expectations/tests/enum_negative.rs diff --git a/tests/expectations/enum_packed.rs b/tests/expectations/tests/enum_packed.rs similarity index 100% rename from tests/expectations/enum_packed.rs rename to tests/expectations/tests/enum_packed.rs diff --git a/tests/expectations/extern.rs b/tests/expectations/tests/extern.rs similarity index 100% rename from tests/expectations/extern.rs rename to tests/expectations/tests/extern.rs diff --git a/tests/expectations/forward_declared_struct.rs b/tests/expectations/tests/forward_declared_struct.rs similarity index 100% rename from tests/expectations/forward_declared_struct.rs rename to tests/expectations/tests/forward_declared_struct.rs diff --git a/tests/expectations/func_proto.rs b/tests/expectations/tests/func_proto.rs similarity index 100% rename from tests/expectations/func_proto.rs rename to tests/expectations/tests/func_proto.rs diff --git a/tests/expectations/func_ptr.rs b/tests/expectations/tests/func_ptr.rs similarity index 100% rename from tests/expectations/func_ptr.rs rename to tests/expectations/tests/func_ptr.rs diff --git a/tests/expectations/func_ptr_in_struct.rs b/tests/expectations/tests/func_ptr_in_struct.rs similarity index 100% rename from tests/expectations/func_ptr_in_struct.rs rename to tests/expectations/tests/func_ptr_in_struct.rs diff --git a/tests/expectations/func_with_array_arg.rs b/tests/expectations/tests/func_with_array_arg.rs similarity index 100% rename from tests/expectations/func_with_array_arg.rs rename to tests/expectations/tests/func_with_array_arg.rs diff --git a/tests/expectations/func_with_func_ptr_arg.rs b/tests/expectations/tests/func_with_func_ptr_arg.rs similarity index 100% rename from tests/expectations/func_with_func_ptr_arg.rs rename to tests/expectations/tests/func_with_func_ptr_arg.rs diff --git a/tests/expectations/in_class_typedef.rs b/tests/expectations/tests/in_class_typedef.rs similarity index 100% rename from tests/expectations/in_class_typedef.rs rename to tests/expectations/tests/in_class_typedef.rs diff --git a/tests/expectations/inherit_named.rs b/tests/expectations/tests/inherit_named.rs similarity index 100% rename from tests/expectations/inherit_named.rs rename to tests/expectations/tests/inherit_named.rs diff --git a/tests/expectations/inherit_typedef.rs b/tests/expectations/tests/inherit_typedef.rs similarity index 100% rename from tests/expectations/inherit_typedef.rs rename to tests/expectations/tests/inherit_typedef.rs diff --git a/tests/expectations/inner_const.rs b/tests/expectations/tests/inner_const.rs similarity index 100% rename from tests/expectations/inner_const.rs rename to tests/expectations/tests/inner_const.rs diff --git a/tests/expectations/inner_template_self.rs b/tests/expectations/tests/inner_template_self.rs similarity index 100% rename from tests/expectations/inner_template_self.rs rename to tests/expectations/tests/inner_template_self.rs diff --git a/tests/expectations/int128_t.rs b/tests/expectations/tests/int128_t.rs similarity index 100% rename from tests/expectations/int128_t.rs rename to tests/expectations/tests/int128_t.rs diff --git a/tests/expectations/jsval_layout_opaque.rs b/tests/expectations/tests/jsval_layout_opaque.rs similarity index 100% rename from tests/expectations/jsval_layout_opaque.rs rename to tests/expectations/tests/jsval_layout_opaque.rs diff --git a/tests/expectations/keywords.rs b/tests/expectations/tests/keywords.rs similarity index 100% rename from tests/expectations/keywords.rs rename to tests/expectations/tests/keywords.rs diff --git a/tests/expectations/mutable.rs b/tests/expectations/tests/mutable.rs similarity index 100% rename from tests/expectations/mutable.rs rename to tests/expectations/tests/mutable.rs diff --git a/tests/expectations/namespace.rs b/tests/expectations/tests/namespace.rs similarity index 100% rename from tests/expectations/namespace.rs rename to tests/expectations/tests/namespace.rs diff --git a/tests/expectations/nested.rs b/tests/expectations/tests/nested.rs similarity index 100% rename from tests/expectations/nested.rs rename to tests/expectations/tests/nested.rs diff --git a/tests/expectations/nested_vtable.rs b/tests/expectations/tests/nested_vtable.rs similarity index 100% rename from tests/expectations/nested_vtable.rs rename to tests/expectations/tests/nested_vtable.rs diff --git a/tests/expectations/no_copy.rs b/tests/expectations/tests/no_copy.rs similarity index 100% rename from tests/expectations/no_copy.rs rename to tests/expectations/tests/no_copy.rs diff --git a/tests/expectations/nsStyleAutoArray.rs b/tests/expectations/tests/nsStyleAutoArray.rs similarity index 100% rename from tests/expectations/nsStyleAutoArray.rs rename to tests/expectations/tests/nsStyleAutoArray.rs diff --git a/tests/expectations/only_bitfields.rs b/tests/expectations/tests/only_bitfields.rs similarity index 100% rename from tests/expectations/only_bitfields.rs rename to tests/expectations/tests/only_bitfields.rs diff --git a/tests/expectations/opaque_in_struct.rs b/tests/expectations/tests/opaque_in_struct.rs similarity index 100% rename from tests/expectations/opaque_in_struct.rs rename to tests/expectations/tests/opaque_in_struct.rs diff --git a/tests/expectations/opaque_pointer.rs b/tests/expectations/tests/opaque_pointer.rs similarity index 100% rename from tests/expectations/opaque_pointer.rs rename to tests/expectations/tests/opaque_pointer.rs diff --git a/tests/expectations/opaque_typedef.rs b/tests/expectations/tests/opaque_typedef.rs similarity index 100% rename from tests/expectations/opaque_typedef.rs rename to tests/expectations/tests/opaque_typedef.rs diff --git a/tests/expectations/overflowed_enum.rs b/tests/expectations/tests/overflowed_enum.rs similarity index 100% rename from tests/expectations/overflowed_enum.rs rename to tests/expectations/tests/overflowed_enum.rs diff --git a/tests/expectations/private.rs b/tests/expectations/tests/private.rs similarity index 100% rename from tests/expectations/private.rs rename to tests/expectations/tests/private.rs diff --git a/tests/expectations/redeclaration.rs b/tests/expectations/tests/redeclaration.rs similarity index 100% rename from tests/expectations/redeclaration.rs rename to tests/expectations/tests/redeclaration.rs diff --git a/tests/expectations/ref_argument_array.rs b/tests/expectations/tests/ref_argument_array.rs similarity index 100% rename from tests/expectations/ref_argument_array.rs rename to tests/expectations/tests/ref_argument_array.rs diff --git a/tests/expectations/replace_template_alias.rs b/tests/expectations/tests/replace_template_alias.rs similarity index 100% rename from tests/expectations/replace_template_alias.rs rename to tests/expectations/tests/replace_template_alias.rs diff --git a/tests/expectations/replaces_double.rs b/tests/expectations/tests/replaces_double.rs similarity index 100% rename from tests/expectations/replaces_double.rs rename to tests/expectations/tests/replaces_double.rs diff --git a/tests/expectations/size_t_template.rs b/tests/expectations/tests/size_t_template.rs similarity index 100% rename from tests/expectations/size_t_template.rs rename to tests/expectations/tests/size_t_template.rs diff --git a/tests/expectations/struct_containing_forward_declared_struct.rs b/tests/expectations/tests/struct_containing_forward_declared_struct.rs similarity index 100% rename from tests/expectations/struct_containing_forward_declared_struct.rs rename to tests/expectations/tests/struct_containing_forward_declared_struct.rs diff --git a/tests/expectations/struct_with_anon_struct.rs b/tests/expectations/tests/struct_with_anon_struct.rs similarity index 100% rename from tests/expectations/struct_with_anon_struct.rs rename to tests/expectations/tests/struct_with_anon_struct.rs diff --git a/tests/expectations/struct_with_anon_struct_array.rs b/tests/expectations/tests/struct_with_anon_struct_array.rs similarity index 100% rename from tests/expectations/struct_with_anon_struct_array.rs rename to tests/expectations/tests/struct_with_anon_struct_array.rs diff --git a/tests/expectations/struct_with_anon_struct_pointer.rs b/tests/expectations/tests/struct_with_anon_struct_pointer.rs similarity index 100% rename from tests/expectations/struct_with_anon_struct_pointer.rs rename to tests/expectations/tests/struct_with_anon_struct_pointer.rs diff --git a/tests/expectations/struct_with_anon_union.rs b/tests/expectations/tests/struct_with_anon_union.rs similarity index 100% rename from tests/expectations/struct_with_anon_union.rs rename to tests/expectations/tests/struct_with_anon_union.rs diff --git a/tests/expectations/struct_with_anon_unnamed_struct.rs b/tests/expectations/tests/struct_with_anon_unnamed_struct.rs similarity index 100% rename from tests/expectations/struct_with_anon_unnamed_struct.rs rename to tests/expectations/tests/struct_with_anon_unnamed_struct.rs diff --git a/tests/expectations/struct_with_anon_unnamed_union.rs b/tests/expectations/tests/struct_with_anon_unnamed_union.rs similarity index 100% rename from tests/expectations/struct_with_anon_unnamed_union.rs rename to tests/expectations/tests/struct_with_anon_unnamed_union.rs diff --git a/tests/expectations/struct_with_bitfields.rs b/tests/expectations/tests/struct_with_bitfields.rs similarity index 100% rename from tests/expectations/struct_with_bitfields.rs rename to tests/expectations/tests/struct_with_bitfields.rs diff --git a/tests/expectations/struct_with_derive_debug.rs b/tests/expectations/tests/struct_with_derive_debug.rs similarity index 100% rename from tests/expectations/struct_with_derive_debug.rs rename to tests/expectations/tests/struct_with_derive_debug.rs diff --git a/tests/expectations/struct_with_nesting.rs b/tests/expectations/tests/struct_with_nesting.rs similarity index 100% rename from tests/expectations/struct_with_nesting.rs rename to tests/expectations/tests/struct_with_nesting.rs diff --git a/tests/expectations/struct_with_packing.rs b/tests/expectations/tests/struct_with_packing.rs similarity index 100% rename from tests/expectations/struct_with_packing.rs rename to tests/expectations/tests/struct_with_packing.rs diff --git a/tests/expectations/struct_with_struct.rs b/tests/expectations/tests/struct_with_struct.rs similarity index 100% rename from tests/expectations/struct_with_struct.rs rename to tests/expectations/tests/struct_with_struct.rs diff --git a/tests/expectations/struct_with_typedef_template_arg.rs b/tests/expectations/tests/struct_with_typedef_template_arg.rs similarity index 100% rename from tests/expectations/struct_with_typedef_template_arg.rs rename to tests/expectations/tests/struct_with_typedef_template_arg.rs diff --git a/tests/expectations/template.rs b/tests/expectations/tests/template.rs similarity index 100% rename from tests/expectations/template.rs rename to tests/expectations/tests/template.rs diff --git a/tests/expectations/template_alias.rs b/tests/expectations/tests/template_alias.rs similarity index 100% rename from tests/expectations/template_alias.rs rename to tests/expectations/tests/template_alias.rs diff --git a/tests/expectations/template_alias_basic.rs b/tests/expectations/tests/template_alias_basic.rs similarity index 100% rename from tests/expectations/template_alias_basic.rs rename to tests/expectations/tests/template_alias_basic.rs diff --git a/tests/expectations/template_alias_namespace.rs b/tests/expectations/tests/template_alias_namespace.rs similarity index 100% rename from tests/expectations/template_alias_namespace.rs rename to tests/expectations/tests/template_alias_namespace.rs diff --git a/tests/expectations/template_typedef_transitive_param.rs b/tests/expectations/tests/template_typedef_transitive_param.rs similarity index 100% rename from tests/expectations/template_typedef_transitive_param.rs rename to tests/expectations/tests/template_typedef_transitive_param.rs diff --git a/tests/expectations/template_typedefs.rs b/tests/expectations/tests/template_typedefs.rs similarity index 100% rename from tests/expectations/template_typedefs.rs rename to tests/expectations/tests/template_typedefs.rs diff --git a/tests/expectations/type_alias_empty.rs b/tests/expectations/tests/type_alias_empty.rs similarity index 100% rename from tests/expectations/type_alias_empty.rs rename to tests/expectations/tests/type_alias_empty.rs diff --git a/tests/expectations/typeref.rs b/tests/expectations/tests/typeref.rs similarity index 100% rename from tests/expectations/typeref.rs rename to tests/expectations/tests/typeref.rs diff --git a/tests/expectations/union_dtor.rs b/tests/expectations/tests/union_dtor.rs similarity index 100% rename from tests/expectations/union_dtor.rs rename to tests/expectations/tests/union_dtor.rs diff --git a/tests/expectations/union_fields.rs b/tests/expectations/tests/union_fields.rs similarity index 100% rename from tests/expectations/union_fields.rs rename to tests/expectations/tests/union_fields.rs diff --git a/tests/expectations/union_template.rs b/tests/expectations/tests/union_template.rs similarity index 100% rename from tests/expectations/union_template.rs rename to tests/expectations/tests/union_template.rs diff --git a/tests/expectations/union_with_anon_struct.rs b/tests/expectations/tests/union_with_anon_struct.rs similarity index 100% rename from tests/expectations/union_with_anon_struct.rs rename to tests/expectations/tests/union_with_anon_struct.rs diff --git a/tests/expectations/union_with_anon_struct_bitfield.rs b/tests/expectations/tests/union_with_anon_struct_bitfield.rs similarity index 100% rename from tests/expectations/union_with_anon_struct_bitfield.rs rename to tests/expectations/tests/union_with_anon_struct_bitfield.rs diff --git a/tests/expectations/union_with_anon_union.rs b/tests/expectations/tests/union_with_anon_union.rs similarity index 100% rename from tests/expectations/union_with_anon_union.rs rename to tests/expectations/tests/union_with_anon_union.rs diff --git a/tests/expectations/union_with_anon_unnamed_struct.rs b/tests/expectations/tests/union_with_anon_unnamed_struct.rs similarity index 100% rename from tests/expectations/union_with_anon_unnamed_struct.rs rename to tests/expectations/tests/union_with_anon_unnamed_struct.rs diff --git a/tests/expectations/union_with_anon_unnamed_union.rs b/tests/expectations/tests/union_with_anon_unnamed_union.rs similarity index 100% rename from tests/expectations/union_with_anon_unnamed_union.rs rename to tests/expectations/tests/union_with_anon_unnamed_union.rs diff --git a/tests/expectations/union_with_big_member.rs b/tests/expectations/tests/union_with_big_member.rs similarity index 100% rename from tests/expectations/union_with_big_member.rs rename to tests/expectations/tests/union_with_big_member.rs diff --git a/tests/expectations/union_with_nesting.rs b/tests/expectations/tests/union_with_nesting.rs similarity index 100% rename from tests/expectations/union_with_nesting.rs rename to tests/expectations/tests/union_with_nesting.rs diff --git a/tests/expectations/unknown_attr.rs b/tests/expectations/tests/unknown_attr.rs similarity index 100% rename from tests/expectations/unknown_attr.rs rename to tests/expectations/tests/unknown_attr.rs diff --git a/tests/expectations/using.rs b/tests/expectations/tests/using.rs similarity index 100% rename from tests/expectations/using.rs rename to tests/expectations/tests/using.rs diff --git a/tests/expectations/vector.rs b/tests/expectations/tests/vector.rs similarity index 100% rename from tests/expectations/vector.rs rename to tests/expectations/tests/vector.rs diff --git a/tests/expectations/virtual_dtor.rs b/tests/expectations/tests/virtual_dtor.rs similarity index 100% rename from tests/expectations/virtual_dtor.rs rename to tests/expectations/tests/virtual_dtor.rs diff --git a/tests/expectations/virtual_overloaded.rs b/tests/expectations/tests/virtual_overloaded.rs similarity index 100% rename from tests/expectations/virtual_overloaded.rs rename to tests/expectations/tests/virtual_overloaded.rs diff --git a/tests/expectations/vtable_recursive_sig.rs b/tests/expectations/tests/vtable_recursive_sig.rs similarity index 100% rename from tests/expectations/vtable_recursive_sig.rs rename to tests/expectations/tests/vtable_recursive_sig.rs diff --git a/tests/expectations/weird_bitfields.rs b/tests/expectations/tests/weird_bitfields.rs similarity index 100% rename from tests/expectations/weird_bitfields.rs rename to tests/expectations/tests/weird_bitfields.rs diff --git a/tests/expectations/what_is_going_on.rs b/tests/expectations/tests/what_is_going_on.rs similarity index 100% rename from tests/expectations/what_is_going_on.rs rename to tests/expectations/tests/what_is_going_on.rs diff --git a/tests/expectations/whitelist_basic.rs b/tests/expectations/tests/whitelist_basic.rs similarity index 100% rename from tests/expectations/whitelist_basic.rs rename to tests/expectations/tests/whitelist_basic.rs diff --git a/tests/expectations/whitelist_vars.rs b/tests/expectations/tests/whitelist_vars.rs similarity index 100% rename from tests/expectations/whitelist_vars.rs rename to tests/expectations/tests/whitelist_vars.rs diff --git a/tests/expectations/variadic_template_args.rs b/tests/expectations/variadic_template_args.rs deleted file mode 100644 index f0c6810651..0000000000 --- a/tests/expectations/variadic_template_args.rs +++ /dev/null @@ -1,21 +0,0 @@ -/* automatically generated by rust-bindgen */ - - -#![allow(non_snake_case)] - - -#[repr(C)] -pub struct RefPtr { - pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -#[repr(C)] -pub struct RefPtr_Proxy { - pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, - pub _phantom_1: ::std::marker::PhantomData, - pub _phantom_2: ::std::marker::PhantomData, -} -pub type RefPtr_Proxy_member_function = - *mut ::std::option::Option type-parameter-1-0>; diff --git a/tests/tests.rs b/tests/tests.rs index 4954ac6fa7..1f72fccf9d 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -24,9 +24,9 @@ fn spawn_run_bindgen(run_bindgen: P, let bindgen = bindgen.as_ref(); let header = header.as_ref(); - // Convert from "tests/headers/foo.hpp" to "tests/expectations/foo.rs" by + // Convert from "tests/headers/foo.hpp" to "tests/expectations/tests/foo.rs" by // saving the filename, popping off "headers/foo.hpp", pushing - // "expectations", pushing the saved filename, and finally modifying the + // "expectations/tests", pushing the saved filename, and finally modifying the // extension. let mut expected = PathBuf::from(header); @@ -36,6 +36,7 @@ fn spawn_run_bindgen(run_bindgen: P, expected.pop(); expected.pop(); expected.push("expectations"); + expected.push("tests"); expected.push(file_name); expected.set_extension("rs"); diff --git a/tests/tools/run-bindgen.py b/tests/tools/run-bindgen.py index 1f5f504e2b..aad210da53 100755 --- a/tests/tools/run-bindgen.py +++ b/tests/tools/run-bindgen.py @@ -130,16 +130,6 @@ def generate_bindings(bindgen, dummy_uses, flags, header, output): command.append(header) run_cmd(command, cwd=os.getcwd(), env=make_bindgen_env()) -def test_generated_bindings(bindings): - """Run the generated bindings's #[test]s.""" - name = None - # Do not delete the temp file, because we need to end the with block before - # we can run the tests. - with tempfile.NamedTemporaryFile(delete=False) as tests: - name = tests.name - run_cmd(["rustc", "--test", bindings, "-o", name]) - run_cmd([name]) - def check_actual_vs_expected(expected_bindings, rust_bindings_path): """ Check the actual generated rust bindings versus our expected generated rust @@ -177,7 +167,6 @@ def main(): test_flags, args.header, args.rust_bindings) - test_generated_bindings(args.rust_bindings) check_actual_vs_expected(expected_bindings, args.rust_bindings) sys.exit(0) From 0e6324069148845a02dee485b49fa1c86fcd307d Mon Sep 17 00:00:00 2001 From: Nikhil Shagrithaya Date: Sat, 5 Nov 2016 11:30:23 +0530 Subject: [PATCH 0041/2291] Removed template_arg_value method in clang.rs --- src/clang.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index a84eaaab43..bfe0cfd350 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -10,7 +10,7 @@ use std::ffi::{CStr, CString}; use std::fmt; use std::hash::Hash; use std::hash::Hasher; -use std::os::raw::{c_char, c_int, c_longlong, c_uint, c_ulong}; +use std::os::raw::{c_char, c_int, c_uint, c_ulong}; /// A cursor into the Clang AST, pointing to an AST node. /// @@ -453,13 +453,6 @@ impl Cursor { pub fn template_arg_kind(&self, i: c_int) -> CXTemplateArgumentKind { unsafe { clang_Cursor_getTemplateArgumentKind(self.x, i as c_uint) } } - - /// Given that this cursor's referent is a template specialization, and that - /// the `i`th template argument is an integral, get the `i`th template - /// argument value. - pub fn template_arg_value(&self, i: c_int) -> c_longlong { - unsafe { clang_Cursor_getTemplateArgumentValue(self.x, i as c_uint) } - } } extern "C" fn visit_children(cur: CXCursor, From c0ab03a132acbfd1b3f4316753b400cb58a085e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 6 Nov 2016 11:59:35 +0100 Subject: [PATCH 0042/2291] Cargo fmt --- src/ir/ty.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index be74926816..78c2d459b9 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -677,9 +677,10 @@ impl Type { // process of resolving them. CXType_MemberPointer | CXType_Pointer => { - let inner = - Item::from_ty_or_ref(ty.pointee_type().unwrap(), location, - parent_id, ctx); + let inner = Item::from_ty_or_ref(ty.pointee_type().unwrap(), + location, + parent_id, + ctx); TypeKind::Pointer(inner) } CXType_BlockPointer => TypeKind::BlockPointer, @@ -687,9 +688,10 @@ impl Type { // can even add bindings for that, so huh. CXType_RValueReference | CXType_LValueReference => { - let inner = - Item::from_ty_or_ref(ty.pointee_type().unwrap(), location, - parent_id, ctx); + let inner = Item::from_ty_or_ref(ty.pointee_type().unwrap(), + location, + parent_id, + ctx); TypeKind::Reference(inner) } // XXX DependentSizedArray is wrong From d677a00c443176c042963d7881874b1e8e475e52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 6 Nov 2016 12:02:44 +0100 Subject: [PATCH 0043/2291] bindgen: Support --use-core and --ctypes-prefix. --- src/bin/bindgen.rs | 13 +++++++++++++ src/codegen/mod.rs | 43 ++++++++++++++++++++++++++----------------- src/ir/context.rs | 16 ++++++++++++---- src/lib.rs | 20 ++++++++++++++++++++ 4 files changed, 71 insertions(+), 21 deletions(-) diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index c906efee27..1e4dea9780 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -67,6 +67,11 @@ Options: --no-unstable-rust Avoid generating unstable rust. + --use-core Use built-in types from core instead of std. + + --ctypes-prefix= Use the given prefix before the raw types + instead of ::std::os::raw::. + --opaque-type= Mark a type as opaque. --blacklist-type= Mark a type as hidden. @@ -180,6 +185,14 @@ fn parse_args_or_exit(args: Vec) -> (BindgenOptions, Box) { "--no-unstable-rust" => { options.unstable_rust = false; } + "--use-core" => { + options.use_core = true; + } + "--ctypes-prefix" => { + let prefix = iter.next() + .expect("--ctypes-prefix expects a prefix after it"); + options.ctypes_prefix = Some(prefix); + } "--emit-clang-ast" => { options.emit_ast = true; } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index e7fa62eeab..85ac13b5af 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -533,6 +533,7 @@ impl<'a> Bitfield<'a> { let setter_name = ctx.ext_cx() .ident_of(&format!("set_{}", &field_name)); let mask = ((1usize << width) - 1) << offset; + let prefix = ctx.trait_prefix(); // The transmute is unfortunate, but it's needed for enums in // bitfields. let item = quote_item!(ctx.ext_cx(), @@ -540,7 +541,7 @@ impl<'a> Bitfield<'a> { #[inline] pub fn $getter_name(&self) -> $field_type { unsafe { - ::std::mem::transmute( + ::$prefix::mem::transmute( ( (self.$field_ident & ($mask as $bitfield_type)) @@ -942,8 +943,9 @@ impl CodeGenerator for CompInfo { if !template_args_used[i] { let name = ctx.resolve_type(*ty).name().unwrap(); let ident = ctx.rust_ident(name); + let prefix = ctx.trait_prefix(); let phantom = quote_ty!(ctx.ext_cx(), - ::std::marker::PhantomData<$ident>); + ::$prefix::marker::PhantomData<$ident>); let field = StructFieldBuilder::named(format!("_phantom_{}", i)) .pub_() @@ -999,10 +1001,11 @@ impl CodeGenerator for CompInfo { let fn_name = format!("bindgen_test_layout_{}", canonical_name); let fn_name = ctx.rust_ident_raw(&fn_name); let ident = ctx.rust_ident_raw(&canonical_name); - let size_of_expr = - quote_expr!(ctx.ext_cx(), ::std::mem::size_of::<$ident>()); - let align_of_expr = - quote_expr!(ctx.ext_cx(), ::std::mem::align_of::<$ident>()); + let prefix = ctx.trait_prefix(); + let size_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::size_of::<$ident>()); + let align_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::align_of::<$ident>()); let size = layout.size; let align = layout.align; let item = quote_item!(ctx.ext_cx(), @@ -1414,7 +1417,13 @@ impl ItemToRustTy for Item { fn raw_type(ctx: &BindgenContext, name: &str) -> P { let ident = ctx.rust_ident_raw(&name); - quote_ty!(ctx.ext_cx(), ::std::os::raw::$ident) + match ctx.options().ctypes_prefix { + Some(ref prefix) => { + let prefix = ctx.rust_ident_raw(prefix); + quote_ty!(ctx.ext_cx(), $prefix::$ident) + } + None => quote_ty!(ctx.ext_cx(), ::std::os::raw::$ident), + } } impl ToRustTy for Type { @@ -1430,9 +1439,7 @@ impl ToRustTy for Type { TypeKind::Void => raw!(c_void), // TODO: we should do something smart with nullptr, or maybe *const // c_void is enough? - TypeKind::NullPtr => { - quote_ty!(ctx.ext_cx(), *const ::std::os::raw::c_void) - } + TypeKind::NullPtr => raw!(c_void).to_ptr(true, ctx.span()), TypeKind::Int(ik) => { match ik { IntKind::Bool => aster::ty::TyBuilder::new().bool(), @@ -1755,10 +1762,12 @@ mod utils { pub fn prepend_union_types(ctx: &BindgenContext, result: &mut Vec>) { + let prefix = ctx.trait_prefix(); let union_field_decl = quote_item!(ctx.ext_cx(), #[derive(Debug)] #[repr(C)] - pub struct __BindgenUnionField(::std::marker::PhantomData); + pub struct __BindgenUnionField( + ::$prefix::marker::PhantomData); ) .unwrap(); @@ -1766,24 +1775,24 @@ mod utils { impl __BindgenUnionField { #[inline] pub fn new() -> Self { - __BindgenUnionField(::std::marker::PhantomData) + __BindgenUnionField(::$prefix::marker::PhantomData) } #[inline] pub unsafe fn as_ref(&self) -> &T { - ::std::mem::transmute(self) + ::$prefix::mem::transmute(self) } #[inline] pub unsafe fn as_mut(&mut self) -> &mut T { - ::std::mem::transmute(self) + ::$prefix::mem::transmute(self) } } ) .unwrap(); let union_field_default_impl = quote_item!(&ctx.ext_cx(), - impl ::std::default::Default for __BindgenUnionField { + impl ::$prefix::default::Default for __BindgenUnionField { #[inline] fn default() -> Self { Self::new() @@ -1793,7 +1802,7 @@ mod utils { .unwrap(); let union_field_clone_impl = quote_item!(&ctx.ext_cx(), - impl ::std::clone::Clone for __BindgenUnionField { + impl ::$prefix::clone::Clone for __BindgenUnionField { #[inline] fn clone(&self) -> Self { Self::new() @@ -1803,7 +1812,7 @@ mod utils { .unwrap(); let union_field_copy_impl = quote_item!(&ctx.ext_cx(), - impl ::std::marker::Copy for __BindgenUnionField {} + impl ::$prefix::marker::Copy for __BindgenUnionField {} ) .unwrap(); diff --git a/src/ir/context.rs b/src/ir/context.rs index fc06375cc4..f11b387a09 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -221,7 +221,7 @@ impl<'ctx> BindgenContext<'ctx> { /// Mangles a name so it doesn't conflict with any keyword. pub fn rust_mangle<'a>(&self, name: &'a str) -> Cow<'a, str> { use syntax::parse::token; - let ident = self.rust_ident_raw(&name); + let ident = self.rust_ident_raw(name); let token = token::Ident(ident); if token.is_any_keyword() || name.contains("@") || name.contains("?") || name.contains("$") || @@ -242,9 +242,7 @@ impl<'ctx> BindgenContext<'ctx> { } /// Returns a mangled name as a rust identifier. - pub fn rust_ident_raw(&self, name: &S) -> Ident - where S: Borrow, - { + pub fn rust_ident_raw(&self, name: &str) -> Ident { self.ext_cx().ident_of(name.borrow()) } @@ -912,6 +910,16 @@ impl<'ctx> BindgenContext<'ctx> { to_iterate: to_iterate, } } + + /// Convenient method for getting the prefix to use for most traits in + /// codegen depending on the `use_core` option. + pub fn trait_prefix(&self) -> Ident { + if self.options().use_core { + self.rust_ident_raw("core") + } else { + self.rust_ident_raw("std") + } + } } /// An iterator over whitelisted items. diff --git a/src/lib.rs b/src/lib.rs index a0eba4c088..a174d8e3ce 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -210,6 +210,18 @@ impl Builder { self } + /// Use core instead of libstd in the generated bindings. + pub fn use_core(mut self) -> Builder { + self.options.use_core = true; + self + } + + /// Use the given prefix for the raw types instead of `::std::os::raw`. + pub fn ctypes_prefix>(mut self, prefix: T) -> Builder { + self.options.ctypes_prefix = Some(prefix.into()); + self + } + /// Generate the Rust bindings using the options built up thus far. pub fn generate<'ctx>(self) -> Result, ()> { Bindings::generate(self.options, None) @@ -273,6 +285,12 @@ pub struct BindgenOptions { /// cannot. pub unstable_rust: bool, + /// True if we should avoid using libstd to use libcore instead. + pub use_core: bool, + + /// An optional prefix for the "raw" types, like `c_int`, `c_void`... + pub ctypes_prefix: Option, + /// True if we should generate constant names that are **directly** under /// namespaces. pub namespaced_constants: bool, @@ -310,6 +328,8 @@ impl Default for BindgenOptions { derive_debug: true, enable_cxx_namespaces: false, unstable_rust: true, + use_core: false, + ctypes_prefix: None, namespaced_constants: true, msvc_mangling: false, raw_lines: vec![], From 264b847383a51afc30a77d4caa0ae0ab42f3dae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 6 Nov 2016 12:25:56 +0100 Subject: [PATCH 0044/2291] bin: Remove unused import. --- src/bin/bindgen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index 1e4dea9780..60632f4368 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -8,7 +8,7 @@ extern crate log; extern crate clang_sys; extern crate rustc_serialize; -use bindgen::{BindgenOptions, Bindings, ClangVersion, LinkType, clang_version}; +use bindgen::{BindgenOptions, Bindings, LinkType, clang_version}; use std::default::Default; use std::env; use std::fs; From 2b77970303764ce1bfb14f29058bde3f5cd635cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 6 Nov 2016 12:43:45 +0100 Subject: [PATCH 0045/2291] Test for --use-core. --- tests/expectations/tests/use-core.rs | 22 ++++++++++++++++++++++ tests/headers/use-core.h | 6 ++++++ tests/tools/run-bindgen.py | 3 ++- 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/tests/use-core.rs create mode 100644 tests/headers/use-core.h diff --git a/tests/expectations/tests/use-core.rs b/tests/expectations/tests/use-core.rs new file mode 100644 index 0000000000..484105eaf6 --- /dev/null +++ b/tests/expectations/tests/use-core.rs @@ -0,0 +1,22 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +extern crate core; + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct foo { + pub a: ::std::os::raw::c_int, + pub b: ::std::os::raw::c_int, + pub bar: *mut ::std::os::raw::c_void, +} +#[test] +fn bindgen_test_layout_foo() { + assert_eq!(::core::mem::size_of::() , 16usize); + assert_eq!(::core::mem::align_of::() , 8usize); +} +impl Clone for foo { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/use-core.h b/tests/headers/use-core.h new file mode 100644 index 0000000000..535d2b1529 --- /dev/null +++ b/tests/headers/use-core.h @@ -0,0 +1,6 @@ +// bindgen-flags: --use-core --raw-line "extern crate core;" + +struct foo { + int a, b; + void* bar; +}; diff --git a/tests/tools/run-bindgen.py b/tests/tools/run-bindgen.py index aad210da53..519e6891af 100755 --- a/tests/tools/run-bindgen.py +++ b/tests/tools/run-bindgen.py @@ -8,6 +8,7 @@ import sys import subprocess import tempfile +import shlex BINDGEN_FLAGS_PREFIX = "// bindgen-flags: " @@ -94,7 +95,7 @@ def get_bindgen_flags(header_path): with open(header_path) as f: for line in f: if line.startswith(BINDGEN_FLAGS_PREFIX): - flags.extend(line.strip().split(BINDGEN_FLAGS_PREFIX)[1].split(" ")) + flags.extend(shlex.split(line.strip().split(BINDGEN_FLAGS_PREFIX)[1])) break return flags From 6611276ee1f49998af7c31d18640f24c37788e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 6 Nov 2016 12:51:55 +0100 Subject: [PATCH 0046/2291] Test for ctypes-prefix, and use-core without libstd. --- tests/expectations/tests/no-std.rs | 23 +++++++++++++++++++++++ tests/headers/no-std.h | 5 +++++ 2 files changed, 28 insertions(+) create mode 100644 tests/expectations/tests/no-std.rs create mode 100644 tests/headers/no-std.h diff --git a/tests/expectations/tests/no-std.rs b/tests/expectations/tests/no-std.rs new file mode 100644 index 0000000000..f50a889d4c --- /dev/null +++ b/tests/expectations/tests/no-std.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#![no_std] +mod libc { pub type c_int = i32; pub enum c_void {} } + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct foo { + pub a: libc::c_int, + pub b: libc::c_int, + pub bar: *mut libc::c_void, +} +#[test] +fn bindgen_test_layout_foo() { + assert_eq!(::core::mem::size_of::() , 16usize); + assert_eq!(::core::mem::align_of::() , 8usize); +} +impl Clone for foo { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/no-std.h b/tests/headers/no-std.h new file mode 100644 index 0000000000..7bee9657f8 --- /dev/null +++ b/tests/headers/no-std.h @@ -0,0 +1,5 @@ +// bindgen-flags: --ctypes-prefix "libc" --use-core --raw-line "#![no_std]" --raw-line "mod libc { pub type c_int = i32; pub enum c_void {} }" +struct foo { + int a, b; + void* bar; +}; From 58cf53e1e5eb6a28c6a092faaad9a057ba0a2c1c Mon Sep 17 00:00:00 2001 From: "J. Cliff Dyer" Date: Sat, 5 Nov 2016 16:40:58 -0400 Subject: [PATCH 0047/2291] Remove unused template_arg_kind function. --- src/clang.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index bfe0cfd350..5a2421f3f9 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -444,15 +444,6 @@ impl Cursor { pub fn is_virtual_base(&self) -> bool { unsafe { clang_isVirtualBase(self.x) != 0 } } - - /// Given that this cursor's referent is a template specialization or - /// declaration, get the `i`th template argument kind. - /// - /// If the referent is not a template or `i` is out of bounds, an invalid - /// kind is returned. - pub fn template_arg_kind(&self, i: c_int) -> CXTemplateArgumentKind { - unsafe { clang_Cursor_getTemplateArgumentKind(self.x, i as c_uint) } - } } extern "C" fn visit_children(cur: CXCursor, From 15d1881e071278cc65acd202284943a6f5ce4543 Mon Sep 17 00:00:00 2001 From: "J. Cliff Dyer" Date: Sun, 6 Nov 2016 11:56:46 -0500 Subject: [PATCH 0048/2291] Wrap enum_val_signed in an Option. Also reorganize calling function to avoid duplicate checking of cursor type. Fixes #127 --- src/clang.rs | 14 +++++++++----- src/ir/enum_ty.rs | 16 ++++++++++------ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 5a2421f3f9..0bfd78ef0e 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -349,11 +349,15 @@ impl Cursor { /// Get the signed constant value for this cursor's enum variant referent. /// - /// Returns `LLONG_MIN` if the cursor's referent is not an enum variant, - /// which is also a valid enum value, so callers should check the cursor - /// kind before calling this method (see issue #127). - pub fn enum_val_signed(&self) -> i64 { - unsafe { clang_getEnumConstantDeclValue(self.x) as i64 } + /// Returns None if the cursor's referent is not an enum variant. + pub fn enum_val_signed(&self) -> Option { + unsafe { + if self.kind() == CXCursor_EnumConstantDecl { + Some(clang_getEnumConstantDeclValue(self.x) as i64) + } else { + None + } + } } /// Get the unsigned constant value for this cursor's enum variant referent. diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index e78184e7c5..fb7b2018ab 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -71,14 +71,18 @@ impl Enum { }; declaration.visit(|cursor| { - if cursor.kind() == CXCursor_EnumConstantDecl { + let val = if is_signed { + cursor.enum_val_signed().map(EnumVariantValue::Signed) + } else { + if cursor.kind() == CXCursor_EnumConstantDecl { + Some(EnumVariantValue::Unsigned(cursor.enum_val_unsigned())) + } else { + None + } + }; + if let Some(val) = val { let name = cursor.spelling(); let comment = cursor.raw_comment(); - let val = if is_signed { - EnumVariantValue::Signed(cursor.enum_val_signed()) - } else { - EnumVariantValue::Unsigned(cursor.enum_val_unsigned()) - }; variants.push(EnumVariant::new(name, comment, val)); } CXChildVisit_Continue From fda05481d98a86254168a850d8be4d23a9c7c51a Mon Sep 17 00:00:00 2001 From: "J. Cliff Dyer" Date: Sun, 6 Nov 2016 16:51:25 -0500 Subject: [PATCH 0049/2291] Restore outer conditional. --- src/ir/enum_ty.rs | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index fb7b2018ab..1bcd5b149c 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -71,23 +71,20 @@ impl Enum { }; declaration.visit(|cursor| { - let val = if is_signed { - cursor.enum_val_signed().map(EnumVariantValue::Signed) - } else { - if cursor.kind() == CXCursor_EnumConstantDecl { - Some(EnumVariantValue::Unsigned(cursor.enum_val_unsigned())) + if cursor.kind() == CXCursor_EnumConstantDecl { + let value = if is_signed { + cursor.enum_val_signed().map(EnumVariantValue::Signed) } else { - None + Some(EnumVariantValue::Unsigned(cursor.enum_val_unsigned())) + }; + if let Some(val) = value { + let name = cursor.spelling(); + let comment = cursor.raw_comment(); + variants.push(EnumVariant::new(name, comment, val)); } - }; - if let Some(val) = val { - let name = cursor.spelling(); - let comment = cursor.raw_comment(); - variants.push(EnumVariant::new(name, comment, val)); } CXChildVisit_Continue }); - Ok(Enum::new(repr, variants)) } } From bfc02909c399f646987f025abf8bce770cf3d581 Mon Sep 17 00:00:00 2001 From: Malisa Smith Date: Sun, 30 Oct 2016 14:05:37 -0700 Subject: [PATCH 0050/2291] make fallible_semantic_parent do ffi call and validation --- src/clang.rs | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 0bfd78ef0e..3ea4ad2fdf 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -101,7 +101,9 @@ impl Cursor { /// See documentation for `lexical_parent` for details on semantic vs /// lexical parents. pub fn fallible_semantic_parent(&self) -> Option { - let sp = self.semantic_parent(); + let sp = unsafe { + Cursor { x: clang_getCursorSemanticParent(self.x) } + }; if sp == *self || !sp.is_valid() { return None; } @@ -113,11 +115,7 @@ impl Cursor { /// See documentation for `lexical_parent` for details on semantic vs /// lexical parents. pub fn semantic_parent(&self) -> Cursor { - unsafe { - Cursor { - x: clang_getCursorSemanticParent(self.x), - } - } + self.fallible_semantic_parent().unwrap() } /// Return the number of template arguments used by this cursor's referent, @@ -157,17 +155,18 @@ impl Cursor { /// Is the referent a top level construct? pub fn is_toplevel(&self) -> bool { - let mut semantic_parent = self.semantic_parent(); + let mut semantic_parent = self.fallible_semantic_parent(); - while semantic_parent.kind() == CXCursor_Namespace || - semantic_parent.kind() == CXCursor_NamespaceAlias || - semantic_parent.kind() == CXCursor_NamespaceRef { - semantic_parent = semantic_parent.semantic_parent(); + while semantic_parent.is_some() && + (semantic_parent.unwrap().kind() == CXCursor_Namespace || + semantic_parent.unwrap().kind() == CXCursor_NamespaceAlias || + semantic_parent.unwrap().kind() == CXCursor_NamespaceRef) { + semantic_parent = semantic_parent.unwrap().fallible_semantic_parent(); } let tu = self.translation_unit(); - // Yes, the second can happen with, e.g., macro definitions. - semantic_parent == tu || semantic_parent == tu.semantic_parent() + // Yes, this can happen with, e.g., macro definitions. + semantic_parent == tu.fallible_semantic_parent() } /// Get the kind of referent this cursor is pointing to. From feb6f673d3261fc249032a7fe281ea7b4135a8f9 Mon Sep 17 00:00:00 2001 From: Andrew Fluth Date: Mon, 7 Nov 2016 06:54:34 -0600 Subject: [PATCH 0051/2291] Wrap enum_val_unsigned in an Option --- src/clang.rs | 14 +++++++++----- src/ir/enum_ty.rs | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 0bfd78ef0e..a11e2924ed 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -362,11 +362,15 @@ impl Cursor { /// Get the unsigned constant value for this cursor's enum variant referent. /// - /// Returns `ULLONG_MAX` if the cursor's referent is not an enum variant, - /// which is also a valid enum value, so callers should check the cursor - /// kind before calling this method (see issue #128). - pub fn enum_val_unsigned(&self) -> u64 { - unsafe { clang_getEnumConstantDeclUnsignedValue(self.x) as u64 } + /// Returns None if the cursor's referent is not an enum variant. + pub fn enum_val_unsigned(&self) -> Option { + unsafe { + if self.kind() == CXCursor_EnumConstantDecl { + Some(clang_getEnumConstantDeclUnsignedValue(self.x) as u64) + } else { + None + } + } } /// Given that this cursor's referent is a `typedef`, get the `Type` that is diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index 1bcd5b149c..8efd9e3be1 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -75,7 +75,7 @@ impl Enum { let value = if is_signed { cursor.enum_val_signed().map(EnumVariantValue::Signed) } else { - Some(EnumVariantValue::Unsigned(cursor.enum_val_unsigned())) + cursor.enum_val_unsigned().map(EnumVariantValue::Unsigned) }; if let Some(val) = value { let name = cursor.spelling(); From cc82b839b164f38513dcdcc93a63d654c82ca80c Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 7 Nov 2016 13:43:34 -0800 Subject: [PATCH 0052/2291] Useful little helpers for Item and Type --- src/ir/item.rs | 11 +++++++++++ src/ir/ty.rs | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/src/ir/item.rs b/src/ir/item.rs index a07ee1f36f..c6d80a0833 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -331,6 +331,12 @@ impl Item { self.kind().expect_type() } + /// Get a reference to this item's underlying `Type`, or `None` if this is + /// some other kind of item. + pub fn as_type(&self) -> Option<&Type> { + self.kind().as_type() + } + /// Get a reference to this item's underlying `Function`. Panic if this is /// some other kind of item. pub fn expect_function(&self) -> &Function { @@ -531,6 +537,11 @@ impl Item { ctx.opaque_by_name(&self.real_canonical_name(ctx, false, true)) } + /// Is this a reference to another type? + pub fn is_type_ref(&self) -> bool { + self.as_type().map_or(false, |ty| ty.is_type_ref()) + } + /// Get the canonical name without taking into account the replaces /// annotation. /// diff --git a/src/ir/ty.rs b/src/ir/ty.rs index be74926816..2c1e5f8efa 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -136,6 +136,15 @@ impl Type { self.is_const } + /// Is this a reference to another type? + pub fn is_type_ref(&self) -> bool { + match self.kind { + TypeKind::ResolvedTypeRef(_) | + TypeKind::UnresolvedTypeRef(_, _, _) => true, + _ => false, + } + } + /// What is the layout of this type? pub fn layout(&self, ctx: &BindgenContext) -> Option { use std::mem; From 4d45f83d1ed0c768795080cd0af87f5d06089da0 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 7 Nov 2016 14:09:40 -0800 Subject: [PATCH 0053/2291] Add `clang::Type::is_valid` A helper for checking if the type's kind is not `CXType_Invalid`. --- src/clang.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/clang.rs b/src/clang.rs index a11e2924ed..b250e5487a 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -715,6 +715,11 @@ impl Type { } } } + + /// Is this a valid type? + pub fn is_valid(&self) -> bool { + self.kind() != CXType_Invalid + } } /// An iterator for a type's template arguments. From 1091a4274eb5c91b6279905688759105ab95bfb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 6 Nov 2016 20:52:01 +0100 Subject: [PATCH 0054/2291] Add an option to avoid converting to f32/f64 automatically float types. --- src/bin/bindgen.rs | 5 +++++ src/codegen/mod.rs | 25 ++++++++++++++++------ src/lib.rs | 10 +++++++++ tests/expectations/tests/convert-floats.rs | 22 +++++++++++++++++++ tests/headers/convert-floats.h | 7 ++++++ 5 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 tests/expectations/tests/convert-floats.rs create mode 100644 tests/headers/convert-floats.h diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index c906efee27..0c3d97cf8e 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -63,6 +63,8 @@ Options: --use-msvc-mangling Handle MSVC C++ ABI mangling; requires that target be set to (i686|x86_64)-pc-win32 + --no-convert-floats Don't convert floats automatically to f32/f64. + --raw-line= Add a raw line at the beginning of the output. --no-unstable-rust Avoid generating unstable rust. @@ -183,6 +185,9 @@ fn parse_args_or_exit(args: Vec) -> (BindgenOptions, Box) { "--emit-clang-ast" => { options.emit_ast = true; } + "--no-convert-floats" => { + options.convert_floats = false; + } "--use-msvc-mangling" => { options.msvc_mangling = true; } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index e7fa62eeab..7d470be4f2 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1458,12 +1458,25 @@ impl ToRustTy for Type { } TypeKind::Float(fk) => { use ir::ty::FloatKind; - // TODO: we probably should just take the type layout into - // account? - match fk { - FloatKind::Float => aster::ty::TyBuilder::new().f32(), - FloatKind::Double | FloatKind::LongDouble => { - aster::ty::TyBuilder::new().f64() + if ctx.options().convert_floats { + // TODO: we probably should just take the type layout into + // account? + // + // Also, maybe this one shouldn't be the default? + match fk { + FloatKind::Float => aster::ty::TyBuilder::new().f32(), + FloatKind::Double | FloatKind::LongDouble => { + aster::ty::TyBuilder::new().f64() + } + } + } else { + // FIXME: `c_longdouble` doesn't seem to be defined in some + // systems, so we use `c_double` directly. + match fk { + FloatKind::Float => raw!(c_float), + FloatKind::Double | FloatKind::LongDouble => { + raw!(c_double) + } } } } diff --git a/src/lib.rs b/src/lib.rs index a0eba4c088..8d2ff7ad21 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -204,6 +204,12 @@ impl Builder { self } + /// Avoid converting floats to f32/f64 by default. + pub fn no_convert_floats(mut self) -> Self { + self.options.convert_floats = false; + self + } + /// Avoid generating any unstable Rust in the generated bindings. pub fn no_unstable_rust(mut self) -> Builder { self.options.unstable_rust = false; @@ -280,6 +286,9 @@ pub struct BindgenOptions { /// True if we should use MSVC name mangling rules. pub msvc_mangling: bool, + /// Whether we should convert float types to f32/f64 types. + pub convert_floats: bool, + /// The set of raw lines to prepend to the generated Rust code. pub raw_lines: Vec, @@ -312,6 +321,7 @@ impl Default for BindgenOptions { unstable_rust: true, namespaced_constants: true, msvc_mangling: false, + convert_floats: true, raw_lines: vec![], clang_args: vec![], input_header: None, diff --git a/tests/expectations/tests/convert-floats.rs b/tests/expectations/tests/convert-floats.rs new file mode 100644 index 0000000000..ed5bcdcdee --- /dev/null +++ b/tests/expectations/tests/convert-floats.rs @@ -0,0 +1,22 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct foo { + pub bar: ::std::os::raw::c_float, + pub baz: ::std::os::raw::c_float, + pub bazz: ::std::os::raw::c_double, + pub bazzz: *mut ::std::os::raw::c_double, +} +#[test] +fn bindgen_test_layout_foo() { + assert_eq!(::std::mem::size_of::() , 24usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for foo { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/convert-floats.h b/tests/headers/convert-floats.h new file mode 100644 index 0000000000..0e0ebd3389 --- /dev/null +++ b/tests/headers/convert-floats.h @@ -0,0 +1,7 @@ +// bindgen-flags: --no-convert-floats + +struct foo { + float bar, baz; + double bazz; + long double* bazzz; +}; From d5ee20c9e566db5fc8141a43f886c03377c4389e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 7 Nov 2016 14:14:33 -0800 Subject: [PATCH 0055/2291] Use `clang::Type::is_valid` instead of checking self.kind() against CXType_Invalid --- src/clang.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index b250e5487a..d9fbd7b86d 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -640,7 +640,7 @@ impl Type { let ret = Type { x: unsafe { clang_getPointeeType(self.x) }, }; - debug_assert!(ret.kind() != CXType_Invalid); + debug_assert!(ret.is_valid()); Some(ret) } _ => None, @@ -653,7 +653,7 @@ impl Type { let current_type = Type { x: unsafe { clang_getElementType(self.x) }, }; - if current_type.kind() != CXType_Invalid { + if current_type.is_valid() { Some(current_type) } else { None @@ -692,10 +692,10 @@ impl Type { let rt = Type { x: unsafe { clang_getResultType(self.x) }, }; - if rt.kind() == CXType_Invalid { - None - } else { + if rt.is_valid() { Some(rt) + } else { + None } } From 6645bbc660ad573da8edee574b1cdae9a92691dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 8 Nov 2016 14:29:42 +0100 Subject: [PATCH 0056/2291] Fix --use-core for functions, since we used the aster helper. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Emilio Cobos Álvarez --- src/codegen/mod.rs | 3 ++- tests/expectations/tests/use-core.rs | 2 ++ tests/headers/use-core.h | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index bf6af82b9d..7fa8b19c1e 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1489,7 +1489,8 @@ impl ToRustTy for Type { } TypeKind::Function(ref fs) => { let ty = fs.to_rust_ty(ctx, item); - aster::AstBuilder::new().ty().option().build(ty) + let prefix = ctx.trait_prefix(); + quote_ty!(ctx.ext_cx(), ::$prefix::option::Option<$ty>) } TypeKind::Array(item, len) => { let inner = item.to_rust_ty(ctx); diff --git a/tests/expectations/tests/use-core.rs b/tests/expectations/tests/use-core.rs index 484105eaf6..b0900f5fa6 100644 --- a/tests/expectations/tests/use-core.rs +++ b/tests/expectations/tests/use-core.rs @@ -20,3 +20,5 @@ fn bindgen_test_layout_foo() { impl Clone for foo { fn clone(&self) -> Self { *self } } +pub type fooFunction = + ::core::option::Option; diff --git a/tests/headers/use-core.h b/tests/headers/use-core.h index 535d2b1529..42bb10d9d1 100644 --- a/tests/headers/use-core.h +++ b/tests/headers/use-core.h @@ -4,3 +4,5 @@ struct foo { int a, b; void* bar; }; + +typedef void (*fooFunction)(int bar); From 18ce3006a87b745fd52a1ce5b2bf7de2b5e2b4ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 8 Nov 2016 07:31:53 +0100 Subject: [PATCH 0057/2291] Add an option to generate bitfield-like typesafe enums. --- src/bin/bindgen.rs | 10 ++++ src/codegen/mod.rs | 145 ++++++++++++++++++++++++++++++++++++++------- src/lib.rs | 13 ++++ 3 files changed, 146 insertions(+), 22 deletions(-) diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index 2dbb1690d1..b9e56b08dc 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -28,6 +28,7 @@ Usage: [--whitelist-type=...] \ [--whitelist-function=...] \ [--whitelist-var=...] \ + [--bitfield-enum=...] \ \ [-- ...] @@ -91,6 +92,10 @@ Options: matching . Same behavior on emptyness than the type whitelisting. + --bitfield-enum= Mark a bitfield as being used as an enum. + This makes bindgen don't generate a rust enum + for it, but a bitfield-like wrapper. + --dummy-uses= For testing purposes, generate a C/C++ file containing dummy uses of all types defined in the input header. @@ -163,6 +168,11 @@ fn parse_args_or_exit(args: Vec) -> (BindgenOptions, Box) { .expect("--whitelist-var expects a pattern"); options.whitelisted_vars.insert(&var_pat); } + "--bitfield-enum" => { + let enum_pat = iter.next() + .expect("--bitfield-enum expects a pattern"); + options.bitfield_enums.insert(&enum_pat); + } "--" => { while let Some(clang_arg) = iter.next() { options.clang_args.push(clang_arg); diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 7fa8b19c1e..02051f270a 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1224,6 +1224,79 @@ impl MethodCodegen for Method { } } +enum EnumBuilder<'a> { + Rust(aster::item::ItemEnumBuilder), + Bitfield { + canonical_name: &'a str, + aster: P, + }, +} + +impl<'a> EnumBuilder<'a> { + fn new(aster: aster::item::ItemBuilder, + name: &'a str, + repr_name: &str, + is_rust: bool) + -> Self { + if is_rust { + EnumBuilder::Rust(aster.enum_(name)) + } else { + EnumBuilder::Bitfield { + canonical_name: name, + aster: aster.tuple_struct(name) + .field() + .pub_() + .ty() + .id(repr_name) + .build(), + } + } + } + + fn with_variant_(self, + ctx: &BindgenContext, + name: &str, + expr: P, + rust_ty: P, + result: &mut CodegenResult) + -> Self { + match self { + EnumBuilder::Rust(b) => { + EnumBuilder::Rust(b.with_variant_(ast::Variant_ { + name: ctx.rust_ident(name), + attrs: vec![], + data: ast::VariantData::Unit(ast::DUMMY_NODE_ID), + disr_expr: Some(expr), + })) + } + EnumBuilder::Bitfield { canonical_name, .. } => { + // FIXME: Probably if unnamed we should be smarter! Easy to + // improve. + let constant_name = format!("{}_{}", canonical_name, name); + let constant = aster::AstBuilder::new() + .item() + .const_(constant_name) + .expr() + .call() + .id(canonical_name) + .arg() + .build(expr) + .build() + .build(rust_ty); + result.push(constant); + self + } + } + } + + fn build(self) -> P { + match self { + EnumBuilder::Rust(b) => b.build(), + EnumBuilder::Bitfield { aster, .. } => aster, + } + } +} + impl CodeGenerator for Enum { type Extra = Item; @@ -1234,7 +1307,8 @@ impl CodeGenerator for Enum { use ir::enum_ty::EnumVariantValue; let name = item.canonical_name(ctx); - let layout = item.expect_type().layout(ctx); + let enum_ty = item.expect_type(); + let layout = enum_ty.layout(ctx); let repr = self.repr().map(|repr| ctx.resolve_type(repr)); let repr = match repr { @@ -1270,10 +1344,24 @@ impl CodeGenerator for Enum { let mut builder = aster::AstBuilder::new().item().pub_(); + let is_bitfield = { + ctx.options().bitfield_enums.matches(&name) || + (enum_ty.name().is_none() && + self.variants() + .iter() + .any(|v| ctx.options().bitfield_enums.matches(&v.name()))) + }; + + let is_rust_enum = !is_bitfield; + // FIXME: Rust forbids repr with empty enums. Remove this condition when // this is allowed. - if !self.variants().is_empty() { - builder = builder.with_attr(attributes::repr(repr_name)); + if is_rust_enum { + if !self.variants().is_empty() { + builder = builder.with_attr(attributes::repr(repr_name)); + } + } else { + builder = builder.with_attr(attributes::repr("C")); } if let Some(comment) = item.comment() { @@ -1289,8 +1377,6 @@ impl CodeGenerator for Enum { builder = builder.with_attr(derives); - let mut builder = builder.enum_(&name); - fn add_constant(enum_: &Type, // Only to avoid recomputing every time. enum_canonical_name: &str, @@ -1321,21 +1407,38 @@ impl CodeGenerator for Enum { // Used to mangle the constants we generate in the unnamed-enum case. let mut parent_canonical_name = None; + let mut builder = + EnumBuilder::new(builder, &name, repr_name, is_rust_enum); + // A map where we keep a value -> variant relation. let mut seen_values = HashMap::<_, String>::new(); - let enum_ty = item.expect_type(); let enum_rust_ty = item.to_rust_ty(ctx); for variant in self.variants().iter() { match seen_values.entry(variant.val()) { Entry::Occupied(ref entry) => { - let existing_variant_name = entry.get(); - let variant_name = ctx.rust_mangle(variant.name()); - add_constant(enum_ty, - &name, - &*variant_name, - existing_variant_name, - enum_rust_ty.clone(), - result); + if is_rust_enum { + let existing_variant_name = entry.get(); + let variant_name = ctx.rust_mangle(variant.name()); + add_constant(enum_ty, + &name, + &*variant_name, + existing_variant_name, + enum_rust_ty.clone(), + result); + } else { + // FIXME: Don't repeat this block below. + let expr = aster::AstBuilder::new().expr(); + let expr = match variant.val() { + EnumVariantValue::Signed(val) => expr.int(val), + EnumVariantValue::Unsigned(val) => expr.uint(val), + }; + let variant_name = ctx.rust_mangle(variant.name()); + builder = builder.with_variant_(ctx, + &*variant_name, + expr, + enum_rust_ty.clone(), + result); + } } Entry::Vacant(entry) => { let expr = aster::AstBuilder::new().expr(); @@ -1344,16 +1447,15 @@ impl CodeGenerator for Enum { EnumVariantValue::Unsigned(val) => expr.uint(val), }; let variant_name = ctx.rust_mangle(variant.name()); - builder = builder.with_variant_(ast::Variant_ { - name: ctx.rust_ident(&*variant_name), - attrs: vec![], - data: ast::VariantData::Unit(ast::DUMMY_NODE_ID), - disr_expr: Some(expr), - }); + builder = builder.with_variant_(ctx, + &*variant_name, + expr, + enum_rust_ty.clone(), + result); // If it's an unnamed enum, we also generate a constant so // it can be properly accessed. - if enum_ty.name().is_none() { + if is_rust_enum && enum_ty.name().is_none() { // NB: if we want to do this for other kind of nested // enums we can probably mangle the name. let mangled_name = if item.is_toplevel(ctx) { @@ -1384,7 +1486,6 @@ impl CodeGenerator for Enum { } } - result.push(builder.build()); } } diff --git a/src/lib.rs b/src/lib.rs index 03dac3cc88..2e61840eb0 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -166,6 +166,15 @@ impl Builder { self } + /// Mark the given enum (or set of enums, if using a pattern) as being + /// bitfield-like. + /// + /// This makes bindgen to generate a type for it that isn't a rust `enum`. + pub fn bitfield_enum>(mut self, arg: T) -> Builder { + self.options.bitfield_enums.insert(&arg); + self + } + /// Add a string to prepend to the generated bindings. The string is passed /// through without any modification. pub fn raw_line>(mut self, arg: T) -> Builder { @@ -262,6 +271,9 @@ pub struct BindgenOptions { /// Whitelisted variables. See docs for `whitelisted_types` for more. pub whitelisted_vars: RegexSet, + /// The enum patterns to mark an enum as bitfield. + pub bitfield_enums: RegexSet, + /// Whether we should generate builtins or not. pub builtins: bool, @@ -329,6 +341,7 @@ impl Default for BindgenOptions { whitelisted_types: Default::default(), whitelisted_functions: Default::default(), whitelisted_vars: Default::default(), + bitfield_enums: Default::default(), builtins: false, links: vec![], emit_ast: false, From c47e589435545ecfd4e815bb0de12b7d9292771b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 8 Nov 2016 07:32:13 +0100 Subject: [PATCH 0058/2291] `cargo fmt`. --- src/clang.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index e6d781234e..1239753463 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -102,7 +102,9 @@ impl Cursor { /// lexical parents. pub fn fallible_semantic_parent(&self) -> Option { let sp = unsafe { - Cursor { x: clang_getCursorSemanticParent(self.x) } + Cursor { + x: clang_getCursorSemanticParent(self.x), + } }; if sp == *self || !sp.is_valid() { return None; @@ -161,7 +163,8 @@ impl Cursor { (semantic_parent.unwrap().kind() == CXCursor_Namespace || semantic_parent.unwrap().kind() == CXCursor_NamespaceAlias || semantic_parent.unwrap().kind() == CXCursor_NamespaceRef) { - semantic_parent = semantic_parent.unwrap().fallible_semantic_parent(); + semantic_parent = semantic_parent.unwrap() + .fallible_semantic_parent(); } let tu = self.translation_unit(); @@ -363,9 +366,9 @@ impl Cursor { /// /// Returns None if the cursor's referent is not an enum variant. pub fn enum_val_unsigned(&self) -> Option { - unsafe { + unsafe { if self.kind() == CXCursor_EnumConstantDecl { - Some(clang_getEnumConstantDeclUnsignedValue(self.x) as u64) + Some(clang_getEnumConstantDeclUnsignedValue(self.x) as u64) } else { None } @@ -691,11 +694,7 @@ impl Type { let rt = Type { x: unsafe { clang_getResultType(self.x) }, }; - if rt.is_valid() { - Some(rt) - } else { - None - } + if rt.is_valid() { Some(rt) } else { None } } /// Given that this type is a function type, get its calling convention. If From 19db528515e5e099cecb3fe7bf89209482046bd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 8 Nov 2016 07:35:45 +0100 Subject: [PATCH 0059/2291] Moar tests. --- .../expectations/tests/bitfield-enum-basic.rs | 20 +++++++++++++++++++ tests/headers/bitfield-enum-basic.h | 15 ++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 tests/expectations/tests/bitfield-enum-basic.rs create mode 100644 tests/headers/bitfield-enum-basic.h diff --git a/tests/expectations/tests/bitfield-enum-basic.rs b/tests/expectations/tests/bitfield-enum-basic.rs new file mode 100644 index 0000000000..c287d9ebb9 --- /dev/null +++ b/tests/expectations/tests/bitfield-enum-basic.rs @@ -0,0 +1,20 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +const Foo_Bar: Foo = Foo(2); +const Foo_Baz: Foo = Foo(4); +const Foo_Duplicated: Foo = Foo(4); +const Foo_Negative: Foo = Foo(-3); +#[repr(C)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub struct Foo(pub i32); +const Buz_Bar: Buz = Buz(2); +const Buz_Baz: Buz = Buz(4); +const Buz_Duplicated: Buz = Buz(4); +const Buz_Negative: Buz = Buz(-3); +#[repr(C)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub struct Buz(pub i8); diff --git a/tests/headers/bitfield-enum-basic.h b/tests/headers/bitfield-enum-basic.h new file mode 100644 index 0000000000..890735e9f7 --- /dev/null +++ b/tests/headers/bitfield-enum-basic.h @@ -0,0 +1,15 @@ +// bindgen-flags: --bitfield-enum ".*" -- -std=c++11 + +enum Foo { + Bar = 1 << 1, + Baz = 1 << 2, + Duplicated = 1 << 2, + Negative = -3, +}; + +enum class Buz : signed char { + Bar = 1 << 1, + Baz = 1 << 2, + Duplicated = 1 << 2, + Negative = -3, +}; From 4062713e0fc3dbfc7c6329252a814579a4702677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 8 Nov 2016 20:45:04 +0100 Subject: [PATCH 0060/2291] codegen: Simplify bitfield logic a bit, make it work for unnamed enums, generate default BitOr implementation. --- src/bin/bindgen.rs | 6 +- src/codegen/mod.rs | 131 +++++++++++------- src/lib.rs | 2 +- .../expectations/tests/bitfield-enum-basic.rs | 73 ++++++++-- tests/headers/bitfield-enum-basic.h | 14 +- 5 files changed, 164 insertions(+), 62 deletions(-) diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index b9e56b08dc..bdb3b2920d 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -92,9 +92,9 @@ Options: matching . Same behavior on emptyness than the type whitelisting. - --bitfield-enum= Mark a bitfield as being used as an enum. - This makes bindgen don't generate a rust enum - for it, but a bitfield-like wrapper. + --bitfield-enum= Mark any enum whose name matches as a + set of bitfield flags instead of an + enumeration. --dummy-uses= For testing purposes, generate a C/C++ file containing dummy uses of all types defined in diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 02051f270a..20f377e191 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -6,7 +6,7 @@ use aster; use ir::annotations::FieldAccessorKind; use ir::comp::{CompInfo, CompKind, Field, Method}; use ir::context::BindgenContext; -use ir::enum_ty::Enum; +use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; use ir::function::{Function, FunctionSig}; use ir::int::IntKind; use ir::item::{Item, ItemCanonicalName, ItemCanonicalPath, ItemId}; @@ -1224,6 +1224,7 @@ impl MethodCodegen for Method { } } +/// A helper type to construct enums, either bitfield ones or rust-style ones. enum EnumBuilder<'a> { Rust(aster::item::ItemEnumBuilder), Bitfield { @@ -1233,6 +1234,8 @@ enum EnumBuilder<'a> { } impl<'a> EnumBuilder<'a> { + /// Create a new enum given an item builder, a canonical name, a name for + /// the representation, and whether it should be represented as a rust enum. fn new(aster: aster::item::ItemBuilder, name: &'a str, repr_name: &str, @@ -1253,29 +1256,42 @@ impl<'a> EnumBuilder<'a> { } } - fn with_variant_(self, - ctx: &BindgenContext, - name: &str, - expr: P, - rust_ty: P, - result: &mut CodegenResult) - -> Self { + /// Add a variant to this enum. + fn with_variant(self, + ctx: &BindgenContext, + variant: &EnumVariant, + mangling_prefix: Option<&String>, + rust_ty: P, + result: &mut CodegenResult) + -> Self { + let variant_name = ctx.rust_mangle(variant.name()); + let expr = aster::AstBuilder::new().expr(); + let expr = match variant.val() { + EnumVariantValue::Signed(v) => expr.int(v), + EnumVariantValue::Unsigned(v) => expr.uint(v), + }; + match self { EnumBuilder::Rust(b) => { EnumBuilder::Rust(b.with_variant_(ast::Variant_ { - name: ctx.rust_ident(name), + name: ctx.rust_ident(&*variant_name), attrs: vec![], data: ast::VariantData::Unit(ast::DUMMY_NODE_ID), disr_expr: Some(expr), })) } EnumBuilder::Bitfield { canonical_name, .. } => { - // FIXME: Probably if unnamed we should be smarter! Easy to - // improve. - let constant_name = format!("{}_{}", canonical_name, name); + let constant_name = match mangling_prefix { + Some(prefix) => { + Cow::Owned(format!("{}_{}", prefix, variant_name)) + } + None => variant_name, + }; + let constant = aster::AstBuilder::new() .item() - .const_(constant_name) + .pub_() + .const_(&*constant_name) .expr() .call() .id(canonical_name) @@ -1289,10 +1305,32 @@ impl<'a> EnumBuilder<'a> { } } - fn build(self) -> P { + fn build(self, + ctx: &BindgenContext, + rust_ty: P, + result: &mut CodegenResult) + -> P { match self { EnumBuilder::Rust(b) => b.build(), - EnumBuilder::Bitfield { aster, .. } => aster, + EnumBuilder::Bitfield { canonical_name, aster } => { + let rust_ty_name = ctx.rust_ident_raw(canonical_name); + let prefix = ctx.trait_prefix(); + + let impl_ = quote_item!(ctx.ext_cx(), + impl ::$prefix::ops::BitOr<$rust_ty> for $rust_ty { + type Output = Self; + + #[inline] + fn bitor(self, other: Self) -> Self { + $rust_ty_name(self.0 | other.0) + } + } + ) + .unwrap(); + + result.push(impl_); + aster + } } } } @@ -1304,8 +1342,6 @@ impl CodeGenerator for Enum { ctx: &BindgenContext, result: &mut CodegenResult, item: &Item) { - use ir::enum_ty::EnumVariantValue; - let name = item.canonical_name(ctx); let enum_ty = item.expect_type(); let layout = enum_ty.layout(ctx); @@ -1404,15 +1440,27 @@ impl CodeGenerator for Enum { result.push(constant); } - // Used to mangle the constants we generate in the unnamed-enum case. - let mut parent_canonical_name = None; - let mut builder = EnumBuilder::new(builder, &name, repr_name, is_rust_enum); // A map where we keep a value -> variant relation. let mut seen_values = HashMap::<_, String>::new(); let enum_rust_ty = item.to_rust_ty(ctx); + let is_toplevel = item.is_toplevel(ctx); + + // Used to mangle the constants we generate in the unnamed-enum case. + let parent_canonical_name = if is_toplevel { + None + } else { + Some(item.parent_id().canonical_name(ctx)) + }; + + let constant_mangling_prefix = if enum_ty.name().is_none() { + parent_canonical_name.as_ref().map(|n| &*n) + } else { + Some(&name) + }; + for variant in self.variants().iter() { match seen_values.entry(variant.val()) { Entry::Occupied(ref entry) => { @@ -1426,46 +1474,30 @@ impl CodeGenerator for Enum { enum_rust_ty.clone(), result); } else { - // FIXME: Don't repeat this block below. - let expr = aster::AstBuilder::new().expr(); - let expr = match variant.val() { - EnumVariantValue::Signed(val) => expr.int(val), - EnumVariantValue::Unsigned(val) => expr.uint(val), - }; - let variant_name = ctx.rust_mangle(variant.name()); - builder = builder.with_variant_(ctx, - &*variant_name, - expr, - enum_rust_ty.clone(), - result); + builder = builder.with_variant(ctx, + variant, + constant_mangling_prefix, + enum_rust_ty.clone(), + result); } } Entry::Vacant(entry) => { - let expr = aster::AstBuilder::new().expr(); - let expr = match variant.val() { - EnumVariantValue::Signed(val) => expr.int(val), - EnumVariantValue::Unsigned(val) => expr.uint(val), - }; + builder = builder.with_variant(ctx, + variant, + constant_mangling_prefix, + enum_rust_ty.clone(), + result); + let variant_name = ctx.rust_mangle(variant.name()); - builder = builder.with_variant_(ctx, - &*variant_name, - expr, - enum_rust_ty.clone(), - result); // If it's an unnamed enum, we also generate a constant so // it can be properly accessed. if is_rust_enum && enum_ty.name().is_none() { // NB: if we want to do this for other kind of nested // enums we can probably mangle the name. - let mangled_name = if item.is_toplevel(ctx) { + let mangled_name = if is_toplevel { variant_name.clone() } else { - if parent_canonical_name.is_none() { - parent_canonical_name = Some(item.parent_id() - .canonical_name(ctx)); - } - let parent_name = parent_canonical_name.as_ref() .unwrap(); @@ -1486,7 +1518,8 @@ impl CodeGenerator for Enum { } } - result.push(builder.build()); + let enum_ = builder.build(ctx, enum_rust_ty, result); + result.push(enum_); } } diff --git a/src/lib.rs b/src/lib.rs index 2e61840eb0..316212dcae 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -169,7 +169,7 @@ impl Builder { /// Mark the given enum (or set of enums, if using a pattern) as being /// bitfield-like. /// - /// This makes bindgen to generate a type for it that isn't a rust `enum`. + /// This makes bindgen generate a type that isn't a rust `enum`. pub fn bitfield_enum>(mut self, arg: T) -> Builder { self.options.bitfield_enums.insert(&arg); self diff --git a/tests/expectations/tests/bitfield-enum-basic.rs b/tests/expectations/tests/bitfield-enum-basic.rs index c287d9ebb9..03e07de6b2 100644 --- a/tests/expectations/tests/bitfield-enum-basic.rs +++ b/tests/expectations/tests/bitfield-enum-basic.rs @@ -4,17 +4,74 @@ #![allow(non_snake_case)] -const Foo_Bar: Foo = Foo(2); -const Foo_Baz: Foo = Foo(4); -const Foo_Duplicated: Foo = Foo(4); -const Foo_Negative: Foo = Foo(-3); +pub const Foo_Bar: Foo = Foo(2); +pub const Foo_Baz: Foo = Foo(4); +pub const Foo_Duplicated: Foo = Foo(4); +pub const Foo_Negative: Foo = Foo(-3); +impl ::std::ops::BitOr for Foo { + type + Output + = + Self; + #[inline] + fn bitor(self, other: Self) -> Self { Foo(self.0 | other.0) } +} #[repr(C)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub struct Foo(pub i32); -const Buz_Bar: Buz = Buz(2); -const Buz_Baz: Buz = Buz(4); -const Buz_Duplicated: Buz = Buz(4); -const Buz_Negative: Buz = Buz(-3); +pub const Buz_Bar: Buz = Buz(2); +pub const Buz_Baz: Buz = Buz(4); +pub const Buz_Duplicated: Buz = Buz(4); +pub const Buz_Negative: Buz = Buz(-3); +impl ::std::ops::BitOr for Buz { + type + Output + = + Self; + #[inline] + fn bitor(self, other: Self) -> Self { Buz(self.0 | other.0) } +} #[repr(C)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub struct Buz(pub i8); +pub const NS_FOO: _bindgen_ty_1 = _bindgen_ty_1(1); +pub const NS_BAR: _bindgen_ty_1 = _bindgen_ty_1(2); +impl ::std::ops::BitOr<_bindgen_ty_1> for _bindgen_ty_1 { + type + Output + = + Self; + #[inline] + fn bitor(self, other: Self) -> Self { _bindgen_ty_1(self.0 | other.0) } +} +#[repr(C)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub struct _bindgen_ty_1(pub u32); +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Dummy { + pub _address: u8, +} +pub const Dummy_DUMMY_FOO: Dummy__bindgen_ty_1 = Dummy__bindgen_ty_1(1); +pub const Dummy_DUMMY_BAR: Dummy__bindgen_ty_1 = Dummy__bindgen_ty_1(2); +impl ::std::ops::BitOr for Dummy__bindgen_ty_1 { + type + Output + = + Self; + #[inline] + fn bitor(self, other: Self) -> Self { + Dummy__bindgen_ty_1(self.0 | other.0) + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub struct Dummy__bindgen_ty_1(pub u32); +#[test] +fn bindgen_test_layout_Dummy() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for Dummy { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/bitfield-enum-basic.h b/tests/headers/bitfield-enum-basic.h index 890735e9f7..364bebf2d2 100644 --- a/tests/headers/bitfield-enum-basic.h +++ b/tests/headers/bitfield-enum-basic.h @@ -1,4 +1,4 @@ -// bindgen-flags: --bitfield-enum ".*" -- -std=c++11 +// bindgen-flags: --bitfield-enum "Foo|Buz|NS_.*|DUMMY_.*" -- -std=c++11 enum Foo { Bar = 1 << 1, @@ -13,3 +13,15 @@ enum class Buz : signed char { Duplicated = 1 << 2, Negative = -3, }; + +enum { + NS_FOO = 1 << 0, + NS_BAR = 1 << 1, +}; + +class Dummy { + enum { + DUMMY_FOO = 1 << 0, + DUMMY_BAR = 1 << 1, + }; +}; From e22a11b4d8d37ff1ed850fd596a0110b433907ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 6 Nov 2016 14:36:47 +0100 Subject: [PATCH 0061/2291] Parse macros with cexpr. --- Cargo.toml | 1 + src/clang.rs | 69 +++++++++- src/ir/context.rs | 25 ++-- src/ir/var.rs | 130 ++++++++++-------- src/lib.rs | 1 + .../expectations/tests/jsval_layout_opaque.rs | 3 +- tests/expectations/tests/macro-expr-basic.rs | 14 ++ tests/headers/macro-expr-basic.h | 12 ++ 8 files changed, 182 insertions(+), 73 deletions(-) create mode 100644 tests/expectations/tests/macro-expr-basic.rs create mode 100644 tests/headers/macro-expr-basic.h diff --git a/Cargo.toml b/Cargo.toml index 4e455fa9a8..97bcb82f93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,7 @@ env_logger = "0.3" rustc-serialize = "0.3.19" syntex_syntax = "0.44" regex = "0.1" +cexpr = "0.2" [dependencies.aster] features = ["with-syntex"] diff --git a/src/clang.rs b/src/clang.rs index e6d781234e..177d7dabd8 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -4,8 +4,9 @@ #![allow(non_upper_case_globals, dead_code)] +use cexpr; use clangll::*; -use std::{mem, ptr}; +use std::{mem, ptr, slice}; use std::ffi::{CStr, CString}; use std::fmt; use std::hash::Hash; @@ -1051,18 +1052,18 @@ impl TranslationUnit { let range = cursor.extent(); let mut tokens = vec![]; unsafe { - let mut token_ptr = ::std::ptr::null_mut(); + let mut token_ptr = ptr::null_mut(); let mut num_tokens: c_uint = 0; clang_tokenize(self.x, range, &mut token_ptr, &mut num_tokens); if token_ptr.is_null() { return None; } - let token_array = ::std::slice::from_raw_parts(token_ptr, - num_tokens as usize); + + let token_array = slice::from_raw_parts(token_ptr, + num_tokens as usize); for &token in token_array.iter() { let kind = clang_getTokenKind(token); - let spelling: String = clang_getTokenSpelling(self.x, token) - .into(); + let spelling = clang_getTokenSpelling(self.x, token).into(); tokens.push(Token { kind: kind, @@ -1073,6 +1074,62 @@ impl TranslationUnit { } Some(tokens) } + + /// Convert a set of tokens from clang into `cexpr` tokens, for further + /// processing. + pub fn cexpr_tokens(&self, + cursor: &Cursor) + -> Option> { + use cexpr::token; + + let mut tokens = match self.tokens(cursor) { + Some(tokens) => tokens, + None => return None, + }; + + // FIXME(emilio): LLVM 3.9 at least always include an extra token for no + // good reason (except if we're at EOF). So we do this kind of hack, + // where we skip known-to-cause problems trailing punctuation and + // trailing keywords. + // + // This is sort of unfortunate, though :(. + // + // I'll try to get it fixed in LLVM if I have the time to submit a + // patch. + let mut trim_last_token = false; + if let Some(token) = tokens.last() { + // The starting of the next macro. + trim_last_token |= token.spelling == "#" && + token.kind == CXToken_Punctuation; + + // A following keyword of any kind, like a following declaration. + trim_last_token |= token.kind == CXToken_Keyword; + } + + if trim_last_token { + tokens.pop().unwrap(); + } + + Some(tokens.into_iter() + .filter_map(|token| { + let kind = match token.kind { + CXToken_Punctuation => token::Kind::Punctuation, + CXToken_Literal => token::Kind::Literal, + CXToken_Identifier => token::Kind::Identifier, + CXToken_Keyword => token::Kind::Keyword, + // NB: cexpr is not too happy about comments inside + // expressions, so we strip them down here. + CXToken_Comment => return None, + _ => panic!("Found unexpected token kind: {}", token.kind), + }; + + Some(token::Token { + kind: kind, + raw: token.spelling.into_bytes().into_boxed_slice(), + }) + }) + .collect::>()) + } } impl Drop for TranslationUnit { diff --git a/src/ir/context.rs b/src/ir/context.rs index f11b387a09..977db9c569 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -1,10 +1,11 @@ //! Common context that is passed around during parsing and codegen. use BindgenOptions; +use cexpr; use clang::{self, Cursor}; use parse::ClangItemParser; use std::borrow::{Borrow, Cow}; -use std::collections::{HashMap, HashSet, hash_map}; +use std::collections::{HashMap, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; use super::int::IntKind; @@ -77,8 +78,9 @@ pub struct BindgenContext<'ctx> { pub currently_parsed_types: Vec<(Cursor, ItemId)>, /// A HashSet with all the already parsed macro names. This is done to avoid - /// hard errors while parsing duplicated macros. - parsed_macros: HashSet, + /// hard errors while parsing duplicated macros, as well to allow macro + /// expression parsing. + parsed_macros: HashMap, cexpr::expr::EvalResult>, /// The active replacements collected from replaces="xxx" annotations. replacements: HashMap, @@ -715,14 +717,21 @@ impl<'ctx> BindgenContext<'ctx> { } /// Have we parsed the macro named `macro_name` already? - pub fn parsed_macro(&self, macro_name: &str) -> bool { - self.parsed_macros.contains(macro_name) + pub fn parsed_macro(&self, macro_name: &[u8]) -> bool { + self.parsed_macros.contains_key(macro_name) + } + + /// Get the currently parsed macros. + pub fn parsed_macros(&self) -> &HashMap, cexpr::expr::EvalResult> { + debug_assert!(!self.in_codegen_phase()); + &self.parsed_macros } /// Mark the macro named `macro_name` as parsed. - pub fn note_parsed_macro(&mut self, macro_name: String) { - debug_assert!(!self.parsed_macros.contains(¯o_name)); - self.parsed_macros.insert(macro_name); + pub fn note_parsed_macro(&mut self, + id: Vec, + value: cexpr::expr::EvalResult) { + self.parsed_macros.insert(id, value); } /// Are we in the codegen phase? diff --git a/src/ir/var.rs b/src/ir/var.rs index 33e5624267..62f17030dc 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -1,7 +1,9 @@ //! Intermediate representation of variables. +use cexpr; use clang; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; +use std::num::Wrapping; use super::context::BindgenContext; use super::function::cursor_mangling; use super::int::IntKind; @@ -73,43 +75,61 @@ impl ClangSubItemParser for Var { ctx: &mut BindgenContext) -> Result, ParseError> { use clangll::*; + use cexpr::expr::EvalResult; match cursor.kind() { CXCursor_MacroDefinition => { - let value = parse_int_literal_tokens(&cursor, - ctx.translation_unit()); + let value = parse_macro(ctx, &cursor, ctx.translation_unit()); - let value = match value { + let (id, value) = match value { Some(v) => v, None => return Err(ParseError::Continue), }; - let name = cursor.spelling(); - if name.is_empty() { - warn!("Empty macro name?"); - return Err(ParseError::Continue); - } + assert!(!id.is_empty(), "Empty macro name?"); - if ctx.parsed_macro(&name) { + if ctx.parsed_macro(&id) { + let name = String::from_utf8(id).unwrap(); warn!("Duplicated macro definition: {}", name); return Err(ParseError::Continue); } - ctx.note_parsed_macro(name.clone()); - - let ty = if value < 0 { - Item::builtin_type(TypeKind::Int(IntKind::Int), true, ctx) - } else if value.abs() > u32::max_value() as i64 { - Item::builtin_type(TypeKind::Int(IntKind::ULongLong), - true, - ctx) - } else { - Item::builtin_type(TypeKind::Int(IntKind::UInt), true, ctx) + + // NB: It's important to "note" the macro even if the result is + // not an integer, otherwise we might loose other kind of + // derived macros. + ctx.note_parsed_macro(id.clone(), value.clone()); + + // NOTE: Unwrapping, here and above, is safe, because the + // identifier of a token comes straight from clang, and we + // enforce utf8 there, so we should have already panicked at + // this point. + let name = String::from_utf8(id).unwrap(); + let (int_kind, val) = match value { + // TODO(emilio): Handle the non-invalid ones! + EvalResult::Float(..) | + EvalResult::Char(..) | + EvalResult::Str(..) | + EvalResult::Invalid => return Err(ParseError::Continue), + + EvalResult::Int(Wrapping(value)) => { + let kind = if value < 0 { + if value < i32::min_value() as i64 { + IntKind::LongLong + } else { + IntKind::Int + } + } else if value > u32::max_value() as i64 { + IntKind::ULongLong + } else { + IntKind::UInt + }; + + (kind, value) + } }; - Ok(ParseResult::New(Var::new(name, - None, - ty, - Some(value), - true), + let ty = Item::builtin_type(TypeKind::Int(int_kind), true, ctx); + + Ok(ParseResult::New(Var::new(name, None, ty, Some(val), true), Some(cursor))) } CXCursor_VarDecl => { @@ -153,49 +173,43 @@ impl ClangSubItemParser for Var { } } -/// Try and parse the immediately found tokens from an unit (if any) to integers +/// Try and parse a macro using all the macros parsed until now. +fn parse_macro(ctx: &BindgenContext, + cursor: &clang::Cursor, + unit: &clang::TranslationUnit) + -> Option<(Vec, cexpr::expr::EvalResult)> { + use cexpr::{expr, nom}; + + let cexpr_tokens = match unit.cexpr_tokens(cursor) { + None => return None, + Some(tokens) => tokens, + }; + + let parser = expr::IdentifierParser::new(ctx.parsed_macros()); + let result = parser.macro_definition(&cexpr_tokens); + + match result { + nom::IResult::Done(_, (id, val)) => Some((id.into(), val)), + _ => None, + } +} + fn parse_int_literal_tokens(cursor: &clang::Cursor, unit: &clang::TranslationUnit) -> Option { - use clangll::{CXToken_Literal, CXToken_Punctuation}; + use cexpr::{expr, nom}; + use cexpr::expr::EvalResult; - let tokens = match unit.tokens(cursor) { + let cexpr_tokens = match unit.cexpr_tokens(cursor) { None => return None, Some(tokens) => tokens, }; - let mut literal = None; - let mut negate = false; - for token in tokens.into_iter() { - match token.kind { - CXToken_Punctuation if token.spelling == "-" => { - negate = !negate; - } - CXToken_Literal => { - literal = Some(token.spelling); - break; - } - _ => { - // Reset values if we found anything else - negate = false; - literal = None; - } - } + // TODO(emilio): We can try to parse other kinds of literals. + match expr::expr(&cexpr_tokens) { + nom::IResult::Done(_, EvalResult::Int(Wrapping(val))) => Some(val), + _ => None, } - - literal.and_then(|lit| { - if lit.starts_with("0x") { - // TODO: try to preserve hex literals? - i64::from_str_radix(&lit[2..], 16).ok() - } else if lit == "0" { - Some(0) - } else if lit.starts_with("0") { - i64::from_str_radix(&lit[1..], 8).ok() - } else { - lit.parse().ok() - } - }) - .map(|lit| if negate { -lit } else { lit }) } fn get_integer_literal_from_cursor(cursor: &clang::Cursor, diff --git a/src/lib.rs b/src/lib.rs index 03dac3cc88..a632c461d7 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,6 +24,7 @@ #[macro_use] extern crate cfg_if; +extern crate cexpr; extern crate syntex_syntax as syntax; extern crate aster; extern crate quasi; diff --git a/tests/expectations/tests/jsval_layout_opaque.rs b/tests/expectations/tests/jsval_layout_opaque.rs index f3c1014e45..fa611f2045 100644 --- a/tests/expectations/tests/jsval_layout_opaque.rs +++ b/tests/expectations/tests/jsval_layout_opaque.rs @@ -24,8 +24,9 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } -pub const JSVAL_ALIGNMENT: ::std::os::raw::c_uint = 8; pub const JSVAL_TAG_SHIFT: ::std::os::raw::c_uint = 47; +pub const JSVAL_PAYLOAD_MASK: ::std::os::raw::c_ulonglong = 140737488355327; +pub const JSVAL_TAG_MASK: ::std::os::raw::c_longlong = -140737488355328; #[repr(u8)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum JSValueType { diff --git a/tests/expectations/tests/macro-expr-basic.rs b/tests/expectations/tests/macro-expr-basic.rs new file mode 100644 index 0000000000..7a5c71e041 --- /dev/null +++ b/tests/expectations/tests/macro-expr-basic.rs @@ -0,0 +1,14 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const FOO: ::std::os::raw::c_uint = 1; +pub const BAR: ::std::os::raw::c_uint = 4; +pub const BAZ: ::std::os::raw::c_uint = 5; +pub const BARR: ::std::os::raw::c_uint = 1; +pub const BAZZ: ::std::os::raw::c_uint = 7; +pub const I_RAN_OUT_OF_DUMB_NAMES: ::std::os::raw::c_uint = 7; +pub const HAZ_A_COMMENT: ::std::os::raw::c_uint = 1; +pub const HAZ_A_COMMENT_INSIDE: ::std::os::raw::c_uint = 2; diff --git a/tests/headers/macro-expr-basic.h b/tests/headers/macro-expr-basic.h new file mode 100644 index 0000000000..55b11367d1 --- /dev/null +++ b/tests/headers/macro-expr-basic.h @@ -0,0 +1,12 @@ +#define FOO 1 +#define BAR 4 +#define BAZ (FOO + BAR) + +#define BARR (1 << 0) +#define BAZZ ((1 << 1) + BAZ) +#define I_RAN_OUT_OF_DUMB_NAMES (BARR | BAZZ) + +/* I haz a comment */ +#define HAZ_A_COMMENT BARR + +#define HAZ_A_COMMENT_INSIDE (/* comment for real */ BARR + FOO) From b11e1dbd3eeda4e9b2a3dc28108393a9727e5c74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 6 Nov 2016 20:32:37 +0100 Subject: [PATCH 0062/2291] Add a finer-grane and more generic API for choosing macro types. --- src/chooser.rs | 14 ++++++++++++++ src/codegen/mod.rs | 11 +++++++++++ src/ir/context.rs | 4 ++-- src/ir/int.rs | 38 ++++++++++++++++++++++++++++++++------ src/ir/var.rs | 30 +++++++++++++++++++++--------- src/lib.rs | 14 ++++++++++++++ 6 files changed, 94 insertions(+), 17 deletions(-) create mode 100644 src/chooser.rs diff --git a/src/chooser.rs b/src/chooser.rs new file mode 100644 index 0000000000..10a77dc9c4 --- /dev/null +++ b/src/chooser.rs @@ -0,0 +1,14 @@ +//! A public API for more fine-grained customization of bindgen behavior. + +pub use ir::int::IntKind; +use std::fmt; + +/// A trait to allow configuring different kinds of types in different +/// situations. +pub trait TypeChooser: fmt::Debug { + /// The integer kind an integer macro should have, given a name and the + /// value of that macro, or `None` if you want the default to be chosen. + fn int_macro(&self, _name: &str, _value: i64) -> Option { + None + } +} diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 7fa8b19c1e..e8c507a1ce 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1453,8 +1453,19 @@ impl ToRustTy for Type { IntKind::ULong => raw!(c_ulong), IntKind::LongLong => raw!(c_longlong), IntKind::ULongLong => raw!(c_ulonglong), + + IntKind::I8 => aster::ty::TyBuilder::new().i8(), + IntKind::U8 => aster::ty::TyBuilder::new().u8(), + IntKind::I16 => aster::ty::TyBuilder::new().i16(), IntKind::U16 => aster::ty::TyBuilder::new().u16(), + IntKind::I32 => aster::ty::TyBuilder::new().i32(), IntKind::U32 => aster::ty::TyBuilder::new().u32(), + IntKind::I64 => aster::ty::TyBuilder::new().i64(), + IntKind::U64 => aster::ty::TyBuilder::new().u64(), + IntKind::Custom(name, _signed) => { + let ident = ctx.rust_ident_raw(name); + quote_ty!(ctx.ext_cx(), $ident) + } // FIXME: This doesn't generate the proper alignment, but we // can't do better right now. We should be able to use // i128/u128 when they're available. diff --git a/src/ir/context.rs b/src/ir/context.rs index 977db9c569..00ece52975 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -4,7 +4,7 @@ use BindgenOptions; use cexpr; use clang::{self, Cursor}; use parse::ClangItemParser; -use std::borrow::{Borrow, Cow}; +use std::borrow::Cow; use std::collections::{HashMap, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; @@ -245,7 +245,7 @@ impl<'ctx> BindgenContext<'ctx> { /// Returns a mangled name as a rust identifier. pub fn rust_ident_raw(&self, name: &str) -> Ident { - self.ext_cx().ident_of(name.borrow()) + self.ext_cx().ident_of(name) } /// Iterate over all items that have been defined. diff --git a/src/ir/int.rs b/src/ir/int.rs index a18e4c588a..562169f798 100644 --- a/src/ir/int.rs +++ b/src/ir/int.rs @@ -36,18 +36,41 @@ pub enum IntKind { /// An `unsigned long long`. ULongLong, + /// A 8-bit signed integer. + I8, + + /// A 8-bit unsigned integer. + U8, + + /// A 16-bit signed integer. + I16, + /// Either a `char16_t` or a `wchar_t`. U16, - /// A `char32_t`. + /// A 32-bit signed integer. + I32, + + /// A 32-bit unsigned integer. U32, + /// A 64-bit signed integer. + I64, + + /// A 64-bit unsigned integer. + U64, + /// An `int128_t` I128, /// A `uint128_t`. - U128, /* Though now we're at it we could add equivalents for the rust - * types... */ + U128, + + /// A custom integer type, used to allow custom macro types depending on + /// range. + /// + /// The boolean means a whether this is a signed integer type or not. + Custom(&'static str, bool), } impl IntKind { @@ -55,10 +78,13 @@ impl IntKind { pub fn is_signed(&self) -> bool { use self::IntKind::*; match *self { - Bool | UChar | UShort | UInt | ULong | ULongLong | U16 | U32 | - U128 => false, + Bool | UChar | UShort | UInt | ULong | ULongLong | U8 | U16 | + U32 | U64 | U128 => false, + + Char | Short | Int | Long | LongLong | I8 | I16 | I32 | I64 | + I128 => true, - Char | Short | Int | Long | LongLong | I128 => true, + Custom(_, signed) => signed, } } } diff --git a/src/ir/var.rs b/src/ir/var.rs index 62f17030dc..0c09bad451 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -111,16 +111,28 @@ impl ClangSubItemParser for Var { EvalResult::Invalid => return Err(ParseError::Continue), EvalResult::Int(Wrapping(value)) => { - let kind = if value < 0 { - if value < i32::min_value() as i64 { - IntKind::LongLong - } else { - IntKind::Int + let kind = match ctx.options().type_chooser { + Some(ref chooser) => { + chooser.int_macro(&name, value) + } + None => None, + }; + + let kind = match kind { + Some(kind) => kind, + None => { + if value < 0 { + if value < i32::min_value() as i64 { + IntKind::LongLong + } else { + IntKind::Int + } + } else if value > u32::max_value() as i64 { + IntKind::ULongLong + } else { + IntKind::UInt + } } - } else if value > u32::max_value() as i64 { - IntKind::ULongLong - } else { - IntKind::UInt }; (kind, value) diff --git a/src/lib.rs b/src/lib.rs index a632c461d7..2c6eebbe71 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -63,6 +63,8 @@ mod parse; mod regex_set; mod uses; +pub mod chooser; + #[cfg(rustfmt)] mod codegen; @@ -229,6 +231,13 @@ impl Builder { self } + /// Allows configuring types in different situations, see the `TypeChooser` + /// documentation. + pub fn type_chooser(mut self, cb: Box) -> Self { + self.options.type_chooser = Some(cb); + self + } + /// Generate the Rust bindings using the options built up thus far. pub fn generate<'ctx>(self) -> Result, ()> { Bindings::generate(self.options, None) @@ -320,6 +329,10 @@ pub struct BindgenOptions { /// Generate a dummy C/C++ file that includes the header and has dummy uses /// of all types defined therein. See the `uses` module for more. pub dummy_uses: Option, + + /// A user-provided type chooser to allow customizing different kinds of + /// situations. + pub type_chooser: Option>, } impl Default for BindgenOptions { @@ -347,6 +360,7 @@ impl Default for BindgenOptions { clang_args: vec![], input_header: None, dummy_uses: None, + type_chooser: None, } } } From 4ee31ce84edc5d556139808c45d4409185e5bc66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 8 Nov 2016 20:59:19 +0100 Subject: [PATCH 0063/2291] Address review comments. --- src/codegen/mod.rs | 2 +- src/ir/int.rs | 11 +++++++---- src/ir/var.rs | 16 ++++------------ 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index e8c507a1ce..0c1c31da7e 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1462,7 +1462,7 @@ impl ToRustTy for Type { IntKind::U32 => aster::ty::TyBuilder::new().u32(), IntKind::I64 => aster::ty::TyBuilder::new().i64(), IntKind::U64 => aster::ty::TyBuilder::new().u64(), - IntKind::Custom(name, _signed) => { + IntKind::Custom { name, .. } => { let ident = ctx.rust_ident_raw(name); quote_ty!(ctx.ext_cx(), $ident) } diff --git a/src/ir/int.rs b/src/ir/int.rs index 562169f798..2d85db8385 100644 --- a/src/ir/int.rs +++ b/src/ir/int.rs @@ -68,9 +68,12 @@ pub enum IntKind { /// A custom integer type, used to allow custom macro types depending on /// range. - /// - /// The boolean means a whether this is a signed integer type or not. - Custom(&'static str, bool), + Custom { + /// The name of the type, which would be used without modification. + name: &'static str, + /// Whether the type is signed or not. + is_signed: bool, + }, } impl IntKind { @@ -84,7 +87,7 @@ impl IntKind { Char | Short | Int | Long | LongLong | I8 | I16 | I32 | I64 | I128 => true, - Custom(_, signed) => signed, + Custom { is_signed, .. } => is_signed, } } } diff --git a/src/ir/var.rs b/src/ir/var.rs index 0c09bad451..047e8642cf 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -111,16 +111,9 @@ impl ClangSubItemParser for Var { EvalResult::Invalid => return Err(ParseError::Continue), EvalResult::Int(Wrapping(value)) => { - let kind = match ctx.options().type_chooser { - Some(ref chooser) => { - chooser.int_macro(&name, value) - } - None => None, - }; - - let kind = match kind { - Some(kind) => kind, - None => { + let kind = ctx.options().type_chooser.as_ref() + .and_then(|c| c.int_macro(&name, value)) + .unwrap_or_else(|| { if value < 0 { if value < i32::min_value() as i64 { IntKind::LongLong @@ -132,8 +125,7 @@ impl ClangSubItemParser for Var { } else { IntKind::UInt } - } - }; + }); (kind, value) } From 6e2397f579407590af0ee7bba0d79ba466f7f02f Mon Sep 17 00:00:00 2001 From: Jeff Waugh Date: Tue, 8 Nov 2016 19:55:49 +1100 Subject: [PATCH 0064/2291] Add required Builder methods --- src/lib.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 8914d72d42..db87eb228d 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -222,6 +222,30 @@ impl Builder { self } + /// Emit Clang AST. + pub fn emit_clang_ast(mut self) -> Builder { + self.options.emit_ast = true; + self + } + + /// Enable C++ namespaces. + pub fn enable_cxx_namespaces(mut self) -> Builder { + self.options.enable_cxx_namespaces = true; + self + } + + /// Ignore functions. + pub fn ignore_functions(mut self) -> Builder { + self.options.ignore_functions = true; + self + } + + /// Ignore methods. + pub fn ignore_methods(mut self) -> Builder { + self.options.ignore_methods = true; + self + } + /// Avoid generating any unstable Rust in the generated bindings. pub fn no_unstable_rust(mut self) -> Builder { self.options.unstable_rust = false; From dc96c1fe4573f3656ce006d451d57cff378a673a Mon Sep 17 00:00:00 2001 From: Jeff Waugh Date: Tue, 8 Nov 2016 16:50:30 +1100 Subject: [PATCH 0065/2291] Port to clap command line parsing --- Cargo.toml | 1 + src/bin/bindgen.rs | 266 +++------------------------------------------ src/bin/options.rs | 257 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 276 insertions(+), 248 deletions(-) create mode 100644 src/bin/options.rs diff --git a/Cargo.toml b/Cargo.toml index 97bcb82f93..920902268b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ quasi_codegen = "0.20" [dependencies] cfg-if = "0.1.0" clang-sys = "0.8.0" +clap = "2" lazy_static = "0.1.*" libc = "0.2" log = "0.3" diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index bdb3b2920d..55d3fdde91 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -6,248 +6,14 @@ extern crate env_logger; #[macro_use] extern crate log; extern crate clang_sys; +extern crate clap; extern crate rustc_serialize; -use bindgen::{BindgenOptions, Bindings, LinkType, clang_version}; -use std::default::Default; +use bindgen::clang_version; use std::env; -use std::fs; -use std::io; -use std::path; -use std::process; -const USAGE: &'static str = " -Usage: - bindgen [options] \ - [--link=...] \ - [--static-link=...] \ - [--framework-link=...] \ - [--raw-line=...] \ - [--opaque-type=...] \ - [--blacklist-type=...] \ - [--whitelist-type=...] \ - [--whitelist-function=...] \ - [--whitelist-var=...] \ - [--bitfield-enum=...] \ - \ - [-- ...] - - bindgen (-h | --help) - -Options: - -h, --help Display this help message. - - -l=, --link= Link to a dynamic library, can be provided - multiple times. - - --static-link= Link to a static library, can be provided - multiple times. - - --framework-link= Link to a framework. - - -o= Write bindings to - (defaults to stdout) - - --builtins Output bindings for builtin definitions (for - example __builtin_va_list) - - --ignore-functions Don't generate bindings for functions and - methods. This is useful when you only care - about struct layouts. - - --ignore-methods Avoid generating all kind of methods. - - --enable-cxx-namespaces Enable support for C++ namespaces. - - --emit-clang-ast Output the ast (for debugging purposes) - - --use-msvc-mangling Handle MSVC C++ ABI mangling; requires that - target be set to (i686|x86_64)-pc-win32 - - --no-convert-floats Don't convert floats automatically to f32/f64. - - --raw-line= Add a raw line at the beginning of the output. - - --no-unstable-rust Avoid generating unstable rust. - - --use-core Use built-in types from core instead of std. - - --ctypes-prefix= Use the given prefix before the raw types - instead of ::std::os::raw::. - - --opaque-type= Mark a type as opaque. - - --blacklist-type= Mark a type as hidden. - - --whitelist-type= Whitelist the type. If this set or any other - of the whitelisting sets is not empty, then - all the non-whitelisted types (or dependant) - won't be generated. - - --whitelist-function= Whitelist all the free-standing functions - matching . Same behavior on emptyness - than the type whitelisting. - - --whitelist-var= Whitelist all the free-standing variables - matching . Same behavior on emptyness - than the type whitelisting. - - --bitfield-enum= Mark any enum whose name matches as a - set of bitfield flags instead of an - enumeration. - - --dummy-uses= For testing purposes, generate a C/C++ file - containing dummy uses of all types defined in - the input header. - - Options other than stated above are passed - directly through to clang. -"; - -// FIXME(emilio): Replace this with docopt if/when they fix their exponential -// algorithm for argument parsing. -// -// FIXME(fitzgen): Switch from `BindgenOptions` to the non-deprecated `Builder`. -#[allow(deprecated)] -fn parse_args_or_exit(args: Vec) -> (BindgenOptions, Box) { - let mut options = BindgenOptions::default(); - let mut dest_file = None; - let mut source_file = None; - - let mut iter = args.into_iter().skip(1); - loop { - let next = match iter.next() { - Some(arg) => arg, - _ => break, - }; - - match &*next { - "-h" | "--help" => { - println!("{}", USAGE); - process::exit(0); - } - "-l" | "--link" => { - let lib = iter.next().expect("--link needs an argument"); - options.links.push((lib, LinkType::Default)); - } - "--static-link" => { - let lib = iter.next().expect("--static-link needs an argument"); - options.links.push((lib, LinkType::Static)); - } - "--framework-link" => { - let lib = iter.next() - .expect("--framework-link needs an argument"); - options.links.push((lib, LinkType::Framework)); - } - "--raw-line" => { - let line = iter.next().expect("--raw-line needs an argument"); - options.raw_lines.push(line); - } - "--opaque-type" => { - let ty_canonical_name = iter.next() - .expect("--opaque-type expects a type"); - options.opaque_types.insert(ty_canonical_name); - } - "--blacklist-type" => { - let ty_canonical_name = iter.next() - .expect("--blacklist-type expects a type"); - options.hidden_types.insert(ty_canonical_name); - } - "--whitelist-type" => { - let ty_pat = iter.next() - .expect("--whitelist-type expects a type pattern"); - options.whitelisted_types.insert(&ty_pat); - } - "--whitelist-function" => { - let function_pat = iter.next() - .expect("--whitelist-function expects a pattern"); - options.whitelisted_functions.insert(&function_pat); - } - "--whitelist-var" => { - let var_pat = iter.next() - .expect("--whitelist-var expects a pattern"); - options.whitelisted_vars.insert(&var_pat); - } - "--bitfield-enum" => { - let enum_pat = iter.next() - .expect("--bitfield-enum expects a pattern"); - options.bitfield_enums.insert(&enum_pat); - } - "--" => { - while let Some(clang_arg) = iter.next() { - options.clang_args.push(clang_arg); - } - } - "--output" | "-o" => { - let out_name = iter.next().expect("-o expects a file name"); - dest_file = Some(out_name); - } - "--builtins" => { - options.builtins = true; - } - "--ignore-functions" => { - options.ignore_functions = true; - } - "--ignore-methods" => { - options.ignore_methods = true; - } - "--enable-cxx-namespaces" => { - options.enable_cxx_namespaces = true; - } - "--no-unstable-rust" => { - options.unstable_rust = false; - } - "--use-core" => { - options.use_core = true; - } - "--ctypes-prefix" => { - let prefix = iter.next() - .expect("--ctypes-prefix expects a prefix after it"); - options.ctypes_prefix = Some(prefix); - } - "--emit-clang-ast" => { - options.emit_ast = true; - } - "--no-convert-floats" => { - options.convert_floats = false; - } - "--use-msvc-mangling" => { - options.msvc_mangling = true; - } - "--dummy-uses" => { - let dummy_path = iter.next() - .expect("--dummy-uses expects a file path"); - options.dummy_uses = Some(dummy_path); - } - other if source_file.is_none() => { - source_file = Some(other.into()); - } - other => { - panic!("Unknown option: \"{}\"", other); - } - } - } - - if let Some(source_file) = source_file.take() { - options.clang_args.push(source_file); - options.input_header = options.clang_args.last().cloned(); - } else { - options.input_header = options.clang_args - .iter() - .find(|arg| arg.ends_with(".h") || arg.ends_with(".hpp")) - .cloned(); - } - - let out = if let Some(ref path_name) = dest_file { - let path = path::Path::new(path_name); - let file = fs::File::create(path).expect("Opening out file failed"); - Box::new(io::BufWriter::new(file)) as Box - } else { - Box::new(io::BufWriter::new(io::stdout())) as Box - }; - - (options, out) -} +mod options; +use options::builder_from_flags; pub fn main() { log::set_logger(|max_log_level| { @@ -304,14 +70,18 @@ pub fn main() { } } - let (options, out) = parse_args_or_exit(bind_args); - - let mut bindings = Bindings::generate(options, None) - .expect("Unable to generate bindings"); - - bindings.write_dummy_uses() - .expect("Unable to write dummy uses to file."); - - bindings.write(out) - .expect("Unable to write bindings to file."); + match builder_from_flags(env::args()) { + Ok((builder, output)) => { + let mut bindings = builder.generate() + .expect("Unable to generate bindings"); + bindings.write(output) + .expect("Unable to write output"); + bindings.write_dummy_uses() + .expect("Unable to write dummy uses to file."); + } + Err(error) => { + println!("{}", error); + std::process::exit(1); + } + }; } diff --git a/src/bin/options.rs b/src/bin/options.rs new file mode 100644 index 0000000000..9eff423244 --- /dev/null +++ b/src/bin/options.rs @@ -0,0 +1,257 @@ +use std::fs::File; +use std::io::{self, Error, ErrorKind}; + +use clap::{App, Arg}; + +use bindgen::{builder, Builder}; + +/// Construct a new [`Builder`](./struct.Builder.html) from command line flags. +pub fn builder_from_flags(args: I) -> Result<(Builder, Box), io::Error> + where I: Iterator +{ + let matches = App::new("bindgen") + .version(env!("CARGO_PKG_VERSION")) + .about("Generates Rust bindings from C/C++ headers.") + .usage("bindgen [FLAGS] [OPTIONS]
-- ...") + .args(&[ + Arg::with_name("header") + .help("C or C++ header file") + .required(true), + Arg::with_name("bitfield-enum") + .long("bitfield-enum") + .help("Mark any enum whose name matches as a set of bitfield flags instead of an enumeration.") + .value_name("regex") + .takes_value(true) + .multiple(true) + .number_of_values(1), + Arg::with_name("blacklist-type") + .long("blacklist-type") + .help("Mark a type as hidden.") + .value_name("type") + .takes_value(true) + .multiple(true) + .number_of_values(1), + Arg::with_name("builtins") + .long("builtins") + .help("Output bindings for builtin definitions, e.g. __builtin_va_list."), + Arg::with_name("ctypes-prefix") + .long("ctypes-prefix") + .help("Use the given prefix before raw types instead of ::std::os::raw.") + .value_name("prefix") + .takes_value(true), + // All positional arguments after the end of options marker, `--` + Arg::with_name("clang-args") + .multiple(true), + Arg::with_name("dummy-uses") + .long("dummy-uses") + .help("For testing purposes, generate a C/C++ file containing dummy uses of all types defined in the input header.") + .takes_value(true), + Arg::with_name("emit-clang-ast") + .long("emit-clang-ast") + .help("Output the Clang AST for debugging purposes."), + Arg::with_name("enable-cxx-namespaces") + .long("enable-cxx-namespaces") + .help("Enable support for C++ namespaces."), + Arg::with_name("framework") + .long("framework-link") + .help("Link to framework.") + .takes_value(true) + .multiple(true) + .number_of_values(1), + Arg::with_name("ignore-functions") + .long("ignore-functions") + .help("Do not generate bindings for functions or methods. This is useful when you only care about struct layouts."), + Arg::with_name("ignore-methods") + .long("ignore-methods") + .help("Do not generate bindings for methods."), + Arg::with_name("dynamic") + .short("l") + .long("link") + .help("Link to dynamic library.") + .takes_value(true) + .multiple(true) + .number_of_values(1), + Arg::with_name("no-convert-floats") + .long("no-convert-floats") + .help("Don't automatically convert floats to f32/f64."), + Arg::with_name("no-unstable-rust") + .long("no-unstable-rust") + .help("Do not generate unstable Rust code.") + .multiple(true), // FIXME: Pass legacy test suite + Arg::with_name("opaque-type") + .long("opaque-type") + .help("Mark a type as opaque.") + .value_name("type") + .takes_value(true) + .multiple(true) + .number_of_values(1), + Arg::with_name("output") + .short("o") + .long("output") + .help("Write Rust bindings to .") + .takes_value(true), + Arg::with_name("raw-line") + .long("raw-line") + .help("Add a raw line of Rust code at the beginning of output.") + .takes_value(true) + .multiple(true) + .number_of_values(1), + Arg::with_name("static") + .long("static-link") + .help("Link to static library.") + .takes_value(true) + .multiple(true) + .number_of_values(1), + Arg::with_name("use-core") + .long("use-core") + .help("Use types from Rust core instead of std."), + Arg::with_name("use-msvc-mangling") + .long("use-msvc-mangling") + .help("MSVC C++ ABI mangling. DEPRECATED: Has no effect."), + Arg::with_name("whitelist-function") + .long("whitelist-function") + .help("Whitelist all the free-standing functions matching . Other non-whitelisted functions will not be generated.") + .value_name("regex") + .takes_value(true) + .multiple(true) + .number_of_values(1), + Arg::with_name("whitelist-type") + .long("whitelist-type") + .help("Whitelist the type. Other non-whitelisted types will not be generated.") + .value_name("type") + .takes_value(true) + .multiple(true) + .number_of_values(1), + Arg::with_name("whitelist-var") + .long("whitelist-var") + .help("Whitelist all the free-standing variables matching . Other non-whitelisted variables will not be generated.") + .value_name("regex") + .takes_value(true) + .multiple(true) + .number_of_values(1), + ]) // .args() + .get_matches_from(args); + + let mut builder = builder(); + + if let Some(header) = matches.value_of("header") { + builder = builder.header(header); + } else { + return Err(Error::new(ErrorKind::Other, "Header not found")); + } + + if let Some(bitfields) = matches.values_of("bitfield-enum") { + for regex in bitfields { + builder = builder.bitfield_enum(regex); + } + } + + if let Some(hidden_types) = matches.values_of("blacklist-type") { + for ty in hidden_types { + builder = builder.hide_type(ty); + } + } + + if matches.is_present("builtins") { + builder = builder.emit_builtins(); + } + + if let Some(prefix) = matches.value_of("ctypes-prefix") { + builder = builder.ctypes_prefix(prefix); + } + + if let Some(dummy) = matches.value_of("dummy-uses") { + builder = builder.dummy_uses(dummy); + } + + if let Some(links) = matches.values_of("dynamic") { + for library in links { + builder = builder.link(library); + } + } + + if matches.is_present("emit-clang-ast") { + builder = builder.emit_clang_ast(); + } + + if matches.is_present("enable-cxx-namespaces") { + builder = builder.enable_cxx_namespaces(); + } + + if let Some(links) = matches.values_of("framework") { + for framework in links { + builder = builder.link_framework(framework); + } + } + + if matches.is_present("ignore-functions") { + builder = builder.ignore_functions(); + } + + if matches.is_present("ignore-methods") { + builder = builder.ignore_methods(); + } + + if matches.is_present("no-unstable-rust") { + builder = builder.no_unstable_rust(); + } + + if matches.is_present("no-convert-floats") { + builder = builder.no_convert_floats(); + } + + if let Some(opaque_types) = matches.values_of("opaque-type") { + for ty in opaque_types { + builder = builder.opaque_type(ty); + } + } + + if let Some(lines) = matches.values_of("raw-line") { + for line in lines { + builder = builder.raw_line(line); + } + } + + if let Some(links) = matches.values_of("static") { + for library in links { + builder = builder.link_static(library); + } + } + + if matches.is_present("use-core") { + builder = builder.use_core(); + } + + if let Some(whitelist) = matches.values_of("whitelist-function") { + for regex in whitelist { + builder = builder.whitelisted_function(regex); + } + } + + if let Some(whitelist) = matches.values_of("whitelist-type") { + for regex in whitelist { + builder = builder.whitelisted_type(regex); + } + } + + if let Some(whitelist) = matches.values_of("whitelist-var") { + for regex in whitelist { + builder = builder.whitelisted_var(regex); + } + } + + if let Some(args) = matches.values_of("clang-args") { + for arg in args { + builder = builder.clang_arg(arg); + } + } + + let output = if let Some(path) = matches.value_of("output") { + let file = try!(File::create(path)); + Box::new(io::BufWriter::new(file)) as Box + } else { + Box::new(io::BufWriter::new(io::stdout())) as Box + }; + + Ok((builder, output)) +} From 5e41fb90044adab76fe6a0a2560ea5e2c53ac6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 11 Nov 2016 00:29:58 +0100 Subject: [PATCH 0066/2291] ir: Search for compound structures when we have unexposed type and base class cursor. And it's not a valid identifier as a template parameter. See the comment and the tests for details. --- src/ir/comp.rs | 3 +- src/ir/item.rs | 3 +- src/ir/ty.rs | 50 ++++++++++++++++++- .../forward-inherit-struct-with-fields.rs | 17 +++++++ .../tests/forward-inherit-struct.rs | 18 +++++++ .../expectations/tests/inherit-namespaced.rs | 18 +++++++ .../multiple-inherit-empty-correct-layout.rs | 45 +++++++++++++++++ .../forward-inherit-struct-with-fields.hpp | 8 +++ tests/headers/forward-inherit-struct.hpp | 5 ++ tests/headers/inherit-namespaced.hpp | 4 ++ .../multiple-inherit-empty-correct-layout.hpp | 3 ++ 11 files changed, 170 insertions(+), 4 deletions(-) create mode 100644 tests/expectations/tests/forward-inherit-struct-with-fields.rs create mode 100644 tests/expectations/tests/forward-inherit-struct.rs create mode 100644 tests/expectations/tests/inherit-namespaced.rs create mode 100644 tests/expectations/tests/multiple-inherit-empty-correct-layout.rs create mode 100644 tests/headers/forward-inherit-struct-with-fields.hpp create mode 100644 tests/headers/forward-inherit-struct.hpp create mode 100644 tests/headers/inherit-namespaced.hpp create mode 100644 tests/headers/multiple-inherit-empty-correct-layout.hpp diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 41e5c3d3dd..bd794a98dd 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -635,7 +635,7 @@ impl CompInfo { ci.has_vtable = cur.is_virtual_base(); } let type_id = - Item::from_ty(&cur.cur_type(), None, None, ctx) + Item::from_ty(&cur.cur_type(), Some(cur), None, ctx) .expect("BaseSpecifier"); ci.base_members.push(type_id); } @@ -763,6 +763,7 @@ impl CompInfo { CXCursor_UnionDecl => CompKind::Union, CXCursor_ClassDecl | CXCursor_StructDecl => CompKind::Struct, + CXCursor_CXXBaseSpecifier | CXCursor_ClassTemplatePartialSpecialization | CXCursor_ClassTemplate => { match cursor.template_kind() { diff --git a/src/ir/item.rs b/src/ir/item.rs index c6d80a0833..691cfec2c2 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -1043,8 +1043,7 @@ impl ClangItemParser for Item { } } // If we have recursed into the AST all we know, and we still - // haven't found what we've got, let's - // just make a named type. + // haven't found what we've got, let's just make a named type. // // This is what happens with some template members, for example. // diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 77dc61be6d..57490cc295 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -540,8 +540,56 @@ impl Type { } else if let Some(location) = location { match location.kind() { CXCursor_ClassTemplatePartialSpecialization | + CXCursor_CXXBaseSpecifier | CXCursor_ClassTemplate => { - name = location.spelling(); + if location.kind() == CXCursor_CXXBaseSpecifier { + // In the case we're parsing a base specifier + // inside an unexposed or invalid type, it means + // that we're parsing one of two things: + // + // * A template parameter. + // * A complex class that isn't exposed. + // + // This means, unfortunately, that there's no + // good way to differentiate between them. + // + // Probably we could try to look at the + // declaration and complicate more this logic, + // but we'll keep it simple... if it's a valid + // C++ identifier, we'll consider it as a + // template parameter. + // + // This is because: + // + // * We expect every other base that is a + // proper identifier (that is, a simple + // struct/union declaration), to be exposed, + // so this path can't be reached in that + // case. + // + // * Quite conveniently, complex base + // specifiers preserve their full names (that + // is: Foo instead of Foo). We can take + // advantage of this. + // + // If we find some edge case where this doesn't + // work (which I guess is unlikely, see the + // different test cases[1][2][3][4]), we'd need + // to find more creative ways of differentiating + // these two cases. + // + // [1]: inherit_named.hpp + // [2]: forward-inherit-struct-with-fields.hpp + // [3]: forward-inherit-struct.hpp + // [4]: inherit-namespaced.hpp + if location.spelling() + .chars() + .all(|c| c.is_alphanumeric() || c == '_') { + return Err(ParseError::Recurse); + } + } else { + name = location.spelling(); + } let complex = CompInfo::from_ty(potential_id, ty, Some(location), diff --git a/tests/expectations/tests/forward-inherit-struct-with-fields.rs b/tests/expectations/tests/forward-inherit-struct-with-fields.rs new file mode 100644 index 0000000000..8410497101 --- /dev/null +++ b/tests/expectations/tests/forward-inherit-struct-with-fields.rs @@ -0,0 +1,17 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Rooted { + pub _base: RootedBase, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RootedBase { + pub foo: *mut T, + pub next: *mut Rooted, +} diff --git a/tests/expectations/tests/forward-inherit-struct.rs b/tests/expectations/tests/forward-inherit-struct.rs new file mode 100644 index 0000000000..e053adcd1a --- /dev/null +++ b/tests/expectations/tests/forward-inherit-struct.rs @@ -0,0 +1,18 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Rooted { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RootedBase { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} diff --git a/tests/expectations/tests/inherit-namespaced.rs b/tests/expectations/tests/inherit-namespaced.rs new file mode 100644 index 0000000000..a58058b002 --- /dev/null +++ b/tests/expectations/tests/inherit-namespaced.rs @@ -0,0 +1,18 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RootedBase { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Rooted { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} diff --git a/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs b/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs new file mode 100644 index 0000000000..5e9cf5224c --- /dev/null +++ b/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs @@ -0,0 +1,45 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Foo { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Bar { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for Bar { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Baz { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Baz() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for Baz { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/forward-inherit-struct-with-fields.hpp b/tests/headers/forward-inherit-struct-with-fields.hpp new file mode 100644 index 0000000000..437fff5d62 --- /dev/null +++ b/tests/headers/forward-inherit-struct-with-fields.hpp @@ -0,0 +1,8 @@ +template class Rooted; +namespace js { + template class RootedBase { + T* foo; + Rooted* next; + }; +} +template class Rooted : js::RootedBase {}; diff --git a/tests/headers/forward-inherit-struct.hpp b/tests/headers/forward-inherit-struct.hpp new file mode 100644 index 0000000000..ac7aef5ee0 --- /dev/null +++ b/tests/headers/forward-inherit-struct.hpp @@ -0,0 +1,5 @@ +template class Rooted; +namespace js { + template class RootedBase {}; +} +template class Rooted : js::RootedBase {}; diff --git a/tests/headers/inherit-namespaced.hpp b/tests/headers/inherit-namespaced.hpp new file mode 100644 index 0000000000..61eafd5a57 --- /dev/null +++ b/tests/headers/inherit-namespaced.hpp @@ -0,0 +1,4 @@ +namespace js { + template class RootedBase {}; +} +template class Rooted : js::RootedBase {}; diff --git a/tests/headers/multiple-inherit-empty-correct-layout.hpp b/tests/headers/multiple-inherit-empty-correct-layout.hpp new file mode 100644 index 0000000000..1e2b133a0a --- /dev/null +++ b/tests/headers/multiple-inherit-empty-correct-layout.hpp @@ -0,0 +1,3 @@ +struct Foo {}; +struct Bar {}; +struct Baz : public Foo, public Bar {}; From 1f9ac5c419abd530f894450f32050f2c380aa844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 11 Nov 2016 00:41:43 +0100 Subject: [PATCH 0067/2291] Reformat. --- src/bin/options.rs | 40 ++++++++++++++++++++++++++-------------- src/ir/var.rs | 4 +++- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/bin/options.rs b/src/bin/options.rs index 9eff423244..9f746fd087 100644 --- a/src/bin/options.rs +++ b/src/bin/options.rs @@ -1,13 +1,15 @@ -use std::fs::File; -use std::io::{self, Error, ErrorKind}; -use clap::{App, Arg}; -use bindgen::{builder, Builder}; +use bindgen::{Builder, builder}; + +use clap::{App, Arg}; +use std::fs::File; +use std::io::{self, Error, ErrorKind}; /// Construct a new [`Builder`](./struct.Builder.html) from command line flags. -pub fn builder_from_flags(args: I) -> Result<(Builder, Box), io::Error> - where I: Iterator +pub fn builder_from_flags(args: I) + -> Result<(Builder, Box), io::Error> + where I: Iterator, { let matches = App::new("bindgen") .version(env!("CARGO_PKG_VERSION")) @@ -19,7 +21,8 @@ pub fn builder_from_flags(args: I) -> Result<(Builder, Box), io::E .required(true), Arg::with_name("bitfield-enum") .long("bitfield-enum") - .help("Mark any enum whose name matches as a set of bitfield flags instead of an enumeration.") + .help("Mark any enum whose name matches as a set of \ + bitfield flags instead of an enumeration.") .value_name("regex") .takes_value(true) .multiple(true) @@ -33,10 +36,12 @@ pub fn builder_from_flags(args: I) -> Result<(Builder, Box), io::E .number_of_values(1), Arg::with_name("builtins") .long("builtins") - .help("Output bindings for builtin definitions, e.g. __builtin_va_list."), + .help("Output bindings for builtin definitions, e.g. \ + __builtin_va_list."), Arg::with_name("ctypes-prefix") .long("ctypes-prefix") - .help("Use the given prefix before raw types instead of ::std::os::raw.") + .help("Use the given prefix before raw types instead of \ + ::std::os::raw.") .value_name("prefix") .takes_value(true), // All positional arguments after the end of options marker, `--` @@ -44,7 +49,8 @@ pub fn builder_from_flags(args: I) -> Result<(Builder, Box), io::E .multiple(true), Arg::with_name("dummy-uses") .long("dummy-uses") - .help("For testing purposes, generate a C/C++ file containing dummy uses of all types defined in the input header.") + .help("For testing purposes, generate a C/C++ file containing \ + dummy uses of all types defined in the input header.") .takes_value(true), Arg::with_name("emit-clang-ast") .long("emit-clang-ast") @@ -60,7 +66,8 @@ pub fn builder_from_flags(args: I) -> Result<(Builder, Box), io::E .number_of_values(1), Arg::with_name("ignore-functions") .long("ignore-functions") - .help("Do not generate bindings for functions or methods. This is useful when you only care about struct layouts."), + .help("Do not generate bindings for functions or methods. This \ + is useful when you only care about struct layouts."), Arg::with_name("ignore-methods") .long("ignore-methods") .help("Do not generate bindings for methods."), @@ -110,21 +117,26 @@ pub fn builder_from_flags(args: I) -> Result<(Builder, Box), io::E .help("MSVC C++ ABI mangling. DEPRECATED: Has no effect."), Arg::with_name("whitelist-function") .long("whitelist-function") - .help("Whitelist all the free-standing functions matching . Other non-whitelisted functions will not be generated.") + .help("Whitelist all the free-standing functions matching \ + . Other non-whitelisted functions will not be \ + generated.") .value_name("regex") .takes_value(true) .multiple(true) .number_of_values(1), Arg::with_name("whitelist-type") .long("whitelist-type") - .help("Whitelist the type. Other non-whitelisted types will not be generated.") + .help("Whitelist the type. Other non-whitelisted types will \ + not be generated.") .value_name("type") .takes_value(true) .multiple(true) .number_of_values(1), Arg::with_name("whitelist-var") .long("whitelist-var") - .help("Whitelist all the free-standing variables matching . Other non-whitelisted variables will not be generated.") + .help("Whitelist all the free-standing variables matching \ + . Other non-whitelisted variables will not be \ + generated.") .value_name("regex") .takes_value(true) .multiple(true) diff --git a/src/ir/var.rs b/src/ir/var.rs index 047e8642cf..0e7df61884 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -111,7 +111,9 @@ impl ClangSubItemParser for Var { EvalResult::Invalid => return Err(ParseError::Continue), EvalResult::Int(Wrapping(value)) => { - let kind = ctx.options().type_chooser.as_ref() + let kind = ctx.options() + .type_chooser + .as_ref() .and_then(|c| c.int_macro(&name, value)) .unwrap_or_else(|| { if value < 0 { From 267d440ae02e6475322772f0deddbe8ed161076f Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 10 Nov 2016 16:04:08 -0800 Subject: [PATCH 0068/2291] Describe how to use `creduce` with `bindgen` This commit extends CONTRIBUTING.md with information on how to use `creduce` to minimize input header test cases that cause `bindgen` to panic, generate bad bindings, or any other incorrectness. --- CONTRIBUTING.md | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fb3208ff54..ce95e21cf8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,6 +14,7 @@ yourself. * [Authoring New Tests](#tests-new) * [Automatic Code Formatting](#formatting) * [Debug Logging](#logs) +* [Using `creduce` to Minimize Test Cases](#creduce) ## Code of Conduct @@ -138,3 +139,88 @@ This logging can also be used when debugging failing tests under ``` $ RUST_LOG=bindgen ./tests/tools/run-bindgen.py ./target/debug/bindgen tests/headers/whatever.h ``` + +## Using `creduce` to Minimize Test Cases + +If you are hacking on `bindgen` and find a test case that causes an unexpected +panic, results in bad Rust bindings, or some other incorrectness in `bindgen`, +then using `creduce` can help reduce the test case to a minimal one. + +[Follow these instructions for building and/or installing `creduce`.](https://github.com/csmith-project/creduce/blob/master/INSTALL) + +Running `creduce` requires two things: + +1. Your isolated test case, and + +2. A script to act as a predicate script describing whether the behavior you're + trying to isolate occurred. + +With those two things in hand, running `creduce` looks like this: + + $ creduce ./predicate.sh ./isolated_test_case.h + +### Isolating Your Test Case + +Use the `-save-temps` flag to make Clang spit out its intermediate +representations when compiling the test case into an object file. + + $ clang[++ -x c++ --std=c++14] -save-temps -c my_test_case.h + +There should now be a `my_test_case.ii` file, which is the results after the C +pre-processor has processed all the `#include`s, `#define`s, and `#ifdef`s. This +is generally what we're looking for. + +### Writing a Predicate Script + +Writing a `predicate.sh` script for a `bindgen` test case is fairly +straightforward. One potential gotcha is that `creduce` can and will attempt to +reduce test cases into invalid C/C++ code. That might be useful for C/C++ +compilers, but we generally only care about valid C/C++ input headers. + +Here is a skeleton predicate script: + +```bash +#!/usr/bin/env bash + +# Exit the script with a nonzero exit code if: +# * any individual command finishes with a nonzero exit code, or +# * we access any undefined variable. +set -eu + +# Print out Rust backtraces on panic. Useful for minimizing a particular panic. +export RUST_BACKTRACE=1 + +# If the `libclang.so` you're using for `bindgen` isn't the system +# `libclang.so`, let the linker find it. +export LD_LIBRARY_PATH=~/path/to/your/directory/containing/libclang + +# Make sure that the reduced test case is valid C/C++ by compiling it. If it +# isn't valid C/C++, this command will exit with a nonzero exit code and cause +# the whole script to do the same. +clang[++ --std=c++14] -c ./pre_processed_header.hpp + +# Run `bindgen` and `grep` for the thing your hunting down! Make sure to include +# `2>&1` to get at stderr if you're hunting down a panic. +~/src/rust-bindgen/target/debug/bindgen \ + ./pre_processed_header.hpp \ + [ ] \ + 2>&1 \ + | grep "" +``` + +When hunting down a panic, I `grep`ed like this: + + ... | grep "thread main panicked at ''" + +When hunting down bad codegen for a base member, I `grep`ed like this: + + ... | grep "pub _base: MyInvalidBaseTypeThatShouldntBeHere" + +That's pretty much it! I want to impress upon you that `creduce` is *really* +helpful and has enabled me to reduce 30k lines of test case into 5 lines. And it +works pretty quickly too. Super valuable tool to have in your belt when hacking +on `bindgen`! + +Happy bug hunting and test case reducing! + +[More information on using `creduce`.](https://embed.cs.utah.edu/creduce/using/) From 53f7a50e2e4f5ef4784e005dee1e00089a7d4ec8 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 10 Nov 2016 10:39:24 -0800 Subject: [PATCH 0069/2291] Add rudimentary support for `__float128` This adds `__float128` as a builtin type, and generates an opaque array of 16 `u8`s to represent it in the generated bindings since Rust doesn't have an `f128` type. Context and motivation: Somehow `__float128` is getting pulled into SpiderMonkey headers from somewhere, and the lack of `__float128` support was causing bindgen to hard fail in bindings generation. --- src/clangll.rs | 1 + src/codegen/mod.rs | 35 ++++++++++++---------------- src/ir/context.rs | 1 + src/ir/ty.rs | 7 +++++- tests/expectations/tests/float128.rs | 7 ++++++ tests/headers/float128.hpp | 13 +++++++++++ 6 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 tests/expectations/tests/float128.rs create mode 100644 tests/headers/float128.hpp diff --git a/src/clangll.rs b/src/clangll.rs index b89c07569f..b974311769 100644 --- a/src/clangll.rs +++ b/src/clangll.rs @@ -392,6 +392,7 @@ pub const CXType_Dependent: c_uint = 26; pub const CXType_ObjCId: c_uint = 27; pub const CXType_ObjCClass: c_uint = 28; pub const CXType_ObjCSel: c_uint = 29; +pub const CXType_Float128: c_uint = 30; pub const CXType_FirstBuiltin: c_uint = 2; pub const CXType_LastBuiltin: c_uint = 29; pub const CXType_Complex: c_uint = 100; diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 5e68da14a5..3bee69b6b9 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1609,27 +1609,22 @@ impl ToRustTy for Type { } } TypeKind::Float(fk) => { + // TODO: we probably should just take the type layout into + // account? + // + // Also, maybe this one shouldn't be the default? + // + // FIXME: `c_longdouble` doesn't seem to be defined in some + // systems, so we use `c_double` directly. use ir::ty::FloatKind; - if ctx.options().convert_floats { - // TODO: we probably should just take the type layout into - // account? - // - // Also, maybe this one shouldn't be the default? - match fk { - FloatKind::Float => aster::ty::TyBuilder::new().f32(), - FloatKind::Double | FloatKind::LongDouble => { - aster::ty::TyBuilder::new().f64() - } - } - } else { - // FIXME: `c_longdouble` doesn't seem to be defined in some - // systems, so we use `c_double` directly. - match fk { - FloatKind::Float => raw!(c_float), - FloatKind::Double | FloatKind::LongDouble => { - raw!(c_double) - } - } + match (fk, ctx.options().convert_floats) { + (FloatKind::Float, true) => aster::ty::TyBuilder::new().f32(), + (FloatKind::Double, true) | + (FloatKind::LongDouble, true) => aster::ty::TyBuilder::new().f64(), + (FloatKind::Float, false) => raw!(c_float), + (FloatKind::Double, false) | + (FloatKind::LongDouble, false) => raw!(c_double), + (FloatKind::Float128, _) => aster::ty::TyBuilder::new().array(16).u8(), } } TypeKind::Function(ref fs) => { diff --git a/src/ir/context.rs b/src/ir/context.rs index 00ece52975..92c6fb4983 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -697,6 +697,7 @@ impl<'ctx> BindgenContext<'ctx> { CXType_Float => TypeKind::Float(FloatKind::Float), CXType_Double => TypeKind::Float(FloatKind::Double), CXType_LongDouble => TypeKind::Float(FloatKind::LongDouble), + CXType_Float128 => TypeKind::Float(FloatKind::Float128), _ => return None, }; diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 77dc61be6d..5a72eb2233 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -363,6 +363,8 @@ pub enum FloatKind { Double, /// A `long double`. LongDouble, + /// A `__float128`. + Float128, } /// The different kinds of types that we can parse. @@ -771,7 +773,10 @@ impl Type { ctx); } _ => { - error!("unsupported type {:?} at {:?}", ty, location); + error!("unsupported type: kind = {:?}; ty = {:?}; at {:?}", + ty.kind(), + ty, + location); return Err(ParseError::Continue); } }; diff --git a/tests/expectations/tests/float128.rs b/tests/expectations/tests/float128.rs new file mode 100644 index 0000000000..b4b7b2bcee --- /dev/null +++ b/tests/expectations/tests/float128.rs @@ -0,0 +1,7 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + + diff --git a/tests/headers/float128.hpp b/tests/headers/float128.hpp new file mode 100644 index 0000000000..f554e88e1a --- /dev/null +++ b/tests/headers/float128.hpp @@ -0,0 +1,13 @@ +// FIXME: libclang < 3.9 does not expose `__float128` in its interface, so this +// test will fail. Once we remove support for `--features llvm_stable` and +// require libclang >= 3.9, we can reenable this test. +// +// static __float128 global = 1.0; + +// FIXME: We have no way to get 128 bit aligned structs in Rust at the moment, +// and therefore the generated layout tests for this struct will fail. When we +// can enforce 128 bit alignment, we can re-enable this test. +// +// struct A { +// __float128 f; +// }; From fc38f9b18a9dacc76b7e8a5c8633f0f02289daae Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 11 Nov 2016 10:13:26 -0800 Subject: [PATCH 0070/2291] Disable OSX builds on Travis CI The wait time to get OSX machines on Travis CI is *way* too long at the moment. We'll be able to revert this commit in the future, once Travis CI adds more OSX machines to their cluster, hopefully. --- .travis.yml | 1 - ci/before_install.sh | 15 +-------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index 36bafd7ad4..467c42dca7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,6 @@ addons: os: - linux - - osx rust: - stable diff --git a/ci/before_install.sh b/ci/before_install.sh index ebe4f4fb94..06c75218dc 100644 --- a/ci/before_install.sh +++ b/ci/before_install.sh @@ -1,11 +1,6 @@ set -e pushd ~ -# Workaround for Travis CI macOS bug (https://github.com/travis-ci/travis-ci/issues/6307) -if [ "${TRAVIS_OS_NAME}" == "osx" ]; then - rvm get head || true -fi - function llvm_version_triple() { if [ "$1" == "3.8" ]; then echo "3.8.0" @@ -23,17 +18,9 @@ function llvm_download() { tar -xf ${LLVM}.tar.xz -C llvm --strip-components=1 export LLVM_CONFIG_PATH=`pwd`/llvm/bin/llvm-config - if [ "${TRAVIS_OS_NAME}" == "osx" ]; then - cp llvm/lib/libclang.dylib /usr/local/lib/libclang.dylib - fi } - -if [ "${TRAVIS_OS_NAME}" == "linux" ]; then - llvm_download linux-gnu-ubuntu-14.04 -else - llvm_download apple-darwin -fi +llvm_download linux-gnu-ubuntu-14.04 popd set +e From b5d879ae4a88068e96b9fc701e55cd64e2a9ba39 Mon Sep 17 00:00:00 2001 From: Jean-Philippe DUFRAIGNE Date: Tue, 8 Nov 2016 20:19:13 +0000 Subject: [PATCH 0071/2291] Use __BindegenComplex for C Complex Fix #72 C complex only exists for floating point types. C Complex are built in types long double _Complex is not supported. Long double would be an f128, runing generated binding test produces: assertion failed: `(left == right)` (left: `16`, right: `32`)', tests/expectations/tests/complex.rs:72 We test global long double _Complex because it does not require layout tests. Handle all the different way a complex can be present in BindgenContext calling generated_bindegen_complex to indicate that __BindgenContext will need to be added. --- src/codegen/helpers.rs | 47 +++++++++++++ src/codegen/mod.rs | 57 ++++++++-------- src/ir/context.rs | 26 ++++++++ src/ir/ty.rs | 16 ++--- tests/expectations/tests/complex.rs | 76 ++++++++-------------- tests/expectations/tests/complex_global.rs | 24 +++++++ tests/expectations/tests/convert-floats.rs | 10 ++- tests/headers/complex.h | 23 ++++--- tests/headers/complex_global.h | 3 + tests/headers/convert-floats.h | 2 + tests/headers/whitelist_basic.hpp | 1 + 11 files changed, 186 insertions(+), 99 deletions(-) create mode 100644 tests/expectations/tests/complex_global.rs create mode 100644 tests/headers/complex_global.h diff --git a/src/codegen/helpers.rs b/src/codegen/helpers.rs index 234dcbcc0c..016ba4789f 100644 --- a/src/codegen/helpers.rs +++ b/src/codegen/helpers.rs @@ -71,3 +71,50 @@ impl BlobTyBuilder { } } } + +pub mod ast_ty { + use aster; + use ir::context::BindgenContext; + use ir::ty::FloatKind; + use syntax::ast; + use syntax::ptr::P; + + pub fn raw_type(ctx: &BindgenContext, name: &str) -> P { + let ident = ctx.rust_ident_raw(&name); + match ctx.options().ctypes_prefix { + Some(ref prefix) => { + let prefix = ctx.rust_ident_raw(prefix); + quote_ty!(ctx.ext_cx(), $prefix::$ident) + } + None => quote_ty!(ctx.ext_cx(), ::std::os::raw::$ident), + } + } + + pub fn float_kind_rust_type(ctx: &BindgenContext, + fk: FloatKind) + -> P { + macro_rules! raw { + ($ty: ident) => { + raw_type(ctx, stringify!($ty)) + } + } + // TODO: we probably should just take the type layout into + // account? + // + // Also, maybe this one shouldn't be the default? + // + // FIXME: `c_longdouble` doesn't seem to be defined in some + // systems, so we use `c_double` directly. + match (fk, ctx.options().convert_floats) { + (FloatKind::Float, true) => aster::ty::TyBuilder::new().f32(), + (FloatKind::Double, true) | + (FloatKind::LongDouble, true) => aster::ty::TyBuilder::new().f64(), + (FloatKind::Float, false) => raw!(c_float), + (FloatKind::Double, false) | + (FloatKind::LongDouble, false) => raw!(c_double), + (FloatKind::Float128, _) => { + aster::ty::TyBuilder::new().array(16).u8() + } + } + } +} diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 3bee69b6b9..1511f62908 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -336,6 +336,7 @@ impl CodeGenerator for Type { TypeKind::NullPtr | TypeKind::Int(..) | TypeKind::Float(..) | + TypeKind::Complex(..) | TypeKind::Array(..) | TypeKind::Pointer(..) | TypeKind::BlockPointer | @@ -1549,21 +1550,12 @@ impl ItemToRustTy for Item { } } -fn raw_type(ctx: &BindgenContext, name: &str) -> P { - let ident = ctx.rust_ident_raw(&name); - match ctx.options().ctypes_prefix { - Some(ref prefix) => { - let prefix = ctx.rust_ident_raw(prefix); - quote_ty!(ctx.ext_cx(), $prefix::$ident) - } - None => quote_ty!(ctx.ext_cx(), ::std::os::raw::$ident), - } -} - impl ToRustTy for Type { type Extra = Item; fn to_rust_ty(&self, ctx: &BindgenContext, item: &Item) -> P { + use self::helpers::ast_ty::*; + macro_rules! raw { ($ty: ident) => { raw_type(ctx, stringify!($ty)) @@ -1608,24 +1600,12 @@ impl ToRustTy for Type { } } } - TypeKind::Float(fk) => { - // TODO: we probably should just take the type layout into - // account? - // - // Also, maybe this one shouldn't be the default? - // - // FIXME: `c_longdouble` doesn't seem to be defined in some - // systems, so we use `c_double` directly. - use ir::ty::FloatKind; - match (fk, ctx.options().convert_floats) { - (FloatKind::Float, true) => aster::ty::TyBuilder::new().f32(), - (FloatKind::Double, true) | - (FloatKind::LongDouble, true) => aster::ty::TyBuilder::new().f64(), - (FloatKind::Float, false) => raw!(c_float), - (FloatKind::Double, false) | - (FloatKind::LongDouble, false) => raw!(c_double), - (FloatKind::Float128, _) => aster::ty::TyBuilder::new().array(16).u8(), - } + TypeKind::Float(fk) => float_kind_rust_type(ctx, fk), + TypeKind::Complex(fk) => { + let float_path = float_kind_rust_type(ctx, fk); + + ctx.generated_bindegen_complex(); + quote_ty!(ctx.ext_cx(), __BindgenComplex<$float_path>) } TypeKind::Function(ref fs) => { let ty = fs.to_rust_ty(ctx, item); @@ -1900,6 +1880,9 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { if saw_union && !context.options().unstable_rust { utils::prepend_union_types(context, &mut result); } + if context.need_bindegen_complex_type() { + utils::prepend_complex_type(context, &mut result); + } result }) } @@ -1981,6 +1964,22 @@ mod utils { result.extend(old_items.into_iter()); } + pub fn prepend_complex_type(ctx: &BindgenContext, + result: &mut Vec>) { + let complex_type = quote_item!(ctx.ext_cx(), + #[derive(PartialEq, Copy, Clone, Hash, Debug, Default)] + #[repr(C)] + pub struct __BindgenComplex { + pub re: T, + pub im: T + } + ) + .unwrap(); + + let items = vec![complex_type]; + let old_items = mem::replace(result, items); + result.extend(old_items.into_iter()); + } pub fn build_templated_path(item: &Item, ctx: &BindgenContext, diff --git a/src/ir/context.rs b/src/ir/context.rs index 92c6fb4983..c7949befd7 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -5,6 +5,7 @@ use cexpr; use clang::{self, Cursor}; use parse::ClangItemParser; use std::borrow::Cow; +use std::cell::Cell; use std::collections::{HashMap, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; @@ -99,6 +100,9 @@ pub struct BindgenContext<'ctx> { /// The options given by the user via cli or other medium. options: BindgenOptions, + + /// Whether a bindgen complex was generated + generated_bindegen_complex: Cell, } impl<'ctx> BindgenContext<'ctx> { @@ -134,6 +138,7 @@ impl<'ctx> BindgenContext<'ctx> { index: index, translation_unit: translation_unit, options: options, + generated_bindegen_complex: Cell::new(false), }; me.add_item(root_module, None, None); @@ -698,6 +703,17 @@ impl<'ctx> BindgenContext<'ctx> { CXType_Double => TypeKind::Float(FloatKind::Double), CXType_LongDouble => TypeKind::Float(FloatKind::LongDouble), CXType_Float128 => TypeKind::Float(FloatKind::Float128), + CXType_Complex => { + let float_type = ty.elem_type() + .expect("Not able to resolve complex type?"); + let float_kind = match float_type.kind() { + CXType_Float => FloatKind::Float, + CXType_Double => FloatKind::Double, + CXType_LongDouble => FloatKind::LongDouble, + _ => panic!("Non floating-type complex?"), + }; + TypeKind::Complex(float_kind) + } _ => return None, }; @@ -930,6 +946,16 @@ impl<'ctx> BindgenContext<'ctx> { self.rust_ident_raw("std") } } + + /// Call if a binden complex is generated + pub fn generated_bindegen_complex(&self) { + self.generated_bindegen_complex.set(true) + } + + /// Whether we need to generate the binden complex type + pub fn need_bindegen_complex_type(&self) -> bool { + self.generated_bindegen_complex.get() + } } /// An iterator over whitelisted items. diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 4c2ef5d8b7..d5ac6116bf 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -334,6 +334,7 @@ impl Type { TypeKind::Comp(..) | TypeKind::Int(..) | TypeKind::Float(..) | + TypeKind::Complex(..) | TypeKind::Function(..) | TypeKind::Enum(..) | TypeKind::Reference(..) | @@ -386,6 +387,9 @@ pub enum TypeKind { /// A floating point type. Float(FloatKind), + /// A complex floating point type. + Complex(FloatKind), + /// A type alias, with a name, that points to another type. Alias(String, ItemId), @@ -463,6 +467,7 @@ impl Type { TypeKind::Named(..) | TypeKind::Int(..) | TypeKind::Float(..) | + TypeKind::Complex(..) | TypeKind::Function(..) | TypeKind::Enum(..) | TypeKind::Reference(..) | @@ -801,17 +806,6 @@ impl Type { .expect("Not able to resolve array element?"); TypeKind::Array(inner, ty.num_elements().unwrap()) } - // A complex number is always a real and an imaginary part, - // so - // represent that as a two-item array. - CXType_Complex => { - let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), - location, - parent_id, - ctx) - .expect("Not able to resolve array element?"); - TypeKind::Array(inner, 2) - } #[cfg(not(feature="llvm_stable"))] CXType_Elaborated => { return Self::from_clang_ty(potential_id, diff --git a/tests/expectations/tests/complex.rs b/tests/expectations/tests/complex.rs index e11a049e2d..f2a97952bf 100644 --- a/tests/expectations/tests/complex.rs +++ b/tests/expectations/tests/complex.rs @@ -4,81 +4,61 @@ #![allow(non_snake_case)] +#[derive(PartialEq, Copy, Clone, Hash, Debug, Default)] #[repr(C)] -#[derive(Debug, Copy)] -pub struct Testdouble { - pub mMember: [f64; 2usize], -} -#[test] -fn bindgen_test_layout_Testdouble() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 8usize); -} -impl Clone for Testdouble { - fn clone(&self) -> Self { *self } -} -#[repr(C)] -#[derive(Debug, Copy)] -pub struct TestdoublePtr { - pub mMember: *mut [f64; 2usize], -} -#[test] -fn bindgen_test_layout_TestdoublePtr() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); -} -impl Clone for TestdoublePtr { - fn clone(&self) -> Self { *self } +pub struct __BindgenComplex { + pub re: T, + pub im: T, } #[repr(C)] #[derive(Debug, Copy)] -pub struct Testfloat { - pub mMember: [f32; 2usize], +pub struct TestDouble { + pub mMember: __BindgenComplex, } #[test] -fn bindgen_test_layout_Testfloat() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); +fn bindgen_test_layout_TestDouble() { + assert_eq!(::std::mem::size_of::() , 16usize); + assert_eq!(::std::mem::align_of::() , 8usize); } -impl Clone for Testfloat { +impl Clone for TestDouble { fn clone(&self) -> Self { *self } } #[repr(C)] #[derive(Debug, Copy)] -pub struct TestfloatPtr { - pub mMember: *mut [f32; 2usize], +pub struct TestDoublePtr { + pub mMember: *mut __BindgenComplex, } #[test] -fn bindgen_test_layout_TestfloatPtr() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); +fn bindgen_test_layout_TestDoublePtr() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); } -impl Clone for TestfloatPtr { +impl Clone for TestDoublePtr { fn clone(&self) -> Self { *self } } #[repr(C)] #[derive(Debug, Copy)] -pub struct Testint { - pub mMember: [::std::os::raw::c_int; 2usize], +pub struct TestFloat { + pub mMember: __BindgenComplex, } #[test] -fn bindgen_test_layout_Testint() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); +fn bindgen_test_layout_TestFloat() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 4usize); } -impl Clone for Testint { +impl Clone for TestFloat { fn clone(&self) -> Self { *self } } #[repr(C)] #[derive(Debug, Copy)] -pub struct TestintPtr { - pub mMember: *mut [::std::os::raw::c_int; 2usize], +pub struct TestFloatPtr { + pub mMember: *mut __BindgenComplex, } #[test] -fn bindgen_test_layout_TestintPtr() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); +fn bindgen_test_layout_TestFloatPtr() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); } -impl Clone for TestintPtr { +impl Clone for TestFloatPtr { fn clone(&self) -> Self { *self } } diff --git a/tests/expectations/tests/complex_global.rs b/tests/expectations/tests/complex_global.rs new file mode 100644 index 0000000000..badc4d1f31 --- /dev/null +++ b/tests/expectations/tests/complex_global.rs @@ -0,0 +1,24 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[derive(PartialEq, Copy, Clone, Hash, Debug, Default)] +#[repr(C)] +pub struct __BindgenComplex { + pub re: T, + pub im: T, +} +extern "C" { + #[link_name = "globalValueFloat"] + pub static mut globalValueFloat: __BindgenComplex; +} +extern "C" { + #[link_name = "globalValueDouble"] + pub static mut globalValueDouble: __BindgenComplex; +} +extern "C" { + #[link_name = "globalValueLongDouble"] + pub static mut globalValueLongDouble: __BindgenComplex; +} diff --git a/tests/expectations/tests/convert-floats.rs b/tests/expectations/tests/convert-floats.rs index ed5bcdcdee..5cd38c133c 100644 --- a/tests/expectations/tests/convert-floats.rs +++ b/tests/expectations/tests/convert-floats.rs @@ -4,6 +4,12 @@ #![allow(non_snake_case)] +#[derive(PartialEq, Copy, Clone, Hash, Debug, Default)] +#[repr(C)] +pub struct __BindgenComplex { + pub re: T, + pub im: T, +} #[repr(C)] #[derive(Debug, Copy)] pub struct foo { @@ -11,10 +17,12 @@ pub struct foo { pub baz: ::std::os::raw::c_float, pub bazz: ::std::os::raw::c_double, pub bazzz: *mut ::std::os::raw::c_double, + pub complexFloat: __BindgenComplex<::std::os::raw::c_float>, + pub complexDouble: __BindgenComplex<::std::os::raw::c_double>, } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 24usize); + assert_eq!(::std::mem::size_of::() , 48usize); assert_eq!(::std::mem::align_of::() , 8usize); } impl Clone for foo { diff --git a/tests/headers/complex.h b/tests/headers/complex.h index ad7af59f21..04877a4ee4 100644 --- a/tests/headers/complex.h +++ b/tests/headers/complex.h @@ -1,13 +1,16 @@ -#define COMPLEX_TEST(ty_) \ - struct Test##ty_ { \ - ty_ _Complex mMember; \ - \ - }; \ - struct Test##ty_##Ptr { \ - ty_ _Complex* mMember; \ +#define COMPLEX_TEST(ty_, name_) \ + struct Test##name_ { \ + ty_ _Complex mMember; \ + \ + }; \ + struct Test##name_##Ptr { \ + ty_ _Complex* mMember; \ }; -COMPLEX_TEST(double) -COMPLEX_TEST(float) -COMPLEX_TEST(int) +COMPLEX_TEST(double, Double) +COMPLEX_TEST(float, Float) + +// FIXME: 128-byte-aligned in some machines +// which we can't support right now in Rust. +// COMPLEX_TEST(long double, LongDouble) diff --git a/tests/headers/complex_global.h b/tests/headers/complex_global.h new file mode 100644 index 0000000000..d9f9fb0163 --- /dev/null +++ b/tests/headers/complex_global.h @@ -0,0 +1,3 @@ +float _Complex globalValueFloat; +double _Complex globalValueDouble; +long double _Complex globalValueLongDouble; diff --git a/tests/headers/convert-floats.h b/tests/headers/convert-floats.h index 0e0ebd3389..08d9fe0bd2 100644 --- a/tests/headers/convert-floats.h +++ b/tests/headers/convert-floats.h @@ -4,4 +4,6 @@ struct foo { float bar, baz; double bazz; long double* bazzz; + float _Complex complexFloat; + double _Complex complexDouble; }; diff --git a/tests/headers/whitelist_basic.hpp b/tests/headers/whitelist_basic.hpp index 661528babc..8424f75a8e 100644 --- a/tests/headers/whitelist_basic.hpp +++ b/tests/headers/whitelist_basic.hpp @@ -12,4 +12,5 @@ class WhitelistMe { struct DontWhitelistMe { void* foo; + double _Complex noComplexGenerated; }; From 5851026f744ddf2807f3eafa8c9341134ae7f4f2 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 11 Nov 2016 16:20:36 -0800 Subject: [PATCH 0072/2291] Add support for bindings to overloaded functions This commit (re)adds support for generating bindings to overloaded functions. First, we use the symbol name instead of the canonical name when checking if we have already generated bindings for a given function. Second, we add a map from canonical names to number of times we have generated a function with that canonical name. We increment this number every time we generate a function. When the number is greater than zero, we append it to the function name so that overloaded functions get a unique Rust symbol. --- src/codegen/mod.rs | 43 +++++++++++++++++++++---- tests/expectations/tests/overloading.rs | 23 +++++++++++++ tests/headers/overloading.hpp | 9 ++++++ 3 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 tests/expectations/tests/overloading.rs create mode 100644 tests/headers/overloading.hpp diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 3bee69b6b9..5ced46a195 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -21,6 +21,7 @@ use self::helpers::{BlobTyBuilder, attributes}; use std::borrow::Cow; use std::collections::HashSet; use std::collections::hash_map::{Entry, HashMap}; +use std::fmt::Write; use std::mem; use std::ops; use syntax::abi::Abi; @@ -57,6 +58,11 @@ struct CodegenResult { /// Being these two different declarations. functions_seen: HashSet, vars_seen: HashSet, + + /// Used for making bindings to overloaded functions. Maps from a canonical + /// function name to the number of overloads we have already codegen'd for + /// that name. This lets us give each overload a unique suffix. + overload_counters: HashMap, } impl CodegenResult { @@ -67,6 +73,7 @@ impl CodegenResult { items_seen: Default::default(), functions_seen: Default::default(), vars_seen: Default::default(), + overload_counters: Default::default(), } } @@ -90,6 +97,16 @@ impl CodegenResult { self.functions_seen.insert(name.into()); } + /// Get the overload number for the given function name. Increments the + /// counter internally so the next time we ask for the overload for this + /// name, we get the incremented value, and so on. + fn overload_number(&mut self, name: &str) -> u32 { + let mut counter = self.overload_counters.entry(name.into()).or_insert(0); + let number = *counter; + *counter += 1; + number + } + fn seen_var(&self, name: &str) -> bool { self.vars_seen.contains(name) } @@ -1803,14 +1820,19 @@ impl CodeGenerator for Function { result: &mut CodegenResult, item: &Item) { let name = self.name(); - let canonical_name = item.canonical_name(ctx); + let mut canonical_name = item.canonical_name(ctx); + let mangled_name = self.mangled_name(); - // TODO: Maybe warn here if there's a type/argument mismatch, or - // something? - if result.seen_function(&canonical_name) { - return; + { + let seen_symbol_name = mangled_name.unwrap_or(&canonical_name); + + // TODO: Maybe warn here if there's a type/argument mismatch, or + // something? + if result.seen_function(seen_symbol_name) { + return; + } + result.saw_function(seen_symbol_name); } - result.saw_function(&canonical_name); let signature_item = ctx.resolve_item(self.signature()); let signature = signature_item.kind().expect_type(); @@ -1827,7 +1849,7 @@ impl CodeGenerator for Function { attributes.push(attributes::doc(comment)); } - if let Some(mangled) = self.mangled_name() { + if let Some(mangled) = mangled_name { attributes.push(attributes::link_name(mangled)); } else if name != canonical_name { attributes.push(attributes::link_name(name)); @@ -1836,6 +1858,13 @@ impl CodeGenerator for Function { let foreign_item_kind = ast::ForeignItemKind::Fn(fndecl, ast::Generics::default()); + // Handle overloaded functions by giving each overload its own unique + // suffix. + let times_seen = result.overload_number(&canonical_name); + if times_seen > 0 { + write!(&mut canonical_name, "{}", times_seen).unwrap(); + } + let foreign_item = ast::ForeignItem { ident: ctx.rust_ident_raw(&canonical_name), attrs: attributes, diff --git a/tests/expectations/tests/overloading.rs b/tests/expectations/tests/overloading.rs new file mode 100644 index 0000000000..4e138e7dac --- /dev/null +++ b/tests/expectations/tests/overloading.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +extern "C" { + #[link_name = "_Z8Evaluatec"] + pub fn Evaluate(r: ::std::os::raw::c_char) -> bool; +} +extern "C" { + #[link_name = "_Z8Evaluateii"] + pub fn Evaluate1(x: ::std::os::raw::c_int, y: ::std::os::raw::c_int) + -> bool; +} +extern "C" { + #[link_name = "_ZN3foo10MyFunctionEv"] + pub fn MyFunction(); +} +extern "C" { + #[link_name = "_ZN3bar10MyFunctionEv"] + pub fn MyFunction1(); +} diff --git a/tests/headers/overloading.hpp b/tests/headers/overloading.hpp new file mode 100644 index 0000000000..3c2b04875b --- /dev/null +++ b/tests/headers/overloading.hpp @@ -0,0 +1,9 @@ +extern bool Evaluate(char r); +extern bool Evaluate(int x, int y); + +namespace foo { + extern void MyFunction(); +} +namespace bar { + extern void MyFunction(); +} From 4640ecacfe087958d7f1891d557afaccbfeddc34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 13 Nov 2016 11:59:54 +0100 Subject: [PATCH 0073/2291] Fix path detection after #228 r? @fitzgen Fixes #242 --- src/bin/bindgen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs index 55d3fdde91..14e882bccf 100755 --- a/src/bin/bindgen.rs +++ b/src/bin/bindgen.rs @@ -70,7 +70,7 @@ pub fn main() { } } - match builder_from_flags(env::args()) { + match builder_from_flags(bind_args.into_iter()) { Ok((builder, output)) => { let mut bindings = builder.generate() .expect("Unable to generate bindings"); From 37c05b71299ec00bd2679c3df22fb6ca0cd0e371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 13 Nov 2016 12:31:23 +0100 Subject: [PATCH 0074/2291] codegen: Special-case i64::MIN since it produces a overflow on aster. Proper fix on aster soon, still worth to get this in I guess. r? @fitzgen --- src/codegen/helpers.rs | 15 +++++++++++++++ src/codegen/mod.rs | 7 ++++--- tests/expectations/tests/enum_explicit_type.rs | 5 ++++- tests/expectations/tests/macro-expr-basic.rs | 1 + tests/headers/enum_explicit_type.hpp | 6 +++++- tests/headers/macro-expr-basic.h | 2 ++ 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/codegen/helpers.rs b/src/codegen/helpers.rs index 016ba4789f..6e5a6f0e31 100644 --- a/src/codegen/helpers.rs +++ b/src/codegen/helpers.rs @@ -117,4 +117,19 @@ pub mod ast_ty { } } } + + pub fn int_expr(val: i64) -> P { + use std::i64; + let expr = aster::AstBuilder::new().expr(); + + // This is not representable as an i64 if it's negative, so we + // special-case it. + // + // Fix in aster incoming. + if val == i64::MIN { + expr.neg().uint(1u64 << 63) + } else { + expr.int(val) + } + } } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index b4c2f3f751..a0b26eadb6 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -101,7 +101,8 @@ impl CodegenResult { /// counter internally so the next time we ask for the overload for this /// name, we get the incremented value, and so on. fn overload_number(&mut self, name: &str) -> u32 { - let mut counter = self.overload_counters.entry(name.into()).or_insert(0); + let mut counter = + self.overload_counters.entry(name.into()).or_insert(0); let number = *counter; *counter += 1; number @@ -313,7 +314,7 @@ impl CodeGenerator for Var { .pub_() .const_(canonical_name) .expr() - .int(val) + .build(helpers::ast_ty::int_expr(val)) .build(ty); result.push(const_item) } else { @@ -1285,7 +1286,7 @@ impl<'a> EnumBuilder<'a> { let variant_name = ctx.rust_mangle(variant.name()); let expr = aster::AstBuilder::new().expr(); let expr = match variant.val() { - EnumVariantValue::Signed(v) => expr.int(v), + EnumVariantValue::Signed(v) => helpers::ast_ty::int_expr(v), EnumVariantValue::Unsigned(v) => expr.uint(v), }; diff --git a/tests/expectations/tests/enum_explicit_type.rs b/tests/expectations/tests/enum_explicit_type.rs index 352f4ea90f..4e555d3a69 100644 --- a/tests/expectations/tests/enum_explicit_type.rs +++ b/tests/expectations/tests/enum_explicit_type.rs @@ -16,6 +16,9 @@ pub enum Bigger { Much = 255, Larger = 256, } #[repr(i64)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum MuchLong { MuchLow = -4294967296, } +#[repr(i64)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum MuchLongLong { I64_MIN = -9223372036854775808, } #[repr(u64)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub enum MuchLongLong { MuchHigh = 4294967296, } +pub enum MuchULongLong { MuchHigh = 4294967296, } diff --git a/tests/expectations/tests/macro-expr-basic.rs b/tests/expectations/tests/macro-expr-basic.rs index 7a5c71e041..355294e715 100644 --- a/tests/expectations/tests/macro-expr-basic.rs +++ b/tests/expectations/tests/macro-expr-basic.rs @@ -7,6 +7,7 @@ pub const FOO: ::std::os::raw::c_uint = 1; pub const BAR: ::std::os::raw::c_uint = 4; pub const BAZ: ::std::os::raw::c_uint = 5; +pub const MIN: ::std::os::raw::c_longlong = -9223372036854775808; pub const BARR: ::std::os::raw::c_uint = 1; pub const BAZZ: ::std::os::raw::c_uint = 7; pub const I_RAN_OUT_OF_DUMB_NAMES: ::std::os::raw::c_uint = 7; diff --git a/tests/headers/enum_explicit_type.hpp b/tests/headers/enum_explicit_type.hpp index 4acb3f15eb..78eadd4032 100644 --- a/tests/headers/enum_explicit_type.hpp +++ b/tests/headers/enum_explicit_type.hpp @@ -19,6 +19,10 @@ enum MuchLong: long { MuchLow = -4294967296, }; -enum MuchLongLong: unsigned long long { +enum MuchLongLong: long long { + I64_MIN = 1ll << 63, +}; + +enum MuchULongLong: unsigned long long { MuchHigh = 4294967296, }; diff --git a/tests/headers/macro-expr-basic.h b/tests/headers/macro-expr-basic.h index 55b11367d1..d2de7fdf49 100644 --- a/tests/headers/macro-expr-basic.h +++ b/tests/headers/macro-expr-basic.h @@ -2,6 +2,8 @@ #define BAR 4 #define BAZ (FOO + BAR) +#define MIN (1 << 63) + #define BARR (1 << 0) #define BAZZ ((1 << 1) + BAZ) #define I_RAN_OUT_OF_DUMB_NAMES (BARR | BAZZ) From 1001e3bcc835e1b01deef6c84f2163d67ff6d509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 13 Nov 2016 13:16:35 +0100 Subject: [PATCH 0075/2291] Handle macro redefinition a bit more graciously. --- src/ir/var.rs | 12 +++++++----- tests/expectations/tests/macro-redef.rs | 9 +++++++++ tests/headers/macro-redef.h | 5 +++++ 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 tests/expectations/tests/macro-redef.rs create mode 100644 tests/headers/macro-redef.h diff --git a/src/ir/var.rs b/src/ir/var.rs index 0e7df61884..1c7b20280e 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -87,17 +87,19 @@ impl ClangSubItemParser for Var { assert!(!id.is_empty(), "Empty macro name?"); - if ctx.parsed_macro(&id) { - let name = String::from_utf8(id).unwrap(); - warn!("Duplicated macro definition: {}", name); - return Err(ParseError::Continue); - } + let previously_defined = ctx.parsed_macro(&id); // NB: It's important to "note" the macro even if the result is // not an integer, otherwise we might loose other kind of // derived macros. ctx.note_parsed_macro(id.clone(), value.clone()); + if previously_defined { + let name = String::from_utf8(id).unwrap(); + warn!("Duplicated macro definition: {}", name); + return Err(ParseError::Continue); + } + // NOTE: Unwrapping, here and above, is safe, because the // identifier of a token comes straight from clang, and we // enforce utf8 there, so we should have already panicked at diff --git a/tests/expectations/tests/macro-redef.rs b/tests/expectations/tests/macro-redef.rs new file mode 100644 index 0000000000..881a44ae87 --- /dev/null +++ b/tests/expectations/tests/macro-redef.rs @@ -0,0 +1,9 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const FOO: ::std::os::raw::c_uint = 4; +pub const BAR: ::std::os::raw::c_uint = 5; +pub const BAZ: ::std::os::raw::c_uint = 6; diff --git a/tests/headers/macro-redef.h b/tests/headers/macro-redef.h new file mode 100644 index 0000000000..0180d2ab09 --- /dev/null +++ b/tests/headers/macro-redef.h @@ -0,0 +1,5 @@ +#define FOO 4 +#define BAR (1 + FOO) +#undef FOO +#define FOO 5 +#define BAZ (1 + FOO) From 76b5372efa95047bc0200067a3f7493b39060a5f Mon Sep 17 00:00:00 2001 From: Takanori Ishibashi Date: Mon, 14 Nov 2016 08:26:48 +0900 Subject: [PATCH 0076/2291] Return Option instead of Cursor --- src/clang.rs | 8 +++++--- src/ir/ty.rs | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 1239753463..315d87a0ae 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -263,11 +263,13 @@ impl Cursor { /// Given that this cursor's referent is reference type, get the cursor /// pointing to the referenced type. - pub fn referenced(&self) -> Cursor { + pub fn referenced(&self) -> Option { unsafe { - Cursor { + let ret = Cursor { x: clang_getCursorReferenced(self.x), - } + }; + + if ret.is_valid() { Some(ret) } else { None } } } diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 77dc61be6d..09961637c4 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -612,7 +612,7 @@ impl Type { TypeKind::TemplateAlias(inner.unwrap(), args) } CXCursor_TemplateRef => { - let referenced = location.referenced(); + let referenced = location.referenced().expect("expected value, got none"); let referenced_ty = referenced.cur_type(); let referenced_declaration = Some(referenced_ty.declaration()); @@ -624,7 +624,7 @@ impl Type { ctx); } CXCursor_TypeRef => { - let referenced = location.referenced(); + let referenced = location.referenced().expect("expected value, got none"); let referenced_ty = referenced.cur_type(); let referenced_declaration = Some(referenced_ty.declaration()); From 89ee7e0ee9e5faa2059915f1c8283d128fc494d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 13 Nov 2016 13:28:46 +0100 Subject: [PATCH 0077/2291] codegen: Always implement debug for __BindgenUnionField. Our debug-detection code assumes so. Fixes #246 r? @fitzgen --- src/codegen/mod.rs | 15 ++++++++++++- tests/expectations/tests/anon_union.rs | 6 +++++- tests/expectations/tests/class.rs | 6 +++++- .../tests/class_with_inner_struct.rs | 6 +++++- .../expectations/tests/jsval_layout_opaque.rs | 6 +++++- .../tests/struct_with_anon_union.rs | 6 +++++- .../tests/struct_with_anon_unnamed_union.rs | 6 +++++- .../expectations/tests/struct_with_nesting.rs | 6 +++++- tests/expectations/tests/typeref.rs | 6 +++++- tests/expectations/tests/union_dtor.rs | 6 +++++- tests/expectations/tests/union_fields.rs | 6 +++++- tests/expectations/tests/union_template.rs | 6 +++++- .../tests/union_with_anon_struct.rs | 6 +++++- .../tests/union_with_anon_struct_bitfield.rs | 6 +++++- .../tests/union_with_anon_union.rs | 6 +++++- .../tests/union_with_anon_unnamed_struct.rs | 6 +++++- .../tests/union_with_anon_unnamed_union.rs | 6 +++++- .../tests/union_with_big_member.rs | 21 ++++++++++++++++++- .../expectations/tests/union_with_nesting.rs | 6 +++++- tests/headers/union_with_big_member.h | 5 +++++ 20 files changed, 124 insertions(+), 19 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index a0b26eadb6..3f7c87e84d 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1930,8 +1930,10 @@ mod utils { pub fn prepend_union_types(ctx: &BindgenContext, result: &mut Vec>) { let prefix = ctx.trait_prefix(); + + // TODO(emilio): The fmt::Debug impl could be way nicer with + // std::intrinsics::type_name, but... let union_field_decl = quote_item!(ctx.ext_cx(), - #[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField( ::$prefix::marker::PhantomData); @@ -1983,11 +1985,22 @@ mod utils { ) .unwrap(); + let union_field_debug_impl = quote_item!(ctx.ext_cx(), + impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } + } + ) + .unwrap(); + let items = vec![ union_field_decl, union_field_impl, union_field_default_impl, union_field_clone_impl, union_field_copy_impl, + union_field_debug_impl, ]; let old_items = mem::replace(result, items); diff --git a/tests/expectations/tests/anon_union.rs b/tests/expectations/tests/anon_union.rs index 0b1da364a2..8af416c32c 100644 --- a/tests/expectations/tests/anon_union.rs +++ b/tests/expectations/tests/anon_union.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct TErrorResult { diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index 4f736342e6..579c24a44b 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] pub struct C { pub a: ::std::os::raw::c_int, diff --git a/tests/expectations/tests/class_with_inner_struct.rs b/tests/expectations/tests/class_with_inner_struct.rs index ca8eb73b09..ab51396dbf 100644 --- a/tests/expectations/tests/class_with_inner_struct.rs +++ b/tests/expectations/tests/class_with_inner_struct.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct A { diff --git a/tests/expectations/tests/jsval_layout_opaque.rs b/tests/expectations/tests/jsval_layout_opaque.rs index fa611f2045..91f898af88 100644 --- a/tests/expectations/tests/jsval_layout_opaque.rs +++ b/tests/expectations/tests/jsval_layout_opaque.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} pub const JSVAL_TAG_SHIFT: ::std::os::raw::c_uint = 47; pub const JSVAL_PAYLOAD_MASK: ::std::os::raw::c_ulonglong = 140737488355327; pub const JSVAL_TAG_MASK: ::std::os::raw::c_longlong = -140737488355328; diff --git a/tests/expectations/tests/struct_with_anon_union.rs b/tests/expectations/tests/struct_with_anon_union.rs index 7c4a7d82d4..0d2e937ac3 100644 --- a/tests/expectations/tests/struct_with_anon_union.rs +++ b/tests/expectations/tests/struct_with_anon_union.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct foo { diff --git a/tests/expectations/tests/struct_with_anon_unnamed_union.rs b/tests/expectations/tests/struct_with_anon_unnamed_union.rs index 0763f5907a..2914eb41ff 100644 --- a/tests/expectations/tests/struct_with_anon_unnamed_union.rs +++ b/tests/expectations/tests/struct_with_anon_unnamed_union.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct foo { diff --git a/tests/expectations/tests/struct_with_nesting.rs b/tests/expectations/tests/struct_with_nesting.rs index 0aacb6b3d3..97a0949ea2 100644 --- a/tests/expectations/tests/struct_with_nesting.rs +++ b/tests/expectations/tests/struct_with_nesting.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct foo { diff --git a/tests/expectations/tests/typeref.rs b/tests/expectations/tests/typeref.rs index a8fe14cdbe..da9441462c 100644 --- a/tests/expectations/tests/typeref.rs +++ b/tests/expectations/tests/typeref.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct nsFoo { diff --git a/tests/expectations/tests/union_dtor.rs b/tests/expectations/tests/union_dtor.rs index 4d1fa25a38..9be626ffa8 100644 --- a/tests/expectations/tests/union_dtor.rs +++ b/tests/expectations/tests/union_dtor.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug)] pub struct UnionWithDtor { diff --git a/tests/expectations/tests/union_fields.rs b/tests/expectations/tests/union_fields.rs index 49bdca13b3..495e80f984 100644 --- a/tests/expectations/tests/union_fields.rs +++ b/tests/expectations/tests/union_fields.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct _bindgen_ty_1 { diff --git a/tests/expectations/tests/union_template.rs b/tests/expectations/tests/union_template.rs index 0114e30663..fc92afb83e 100644 --- a/tests/expectations/tests/union_template.rs +++ b/tests/expectations/tests/union_template.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct NastyStruct { diff --git a/tests/expectations/tests/union_with_anon_struct.rs b/tests/expectations/tests/union_with_anon_struct.rs index 406dd231ed..f0a2151223 100644 --- a/tests/expectations/tests/union_with_anon_struct.rs +++ b/tests/expectations/tests/union_with_anon_struct.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct foo { diff --git a/tests/expectations/tests/union_with_anon_struct_bitfield.rs b/tests/expectations/tests/union_with_anon_struct_bitfield.rs index 91d9fa5974..548b0dc48a 100644 --- a/tests/expectations/tests/union_with_anon_struct_bitfield.rs +++ b/tests/expectations/tests/union_with_anon_struct_bitfield.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct foo { diff --git a/tests/expectations/tests/union_with_anon_union.rs b/tests/expectations/tests/union_with_anon_union.rs index c7ca3411c6..9527855640 100644 --- a/tests/expectations/tests/union_with_anon_union.rs +++ b/tests/expectations/tests/union_with_anon_union.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct foo { diff --git a/tests/expectations/tests/union_with_anon_unnamed_struct.rs b/tests/expectations/tests/union_with_anon_unnamed_struct.rs index 33d75affb6..2d6fab97b7 100644 --- a/tests/expectations/tests/union_with_anon_unnamed_struct.rs +++ b/tests/expectations/tests/union_with_anon_unnamed_struct.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct pixel { diff --git a/tests/expectations/tests/union_with_anon_unnamed_union.rs b/tests/expectations/tests/union_with_anon_unnamed_union.rs index c47850f59e..eb214017fe 100644 --- a/tests/expectations/tests/union_with_anon_unnamed_union.rs +++ b/tests/expectations/tests/union_with_anon_unnamed_union.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct foo { diff --git a/tests/expectations/tests/union_with_big_member.rs b/tests/expectations/tests/union_with_big_member.rs index 521a5ff4c7..b921f33c95 100644 --- a/tests/expectations/tests/union_with_big_member.rs +++ b/tests/expectations/tests/union_with_big_member.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Copy)] pub struct WithBigArray { @@ -40,6 +44,21 @@ impl Clone for WithBigArray { fn clone(&self) -> Self { *self } } #[repr(C)] +#[derive(Debug, Copy)] +pub struct WithBigArray2 { + pub a: __BindgenUnionField<::std::os::raw::c_int>, + pub b: __BindgenUnionField<[::std::os::raw::c_char; 33usize]>, + pub bindgen_union_field: [u32; 9usize], +} +#[test] +fn bindgen_test_layout_WithBigArray2() { + assert_eq!(::std::mem::size_of::() , 36usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for WithBigArray2 { + fn clone(&self) -> Self { *self } +} +#[repr(C)] #[derive(Copy)] pub struct WithBigMember { pub a: __BindgenUnionField<::std::os::raw::c_int>, diff --git a/tests/expectations/tests/union_with_nesting.rs b/tests/expectations/tests/union_with_nesting.rs index 6ed81adb49..61c08a2a3e 100644 --- a/tests/expectations/tests/union_with_nesting.rs +++ b/tests/expectations/tests/union_with_nesting.rs @@ -4,7 +4,6 @@ #![allow(non_snake_case)] -#[derive(Debug)] #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -24,6 +23,11 @@ impl ::std::clone::Clone for __BindgenUnionField { fn clone(&self) -> Self { Self::new() } } impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct foo { diff --git a/tests/headers/union_with_big_member.h b/tests/headers/union_with_big_member.h index 06682ef191..6347d6cad3 100644 --- a/tests/headers/union_with_big_member.h +++ b/tests/headers/union_with_big_member.h @@ -3,6 +3,11 @@ union WithBigArray { int b[33]; }; +union WithBigArray2 { + int a; + char b[33]; +}; + union WithBigMember { int a; union WithBigArray b; From e52dc684cf4db42b320e373b0c73741fedb908f8 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 14 Nov 2016 13:16:55 -0800 Subject: [PATCH 0078/2291] Clean up TypeCollector implementations Rather than making `TypeCollector` implementations recursively call `type_collector` on their subtypes, just gather immediate subtypes into the `ItemSet`. The subtypes' `TypeCollector` implementation will be recursively called by `WhitelistedItemsIter`. This makes it less likely we will "skip" a layer by recursively calling `collect_types` on some subtypes without adding the subtypes themselves to the set. --- src/ir/comp.rs | 14 +++++++------- src/ir/function.rs | 6 +++--- src/ir/item.rs | 1 - src/ir/ty.rs | 10 +++++----- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/ir/comp.rs b/src/ir/comp.rs index bd794a98dd..1d823d0a90 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -846,24 +846,24 @@ impl TypeCollector for CompInfo { types: &mut ItemSet, item: &Item) { if let Some(template) = self.specialized_template() { - template.collect_types(context, types, &()); + types.insert(template); } let applicable_template_args = item.applicable_template_args(context); for arg in applicable_template_args { - arg.collect_types(context, types, &()); + types.insert(arg); } - for base in self.base_members() { - base.collect_types(context, types, &()); + for &base in self.base_members() { + types.insert(base); } for field in self.fields() { - field.ty().collect_types(context, types, &()); + types.insert(field.ty()); } - for ty in self.inner_types() { - ty.collect_types(context, types, &()); + for &ty in self.inner_types() { + types.insert(ty); } // FIXME(emilio): Methods, VTable? diff --git a/src/ir/function.rs b/src/ir/function.rs index 163e303972..e45dcbe817 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -270,13 +270,13 @@ impl TypeCollector for FunctionSig { type Extra = Item; fn collect_types(&self, - context: &BindgenContext, + _context: &BindgenContext, types: &mut ItemSet, _item: &Item) { - self.return_type().collect_types(context, types, &()); + types.insert(self.return_type()); for &(_, ty) in self.argument_types() { - ty.collect_types(context, types, &()); + types.insert(ty); } } } diff --git a/src/ir/item.rs b/src/ir/item.rs index 691cfec2c2..14dc3b2a0b 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -153,7 +153,6 @@ impl TypeCollector for Item { match *self.kind() { ItemKind::Type(ref ty) => { - types.insert(self.id()); if !self.is_opaque(ctx) { ty.collect_types(ctx, types, self); } diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 59044bdde5..ba69296b25 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -847,13 +847,13 @@ impl TypeCollector for Type { TypeKind::Alias(_, inner) | TypeKind::Named(_, Some(inner)) | TypeKind::ResolvedTypeRef(inner) => { - inner.collect_types(context, types, &()) + types.insert(inner); } TypeKind::TemplateRef(inner, ref template_args) => { - inner.collect_types(context, types, &()); - for item in template_args { - item.collect_types(context, types, &()); + types.insert(inner); + for &item in template_args { + types.insert(item); } } TypeKind::Comp(ref ci) => ci.collect_types(context, types, item), @@ -862,7 +862,7 @@ impl TypeCollector for Type { } // FIXME: Pending types! ref other @ _ => { - debug!("Ignoring: {:?}", other); + debug!("::collect_types: Ignoring: {:?}", other); } } } From d18ec2b587562a4747b6aca29076fc80f8aede54 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 14 Nov 2016 13:25:07 -0800 Subject: [PATCH 0079/2291] Warn when giving up and assuming a named type When we fail to parse Clang stuff into our IR and give up, and assume that we are looking at a named template type, we now emit a warning to assist with debugging. --- src/ir/item.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ir/item.rs b/src/ir/item.rs index 691cfec2c2..e25335bf26 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -1051,6 +1051,9 @@ impl ClangItemParser for Item { // It's harmless, but if we restrict that, then // tests/headers/nsStyleAutoArray.hpp crashes. if let Err(ParseError::Recurse) = result { + warn!("Unknown type, assuming named template type: id = {:?}; spelling = {}", + id, + ty.spelling()); Ok(Self::named_type_with_id(id, ty.spelling(), None, From 6bbabff9b4bad35d58172840217c116f0f739980 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 14 Nov 2016 15:35:45 -0800 Subject: [PATCH 0080/2291] Add more logging for item insertion and asserts This adds `debug!` logging for all paths that insert items into `BindgenContext::items`, and adds some `debug_assert!`s against dangling `ItemId`s. --- src/ir/context.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ir/context.rs b/src/ir/context.rs index c7949befd7..97f734b22d 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -415,6 +415,7 @@ impl<'ctx> BindgenContext<'ctx> { // If at some point we care about the memory here, probably a map TypeKind // -> builtin type ItemId would be the best to improve that. fn add_builtin_item(&mut self, item: Item) { + debug!("add_builtin_item: item = {:?}", item); debug_assert!(item.kind().is_type()); let id = item.id(); let old_item = self.items.insert(id, item); @@ -573,6 +574,8 @@ impl<'ctx> BindgenContext<'ctx> { }; // Bypass all the validations in add_item explicitly. + debug!("build_template_wrapper: inserting item: {:?}", item); + debug_assert!(with_id == item.id()); self.items.insert(with_id, item); with_id } @@ -990,6 +993,7 @@ impl<'ctx, 'gen> Iterator for WhitelistedItemsIter<'ctx, 'gen> }; debug_assert!(self.seen.contains(&id)); + debug_assert!(self.ctx.items.contains_key(&id)); let mut sub_types = ItemSet::new(); id.collect_types(self.ctx, &mut sub_types, &()); From 2003f9c82245a67ed28ae1c9c1ec24cc5b07fa7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 14 Nov 2016 22:15:23 +0100 Subject: [PATCH 0081/2291] ir: Explicitly discard specialized templated type aliases as already resolved. --- src/clang.rs | 23 ++++ src/ir/context.rs | 107 +++++++++++------- ..._alias_partial_template_especialization.rs | 12 ++ .../tests/type_alias_template_specialized.rs | 19 ++++ ...alias_partial_template_especialization.hpp | 7 ++ .../type_alias_template_specialized.hpp | 9 ++ 6 files changed, 135 insertions(+), 42 deletions(-) create mode 100644 tests/expectations/tests/type_alias_partial_template_especialization.rs create mode 100644 tests/expectations/tests/type_alias_template_specialized.rs create mode 100644 tests/headers/type_alias_partial_template_especialization.hpp create mode 100644 tests/headers/type_alias_template_specialized.hpp diff --git a/src/clang.rs b/src/clang.rs index 385fd09a2a..7da755eaba 100755 --- a/src/clang.rs +++ b/src/clang.rs @@ -317,6 +317,24 @@ impl Cursor { } } + /// Returns whether the given location contains a cursor with the given + /// kind in the first level of nesting underneath (doesn't look + /// recursively). + pub fn contains_cursor(&self, kind: Enum_CXCursorKind) -> bool { + let mut found = false; + + self.visit(|c| { + if c.kind() == kind { + found = true; + CXChildVisit_Break + } else { + CXChildVisit_Continue + } + }); + + found + } + /// Is the referent an inlined function? #[cfg(not(feature="llvm_stable"))] pub fn is_inlined_function(&self) -> bool { @@ -721,6 +739,11 @@ impl Type { pub fn is_valid(&self) -> bool { self.kind() != CXType_Invalid } + + /// Is this a valid and exposed type? + pub fn is_valid_and_exposed(&self) -> bool { + self.is_valid() && self.kind() != CXType_Unexposed + } } /// An iterator for a type's template arguments. diff --git a/src/ir/context.rs b/src/ir/context.rs index c7949befd7..1b446ace16 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -499,16 +499,12 @@ impl<'ctx> BindgenContext<'ctx> { wrapping: ItemId, parent_id: ItemId, ty: &clang::Type, - location: clang::Cursor) + location: clang::Cursor, + declaration: clang::Cursor) -> ItemId { use clangll::*; let mut args = vec![]; - let mut found_invalid_template_ref = false; location.visit(|c| { - if c.kind() == CXCursor_TemplateRef && - c.cur_type().kind() == CXType_Invalid { - found_invalid_template_ref = true; - } if c.kind() == CXCursor_TypeRef { // The `with_id` id will potentially end up unused if we give up // on this type (for example, its a tricky partial template @@ -527,39 +523,46 @@ impl<'ctx> BindgenContext<'ctx> { let item = { let wrapping_type = self.resolve_type(wrapping); - let old_args = match *wrapping_type.kind() { - TypeKind::Comp(ref ci) => ci.template_args(), - _ => panic!("how?"), - }; - // The following assertion actually fails with partial template - // specialization. But as far as I know there's no way at all to - // grab the specialized types from neither the AST or libclang. - // - // This flaw was already on the old parser, but I now think it has - // no clear solution. - // - // For an easy example in which there's no way at all of getting the - // `int` type, except manually parsing the spelling: - // - // template - // class Incomplete { - // T d; - // U p; - // }; - // - // template - // class Foo { - // Incomplete bar; - // }; - // - // debug_assert_eq!(old_args.len(), args.len()); - // - // That being said, this is not so common, so just error! and hope - // for the best, returning the previous type, who knows. - if old_args.len() != args.len() { - error!("Found partial template specialization, \ - expect dragons!"); - return wrapping; + if let TypeKind::Comp(ref ci) = *wrapping_type.kind() { + let old_args = ci.template_args(); + + // The following assertion actually fails with partial template + // specialization. But as far as I know there's no way at all to + // grab the specialized types from neither the AST or libclang, + // which sucks. The same happens for specialized type alias + // template declarations, where we have that ugly hack up there. + // + // This flaw was already on the old parser, but I now think it + // has no clear solution (apart from patching libclang to + // somehow expose them, of course). + // + // For an easy example in which there's no way at all of getting + // the `int` type, except manually parsing the spelling: + // + // template + // class Incomplete { + // T d; + // U p; + // }; + // + // template + // class Foo { + // Incomplete bar; + // }; + // + // debug_assert_eq!(old_args.len(), args.len()); + // + // That being said, this is not so common, so just error! and + // hope for the best, returning the previous type, who knows. + if old_args.len() != args.len() { + error!("Found partial template specialization, \ + expect dragons!"); + return wrapping; + } + } else { + assert_eq!(declaration.kind(), + ::clangll::CXCursor_TypeAliasTemplateDecl, + "Expected wrappable type"); } let type_kind = TypeKind::TemplateRef(wrapping, args); @@ -586,7 +589,9 @@ impl<'ctx> BindgenContext<'ctx> { location: Option) -> Option { use clangll::{CXCursor_ClassTemplate, - CXCursor_ClassTemplatePartialSpecialization}; + CXCursor_ClassTemplatePartialSpecialization, + CXCursor_TypeAliasTemplateDecl, + CXCursor_TypeRef}; debug!("builtin_or_resolved_ty: {:?}, {:?}, {:?}", ty, location, @@ -630,15 +635,33 @@ impl<'ctx> BindgenContext<'ctx> { // argument names don't matter in the global context. if (declaration.kind() == CXCursor_ClassTemplate || declaration.kind() == - CXCursor_ClassTemplatePartialSpecialization) && + CXCursor_ClassTemplatePartialSpecialization || + declaration.kind() == CXCursor_TypeAliasTemplateDecl) && *ty != canonical_declaration.cur_type() && location.is_some() && parent_id.is_some() { + // For specialized type aliases, there's no way to get the + // template parameters as of this writing (for a struct + // specialization we wouldn't be in this branch anyway). + // + // Explicitly return `None` if there aren't any + // unspecialized parameters (contains any `TypeRef`) so we + // resolve the canonical type if there is one and it's + // exposed. + // + // This is _tricky_, I know :( + if declaration.kind() == CXCursor_TypeAliasTemplateDecl && + !location.unwrap().contains_cursor(CXCursor_TypeRef) && + ty.canonical_type().is_valid_and_exposed() { + return None; + } + return Some(self.build_template_wrapper(with_id, id, parent_id.unwrap(), ty, - location.unwrap())); + location.unwrap(), + declaration)); } return Some(self.build_ty_wrapper(with_id, id, parent_id, ty)); diff --git a/tests/expectations/tests/type_alias_partial_template_especialization.rs b/tests/expectations/tests/type_alias_partial_template_especialization.rs new file mode 100644 index 0000000000..70b5f66c50 --- /dev/null +++ b/tests/expectations/tests/type_alias_partial_template_especialization.rs @@ -0,0 +1,12 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub type MaybeWrapped = A; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Rooted { + pub ptr: MaybeWrapped, +} diff --git a/tests/expectations/tests/type_alias_template_specialized.rs b/tests/expectations/tests/type_alias_template_specialized.rs new file mode 100644 index 0000000000..989f2015b0 --- /dev/null +++ b/tests/expectations/tests/type_alias_template_specialized.rs @@ -0,0 +1,19 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Rooted { + pub ptr: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_Rooted() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for Rooted { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/type_alias_partial_template_especialization.hpp b/tests/headers/type_alias_partial_template_especialization.hpp new file mode 100644 index 0000000000..dfc36786c4 --- /dev/null +++ b/tests/headers/type_alias_partial_template_especialization.hpp @@ -0,0 +1,7 @@ +// bindgen-flags: -- -std=c++14 +template using MaybeWrapped = A; + +template +class Rooted { + MaybeWrapped ptr; +}; diff --git a/tests/headers/type_alias_template_specialized.hpp b/tests/headers/type_alias_template_specialized.hpp new file mode 100644 index 0000000000..a2d32b56a1 --- /dev/null +++ b/tests/headers/type_alias_template_specialized.hpp @@ -0,0 +1,9 @@ +// bindgen-flags: --whitelist-type Rooted -- -std=c++14 + +template using MaybeWrapped = a; +class Rooted { + MaybeWrapped ptr; +}; + +///
+template using replaces_MaybeWrapped = a; From 74465b729ccef79aa8456bc9ba80241b99c466a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 15 Nov 2016 18:32:41 +0100 Subject: [PATCH 0082/2291] ir: Make the id local to the context. --- src/codegen/mod.rs | 8 ++++---- src/ir/comp.rs | 4 ++-- src/ir/context.rs | 41 +++++++++++++++++++++++++++++++--------- src/ir/enum_ty.rs | 4 ++-- src/ir/function.rs | 4 ++-- src/ir/item.rs | 33 ++++++++++---------------------- src/ir/module.rs | 3 +-- src/ir/ty.rs | 4 ++-- src/ir/type_collector.rs | 3 +-- src/ir/var.rs | 4 ++-- src/lib.rs | 4 ++-- src/parse.rs | 3 +-- 12 files changed, 61 insertions(+), 54 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 3f7c87e84d..8e04fd7c05 100755 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -5,11 +5,11 @@ use aster; use ir::annotations::FieldAccessorKind; use ir::comp::{CompInfo, CompKind, Field, Method}; -use ir::context::BindgenContext; +use ir::context::{BindgenContext, ItemId}; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; use ir::function::{Function, FunctionSig}; use ir::int::IntKind; -use ir::item::{Item, ItemCanonicalName, ItemCanonicalPath, ItemId}; +use ir::item::{Item, ItemCanonicalName, ItemCanonicalPath}; use ir::item_kind::ItemKind; use ir::layout::Layout; use ir::module::Module; @@ -1919,8 +1919,8 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { mod utils { use aster; - use ir::context::BindgenContext; - use ir::item::{Item, ItemCanonicalPath, ItemId}; + use ir::context::{BindgenContext, ItemId}; + use ir::item::{Item, ItemCanonicalPath}; use ir::ty::TypeKind; use std::mem; use super::ItemToRustTy; diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 1d823d0a90..d19d12092b 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -5,8 +5,8 @@ use parse::{ClangItemParser, ParseError}; use std::cell::Cell; use std::cmp; use super::annotations::Annotations; -use super::context::BindgenContext; -use super::item::{Item, ItemId}; +use super::context::{BindgenContext, ItemId}; +use super::item::Item; use super::layout::Layout; use super::ty::{RUST_DERIVE_IN_ARRAY_LIMIT, Type}; use super::type_collector::{ItemSet, TypeCollector}; diff --git a/src/ir/context.rs b/src/ir/context.rs index 8c84b328e6..857219780e 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -10,7 +10,7 @@ use std::collections::{HashMap, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; use super::int::IntKind; -use super::item::{Item, ItemCanonicalName, ItemId}; +use super::item::{Item, ItemCanonicalName}; use super::item_kind::ItemKind; use super::module::Module; use super::ty::{FloatKind, Type, TypeKind}; @@ -19,6 +19,19 @@ use syntax::ast::Ident; use syntax::codemap::{DUMMY_SP, Span}; use syntax::ext::base::ExtCtxt; +/// A single identifier for an item. +/// +/// TODO: Build stronger abstractions on top of this, like TypeId(ItemId)? +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct ItemId(usize); + +impl ItemId { + /// Get a numeric representation of this id. + pub fn as_usize(&self) -> usize { + self.0 + } +} + /// A key used to index a resolved type, so we only process it once. /// /// This is almost always a USR string (an unique identifier generated by @@ -50,6 +63,9 @@ pub struct BindgenContext<'ctx> { /// output. items: BTreeMap, + /// The next item id to use during this bindings regeneration. + next_item_id: ItemId, + /// Clang USR to type map. This is needed to be able to associate types with /// item ids during parsing. types: HashMap, @@ -122,11 +138,12 @@ impl<'ctx> BindgenContext<'ctx> { parse_options) .expect("TranslationUnit::parse"); - let root_module = Self::build_root_module(); + let root_module = Self::build_root_module(ItemId(0)); let mut me = BindgenContext { items: Default::default(), types: Default::default(), modules: Default::default(), + next_item_id: ItemId(1), root_module: root_module.id(), current_module: root_module.id(), currently_parsed_types: vec![], @@ -422,9 +439,8 @@ impl<'ctx> BindgenContext<'ctx> { assert!(old_item.is_none(), "Inserted type twice?"); } - fn build_root_module() -> Item { + fn build_root_module(id: ItemId) -> Item { let module = Module::new(Some("root".into())); - let id = ItemId::next(); Item::new(id, None, None, id, ItemKind::Module(module)) } @@ -702,6 +718,13 @@ impl<'ctx> BindgenContext<'ctx> { with_id } + /// Returns the next item id to be used for an item. + pub fn next_item_id(&mut self) -> ItemId { + let ret = self.next_item_id; + self.next_item_id = ItemId(self.next_item_id.0 + 1); + ret + } + fn build_builtin_ty(&mut self, ty: &clang::Type, _declaration: Cursor) @@ -747,7 +770,7 @@ impl<'ctx> BindgenContext<'ctx> { let is_const = ty.is_const(); let layout = ty.fallible_layout().ok(); let ty = Type::new(Some(spelling), layout, type_kind, is_const); - let id = ItemId::next(); + let id = self.next_item_id(); let item = Item::new(id, None, None, self.root_module, ItemKind::Type(ty)); self.add_builtin_item(item); @@ -841,11 +864,11 @@ impl<'ctx> BindgenContext<'ctx> { use clangll::*; assert!(cursor.kind() == CXCursor_Namespace, "Be a nice person"); let cursor = cursor.canonical(); - let module_id = match self.modules.get(&cursor) { - Some(id) => return *id, - None => ItemId::next(), - }; + if let Some(id) = self.modules.get(&cursor) { + return *id; + } + let module_id = self.next_item_id(); let module_name = self.translation_unit .tokens(&cursor) .and_then(|tokens| { diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index 8efd9e3be1..6085833d18 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -2,8 +2,8 @@ use clang; use parse::{ClangItemParser, ParseError}; -use super::context::BindgenContext; -use super::item::{Item, ItemId}; +use super::context::{BindgenContext, ItemId}; +use super::item::Item; use super::ty::TypeKind; /// A C/C++ enumeration. diff --git a/src/ir/function.rs b/src/ir/function.rs index e45dcbe817..eacb6c0ea8 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -3,8 +3,8 @@ use clang; use clangll::Enum_CXCallingConv; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; -use super::context::BindgenContext; -use super::item::{Item, ItemId}; +use super::context::{BindgenContext, ItemId}; +use super::item::Item; use super::ty::TypeKind; use super::type_collector::{ItemSet, TypeCollector}; use syntax::abi; diff --git a/src/ir/item.rs b/src/ir/item.rs index 17d249b560..1f05f92f39 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -4,9 +4,8 @@ use clang; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use regex::Regex; use std::cell::{Cell, RefCell}; -use std::sync::atomic::{ATOMIC_USIZE_INIT, AtomicUsize, Ordering}; use super::annotations::Annotations; -use super::context::BindgenContext; +use super::context::{BindgenContext, ItemId}; use super::function::Function; use super::item_kind::ItemKind; use super::module::Module; @@ -78,21 +77,6 @@ impl<'a, 'b> Iterator for ItemAncestorsIter<'a, 'b> } } -/// A single identifier for an item. -/// -/// TODO: Build stronger abstractions on top of this, like TypeId(ItemId)? -#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct ItemId(usize); - -impl ItemId { - /// Allocate the next `ItemId`. - pub fn next() -> Self { - static NEXT_ITEM_ID: AtomicUsize = ATOMIC_USIZE_INIT; - let next_id = NEXT_ITEM_ID.fetch_add(1, Ordering::Relaxed); - ItemId(next_id) - } -} - // Pure convenience impl ItemCanonicalName for ItemId { fn canonical_name(&self, ctx: &BindgenContext) -> String { @@ -667,7 +651,7 @@ impl Item { // Note that this `id_` prefix prevents (really unlikely) collisions // between the global id and the local id of an item with the same // parent. - format!("id_{}", self.id().0) + format!("id_{}", self.id().as_usize()) } fn make_exposed_name(&self, @@ -747,7 +731,7 @@ impl ClangItemParser for Item { } let ty = Type::new(None, None, kind, is_const); - let id = ItemId::next(); + let id = ctx.next_item_id(); let module = ctx.root_module(); ctx.add_item(Item::new(id, None, None, module, ItemKind::Type(ty)), None, @@ -779,7 +763,7 @@ impl ClangItemParser for Item { ($what:ident) => { match $what::parse(cursor, ctx) { Ok(ParseResult::New(item, declaration)) => { - let id = ItemId::next(); + let id = ctx.next_item_id(); ctx.add_item(Item::new(id, comment, annotations, relevant_parent_id, @@ -855,7 +839,8 @@ impl ClangItemParser for Item { parent_id: Option, ctx: &mut BindgenContext) -> ItemId { - Self::from_ty_or_ref_with_id(ItemId::next(), + let id = ctx.next_item_id(); + Self::from_ty_or_ref_with_id(id, ty, location, parent_id, @@ -925,7 +910,8 @@ impl ClangItemParser for Item { parent_id: Option, ctx: &mut BindgenContext) -> Result { - Self::from_ty_with_id(ItemId::next(), ty, location, parent_id, ctx) + let id = ctx.next_item_id(); + Self::from_ty_with_id(id, ty, location, parent_id, ctx) } /// This is one of the trickiest methods you'll find (probably along with @@ -1109,7 +1095,8 @@ impl ClangItemParser for Item { -> ItemId where S: Into, { - Self::named_type_with_id(ItemId::next(), name, default, parent_id, ctx) + let id = ctx.next_item_id(); + Self::named_type_with_id(id, name, default, parent_id, ctx) } } diff --git a/src/ir/module.rs b/src/ir/module.rs index 42175b920e..c5d8cfa79e 100644 --- a/src/ir/module.rs +++ b/src/ir/module.rs @@ -3,8 +3,7 @@ use clang; use parse::{ClangSubItemParser, ParseError, ParseResult}; use parse_one; -use super::context::BindgenContext; -use super::item::ItemId; +use super::context::{BindgenContext, ItemId}; /// A module, as in, a C++ namespace. #[derive(Clone, Debug)] diff --git a/src/ir/ty.rs b/src/ir/ty.rs index ba69296b25..34af2db502 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -3,11 +3,11 @@ use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; use super::comp::CompInfo; -use super::context::BindgenContext; +use super::context::{BindgenContext, ItemId}; use super::enum_ty::Enum; use super::function::FunctionSig; use super::int::IntKind; -use super::item::{Item, ItemId}; +use super::item::Item; use super::layout::Layout; use super::type_collector::{ItemSet, TypeCollector}; diff --git a/src/ir/type_collector.rs b/src/ir/type_collector.rs index a829b165ba..0f10152d4a 100644 --- a/src/ir/type_collector.rs +++ b/src/ir/type_collector.rs @@ -1,8 +1,7 @@ //! Collecting type items. use std::collections::BTreeSet; -use super::context::BindgenContext; -use super::item::ItemId; +use super::context::{BindgenContext, ItemId}; /// A set of items. pub type ItemSet = BTreeSet; diff --git a/src/ir/var.rs b/src/ir/var.rs index 1c7b20280e..d0c4d9cacd 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -4,10 +4,10 @@ use cexpr; use clang; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use std::num::Wrapping; -use super::context::BindgenContext; +use super::context::{BindgenContext, ItemId}; use super::function::cursor_mangling; use super::int::IntKind; -use super::item::{Item, ItemId}; +use super::item::Item; use super::ty::TypeKind; /// A `Var` is our intermediate representation of a variable. diff --git a/src/lib.rs b/src/lib.rs index db87eb228d..b56cb468e9 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -78,8 +78,8 @@ mod codegen { include!(concat!(env!("OUT_DIR"), "/codegen.rs")); } -use ir::context::BindgenContext; -use ir::item::{Item, ItemId}; +use ir::context::{BindgenContext, ItemId}; +use ir::item::Item; use parse::{ClangItemParser, ParseError}; use regex_set::RegexSet; diff --git a/src/parse.rs b/src/parse.rs index 98cf6b13e8..28e6575945 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -1,8 +1,7 @@ //! Common traits and types related to parsing our IR from Clang cursors. use clang; -use ir::context::BindgenContext; -use ir::item::ItemId; +use ir::context::{BindgenContext, ItemId}; use ir::ty::TypeKind; /// Not so much an error in the traditional sense, but a control flow message From 8270a0ca766ea834032daeb67c7f32a1947ab3bd Mon Sep 17 00:00:00 2001 From: Jeff Waugh Date: Tue, 15 Nov 2016 14:37:20 +1100 Subject: [PATCH 0083/2291] Transition to libbindgen sub-crate - The root crate is the `bindgen` binary - Rust-ify the test suite, no more subprocesses! - Update Travis config to test both crates --- .gitignore | 4 - .travis.yml | 7 +- CONTRIBUTING.md | 48 ++--- Cargo.toml | 42 +---- Makefile | 34 ---- libbindgen/Cargo.toml | 54 ++++++ build.rs => libbindgen/build.rs | 0 {src => libbindgen/src}/chooser.rs | 0 {src => libbindgen/src}/clang.rs | 0 {src => libbindgen/src}/clangll.rs | 0 {src => libbindgen/src}/codegen/helpers.rs | 0 {src => libbindgen/src}/codegen/mod.rs | 0 {src => libbindgen/src}/ir/annotations.rs | 0 {src => libbindgen/src}/ir/comp.rs | 0 {src => libbindgen/src}/ir/context.rs | 0 {src => libbindgen/src}/ir/enum_ty.rs | 0 {src => libbindgen/src}/ir/function.rs | 0 {src => libbindgen/src}/ir/int.rs | 0 {src => libbindgen/src}/ir/item.rs | 0 {src => libbindgen/src}/ir/item_kind.rs | 0 {src => libbindgen/src}/ir/layout.rs | 0 {src => libbindgen/src}/ir/mod.rs | 0 {src => libbindgen/src}/ir/module.rs | 0 {src => libbindgen/src}/ir/ty.rs | 0 {src => libbindgen/src}/ir/type_collector.rs | 0 {src => libbindgen/src}/ir/var.rs | 0 {src => libbindgen/src}/lib.rs | 3 - {src => libbindgen/src}/parse.rs | 0 {src => libbindgen/src}/regex_set.rs | 0 {src => libbindgen/src}/uses.rs | 0 .../tests}/expectations/Cargo.toml | 0 .../tests}/expectations/src/lib.rs | 0 .../tests}/expectations/tests/accessors.rs | 0 .../expectations/tests/annotation_hide.rs | 0 .../tests}/expectations/tests/anon_enum.rs | 0 .../expectations/tests/anon_enum_whitelist.rs | 0 .../tests}/expectations/tests/anon_union.rs | 0 .../tests}/expectations/tests/arg_keyword.rs | 0 .../expectations/tests/base-to-derived.rs | 0 .../expectations/tests/bitfield-enum-basic.rs | 0 .../tests}/expectations/tests/blocks.rs | 0 .../tests}/expectations/tests/class.rs | 0 .../tests}/expectations/tests/class_nested.rs | 0 .../expectations/tests/class_no_members.rs | 0 .../tests}/expectations/tests/class_static.rs | 0 .../expectations/tests/class_static_const.rs | 0 .../tests}/expectations/tests/class_use_as.rs | 0 .../expectations/tests/class_with_dtor.rs | 0 .../tests/class_with_inner_struct.rs | 0 .../expectations/tests/class_with_typedef.rs | 0 .../tests}/expectations/tests/complex.rs | 0 .../expectations/tests/complex_global.rs | 0 .../expectations/tests/const_enum_unnamed.rs | 0 .../tests}/expectations/tests/const_ptr.rs | 0 .../expectations/tests/const_resolved_ty.rs | 0 .../tests}/expectations/tests/const_tparam.rs | 0 .../expectations/tests/convert-floats.rs | 0 .../tests}/expectations/tests/crtp.rs | 0 .../tests/decl_extern_int_twice.rs | 0 .../expectations/tests/decl_ptr_to_array.rs | 0 .../tests/duplicated_constants_in_ns.rs | 0 .../tests}/expectations/tests/elaborated.rs | 0 .../tests/empty_template_param_name.rs | 0 .../tests}/expectations/tests/enum.rs | 0 .../tests}/expectations/tests/enum_alias.rs | 0 .../tests/enum_and_vtable_mangling.rs | 0 .../tests}/expectations/tests/enum_dupe.rs | 0 .../expectations/tests/enum_explicit_type.rs | 0 .../expectations/tests/enum_negative.rs | 0 .../tests}/expectations/tests/enum_packed.rs | 0 .../tests}/expectations/tests/extern.rs | 0 .../tests}/expectations/tests/float128.rs | 0 .../forward-inherit-struct-with-fields.rs | 0 .../tests/forward-inherit-struct.rs | 0 .../tests/forward_declared_struct.rs | 0 .../tests}/expectations/tests/func_proto.rs | 0 .../tests}/expectations/tests/func_ptr.rs | 0 .../expectations/tests/func_ptr_in_struct.rs | 0 .../expectations/tests/func_with_array_arg.rs | 0 .../tests/func_with_func_ptr_arg.rs | 0 .../expectations/tests/in_class_typedef.rs | 0 .../expectations/tests/inherit-namespaced.rs | 0 .../expectations/tests/inherit_named.rs | 0 .../expectations/tests/inherit_typedef.rs | 0 .../tests}/expectations/tests/inner_const.rs | 0 .../expectations/tests/inner_template_self.rs | 0 .../tests}/expectations/tests/int128_t.rs | 0 .../expectations/tests/jsval_layout_opaque.rs | 0 .../tests}/expectations/tests/keywords.rs | 0 .../expectations/tests/macro-expr-basic.rs | 0 .../tests}/expectations/tests/macro-redef.rs | 0 .../multiple-inherit-empty-correct-layout.rs | 0 .../tests}/expectations/tests/mutable.rs | 0 .../tests}/expectations/tests/namespace.rs | 0 .../tests}/expectations/tests/nested.rs | 0 .../expectations/tests/nested_vtable.rs | 0 .../tests}/expectations/tests/no-std.rs | 0 .../tests}/expectations/tests/no_copy.rs | 0 .../expectations/tests/nsStyleAutoArray.rs | 0 .../expectations/tests/only_bitfields.rs | 0 .../expectations/tests/opaque_in_struct.rs | 0 .../expectations/tests/opaque_pointer.rs | 0 .../expectations/tests/opaque_typedef.rs | 0 .../expectations/tests/overflowed_enum.rs | 0 .../tests}/expectations/tests/overloading.rs | 0 .../tests}/expectations/tests/private.rs | 0 .../expectations/tests/redeclaration.rs | 0 .../expectations/tests/ref_argument_array.rs | 0 .../tests/replace_template_alias.rs | 0 .../expectations/tests/replaces_double.rs | 0 .../expectations/tests/size_t_template.rs | 0 ...ruct_containing_forward_declared_struct.rs | 0 .../tests/struct_with_anon_struct.rs | 0 .../tests/struct_with_anon_struct_array.rs | 0 .../tests/struct_with_anon_struct_pointer.rs | 0 .../tests/struct_with_anon_union.rs | 0 .../tests/struct_with_anon_unnamed_struct.rs | 0 .../tests/struct_with_anon_unnamed_union.rs | 0 .../tests/struct_with_bitfields.rs | 0 .../tests/struct_with_derive_debug.rs | 0 .../expectations/tests/struct_with_nesting.rs | 0 .../expectations/tests/struct_with_packing.rs | 0 .../expectations/tests/struct_with_struct.rs | 0 .../tests/struct_with_typedef_template_arg.rs | 0 .../tests}/expectations/tests/template.rs | 0 .../expectations/tests/template_alias.rs | 0 .../tests/template_alias_basic.rs | 0 .../tests/template_alias_namespace.rs | 0 .../template_typedef_transitive_param.rs | 0 .../expectations/tests/template_typedefs.rs | 0 .../expectations/tests/type_alias_empty.rs | 0 .../tests}/expectations/tests/typeref.rs | 0 .../tests}/expectations/tests/union_dtor.rs | 0 .../tests}/expectations/tests/union_fields.rs | 0 .../expectations/tests/union_template.rs | 0 .../tests/union_with_anon_struct.rs | 0 .../tests/union_with_anon_struct_bitfield.rs | 0 .../tests/union_with_anon_union.rs | 0 .../tests/union_with_anon_unnamed_struct.rs | 0 .../tests/union_with_anon_unnamed_union.rs | 0 .../tests/union_with_big_member.rs | 0 .../expectations/tests/union_with_nesting.rs | 0 .../tests}/expectations/tests/unknown_attr.rs | 0 .../tests}/expectations/tests/use-core.rs | 0 .../tests}/expectations/tests/using.rs | 0 .../tests}/expectations/tests/vector.rs | 0 .../tests}/expectations/tests/virtual_dtor.rs | 0 .../expectations/tests/virtual_overloaded.rs | 0 .../tests/vtable_recursive_sig.rs | 0 .../expectations/tests/weird_bitfields.rs | 0 .../expectations/tests/what_is_going_on.rs | 0 .../expectations/tests/whitelist_basic.rs | 0 .../expectations/tests/whitelist_vars.rs | 0 .../tests}/headers/accessors.hpp | 0 .../tests}/headers/annotation_hide.hpp | 0 .../tests}/headers/anon_enum.hpp | 0 .../tests}/headers/anon_enum_whitelist.h | 0 .../tests}/headers/anon_union.hpp | 0 .../tests}/headers/arg_keyword.hpp | 0 .../tests}/headers/base-to-derived.hpp | 0 .../tests}/headers/bitfield-enum-basic.h | 0 {tests => libbindgen/tests}/headers/blocks.h | 0 {tests => libbindgen/tests}/headers/class.hpp | 0 .../tests}/headers/class_nested.hpp | 0 .../tests}/headers/class_no_members.hpp | 0 .../tests}/headers/class_static.hpp | 0 .../tests}/headers/class_static_const.hpp | 0 .../tests}/headers/class_use_as.hpp | 0 .../tests}/headers/class_with_dtor.hpp | 0 .../headers/class_with_inner_struct.hpp | 0 .../tests}/headers/class_with_typedef.hpp | 0 {tests => libbindgen/tests}/headers/complex.h | 0 .../tests}/headers/complex_global.h | 0 .../tests}/headers/const_enum_unnamed.hpp | 0 .../tests}/headers/const_ptr.hpp | 0 .../tests}/headers/const_resolved_ty.h | 0 .../tests}/headers/const_tparam.hpp | 0 .../tests}/headers/convert-floats.h | 0 {tests => libbindgen/tests}/headers/crtp.hpp | 0 .../tests}/headers/decl_extern_int_twice.h | 0 .../tests}/headers/decl_ptr_to_array.h | 0 .../headers/duplicated_constants_in_ns.hpp | 0 .../tests}/headers/elaborated.hpp | 0 .../headers/empty_template_param_name.hpp | 0 {tests => libbindgen/tests}/headers/enum.h | 0 .../tests}/headers/enum_alias.hpp | 0 .../headers/enum_and_vtable_mangling.hpp | 0 .../tests}/headers/enum_dupe.h | 0 .../tests}/headers/enum_explicit_type.hpp | 0 .../tests}/headers/enum_negative.h | 0 .../tests}/headers/enum_packed.h | 0 .../tests}/headers/extern.hpp | 0 .../tests}/headers/float128.hpp | 0 .../forward-inherit-struct-with-fields.hpp | 0 .../tests}/headers/forward-inherit-struct.hpp | 0 .../tests}/headers/forward_declared_struct.h | 0 .../tests}/headers/func_proto.h | 0 .../tests}/headers/func_ptr.h | 0 .../tests}/headers/func_ptr_in_struct.h | 0 .../tests}/headers/func_with_array_arg.h | 0 .../tests}/headers/func_with_func_ptr_arg.h | 0 .../tests}/headers/in_class_typedef.hpp | 0 .../tests}/headers/inherit-namespaced.hpp | 0 .../tests}/headers/inherit_named.hpp | 0 .../tests}/headers/inherit_typedef.hpp | 0 .../tests}/headers/inner_const.hpp | 0 .../tests}/headers/inner_template_self.hpp | 0 .../tests}/headers/int128_t.h | 0 .../tests}/headers/jsval_layout_opaque.hpp | 0 .../tests}/headers/keywords.h | 0 .../tests}/headers/macro-expr-basic.h | 0 .../tests}/headers/macro-redef.h | 0 .../multiple-inherit-empty-correct-layout.hpp | 0 .../tests}/headers/mutable.hpp | 0 .../tests}/headers/namespace.hpp | 0 .../tests}/headers/nested.hpp | 0 .../tests}/headers/nested_vtable.hpp | 0 {tests => libbindgen/tests}/headers/no-std.h | 0 .../tests}/headers/no_copy.hpp | 0 .../tests}/headers/nsStyleAutoArray.hpp | 0 .../tests}/headers/only_bitfields.hpp | 0 .../tests}/headers/opaque_in_struct.hpp | 0 .../tests}/headers/opaque_pointer.hpp | 0 .../tests}/headers/opaque_typedef.hpp | 0 .../tests}/headers/overflowed_enum.hpp | 0 .../tests}/headers/overloading.hpp | 0 .../tests}/headers/private.hpp | 0 .../tests}/headers/redeclaration.hpp | 0 .../tests}/headers/ref_argument_array.hpp | 0 .../tests}/headers/replace_template_alias.hpp | 0 .../tests}/headers/replaces_double.hpp | 0 .../tests}/headers/size_t_template.hpp | 0 ...truct_containing_forward_declared_struct.h | 0 .../tests}/headers/struct_with_anon_struct.h | 0 .../headers/struct_with_anon_struct_array.h | 0 .../headers/struct_with_anon_struct_pointer.h | 0 .../tests}/headers/struct_with_anon_union.h | 0 .../headers/struct_with_anon_unnamed_struct.h | 0 .../headers/struct_with_anon_unnamed_union.h | 0 .../tests}/headers/struct_with_bitfields.h | 0 .../tests}/headers/struct_with_derive_debug.h | 0 .../tests}/headers/struct_with_nesting.h | 0 .../tests}/headers/struct_with_packing.h | 0 .../tests}/headers/struct_with_struct.h | 0 .../struct_with_typedef_template_arg.hpp | 0 .../tests}/headers/template.hpp | 0 .../tests}/headers/template_alias.hpp | 0 .../tests}/headers/template_alias_basic.hpp | 0 .../headers/template_alias_namespace.hpp | 0 .../template_typedef_transitive_param.hpp | 0 .../tests}/headers/template_typedefs.hpp | 0 .../tests}/headers/type_alias_empty.hpp | 0 .../tests}/headers/typeref.hpp | 0 .../tests}/headers/union_dtor.hpp | 0 .../tests}/headers/union_fields.hpp | 0 .../tests}/headers/union_template.hpp | 0 .../tests}/headers/union_with_anon_struct.h | 0 .../headers/union_with_anon_struct_bitfield.h | 0 .../tests}/headers/union_with_anon_union.h | 0 .../headers/union_with_anon_unnamed_struct.h | 0 .../headers/union_with_anon_unnamed_union.h | 0 .../tests}/headers/union_with_big_member.h | 0 .../tests}/headers/union_with_nesting.h | 0 .../tests}/headers/unknown_attr.h | 0 .../tests}/headers/use-core.h | 0 {tests => libbindgen/tests}/headers/using.hpp | 0 .../tests}/headers/vector.hpp | 0 .../tests}/headers/virtual_dtor.hpp | 0 .../tests}/headers/virtual_overloaded.hpp | 0 .../tests}/headers/vtable_recursive_sig.hpp | 0 .../tests}/headers/weird_bitfields.hpp | 0 .../tests}/headers/what_is_going_on.hpp | 0 .../tests}/headers/whitelist_basic.hpp | 0 .../tests}/headers/whitelist_vars.h | 0 libbindgen/tests/tests.rs | 138 ++++++++++++++ {tests => libbindgen/tests}/uses/.gitignore | 0 src/{bin/bindgen.rs => main.rs} | 7 +- src/{bin => }/options.rs | 5 +- tests/tests.rs | 171 ----------------- tests/tools/run-bindgen.py | 175 ------------------ 280 files changed, 216 insertions(+), 472 deletions(-) delete mode 100644 Makefile create mode 100644 libbindgen/Cargo.toml rename build.rs => libbindgen/build.rs (100%) rename {src => libbindgen/src}/chooser.rs (100%) rename {src => libbindgen/src}/clang.rs (100%) mode change 100755 => 100644 rename {src => libbindgen/src}/clangll.rs (100%) rename {src => libbindgen/src}/codegen/helpers.rs (100%) rename {src => libbindgen/src}/codegen/mod.rs (100%) mode change 100755 => 100644 rename {src => libbindgen/src}/ir/annotations.rs (100%) rename {src => libbindgen/src}/ir/comp.rs (100%) rename {src => libbindgen/src}/ir/context.rs (100%) rename {src => libbindgen/src}/ir/enum_ty.rs (100%) rename {src => libbindgen/src}/ir/function.rs (100%) rename {src => libbindgen/src}/ir/int.rs (100%) rename {src => libbindgen/src}/ir/item.rs (100%) rename {src => libbindgen/src}/ir/item_kind.rs (100%) rename {src => libbindgen/src}/ir/layout.rs (100%) rename {src => libbindgen/src}/ir/mod.rs (100%) rename {src => libbindgen/src}/ir/module.rs (100%) rename {src => libbindgen/src}/ir/ty.rs (100%) rename {src => libbindgen/src}/ir/type_collector.rs (100%) rename {src => libbindgen/src}/ir/var.rs (100%) rename {src => libbindgen/src}/lib.rs (99%) mode change 100755 => 100644 rename {src => libbindgen/src}/parse.rs (100%) rename {src => libbindgen/src}/regex_set.rs (100%) rename {src => libbindgen/src}/uses.rs (100%) rename {tests => libbindgen/tests}/expectations/Cargo.toml (100%) rename {tests => libbindgen/tests}/expectations/src/lib.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/accessors.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/annotation_hide.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/anon_enum.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/anon_enum_whitelist.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/anon_union.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/arg_keyword.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/base-to-derived.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/bitfield-enum-basic.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/blocks.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/class.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/class_nested.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/class_no_members.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/class_static.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/class_static_const.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/class_use_as.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/class_with_dtor.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/class_with_inner_struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/class_with_typedef.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/complex.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/complex_global.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/const_enum_unnamed.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/const_ptr.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/const_resolved_ty.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/const_tparam.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/convert-floats.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/crtp.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/decl_extern_int_twice.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/decl_ptr_to_array.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/duplicated_constants_in_ns.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/elaborated.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/empty_template_param_name.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/enum.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/enum_alias.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/enum_and_vtable_mangling.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/enum_dupe.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/enum_explicit_type.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/enum_negative.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/enum_packed.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/extern.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/float128.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/forward-inherit-struct-with-fields.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/forward-inherit-struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/forward_declared_struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/func_proto.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/func_ptr.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/func_ptr_in_struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/func_with_array_arg.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/func_with_func_ptr_arg.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/in_class_typedef.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/inherit-namespaced.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/inherit_named.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/inherit_typedef.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/inner_const.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/inner_template_self.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/int128_t.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/jsval_layout_opaque.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/keywords.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/macro-expr-basic.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/macro-redef.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/multiple-inherit-empty-correct-layout.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/mutable.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/namespace.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/nested.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/nested_vtable.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/no-std.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/no_copy.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/nsStyleAutoArray.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/only_bitfields.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/opaque_in_struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/opaque_pointer.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/opaque_typedef.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/overflowed_enum.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/overloading.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/private.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/redeclaration.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/ref_argument_array.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/replace_template_alias.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/replaces_double.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/size_t_template.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_containing_forward_declared_struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_anon_struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_anon_struct_array.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_anon_struct_pointer.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_anon_union.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_anon_unnamed_struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_anon_unnamed_union.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_bitfields.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_derive_debug.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_nesting.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_packing.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/struct_with_typedef_template_arg.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/template.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/template_alias.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/template_alias_basic.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/template_alias_namespace.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/template_typedef_transitive_param.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/template_typedefs.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/type_alias_empty.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/typeref.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/union_dtor.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/union_fields.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/union_template.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/union_with_anon_struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/union_with_anon_struct_bitfield.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/union_with_anon_union.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/union_with_anon_unnamed_struct.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/union_with_anon_unnamed_union.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/union_with_big_member.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/union_with_nesting.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/unknown_attr.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/use-core.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/using.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/vector.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/virtual_dtor.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/virtual_overloaded.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/vtable_recursive_sig.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/weird_bitfields.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/what_is_going_on.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/whitelist_basic.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/whitelist_vars.rs (100%) rename {tests => libbindgen/tests}/headers/accessors.hpp (100%) rename {tests => libbindgen/tests}/headers/annotation_hide.hpp (100%) rename {tests => libbindgen/tests}/headers/anon_enum.hpp (100%) rename {tests => libbindgen/tests}/headers/anon_enum_whitelist.h (100%) rename {tests => libbindgen/tests}/headers/anon_union.hpp (100%) rename {tests => libbindgen/tests}/headers/arg_keyword.hpp (100%) rename {tests => libbindgen/tests}/headers/base-to-derived.hpp (100%) rename {tests => libbindgen/tests}/headers/bitfield-enum-basic.h (100%) rename {tests => libbindgen/tests}/headers/blocks.h (100%) rename {tests => libbindgen/tests}/headers/class.hpp (100%) rename {tests => libbindgen/tests}/headers/class_nested.hpp (100%) rename {tests => libbindgen/tests}/headers/class_no_members.hpp (100%) rename {tests => libbindgen/tests}/headers/class_static.hpp (100%) rename {tests => libbindgen/tests}/headers/class_static_const.hpp (100%) rename {tests => libbindgen/tests}/headers/class_use_as.hpp (100%) rename {tests => libbindgen/tests}/headers/class_with_dtor.hpp (100%) rename {tests => libbindgen/tests}/headers/class_with_inner_struct.hpp (100%) rename {tests => libbindgen/tests}/headers/class_with_typedef.hpp (100%) rename {tests => libbindgen/tests}/headers/complex.h (100%) rename {tests => libbindgen/tests}/headers/complex_global.h (100%) rename {tests => libbindgen/tests}/headers/const_enum_unnamed.hpp (100%) rename {tests => libbindgen/tests}/headers/const_ptr.hpp (100%) rename {tests => libbindgen/tests}/headers/const_resolved_ty.h (100%) rename {tests => libbindgen/tests}/headers/const_tparam.hpp (100%) rename {tests => libbindgen/tests}/headers/convert-floats.h (100%) rename {tests => libbindgen/tests}/headers/crtp.hpp (100%) rename {tests => libbindgen/tests}/headers/decl_extern_int_twice.h (100%) rename {tests => libbindgen/tests}/headers/decl_ptr_to_array.h (100%) rename {tests => libbindgen/tests}/headers/duplicated_constants_in_ns.hpp (100%) rename {tests => libbindgen/tests}/headers/elaborated.hpp (100%) rename {tests => libbindgen/tests}/headers/empty_template_param_name.hpp (100%) rename {tests => libbindgen/tests}/headers/enum.h (100%) rename {tests => libbindgen/tests}/headers/enum_alias.hpp (100%) rename {tests => libbindgen/tests}/headers/enum_and_vtable_mangling.hpp (100%) rename {tests => libbindgen/tests}/headers/enum_dupe.h (100%) rename {tests => libbindgen/tests}/headers/enum_explicit_type.hpp (100%) rename {tests => libbindgen/tests}/headers/enum_negative.h (100%) rename {tests => libbindgen/tests}/headers/enum_packed.h (100%) rename {tests => libbindgen/tests}/headers/extern.hpp (100%) rename {tests => libbindgen/tests}/headers/float128.hpp (100%) rename {tests => libbindgen/tests}/headers/forward-inherit-struct-with-fields.hpp (100%) rename {tests => libbindgen/tests}/headers/forward-inherit-struct.hpp (100%) rename {tests => libbindgen/tests}/headers/forward_declared_struct.h (100%) rename {tests => libbindgen/tests}/headers/func_proto.h (100%) rename {tests => libbindgen/tests}/headers/func_ptr.h (100%) rename {tests => libbindgen/tests}/headers/func_ptr_in_struct.h (100%) rename {tests => libbindgen/tests}/headers/func_with_array_arg.h (100%) rename {tests => libbindgen/tests}/headers/func_with_func_ptr_arg.h (100%) rename {tests => libbindgen/tests}/headers/in_class_typedef.hpp (100%) rename {tests => libbindgen/tests}/headers/inherit-namespaced.hpp (100%) rename {tests => libbindgen/tests}/headers/inherit_named.hpp (100%) rename {tests => libbindgen/tests}/headers/inherit_typedef.hpp (100%) rename {tests => libbindgen/tests}/headers/inner_const.hpp (100%) rename {tests => libbindgen/tests}/headers/inner_template_self.hpp (100%) rename {tests => libbindgen/tests}/headers/int128_t.h (100%) rename {tests => libbindgen/tests}/headers/jsval_layout_opaque.hpp (100%) rename {tests => libbindgen/tests}/headers/keywords.h (100%) rename {tests => libbindgen/tests}/headers/macro-expr-basic.h (100%) rename {tests => libbindgen/tests}/headers/macro-redef.h (100%) rename {tests => libbindgen/tests}/headers/multiple-inherit-empty-correct-layout.hpp (100%) rename {tests => libbindgen/tests}/headers/mutable.hpp (100%) rename {tests => libbindgen/tests}/headers/namespace.hpp (100%) rename {tests => libbindgen/tests}/headers/nested.hpp (100%) rename {tests => libbindgen/tests}/headers/nested_vtable.hpp (100%) rename {tests => libbindgen/tests}/headers/no-std.h (100%) rename {tests => libbindgen/tests}/headers/no_copy.hpp (100%) rename {tests => libbindgen/tests}/headers/nsStyleAutoArray.hpp (100%) rename {tests => libbindgen/tests}/headers/only_bitfields.hpp (100%) rename {tests => libbindgen/tests}/headers/opaque_in_struct.hpp (100%) rename {tests => libbindgen/tests}/headers/opaque_pointer.hpp (100%) rename {tests => libbindgen/tests}/headers/opaque_typedef.hpp (100%) rename {tests => libbindgen/tests}/headers/overflowed_enum.hpp (100%) rename {tests => libbindgen/tests}/headers/overloading.hpp (100%) rename {tests => libbindgen/tests}/headers/private.hpp (100%) rename {tests => libbindgen/tests}/headers/redeclaration.hpp (100%) rename {tests => libbindgen/tests}/headers/ref_argument_array.hpp (100%) rename {tests => libbindgen/tests}/headers/replace_template_alias.hpp (100%) rename {tests => libbindgen/tests}/headers/replaces_double.hpp (100%) rename {tests => libbindgen/tests}/headers/size_t_template.hpp (100%) rename {tests => libbindgen/tests}/headers/struct_containing_forward_declared_struct.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_anon_struct.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_anon_struct_array.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_anon_struct_pointer.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_anon_union.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_anon_unnamed_struct.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_anon_unnamed_union.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_bitfields.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_derive_debug.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_nesting.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_packing.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_struct.h (100%) rename {tests => libbindgen/tests}/headers/struct_with_typedef_template_arg.hpp (100%) rename {tests => libbindgen/tests}/headers/template.hpp (100%) rename {tests => libbindgen/tests}/headers/template_alias.hpp (100%) rename {tests => libbindgen/tests}/headers/template_alias_basic.hpp (100%) rename {tests => libbindgen/tests}/headers/template_alias_namespace.hpp (100%) rename {tests => libbindgen/tests}/headers/template_typedef_transitive_param.hpp (100%) rename {tests => libbindgen/tests}/headers/template_typedefs.hpp (100%) rename {tests => libbindgen/tests}/headers/type_alias_empty.hpp (100%) rename {tests => libbindgen/tests}/headers/typeref.hpp (100%) rename {tests => libbindgen/tests}/headers/union_dtor.hpp (100%) rename {tests => libbindgen/tests}/headers/union_fields.hpp (100%) rename {tests => libbindgen/tests}/headers/union_template.hpp (100%) rename {tests => libbindgen/tests}/headers/union_with_anon_struct.h (100%) rename {tests => libbindgen/tests}/headers/union_with_anon_struct_bitfield.h (100%) rename {tests => libbindgen/tests}/headers/union_with_anon_union.h (100%) rename {tests => libbindgen/tests}/headers/union_with_anon_unnamed_struct.h (100%) rename {tests => libbindgen/tests}/headers/union_with_anon_unnamed_union.h (100%) rename {tests => libbindgen/tests}/headers/union_with_big_member.h (100%) rename {tests => libbindgen/tests}/headers/union_with_nesting.h (100%) rename {tests => libbindgen/tests}/headers/unknown_attr.h (100%) rename {tests => libbindgen/tests}/headers/use-core.h (100%) rename {tests => libbindgen/tests}/headers/using.hpp (100%) rename {tests => libbindgen/tests}/headers/vector.hpp (100%) rename {tests => libbindgen/tests}/headers/virtual_dtor.hpp (100%) rename {tests => libbindgen/tests}/headers/virtual_overloaded.hpp (100%) rename {tests => libbindgen/tests}/headers/vtable_recursive_sig.hpp (100%) rename {tests => libbindgen/tests}/headers/weird_bitfields.hpp (100%) rename {tests => libbindgen/tests}/headers/what_is_going_on.hpp (100%) rename {tests => libbindgen/tests}/headers/whitelist_basic.hpp (100%) rename {tests => libbindgen/tests}/headers/whitelist_vars.h (100%) create mode 100644 libbindgen/tests/tests.rs rename {tests => libbindgen/tests}/uses/.gitignore (100%) rename src/{bin/bindgen.rs => main.rs} (96%) mode change 100755 => 100644 rename src/{bin => }/options.rs (99%) delete mode 100644 tests/tests.rs delete mode 100755 tests/tools/run-bindgen.py diff --git a/.gitignore b/.gitignore index f54aca9873..049fbc4aa6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,5 @@ -bindgen -libbindgen* - # Cargo target/ Cargo.lock *~ #*# - diff --git a/.travis.yml b/.travis.yml index 467c42dca7..48f0b4b1a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,16 +24,19 @@ cache: before_install: . ./ci/before_install.sh +before_script: cd libbindgen + script: - - cargo build --verbose --features "$BINDGEN_FEATURES" - cargo test --features "$BINDGEN_FEATURES" - - cargo build --release --verbose --features "$BINDGEN_FEATURES" - cargo test --release --features "$BINDGEN_FEATURES" - git add -A - git diff @ - git diff-index --quiet HEAD - cargo test -p tests_expectations - cargo build --features "$BINDGEN_FEATURES _docs" + - cd .. + - cargo test --features "$BINDGEN_FEATURES" + - cargo test --release --features "$BINDGEN_FEATURES" notifications: webhooks: http://build.servo.org:54856/travis diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ce95e21cf8..bab631d653 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,20 +42,22 @@ that you aren't forgetting to document types and functions. CI will catch it if you forget, but the turn around will be a lot slower ;) ``` -$ cargo build --features "llvm_stable _docs" +$ cd libbindgen && cargo build --features "llvm_stable _docs" ``` ## Testing +Code for binding generation and testing thereof is in the `libbindgen` crate. +The following sections assume you are working in that subdirectory. + ### Overview -Input C/C++ test headers reside in the `tests/headers` directory. The expected -output rust bindings live in `tests/expectations/tests`; for example, -`tests/headers/my_header.h`'s expected generated rust bindings would be +Input C/C++ test headers reside in the `tests/headers` directory. Expected +output Rust bindings live in `tests/expectations/tests`. For example, +`tests/headers/my_header.h`'s expected generated Rust bindings would be `tests/expectations/tests/my_header.rs`. -The `tests/tools/run-bindgen.py` script runs `bindgen` on the test headers and -compares the results to the expectations. +Run `cargo test` to compare generated Rust bindings to the expectations. ### Running All Tests @@ -63,25 +65,11 @@ compares the results to the expectations. $ cargo test [--features llvm_stable] ``` -This spawns a `tests/tools/run-bindgen.py` subprocess for each test header. - -### Running a Single, Specific Test - -``` -$ ./tests/tools/run-bindgen.py ./target/debug/bindgen ./tests/headers/some_header.h -``` - -To learn more about the options available with `run-bindgen.py`: - -``` -$ ./tests/tools/run-bindgen.py --help -``` - ### Authoring New Tests To add a new test header to the suite, simply put it in the `tests/headers` -directory. Next, run the `run-bindgen.py` script with the new test header, which -will generate the initial expected output rust bindings. +directory. Next, run `bindgen` to generate the initial expected output Rust +bindings. Put those in `tests/expectations/tests`. If your new test requires certain flags to be passed to `bindgen`, you can specify them at the top of the test header, with a comment like this: @@ -90,14 +78,7 @@ specify them at the top of the test header, with a comment like this: // bindgen-flags: --enable-cxx-namespaces -- -std=c++14 ``` -If your new test requires `bindgen` to be built with certain features, you can -specify the required features at the top of the test header in a similar manner: - -```c -// bingden-features: llvm_stable -``` - -Then verify the new rust bindings compile and its tests pass: +Then verify the new Rust bindings compile and pass some basic tests: ``` $ cargo test -p tests_expectations @@ -130,14 +111,13 @@ To help debug what `bindgen` is doing, you can define the environment variable `RUST_LOG=bindgen` to get a bunch of debugging log spew. ``` -$ RUST_LOG=bindgen ./target/debug/bindgen [flags...] ~/path/to/some/header.h +$ RUST_LOG=libbindgen ./target/debug/bindgen [flags...] ~/path/to/some/header.h ``` -This logging can also be used when debugging failing tests under -`run-bindgen.py`: +This logging can also be used when debugging failing tests: ``` -$ RUST_LOG=bindgen ./tests/tools/run-bindgen.py ./target/debug/bindgen tests/headers/whatever.h +$ RUST_LOG=libbindgen cd libbindgen && cargo test ``` ## Using `creduce` to Minimize Test Cases diff --git a/Cargo.toml b/Cargo.toml index 920902268b..e5a14a6f82 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,6 @@ authors = [ "Emilio Cobos Álvarez ", "The Servo project developers", ] -build = "build.rs" description = "A binding generator for Rust" homepage = "https://github.com/servo/rust-bindgen" keywords = ["bindings", "ffi", "code-generation"] @@ -14,50 +13,13 @@ readme = "README.md" repository = "https://github.com/servo/rust-bindgen" version = "0.17.0" -[[bin]] -doc = false -name = "bindgen" - -[build-dependencies] -quasi_codegen = "0.20" - [dependencies] -cfg-if = "0.1.0" clang-sys = "0.8.0" clap = "2" -lazy_static = "0.1.*" -libc = "0.2" +libbindgen = { path = "libbindgen" } log = "0.3" env_logger = "0.3" rustc-serialize = "0.3.19" -syntex_syntax = "0.44" -regex = "0.1" -cexpr = "0.2" - -[dependencies.aster] -features = ["with-syntex"] -version = "0.28" - -[dependencies.clippy] -optional = true -version = "*" - -[dependencies.quasi] -features = ["with-syntex"] -version = "0.20" [features] -llvm_stable = [] -static = [] -# This feature only exists for CI -- don't use it! -_docs = [] - -[lib] -name = "bindgen" -path = "src/lib.rs" - -[dev-dependencies.tests_expectations] -path = "tests/expectations" - -[[test]] -name = "tests" +llvm_stable = ["libbindgen/llvm_stable"] diff --git a/Makefile b/Makefile deleted file mode 100644 index 90281f7b61..0000000000 --- a/Makefile +++ /dev/null @@ -1,34 +0,0 @@ - -TEST_HEADERS := $(wildcard tests/headers/*.h) $(wildcard tests/headers/*.hpp) - -TEST_TARGETS := $(TEST_HEADERS:.h=.rs) -TEST_TARGETS := $(TEST_TARGETS:.hpp=.rs) -TEST_TARGETS := $(patsubst tests/headers/%, tests/expectations/tests/%, $(TEST_TARGETS)) - -BINDGEN := ./target/debug/bindgen - -.PHONY: $(BINDGEN) -$(BINDGEN): - [ -f $@ ] || cargo build --features llvm_stable - -.PHONY: test -test: - cargo test --features llvm_stable - - -.PHONY: regen-tests -regen-tests: $(BINDGEN) clean-tests $(TEST_TARGETS) - @echo > /dev/null - -.PHONY: clean-tests -clean-tests: - $(RM) $(TEST_TARGETS) - -# TODO: Add options to add flags and whatnot -tests/expectations/tests/%.rs: tests/headers/%.h - @mkdir -p $(dir $@) - ./tests/tools/run-bindgen.py $(BINDGEN) $< $@ - -tests/expectations/tests/%.rs: tests/headers/%.hpp - @mkdir -p $(dir $@) - ./tests/tools/run-bindgen.py $(BINDGEN) $< $@ diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml new file mode 100644 index 0000000000..664ece6e6b --- /dev/null +++ b/libbindgen/Cargo.toml @@ -0,0 +1,54 @@ +[package] +authors = [ + "Jyun-Yan You ", + "Emilio Cobos Álvarez ", + "The Servo project developers", +] +build = "build.rs" +description = "A binding generator for Rust" +homepage = "https://github.com/servo/rust-bindgen" +keywords = ["bindings", "ffi", "code-generation"] +license = "BSD-3-Clause" +name = "libbindgen" +readme = "README.md" +repository = "https://github.com/servo/rust-bindgen" +version = "0.17.0" + +[dev-dependencies] +diff = "0.1" +clap = "2" +shlex = "0.1" +tests_expectations = { path = "tests/expectations" } + +[build-dependencies] +quasi_codegen = "0.20" + +[dependencies] +cfg-if = "0.1.0" +clang-sys = "0.8.0" +lazy_static = "0.1.*" +libc = "0.2" +log = "0.3" +env_logger = "0.3" +rustc-serialize = "0.3.19" +syntex_syntax = "0.44" +regex = "0.1" +cexpr = "0.2" + +[dependencies.aster] +features = ["with-syntex"] +version = "0.28" + +[dependencies.clippy] +optional = true +version = "*" + +[dependencies.quasi] +features = ["with-syntex"] +version = "0.20" + +[features] +llvm_stable = [] +static = [] +# This feature only exists for CI -- don't use it! +_docs = [] diff --git a/build.rs b/libbindgen/build.rs similarity index 100% rename from build.rs rename to libbindgen/build.rs diff --git a/src/chooser.rs b/libbindgen/src/chooser.rs similarity index 100% rename from src/chooser.rs rename to libbindgen/src/chooser.rs diff --git a/src/clang.rs b/libbindgen/src/clang.rs old mode 100755 new mode 100644 similarity index 100% rename from src/clang.rs rename to libbindgen/src/clang.rs diff --git a/src/clangll.rs b/libbindgen/src/clangll.rs similarity index 100% rename from src/clangll.rs rename to libbindgen/src/clangll.rs diff --git a/src/codegen/helpers.rs b/libbindgen/src/codegen/helpers.rs similarity index 100% rename from src/codegen/helpers.rs rename to libbindgen/src/codegen/helpers.rs diff --git a/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs old mode 100755 new mode 100644 similarity index 100% rename from src/codegen/mod.rs rename to libbindgen/src/codegen/mod.rs diff --git a/src/ir/annotations.rs b/libbindgen/src/ir/annotations.rs similarity index 100% rename from src/ir/annotations.rs rename to libbindgen/src/ir/annotations.rs diff --git a/src/ir/comp.rs b/libbindgen/src/ir/comp.rs similarity index 100% rename from src/ir/comp.rs rename to libbindgen/src/ir/comp.rs diff --git a/src/ir/context.rs b/libbindgen/src/ir/context.rs similarity index 100% rename from src/ir/context.rs rename to libbindgen/src/ir/context.rs diff --git a/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs similarity index 100% rename from src/ir/enum_ty.rs rename to libbindgen/src/ir/enum_ty.rs diff --git a/src/ir/function.rs b/libbindgen/src/ir/function.rs similarity index 100% rename from src/ir/function.rs rename to libbindgen/src/ir/function.rs diff --git a/src/ir/int.rs b/libbindgen/src/ir/int.rs similarity index 100% rename from src/ir/int.rs rename to libbindgen/src/ir/int.rs diff --git a/src/ir/item.rs b/libbindgen/src/ir/item.rs similarity index 100% rename from src/ir/item.rs rename to libbindgen/src/ir/item.rs diff --git a/src/ir/item_kind.rs b/libbindgen/src/ir/item_kind.rs similarity index 100% rename from src/ir/item_kind.rs rename to libbindgen/src/ir/item_kind.rs diff --git a/src/ir/layout.rs b/libbindgen/src/ir/layout.rs similarity index 100% rename from src/ir/layout.rs rename to libbindgen/src/ir/layout.rs diff --git a/src/ir/mod.rs b/libbindgen/src/ir/mod.rs similarity index 100% rename from src/ir/mod.rs rename to libbindgen/src/ir/mod.rs diff --git a/src/ir/module.rs b/libbindgen/src/ir/module.rs similarity index 100% rename from src/ir/module.rs rename to libbindgen/src/ir/module.rs diff --git a/src/ir/ty.rs b/libbindgen/src/ir/ty.rs similarity index 100% rename from src/ir/ty.rs rename to libbindgen/src/ir/ty.rs diff --git a/src/ir/type_collector.rs b/libbindgen/src/ir/type_collector.rs similarity index 100% rename from src/ir/type_collector.rs rename to libbindgen/src/ir/type_collector.rs diff --git a/src/ir/var.rs b/libbindgen/src/ir/var.rs similarity index 100% rename from src/ir/var.rs rename to libbindgen/src/ir/var.rs diff --git a/src/lib.rs b/libbindgen/src/lib.rs old mode 100755 new mode 100644 similarity index 99% rename from src/lib.rs rename to libbindgen/src/lib.rs index b56cb468e9..d0ca7b03af --- a/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -5,9 +5,6 @@ //! //! See the [Builder](./struct.Builder.html) struct for usage. -#![crate_name = "bindgen"] -#![crate_type = "dylib"] - #![cfg_attr(feature = "clippy", feature(plugin))] #![cfg_attr(feature = "clippy", plugin(clippy))] diff --git a/src/parse.rs b/libbindgen/src/parse.rs similarity index 100% rename from src/parse.rs rename to libbindgen/src/parse.rs diff --git a/src/regex_set.rs b/libbindgen/src/regex_set.rs similarity index 100% rename from src/regex_set.rs rename to libbindgen/src/regex_set.rs diff --git a/src/uses.rs b/libbindgen/src/uses.rs similarity index 100% rename from src/uses.rs rename to libbindgen/src/uses.rs diff --git a/tests/expectations/Cargo.toml b/libbindgen/tests/expectations/Cargo.toml similarity index 100% rename from tests/expectations/Cargo.toml rename to libbindgen/tests/expectations/Cargo.toml diff --git a/tests/expectations/src/lib.rs b/libbindgen/tests/expectations/src/lib.rs similarity index 100% rename from tests/expectations/src/lib.rs rename to libbindgen/tests/expectations/src/lib.rs diff --git a/tests/expectations/tests/accessors.rs b/libbindgen/tests/expectations/tests/accessors.rs similarity index 100% rename from tests/expectations/tests/accessors.rs rename to libbindgen/tests/expectations/tests/accessors.rs diff --git a/tests/expectations/tests/annotation_hide.rs b/libbindgen/tests/expectations/tests/annotation_hide.rs similarity index 100% rename from tests/expectations/tests/annotation_hide.rs rename to libbindgen/tests/expectations/tests/annotation_hide.rs diff --git a/tests/expectations/tests/anon_enum.rs b/libbindgen/tests/expectations/tests/anon_enum.rs similarity index 100% rename from tests/expectations/tests/anon_enum.rs rename to libbindgen/tests/expectations/tests/anon_enum.rs diff --git a/tests/expectations/tests/anon_enum_whitelist.rs b/libbindgen/tests/expectations/tests/anon_enum_whitelist.rs similarity index 100% rename from tests/expectations/tests/anon_enum_whitelist.rs rename to libbindgen/tests/expectations/tests/anon_enum_whitelist.rs diff --git a/tests/expectations/tests/anon_union.rs b/libbindgen/tests/expectations/tests/anon_union.rs similarity index 100% rename from tests/expectations/tests/anon_union.rs rename to libbindgen/tests/expectations/tests/anon_union.rs diff --git a/tests/expectations/tests/arg_keyword.rs b/libbindgen/tests/expectations/tests/arg_keyword.rs similarity index 100% rename from tests/expectations/tests/arg_keyword.rs rename to libbindgen/tests/expectations/tests/arg_keyword.rs diff --git a/tests/expectations/tests/base-to-derived.rs b/libbindgen/tests/expectations/tests/base-to-derived.rs similarity index 100% rename from tests/expectations/tests/base-to-derived.rs rename to libbindgen/tests/expectations/tests/base-to-derived.rs diff --git a/tests/expectations/tests/bitfield-enum-basic.rs b/libbindgen/tests/expectations/tests/bitfield-enum-basic.rs similarity index 100% rename from tests/expectations/tests/bitfield-enum-basic.rs rename to libbindgen/tests/expectations/tests/bitfield-enum-basic.rs diff --git a/tests/expectations/tests/blocks.rs b/libbindgen/tests/expectations/tests/blocks.rs similarity index 100% rename from tests/expectations/tests/blocks.rs rename to libbindgen/tests/expectations/tests/blocks.rs diff --git a/tests/expectations/tests/class.rs b/libbindgen/tests/expectations/tests/class.rs similarity index 100% rename from tests/expectations/tests/class.rs rename to libbindgen/tests/expectations/tests/class.rs diff --git a/tests/expectations/tests/class_nested.rs b/libbindgen/tests/expectations/tests/class_nested.rs similarity index 100% rename from tests/expectations/tests/class_nested.rs rename to libbindgen/tests/expectations/tests/class_nested.rs diff --git a/tests/expectations/tests/class_no_members.rs b/libbindgen/tests/expectations/tests/class_no_members.rs similarity index 100% rename from tests/expectations/tests/class_no_members.rs rename to libbindgen/tests/expectations/tests/class_no_members.rs diff --git a/tests/expectations/tests/class_static.rs b/libbindgen/tests/expectations/tests/class_static.rs similarity index 100% rename from tests/expectations/tests/class_static.rs rename to libbindgen/tests/expectations/tests/class_static.rs diff --git a/tests/expectations/tests/class_static_const.rs b/libbindgen/tests/expectations/tests/class_static_const.rs similarity index 100% rename from tests/expectations/tests/class_static_const.rs rename to libbindgen/tests/expectations/tests/class_static_const.rs diff --git a/tests/expectations/tests/class_use_as.rs b/libbindgen/tests/expectations/tests/class_use_as.rs similarity index 100% rename from tests/expectations/tests/class_use_as.rs rename to libbindgen/tests/expectations/tests/class_use_as.rs diff --git a/tests/expectations/tests/class_with_dtor.rs b/libbindgen/tests/expectations/tests/class_with_dtor.rs similarity index 100% rename from tests/expectations/tests/class_with_dtor.rs rename to libbindgen/tests/expectations/tests/class_with_dtor.rs diff --git a/tests/expectations/tests/class_with_inner_struct.rs b/libbindgen/tests/expectations/tests/class_with_inner_struct.rs similarity index 100% rename from tests/expectations/tests/class_with_inner_struct.rs rename to libbindgen/tests/expectations/tests/class_with_inner_struct.rs diff --git a/tests/expectations/tests/class_with_typedef.rs b/libbindgen/tests/expectations/tests/class_with_typedef.rs similarity index 100% rename from tests/expectations/tests/class_with_typedef.rs rename to libbindgen/tests/expectations/tests/class_with_typedef.rs diff --git a/tests/expectations/tests/complex.rs b/libbindgen/tests/expectations/tests/complex.rs similarity index 100% rename from tests/expectations/tests/complex.rs rename to libbindgen/tests/expectations/tests/complex.rs diff --git a/tests/expectations/tests/complex_global.rs b/libbindgen/tests/expectations/tests/complex_global.rs similarity index 100% rename from tests/expectations/tests/complex_global.rs rename to libbindgen/tests/expectations/tests/complex_global.rs diff --git a/tests/expectations/tests/const_enum_unnamed.rs b/libbindgen/tests/expectations/tests/const_enum_unnamed.rs similarity index 100% rename from tests/expectations/tests/const_enum_unnamed.rs rename to libbindgen/tests/expectations/tests/const_enum_unnamed.rs diff --git a/tests/expectations/tests/const_ptr.rs b/libbindgen/tests/expectations/tests/const_ptr.rs similarity index 100% rename from tests/expectations/tests/const_ptr.rs rename to libbindgen/tests/expectations/tests/const_ptr.rs diff --git a/tests/expectations/tests/const_resolved_ty.rs b/libbindgen/tests/expectations/tests/const_resolved_ty.rs similarity index 100% rename from tests/expectations/tests/const_resolved_ty.rs rename to libbindgen/tests/expectations/tests/const_resolved_ty.rs diff --git a/tests/expectations/tests/const_tparam.rs b/libbindgen/tests/expectations/tests/const_tparam.rs similarity index 100% rename from tests/expectations/tests/const_tparam.rs rename to libbindgen/tests/expectations/tests/const_tparam.rs diff --git a/tests/expectations/tests/convert-floats.rs b/libbindgen/tests/expectations/tests/convert-floats.rs similarity index 100% rename from tests/expectations/tests/convert-floats.rs rename to libbindgen/tests/expectations/tests/convert-floats.rs diff --git a/tests/expectations/tests/crtp.rs b/libbindgen/tests/expectations/tests/crtp.rs similarity index 100% rename from tests/expectations/tests/crtp.rs rename to libbindgen/tests/expectations/tests/crtp.rs diff --git a/tests/expectations/tests/decl_extern_int_twice.rs b/libbindgen/tests/expectations/tests/decl_extern_int_twice.rs similarity index 100% rename from tests/expectations/tests/decl_extern_int_twice.rs rename to libbindgen/tests/expectations/tests/decl_extern_int_twice.rs diff --git a/tests/expectations/tests/decl_ptr_to_array.rs b/libbindgen/tests/expectations/tests/decl_ptr_to_array.rs similarity index 100% rename from tests/expectations/tests/decl_ptr_to_array.rs rename to libbindgen/tests/expectations/tests/decl_ptr_to_array.rs diff --git a/tests/expectations/tests/duplicated_constants_in_ns.rs b/libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs similarity index 100% rename from tests/expectations/tests/duplicated_constants_in_ns.rs rename to libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs diff --git a/tests/expectations/tests/elaborated.rs b/libbindgen/tests/expectations/tests/elaborated.rs similarity index 100% rename from tests/expectations/tests/elaborated.rs rename to libbindgen/tests/expectations/tests/elaborated.rs diff --git a/tests/expectations/tests/empty_template_param_name.rs b/libbindgen/tests/expectations/tests/empty_template_param_name.rs similarity index 100% rename from tests/expectations/tests/empty_template_param_name.rs rename to libbindgen/tests/expectations/tests/empty_template_param_name.rs diff --git a/tests/expectations/tests/enum.rs b/libbindgen/tests/expectations/tests/enum.rs similarity index 100% rename from tests/expectations/tests/enum.rs rename to libbindgen/tests/expectations/tests/enum.rs diff --git a/tests/expectations/tests/enum_alias.rs b/libbindgen/tests/expectations/tests/enum_alias.rs similarity index 100% rename from tests/expectations/tests/enum_alias.rs rename to libbindgen/tests/expectations/tests/enum_alias.rs diff --git a/tests/expectations/tests/enum_and_vtable_mangling.rs b/libbindgen/tests/expectations/tests/enum_and_vtable_mangling.rs similarity index 100% rename from tests/expectations/tests/enum_and_vtable_mangling.rs rename to libbindgen/tests/expectations/tests/enum_and_vtable_mangling.rs diff --git a/tests/expectations/tests/enum_dupe.rs b/libbindgen/tests/expectations/tests/enum_dupe.rs similarity index 100% rename from tests/expectations/tests/enum_dupe.rs rename to libbindgen/tests/expectations/tests/enum_dupe.rs diff --git a/tests/expectations/tests/enum_explicit_type.rs b/libbindgen/tests/expectations/tests/enum_explicit_type.rs similarity index 100% rename from tests/expectations/tests/enum_explicit_type.rs rename to libbindgen/tests/expectations/tests/enum_explicit_type.rs diff --git a/tests/expectations/tests/enum_negative.rs b/libbindgen/tests/expectations/tests/enum_negative.rs similarity index 100% rename from tests/expectations/tests/enum_negative.rs rename to libbindgen/tests/expectations/tests/enum_negative.rs diff --git a/tests/expectations/tests/enum_packed.rs b/libbindgen/tests/expectations/tests/enum_packed.rs similarity index 100% rename from tests/expectations/tests/enum_packed.rs rename to libbindgen/tests/expectations/tests/enum_packed.rs diff --git a/tests/expectations/tests/extern.rs b/libbindgen/tests/expectations/tests/extern.rs similarity index 100% rename from tests/expectations/tests/extern.rs rename to libbindgen/tests/expectations/tests/extern.rs diff --git a/tests/expectations/tests/float128.rs b/libbindgen/tests/expectations/tests/float128.rs similarity index 100% rename from tests/expectations/tests/float128.rs rename to libbindgen/tests/expectations/tests/float128.rs diff --git a/tests/expectations/tests/forward-inherit-struct-with-fields.rs b/libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs similarity index 100% rename from tests/expectations/tests/forward-inherit-struct-with-fields.rs rename to libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs diff --git a/tests/expectations/tests/forward-inherit-struct.rs b/libbindgen/tests/expectations/tests/forward-inherit-struct.rs similarity index 100% rename from tests/expectations/tests/forward-inherit-struct.rs rename to libbindgen/tests/expectations/tests/forward-inherit-struct.rs diff --git a/tests/expectations/tests/forward_declared_struct.rs b/libbindgen/tests/expectations/tests/forward_declared_struct.rs similarity index 100% rename from tests/expectations/tests/forward_declared_struct.rs rename to libbindgen/tests/expectations/tests/forward_declared_struct.rs diff --git a/tests/expectations/tests/func_proto.rs b/libbindgen/tests/expectations/tests/func_proto.rs similarity index 100% rename from tests/expectations/tests/func_proto.rs rename to libbindgen/tests/expectations/tests/func_proto.rs diff --git a/tests/expectations/tests/func_ptr.rs b/libbindgen/tests/expectations/tests/func_ptr.rs similarity index 100% rename from tests/expectations/tests/func_ptr.rs rename to libbindgen/tests/expectations/tests/func_ptr.rs diff --git a/tests/expectations/tests/func_ptr_in_struct.rs b/libbindgen/tests/expectations/tests/func_ptr_in_struct.rs similarity index 100% rename from tests/expectations/tests/func_ptr_in_struct.rs rename to libbindgen/tests/expectations/tests/func_ptr_in_struct.rs diff --git a/tests/expectations/tests/func_with_array_arg.rs b/libbindgen/tests/expectations/tests/func_with_array_arg.rs similarity index 100% rename from tests/expectations/tests/func_with_array_arg.rs rename to libbindgen/tests/expectations/tests/func_with_array_arg.rs diff --git a/tests/expectations/tests/func_with_func_ptr_arg.rs b/libbindgen/tests/expectations/tests/func_with_func_ptr_arg.rs similarity index 100% rename from tests/expectations/tests/func_with_func_ptr_arg.rs rename to libbindgen/tests/expectations/tests/func_with_func_ptr_arg.rs diff --git a/tests/expectations/tests/in_class_typedef.rs b/libbindgen/tests/expectations/tests/in_class_typedef.rs similarity index 100% rename from tests/expectations/tests/in_class_typedef.rs rename to libbindgen/tests/expectations/tests/in_class_typedef.rs diff --git a/tests/expectations/tests/inherit-namespaced.rs b/libbindgen/tests/expectations/tests/inherit-namespaced.rs similarity index 100% rename from tests/expectations/tests/inherit-namespaced.rs rename to libbindgen/tests/expectations/tests/inherit-namespaced.rs diff --git a/tests/expectations/tests/inherit_named.rs b/libbindgen/tests/expectations/tests/inherit_named.rs similarity index 100% rename from tests/expectations/tests/inherit_named.rs rename to libbindgen/tests/expectations/tests/inherit_named.rs diff --git a/tests/expectations/tests/inherit_typedef.rs b/libbindgen/tests/expectations/tests/inherit_typedef.rs similarity index 100% rename from tests/expectations/tests/inherit_typedef.rs rename to libbindgen/tests/expectations/tests/inherit_typedef.rs diff --git a/tests/expectations/tests/inner_const.rs b/libbindgen/tests/expectations/tests/inner_const.rs similarity index 100% rename from tests/expectations/tests/inner_const.rs rename to libbindgen/tests/expectations/tests/inner_const.rs diff --git a/tests/expectations/tests/inner_template_self.rs b/libbindgen/tests/expectations/tests/inner_template_self.rs similarity index 100% rename from tests/expectations/tests/inner_template_self.rs rename to libbindgen/tests/expectations/tests/inner_template_self.rs diff --git a/tests/expectations/tests/int128_t.rs b/libbindgen/tests/expectations/tests/int128_t.rs similarity index 100% rename from tests/expectations/tests/int128_t.rs rename to libbindgen/tests/expectations/tests/int128_t.rs diff --git a/tests/expectations/tests/jsval_layout_opaque.rs b/libbindgen/tests/expectations/tests/jsval_layout_opaque.rs similarity index 100% rename from tests/expectations/tests/jsval_layout_opaque.rs rename to libbindgen/tests/expectations/tests/jsval_layout_opaque.rs diff --git a/tests/expectations/tests/keywords.rs b/libbindgen/tests/expectations/tests/keywords.rs similarity index 100% rename from tests/expectations/tests/keywords.rs rename to libbindgen/tests/expectations/tests/keywords.rs diff --git a/tests/expectations/tests/macro-expr-basic.rs b/libbindgen/tests/expectations/tests/macro-expr-basic.rs similarity index 100% rename from tests/expectations/tests/macro-expr-basic.rs rename to libbindgen/tests/expectations/tests/macro-expr-basic.rs diff --git a/tests/expectations/tests/macro-redef.rs b/libbindgen/tests/expectations/tests/macro-redef.rs similarity index 100% rename from tests/expectations/tests/macro-redef.rs rename to libbindgen/tests/expectations/tests/macro-redef.rs diff --git a/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs b/libbindgen/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs similarity index 100% rename from tests/expectations/tests/multiple-inherit-empty-correct-layout.rs rename to libbindgen/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs diff --git a/tests/expectations/tests/mutable.rs b/libbindgen/tests/expectations/tests/mutable.rs similarity index 100% rename from tests/expectations/tests/mutable.rs rename to libbindgen/tests/expectations/tests/mutable.rs diff --git a/tests/expectations/tests/namespace.rs b/libbindgen/tests/expectations/tests/namespace.rs similarity index 100% rename from tests/expectations/tests/namespace.rs rename to libbindgen/tests/expectations/tests/namespace.rs diff --git a/tests/expectations/tests/nested.rs b/libbindgen/tests/expectations/tests/nested.rs similarity index 100% rename from tests/expectations/tests/nested.rs rename to libbindgen/tests/expectations/tests/nested.rs diff --git a/tests/expectations/tests/nested_vtable.rs b/libbindgen/tests/expectations/tests/nested_vtable.rs similarity index 100% rename from tests/expectations/tests/nested_vtable.rs rename to libbindgen/tests/expectations/tests/nested_vtable.rs diff --git a/tests/expectations/tests/no-std.rs b/libbindgen/tests/expectations/tests/no-std.rs similarity index 100% rename from tests/expectations/tests/no-std.rs rename to libbindgen/tests/expectations/tests/no-std.rs diff --git a/tests/expectations/tests/no_copy.rs b/libbindgen/tests/expectations/tests/no_copy.rs similarity index 100% rename from tests/expectations/tests/no_copy.rs rename to libbindgen/tests/expectations/tests/no_copy.rs diff --git a/tests/expectations/tests/nsStyleAutoArray.rs b/libbindgen/tests/expectations/tests/nsStyleAutoArray.rs similarity index 100% rename from tests/expectations/tests/nsStyleAutoArray.rs rename to libbindgen/tests/expectations/tests/nsStyleAutoArray.rs diff --git a/tests/expectations/tests/only_bitfields.rs b/libbindgen/tests/expectations/tests/only_bitfields.rs similarity index 100% rename from tests/expectations/tests/only_bitfields.rs rename to libbindgen/tests/expectations/tests/only_bitfields.rs diff --git a/tests/expectations/tests/opaque_in_struct.rs b/libbindgen/tests/expectations/tests/opaque_in_struct.rs similarity index 100% rename from tests/expectations/tests/opaque_in_struct.rs rename to libbindgen/tests/expectations/tests/opaque_in_struct.rs diff --git a/tests/expectations/tests/opaque_pointer.rs b/libbindgen/tests/expectations/tests/opaque_pointer.rs similarity index 100% rename from tests/expectations/tests/opaque_pointer.rs rename to libbindgen/tests/expectations/tests/opaque_pointer.rs diff --git a/tests/expectations/tests/opaque_typedef.rs b/libbindgen/tests/expectations/tests/opaque_typedef.rs similarity index 100% rename from tests/expectations/tests/opaque_typedef.rs rename to libbindgen/tests/expectations/tests/opaque_typedef.rs diff --git a/tests/expectations/tests/overflowed_enum.rs b/libbindgen/tests/expectations/tests/overflowed_enum.rs similarity index 100% rename from tests/expectations/tests/overflowed_enum.rs rename to libbindgen/tests/expectations/tests/overflowed_enum.rs diff --git a/tests/expectations/tests/overloading.rs b/libbindgen/tests/expectations/tests/overloading.rs similarity index 100% rename from tests/expectations/tests/overloading.rs rename to libbindgen/tests/expectations/tests/overloading.rs diff --git a/tests/expectations/tests/private.rs b/libbindgen/tests/expectations/tests/private.rs similarity index 100% rename from tests/expectations/tests/private.rs rename to libbindgen/tests/expectations/tests/private.rs diff --git a/tests/expectations/tests/redeclaration.rs b/libbindgen/tests/expectations/tests/redeclaration.rs similarity index 100% rename from tests/expectations/tests/redeclaration.rs rename to libbindgen/tests/expectations/tests/redeclaration.rs diff --git a/tests/expectations/tests/ref_argument_array.rs b/libbindgen/tests/expectations/tests/ref_argument_array.rs similarity index 100% rename from tests/expectations/tests/ref_argument_array.rs rename to libbindgen/tests/expectations/tests/ref_argument_array.rs diff --git a/tests/expectations/tests/replace_template_alias.rs b/libbindgen/tests/expectations/tests/replace_template_alias.rs similarity index 100% rename from tests/expectations/tests/replace_template_alias.rs rename to libbindgen/tests/expectations/tests/replace_template_alias.rs diff --git a/tests/expectations/tests/replaces_double.rs b/libbindgen/tests/expectations/tests/replaces_double.rs similarity index 100% rename from tests/expectations/tests/replaces_double.rs rename to libbindgen/tests/expectations/tests/replaces_double.rs diff --git a/tests/expectations/tests/size_t_template.rs b/libbindgen/tests/expectations/tests/size_t_template.rs similarity index 100% rename from tests/expectations/tests/size_t_template.rs rename to libbindgen/tests/expectations/tests/size_t_template.rs diff --git a/tests/expectations/tests/struct_containing_forward_declared_struct.rs b/libbindgen/tests/expectations/tests/struct_containing_forward_declared_struct.rs similarity index 100% rename from tests/expectations/tests/struct_containing_forward_declared_struct.rs rename to libbindgen/tests/expectations/tests/struct_containing_forward_declared_struct.rs diff --git a/tests/expectations/tests/struct_with_anon_struct.rs b/libbindgen/tests/expectations/tests/struct_with_anon_struct.rs similarity index 100% rename from tests/expectations/tests/struct_with_anon_struct.rs rename to libbindgen/tests/expectations/tests/struct_with_anon_struct.rs diff --git a/tests/expectations/tests/struct_with_anon_struct_array.rs b/libbindgen/tests/expectations/tests/struct_with_anon_struct_array.rs similarity index 100% rename from tests/expectations/tests/struct_with_anon_struct_array.rs rename to libbindgen/tests/expectations/tests/struct_with_anon_struct_array.rs diff --git a/tests/expectations/tests/struct_with_anon_struct_pointer.rs b/libbindgen/tests/expectations/tests/struct_with_anon_struct_pointer.rs similarity index 100% rename from tests/expectations/tests/struct_with_anon_struct_pointer.rs rename to libbindgen/tests/expectations/tests/struct_with_anon_struct_pointer.rs diff --git a/tests/expectations/tests/struct_with_anon_union.rs b/libbindgen/tests/expectations/tests/struct_with_anon_union.rs similarity index 100% rename from tests/expectations/tests/struct_with_anon_union.rs rename to libbindgen/tests/expectations/tests/struct_with_anon_union.rs diff --git a/tests/expectations/tests/struct_with_anon_unnamed_struct.rs b/libbindgen/tests/expectations/tests/struct_with_anon_unnamed_struct.rs similarity index 100% rename from tests/expectations/tests/struct_with_anon_unnamed_struct.rs rename to libbindgen/tests/expectations/tests/struct_with_anon_unnamed_struct.rs diff --git a/tests/expectations/tests/struct_with_anon_unnamed_union.rs b/libbindgen/tests/expectations/tests/struct_with_anon_unnamed_union.rs similarity index 100% rename from tests/expectations/tests/struct_with_anon_unnamed_union.rs rename to libbindgen/tests/expectations/tests/struct_with_anon_unnamed_union.rs diff --git a/tests/expectations/tests/struct_with_bitfields.rs b/libbindgen/tests/expectations/tests/struct_with_bitfields.rs similarity index 100% rename from tests/expectations/tests/struct_with_bitfields.rs rename to libbindgen/tests/expectations/tests/struct_with_bitfields.rs diff --git a/tests/expectations/tests/struct_with_derive_debug.rs b/libbindgen/tests/expectations/tests/struct_with_derive_debug.rs similarity index 100% rename from tests/expectations/tests/struct_with_derive_debug.rs rename to libbindgen/tests/expectations/tests/struct_with_derive_debug.rs diff --git a/tests/expectations/tests/struct_with_nesting.rs b/libbindgen/tests/expectations/tests/struct_with_nesting.rs similarity index 100% rename from tests/expectations/tests/struct_with_nesting.rs rename to libbindgen/tests/expectations/tests/struct_with_nesting.rs diff --git a/tests/expectations/tests/struct_with_packing.rs b/libbindgen/tests/expectations/tests/struct_with_packing.rs similarity index 100% rename from tests/expectations/tests/struct_with_packing.rs rename to libbindgen/tests/expectations/tests/struct_with_packing.rs diff --git a/tests/expectations/tests/struct_with_struct.rs b/libbindgen/tests/expectations/tests/struct_with_struct.rs similarity index 100% rename from tests/expectations/tests/struct_with_struct.rs rename to libbindgen/tests/expectations/tests/struct_with_struct.rs diff --git a/tests/expectations/tests/struct_with_typedef_template_arg.rs b/libbindgen/tests/expectations/tests/struct_with_typedef_template_arg.rs similarity index 100% rename from tests/expectations/tests/struct_with_typedef_template_arg.rs rename to libbindgen/tests/expectations/tests/struct_with_typedef_template_arg.rs diff --git a/tests/expectations/tests/template.rs b/libbindgen/tests/expectations/tests/template.rs similarity index 100% rename from tests/expectations/tests/template.rs rename to libbindgen/tests/expectations/tests/template.rs diff --git a/tests/expectations/tests/template_alias.rs b/libbindgen/tests/expectations/tests/template_alias.rs similarity index 100% rename from tests/expectations/tests/template_alias.rs rename to libbindgen/tests/expectations/tests/template_alias.rs diff --git a/tests/expectations/tests/template_alias_basic.rs b/libbindgen/tests/expectations/tests/template_alias_basic.rs similarity index 100% rename from tests/expectations/tests/template_alias_basic.rs rename to libbindgen/tests/expectations/tests/template_alias_basic.rs diff --git a/tests/expectations/tests/template_alias_namespace.rs b/libbindgen/tests/expectations/tests/template_alias_namespace.rs similarity index 100% rename from tests/expectations/tests/template_alias_namespace.rs rename to libbindgen/tests/expectations/tests/template_alias_namespace.rs diff --git a/tests/expectations/tests/template_typedef_transitive_param.rs b/libbindgen/tests/expectations/tests/template_typedef_transitive_param.rs similarity index 100% rename from tests/expectations/tests/template_typedef_transitive_param.rs rename to libbindgen/tests/expectations/tests/template_typedef_transitive_param.rs diff --git a/tests/expectations/tests/template_typedefs.rs b/libbindgen/tests/expectations/tests/template_typedefs.rs similarity index 100% rename from tests/expectations/tests/template_typedefs.rs rename to libbindgen/tests/expectations/tests/template_typedefs.rs diff --git a/tests/expectations/tests/type_alias_empty.rs b/libbindgen/tests/expectations/tests/type_alias_empty.rs similarity index 100% rename from tests/expectations/tests/type_alias_empty.rs rename to libbindgen/tests/expectations/tests/type_alias_empty.rs diff --git a/tests/expectations/tests/typeref.rs b/libbindgen/tests/expectations/tests/typeref.rs similarity index 100% rename from tests/expectations/tests/typeref.rs rename to libbindgen/tests/expectations/tests/typeref.rs diff --git a/tests/expectations/tests/union_dtor.rs b/libbindgen/tests/expectations/tests/union_dtor.rs similarity index 100% rename from tests/expectations/tests/union_dtor.rs rename to libbindgen/tests/expectations/tests/union_dtor.rs diff --git a/tests/expectations/tests/union_fields.rs b/libbindgen/tests/expectations/tests/union_fields.rs similarity index 100% rename from tests/expectations/tests/union_fields.rs rename to libbindgen/tests/expectations/tests/union_fields.rs diff --git a/tests/expectations/tests/union_template.rs b/libbindgen/tests/expectations/tests/union_template.rs similarity index 100% rename from tests/expectations/tests/union_template.rs rename to libbindgen/tests/expectations/tests/union_template.rs diff --git a/tests/expectations/tests/union_with_anon_struct.rs b/libbindgen/tests/expectations/tests/union_with_anon_struct.rs similarity index 100% rename from tests/expectations/tests/union_with_anon_struct.rs rename to libbindgen/tests/expectations/tests/union_with_anon_struct.rs diff --git a/tests/expectations/tests/union_with_anon_struct_bitfield.rs b/libbindgen/tests/expectations/tests/union_with_anon_struct_bitfield.rs similarity index 100% rename from tests/expectations/tests/union_with_anon_struct_bitfield.rs rename to libbindgen/tests/expectations/tests/union_with_anon_struct_bitfield.rs diff --git a/tests/expectations/tests/union_with_anon_union.rs b/libbindgen/tests/expectations/tests/union_with_anon_union.rs similarity index 100% rename from tests/expectations/tests/union_with_anon_union.rs rename to libbindgen/tests/expectations/tests/union_with_anon_union.rs diff --git a/tests/expectations/tests/union_with_anon_unnamed_struct.rs b/libbindgen/tests/expectations/tests/union_with_anon_unnamed_struct.rs similarity index 100% rename from tests/expectations/tests/union_with_anon_unnamed_struct.rs rename to libbindgen/tests/expectations/tests/union_with_anon_unnamed_struct.rs diff --git a/tests/expectations/tests/union_with_anon_unnamed_union.rs b/libbindgen/tests/expectations/tests/union_with_anon_unnamed_union.rs similarity index 100% rename from tests/expectations/tests/union_with_anon_unnamed_union.rs rename to libbindgen/tests/expectations/tests/union_with_anon_unnamed_union.rs diff --git a/tests/expectations/tests/union_with_big_member.rs b/libbindgen/tests/expectations/tests/union_with_big_member.rs similarity index 100% rename from tests/expectations/tests/union_with_big_member.rs rename to libbindgen/tests/expectations/tests/union_with_big_member.rs diff --git a/tests/expectations/tests/union_with_nesting.rs b/libbindgen/tests/expectations/tests/union_with_nesting.rs similarity index 100% rename from tests/expectations/tests/union_with_nesting.rs rename to libbindgen/tests/expectations/tests/union_with_nesting.rs diff --git a/tests/expectations/tests/unknown_attr.rs b/libbindgen/tests/expectations/tests/unknown_attr.rs similarity index 100% rename from tests/expectations/tests/unknown_attr.rs rename to libbindgen/tests/expectations/tests/unknown_attr.rs diff --git a/tests/expectations/tests/use-core.rs b/libbindgen/tests/expectations/tests/use-core.rs similarity index 100% rename from tests/expectations/tests/use-core.rs rename to libbindgen/tests/expectations/tests/use-core.rs diff --git a/tests/expectations/tests/using.rs b/libbindgen/tests/expectations/tests/using.rs similarity index 100% rename from tests/expectations/tests/using.rs rename to libbindgen/tests/expectations/tests/using.rs diff --git a/tests/expectations/tests/vector.rs b/libbindgen/tests/expectations/tests/vector.rs similarity index 100% rename from tests/expectations/tests/vector.rs rename to libbindgen/tests/expectations/tests/vector.rs diff --git a/tests/expectations/tests/virtual_dtor.rs b/libbindgen/tests/expectations/tests/virtual_dtor.rs similarity index 100% rename from tests/expectations/tests/virtual_dtor.rs rename to libbindgen/tests/expectations/tests/virtual_dtor.rs diff --git a/tests/expectations/tests/virtual_overloaded.rs b/libbindgen/tests/expectations/tests/virtual_overloaded.rs similarity index 100% rename from tests/expectations/tests/virtual_overloaded.rs rename to libbindgen/tests/expectations/tests/virtual_overloaded.rs diff --git a/tests/expectations/tests/vtable_recursive_sig.rs b/libbindgen/tests/expectations/tests/vtable_recursive_sig.rs similarity index 100% rename from tests/expectations/tests/vtable_recursive_sig.rs rename to libbindgen/tests/expectations/tests/vtable_recursive_sig.rs diff --git a/tests/expectations/tests/weird_bitfields.rs b/libbindgen/tests/expectations/tests/weird_bitfields.rs similarity index 100% rename from tests/expectations/tests/weird_bitfields.rs rename to libbindgen/tests/expectations/tests/weird_bitfields.rs diff --git a/tests/expectations/tests/what_is_going_on.rs b/libbindgen/tests/expectations/tests/what_is_going_on.rs similarity index 100% rename from tests/expectations/tests/what_is_going_on.rs rename to libbindgen/tests/expectations/tests/what_is_going_on.rs diff --git a/tests/expectations/tests/whitelist_basic.rs b/libbindgen/tests/expectations/tests/whitelist_basic.rs similarity index 100% rename from tests/expectations/tests/whitelist_basic.rs rename to libbindgen/tests/expectations/tests/whitelist_basic.rs diff --git a/tests/expectations/tests/whitelist_vars.rs b/libbindgen/tests/expectations/tests/whitelist_vars.rs similarity index 100% rename from tests/expectations/tests/whitelist_vars.rs rename to libbindgen/tests/expectations/tests/whitelist_vars.rs diff --git a/tests/headers/accessors.hpp b/libbindgen/tests/headers/accessors.hpp similarity index 100% rename from tests/headers/accessors.hpp rename to libbindgen/tests/headers/accessors.hpp diff --git a/tests/headers/annotation_hide.hpp b/libbindgen/tests/headers/annotation_hide.hpp similarity index 100% rename from tests/headers/annotation_hide.hpp rename to libbindgen/tests/headers/annotation_hide.hpp diff --git a/tests/headers/anon_enum.hpp b/libbindgen/tests/headers/anon_enum.hpp similarity index 100% rename from tests/headers/anon_enum.hpp rename to libbindgen/tests/headers/anon_enum.hpp diff --git a/tests/headers/anon_enum_whitelist.h b/libbindgen/tests/headers/anon_enum_whitelist.h similarity index 100% rename from tests/headers/anon_enum_whitelist.h rename to libbindgen/tests/headers/anon_enum_whitelist.h diff --git a/tests/headers/anon_union.hpp b/libbindgen/tests/headers/anon_union.hpp similarity index 100% rename from tests/headers/anon_union.hpp rename to libbindgen/tests/headers/anon_union.hpp diff --git a/tests/headers/arg_keyword.hpp b/libbindgen/tests/headers/arg_keyword.hpp similarity index 100% rename from tests/headers/arg_keyword.hpp rename to libbindgen/tests/headers/arg_keyword.hpp diff --git a/tests/headers/base-to-derived.hpp b/libbindgen/tests/headers/base-to-derived.hpp similarity index 100% rename from tests/headers/base-to-derived.hpp rename to libbindgen/tests/headers/base-to-derived.hpp diff --git a/tests/headers/bitfield-enum-basic.h b/libbindgen/tests/headers/bitfield-enum-basic.h similarity index 100% rename from tests/headers/bitfield-enum-basic.h rename to libbindgen/tests/headers/bitfield-enum-basic.h diff --git a/tests/headers/blocks.h b/libbindgen/tests/headers/blocks.h similarity index 100% rename from tests/headers/blocks.h rename to libbindgen/tests/headers/blocks.h diff --git a/tests/headers/class.hpp b/libbindgen/tests/headers/class.hpp similarity index 100% rename from tests/headers/class.hpp rename to libbindgen/tests/headers/class.hpp diff --git a/tests/headers/class_nested.hpp b/libbindgen/tests/headers/class_nested.hpp similarity index 100% rename from tests/headers/class_nested.hpp rename to libbindgen/tests/headers/class_nested.hpp diff --git a/tests/headers/class_no_members.hpp b/libbindgen/tests/headers/class_no_members.hpp similarity index 100% rename from tests/headers/class_no_members.hpp rename to libbindgen/tests/headers/class_no_members.hpp diff --git a/tests/headers/class_static.hpp b/libbindgen/tests/headers/class_static.hpp similarity index 100% rename from tests/headers/class_static.hpp rename to libbindgen/tests/headers/class_static.hpp diff --git a/tests/headers/class_static_const.hpp b/libbindgen/tests/headers/class_static_const.hpp similarity index 100% rename from tests/headers/class_static_const.hpp rename to libbindgen/tests/headers/class_static_const.hpp diff --git a/tests/headers/class_use_as.hpp b/libbindgen/tests/headers/class_use_as.hpp similarity index 100% rename from tests/headers/class_use_as.hpp rename to libbindgen/tests/headers/class_use_as.hpp diff --git a/tests/headers/class_with_dtor.hpp b/libbindgen/tests/headers/class_with_dtor.hpp similarity index 100% rename from tests/headers/class_with_dtor.hpp rename to libbindgen/tests/headers/class_with_dtor.hpp diff --git a/tests/headers/class_with_inner_struct.hpp b/libbindgen/tests/headers/class_with_inner_struct.hpp similarity index 100% rename from tests/headers/class_with_inner_struct.hpp rename to libbindgen/tests/headers/class_with_inner_struct.hpp diff --git a/tests/headers/class_with_typedef.hpp b/libbindgen/tests/headers/class_with_typedef.hpp similarity index 100% rename from tests/headers/class_with_typedef.hpp rename to libbindgen/tests/headers/class_with_typedef.hpp diff --git a/tests/headers/complex.h b/libbindgen/tests/headers/complex.h similarity index 100% rename from tests/headers/complex.h rename to libbindgen/tests/headers/complex.h diff --git a/tests/headers/complex_global.h b/libbindgen/tests/headers/complex_global.h similarity index 100% rename from tests/headers/complex_global.h rename to libbindgen/tests/headers/complex_global.h diff --git a/tests/headers/const_enum_unnamed.hpp b/libbindgen/tests/headers/const_enum_unnamed.hpp similarity index 100% rename from tests/headers/const_enum_unnamed.hpp rename to libbindgen/tests/headers/const_enum_unnamed.hpp diff --git a/tests/headers/const_ptr.hpp b/libbindgen/tests/headers/const_ptr.hpp similarity index 100% rename from tests/headers/const_ptr.hpp rename to libbindgen/tests/headers/const_ptr.hpp diff --git a/tests/headers/const_resolved_ty.h b/libbindgen/tests/headers/const_resolved_ty.h similarity index 100% rename from tests/headers/const_resolved_ty.h rename to libbindgen/tests/headers/const_resolved_ty.h diff --git a/tests/headers/const_tparam.hpp b/libbindgen/tests/headers/const_tparam.hpp similarity index 100% rename from tests/headers/const_tparam.hpp rename to libbindgen/tests/headers/const_tparam.hpp diff --git a/tests/headers/convert-floats.h b/libbindgen/tests/headers/convert-floats.h similarity index 100% rename from tests/headers/convert-floats.h rename to libbindgen/tests/headers/convert-floats.h diff --git a/tests/headers/crtp.hpp b/libbindgen/tests/headers/crtp.hpp similarity index 100% rename from tests/headers/crtp.hpp rename to libbindgen/tests/headers/crtp.hpp diff --git a/tests/headers/decl_extern_int_twice.h b/libbindgen/tests/headers/decl_extern_int_twice.h similarity index 100% rename from tests/headers/decl_extern_int_twice.h rename to libbindgen/tests/headers/decl_extern_int_twice.h diff --git a/tests/headers/decl_ptr_to_array.h b/libbindgen/tests/headers/decl_ptr_to_array.h similarity index 100% rename from tests/headers/decl_ptr_to_array.h rename to libbindgen/tests/headers/decl_ptr_to_array.h diff --git a/tests/headers/duplicated_constants_in_ns.hpp b/libbindgen/tests/headers/duplicated_constants_in_ns.hpp similarity index 100% rename from tests/headers/duplicated_constants_in_ns.hpp rename to libbindgen/tests/headers/duplicated_constants_in_ns.hpp diff --git a/tests/headers/elaborated.hpp b/libbindgen/tests/headers/elaborated.hpp similarity index 100% rename from tests/headers/elaborated.hpp rename to libbindgen/tests/headers/elaborated.hpp diff --git a/tests/headers/empty_template_param_name.hpp b/libbindgen/tests/headers/empty_template_param_name.hpp similarity index 100% rename from tests/headers/empty_template_param_name.hpp rename to libbindgen/tests/headers/empty_template_param_name.hpp diff --git a/tests/headers/enum.h b/libbindgen/tests/headers/enum.h similarity index 100% rename from tests/headers/enum.h rename to libbindgen/tests/headers/enum.h diff --git a/tests/headers/enum_alias.hpp b/libbindgen/tests/headers/enum_alias.hpp similarity index 100% rename from tests/headers/enum_alias.hpp rename to libbindgen/tests/headers/enum_alias.hpp diff --git a/tests/headers/enum_and_vtable_mangling.hpp b/libbindgen/tests/headers/enum_and_vtable_mangling.hpp similarity index 100% rename from tests/headers/enum_and_vtable_mangling.hpp rename to libbindgen/tests/headers/enum_and_vtable_mangling.hpp diff --git a/tests/headers/enum_dupe.h b/libbindgen/tests/headers/enum_dupe.h similarity index 100% rename from tests/headers/enum_dupe.h rename to libbindgen/tests/headers/enum_dupe.h diff --git a/tests/headers/enum_explicit_type.hpp b/libbindgen/tests/headers/enum_explicit_type.hpp similarity index 100% rename from tests/headers/enum_explicit_type.hpp rename to libbindgen/tests/headers/enum_explicit_type.hpp diff --git a/tests/headers/enum_negative.h b/libbindgen/tests/headers/enum_negative.h similarity index 100% rename from tests/headers/enum_negative.h rename to libbindgen/tests/headers/enum_negative.h diff --git a/tests/headers/enum_packed.h b/libbindgen/tests/headers/enum_packed.h similarity index 100% rename from tests/headers/enum_packed.h rename to libbindgen/tests/headers/enum_packed.h diff --git a/tests/headers/extern.hpp b/libbindgen/tests/headers/extern.hpp similarity index 100% rename from tests/headers/extern.hpp rename to libbindgen/tests/headers/extern.hpp diff --git a/tests/headers/float128.hpp b/libbindgen/tests/headers/float128.hpp similarity index 100% rename from tests/headers/float128.hpp rename to libbindgen/tests/headers/float128.hpp diff --git a/tests/headers/forward-inherit-struct-with-fields.hpp b/libbindgen/tests/headers/forward-inherit-struct-with-fields.hpp similarity index 100% rename from tests/headers/forward-inherit-struct-with-fields.hpp rename to libbindgen/tests/headers/forward-inherit-struct-with-fields.hpp diff --git a/tests/headers/forward-inherit-struct.hpp b/libbindgen/tests/headers/forward-inherit-struct.hpp similarity index 100% rename from tests/headers/forward-inherit-struct.hpp rename to libbindgen/tests/headers/forward-inherit-struct.hpp diff --git a/tests/headers/forward_declared_struct.h b/libbindgen/tests/headers/forward_declared_struct.h similarity index 100% rename from tests/headers/forward_declared_struct.h rename to libbindgen/tests/headers/forward_declared_struct.h diff --git a/tests/headers/func_proto.h b/libbindgen/tests/headers/func_proto.h similarity index 100% rename from tests/headers/func_proto.h rename to libbindgen/tests/headers/func_proto.h diff --git a/tests/headers/func_ptr.h b/libbindgen/tests/headers/func_ptr.h similarity index 100% rename from tests/headers/func_ptr.h rename to libbindgen/tests/headers/func_ptr.h diff --git a/tests/headers/func_ptr_in_struct.h b/libbindgen/tests/headers/func_ptr_in_struct.h similarity index 100% rename from tests/headers/func_ptr_in_struct.h rename to libbindgen/tests/headers/func_ptr_in_struct.h diff --git a/tests/headers/func_with_array_arg.h b/libbindgen/tests/headers/func_with_array_arg.h similarity index 100% rename from tests/headers/func_with_array_arg.h rename to libbindgen/tests/headers/func_with_array_arg.h diff --git a/tests/headers/func_with_func_ptr_arg.h b/libbindgen/tests/headers/func_with_func_ptr_arg.h similarity index 100% rename from tests/headers/func_with_func_ptr_arg.h rename to libbindgen/tests/headers/func_with_func_ptr_arg.h diff --git a/tests/headers/in_class_typedef.hpp b/libbindgen/tests/headers/in_class_typedef.hpp similarity index 100% rename from tests/headers/in_class_typedef.hpp rename to libbindgen/tests/headers/in_class_typedef.hpp diff --git a/tests/headers/inherit-namespaced.hpp b/libbindgen/tests/headers/inherit-namespaced.hpp similarity index 100% rename from tests/headers/inherit-namespaced.hpp rename to libbindgen/tests/headers/inherit-namespaced.hpp diff --git a/tests/headers/inherit_named.hpp b/libbindgen/tests/headers/inherit_named.hpp similarity index 100% rename from tests/headers/inherit_named.hpp rename to libbindgen/tests/headers/inherit_named.hpp diff --git a/tests/headers/inherit_typedef.hpp b/libbindgen/tests/headers/inherit_typedef.hpp similarity index 100% rename from tests/headers/inherit_typedef.hpp rename to libbindgen/tests/headers/inherit_typedef.hpp diff --git a/tests/headers/inner_const.hpp b/libbindgen/tests/headers/inner_const.hpp similarity index 100% rename from tests/headers/inner_const.hpp rename to libbindgen/tests/headers/inner_const.hpp diff --git a/tests/headers/inner_template_self.hpp b/libbindgen/tests/headers/inner_template_self.hpp similarity index 100% rename from tests/headers/inner_template_self.hpp rename to libbindgen/tests/headers/inner_template_self.hpp diff --git a/tests/headers/int128_t.h b/libbindgen/tests/headers/int128_t.h similarity index 100% rename from tests/headers/int128_t.h rename to libbindgen/tests/headers/int128_t.h diff --git a/tests/headers/jsval_layout_opaque.hpp b/libbindgen/tests/headers/jsval_layout_opaque.hpp similarity index 100% rename from tests/headers/jsval_layout_opaque.hpp rename to libbindgen/tests/headers/jsval_layout_opaque.hpp diff --git a/tests/headers/keywords.h b/libbindgen/tests/headers/keywords.h similarity index 100% rename from tests/headers/keywords.h rename to libbindgen/tests/headers/keywords.h diff --git a/tests/headers/macro-expr-basic.h b/libbindgen/tests/headers/macro-expr-basic.h similarity index 100% rename from tests/headers/macro-expr-basic.h rename to libbindgen/tests/headers/macro-expr-basic.h diff --git a/tests/headers/macro-redef.h b/libbindgen/tests/headers/macro-redef.h similarity index 100% rename from tests/headers/macro-redef.h rename to libbindgen/tests/headers/macro-redef.h diff --git a/tests/headers/multiple-inherit-empty-correct-layout.hpp b/libbindgen/tests/headers/multiple-inherit-empty-correct-layout.hpp similarity index 100% rename from tests/headers/multiple-inherit-empty-correct-layout.hpp rename to libbindgen/tests/headers/multiple-inherit-empty-correct-layout.hpp diff --git a/tests/headers/mutable.hpp b/libbindgen/tests/headers/mutable.hpp similarity index 100% rename from tests/headers/mutable.hpp rename to libbindgen/tests/headers/mutable.hpp diff --git a/tests/headers/namespace.hpp b/libbindgen/tests/headers/namespace.hpp similarity index 100% rename from tests/headers/namespace.hpp rename to libbindgen/tests/headers/namespace.hpp diff --git a/tests/headers/nested.hpp b/libbindgen/tests/headers/nested.hpp similarity index 100% rename from tests/headers/nested.hpp rename to libbindgen/tests/headers/nested.hpp diff --git a/tests/headers/nested_vtable.hpp b/libbindgen/tests/headers/nested_vtable.hpp similarity index 100% rename from tests/headers/nested_vtable.hpp rename to libbindgen/tests/headers/nested_vtable.hpp diff --git a/tests/headers/no-std.h b/libbindgen/tests/headers/no-std.h similarity index 100% rename from tests/headers/no-std.h rename to libbindgen/tests/headers/no-std.h diff --git a/tests/headers/no_copy.hpp b/libbindgen/tests/headers/no_copy.hpp similarity index 100% rename from tests/headers/no_copy.hpp rename to libbindgen/tests/headers/no_copy.hpp diff --git a/tests/headers/nsStyleAutoArray.hpp b/libbindgen/tests/headers/nsStyleAutoArray.hpp similarity index 100% rename from tests/headers/nsStyleAutoArray.hpp rename to libbindgen/tests/headers/nsStyleAutoArray.hpp diff --git a/tests/headers/only_bitfields.hpp b/libbindgen/tests/headers/only_bitfields.hpp similarity index 100% rename from tests/headers/only_bitfields.hpp rename to libbindgen/tests/headers/only_bitfields.hpp diff --git a/tests/headers/opaque_in_struct.hpp b/libbindgen/tests/headers/opaque_in_struct.hpp similarity index 100% rename from tests/headers/opaque_in_struct.hpp rename to libbindgen/tests/headers/opaque_in_struct.hpp diff --git a/tests/headers/opaque_pointer.hpp b/libbindgen/tests/headers/opaque_pointer.hpp similarity index 100% rename from tests/headers/opaque_pointer.hpp rename to libbindgen/tests/headers/opaque_pointer.hpp diff --git a/tests/headers/opaque_typedef.hpp b/libbindgen/tests/headers/opaque_typedef.hpp similarity index 100% rename from tests/headers/opaque_typedef.hpp rename to libbindgen/tests/headers/opaque_typedef.hpp diff --git a/tests/headers/overflowed_enum.hpp b/libbindgen/tests/headers/overflowed_enum.hpp similarity index 100% rename from tests/headers/overflowed_enum.hpp rename to libbindgen/tests/headers/overflowed_enum.hpp diff --git a/tests/headers/overloading.hpp b/libbindgen/tests/headers/overloading.hpp similarity index 100% rename from tests/headers/overloading.hpp rename to libbindgen/tests/headers/overloading.hpp diff --git a/tests/headers/private.hpp b/libbindgen/tests/headers/private.hpp similarity index 100% rename from tests/headers/private.hpp rename to libbindgen/tests/headers/private.hpp diff --git a/tests/headers/redeclaration.hpp b/libbindgen/tests/headers/redeclaration.hpp similarity index 100% rename from tests/headers/redeclaration.hpp rename to libbindgen/tests/headers/redeclaration.hpp diff --git a/tests/headers/ref_argument_array.hpp b/libbindgen/tests/headers/ref_argument_array.hpp similarity index 100% rename from tests/headers/ref_argument_array.hpp rename to libbindgen/tests/headers/ref_argument_array.hpp diff --git a/tests/headers/replace_template_alias.hpp b/libbindgen/tests/headers/replace_template_alias.hpp similarity index 100% rename from tests/headers/replace_template_alias.hpp rename to libbindgen/tests/headers/replace_template_alias.hpp diff --git a/tests/headers/replaces_double.hpp b/libbindgen/tests/headers/replaces_double.hpp similarity index 100% rename from tests/headers/replaces_double.hpp rename to libbindgen/tests/headers/replaces_double.hpp diff --git a/tests/headers/size_t_template.hpp b/libbindgen/tests/headers/size_t_template.hpp similarity index 100% rename from tests/headers/size_t_template.hpp rename to libbindgen/tests/headers/size_t_template.hpp diff --git a/tests/headers/struct_containing_forward_declared_struct.h b/libbindgen/tests/headers/struct_containing_forward_declared_struct.h similarity index 100% rename from tests/headers/struct_containing_forward_declared_struct.h rename to libbindgen/tests/headers/struct_containing_forward_declared_struct.h diff --git a/tests/headers/struct_with_anon_struct.h b/libbindgen/tests/headers/struct_with_anon_struct.h similarity index 100% rename from tests/headers/struct_with_anon_struct.h rename to libbindgen/tests/headers/struct_with_anon_struct.h diff --git a/tests/headers/struct_with_anon_struct_array.h b/libbindgen/tests/headers/struct_with_anon_struct_array.h similarity index 100% rename from tests/headers/struct_with_anon_struct_array.h rename to libbindgen/tests/headers/struct_with_anon_struct_array.h diff --git a/tests/headers/struct_with_anon_struct_pointer.h b/libbindgen/tests/headers/struct_with_anon_struct_pointer.h similarity index 100% rename from tests/headers/struct_with_anon_struct_pointer.h rename to libbindgen/tests/headers/struct_with_anon_struct_pointer.h diff --git a/tests/headers/struct_with_anon_union.h b/libbindgen/tests/headers/struct_with_anon_union.h similarity index 100% rename from tests/headers/struct_with_anon_union.h rename to libbindgen/tests/headers/struct_with_anon_union.h diff --git a/tests/headers/struct_with_anon_unnamed_struct.h b/libbindgen/tests/headers/struct_with_anon_unnamed_struct.h similarity index 100% rename from tests/headers/struct_with_anon_unnamed_struct.h rename to libbindgen/tests/headers/struct_with_anon_unnamed_struct.h diff --git a/tests/headers/struct_with_anon_unnamed_union.h b/libbindgen/tests/headers/struct_with_anon_unnamed_union.h similarity index 100% rename from tests/headers/struct_with_anon_unnamed_union.h rename to libbindgen/tests/headers/struct_with_anon_unnamed_union.h diff --git a/tests/headers/struct_with_bitfields.h b/libbindgen/tests/headers/struct_with_bitfields.h similarity index 100% rename from tests/headers/struct_with_bitfields.h rename to libbindgen/tests/headers/struct_with_bitfields.h diff --git a/tests/headers/struct_with_derive_debug.h b/libbindgen/tests/headers/struct_with_derive_debug.h similarity index 100% rename from tests/headers/struct_with_derive_debug.h rename to libbindgen/tests/headers/struct_with_derive_debug.h diff --git a/tests/headers/struct_with_nesting.h b/libbindgen/tests/headers/struct_with_nesting.h similarity index 100% rename from tests/headers/struct_with_nesting.h rename to libbindgen/tests/headers/struct_with_nesting.h diff --git a/tests/headers/struct_with_packing.h b/libbindgen/tests/headers/struct_with_packing.h similarity index 100% rename from tests/headers/struct_with_packing.h rename to libbindgen/tests/headers/struct_with_packing.h diff --git a/tests/headers/struct_with_struct.h b/libbindgen/tests/headers/struct_with_struct.h similarity index 100% rename from tests/headers/struct_with_struct.h rename to libbindgen/tests/headers/struct_with_struct.h diff --git a/tests/headers/struct_with_typedef_template_arg.hpp b/libbindgen/tests/headers/struct_with_typedef_template_arg.hpp similarity index 100% rename from tests/headers/struct_with_typedef_template_arg.hpp rename to libbindgen/tests/headers/struct_with_typedef_template_arg.hpp diff --git a/tests/headers/template.hpp b/libbindgen/tests/headers/template.hpp similarity index 100% rename from tests/headers/template.hpp rename to libbindgen/tests/headers/template.hpp diff --git a/tests/headers/template_alias.hpp b/libbindgen/tests/headers/template_alias.hpp similarity index 100% rename from tests/headers/template_alias.hpp rename to libbindgen/tests/headers/template_alias.hpp diff --git a/tests/headers/template_alias_basic.hpp b/libbindgen/tests/headers/template_alias_basic.hpp similarity index 100% rename from tests/headers/template_alias_basic.hpp rename to libbindgen/tests/headers/template_alias_basic.hpp diff --git a/tests/headers/template_alias_namespace.hpp b/libbindgen/tests/headers/template_alias_namespace.hpp similarity index 100% rename from tests/headers/template_alias_namespace.hpp rename to libbindgen/tests/headers/template_alias_namespace.hpp diff --git a/tests/headers/template_typedef_transitive_param.hpp b/libbindgen/tests/headers/template_typedef_transitive_param.hpp similarity index 100% rename from tests/headers/template_typedef_transitive_param.hpp rename to libbindgen/tests/headers/template_typedef_transitive_param.hpp diff --git a/tests/headers/template_typedefs.hpp b/libbindgen/tests/headers/template_typedefs.hpp similarity index 100% rename from tests/headers/template_typedefs.hpp rename to libbindgen/tests/headers/template_typedefs.hpp diff --git a/tests/headers/type_alias_empty.hpp b/libbindgen/tests/headers/type_alias_empty.hpp similarity index 100% rename from tests/headers/type_alias_empty.hpp rename to libbindgen/tests/headers/type_alias_empty.hpp diff --git a/tests/headers/typeref.hpp b/libbindgen/tests/headers/typeref.hpp similarity index 100% rename from tests/headers/typeref.hpp rename to libbindgen/tests/headers/typeref.hpp diff --git a/tests/headers/union_dtor.hpp b/libbindgen/tests/headers/union_dtor.hpp similarity index 100% rename from tests/headers/union_dtor.hpp rename to libbindgen/tests/headers/union_dtor.hpp diff --git a/tests/headers/union_fields.hpp b/libbindgen/tests/headers/union_fields.hpp similarity index 100% rename from tests/headers/union_fields.hpp rename to libbindgen/tests/headers/union_fields.hpp diff --git a/tests/headers/union_template.hpp b/libbindgen/tests/headers/union_template.hpp similarity index 100% rename from tests/headers/union_template.hpp rename to libbindgen/tests/headers/union_template.hpp diff --git a/tests/headers/union_with_anon_struct.h b/libbindgen/tests/headers/union_with_anon_struct.h similarity index 100% rename from tests/headers/union_with_anon_struct.h rename to libbindgen/tests/headers/union_with_anon_struct.h diff --git a/tests/headers/union_with_anon_struct_bitfield.h b/libbindgen/tests/headers/union_with_anon_struct_bitfield.h similarity index 100% rename from tests/headers/union_with_anon_struct_bitfield.h rename to libbindgen/tests/headers/union_with_anon_struct_bitfield.h diff --git a/tests/headers/union_with_anon_union.h b/libbindgen/tests/headers/union_with_anon_union.h similarity index 100% rename from tests/headers/union_with_anon_union.h rename to libbindgen/tests/headers/union_with_anon_union.h diff --git a/tests/headers/union_with_anon_unnamed_struct.h b/libbindgen/tests/headers/union_with_anon_unnamed_struct.h similarity index 100% rename from tests/headers/union_with_anon_unnamed_struct.h rename to libbindgen/tests/headers/union_with_anon_unnamed_struct.h diff --git a/tests/headers/union_with_anon_unnamed_union.h b/libbindgen/tests/headers/union_with_anon_unnamed_union.h similarity index 100% rename from tests/headers/union_with_anon_unnamed_union.h rename to libbindgen/tests/headers/union_with_anon_unnamed_union.h diff --git a/tests/headers/union_with_big_member.h b/libbindgen/tests/headers/union_with_big_member.h similarity index 100% rename from tests/headers/union_with_big_member.h rename to libbindgen/tests/headers/union_with_big_member.h diff --git a/tests/headers/union_with_nesting.h b/libbindgen/tests/headers/union_with_nesting.h similarity index 100% rename from tests/headers/union_with_nesting.h rename to libbindgen/tests/headers/union_with_nesting.h diff --git a/tests/headers/unknown_attr.h b/libbindgen/tests/headers/unknown_attr.h similarity index 100% rename from tests/headers/unknown_attr.h rename to libbindgen/tests/headers/unknown_attr.h diff --git a/tests/headers/use-core.h b/libbindgen/tests/headers/use-core.h similarity index 100% rename from tests/headers/use-core.h rename to libbindgen/tests/headers/use-core.h diff --git a/tests/headers/using.hpp b/libbindgen/tests/headers/using.hpp similarity index 100% rename from tests/headers/using.hpp rename to libbindgen/tests/headers/using.hpp diff --git a/tests/headers/vector.hpp b/libbindgen/tests/headers/vector.hpp similarity index 100% rename from tests/headers/vector.hpp rename to libbindgen/tests/headers/vector.hpp diff --git a/tests/headers/virtual_dtor.hpp b/libbindgen/tests/headers/virtual_dtor.hpp similarity index 100% rename from tests/headers/virtual_dtor.hpp rename to libbindgen/tests/headers/virtual_dtor.hpp diff --git a/tests/headers/virtual_overloaded.hpp b/libbindgen/tests/headers/virtual_overloaded.hpp similarity index 100% rename from tests/headers/virtual_overloaded.hpp rename to libbindgen/tests/headers/virtual_overloaded.hpp diff --git a/tests/headers/vtable_recursive_sig.hpp b/libbindgen/tests/headers/vtable_recursive_sig.hpp similarity index 100% rename from tests/headers/vtable_recursive_sig.hpp rename to libbindgen/tests/headers/vtable_recursive_sig.hpp diff --git a/tests/headers/weird_bitfields.hpp b/libbindgen/tests/headers/weird_bitfields.hpp similarity index 100% rename from tests/headers/weird_bitfields.hpp rename to libbindgen/tests/headers/weird_bitfields.hpp diff --git a/tests/headers/what_is_going_on.hpp b/libbindgen/tests/headers/what_is_going_on.hpp similarity index 100% rename from tests/headers/what_is_going_on.hpp rename to libbindgen/tests/headers/what_is_going_on.hpp diff --git a/tests/headers/whitelist_basic.hpp b/libbindgen/tests/headers/whitelist_basic.hpp similarity index 100% rename from tests/headers/whitelist_basic.hpp rename to libbindgen/tests/headers/whitelist_basic.hpp diff --git a/tests/headers/whitelist_vars.h b/libbindgen/tests/headers/whitelist_vars.h similarity index 100% rename from tests/headers/whitelist_vars.h rename to libbindgen/tests/headers/whitelist_vars.h diff --git a/libbindgen/tests/tests.rs b/libbindgen/tests/tests.rs new file mode 100644 index 0000000000..c98262608e --- /dev/null +++ b/libbindgen/tests/tests.rs @@ -0,0 +1,138 @@ +extern crate clap; +extern crate diff; +#[macro_use] +extern crate env_logger; +extern crate libbindgen; +extern crate log; +extern crate shlex; + +use std::env; +use std::fs; +use std::io::{BufRead, BufReader, Error, ErrorKind, Read}; +use std::path::{Path, PathBuf}; + +#[path="../../src/options.rs"] +mod options; +use options::builder_from_flags; + +fn compare_generated_header(header: &PathBuf, + builder: libbindgen::Builder) + -> Result<(), Error> { + let file_name = try!(header.file_name() + .ok_or(Error::new(ErrorKind::Other, "spawn_bindgen expects a file"))); + + let mut expected = PathBuf::from(header); + expected.pop(); + expected.pop(); + expected.push("expectations"); + expected.push("tests"); + expected.push(file_name); + expected.set_extension("rs"); + + // We skip the generate() error here so we get a full diff below + let output = match builder.generate() { + Ok(bindings) => bindings.to_string(), + Err(_) => "".to_string(), + }; + + let mut buffer = String::new(); + let f = try!(fs::File::open(&expected)); + let _ = try!(BufReader::new(f).read_to_string(&mut buffer)); + + if output == buffer { + return Ok(()); + } + + println!("diff expected generated"); + println!("--- expected: {:?}", expected); + println!("+++ generated from: {:?}", header); + + for diff in diff::lines(&buffer, &output) { + match diff { + diff::Result::Left(l) => println!("-{}", l), + diff::Result::Both(l, _) => println!(" {}", l), + diff::Result::Right(r) => println!("+{}", r), + } + } + Err(Error::new(ErrorKind::Other, "Header and binding differ!")) +} + +fn create_bindgen_builder(header: &PathBuf) + -> Result { + let source = try!(fs::File::open(header)); + let reader = BufReader::new(source); + + // Scoop up bindgen-flags from test header + let line: String = try!(reader.lines().take(1).collect()); + let flags: Vec = if line.contains("bindgen-flags:") { + line.split("bindgen-flags:").last().and_then(shlex::split) + } else { + None + }.unwrap_or(Vec::with_capacity(2)); + + // Fool builder_from_flags() into believing it has real env::args_os... + // - add "bindgen" as executable name 0th element + // - add header filename as 1st element + // - prepend raw lines so they're in the right order for expected output + // - append the test header's bindgen flags + let header_str = try!(header.to_str() + .ok_or(Error::new(ErrorKind::Other, "Invalid header file name"))); + + let prepend = [ + "bindgen", + header_str, + "--raw-line", "", + "--raw-line", "#![allow(non_snake_case)]", + "--raw-line", "", + ]; + + let args = prepend.into_iter() + .map(ToString::to_string) + .chain(flags.into_iter()); + + builder_from_flags(args).map(|(builder, _)| builder.no_unstable_rust()) +} + +#[test] +fn run_bindgen_tests() { + log::set_logger(|max_log_level| { + use env_logger::Logger; + let env_logger = Logger::new(); + max_log_level.set(env_logger.filter()); + Box::new(env_logger) + }) + .expect("Failed to set logger."); + + let manifest_env = env::var("CARGO_MANIFEST_DIR") + .expect("CARGO_MANIFEST_DIR not set!"); + let manifest_dir = Path::new(&manifest_env); + let headers_dir = manifest_dir.join("tests").join("headers"); + + let entries = fs::read_dir(&headers_dir) + .expect("Couldn't read headers dir") + .map(|result| result.expect("Couldn't read header file")); + + let headers: Vec<_> = entries.filter_map(|entry| { + match entry.path().extension().and_then(|s| s.to_str()) { + Some("h") | Some("hpp") => Some(entry.path()), + _ => None, + } + }) + .collect(); + + let failures: Vec<_> = headers.iter() + .filter_map(|header| { + create_bindgen_builder(header) + .and_then(|builder| compare_generated_header(header, builder)) + .err() + }) + .collect(); + + let num_failures = failures.len(); + + if num_failures > 0 { + panic!("{} test{} failed!", + num_failures, + if num_failures > 1 {"s"} else {""}); + } +} diff --git a/tests/uses/.gitignore b/libbindgen/tests/uses/.gitignore similarity index 100% rename from tests/uses/.gitignore rename to libbindgen/tests/uses/.gitignore diff --git a/src/bin/bindgen.rs b/src/main.rs old mode 100755 new mode 100644 similarity index 96% rename from src/bin/bindgen.rs rename to src/main.rs index 14e882bccf..8cbff63bb8 --- a/src/bin/bindgen.rs +++ b/src/main.rs @@ -1,7 +1,4 @@ -#![crate_name = "bindgen"] -#![crate_type = "bin"] - -extern crate bindgen; +extern crate libbindgen; extern crate env_logger; #[macro_use] extern crate log; @@ -9,7 +6,7 @@ extern crate clang_sys; extern crate clap; extern crate rustc_serialize; -use bindgen::clang_version; +use libbindgen::clang_version; use std::env; mod options; diff --git a/src/bin/options.rs b/src/options.rs similarity index 99% rename from src/bin/options.rs rename to src/options.rs index 9f746fd087..c3c6a1f269 100644 --- a/src/bin/options.rs +++ b/src/options.rs @@ -1,8 +1,5 @@ - - -use bindgen::{Builder, builder}; - use clap::{App, Arg}; +use libbindgen::{Builder, builder}; use std::fs::File; use std::io::{self, Error, ErrorKind}; diff --git a/tests/tests.rs b/tests/tests.rs deleted file mode 100644 index 1f72fccf9d..0000000000 --- a/tests/tests.rs +++ /dev/null @@ -1,171 +0,0 @@ -// We add this `extern crate` here to ensure that bindgen is up-to-date and -// rebuilt, even though we aren't using any of its types or functions here, only -// indirectly calling the executable. -#[allow(dead_code)] -extern crate bindgen; - -use std::env; -use std::fs; -use std::io::Read; -use std::path::{Path, PathBuf}; -use std::process; - -const TEST_BATCH_DEFAULT_SIZE: usize = 16; - -fn spawn_run_bindgen(run_bindgen: P, - bindgen: Q, - header: R) - -> process::Child - where P: AsRef, - Q: AsRef, - R: AsRef, -{ - let run_bindgen = run_bindgen.as_ref(); - let bindgen = bindgen.as_ref(); - let header = header.as_ref(); - - // Convert from "tests/headers/foo.hpp" to "tests/expectations/tests/foo.rs" by - // saving the filename, popping off "headers/foo.hpp", pushing - // "expectations/tests", pushing the saved filename, and finally modifying the - // extension. - - let mut expected = PathBuf::from(header); - let file_name = expected.file_name() - .expect("Should have filename") - .to_os_string(); - expected.pop(); - expected.pop(); - expected.push("expectations"); - expected.push("tests"); - expected.push(file_name); - expected.set_extension("rs"); - - // And the same style conversion as above, but for the dummy uses. We assume - // that .hpp means we should generate a .cpp uses file, and .h means we - // should generate a .c file. - - let mut dummy_uses = PathBuf::from(header); - let file_name = dummy_uses.file_name() - .expect("Should still have filename") - .to_os_string(); - dummy_uses.pop(); - dummy_uses.pop(); - dummy_uses.push("uses"); - dummy_uses.push(file_name); - dummy_uses.set_extension(if header.extension().and_then(|s| s.to_str()) == - Some("hpp") { - "cpp" - } else { - "c" - }); - - process::Command::new(run_bindgen) - .stdout(process::Stdio::piped()) - .stderr(process::Stdio::piped()) - .arg(bindgen) - .arg(header) - .arg(expected) - .arg("--dummy-uses") - .arg(dummy_uses) - .spawn() - .expect("Should be able to spawn run-bindgen.py child process") -} - -#[test] -fn run_bindgen_tests() { - let crate_root = env::var("CARGO_MANIFEST_DIR") - .expect("should have CARGO_MANIFEST_DIR environment variable"); - - let mut run_bindgen = PathBuf::from(&crate_root); - run_bindgen.push("tests"); - run_bindgen.push("tools"); - run_bindgen.push("run-bindgen.py"); - - let mut bindgen = PathBuf::from(&crate_root); - bindgen.push("target"); - if cfg!(debug_assertions) { - bindgen.push("debug"); - } else { - bindgen.push("release"); - } - bindgen.push("bindgen"); - if !bindgen.is_file() { - panic!("{} is not a file! Build bindgen before running tests.", - bindgen.display()); - } - - let mut headers_dir = PathBuf::from(&crate_root); - headers_dir.push("tests"); - headers_dir.push("headers"); - - let entries = fs::read_dir(&headers_dir) - .expect("Should read directory") - .map(|result| result.expect("Should read directory entry")); - - let tests = entries.filter(|entry| { - match entry.path().extension().and_then(|s| s.to_str()) { - Some("h") | Some("hpp") => true, - _ => false, - } - }) - .collect::>(); - - let batch_size = env::var("BINDGEN_TEST_BATCH_SIZE") - .ok() - .and_then(|x| x.parse::().ok()) - .unwrap_or(TEST_BATCH_DEFAULT_SIZE); - - // Spawn `batch_size` children to run in parallel and wait on all of them - // before processing the next batch. This puts a limit on the resources - // consumed when testing, so that we don't overload the system. - - let children = tests.chunks(batch_size).map(|x| { - x.iter() - .map(|entry| { - let child = spawn_run_bindgen(run_bindgen.clone(), - bindgen.clone(), - entry.path()); - (entry.path(), child) - }) - .collect::>() - }); - - let failures: Vec<_> = children.flat_map(|x| { - x.into_iter().filter_map(|(path, mut child)| { - let passed = child.wait() - .expect("Should wait on child process") - .success(); - - if passed { None } else { Some((path, child)) } - }) - }) - .collect(); - - let num_failures = failures.len(); - - for (path, child) in failures { - println!("FAIL: {}", path.display()); - - let mut buf = String::new(); - - child.stdout - .expect("should have stdout piped") - .read_to_string(&mut buf) - .expect("should read child's stdout"); - for line in buf.lines() { - println!("child stdout> {}", line); - } - - child.stderr - .expect("should have stderr piped") - .read_to_string(&mut buf) - .expect("should read child's stderr"); - for line in buf.lines() { - println!("child stderr> {}", line); - } - } - - if num_failures > 0 { - panic!("{} test failures!", num_failures); - } -} diff --git a/tests/tools/run-bindgen.py b/tests/tools/run-bindgen.py deleted file mode 100755 index 519e6891af..0000000000 --- a/tests/tools/run-bindgen.py +++ /dev/null @@ -1,175 +0,0 @@ -#!/usr/bin/env python - -from __future__ import print_function - -import argparse -import difflib -import os -import sys -import subprocess -import tempfile -import shlex - -BINDGEN_FLAGS_PREFIX = "// bindgen-flags: " - -COMMON_PRELUDE = """ -#![allow(non_snake_case)] -""" - -DESCRIPTION = """ -Run bindgen on a test header and check the generated bindings against expected -output. -""" - -def make_parser(): - """Make the commandline parser""" - parser = argparse.ArgumentParser(description=DESCRIPTION) - parser.add_argument("bindgen", - metavar="BINDGEN", - help="The path to the bindgen executable") - parser.add_argument("header", - metavar="HEADER", - help="The path to the input header") - parser.add_argument("rust_bindings", - metavar="RUST_BINDINGS", - help="The path to the generated rust output. If a file \ - at this path already exists, the newly generated \ - bindings will be checked against those extant \ - expected bindings.") - parser.add_argument("--feature", - dest="features", - action="append", - nargs=1, - help="Run tests that depend on bindgen being built with \ - the given feature.") - parser.add_argument("--dummy-uses", - dest="dummy_uses", - help="The path to generate dummy C/C++ uses of the \ - whitelisted types from the input header at.") - return parser - -def usage_and_exit(*args): - """Print the program usage and exit. If args are given, print them first""" - if len(args) > 0: - print(*args) - make_parser().print_help() - sys.exit(1) - -def parse_args(): - """Get, parse, and validate commandline arguments.""" - parser = make_parser() - args = parser.parse_args() - - if args.features is None: - args.features = [] - - if not os.path.isfile(args.bindgen): - usage_and_exit("error: bindgen is not a file:", args.bindgen) - - if not os.path.isfile(args.header): - usage_and_exit("error: header is not a file:", args.header) - - return args - -def make_bindgen_env(): - """Build the environment to run bindgen in.""" - env = os.environ.copy() - env["RUST_BACKTRACE"] = "1" - - # El Capitan likes to unset dyld variables - # https://forums.developer.apple.com/thread/9233 - if "DYLD_LIBRARY_PATH" not in env and "LIBCLANG_PATH" in env: - env["DYLD_LIBRARY_PATH"] = env["LIBCLANG_PATH"] - - return env - -def get_bindgen_flags(header_path): - """ - Return the bindgen flags required for this header - """ - flags = ["--no-unstable-rust"] - for line in COMMON_PRELUDE.split("\n"): - flags.append("--raw-line") - flags.append(line) - - with open(header_path) as f: - for line in f: - if line.startswith(BINDGEN_FLAGS_PREFIX): - flags.extend(shlex.split(line.strip().split(BINDGEN_FLAGS_PREFIX)[1])) - break - - return flags - -def get_expected_bindings(rust_bindings_path): - """ - Get the expected, generated rust bindings output, or None if there is no - expected output yet. - """ - expected_bindings = None - if os.path.isfile(rust_bindings_path): - with open(rust_bindings_path) as f: - expected_bindings = f.read() - return expected_bindings - -def get_actual_bindings(rust_bindings_path): - """Get the actual generated rust bindings output.""" - assert os.path.isfile(rust_bindings_path) - with open(rust_bindings_path) as f: - return f.read() - -def run_cmd(command, **kwargs): - """Run the given command, passing through **kwargs to subprocess.check_call""" - print("run-bindgen.py: running", command) - subprocess.check_call(command, **kwargs) - -def generate_bindings(bindgen, dummy_uses, flags, header, output): - """Generate the rust bindings.""" - command = [bindgen, "-o", output] - if dummy_uses: - command.extend(["--dummy-uses", dummy_uses]) - command.extend(flags) - command.append(header) - run_cmd(command, cwd=os.getcwd(), env=make_bindgen_env()) - -def check_actual_vs_expected(expected_bindings, rust_bindings_path): - """ - Check the actual generated rust bindings versus our expected generated rust - bindings. If they don't match up, print a diff between them and exit with a - failure. - """ - if expected_bindings is None: - return - - actual_bindings = get_actual_bindings(rust_bindings_path) - if actual_bindings == expected_bindings: - return - - print("error: actual generated bindings do not match expected generated bindings!") - - def to_diffable(s): - return map(lambda l: l + "\n", s.split("\n")) - - diff = difflib.unified_diff(to_diffable(expected_bindings), - to_diffable(actual_bindings), - fromfile="expected_bindings.rs", - tofile="actual_bindings.rs") - sys.stderr.writelines(diff) - sys.stderr.write("\n") - - sys.exit(1) - -def main(): - args = parse_args() - - test_flags = get_bindgen_flags(args.header) - expected_bindings = get_expected_bindings(args.rust_bindings) - generate_bindings(args.bindgen, - args.dummy_uses, - test_flags, - args.header, - args.rust_bindings) - check_actual_vs_expected(expected_bindings, args.rust_bindings) - sys.exit(0) - -if __name__ == "__main__": - main() From c555fcf76a3b3b2e416a8a517e72b319e9a4d18b Mon Sep 17 00:00:00 2001 From: Jeff Waugh Date: Tue, 15 Nov 2016 17:01:08 +1100 Subject: [PATCH 0084/2291] Document library usage --- README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/README.md b/README.md index 97488b6b71..7187201f16 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,40 @@ $ LIBCLANG_PATH=path/to/clang-3.9/build/lib \ cargo build ``` +# Library usage with `build.rs` + +In `Cargo.toml`: + +```toml +[package] +... +build = "build.rs" + +[build-dependencies.libbindgen] +git = "https://github.com/servo/rust-bindgen" +features = ["llvm_stable"] +``` + +In `build.rs`: + +```rust +extern crate libbindgen; + +fn main() { + let _ = libbindgen::builder() + .header("example.h") + .use_core() + .generate().unwrap() + .write_to_file(concat!(env!("OUT_DIR"), "/example.rs")); +} +``` + +In `src/main.rs`: + +```rust +include!(concat!(env!("OUT_DIR"), "/example.rs")); +``` + # Command Line Usage There are a few options documented when running `./bindgen --help`. Other From 073b12ff35a8ec6314d655804915f177ce453227 Mon Sep 17 00:00:00 2001 From: Jeff Waugh Date: Tue, 15 Nov 2016 17:01:49 +1100 Subject: [PATCH 0085/2291] Remove plugin and its documentation --- README.md | 8 - bindgen_plugin/Cargo.toml | 20 -- bindgen_plugin/src/bgmacro.rs | 344 ---------------------------------- bindgen_plugin/src/lib.rs | 17 -- 4 files changed, 389 deletions(-) delete mode 100644 bindgen_plugin/Cargo.toml delete mode 100644 bindgen_plugin/src/bgmacro.rs delete mode 100644 bindgen_plugin/src/lib.rs diff --git a/README.md b/README.md index 7187201f16..ead988ecd6 100644 --- a/README.md +++ b/README.md @@ -176,11 +176,3 @@ the ones that would be generated for `nsTArray_Simple`. The `nocopy` annotation is used to prevent bindgen to autoderive the `Copy` and `Clone` traits for a type. - -# Macro Usage - -This mode isn't actively maintained, so no promises are made around it. Check -out the upstream documentation for info about how it *should* work. - -[sm-script]: https://github.com/servo/rust-mozjs/blob/master/etc/bindings.sh -[stylo-scripts]: https://github.com/servo/servo/tree/master/components/style/binding_tools diff --git a/bindgen_plugin/Cargo.toml b/bindgen_plugin/Cargo.toml deleted file mode 100644 index 0ebcb16f50..0000000000 --- a/bindgen_plugin/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] - -name = "bindgen_plugin" -version = "0.16.0" -description = "A binding generator for Rust - compiler plugin" -authors = ["Jyun-Yan You "] -license = "BSD-3-Clause" - -[dependencies.bindgen] -version = "0.16.0" -path = ".." - -[features] -static = [] - -[lib] - -name = "bindgen_plugin" -path = "src/lib.rs" -plugin = true diff --git a/bindgen_plugin/src/bgmacro.rs b/bindgen_plugin/src/bgmacro.rs deleted file mode 100644 index 0e95b9a5af..0000000000 --- a/bindgen_plugin/src/bgmacro.rs +++ /dev/null @@ -1,344 +0,0 @@ -use std::default::Default; -use std::env; -use std::path::Path; - -use syntax::ast; -use syntax::codemap; -use syntax::ext::base; -use syntax::fold::Folder; -use syntax::parse; -use syntax::parse::token; -use syntax::ptr::P; -use syntax::util::small_vector::SmallVector; - -use bindgen::{Bindings, BindgenOptions, LinkType, Logger, self}; - -pub fn bindgen_macro(cx: &mut base::ExtCtxt, sp: codemap::Span, tts: &[ast::TokenTree]) -> Box { - let mut visit = BindgenArgsVisitor { - options: Default::default(), - seen_named: false - }; - - visit.options.builtins = true; - if !parse_macro_opts(cx, tts, &mut visit) { - return base::DummyResult::any(sp); - } - - // Reparse clang_args as it is passed in string form - let clang_args = visit.options.clang_args.connect(" "); - visit.options.clang_args = parse_process_args(&clang_args); - - if let Some(path) = bindgen::get_include_dir() { - visit.options.clang_args.push("-I".to_owned()); - visit.options.clang_args.push(path); - } - - // Set the working dir to the directory containing the invoking rs file so - // that clang searches for headers relative to it rather than the crate root - let filename = cx.codemap().span_to_filename(sp); - let mod_dir = Path::new(&filename).parent().unwrap(); - let cwd = match env::current_dir() { - Ok(d) => d, - Err(e) => panic!("Invalid current working directory: {}", e), - }; - let p = Path::new(mod_dir); - if let Err(e) = env::set_current_dir(&p) { - panic!("Failed to change to directory {}: {}", p.display(), e); - }; - - // We want the span for errors to just match the bindgen! symbol - // instead of the whole invocation which can span multiple lines - let mut short_span = sp; - short_span.hi = short_span.lo + codemap::BytePos(8); - - let logger = MacroLogger { sp: short_span, cx: cx }; - - let ret = match Bindings::generate(&visit.options, Some(&logger as &Logger), None) { - Ok(bindings) => { - // syntex_syntax is not compatible with libsyntax so convert to string and reparse - let bindings_str = bindings.to_string(); - // Unfortunately we lose span information due to reparsing - let mut parser = parse::new_parser_from_source_str(cx.parse_sess(), cx.cfg(), "(Auto-generated bindings)".to_string(), bindings_str); - - let mut items = Vec::new(); - while let Ok(Some(item)) = parser.parse_item() { - items.push(item); - } - - Box::new(BindgenResult { items: Some(SmallVector::many(items)) }) as Box - - } - Err(_) => base::DummyResult::any(sp) - }; - - let p = Path::new(&cwd); - if let Err(e) = env::set_current_dir(&p) { - panic!("Failed to return to directory {}: {}", p.display(), e); - } - - ret -} - -trait MacroArgsVisitor { - fn visit_str(&mut self, name: Option<&str>, val: &str) -> bool; - fn visit_int(&mut self, name: Option<&str>, val: i64) -> bool; - fn visit_bool(&mut self, name: Option<&str>, val: bool) -> bool; - fn visit_ident(&mut self, name: Option<&str>, ident: &str) -> bool; -} - -struct BindgenArgsVisitor { - pub options: BindgenOptions, - seen_named: bool -} - -impl MacroArgsVisitor for BindgenArgsVisitor { - fn visit_str(&mut self, mut name: Option<&str>, val: &str) -> bool { - if name.is_some() { self.seen_named = true; } - else if !self.seen_named { name = Some("clang_args") } - match name { - Some("link") => self.options.links.push((val.to_string(), LinkType::Default)), - Some("link_static") => self.options.links.push((val.to_string(), LinkType::Static)), - Some("link_framework") => self.options.links.push((val.to_string(), LinkType::Framework)), - Some("match") => self.options.match_pat.push(val.to_string()), - Some("clang_args") => self.options.clang_args.push(val.to_string()), - _ => return false - } - true - } - - fn visit_int(&mut self, name: Option<&str>, _val: i64) -> bool { - if name.is_some() { self.seen_named = true; } - false - } - - fn visit_bool(&mut self, name: Option<&str>, val: bool) -> bool { - if name.is_some() { self.seen_named = true; } - match name { - Some("emit_builtins") => self.options.builtins = val, - _ => return false - } - true - } - - fn visit_ident(&mut self, name: Option<&str>, _val: &str) -> bool { - if name.is_some() { self.seen_named = true; } - false - } -} - -// Parses macro invocations in the form [ident=|:]value where value is an ident or literal -// e.g. bindgen!(module_name, "header.h", emit_builtins=false, clang_args:"-I /usr/local/include") -fn parse_macro_opts(cx: &mut base::ExtCtxt, tts: &[ast::TokenTree], visit: &mut MacroArgsVisitor) -> bool { - let mut parser = cx.new_parser_from_tts(tts); - let mut args_good = true; - - loop { - let mut name: Option = None; - let mut span = parser.span; - - // Check for [ident=]value and if found save ident to name - if parser.look_ahead(1, |t| t == &token::Eq) { - match parser.bump_and_get() { - Ok(token::Ident(ident, _)) => { - let ident = parser.id_to_interned_str(ident); - name = Some(ident.to_string()); - if let Err(_) = parser.expect(&token::Eq) { - return false; - } - }, - _ => { - cx.span_err(span, "invalid argument format"); - return false - } - } - } - - match parser.token { - // Match [ident] - token::Ident(val, _) => { - let val = parser.id_to_interned_str(val); - span.hi = parser.span.hi; - if let Err(_) = parser.bump() { - return false; - } - - // Bools are simply encoded as idents - let ret = match &*val { - "true" => visit.visit_bool(as_str(&name), true), - "false" => visit.visit_bool(as_str(&name), false), - val => visit.visit_ident(as_str(&name), val) - }; - if !ret { - cx.span_err(span, "invalid argument"); - args_good = false; - } - } - // Match [literal] and parse as an expression so we can expand macros - _ => { - let expr = cx.expander().fold_expr(parser.parse_expr().unwrap()); - span.hi = expr.span.hi; - match expr.node { - ast::ExprLit(ref lit) => { - let ret = match lit.node { - ast::LitStr(ref s, _) => visit.visit_str(as_str(&name), &*s), - ast::LitBool(b) => visit.visit_bool(as_str(&name), b), - ast::LitInt(i, ast::SignedIntLit(_, sign)) | - ast::LitInt(i, ast::UnsuffixedIntLit(sign)) => { - let i = i as i64; - let i = if sign == ast::Minus { -i } else { i }; - visit.visit_int(as_str(&name), i) - }, - ast::LitInt(i, ast::UnsignedIntLit(_)) => visit.visit_int(as_str(&name), i as i64), - _ => { - cx.span_err(span, "invalid argument format"); - return false - } - }; - if !ret { - cx.span_err(span, "invalid argument"); - args_good = false; - } - }, - _ => { - cx.span_err(span, "invalid argument format"); - return false - } - } - } - } - - if parser.check(&token::Eof) { - return args_good - } - - if parser.eat(&token::Comma).is_err() { - cx.span_err(parser.span, "invalid argument format"); - return false - } - } -} - -// I'm sure there's a nicer way of doing it -fn as_str<'a>(owned: &'a Option) -> Option<&'a str> { - match owned { - &Some(ref s) => Some(s), - &None => None - } -} - -#[derive(PartialEq, Eq)] -enum QuoteState { - InNone, - InSingleQuotes, - InDoubleQuotes -} - -fn parse_process_args(s: &str) -> Vec { - let s = s.trim(); - let mut parts = Vec::new(); - let mut quote_state = QuoteState::InNone; - let mut positions = vec!(0); - let mut last = ' '; - for (i, c) in s.chars().chain(" ".chars()).enumerate() { - match (last, c) { - // Match \" set has_escaped and skip - ('\\', '\"') => (), - // Match \' - ('\\', '\'') => (), - // Match \ - // Check we don't escape the final added space - ('\\', ' ') if i < s.len() => (), - // Match \\ - ('\\', '\\') => (), - // Match " - (_, '\"') if quote_state == QuoteState::InNone => { - quote_state = QuoteState::InDoubleQuotes; - positions.push(i); - positions.push(i + 1); - }, - (_, '\"') if quote_state == QuoteState::InDoubleQuotes => { - quote_state = QuoteState::InNone; - positions.push(i); - positions.push(i + 1); - }, - // Match ' - (_, '\'') if quote_state == QuoteState::InNone => { - quote_state = QuoteState::InSingleQuotes; - positions.push(i); - positions.push(i + 1); - }, - (_, '\'') if quote_state == QuoteState::InSingleQuotes => { - quote_state = QuoteState::InNone; - positions.push(i); - positions.push(i + 1); - }, - // Match - // If we are at the end of the string close any open quotes - (_, ' ') if quote_state == QuoteState::InNone || i >= s.len() => { - { - positions.push(i); - - let starts = positions.iter().enumerate().filter(|&(i, _)| i % 2 == 0); - let ends = positions.iter().enumerate().filter(|&(i, _)| i % 2 == 1); - - let part: Vec = starts.zip(ends).map(|((_, start), (_, end))| s[*start..*end].to_string()).collect(); - - let part = part.join(""); - - if part.len() > 0 { - // Remove any extra whitespace outside the quotes - let part = part.trim(); - // Replace quoted characters - let part = part.replace("\\\"", "\""); - let part = part.replace("\\\'", "\'"); - let part = part.replace("\\ ", " "); - let part = part.replace("\\\\", "\\"); - parts.push(part); - } - } - - positions.clear(); - positions.push(i + 1); - }, - (_, _) => () - } - last = c; - } - parts -} - -struct MacroLogger<'a, 'b:'a> { - sp: codemap::Span, - cx: &'a base::ExtCtxt<'b> -} - -impl<'a, 'b> Logger for MacroLogger<'a, 'b> { - fn error(&self, msg: &str) { - self.cx.span_err(self.sp, msg) - } - - fn warn(&self, msg: &str) { - self.cx.span_warn(self.sp, msg) - } -} - -struct BindgenResult { - items: Option>> -} - -impl base::MacResult for BindgenResult { - fn make_items(mut self: Box) -> Option>> { - self.items.take() - } -} - -#[test] -fn test_parse_process_args() { - assert_eq!(parse_process_args("a b c"), vec!("a", "b", "c")); - assert_eq!(parse_process_args("a \"b\" c"), vec!("a", "b", "c")); - assert_eq!(parse_process_args("a \'b\' c"), vec!("a", "b", "c")); - assert_eq!(parse_process_args("a \"b c\""), vec!("a", "b c")); - assert_eq!(parse_process_args("a \'\"b\"\' c"), vec!("a", "\"b\"", "c")); - assert_eq!(parse_process_args("a b\\ c"), vec!("a", "b c")); - assert_eq!(parse_process_args("a b c\\"), vec!("a", "b", "c\\")); -} diff --git a/bindgen_plugin/src/lib.rs b/bindgen_plugin/src/lib.rs deleted file mode 100644 index 970e06ecf2..0000000000 --- a/bindgen_plugin/src/lib.rs +++ /dev/null @@ -1,17 +0,0 @@ -#![crate_name = "bindgen_plugin"] -#![crate_type = "dylib"] -#![feature(plugin_registrar, rustc_private)] - -extern crate bindgen; -extern crate rustc_plugin; -extern crate syntax; - -mod bgmacro; - -use rustc_plugin::Registry; - -#[doc(hidden)] -#[plugin_registrar] -pub fn plugin_registrar(reg: &mut Registry) { - reg.register_macro("bindgen", bgmacro::bindgen_macro); -} From a6aa516270225f387e9e615dcfa6eebca71f5475 Mon Sep 17 00:00:00 2001 From: Jeff Waugh Date: Wed, 16 Nov 2016 02:58:01 +1100 Subject: [PATCH 0086/2291] Generate a separate test function for every header - Header tests can now be run selectively, e.g. `cargo test union` will test all headers with 'union' in the file name. - The list of test functions is generated by `build.rs`, so never needs to be updated. - Clever approach suggested by @fitzgen. --- libbindgen/build.rs | 39 ++++++++++++++++++++++++-- libbindgen/tests/tests.rs | 58 ++++++++++----------------------------- 2 files changed, 51 insertions(+), 46 deletions(-) diff --git a/libbindgen/build.rs b/libbindgen/build.rs index b9cf3e6045..228a7f2212 100644 --- a/libbindgen/build.rs +++ b/libbindgen/build.rs @@ -1,10 +1,9 @@ mod codegen { extern crate quasi_codegen; use std::path::Path; - use std::env; pub fn main() { - let out_dir = env::var_os("OUT_DIR").unwrap(); + let out_dir = Path::new(env!("OUT_DIR")); let src = Path::new("src/codegen/mod.rs"); let dst = Path::new(&out_dir).join("codegen.rs"); @@ -14,6 +13,42 @@ mod codegen { } } +mod testgen { + use std::char; + use std::ffi::OsStr; + use std::fs::{self, File}; + use std::io::Write; + use std::path::Path; + + pub fn main() { + let out_dir = Path::new(env!("OUT_DIR")); + let mut dst = File::create(Path::new(&out_dir).join("tests.rs")).unwrap(); + + let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); + let headers_dir = manifest_dir.join("tests").join("headers"); + + let entries = fs::read_dir(headers_dir) + .expect("Couldn't read headers dir") + .map(|result| result.expect("Couldn't read header file")); + + for entry in entries { + match entry.path().extension().and_then(OsStr::to_str) { + Some("h") | Some("hpp") => { + let func = entry.file_name().to_str().unwrap() + .replace(|c| !char::is_alphanumeric(c), "_") + .replace("__", "_") + .to_lowercase(); + let _ = writeln!(dst, "test_header!(header_{}, {:?});", + func, entry.path()); + } + _ => {} + } + } + let _ = dst.flush(); + } +} + fn main() { codegen::main(); + testgen::main(); } diff --git a/libbindgen/tests/tests.rs b/libbindgen/tests/tests.rs index c98262608e..c07864062b 100644 --- a/libbindgen/tests/tests.rs +++ b/libbindgen/tests/tests.rs @@ -6,10 +6,9 @@ extern crate libbindgen; extern crate log; extern crate shlex; -use std::env; use std::fs; use std::io::{BufRead, BufReader, Error, ErrorKind, Read}; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; #[path="../../src/options.rs"] mod options; @@ -93,46 +92,17 @@ fn create_bindgen_builder(header: &PathBuf) builder_from_flags(args).map(|(builder, _)| builder.no_unstable_rust()) } -#[test] -fn run_bindgen_tests() { - log::set_logger(|max_log_level| { - use env_logger::Logger; - let env_logger = Logger::new(); - max_log_level.set(env_logger.filter()); - Box::new(env_logger) - }) - .expect("Failed to set logger."); - - let manifest_env = env::var("CARGO_MANIFEST_DIR") - .expect("CARGO_MANIFEST_DIR not set!"); - let manifest_dir = Path::new(&manifest_env); - let headers_dir = manifest_dir.join("tests").join("headers"); - - let entries = fs::read_dir(&headers_dir) - .expect("Couldn't read headers dir") - .map(|result| result.expect("Couldn't read header file")); - - let headers: Vec<_> = entries.filter_map(|entry| { - match entry.path().extension().and_then(|s| s.to_str()) { - Some("h") | Some("hpp") => Some(entry.path()), - _ => None, - } - }) - .collect(); - - let failures: Vec<_> = headers.iter() - .filter_map(|header| { - create_bindgen_builder(header) - .and_then(|builder| compare_generated_header(header, builder)) - .err() - }) - .collect(); - - let num_failures = failures.len(); - - if num_failures > 0 { - panic!("{} test{} failed!", - num_failures, - if num_failures > 1 {"s"} else {""}); - } +macro_rules! test_header { + ($function:ident, $header:expr) => ( + #[test] + fn $function() { + let header = PathBuf::from($header); + let _ = create_bindgen_builder(&header) + .and_then(|builder| compare_generated_header(&header, builder)) + .map_err(|err| panic!(format!("{}", err)) ); + } + ) } + +// This file is generated by build.rs +include!(concat!(env!("OUT_DIR"), "/tests.rs")); From 2895ae351c374a5cf49bc1e950b3cca9a1d09c8c Mon Sep 17 00:00:00 2001 From: Jeff Waugh Date: Wed, 16 Nov 2016 06:24:03 +1100 Subject: [PATCH 0087/2291] Avoid superfluous repeated builds on Travis --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 48f0b4b1a1..98073e005b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,8 @@ rust: - nightly env: - - LLVM_VERSION=3.8 BINDGEN_FEATURES=llvm_stable - - LLVM_VERSION=3.9 BINDGEN_FEATURES= + - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.8 BINDGEN_FEATURES=llvm_stable + - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.9 BINDGEN_FEATURES= cache: directories: From 3bb07b6ea4e60a30a774d41819b63a85de096a1e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 15 Nov 2016 10:26:26 -0800 Subject: [PATCH 0088/2291] Add an option to emit our ir for debugging Similar to our ability to emit the clang AST, this adds an option to emit our IR for debugging purposes. --- libbindgen/src/codegen/mod.rs | 7 +++++++ libbindgen/src/lib.rs | 10 ++++++++++ src/options.rs | 7 +++++++ 3 files changed, 24 insertions(+) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 8e04fd7c05..009d881911 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1892,6 +1892,13 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { let whitelisted_items: ItemSet = context.whitelisted_items().collect(); + if context.options().emit_ir { + for &id in whitelisted_items.iter() { + let item = context.resolve_item(id); + println!("ir: {:?} = {:#?}", id, item); + } + } + for &id in whitelisted_items.iter() { let item = context.resolve_item(id); diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index d0ca7b03af..e4923b77dd 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -225,6 +225,12 @@ impl Builder { self } + /// Emit IR. + pub fn emit_ir(mut self) -> Builder { + self.options.emit_ir = true; + self + } + /// Enable C++ namespaces. pub fn enable_cxx_namespaces(mut self) -> Builder { self.options.enable_cxx_namespaces = true; @@ -314,6 +320,9 @@ pub struct BindgenOptions { /// True if we should dump the Clang AST for debugging purposes. pub emit_ast: bool, + /// True if we should dump our internal IR for debugging purposes. + pub emit_ir: bool, + /// True if we should ignore functions and only generate bindings for /// structures, types, and methods. pub ignore_functions: bool, @@ -380,6 +389,7 @@ impl Default for BindgenOptions { builtins: false, links: vec![], emit_ast: false, + emit_ir: false, ignore_functions: false, ignore_methods: false, derive_debug: true, diff --git a/src/options.rs b/src/options.rs index c3c6a1f269..2ea74a27a9 100644 --- a/src/options.rs +++ b/src/options.rs @@ -52,6 +52,9 @@ pub fn builder_from_flags(args: I) Arg::with_name("emit-clang-ast") .long("emit-clang-ast") .help("Output the Clang AST for debugging purposes."), + Arg::with_name("emit-ir") + .long("emit-ir") + .help("Output our internal IR for debugging purposes."), Arg::with_name("enable-cxx-namespaces") .long("enable-cxx-namespaces") .help("Enable support for C++ namespaces."), @@ -183,6 +186,10 @@ pub fn builder_from_flags(args: I) builder = builder.emit_clang_ast(); } + if matches.is_present("emit-ir") { + builder = builder.emit_ir(); + } + if matches.is_present("enable-cxx-namespaces") { builder = builder.enable_cxx_namespaces(); } From 1256345ab0939622a19200834587ac8b64dc355d Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 15 Nov 2016 13:06:19 -0800 Subject: [PATCH 0089/2291] Disable nightly Rust builds on Travis CI There is a regression in nightly Rust that is causing compilation to fail on Ubuntu 12.04, which is what Travis CI is using. This commit will be reverted once that regression is fixed. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 48f0b4b1a1..9c7c1155df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,6 @@ os: rust: - stable - - nightly env: - LLVM_VERSION=3.8 BINDGEN_FEATURES=llvm_stable From 8d897009a217be80d9a9133915f30e51812f18c1 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 15 Nov 2016 13:31:59 -0800 Subject: [PATCH 0090/2291] Clean up AST dumping This adds labels to each thing that gets printed for each AST node, and uses a range for indent iteration rather than an index variable. --- libbindgen/src/clang.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 7da755eaba..d10457b3b0 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -1235,21 +1235,23 @@ pub fn type_to_str(x: Enum_CXTypeKind) -> String { /// Dump the Clang AST to stdout for debugging purposes. pub fn ast_dump(c: &Cursor, depth: isize) -> Enum_CXVisitorResult { fn print_indent(depth: isize, s: &str) { - let mut i = 0; - while i < depth { + for _ in 0..depth { print!("\t"); - i += 1; } println!("{}", s); } - let ct = c.cur_type().kind(); + print_indent(depth, - &format!("({} {} {}", + &format!("(kind: {}, spelling: {}, type: {}", kind_to_str(c.kind()), c.spelling(), - type_to_str(ct))); + type_to_str(c.cur_type().kind()))); + + // Recurse. c.visit(|s| ast_dump(&s, depth + 1)); + print_indent(depth, ")"); + CXChildVisit_Continue } From 60b1c83009c721ec7f6214d16a5035b62304afe9 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 15 Nov 2016 13:35:00 -0800 Subject: [PATCH 0091/2291] Add `debug!` logging in code generation This instruments each `CodeGenerator` implementation with a `debug!` logging macro. --- libbindgen/src/codegen/mod.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 8e04fd7c05..65bc28d53a 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -228,9 +228,12 @@ impl CodeGenerator for Item { result: &mut CodegenResult, _extra: &()) { if self.is_hidden(ctx) || result.seen(self.id()) { + debug!("::codegen: Ignoring hidden or seen: self = {:?}", self); return; } + debug!("::codegen: self = {:?}", self); + result.set_seen(self.id()); match *self.kind() { @@ -264,6 +267,8 @@ impl CodeGenerator for Module { ctx: &BindgenContext, result: &mut CodegenResult, item: &Item) { + debug!("::codegen: item = {:?}", item); + if !ctx.options().enable_cxx_namespaces { for child in self.children() { ctx.resolve_item(*child).codegen(ctx, result, &()); @@ -299,6 +304,8 @@ impl CodeGenerator for Var { ctx: &BindgenContext, result: &mut CodegenResult, item: &Item) { + debug!("::codegen: item = {:?}", item); + let canonical_name = item.canonical_name(ctx); if result.seen_var(&canonical_name) { @@ -349,6 +356,8 @@ impl CodeGenerator for Type { ctx: &BindgenContext, result: &mut CodegenResult, item: &Item) { + debug!("::codegen: item = {:?}", item); + match *self.kind() { TypeKind::Void | TypeKind::NullPtr | @@ -600,6 +609,9 @@ impl CodeGenerator for CompInfo { result: &mut CodegenResult, item: &Item) { use aster::struct_field::StructFieldBuilder; + + debug!("::codegen: item = {:?}", item); + // Don't output classes with template parameters that aren't types, and // also don't output template specializations, neither total or partial. // @@ -1361,6 +1373,8 @@ impl CodeGenerator for Enum { ctx: &BindgenContext, result: &mut CodegenResult, item: &Item) { + debug!("::codegen: item = {:?}", item); + let name = item.canonical_name(ctx); let enum_ty = item.expect_type(); let layout = enum_ty.layout(ctx); @@ -1800,6 +1814,8 @@ impl CodeGenerator for Function { ctx: &BindgenContext, result: &mut CodegenResult, item: &Item) { + debug!("::codegen: item = {:?}", item); + let name = self.name(); let mut canonical_name = item.canonical_name(ctx); let mangled_name = self.mangled_name(); From 239d62bbcfeb26aa6c29e95675e1f6907fea4c4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 15 Nov 2016 12:22:31 +0100 Subject: [PATCH 0092/2291] clangll: Add bindings to CXEvalResult --- libbindgen/src/clangll.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/libbindgen/src/clangll.rs b/libbindgen/src/clangll.rs index b974311769..98ba525c19 100644 --- a/libbindgen/src/clangll.rs +++ b/libbindgen/src/clangll.rs @@ -7,7 +7,22 @@ #![allow(non_upper_case_globals)] #![cfg_attr(rustfmt, rustfmt_skip)] -use ::std::os::raw::{ c_char, c_int, c_long, c_longlong, c_uint, c_ulong, c_ulonglong, c_void}; +use ::std::os::raw::{c_char, c_int, c_long, c_longlong, c_uint, c_ulong, c_ulonglong, c_void}; + +#[cfg(not(feature = "llvm_stable"))] +use std::os::raw::c_double; + + +pub type CXEvalResult = *mut c_void; +pub type Enum_CXEvalResultKind = c_uint; + +pub const CXEval_Int: c_uint = 1; +pub const CXEval_Float: c_uint = 2; +pub const CXEval_ObjCStrLiteral: c_uint = 3; +pub const CXEval_StrLiteral: c_uint = 4; +pub const CXEval_CFStr: c_uint = 5; +pub const CXEval_Other: c_uint = 6; +pub const CXEval_UnExposed: c_uint = 0; pub type ptrdiff_t = c_long; pub type size_t = c_ulong; @@ -1436,4 +1451,10 @@ extern "C" { offset: *mut c_uint); pub fn clang_indexLoc_getCXSourceLocation(loc: CXIdxLoc) -> CXSourceLocation; + pub fn clang_Cursor_Evaluate(C: CXCursor) -> CXEvalResult; + pub fn clang_EvalResult_getKind(E: CXEvalResult) -> Enum_CXEvalResultKind; + pub fn clang_EvalResult_getAsInt(E: CXEvalResult) -> c_int; + pub fn clang_EvalResult_getAsDouble(E: CXEvalResult) -> c_double; + pub fn clang_EvalResult_getAsStr(E: CXEvalResult) -> *const c_char; + pub fn clang_EvalResult_dispose(E: CXEvalResult); } From f9422a46535a539e60776ad8df08991ca2ebdee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 15 Nov 2016 13:33:41 +0100 Subject: [PATCH 0093/2291] clang: Don't leak all the strings in the world. --- libbindgen/src/clang.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index d10457b3b0..15f288dd02 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -933,7 +933,9 @@ impl Into for CXString { } unsafe { let c_str = CStr::from_ptr(clang_getCString(self) as *const _); - c_str.to_string_lossy().into_owned() + let ret = c_str.to_string_lossy().into_owned(); + clang_disposeString(self); + ret } } } From d51616852ff57afcfb9ffbc4d6947b4627c03488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 15 Nov 2016 13:34:10 +0100 Subject: [PATCH 0094/2291] clang: Evaluate more complex constant expressions in variables. --- libbindgen/src/clang.rs | 52 +++++++++++++++++++ libbindgen/src/clangll.rs | 6 +++ libbindgen/src/ir/var.rs | 22 +++++--- tests/expectations/tests/constant-evaluate.rs | 12 +++++ tests/headers/constant-evaluate.h | 7 +++ 5 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 tests/expectations/tests/constant-evaluate.rs create mode 100644 tests/headers/constant-evaluate.h diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 15f288dd02..fb495929f6 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -475,6 +475,11 @@ impl Cursor { pub fn is_virtual_base(&self) -> bool { unsafe { clang_isVirtualBase(self.x) != 0 } } + + /// Try to evaluate this cursor. + pub fn evaluate(&self) -> EvalResult { + EvalResult::new(*self) + } } extern "C" fn visit_children(cur: CXCursor, @@ -1261,3 +1266,50 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> Enum_CXVisitorResult { pub fn extract_clang_version() -> String { unsafe { clang_getClangVersion().into() } } + +#[derive(Debug)] +pub struct EvalResult { + x: CXEvalResult, +} + +#[cfg(feature = "llvm_stable")] +impl EvalResult { + pub fn new(_: Cursor) -> Self { + EvalResult { + x: ::std::ptr::null_mut(), + } + } + + pub fn as_int(&self) -> Option { + None + } +} + +#[cfg(not(feature = "llvm_stable"))] +impl EvalResult { + pub fn new(cursor: Cursor) -> Self { + EvalResult { + x: unsafe { clang_Cursor_Evaluate(cursor.x) }, + } + } + + pub fn kind(&self) -> Enum_CXEvalResultKind { + unsafe { clang_EvalResult_getKind(self.x) } + } + + pub fn as_int(&self) -> Option { + match self.kind() { + CXEval_Int => { + Some(unsafe { clang_EvalResult_getAsInt(self.x) } as i32) + } + _ => None, + } + } +} + +#[cfg(not(feature = "llvm_stable"))] +impl Drop for EvalResult { + fn drop(&mut self) { + unsafe { clang_EvalResult_dispose(self.x) }; + } +} diff --git a/libbindgen/src/clangll.rs b/libbindgen/src/clangll.rs index 98ba525c19..e37baf257a 100644 --- a/libbindgen/src/clangll.rs +++ b/libbindgen/src/clangll.rs @@ -1451,10 +1451,16 @@ extern "C" { offset: *mut c_uint); pub fn clang_indexLoc_getCXSourceLocation(loc: CXIdxLoc) -> CXSourceLocation; + #[cfg(not(feature="llvm_stable"))] pub fn clang_Cursor_Evaluate(C: CXCursor) -> CXEvalResult; + #[cfg(not(feature="llvm_stable"))] pub fn clang_EvalResult_getKind(E: CXEvalResult) -> Enum_CXEvalResultKind; + #[cfg(not(feature="llvm_stable"))] pub fn clang_EvalResult_getAsInt(E: CXEvalResult) -> c_int; + #[cfg(not(feature="llvm_stable"))] pub fn clang_EvalResult_getAsDouble(E: CXEvalResult) -> c_double; + #[cfg(not(feature="llvm_stable"))] pub fn clang_EvalResult_getAsStr(E: CXEvalResult) -> *const c_char; + #[cfg(not(feature="llvm_stable"))] pub fn clang_EvalResult_dispose(E: CXEvalResult); } diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index d0c4d9cacd..c4f1f750f2 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -159,13 +159,23 @@ impl ClangSubItemParser for Var { // tests/headers/inner_const.hpp // // That's fine because in that case we know it's not a literal. - let value = ctx.safe_resolve_type(ty) + let is_integer = ctx.safe_resolve_type(ty) .and_then(|t| t.safe_canonical_type(ctx)) - .and_then(|t| if t.is_integer() { Some(t) } else { None }) - .and_then(|_| { - get_integer_literal_from_cursor(&cursor, - ctx.translation_unit()) - }); + .map(|t| t.is_integer()) + .unwrap_or(false); + + let value = if is_integer { + cursor.evaluate() + .as_int() + .map(|val| val as i64) + .or_else(|| { + let tu = ctx.translation_unit(); + get_integer_literal_from_cursor(&cursor, tu) + }) + } else { + None + }; + let mangling = cursor_mangling(&cursor); diff --git a/tests/expectations/tests/constant-evaluate.rs b/tests/expectations/tests/constant-evaluate.rs new file mode 100644 index 0000000000..ec95301894 --- /dev/null +++ b/tests/expectations/tests/constant-evaluate.rs @@ -0,0 +1,12 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const foo: _bindgen_ty_1 = _bindgen_ty_1::foo; +pub const bar: _bindgen_ty_1 = _bindgen_ty_1::bar; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum _bindgen_ty_1 { foo = 4, bar = 8, } +pub const BAZ: ::std::os::raw::c_longlong = 24; diff --git a/tests/headers/constant-evaluate.h b/tests/headers/constant-evaluate.h new file mode 100644 index 0000000000..1c6747a6b2 --- /dev/null +++ b/tests/headers/constant-evaluate.h @@ -0,0 +1,7 @@ + +enum { + foo = 4, + bar = 8, +}; + +const long long BAZ = (1 << foo) | bar; From 91faa76c44acb863a8cf4a5237faa75ac21a8dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 15 Nov 2016 13:44:23 +0100 Subject: [PATCH 0095/2291] reformat. --- libbindgen/src/clang.rs | 2 +- libbindgen/src/ir/context.rs | 3 +-- libbindgen/src/ir/ty.rs | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index fb495929f6..32424d407f 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -264,7 +264,7 @@ impl Cursor { /// Given that this cursor's referent is reference type, get the cursor /// pointing to the referenced type. - pub fn referenced(&self) -> Option { + pub fn referenced(&self) -> Option { unsafe { let ret = Cursor { x: clang_getCursorReferenced(self.x), diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 857219780e..a1ec8c708b 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -609,8 +609,7 @@ impl<'ctx> BindgenContext<'ctx> { -> Option { use clangll::{CXCursor_ClassTemplate, CXCursor_ClassTemplatePartialSpecialization, - CXCursor_TypeAliasTemplateDecl, - CXCursor_TypeRef}; + CXCursor_TypeAliasTemplateDecl, CXCursor_TypeRef}; debug!("builtin_or_resolved_ty: {:?}, {:?}, {:?}", ty, location, diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 34af2db502..254568bf67 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -667,7 +667,7 @@ impl Type { TypeKind::TemplateAlias(inner.unwrap(), args) } CXCursor_TemplateRef => { - let referenced = location.referenced().expect("expected value, got none"); + let referenced = location.referenced().unwrap(); let referenced_ty = referenced.cur_type(); let referenced_declaration = Some(referenced_ty.declaration()); @@ -679,7 +679,7 @@ impl Type { ctx); } CXCursor_TypeRef => { - let referenced = location.referenced().expect("expected value, got none"); + let referenced = location.referenced().unwrap(); let referenced_ty = referenced.cur_type(); let referenced_declaration = Some(referenced_ty.declaration()); From 824f99a67721584b43544ed561236e6bbec24fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 15 Nov 2016 14:29:46 +0100 Subject: [PATCH 0096/2291] Multiple constant generation evaluation improvements. --- libbindgen/src/clang.rs | 22 +++++- libbindgen/src/codegen/helpers.rs | 33 ++++++++ libbindgen/src/codegen/mod.rs | 43 +++++++++- libbindgen/src/ir/item.rs | 6 +- libbindgen/src/ir/ty.rs | 8 ++ libbindgen/src/ir/var.rs | 79 +++++++++++++------ .../expectations/tests/constant-evaluate.rs | 3 + .../tests/expectations/tests/macro_const.rs | 12 +++ ..._alias_partial_template_especialization.rs | 0 .../tests/type_alias_template_specialized.rs | 0 libbindgen/tests/headers/constant-evaluate.h | 11 +++ libbindgen/tests/headers/macro_const.h | 7 ++ ...alias_partial_template_especialization.hpp | 0 .../type_alias_template_specialized.hpp | 0 libbindgen/tests/tests.rs | 60 ++++++++++---- tests/headers/constant-evaluate.h | 7 -- 16 files changed, 237 insertions(+), 54 deletions(-) rename {tests => libbindgen/tests}/expectations/tests/constant-evaluate.rs (74%) create mode 100644 libbindgen/tests/expectations/tests/macro_const.rs rename {tests => libbindgen/tests}/expectations/tests/type_alias_partial_template_especialization.rs (100%) rename {tests => libbindgen/tests}/expectations/tests/type_alias_template_specialized.rs (100%) create mode 100644 libbindgen/tests/headers/constant-evaluate.h create mode 100644 libbindgen/tests/headers/macro_const.h rename {tests => libbindgen/tests}/headers/type_alias_partial_template_especialization.hpp (100%) rename {tests => libbindgen/tests}/headers/type_alias_template_specialized.hpp (100%) delete mode 100644 tests/headers/constant-evaluate.h diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 32424d407f..da4d3e4b4c 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -1267,6 +1267,7 @@ pub fn extract_clang_version() -> String { unsafe { clang_getClangVersion().into() } } +/// A wrapper for the result of evaluating an expression. #[derive(Debug)] pub struct EvalResult { x: CXEvalResult, @@ -1274,12 +1275,19 @@ pub struct EvalResult { #[cfg(feature = "llvm_stable")] impl EvalResult { + /// Create a dummy EvalResult. pub fn new(_: Cursor) -> Self { EvalResult { x: ::std::ptr::null_mut(), } } + /// Not useful in llvm 3.8. + pub fn as_double(&self) -> Option { + None + } + + /// Not useful in llvm 3.8. pub fn as_int(&self) -> Option { None } @@ -1287,16 +1295,28 @@ impl EvalResult { #[cfg(not(feature = "llvm_stable"))] impl EvalResult { + /// Evaluate `cursor` and return the result. pub fn new(cursor: Cursor) -> Self { EvalResult { x: unsafe { clang_Cursor_Evaluate(cursor.x) }, } } - pub fn kind(&self) -> Enum_CXEvalResultKind { + fn kind(&self) -> Enum_CXEvalResultKind { unsafe { clang_EvalResult_getKind(self.x) } } + /// Try to get back the result as a double. + pub fn as_double(&self) -> Option { + match self.kind() { + CXEval_Float => { + Some(unsafe { clang_EvalResult_getAsDouble(self.x) } as f64) + } + _ => None, + } + } + + /// Try to get back the result as an integer. pub fn as_int(&self) -> Option { match self.kind() { CXEval_Int => { diff --git a/libbindgen/src/codegen/helpers.rs b/libbindgen/src/codegen/helpers.rs index 6e5a6f0e31..8c3d3cea7c 100644 --- a/libbindgen/src/codegen/helpers.rs +++ b/libbindgen/src/codegen/helpers.rs @@ -132,4 +132,37 @@ pub mod ast_ty { expr.int(val) } } + + pub fn byte_array_expr(bytes: &[u8]) -> P { + let mut vec = Vec::with_capacity(bytes.len() + 1); + for byte in bytes { + vec.push(int_expr(*byte as i64)); + } + vec.push(int_expr(0)); + + let kind = ast::ExprKind::Vec(vec); + + aster::AstBuilder::new().expr().build_expr_kind(kind) + } + + pub fn cstr_expr(mut string: String) -> P { + string.push('\0'); + aster::AstBuilder::new() + .expr() + .build_lit(aster::AstBuilder::new().lit().byte_str(string)) + } + + pub fn float_expr(f: f64) -> P { + use aster::str::ToInternedString; + let mut string = f.to_string(); + + // So it gets properly recognised as a floating point constant. + if !string.contains('.') { + string.push('.'); + } + + let interned_str = string.as_str().to_interned_string(); + let kind = ast::LitKind::FloatUnsuffixed(interned_str); + aster::AstBuilder::new().expr().lit().build_lit(kind) + } } diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 99ec56f456..ceb023f796 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -304,6 +304,7 @@ impl CodeGenerator for Var { ctx: &BindgenContext, result: &mut CodegenResult, item: &Item) { + use ir::var::VarType; debug!("::codegen: item = {:?}", item); let canonical_name = item.canonical_name(ctx); @@ -320,10 +321,44 @@ impl CodeGenerator for Var { .item() .pub_() .const_(canonical_name) - .expr() - .build(helpers::ast_ty::int_expr(val)) - .build(ty); - result.push(const_item) + .expr(); + let item = match *val { + VarType::Int(val) => { + const_item.build(helpers::ast_ty::int_expr(val)) + .build(ty) + } + VarType::String(ref bytes) => { + // Account the trailing zero. + // + // TODO: Here we ignore the type we just made up, probably + // we should refactor how the variable type and ty id work. + let len = bytes.len() + 1; + let ty = quote_ty!(ctx.ext_cx(), [u8; $len]); + + match String::from_utf8(bytes.clone()) { + Ok(string) => { + const_item.build(helpers::ast_ty::cstr_expr(string)) + .build(quote_ty!(ctx.ext_cx(), &'static $ty)) + } + Err(..) => { + const_item + .build(helpers::ast_ty::byte_array_expr(bytes)) + .build(ty) + } + } + } + VarType::Float(f) => { + const_item.build(helpers::ast_ty::float_expr(f)) + .build(ty) + } + VarType::Char(c) => { + const_item + .build(aster::AstBuilder::new().expr().lit().byte(c)) + .build(ty) + } + }; + + result.push(item); } else { let mut attrs = vec![]; if let Some(mangled) = self.mangled_name() { diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 1f05f92f39..253db8c005 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -840,11 +840,7 @@ impl ClangItemParser for Item { ctx: &mut BindgenContext) -> ItemId { let id = ctx.next_item_id(); - Self::from_ty_or_ref_with_id(id, - ty, - location, - parent_id, - ctx) + Self::from_ty_or_ref_with_id(id, ty, location, parent_id, ctx) } /// Parse a C++ type. If we find a reference to a type that has not been diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 254568bf67..48fd65bbd9 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -123,6 +123,14 @@ impl Type { Self::new(Some(name), None, kind, false) } + /// Is this an floating point type? + pub fn is_float(&self) -> bool { + match self.kind { + TypeKind::Float(..) => true, + _ => false, + } + } + /// Is this an integer type? pub fn is_integer(&self) -> bool { match self.kind { diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index c4f1f750f2..5110051449 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -8,7 +8,15 @@ use super::context::{BindgenContext, ItemId}; use super::function::cursor_mangling; use super::int::IntKind; use super::item::Item; -use super::ty::TypeKind; +use super::ty::{FloatKind, TypeKind}; + +#[derive(Debug)] +pub enum VarType { + Int(i64), + Float(f64), + Char(u8), + String(Vec), +} /// A `Var` is our intermediate representation of a variable. #[derive(Debug)] @@ -19,9 +27,8 @@ pub struct Var { mangled_name: Option, /// The type of the variable. ty: ItemId, - /// TODO: support non-integer constants? - /// The integer value of the variable. - val: Option, + /// The value of the variable, that needs to be suitable for `ty`. + val: Option, /// Whether this variable is const. is_const: bool, } @@ -31,7 +38,7 @@ impl Var { pub fn new(name: String, mangled: Option, ty: ItemId, - val: Option, + val: Option, is_const: bool) -> Var { assert!(!name.is_empty()); @@ -50,8 +57,8 @@ impl Var { } /// The value of this constant variable, if any. - pub fn val(&self) -> Option { - self.val + pub fn val(&self) -> Option<&VarType> { + self.val.as_ref() } /// Get this variable's type. @@ -76,6 +83,7 @@ impl ClangSubItemParser for Var { -> Result, ParseError> { use clangll::*; use cexpr::expr::EvalResult; + use cexpr::literal::CChar; match cursor.kind() { CXCursor_MacroDefinition => { let value = parse_macro(ctx, &cursor, ctx.translation_unit()); @@ -105,13 +113,32 @@ impl ClangSubItemParser for Var { // enforce utf8 there, so we should have already panicked at // this point. let name = String::from_utf8(id).unwrap(); - let (int_kind, val) = match value { - // TODO(emilio): Handle the non-invalid ones! - EvalResult::Float(..) | - EvalResult::Char(..) | - EvalResult::Str(..) | + let (type_kind, val) = match value { EvalResult::Invalid => return Err(ParseError::Continue), - + EvalResult::Float(f) => { + (TypeKind::Float(FloatKind::Float), VarType::Float(f)) + } + EvalResult::Char(c) => { + let c = match c { + CChar::Char(c) => { + assert_eq!(c.len_utf8(), 1); + c as u8 + } + CChar::Raw(c) => { + assert!(c <= ::std::u8::MAX as u64); + c as u8 + } + }; + + (TypeKind::Int(IntKind::U8), VarType::Char(c)) + } + EvalResult::Str(val) => { + let char_ty = + Item::builtin_type(TypeKind::Int(IntKind::U8), + true, + ctx); + (TypeKind::Pointer(char_ty), VarType::String(val)) + } EvalResult::Int(Wrapping(value)) => { let kind = ctx.options() .type_chooser @@ -131,11 +158,11 @@ impl ClangSubItemParser for Var { } }); - (kind, value) + (TypeKind::Int(kind), VarType::Int(value)) } }; - let ty = Item::builtin_type(TypeKind::Int(int_kind), true, ctx); + let ty = Item::builtin_type(type_kind, true, ctx); Ok(ParseResult::New(Var::new(name, None, ty, Some(val), true), Some(cursor))) @@ -159,11 +186,16 @@ impl ClangSubItemParser for Var { // tests/headers/inner_const.hpp // // That's fine because in that case we know it's not a literal. - let is_integer = ctx.safe_resolve_type(ty) - .and_then(|t| t.safe_canonical_type(ctx)) - .map(|t| t.is_integer()) - .unwrap_or(false); + let canonical_ty = ctx.safe_resolve_type(ty) + .and_then(|t| t.safe_canonical_type(ctx)); + let is_integer = canonical_ty.map_or(false, |t| t.is_integer()); + let is_float = canonical_ty.map_or(false, |t| t.is_float()); + + // TODO: We could handle `char` more gracefully. + // TODO: Strings, though the lookup is a bit more hard (we need + // to look at the canonical type of the pointee too, and check + // is char, u8, or i8 I guess). let value = if is_integer { cursor.evaluate() .as_int() @@ -172,16 +204,19 @@ impl ClangSubItemParser for Var { let tu = ctx.translation_unit(); get_integer_literal_from_cursor(&cursor, tu) }) + .map(VarType::Int) + } else if is_float { + cursor.evaluate() + .as_double() + .map(VarType::Float) } else { None }; - let mangling = cursor_mangling(&cursor); - let var = Var::new(name, mangling, ty, value, is_const); - Ok(ParseResult::New(var, Some(cursor))) + Ok(ParseResult::New(var, Some(cursor))) } _ => { /* TODO */ diff --git a/tests/expectations/tests/constant-evaluate.rs b/libbindgen/tests/expectations/tests/constant-evaluate.rs similarity index 74% rename from tests/expectations/tests/constant-evaluate.rs rename to libbindgen/tests/expectations/tests/constant-evaluate.rs index ec95301894..27b8d8296c 100644 --- a/tests/expectations/tests/constant-evaluate.rs +++ b/libbindgen/tests/expectations/tests/constant-evaluate.rs @@ -10,3 +10,6 @@ pub const bar: _bindgen_ty_1 = _bindgen_ty_1::bar; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum _bindgen_ty_1 { foo = 4, bar = 8, } pub const BAZ: ::std::os::raw::c_longlong = 24; +pub const fuzz: f64 = 51.; +pub const BAZZ: ::std::os::raw::c_char = 53; +pub const WAT: ::std::os::raw::c_char = 0; diff --git a/libbindgen/tests/expectations/tests/macro_const.rs b/libbindgen/tests/expectations/tests/macro_const.rs new file mode 100644 index 0000000000..9e7eb420ed --- /dev/null +++ b/libbindgen/tests/expectations/tests/macro_const.rs @@ -0,0 +1,12 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const foo: &'static [u8; 4usize] = b"bar\x00"; +pub const CHAR: u8 = b'b'; +pub const CHARR: u8 = b'\x00'; +pub const FLOAT: f32 = 5.09; +pub const FLOAT_EXPR: f32 = 0.005; +pub const INVALID_UTF8: [u8; 5usize] = [240, 40, 140, 40, 0]; diff --git a/tests/expectations/tests/type_alias_partial_template_especialization.rs b/libbindgen/tests/expectations/tests/type_alias_partial_template_especialization.rs similarity index 100% rename from tests/expectations/tests/type_alias_partial_template_especialization.rs rename to libbindgen/tests/expectations/tests/type_alias_partial_template_especialization.rs diff --git a/tests/expectations/tests/type_alias_template_specialized.rs b/libbindgen/tests/expectations/tests/type_alias_template_specialized.rs similarity index 100% rename from tests/expectations/tests/type_alias_template_specialized.rs rename to libbindgen/tests/expectations/tests/type_alias_template_specialized.rs diff --git a/libbindgen/tests/headers/constant-evaluate.h b/libbindgen/tests/headers/constant-evaluate.h new file mode 100644 index 0000000000..2790d603c1 --- /dev/null +++ b/libbindgen/tests/headers/constant-evaluate.h @@ -0,0 +1,11 @@ +// bindgen-unstable + +enum { + foo = 4, + bar = 8, +}; + +const long long BAZ = (1 << foo) | bar; +const double fuzz = (1 + 50.0f); +const char BAZZ = '5'; +const char WAT = '\0'; diff --git a/libbindgen/tests/headers/macro_const.h b/libbindgen/tests/headers/macro_const.h new file mode 100644 index 0000000000..c28a3f6bc8 --- /dev/null +++ b/libbindgen/tests/headers/macro_const.h @@ -0,0 +1,7 @@ +#define foo "bar" +#define CHAR 'b' +#define CHARR '\0' +#define FLOAT 5.09f +#define FLOAT_EXPR (5 / 1000.0f) + +#define INVALID_UTF8 "\xf0\x28\x8c\x28" diff --git a/tests/headers/type_alias_partial_template_especialization.hpp b/libbindgen/tests/headers/type_alias_partial_template_especialization.hpp similarity index 100% rename from tests/headers/type_alias_partial_template_especialization.hpp rename to libbindgen/tests/headers/type_alias_partial_template_especialization.hpp diff --git a/tests/headers/type_alias_template_specialized.hpp b/libbindgen/tests/headers/type_alias_template_specialized.hpp similarity index 100% rename from tests/headers/type_alias_template_specialized.hpp rename to libbindgen/tests/headers/type_alias_template_specialized.hpp diff --git a/libbindgen/tests/tests.rs b/libbindgen/tests/tests.rs index c07864062b..cb26c88a4e 100644 --- a/libbindgen/tests/tests.rs +++ b/libbindgen/tests/tests.rs @@ -7,7 +7,7 @@ extern crate log; extern crate shlex; use std::fs; -use std::io::{BufRead, BufReader, Error, ErrorKind, Read}; +use std::io::{BufRead, BufReader, Error, ErrorKind, Read, Write}; use std::path::PathBuf; #[path="../../src/options.rs"] @@ -35,11 +35,18 @@ fn compare_generated_header(header: &PathBuf, }; let mut buffer = String::new(); - let f = try!(fs::File::open(&expected)); - let _ = try!(BufReader::new(f).read_to_string(&mut buffer)); + { + if let Ok(expected_file) = fs::File::open(&expected) { + try!(BufReader::new(expected_file).read_to_string(&mut buffer)); + } + } if output == buffer { - return Ok(()); + if !output.is_empty() { + return Ok(()); + } + return Err(Error::new(ErrorKind::Other, + "Something's gone really wrong!")) } println!("diff expected generated"); @@ -53,21 +60,34 @@ fn compare_generated_header(header: &PathBuf, diff::Result::Right(r) => println!("+{}", r), } } + + // Override the diff. + { + let mut expected_file = try!(fs::File::create(&expected)); + try!(expected_file.write_all(output.as_bytes())); + } + Err(Error::new(ErrorKind::Other, "Header and binding differ!")) } fn create_bindgen_builder(header: &PathBuf) - -> Result { + -> Result, Error> { let source = try!(fs::File::open(header)); let reader = BufReader::new(source); // Scoop up bindgen-flags from test header - let line: String = try!(reader.lines().take(1).collect()); - let flags: Vec = if line.contains("bindgen-flags:") { - line.split("bindgen-flags:").last().and_then(shlex::split) - } else { - None - }.unwrap_or(Vec::with_capacity(2)); + let mut flags = Vec::with_capacity(2); + + for line in reader.lines().take(2) { + let line = try!(line); + if line.contains("bindgen-flags: ") { + let extra_flags = line.split("bindgen-flags: ") + .last().and_then(shlex::split).unwrap(); + flags.extend(extra_flags.into_iter()); + } else if line.contains("bindgen-unstable") && cfg!(feature = "llvm_stable") { + return Ok(None) + } + } // Fool builder_from_flags() into believing it has real env::args_os... // - add "bindgen" as executable name 0th element @@ -89,7 +109,8 @@ fn create_bindgen_builder(header: &PathBuf) .map(ToString::to_string) .chain(flags.into_iter()); - builder_from_flags(args).map(|(builder, _)| builder.no_unstable_rust()) + builder_from_flags(args) + .map(|(builder, _)| Some(builder.no_unstable_rust())) } macro_rules! test_header { @@ -97,9 +118,18 @@ macro_rules! test_header { #[test] fn $function() { let header = PathBuf::from($header); - let _ = create_bindgen_builder(&header) - .and_then(|builder| compare_generated_header(&header, builder)) - .map_err(|err| panic!(format!("{}", err)) ); + let result = create_bindgen_builder(&header) + .and_then(|builder| { + if let Some(builder) = builder { + compare_generated_header(&header, builder) + } else { + Ok(()) + } + }); + + if let Err(err) = result { + panic!("{}", err); + } } ) } diff --git a/tests/headers/constant-evaluate.h b/tests/headers/constant-evaluate.h deleted file mode 100644 index 1c6747a6b2..0000000000 --- a/tests/headers/constant-evaluate.h +++ /dev/null @@ -1,7 +0,0 @@ - -enum { - foo = 4, - bar = 8, -}; - -const long long BAZ = (1 << foo) | bar; From b348e73b81f9b5fa350defe313810c2770063827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 15 Nov 2016 21:24:06 +0100 Subject: [PATCH 0097/2291] Don't ignore errors in the test suite. --- libbindgen/build.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libbindgen/build.rs b/libbindgen/build.rs index 228a7f2212..98bb76a9bc 100644 --- a/libbindgen/build.rs +++ b/libbindgen/build.rs @@ -38,13 +38,14 @@ mod testgen { .replace(|c| !char::is_alphanumeric(c), "_") .replace("__", "_") .to_lowercase(); - let _ = writeln!(dst, "test_header!(header_{}, {:?});", - func, entry.path()); + writeln!(dst, "test_header!(header_{}, {:?});", + func, entry.path()).unwrap(); } _ => {} } } - let _ = dst.flush(); + + dst.flush().unwrap(); } } From 9380ed5a917b92858cc61b38ec2e300ab08a2337 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 15 Nov 2016 21:46:17 +0100 Subject: [PATCH 0098/2291] ir: var: Missing docs. --- libbindgen/src/ir/var.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index 5110051449..3270b33216 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -10,11 +10,16 @@ use super::int::IntKind; use super::item::Item; use super::ty::{FloatKind, TypeKind}; +/// The type for a constant variable. #[derive(Debug)] pub enum VarType { + /// An integer. Int(i64), + /// A floating point number. Float(f64), + /// A character. Char(u8), + /// A string, not necessarily well-formed utf-8. String(Vec), } From a949b5ceef6cf538af59698238f65efa2989ae3c Mon Sep 17 00:00:00 2001 From: Jeff Waugh Date: Wed, 16 Nov 2016 09:27:13 +1100 Subject: [PATCH 0099/2291] libbindgen: Make logging optional Note that the log crate isn't completely banished, as other is required by other dependencies. --- libbindgen/Cargo.toml | 12 ++++++++++-- libbindgen/src/lib.rs | 8 +++++++- libbindgen/src/log_stubs.rs | 30 ++++++++++++++++++++++++++++++ libbindgen/tests/tests.rs | 3 --- 4 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 libbindgen/src/log_stubs.rs diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 664ece6e6b..e275100b1d 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -28,8 +28,6 @@ cfg-if = "0.1.0" clang-sys = "0.8.0" lazy_static = "0.1.*" libc = "0.2" -log = "0.3" -env_logger = "0.3" rustc-serialize = "0.3.19" syntex_syntax = "0.44" regex = "0.1" @@ -43,12 +41,22 @@ version = "0.28" optional = true version = "*" +[dependencies.env_logger] +optional = true +version = "0.3" + +[dependencies.log] +optional = true +version = "0.3" + [dependencies.quasi] features = ["with-syntex"] version = "0.20" [features] +default = ["logging"] llvm_stable = [] +logging = ["env_logger", "log"] static = [] # This feature only exists for CI -- don't use it! _docs = [] diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index e4923b77dd..84c6931079 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -29,9 +29,15 @@ extern crate clang_sys; extern crate libc; extern crate regex; #[macro_use] +extern crate lazy_static; + +#[cfg(feature = "logging")] +#[macro_use] extern crate log; + +#[cfg(not(feature = "logging"))] #[macro_use] -extern crate lazy_static; +mod log_stubs; // A macro to declare an internal module for which we *must* provide // documentation for. If we are building with the "_docs" feature, then the diff --git a/libbindgen/src/log_stubs.rs b/libbindgen/src/log_stubs.rs new file mode 100644 index 0000000000..4262e12040 --- /dev/null +++ b/libbindgen/src/log_stubs.rs @@ -0,0 +1,30 @@ +macro_rules! log { + (target: $target:expr, $lvl:expr, $($arg)+) => { + let _ = $target; + let _ = log!($lvl, $($arg)+); + }; + ($lvl:expr, $($arg:tt)+) => { + let _ = $lvl; + let _ = format_args!($($arg)+); + }; +} +macro_rules! error { + (target: $target:expr, $($arg:tt)*) => { log!($target, $($arg)*); }; + ($($arg:tt)*) => { log!("", $($arg)*); }; +} +macro_rules! warn { + (target: $target:expr, $($arg:tt)*) => { log!($target, $($arg)*); }; + ($($arg:tt)*) => { log!("", $($arg)*); }; +} +macro_rules! info { + (target: $target:expr, $($arg:tt)*) => { log!($target, $($arg)*); }; + ($($arg:tt)*) => { log!("", $($arg)*); }; +} +macro_rules! debug { + (target: $target:expr, $($arg:tt)*) => { log!($target, $($arg)*); }; + ($($arg:tt)*) => { log!("", $($arg)*); }; +} +macro_rules! trace { + (target: $target:expr, $($arg:tt)*) => { log!($target, $($arg)*); }; + ($($arg:tt)*) => { log!("", $($arg)*); }; +} diff --git a/libbindgen/tests/tests.rs b/libbindgen/tests/tests.rs index c07864062b..6350328269 100644 --- a/libbindgen/tests/tests.rs +++ b/libbindgen/tests/tests.rs @@ -1,9 +1,6 @@ extern crate clap; extern crate diff; -#[macro_use] -extern crate env_logger; extern crate libbindgen; -extern crate log; extern crate shlex; use std::fs; From 2468fb2baf502159558e83a9457d5d74f793c6fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 16 Nov 2016 14:09:38 +0100 Subject: [PATCH 0100/2291] ir: context: fall back to use the declaration as a key when there's no USR. Apparently MSVC isn't that good at giving us USRs... Fixes #271 --- libbindgen/src/ir/context.rs | 2 +- .../tests/expectations/tests/msvc-no-usr.rs | 19 +++++++++++++++++++ libbindgen/tests/headers/msvc-no-usr.hpp | 8 ++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 libbindgen/tests/expectations/tests/msvc-no-usr.rs create mode 100644 libbindgen/tests/headers/msvc-no-usr.hpp diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index a1ec8c708b..bda3e3c8a5 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -222,7 +222,7 @@ impl<'ctx> BindgenContext<'ctx> { error!("Valid declaration with no USR: {:?}, {:?}", declaration, location); - return; + TypeKey::Declaration(declaration) }; let old = self.types.insert(key, id); diff --git a/libbindgen/tests/expectations/tests/msvc-no-usr.rs b/libbindgen/tests/expectations/tests/msvc-no-usr.rs new file mode 100644 index 0000000000..8cab8cdc2f --- /dev/null +++ b/libbindgen/tests/expectations/tests/msvc-no-usr.rs @@ -0,0 +1,19 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct A { + pub foo: usize, +} +#[test] +fn bindgen_test_layout_A() { + assert_eq!(::std::mem::size_of::
() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for A { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/headers/msvc-no-usr.hpp b/libbindgen/tests/headers/msvc-no-usr.hpp new file mode 100644 index 0000000000..b15e49f52d --- /dev/null +++ b/libbindgen/tests/headers/msvc-no-usr.hpp @@ -0,0 +1,8 @@ + +typedef unsigned long long size_t; + +class A { + const size_t foo; + + A() : foo(5) {} +}; From 19d36d436ec8674604ea53a249fc8a952eab2d33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 16 Nov 2016 22:12:13 +0100 Subject: [PATCH 0101/2291] Address review comments. --- libbindgen/src/clang.rs | 2 +- libbindgen/src/ir/ty.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index da4d3e4b4c..637823ead8 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -1278,7 +1278,7 @@ impl EvalResult { /// Create a dummy EvalResult. pub fn new(_: Cursor) -> Self { EvalResult { - x: ::std::ptr::null_mut(), + x: ptr::null_mut(), } } diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 48fd65bbd9..1cd255a574 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -123,7 +123,7 @@ impl Type { Self::new(Some(name), None, kind, false) } - /// Is this an floating point type? + /// Is this a floating point type? pub fn is_float(&self) -> bool { match self.kind { TypeKind::Float(..) => true, From ea1d6449ec1b0fde9eef2d3f2fe9846c1ac336ff Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Thu, 17 Nov 2016 11:42:01 +1100 Subject: [PATCH 0102/2291] Rerun build script when new test is added --- libbindgen/build.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/libbindgen/build.rs b/libbindgen/build.rs index 98bb76a9bc..36c3aa69c9 100644 --- a/libbindgen/build.rs +++ b/libbindgen/build.rs @@ -24,6 +24,7 @@ mod testgen { let out_dir = Path::new(env!("OUT_DIR")); let mut dst = File::create(Path::new(&out_dir).join("tests.rs")).unwrap(); + println!("cargo:rerun-if-changed=tests/headers"); let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); let headers_dir = manifest_dir.join("tests").join("headers"); From 47cb4e34df94480780ea2dc4d7070eb306f1193b Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Thu, 17 Nov 2016 11:43:10 +1100 Subject: [PATCH 0103/2291] Generate bool value for bool constants This fixes #272. --- libbindgen/src/codegen/helpers.rs | 4 ++++ libbindgen/src/codegen/mod.rs | 4 ++++ libbindgen/src/ir/ty.rs | 8 +++++++ libbindgen/src/ir/var.rs | 8 ++++++- .../tests/expectations/tests/const_bool.rs | 23 +++++++++++++++++++ libbindgen/tests/headers/const_bool.hpp | 9 ++++++++ 6 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 libbindgen/tests/expectations/tests/const_bool.rs create mode 100644 libbindgen/tests/headers/const_bool.hpp diff --git a/libbindgen/src/codegen/helpers.rs b/libbindgen/src/codegen/helpers.rs index 8c3d3cea7c..7284ab80de 100644 --- a/libbindgen/src/codegen/helpers.rs +++ b/libbindgen/src/codegen/helpers.rs @@ -133,6 +133,10 @@ pub mod ast_ty { } } + pub fn bool_expr(val: bool) -> P { + aster::AstBuilder::new().expr().bool(val) + } + pub fn byte_array_expr(bytes: &[u8]) -> P { let mut vec = Vec::with_capacity(bytes.len() + 1); for byte in bytes { diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index ceb023f796..f15b92d15e 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -323,6 +323,10 @@ impl CodeGenerator for Var { .const_(canonical_name) .expr(); let item = match *val { + VarType::Bool(val) => { + const_item.build(helpers::ast_ty::bool_expr(val)) + .build(ty) + } VarType::Int(val) => { const_item.build(helpers::ast_ty::int_expr(val)) .build(ty) diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 1cd255a574..b87dd11bc2 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -131,6 +131,14 @@ impl Type { } } + /// Is this a boolean type? + pub fn is_bool(&self) -> bool { + match self.kind { + TypeKind::Int(IntKind::Bool) => true, + _ => false, + } + } + /// Is this an integer type? pub fn is_integer(&self) -> bool { match self.kind { diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index 3270b33216..98b94da313 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -13,6 +13,8 @@ use super::ty::{FloatKind, TypeKind}; /// The type for a constant variable. #[derive(Debug)] pub enum VarType { + /// An boolean. + Bool(bool), /// An integer. Int(i64), /// A floating point number. @@ -194,6 +196,7 @@ impl ClangSubItemParser for Var { let canonical_ty = ctx.safe_resolve_type(ty) .and_then(|t| t.safe_canonical_type(ctx)); + let is_bool = canonical_ty.map_or(false, |t| t.is_bool()); let is_integer = canonical_ty.map_or(false, |t| t.is_integer()); let is_float = canonical_ty.map_or(false, |t| t.is_float()); @@ -201,7 +204,10 @@ impl ClangSubItemParser for Var { // TODO: Strings, though the lookup is a bit more hard (we need // to look at the canonical type of the pointee too, and check // is char, u8, or i8 I guess). - let value = if is_integer { + let value = if is_bool { + cursor.evaluate().as_int() + .map(|val| VarType::Bool(val != 0)) + } else if is_integer { cursor.evaluate() .as_int() .map(|val| val as i64) diff --git a/libbindgen/tests/expectations/tests/const_bool.rs b/libbindgen/tests/expectations/tests/const_bool.rs new file mode 100644 index 0000000000..8a50a0944e --- /dev/null +++ b/libbindgen/tests/expectations/tests/const_bool.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const k: bool = true; +#[repr(C)] +#[derive(Debug, Copy)] +pub struct A { + pub _address: u8, +} +pub const A_k: bool = false; +#[test] +fn bindgen_test_layout_A() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for A { + fn clone(&self) -> Self { *self } +} +pub type foo = bool; +pub const k2: foo = true; diff --git a/libbindgen/tests/headers/const_bool.hpp b/libbindgen/tests/headers/const_bool.hpp new file mode 100644 index 0000000000..633a7c9077 --- /dev/null +++ b/libbindgen/tests/headers/const_bool.hpp @@ -0,0 +1,9 @@ +// bindgen-unstable + +const bool k = true; +struct A { + static const bool k = false; +}; + +typedef bool foo; +const foo k2 = true; From c007e84e8692cab618519ac4e54f0370c78b6df6 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Thu, 17 Nov 2016 18:06:48 +1100 Subject: [PATCH 0104/2291] Update quasi to 0.21 This is not the latest version, because the latest version doesn't work due to serde-rs/quasi#65. The issue of keeping using 0.20 is that libbindgen depends on aster 0.28 while quasi depends on aster 0.27, which leads to duplicate versions of aster dependency. Updating quasi to 0.21 brings aster to 0.29, which also works for libbindgen. --- libbindgen/Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index e275100b1d..b87f5e1969 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -21,7 +21,7 @@ shlex = "0.1" tests_expectations = { path = "tests/expectations" } [build-dependencies] -quasi_codegen = "0.20" +quasi_codegen = "0.21" [dependencies] cfg-if = "0.1.0" @@ -35,7 +35,7 @@ cexpr = "0.2" [dependencies.aster] features = ["with-syntex"] -version = "0.28" +version = "0.29" [dependencies.clippy] optional = true @@ -51,7 +51,7 @@ version = "0.3" [dependencies.quasi] features = ["with-syntex"] -version = "0.20" +version = "0.21" [features] default = ["logging"] From 06e5f6c8bcc7fba5994a349b9ce88c1063eb4279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 17 Nov 2016 10:50:48 +0100 Subject: [PATCH 0105/2291] ir: Avoid generating out-of-range values in constants. Fixes #274 --- libbindgen/src/codegen/mod.rs | 6 ++-- libbindgen/src/ir/int.rs | 5 +++ libbindgen/src/ir/item.rs | 3 +- libbindgen/src/ir/ty.rs | 4 ++- libbindgen/src/ir/var.rs | 35 +++++++++++-------- .../expectations/tests/constant-evaluate.rs | 3 ++ libbindgen/tests/headers/constant-evaluate.h | 5 +++ 7 files changed, 42 insertions(+), 19 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index f15b92d15e..5a54c113ef 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -228,7 +228,8 @@ impl CodeGenerator for Item { result: &mut CodegenResult, _extra: &()) { if self.is_hidden(ctx) || result.seen(self.id()) { - debug!("::codegen: Ignoring hidden or seen: self = {:?}", self); + debug!("::codegen: Ignoring hidden or seen: \ + self = {:?}", self); return; } @@ -328,8 +329,7 @@ impl CodeGenerator for Var { .build(ty) } VarType::Int(val) => { - const_item.build(helpers::ast_ty::int_expr(val)) - .build(ty) + const_item.build(helpers::ast_ty::int_expr(val)).build(ty) } VarType::String(ref bytes) => { // Account the trailing zero. diff --git a/libbindgen/src/ir/int.rs b/libbindgen/src/ir/int.rs index 2d85db8385..179ebb96ce 100644 --- a/libbindgen/src/ir/int.rs +++ b/libbindgen/src/ir/int.rs @@ -90,4 +90,9 @@ impl IntKind { Custom { is_signed, .. } => is_signed, } } + + /// Whether this type's signedness matches the value. + pub fn signedness_matches(&self, val: i64) -> bool { + val >= 0 || self.is_signed() + } } diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 253db8c005..f464ce4a35 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -1032,7 +1032,8 @@ impl ClangItemParser for Item { // It's harmless, but if we restrict that, then // tests/headers/nsStyleAutoArray.hpp crashes. if let Err(ParseError::Recurse) = result { - warn!("Unknown type, assuming named template type: id = {:?}; spelling = {}", + warn!("Unknown type, assuming named template type: \ + id = {:?}; spelling = {}", id, ty.spelling()); Ok(Self::named_type_with_id(id, diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index b87dd11bc2..60611b8d9f 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -878,7 +878,9 @@ impl TypeCollector for Type { } // FIXME: Pending types! ref other @ _ => { - debug!("::collect_types: Ignoring: {:?}", other); + debug!("::collect_types: Ignoring: \ + {:?}", + other); } } } diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index 98b94da313..bbaea93953 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -13,7 +13,7 @@ use super::ty::{FloatKind, TypeKind}; /// The type for a constant variable. #[derive(Debug)] pub enum VarType { - /// An boolean. + /// A boolean. Bool(bool), /// An integer. Int(i64), @@ -196,7 +196,6 @@ impl ClangSubItemParser for Var { let canonical_ty = ctx.safe_resolve_type(ty) .and_then(|t| t.safe_canonical_type(ctx)); - let is_bool = canonical_ty.map_or(false, |t| t.is_bool()); let is_integer = canonical_ty.map_or(false, |t| t.is_integer()); let is_float = canonical_ty.map_or(false, |t| t.is_float()); @@ -204,18 +203,26 @@ impl ClangSubItemParser for Var { // TODO: Strings, though the lookup is a bit more hard (we need // to look at the canonical type of the pointee too, and check // is char, u8, or i8 I guess). - let value = if is_bool { - cursor.evaluate().as_int() - .map(|val| VarType::Bool(val != 0)) - } else if is_integer { - cursor.evaluate() - .as_int() - .map(|val| val as i64) - .or_else(|| { - let tu = ctx.translation_unit(); - get_integer_literal_from_cursor(&cursor, tu) - }) - .map(VarType::Int) + let value = if is_integer { + let kind = match *canonical_ty.unwrap().kind() { + TypeKind::Int(kind) => kind, + _ => unreachable!(), + }; + + let mut val = + cursor.evaluate().as_int().map(|val| val as i64); + if val.is_none() || !kind.signedness_matches(val.unwrap()) { + let tu = ctx.translation_unit(); + val = get_integer_literal_from_cursor(&cursor, tu); + } + + val.map(|val| { + if kind == IntKind::Bool { + VarType::Bool(val != 0) + } else { + VarType::Int(val) + } + }) } else if is_float { cursor.evaluate() .as_double() diff --git a/libbindgen/tests/expectations/tests/constant-evaluate.rs b/libbindgen/tests/expectations/tests/constant-evaluate.rs index 27b8d8296c..6947be982b 100644 --- a/libbindgen/tests/expectations/tests/constant-evaluate.rs +++ b/libbindgen/tests/expectations/tests/constant-evaluate.rs @@ -9,6 +9,9 @@ pub const bar: _bindgen_ty_1 = _bindgen_ty_1::bar; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum _bindgen_ty_1 { foo = 4, bar = 8, } +pub type EasyToOverflow = ::std::os::raw::c_ulonglong; +pub const k: EasyToOverflow = 2147483648; +pub const k_expr: EasyToOverflow = 0; pub const BAZ: ::std::os::raw::c_longlong = 24; pub const fuzz: f64 = 51.; pub const BAZZ: ::std::os::raw::c_char = 53; diff --git a/libbindgen/tests/headers/constant-evaluate.h b/libbindgen/tests/headers/constant-evaluate.h index 2790d603c1..b6a0492f17 100644 --- a/libbindgen/tests/headers/constant-evaluate.h +++ b/libbindgen/tests/headers/constant-evaluate.h @@ -5,6 +5,11 @@ enum { bar = 8, }; +typedef unsigned long long EasyToOverflow; +const EasyToOverflow k = 0x80000000; + +const EasyToOverflow k_expr = 1ULL << 60; + const long long BAZ = (1 << foo) | bar; const double fuzz = (1 + 50.0f); const char BAZZ = '5'; From e65cd9bf47f52c13522b984426e26b948de9dbe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20HUBSCHER?= Date: Fri, 4 Nov 2016 17:05:23 +0100 Subject: [PATCH 0106/2291] =?UTF-8?q?Attempt=20to=20fix=20#130=20=E2=80=94?= =?UTF-8?q?=20clang::Cursor::args=20should=20return=20an=20Option>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libbindgen/src/clang.rs | 26 ++++++++++++++++++-------- libbindgen/src/ir/function.rs | 2 +- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 637823ead8..6c95b22f3c 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -420,16 +420,26 @@ impl Cursor { /// Given that this cursor's referent is a function, return cursors to its /// parameters. - pub fn args(&self) -> Vec { + pub fn args(&self) -> Option> { + // XXX: We might want to use and keep num_args + // match self.kind() { + // CXCursor_FunctionDecl | + // CXCursor_CXXMethod => { unsafe { - let num = self.num_args().expect("expected value, got none") as u32; - let mut args = vec![]; - for i in 0..num { - args.push(Cursor { - x: clang_Cursor_getArgument(self.x, i as c_uint), - }); + let w = clang_Cursor_getNumArguments(self.x); + if w == -1 { + None + } else { + let num = w as u32; + + let mut args = vec![]; + for i in 0..num { + args.push(Cursor { + x: clang_Cursor_getArgument(self.x, i as c_uint), + }); + } + Some(args) } - args } } diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs index eacb6c0ea8..60bd1e5b75 100644 --- a/libbindgen/src/ir/function.rs +++ b/libbindgen/src/ir/function.rs @@ -150,7 +150,7 @@ impl FunctionSig { CXCursor_CXXMethod => { // For CXCursor_FunctionDecl, cursor.args() is the reliable way // to get parameter names and types. - cursor.args() + cursor.args().expect("It cannot be None because we are in a method/function") .iter() .map(|arg| { let arg_ty = arg.cur_type(); From 4cc53ed6d5196d072f51809c7a3e18493385c606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 18 Nov 2016 00:43:36 +0100 Subject: [PATCH 0107/2291] codegen: Properly mangle bitfield getters. --- libbindgen/src/codegen/mod.rs | 2 +- .../tests/bitfield_method_mangling.rs | 49 +++++++++++++++++++ .../tests/headers/bitfield_method_mangling.h | 5 ++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 libbindgen/tests/expectations/tests/bitfield_method_mangling.rs create mode 100644 libbindgen/tests/headers/bitfield_method_mangling.h diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 5a54c113ef..6c8a36f733 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -596,7 +596,7 @@ impl<'a> Bitfield<'a> { let field_type = field_item.to_rust_ty(ctx); let int_type = BlobTyBuilder::new(field_ty_layout).build(); - let getter_name = ctx.ext_cx().ident_of(&field_name); + let getter_name = ctx.rust_ident(&field_name); let setter_name = ctx.ext_cx() .ident_of(&format!("set_{}", &field_name)); let mask = ((1usize << width) - 1) << offset; diff --git a/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs b/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs new file mode 100644 index 0000000000..5aba8abb08 --- /dev/null +++ b/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs @@ -0,0 +1,49 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct _bindgen_ty_1 { + pub _bitfield_1: u32, +} +#[test] +fn bindgen_test_layout__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize); + assert_eq!(::std::mem::align_of::<_bindgen_ty_1>() , 4usize); +} +impl Clone for _bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +impl _bindgen_ty_1 { + #[inline] + pub fn pad3(&self) -> ::std::os::raw::c_uint { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (16777215usize as u32)) + >> 0u32) as u32) + } + } + #[inline] + pub fn set_pad3(&mut self, val: ::std::os::raw::c_uint) { + self._bitfield_1 &= !(16777215usize as u32); + self._bitfield_1 |= + ((val as u32 as u32) << 0u32) & (16777215usize as u32); + } + #[inline] + pub fn type_(&self) -> ::std::os::raw::c_uint { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & + (4278190080usize as u32)) >> 24u32) as + u32) + } + } + #[inline] + pub fn set_type(&mut self, val: ::std::os::raw::c_uint) { + self._bitfield_1 &= !(4278190080usize as u32); + self._bitfield_1 |= + ((val as u32 as u32) << 24u32) & (4278190080usize as u32); + } +} +pub type mach_msg_type_descriptor_t = _bindgen_ty_1; diff --git a/libbindgen/tests/headers/bitfield_method_mangling.h b/libbindgen/tests/headers/bitfield_method_mangling.h new file mode 100644 index 0000000000..257648ee78 --- /dev/null +++ b/libbindgen/tests/headers/bitfield_method_mangling.h @@ -0,0 +1,5 @@ +typedef struct +{ + unsigned int pad3: 24; + unsigned int type: 8; +} mach_msg_type_descriptor_t; From 0e96de1249dad4a64961fd624c2fc49c84b93354 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 16 Nov 2016 13:02:44 -0800 Subject: [PATCH 0108/2291] Make `ir::Item::is_module` public --- libbindgen/src/ir/item.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 253db8c005..108150e509 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -490,7 +490,8 @@ impl Item { } } - fn is_module(&self) -> bool { + /// Is this item a module? + pub fn is_module(&self) -> bool { match self.kind { ItemKind::Module(..) => true, _ => false, From 2a9341146ff2ae3deef7a39b385360122f406c52 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 15 Nov 2016 14:14:37 -0800 Subject: [PATCH 0109/2291] Include namespaces in mangled symbols When we aren't using `--enable-cxx-namespaces`, we can end up with conflicting struct symbol names that we need to disambiguate. The solution is to mangle the namespaced C++ symbol "foo::bar::Baz" into the Rust "foo_bar_Baz" symbol. --- libbindgen/src/ir/item.rs | 257 +++++++++--------- .../tests/class_with_inner_struct.rs | 28 +- .../tests/expectations/tests/elaborated.rs | 4 +- .../expectations/tests/inherit-namespaced.rs | 2 +- .../expectations/tests/jsval_layout_opaque.rs | 16 +- .../tests/expectations/tests/overloading.rs | 4 +- .../tests/replace_template_alias.rs | 8 +- ...ame_struct_name_in_different_namespaces.rs | 28 ++ .../expectations/tests/struct_with_nesting.rs | 28 +- .../expectations/tests/template_alias.rs | 6 +- .../tests/expectations/tests/typeref.rs | 32 +-- .../expectations/tests/union_with_nesting.rs | 28 +- .../tests/headers/replace_template_alias.hpp | 2 +- ...me_struct_name_in_different_namespaces.hpp | 12 + 14 files changed, 253 insertions(+), 202 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/same_struct_name_in_different_namespaces.rs create mode 100644 libbindgen/tests/headers/same_struct_name_in_different_namespaces.hpp diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 108150e509..013912e390 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -2,8 +2,8 @@ use clang; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; -use regex::Regex; use std::cell::{Cell, RefCell}; +use std::fmt::Write; use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; use super::function::Function; @@ -526,6 +526,108 @@ impl Item { self.as_type().map_or(false, |ty| ty.is_type_ref()) } + /// Get the target item id for name generation. + fn name_target(&self, ctx: &BindgenContext, for_name_checking: bool) -> ItemId { + let mut item = self; + loop { + match *item.kind() { + ItemKind::Type(ref ty) => { + match *ty.kind() { + // If we're a template specialization, our name is our + // parent's name. + TypeKind::Comp(ref ci) if ci.is_template_specialization() => { + item = ctx.resolve_item(ci.specialized_template().unwrap()); + }, + // Same as above. + TypeKind::ResolvedTypeRef(inner) | + TypeKind::TemplateRef(inner, _) => { + item = ctx.resolve_item(inner); + } + // Template aliases use their inner alias type's name if we + // are checking names for whitelisting/replacement/etc. + TypeKind::TemplateAlias(inner, _) if for_name_checking => { + item = ctx.resolve_item(inner); + assert_eq!(item.id(), item.name_target(ctx, for_name_checking)); + return item.id(); + } + _ => return item.id(), + } + }, + _ => return item.id(), + } + } + } + + /// Get this function item's name, or `None` if this item is not a function. + fn func_name(&self) -> Option<&str> { + match *self.kind() { + ItemKind::Function(ref func) => Some(func.name()), + _ => None, + } + } + + /// Get the overload index for this method. If this is not a method, return + /// `None`. + fn method_overload_index(&self, ctx: &BindgenContext) -> Option { + self.func_name().and_then(|func_name| { + let parent = ctx.resolve_item(self.parent_id()); + if let ItemKind::Type(ref ty) = *parent.kind() { + if let TypeKind::Comp(ref ci) = *ty.kind() { + return ci.methods() + .iter() + .filter(|method| { + let item = ctx.resolve_item(method.signature()); + let func = item.expect_function(); + func.name() == func_name + }) + .enumerate() + .find(|&(_, ref method)| method.signature() == self.id()) + .map(|(idx, _)| idx); + } + } + + None + }) + } + + /// Get this item's base name (aka non-namespaced name). + /// + /// The `for_name_checking` boolean parameter informs us whether we are + /// asking for the name in order to do a whitelisting/replacement/etc check + /// or if we are instead using it for code generation. + fn base_name(&self, ctx: &BindgenContext, for_name_checking: bool) -> String { + match *self.kind() { + ItemKind::Var(ref var) => var.name().to_owned(), + ItemKind::Module(ref module) => { + module.name() + .map(ToOwned::to_owned) + .unwrap_or_else(|| format!("_bindgen_mod_{}", self.exposed_id(ctx))) + }, + ItemKind::Type(ref ty) => { + let name = match *ty.kind() { + TypeKind::ResolvedTypeRef(..) => + panic!("should have resolved this in name_target()"), + TypeKind::TemplateAlias(..) if !for_name_checking => Some(""), + TypeKind::TemplateAlias(..) => None, + _ => ty.name(), + }; + name.map(ToOwned::to_owned) + .unwrap_or_else(|| format!("_bindgen_ty_{}", self.exposed_id(ctx))) + } + ItemKind::Function(ref fun) => { + let mut name = fun.name().to_owned(); + + if let Some(idx) = self.method_overload_index(ctx) { + if idx > 0 { + write!(&mut name, "{}", idx).unwrap(); + } + } + + name + }, + } + } + /// Get the canonical name without taking into account the replaces /// annotation. /// @@ -539,102 +641,38 @@ impl Item { /// type and the parent chain, since it should be consistent. pub fn real_canonical_name(&self, ctx: &BindgenContext, - count_namespaces: bool, + within_namespace: bool, for_name_checking: bool) -> String { - let base_name = match *self.kind() { - ItemKind::Type(ref ty) => { - match *ty.kind() { - // If we're a template specialization, our name is our - // parent's. - TypeKind::Comp(ref ci) - if ci.is_template_specialization() => { - return ci.specialized_template().unwrap() - .canonical_name(ctx); - }, - // Same as above - TypeKind::ResolvedTypeRef(inner) | - TypeKind::TemplateRef(inner, _) => { - return inner.canonical_name(ctx); - } - // If we're a named type, we don't need to mangle it, and we - // should be able to assert we're not top level. - TypeKind::Named(ref name, _) => { - return name.to_owned(); - } - // We call codegen on the inner type, but we do not want - // this alias's name to appear in the canonical name just - // because it is in the inner type's parent chain, so we use - // an empty base name. - // - // Note that this would be incorrect if this type could be - // referenced from, let's say, a member variable, but in - // that case the referenced type is the inner alias, so - // we're good there. If we wouldn't, a more complex solution - // would be needed. - TypeKind::TemplateAlias(inner, _) => { - if for_name_checking { - return ctx.resolve_item(inner) - .real_canonical_name(ctx, - count_namespaces, - false); - } - Some("") - } - // Else use the proper name, or fallback to a name with an - // id. - _ => { - ty.name() - } - }.map(ToOwned::to_owned) - } - ItemKind::Function(ref fun) => { - let mut base = fun.name().to_owned(); - - // We might need to deduplicate if we're a method. - let parent = ctx.resolve_item(self.parent_id()); - if let ItemKind::Type(ref ty) = *parent.kind() { - if let TypeKind::Comp(ref ci) = *ty.kind() { - let mut count = 0; - let mut found = false; - for method in ci.methods() { - if method.signature() == self.id() { - found = true; - break; - } - let fun = ctx.resolve_item(method.signature()) - .expect_function(); - if fun.name() == base { - count += 1; - } - } - - assert!(found, "Method not found?"); - if count != 0 { - base.push_str(&count.to_string()); - } - } - } - Some(base) - } - ItemKind::Var(ref var) => Some(var.name().to_owned()), - ItemKind::Module(ref module) => { - module.name().map(ToOwned::to_owned) - } - }; + let target = ctx.resolve_item(self.name_target(ctx, for_name_checking)); + let base_name = target.base_name(ctx, for_name_checking); - let parent = ctx.resolve_item(self.parent_id()); - let parent_is_namespace = parent.is_module(); + // Named template type arguments are never namespaced, and never + // mangled. + if target.as_type().map_or(false, |ty| ty.is_named()) { + return base_name; + } - if self.is_toplevel(ctx) || (parent_is_namespace && count_namespaces) { - let base_name = self.make_exposed_name(None, base_name, ctx); + if within_namespace { return ctx.rust_mangle(&base_name).into_owned(); } - // TODO: allow modification of the mangling functions, maybe even per - // item type? - let parent_name = parent.canonical_name(ctx); - self.make_exposed_name(Some(parent_name), base_name, ctx) + // Concatenate this item's ancestors' names together. + let mut names: Vec<_> = target.parent_id() + .ancestors(ctx) + .filter(|id| *id != ctx.root_module()) + .map(|id| { + let item = ctx.resolve_item(id); + let target = ctx.resolve_item(item.name_target(ctx, false)); + target.base_name(ctx, false) + }) + .filter(|name| !name.is_empty()) + .collect(); + names.reverse(); + names.push(base_name); + let name = names.join("_"); + + ctx.rust_mangle(&name).into_owned() } fn exposed_id(&self, ctx: &BindgenContext) -> String { @@ -655,45 +693,6 @@ impl Item { format!("id_{}", self.id().as_usize()) } - fn make_exposed_name(&self, - parent_name: Option, - base_name: Option, - ctx: &BindgenContext) - -> String { - lazy_static! { - static ref RE_ENDS_WITH_BINDGEN_TY: Regex = - Regex::new(r"_bindgen_ty(_\d+)+$").unwrap(); - - static ref RE_ENDS_WITH_BINDGEN_MOD: Regex = - Regex::new(r"_bindgen_mod(_\d+)+$").unwrap(); - } - - let (re, kind) = match *self.kind() { - ItemKind::Module(..) => (&*RE_ENDS_WITH_BINDGEN_MOD, "mod"), - _ => (&*RE_ENDS_WITH_BINDGEN_TY, "ty"), - }; - - let parent_name = - parent_name.and_then(|n| if n.is_empty() { None } else { Some(n) }); - match (parent_name, base_name) { - (Some(parent), Some(base)) => format!("{}_{}", parent, base), - (Some(parent), None) => { - if re.is_match(parent.as_str()) { - format!("{}_{}", parent, self.exposed_id(ctx)) - } else { - format!("{}__bindgen_{}_{}", - parent, - kind, - self.exposed_id(ctx)) - } - } - (None, Some(base)) => base, - (None, None) => { - format!("_bindgen_{}_{}", kind, self.exposed_id(ctx)) - } - } - } - /// Get a mutable reference to this item's `Module`, or `None` if this is /// not a `Module` item. pub fn as_module_mut(&mut self) -> Option<&mut Module> { diff --git a/libbindgen/tests/expectations/tests/class_with_inner_struct.rs b/libbindgen/tests/expectations/tests/class_with_inner_struct.rs index ab51396dbf..a1bacbdb78 100644 --- a/libbindgen/tests/expectations/tests/class_with_inner_struct.rs +++ b/libbindgen/tests/expectations/tests/class_with_inner_struct.rs @@ -129,38 +129,42 @@ pub struct C { #[repr(C)] #[derive(Debug, Copy)] pub struct C__bindgen_ty_1 { - pub mFunc: __BindgenUnionField, - pub __bindgen_anon_1: __BindgenUnionField, + pub mFunc: __BindgenUnionField, + pub __bindgen_anon_1: __BindgenUnionField, pub bindgen_union_field: [u32; 4usize], } #[repr(C)] #[derive(Debug, Copy)] -pub struct C__bindgen_ty_1_1 { +pub struct C__bindgen_ty_1__bindgen_ty_1 { pub mX1: f32, pub mY1: f32, pub mX2: f32, pub mY2: f32, } #[test] -fn bindgen_test_layout_C__bindgen_ty_1_1() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 4usize); +fn bindgen_test_layout_C__bindgen_ty_1__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 16usize); + assert_eq!(::std::mem::align_of::() , + 4usize); } -impl Clone for C__bindgen_ty_1_1 { +impl Clone for C__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[repr(C)] #[derive(Debug, Copy)] -pub struct C__bindgen_ty_1_2 { +pub struct C__bindgen_ty_1__bindgen_ty_2 { pub mStepSyntax: StepSyntax, pub mSteps: ::std::os::raw::c_uint, } #[test] -fn bindgen_test_layout_C__bindgen_ty_1_2() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); +fn bindgen_test_layout_C__bindgen_ty_1__bindgen_ty_2() { + assert_eq!(::std::mem::size_of::() , + 8usize); + assert_eq!(::std::mem::align_of::() , + 4usize); } -impl Clone for C__bindgen_ty_1_2 { +impl Clone for C__bindgen_ty_1__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] diff --git a/libbindgen/tests/expectations/tests/elaborated.rs b/libbindgen/tests/expectations/tests/elaborated.rs index db373d41b7..0e8f4ee55f 100644 --- a/libbindgen/tests/expectations/tests/elaborated.rs +++ b/libbindgen/tests/expectations/tests/elaborated.rs @@ -4,8 +4,8 @@ #![allow(non_snake_case)] -pub type whatever_t = ::std::os::raw::c_int; +pub type whatever_whatever_t = ::std::os::raw::c_int; extern "C" { #[link_name = "_Z9somethingPKi"] - pub fn something(wat: *const whatever_t); + pub fn something(wat: *const whatever_whatever_t); } diff --git a/libbindgen/tests/expectations/tests/inherit-namespaced.rs b/libbindgen/tests/expectations/tests/inherit-namespaced.rs index a58058b002..c0d2e5a643 100644 --- a/libbindgen/tests/expectations/tests/inherit-namespaced.rs +++ b/libbindgen/tests/expectations/tests/inherit-namespaced.rs @@ -6,7 +6,7 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct RootedBase { +pub struct js_RootedBase { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } diff --git a/libbindgen/tests/expectations/tests/jsval_layout_opaque.rs b/libbindgen/tests/expectations/tests/jsval_layout_opaque.rs index 91f898af88..530fdb22c5 100644 --- a/libbindgen/tests/expectations/tests/jsval_layout_opaque.rs +++ b/libbindgen/tests/expectations/tests/jsval_layout_opaque.rs @@ -154,24 +154,24 @@ impl jsval_layout__bindgen_ty_1 { #[repr(C)] #[derive(Debug, Copy)] pub struct jsval_layout__bindgen_ty_2 { - pub payload: jsval_layout__bindgen_ty_2_1, + pub payload: jsval_layout__bindgen_ty_2__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Copy)] -pub struct jsval_layout__bindgen_ty_2_1 { +pub struct jsval_layout__bindgen_ty_2__bindgen_ty_1 { pub i32: __BindgenUnionField, pub u32: __BindgenUnionField, pub why: __BindgenUnionField, pub bindgen_union_field: u32, } #[test] -fn bindgen_test_layout_jsval_layout__bindgen_ty_2_1() { - assert_eq!(::std::mem::size_of::() , - 4usize); - assert_eq!(::std::mem::align_of::() , - 4usize); +fn bindgen_test_layout_jsval_layout__bindgen_ty_2__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() + , 4usize); + assert_eq!(::std::mem::align_of::() + , 4usize); } -impl Clone for jsval_layout__bindgen_ty_2_1 { +impl Clone for jsval_layout__bindgen_ty_2__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] diff --git a/libbindgen/tests/expectations/tests/overloading.rs b/libbindgen/tests/expectations/tests/overloading.rs index 4e138e7dac..71002e23bc 100644 --- a/libbindgen/tests/expectations/tests/overloading.rs +++ b/libbindgen/tests/expectations/tests/overloading.rs @@ -15,9 +15,9 @@ extern "C" { } extern "C" { #[link_name = "_ZN3foo10MyFunctionEv"] - pub fn MyFunction(); + pub fn foo_MyFunction(); } extern "C" { #[link_name = "_ZN3bar10MyFunctionEv"] - pub fn MyFunction1(); + pub fn bar_MyFunction(); } diff --git a/libbindgen/tests/expectations/tests/replace_template_alias.rs b/libbindgen/tests/expectations/tests/replace_template_alias.rs index 61a2fbccea..b9a0d0c986 100644 --- a/libbindgen/tests/expectations/tests/replace_template_alias.rs +++ b/libbindgen/tests/expectations/tests/replace_template_alias.rs @@ -6,10 +6,10 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct Rooted { - pub ptr: MaybeWrapped, +pub struct JS_Rooted { + pub ptr: JS_detail_MaybeWrapped, } /// But the replacement type does use T! /// -///
-pub type MaybeWrapped = T; +///
+pub type JS_detail_MaybeWrapped = T; diff --git a/libbindgen/tests/expectations/tests/same_struct_name_in_different_namespaces.rs b/libbindgen/tests/expectations/tests/same_struct_name_in_different_namespaces.rs new file mode 100644 index 0000000000..8e7c177b8a --- /dev/null +++ b/libbindgen/tests/expectations/tests/same_struct_name_in_different_namespaces.rs @@ -0,0 +1,28 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct JS_Zone { + pub _address: u8, +} +impl Clone for JS_Zone { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct JS_shadow_Zone { + pub x: ::std::os::raw::c_int, + pub y: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_JS_shadow_Zone() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for JS_shadow_Zone { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/expectations/tests/struct_with_nesting.rs b/libbindgen/tests/expectations/tests/struct_with_nesting.rs index 97a0949ea2..b3e0a5ca88 100644 --- a/libbindgen/tests/expectations/tests/struct_with_nesting.rs +++ b/libbindgen/tests/expectations/tests/struct_with_nesting.rs @@ -38,38 +38,42 @@ pub struct foo { #[derive(Debug, Copy)] pub struct foo__bindgen_ty_1 { pub b: __BindgenUnionField<::std::os::raw::c_uint>, - pub __bindgen_anon_1: __BindgenUnionField, - pub __bindgen_anon_2: __BindgenUnionField, + pub __bindgen_anon_1: __BindgenUnionField, + pub __bindgen_anon_2: __BindgenUnionField, pub bindgen_union_field: u32, } #[repr(C)] #[derive(Debug, Copy)] -pub struct foo__bindgen_ty_1_1 { +pub struct foo__bindgen_ty_1__bindgen_ty_1 { pub c1: ::std::os::raw::c_ushort, pub c2: ::std::os::raw::c_ushort, } #[test] -fn bindgen_test_layout_foo__bindgen_ty_1_1() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 2usize); +fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 4usize); + assert_eq!(::std::mem::align_of::() , + 2usize); } -impl Clone for foo__bindgen_ty_1_1 { +impl Clone for foo__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[repr(C)] #[derive(Debug, Copy)] -pub struct foo__bindgen_ty_1_2 { +pub struct foo__bindgen_ty_1__bindgen_ty_2 { pub d1: ::std::os::raw::c_uchar, pub d2: ::std::os::raw::c_uchar, pub d3: ::std::os::raw::c_uchar, pub d4: ::std::os::raw::c_uchar, } #[test] -fn bindgen_test_layout_foo__bindgen_ty_1_2() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 1usize); +fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_2() { + assert_eq!(::std::mem::size_of::() , + 4usize); + assert_eq!(::std::mem::align_of::() , + 1usize); } -impl Clone for foo__bindgen_ty_1_2 { +impl Clone for foo__bindgen_ty_1__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] diff --git a/libbindgen/tests/expectations/tests/template_alias.rs b/libbindgen/tests/expectations/tests/template_alias.rs index 6457381f08..d301a11c42 100644 --- a/libbindgen/tests/expectations/tests/template_alias.rs +++ b/libbindgen/tests/expectations/tests/template_alias.rs @@ -4,9 +4,9 @@ #![allow(non_snake_case)] -pub type Wrapped = T; +pub type JS_detail_Wrapped = T; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct Rooted { - pub ptr: Wrapped, +pub struct JS_Rooted { + pub ptr: JS_detail_Wrapped, } diff --git a/libbindgen/tests/expectations/tests/typeref.rs b/libbindgen/tests/expectations/tests/typeref.rs index da9441462c..21217ced12 100644 --- a/libbindgen/tests/expectations/tests/typeref.rs +++ b/libbindgen/tests/expectations/tests/typeref.rs @@ -31,7 +31,7 @@ impl ::std::fmt::Debug for __BindgenUnionField { #[repr(C)] #[derive(Debug, Copy)] pub struct nsFoo { - pub mBar: StyleShapeSource<::std::os::raw::c_int>, + pub mBar: mozilla_StyleShapeSource<::std::os::raw::c_int>, } #[test] fn bindgen_test_layout_nsFoo() { @@ -43,28 +43,28 @@ impl Clone for nsFoo { } #[repr(C)] #[derive(Debug, Copy)] -pub struct FragmentOrURL { +pub struct mozilla_FragmentOrURL { pub mIsLocalRef: bool, } #[test] -fn bindgen_test_layout_FragmentOrURL() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); +fn bindgen_test_layout_mozilla_FragmentOrURL() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); } -impl Clone for FragmentOrURL { +impl Clone for mozilla_FragmentOrURL { fn clone(&self) -> Self { *self } } #[repr(C)] #[derive(Debug, Copy)] -pub struct Position { +pub struct mozilla_Position { pub _address: u8, } #[test] -fn bindgen_test_layout_Position() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); +fn bindgen_test_layout_mozilla_Position() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); } -impl Clone for Position { +impl Clone for mozilla_Position { fn clone(&self) -> Self { *self } } #[repr(C)] @@ -82,15 +82,15 @@ impl Clone for Bar { } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct StyleShapeSource { - pub __bindgen_anon_1: StyleShapeSource__bindgen_ty_1, +pub struct mozilla_StyleShapeSource { + pub __bindgen_anon_1: mozilla_StyleShapeSource__bindgen_ty_1, pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct StyleShapeSource__bindgen_ty_1 { - pub mPosition: __BindgenUnionField<*mut Position>, - pub mFragmentOrURL: __BindgenUnionField<*mut FragmentOrURL>, +pub struct mozilla_StyleShapeSource__bindgen_ty_1 { + pub mPosition: __BindgenUnionField<*mut mozilla_Position>, + pub mFragmentOrURL: __BindgenUnionField<*mut mozilla_FragmentOrURL>, pub bindgen_union_field: u64, pub _phantom_0: ::std::marker::PhantomData, } diff --git a/libbindgen/tests/expectations/tests/union_with_nesting.rs b/libbindgen/tests/expectations/tests/union_with_nesting.rs index 61c08a2a3e..af9e442d10 100644 --- a/libbindgen/tests/expectations/tests/union_with_nesting.rs +++ b/libbindgen/tests/expectations/tests/union_with_nesting.rs @@ -38,37 +38,41 @@ pub struct foo { #[repr(C)] #[derive(Debug, Copy)] pub struct foo__bindgen_ty_1 { - pub __bindgen_anon_1: foo__bindgen_ty_1_1, - pub __bindgen_anon_2: foo__bindgen_ty_1_2, + pub __bindgen_anon_1: foo__bindgen_ty_1__bindgen_ty_1, + pub __bindgen_anon_2: foo__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Copy)] -pub struct foo__bindgen_ty_1_1 { +pub struct foo__bindgen_ty_1__bindgen_ty_1 { pub b1: __BindgenUnionField<::std::os::raw::c_ushort>, pub b2: __BindgenUnionField<::std::os::raw::c_ushort>, pub bindgen_union_field: u16, } #[test] -fn bindgen_test_layout_foo__bindgen_ty_1_1() { - assert_eq!(::std::mem::size_of::() , 2usize); - assert_eq!(::std::mem::align_of::() , 2usize); +fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 2usize); + assert_eq!(::std::mem::align_of::() , + 2usize); } -impl Clone for foo__bindgen_ty_1_1 { +impl Clone for foo__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[repr(C)] #[derive(Debug, Copy)] -pub struct foo__bindgen_ty_1_2 { +pub struct foo__bindgen_ty_1__bindgen_ty_2 { pub c1: __BindgenUnionField<::std::os::raw::c_ushort>, pub c2: __BindgenUnionField<::std::os::raw::c_ushort>, pub bindgen_union_field: u16, } #[test] -fn bindgen_test_layout_foo__bindgen_ty_1_2() { - assert_eq!(::std::mem::size_of::() , 2usize); - assert_eq!(::std::mem::align_of::() , 2usize); +fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_2() { + assert_eq!(::std::mem::size_of::() , + 2usize); + assert_eq!(::std::mem::align_of::() , + 2usize); } -impl Clone for foo__bindgen_ty_1_2 { +impl Clone for foo__bindgen_ty_1__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] diff --git a/libbindgen/tests/headers/replace_template_alias.hpp b/libbindgen/tests/headers/replace_template_alias.hpp index 6ceae4e517..b0648994e8 100644 --- a/libbindgen/tests/headers/replace_template_alias.hpp +++ b/libbindgen/tests/headers/replace_template_alias.hpp @@ -18,6 +18,6 @@ class Rooted { /// But the replacement type does use T! /// -///
+///
template using replaces_MaybeWrapped = T; diff --git a/libbindgen/tests/headers/same_struct_name_in_different_namespaces.hpp b/libbindgen/tests/headers/same_struct_name_in_different_namespaces.hpp new file mode 100644 index 0000000000..fe6858458f --- /dev/null +++ b/libbindgen/tests/headers/same_struct_name_in_different_namespaces.hpp @@ -0,0 +1,12 @@ +namespace JS { + + struct Zone; + + namespace shadow { + + struct Zone { + int x; + int y; + }; + } +} From 3f0f86810b855d20dfc39655f336ba814d169281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20HUBSCHER?= Date: Fri, 18 Nov 2016 19:15:16 +0100 Subject: [PATCH 0110/2291] Add a test --- .../expectations/tests/variadic_template_function.rs | 12 ++++++++++++ .../tests/headers/variadic_template_function.hpp | 6 ++++++ 2 files changed, 18 insertions(+) create mode 100644 libbindgen/tests/expectations/tests/variadic_template_function.rs create mode 100644 libbindgen/tests/headers/variadic_template_function.hpp diff --git a/libbindgen/tests/expectations/tests/variadic_template_function.rs b/libbindgen/tests/expectations/tests/variadic_template_function.rs new file mode 100644 index 0000000000..cd99df960d --- /dev/null +++ b/libbindgen/tests/expectations/tests/variadic_template_function.rs @@ -0,0 +1,12 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct VariadicFunctionObject { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} diff --git a/libbindgen/tests/headers/variadic_template_function.hpp b/libbindgen/tests/headers/variadic_template_function.hpp new file mode 100644 index 0000000000..4942d8f024 --- /dev/null +++ b/libbindgen/tests/headers/variadic_template_function.hpp @@ -0,0 +1,6 @@ + +template +class VariadicFunctionObject { +public: + int add_em_up(T count,...); +}; From 1c18ec72b83a107c16d944e7c260855419eb7f3c Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 18 Nov 2016 16:19:46 -0800 Subject: [PATCH 0111/2291] Do not evaluate variadic template types This is a workaround for an internal clang assertion that gets triggered if we try to evaluate a variadic template type reference. Fixes #283 --- libbindgen/src/clang.rs | 35 ++++++++++++++----- libbindgen/src/ir/var.rs | 7 ++-- .../tests/eval-variadic-template-parameter.rs | 12 +++++++ .../eval-variadic-template-parameter.hpp | 8 +++++ 4 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/eval-variadic-template-parameter.rs create mode 100644 libbindgen/tests/headers/eval-variadic-template-parameter.hpp diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 6c95b22f3c..a11903aa95 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -487,7 +487,7 @@ impl Cursor { } /// Try to evaluate this cursor. - pub fn evaluate(&self) -> EvalResult { + pub fn evaluate(&self) -> Option { EvalResult::new(*self) } } @@ -1286,10 +1286,8 @@ pub struct EvalResult { #[cfg(feature = "llvm_stable")] impl EvalResult { /// Create a dummy EvalResult. - pub fn new(_: Cursor) -> Self { - EvalResult { - x: ptr::null_mut(), - } + pub fn new(_: Cursor) -> Option { + None } /// Not useful in llvm 3.8. @@ -1306,10 +1304,31 @@ impl EvalResult { #[cfg(not(feature = "llvm_stable"))] impl EvalResult { /// Evaluate `cursor` and return the result. - pub fn new(cursor: Cursor) -> Self { - EvalResult { - x: unsafe { clang_Cursor_Evaluate(cursor.x) }, + pub fn new(cursor: Cursor) -> Option { + // Clang has an internal assertion we can trigger if we try to evaluate + // a cursor containing a variadic template type reference. Triggering + // the assertion aborts the process, and we don't want that. Clang + // *also* doesn't expose any API for finding variadic vs non-variadic + // template type references, let alone whether a type referenced is a + // template type, instead they seem to show up as type references to an + // unexposed type. Our solution is to just flat out ban all + // `CXType_Unexposed` from evaluation. + let mut found_cant_eval = false; + cursor.visit(|c| { + if c.kind() == CXCursor_TypeRef && c.cur_type().kind() == CXType_Unexposed { + found_cant_eval = true; + CXChildVisit_Break + } else { + CXChildVisit_Recurse + } + }); + if found_cant_eval { + return None; } + + Some(EvalResult { + x: unsafe { clang_Cursor_Evaluate(cursor.x) }, + }) } fn kind(&self) -> Enum_CXEvalResultKind { diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index bbaea93953..b819bfa4ec 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -209,8 +209,9 @@ impl ClangSubItemParser for Var { _ => unreachable!(), }; - let mut val = - cursor.evaluate().as_int().map(|val| val as i64); + let mut val = cursor.evaluate() + .and_then(|v| v.as_int()) + .map(|val| val as i64); if val.is_none() || !kind.signedness_matches(val.unwrap()) { let tu = ctx.translation_unit(); val = get_integer_literal_from_cursor(&cursor, tu); @@ -225,7 +226,7 @@ impl ClangSubItemParser for Var { }) } else if is_float { cursor.evaluate() - .as_double() + .and_then(|v| v.as_double()) .map(VarType::Float) } else { None diff --git a/libbindgen/tests/expectations/tests/eval-variadic-template-parameter.rs b/libbindgen/tests/expectations/tests/eval-variadic-template-parameter.rs new file mode 100644 index 0000000000..f8c937e2a8 --- /dev/null +++ b/libbindgen/tests/expectations/tests/eval-variadic-template-parameter.rs @@ -0,0 +1,12 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct B { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} diff --git a/libbindgen/tests/headers/eval-variadic-template-parameter.hpp b/libbindgen/tests/headers/eval-variadic-template-parameter.hpp new file mode 100644 index 0000000000..0a9e51c1e3 --- /dev/null +++ b/libbindgen/tests/headers/eval-variadic-template-parameter.hpp @@ -0,0 +1,8 @@ +// bindgen-flags: -- -std=c++11 + +template +struct B { + // Can't generate anything meaningful in Rust for this, but we shouldn't + // trigger an assertion inside Clang. + static const long c = sizeof...(T); +}; From 515ef38574845b0fbac1bea72269b44bd0642b75 Mon Sep 17 00:00:00 2001 From: Artem Biryukov Date: Wed, 16 Nov 2016 17:40:06 +0300 Subject: [PATCH 0112/2291] First steps to fix issue #57 --- libbindgen/src/codegen/mod.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 6c8a36f733..8b54ab007f 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -656,8 +656,30 @@ impl CodeGenerator for CompInfo { // // TODO: Generate layout tests for template specializations, yay! if self.has_non_type_template_params() || - self.is_template_specialization() { - return; + self.is_template_specialization() { + let layout = item.kind().expect_type().layout(ctx); + let canonical_name = item.canonical_name(ctx); + + if let Some(layout) = layout { + let fn_name = format!("bindgen_test_layout_template_{}", canonical_name); + let fn_name = ctx.rust_ident_raw(&fn_name); + let ident = item.to_rust_ty(ctx); + let prefix = ctx.trait_prefix(); + let size_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::size_of::<$ident>()); + let align_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::align_of::<$ident>()); + let size = layout.size; + let align = layout.align; + let item = quote_item!(ctx.ext_cx(), + #[test] + fn $fn_name() { + assert_eq!($size_of_expr, $size); + assert_eq!($align_of_expr, $align); + }).unwrap(); + result.push(item); + } + return; } let applicable_template_args = item.applicable_template_args(ctx); From bed241ea45ce82a283f9c5cda3f98bd6969e53c2 Mon Sep 17 00:00:00 2001 From: Artem Biryukov Date: Sun, 20 Nov 2016 11:50:23 +0300 Subject: [PATCH 0113/2291] Take out template arguments and make unique names --- libbindgen/src/codegen/mod.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 8b54ab007f..c99caf9ea3 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -655,13 +655,25 @@ impl CodeGenerator for CompInfo { // also don't output template specializations, neither total or partial. // // TODO: Generate layout tests for template specializations, yay! + + // TODO (imp): I will keep it like that right now and move it to function later if self.has_non_type_template_params() || self.is_template_specialization() { let layout = item.kind().expect_type().layout(ctx); let canonical_name = item.canonical_name(ctx); if let Some(layout) = layout { - let fn_name = format!("bindgen_test_layout_template_{}", canonical_name); + + let mut types = String::new(); + + for arg in self.template_args() { + if let Some(name) = ctx.resolve_type(*arg).name() { + // hope this isn't bad + types.push_str(format!("{}_", name).as_str()); + } + } + + let fn_name = format!("bindgen_test_layout_template_{}_{}", canonical_name, types); let fn_name = ctx.rust_ident_raw(&fn_name); let ident = item.to_rust_ty(ctx); let prefix = ctx.trait_prefix(); From 5ee3601ea9eb953df23b0454f30662f2c154f7a4 Mon Sep 17 00:00:00 2001 From: Artem Biryukov Date: Sun, 20 Nov 2016 12:11:53 +0300 Subject: [PATCH 0114/2291] Add new expectations for tests --- libbindgen/src/codegen/mod.rs | 4 ++-- libbindgen/tests/expectations/tests/anon_union.rs | 7 +++++++ .../tests/expectations/tests/class_with_dtor.rs | 7 +++++++ libbindgen/tests/expectations/tests/crtp.rs | 12 ++++++++++++ libbindgen/tests/expectations/tests/template.rs | 14 ++++++++++++++ 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index c99caf9ea3..6730a9100c 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -669,11 +669,11 @@ impl CodeGenerator for CompInfo { for arg in self.template_args() { if let Some(name) = ctx.resolve_type(*arg).name() { // hope this isn't bad - types.push_str(format!("{}_", name).as_str()); + types.push_str(format!("_{}", name).as_str()); } } - let fn_name = format!("bindgen_test_layout_template_{}_{}", canonical_name, types); + let fn_name = format!("bindgen_test_layout_template_{}{}", canonical_name, types); let fn_name = ctx.rust_ident_raw(&fn_name); let ident = item.to_rust_ty(ctx); let prefix = ctx.trait_prefix(); diff --git a/libbindgen/tests/expectations/tests/anon_union.rs b/libbindgen/tests/expectations/tests/anon_union.rs index 8af416c32c..2dc206b728 100644 --- a/libbindgen/tests/expectations/tests/anon_union.rs +++ b/libbindgen/tests/expectations/tests/anon_union.rs @@ -75,3 +75,10 @@ fn bindgen_test_layout_ErrorResult() { impl Clone for ErrorResult { fn clone(&self) -> Self { *self } } +#[test] +fn bindgen_test_layout_template_TErrorResult_int() { + assert_eq!(::std::mem::size_of::>() , + 24usize); + assert_eq!(::std::mem::align_of::>() , + 8usize); +} diff --git a/libbindgen/tests/expectations/tests/class_with_dtor.rs b/libbindgen/tests/expectations/tests/class_with_dtor.rs index 8ed1ddf9fe..f09699ca0e 100644 --- a/libbindgen/tests/expectations/tests/class_with_dtor.rs +++ b/libbindgen/tests/expectations/tests/class_with_dtor.rs @@ -20,3 +20,10 @@ fn bindgen_test_layout_WithoutDtor() { assert_eq!(::std::mem::size_of::() , 8usize); assert_eq!(::std::mem::align_of::() , 8usize); } +#[test] +fn bindgen_test_layout_template_HandleWithDtor_int() { + assert_eq!(::std::mem::size_of::>() + , 8usize); + assert_eq!(::std::mem::align_of::>() + , 8usize); +} diff --git a/libbindgen/tests/expectations/tests/crtp.rs b/libbindgen/tests/expectations/tests/crtp.rs index e4a86b2430..3962959916 100644 --- a/libbindgen/tests/expectations/tests/crtp.rs +++ b/libbindgen/tests/expectations/tests/crtp.rs @@ -23,6 +23,11 @@ fn bindgen_test_layout_Derived() { impl Clone for Derived { fn clone(&self) -> Self { *self } } +#[test] +fn bindgen_test_layout_template_Base() { + assert_eq!(::std::mem::size_of::>() , 1usize); + assert_eq!(::std::mem::align_of::>() , 1usize); +} #[repr(C)] #[derive(Debug)] pub struct BaseWithDestructor { @@ -41,3 +46,10 @@ fn bindgen_test_layout_DerivedFromBaseWithDestructor() { assert_eq!(::std::mem::align_of::() , 1usize); } +#[test] +fn bindgen_test_layout_template_BaseWithDestructor() { + assert_eq!(::std::mem::size_of::>() + , 1usize); + assert_eq!(::std::mem::align_of::>() + , 1usize); +} diff --git a/libbindgen/tests/expectations/tests/template.rs b/libbindgen/tests/expectations/tests/template.rs index 76afc87966..970b9037ac 100644 --- a/libbindgen/tests/expectations/tests/template.rs +++ b/libbindgen/tests/expectations/tests/template.rs @@ -12,6 +12,13 @@ pub struct Foo { pub m_member_arr: [T; 1usize], pub _phantom_1: ::std::marker::PhantomData, } +#[test] +fn bindgen_test_layout_template_Foo_int_int() { + assert_eq!(::std::mem::size_of::>() + , 24usize); + assert_eq!(::std::mem::align_of::>() + , 8usize); +} extern "C" { #[link_name = "_Z3bar3FooIiiE"] pub fn bar(foo: Foo<::std::os::raw::c_int, ::std::os::raw::c_int>); @@ -168,3 +175,10 @@ pub struct TemplateWithVar { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +#[test] +fn bindgen_test_layout_template_WithDtor_int() { + assert_eq!(::std::mem::size_of::>() , + 4usize); + assert_eq!(::std::mem::align_of::>() , + 4usize); +} From 9ac13adc1ff5a8f102b5efdce35411379a772a43 Mon Sep 17 00:00:00 2001 From: Tai Sassen-Liang Date: Mon, 7 Nov 2016 00:19:12 +0100 Subject: [PATCH 0115/2291] clang::Cursor::enum_type should return an Option Fixes issue #125 --- libbindgen/src/clang.rs | 7 ++++--- libbindgen/src/ir/enum_ty.rs | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 6c95b22f3c..08c77b19de 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -362,11 +362,12 @@ impl Cursor { /// Get the integer representation type used to hold this cursor's referent /// enum type. - pub fn enum_type(&self) -> Type { + pub fn enum_type(&self) -> Option { unsafe { - Type { + let t = Type { x: clang_getEnumDeclIntegerType(self.x), - } + }; + if t.kind() == CXType_Invalid { None } else { Some(t) } } } diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index 6085833d18..0d4f955bbc 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -49,8 +49,8 @@ impl Enum { } let declaration = ty.declaration().canonical(); - let repr = Item::from_ty(&declaration.enum_type(), None, None, ctx) - .ok(); + let et = &declaration.enum_type().expect("This should be an enum since we checked above!"); + let repr = Item::from_ty(et, None, None, ctx).ok(); let mut variants = vec![]; let is_signed = match repr { From ffeeba5670aa38ea02a82b93d8b4a4eefc781253 Mon Sep 17 00:00:00 2001 From: Tai Sassen-Liang Date: Sun, 20 Nov 2016 18:48:13 +0100 Subject: [PATCH 0116/2291] Update error wording for enum_type().expect() --- libbindgen/src/ir/enum_ty.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index 0d4f955bbc..33a4fcfae5 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -49,7 +49,7 @@ impl Enum { } let declaration = ty.declaration().canonical(); - let et = &declaration.enum_type().expect("This should be an enum since we checked above!"); + let et = &declaration.enum_type().expect("Expected an enum type"); let repr = Item::from_ty(et, None, None, ctx).ok(); let mut variants = vec![]; From 12a191e6968f1761eb3f4bbaf89a94312634734d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 21 Nov 2016 13:55:23 +0100 Subject: [PATCH 0117/2291] codegen: Fix whitelisting inside namespaces. --- libbindgen/src/codegen/mod.rs | 46 +++++++++++++------ libbindgen/src/ir/context.rs | 2 +- .../tests/duplicated_constants_in_ns.rs | 3 ++ .../tests/expectations/tests/namespace.rs | 5 ++ .../tests/template_alias_namespace.rs | 3 ++ .../tests/whitelist-namespaces-basic.rs | 31 +++++++++++++ .../tests/whitelist-namespaces.rs | 44 ++++++++++++++++++ .../headers/whitelist-namespaces-basic.hpp | 10 ++++ .../tests/headers/whitelist-namespaces.hpp | 10 ++++ 9 files changed, 138 insertions(+), 16 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/whitelist-namespaces-basic.rs create mode 100644 libbindgen/tests/expectations/tests/whitelist-namespaces.rs create mode 100644 libbindgen/tests/headers/whitelist-namespaces-basic.hpp create mode 100644 libbindgen/tests/headers/whitelist-namespaces.hpp diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 6c8a36f733..a522d88711 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -33,7 +33,7 @@ fn root_import(ctx: &BindgenContext) -> P { assert!(ctx.options().enable_cxx_namespaces, "Somebody messed it up"); let root = ctx.root_module().canonical_name(ctx); let root_ident = ctx.rust_ident(&root); - quote_item!(ctx.ext_cx(), use $root_ident;).unwrap() + quote_item!(ctx.ext_cx(), #[allow(unused_imports)] use $root_ident;).unwrap() } struct CodegenResult { @@ -217,6 +217,7 @@ trait CodeGenerator { fn codegen(&self, ctx: &BindgenContext, result: &mut CodegenResult, + whitelisted_items: &ItemSet, extra: &Self::Extra); } @@ -226,6 +227,7 @@ impl CodeGenerator for Item { fn codegen(&self, ctx: &BindgenContext, result: &mut CodegenResult, + whitelisted_items: &ItemSet, _extra: &()) { if self.is_hidden(ctx) || result.seen(self.id()) { debug!("::codegen: Ignoring hidden or seen: \ @@ -244,18 +246,18 @@ impl CodeGenerator for Item { return; } - module.codegen(ctx, result, self); + module.codegen(ctx, result, whitelisted_items, self); } ItemKind::Function(ref fun) => { if !ctx.options().ignore_functions { - fun.codegen(ctx, result, self); + fun.codegen(ctx, result, whitelisted_items, self); } } ItemKind::Var(ref var) => { - var.codegen(ctx, result, self); + var.codegen(ctx, result, whitelisted_items, self); } ItemKind::Type(ref ty) => { - ty.codegen(ctx, result, self); + ty.codegen(ctx, result, whitelisted_items, self); } } } @@ -267,12 +269,14 @@ impl CodeGenerator for Module { fn codegen(&self, ctx: &BindgenContext, result: &mut CodegenResult, + whitelisted_items: &ItemSet, item: &Item) { debug!("::codegen: item = {:?}", item); if !ctx.options().enable_cxx_namespaces { for child in self.children() { - ctx.resolve_item(*child).codegen(ctx, result, &()); + ctx.resolve_item(*child) + .codegen(ctx, result, whitelisted_items, &()); } return; } @@ -280,7 +284,10 @@ impl CodeGenerator for Module { let inner_items = result.inner(|result| { result.push(root_import(ctx)); for child in self.children() { - ctx.resolve_item(*child).codegen(ctx, result, &()); + if whitelisted_items.contains(child) { + ctx.resolve_item(*child) + .codegen(ctx, result, whitelisted_items, &()); + } } }); @@ -304,6 +311,7 @@ impl CodeGenerator for Var { fn codegen(&self, ctx: &BindgenContext, result: &mut CodegenResult, + _whitelisted_items: &ItemSet, item: &Item) { use ir::var::VarType; debug!("::codegen: item = {:?}", item); @@ -394,6 +402,7 @@ impl CodeGenerator for Type { fn codegen(&self, ctx: &BindgenContext, result: &mut CodegenResult, + whitelisted_items: &ItemSet, item: &Item) { debug!("::codegen: item = {:?}", item); @@ -415,12 +424,12 @@ impl CodeGenerator for Type { // converted to rust types in fields, arguments, and such. return; } - TypeKind::Comp(ref ci) => ci.codegen(ctx, result, item), + TypeKind::Comp(ref ci) => ci.codegen(ctx, result, whitelisted_items, item), TypeKind::TemplateAlias(inner, _) => { // NB: The inner Alias will pick the correct // applicable_template_args. let inner_item = ctx.resolve_item(inner); - inner_item.expect_type().codegen(ctx, result, inner_item); + inner_item.expect_type().codegen(ctx, result, whitelisted_items, inner_item); } TypeKind::Alias(ref spelling, inner) => { let inner_item = ctx.resolve_item(inner); @@ -478,7 +487,7 @@ impl CodeGenerator for Type { let typedef = generics.build().build_ty(inner_rust_type); result.push(typedef) } - TypeKind::Enum(ref ei) => ei.codegen(ctx, result, item), + TypeKind::Enum(ref ei) => ei.codegen(ctx, result, whitelisted_items, item), ref u @ TypeKind::UnresolvedTypeRef(..) => { unreachable!("Should have been resolved after parsing {:?}!", u) } @@ -513,6 +522,7 @@ impl<'a> CodeGenerator for Vtable<'a> { fn codegen(&self, ctx: &BindgenContext, result: &mut CodegenResult, + _whitelisted_items: &ItemSet, item: &Item) { assert_eq!(item.id(), self.item_id); // For now, generate an empty struct, later we should generate function @@ -646,6 +656,7 @@ impl CodeGenerator for CompInfo { fn codegen(&self, ctx: &BindgenContext, result: &mut CodegenResult, + whitelisted_items: &ItemSet, item: &Item) { use aster::struct_field::StructFieldBuilder; @@ -732,7 +743,7 @@ impl CodeGenerator for CompInfo { if self.needs_explicit_vtable(ctx) { let vtable = Vtable::new(item.id(), self.methods(), self.base_members()); - vtable.codegen(ctx, result, item); + vtable.codegen(ctx, result, whitelisted_items, item); let vtable_type = vtable.to_rust_ty(ctx).to_ptr(true, ctx.span()); @@ -1051,7 +1062,7 @@ impl CodeGenerator for CompInfo { for ty in self.inner_types() { let child_item = ctx.resolve_item(*ty); // assert_eq!(child_item.parent_id(), item.id()); - child_item.codegen(ctx, result, &()); + child_item.codegen(ctx, result, whitelisted_items, &()); } // NOTE: Some unexposed attributes (like alignment attributes) may @@ -1064,7 +1075,7 @@ impl CodeGenerator for CompInfo { if applicable_template_args.is_empty() && !self.found_unknown_attr() { for var in self.inner_vars() { - ctx.resolve_item(*var).codegen(ctx, result, &()); + ctx.resolve_item(*var).codegen(ctx, result, whitelisted_items, &()); } if let Some(layout) = layout { @@ -1094,6 +1105,7 @@ impl CodeGenerator for CompInfo { &mut methods, &mut method_names, result, + whitelisted_items, item); } } @@ -1145,6 +1157,7 @@ trait MethodCodegen { methods: &mut Vec, method_names: &mut HashMap, result: &mut CodegenResult, + whitelisted_items: &ItemSet, parent: &Item); } @@ -1154,6 +1167,7 @@ impl MethodCodegen for Method { methods: &mut Vec, method_names: &mut HashMap, result: &mut CodegenResult, + whitelisted_items: &ItemSet, _parent: &Item) { if ctx.options().ignore_methods { return; @@ -1163,7 +1177,7 @@ impl MethodCodegen for Method { return; // FIXME } // First of all, output the actual function. - ctx.resolve_item(self.signature()).codegen(ctx, result, &()); + ctx.resolve_item(self.signature()).codegen(ctx, result, whitelisted_items, &()); let function_item = ctx.resolve_item(self.signature()); let function = function_item.expect_function(); @@ -1411,6 +1425,7 @@ impl CodeGenerator for Enum { fn codegen(&self, ctx: &BindgenContext, result: &mut CodegenResult, + _whitelisted_items: &ItemSet, item: &Item) { debug!("::codegen: item = {:?}", item); @@ -1852,6 +1867,7 @@ impl CodeGenerator for Function { fn codegen(&self, ctx: &BindgenContext, result: &mut CodegenResult, + _whitelisted_items: &ItemSet, item: &Item) { debug!("::codegen: item = {:?}", item); @@ -1963,7 +1979,7 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { // need to take responsibility for generating it. if item.is_toplevel(context) || !ancestor_is_whitelisted(context, &whitelisted_items, id) { - item.codegen(context, &mut result, &()); + item.codegen(context, &mut result, &whitelisted_items, &()); } } diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index bda3e3c8a5..b7754a40a8 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -938,7 +938,7 @@ impl<'ctx> BindgenContext<'ctx> { let name = item.canonical_name(self); match *item.kind() { - ItemKind::Module(..) => false, + ItemKind::Module(..) => self.options().enable_cxx_namespaces, ItemKind::Function(_) => { self.options().whitelisted_functions.matches(&name) } diff --git a/libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs b/libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs index cb69890cc6..3acc53e8b3 100644 --- a/libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs +++ b/libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs @@ -5,12 +5,15 @@ pub mod root { + #[allow(unused_imports)] use root; pub mod foo { + #[allow(unused_imports)] use root; pub const FOO: ::std::os::raw::c_int = 4; } pub mod bar { + #[allow(unused_imports)] use root; pub const FOO: ::std::os::raw::c_int = 5; } diff --git a/libbindgen/tests/expectations/tests/namespace.rs b/libbindgen/tests/expectations/tests/namespace.rs index bc8bae681b..abb48204cb 100644 --- a/libbindgen/tests/expectations/tests/namespace.rs +++ b/libbindgen/tests/expectations/tests/namespace.rs @@ -5,12 +5,14 @@ pub mod root { + #[allow(unused_imports)] use root; extern "C" { #[link_name = "_Z9top_levelv"] pub fn top_level(); } pub mod whatever { + #[allow(unused_imports)] use root; pub type whatever_int_t = ::std::os::raw::c_int; extern "C" { @@ -19,8 +21,10 @@ pub mod root { } } pub mod _bindgen_mod_id_13 { + #[allow(unused_imports)] use root; pub mod empty { + #[allow(unused_imports)] use root; } extern "C" { @@ -50,6 +54,7 @@ pub mod root { pub m_c_arr: [T; 10usize], } pub mod w { + #[allow(unused_imports)] use root; pub type whatever_int_t = ::std::os::raw::c_uint; #[repr(C)] diff --git a/libbindgen/tests/expectations/tests/template_alias_namespace.rs b/libbindgen/tests/expectations/tests/template_alias_namespace.rs index 475c2b0516..36806d44c4 100644 --- a/libbindgen/tests/expectations/tests/template_alias_namespace.rs +++ b/libbindgen/tests/expectations/tests/template_alias_namespace.rs @@ -5,10 +5,13 @@ pub mod root { + #[allow(unused_imports)] use root; pub mod JS { + #[allow(unused_imports)] use root; pub mod detail { + #[allow(unused_imports)] use root; pub type Wrapped = T; } diff --git a/libbindgen/tests/expectations/tests/whitelist-namespaces-basic.rs b/libbindgen/tests/expectations/tests/whitelist-namespaces-basic.rs new file mode 100644 index 0000000000..8806cbf424 --- /dev/null +++ b/libbindgen/tests/expectations/tests/whitelist-namespaces-basic.rs @@ -0,0 +1,31 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use root; + pub mod outer { + #[allow(unused_imports)] + use root; + pub mod inner { + #[allow(unused_imports)] + use root; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Helper { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_Helper() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); + } + impl Clone for Helper { + fn clone(&self) -> Self { *self } + } + } + } +} diff --git a/libbindgen/tests/expectations/tests/whitelist-namespaces.rs b/libbindgen/tests/expectations/tests/whitelist-namespaces.rs new file mode 100644 index 0000000000..42cccdeebc --- /dev/null +++ b/libbindgen/tests/expectations/tests/whitelist-namespaces.rs @@ -0,0 +1,44 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use root; + pub mod outer { + #[allow(unused_imports)] + use root; + pub mod inner { + #[allow(unused_imports)] + use root; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Helper { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_Helper() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); + } + impl Clone for Helper { + fn clone(&self) -> Self { *self } + } + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Test { + pub helper: root::outer::inner::Helper, + } + #[test] + fn bindgen_test_layout_Test() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); + } + impl Clone for Test { + fn clone(&self) -> Self { *self } + } + } +} diff --git a/libbindgen/tests/headers/whitelist-namespaces-basic.hpp b/libbindgen/tests/headers/whitelist-namespaces-basic.hpp new file mode 100644 index 0000000000..b631d290c5 --- /dev/null +++ b/libbindgen/tests/headers/whitelist-namespaces-basic.hpp @@ -0,0 +1,10 @@ +// bindgen-flags: --enable-cxx-namespaces --whitelist-type '.*Helper' + +namespace outer { + namespace inner { + struct Helper {}; + } + struct Test { + inner::Helper helper; + }; +} diff --git a/libbindgen/tests/headers/whitelist-namespaces.hpp b/libbindgen/tests/headers/whitelist-namespaces.hpp new file mode 100644 index 0000000000..d34cbe9430 --- /dev/null +++ b/libbindgen/tests/headers/whitelist-namespaces.hpp @@ -0,0 +1,10 @@ +// bindgen-flags: --enable-cxx-namespaces --whitelist-type '.*' + +namespace outer { + namespace inner { + struct Helper {}; + } + struct Test { + inner::Helper helper; + }; +} From a95d9d5a4ac50d9d621edf6d314062548da9caf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 21 Nov 2016 14:05:16 +0100 Subject: [PATCH 0118/2291] Reformat. --- libbindgen/src/codegen/mod.rs | 24 +++++++++----- libbindgen/src/ir/context.rs | 4 ++- libbindgen/src/ir/function.rs | 3 +- libbindgen/src/ir/item.rs | 59 ++++++++++++++++++++++------------- 4 files changed, 59 insertions(+), 31 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index a522d88711..c8cd4cdfef 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -33,7 +33,8 @@ fn root_import(ctx: &BindgenContext) -> P { assert!(ctx.options().enable_cxx_namespaces, "Somebody messed it up"); let root = ctx.root_module().canonical_name(ctx); let root_ident = ctx.rust_ident(&root); - quote_item!(ctx.ext_cx(), #[allow(unused_imports)] use $root_ident;).unwrap() + quote_item!(ctx.ext_cx(), #[allow(unused_imports)] use $root_ident;) + .unwrap() } struct CodegenResult { @@ -276,7 +277,7 @@ impl CodeGenerator for Module { if !ctx.options().enable_cxx_namespaces { for child in self.children() { ctx.resolve_item(*child) - .codegen(ctx, result, whitelisted_items, &()); + .codegen(ctx, result, whitelisted_items, &()); } return; } @@ -286,7 +287,7 @@ impl CodeGenerator for Module { for child in self.children() { if whitelisted_items.contains(child) { ctx.resolve_item(*child) - .codegen(ctx, result, whitelisted_items, &()); + .codegen(ctx, result, whitelisted_items, &()); } } }); @@ -424,12 +425,15 @@ impl CodeGenerator for Type { // converted to rust types in fields, arguments, and such. return; } - TypeKind::Comp(ref ci) => ci.codegen(ctx, result, whitelisted_items, item), + TypeKind::Comp(ref ci) => { + ci.codegen(ctx, result, whitelisted_items, item) + } TypeKind::TemplateAlias(inner, _) => { // NB: The inner Alias will pick the correct // applicable_template_args. let inner_item = ctx.resolve_item(inner); - inner_item.expect_type().codegen(ctx, result, whitelisted_items, inner_item); + inner_item.expect_type() + .codegen(ctx, result, whitelisted_items, inner_item); } TypeKind::Alias(ref spelling, inner) => { let inner_item = ctx.resolve_item(inner); @@ -487,7 +491,9 @@ impl CodeGenerator for Type { let typedef = generics.build().build_ty(inner_rust_type); result.push(typedef) } - TypeKind::Enum(ref ei) => ei.codegen(ctx, result, whitelisted_items, item), + TypeKind::Enum(ref ei) => { + ei.codegen(ctx, result, whitelisted_items, item) + } ref u @ TypeKind::UnresolvedTypeRef(..) => { unreachable!("Should have been resolved after parsing {:?}!", u) } @@ -1075,7 +1081,8 @@ impl CodeGenerator for CompInfo { if applicable_template_args.is_empty() && !self.found_unknown_attr() { for var in self.inner_vars() { - ctx.resolve_item(*var).codegen(ctx, result, whitelisted_items, &()); + ctx.resolve_item(*var) + .codegen(ctx, result, whitelisted_items, &()); } if let Some(layout) = layout { @@ -1177,7 +1184,8 @@ impl MethodCodegen for Method { return; // FIXME } // First of all, output the actual function. - ctx.resolve_item(self.signature()).codegen(ctx, result, whitelisted_items, &()); + ctx.resolve_item(self.signature()) + .codegen(ctx, result, whitelisted_items, &()); let function_item = ctx.resolve_item(self.signature()); let function = function_item.expect_function(); diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index b7754a40a8..7c643f04a0 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -938,7 +938,9 @@ impl<'ctx> BindgenContext<'ctx> { let name = item.canonical_name(self); match *item.kind() { - ItemKind::Module(..) => self.options().enable_cxx_namespaces, + ItemKind::Module(..) => { + self.options().enable_cxx_namespaces + } ItemKind::Function(_) => { self.options().whitelisted_functions.matches(&name) } diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs index 60bd1e5b75..5a864cfc7b 100644 --- a/libbindgen/src/ir/function.rs +++ b/libbindgen/src/ir/function.rs @@ -150,7 +150,8 @@ impl FunctionSig { CXCursor_CXXMethod => { // For CXCursor_FunctionDecl, cursor.args() is the reliable way // to get parameter names and types. - cursor.args().expect("It cannot be None because we are in a method/function") + cursor.args() + .unwrap() .iter() .map(|arg| { let arg_ty = arg.cur_type(); diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 176eca14ec..c370c8b0e7 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -527,7 +527,10 @@ impl Item { } /// Get the target item id for name generation. - fn name_target(&self, ctx: &BindgenContext, for_name_checking: bool) -> ItemId { + fn name_target(&self, + ctx: &BindgenContext, + for_name_checking: bool) + -> ItemId { let mut item = self; loop { match *item.kind() { @@ -535,24 +538,31 @@ impl Item { match *ty.kind() { // If we're a template specialization, our name is our // parent's name. - TypeKind::Comp(ref ci) if ci.is_template_specialization() => { - item = ctx.resolve_item(ci.specialized_template().unwrap()); - }, + TypeKind::Comp(ref ci) + if ci.is_template_specialization() => { + let specialized = + ci.specialized_template().unwrap(); + item = ctx.resolve_item(specialized); + } // Same as above. TypeKind::ResolvedTypeRef(inner) | TypeKind::TemplateRef(inner, _) => { item = ctx.resolve_item(inner); } - // Template aliases use their inner alias type's name if we - // are checking names for whitelisting/replacement/etc. - TypeKind::TemplateAlias(inner, _) if for_name_checking => { + // Template aliases use their inner alias type's name if + // we are checking names for + // whitelisting/replacement/etc. + TypeKind::TemplateAlias(inner, _) + if for_name_checking => { item = ctx.resolve_item(inner); - assert_eq!(item.id(), item.name_target(ctx, for_name_checking)); + assert_eq!(item.id(), + item.name_target(ctx, + for_name_checking)); return item.id(); } _ => return item.id(), } - }, + } _ => return item.id(), } } @@ -580,9 +590,7 @@ impl Item { let func = item.expect_function(); func.name() == func_name }) - .enumerate() - .find(|&(_, ref method)| method.signature() == self.id()) - .map(|(idx, _)| idx); + .position(|method| method.signature() == self.id()); } } @@ -595,24 +603,33 @@ impl Item { /// The `for_name_checking` boolean parameter informs us whether we are /// asking for the name in order to do a whitelisting/replacement/etc check /// or if we are instead using it for code generation. - fn base_name(&self, ctx: &BindgenContext, for_name_checking: bool) -> String { + fn base_name(&self, + ctx: &BindgenContext, + for_name_checking: bool) + -> String { match *self.kind() { ItemKind::Var(ref var) => var.name().to_owned(), ItemKind::Module(ref module) => { module.name() .map(ToOwned::to_owned) - .unwrap_or_else(|| format!("_bindgen_mod_{}", self.exposed_id(ctx))) - }, + .unwrap_or_else(|| { + format!("_bindgen_mod_{}", self.exposed_id(ctx)) + }) + } ItemKind::Type(ref ty) => { let name = match *ty.kind() { - TypeKind::ResolvedTypeRef(..) => - panic!("should have resolved this in name_target()"), - TypeKind::TemplateAlias(..) if !for_name_checking => Some(""), - TypeKind::TemplateAlias(..) => None, + TypeKind::ResolvedTypeRef(..) => { + panic!("should have resolved this in name_target()") + } + TypeKind::TemplateAlias(..) => { + if for_name_checking { None } else { Some("") } + } _ => ty.name(), }; name.map(ToOwned::to_owned) - .unwrap_or_else(|| format!("_bindgen_ty_{}", self.exposed_id(ctx))) + .unwrap_or_else(|| { + format!("_bindgen_ty_{}", self.exposed_id(ctx)) + }) } ItemKind::Function(ref fun) => { let mut name = fun.name().to_owned(); @@ -624,7 +641,7 @@ impl Item { } name - }, + } } } From 5c764836380a2987da0db3997d26589e9e79d8c8 Mon Sep 17 00:00:00 2001 From: Artem Biryukov Date: Mon, 21 Nov 2016 20:00:19 +0300 Subject: [PATCH 0119/2291] Apply fixes due code review for issue #57 --- libbindgen/src/codegen/mod.rs | 62 ++++++++----------- .../tests/expectations/tests/anon_union.rs | 2 +- .../expectations/tests/class_with_dtor.rs | 2 +- libbindgen/tests/expectations/tests/crtp.rs | 4 +- .../tests/expectations/tests/template.rs | 4 +- 5 files changed, 31 insertions(+), 43 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 6730a9100c..392ec28a36 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -653,45 +653,33 @@ impl CodeGenerator for CompInfo { // Don't output classes with template parameters that aren't types, and // also don't output template specializations, neither total or partial. - // - // TODO: Generate layout tests for template specializations, yay! - - // TODO (imp): I will keep it like that right now and move it to function later - if self.has_non_type_template_params() || - self.is_template_specialization() { - let layout = item.kind().expect_type().layout(ctx); - let canonical_name = item.canonical_name(ctx); - - if let Some(layout) = layout { + if self.has_non_type_template_params() { + return; + } - let mut types = String::new(); + if self.is_template_specialization() { + let layout = item.kind().expect_type().layout(ctx); - for arg in self.template_args() { - if let Some(name) = ctx.resolve_type(*arg).name() { - // hope this isn't bad - types.push_str(format!("_{}", name).as_str()); - } - } - - let fn_name = format!("bindgen_test_layout_template_{}{}", canonical_name, types); - let fn_name = ctx.rust_ident_raw(&fn_name); - let ident = item.to_rust_ty(ctx); - let prefix = ctx.trait_prefix(); - let size_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::size_of::<$ident>()); - let align_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::align_of::<$ident>()); - let size = layout.size; - let align = layout.align; - let item = quote_item!(ctx.ext_cx(), - #[test] - fn $fn_name() { - assert_eq!($size_of_expr, $size); - assert_eq!($align_of_expr, $align); - }).unwrap(); - result.push(item); - } - return; + if let Some(layout) = layout { + let fn_name = format!("__bindgen_test_layout_template_{}", item.id().as_usize()); + let fn_name = ctx.rust_ident_raw(&fn_name); + let ident = item.to_rust_ty(ctx); + let prefix = ctx.trait_prefix(); + let size_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::size_of::<$ident>()); + let align_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::align_of::<$ident>()); + let size = layout.size; + let align = layout.align; + let item = quote_item!(ctx.ext_cx(), + #[test] + fn $fn_name() { + assert_eq!($size_of_expr, $size); + assert_eq!($align_of_expr, $align); + }).unwrap(); + result.push(item); + } + return; } let applicable_template_args = item.applicable_template_args(ctx); diff --git a/libbindgen/tests/expectations/tests/anon_union.rs b/libbindgen/tests/expectations/tests/anon_union.rs index 2dc206b728..915dfbd5b1 100644 --- a/libbindgen/tests/expectations/tests/anon_union.rs +++ b/libbindgen/tests/expectations/tests/anon_union.rs @@ -76,7 +76,7 @@ impl Clone for ErrorResult { fn clone(&self) -> Self { *self } } #[test] -fn bindgen_test_layout_template_TErrorResult_int() { +fn __bindgen_test_layout_template_17() { assert_eq!(::std::mem::size_of::>() , 24usize); assert_eq!(::std::mem::align_of::>() , diff --git a/libbindgen/tests/expectations/tests/class_with_dtor.rs b/libbindgen/tests/expectations/tests/class_with_dtor.rs index f09699ca0e..88c036b6a4 100644 --- a/libbindgen/tests/expectations/tests/class_with_dtor.rs +++ b/libbindgen/tests/expectations/tests/class_with_dtor.rs @@ -21,7 +21,7 @@ fn bindgen_test_layout_WithoutDtor() { assert_eq!(::std::mem::align_of::() , 8usize); } #[test] -fn bindgen_test_layout_template_HandleWithDtor_int() { +fn __bindgen_test_layout_template_11() { assert_eq!(::std::mem::size_of::>() , 8usize); assert_eq!(::std::mem::align_of::>() diff --git a/libbindgen/tests/expectations/tests/crtp.rs b/libbindgen/tests/expectations/tests/crtp.rs index 3962959916..a50e05e431 100644 --- a/libbindgen/tests/expectations/tests/crtp.rs +++ b/libbindgen/tests/expectations/tests/crtp.rs @@ -24,7 +24,7 @@ impl Clone for Derived { fn clone(&self) -> Self { *self } } #[test] -fn bindgen_test_layout_template_Base() { +fn __bindgen_test_layout_template_5() { assert_eq!(::std::mem::size_of::>() , 1usize); assert_eq!(::std::mem::align_of::>() , 1usize); } @@ -47,7 +47,7 @@ fn bindgen_test_layout_DerivedFromBaseWithDestructor() { 1usize); } #[test] -fn bindgen_test_layout_template_BaseWithDestructor() { +fn __bindgen_test_layout_template_12() { assert_eq!(::std::mem::size_of::>() , 1usize); assert_eq!(::std::mem::align_of::>() diff --git a/libbindgen/tests/expectations/tests/template.rs b/libbindgen/tests/expectations/tests/template.rs index 970b9037ac..21814baa5d 100644 --- a/libbindgen/tests/expectations/tests/template.rs +++ b/libbindgen/tests/expectations/tests/template.rs @@ -13,7 +13,7 @@ pub struct Foo { pub _phantom_1: ::std::marker::PhantomData, } #[test] -fn bindgen_test_layout_template_Foo_int_int() { +fn __bindgen_test_layout_template_10() { assert_eq!(::std::mem::size_of::>() , 24usize); assert_eq!(::std::mem::align_of::>() @@ -176,7 +176,7 @@ pub struct TemplateWithVar { pub _phantom_0: ::std::marker::PhantomData, } #[test] -fn bindgen_test_layout_template_WithDtor_int() { +fn __bindgen_test_layout_template_132() { assert_eq!(::std::mem::size_of::>() , 4usize); assert_eq!(::std::mem::align_of::>() , From d62af02361be371ded003cb4d293aea8d0762ae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 21 Nov 2016 10:16:47 +0100 Subject: [PATCH 0120/2291] ir: Properly recurse inside types. --- libbindgen/src/ir/item.rs | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index c370c8b0e7..4699af7884 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -1,6 +1,7 @@ //! Bindgen's core intermediate representation type. use clang; +use clangll; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use std::cell::{Cell, RefCell}; use std::fmt::Write; @@ -1021,19 +1022,35 @@ impl ClangItemParser for Item { assert_eq!(popped_decl, declaration_to_look_for); } - location.visit(|cur| { + fn visit_child(cur: clang::Cursor, + id: ItemId, + ty: &clang::Type, + parent_id: Option, + ctx: &mut BindgenContext, + result: &mut Result) + -> clangll::Enum_CXChildVisitResult { use clangll::*; - result = Item::from_ty_with_id(id, - ty, - Some(cur), - parent_id, - ctx); - match result { + if result.is_ok() { + return CXChildVisit_Break; + } + + *result = Item::from_ty_with_id(id, + ty, + Some(cur), + parent_id, + ctx); + + match *result { Ok(..) => CXChildVisit_Break, - Err(ParseError::Recurse) => CXChildVisit_Recurse, + Err(ParseError::Recurse) => { + cur.visit(|c| visit_child(c, id, ty, parent_id, ctx, result)); + CXChildVisit_Continue + } Err(ParseError::Continue) => CXChildVisit_Continue, } - }); + } + + location.visit(|cur| visit_child(cur, id, ty, parent_id, ctx, &mut result)); if valid_decl { ctx.currently_parsed_types From 326796e6af5e05135427fd42475ca20f2de38a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 21 Nov 2016 10:17:25 +0100 Subject: [PATCH 0121/2291] ir: Explicitly bypass NamespaceRef's --- libbindgen/src/ir/ty.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 60611b8d9f..1980b088db 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -709,6 +709,9 @@ impl Type { ctx); return Ok(ParseResult::AlreadyResolved(item)); } + CXCursor_NamespaceRef => { + return Err(ParseError::Continue); + } _ => { if ty.kind() == CXType_Unexposed { warn!("Unexposed type {:?}, recursing inside, \ From 91f279f735e3501cd738e4bff0371b41a830410c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 21 Nov 2016 10:19:05 +0100 Subject: [PATCH 0122/2291] ir: Pass the location instead of the declaration for TemplateRef's. --- libbindgen/src/ir/ty.rs | 19 ++++++++++++------ .../expectations/tests/templateref_opaque.rs | 20 +++++++++++++++++++ .../tests/headers/templateref_opaque.hpp | 11 ++++++++++ 3 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/templateref_opaque.rs create mode 100644 libbindgen/tests/headers/templateref_opaque.hpp diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 1980b088db..1e4c40ef1a 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -685,26 +685,33 @@ impl Type { CXCursor_TemplateRef => { let referenced = location.referenced().unwrap(); let referenced_ty = referenced.cur_type(); - let referenced_declaration = - Some(referenced_ty.declaration()); + + debug!("TemplateRef {:?} {:?} {:?}", + location, + referenced, + referenced_ty); return Self::from_clang_ty(potential_id, &referenced_ty, - referenced_declaration, + Some(referenced), parent_id, ctx); } CXCursor_TypeRef => { let referenced = location.referenced().unwrap(); let referenced_ty = referenced.cur_type(); - let referenced_declaration = - Some(referenced_ty.declaration()); + let declaration = referenced_ty.declaration(); + + debug!("TypeRef {:?} {:?} {:?}", + location, + referenced, + referenced_ty); let item = Item::from_ty_or_ref_with_id( potential_id, referenced_ty, - referenced_declaration, + Some(declaration), parent_id, ctx); return Ok(ParseResult::AlreadyResolved(item)); diff --git a/libbindgen/tests/expectations/tests/templateref_opaque.rs b/libbindgen/tests/expectations/tests/templateref_opaque.rs new file mode 100644 index 0000000000..d69254c814 --- /dev/null +++ b/libbindgen/tests/expectations/tests/templateref_opaque.rs @@ -0,0 +1,20 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct detail_PointerType { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +pub type detail_PointerType_Type = *mut T; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct UniquePtr { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +pub type UniquePtr_Pointer = detail_PointerType; diff --git a/libbindgen/tests/headers/templateref_opaque.hpp b/libbindgen/tests/headers/templateref_opaque.hpp new file mode 100644 index 0000000000..ca154c34c9 --- /dev/null +++ b/libbindgen/tests/headers/templateref_opaque.hpp @@ -0,0 +1,11 @@ + +namespace detail { +template +struct PointerType { + typedef T* Type; +}; +} +template +class UniquePtr { + typedef typename detail::PointerType Pointer; +}; From f522b613b899e70a6141375dd46da1a6f49db360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 21 Nov 2016 19:23:54 +0100 Subject: [PATCH 0123/2291] Address review comments. --- libbindgen/src/ir/item.rs | 57 +++++++++++++++++++-------------------- libbindgen/src/ir/ty.rs | 17 ++++++------ 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 4699af7884..32e3c4c52a 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -734,6 +734,31 @@ impl Item { } } +// An utility function to handle recursing inside nested types. +fn visit_child(cur: clang::Cursor, + id: ItemId, + ty: &clang::Type, + parent_id: Option, + ctx: &mut BindgenContext, + result: &mut Result) + -> clangll::Enum_CXChildVisitResult { + use clangll::*; + if result.is_ok() { + return CXChildVisit_Break; + } + + *result = Item::from_ty_with_id(id, ty, Some(cur), parent_id, ctx); + + match *result { + Ok(..) => CXChildVisit_Break, + Err(ParseError::Recurse) => { + cur.visit(|c| visit_child(c, id, ty, parent_id, ctx, result)); + CXChildVisit_Continue + } + Err(ParseError::Continue) => CXChildVisit_Continue, + } +} + impl ClangItemParser for Item { fn builtin_type(kind: TypeKind, is_const: bool, @@ -1022,35 +1047,9 @@ impl ClangItemParser for Item { assert_eq!(popped_decl, declaration_to_look_for); } - fn visit_child(cur: clang::Cursor, - id: ItemId, - ty: &clang::Type, - parent_id: Option, - ctx: &mut BindgenContext, - result: &mut Result) - -> clangll::Enum_CXChildVisitResult { - use clangll::*; - if result.is_ok() { - return CXChildVisit_Break; - } - - *result = Item::from_ty_with_id(id, - ty, - Some(cur), - parent_id, - ctx); - - match *result { - Ok(..) => CXChildVisit_Break, - Err(ParseError::Recurse) => { - cur.visit(|c| visit_child(c, id, ty, parent_id, ctx, result)); - CXChildVisit_Continue - } - Err(ParseError::Continue) => CXChildVisit_Continue, - } - } - - location.visit(|cur| visit_child(cur, id, ty, parent_id, ctx, &mut result)); + location.visit(|cur| { + visit_child(cur, id, ty, parent_id, ctx, &mut result) + }); if valid_decl { ctx.currently_parsed_types diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 1e4c40ef1a..7f01e388e4 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -686,7 +686,8 @@ impl Type { let referenced = location.referenced().unwrap(); let referenced_ty = referenced.cur_type(); - debug!("TemplateRef {:?} {:?} {:?}", + debug!("TemplateRef: location = {:?}; referenced = \ + {:?}; referenced_ty = {:?}", location, referenced, referenced_ty); @@ -702,18 +703,18 @@ impl Type { let referenced_ty = referenced.cur_type(); let declaration = referenced_ty.declaration(); - debug!("TypeRef {:?} {:?} {:?}", + debug!("TypeRef: location = {:?}; referenced = \ + {:?}; referenced_ty = {:?}", location, referenced, referenced_ty); let item = - Item::from_ty_or_ref_with_id( - potential_id, - referenced_ty, - Some(declaration), - parent_id, - ctx); + Item::from_ty_or_ref_with_id(potential_id, + referenced_ty, + Some(declaration), + parent_id, + ctx); return Ok(ParseResult::AlreadyResolved(item)); } CXCursor_NamespaceRef => { From 77868f4379dc40b91dfd3674c8091c14dcf69ecd Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 21 Nov 2016 10:59:36 -0800 Subject: [PATCH 0124/2291] Recurse on the innter type when finding a template alias name target The assertion that the template alias's inner type was our name target, and that we didn't need to recurse, is failing when generating SpiderMonkey bindings. I'm not 100% sure when this can happen, but clearly it can, and it is easy to support, so let's support it. --- libbindgen/src/ir/item.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 32e3c4c52a..d96936ad62 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -556,10 +556,6 @@ impl Item { TypeKind::TemplateAlias(inner, _) if for_name_checking => { item = ctx.resolve_item(inner); - assert_eq!(item.id(), - item.name_target(ctx, - for_name_checking)); - return item.id(); } _ => return item.id(), } From bd29a7a86ec9b7a2666fe290da940e319e71b008 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 21 Nov 2016 14:28:35 -0800 Subject: [PATCH 0125/2291] Trace function signature types This extends the `TypeCollector` trait implementation for `Item` to consider items of kind `Function` and to collect the types found in the function's signature. Fixes #291 --- libbindgen/src/ir/item.rs | 5 +++++ ...type-referenced-by-whitelisted-function.rs | 22 +++++++++++++++++++ .../type-referenced-by-whitelisted-function.h | 7 ++++++ 3 files changed, 34 insertions(+) create mode 100644 libbindgen/tests/expectations/tests/type-referenced-by-whitelisted-function.rs create mode 100644 libbindgen/tests/headers/type-referenced-by-whitelisted-function.h diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index d96936ad62..b857acf90c 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -142,6 +142,11 @@ impl TypeCollector for Item { ty.collect_types(ctx, types, self); } } + ItemKind::Function(ref fun) => { + if !self.is_opaque(ctx) { + types.insert(fun.signature()); + } + } _ => {} // FIXME. } } diff --git a/libbindgen/tests/expectations/tests/type-referenced-by-whitelisted-function.rs b/libbindgen/tests/expectations/tests/type-referenced-by-whitelisted-function.rs new file mode 100644 index 0000000000..c968650115 --- /dev/null +++ b/libbindgen/tests/expectations/tests/type-referenced-by-whitelisted-function.rs @@ -0,0 +1,22 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct dl_phdr_info { + pub x: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_dl_phdr_info() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for dl_phdr_info { + fn clone(&self) -> Self { *self } +} +extern "C" { + pub fn dl_iterate_phdr(arg1: *mut dl_phdr_info) -> ::std::os::raw::c_int; +} diff --git a/libbindgen/tests/headers/type-referenced-by-whitelisted-function.h b/libbindgen/tests/headers/type-referenced-by-whitelisted-function.h new file mode 100644 index 0000000000..86b0030300 --- /dev/null +++ b/libbindgen/tests/headers/type-referenced-by-whitelisted-function.h @@ -0,0 +1,7 @@ +// bindgen-flags: --whitelist-function dl_iterate_phdr + +struct dl_phdr_info { + int x; +}; + +int dl_iterate_phdr(struct dl_phdr_info *); From b1736b936e6c8a5fd8885c3ea79e38a2be689d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 22 Nov 2016 10:27:47 +0100 Subject: [PATCH 0126/2291] ir: Deduplicate namespaces. --- libbindgen/src/ir/context.rs | 2 + .../duplicated-namespaces-definitions.rs | 45 +++++++++++++++++++ .../tests/duplicated-namespaces.rs | 14 ++++++ .../tests/expectations/tests/typeref.rs | 26 +++++------ .../duplicated-namespaces-definitions.hpp | 18 ++++++++ .../tests/headers/duplicated-namespaces.hpp | 4 ++ 6 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/duplicated-namespaces-definitions.rs create mode 100644 libbindgen/tests/expectations/tests/duplicated-namespaces.rs create mode 100644 libbindgen/tests/headers/duplicated-namespaces-definitions.hpp create mode 100644 libbindgen/tests/headers/duplicated-namespaces.hpp diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 7c643f04a0..76e27841ba 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -888,6 +888,8 @@ impl<'ctx> BindgenContext<'ctx> { self.current_module, ItemKind::Module(module)); + self.modules.insert(cursor, module.id()); + self.add_item(module, None, None); module_id diff --git a/libbindgen/tests/expectations/tests/duplicated-namespaces-definitions.rs b/libbindgen/tests/expectations/tests/duplicated-namespaces-definitions.rs new file mode 100644 index 0000000000..314a24a326 --- /dev/null +++ b/libbindgen/tests/expectations/tests/duplicated-namespaces-definitions.rs @@ -0,0 +1,45 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use root; + pub mod foo { + #[allow(unused_imports)] + use root; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Bar { + pub foo: ::std::os::raw::c_int, + pub baz: bool, + } + #[test] + fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 4usize); + } + impl Clone for Bar { + fn clone(&self) -> Self { *self } + } + } + pub mod bar { + #[allow(unused_imports)] + use root; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Foo { + pub ptr: *mut root::foo::Bar, + } + #[test] + fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); + } + impl Clone for Foo { + fn clone(&self) -> Self { *self } + } + } +} diff --git a/libbindgen/tests/expectations/tests/duplicated-namespaces.rs b/libbindgen/tests/expectations/tests/duplicated-namespaces.rs new file mode 100644 index 0000000000..786fe1a55c --- /dev/null +++ b/libbindgen/tests/expectations/tests/duplicated-namespaces.rs @@ -0,0 +1,14 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use root; + pub mod std { + #[allow(unused_imports)] + use root; + } +} diff --git a/libbindgen/tests/expectations/tests/typeref.rs b/libbindgen/tests/expectations/tests/typeref.rs index 21217ced12..1188393dd3 100644 --- a/libbindgen/tests/expectations/tests/typeref.rs +++ b/libbindgen/tests/expectations/tests/typeref.rs @@ -68,19 +68,6 @@ impl Clone for mozilla_Position { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] -pub struct Bar { - pub mFoo: *mut nsFoo, -} -#[test] -fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); -} -impl Clone for Bar { - fn clone(&self) -> Self { *self } -} -#[repr(C)] #[derive(Debug, Copy, Clone)] pub struct mozilla_StyleShapeSource { pub __bindgen_anon_1: mozilla_StyleShapeSource__bindgen_ty_1, @@ -94,3 +81,16 @@ pub struct mozilla_StyleShapeSource__bindgen_ty_1 { pub bindgen_union_field: u64, pub _phantom_0: ::std::marker::PhantomData, } +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Bar { + pub mFoo: *mut nsFoo, +} +#[test] +fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for Bar { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/headers/duplicated-namespaces-definitions.hpp b/libbindgen/tests/headers/duplicated-namespaces-definitions.hpp new file mode 100644 index 0000000000..7c8888def2 --- /dev/null +++ b/libbindgen/tests/headers/duplicated-namespaces-definitions.hpp @@ -0,0 +1,18 @@ +// bindgen-flags: --enable-cxx-namespaces + +namespace foo { + class Bar; +} + +namespace bar { + struct Foo { + foo::Bar* ptr; + }; +}; + +namespace foo { + class Bar { + int foo; + bool baz; + }; +} diff --git a/libbindgen/tests/headers/duplicated-namespaces.hpp b/libbindgen/tests/headers/duplicated-namespaces.hpp new file mode 100644 index 0000000000..10e1933f43 --- /dev/null +++ b/libbindgen/tests/headers/duplicated-namespaces.hpp @@ -0,0 +1,4 @@ +// bindgen-flags: --enable-cxx-namespaces + +namespace std {} +namespace std {} From 26d4c73dd364fb52ac459ff642fade6c6a3895a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 22 Nov 2016 13:15:56 +0100 Subject: [PATCH 0127/2291] A more coherent story for whitelisting. --- libbindgen/src/codegen/mod.rs | 77 ++++++------------- libbindgen/src/ir/context.rs | 35 +++++---- libbindgen/src/ir/item.rs | 19 ++++- .../tests/maddness-is-avoidable.rs | 20 +++++ .../expectations/tests/module-whitelisted.rs | 23 ++++++ .../tests/expectations/tests/namespace.rs | 12 --- .../tests/expectations/tests/replace_use.rs | 28 +++++++ .../tests/expectations/tests/whitelist_fix.rs | 10 +++ .../tests/headers/maddness-is-avoidable.hpp | 9 +++ .../tests/headers/module-whitelisted.hpp | 2 + libbindgen/tests/headers/replace_use.hpp | 15 ++++ .../headers/whitelist-namespaces-basic.hpp | 2 +- libbindgen/tests/headers/whitelist_fix.hpp | 4 + 13 files changed, 169 insertions(+), 87 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/maddness-is-avoidable.rs create mode 100644 libbindgen/tests/expectations/tests/module-whitelisted.rs create mode 100644 libbindgen/tests/expectations/tests/replace_use.rs create mode 100644 libbindgen/tests/expectations/tests/whitelist_fix.rs create mode 100644 libbindgen/tests/headers/maddness-is-avoidable.hpp create mode 100644 libbindgen/tests/headers/module-whitelisted.hpp create mode 100644 libbindgen/tests/headers/replace_use.hpp create mode 100644 libbindgen/tests/headers/whitelist_fix.hpp diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index a3fefcc72a..0469a5be04 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -242,11 +242,6 @@ impl CodeGenerator for Item { match *self.kind() { ItemKind::Module(ref module) => { - if !ctx.options().enable_cxx_namespaces && - self.id() == ctx.root_module() { - return; - } - module.codegen(ctx, result, whitelisted_items, self); } ItemKind::Function(ref fun) => { @@ -274,22 +269,28 @@ impl CodeGenerator for Module { item: &Item) { debug!("::codegen: item = {:?}", item); - if !ctx.options().enable_cxx_namespaces { - for child in self.children() { - ctx.resolve_item(*child) - .codegen(ctx, result, whitelisted_items, &()); + let codegen_self = |result: &mut CodegenResult| { + // FIXME: This could be less expensive, I guess. + for &whitelisted_item in whitelisted_items { + if whitelisted_item == item.id() { + continue; + } + + let child = ctx.resolve_item(whitelisted_item); + if child.parent_id() == item.id() { + child.codegen(ctx, result, whitelisted_items, &()); + } } + }; + + if !ctx.options().enable_cxx_namespaces { + codegen_self(result); return; } let inner_items = result.inner(|result| { result.push(root_import(ctx)); - for child in self.children() { - if whitelisted_items.contains(child) { - ctx.resolve_item(*child) - .codegen(ctx, result, whitelisted_items, &()); - } - } + codegen_self(result); }); let module = ast::ItemKind::Mod(ast::Mod { @@ -428,13 +429,12 @@ impl CodeGenerator for Type { TypeKind::Comp(ref ci) => { ci.codegen(ctx, result, whitelisted_items, item) } + // NB: The inner Alias will be generated and pick the correct + // applicable_template_args. TypeKind::TemplateAlias(inner, _) => { - // NB: The inner Alias will pick the correct - // applicable_template_args. - let inner_item = ctx.resolve_item(inner); - inner_item.expect_type() - .codegen(ctx, result, whitelisted_items, inner_item); - } + ctx.resolve_item(inner) + .codegen(ctx, result, whitelisted_items, &()) + }, TypeKind::Alias(ref spelling, inner) => { let inner_item = ctx.resolve_item(inner); let name = item.canonical_name(ctx); @@ -1964,27 +1964,6 @@ impl CodeGenerator for Function { } } -// Return true if any of the ancestors of `id` are in the whitelisted items set, -// false otherwise. -fn ancestor_is_whitelisted(ctx: &BindgenContext, - whitelisted_items: &ItemSet, - id: ItemId) - -> bool { - let item = ctx.resolve_item(id); - let mut last = id; - let mut current = item.parent_id(); - - while last != current { - if whitelisted_items.contains(¤t) { - return true; - } - last = current; - current = ctx.resolve_item(current).parent_id(); - } - - false -} - pub fn codegen(context: &mut BindgenContext) -> Vec> { context.gen(|context| { let mut result = CodegenResult::new(); @@ -2000,18 +1979,8 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { } } - for &id in whitelisted_items.iter() { - let item = context.resolve_item(id); - - // Non-toplevel items' parents are responsible one for generating - // their children. However, if we find an orphaned reference to a - // non-toplevel item whose parent is not in our whitelisted set, we - // need to take responsibility for generating it. - if item.is_toplevel(context) || - !ancestor_is_whitelisted(context, &whitelisted_items, id) { - item.codegen(context, &mut result, &whitelisted_items, &()); - } - } + context.resolve_item(context.root_module()) + .codegen(context, &mut result, &whitelisted_items, &()); let saw_union = result.saw_union; let mut result = result.items; diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 76e27841ba..e599160e5d 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -10,7 +10,7 @@ use std::collections::{HashMap, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; use super::int::IntKind; -use super::item::{Item, ItemCanonicalName}; +use super::item::Item; use super::item_kind::ItemKind; use super::module::Module; use super::ty::{FloatKind, Type, TypeKind}; @@ -938,11 +938,9 @@ impl<'ctx> BindgenContext<'ctx> { return true; } - let name = item.canonical_name(self); + let name = item.real_canonical_name(self, false, true); match *item.kind() { - ItemKind::Module(..) => { - self.options().enable_cxx_namespaces - } + ItemKind::Module(..) => true, ItemKind::Function(_) => { self.options().whitelisted_functions.matches(&name) } @@ -954,18 +952,21 @@ impl<'ctx> BindgenContext<'ctx> { return true; } - // Unnamed top-level enums are special and we whitelist - // them via the `whitelisted_vars` filter, since they're - // effectively top-level constants, and there's no way - // for them to be referenced consistently. - if let TypeKind::Enum(ref enum_) = *ty.kind() { - if ty.name().is_none() && - enum_.variants().iter().any(|variant| { - self.options() - .whitelisted_vars - .matches(&variant.name()) - }) { - return true; + if self.resolve_item(item.parent_id()).is_module() { + // Unnamed top-level enums are special and we + // whitelist them via the `whitelisted_vars` filter, + // since they're effectively top-level constants, + // and there's no way for them to be referenced + // consistently. + if let TypeKind::Enum(ref enum_) = *ty.kind() { + if ty.name().is_none() && + enum_.variants().iter().any(|variant| { + self.options() + .whitelisted_vars + .matches(&variant.name()) + }) { + return true; + } } } diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index b857acf90c..1f15ff0ffc 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -532,6 +532,14 @@ impl Item { self.as_type().map_or(false, |ty| ty.is_type_ref()) } + /// Is this item a var type? + pub fn is_var(&self) -> bool { + match *self.kind() { + ItemKind::Var(..) => true, + _ => false, + } + } + /// Get the target item id for name generation. fn name_target(&self, ctx: &BindgenContext, @@ -664,6 +672,14 @@ impl Item { for_name_checking: bool) -> String { let target = ctx.resolve_item(self.name_target(ctx, for_name_checking)); + + // Short-circuit if the target has an override, and just use that. + if !for_name_checking { + if let Some(other) = target.annotations.use_instead_of() { + return other.to_owned(); + } + } + let base_name = target.base_name(ctx, for_name_checking); // Named template type arguments are never namespaced, and never @@ -1135,9 +1151,6 @@ impl ItemCanonicalName for Item { fn canonical_name(&self, ctx: &BindgenContext) -> String { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); - if let Some(other_canon_type) = self.annotations.use_instead_of() { - return other_canon_type.to_owned(); - } if self.canonical_name_cache.borrow().is_none() { *self.canonical_name_cache.borrow_mut() = Some(self.real_canonical_name(ctx, diff --git a/libbindgen/tests/expectations/tests/maddness-is-avoidable.rs b/libbindgen/tests/expectations/tests/maddness-is-avoidable.rs new file mode 100644 index 0000000000..d31345ba67 --- /dev/null +++ b/libbindgen/tests/expectations/tests/maddness-is-avoidable.rs @@ -0,0 +1,20 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RefPtr { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RefPtr_Proxy { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, + pub _phantom_1: ::std::marker::PhantomData, + pub _phantom_2: ::std::marker::PhantomData, +} diff --git a/libbindgen/tests/expectations/tests/module-whitelisted.rs b/libbindgen/tests/expectations/tests/module-whitelisted.rs new file mode 100644 index 0000000000..7e63c8c8eb --- /dev/null +++ b/libbindgen/tests/expectations/tests/module-whitelisted.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use root; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Test { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_Test() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); + } + impl Clone for Test { + fn clone(&self) -> Self { *self } + } +} diff --git a/libbindgen/tests/expectations/tests/namespace.rs b/libbindgen/tests/expectations/tests/namespace.rs index abb48204cb..54bc08dc6e 100644 --- a/libbindgen/tests/expectations/tests/namespace.rs +++ b/libbindgen/tests/expectations/tests/namespace.rs @@ -76,15 +76,3 @@ pub mod root { } } } -extern "C" { - #[link_name = "_Z9top_levelv"] - pub fn top_level(); -} -#[repr(C)] -#[derive(Debug)] -pub struct C { - pub _base: root::_bindgen_mod_id_13::A, - pub m_c: T, - pub m_c_ptr: *mut T, - pub m_c_arr: [T; 10usize], -} diff --git a/libbindgen/tests/expectations/tests/replace_use.rs b/libbindgen/tests/expectations/tests/replace_use.rs new file mode 100644 index 0000000000..f4fee44209 --- /dev/null +++ b/libbindgen/tests/expectations/tests/replace_use.rs @@ -0,0 +1,28 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +/** + *
+ */ +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct nsTArray { + pub y: ::std::os::raw::c_uint, + pub _phantom_0: ::std::marker::PhantomData, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Test { + pub a: nsTArray<::std::os::raw::c_long>, +} +#[test] +fn bindgen_test_layout_Test() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for Test { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/expectations/tests/whitelist_fix.rs b/libbindgen/tests/expectations/tests/whitelist_fix.rs new file mode 100644 index 0000000000..9e26e1bed0 --- /dev/null +++ b/libbindgen/tests/expectations/tests/whitelist_fix.rs @@ -0,0 +1,10 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +pub enum Test {} + +extern "C" { + pub fn Servo_Test(a: *mut Test); +} diff --git a/libbindgen/tests/headers/maddness-is-avoidable.hpp b/libbindgen/tests/headers/maddness-is-avoidable.hpp new file mode 100644 index 0000000000..46d7495ead --- /dev/null +++ b/libbindgen/tests/headers/maddness-is-avoidable.hpp @@ -0,0 +1,9 @@ +// bindgen-flags: --blacklist-type RefPtr_Proxy_member_function + +template +class RefPtr { + template + class Proxy { + typedef R (T::*member_function)(Args...); + }; +}; diff --git a/libbindgen/tests/headers/module-whitelisted.hpp b/libbindgen/tests/headers/module-whitelisted.hpp new file mode 100644 index 0000000000..f41e874edd --- /dev/null +++ b/libbindgen/tests/headers/module-whitelisted.hpp @@ -0,0 +1,2 @@ +// bindgen-flags: --enable-cxx-namespaces +struct Test {}; diff --git a/libbindgen/tests/headers/replace_use.hpp b/libbindgen/tests/headers/replace_use.hpp new file mode 100644 index 0000000000..de44eb19cc --- /dev/null +++ b/libbindgen/tests/headers/replace_use.hpp @@ -0,0 +1,15 @@ +template +struct nsTArray { + int x; +}; +/** + *
+ */ +template +struct nsTArray_Simple { + unsigned int y; +}; + +struct Test { + nsTArray a; +}; diff --git a/libbindgen/tests/headers/whitelist-namespaces-basic.hpp b/libbindgen/tests/headers/whitelist-namespaces-basic.hpp index b631d290c5..abe9dc11ba 100644 --- a/libbindgen/tests/headers/whitelist-namespaces-basic.hpp +++ b/libbindgen/tests/headers/whitelist-namespaces-basic.hpp @@ -1,4 +1,4 @@ -// bindgen-flags: --enable-cxx-namespaces --whitelist-type '.*Helper' +// bindgen-flags: --enable-cxx-namespaces --whitelist-type outer_inner_Helper namespace outer { namespace inner { diff --git a/libbindgen/tests/headers/whitelist_fix.hpp b/libbindgen/tests/headers/whitelist_fix.hpp new file mode 100644 index 0000000000..d0abda540d --- /dev/null +++ b/libbindgen/tests/headers/whitelist_fix.hpp @@ -0,0 +1,4 @@ +// bindgen-flags: --whitelist-function 'Servo_.*' --blacklist-type Test --raw-line "pub enum Test {}" + +struct Test {}; +extern "C" void Servo_Test(Test* a); From 2fa8409d1652b5f81c01d8ccb53bc30202249d95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 22 Nov 2016 19:38:22 +0100 Subject: [PATCH 0128/2291] codegen: Don't bother generating an empty module. --- libbindgen/src/codegen/mod.rs | 13 ++++++++++--- .../expectations/tests/duplicated-namespaces.rs | 4 ---- libbindgen/tests/expectations/tests/namespace.rs | 4 ---- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 0469a5be04..ba52fa8332 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -269,7 +269,7 @@ impl CodeGenerator for Module { item: &Item) { debug!("::codegen: item = {:?}", item); - let codegen_self = |result: &mut CodegenResult| { + let codegen_self = |result: &mut CodegenResult, found_any: &mut bool| { // FIXME: This could be less expensive, I guess. for &whitelisted_item in whitelisted_items { if whitelisted_item == item.id() { @@ -278,21 +278,28 @@ impl CodeGenerator for Module { let child = ctx.resolve_item(whitelisted_item); if child.parent_id() == item.id() { + *found_any = true; child.codegen(ctx, result, whitelisted_items, &()); } } }; if !ctx.options().enable_cxx_namespaces { - codegen_self(result); + codegen_self(result, &mut false); return; } + let mut found_any = false; let inner_items = result.inner(|result| { result.push(root_import(ctx)); - codegen_self(result); + codegen_self(result, &mut found_any); }); + // Don't bother creating an empty module. + if !found_any { + return; + } + let module = ast::ItemKind::Mod(ast::Mod { inner: ctx.span(), items: inner_items, diff --git a/libbindgen/tests/expectations/tests/duplicated-namespaces.rs b/libbindgen/tests/expectations/tests/duplicated-namespaces.rs index 786fe1a55c..7a283160a8 100644 --- a/libbindgen/tests/expectations/tests/duplicated-namespaces.rs +++ b/libbindgen/tests/expectations/tests/duplicated-namespaces.rs @@ -7,8 +7,4 @@ pub mod root { #[allow(unused_imports)] use root; - pub mod std { - #[allow(unused_imports)] - use root; - } } diff --git a/libbindgen/tests/expectations/tests/namespace.rs b/libbindgen/tests/expectations/tests/namespace.rs index 54bc08dc6e..34c2da1e8d 100644 --- a/libbindgen/tests/expectations/tests/namespace.rs +++ b/libbindgen/tests/expectations/tests/namespace.rs @@ -23,10 +23,6 @@ pub mod root { pub mod _bindgen_mod_id_13 { #[allow(unused_imports)] use root; - pub mod empty { - #[allow(unused_imports)] - use root; - } extern "C" { #[link_name = "_ZN12_GLOBAL__N_13fooEv"] pub fn foo(); From 1cdec58024f260cfe92917aef783145b528663c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 22 Nov 2016 20:01:29 +0100 Subject: [PATCH 0129/2291] ir: Rework how we discover children of modules. --- libbindgen/src/codegen/mod.rs | 13 +++------- libbindgen/src/ir/context.rs | 24 +++++++++-------- libbindgen/src/ir/module.rs | 4 +-- libbindgen/src/lib.rs | 11 ++++---- .../tests/expectations/tests/anon_union.rs | 14 +++++----- libbindgen/tests/expectations/tests/crtp.rs | 24 ++++++++--------- .../forward-inherit-struct-with-fields.rs | 10 +++---- .../tests/forward-inherit-struct.rs | 4 +-- .../tests/vtable_recursive_sig.rs | 26 +++++++++---------- 9 files changed, 63 insertions(+), 67 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index ba52fa8332..ad9ac2deeb 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -270,16 +270,11 @@ impl CodeGenerator for Module { debug!("::codegen: item = {:?}", item); let codegen_self = |result: &mut CodegenResult, found_any: &mut bool| { - // FIXME: This could be less expensive, I guess. - for &whitelisted_item in whitelisted_items { - if whitelisted_item == item.id() { - continue; - } - - let child = ctx.resolve_item(whitelisted_item); - if child.parent_id() == item.id() { + for child in self.children() { + if whitelisted_items.contains(child) { *found_any = true; - child.codegen(ctx, result, whitelisted_items, &()); + ctx.resolve_item(*child) + .codegen(ctx, result, whitelisted_items, &()); } } }; diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index e599160e5d..67db2a5972 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -184,6 +184,17 @@ impl<'ctx> BindgenContext<'ctx> { let id = item.id(); let is_type = item.kind().is_type(); let is_unnamed = is_type && item.expect_type().name().is_none(); + + // Be sure to track all the generated children under namespace, even + // those generated after resolving typerefs, etc. + if item.id() != item.parent_id() { + if let Some(mut parent) = self.items.get_mut(&item.parent_id()) { + if let Some(mut module) = parent.as_module_mut() { + module.children_mut().push(item.id()); + } + } + } + let old_item = self.items.insert(id, item); assert!(old_item.is_none(), "Inserted type twice?"); @@ -898,23 +909,14 @@ impl<'ctx> BindgenContext<'ctx> { /// Start traversing the module with the given `module_id`, invoke the /// callback `cb`, and then return to traversing the original module. pub fn with_module(&mut self, module_id: ItemId, cb: F) - where F: FnOnce(&mut Self, &mut Vec), + where F: FnOnce(&mut Self), { debug_assert!(self.resolve_item(module_id).kind().is_module(), "Wat"); let previous_id = self.current_module; self.current_module = module_id; - let mut children = vec![]; - cb(self, &mut children); - - self.items - .get_mut(&module_id) - .unwrap() - .as_module_mut() - .expect("Not a module?") - .children_mut() - .extend(children.into_iter()); + cb(self); self.current_module = previous_id; } diff --git a/libbindgen/src/ir/module.rs b/libbindgen/src/ir/module.rs index c5d8cfa79e..7546a63c7a 100644 --- a/libbindgen/src/ir/module.rs +++ b/libbindgen/src/ir/module.rs @@ -47,9 +47,9 @@ impl ClangSubItemParser for Module { match cursor.kind() { CXCursor_Namespace => { let module_id = ctx.module(cursor); - ctx.with_module(module_id, |ctx, children| { + ctx.with_module(module_id, |ctx| { cursor.visit(|cursor| { - parse_one(ctx, cursor, Some(module_id), children) + parse_one(ctx, cursor, Some(module_id)) }) }); diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 84c6931079..10961e3613 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -544,8 +544,7 @@ fn filter_builtins(ctx: &BindgenContext, cursor: &clang::Cursor) -> bool { /// Parse one `Item` from the Clang cursor. pub fn parse_one(ctx: &mut BindgenContext, cursor: clang::Cursor, - parent: Option, - children: &mut Vec) + parent: Option) -> clangll::Enum_CXVisitorResult { if !filter_builtins(ctx, &cursor) { return CXChildVisit_Continue; @@ -553,10 +552,10 @@ pub fn parse_one(ctx: &mut BindgenContext, use clangll::CXChildVisit_Continue; match Item::parse(cursor, parent, ctx) { - Ok(id) => children.push(id), + Ok(..) => {}, Err(ParseError::Continue) => {} Err(ParseError::Recurse) => { - cursor.visit(|child| parse_one(ctx, child, parent, children)); + cursor.visit(|child| parse_one(ctx, child, parent)); } } CXChildVisit_Continue @@ -579,8 +578,8 @@ fn parse(context: &mut BindgenContext) { } let root = context.root_module(); - context.with_module(root, |context, children| { - cursor.visit(|cursor| parse_one(context, cursor, None, children)) + context.with_module(root, |context| { + cursor.visit(|cursor| parse_one(context, cursor, None)) }); assert!(context.current_module() == context.root_module(), diff --git a/libbindgen/tests/expectations/tests/anon_union.rs b/libbindgen/tests/expectations/tests/anon_union.rs index 915dfbd5b1..db03e1774d 100644 --- a/libbindgen/tests/expectations/tests/anon_union.rs +++ b/libbindgen/tests/expectations/tests/anon_union.rs @@ -62,6 +62,13 @@ pub struct TErrorResult__bindgen_ty_1 { pub bindgen_union_field: u64, pub _phantom_0: ::std::marker::PhantomData, } +#[test] +fn __bindgen_test_layout_template_17() { + assert_eq!(::std::mem::size_of::>() , + 24usize); + assert_eq!(::std::mem::align_of::>() , + 8usize); +} #[repr(C)] #[derive(Debug, Copy)] pub struct ErrorResult { @@ -75,10 +82,3 @@ fn bindgen_test_layout_ErrorResult() { impl Clone for ErrorResult { fn clone(&self) -> Self { *self } } -#[test] -fn __bindgen_test_layout_template_17() { - assert_eq!(::std::mem::size_of::>() , - 24usize); - assert_eq!(::std::mem::align_of::>() , - 8usize); -} diff --git a/libbindgen/tests/expectations/tests/crtp.rs b/libbindgen/tests/expectations/tests/crtp.rs index a50e05e431..e21c5de209 100644 --- a/libbindgen/tests/expectations/tests/crtp.rs +++ b/libbindgen/tests/expectations/tests/crtp.rs @@ -10,6 +10,11 @@ pub struct Base { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +#[test] +fn __bindgen_test_layout_template_5() { + assert_eq!(::std::mem::size_of::>() , 1usize); + assert_eq!(::std::mem::align_of::>() , 1usize); +} #[repr(C)] #[derive(Debug, Copy)] pub struct Derived { @@ -23,17 +28,19 @@ fn bindgen_test_layout_Derived() { impl Clone for Derived { fn clone(&self) -> Self { *self } } -#[test] -fn __bindgen_test_layout_template_5() { - assert_eq!(::std::mem::size_of::>() , 1usize); - assert_eq!(::std::mem::align_of::>() , 1usize); -} #[repr(C)] #[derive(Debug)] pub struct BaseWithDestructor { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +#[test] +fn __bindgen_test_layout_template_12() { + assert_eq!(::std::mem::size_of::>() + , 1usize); + assert_eq!(::std::mem::align_of::>() + , 1usize); +} #[repr(C)] #[derive(Debug)] pub struct DerivedFromBaseWithDestructor { @@ -46,10 +53,3 @@ fn bindgen_test_layout_DerivedFromBaseWithDestructor() { assert_eq!(::std::mem::align_of::() , 1usize); } -#[test] -fn __bindgen_test_layout_template_12() { - assert_eq!(::std::mem::size_of::>() - , 1usize); - assert_eq!(::std::mem::align_of::>() - , 1usize); -} diff --git a/libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs b/libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs index 8410497101..fc24e98921 100644 --- a/libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs +++ b/libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs @@ -4,14 +4,14 @@ #![allow(non_snake_case)] -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Rooted { - pub _base: RootedBase, -} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct RootedBase { pub foo: *mut T, pub next: *mut Rooted, } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Rooted { + pub _base: RootedBase, +} diff --git a/libbindgen/tests/expectations/tests/forward-inherit-struct.rs b/libbindgen/tests/expectations/tests/forward-inherit-struct.rs index e053adcd1a..a58058b002 100644 --- a/libbindgen/tests/expectations/tests/forward-inherit-struct.rs +++ b/libbindgen/tests/expectations/tests/forward-inherit-struct.rs @@ -6,13 +6,13 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct Rooted { +pub struct RootedBase { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct RootedBase { +pub struct Rooted { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } diff --git a/libbindgen/tests/expectations/tests/vtable_recursive_sig.rs b/libbindgen/tests/expectations/tests/vtable_recursive_sig.rs index ce62eeb0fc..773123367f 100644 --- a/libbindgen/tests/expectations/tests/vtable_recursive_sig.rs +++ b/libbindgen/tests/expectations/tests/vtable_recursive_sig.rs @@ -4,19 +4,6 @@ #![allow(non_snake_case)] -#[repr(C)] -#[derive(Debug, Copy)] -pub struct Derived { - pub _base: Base, -} -#[test] -fn bindgen_test_layout_Derived() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); -} -impl Clone for Derived { - fn clone(&self) -> Self { *self } -} #[repr(C)] pub struct Base__bindgen_vtable { } @@ -33,3 +20,16 @@ fn bindgen_test_layout_Base() { impl Clone for Base { fn clone(&self) -> Self { *self } } +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Derived { + pub _base: Base, +} +#[test] +fn bindgen_test_layout_Derived() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for Derived { + fn clone(&self) -> Self { *self } +} From 85a9dd3bb491b785318f76c0e176149b5b02934d Mon Sep 17 00:00:00 2001 From: Tai Sassen-Liang Date: Tue, 22 Nov 2016 23:57:29 +0100 Subject: [PATCH 0130/2291] Use is_valid instead of checking directly against Type::kind Thanks for pointing this out @emilio. --- libbindgen/src/clang.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 08c77b19de..2fcaf9a077 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -367,7 +367,7 @@ impl Cursor { let t = Type { x: clang_getEnumDeclIntegerType(self.x), }; - if t.kind() == CXType_Invalid { None } else { Some(t) } + if t.is_valid() { Some(t) } else { None } } } From b8b3d781cd05c56e7748230b2468524098dc1b65 Mon Sep 17 00:00:00 2001 From: Tai Sassen-Liang Date: Tue, 22 Nov 2016 23:58:48 +0100 Subject: [PATCH 0131/2291] Circuit-break if Cursor::enum_type returns None As discussed with @emilio. Part of #125. --- libbindgen/src/ir/enum_ty.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index 33a4fcfae5..14ca496528 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -49,8 +49,11 @@ impl Enum { } let declaration = ty.declaration().canonical(); - let et = &declaration.enum_type().expect("Expected an enum type"); - let repr = Item::from_ty(et, None, None, ctx).ok(); + let et = declaration.enum_type(); + if et.is_none() { + return Err(ParseError::Continue); + } + let repr = Item::from_ty(&et.unwrap(), None, None, ctx).ok(); let mut variants = vec![]; let is_signed = match repr { From 27eea057f029ec8ceada1b0718888a4cbe6ce206 Mon Sep 17 00:00:00 2001 From: Tai Sassen-Liang Date: Wed, 23 Nov 2016 23:48:41 +0100 Subject: [PATCH 0132/2291] Use and_then() to properly handle cases when Cursor::enum_type() return None --- libbindgen/src/ir/enum_ty.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index 14ca496528..f728b22a2d 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -49,11 +49,9 @@ impl Enum { } let declaration = ty.declaration().canonical(); - let et = declaration.enum_type(); - if et.is_none() { - return Err(ParseError::Continue); - } - let repr = Item::from_ty(&et.unwrap(), None, None, ctx).ok(); + let repr = declaration.enum_type().and_then(|et| { + Item::from_ty(&et, None, None, ctx).ok() + }); let mut variants = vec![]; let is_signed = match repr { From 294c1b07e2ed10fb9d6afdd5a6aa234ebf0258d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 24 Nov 2016 21:06:42 +0100 Subject: [PATCH 0133/2291] Add a new disable-name-namespacing option. --- libbindgen/src/ir/context.rs | 6 ++---- libbindgen/src/ir/item.rs | 8 ++++---- libbindgen/src/lib.rs | 20 +++++++++++++++++++ .../expectations/tests/disable-namespacing.rs | 7 +++++++ .../tests/headers/disable-namespacing.hpp | 9 +++++++++ src/options.rs | 7 +++++++ 6 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/disable-namespacing.rs create mode 100644 libbindgen/tests/headers/disable-namespacing.hpp diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 67db2a5972..a0e57610c9 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -367,10 +367,8 @@ impl<'ctx> BindgenContext<'ctx> { _ => continue, } - let name = item.real_canonical_name(self, - self.options() - .enable_cxx_namespaces, - true); + let in_namespace = self.options().enable_cxx_namespaces; + let name = item.real_canonical_name(self, in_namespace, true); let replacement = self.replacements.get(&name); if let Some(replacement) = replacement { diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 1f15ff0ffc..c81eab8b18 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -1152,11 +1152,11 @@ impl ItemCanonicalName for Item { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); if self.canonical_name_cache.borrow().is_none() { + let in_namespace = ctx.options().enable_cxx_namespaces || + ctx.options().disable_name_namespacing; + *self.canonical_name_cache.borrow_mut() = - Some(self.real_canonical_name(ctx, - ctx.options() - .enable_cxx_namespaces, - false)); + Some(self.real_canonical_name(ctx, in_namespace, false)); } return self.canonical_name_cache.borrow().as_ref().unwrap().clone(); } diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 10961e3613..177e67cdfc 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -243,6 +243,22 @@ impl Builder { self } + /// Disable auto-namespacing of names if namespaces are disabled. + /// + /// By default, if namespaces are disabled, bindgen tries to mangle the + /// names to from `foo::bar::Baz` to look like `foo_bar_Baz`, instead of + /// just `Baz`. + /// + /// This option disables that behavior. + /// + /// Note that this intentionally doesn't change the names using for + /// whitelisting and blacklisting, that should still be mangled with the + /// namespaces. + pub fn disable_name_namespacing(mut self) -> Builder { + self.options.disable_name_namespacing = true; + self + } + /// Ignore functions. pub fn ignore_functions(mut self) -> Builder { self.options.ignore_functions = true; @@ -341,6 +357,9 @@ pub struct BindgenOptions { /// generated bindings. pub enable_cxx_namespaces: bool, + /// True if we should avoid mangling names with namespaces. + pub disable_name_namespacing: bool, + /// True if we shold derive Debug trait implementations for C/C++ structures /// and types. pub derive_debug: bool, @@ -400,6 +419,7 @@ impl Default for BindgenOptions { ignore_methods: false, derive_debug: true, enable_cxx_namespaces: false, + disable_name_namespacing: false, unstable_rust: true, use_core: false, ctypes_prefix: None, diff --git a/libbindgen/tests/expectations/tests/disable-namespacing.rs b/libbindgen/tests/expectations/tests/disable-namespacing.rs new file mode 100644 index 0000000000..5c166946d9 --- /dev/null +++ b/libbindgen/tests/expectations/tests/disable-namespacing.rs @@ -0,0 +1,7 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub type Baz = ::std::os::raw::c_int; diff --git a/libbindgen/tests/headers/disable-namespacing.hpp b/libbindgen/tests/headers/disable-namespacing.hpp new file mode 100644 index 0000000000..11191361c0 --- /dev/null +++ b/libbindgen/tests/headers/disable-namespacing.hpp @@ -0,0 +1,9 @@ +// bindgen-flags: --disable-name-namespacing + +namespace foo { +namespace bar { + +typedef int Baz; + +} +} diff --git a/src/options.rs b/src/options.rs index 2ea74a27a9..9632619ff6 100644 --- a/src/options.rs +++ b/src/options.rs @@ -58,6 +58,9 @@ pub fn builder_from_flags(args: I) Arg::with_name("enable-cxx-namespaces") .long("enable-cxx-namespaces") .help("Enable support for C++ namespaces."), + Arg::with_name("disable-name-namespacing") + .long("disable-name-namespacing") + .help("Disable name namespacing if namespaces are disabled."), Arg::with_name("framework") .long("framework-link") .help("Link to framework.") @@ -194,6 +197,10 @@ pub fn builder_from_flags(args: I) builder = builder.enable_cxx_namespaces(); } + if matches.is_present("disable-name-namespacing") { + builder = builder.disable_name_namespacing(); + } + if let Some(links) = matches.values_of("framework") { for framework in links { builder = builder.link_framework(framework); From ebef1423cde4afa8d1f97a6f91ad466642a41b1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 24 Nov 2016 22:02:53 +0100 Subject: [PATCH 0134/2291] Some fixes for libclang 4.0. --- libbindgen/src/clang.rs | 13 +++++++++++++ libbindgen/src/ir/comp.rs | 18 +++++++++++++++--- libbindgen/src/ir/ty.rs | 2 +- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 720696448b..7c6d31999d 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -760,6 +760,19 @@ impl Type { pub fn is_valid_and_exposed(&self) -> bool { self.is_valid() && self.kind() != CXType_Unexposed } + + /// Is this type a fully specialized template? + pub fn is_fully_specialized_template(&self) -> bool { + // Yep, the spelling of this containing type-parameter is extremely + // nasty... But can happen in . Unfortunately I couldn't + // reduce it enough :( + !self.spelling().contains("type-parameter") && + self.template_args() + .map_or(false, |mut args| { + args.len() > 0 && + !args.any(|t| t.spelling().contains("type-parameter")) + }) + } } /// An iterator for a type's template arguments. diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index d19d12092b..d2ace023eb 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -498,17 +498,29 @@ impl CompInfo { None => vec![], Some(arg_types) => { let num_arg_types = arg_types.len(); + let mut specialization = true; let args = arg_types.filter(|t| t.kind() != CXType_Invalid) - .map(|t| Item::from_ty_or_ref(t, None, None, ctx)) + .filter_map(|t| { + if t.spelling().starts_with("type-parameter") { + specialization = false; + None + } else { + Some(Item::from_ty_or_ref(t, None, None, ctx)) + } + }) .collect::>(); - if args.len() != num_arg_types { + if specialization && args.len() != num_arg_types { ci.has_non_type_template_params = true; warn!("warning: Template parameter is not a type"); } - args + if specialization { + args + } else { + vec![] + } } }; diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 7f01e388e4..33e208613a 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -554,7 +554,7 @@ impl Type { TypeKind::Function(signature) // Same here, with template specialisations we can safely // assume this is a Comp(..) - } else if ty.template_args().map_or(false, |x| x.len() > 0) { + } else if ty.is_fully_specialized_template() { debug!("Template specialization: {:?}", ty); let complex = CompInfo::from_ty(potential_id, ty, location, ctx) From d1e97eaf1b980d504765197e521207547dcc33f4 Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Sat, 26 Nov 2016 23:08:37 +0800 Subject: [PATCH 0135/2291] Restore links in README.md These were deleted accidentally in 073b12ff35a8ec6314d655804915f177ce453227. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ead988ecd6..09f88db204 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,9 @@ There are a few options documented when running `./bindgen --help`. Other options might exist (see [the SpiderMonkey script][sm-script] and [the Stylo scripts][stylo-scripts] to see how is it used inside the Servo organisation. +[sm-script]: https://github.com/servo/rust-mozjs/blob/master/etc/bindings.sh +[stylo-scripts]: https://github.com/servo/servo/tree/master/components/style/binding_tools + ## C++ Usage This fork of rust-bindgen can handle a number of C++ features. From 673f9d313a981be3882050849d621bd12f07291c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 24 Nov 2016 22:48:05 +0100 Subject: [PATCH 0136/2291] ir: Don't assume our name is our base name too early when we're in a namespace. --- libbindgen/src/ir/item.rs | 15 ++++-- .../tests/nested_within_namespace.rs | 53 +++++++++++++++++++ .../tests/headers/nested_within_namespace.hpp | 15 ++++++ 3 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/nested_within_namespace.rs create mode 100644 libbindgen/tests/headers/nested_within_namespace.hpp diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index c81eab8b18..1d643a4590 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -688,14 +688,14 @@ impl Item { return base_name; } - if within_namespace { - return ctx.rust_mangle(&base_name).into_owned(); - } - // Concatenate this item's ancestors' names together. let mut names: Vec<_> = target.parent_id() .ancestors(ctx) .filter(|id| *id != ctx.root_module()) + .take_while(|id| { + // Stop iterating ancestors once we reach a namespace. + !within_namespace || !ctx.resolve_item(*id).is_module() + }) .map(|id| { let item = ctx.resolve_item(id); let target = ctx.resolve_item(item.name_target(ctx, false)); @@ -703,8 +703,13 @@ impl Item { }) .filter(|name| !name.is_empty()) .collect(); + names.reverse(); - names.push(base_name); + + if !base_name.is_empty() { + names.push(base_name); + } + let name = names.join("_"); ctx.rust_mangle(&name).into_owned() diff --git a/libbindgen/tests/expectations/tests/nested_within_namespace.rs b/libbindgen/tests/expectations/tests/nested_within_namespace.rs new file mode 100644 index 0000000000..949b5adbd9 --- /dev/null +++ b/libbindgen/tests/expectations/tests/nested_within_namespace.rs @@ -0,0 +1,53 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use root; + pub mod foo { + #[allow(unused_imports)] + use root; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Bar { + pub foo: ::std::os::raw::c_int, + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Bar_Baz { + pub foo: ::std::os::raw::c_int, + } + #[test] + fn bindgen_test_layout_Bar_Baz() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); + } + impl Clone for Bar_Baz { + fn clone(&self) -> Self { *self } + } + #[test] + fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); + } + impl Clone for Bar { + fn clone(&self) -> Self { *self } + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Baz { + pub baz: ::std::os::raw::c_int, + } + #[test] + fn bindgen_test_layout_Baz() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); + } + impl Clone for Baz { + fn clone(&self) -> Self { *self } + } + } +} diff --git a/libbindgen/tests/headers/nested_within_namespace.hpp b/libbindgen/tests/headers/nested_within_namespace.hpp new file mode 100644 index 0000000000..a9b7c1ec6a --- /dev/null +++ b/libbindgen/tests/headers/nested_within_namespace.hpp @@ -0,0 +1,15 @@ +// bindgen-flags: --enable-cxx-namespaces + +namespace foo { + class Bar { + int foo; + + class Baz { + int foo; + }; + }; + + class Baz { + int baz; + }; +} From 0557db47a42c70b33c157cf201235d40fddeaa1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 29 Nov 2016 20:37:22 +0100 Subject: [PATCH 0137/2291] ir: Add a note about duplicated names. --- libbindgen/src/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 177e67cdfc..f25c6cdf72 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -254,6 +254,9 @@ impl Builder { /// Note that this intentionally doesn't change the names using for /// whitelisting and blacklisting, that should still be mangled with the /// namespaces. + /// + /// Note, also, that using this option may cause duplicated names to be + /// generated. pub fn disable_name_namespacing(mut self) -> Builder { self.options.disable_name_namespacing = true; self From e8d74b3edcaf7e890d8d6402271a817673f47df9 Mon Sep 17 00:00:00 2001 From: Artem Biryukov Date: Thu, 1 Dec 2016 04:26:21 +0300 Subject: [PATCH 0138/2291] Unify naming methods into a single method + options builder type This an implementation of `NameOptions` structure which will hold flags for building a name string. This fixes related to issue #201 --- libbindgen/src/ir/context.rs | 13 ++++- libbindgen/src/ir/item.rs | 93 ++++++++++++++++++++++++++++-------- 2 files changed, 83 insertions(+), 23 deletions(-) diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index a0e57610c9..ebc7f10a6c 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -368,7 +368,16 @@ impl<'ctx> BindgenContext<'ctx> { } let in_namespace = self.options().enable_cxx_namespaces; - let name = item.real_canonical_name(self, in_namespace, true); + + let name = if in_namespace { + item.name(self) + .within_namespaces() + .get() + } else { + item.name(self) + .for_name_checking() + .get() + }; let replacement = self.replacements.get(&name); if let Some(replacement) = replacement { @@ -938,7 +947,7 @@ impl<'ctx> BindgenContext<'ctx> { return true; } - let name = item.real_canonical_name(self, false, true); + let name = item.name(self).for_name_checking().get(); match *item.kind() { ItemKind::Module(..) => true, ItemKind::Function(_) => { diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 1d643a4590..c0555bca7b 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -516,7 +516,7 @@ impl Item { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); self.annotations.hide() || - ctx.hidden_by_name(&self.real_canonical_name(ctx, false, true), self.id) + ctx.hidden_by_name(&self.name(ctx).for_name_checking().get(), self.id) } /// Is this item opaque? @@ -524,7 +524,7 @@ impl Item { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); self.annotations.opaque() || - ctx.opaque_by_name(&self.real_canonical_name(ctx, false, true)) + ctx.opaque_by_name(&self.name(ctx).for_name_checking().get()) } /// Is this a reference to another type? @@ -540,6 +540,13 @@ impl Item { } } + /// Take out item NameOptions + pub fn name<'item, 'ctx>(&'item self, + ctx: &'item BindgenContext<'ctx>) + -> NameOptions<'item, 'ctx> { + NameOptions::new(self, ctx) + } + /// Get the target item id for name generation. fn name_target(&self, ctx: &BindgenContext, @@ -628,9 +635,7 @@ impl Item { } ItemKind::Type(ref ty) => { let name = match *ty.kind() { - TypeKind::ResolvedTypeRef(..) => { - panic!("should have resolved this in name_target()") - } + TypeKind::ResolvedTypeRef(..) => panic!("should have resolved this in name_target()"), TypeKind::TemplateAlias(..) => { if for_name_checking { None } else { Some("") } } @@ -668,19 +673,19 @@ impl Item { /// type and the parent chain, since it should be consistent. pub fn real_canonical_name(&self, ctx: &BindgenContext, - within_namespace: bool, - for_name_checking: bool) + opt: &NameOptions) -> String { - let target = ctx.resolve_item(self.name_target(ctx, for_name_checking)); + let target = + ctx.resolve_item(self.name_target(ctx, opt.for_name_checking)); // Short-circuit if the target has an override, and just use that. - if !for_name_checking { + if !opt.for_name_checking { if let Some(other) = target.annotations.use_instead_of() { return other.to_owned(); } } - let base_name = target.base_name(ctx, for_name_checking); + let base_name = target.base_name(ctx, opt.for_name_checking); // Named template type arguments are never namespaced, and never // mangled. @@ -694,7 +699,7 @@ impl Item { .filter(|id| *id != ctx.root_module()) .take_while(|id| { // Stop iterating ancestors once we reach a namespace. - !within_namespace || !ctx.resolve_item(*id).is_module() + !opt.within_namespaces || !ctx.resolve_item(*id).is_module() }) .map(|id| { let item = ctx.resolve_item(id); @@ -940,9 +945,8 @@ impl ClangItemParser for Item { .expect("Unable to resolve type"); } - if let Some(ty) = ctx.builtin_or_resolved_ty(potential_id, - parent_id, &ty, - location) { + if let Some(ty) = + ctx.builtin_or_resolved_ty(potential_id, parent_id, &ty, location) { debug!("{:?} already resolved: {:?}", ty, location); return ty; } @@ -1008,7 +1012,7 @@ impl ClangItemParser for Item { } if let Some(ty) = - ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { + ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { return Ok(ty); } @@ -1026,9 +1030,10 @@ impl ClangItemParser for Item { }; if valid_decl { - if let Some(&(_, item_id)) = ctx.currently_parsed_types - .iter() - .find(|&&(d, _)| d == declaration_to_look_for) { + if let Some(&(_, item_id)) = + ctx.currently_parsed_types + .iter() + .find(|&&(d, _)| d == declaration_to_look_for) { debug!("Avoiding recursion parsing type: {:?}", ty); return Ok(item_id); } @@ -1160,8 +1165,11 @@ impl ItemCanonicalName for Item { let in_namespace = ctx.options().enable_cxx_namespaces || ctx.options().disable_name_namespacing; - *self.canonical_name_cache.borrow_mut() = - Some(self.real_canonical_name(ctx, in_namespace, false)); + *self.canonical_name_cache.borrow_mut() = if in_namespace { + Some(self.name(ctx).within_namespaces().get()) + } else { + Some(self.name(ctx).get()) + }; } return self.canonical_name_cache.borrow().as_ref().unwrap().clone(); } @@ -1214,8 +1222,51 @@ impl ItemCanonicalPath for Item { debug_assert!(is_alias, "How can this ever happen?"); parent_path.pop().unwrap(); } - parent_path.push(self.real_canonical_name(ctx, true, false)); + parent_path.push(self.name(ctx).within_namespaces().get()); parent_path } } + +/// Builder struct for naming variations, which hold inside different +/// flags for naming options. +#[derive(Debug)] +pub struct NameOptions<'item, 'ctx> + where 'ctx: 'item, +{ + item: &'item Item, + ctx: &'item BindgenContext<'ctx>, + for_name_checking: bool, + within_namespaces: bool, +} + +impl<'item, 'ctx> NameOptions<'item, 'ctx> { + /// Construct a new `NameOptions` + pub fn new(item: &'item Item, ctx: &'item BindgenContext<'ctx>) -> Self { + NameOptions { + item: item, + ctx: ctx, + for_name_checking: false, + within_namespaces: false, + } + } + + /// Construct a name that is suitable for replacements/whitelisting/opaque- + /// ness look ups. + pub fn for_name_checking(&mut self) -> &mut Self { + self.for_name_checking = true; + self + } + + /// Construct the name without the item's containing C++ namespaces mangled + /// into it. In other words, the item's name within the item's namespace. + pub fn within_namespaces(&mut self) -> &mut Self { + self.within_namespaces = true; + self + } + + /// Construct a name `String` + pub fn get(&self) -> String { + self.item.real_canonical_name(self.ctx, self) + } +} From 8091fd641b9692007bbb85d3bec37afc426b897d Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 1 Dec 2016 13:16:16 -0800 Subject: [PATCH 0139/2291] Use the generated root module via a relative path We previously generated uses of the root module with absolute paths: use root; However this only works if the generated bindings are the root of the crate. If they were in some submodule then that path would not be valid. They are now generated relative to the current module, like this: use self::super::super::root; Fixes #96 --- libbindgen/src/codegen/mod.rs | 32 ++++++++++++++++--- .../duplicated-namespaces-definitions.rs | 6 ++-- .../tests/duplicated-namespaces.rs | 2 +- .../tests/duplicated_constants_in_ns.rs | 6 ++-- .../expectations/tests/module-whitelisted.rs | 2 +- .../tests/expectations/tests/namespace.rs | 8 ++--- .../tests/nested_within_namespace.rs | 4 +-- .../tests/template_alias_namespace.rs | 6 ++-- .../tests/whitelist-namespaces-basic.rs | 6 ++-- .../tests/whitelist-namespaces.rs | 6 ++-- 10 files changed, 50 insertions(+), 28 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index ad9ac2deeb..7fa76d56bb 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -9,7 +9,7 @@ use ir::context::{BindgenContext, ItemId}; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; use ir::function::{Function, FunctionSig}; use ir::int::IntKind; -use ir::item::{Item, ItemCanonicalName, ItemCanonicalPath}; +use ir::item::{Item, ItemAncestors, ItemCanonicalName, ItemCanonicalPath}; use ir::item_kind::ItemKind; use ir::layout::Layout; use ir::module::Module; @@ -22,6 +22,7 @@ use std::borrow::Cow; use std::collections::HashSet; use std::collections::hash_map::{Entry, HashMap}; use std::fmt::Write; +use std::iter; use std::mem; use std::ops; use syntax::abi::Abi; @@ -29,12 +30,33 @@ use syntax::ast; use syntax::codemap::{Span, respan}; use syntax::ptr::P; -fn root_import(ctx: &BindgenContext) -> P { +fn root_import(ctx: &BindgenContext, module: &Item) -> P { assert!(ctx.options().enable_cxx_namespaces, "Somebody messed it up"); + assert!(module.is_module()); + let root = ctx.root_module().canonical_name(ctx); let root_ident = ctx.rust_ident(&root); - quote_item!(ctx.ext_cx(), #[allow(unused_imports)] use $root_ident;) - .unwrap() + + let super_ = aster::AstBuilder::new().id("super"); + let supers = module + .ancestors(ctx) + .filter(|id| ctx.resolve_item(*id).is_module()) + .map(|_| super_.clone()) + .chain(iter::once(super_)); + + let self_ = iter::once(aster::AstBuilder::new().id("self")); + let root_ident = iter::once(root_ident); + + let path = self_.chain(supers).chain(root_ident); + + let use_root = aster::AstBuilder::new() + .item() + .use_() + .ids(path) + .build() + .build(); + + quote_item!(ctx.ext_cx(), #[allow(unused_imports)] $use_root).unwrap() } struct CodegenResult { @@ -286,7 +308,7 @@ impl CodeGenerator for Module { let mut found_any = false; let inner_items = result.inner(|result| { - result.push(root_import(ctx)); + result.push(root_import(ctx, item)); codegen_self(result, &mut found_any); }); diff --git a/libbindgen/tests/expectations/tests/duplicated-namespaces-definitions.rs b/libbindgen/tests/expectations/tests/duplicated-namespaces-definitions.rs index 314a24a326..da06a2a9c3 100644 --- a/libbindgen/tests/expectations/tests/duplicated-namespaces-definitions.rs +++ b/libbindgen/tests/expectations/tests/duplicated-namespaces-definitions.rs @@ -6,10 +6,10 @@ pub mod root { #[allow(unused_imports)] - use root; + use self::super::root; pub mod foo { #[allow(unused_imports)] - use root; + use self::super::super::root; #[repr(C)] #[derive(Debug, Copy)] pub struct Bar { @@ -27,7 +27,7 @@ pub mod root { } pub mod bar { #[allow(unused_imports)] - use root; + use self::super::super::root; #[repr(C)] #[derive(Debug, Copy)] pub struct Foo { diff --git a/libbindgen/tests/expectations/tests/duplicated-namespaces.rs b/libbindgen/tests/expectations/tests/duplicated-namespaces.rs index 7a283160a8..42976657ad 100644 --- a/libbindgen/tests/expectations/tests/duplicated-namespaces.rs +++ b/libbindgen/tests/expectations/tests/duplicated-namespaces.rs @@ -6,5 +6,5 @@ pub mod root { #[allow(unused_imports)] - use root; + use self::super::root; } diff --git a/libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs b/libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs index 3acc53e8b3..3721740c46 100644 --- a/libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs +++ b/libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs @@ -6,15 +6,15 @@ pub mod root { #[allow(unused_imports)] - use root; + use self::super::root; pub mod foo { #[allow(unused_imports)] - use root; + use self::super::super::root; pub const FOO: ::std::os::raw::c_int = 4; } pub mod bar { #[allow(unused_imports)] - use root; + use self::super::super::root; pub const FOO: ::std::os::raw::c_int = 5; } } diff --git a/libbindgen/tests/expectations/tests/module-whitelisted.rs b/libbindgen/tests/expectations/tests/module-whitelisted.rs index 7e63c8c8eb..6f88c54b1d 100644 --- a/libbindgen/tests/expectations/tests/module-whitelisted.rs +++ b/libbindgen/tests/expectations/tests/module-whitelisted.rs @@ -6,7 +6,7 @@ pub mod root { #[allow(unused_imports)] - use root; + use self::super::root; #[repr(C)] #[derive(Debug, Copy)] pub struct Test { diff --git a/libbindgen/tests/expectations/tests/namespace.rs b/libbindgen/tests/expectations/tests/namespace.rs index 34c2da1e8d..3d6e597484 100644 --- a/libbindgen/tests/expectations/tests/namespace.rs +++ b/libbindgen/tests/expectations/tests/namespace.rs @@ -6,14 +6,14 @@ pub mod root { #[allow(unused_imports)] - use root; + use self::super::root; extern "C" { #[link_name = "_Z9top_levelv"] pub fn top_level(); } pub mod whatever { #[allow(unused_imports)] - use root; + use self::super::super::root; pub type whatever_int_t = ::std::os::raw::c_int; extern "C" { #[link_name = "_ZN8whatever11in_whateverEv"] @@ -22,7 +22,7 @@ pub mod root { } pub mod _bindgen_mod_id_13 { #[allow(unused_imports)] - use root; + use self::super::super::root; extern "C" { #[link_name = "_ZN12_GLOBAL__N_13fooEv"] pub fn foo(); @@ -51,7 +51,7 @@ pub mod root { } pub mod w { #[allow(unused_imports)] - use root; + use self::super::super::root; pub type whatever_int_t = ::std::os::raw::c_uint; #[repr(C)] #[derive(Debug)] diff --git a/libbindgen/tests/expectations/tests/nested_within_namespace.rs b/libbindgen/tests/expectations/tests/nested_within_namespace.rs index 949b5adbd9..0c9c31ef74 100644 --- a/libbindgen/tests/expectations/tests/nested_within_namespace.rs +++ b/libbindgen/tests/expectations/tests/nested_within_namespace.rs @@ -6,10 +6,10 @@ pub mod root { #[allow(unused_imports)] - use root; + use self::super::root; pub mod foo { #[allow(unused_imports)] - use root; + use self::super::super::root; #[repr(C)] #[derive(Debug, Copy)] pub struct Bar { diff --git a/libbindgen/tests/expectations/tests/template_alias_namespace.rs b/libbindgen/tests/expectations/tests/template_alias_namespace.rs index 36806d44c4..cf4a079c7e 100644 --- a/libbindgen/tests/expectations/tests/template_alias_namespace.rs +++ b/libbindgen/tests/expectations/tests/template_alias_namespace.rs @@ -6,13 +6,13 @@ pub mod root { #[allow(unused_imports)] - use root; + use self::super::root; pub mod JS { #[allow(unused_imports)] - use root; + use self::super::super::root; pub mod detail { #[allow(unused_imports)] - use root; + use self::super::super::super::root; pub type Wrapped = T; } #[repr(C)] diff --git a/libbindgen/tests/expectations/tests/whitelist-namespaces-basic.rs b/libbindgen/tests/expectations/tests/whitelist-namespaces-basic.rs index 8806cbf424..cbb12f6bbb 100644 --- a/libbindgen/tests/expectations/tests/whitelist-namespaces-basic.rs +++ b/libbindgen/tests/expectations/tests/whitelist-namespaces-basic.rs @@ -6,13 +6,13 @@ pub mod root { #[allow(unused_imports)] - use root; + use self::super::root; pub mod outer { #[allow(unused_imports)] - use root; + use self::super::super::root; pub mod inner { #[allow(unused_imports)] - use root; + use self::super::super::super::root; #[repr(C)] #[derive(Debug, Copy)] pub struct Helper { diff --git a/libbindgen/tests/expectations/tests/whitelist-namespaces.rs b/libbindgen/tests/expectations/tests/whitelist-namespaces.rs index 42cccdeebc..bc257af642 100644 --- a/libbindgen/tests/expectations/tests/whitelist-namespaces.rs +++ b/libbindgen/tests/expectations/tests/whitelist-namespaces.rs @@ -6,13 +6,13 @@ pub mod root { #[allow(unused_imports)] - use root; + use self::super::root; pub mod outer { #[allow(unused_imports)] - use root; + use self::super::super::root; pub mod inner { #[allow(unused_imports)] - use root; + use self::super::super::super::root; #[repr(C)] #[derive(Debug, Copy)] pub struct Helper { From 2c43aaef40ca43ed7be52ea738065bfbe3baae6c Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 2 Dec 2016 13:43:54 -0800 Subject: [PATCH 0140/2291] Do not treat parent struct as a module for nested structs This fixes `ItemCanonicalPath` to return paths of the form `[module*, item]` rather than `[item*, item]`. That is, there will only be module names before the item's name, rather than also other arbitrary item names (such as parent structs). Fixes #311 --- libbindgen/src/ir/item.rs | 54 ++++--------------- .../tests/expectations/tests/issue_311.rs | 38 +++++++++++++ libbindgen/tests/headers/issue_311.hpp | 5 ++ 3 files changed, 53 insertions(+), 44 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/issue_311.rs create mode 100644 libbindgen/tests/headers/issue_311.hpp diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index c0555bca7b..76ab0d5531 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -5,6 +5,7 @@ use clangll; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use std::cell::{Cell, RefCell}; use std::fmt::Write; +use std::iter; use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; use super::function::Function; @@ -1181,50 +1182,15 @@ impl ItemCanonicalPath for Item { return vec![self.canonical_name(ctx)]; } - if self.id() == ctx.root_module() { - match self.kind { - ItemKind::Module(ref module) => { - return vec![module.name().unwrap().into()] - } - _ => panic!("Something has wrong horribly wrong"), - } - } - - // TODO: This duplicates too much logic with real_canonical_name. - if let ItemKind::Type(ref ty) = *self.kind() { - match *ty.kind() { - TypeKind::Comp(ref ci) if ci.is_template_specialization() => { - return ci.specialized_template() - .unwrap() - .canonical_path(ctx); - } - TypeKind::ResolvedTypeRef(inner) | - TypeKind::TemplateRef(inner, _) => { - return inner.canonical_path(ctx); - } - TypeKind::Named(ref name, _) => { - return vec![name.clone()]; - } - _ => {} - } - } - - let mut parent_path = self.parent_id().canonical_path(&ctx); - if parent_path.last() - .map_or(false, |parent_name| parent_name.is_empty()) { - // This only happens (or should only happen) when we're an alias, - // and our parent is a templated alias, in which case the last - // component of the path will be empty. - let is_alias = match *self.expect_type().kind() { - TypeKind::Alias(..) => true, - _ => false, - }; - debug_assert!(is_alias, "How can this ever happen?"); - parent_path.pop().unwrap(); - } - parent_path.push(self.name(ctx).within_namespaces().get()); - - parent_path + let target = ctx.resolve_item(self.name_target(ctx, false)); + let mut path: Vec<_> = target.ancestors(ctx) + .chain(iter::once(ctx.root_module())) + .map(|id| ctx.resolve_item(id)) + .filter(|item| item.is_module() || item.id() == target.id()) + .map(|item| item.name(ctx).within_namespaces().get()) + .collect(); + path.reverse(); + path } } diff --git a/libbindgen/tests/expectations/tests/issue_311.rs b/libbindgen/tests/expectations/tests/issue_311.rs new file mode 100644 index 0000000000..f01a9d9354 --- /dev/null +++ b/libbindgen/tests/expectations/tests/issue_311.rs @@ -0,0 +1,38 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use self::super::root; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct jsval_layout { + pub __bindgen_anon_1: root::jsval_layout__bindgen_ty_1, + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct jsval_layout__bindgen_ty_1 { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_jsval_layout__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 1usize); + assert_eq!(::std::mem::align_of::() , + 1usize); + } + impl Clone for jsval_layout__bindgen_ty_1 { + fn clone(&self) -> Self { *self } + } + #[test] + fn bindgen_test_layout_jsval_layout() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); + } + impl Clone for jsval_layout { + fn clone(&self) -> Self { *self } + } +} diff --git a/libbindgen/tests/headers/issue_311.hpp b/libbindgen/tests/headers/issue_311.hpp new file mode 100644 index 0000000000..a8d7fd997d --- /dev/null +++ b/libbindgen/tests/headers/issue_311.hpp @@ -0,0 +1,5 @@ +// bindgen-flags: --enable-cxx-namespaces + +struct jsval_layout { + struct {}; +}; From 12ee656be8dbacb49179060763830c08a5202156 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 2 Dec 2016 14:38:27 -0800 Subject: [PATCH 0141/2291] Assert that we won't infinite loop in ItemAncestorsIter In non-release builds with debug assertions, keep track of the set of `ItemId`s that we have iterated over in `ItemAncestorsIter` and make sure that we don't reach an ancestor we have already yielded, which would trigger an infinite loop. --- libbindgen/src/ir/item.rs | 43 +++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 76ab0d5531..f4272e2d1d 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -55,12 +55,45 @@ pub trait ItemAncestors { -> ItemAncestorsIter<'a, 'b>; } +cfg_if! { + if #[cfg(debug_assertions)] { + type AncestorsSeen = ItemSet; + } else { + struct AncestorsSeen; + + impl AncestorsSeen { + fn new() -> Self { + AncestorsSeen + } + + fn contains(&self,_id: &ItemId) -> bool { + false + } + + fn insert(&mut self, _id: ItemId) {} + } + } +} + /// An iterator over an item and its ancestors. pub struct ItemAncestorsIter<'a, 'b> where 'b: 'a, { item: ItemId, ctx: &'a BindgenContext<'b>, + seen: AncestorsSeen, +} + +impl <'a, 'b> ItemAncestorsIter<'a, 'b> + where 'b: 'a +{ + fn new(ctx: &'a BindgenContext<'b>, item: ItemId) -> Self { + ItemAncestorsIter { + item: item, + ctx: ctx, + seen: AncestorsSeen::new(), + } + } } impl<'a, 'b> Iterator for ItemAncestorsIter<'a, 'b> @@ -70,10 +103,15 @@ impl<'a, 'b> Iterator for ItemAncestorsIter<'a, 'b> fn next(&mut self) -> Option { let item = self.ctx.resolve_item(self.item); + if item.parent_id() == self.item { None } else { self.item = item.parent_id(); + + debug_assert!(!self.seen.contains(&item.id())); + self.seen.insert(item.id()); + Some(item.id()) } } @@ -100,10 +138,7 @@ impl ItemAncestors for ItemId { fn ancestors<'a, 'b>(&self, ctx: &'a BindgenContext<'b>) -> ItemAncestorsIter<'a, 'b> { - ItemAncestorsIter { - item: *self, - ctx: ctx, - } + ItemAncestorsIter::new(ctx, *self) } } From 8c4482592c31d3d50f82cee0058b51ac90c31de3 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 2 Dec 2016 14:57:56 -0800 Subject: [PATCH 0142/2291] Assert that we do not infinitely loop in ir::Item::name_target This re-uses the infrastructure used when asserting that `ItemAncestorsIter` does not infinitely loop in `ir::Item::name_target`. --- libbindgen/src/ir/item.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index f4272e2d1d..74c6508332 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -588,8 +588,13 @@ impl Item { ctx: &BindgenContext, for_name_checking: bool) -> ItemId { + let mut targets_seen = AncestorsSeen::new(); let mut item = self; + loop { + debug_assert!(!targets_seen.contains(&item.id())); + targets_seen.insert(item.id()); + match *item.kind() { ItemKind::Type(ref ty) => { match *ty.kind() { From fa5ad81713a738dd181333de3f60a432f22a5003 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 2 Dec 2016 15:01:57 -0800 Subject: [PATCH 0143/2291] Rename `AncestorsSeen` to `DebugOnlyItemSet` The type is now being used outside of the context of ancestors, and additionally "debug only" more precisely describes its behavior. --- libbindgen/src/ir/item.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 74c6508332..f12e4b549a 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -57,13 +57,13 @@ pub trait ItemAncestors { cfg_if! { if #[cfg(debug_assertions)] { - type AncestorsSeen = ItemSet; + type DebugOnlyItemSet = ItemSet; } else { - struct AncestorsSeen; + struct DebugOnlyItemSet; - impl AncestorsSeen { + impl DebugOnlyItemSet { fn new() -> Self { - AncestorsSeen + DebugOnlyItemSet } fn contains(&self,_id: &ItemId) -> bool { @@ -81,7 +81,7 @@ pub struct ItemAncestorsIter<'a, 'b> { item: ItemId, ctx: &'a BindgenContext<'b>, - seen: AncestorsSeen, + seen: DebugOnlyItemSet, } impl <'a, 'b> ItemAncestorsIter<'a, 'b> @@ -91,7 +91,7 @@ impl <'a, 'b> ItemAncestorsIter<'a, 'b> ItemAncestorsIter { item: item, ctx: ctx, - seen: AncestorsSeen::new(), + seen: DebugOnlyItemSet::new(), } } } @@ -588,7 +588,7 @@ impl Item { ctx: &BindgenContext, for_name_checking: bool) -> ItemId { - let mut targets_seen = AncestorsSeen::new(); + let mut targets_seen = DebugOnlyItemSet::new(); let mut item = self; loop { From 161a590d44952d9921ab1cdd721166aceee5ed01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 5 Dec 2016 00:36:05 -0800 Subject: [PATCH 0144/2291] codegen: Fix bindgen-injected items in namespaces. Found while trying to use namespaces in stylo. --- libbindgen/src/codegen/mod.rs | 32 ++++++++---- .../tests/expectations/tests/union-in-ns.rs | 52 +++++++++++++++++++ libbindgen/tests/headers/union-in-ns.hpp | 5 ++ 3 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/union-in-ns.rs create mode 100644 libbindgen/tests/headers/union-in-ns.hpp diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 7fa76d56bb..c267cb958d 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -299,6 +299,16 @@ impl CodeGenerator for Module { .codegen(ctx, result, whitelisted_items, &()); } } + + if item.id() == ctx.root_module() { + let saw_union = result.saw_union; + if saw_union && !ctx.options().unstable_rust { + utils::prepend_union_types(ctx, &mut *result); + } + if ctx.need_bindegen_complex_type() { + utils::prepend_complex_type(ctx, &mut *result); + } + } }; if !ctx.options().enable_cxx_namespaces { @@ -912,7 +922,11 @@ impl CodeGenerator for CompInfo { // NB: In unstable rust we use proper `union` types. let ty = if is_union && !ctx.options().unstable_rust { - quote_ty!(ctx.ext_cx(), __BindgenUnionField<$ty>) + if ctx.options().enable_cxx_namespaces { + quote_ty!(ctx.ext_cx(), root::__BindgenUnionField<$ty>) + } else { + quote_ty!(ctx.ext_cx(), __BindgenUnionField<$ty>) + } } else { ty }; @@ -1745,7 +1759,11 @@ impl ToRustTy for Type { let float_path = float_kind_rust_type(ctx, fk); ctx.generated_bindegen_complex(); - quote_ty!(ctx.ext_cx(), __BindgenComplex<$float_path>) + if ctx.options().enable_cxx_namespaces { + quote_ty!(ctx.ext_cx(), root::__BindgenComplex<$float_path>) + } else { + quote_ty!(ctx.ext_cx(), __BindgenComplex<$float_path>) + } } TypeKind::Function(ref fs) => { let ty = fs.to_rust_ty(ctx, item); @@ -2006,15 +2024,7 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { context.resolve_item(context.root_module()) .codegen(context, &mut result, &whitelisted_items, &()); - let saw_union = result.saw_union; - let mut result = result.items; - if saw_union && !context.options().unstable_rust { - utils::prepend_union_types(context, &mut result); - } - if context.need_bindegen_complex_type() { - utils::prepend_complex_type(context, &mut result); - } - result + result.items }) } diff --git a/libbindgen/tests/expectations/tests/union-in-ns.rs b/libbindgen/tests/expectations/tests/union-in-ns.rs new file mode 100644 index 0000000000..fa511e512f --- /dev/null +++ b/libbindgen/tests/expectations/tests/union-in-ns.rs @@ -0,0 +1,52 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[repr(C)] + pub struct __BindgenUnionField(::std::marker::PhantomData); + impl __BindgenUnionField { + #[inline] + pub fn new() -> Self { + __BindgenUnionField(::std::marker::PhantomData) + } + #[inline] + pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut(&mut self) -> &mut T { + ::std::mem::transmute(self) + } + } + impl ::std::default::Default for __BindgenUnionField { + #[inline] + fn default() -> Self { Self::new() } + } + impl ::std::clone::Clone for __BindgenUnionField { + #[inline] + fn clone(&self) -> Self { Self::new() } + } + impl ::std::marker::Copy for __BindgenUnionField { } + impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } + } + #[allow(unused_imports)] + use self::super::root; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct bar { + pub baz: root::__BindgenUnionField<::std::os::raw::c_int>, + pub bindgen_union_field: u32, + } + #[test] + fn bindgen_test_layout_bar() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); + } + impl Clone for bar { + fn clone(&self) -> Self { *self } + } +} diff --git a/libbindgen/tests/headers/union-in-ns.hpp b/libbindgen/tests/headers/union-in-ns.hpp new file mode 100644 index 0000000000..68b8f72d6e --- /dev/null +++ b/libbindgen/tests/headers/union-in-ns.hpp @@ -0,0 +1,5 @@ +// bindgen-flags: --enable-cxx-namespaces + +union bar { + int baz; +}; From f67ae948a831c69e9de16da216cb80892b5038fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 4 Dec 2016 15:15:56 +0100 Subject: [PATCH 0145/2291] Add an API to decide what gets generated more granularly. --- libbindgen/src/codegen/mod.rs | 32 +++++++++-------- libbindgen/src/lib.rs | 68 ++++++++++++++++++++++++++++------- src/options.rs | 25 ++++++++++++- 3 files changed, 97 insertions(+), 28 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 7fa76d56bb..ff18ab83c9 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -267,15 +267,19 @@ impl CodeGenerator for Item { module.codegen(ctx, result, whitelisted_items, self); } ItemKind::Function(ref fun) => { - if !ctx.options().ignore_functions { + if ctx.options().codegen_config.functions { fun.codegen(ctx, result, whitelisted_items, self); } } ItemKind::Var(ref var) => { - var.codegen(ctx, result, whitelisted_items, self); + if ctx.options().codegen_config.vars { + var.codegen(ctx, result, whitelisted_items, self); + } } ItemKind::Type(ref ty) => { - ty.codegen(ctx, result, whitelisted_items, self); + if ctx.options().codegen_config.types { + ty.codegen(ctx, result, whitelisted_items, self); + } } } } @@ -1152,14 +1156,16 @@ impl CodeGenerator for CompInfo { result.push(item); } - let mut method_names = Default::default(); - for method in self.methods() { - method.codegen_method(ctx, - &mut methods, - &mut method_names, - result, - whitelisted_items, - item); + if ctx.options().codegen_config.methods { + let mut method_names = Default::default(); + for method in self.methods() { + method.codegen_method(ctx, + &mut methods, + &mut method_names, + result, + whitelisted_items, + item); + } } } @@ -1222,10 +1228,6 @@ impl MethodCodegen for Method { result: &mut CodegenResult, whitelisted_items: &ItemSet, _parent: &Item) { - if ctx.options().ignore_methods { - return; - } - if self.is_virtual() { return; // FIXME } diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index f25c6cdf72..b2d3593cc6 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -98,6 +98,49 @@ use syntax::print::pp::eof; use syntax::print::pprust; use syntax::ptr::P; +/// A type used to indicate which kind of items do we have to generate. +/// +/// TODO(emilio): Use `bitflags!` +#[derive(Debug, Clone)] +pub struct CodegenConfig { + /// Whether to generate functions. + pub functions: bool, + /// Whether to generate types. + pub types: bool, + /// Whether to generate constants. + pub vars: bool, + /// Whether to generate methods. + pub methods: bool, +} + +impl CodegenConfig { + /// Generate all kinds of items. + pub fn all() -> Self { + CodegenConfig { + functions: true, + types: true, + vars: true, + methods: true, + } + } + + /// Generate nothing. + pub fn nothing() -> Self { + CodegenConfig { + functions: false, + types: false, + vars: false, + methods: false, + } + } +} + +impl Default for CodegenConfig { + fn default() -> Self { + CodegenConfig::all() + } +} + /// Configure and generate Rust bindings for a C/C++ header. /// /// This is the main entry point to the library. @@ -264,13 +307,13 @@ impl Builder { /// Ignore functions. pub fn ignore_functions(mut self) -> Builder { - self.options.ignore_functions = true; + self.options.codegen_config.functions = false; self } /// Ignore methods. pub fn ignore_methods(mut self) -> Builder { - self.options.ignore_methods = true; + self.options.codegen_config.methods = false; self } @@ -299,6 +342,12 @@ impl Builder { self } + /// Choose what to generate using a CodegenConfig. + pub fn with_codegen_config(mut self, config: CodegenConfig) -> Self { + self.options.codegen_config = config; + self + } + /// Generate the Rust bindings using the options built up thus far. pub fn generate<'ctx>(self) -> Result, ()> { Bindings::generate(self.options, None) @@ -348,14 +397,6 @@ pub struct BindgenOptions { /// True if we should dump our internal IR for debugging purposes. pub emit_ir: bool, - /// True if we should ignore functions and only generate bindings for - /// structures, types, and methods. - pub ignore_functions: bool, - - /// True if we should avoid generating bindings for methods, and instead - /// just generate code for structures and types. - pub ignore_methods: bool, - /// True if we should emulate C++ namespaces with Rust modules in the /// generated bindings. pub enable_cxx_namespaces: bool, @@ -403,6 +444,10 @@ pub struct BindgenOptions { /// A user-provided type chooser to allow customizing different kinds of /// situations. pub type_chooser: Option>, + + /// Which kind of items should we generate? By default, we'll generate all + /// of them. + pub codegen_config: CodegenConfig, } impl Default for BindgenOptions { @@ -418,8 +463,6 @@ impl Default for BindgenOptions { links: vec![], emit_ast: false, emit_ir: false, - ignore_functions: false, - ignore_methods: false, derive_debug: true, enable_cxx_namespaces: false, disable_name_namespacing: false, @@ -434,6 +477,7 @@ impl Default for BindgenOptions { input_header: None, dummy_uses: None, type_chooser: None, + codegen_config: CodegenConfig::all(), } } } diff --git a/src/options.rs b/src/options.rs index 9632619ff6..a783696ec4 100644 --- a/src/options.rs +++ b/src/options.rs @@ -1,5 +1,5 @@ use clap::{App, Arg}; -use libbindgen::{Builder, builder}; +use libbindgen::{Builder, builder, CodegenConfig}; use std::fs::File; use std::io::{self, Error, ErrorKind}; @@ -71,6 +71,12 @@ pub fn builder_from_flags(args: I) .long("ignore-functions") .help("Do not generate bindings for functions or methods. This \ is useful when you only care about struct layouts."), + Arg::with_name("generate") + .long("generate") + .help("Generate a given kind of items, split by commas. \ + Valid values are \"functions\",\"types\", \"vars\" and \ + \"methods\".") + .takes_value(true), Arg::with_name("ignore-methods") .long("ignore-methods") .help("Do not generate bindings for methods."), @@ -185,6 +191,23 @@ pub fn builder_from_flags(args: I) } } + if let Some(what_to_generate) = matches.value_of("generate") { + let mut config = CodegenConfig::nothing(); + for what in what_to_generate.split(",") { + match what { + "functions" => config.functions = true, + "types" => config.types = true, + "vars" => config.vars = true, + "methods" => config.methods = true, + _ => { + return Err( + Error::new(ErrorKind::Other, "Unknown generate item")); + } + } + } + builder = builder.with_codegen_config(config); + } + if matches.is_present("emit-clang-ast") { builder = builder.emit_clang_ast(); } From e054f6b5bad0f91b90a73ef9291f6c53b1afcfe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 6 Dec 2016 23:57:11 -0800 Subject: [PATCH 0146/2291] Update clang-sys. --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index e5a14a6f82..57be684ee8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ repository = "https://github.com/servo/rust-bindgen" version = "0.17.0" [dependencies] -clang-sys = "0.8.0" +clang-sys = "0.11.1" clap = "2" libbindgen = { path = "libbindgen" } log = "0.3" From 9e57da0c24209bc921c78375c29f7d161c450323 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Wed, 7 Dec 2016 12:57:33 -1000 Subject: [PATCH 0147/2291] Use std::env::var instead of env! in build srcipt Recent versions of Cargo seems to not provide $OUT_DIR and some other environment variables anymore when building build scripts. --- libbindgen/build.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libbindgen/build.rs b/libbindgen/build.rs index 36c3aa69c9..c3633cd4fd 100644 --- a/libbindgen/build.rs +++ b/libbindgen/build.rs @@ -1,9 +1,10 @@ mod codegen { extern crate quasi_codegen; - use std::path::Path; + use std::env; + use std::path::{Path, PathBuf}; pub fn main() { - let out_dir = Path::new(env!("OUT_DIR")); + let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); let src = Path::new("src/codegen/mod.rs"); let dst = Path::new(&out_dir).join("codegen.rs"); @@ -15,17 +16,18 @@ mod codegen { mod testgen { use std::char; + use std::env; use std::ffi::OsStr; use std::fs::{self, File}; use std::io::Write; - use std::path::Path; + use std::path::{Path, PathBuf}; pub fn main() { - let out_dir = Path::new(env!("OUT_DIR")); + let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); let mut dst = File::create(Path::new(&out_dir).join("tests.rs")).unwrap(); println!("cargo:rerun-if-changed=tests/headers"); - let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); + let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); let headers_dir = manifest_dir.join("tests").join("headers"); let entries = fs::read_dir(headers_dir) From 9ac59f8ad0171dc93cced2a2d69b49fcf13f814a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 5 Dec 2016 09:03:13 -0800 Subject: [PATCH 0148/2291] ir: Auto-whitelist replacements. --- libbindgen/src/ir/context.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index ebc7f10a6c..f832a5d2e3 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -947,6 +947,12 @@ impl<'ctx> BindgenContext<'ctx> { return true; } + // If this is a type that explicitly replaces another, we assume + // you know what you're doing. + if item.annotations().use_instead_of().is_some() { + return true; + } + let name = item.name(self).for_name_checking().get(); match *item.kind() { ItemKind::Module(..) => true, From f684e77b950c00454909a54df7a26335b68e05ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 5 Dec 2016 09:38:01 -0800 Subject: [PATCH 0149/2291] ir: Saner whitelisting/blacklisting. --- libbindgen/src/codegen/mod.rs | 13 +-- libbindgen/src/ir/annotations.rs | 15 ++- libbindgen/src/ir/context.rs | 100 +++++++++++------ libbindgen/src/ir/item.rs | 104 +++++++++++------- libbindgen/src/ir/ty.rs | 95 +++++++++------- .../tests/reparented_replacement.rs | 29 +++++ .../tests/replace_template_alias.rs | 8 +- .../tests/type_alias_template_specialized.rs | 2 + .../tests/headers/reparented_replacement.hpp | 16 +++ .../tests/headers/replace_template_alias.hpp | 2 +- .../headers/whitelist-namespaces-basic.hpp | 2 +- 11 files changed, 253 insertions(+), 133 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/reparented_replacement.rs create mode 100644 libbindgen/tests/headers/reparented_replacement.hpp diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index d2e2b96c16..95a6f61176 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -467,12 +467,9 @@ impl CodeGenerator for Type { TypeKind::Comp(ref ci) => { ci.codegen(ctx, result, whitelisted_items, item) } - // NB: The inner Alias will be generated and pick the correct + // NB: The code below will pick the correct // applicable_template_args. - TypeKind::TemplateAlias(inner, _) => { - ctx.resolve_item(inner) - .codegen(ctx, result, whitelisted_items, &()) - }, + TypeKind::TemplateAlias(ref spelling, inner, _) | TypeKind::Alias(ref spelling, inner) => { let inner_item = ctx.resolve_item(inner); let name = item.canonical_name(ctx); @@ -1777,10 +1774,9 @@ impl ToRustTy for Type { aster::ty::TyBuilder::new().array(len).build(inner) } TypeKind::Enum(..) => { - let path = item.canonical_path(ctx); + let path = item.namespace_aware_canonical_path(ctx); aster::AstBuilder::new().ty().path().ids(path).build() } - TypeKind::TemplateAlias(inner, ref template_args) | TypeKind::TemplateRef(inner, ref template_args) => { // PS: Sorry for the duplication here. let mut inner_ty = inner.to_rust_ty(ctx).unwrap(); @@ -1803,6 +1799,7 @@ impl ToRustTy for Type { P(inner_ty) } TypeKind::ResolvedTypeRef(inner) => inner.to_rust_ty(ctx), + TypeKind::TemplateAlias(ref spelling, inner, _) | TypeKind::Alias(ref spelling, inner) => { if item.is_opaque(ctx) { // Pray if there's no available layout. @@ -2141,7 +2138,7 @@ mod utils { ctx: &BindgenContext, only_named: bool) -> P { - let path = item.canonical_path(ctx); + let path = item.namespace_aware_canonical_path(ctx); let builder = aster::AstBuilder::new().ty().path(); let template_args = if only_named { diff --git a/libbindgen/src/ir/annotations.rs b/libbindgen/src/ir/annotations.rs index 58308d6dde..948dbc96ba 100644 --- a/libbindgen/src/ir/annotations.rs +++ b/libbindgen/src/ir/annotations.rs @@ -27,9 +27,9 @@ pub struct Annotations { /// Whether this item should be hidden from the output. Only applies to /// types. hide: bool, - /// Whether this type should be replaced by another. The name must be the - /// canonical name that that type would get. - use_instead_of: Option, + /// Whether this type should be replaced by another. The name is a + /// namespace-aware path. + use_instead_of: Option>, /// Manually disable deriving copy/clone on this type. Only applies to /// struct or union types. disallow_copy: bool, @@ -106,7 +106,7 @@ impl Annotations { /// ``` /// /// That is, code for `Foo` is used to generate `Bar`. - pub fn use_instead_of(&self) -> Option<&str> { + pub fn use_instead_of(&self) -> Option<&[String]> { self.use_instead_of.as_ref().map(|s| &**s) } @@ -138,7 +138,12 @@ impl Annotations { "opaque" => self.opaque = true, "hide" => self.hide = true, "nocopy" => self.disallow_copy = true, - "replaces" => self.use_instead_of = Some(attr.value), + "replaces" => { + self.use_instead_of = + Some(attr.value.split("::") + .map(Into::into) + .collect()) + }, "private" => { self.private_fields = Some(attr.value != "false") } diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index f832a5d2e3..1d658e7d32 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -10,7 +10,7 @@ use std::collections::{HashMap, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; use super::int::IntKind; -use super::item::Item; +use super::item::{Item, ItemCanonicalPath}; use super::item_kind::ItemKind; use super::module::Module; use super::ty::{FloatKind, Type, TypeKind}; @@ -100,7 +100,7 @@ pub struct BindgenContext<'ctx> { parsed_macros: HashMap, cexpr::expr::EvalResult>, /// The active replacements collected from replaces="xxx" annotations. - replacements: HashMap, + replacements: HashMap, ItemId>, collected_typerefs: bool, @@ -172,7 +172,8 @@ impl<'ctx> BindgenContext<'ctx> { declaration: Option, location: Option) { use clangll::{CXCursor_ClassTemplate, - CXCursor_ClassTemplatePartialSpecialization}; + CXCursor_ClassTemplatePartialSpecialization, + CXCursor_TypeAliasTemplateDecl}; debug!("BindgenContext::add_item({:?}, declaration: {:?}, loc: {:?}", item, declaration, @@ -207,7 +208,8 @@ impl<'ctx> BindgenContext<'ctx> { if let Some(location) = location { if location.kind() == CXCursor_ClassTemplate || location.kind() == - CXCursor_ClassTemplatePartialSpecialization { + CXCursor_ClassTemplatePartialSpecialization || + location.kind() == CXCursor_TypeAliasTemplateDecl { declaration = location; } } @@ -353,6 +355,10 @@ impl<'ctx> BindgenContext<'ctx> { let mut replacements = vec![]; for (id, item) in self.items.iter() { + if item.annotations().use_instead_of().is_some() { + continue; + } + // Calls to `canonical_name` are expensive, so eagerly filter out // items that cannot be replaced. let ty = match item.kind().as_type() { @@ -362,23 +368,13 @@ impl<'ctx> BindgenContext<'ctx> { match *ty.kind() { TypeKind::Comp(ref ci) if !ci.is_template_specialization() => {} - TypeKind::TemplateAlias(_, _) | - TypeKind::Alias(_, _) => {} + TypeKind::TemplateAlias(..) | + TypeKind::Alias(..) => {} _ => continue, } - let in_namespace = self.options().enable_cxx_namespaces; - - let name = if in_namespace { - item.name(self) - .within_namespaces() - .get() - } else { - item.name(self) - .for_name_checking() - .get() - }; - let replacement = self.replacements.get(&name); + let path = item.canonical_path(self); + let replacement = self.replacements.get(&path[1..]); if let Some(replacement) = replacement { if replacement != id { @@ -394,9 +390,33 @@ impl<'ctx> BindgenContext<'ctx> { for (id, replacement) in replacements { debug!("Replacing {:?} with {:?}", id, replacement); - let mut item = self.items.get_mut(&id).unwrap(); - *item.kind_mut().as_type_mut().unwrap().kind_mut() = - TypeKind::ResolvedTypeRef(replacement); + let new_parent = { + let mut item = self.items.get_mut(&id).unwrap(); + *item.kind_mut().as_type_mut().unwrap().kind_mut() = + TypeKind::ResolvedTypeRef(replacement); + item.parent_id() + }; + + + // Reparent the item. + let old_parent = self.resolve_item(replacement).parent_id(); + + if new_parent == old_parent { + continue; + } + + if let Some(mut module) = self.items.get_mut(&old_parent).unwrap().as_module_mut() { + // Deparent the replacement. + let position = module.children().iter().position(|id| *id == replacement).unwrap(); + module.children_mut().remove(position); + } + + if let Some(mut module) = self.items.get_mut(&new_parent).unwrap().as_module_mut() { + module.children_mut().push(replacement); + } + + self.items.get_mut(&replacement).unwrap().set_parent_for_replacement(new_parent); + self.items.get_mut(&id).unwrap().set_parent_for_replacement(old_parent); } } @@ -637,7 +657,8 @@ impl<'ctx> BindgenContext<'ctx> { if let Some(location) = location { if location.kind() == CXCursor_ClassTemplate || location.kind() == - CXCursor_ClassTemplatePartialSpecialization { + CXCursor_ClassTemplatePartialSpecialization || + location.kind() == CXCursor_TypeAliasTemplateDecl { declaration = location; } } @@ -827,17 +848,17 @@ impl<'ctx> BindgenContext<'ctx> { /// /// Replacement types are declared using the `replaces="xxx"` annotation, /// and implies that the original type is hidden. - pub fn replace(&mut self, name: &str, potential_ty: ItemId) { + pub fn replace(&mut self, name: &[String], potential_ty: ItemId) { match self.replacements.entry(name.into()) { hash_map::Entry::Vacant(entry) => { - debug!("Defining replacement for {} as {:?}", + debug!("Defining replacement for {:?} as {:?}", name, potential_ty); entry.insert(potential_ty); } hash_map::Entry::Occupied(occupied) => { - warn!("Replacement for {} already defined as {:?}; \ - ignoring duplicate replacement definition as {:?}}}", + warn!("Replacement for {:?} already defined as {:?}; \ + ignoring duplicate replacement definition as {:?}", name, occupied.get(), potential_ty); @@ -847,27 +868,27 @@ impl<'ctx> BindgenContext<'ctx> { /// Is the item with the given `name` hidden? Or is the item with the given /// `name` and `id` replaced by another type, and effectively hidden? - pub fn hidden_by_name(&self, name: &str, id: ItemId) -> bool { + pub fn hidden_by_name(&self, path: &[String], id: ItemId) -> bool { debug_assert!(self.in_codegen_phase(), "You're not supposed to call this yet"); - self.options.hidden_types.contains(name) || - self.is_replaced_type(name, id) + self.options.hidden_types.contains(&path[1..].join("::")) || + self.is_replaced_type(path, id) } /// Has the item with the given `name` and `id` been replaced by another /// type? - pub fn is_replaced_type(&self, name: &str, id: ItemId) -> bool { - match self.replacements.get(name) { + pub fn is_replaced_type(&self, path: &[String], id: ItemId) -> bool { + match self.replacements.get(path) { Some(replaced_by) if *replaced_by != id => true, _ => false, } } /// Is the type with the given `name` marked as opaque? - pub fn opaque_by_name(&self, name: &str) -> bool { + pub fn opaque_by_name(&self, path: &[String]) -> bool { debug_assert!(self.in_codegen_phase(), "You're not supposed to call this yet"); - self.options.opaque_types.contains(name) + self.options.opaque_types.contains(&path[1..].join("::")) } /// Get the options used to configure this bindgen context. @@ -953,7 +974,8 @@ impl<'ctx> BindgenContext<'ctx> { return true; } - let name = item.name(self).for_name_checking().get(); + let name = item.canonical_path(self)[1..].join("::"); + debug!("whitelisted_items: testing {:?}", name); match *item.kind() { ItemKind::Module(..) => true, ItemKind::Function(_) => { @@ -967,7 +989,10 @@ impl<'ctx> BindgenContext<'ctx> { return true; } - if self.resolve_item(item.parent_id()).is_module() { + let parent = self.resolve_item(item.parent_id()); + if parent.is_module() { + let mut prefix_path = parent.canonical_path(self); + // Unnamed top-level enums are special and we // whitelist them via the `whitelisted_vars` filter, // since they're effectively top-level constants, @@ -976,9 +1001,12 @@ impl<'ctx> BindgenContext<'ctx> { if let TypeKind::Enum(ref enum_) = *ty.kind() { if ty.name().is_none() && enum_.variants().iter().any(|variant| { + prefix_path.push(variant.name().into()); + let name = prefix_path[1..].join("::"); + prefix_path.pop().unwrap(); self.options() .whitelisted_vars - .matches(&variant.name()) + .matches(&name) }) { return true; } diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index f12e4b549a..79aca5af2e 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -42,6 +42,12 @@ pub trait ItemCanonicalName { /// For bar, the canonical path is `vec!["foo", "BAR"]`, while the canonical /// name is just `"BAR"`. pub trait ItemCanonicalPath { + /// Get the namespace-aware canonical path for this item. This means that if + /// namespaces are disabled, you'll + fn namespace_aware_canonical_path(&self, + ctx: &BindgenContext) + -> Vec; + /// Get the canonical path for this item. fn canonical_path(&self, ctx: &BindgenContext) -> Vec; } @@ -127,6 +133,14 @@ impl ItemCanonicalName for ItemId { } impl ItemCanonicalPath for ItemId { + fn namespace_aware_canonical_path(&self, + ctx: &BindgenContext) + -> Vec { + debug_assert!(ctx.in_codegen_phase(), + "You're not supposed to call this yet"); + ctx.resolve_item(*self).namespace_aware_canonical_path(ctx) + } + fn canonical_path(&self, ctx: &BindgenContext) -> Vec { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); @@ -276,6 +290,13 @@ impl Item { self.parent_id } + /// Set this item's parent id. + /// + /// This is only used so replacements get generated in the proper module. + pub fn set_parent_for_replacement(&mut self, id: ItemId) { + self.parent_id = id; + } + /// Get this `Item`'s comment, if it has any. pub fn comment(&self) -> Option<&str> { self.comment.as_ref().map(|c| &**c) @@ -509,7 +530,7 @@ impl Item { } // XXX Is this completely correct? Partial template specialization // is hard anyways, sigh... - TypeKind::TemplateAlias(_, ref args) | + TypeKind::TemplateAlias(_, _, ref args) | TypeKind::TemplateRef(_, ref args) => args.clone(), // In a template specialization we've got all we want. TypeKind::Comp(ref ci) if ci.is_template_specialization() => { @@ -552,7 +573,7 @@ impl Item { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); self.annotations.hide() || - ctx.hidden_by_name(&self.name(ctx).for_name_checking().get(), self.id) + ctx.hidden_by_name(&self.canonical_path(ctx), self.id) } /// Is this item opaque? @@ -560,7 +581,7 @@ impl Item { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); self.annotations.opaque() || - ctx.opaque_by_name(&self.name(ctx).for_name_checking().get()) + ctx.opaque_by_name(&self.canonical_path(ctx)) } /// Is this a reference to another type? @@ -585,8 +606,7 @@ impl Item { /// Get the target item id for name generation. fn name_target(&self, - ctx: &BindgenContext, - for_name_checking: bool) + ctx: &BindgenContext) -> ItemId { let mut targets_seen = DebugOnlyItemSet::new(); let mut item = self; @@ -595,6 +615,10 @@ impl Item { debug_assert!(!targets_seen.contains(&item.id())); targets_seen.insert(item.id()); + if self.annotations().use_instead_of().is_some() { + return self.id(); + } + match *item.kind() { ItemKind::Type(ref ty) => { match *ty.kind() { @@ -611,13 +635,6 @@ impl Item { TypeKind::TemplateRef(inner, _) => { item = ctx.resolve_item(inner); } - // Template aliases use their inner alias type's name if - // we are checking names for - // whitelisting/replacement/etc. - TypeKind::TemplateAlias(inner, _) - if for_name_checking => { - item = ctx.resolve_item(inner); - } _ => return item.id(), } } @@ -657,14 +674,13 @@ impl Item { } /// Get this item's base name (aka non-namespaced name). - /// - /// The `for_name_checking` boolean parameter informs us whether we are - /// asking for the name in order to do a whitelisting/replacement/etc check - /// or if we are instead using it for code generation. fn base_name(&self, - ctx: &BindgenContext, - for_name_checking: bool) + ctx: &BindgenContext) -> String { + if let Some(path) = self.annotations().use_instead_of() { + return path.last().unwrap().clone(); + } + match *self.kind() { ItemKind::Var(ref var) => var.name().to_owned(), ItemKind::Module(ref module) => { @@ -677,9 +693,6 @@ impl Item { ItemKind::Type(ref ty) => { let name = match *ty.kind() { TypeKind::ResolvedTypeRef(..) => panic!("should have resolved this in name_target()"), - TypeKind::TemplateAlias(..) => { - if for_name_checking { None } else { Some("") } - } _ => ty.name(), }; name.map(ToOwned::to_owned) @@ -717,16 +730,17 @@ impl Item { opt: &NameOptions) -> String { let target = - ctx.resolve_item(self.name_target(ctx, opt.for_name_checking)); + ctx.resolve_item(self.name_target(ctx)); // Short-circuit if the target has an override, and just use that. - if !opt.for_name_checking { - if let Some(other) = target.annotations.use_instead_of() { - return other.to_owned(); + if let Some(path) = target.annotations.use_instead_of() { + if ctx.options().enable_cxx_namespaces { + return path.last().unwrap().clone(); } + return path.join("_").to_owned(); } - let base_name = target.base_name(ctx, opt.for_name_checking); + let base_name = target.base_name(ctx); // Named template type arguments are never namespaced, and never // mangled. @@ -744,8 +758,8 @@ impl Item { }) .map(|id| { let item = ctx.resolve_item(id); - let target = ctx.resolve_item(item.name_target(ctx, false)); - target.base_name(ctx, false) + let target = ctx.resolve_item(item.name_target(ctx)); + target.base_name(ctx) }) .filter(|name| !name.is_empty()) .collect(); @@ -1217,17 +1231,34 @@ impl ItemCanonicalName for Item { } impl ItemCanonicalPath for Item { + fn namespace_aware_canonical_path(&self, + ctx: &BindgenContext) + -> Vec { + if ctx.options().enable_cxx_namespaces { + return self.canonical_path(ctx); + } + return vec![self.canonical_path(ctx)[1..].join("_")]; + } + fn canonical_path(&self, ctx: &BindgenContext) -> Vec { - if !ctx.options().enable_cxx_namespaces { - return vec![self.canonical_name(ctx)]; + if let Some(path) = self.annotations().use_instead_of() { + let mut ret = + vec![ctx.resolve_item(ctx.root_module()).name(ctx).get()]; + ret.extend_from_slice(path); + return ret; } - let target = ctx.resolve_item(self.name_target(ctx, false)); + let target = ctx.resolve_item(self.name_target(ctx)); let mut path: Vec<_> = target.ancestors(ctx) .chain(iter::once(ctx.root_module())) .map(|id| ctx.resolve_item(id)) .filter(|item| item.is_module() || item.id() == target.id()) - .map(|item| item.name(ctx).within_namespaces().get()) + .map(|item| { + ctx.resolve_item(item.name_target(ctx)) + .name(ctx) + .within_namespaces() + .get() + }) .collect(); path.reverse(); path @@ -1242,7 +1273,6 @@ pub struct NameOptions<'item, 'ctx> { item: &'item Item, ctx: &'item BindgenContext<'ctx>, - for_name_checking: bool, within_namespaces: bool, } @@ -1252,18 +1282,10 @@ impl<'item, 'ctx> NameOptions<'item, 'ctx> { NameOptions { item: item, ctx: ctx, - for_name_checking: false, within_namespaces: false, } } - /// Construct a name that is suitable for replacements/whitelisting/opaque- - /// ness look ups. - pub fn for_name_checking(&mut self) -> &mut Self { - self.for_name_checking = true; - self - } - /// Construct the name without the item's containing C++ namespaces mangled /// into it. In other words, the item's name within the item's namespace. pub fn within_namespaces(&mut self) -> &mut Self { diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 33e208613a..8b0116df40 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -64,6 +64,22 @@ impl Type { &self.kind } + /// Overrides the kind of the item. This is mostly a template alias + /// implementation detail, and debug assertions guard it like so. + pub fn set_kind(&mut self, kind: TypeKind) { + if cfg!(debug_assertions) { + match (&self.kind, &kind) { + (&TypeKind::Alias(ref alias_name, alias_inner), + &TypeKind::TemplateAlias(ref name, inner, _)) => { + assert_eq!(alias_name, name); + assert_eq!(alias_inner, inner); + } + _ => panic!("Unexpected kind in `set_kind`!"), + }; + } + self.kind = kind; + } + /// Get a mutable reference to this type's kind. pub fn kind_mut(&mut self) -> &mut TypeKind { &mut self.kind @@ -90,6 +106,14 @@ impl Type { } } + /// Is this a template alias type? + pub fn is_template_alias(&self) -> bool { + match self.kind { + TypeKind::TemplateAlias(..) => true, + _ => false, + } + } + /// Is this a function type? pub fn is_function(&self) -> bool { match self.kind { @@ -195,7 +219,7 @@ impl Type { ctx.resolve_type(t).can_derive_debug(ctx) } TypeKind::ResolvedTypeRef(t) | - TypeKind::TemplateAlias(t, _) | + TypeKind::TemplateAlias(_, t, _) | TypeKind::Alias(_, t) => ctx.resolve_type(t).can_derive_debug(ctx), TypeKind::Comp(ref info) => { info.can_derive_debug(ctx, self.layout(ctx)) @@ -232,7 +256,7 @@ impl Type { -> bool { match self.kind { TypeKind::ResolvedTypeRef(t) | - TypeKind::TemplateAlias(t, _) | + TypeKind::TemplateAlias(_, t, _) | TypeKind::Alias(_, t) | TypeKind::Array(t, _) => { ctx.resolve_item(t) @@ -252,7 +276,7 @@ impl Type { ctx.resolve_item(t).can_derive_copy_in_array(ctx) } TypeKind::ResolvedTypeRef(t) | - TypeKind::TemplateAlias(t, _) | + TypeKind::TemplateAlias(_, t, _) | TypeKind::TemplateRef(t, _) | TypeKind::Alias(_, t) => ctx.resolve_item(t).can_derive_copy(ctx), TypeKind::Comp(ref info) => info.can_derive_copy(ctx, item), @@ -265,7 +289,7 @@ impl Type { // FIXME: Can we do something about template parameters? Huh... match self.kind { TypeKind::TemplateRef(t, _) | - TypeKind::TemplateAlias(t, _) | + TypeKind::TemplateAlias(_, t, _) | TypeKind::Alias(_, t) | TypeKind::ResolvedTypeRef(t) => ctx.resolve_type(t).has_vtable(ctx), TypeKind::Comp(ref info) => info.has_vtable(ctx), @@ -278,7 +302,7 @@ impl Type { pub fn has_destructor(&self, ctx: &BindgenContext) -> bool { match self.kind { TypeKind::TemplateRef(t, _) | - TypeKind::TemplateAlias(t, _) | + TypeKind::TemplateAlias(_, t, _) | TypeKind::Alias(_, t) | TypeKind::ResolvedTypeRef(t) => { ctx.resolve_type(t).has_destructor(ctx) @@ -293,10 +317,9 @@ impl Type { ctx: &BindgenContext, ty: &Type) -> bool { - debug_assert!(ty.is_named()); let name = match *ty.kind() { TypeKind::Named(ref name, _) => name, - _ => unreachable!(), + ref other @ _ => unreachable!("Not a named type: {:?}", other), }; match self.kind { @@ -316,7 +339,7 @@ impl Type { ctx.resolve_type(sig.return_type()) .signature_contains_named_type(ctx, ty) } - TypeKind::TemplateAlias(_, ref template_args) | + TypeKind::TemplateAlias(_, _, ref template_args) | TypeKind::TemplateRef(_, ref template_args) => { template_args.iter().any(|arg| { ctx.resolve_type(*arg) @@ -361,7 +384,7 @@ impl Type { TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(_, inner) | - TypeKind::TemplateAlias(inner, _) | + TypeKind::TemplateAlias(_, inner, _) | TypeKind::TemplateRef(inner, _) => { ctx.resolve_type(inner).safe_canonical_type(ctx) } @@ -409,9 +432,9 @@ pub enum TypeKind { /// A type alias, with a name, that points to another type. Alias(String, ItemId), - /// A templated alias, pointing to an inner `Alias` type, with template - /// parameters. - TemplateAlias(ItemId, Vec), + /// A templated alias, pointing to an inner type, just as `Alias`, but with + /// template parameters. + TemplateAlias(String, ItemId, Vec), /// An array of a type and a lenght. Array(ItemId, usize), @@ -476,7 +499,7 @@ impl Type { } TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(_, inner) | - TypeKind::TemplateAlias(inner, _) | + TypeKind::TemplateAlias(_, inner, _) | TypeKind::TemplateRef(inner, _) => { ctx.resolve_type(inner).is_unsized(ctx) } @@ -630,13 +653,19 @@ impl Type { location.visit(|cur| { match cur.kind() { CXCursor_TypeAliasDecl => { - debug_assert!(cur.cur_type().kind() == + let current = cur.cur_type(); + + debug_assert!(current.kind() == CXType_Typedef); - inner = - Item::from_ty(&cur.cur_type(), - Some(cur), - Some(potential_id), - ctx); + + name = current.spelling(); + + let inner_ty = cur.typedef_type(); + inner = Item::from_ty( + &inner_ty, + Some(cur), + Some(potential_id), + ctx); } CXCursor_TemplateTypeParameter => { // See the comment in src/ir/comp.rs @@ -663,24 +692,16 @@ impl Type { CXChildVisit_Continue }); - if inner.is_err() { - error!("Failed to parse templated alias {:?}", - location); - return Err(ParseError::Continue); - } + let inner_type = match inner { + Ok(inner) => inner, + Err(..) => { + error!("Failed to parse template alias {:?}", + location); + return Err(ParseError::Continue); + } + }; - // NB: `args` may be empty here (if for example the - // template parameters are constants). - // - // We can't reject it here then because inner points - // to `potential_id` now, so either we remove - // `inner` and return an error, or carry on. - // - // In this case, we just carry on, since it seems - // easier if than removing every possible reference - // to `item` from `ctx`, and it doesn't give any - // problems that we didn't have anyway. - TypeKind::TemplateAlias(inner.unwrap(), args) + TypeKind::TemplateAlias(name.clone(), inner_type, args) } CXCursor_TemplateRef => { let referenced = location.referenced().unwrap(); @@ -870,13 +891,13 @@ impl TypeCollector for Type { TypeKind::Pointer(inner) | TypeKind::Reference(inner) | TypeKind::Array(inner, _) | - TypeKind::TemplateAlias(inner, _) | TypeKind::Alias(_, inner) | TypeKind::Named(_, Some(inner)) | TypeKind::ResolvedTypeRef(inner) => { types.insert(inner); } + TypeKind::TemplateAlias(_, inner, ref template_args) | TypeKind::TemplateRef(inner, ref template_args) => { types.insert(inner); for &item in template_args { diff --git a/libbindgen/tests/expectations/tests/reparented_replacement.rs b/libbindgen/tests/expectations/tests/reparented_replacement.rs new file mode 100644 index 0000000000..74ee229c15 --- /dev/null +++ b/libbindgen/tests/expectations/tests/reparented_replacement.rs @@ -0,0 +1,29 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use self::super::root; + pub mod foo { + #[allow(unused_imports)] + use self::super::super::root; + ///
+ #[repr(C)] + #[derive(Debug, Copy)] + pub struct Bar { + pub bazz: ::std::os::raw::c_int, + } + #[test] + fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); + } + impl Clone for Bar { + fn clone(&self) -> Self { *self } + } + } + pub type ReferencesBar = root::foo::Bar; +} diff --git a/libbindgen/tests/expectations/tests/replace_template_alias.rs b/libbindgen/tests/expectations/tests/replace_template_alias.rs index b9a0d0c986..f922ac7750 100644 --- a/libbindgen/tests/expectations/tests/replace_template_alias.rs +++ b/libbindgen/tests/expectations/tests/replace_template_alias.rs @@ -4,12 +4,12 @@ #![allow(non_snake_case)] +/// But the replacement type does use T! +/// +///
+pub type JS_detail_MaybeWrapped = T; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct JS_Rooted { pub ptr: JS_detail_MaybeWrapped, } -/// But the replacement type does use T! -/// -///
-pub type JS_detail_MaybeWrapped = T; diff --git a/libbindgen/tests/expectations/tests/type_alias_template_specialized.rs b/libbindgen/tests/expectations/tests/type_alias_template_specialized.rs index 989f2015b0..11813bc6a2 100644 --- a/libbindgen/tests/expectations/tests/type_alias_template_specialized.rs +++ b/libbindgen/tests/expectations/tests/type_alias_template_specialized.rs @@ -17,3 +17,5 @@ fn bindgen_test_layout_Rooted() { impl Clone for Rooted { fn clone(&self) -> Self { *self } } +///
+pub type MaybeWrapped
= a; diff --git a/libbindgen/tests/headers/reparented_replacement.hpp b/libbindgen/tests/headers/reparented_replacement.hpp new file mode 100644 index 0000000000..4ac2bf03c8 --- /dev/null +++ b/libbindgen/tests/headers/reparented_replacement.hpp @@ -0,0 +1,16 @@ +// bindgen-flags: --enable-cxx-namespaces + +namespace foo { + struct Bar { + int baz; + }; +} + +namespace bar { + ///
+ struct Bar_Replacement { + int bazz; + }; +}; + +typedef foo::Bar ReferencesBar; diff --git a/libbindgen/tests/headers/replace_template_alias.hpp b/libbindgen/tests/headers/replace_template_alias.hpp index b0648994e8..c325b5a38e 100644 --- a/libbindgen/tests/headers/replace_template_alias.hpp +++ b/libbindgen/tests/headers/replace_template_alias.hpp @@ -18,6 +18,6 @@ class Rooted { /// But the replacement type does use T! /// -///
+///
template using replaces_MaybeWrapped = T; diff --git a/libbindgen/tests/headers/whitelist-namespaces-basic.hpp b/libbindgen/tests/headers/whitelist-namespaces-basic.hpp index abe9dc11ba..2eaa87403e 100644 --- a/libbindgen/tests/headers/whitelist-namespaces-basic.hpp +++ b/libbindgen/tests/headers/whitelist-namespaces-basic.hpp @@ -1,4 +1,4 @@ -// bindgen-flags: --enable-cxx-namespaces --whitelist-type outer_inner_Helper +// bindgen-flags: --enable-cxx-namespaces --whitelist-type outer::inner::Helper namespace outer { namespace inner { From 5e10791fdea72f2d4ca80b1f6b90ac25c415048c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 7 Dec 2016 16:38:53 -1000 Subject: [PATCH 0150/2291] ir: Move duplicated checks into a function. --- libbindgen/src/clang.rs | 12 ++++++++++++ libbindgen/src/ir/context.rs | 22 ++++------------------ libbindgen/src/ir/item.rs | 3 ++- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 7c6d31999d..a81a8cfbda 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -173,6 +173,18 @@ impl Cursor { semantic_parent == tu.fallible_semantic_parent() } + /// There are a few kinds of types that we need to treat specially, mainly + /// not tracking the type declaration but the location of the cursor, given + /// clang doesn't expose a proper declaration for these types. + pub fn is_template_like(&self) -> bool { + match self.kind() { + CXCursor_ClassTemplate | + CXCursor_ClassTemplatePartialSpecialization | + CXCursor_TypeAliasTemplateDecl => true, + _ => false, + } + } + /// Get the kind of referent this cursor is pointing to. pub fn kind(&self) -> Enum_CXCursorKind { unsafe { clang_getCursorKind(self.x) } diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 1d658e7d32..b1c40cb3de 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -171,9 +171,6 @@ impl<'ctx> BindgenContext<'ctx> { item: Item, declaration: Option, location: Option) { - use clangll::{CXCursor_ClassTemplate, - CXCursor_ClassTemplatePartialSpecialization, - CXCursor_TypeAliasTemplateDecl}; debug!("BindgenContext::add_item({:?}, declaration: {:?}, loc: {:?}", item, declaration, @@ -206,10 +203,7 @@ impl<'ctx> BindgenContext<'ctx> { let mut declaration = declaration.unwrap(); if !declaration.is_valid() { if let Some(location) = location { - if location.kind() == CXCursor_ClassTemplate || - location.kind() == - CXCursor_ClassTemplatePartialSpecialization || - location.kind() == CXCursor_TypeAliasTemplateDecl { + if location.is_template_like() { declaration = location; } } @@ -645,9 +639,7 @@ impl<'ctx> BindgenContext<'ctx> { ty: &clang::Type, location: Option) -> Option { - use clangll::{CXCursor_ClassTemplate, - CXCursor_ClassTemplatePartialSpecialization, - CXCursor_TypeAliasTemplateDecl, CXCursor_TypeRef}; + use clangll::{CXCursor_TypeAliasTemplateDecl, CXCursor_TypeRef}; debug!("builtin_or_resolved_ty: {:?}, {:?}, {:?}", ty, location, @@ -655,10 +647,7 @@ impl<'ctx> BindgenContext<'ctx> { let mut declaration = ty.declaration(); if !declaration.is_valid() { if let Some(location) = location { - if location.kind() == CXCursor_ClassTemplate || - location.kind() == - CXCursor_ClassTemplatePartialSpecialization || - location.kind() == CXCursor_TypeAliasTemplateDecl { + if location.is_template_like() { declaration = location; } } @@ -690,10 +679,7 @@ impl<'ctx> BindgenContext<'ctx> { // Note that we only do it if parent_id is some, and we have a // location for building the new arguments, the template // argument names don't matter in the global context. - if (declaration.kind() == CXCursor_ClassTemplate || - declaration.kind() == - CXCursor_ClassTemplatePartialSpecialization || - declaration.kind() == CXCursor_TypeAliasTemplateDecl) && + if declaration.is_template_like() && *ty != canonical_declaration.cur_type() && location.is_some() && parent_id.is_some() { diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 79aca5af2e..a754801c63 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -43,7 +43,8 @@ pub trait ItemCanonicalName { /// name is just `"BAR"`. pub trait ItemCanonicalPath { /// Get the namespace-aware canonical path for this item. This means that if - /// namespaces are disabled, you'll + /// namespaces are disabled, you'll get a single item, and otherwise you get + /// the whole path. fn namespace_aware_canonical_path(&self, ctx: &BindgenContext) -> Vec; From c3685effcee7c49a747b2e149432f4113bc22713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 7 Dec 2016 16:44:07 -1000 Subject: [PATCH 0151/2291] ir: Add test for #315 Fixes #315 --- libbindgen/tests/expectations/tests/issue_315.rs | 8 ++++++++ libbindgen/tests/headers/issue_315.hpp | 2 ++ 2 files changed, 10 insertions(+) create mode 100644 libbindgen/tests/expectations/tests/issue_315.rs create mode 100644 libbindgen/tests/headers/issue_315.hpp diff --git a/libbindgen/tests/expectations/tests/issue_315.rs b/libbindgen/tests/expectations/tests/issue_315.rs new file mode 100644 index 0000000000..a5ab63fca1 --- /dev/null +++ b/libbindgen/tests/expectations/tests/issue_315.rs @@ -0,0 +1,8 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +///
+pub type c
= a; diff --git a/libbindgen/tests/headers/issue_315.hpp b/libbindgen/tests/headers/issue_315.hpp new file mode 100644 index 0000000000..e58cb5e335 --- /dev/null +++ b/libbindgen/tests/headers/issue_315.hpp @@ -0,0 +1,2 @@ +///
+template using b = a; From 27fb5df28b063e59fd4d4f9e1ad858f681e9e6d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 7 Dec 2016 17:04:56 -1000 Subject: [PATCH 0152/2291] ir: Fix namespace_aware_canonical_name with disable_name_namespacing. --- libbindgen/src/ir/item.rs | 8 +++++-- .../canonical_path_without_namespacing.rs | 23 +++++++++++++++++++ .../canonical_path_without_namespacing.hpp | 7 ++++++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/canonical_path_without_namespacing.rs create mode 100644 libbindgen/tests/headers/canonical_path_without_namespacing.hpp diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index a754801c63..6601216eb9 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -1235,10 +1235,14 @@ impl ItemCanonicalPath for Item { fn namespace_aware_canonical_path(&self, ctx: &BindgenContext) -> Vec { + let path = self.canonical_path(ctx); if ctx.options().enable_cxx_namespaces { - return self.canonical_path(ctx); + return path; } - return vec![self.canonical_path(ctx)[1..].join("_")]; + if ctx.options().disable_name_namespacing { + return vec![path.last().unwrap().clone()]; + } + return vec![path[1..].join("_")]; } fn canonical_path(&self, ctx: &BindgenContext) -> Vec { diff --git a/libbindgen/tests/expectations/tests/canonical_path_without_namespacing.rs b/libbindgen/tests/expectations/tests/canonical_path_without_namespacing.rs new file mode 100644 index 0000000000..0b1f561c74 --- /dev/null +++ b/libbindgen/tests/expectations/tests/canonical_path_without_namespacing.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Bar { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for Bar { + fn clone(&self) -> Self { *self } +} +extern "C" { + #[link_name = "_Z3bazPN3foo3BarE"] + pub fn baz(arg1: *mut Bar); +} diff --git a/libbindgen/tests/headers/canonical_path_without_namespacing.hpp b/libbindgen/tests/headers/canonical_path_without_namespacing.hpp new file mode 100644 index 0000000000..92e8584284 --- /dev/null +++ b/libbindgen/tests/headers/canonical_path_without_namespacing.hpp @@ -0,0 +1,7 @@ +// bindgen-flags: --disable-name-namespacing + +namespace foo { + struct Bar {}; +} + +void baz(foo::Bar*); From dd80c2782a545864b95d2f0d18e7884038bff473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 7 Dec 2016 22:39:46 -1000 Subject: [PATCH 0153/2291] codegen: generate stable names for tests functions. --- libbindgen/src/codegen/mod.rs | 191 ++++++++++-------- .../tests/expectations/tests/anon_union.rs | 2 +- .../expectations/tests/class_with_dtor.rs | 2 +- libbindgen/tests/expectations/tests/crtp.rs | 4 +- .../tests/expectations/tests/template.rs | 4 +- 5 files changed, 109 insertions(+), 94 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 95a6f61176..a88e7d733a 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -19,6 +19,7 @@ use ir::var::Var; use self::helpers::{BlobTyBuilder, attributes}; use std::borrow::Cow; +use std::cell::Cell; use std::collections::HashSet; use std::collections::hash_map::{Entry, HashMap}; use std::fmt::Write; @@ -59,9 +60,16 @@ fn root_import(ctx: &BindgenContext, module: &Item) -> P { quote_item!(ctx.ext_cx(), #[allow(unused_imports)] $use_root).unwrap() } -struct CodegenResult { +struct CodegenResult<'a> { items: Vec>, + + /// A monotonic counter used to add stable unique id's to stuff that doesn't + /// need to be referenced by anything. + codegen_id: &'a Cell, + + /// Whether an union has been generated at least once. saw_union: bool, + items_seen: HashSet, /// The set of generated function/var names, needed because in C/C++ is /// legal to do something like: @@ -88,11 +96,12 @@ struct CodegenResult { overload_counters: HashMap, } -impl CodegenResult { - fn new() -> Self { +impl<'a> CodegenResult<'a> { + fn new(codegen_id: &'a Cell) -> Self { CodegenResult { items: vec![], saw_union: false, + codegen_id: codegen_id, items_seen: Default::default(), functions_seen: Default::default(), vars_seen: Default::default(), @@ -100,6 +109,11 @@ impl CodegenResult { } } + fn next_id(&mut self) -> usize { + self.codegen_id.set(self.codegen_id.get() + 1); + self.codegen_id.get() + } + fn saw_union(&mut self) { self.saw_union = true; } @@ -142,7 +156,7 @@ impl CodegenResult { fn inner(&mut self, cb: F) -> Vec> where F: FnOnce(&mut Self), { - let mut new = Self::new(); + let mut new = Self::new(self.codegen_id); cb(&mut new); @@ -152,7 +166,7 @@ impl CodegenResult { } } -impl ops::Deref for CodegenResult { +impl<'a> ops::Deref for CodegenResult<'a> { type Target = Vec>; fn deref(&self) -> &Self::Target { @@ -160,7 +174,7 @@ impl ops::Deref for CodegenResult { } } -impl ops::DerefMut for CodegenResult { +impl<'a> ops::DerefMut for CodegenResult<'a> { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.items } @@ -237,21 +251,21 @@ trait CodeGenerator { /// Extra information from the caller. type Extra; - fn codegen(&self, - ctx: &BindgenContext, - result: &mut CodegenResult, - whitelisted_items: &ItemSet, - extra: &Self::Extra); + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + whitelisted_items: &ItemSet, + extra: &Self::Extra); } impl CodeGenerator for Item { type Extra = (); - fn codegen(&self, - ctx: &BindgenContext, - result: &mut CodegenResult, - whitelisted_items: &ItemSet, - _extra: &()) { + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + whitelisted_items: &ItemSet, + _extra: &()) { if self.is_hidden(ctx) || result.seen(self.id()) { debug!("::codegen: Ignoring hidden or seen: \ self = {:?}", self); @@ -288,11 +302,11 @@ impl CodeGenerator for Item { impl CodeGenerator for Module { type Extra = Item; - fn codegen(&self, - ctx: &BindgenContext, - result: &mut CodegenResult, - whitelisted_items: &ItemSet, - item: &Item) { + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + whitelisted_items: &ItemSet, + item: &Item) { debug!("::codegen: item = {:?}", item); let codegen_self = |result: &mut CodegenResult, found_any: &mut bool| { @@ -348,11 +362,11 @@ impl CodeGenerator for Module { impl CodeGenerator for Var { type Extra = Item; - fn codegen(&self, - ctx: &BindgenContext, - result: &mut CodegenResult, - _whitelisted_items: &ItemSet, - item: &Item) { + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + _whitelisted_items: &ItemSet, + item: &Item) { use ir::var::VarType; debug!("::codegen: item = {:?}", item); @@ -439,11 +453,11 @@ impl CodeGenerator for Var { impl CodeGenerator for Type { type Extra = Item; - fn codegen(&self, - ctx: &BindgenContext, - result: &mut CodegenResult, - whitelisted_items: &ItemSet, - item: &Item) { + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + whitelisted_items: &ItemSet, + item: &Item) { debug!("::codegen: item = {:?}", item); match *self.kind() { @@ -560,11 +574,11 @@ impl<'a> Vtable<'a> { impl<'a> CodeGenerator for Vtable<'a> { type Extra = Item; - fn codegen(&self, - ctx: &BindgenContext, - result: &mut CodegenResult, - _whitelisted_items: &ItemSet, - item: &Item) { + fn codegen<'b>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'b>, + _whitelisted_items: &ItemSet, + item: &Item) { assert_eq!(item.id(), self.item_id); // For now, generate an empty struct, later we should generate function // pointers and whatnot. @@ -694,11 +708,11 @@ impl<'a> Bitfield<'a> { impl CodeGenerator for CompInfo { type Extra = Item; - fn codegen(&self, - ctx: &BindgenContext, - result: &mut CodegenResult, - whitelisted_items: &ItemSet, - item: &Item) { + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + whitelisted_items: &ItemSet, + item: &Item) { use aster::struct_field::StructFieldBuilder; debug!("::codegen: item = {:?}", item); @@ -713,7 +727,7 @@ impl CodeGenerator for CompInfo { let layout = item.kind().expect_type().layout(ctx); if let Some(layout) = layout { - let fn_name = format!("__bindgen_test_layout_template_{}", item.id().as_usize()); + let fn_name = format!("__bindgen_test_layout_template_{}", result.next_id()); let fn_name = ctx.rust_ident_raw(&fn_name); let ident = item.to_rust_ty(ctx); let prefix = ctx.trait_prefix(); @@ -1222,23 +1236,23 @@ impl CodeGenerator for CompInfo { } trait MethodCodegen { - fn codegen_method(&self, - ctx: &BindgenContext, - methods: &mut Vec, - method_names: &mut HashMap, - result: &mut CodegenResult, - whitelisted_items: &ItemSet, - parent: &Item); + fn codegen_method<'a>(&self, + ctx: &BindgenContext, + methods: &mut Vec, + method_names: &mut HashMap, + result: &mut CodegenResult<'a>, + whitelisted_items: &ItemSet, + parent: &Item); } impl MethodCodegen for Method { - fn codegen_method(&self, - ctx: &BindgenContext, - methods: &mut Vec, - method_names: &mut HashMap, - result: &mut CodegenResult, - whitelisted_items: &ItemSet, - _parent: &Item) { + fn codegen_method<'a>(&self, + ctx: &BindgenContext, + methods: &mut Vec, + method_names: &mut HashMap, + result: &mut CodegenResult<'a>, + whitelisted_items: &ItemSet, + _parent: &Item) { if self.is_virtual() { return; // FIXME } @@ -1408,13 +1422,13 @@ impl<'a> EnumBuilder<'a> { } /// Add a variant to this enum. - fn with_variant(self, - ctx: &BindgenContext, - variant: &EnumVariant, - mangling_prefix: Option<&String>, - rust_ty: P, - result: &mut CodegenResult) - -> Self { + fn with_variant<'b>(self, + ctx: &BindgenContext, + variant: &EnumVariant, + mangling_prefix: Option<&String>, + rust_ty: P, + result: &mut CodegenResult<'b>) + -> Self { let variant_name = ctx.rust_mangle(variant.name()); let expr = aster::AstBuilder::new().expr(); let expr = match variant.val() { @@ -1456,11 +1470,11 @@ impl<'a> EnumBuilder<'a> { } } - fn build(self, - ctx: &BindgenContext, - rust_ty: P, - result: &mut CodegenResult) - -> P { + fn build<'b>(self, + ctx: &BindgenContext, + rust_ty: P, + result: &mut CodegenResult<'b>) + -> P { match self { EnumBuilder::Rust(b) => b.build(), EnumBuilder::Bitfield { canonical_name, aster } => { @@ -1489,11 +1503,11 @@ impl<'a> EnumBuilder<'a> { impl CodeGenerator for Enum { type Extra = Item; - fn codegen(&self, - ctx: &BindgenContext, - result: &mut CodegenResult, - _whitelisted_items: &ItemSet, - item: &Item) { + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + _whitelisted_items: &ItemSet, + item: &Item) { debug!("::codegen: item = {:?}", item); let name = item.canonical_name(ctx); @@ -1567,15 +1581,15 @@ impl CodeGenerator for Enum { builder = builder.with_attr(derives); - fn add_constant(enum_: &Type, - // Only to avoid recomputing every time. - enum_canonical_name: &str, - // May be the same as "variant" if it's because the - // enum is unnamed and we still haven't seen the value. - variant_name: &str, - referenced_name: &str, - enum_rust_ty: P, - result: &mut CodegenResult) { + fn add_constant<'a>(enum_: &Type, + // Only to avoid recomputing every time. + enum_canonical_name: &str, + // May be the same as "variant" if it's because the + // enum is unnamed and we still haven't seen the value. + variant_name: &str, + referenced_name: &str, + enum_rust_ty: P, + result: &mut CodegenResult<'a>) { let constant_name = if enum_.name().is_some() { format!("{}_{}", enum_canonical_name, variant_name) } else { @@ -1935,11 +1949,11 @@ impl ToRustTy for FunctionSig { impl CodeGenerator for Function { type Extra = Item; - fn codegen(&self, - ctx: &BindgenContext, - result: &mut CodegenResult, - _whitelisted_items: &ItemSet, - item: &Item) { + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + _whitelisted_items: &ItemSet, + item: &Item) { debug!("::codegen: item = {:?}", item); let name = self.name(); @@ -2007,7 +2021,8 @@ impl CodeGenerator for Function { pub fn codegen(context: &mut BindgenContext) -> Vec> { context.gen(|context| { - let mut result = CodegenResult::new(); + let counter = Cell::new(0); + let mut result = CodegenResult::new(&counter); debug!("codegen: {:?}", context.options()); diff --git a/libbindgen/tests/expectations/tests/anon_union.rs b/libbindgen/tests/expectations/tests/anon_union.rs index db03e1774d..8ae92b316a 100644 --- a/libbindgen/tests/expectations/tests/anon_union.rs +++ b/libbindgen/tests/expectations/tests/anon_union.rs @@ -63,7 +63,7 @@ pub struct TErrorResult__bindgen_ty_1 { pub _phantom_0: ::std::marker::PhantomData, } #[test] -fn __bindgen_test_layout_template_17() { +fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() , 24usize); assert_eq!(::std::mem::align_of::>() , diff --git a/libbindgen/tests/expectations/tests/class_with_dtor.rs b/libbindgen/tests/expectations/tests/class_with_dtor.rs index 88c036b6a4..8fa0951f8f 100644 --- a/libbindgen/tests/expectations/tests/class_with_dtor.rs +++ b/libbindgen/tests/expectations/tests/class_with_dtor.rs @@ -21,7 +21,7 @@ fn bindgen_test_layout_WithoutDtor() { assert_eq!(::std::mem::align_of::() , 8usize); } #[test] -fn __bindgen_test_layout_template_11() { +fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() , 8usize); assert_eq!(::std::mem::align_of::>() diff --git a/libbindgen/tests/expectations/tests/crtp.rs b/libbindgen/tests/expectations/tests/crtp.rs index e21c5de209..109a768a62 100644 --- a/libbindgen/tests/expectations/tests/crtp.rs +++ b/libbindgen/tests/expectations/tests/crtp.rs @@ -11,7 +11,7 @@ pub struct Base { pub _phantom_0: ::std::marker::PhantomData, } #[test] -fn __bindgen_test_layout_template_5() { +fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() , 1usize); assert_eq!(::std::mem::align_of::>() , 1usize); } @@ -35,7 +35,7 @@ pub struct BaseWithDestructor { pub _phantom_0: ::std::marker::PhantomData, } #[test] -fn __bindgen_test_layout_template_12() { +fn __bindgen_test_layout_template_2() { assert_eq!(::std::mem::size_of::>() , 1usize); assert_eq!(::std::mem::align_of::>() diff --git a/libbindgen/tests/expectations/tests/template.rs b/libbindgen/tests/expectations/tests/template.rs index 21814baa5d..5864ac73dd 100644 --- a/libbindgen/tests/expectations/tests/template.rs +++ b/libbindgen/tests/expectations/tests/template.rs @@ -13,7 +13,7 @@ pub struct Foo { pub _phantom_1: ::std::marker::PhantomData, } #[test] -fn __bindgen_test_layout_template_10() { +fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() , 24usize); assert_eq!(::std::mem::align_of::>() @@ -176,7 +176,7 @@ pub struct TemplateWithVar { pub _phantom_0: ::std::marker::PhantomData, } #[test] -fn __bindgen_test_layout_template_132() { +fn __bindgen_test_layout_template_2() { assert_eq!(::std::mem::size_of::>() , 4usize); assert_eq!(::std::mem::align_of::>() , From c54c3fbb96980de0e966624c8389a18140a46d8a Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Thu, 8 Dec 2016 17:00:24 -1000 Subject: [PATCH 0154/2291] Upgrade clang-sys in libbindgen --- libbindgen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index b87f5e1969..a094824c4f 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -25,7 +25,7 @@ quasi_codegen = "0.21" [dependencies] cfg-if = "0.1.0" -clang-sys = "0.8.0" +clang-sys = "0.11.1" lazy_static = "0.1.*" libc = "0.2" rustc-serialize = "0.3.19" From 13090288cbb348c46368e7c990a859765adbf9cb Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 9 Dec 2016 12:38:13 -0800 Subject: [PATCH 0155/2291] Use a shared workspace for bindgen, libbindgen, and test_expectations --- Cargo.toml | 29 ++++-------------------- bindgen/Cargo.toml | 26 +++++++++++++++++++++ {src => bindgen/src}/main.rs | 0 {src => bindgen/src}/options.rs | 0 libbindgen/Cargo.toml | 2 +- libbindgen/README.md | 3 +++ libbindgen/tests/expectations/Cargo.toml | 1 + libbindgen/tests/tests.rs | 2 +- 8 files changed, 37 insertions(+), 26 deletions(-) create mode 100644 bindgen/Cargo.toml rename {src => bindgen/src}/main.rs (100%) rename {src => bindgen/src}/options.rs (100%) create mode 100644 libbindgen/README.md diff --git a/Cargo.toml b/Cargo.toml index 57be684ee8..dd953a9760 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,25 +1,6 @@ -[package] -authors = [ - "Jyun-Yan You ", - "Emilio Cobos Álvarez ", - "The Servo project developers", +[workspace] +members = [ + "bindgen", + "libbindgen", + "libbindgen/tests/expectations", ] -description = "A binding generator for Rust" -homepage = "https://github.com/servo/rust-bindgen" -keywords = ["bindings", "ffi", "code-generation"] -license = "BSD-3-Clause" -name = "bindgen" -readme = "README.md" -repository = "https://github.com/servo/rust-bindgen" -version = "0.17.0" - -[dependencies] -clang-sys = "0.11.1" -clap = "2" -libbindgen = { path = "libbindgen" } -log = "0.3" -env_logger = "0.3" -rustc-serialize = "0.3.19" - -[features] -llvm_stable = ["libbindgen/llvm_stable"] diff --git a/bindgen/Cargo.toml b/bindgen/Cargo.toml new file mode 100644 index 0000000000..1ac99d0389 --- /dev/null +++ b/bindgen/Cargo.toml @@ -0,0 +1,26 @@ +[package] +authors = [ + "Jyun-Yan You ", + "Emilio Cobos Álvarez ", + "The Servo project developers", +] +description = "A binding generator for Rust" +homepage = "https://github.com/servo/rust-bindgen" +keywords = ["bindings", "ffi", "code-generation"] +license = "BSD-3-Clause" +name = "bindgen" +readme = "README.md" +repository = "https://github.com/servo/rust-bindgen" +version = "0.17.0" +workspace = ".." + +[dependencies] +clang-sys = "0.11.1" +clap = "2" +libbindgen = { path = "../libbindgen" } +log = "0.3" +env_logger = "0.3" +rustc-serialize = "0.3.19" + +[features] +llvm_stable = ["libbindgen/llvm_stable"] diff --git a/src/main.rs b/bindgen/src/main.rs similarity index 100% rename from src/main.rs rename to bindgen/src/main.rs diff --git a/src/options.rs b/bindgen/src/options.rs similarity index 100% rename from src/options.rs rename to bindgen/src/options.rs diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index a094824c4f..43bebb84f6 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -13,12 +13,12 @@ name = "libbindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" version = "0.17.0" +workspace = ".." [dev-dependencies] diff = "0.1" clap = "2" shlex = "0.1" -tests_expectations = { path = "tests/expectations" } [build-dependencies] quasi_codegen = "0.21" diff --git a/libbindgen/README.md b/libbindgen/README.md new file mode 100644 index 0000000000..e0bbddf50b --- /dev/null +++ b/libbindgen/README.md @@ -0,0 +1,3 @@ +# `libbindgen` + +Generate Rust FFI bindings from C/C++ header files. diff --git a/libbindgen/tests/expectations/Cargo.toml b/libbindgen/tests/expectations/Cargo.toml index 53f1b14f46..0980c56432 100644 --- a/libbindgen/tests/expectations/Cargo.toml +++ b/libbindgen/tests/expectations/Cargo.toml @@ -7,5 +7,6 @@ authors = [ "Emilio Cobos Álvarez ", "The Servo project developers", ] +workspace = "../../.." [dependencies] diff --git a/libbindgen/tests/tests.rs b/libbindgen/tests/tests.rs index e4a62523ea..12816c1b0b 100644 --- a/libbindgen/tests/tests.rs +++ b/libbindgen/tests/tests.rs @@ -7,7 +7,7 @@ use std::fs; use std::io::{BufRead, BufReader, Error, ErrorKind, Read, Write}; use std::path::PathBuf; -#[path="../../src/options.rs"] +#[path="../../bindgen/src/options.rs"] mod options; use options::builder_from_flags; From 07acbdd568f9186c13e5f5051b5d4a2d19eb76fa Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 9 Dec 2016 12:49:36 -0800 Subject: [PATCH 0156/2291] Set `libbindgen`'s version to 0.1.0 --- libbindgen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 43bebb84f6..4b3a4f4918 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -12,7 +12,7 @@ license = "BSD-3-Clause" name = "libbindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" -version = "0.17.0" +version = "0.1.0" workspace = ".." [dev-dependencies] From ec2e660bf733e8b6383bc235236f414b3bc57c28 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 9 Dec 2016 13:01:32 -0800 Subject: [PATCH 0157/2291] Fix Travis CI test integration with workspaces --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 17beccc628..5882493b3b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,9 +31,10 @@ script: - git add -A - git diff @ - git diff-index --quiet HEAD - - cargo test -p tests_expectations - cargo build --features "$BINDGEN_FEATURES _docs" - - cd .. + - cd tests/expectations + - cargo test + - cd ../../../bindgen - cargo test --features "$BINDGEN_FEATURES" - cargo test --release --features "$BINDGEN_FEATURES" From 544e913980baf582bb9d4df0ddb03140feb26159 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Fri, 9 Dec 2016 15:28:58 -1000 Subject: [PATCH 0158/2291] Remove macro_rules in codegen --- libbindgen/src/codegen/helpers.rs | 9 ++--- libbindgen/src/codegen/mod.rs | 60 +++++++++++++------------------ 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/libbindgen/src/codegen/helpers.rs b/libbindgen/src/codegen/helpers.rs index 7284ab80de..f1a0f3143f 100644 --- a/libbindgen/src/codegen/helpers.rs +++ b/libbindgen/src/codegen/helpers.rs @@ -93,11 +93,6 @@ pub mod ast_ty { pub fn float_kind_rust_type(ctx: &BindgenContext, fk: FloatKind) -> P { - macro_rules! raw { - ($ty: ident) => { - raw_type(ctx, stringify!($ty)) - } - } // TODO: we probably should just take the type layout into // account? // @@ -109,9 +104,9 @@ pub mod ast_ty { (FloatKind::Float, true) => aster::ty::TyBuilder::new().f32(), (FloatKind::Double, true) | (FloatKind::LongDouble, true) => aster::ty::TyBuilder::new().f64(), - (FloatKind::Float, false) => raw!(c_float), + (FloatKind::Float, false) => raw_type(ctx, "c_float"), (FloatKind::Double, false) | - (FloatKind::LongDouble, false) => raw!(c_double), + (FloatKind::LongDouble, false) => raw_type(ctx, "c_double"), (FloatKind::Float128, _) => { aster::ty::TyBuilder::new().array(16).u8() } diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index a88e7d733a..31946964fa 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1723,29 +1723,24 @@ impl ToRustTy for Type { fn to_rust_ty(&self, ctx: &BindgenContext, item: &Item) -> P { use self::helpers::ast_ty::*; - macro_rules! raw { - ($ty: ident) => { - raw_type(ctx, stringify!($ty)) - } - } match *self.kind() { - TypeKind::Void => raw!(c_void), + TypeKind::Void => raw_type(ctx, "c_void"), // TODO: we should do something smart with nullptr, or maybe *const // c_void is enough? - TypeKind::NullPtr => raw!(c_void).to_ptr(true, ctx.span()), + TypeKind::NullPtr => raw_type(ctx, "c_void").to_ptr(true, ctx.span()), TypeKind::Int(ik) => { match ik { IntKind::Bool => aster::ty::TyBuilder::new().bool(), - IntKind::Char => raw!(c_char), - IntKind::UChar => raw!(c_uchar), - IntKind::Short => raw!(c_short), - IntKind::UShort => raw!(c_ushort), - IntKind::Int => raw!(c_int), - IntKind::UInt => raw!(c_uint), - IntKind::Long => raw!(c_long), - IntKind::ULong => raw!(c_ulong), - IntKind::LongLong => raw!(c_longlong), - IntKind::ULongLong => raw!(c_ulonglong), + IntKind::Char => raw_type(ctx, "c_char"), + IntKind::UChar => raw_type(ctx, "c_uchar"), + IntKind::Short => raw_type(ctx, "c_short"), + IntKind::UShort => raw_type(ctx, "c_ushort"), + IntKind::Int => raw_type(ctx, "c_int"), + IntKind::UInt => raw_type(ctx, "c_uint"), + IntKind::Long => raw_type(ctx, "c_long"), + IntKind::ULong => raw_type(ctx, "c_ulong"), + IntKind::LongLong => raw_type(ctx, "c_longlong"), + IntKind::ULongLong => raw_type(ctx, "c_ulonglong"), IntKind::I8 => aster::ty::TyBuilder::new().i8(), IntKind::U8 => aster::ty::TyBuilder::new().u8(), @@ -1843,7 +1838,7 @@ impl ToRustTy for Type { utils::build_templated_path(item, ctx, false) } TypeKind::BlockPointer => { - let void = raw!(c_void); + let void = raw_type(ctx, "c_void"); void.to_ptr(/* is_const = */ false, ctx.span()) @@ -2204,24 +2199,19 @@ mod utils { -> Option> { // FIXME: We could use the inner item to check this is really a // primitive type but, who the heck overrides these anyway? - macro_rules! ty { - ($which:ident) => {{ - primitive_ty(ctx, stringify!($which)) - }} - } Some(match name { - "int8_t" => ty!(i8), - "uint8_t" => ty!(u8), - "int16_t" => ty!(i16), - "uint16_t" => ty!(u16), - "int32_t" => ty!(i32), - "uint32_t" => ty!(u32), - "int64_t" => ty!(i64), - "uint64_t" => ty!(u64), - - "uintptr_t" | "size_t" => ty!(usize), - - "intptr_t" | "ptrdiff_t" | "ssize_t" => ty!(isize), + "int8_t" => primitive_ty(ctx, "i8"), + "uint8_t" => primitive_ty(ctx, "u8"), + "int16_t" => primitive_ty(ctx, "i16"), + "uint16_t" => primitive_ty(ctx, "u16"), + "int32_t" => primitive_ty(ctx, "i32"), + "uint32_t" => primitive_ty(ctx, "u32"), + "int64_t" => primitive_ty(ctx, "i64"), + "uint64_t" => primitive_ty(ctx, "u64"), + + "uintptr_t" | "size_t" => primitive_ty(ctx, "usize"), + + "intptr_t" | "ptrdiff_t" | "ssize_t" => primitive_ty(ctx, "isize"), _ => return None, }) } From 322d1f21130da1b49f912fd386380975b3d1b352 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Fri, 9 Dec 2016 15:37:54 -1000 Subject: [PATCH 0159/2291] Upgrade deps to have syntex 0.50 --- libbindgen/Cargo.toml | 8 ++++---- libbindgen/src/ir/context.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 4b3a4f4918..bc3137db47 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -21,7 +21,7 @@ clap = "2" shlex = "0.1" [build-dependencies] -quasi_codegen = "0.21" +quasi_codegen = "0.26" [dependencies] cfg-if = "0.1.0" @@ -29,13 +29,13 @@ clang-sys = "0.11.1" lazy_static = "0.1.*" libc = "0.2" rustc-serialize = "0.3.19" -syntex_syntax = "0.44" +syntex_syntax = "0.50" regex = "0.1" cexpr = "0.2" [dependencies.aster] features = ["with-syntex"] -version = "0.29" +version = "0.34" [dependencies.clippy] optional = true @@ -51,7 +51,7 @@ version = "0.3" [dependencies.quasi] features = ["with-syntex"] -version = "0.21" +version = "0.26" [features] default = ["logging"] diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index b1c40cb3de..8be064b8ec 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -429,7 +429,7 @@ impl<'ctx> BindgenContext<'ctx> { let sess = parse::ParseSess::new(); let mut loader = base::DummyResolver; let mut ctx = - GenContext(base::ExtCtxt::new(&sess, vec![], cfg, &mut loader)); + GenContext(base::ExtCtxt::new(&sess, cfg, &mut loader)); ctx.0.bt_push(ExpnInfo { call_site: self.span, From da50e5fae8551d0bfb79326f43b4be1f051319bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 9 Dec 2016 14:00:32 -1000 Subject: [PATCH 0160/2291] s/_docs/docs_ --- .travis.yml | 2 +- libbindgen/Cargo.toml | 2 +- libbindgen/src/lib.rs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5882493b3b..8d7047aa98 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,7 @@ script: - git add -A - git diff @ - git diff-index --quiet HEAD - - cargo build --features "$BINDGEN_FEATURES _docs" + - cargo build --features "$BINDGEN_FEATURES docs_" - cd tests/expectations - cargo test - cd ../../../bindgen diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index bc3137db47..dceb17f022 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -59,4 +59,4 @@ llvm_stable = [] logging = ["env_logger", "log"] static = [] # This feature only exists for CI -- don't use it! -_docs = [] +docs_ = [] diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index b2d3593cc6..6ed5cd4b33 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -40,7 +40,7 @@ extern crate log; mod log_stubs; // A macro to declare an internal module for which we *must* provide -// documentation for. If we are building with the "_docs" feature, then the +// documentation for. If we are building with the "docs_" feature, then the // module is declared public, and our `#![deny(missing_docs)]` pragma applies to // it. This feature is used in CI, so we won't let anything slip by // undocumented. Normal builds, however, will leave the module private, so that @@ -48,7 +48,7 @@ mod log_stubs; macro_rules! doc_mod { ($m:ident, $doc_mod_name:ident) => { cfg_if! { - if #[cfg(feature = "_docs")] { + if #[cfg(feature = "docs_")] { pub mod $doc_mod_name { //! Autogenerated documentation module. pub use super::$m::*; From bb8a50f56856e31a33b5ff22188485f17d40893c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 9 Dec 2016 14:04:27 -1000 Subject: [PATCH 0161/2291] Rip off the clippy feature. --- libbindgen/Cargo.toml | 4 ---- libbindgen/src/lib.rs | 5 ----- 2 files changed, 9 deletions(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index dceb17f022..9f02e2ba7e 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -37,10 +37,6 @@ cexpr = "0.2" features = ["with-syntex"] version = "0.34" -[dependencies.clippy] -optional = true -version = "*" - [dependencies.env_logger] optional = true version = "0.3" diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 6ed5cd4b33..7db26eabeb 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -5,9 +5,6 @@ //! //! See the [Builder](./struct.Builder.html) struct for usage. -#![cfg_attr(feature = "clippy", feature(plugin))] -#![cfg_attr(feature = "clippy", plugin(clippy))] - #![deny(missing_docs)] #![deny(warnings)] @@ -552,8 +549,6 @@ impl<'ctx> Bindings<'ctx> { } /// Write these bindings as source text to the given `Write`able. - // https://github.com/Manishearth/rust-clippy/issues/740 - #[cfg_attr(feature = "clippy", allow(needless_lifetimes))] pub fn write<'a>(&self, mut writer: Box) -> io::Result<()> { try!(writer.write("/* automatically generated by rust-bindgen */\n\n" .as_bytes())); From ef69d847a3f7f936fb2ce58421b59b6f96dcffd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 9 Dec 2016 16:11:24 -1000 Subject: [PATCH 0162/2291] Publish 0.1.1 for the recent changes. --- libbindgen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 9f02e2ba7e..8d050a965f 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -12,7 +12,7 @@ license = "BSD-3-Clause" name = "libbindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" -version = "0.1.0" +version = "0.1.1" workspace = ".." [dev-dependencies] From 854aa11d237ff75474dc6c26833fcde884fdecd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 9 Dec 2016 16:11:45 -1000 Subject: [PATCH 0163/2291] Use consistent indentation in toml files. --- Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index dd953a9760..0ca737c7f0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] members = [ - "bindgen", - "libbindgen", - "libbindgen/tests/expectations", + "bindgen", + "libbindgen", + "libbindgen/tests/expectations", ] From 09c66d1ddf206e0c32732d89774159bec0888a8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 10 Dec 2016 18:19:25 -1000 Subject: [PATCH 0164/2291] lib: Return error early if there are any error diagnostics. --- libbindgen/Cargo.toml | 2 +- libbindgen/src/lib.rs | 11 +++++++++-- ...{bitfield-enum-basic.h => bitfield-enum-basic.hpp} | 0 .../tests/headers/empty_template_param_name.hpp | 2 ++ 4 files changed, 12 insertions(+), 3 deletions(-) rename libbindgen/tests/headers/{bitfield-enum-basic.h => bitfield-enum-basic.hpp} (100%) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 8d050a965f..47e8b2827e 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -12,7 +12,7 @@ license = "BSD-3-Clause" name = "libbindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" -version = "0.1.1" +version = "0.1.2" workspace = ".." [dev-dependencies] diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 7db26eabeb..3ced6dab84 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -510,7 +510,7 @@ impl<'ctx> Bindings<'ctx> { let span = span.unwrap_or(DUMMY_SP); let mut context = BindgenContext::new(options); - parse(&mut context); + try!(parse(&mut context)); let module = ast::Mod { inner: span, @@ -624,14 +624,20 @@ pub fn parse_one(ctx: &mut BindgenContext, } /// Parse the Clang AST into our `Item` internal representation. -fn parse(context: &mut BindgenContext) { +fn parse(context: &mut BindgenContext) -> Result<(), ()> { use clang::Diagnostic; use clangll::*; + let mut any_error = false; for d in context.translation_unit().diags().iter() { let msg = d.format(Diagnostic::default_opts()); let is_err = d.severity() >= CXDiagnostic_Error; println!("{}, err: {}", msg, is_err); + any_error |= is_err; + } + + if any_error { + return Err(()); } let cursor = context.translation_unit().cursor(); @@ -646,6 +652,7 @@ fn parse(context: &mut BindgenContext) { assert!(context.current_module() == context.root_module(), "How did this happen?"); + Ok(()) } /// Extracted Clang version data diff --git a/libbindgen/tests/headers/bitfield-enum-basic.h b/libbindgen/tests/headers/bitfield-enum-basic.hpp similarity index 100% rename from libbindgen/tests/headers/bitfield-enum-basic.h rename to libbindgen/tests/headers/bitfield-enum-basic.hpp diff --git a/libbindgen/tests/headers/empty_template_param_name.hpp b/libbindgen/tests/headers/empty_template_param_name.hpp index b3360bc95c..0e9f3c341f 100644 --- a/libbindgen/tests/headers/empty_template_param_name.hpp +++ b/libbindgen/tests/headers/empty_template_param_name.hpp @@ -1,3 +1,5 @@ +// bindgen-flags: -- -std=c++11 + template using __void_t = void; template> From aa05fdf30b0623d7d3622c7afccccbb3209629f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 11 Dec 2016 09:46:49 +0100 Subject: [PATCH 0165/2291] options: Ensure to pass the clang header last to clang. --- libbindgen/src/lib.rs | 10 +++++++--- libbindgen/tests/expectations/tests/dash_language.rs | 12 ++++++++++++ libbindgen/tests/headers/dash_language.h | 6 ++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/dash_language.rs create mode 100644 libbindgen/tests/headers/dash_language.h diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 3ced6dab84..1acfd1434c 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -168,8 +168,8 @@ impl Builder { /// Set the input C/C++ header. pub fn header>(mut self, header: T) -> Builder { let header = header.into(); - self.options.input_header = Some(header.clone()); - self.clang_arg(header) + self.options.input_header = Some(header); + self } /// Generate a C/C++ file that includes the header and has dummy uses of @@ -504,11 +504,15 @@ impl<'ctx> Bindings<'ctx> { /// /// Deprecated - use a `Builder` instead #[deprecated] - pub fn generate(options: BindgenOptions, + pub fn generate(mut options: BindgenOptions, span: Option) -> Result, ()> { let span = span.unwrap_or(DUMMY_SP); + if let Some(h) = options.input_header.as_ref() { + options.clang_args.push(h.clone()) + } + let mut context = BindgenContext::new(options); try!(parse(&mut context)); diff --git a/libbindgen/tests/expectations/tests/dash_language.rs b/libbindgen/tests/expectations/tests/dash_language.rs new file mode 100644 index 0000000000..148f9c32d7 --- /dev/null +++ b/libbindgen/tests/expectations/tests/dash_language.rs @@ -0,0 +1,12 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Foo { + pub bar: ::std::os::raw::c_int, + pub _phantom_0: ::std::marker::PhantomData, +} diff --git a/libbindgen/tests/headers/dash_language.h b/libbindgen/tests/headers/dash_language.h new file mode 100644 index 0000000000..4c8bb58dd7 --- /dev/null +++ b/libbindgen/tests/headers/dash_language.h @@ -0,0 +1,6 @@ +// bindgen-flags: -- -x c++ --std=c++11 + +template +struct Foo { + int bar; +}; From 8a605123675d56d95533bfa22270bee202aa42db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 11 Dec 2016 15:38:53 +0100 Subject: [PATCH 0166/2291] lib: Do the path fixup inside the library, so users of the library don't have to do this themselves. --- bindgen/src/main.rs | 25 ------------------------- libbindgen/src/lib.rs | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/bindgen/src/main.rs b/bindgen/src/main.rs index 8cbff63bb8..c1dc632f00 100644 --- a/bindgen/src/main.rs +++ b/bindgen/src/main.rs @@ -42,31 +42,6 @@ pub fn main() { _ => {} } - if let Some(clang) = clang_sys::support::Clang::find(None) { - let has_clang_args = - bind_args.iter().rposition(|arg| *arg == "--").is_some(); - if !has_clang_args { - bind_args.push("--".to_owned()); - } - - // If --target is specified, assume caller knows what they're doing and - // don't mess with - // include paths for them - let has_target_arg = bind_args.iter() - .rposition(|arg| arg.starts_with("--target")) - .is_some(); - if !has_target_arg { - // TODO: distinguish C and C++ paths? C++'s should be enough, I - // guess. - for path in clang.cpp_search_paths.into_iter() { - if let Ok(path) = path.into_os_string().into_string() { - bind_args.push("-isystem".to_owned()); - bind_args.push(path); - } - } - } - } - match builder_from_flags(bind_args.into_iter()) { Ok((builder, output)) => { let mut bindings = builder.generate() diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 1acfd1434c..29580f3682 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -509,6 +509,25 @@ impl<'ctx> Bindings<'ctx> { -> Result, ()> { let span = span.unwrap_or(DUMMY_SP); + // TODO: Make this path fixup configurable? + if let Some(clang) = clang_sys::support::Clang::find(None) { + // If --target is specified, assume caller knows what they're doing + // and don't mess with include paths for them + let has_target_arg = options.clang_args.iter() + .rposition(|arg| arg.starts_with("--target")) + .is_some(); + if !has_target_arg { + // TODO: distinguish C and C++ paths? C++'s should be enough, I + // guess. + for path in clang.cpp_search_paths.into_iter() { + if let Ok(path) = path.into_os_string().into_string() { + options.clang_args.push("-isystem".to_owned()); + options.clang_args.push(path); + } + } + } + } + if let Some(h) = options.input_header.as_ref() { options.clang_args.push(h.clone()) } From 3f711d85e72a4e4a516a8b128a9b212d8305b035 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Mon, 12 Dec 2016 13:48:58 -1000 Subject: [PATCH 0167/2291] Fix issues in README Mainly for fixing `env!("OUT_DIR")` usage in `build.rs`. --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 09f88db204..f25b815bb2 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ In `Cargo.toml`: ```toml [package] -... +# ... build = "build.rs" [build-dependencies.libbindgen] @@ -95,12 +95,16 @@ In `build.rs`: ```rust extern crate libbindgen; +use std::env; +use std::path::Path; + fn main() { + let out_dir = env::var("OUT_DIR").unwrap(); let _ = libbindgen::builder() .header("example.h") .use_core() .generate().unwrap() - .write_to_file(concat!(env!("OUT_DIR"), "/example.rs")); + .write_to_file(Path::new(&out_dir).join("example.rs")); } ``` From 883ff74e5f20b68b41f322daa582d9208eece65a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 12 Dec 2016 16:11:43 +0100 Subject: [PATCH 0168/2291] Add support for constructors, and integration tests. --- .travis.yml | 2 + Cargo.toml | 1 + bindgen-integration/Cargo.toml | 12 +++ bindgen-integration/build.rs | 28 ++++++ bindgen-integration/cpp/Test.cc | 15 +++ bindgen-integration/cpp/Test.h | 10 ++ bindgen-integration/src/lib.rs | 28 ++++++ libbindgen/src/codegen/helpers.rs | 22 +++++ libbindgen/src/codegen/mod.rs | 96 ++++++++++++------- libbindgen/src/ir/comp.rs | 70 +++++++++----- libbindgen/src/ir/function.rs | 13 ++- libbindgen/src/ir/item.rs | 23 +++-- libbindgen/src/lib.rs | 4 + .../tests/expectations/tests/constructors.rs | 67 +++++++++++++ libbindgen/tests/headers/constructors.hpp | 13 +++ 15 files changed, 332 insertions(+), 72 deletions(-) create mode 100644 bindgen-integration/Cargo.toml create mode 100644 bindgen-integration/build.rs create mode 100644 bindgen-integration/cpp/Test.cc create mode 100644 bindgen-integration/cpp/Test.h create mode 100644 bindgen-integration/src/lib.rs create mode 100644 libbindgen/tests/expectations/tests/constructors.rs create mode 100644 libbindgen/tests/headers/constructors.hpp diff --git a/.travis.yml b/.travis.yml index 8d7047aa98..f7fbf2b477 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,6 +37,8 @@ script: - cd ../../../bindgen - cargo test --features "$BINDGEN_FEATURES" - cargo test --release --features "$BINDGEN_FEATURES" + - cd ../bindgen-integration + - cargo test notifications: webhooks: http://build.servo.org:54856/travis diff --git a/Cargo.toml b/Cargo.toml index 0ca737c7f0..106e652be5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] members = [ "bindgen", + "bindgen-integration", "libbindgen", "libbindgen/tests/expectations", ] diff --git a/bindgen-integration/Cargo.toml b/bindgen-integration/Cargo.toml new file mode 100644 index 0000000000..04f0f84c1f --- /dev/null +++ b/bindgen-integration/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "bindgen-integration" +description = "A package to test various bindgen features" +version = "0.1.0" +authors = ["Emilio Cobos Álvarez "] +workspace = ".." +publish = false +build = "build.rs" + +[build-dependencies] +libbindgen = { path = "../libbindgen" } +gcc = "0.3" diff --git a/bindgen-integration/build.rs b/bindgen-integration/build.rs new file mode 100644 index 0000000000..ff8ba172f6 --- /dev/null +++ b/bindgen-integration/build.rs @@ -0,0 +1,28 @@ +extern crate libbindgen; +extern crate gcc; + +use std::env; +use std::path::PathBuf; +use libbindgen::Builder; + +fn main() { + gcc::Config::new() + .cpp(true) + .file("cpp/Test.cc") + .compile("libtest.a"); + + let bindings = Builder::default() + .no_unstable_rust() + .header("cpp/Test.h") + .clang_arg("-x") + .clang_arg("c++") + .clang_arg("-std=c++11") + .generate() + .expect("Unable to generate bindings"); + + + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); + bindings + .write_to_file(out_path.join("test.rs")) + .expect("Couldn't write bindings!"); +} diff --git a/bindgen-integration/cpp/Test.cc b/bindgen-integration/cpp/Test.cc new file mode 100644 index 0000000000..d9c13a7671 --- /dev/null +++ b/bindgen-integration/cpp/Test.cc @@ -0,0 +1,15 @@ +#include "Test.h" + +const char* Test::name() { + return "Test"; +} + +Test::Test(int foo) + : m_int(foo) + , m_double(0.0) +{} + +Test::Test(double foo) + : m_int(0) + , m_double(foo) +{} diff --git a/bindgen-integration/cpp/Test.h b/bindgen-integration/cpp/Test.h new file mode 100644 index 0000000000..2e15bb491a --- /dev/null +++ b/bindgen-integration/cpp/Test.h @@ -0,0 +1,10 @@ +#pragma once + +class Test final { + int m_int; + double m_double; +public: + static const char* name(); + Test(int foo); + Test(double foo); +}; diff --git a/bindgen-integration/src/lib.rs b/bindgen-integration/src/lib.rs new file mode 100644 index 0000000000..4f239510f4 --- /dev/null +++ b/bindgen-integration/src/lib.rs @@ -0,0 +1,28 @@ +mod bindings { + include!(concat!(env!("OUT_DIR"), "/test.rs")); +} + +use std::ffi::CStr; + +#[test] +fn test_static_method() { + let c_str = unsafe { bindings::Test::name() }; + let name = unsafe { + CStr::from_ptr(c_str).to_string_lossy().into_owned() + }; + assert_eq!(name, "Test", "Calling a static C++ method works!"); +} + +#[test] +fn test_constructor() { + let test = unsafe { bindings::Test::new(5) }; + assert_eq!(test.m_int, 5); + assert_eq!(test.m_double, 0.0); +} + +#[test] +fn test_overload() { + let test = unsafe { bindings::Test::new1(5.0) }; + assert_eq!(test.m_int, 0); + assert_eq!(test.m_double, 5.0); +} diff --git a/libbindgen/src/codegen/helpers.rs b/libbindgen/src/codegen/helpers.rs index f1a0f3143f..c09f007160 100644 --- a/libbindgen/src/codegen/helpers.rs +++ b/libbindgen/src/codegen/helpers.rs @@ -75,6 +75,7 @@ impl BlobTyBuilder { pub mod ast_ty { use aster; use ir::context::BindgenContext; + use ir::function::FunctionSig; use ir::ty::FloatKind; use syntax::ast; use syntax::ptr::P; @@ -164,4 +165,25 @@ pub mod ast_ty { let kind = ast::LitKind::FloatUnsuffixed(interned_str); aster::AstBuilder::new().expr().lit().build_lit(kind) } + + pub fn arguments_from_signature(signature: &FunctionSig, + ctx: &BindgenContext) + -> Vec> { + // TODO: We need to keep in sync the argument names, so we should unify + // this with the other loop that decides them. + let mut unnamed_arguments = 0; + signature.argument_types() + .iter() + .map(|&(ref name, _ty)| { + let arg_name = match *name { + Some(ref name) => ctx.rust_mangle(name).into_owned(), + None => { + unnamed_arguments += 1; + format!("arg{}", unnamed_arguments) + } + }; + aster::expr::ExprBuilder::new().id(arg_name) + }) + .collect::>() + } } diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 31946964fa..f3181de729 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -4,7 +4,7 @@ mod helpers; use aster; use ir::annotations::FieldAccessorKind; -use ir::comp::{CompInfo, CompKind, Field, Method}; +use ir::comp::{CompInfo, CompKind, Field, Method, MethodKind}; use ir::context::{BindgenContext, ItemId}; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; use ir::function::{Function, FunctionSig}; @@ -1181,15 +1181,28 @@ impl CodeGenerator for CompInfo { result.push(item); } + let mut method_names = Default::default(); if ctx.options().codegen_config.methods { - let mut method_names = Default::default(); for method in self.methods() { + assert!(method.kind() != MethodKind::Constructor); method.codegen_method(ctx, &mut methods, &mut method_names, result, whitelisted_items, - item); + self); + } + } + + if ctx.options().codegen_config.constructors { + for sig in self.constructors() { + Method::new(MethodKind::Constructor, *sig, /* const */ false) + .codegen_method(ctx, + &mut methods, + &mut method_names, + result, + whitelisted_items, + self); } } } @@ -1242,7 +1255,7 @@ trait MethodCodegen { method_names: &mut HashMap, result: &mut CodegenResult<'a>, whitelisted_items: &ItemSet, - parent: &Item); + parent: &CompInfo); } impl MethodCodegen for Method { @@ -1252,18 +1265,21 @@ impl MethodCodegen for Method { method_names: &mut HashMap, result: &mut CodegenResult<'a>, whitelisted_items: &ItemSet, - _parent: &Item) { + _parent: &CompInfo) { if self.is_virtual() { return; // FIXME } // First of all, output the actual function. - ctx.resolve_item(self.signature()) - .codegen(ctx, result, whitelisted_items, &()); - let function_item = ctx.resolve_item(self.signature()); + function_item.codegen(ctx, result, whitelisted_items, &()); + let function = function_item.expect_function(); - let mut name = function.name().to_owned(); let signature_item = ctx.resolve_item(function.signature()); + let mut name = match self.kind() { + MethodKind::Constructor => "new".into(), + _ => function.name().to_owned(), + }; + let signature = match *signature_item.expect_type().kind() { TypeKind::Function(ref sig) => sig, _ => panic!("How in the world?"), @@ -1283,7 +1299,7 @@ impl MethodCodegen for Method { let function_name = function_item.canonical_name(ctx); let mut fndecl = utils::rust_fndecl_from_signature(ctx, signature_item) .unwrap(); - if !self.is_static() { + if !self.is_static() && !self.is_constructor() { let mutability = if self.is_const() { ast::Mutability::Immutable } else { @@ -1319,32 +1335,38 @@ impl MethodCodegen for Method { }; } + // If it's a constructor, we always return `Self`, and we inject the + // "this" parameter, so there's no need to ask the user for it. + // + // Note that constructors in Clang are represented as functions with + // return-type = void. + if self.is_constructor() { + fndecl.inputs.remove(0); + fndecl.output = ast::FunctionRetTy::Ty(quote_ty!(ctx.ext_cx(), Self)); + } + let sig = ast::MethodSig { unsafety: ast::Unsafety::Unsafe, abi: Abi::Rust, - decl: P(fndecl.clone()), + decl: P(fndecl), generics: ast::Generics::default(), constness: respan(ctx.span(), ast::Constness::NotConst), }; - // TODO: We need to keep in sync the argument names, so we should unify - // this with the other loop that decides them. - let mut unnamed_arguments = 0; - let mut exprs = signature.argument_types() - .iter() - .map(|&(ref name, _ty)| { - let arg_name = match *name { - Some(ref name) => ctx.rust_mangle(name).into_owned(), - None => { - unnamed_arguments += 1; - format!("arg{}", unnamed_arguments) - } - }; - aster::expr::ExprBuilder::new().id(arg_name) - }) - .collect::>(); + let mut exprs = + helpers::ast_ty::arguments_from_signature(&signature, ctx); + + let mut stmts = vec![]; - if !self.is_static() { + // If it's a constructor, we need to insert an extra parameter with a + // variable called `tmp` we're going to create. + if self.is_constructor() { + let tmp_variable_decl = + quote_stmt!(ctx.ext_cx(), let mut tmp = ::std::mem::uninitialized()) + .unwrap(); + stmts.push(tmp_variable_decl); + exprs[0] = quote_expr!(ctx.ext_cx(), &mut tmp); + } else if !self.is_static() { assert!(!exprs.is_empty()); exprs[0] = if self.is_const() { quote_expr!(ctx.ext_cx(), &*self) @@ -1359,14 +1381,18 @@ impl MethodCodegen for Method { .with_args(exprs) .build(); + stmts.push(ast::Stmt { + id: ast::DUMMY_NODE_ID, + node: ast::StmtKind::Expr(call), + span: ctx.span(), + }); + + if self.is_constructor() { + stmts.push(quote_stmt!(ctx.ext_cx(), tmp).unwrap()); + } + let block = ast::Block { - stmts: vec![ - ast::Stmt { - id: ast::DUMMY_NODE_ID, - node: ast::StmtKind::Expr(call), - span: ctx.span(), - } - ], + stmts: stmts, id: ast::DUMMY_NODE_ID, rules: ast::BlockCheckMode::Default, span: ctx.span(), diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index d2ace023eb..c351a152ed 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -23,6 +23,9 @@ pub enum CompKind { /// The kind of C++ method. #[derive(Debug, Copy, Clone, PartialEq)] pub enum MethodKind { + /// A constructor. We represent it as method for convenience, to avoid code + /// duplication. + Constructor, /// A static method. Static, /// A normal method. @@ -45,7 +48,7 @@ pub struct Method { impl Method { /// Construct a new `Method`. - fn new(kind: MethodKind, signature: ItemId, is_const: bool) -> Self { + pub fn new(kind: MethodKind, signature: ItemId, is_const: bool) -> Self { Method { kind: kind, signature: signature, @@ -58,6 +61,11 @@ impl Method { self.kind } + /// Is this a constructor? + pub fn is_constructor(&self) -> bool { + self.kind == MethodKind::Constructor + } + /// Is this a virtual method? pub fn is_virtual(&self) -> bool { self.kind == MethodKind::Virtual @@ -167,6 +175,9 @@ pub struct CompInfo { /// The method declarations inside this class, if in C++ mode. methods: Vec, + /// The different constructors this struct or class contains. + constructors: Vec, + /// Vector of classes this one inherits from. base_members: Vec, @@ -235,6 +246,7 @@ impl CompInfo { fields: vec![], template_args: vec![], methods: vec![], + constructors: vec![], base_members: vec![], ref_template: None, inner_types: vec![], @@ -454,6 +466,10 @@ impl CompInfo { &self.methods } + pub fn constructors(&self) -> &[ItemId] { + &self.constructors + } + /// What kind of compound type is this? pub fn kind(&self) -> CompKind { self.kind @@ -651,14 +667,15 @@ impl CompInfo { .expect("BaseSpecifier"); ci.base_members.push(type_id); } + CXCursor_Constructor | + CXCursor_Destructor | CXCursor_CXXMethod => { let is_virtual = cur.method_is_virtual(); let is_static = cur.method_is_static(); debug_assert!(!(is_static && is_virtual), "How?"); - if !ci.has_vtable { - ci.has_vtable = is_virtual; - } + ci.has_destructor |= cur.kind() == CXCursor_Destructor; + ci.has_vtable |= is_virtual; let linkage = cur.linkage(); if linkage != CXLinkage_External { @@ -699,30 +716,34 @@ impl CompInfo { // NB: This gets us an owned `Function`, not a // `FunctionSig`. - let method_signature = + let signature = Item::parse(cur, Some(potential_id), ctx) .expect("CXXMethod"); - let is_const = cur.method_is_const(); - let method_kind = if is_static { - MethodKind::Static - } else if is_virtual { - MethodKind::Virtual - } else { - MethodKind::Normal - }; - - let method = - Method::new(method_kind, method_signature, is_const); - - ci.methods.push(method); - } - CXCursor_Destructor => { - if cur.method_is_virtual() { - // FIXME: Push to the method list? - ci.has_vtable = true; + match cur.kind() { + CXCursor_Constructor => { + ci.constructors.push(signature); + } + // TODO(emilio): Bind the destructor? + CXCursor_Destructor => {}, + CXCursor_CXXMethod => { + let is_const = cur.method_is_const(); + let method_kind = if is_static { + MethodKind::Static + } else if is_virtual { + MethodKind::Virtual + } else { + MethodKind::Normal + }; + + let method = Method::new(method_kind, + signature, + is_const); + + ci.methods.push(method); + } + _ => unreachable!("How can we see this here?"), } - ci.has_destructor = true; } CXCursor_NonTypeTemplateParameter => { ci.has_non_type_template_params = true; @@ -746,7 +767,6 @@ impl CompInfo { // Intentionally not handled CXCursor_CXXAccessSpecifier | CXCursor_CXXFinalAttr | - CXCursor_Constructor | CXCursor_FunctionTemplate | CXCursor_ConversionFunction => {} _ => { diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs index 5a864cfc7b..c4c26c620f 100644 --- a/libbindgen/src/ir/function.rs +++ b/libbindgen/src/ir/function.rs @@ -147,6 +147,7 @@ impl FunctionSig { }; let mut args: Vec<_> = match cursor.kind() { CXCursor_FunctionDecl | + CXCursor_Constructor | CXCursor_CXXMethod => { // For CXCursor_FunctionDecl, cursor.args() is the reliable way // to get parameter names and types. @@ -184,10 +185,12 @@ impl FunctionSig { } }; - if cursor.kind() == CXCursor_CXXMethod { - let is_const = cursor.method_is_const(); - let is_virtual = cursor.method_is_virtual(); - let is_static = cursor.method_is_static(); + let is_method = cursor.kind() == CXCursor_CXXMethod; + + if is_method || cursor.kind() == CXCursor_Constructor { + let is_const = is_method && cursor.method_is_const(); + let is_virtual = is_method && cursor.method_is_virtual(); + let is_static = is_method && cursor.method_is_static(); if !is_static && !is_virtual { let class = Item::parse(cursor.semantic_parent(), None, ctx) .expect("Expected to parse the class"); @@ -240,6 +243,8 @@ impl ClangSubItemParser for Function { use clangll::*; match cursor.kind() { CXCursor_FunctionDecl | + CXCursor_Constructor | + CXCursor_Destructor | CXCursor_CXXMethod => {} _ => return Err(ParseError::Continue), }; diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 6601216eb9..11ec7d99b5 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -654,19 +654,26 @@ impl Item { /// Get the overload index for this method. If this is not a method, return /// `None`. - fn method_overload_index(&self, ctx: &BindgenContext) -> Option { + fn overload_index(&self, ctx: &BindgenContext) -> Option { self.func_name().and_then(|func_name| { let parent = ctx.resolve_item(self.parent_id()); if let ItemKind::Type(ref ty) = *parent.kind() { if let TypeKind::Comp(ref ci) = *ty.kind() { - return ci.methods() + // All the constructors have the same name, so no need to + // resolve and check. + return ci.constructors() .iter() - .filter(|method| { - let item = ctx.resolve_item(method.signature()); - let func = item.expect_function(); - func.name() == func_name + .position(|c| *c == self.id()) + .or_else(|| { + ci.methods() + .iter() + .filter(|m| { + let item = ctx.resolve_item(m.signature()); + let func = item.expect_function(); + func.name() == func_name + }) + .position(|m| m.signature() == self.id()) }) - .position(|method| method.signature() == self.id()); } } @@ -704,7 +711,7 @@ impl Item { ItemKind::Function(ref fun) => { let mut name = fun.name().to_owned(); - if let Some(idx) = self.method_overload_index(ctx) { + if let Some(idx) = self.overload_index(ctx) { if idx > 0 { write!(&mut name, "{}", idx).unwrap(); } diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 29580f3682..2ff61f901b 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -108,6 +108,8 @@ pub struct CodegenConfig { pub vars: bool, /// Whether to generate methods. pub methods: bool, + /// Whether to generate constructors. + pub constructors: bool, } impl CodegenConfig { @@ -118,6 +120,7 @@ impl CodegenConfig { types: true, vars: true, methods: true, + constructors: true, } } @@ -128,6 +131,7 @@ impl CodegenConfig { types: false, vars: false, methods: false, + constructors: false, } } } diff --git a/libbindgen/tests/expectations/tests/constructors.rs b/libbindgen/tests/expectations/tests/constructors.rs new file mode 100644 index 0000000000..80c140571b --- /dev/null +++ b/libbindgen/tests/expectations/tests/constructors.rs @@ -0,0 +1,67 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct TestOverload { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_TestOverload() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +extern "C" { + #[link_name = "_ZN12TestOverloadC1Ei"] + pub fn TestOverload_TestOverload(this: *mut TestOverload, + arg1: ::std::os::raw::c_int); +} +extern "C" { + #[link_name = "_ZN12TestOverloadC1Ed"] + pub fn TestOverload_TestOverload1(this: *mut TestOverload, arg1: f64); +} +impl Clone for TestOverload { + fn clone(&self) -> Self { *self } +} +impl TestOverload { + #[inline] + pub unsafe fn new(arg1: ::std::os::raw::c_int) -> Self { + let mut tmp = ::std::mem::uninitialized(); + TestOverload_TestOverload(&mut tmp, arg1); + tmp + } + #[inline] + pub unsafe fn new1(arg1: f64) -> Self { + let mut tmp = ::std::mem::uninitialized(); + TestOverload_TestOverload1(&mut tmp, arg1); + tmp + } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct TestPublicNoArgs { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_TestPublicNoArgs() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +extern "C" { + #[link_name = "_ZN16TestPublicNoArgsC1Ev"] + pub fn TestPublicNoArgs_TestPublicNoArgs(this: *mut TestPublicNoArgs); +} +impl Clone for TestPublicNoArgs { + fn clone(&self) -> Self { *self } +} +impl TestPublicNoArgs { + #[inline] + pub unsafe fn new() -> Self { + let mut tmp = ::std::mem::uninitialized(); + TestPublicNoArgs_TestPublicNoArgs(&mut tmp); + tmp + } +} diff --git a/libbindgen/tests/headers/constructors.hpp b/libbindgen/tests/headers/constructors.hpp new file mode 100644 index 0000000000..d417488917 --- /dev/null +++ b/libbindgen/tests/headers/constructors.hpp @@ -0,0 +1,13 @@ + +class TestOverload { + // This one shouldnt' be generated. + TestOverload(); +public: + TestOverload(int); + TestOverload(double); +}; + +class TestPublicNoArgs { +public: + TestPublicNoArgs(); +}; From 0f0b6d6e97ede76693f4d48b90ee04ad7126069b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 13 Dec 2016 14:36:59 +0100 Subject: [PATCH 0169/2291] codegen: Rename the temporary variable in constructors for __bindgen_tmp, to avoid potential conflicts. --- libbindgen/src/codegen/mod.rs | 9 +++++---- .../tests/expectations/tests/constructors.rs | 18 +++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index f3181de729..bf516cd25a 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1359,13 +1359,14 @@ impl MethodCodegen for Method { let mut stmts = vec![]; // If it's a constructor, we need to insert an extra parameter with a - // variable called `tmp` we're going to create. + // variable called `__bindgen_tmp` we're going to create. if self.is_constructor() { let tmp_variable_decl = - quote_stmt!(ctx.ext_cx(), let mut tmp = ::std::mem::uninitialized()) + quote_stmt!(ctx.ext_cx(), + let mut __bindgen_tmp = ::std::mem::uninitialized()) .unwrap(); stmts.push(tmp_variable_decl); - exprs[0] = quote_expr!(ctx.ext_cx(), &mut tmp); + exprs[0] = quote_expr!(ctx.ext_cx(), &mut __bindgen_tmp); } else if !self.is_static() { assert!(!exprs.is_empty()); exprs[0] = if self.is_const() { @@ -1388,7 +1389,7 @@ impl MethodCodegen for Method { }); if self.is_constructor() { - stmts.push(quote_stmt!(ctx.ext_cx(), tmp).unwrap()); + stmts.push(quote_stmt!(ctx.ext_cx(), __bindgen_tmp).unwrap()); } let block = ast::Block { diff --git a/libbindgen/tests/expectations/tests/constructors.rs b/libbindgen/tests/expectations/tests/constructors.rs index 80c140571b..95afb82da8 100644 --- a/libbindgen/tests/expectations/tests/constructors.rs +++ b/libbindgen/tests/expectations/tests/constructors.rs @@ -29,15 +29,15 @@ impl Clone for TestOverload { impl TestOverload { #[inline] pub unsafe fn new(arg1: ::std::os::raw::c_int) -> Self { - let mut tmp = ::std::mem::uninitialized(); - TestOverload_TestOverload(&mut tmp, arg1); - tmp + let mut __bindgen_tmp = ::std::mem::uninitialized(); + TestOverload_TestOverload(&mut __bindgen_tmp, arg1); + __bindgen_tmp } #[inline] pub unsafe fn new1(arg1: f64) -> Self { - let mut tmp = ::std::mem::uninitialized(); - TestOverload_TestOverload1(&mut tmp, arg1); - tmp + let mut __bindgen_tmp = ::std::mem::uninitialized(); + TestOverload_TestOverload1(&mut __bindgen_tmp, arg1); + __bindgen_tmp } } #[repr(C)] @@ -60,8 +60,8 @@ impl Clone for TestPublicNoArgs { impl TestPublicNoArgs { #[inline] pub unsafe fn new() -> Self { - let mut tmp = ::std::mem::uninitialized(); - TestPublicNoArgs_TestPublicNoArgs(&mut tmp); - tmp + let mut __bindgen_tmp = ::std::mem::uninitialized(); + TestPublicNoArgs_TestPublicNoArgs(&mut __bindgen_tmp); + __bindgen_tmp } } From bc28da0838e8e39fb87f8f92b467b1ec058500a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 13 Dec 2016 14:49:40 +0100 Subject: [PATCH 0170/2291] Fix travis --- .travis.yml | 3 ++- bindgen-integration/Cargo.toml | 3 +++ bindgen-integration/cpp/Test.h | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f7fbf2b477..df1a515691 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,7 +38,8 @@ script: - cargo test --features "$BINDGEN_FEATURES" - cargo test --release --features "$BINDGEN_FEATURES" - cd ../bindgen-integration - - cargo test + - cargo test --features "$BINDGEN_FEATURES" + - cargo test --release --features "$BINDGEN_FEATURES" notifications: webhooks: http://build.servo.org:54856/travis diff --git a/bindgen-integration/Cargo.toml b/bindgen-integration/Cargo.toml index 04f0f84c1f..e0687f9959 100644 --- a/bindgen-integration/Cargo.toml +++ b/bindgen-integration/Cargo.toml @@ -10,3 +10,6 @@ build = "build.rs" [build-dependencies] libbindgen = { path = "../libbindgen" } gcc = "0.3" + +[features] +llvm_stable = ["libbindgen/llvm_stable"] diff --git a/bindgen-integration/cpp/Test.h b/bindgen-integration/cpp/Test.h index 2e15bb491a..21f6d1a7bb 100644 --- a/bindgen-integration/cpp/Test.h +++ b/bindgen-integration/cpp/Test.h @@ -1,6 +1,6 @@ #pragma once -class Test final { +class Test { int m_int; double m_double; public: From 1daf989fc92a45b5d4bd7a5fc7bbc51b18270466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 13 Dec 2016 15:14:15 +0100 Subject: [PATCH 0171/2291] ir: Add documentation for CompInfo::constructors --- libbindgen/src/ir/comp.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index c351a152ed..cdba2bfbd2 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -466,6 +466,7 @@ impl CompInfo { &self.methods } + /// Get this type's set of constructors. pub fn constructors(&self) -> &[ItemId] { &self.constructors } From 6e712b0b336b5c62f2d0d3dd49853b0b9e8295fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 13 Dec 2016 16:35:28 +0100 Subject: [PATCH 0172/2291] Use clang-sys bindings instead of ours. I plan to use a dynamically loaded clang-sys library to remove the llvm-stable feature. This is part of the work. --- libbindgen/Cargo.toml | 2 +- libbindgen/src/clang.rs | 147 ++- libbindgen/src/clangll.rs | 1466 ------------------------------ libbindgen/src/ir/annotations.rs | 2 +- libbindgen/src/ir/comp.rs | 6 +- libbindgen/src/ir/context.rs | 14 +- libbindgen/src/ir/enum_ty.rs | 2 +- libbindgen/src/ir/function.rs | 12 +- libbindgen/src/ir/item.rs | 10 +- libbindgen/src/ir/module.rs | 2 +- libbindgen/src/ir/ty.rs | 2 +- libbindgen/src/ir/var.rs | 4 +- libbindgen/src/lib.rs | 10 +- 13 files changed, 104 insertions(+), 1575 deletions(-) delete mode 100644 libbindgen/src/clangll.rs diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 47e8b2827e..1c1b15c381 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -25,13 +25,13 @@ quasi_codegen = "0.26" [dependencies] cfg-if = "0.1.0" -clang-sys = "0.11.1" lazy_static = "0.1.*" libc = "0.2" rustc-serialize = "0.3.19" syntex_syntax = "0.50" regex = "0.1" cexpr = "0.2" +clang-sys = { version = "0.11.1", features = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9"] } [dependencies.aster] features = ["with-syntex"] diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index a81a8cfbda..ad311835f0 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -1,11 +1,11 @@ //! A higher level Clang API built on top of the generated bindings in the -//! `clangll` module. +//! `clang_sys` module. #![allow(non_upper_case_globals, dead_code)] use cexpr; -use clangll::*; +use clang_sys::*; use std::{mem, ptr, slice}; use std::ffi::{CStr, CString}; use std::fmt; @@ -38,7 +38,7 @@ impl Cursor { /// /// The USR can be used to compare entities across translation units. pub fn usr(&self) -> Option { - let s: String = unsafe { clang_getCursorUSR(self.x) }.into(); + let s = unsafe { cxstring_into_string(clang_getCursorUSR(self.x)) }; if s.is_empty() { None } else { Some(s) } } @@ -56,7 +56,7 @@ impl Cursor { /// Get this cursor's referent's spelling. pub fn spelling(&self) -> String { - unsafe { clang_getCursorSpelling(self.x).into() } + unsafe { cxstring_into_string(clang_getCursorSpelling(self.x)) } } /// Get this cursor's referent's display name. @@ -64,12 +64,12 @@ impl Cursor { /// This is not necessarily a valid identifier. It includes extra /// information, such as parameters for a function, etc. pub fn display_name(&self) -> String { - unsafe { clang_getCursorDisplayName(self.x).into() } + unsafe { cxstring_into_string(clang_getCursorDisplayName(self.x)) } } /// Get the mangled name of this cursor's referent. pub fn mangling(&self) -> String { - unsafe { clang_Cursor_getMangling(self.x).into() } + unsafe { cxstring_into_string(clang_Cursor_getMangling(self.x)) } } /// Get the `Cursor` for this cursor's referent's lexical parent. @@ -186,7 +186,7 @@ impl Cursor { } /// Get the kind of referent this cursor is pointing to. - pub fn kind(&self) -> Enum_CXCursorKind { + pub fn kind(&self) -> CXCursorKind { unsafe { clang_getCursorKind(self.x) } } @@ -238,8 +238,9 @@ impl Cursor { /// Get the raw declaration comment for this referent, if one exists. pub fn raw_comment(&self) -> Option { - let s: String = - unsafe { clang_Cursor_getRawCommentText(self.x).into() }; + let s = unsafe { + cxstring_into_string(clang_Cursor_getRawCommentText(self.x)) + }; if s.is_empty() { None } else { Some(s) } } @@ -312,7 +313,7 @@ impl Cursor { /// Assuming that this cursor's referent is a template declaration, get the /// kind of cursor that would be generated for its specializations. - pub fn template_kind(&self) -> Enum_CXCursorKind { + pub fn template_kind(&self) -> CXCursorKind { unsafe { clang_getTemplateCursorKind(self.x) } } @@ -320,11 +321,11 @@ impl Cursor { /// /// Call the given function on each AST node traversed. pub fn visit(&self, mut visitor: Visitor) - where Visitor: FnMut(Cursor) -> Enum_CXChildVisitResult, + where Visitor: FnMut(Cursor) -> CXChildVisitResult, { unsafe { clang_visitChildren(self.x, - Some(visit_children::), + visit_children::, mem::transmute(&mut visitor)); } } @@ -332,7 +333,7 @@ impl Cursor { /// Returns whether the given location contains a cursor with the given /// kind in the first level of nesting underneath (doesn't look /// recursively). - pub fn contains_cursor(&self, kind: Enum_CXCursorKind) -> bool { + pub fn contains_cursor(&self, kind: CXCursorKind) -> bool { let mut found = false; self.visit(|c| { @@ -422,12 +423,12 @@ impl Cursor { /// Get the linkage kind for this cursor's referent. /// /// This only applies to functions and variables. - pub fn linkage(&self) -> Enum_CXLinkageKind { + pub fn linkage(&self) -> CXLinkageKind { unsafe { clang_getCursorLinkage(self.x) } } /// Get the visibility of this cursor's referent. - pub fn visibility(&self) -> Enum_CXVisibilityKind { + pub fn visibility(&self) -> CXVisibilityKind { unsafe { clang_getCursorVisibility(self.x) } } @@ -469,7 +470,7 @@ impl Cursor { } /// Get the access specifier for this cursor's referent. - pub fn access_specifier(&self) -> Enum_CX_CXXAccessSpecifier { + pub fn access_specifier(&self) -> CX_CXXAccessSpecifier { unsafe { clang_getCXXAccessSpecifier(self.x) } } @@ -508,8 +509,8 @@ impl Cursor { extern "C" fn visit_children(cur: CXCursor, _parent: CXCursor, data: CXClientData) - -> Enum_CXChildVisitResult - where Visitor: FnMut(Cursor) -> Enum_CXChildVisitResult, + -> CXChildVisitResult + where Visitor: FnMut(Cursor) -> CXChildVisitResult, { let func: &mut Visitor = unsafe { mem::transmute(data) }; let child = Cursor { @@ -534,7 +535,7 @@ impl Hash for Cursor { } /// The type of a node in clang's AST. -#[derive(Clone, Hash)] +#[derive(Clone)] pub struct Type { x: CXType, } @@ -579,6 +580,11 @@ pub enum LayoutError { impl ::std::convert::From for LayoutError { fn from(val: i32) -> Self { use self::LayoutError::*; + let val = match CXTypeLayoutError::from_raw(val) { + Some(val) => val, + None => return Unknown, + }; + match val { CXTypeLayoutError_Invalid => Invalid, CXTypeLayoutError_Incomplete => Incomplete, @@ -592,7 +598,7 @@ impl ::std::convert::From for LayoutError { impl Type { /// Get this type's kind. - pub fn kind(&self) -> Enum_CXTypeKind { + pub fn kind(&self) -> CXTypeKind { self.x.kind } @@ -607,7 +613,9 @@ impl Type { /// Get a raw display name for this type. pub fn spelling(&self) -> String { - unsafe { clang_getTypeSpelling(self.x).into() } + unsafe { + cxstring_into_string(clang_getTypeSpelling(self.x)) + } } /// Is this type const qualified? @@ -748,7 +756,7 @@ impl Type { /// Given that this type is a function type, get its calling convention. If /// this is not a function type, `CXCallingConv_Invalid` is returned. - pub fn call_conv(&self) -> Enum_CXCallingConv { + pub fn call_conv(&self) -> CXCallingConv { unsafe { clang_getFunctionTypeCallingConv(self.x) } } @@ -798,7 +806,7 @@ impl Iterator for TypeTemplateArgIterator { type Item = Type; fn next(&mut self) -> Option { if self.index < self.length { - let idx = self.index as c_int; + let idx = self.index as c_uint; self.index += 1; Some(Type { x: unsafe { clang_Type_getTemplateArgumentAsType(self.x, idx) }, @@ -827,7 +835,7 @@ impl SourceLocation { /// location. pub fn location(&self) -> (File, usize, usize, usize) { unsafe { - let mut file = ptr::null_mut(); + let mut file = mem::zeroed(); let mut line = 0; let mut col = 0; let mut off = 0; @@ -866,7 +874,7 @@ pub struct Comment { impl Comment { /// What kind of comment is this? - pub fn kind(&self) -> Enum_CXCommentKind { + pub fn kind(&self) -> CXCommentKind { unsafe { clang_Comment_getKind(self.x) } } @@ -882,7 +890,9 @@ impl Comment { /// Given that this comment is the start or end of an HTML tag, get its tag /// name. pub fn get_tag_name(&self) -> String { - unsafe { clang_HTMLTagComment_getTagName(self.x).into() } + unsafe { + cxstring_into_string(clang_HTMLTagComment_getTagName(self.x)) + } } /// Given that this comment is an HTML start tag, get its attributes. @@ -940,10 +950,12 @@ impl Iterator for CommentAttributesIterator { self.index += 1; Some(CommentAttribute { name: unsafe { - clang_HTMLStartTag_getAttrName(self.x, idx).into() + cxstring_into_string( + clang_HTMLStartTag_getAttrName(self.x, idx)) }, value: unsafe { - clang_HTMLStartTag_getAttrValue(self.x, idx).into() + cxstring_into_string( + clang_HTMLStartTag_getAttrValue(self.x, idx)) }, }) } else { @@ -963,21 +975,21 @@ impl File { if self.x.is_null() { return None; } - unsafe { Some(clang_getFileName(self.x).into()) } + Some(unsafe { + cxstring_into_string(clang_getFileName(self.x)) + }) } } -impl Into for CXString { - fn into(self) -> String { - if self.data.is_null() { - return "".to_owned(); - } - unsafe { - let c_str = CStr::from_ptr(clang_getCString(self) as *const _); - let ret = c_str.to_string_lossy().into_owned(); - clang_disposeString(self); - ret - } +fn cxstring_into_string(s: CXString) -> String { + if s.data.is_null() { + return "".to_owned(); + } + unsafe { + let c_str = CStr::from_ptr(clang_getCString(s) as *const _); + let ret = c_str.to_string_lossy().into_owned(); + clang_disposeString(s); + ret } } @@ -1043,14 +1055,14 @@ impl TranslationUnit { file: &str, cmd_args: &[String], unsaved: &[UnsavedFile], - opts: ::libc::c_uint) + opts: CXTranslationUnit_Flags) -> Option { let fname = CString::new(file).unwrap(); let _c_args: Vec = cmd_args.iter().map(|s| CString::new(s.clone()).unwrap()).collect(); let c_args: Vec<*const c_char> = _c_args.iter().map(|s| s.as_ptr()).collect(); - let mut c_unsaved: Vec = + let mut c_unsaved: Vec = unsaved.iter().map(|f| f.x).collect(); let tu = unsafe { clang_parseTranslationUnit(ix.x, @@ -1070,20 +1082,6 @@ impl TranslationUnit { } } - /// Reparse this translation unit, maybe because the file changed on disk or - /// something like that. - pub fn reparse(&self, unsaved: &[UnsavedFile], opts: usize) -> bool { - let mut c_unsaved: Vec = - unsaved.iter().map(|f| f.x).collect(); - - unsafe { - clang_reparseTranslationUnit(self.x, - c_unsaved.len() as c_uint, - c_unsaved.as_mut_ptr(), - opts as c_uint) == 0 - } - } - /// Get the Clang diagnostic information associated with this translation /// unit. pub fn diags(&self) -> Vec { @@ -1130,7 +1128,8 @@ impl TranslationUnit { num_tokens as usize); for &token in token_array.iter() { let kind = clang_getTokenKind(token); - let spelling = clang_getTokenSpelling(self.x, token).into(); + let spelling = cxstring_into_string( + clang_getTokenSpelling(self.x, token)); tokens.push(Token { kind: kind, @@ -1187,7 +1186,7 @@ impl TranslationUnit { // NB: cexpr is not too happy about comments inside // expressions, so we strip them down here. CXToken_Comment => return None, - _ => panic!("Found unexpected token kind: {}", token.kind), + _ => panic!("Found unexpected token kind: {:?}", token.kind), }; Some(token::Token { @@ -1214,19 +1213,17 @@ pub struct Diagnostic { } impl Diagnostic { - /// Get the default diagnostic display option bit flags. - pub fn default_opts() -> usize { - unsafe { clang_defaultDiagnosticDisplayOptions() as usize } - } - /// Format this diagnostic message as a string, using the given option bit /// flags. - pub fn format(&self, opts: usize) -> String { - unsafe { clang_formatDiagnostic(self.x, opts as c_uint).into() } + pub fn format(&self) -> String { + unsafe { + let opts = clang_defaultDiagnosticDisplayOptions(); + cxstring_into_string( + clang_formatDiagnostic(self.x, opts)) } } /// What is the severity of this diagnostic message? - pub fn severity(&self) -> Enum_CXDiagnosticSeverity { + pub fn severity(&self) -> CXDiagnosticSeverity { unsafe { clang_getDiagnosticSeverity(self.x) } } } @@ -1242,7 +1239,7 @@ impl Drop for Diagnostic { /// A file which has not been saved to disk. pub struct UnsavedFile { - x: Struct_CXUnsavedFile, + x: CXUnsavedFile, name: CString, contents: CString, } @@ -1252,7 +1249,7 @@ impl UnsavedFile { pub fn new(name: &str, contents: &str) -> UnsavedFile { let name = CString::new(name).unwrap(); let contents = CString::new(contents).unwrap(); - let x = Struct_CXUnsavedFile { + let x = CXUnsavedFile { Filename: name.as_ptr(), Contents: contents.as_ptr(), Length: contents.as_bytes().len() as c_ulong, @@ -1266,17 +1263,17 @@ impl UnsavedFile { } /// Convert a cursor kind into a static string. -pub fn kind_to_str(x: Enum_CXCursorKind) -> String { - unsafe { clang_getCursorKindSpelling(x) }.into() +pub fn kind_to_str(x: CXCursorKind) -> String { + unsafe { cxstring_into_string(clang_getCursorKindSpelling(x)) } } /// Convert a type kind to a static string. -pub fn type_to_str(x: Enum_CXTypeKind) -> String { - unsafe { clang_getTypeKindSpelling(x).into() } +pub fn type_to_str(x: CXTypeKind) -> String { + unsafe { cxstring_into_string(clang_getTypeKindSpelling(x)) } } /// Dump the Clang AST to stdout for debugging purposes. -pub fn ast_dump(c: &Cursor, depth: isize) -> Enum_CXVisitorResult { +pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { fn print_indent(depth: isize, s: &str) { for _ in 0..depth { print!("\t"); @@ -1300,7 +1297,7 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> Enum_CXVisitorResult { /// Try to extract the clang version to a string pub fn extract_clang_version() -> String { - unsafe { clang_getClangVersion().into() } + unsafe { cxstring_into_string(clang_getClangVersion()) } } /// A wrapper for the result of evaluating an expression. @@ -1357,7 +1354,7 @@ impl EvalResult { }) } - fn kind(&self) -> Enum_CXEvalResultKind { + fn kind(&self) -> CXEvalResultKind { unsafe { clang_EvalResult_getKind(self.x) } } diff --git a/libbindgen/src/clangll.rs b/libbindgen/src/clangll.rs deleted file mode 100644 index e37baf257a..0000000000 --- a/libbindgen/src/clangll.rs +++ /dev/null @@ -1,1466 +0,0 @@ -/* automatically generated by rust-bindgen */ - -#![allow(non_camel_case_types)] -#![allow(dead_code)] -#![allow(unused_attributes)] -#![allow(non_snake_case)] -#![allow(non_upper_case_globals)] -#![cfg_attr(rustfmt, rustfmt_skip)] - -use ::std::os::raw::{c_char, c_int, c_long, c_longlong, c_uint, c_ulong, c_ulonglong, c_void}; - -#[cfg(not(feature = "llvm_stable"))] -use std::os::raw::c_double; - - -pub type CXEvalResult = *mut c_void; -pub type Enum_CXEvalResultKind = c_uint; - -pub const CXEval_Int: c_uint = 1; -pub const CXEval_Float: c_uint = 2; -pub const CXEval_ObjCStrLiteral: c_uint = 3; -pub const CXEval_StrLiteral: c_uint = 4; -pub const CXEval_CFStr: c_uint = 5; -pub const CXEval_Other: c_uint = 6; -pub const CXEval_UnExposed: c_uint = 0; - -pub type ptrdiff_t = c_long; -pub type size_t = c_ulong; -pub type wchar_t = c_int; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXString { - pub data: *const c_void, - pub private_flags: c_uint, -} -pub type CXIndex = *mut c_void; -pub enum Struct_CXTranslationUnitImpl { } -pub type CXTranslationUnit = *mut Struct_CXTranslationUnitImpl; -pub type CXClientData = *mut c_void; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Struct_CXUnsavedFile { - pub Filename: *const c_char, - pub Contents: *const c_char, - pub Length: c_ulong, -} -pub type Enum_CXAvailabilityKind = c_uint; -pub const CXAvailability_Available: c_uint = 0; -pub const CXAvailability_Deprecated: c_uint = 1; -pub const CXAvailability_NotAvailable: c_uint = 2; -pub const CXAvailability_NotAccessible: c_uint = 3; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Struct_CXVersion { - pub Major: c_int, - pub Minor: c_int, - pub Subminor: c_int, -} -pub type CXVersion = Struct_CXVersion; -pub type CXGlobalOptFlags = c_uint; -pub const CXGlobalOpt_None: c_uint = 0; -pub const CXGlobalOpt_ThreadBackgroundPriorityForIndexing: c_uint = - 1; -pub const CXGlobalOpt_ThreadBackgroundPriorityForEditing: c_uint = 2; -pub const CXGlobalOpt_ThreadBackgroundPriorityForAll: c_uint = 3; -pub type CXFile = *mut c_void; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXFileUniqueID { - pub data: [c_ulonglong; 3], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXSourceLocation { - pub ptr_data: [*const c_void; 2], - pub int_data: c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXSourceRange { - pub ptr_data: [*const c_void; 2], - pub begin_int_data: c_uint, - pub end_int_data: c_uint, -} -pub type Enum_CXDiagnosticSeverity = c_uint; -pub const CXDiagnostic_Ignored: c_uint = 0; -pub const CXDiagnostic_Note: c_uint = 1; -pub const CXDiagnostic_Warning: c_uint = 2; -pub const CXDiagnostic_Error: c_uint = 3; -pub const CXDiagnostic_Fatal: c_uint = 4; -pub type CXDiagnostic = *mut c_void; -pub type CXDiagnosticSet = *mut c_void; -pub type Enum_CXLoadDiag_Error = c_uint; -pub const CXLoadDiag_None: c_uint = 0; -pub const CXLoadDiag_Unknown: c_uint = 1; -pub const CXLoadDiag_CannotLoad: c_uint = 2; -pub const CXLoadDiag_InvalidFile: c_uint = 3; -pub type Enum_CXDiagnosticDisplayOptions = c_uint; -pub const CXDiagnostic_DisplaySourceLocation: c_uint = 1; -pub const CXDiagnostic_DisplayColumn: c_uint = 2; -pub const CXDiagnostic_DisplaySourceRanges: c_uint = 4; -pub const CXDiagnostic_DisplayOption: c_uint = 8; -pub const CXDiagnostic_DisplayCategoryId: c_uint = 16; -pub const CXDiagnostic_DisplayCategoryName: c_uint = 32; -pub type Enum_CXTranslationUnit_Flags = c_uint; -pub const CXTranslationUnit_None: c_uint = 0; -pub const CXTranslationUnit_DetailedPreprocessingRecord: c_uint = 1; -pub const CXTranslationUnit_Incomplete: c_uint = 2; -pub const CXTranslationUnit_PrecompiledPreamble: c_uint = 4; -pub const CXTranslationUnit_CacheCompletionResults: c_uint = 8; -pub const CXTranslationUnit_ForSerialization: c_uint = 16; -pub const CXTranslationUnit_CXXChainedPCH: c_uint = 32; -pub const CXTranslationUnit_SkipFunctionBodies: c_uint = 64; -pub const CXTranslationUnit_IncludeBriefCommentsInCodeCompletion: - c_uint = - 128; -pub type Enum_CXSaveTranslationUnit_Flags = c_uint; -pub const CXSaveTranslationUnit_None: c_uint = 0; -pub type Enum_CXSaveError = c_uint; -pub const CXSaveError_None: c_uint = 0; -pub const CXSaveError_Unknown: c_uint = 1; -pub const CXSaveError_TranslationErrors: c_uint = 2; -pub const CXSaveError_InvalidTU: c_uint = 3; -pub type Enum_CXReparse_Flags = c_uint; -pub const CXReparse_None: c_uint = 0; -pub type Enum_CXTUResourceUsageKind = c_uint; -pub const CXTUResourceUsage_AST: c_uint = 1; -pub const CXTUResourceUsage_Identifiers: c_uint = 2; -pub const CXTUResourceUsage_Selectors: c_uint = 3; -pub const CXTUResourceUsage_GlobalCompletionResults: c_uint = 4; -pub const CXTUResourceUsage_SourceManagerContentCache: c_uint = 5; -pub const CXTUResourceUsage_AST_SideTables: c_uint = 6; -pub const CXTUResourceUsage_SourceManager_Membuffer_Malloc: c_uint = - 7; -pub const CXTUResourceUsage_SourceManager_Membuffer_MMap: c_uint = 8; -pub const CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc: - c_uint = - 9; -pub const CXTUResourceUsage_ExternalASTSource_Membuffer_MMap: c_uint - = - 10; -pub const CXTUResourceUsage_Preprocessor: c_uint = 11; -pub const CXTUResourceUsage_PreprocessingRecord: c_uint = 12; -pub const CXTUResourceUsage_SourceManager_DataStructures: c_uint = - 13; -pub const CXTUResourceUsage_Preprocessor_HeaderSearch: c_uint = 14; -pub const CXTUResourceUsage_MEMORY_IN_BYTES_BEGIN: c_uint = 1; -pub const CXTUResourceUsage_MEMORY_IN_BYTES_END: c_uint = 14; -pub const CXTUResourceUsage_First: c_uint = 1; -pub const CXTUResourceUsage_Last: c_uint = 14; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Struct_CXTUResourceUsageEntry { - pub kind: Enum_CXTUResourceUsageKind, - pub amount: c_ulong, -} -pub type CXTUResourceUsageEntry = Struct_CXTUResourceUsageEntry; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Struct_CXTUResourceUsage { - pub data: *mut c_void, - pub numEntries: c_uint, - pub entries: *mut CXTUResourceUsageEntry, -} -pub type CXTUResourceUsage = Struct_CXTUResourceUsage; -pub type Enum_CXCursorKind = c_uint; -pub const CXCursor_UnexposedDecl: c_uint = 1; -pub const CXCursor_StructDecl: c_uint = 2; -pub const CXCursor_UnionDecl: c_uint = 3; -pub const CXCursor_ClassDecl: c_uint = 4; -pub const CXCursor_EnumDecl: c_uint = 5; -pub const CXCursor_FieldDecl: c_uint = 6; -pub const CXCursor_EnumConstantDecl: c_uint = 7; -pub const CXCursor_FunctionDecl: c_uint = 8; -pub const CXCursor_VarDecl: c_uint = 9; -pub const CXCursor_ParmDecl: c_uint = 10; -pub const CXCursor_ObjCInterfaceDecl: c_uint = 11; -pub const CXCursor_ObjCCategoryDecl: c_uint = 12; -pub const CXCursor_ObjCProtocolDecl: c_uint = 13; -pub const CXCursor_ObjCPropertyDecl: c_uint = 14; -pub const CXCursor_ObjCIvarDecl: c_uint = 15; -pub const CXCursor_ObjCInstanceMethodDecl: c_uint = 16; -pub const CXCursor_ObjCClassMethodDecl: c_uint = 17; -pub const CXCursor_ObjCImplementationDecl: c_uint = 18; -pub const CXCursor_ObjCCategoryImplDecl: c_uint = 19; -pub const CXCursor_TypedefDecl: c_uint = 20; -pub const CXCursor_CXXMethod: c_uint = 21; -pub const CXCursor_Namespace: c_uint = 22; -pub const CXCursor_LinkageSpec: c_uint = 23; -pub const CXCursor_Constructor: c_uint = 24; -pub const CXCursor_Destructor: c_uint = 25; -pub const CXCursor_ConversionFunction: c_uint = 26; -pub const CXCursor_TemplateTypeParameter: c_uint = 27; -pub const CXCursor_NonTypeTemplateParameter: c_uint = 28; -pub const CXCursor_TemplateTemplateParameter: c_uint = 29; -pub const CXCursor_FunctionTemplate: c_uint = 30; -pub const CXCursor_ClassTemplate: c_uint = 31; -pub const CXCursor_ClassTemplatePartialSpecialization: c_uint = 32; -pub const CXCursor_NamespaceAlias: c_uint = 33; -pub const CXCursor_UsingDirective: c_uint = 34; -pub const CXCursor_UsingDeclaration: c_uint = 35; -pub const CXCursor_TypeAliasDecl: c_uint = 36; -pub const CXCursor_ObjCSynthesizeDecl: c_uint = 37; -pub const CXCursor_ObjCDynamicDecl: c_uint = 38; -pub const CXCursor_CXXAccessSpecifier: c_uint = 39; -pub const CXCursor_FirstDecl: c_uint = 1; -pub const CXCursor_LastDecl: c_uint = 39; -pub const CXCursor_FirstRef: c_uint = 40; -pub const CXCursor_ObjCSuperClassRef: c_uint = 40; -pub const CXCursor_ObjCProtocolRef: c_uint = 41; -pub const CXCursor_ObjCClassRef: c_uint = 42; -pub const CXCursor_TypeRef: c_uint = 43; -pub const CXCursor_CXXBaseSpecifier: c_uint = 44; -pub const CXCursor_TemplateRef: c_uint = 45; -pub const CXCursor_NamespaceRef: c_uint = 46; -pub const CXCursor_MemberRef: c_uint = 47; -pub const CXCursor_LabelRef: c_uint = 48; -pub const CXCursor_OverloadedDeclRef: c_uint = 49; -pub const CXCursor_VariableRef: c_uint = 50; -pub const CXCursor_LastRef: c_uint = 50; -pub const CXCursor_FirstInvalid: c_uint = 70; -pub const CXCursor_InvalidFile: c_uint = 70; -pub const CXCursor_NoDeclFound: c_uint = 71; -pub const CXCursor_NotImplemented: c_uint = 72; -pub const CXCursor_InvalidCode: c_uint = 73; -pub const CXCursor_LastInvalid: c_uint = 73; -pub const CXCursor_FirstExpr: c_uint = 100; -pub const CXCursor_UnexposedExpr: c_uint = 100; -pub const CXCursor_DeclRefExpr: c_uint = 101; -pub const CXCursor_MemberRefExpr: c_uint = 102; -pub const CXCursor_CallExpr: c_uint = 103; -pub const CXCursor_ObjCMessageExpr: c_uint = 104; -pub const CXCursor_BlockExpr: c_uint = 105; -pub const CXCursor_IntegerLiteral: c_uint = 106; -pub const CXCursor_FloatingLiteral: c_uint = 107; -pub const CXCursor_ImaginaryLiteral: c_uint = 108; -pub const CXCursor_StringLiteral: c_uint = 109; -pub const CXCursor_CharacterLiteral: c_uint = 110; -pub const CXCursor_ParenExpr: c_uint = 111; -pub const CXCursor_UnaryOperator: c_uint = 112; -pub const CXCursor_ArraySubscriptExpr: c_uint = 113; -pub const CXCursor_BinaryOperator: c_uint = 114; -pub const CXCursor_CompoundAssignOperator: c_uint = 115; -pub const CXCursor_ConditionalOperator: c_uint = 116; -pub const CXCursor_CStyleCastExpr: c_uint = 117; -pub const CXCursor_CompoundLiteralExpr: c_uint = 118; -pub const CXCursor_InitListExpr: c_uint = 119; -pub const CXCursor_AddrLabelExpr: c_uint = 120; -pub const CXCursor_StmtExpr: c_uint = 121; -pub const CXCursor_GenericSelectionExpr: c_uint = 122; -pub const CXCursor_GNUNullExpr: c_uint = 123; -pub const CXCursor_CXXStaticCastExpr: c_uint = 124; -pub const CXCursor_CXXDynamicCastExpr: c_uint = 125; -pub const CXCursor_CXXReinterpretCastExpr: c_uint = 126; -pub const CXCursor_CXXConstCastExpr: c_uint = 127; -pub const CXCursor_CXXFunctionalCastExpr: c_uint = 128; -pub const CXCursor_CXXTypeidExpr: c_uint = 129; -pub const CXCursor_CXXBoolLiteralExpr: c_uint = 130; -pub const CXCursor_CXXNullPtrLiteralExpr: c_uint = 131; -pub const CXCursor_CXXThisExpr: c_uint = 132; -pub const CXCursor_CXXThrowExpr: c_uint = 133; -pub const CXCursor_CXXNewExpr: c_uint = 134; -pub const CXCursor_CXXDeleteExpr: c_uint = 135; -pub const CXCursor_UnaryExpr: c_uint = 136; -pub const CXCursor_ObjCStringLiteral: c_uint = 137; -pub const CXCursor_ObjCEncodeExpr: c_uint = 138; -pub const CXCursor_ObjCSelectorExpr: c_uint = 139; -pub const CXCursor_ObjCProtocolExpr: c_uint = 140; -pub const CXCursor_ObjCBridgedCastExpr: c_uint = 141; -pub const CXCursor_PackExpansionExpr: c_uint = 142; -pub const CXCursor_SizeOfPackExpr: c_uint = 143; -pub const CXCursor_LambdaExpr: c_uint = 144; -pub const CXCursor_ObjCBoolLiteralExpr: c_uint = 145; -pub const CXCursor_ObjCSelfExpr: c_uint = 146; -pub const CXCursor_LastExpr: c_uint = 146; -pub const CXCursor_FirstStmt: c_uint = 200; -pub const CXCursor_UnexposedStmt: c_uint = 200; -pub const CXCursor_LabelStmt: c_uint = 201; -pub const CXCursor_CompoundStmt: c_uint = 202; -pub const CXCursor_CaseStmt: c_uint = 203; -pub const CXCursor_DefaultStmt: c_uint = 204; -pub const CXCursor_IfStmt: c_uint = 205; -pub const CXCursor_SwitchStmt: c_uint = 206; -pub const CXCursor_WhileStmt: c_uint = 207; -pub const CXCursor_DoStmt: c_uint = 208; -pub const CXCursor_ForStmt: c_uint = 209; -pub const CXCursor_GotoStmt: c_uint = 210; -pub const CXCursor_IndirectGotoStmt: c_uint = 211; -pub const CXCursor_ContinueStmt: c_uint = 212; -pub const CXCursor_BreakStmt: c_uint = 213; -pub const CXCursor_ReturnStmt: c_uint = 214; -pub const CXCursor_GCCAsmStmt: c_uint = 215; -pub const CXCursor_AsmStmt: c_uint = 215; -pub const CXCursor_ObjCAtTryStmt: c_uint = 216; -pub const CXCursor_ObjCAtCatchStmt: c_uint = 217; -pub const CXCursor_ObjCAtFinallyStmt: c_uint = 218; -pub const CXCursor_ObjCAtThrowStmt: c_uint = 219; -pub const CXCursor_ObjCAtSynchronizedStmt: c_uint = 220; -pub const CXCursor_ObjCAutoreleasePoolStmt: c_uint = 221; -pub const CXCursor_ObjCForCollectionStmt: c_uint = 222; -pub const CXCursor_CXXCatchStmt: c_uint = 223; -pub const CXCursor_CXXTryStmt: c_uint = 224; -pub const CXCursor_CXXForRangeStmt: c_uint = 225; -pub const CXCursor_SEHTryStmt: c_uint = 226; -pub const CXCursor_SEHExceptStmt: c_uint = 227; -pub const CXCursor_SEHFinallyStmt: c_uint = 228; -pub const CXCursor_MSAsmStmt: c_uint = 229; -pub const CXCursor_NullStmt: c_uint = 230; -pub const CXCursor_DeclStmt: c_uint = 231; -pub const CXCursor_OMPParallelDirective: c_uint = 232; -pub const CXCursor_LastStmt: c_uint = 232; -pub const CXCursor_TranslationUnit: c_uint = 300; -pub const CXCursor_FirstAttr: c_uint = 400; -pub const CXCursor_UnexposedAttr: c_uint = 400; -pub const CXCursor_IBActionAttr: c_uint = 401; -pub const CXCursor_IBOutletAttr: c_uint = 402; -pub const CXCursor_IBOutletCollectionAttr: c_uint = 403; -pub const CXCursor_CXXFinalAttr: c_uint = 404; -pub const CXCursor_CXXOverrideAttr: c_uint = 405; -pub const CXCursor_AnnotateAttr: c_uint = 406; -pub const CXCursor_AsmLabelAttr: c_uint = 407; -pub const CXCursor_PackedAttr: c_uint = 408; -pub const CXCursor_LastAttr: c_uint = 408; -pub const CXCursor_PreprocessingDirective: c_uint = 500; -pub const CXCursor_MacroDefinition: c_uint = 501; -pub const CXCursor_MacroExpansion: c_uint = 502; -pub const CXCursor_MacroInstantiation: c_uint = 502; -pub const CXCursor_InclusionDirective: c_uint = 503; -pub const CXCursor_FirstPreprocessing: c_uint = 500; -pub const CXCursor_LastPreprocessing: c_uint = 503; -pub const CXCursor_ModuleImportDecl: c_uint = 600; -pub const CXCursor_TypeAliasTemplateDecl: c_uint = 601; -pub const CXCursor_StaticAssert: c_uint = 602; -pub const CXCursor_FirstExtraDecl: c_uint = 600; -pub const CXCursor_LastExtraDecl: c_uint = 602; -pub const CXCursor_OverloadCandidate: c_uint = 700; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXCursor { - pub kind: Enum_CXCursorKind, - pub xdata: c_int, - pub data: [*const c_void; 3], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXComment { - pub ASTNode: *const c_void, - pub TranslationUnit: CXTranslationUnit, -} -pub type Enum_CXLinkageKind = ::libc::c_uint; -pub const CXLinkage_Invalid: ::libc::c_uint = 0; -pub const CXLinkage_NoLinkage: ::libc::c_uint = 1; -pub const CXLinkage_Internal: ::libc::c_uint = 2; -pub const CXLinkage_UniqueExternal: ::libc::c_uint = 3; -pub const CXLinkage_External: ::libc::c_uint = 4; -pub type Enum_CXVisibilityKind = ::libc::c_uint; -pub const CXVisibility_Invalid: ::libc::c_uint = 0; -pub const CXVisibility_Hidden: ::libc::c_uint = 1; -pub const CXVisibility_Protected: ::libc::c_uint = 2; -pub const CXVisibility_Default: ::libc::c_uint = 3; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Struct_CXPlatformAvailability { - pub Platform: CXString, - pub Introduced: CXVersion, - pub Deprecated: CXVersion, - pub Obsoleted: CXVersion, - pub Unavailable: c_int, - pub Message: CXString, -} -pub type CXPlatformAvailability = Struct_CXPlatformAvailability; -pub type Enum_CXLanguageKind = c_uint; -pub const CXLanguage_Invalid: c_uint = 0; -pub const CXLanguage_C: c_uint = 1; -pub const CXLanguage_ObjC: c_uint = 2; -pub const CXLanguage_CPlusPlus: c_uint = 3; -pub enum Struct_CXCursorSetImpl { } -pub type CXCursorSet = *mut Struct_CXCursorSetImpl; -pub type Enum_CXTypeKind = c_uint; -pub const CXType_Invalid: c_uint = 0; -pub const CXType_Unexposed: c_uint = 1; -pub const CXType_Void: c_uint = 2; -pub const CXType_Bool: c_uint = 3; -pub const CXType_Char_U: c_uint = 4; -pub const CXType_UChar: c_uint = 5; -pub const CXType_Char16: c_uint = 6; -pub const CXType_Char32: c_uint = 7; -pub const CXType_UShort: c_uint = 8; -pub const CXType_UInt: c_uint = 9; -pub const CXType_ULong: c_uint = 10; -pub const CXType_ULongLong: c_uint = 11; -pub const CXType_UInt128: c_uint = 12; -pub const CXType_Char_S: c_uint = 13; -pub const CXType_SChar: c_uint = 14; -pub const CXType_WChar: c_uint = 15; -pub const CXType_Short: c_uint = 16; -pub const CXType_Int: c_uint = 17; -pub const CXType_Long: c_uint = 18; -pub const CXType_LongLong: c_uint = 19; -pub const CXType_Int128: c_uint = 20; -pub const CXType_Float: c_uint = 21; -pub const CXType_Double: c_uint = 22; -pub const CXType_LongDouble: c_uint = 23; -pub const CXType_NullPtr: c_uint = 24; -pub const CXType_Overload: c_uint = 25; -pub const CXType_Dependent: c_uint = 26; -pub const CXType_ObjCId: c_uint = 27; -pub const CXType_ObjCClass: c_uint = 28; -pub const CXType_ObjCSel: c_uint = 29; -pub const CXType_Float128: c_uint = 30; -pub const CXType_FirstBuiltin: c_uint = 2; -pub const CXType_LastBuiltin: c_uint = 29; -pub const CXType_Complex: c_uint = 100; -pub const CXType_Pointer: c_uint = 101; -pub const CXType_BlockPointer: c_uint = 102; -pub const CXType_LValueReference: c_uint = 103; -pub const CXType_RValueReference: c_uint = 104; -pub const CXType_Record: c_uint = 105; -pub const CXType_Enum: c_uint = 106; -pub const CXType_Typedef: c_uint = 107; -pub const CXType_ObjCInterface: c_uint = 108; -pub const CXType_ObjCObjectPointer: c_uint = 109; -pub const CXType_FunctionNoProto: c_uint = 110; -pub const CXType_FunctionProto: c_uint = 111; -pub const CXType_ConstantArray: c_uint = 112; -pub const CXType_Vector: c_uint = 113; -pub const CXType_IncompleteArray: c_uint = 114; -pub const CXType_VariableArray: c_uint = 115; -pub const CXType_DependentSizedArray: c_uint = 116; -pub const CXType_MemberPointer: c_uint = 117; -#[cfg(not(feature="llvm_stable"))] -pub const CXType_Auto: c_uint = 118; -#[cfg(not(feature="llvm_stable"))] -pub const CXType_Elaborated: c_uint = 119; -pub type Enum_CXCallingConv = c_uint; -pub const CXCallingConv_Default: c_uint = 0; -pub const CXCallingConv_C: c_uint = 1; -pub const CXCallingConv_X86StdCall: c_uint = 2; -pub const CXCallingConv_X86FastCall: c_uint = 3; -pub const CXCallingConv_X86ThisCall: c_uint = 4; -pub const CXCallingConv_X86Pascal: c_uint = 5; -pub const CXCallingConv_AAPCS: c_uint = 6; -pub const CXCallingConv_AAPCS_VFP: c_uint = 7; -pub const CXCallingConv_PnaclCall: c_uint = 8; -pub const CXCallingConv_IntelOclBicc: c_uint = 9; -pub const CXCallingConv_X86_64Win64: c_uint = 10; -pub const CXCallingConv_X86_64SysV: c_uint = 11; -pub const CXCallingConv_Invalid: c_uint = 100; -pub const CXCallingConv_Unexposed: c_uint = 200; -#[repr(C)] -#[derive(Copy, Clone, Hash)] -pub struct CXType { - pub kind: Enum_CXTypeKind, - pub data: [*mut c_void; 2], -} -pub type Enum_CXTypeLayoutError = c_int; -pub const CXTypeLayoutError_Invalid: c_int = -1; -pub const CXTypeLayoutError_Incomplete: c_int = -2; -pub const CXTypeLayoutError_Dependent: c_int = -3; -pub const CXTypeLayoutError_NotConstantSize: c_int = -4; -pub const CXTypeLayoutError_InvalidFieldName: c_int = -5; -pub type Enum_CXRefQualifierKind = c_uint; -pub const CXRefQualifier_None: c_uint = 0; -pub const CXRefQualifier_LValue: c_uint = 1; -pub const CXRefQualifier_RValue: c_uint = 2; -pub type Enum_CX_CXXAccessSpecifier = c_uint; -pub const CX_CXXInvalidAccessSpecifier: c_uint = 0; -pub const CX_CXXPublic: c_uint = 1; -pub const CX_CXXProtected: c_uint = 2; -pub const CX_CXXPrivate: c_uint = 3; -pub type Enum_CXChildVisitResult = c_uint; -pub const CXChildVisit_Break: c_uint = 0; -pub const CXChildVisit_Continue: c_uint = 1; -pub const CXChildVisit_Recurse: c_uint = 2; -pub type CXCursorVisitor = - ::std::option::Option Enum_CXChildVisitResult>; -pub type CXObjCPropertyAttrKind = c_uint; -pub const CXObjCPropertyAttr_noattr: c_uint = 0; -pub const CXObjCPropertyAttr_readonly: c_uint = 1; -pub const CXObjCPropertyAttr_getter: c_uint = 2; -pub const CXObjCPropertyAttr_assign: c_uint = 4; -pub const CXObjCPropertyAttr_readwrite: c_uint = 8; -pub const CXObjCPropertyAttr_retain: c_uint = 16; -pub const CXObjCPropertyAttr_copy: c_uint = 32; -pub const CXObjCPropertyAttr_nonatomic: c_uint = 64; -pub const CXObjCPropertyAttr_setter: c_uint = 128; -pub const CXObjCPropertyAttr_atomic: c_uint = 256; -pub const CXObjCPropertyAttr_weak: c_uint = 512; -pub const CXObjCPropertyAttr_strong: c_uint = 1024; -pub const CXObjCPropertyAttr_unsafe_unretained: c_uint = 2048; -pub type CXObjCDeclQualifierKind = c_uint; -pub const CXObjCDeclQualifier_None: c_uint = 0; -pub const CXObjCDeclQualifier_In: c_uint = 1; -pub const CXObjCDeclQualifier_Inout: c_uint = 2; -pub const CXObjCDeclQualifier_Out: c_uint = 4; -pub const CXObjCDeclQualifier_Bycopy: c_uint = 8; -pub const CXObjCDeclQualifier_Byref: c_uint = 16; -pub const CXObjCDeclQualifier_Oneway: c_uint = 32; -pub type CXModule = *mut c_void; -pub type Enum_CXCommentKind = c_uint; -pub const CXComment_Null: c_uint = 0; -pub const CXComment_Text: c_uint = 1; -pub const CXComment_InlineCommand: c_uint = 2; -pub const CXComment_HTMLStartTag: c_uint = 3; -pub const CXComment_HTMLEndTag: c_uint = 4; -pub const CXComment_Paragraph: c_uint = 5; -pub const CXComment_BlockCommand: c_uint = 6; -pub const CXComment_ParamCommand: c_uint = 7; -pub const CXComment_TParamCommand: c_uint = 8; -pub const CXComment_VerbatimBlockCommand: c_uint = 9; -pub const CXComment_VerbatimBlockLine: c_uint = 10; -pub const CXComment_VerbatimLine: c_uint = 11; -pub const CXComment_FullComment: c_uint = 12; -pub type Enum_CXCommentInlineCommandRenderKind = c_uint; -pub const CXCommentInlineCommandRenderKind_Normal: c_uint = 0; -pub const CXCommentInlineCommandRenderKind_Bold: c_uint = 1; -pub const CXCommentInlineCommandRenderKind_Monospaced: c_uint = 2; -pub const CXCommentInlineCommandRenderKind_Emphasized: c_uint = 3; -pub type Enum_CXCommentParamPassDirection = c_uint; -pub const CXCommentParamPassDirection_In: c_uint = 0; -pub const CXCommentParamPassDirection_Out: c_uint = 1; -pub const CXCommentParamPassDirection_InOut: c_uint = 2; -pub type Enum_CXNameRefFlags = c_uint; -pub const CXNameRange_WantQualifier: c_uint = 1; -pub const CXNameRange_WantTemplateArgs: c_uint = 2; -pub const CXNameRange_WantSinglePiece: c_uint = 4; -pub type Enum_CXTokenKind = c_uint; -pub const CXToken_Punctuation: c_uint = 0; -pub const CXToken_Keyword: c_uint = 1; -pub const CXToken_Identifier: c_uint = 2; -pub const CXToken_Literal: c_uint = 3; -pub const CXToken_Comment: c_uint = 4; -pub type CXTokenKind = Enum_CXTokenKind; -pub type Enum_CXTemplateArgumentKind = c_uint; -pub const CXTemplateArgumentKind_Null: c_uint = 0; -pub const CXTemplateArgumentKind_Type: c_uint = 1; -pub const CXTemplateArgumentKind_Declaration: c_uint = 2; -pub const CXTemplateArgumentKind_NullPtr: c_uint = 3; -pub const CXTemplateArgumentKind_Integral: c_uint = 4; -pub const CXTemplateArgumentKind_Template: c_uint = 5; -pub const CXTemplateArgumentKind_TemplateExpansion: c_uint = 6; -pub const CXTemplateArgumentKind_Expression: c_uint = 7; -pub const CXTemplateArgumentKind_Pack: c_uint = 8; -pub const CXTemplateArgumentKind_Invalid: c_uint = 9; -pub type CXTemplateArgumentKind = Enum_CXTemplateArgumentKind; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXToken { - pub int_data: [c_uint; 4], - pub ptr_data: *mut c_void, -} -pub type CXCompletionString = *mut c_void; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXCompletionResult { - pub CursorKind: Enum_CXCursorKind, - pub CompletionString: CXCompletionString, -} -pub type Enum_CXCompletionChunkKind = c_uint; -pub const CXCompletionChunk_Optional: c_uint = 0; -pub const CXCompletionChunk_TypedText: c_uint = 1; -pub const CXCompletionChunk_Text: c_uint = 2; -pub const CXCompletionChunk_Placeholder: c_uint = 3; -pub const CXCompletionChunk_Informative: c_uint = 4; -pub const CXCompletionChunk_CurrentParameter: c_uint = 5; -pub const CXCompletionChunk_LeftParen: c_uint = 6; -pub const CXCompletionChunk_RightParen: c_uint = 7; -pub const CXCompletionChunk_LeftBracket: c_uint = 8; -pub const CXCompletionChunk_RightBracket: c_uint = 9; -pub const CXCompletionChunk_LeftBrace: c_uint = 10; -pub const CXCompletionChunk_RightBrace: c_uint = 11; -pub const CXCompletionChunk_LeftAngle: c_uint = 12; -pub const CXCompletionChunk_RightAngle: c_uint = 13; -pub const CXCompletionChunk_Comma: c_uint = 14; -pub const CXCompletionChunk_ResultType: c_uint = 15; -pub const CXCompletionChunk_Colon: c_uint = 16; -pub const CXCompletionChunk_SemiColon: c_uint = 17; -pub const CXCompletionChunk_Equal: c_uint = 18; -pub const CXCompletionChunk_HorizontalSpace: c_uint = 19; -pub const CXCompletionChunk_VerticalSpace: c_uint = 20; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXCodeCompleteResults { - pub Results: *mut CXCompletionResult, - pub NumResults: c_uint, -} -pub type Enum_CXCodeComplete_Flags = c_uint; -pub const CXCodeComplete_IncludeMacros: c_uint = 1; -pub const CXCodeComplete_IncludeCodePatterns: c_uint = 2; -pub const CXCodeComplete_IncludeBriefComments: c_uint = 4; -pub type Enum_CXCompletionContext = c_uint; -pub const CXCompletionContext_Unexposed: c_uint = 0; -pub const CXCompletionContext_AnyType: c_uint = 1; -pub const CXCompletionContext_AnyValue: c_uint = 2; -pub const CXCompletionContext_ObjCObjectValue: c_uint = 4; -pub const CXCompletionContext_ObjCSelectorValue: c_uint = 8; -pub const CXCompletionContext_CXXClassTypeValue: c_uint = 16; -pub const CXCompletionContext_DotMemberAccess: c_uint = 32; -pub const CXCompletionContext_ArrowMemberAccess: c_uint = 64; -pub const CXCompletionContext_ObjCPropertyAccess: c_uint = 128; -pub const CXCompletionContext_EnumTag: c_uint = 256; -pub const CXCompletionContext_UnionTag: c_uint = 512; -pub const CXCompletionContext_StructTag: c_uint = 1024; -pub const CXCompletionContext_ClassTag: c_uint = 2048; -pub const CXCompletionContext_Namespace: c_uint = 4096; -pub const CXCompletionContext_NestedNameSpecifier: c_uint = 8192; -pub const CXCompletionContext_ObjCInterface: c_uint = 16384; -pub const CXCompletionContext_ObjCProtocol: c_uint = 32768; -pub const CXCompletionContext_ObjCCategory: c_uint = 65536; -pub const CXCompletionContext_ObjCInstanceMessage: c_uint = 131072; -pub const CXCompletionContext_ObjCClassMessage: c_uint = 262144; -pub const CXCompletionContext_ObjCSelectorName: c_uint = 524288; -pub const CXCompletionContext_MacroName: c_uint = 1048576; -pub const CXCompletionContext_NaturalLanguage: c_uint = 2097152; -pub const CXCompletionContext_Unknown: c_uint = 4194303; -pub type CXInclusionVisitor = - ::std::option::Option; -pub type CXRemapping = *mut c_void; -pub type Enum_CXVisitorResult = c_uint; -pub const CXVisit_Break: c_uint = 0; -pub const CXVisit_Continue: c_uint = 1; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXCursorAndRangeVisitor { - pub context: *mut c_void, - pub visit: ::std::option::Option Enum_CXVisitorResult>, -} -pub type CXResult = c_uint; -pub const CXResult_Success: c_uint = 0; -pub const CXResult_Invalid: c_uint = 1; -pub const CXResult_VisitBreak: c_uint = 2; -pub type CXIdxClientFile = *mut c_void; -pub type CXIdxClientEntity = *mut c_void; -pub type CXIdxClientContainer = *mut c_void; -pub type CXIdxClientASTFile = *mut c_void; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxLoc { - pub ptr_data: [*mut c_void; 2], - pub int_data: c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxIncludedFileInfo { - pub hashLoc: CXIdxLoc, - pub filename: *const c_char, - pub file: CXFile, - pub isImport: c_int, - pub isAngled: c_int, - pub isModuleImport: c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxImportedASTFileInfo { - pub file: CXFile, - pub module: CXModule, - pub loc: CXIdxLoc, - pub isImplicit: c_int, -} -pub type CXIdxEntityKind = c_uint; -pub const CXIdxEntity_Unexposed: c_uint = 0; -pub const CXIdxEntity_Typedef: c_uint = 1; -pub const CXIdxEntity_Function: c_uint = 2; -pub const CXIdxEntity_Variable: c_uint = 3; -pub const CXIdxEntity_Field: c_uint = 4; -pub const CXIdxEntity_EnumConstant: c_uint = 5; -pub const CXIdxEntity_ObjCClass: c_uint = 6; -pub const CXIdxEntity_ObjCProtocol: c_uint = 7; -pub const CXIdxEntity_ObjCCategory: c_uint = 8; -pub const CXIdxEntity_ObjCInstanceMethod: c_uint = 9; -pub const CXIdxEntity_ObjCClassMethod: c_uint = 10; -pub const CXIdxEntity_ObjCProperty: c_uint = 11; -pub const CXIdxEntity_ObjCIvar: c_uint = 12; -pub const CXIdxEntity_Enum: c_uint = 13; -pub const CXIdxEntity_Struct: c_uint = 14; -pub const CXIdxEntity_Union: c_uint = 15; -pub const CXIdxEntity_CXXClass: c_uint = 16; -pub const CXIdxEntity_CXXNamespace: c_uint = 17; -pub const CXIdxEntity_CXXNamespaceAlias: c_uint = 18; -pub const CXIdxEntity_CXXStaticVariable: c_uint = 19; -pub const CXIdxEntity_CXXStaticMethod: c_uint = 20; -pub const CXIdxEntity_CXXInstanceMethod: c_uint = 21; -pub const CXIdxEntity_CXXConstructor: c_uint = 22; -pub const CXIdxEntity_CXXDestructor: c_uint = 23; -pub const CXIdxEntity_CXXConversionFunction: c_uint = 24; -pub const CXIdxEntity_CXXTypeAlias: c_uint = 25; -pub const CXIdxEntity_CXXInterface: c_uint = 26; -pub type CXIdxEntityLanguage = c_uint; -pub const CXIdxEntityLang_None: c_uint = 0; -pub const CXIdxEntityLang_C: c_uint = 1; -pub const CXIdxEntityLang_ObjC: c_uint = 2; -pub const CXIdxEntityLang_CXX: c_uint = 3; -pub type CXIdxEntityCXXTemplateKind = c_uint; -pub const CXIdxEntity_NonTemplate: c_uint = 0; -pub const CXIdxEntity_Template: c_uint = 1; -pub const CXIdxEntity_TemplatePartialSpecialization: c_uint = 2; -pub const CXIdxEntity_TemplateSpecialization: c_uint = 3; -pub type CXIdxAttrKind = c_uint; -pub const CXIdxAttr_Unexposed: c_uint = 0; -pub const CXIdxAttr_IBAction: c_uint = 1; -pub const CXIdxAttr_IBOutlet: c_uint = 2; -pub const CXIdxAttr_IBOutletCollection: c_uint = 3; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxAttrInfo { - pub kind: CXIdxAttrKind, - pub cursor: CXCursor, - pub loc: CXIdxLoc, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxEntityInfo { - pub kind: CXIdxEntityKind, - pub templateKind: CXIdxEntityCXXTemplateKind, - pub lang: CXIdxEntityLanguage, - pub name: *const c_char, - pub USR: *const c_char, - pub cursor: CXCursor, - pub attributes: *const *const CXIdxAttrInfo, - pub numAttributes: c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxContainerInfo { - pub cursor: CXCursor, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxIBOutletCollectionAttrInfo { - pub attrInfo: *const CXIdxAttrInfo, - pub objcClass: *const CXIdxEntityInfo, - pub classCursor: CXCursor, - pub classLoc: CXIdxLoc, -} -pub type CXIdxDeclInfoFlags = c_uint; -pub const CXIdxDeclFlag_Skipped: c_uint = 1; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxDeclInfo { - pub entityInfo: *const CXIdxEntityInfo, - pub cursor: CXCursor, - pub loc: CXIdxLoc, - pub semanticContainer: *const CXIdxContainerInfo, - pub lexicalContainer: *const CXIdxContainerInfo, - pub isRedeclaration: c_int, - pub isDefinition: c_int, - pub isContainer: c_int, - pub declAsContainer: *const CXIdxContainerInfo, - pub isImplicit: c_int, - pub attributes: *const *const CXIdxAttrInfo, - pub numAttributes: c_uint, - pub flags: c_uint, -} -pub type CXIdxObjCContainerKind = c_uint; -pub const CXIdxObjCContainer_ForwardRef: c_uint = 0; -pub const CXIdxObjCContainer_Interface: c_uint = 1; -pub const CXIdxObjCContainer_Implementation: c_uint = 2; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxObjCContainerDeclInfo { - pub declInfo: *const CXIdxDeclInfo, - pub kind: CXIdxObjCContainerKind, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxBaseClassInfo { - pub base: *const CXIdxEntityInfo, - pub cursor: CXCursor, - pub loc: CXIdxLoc, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxObjCProtocolRefInfo { - pub protocol: *const CXIdxEntityInfo, - pub cursor: CXCursor, - pub loc: CXIdxLoc, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxObjCProtocolRefListInfo { - pub protocols: *const *const CXIdxObjCProtocolRefInfo, - pub numProtocols: c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxObjCInterfaceDeclInfo { - pub containerInfo: *const CXIdxObjCContainerDeclInfo, - pub superInfo: *const CXIdxBaseClassInfo, - pub protocols: *const CXIdxObjCProtocolRefListInfo, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxObjCCategoryDeclInfo { - pub containerInfo: *const CXIdxObjCContainerDeclInfo, - pub objcClass: *const CXIdxEntityInfo, - pub classCursor: CXCursor, - pub classLoc: CXIdxLoc, - pub protocols: *const CXIdxObjCProtocolRefListInfo, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxObjCPropertyDeclInfo { - pub declInfo: *const CXIdxDeclInfo, - pub getter: *const CXIdxEntityInfo, - pub setter: *const CXIdxEntityInfo, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxCXXClassDeclInfo { - pub declInfo: *const CXIdxDeclInfo, - pub bases: *const *const CXIdxBaseClassInfo, - pub numBases: c_uint, -} -pub type CXIdxEntityRefKind = c_uint; -pub const CXIdxEntityRef_Direct: c_uint = 1; -pub const CXIdxEntityRef_Implicit: c_uint = 2; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct CXIdxEntityRefInfo { - pub kind: CXIdxEntityRefKind, - pub cursor: CXCursor, - pub loc: CXIdxLoc, - pub referencedEntity: *const CXIdxEntityInfo, - pub parentEntity: *const CXIdxEntityInfo, - pub container: *const CXIdxContainerInfo, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct IndexerCallbacks { - pub abortQuery: ::std::option::Option c_int>, - pub diagnostic: ::std::option::Option, - pub enteredMainFile: ::std::option::Option CXIdxClientFile>, - pub ppIncludedFile: ::std::option::Option CXIdxClientFile>, - pub importedASTFile: ::std::option::Option CXIdxClientASTFile>, - pub startedTranslationUnit: ::std::option::Option - CXIdxClientContainer>, - pub indexDeclaration: ::std::option::Option, - pub indexEntityReference: ::std::option::Option, -} -pub type CXIndexAction = *mut c_void; -pub type CXIndexOptFlags = c_uint; -pub const CXIndexOpt_None: c_uint = 0; -pub const CXIndexOpt_SuppressRedundantRefs: c_uint = 1; -pub const CXIndexOpt_IndexFunctionLocalSymbols: c_uint = 2; -pub const CXIndexOpt_IndexImplicitTemplateInstantiations: c_uint = 4; -pub const CXIndexOpt_SuppressWarnings: c_uint = 8; -pub const CXIndexOpt_SkipParsedBodiesInSession: c_uint = 16; -extern "C" { - pub fn clang_getCString(string: CXString) -> *const c_char; - pub fn clang_disposeString(string: CXString); - pub fn clang_createIndex(excludeDeclarationsFromPCH: c_int, - displayDiagnostics: c_int) -> CXIndex; - pub fn clang_disposeIndex(index: CXIndex); - pub fn clang_CXIndex_setGlobalOptions(arg1: CXIndex, - options: c_uint); - pub fn clang_CXIndex_getGlobalOptions(arg1: CXIndex) -> c_uint; - pub fn clang_getFileName(SFile: CXFile) -> CXString; - pub fn clang_getFileTime(SFile: CXFile) -> ::libc::time_t; - pub fn clang_getFileUniqueID(file: CXFile, outID: *mut CXFileUniqueID) -> - c_int; - pub fn clang_isFileMultipleIncludeGuarded(tu: CXTranslationUnit, - file: CXFile) -> c_uint; - pub fn clang_getFile(tu: CXTranslationUnit, - file_name: *const c_char) -> CXFile; - pub fn clang_getNullLocation() -> CXSourceLocation; - pub fn clang_equalLocations(loc1: CXSourceLocation, - loc2: CXSourceLocation) -> c_uint; - pub fn clang_getLocation(tu: CXTranslationUnit, file: CXFile, - line: c_uint, column: c_uint) -> - CXSourceLocation; - pub fn clang_getLocationForOffset(tu: CXTranslationUnit, file: CXFile, - offset: c_uint) -> - CXSourceLocation; - pub fn clang_Location_isInSystemHeader(location: CXSourceLocation) -> - c_int; - pub fn clang_Location_isFromMainFile(location: CXSourceLocation) -> - c_int; - pub fn clang_getNullRange() -> CXSourceRange; - pub fn clang_getRange(begin: CXSourceLocation, end: CXSourceLocation) -> - CXSourceRange; - pub fn clang_equalRanges(range1: CXSourceRange, range2: CXSourceRange) -> - c_uint; - pub fn clang_Range_isNull(range: CXSourceRange) -> c_int; - pub fn clang_getExpansionLocation(location: CXSourceLocation, - file: *mut CXFile, - line: *mut c_uint, - column: *mut c_uint, - offset: *mut c_uint); - pub fn clang_getPresumedLocation(location: CXSourceLocation, - filename: *mut CXString, - line: *mut c_uint, - column: *mut c_uint); - pub fn clang_getInstantiationLocation(location: CXSourceLocation, - file: *mut CXFile, - line: *mut c_uint, - column: *mut c_uint, - offset: *mut c_uint); - pub fn clang_getSpellingLocation(location: CXSourceLocation, - file: *mut CXFile, - line: *mut c_uint, - column: *mut c_uint, - offset: *mut c_uint); - pub fn clang_getFileLocation(location: CXSourceLocation, - file: *mut CXFile, line: *mut c_uint, - column: *mut c_uint, - offset: *mut c_uint); - pub fn clang_getRangeStart(range: CXSourceRange) -> CXSourceLocation; - pub fn clang_getRangeEnd(range: CXSourceRange) -> CXSourceLocation; - pub fn clang_getNumDiagnosticsInSet(Diags: CXDiagnosticSet) -> - c_uint; - pub fn clang_getDiagnosticInSet(Diags: CXDiagnosticSet, - Index: c_uint) -> CXDiagnostic; - pub fn clang_loadDiagnostics(file: *const c_char, - error: *mut Enum_CXLoadDiag_Error, - errorString: *mut CXString) -> - CXDiagnosticSet; - pub fn clang_disposeDiagnosticSet(Diags: CXDiagnosticSet); - pub fn clang_getChildDiagnostics(D: CXDiagnostic) -> CXDiagnosticSet; - pub fn clang_getNumDiagnostics(Unit: CXTranslationUnit) -> c_uint; - pub fn clang_getDiagnostic(Unit: CXTranslationUnit, Index: c_uint) - -> CXDiagnostic; - pub fn clang_getDiagnosticSetFromTU(Unit: CXTranslationUnit) -> - CXDiagnosticSet; - pub fn clang_disposeDiagnostic(Diagnostic: CXDiagnostic); - pub fn clang_formatDiagnostic(Diagnostic: CXDiagnostic, - Options: c_uint) -> CXString; - pub fn clang_defaultDiagnosticDisplayOptions() -> c_uint; - pub fn clang_getDiagnosticSeverity(arg1: CXDiagnostic) -> - Enum_CXDiagnosticSeverity; - pub fn clang_getDiagnosticLocation(arg1: CXDiagnostic) -> - CXSourceLocation; - pub fn clang_getDiagnosticSpelling(arg1: CXDiagnostic) -> CXString; - pub fn clang_getDiagnosticOption(Diag: CXDiagnostic, - Disable: *mut CXString) -> CXString; - pub fn clang_getDiagnosticCategory(arg1: CXDiagnostic) -> c_uint; - pub fn clang_getDiagnosticCategoryName(Category: c_uint) -> - CXString; - pub fn clang_getDiagnosticCategoryText(arg1: CXDiagnostic) -> CXString; - pub fn clang_getDiagnosticNumRanges(arg1: CXDiagnostic) -> c_uint; - pub fn clang_getDiagnosticRange(Diagnostic: CXDiagnostic, - Range: c_uint) -> CXSourceRange; - pub fn clang_getDiagnosticNumFixIts(Diagnostic: CXDiagnostic) -> - c_uint; - pub fn clang_getDiagnosticFixIt(Diagnostic: CXDiagnostic, - FixIt: c_uint, - ReplacementRange: *mut CXSourceRange) -> - CXString; - pub fn clang_getTranslationUnitSpelling(CTUnit: CXTranslationUnit) -> - CXString; - pub fn clang_createTranslationUnitFromSourceFile(CIdx: CXIndex, - source_filename: - *const c_char, - num_clang_command_line_args: - c_int, - clang_command_line_args: - *const *const c_char, - num_unsaved_files: - c_uint, - unsaved_files: - *mut Struct_CXUnsavedFile) - -> CXTranslationUnit; - pub fn clang_createTranslationUnit(arg1: CXIndex, - ast_filename: *const c_char) -> - CXTranslationUnit; - pub fn clang_defaultEditingTranslationUnitOptions() -> c_uint; - pub fn clang_parseTranslationUnit(CIdx: CXIndex, - source_filename: *const c_char, - command_line_args: - *const *const c_char, - num_command_line_args: c_int, - unsaved_files: - *mut Struct_CXUnsavedFile, - num_unsaved_files: c_uint, - options: c_uint) -> - CXTranslationUnit; - pub fn clang_defaultSaveOptions(TU: CXTranslationUnit) -> c_uint; - pub fn clang_saveTranslationUnit(TU: CXTranslationUnit, - FileName: *const c_char, - options: c_uint) -> - c_int; - pub fn clang_disposeTranslationUnit(arg1: CXTranslationUnit); - pub fn clang_defaultReparseOptions(TU: CXTranslationUnit) -> - c_uint; - pub fn clang_reparseTranslationUnit(TU: CXTranslationUnit, - num_unsaved_files: c_uint, - unsaved_files: - *mut Struct_CXUnsavedFile, - options: c_uint) -> - c_int; - pub fn clang_getTUResourceUsageName(kind: Enum_CXTUResourceUsageKind) -> - *const c_char; - pub fn clang_getCXTUResourceUsage(TU: CXTranslationUnit) -> - CXTUResourceUsage; - pub fn clang_disposeCXTUResourceUsage(usage: CXTUResourceUsage); - pub fn clang_getNullCursor() -> CXCursor; - pub fn clang_getTranslationUnitCursor(arg1: CXTranslationUnit) -> - CXCursor; - pub fn clang_equalCursors(arg1: CXCursor, arg2: CXCursor) -> - c_uint; - pub fn clang_Cursor_isNull(cursor: CXCursor) -> c_int; - pub fn clang_hashCursor(arg1: CXCursor) -> c_uint; - pub fn clang_getCursorKind(arg1: CXCursor) -> Enum_CXCursorKind; - pub fn clang_isDeclaration(arg1: Enum_CXCursorKind) -> c_uint; - pub fn clang_isReference(arg1: Enum_CXCursorKind) -> c_uint; - pub fn clang_isExpression(arg1: Enum_CXCursorKind) -> c_uint; - pub fn clang_isStatement(arg1: Enum_CXCursorKind) -> c_uint; - pub fn clang_isAttribute(arg1: Enum_CXCursorKind) -> c_uint; - pub fn clang_isInvalid(arg1: Enum_CXCursorKind) -> c_uint; - pub fn clang_isTranslationUnit(arg1: Enum_CXCursorKind) -> c_uint; - pub fn clang_isPreprocessing(arg1: Enum_CXCursorKind) -> c_uint; - pub fn clang_isUnexposed(arg1: Enum_CXCursorKind) -> c_uint; - pub fn clang_getCursorLinkage(cursor: CXCursor) -> Enum_CXLinkageKind; - pub fn clang_getCursorVisibility(cursor: CXCursor) -> Enum_CXVisibilityKind; - pub fn clang_getCursorAvailability(cursor: CXCursor) -> - Enum_CXAvailabilityKind; - pub fn clang_getCursorPlatformAvailability(cursor: CXCursor, - always_deprecated: - *mut c_int, - deprecated_message: - *mut CXString, - always_unavailable: - *mut c_int, - unavailable_message: - *mut CXString, - availability: - *mut CXPlatformAvailability, - availability_size: - c_int) -> - c_int; - pub fn clang_disposeCXPlatformAvailability(availability: - *mut CXPlatformAvailability); - pub fn clang_getCursorLanguage(cursor: CXCursor) -> Enum_CXLanguageKind; - pub fn clang_Cursor_getTranslationUnit(arg1: CXCursor) -> - CXTranslationUnit; - pub fn clang_createCXCursorSet() -> CXCursorSet; - pub fn clang_disposeCXCursorSet(cset: CXCursorSet); - pub fn clang_CXCursorSet_contains(cset: CXCursorSet, cursor: CXCursor) -> - c_uint; - pub fn clang_CXCursorSet_insert(cset: CXCursorSet, cursor: CXCursor) -> - c_uint; - pub fn clang_getCursorSemanticParent(cursor: CXCursor) -> CXCursor; - pub fn clang_getCursorLexicalParent(cursor: CXCursor) -> CXCursor; - pub fn clang_getOverriddenCursors(cursor: CXCursor, - overridden: *mut *mut CXCursor, - num_overridden: *mut c_uint); - pub fn clang_disposeOverriddenCursors(overridden: *mut CXCursor); - pub fn clang_getIncludedFile(cursor: CXCursor) -> CXFile; - pub fn clang_getCursor(arg1: CXTranslationUnit, arg2: CXSourceLocation) -> - CXCursor; - pub fn clang_getCursorLocation(arg1: CXCursor) -> CXSourceLocation; - pub fn clang_getCursorExtent(arg1: CXCursor) -> CXSourceRange; - pub fn clang_getCursorType(C: CXCursor) -> CXType; - pub fn clang_getTypeSpelling(CT: CXType) -> CXString; - pub fn clang_getTypedefDeclUnderlyingType(C: CXCursor) -> CXType; - pub fn clang_getEnumDeclIntegerType(C: CXCursor) -> CXType; - pub fn clang_getEnumConstantDeclValue(C: CXCursor) -> c_longlong; - pub fn clang_getEnumConstantDeclUnsignedValue(C: CXCursor) -> - c_ulonglong; - pub fn clang_getFieldDeclBitWidth(C: CXCursor) -> c_int; - pub fn clang_Cursor_getNumArguments(C: CXCursor) -> c_int; - pub fn clang_Cursor_getArgument(C: CXCursor, i: c_uint) -> - CXCursor; - pub fn clang_Cursor_getNumTemplateArguments(T: CXCursor) -> c_int; - pub fn clang_Cursor_getTemplateArgumentKind(C: CXCursor, i: c_uint) -> - CXTemplateArgumentKind; - pub fn clang_Cursor_getTemplateArgumentValue(C: CXCursor, i: c_uint) -> - c_longlong; - pub fn clang_Cursor_getTemplateArgumentUnsignedValue(C: CXCursor, i: c_uint) -> - c_ulonglong; - pub fn clang_equalTypes(A: CXType, B: CXType) -> c_uint; - pub fn clang_getCanonicalType(T: CXType) -> CXType; - pub fn clang_isConstQualifiedType(T: CXType) -> c_uint; - pub fn clang_isVolatileQualifiedType(T: CXType) -> c_uint; - pub fn clang_isRestrictQualifiedType(T: CXType) -> c_uint; - pub fn clang_getPointeeType(T: CXType) -> CXType; - pub fn clang_getTypeDeclaration(T: CXType) -> CXCursor; - pub fn clang_getDeclObjCTypeEncoding(C: CXCursor) -> CXString; - pub fn clang_getTypeKindSpelling(K: Enum_CXTypeKind) -> CXString; - pub fn clang_getFunctionTypeCallingConv(T: CXType) -> Enum_CXCallingConv; - pub fn clang_getResultType(T: CXType) -> CXType; - pub fn clang_getNumArgTypes(T: CXType) -> c_int; - pub fn clang_getArgType(T: CXType, i: c_uint) -> CXType; - pub fn clang_isFunctionTypeVariadic(T: CXType) -> c_uint; - pub fn clang_getCursorResultType(C: CXCursor) -> CXType; - pub fn clang_isPODType(T: CXType) -> c_uint; - pub fn clang_getElementType(T: CXType) -> CXType; - pub fn clang_getNumElements(T: CXType) -> c_longlong; - pub fn clang_getArrayElementType(T: CXType) -> CXType; - pub fn clang_getArraySize(T: CXType) -> c_longlong; - pub fn clang_Type_getAlignOf(T: CXType) -> c_longlong; - pub fn clang_Type_getClassType(T: CXType) -> CXType; - pub fn clang_Type_getSizeOf(T: CXType) -> c_longlong; - pub fn clang_Type_getOffsetOf(T: CXType, S: *const c_char) -> - c_longlong; - pub fn clang_Type_getCXXRefQualifier(T: CXType) -> - Enum_CXRefQualifierKind; - pub fn clang_Type_getNumTemplateArguments(T: CXType) -> c_int; - pub fn clang_Type_getTemplateArgumentAsType(T: CXType, i: c_int) -> - CXType; - #[cfg(not(feature="llvm_stable"))] - pub fn clang_Type_getNamedType(CT: CXType) -> CXType; - pub fn clang_Cursor_isBitField(C: CXCursor) -> c_uint; - #[cfg(not(feature="llvm_stable"))] - pub fn clang_Cursor_isFunctionInlined(C: CXCursor) -> c_uint; - pub fn clang_isVirtualBase(arg1: CXCursor) -> c_uint; - pub fn clang_getCXXAccessSpecifier(arg1: CXCursor) -> - Enum_CX_CXXAccessSpecifier; - pub fn clang_getNumOverloadedDecls(cursor: CXCursor) -> c_uint; - pub fn clang_getOverloadedDecl(cursor: CXCursor, index: c_uint) -> - CXCursor; - pub fn clang_getIBOutletCollectionType(arg1: CXCursor) -> CXType; - pub fn clang_visitChildren(parent: CXCursor, visitor: CXCursorVisitor, - client_data: CXClientData) -> c_uint; - pub fn clang_getCursorUSR(arg1: CXCursor) -> CXString; - pub fn clang_constructUSR_ObjCClass(class_name: *const c_char) -> - CXString; - pub fn clang_constructUSR_ObjCCategory(class_name: *const c_char, - category_name: - *const c_char) -> - CXString; - pub fn clang_constructUSR_ObjCProtocol(protocol_name: - *const c_char) -> - CXString; - pub fn clang_constructUSR_ObjCIvar(name: *const c_char, - classUSR: CXString) -> CXString; - pub fn clang_constructUSR_ObjCMethod(name: *const c_char, - isInstanceMethod: c_uint, - classUSR: CXString) -> CXString; - pub fn clang_constructUSR_ObjCProperty(property: *const c_char, - classUSR: CXString) -> CXString; - pub fn clang_getCursorSpelling(arg1: CXCursor) -> CXString; - pub fn clang_Cursor_getSpellingNameRange(arg1: CXCursor, - pieceIndex: c_uint, - options: c_uint) -> - CXSourceRange; - pub fn clang_Cursor_getOffsetOfField(C: CXCursor) -> c_longlong; - pub fn clang_getCursorDisplayName(arg1: CXCursor) -> CXString; - pub fn clang_getCursorReferenced(arg1: CXCursor) -> CXCursor; - pub fn clang_getCursorDefinition(arg1: CXCursor) -> CXCursor; - pub fn clang_isCursorDefinition(arg1: CXCursor) -> c_uint; - pub fn clang_getCanonicalCursor(arg1: CXCursor) -> CXCursor; - pub fn clang_Cursor_getObjCSelectorIndex(arg1: CXCursor) -> c_int; - pub fn clang_Cursor_isDynamicCall(C: CXCursor) -> c_int; - pub fn clang_Cursor_getReceiverType(C: CXCursor) -> CXType; - pub fn clang_Cursor_getObjCPropertyAttributes(C: CXCursor, - reserved: c_uint) -> - c_uint; - pub fn clang_Cursor_getObjCDeclQualifiers(C: CXCursor) -> c_uint; - pub fn clang_Cursor_isObjCOptional(C: CXCursor) -> c_uint; - pub fn clang_Cursor_isVariadic(C: CXCursor) -> c_uint; - pub fn clang_Cursor_getCommentRange(C: CXCursor) -> CXSourceRange; - pub fn clang_Cursor_getRawCommentText(C: CXCursor) -> CXString; - pub fn clang_Cursor_getBriefCommentText(C: CXCursor) -> CXString; - pub fn clang_Cursor_getMangling(C: CXCursor) -> CXString; - pub fn clang_Cursor_getParsedComment(C: CXCursor) -> CXComment; - pub fn clang_Cursor_getModule(C: CXCursor) -> CXModule; - pub fn clang_Cursor_isAnonymous(C: CXCursor) -> c_uint; - pub fn clang_Module_getASTFile(Module: CXModule) -> CXFile; - pub fn clang_Module_getParent(Module: CXModule) -> CXModule; - pub fn clang_Module_getName(Module: CXModule) -> CXString; - pub fn clang_Module_getFullName(Module: CXModule) -> CXString; - pub fn clang_Module_getNumTopLevelHeaders(arg1: CXTranslationUnit, - Module: CXModule) -> - c_uint; - pub fn clang_Module_getTopLevelHeader(arg1: CXTranslationUnit, - Module: CXModule, - Index: c_uint) -> CXFile; - pub fn clang_Comment_getKind(Comment: CXComment) -> Enum_CXCommentKind; - pub fn clang_Comment_getNumChildren(Comment: CXComment) -> c_uint; - pub fn clang_Comment_getChild(Comment: CXComment, - ChildIdx: c_uint) -> CXComment; - pub fn clang_Comment_isWhitespace(Comment: CXComment) -> c_uint; - pub fn clang_InlineContentComment_hasTrailingNewline(Comment: CXComment) - -> c_uint; - pub fn clang_TextComment_getText(Comment: CXComment) -> CXString; - pub fn clang_InlineCommandComment_getCommandName(Comment: CXComment) -> - CXString; - pub fn clang_InlineCommandComment_getRenderKind(Comment: CXComment) -> - Enum_CXCommentInlineCommandRenderKind; - pub fn clang_InlineCommandComment_getNumArgs(Comment: CXComment) -> - c_uint; - pub fn clang_InlineCommandComment_getArgText(Comment: CXComment, - ArgIdx: c_uint) -> - CXString; - pub fn clang_HTMLTagComment_getTagName(Comment: CXComment) -> CXString; - pub fn clang_HTMLStartTagComment_isSelfClosing(Comment: CXComment) -> - c_uint; - pub fn clang_HTMLStartTag_getNumAttrs(Comment: CXComment) -> - c_uint; - pub fn clang_HTMLStartTag_getAttrName(Comment: CXComment, - AttrIdx: c_uint) -> - CXString; - pub fn clang_HTMLStartTag_getAttrValue(Comment: CXComment, - AttrIdx: c_uint) -> - CXString; - pub fn clang_BlockCommandComment_getCommandName(Comment: CXComment) -> - CXString; - pub fn clang_BlockCommandComment_getNumArgs(Comment: CXComment) -> - c_uint; - pub fn clang_BlockCommandComment_getArgText(Comment: CXComment, - ArgIdx: c_uint) -> - CXString; - pub fn clang_BlockCommandComment_getParagraph(Comment: CXComment) -> - CXComment; - pub fn clang_ParamCommandComment_getParamName(Comment: CXComment) -> - CXString; - pub fn clang_ParamCommandComment_isParamIndexValid(Comment: CXComment) -> - c_uint; - pub fn clang_ParamCommandComment_getParamIndex(Comment: CXComment) -> - c_uint; - pub fn clang_ParamCommandComment_isDirectionExplicit(Comment: CXComment) - -> c_uint; - pub fn clang_ParamCommandComment_getDirection(Comment: CXComment) -> - Enum_CXCommentParamPassDirection; - pub fn clang_TParamCommandComment_getParamName(Comment: CXComment) -> - CXString; - pub fn clang_TParamCommandComment_isParamPositionValid(Comment: CXComment) - -> c_uint; - pub fn clang_TParamCommandComment_getDepth(Comment: CXComment) -> - c_uint; - pub fn clang_TParamCommandComment_getIndex(Comment: CXComment, - Depth: c_uint) -> - c_uint; - pub fn clang_VerbatimBlockLineComment_getText(Comment: CXComment) -> - CXString; - pub fn clang_VerbatimLineComment_getText(Comment: CXComment) -> CXString; - pub fn clang_HTMLTagComment_getAsString(Comment: CXComment) -> CXString; - pub fn clang_FullComment_getAsHTML(Comment: CXComment) -> CXString; - pub fn clang_FullComment_getAsXML(Comment: CXComment) -> CXString; - pub fn clang_CXXMethod_isPureVirtual(C: CXCursor) -> c_uint; - pub fn clang_CXXMethod_isConst(C: CXCursor) -> c_uint; - pub fn clang_CXXMethod_isStatic(C: CXCursor) -> c_uint; - pub fn clang_CXXMethod_isVirtual(C: CXCursor) -> c_uint; - pub fn clang_CXXField_isMutable(C: CXCursor) -> c_uint; - pub fn clang_getTemplateCursorKind(C: CXCursor) -> Enum_CXCursorKind; - pub fn clang_getSpecializedCursorTemplate(C: CXCursor) -> CXCursor; - pub fn clang_getCursorReferenceNameRange(C: CXCursor, - NameFlags: c_uint, - PieceIndex: c_uint) -> - CXSourceRange; - pub fn clang_getTokenKind(arg1: CXToken) -> CXTokenKind; - pub fn clang_getTokenSpelling(arg1: CXTranslationUnit, arg2: CXToken) -> - CXString; - pub fn clang_getTokenLocation(arg1: CXTranslationUnit, arg2: CXToken) -> - CXSourceLocation; - pub fn clang_getTokenExtent(arg1: CXTranslationUnit, arg2: CXToken) -> - CXSourceRange; - pub fn clang_tokenize(TU: CXTranslationUnit, Range: CXSourceRange, - Tokens: *mut *mut CXToken, - NumTokens: *mut c_uint); - pub fn clang_annotateTokens(TU: CXTranslationUnit, Tokens: *mut CXToken, - NumTokens: c_uint, - Cursors: *mut CXCursor); - pub fn clang_disposeTokens(TU: CXTranslationUnit, Tokens: *mut CXToken, - NumTokens: c_uint); - pub fn clang_getCursorKindSpelling(Kind: Enum_CXCursorKind) -> CXString; - pub fn clang_getDefinitionSpellingAndExtent(arg1: CXCursor, - startBuf: - *mut *const c_char, - endBuf: - *mut *const c_char, - startLine: - *mut c_uint, - startColumn: - *mut c_uint, - endLine: *mut c_uint, - endColumn: - *mut c_uint); - pub fn clang_enableStackTraces(); - pub fn clang_executeOnThread(_fn: - ::std::option::Option, - user_data: *mut c_void, - stack_size: c_uint); - pub fn clang_getCompletionChunkKind(completion_string: CXCompletionString, - chunk_number: c_uint) -> - Enum_CXCompletionChunkKind; - pub fn clang_getCompletionChunkText(completion_string: CXCompletionString, - chunk_number: c_uint) -> - CXString; - pub fn clang_getCompletionChunkCompletionString(completion_string: - CXCompletionString, - chunk_number: - c_uint) -> - CXCompletionString; - pub fn clang_getNumCompletionChunks(completion_string: CXCompletionString) - -> c_uint; - pub fn clang_getCompletionPriority(completion_string: CXCompletionString) - -> c_uint; - pub fn clang_getCompletionAvailability(completion_string: - CXCompletionString) -> - Enum_CXAvailabilityKind; - pub fn clang_getCompletionNumAnnotations(completion_string: - CXCompletionString) -> - c_uint; - pub fn clang_getCompletionAnnotation(completion_string: - CXCompletionString, - annotation_number: c_uint) -> - CXString; - pub fn clang_getCompletionParent(completion_string: CXCompletionString, - kind: *mut Enum_CXCursorKind) -> - CXString; - pub fn clang_getCompletionBriefComment(completion_string: - CXCompletionString) -> - CXString; - pub fn clang_getCursorCompletionString(cursor: CXCursor) -> - CXCompletionString; - pub fn clang_defaultCodeCompleteOptions() -> c_uint; - pub fn clang_codeCompleteAt(TU: CXTranslationUnit, - complete_filename: *const c_char, - complete_line: c_uint, - complete_column: c_uint, - unsaved_files: *mut Struct_CXUnsavedFile, - num_unsaved_files: c_uint, - options: c_uint) -> - *mut CXCodeCompleteResults; - pub fn clang_sortCodeCompletionResults(Results: *mut CXCompletionResult, - NumResults: c_uint); - pub fn clang_disposeCodeCompleteResults(Results: - *mut CXCodeCompleteResults); - pub fn clang_codeCompleteGetNumDiagnostics(Results: - *mut CXCodeCompleteResults) - -> c_uint; - pub fn clang_codeCompleteGetDiagnostic(Results: - *mut CXCodeCompleteResults, - Index: c_uint) -> - CXDiagnostic; - pub fn clang_codeCompleteGetContexts(Results: *mut CXCodeCompleteResults) - -> c_ulonglong; - pub fn clang_codeCompleteGetContainerKind(Results: - *mut CXCodeCompleteResults, - IsIncomplete: - *mut c_uint) -> - Enum_CXCursorKind; - pub fn clang_codeCompleteGetContainerUSR(Results: - *mut CXCodeCompleteResults) - -> CXString; - pub fn clang_codeCompleteGetObjCSelector(Results: - *mut CXCodeCompleteResults) - -> CXString; - pub fn clang_getClangVersion() -> CXString; - pub fn clang_toggleCrashRecovery(isEnabled: c_uint); - pub fn clang_getInclusions(tu: CXTranslationUnit, - visitor: CXInclusionVisitor, - client_data: CXClientData); - pub fn clang_getRemappings(path: *const c_char) -> CXRemapping; - pub fn clang_getRemappingsFromFileList(filePaths: - *mut *const c_char, - numFiles: c_uint) -> - CXRemapping; - pub fn clang_remap_getNumFiles(arg1: CXRemapping) -> c_uint; - pub fn clang_remap_getFilenames(arg1: CXRemapping, index: c_uint, - original: *mut CXString, - transformed: *mut CXString); - pub fn clang_remap_dispose(arg1: CXRemapping); - pub fn clang_findReferencesInFile(cursor: CXCursor, file: CXFile, - visitor: CXCursorAndRangeVisitor) -> - CXResult; - pub fn clang_findIncludesInFile(TU: CXTranslationUnit, file: CXFile, - visitor: CXCursorAndRangeVisitor) -> - CXResult; - pub fn clang_index_isEntityObjCContainerKind(arg1: CXIdxEntityKind) -> - c_int; - pub fn clang_index_getObjCContainerDeclInfo(arg1: *const CXIdxDeclInfo) -> - *const CXIdxObjCContainerDeclInfo; - pub fn clang_index_getObjCInterfaceDeclInfo(arg1: *const CXIdxDeclInfo) -> - *const CXIdxObjCInterfaceDeclInfo; - pub fn clang_index_getObjCCategoryDeclInfo(arg1: *const CXIdxDeclInfo) -> - *const CXIdxObjCCategoryDeclInfo; - pub fn clang_index_getObjCProtocolRefListInfo(arg1: *const CXIdxDeclInfo) - -> *const CXIdxObjCProtocolRefListInfo; - pub fn clang_index_getObjCPropertyDeclInfo(arg1: *const CXIdxDeclInfo) -> - *const CXIdxObjCPropertyDeclInfo; - pub fn clang_index_getIBOutletCollectionAttrInfo(arg1: - *const CXIdxAttrInfo) - -> *const CXIdxIBOutletCollectionAttrInfo; - pub fn clang_index_getCXXClassDeclInfo(arg1: *const CXIdxDeclInfo) -> - *const CXIdxCXXClassDeclInfo; - pub fn clang_index_getClientContainer(arg1: *const CXIdxContainerInfo) -> - CXIdxClientContainer; - pub fn clang_index_setClientContainer(arg1: *const CXIdxContainerInfo, - arg2: CXIdxClientContainer); - pub fn clang_index_getClientEntity(arg1: *const CXIdxEntityInfo) -> - CXIdxClientEntity; - pub fn clang_index_setClientEntity(arg1: *const CXIdxEntityInfo, - arg2: CXIdxClientEntity); - pub fn clang_IndexAction_create(CIdx: CXIndex) -> CXIndexAction; - pub fn clang_IndexAction_dispose(arg1: CXIndexAction); - pub fn clang_indexSourceFile(arg1: CXIndexAction, - client_data: CXClientData, - index_callbacks: *mut IndexerCallbacks, - index_callbacks_size: c_uint, - index_options: c_uint, - source_filename: *const c_char, - command_line_args: - *const *const c_char, - num_command_line_args: c_int, - unsaved_files: *mut Struct_CXUnsavedFile, - num_unsaved_files: c_uint, - out_TU: *mut CXTranslationUnit, - TU_options: c_uint) -> c_int; - pub fn clang_indexTranslationUnit(arg1: CXIndexAction, - client_data: CXClientData, - index_callbacks: *mut IndexerCallbacks, - index_callbacks_size: c_uint, - index_options: c_uint, - arg2: CXTranslationUnit) -> - c_int; - pub fn clang_indexLoc_getFileLocation(loc: CXIdxLoc, - indexFile: *mut CXIdxClientFile, - file: *mut CXFile, - line: *mut c_uint, - column: *mut c_uint, - offset: *mut c_uint); - pub fn clang_indexLoc_getCXSourceLocation(loc: CXIdxLoc) -> - CXSourceLocation; - #[cfg(not(feature="llvm_stable"))] - pub fn clang_Cursor_Evaluate(C: CXCursor) -> CXEvalResult; - #[cfg(not(feature="llvm_stable"))] - pub fn clang_EvalResult_getKind(E: CXEvalResult) -> Enum_CXEvalResultKind; - #[cfg(not(feature="llvm_stable"))] - pub fn clang_EvalResult_getAsInt(E: CXEvalResult) -> c_int; - #[cfg(not(feature="llvm_stable"))] - pub fn clang_EvalResult_getAsDouble(E: CXEvalResult) -> c_double; - #[cfg(not(feature="llvm_stable"))] - pub fn clang_EvalResult_getAsStr(E: CXEvalResult) -> *const c_char; - #[cfg(not(feature="llvm_stable"))] - pub fn clang_EvalResult_dispose(E: CXEvalResult); -} diff --git a/libbindgen/src/ir/annotations.rs b/libbindgen/src/ir/annotations.rs index 948dbc96ba..968e2da187 100644 --- a/libbindgen/src/ir/annotations.rs +++ b/libbindgen/src/ir/annotations.rs @@ -126,7 +126,7 @@ impl Annotations { } fn parse(&mut self, comment: &clang::Comment, matched: &mut bool) { - use clangll::CXComment_HTMLStartTag; + use clang_sys::CXComment_HTMLStartTag; if comment.kind() == CXComment_HTMLStartTag && comment.get_tag_name() == "div" && comment.get_tag_attrs() diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index d2ace023eb..75b3467be7 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -470,7 +470,7 @@ impl CompInfo { location: Option, ctx: &mut BindgenContext) -> Result { - use clangll::*; + use clang_sys::*; // Sigh... For class templates we want the location, for // specialisations, we want the declaration... So just try both. // @@ -750,7 +750,7 @@ impl CompInfo { CXCursor_FunctionTemplate | CXCursor_ConversionFunction => {} _ => { - warn!("unhandled comp member `{}` (kind {}) in `{}` ({})", + warn!("unhandled comp member `{}` (kind {:?}) in `{}` ({})", cur.spelling(), cur.kind(), cursor.spelling(), @@ -770,7 +770,7 @@ impl CompInfo { fn kind_from_cursor(cursor: &clang::Cursor) -> Result { - use clangll::*; + use clang_sys::*; Ok(match cursor.kind() { CXCursor_UnionDecl => CompKind::Union, CXCursor_ClassDecl | diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 8be064b8ec..6069121c21 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -124,12 +124,12 @@ pub struct BindgenContext<'ctx> { impl<'ctx> BindgenContext<'ctx> { /// Construct the context for the given `options`. pub fn new(options: BindgenOptions) -> Self { - use clangll; + use clang_sys; let index = clang::Index::new(false, true); let parse_options = - clangll::CXTranslationUnit_DetailedPreprocessingRecord; + clang_sys::CXTranslationUnit_DetailedPreprocessingRecord; let translation_unit = clang::TranslationUnit::parse(&index, "", @@ -551,7 +551,7 @@ impl<'ctx> BindgenContext<'ctx> { location: clang::Cursor, declaration: clang::Cursor) -> ItemId { - use clangll::*; + use clang_sys::*; let mut args = vec![]; location.visit(|c| { if c.kind() == CXCursor_TypeRef { @@ -610,7 +610,7 @@ impl<'ctx> BindgenContext<'ctx> { } } else { assert_eq!(declaration.kind(), - ::clangll::CXCursor_TypeAliasTemplateDecl, + ::clang_sys::CXCursor_TypeAliasTemplateDecl, "Expected wrappable type"); } @@ -639,7 +639,7 @@ impl<'ctx> BindgenContext<'ctx> { ty: &clang::Type, location: Option) -> Option { - use clangll::{CXCursor_TypeAliasTemplateDecl, CXCursor_TypeRef}; + use clang_sys::{CXCursor_TypeAliasTemplateDecl, CXCursor_TypeRef}; debug!("builtin_or_resolved_ty: {:?}, {:?}, {:?}", ty, location, @@ -753,7 +753,7 @@ impl<'ctx> BindgenContext<'ctx> { ty: &clang::Type, _declaration: Cursor) -> Option { - use clangll::*; + use clang_sys::*; let type_kind = match ty.kind() { CXType_NullPtr => TypeKind::NullPtr, CXType_Void => TypeKind::Void, @@ -885,7 +885,7 @@ impl<'ctx> BindgenContext<'ctx> { /// Given a CXCursor_Namespace cursor, return the item id of the /// corresponding module, or create one on the fly. pub fn module(&mut self, cursor: clang::Cursor) -> ItemId { - use clangll::*; + use clang_sys::*; assert!(cursor.kind() == CXCursor_Namespace, "Be a nice person"); let cursor = cursor.canonical(); if let Some(id) = self.modules.get(&cursor) { diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index f728b22a2d..dc6a866519 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -43,7 +43,7 @@ impl Enum { pub fn from_ty(ty: &clang::Type, ctx: &mut BindgenContext) -> Result { - use clangll::*; + use clang_sys::*; if ty.kind() != CXType_Enum { return Err(ParseError::Continue); } diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs index 5a864cfc7b..df518ab1fe 100644 --- a/libbindgen/src/ir/function.rs +++ b/libbindgen/src/ir/function.rs @@ -1,7 +1,7 @@ //! Intermediate representation for C/C++ functions and methods. use clang; -use clangll::Enum_CXCallingConv; +use clang_sys::CXCallingConv; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use super::context::{BindgenContext, ItemId}; use super::item::Item; @@ -76,8 +76,8 @@ pub struct FunctionSig { abi: abi::Abi, } -fn get_abi(cc: Enum_CXCallingConv) -> abi::Abi { - use clangll::*; +fn get_abi(cc: CXCallingConv) -> abi::Abi { + use clang_sys::*; match cc { CXCallingConv_Default => abi::Abi::C, CXCallingConv_C => abi::Abi::C, @@ -85,7 +85,7 @@ fn get_abi(cc: Enum_CXCallingConv) -> abi::Abi { CXCallingConv_X86FastCall => abi::Abi::Fastcall, CXCallingConv_AAPCS => abi::Abi::Aapcs, CXCallingConv_X86_64Win64 => abi::Abi::Win64, - other => panic!("unsupported calling convention: {}", other), + other => panic!("unsupported calling convention: {:?}", other), } } @@ -131,7 +131,7 @@ impl FunctionSig { cursor: &clang::Cursor, ctx: &mut BindgenContext) -> Result { - use clangll::*; + use clang_sys::*; debug!("FunctionSig::from_ty {:?} {:?}", ty, cursor); // Don't parse operatorxx functions in C++ @@ -237,7 +237,7 @@ impl ClangSubItemParser for Function { fn parse(cursor: clang::Cursor, context: &mut BindgenContext) -> Result, ParseError> { - use clangll::*; + use clang_sys::*; match cursor.kind() { CXCursor_FunctionDecl | CXCursor_CXXMethod => {} diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 6601216eb9..47ece3eb06 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -1,7 +1,7 @@ //! Bindgen's core intermediate representation type. use clang; -use clangll; +use clang_sys; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use std::cell::{Cell, RefCell}; use std::fmt::Write; @@ -824,8 +824,8 @@ fn visit_child(cur: clang::Cursor, parent_id: Option, ctx: &mut BindgenContext, result: &mut Result) - -> clangll::Enum_CXChildVisitResult { - use clangll::*; + -> clang_sys::CXChildVisitResult { + use clang_sys::*; if result.is_ok() { return CXChildVisit_Break; } @@ -873,7 +873,7 @@ impl ClangItemParser for Item { use ir::function::Function; use ir::module::Module; use ir::var::Var; - use clangll::*; + use clang_sys::*; if !cursor.is_valid() { return Err(ParseError::Continue); @@ -1049,7 +1049,7 @@ impl ClangItemParser for Item { parent_id: Option, ctx: &mut BindgenContext) -> Result { - use clangll::*; + use clang_sys::*; let decl = { let decl = ty.declaration(); diff --git a/libbindgen/src/ir/module.rs b/libbindgen/src/ir/module.rs index 7546a63c7a..5fae3932ac 100644 --- a/libbindgen/src/ir/module.rs +++ b/libbindgen/src/ir/module.rs @@ -43,7 +43,7 @@ impl ClangSubItemParser for Module { fn parse(cursor: clang::Cursor, ctx: &mut BindgenContext) -> Result, ParseError> { - use clangll::*; + use clang_sys::*; match cursor.kind() { CXCursor_Namespace => { let module_id = ctx.module(cursor); diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 8b0116df40..dde2176e70 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -531,7 +531,7 @@ impl Type { parent_id: Option, ctx: &mut BindgenContext) -> Result, ParseError> { - use clangll::*; + use clang_sys::*; { let already_resolved = ctx.builtin_or_resolved_ty(potential_id, diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index b819bfa4ec..518141c64b 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -88,7 +88,7 @@ impl ClangSubItemParser for Var { fn parse(cursor: clang::Cursor, ctx: &mut BindgenContext) -> Result, ParseError> { - use clangll::*; + use clang_sys::*; use cexpr::expr::EvalResult; use cexpr::literal::CChar; match cursor.kind() { @@ -287,7 +287,7 @@ fn parse_int_literal_tokens(cursor: &clang::Cursor, fn get_integer_literal_from_cursor(cursor: &clang::Cursor, unit: &clang::TranslationUnit) -> Option { - use clangll::*; + use clang_sys::*; let mut value = None; cursor.visit(|c| { match c.kind() { diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 29580f3682..ca7a94609d 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -56,7 +56,6 @@ macro_rules! doc_mod { }; } -mod clangll; mod clang; mod ir; mod parse; @@ -630,12 +629,12 @@ fn filter_builtins(ctx: &BindgenContext, cursor: &clang::Cursor) -> bool { pub fn parse_one(ctx: &mut BindgenContext, cursor: clang::Cursor, parent: Option) - -> clangll::Enum_CXVisitorResult { + -> clang_sys::CXChildVisitResult { if !filter_builtins(ctx, &cursor) { return CXChildVisit_Continue; } - use clangll::CXChildVisit_Continue; + use clang_sys::CXChildVisit_Continue; match Item::parse(cursor, parent, ctx) { Ok(..) => {}, Err(ParseError::Continue) => {} @@ -648,12 +647,11 @@ pub fn parse_one(ctx: &mut BindgenContext, /// Parse the Clang AST into our `Item` internal representation. fn parse(context: &mut BindgenContext) -> Result<(), ()> { - use clang::Diagnostic; - use clangll::*; + use clang_sys::*; let mut any_error = false; for d in context.translation_unit().diags().iter() { - let msg = d.format(Diagnostic::default_opts()); + let msg = d.format(); let is_err = d.severity() >= CXDiagnostic_Error; println!("{}, err: {}", msg, is_err); any_error |= is_err; From 0608a9c6d31fb68ba5080ddde57527788229ecf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 13 Dec 2016 18:18:31 +0100 Subject: [PATCH 0173/2291] cargo: Sort dependencies in libbindgen. --- libbindgen/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 1c1b15c381..9e913ecba8 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -24,14 +24,14 @@ shlex = "0.1" quasi_codegen = "0.26" [dependencies] +cexpr = "0.2" cfg-if = "0.1.0" +clang-sys = { version = "0.11.1", features = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9"] } lazy_static = "0.1.*" libc = "0.2" rustc-serialize = "0.3.19" syntex_syntax = "0.50" regex = "0.1" -cexpr = "0.2" -clang-sys = { version = "0.11.1", features = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9"] } [dependencies.aster] features = ["with-syntex"] From 8f0320d1b0c7a1f9ddf93ecf453af0a2266ec552 Mon Sep 17 00:00:00 2001 From: Vladimir Vukicevic Date: Tue, 13 Dec 2016 13:46:00 -0500 Subject: [PATCH 0174/2291] Silence the 'Unhandled cursor kind' warning for toplevel operator overloads and using directives --- libbindgen/src/ir/item.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 301085dc15..00c2982209 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -950,6 +950,7 @@ impl ClangItemParser for Item { CXCursor_MacroDefinition | CXCursor_MacroExpansion | CXCursor_UsingDeclaration | + CXCursor_UsingDirective | CXCursor_StaticAssert | CXCursor_InclusionDirective => { debug!("Unhandled cursor kind {:?}: {:?}", @@ -957,9 +958,13 @@ impl ClangItemParser for Item { cursor); } _ => { - error!("Unhandled cursor kind {:?}: {:?}", - cursor.kind(), - cursor); + // ignore toplevel operator overloads + let spelling = cursor.spelling(); + if !spelling.starts_with("operator") { + error!("Unhandled cursor kind {:?}: {:?}", + cursor.kind(), + cursor); + } } } From 810c6207b952e7ec9457321dc8f27982fe8e9f40 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Wed, 14 Dec 2016 09:44:55 +1100 Subject: [PATCH 0175/2291] Upgrade lazy_static to 0.2.x --- libbindgen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 9e913ecba8..d78cbc3bff 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -27,7 +27,7 @@ quasi_codegen = "0.26" cexpr = "0.2" cfg-if = "0.1.0" clang-sys = { version = "0.11.1", features = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9"] } -lazy_static = "0.1.*" +lazy_static = "0.2.1" libc = "0.2" rustc-serialize = "0.3.19" syntex_syntax = "0.50" From d934705e1a3d830a8829e41e0e1809fd88da5044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 13 Dec 2016 18:18:00 +0100 Subject: [PATCH 0176/2291] Use a dynamically loaded clang to do as much as we can with old clang versions, and experiment with new ones. It's a pity that we don't support clang 3.7 and similar for generating C bindings, when it should be straight-forward. This should allow us to support older clang versions, and also experiment with pre-release clang APIs if needed. This depends on: https://github.com/KyleMayes/clang-sys/pull/44 --- bindgen/Cargo.toml | 2 +- libbindgen/Cargo.toml | 2 +- libbindgen/src/clang.rs | 39 ++++++--------------------------------- libbindgen/src/ir/ty.rs | 1 - libbindgen/src/lib.rs | 9 +++++++++ 5 files changed, 17 insertions(+), 36 deletions(-) diff --git a/bindgen/Cargo.toml b/bindgen/Cargo.toml index 1ac99d0389..22e31ba6e6 100644 --- a/bindgen/Cargo.toml +++ b/bindgen/Cargo.toml @@ -15,7 +15,7 @@ version = "0.17.0" workspace = ".." [dependencies] -clang-sys = "0.11.1" +clang-sys = "0.12" clap = "2" libbindgen = { path = "../libbindgen" } log = "0.3" diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index d78cbc3bff..6e6b045511 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -26,7 +26,7 @@ quasi_codegen = "0.26" [dependencies] cexpr = "0.2" cfg-if = "0.1.0" -clang-sys = { version = "0.11.1", features = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9"] } +clang-sys = { version = "0.12", features = ["runtime", "clang_3_9"] } lazy_static = "0.2.1" libc = "0.2" rustc-serialize = "0.3.19" diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index ad311835f0..3f272607df 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -349,19 +349,9 @@ impl Cursor { } /// Is the referent an inlined function? - #[cfg(not(feature="llvm_stable"))] pub fn is_inlined_function(&self) -> bool { - unsafe { clang_Cursor_isFunctionInlined(self.x) != 0 } - } - - // TODO: Remove this when LLVM 3.9 is released. - // - // This is currently used for CI purposes. - - /// Is the referent an inlined function? - #[cfg(feature="llvm_stable")] - pub fn is_inlined_function(&self) -> bool { - false + clang_Cursor_isFunctionInlined::is_loaded() && + unsafe { clang_Cursor_isFunctionInlined(self.x) != 0 } } /// Get the width of this cursor's referent bit field, or `None` if the @@ -762,7 +752,6 @@ impl Type { /// For elaborated types (types which use `class`, `struct`, or `union` to /// disambiguate types from local bindings), get the underlying type. - #[cfg(not(feature="llvm_stable"))] pub fn named(&self) -> Type { unsafe { Type { @@ -1306,28 +1295,13 @@ pub struct EvalResult { x: CXEvalResult, } -#[cfg(feature = "llvm_stable")] -impl EvalResult { - /// Create a dummy EvalResult. - pub fn new(_: Cursor) -> Option { - None - } - - /// Not useful in llvm 3.8. - pub fn as_double(&self) -> Option { - None - } - - /// Not useful in llvm 3.8. - pub fn as_int(&self) -> Option { - None - } -} - -#[cfg(not(feature = "llvm_stable"))] impl EvalResult { /// Evaluate `cursor` and return the result. pub fn new(cursor: Cursor) -> Option { + if !clang_Cursor_Evaluate::is_loaded() { + return None; + } + // Clang has an internal assertion we can trigger if we try to evaluate // a cursor containing a variadic template type reference. Triggering // the assertion aborts the process, and we don't want that. Clang @@ -1379,7 +1353,6 @@ impl EvalResult { } } -#[cfg(not(feature = "llvm_stable"))] impl Drop for EvalResult { fn drop(&mut self) { unsafe { clang_EvalResult_dispose(self.x) }; diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index dde2176e70..58ac7c871f 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -854,7 +854,6 @@ impl Type { .expect("Not able to resolve array element?"); TypeKind::Array(inner, ty.num_elements().unwrap()) } - #[cfg(not(feature="llvm_stable"))] CXType_Elaborated => { return Self::from_clang_ty(potential_id, &ty.named(), diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 22972659df..4ef8b54ca9 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -511,6 +511,10 @@ impl<'ctx> Bindings<'ctx> { span: Option) -> Result, ()> { let span = span.unwrap_or(DUMMY_SP); + if !clang_sys::is_loaded() { + // TODO(emilio): Return meaningful error (breaking). + clang_sys::load().expect("Unable to find libclang"); + } // TODO: Make this path fixup configurable? if let Some(clang) = clang_sys::support::Clang::find(None) { @@ -691,6 +695,11 @@ pub struct ClangVersion { /// Get the major and the minor semvar numbers of Clang's version pub fn clang_version() -> ClangVersion { + if !clang_sys::is_loaded() { + // TODO(emilio): Return meaningful error (breaking). + clang_sys::load().expect("Unable to find libclang"); + } + let raw_v: String = clang::extract_clang_version(); let split_v: Option> = raw_v.split_whitespace() .nth(2) From a1e20297451137f29d105a18e1fd9704ba3dc366 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Fri, 16 Dec 2016 01:03:32 +1100 Subject: [PATCH 0177/2291] Fix an unused_mut warning --- bindgen/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bindgen/src/main.rs b/bindgen/src/main.rs index c1dc632f00..b54d4af5ed 100644 --- a/bindgen/src/main.rs +++ b/bindgen/src/main.rs @@ -21,7 +21,7 @@ pub fn main() { }) .expect("Failed to set logger."); - let mut bind_args: Vec<_> = env::args().collect(); + let bind_args: Vec<_> = env::args().collect(); let version = clang_version(); let expected_version = if cfg!(feature = "llvm_stable") { From 0ec5a6aa25bda273781a6569107b82c65cf004c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 15 Dec 2016 16:50:01 +0100 Subject: [PATCH 0178/2291] codegen: Properly mangle method names. --- libbindgen/src/codegen/mod.rs | 2 +- .../expectations/tests/method-mangling.rs | 29 +++++++++++++++++++ libbindgen/tests/headers/method-mangling.hpp | 5 ++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 libbindgen/tests/expectations/tests/method-mangling.rs create mode 100644 libbindgen/tests/headers/method-mangling.hpp diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index bf516cd25a..9ab264c671 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1404,7 +1404,7 @@ impl MethodCodegen for Method { let item = ast::ImplItem { id: ast::DUMMY_NODE_ID, - ident: ctx.ext_cx().ident_of(&name), + ident: ctx.rust_ident(&name), vis: ast::Visibility::Public, attrs: attrs, node: ast::ImplItemKind::Method(sig, P(block)), diff --git a/libbindgen/tests/expectations/tests/method-mangling.rs b/libbindgen/tests/expectations/tests/method-mangling.rs new file mode 100644 index 0000000000..3b5107a8f8 --- /dev/null +++ b/libbindgen/tests/expectations/tests/method-mangling.rs @@ -0,0 +1,29 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Foo { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +extern "C" { + #[link_name = "_ZN3Foo4typeEv"] + pub fn Foo_type(this: *mut Foo) -> ::std::os::raw::c_int; +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} +impl Foo { + #[inline] + pub unsafe fn type_(&mut self) -> ::std::os::raw::c_int { + Foo_type(&mut *self) + } +} diff --git a/libbindgen/tests/headers/method-mangling.hpp b/libbindgen/tests/headers/method-mangling.hpp new file mode 100644 index 0000000000..0dac497569 --- /dev/null +++ b/libbindgen/tests/headers/method-mangling.hpp @@ -0,0 +1,5 @@ + +class Foo { +public: + int type(); +}; From 31bd2d3a1ffa47e15b0701761966fc836c9da99d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 15 Dec 2016 16:57:32 +0100 Subject: [PATCH 0179/2291] ir: Don't parse standalone destructors. --- libbindgen/src/ir/function.rs | 2 +- .../tests/expectations/tests/public-dtor.rs | 16 ++++++++++++++++ libbindgen/tests/headers/public-dtor.hpp | 15 +++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 libbindgen/tests/expectations/tests/public-dtor.rs create mode 100644 libbindgen/tests/headers/public-dtor.hpp diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs index a068097d2f..76576dbdd0 100644 --- a/libbindgen/src/ir/function.rs +++ b/libbindgen/src/ir/function.rs @@ -242,9 +242,9 @@ impl ClangSubItemParser for Function { -> Result, ParseError> { use clang_sys::*; match cursor.kind() { + // FIXME(emilio): Generate destructors properly. CXCursor_FunctionDecl | CXCursor_Constructor | - CXCursor_Destructor | CXCursor_CXXMethod => {} _ => return Err(ParseError::Continue), }; diff --git a/libbindgen/tests/expectations/tests/public-dtor.rs b/libbindgen/tests/expectations/tests/public-dtor.rs new file mode 100644 index 0000000000..851857eeaa --- /dev/null +++ b/libbindgen/tests/expectations/tests/public-dtor.rs @@ -0,0 +1,16 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug)] +pub struct cv_String { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_cv_String() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} diff --git a/libbindgen/tests/headers/public-dtor.hpp b/libbindgen/tests/headers/public-dtor.hpp new file mode 100644 index 0000000000..5d4fb592a1 --- /dev/null +++ b/libbindgen/tests/headers/public-dtor.hpp @@ -0,0 +1,15 @@ + + +namespace cv { +class String { +public: + ~String(); +}; + + +inline +String::~String() +{ +} + +} From 989a5166c71e88e3fe791896fc8b9478a72878ce Mon Sep 17 00:00:00 2001 From: Artem Biryukov Date: Fri, 2 Dec 2016 23:30:23 +0300 Subject: [PATCH 0180/2291] Add assertion for dangling references --- libbindgen/src/ir/context.rs | 130 ++++++++++++++++++++++++++++++++--- 1 file changed, 122 insertions(+), 8 deletions(-) diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 6069121c21..4cf772dccd 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -6,7 +6,7 @@ use clang::{self, Cursor}; use parse::ClangItemParser; use std::borrow::Cow; use std::cell::Cell; -use std::collections::{HashMap, hash_map}; +use std::collections::{HashMap, VecDeque, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; use super::int::IntKind; @@ -399,18 +399,33 @@ impl<'ctx> BindgenContext<'ctx> { continue; } - if let Some(mut module) = self.items.get_mut(&old_parent).unwrap().as_module_mut() { + if let Some(mut module) = self.items + .get_mut(&old_parent) + .unwrap() + .as_module_mut() { // Deparent the replacement. - let position = module.children().iter().position(|id| *id == replacement).unwrap(); + let position = module.children() + .iter() + .position(|id| *id == replacement) + .unwrap(); module.children_mut().remove(position); } - if let Some(mut module) = self.items.get_mut(&new_parent).unwrap().as_module_mut() { + if let Some(mut module) = self.items + .get_mut(&new_parent) + .unwrap() + .as_module_mut() { module.children_mut().push(replacement); } - self.items.get_mut(&replacement).unwrap().set_parent_for_replacement(new_parent); - self.items.get_mut(&id).unwrap().set_parent_for_replacement(old_parent); + self.items + .get_mut(&replacement) + .unwrap() + .set_parent_for_replacement(new_parent); + self.items + .get_mut(&id) + .unwrap() + .set_parent_for_replacement(old_parent); } } @@ -428,8 +443,7 @@ impl<'ctx> BindgenContext<'ctx> { let cfg = ExpansionConfig::default("xxx".to_owned()); let sess = parse::ParseSess::new(); let mut loader = base::DummyResolver; - let mut ctx = - GenContext(base::ExtCtxt::new(&sess, cfg, &mut loader)); + let mut ctx = GenContext(base::ExtCtxt::new(&sess, cfg, &mut loader)); ctx.0.bt_push(ExpnInfo { call_site: self.span, @@ -445,6 +459,8 @@ impl<'ctx> BindgenContext<'ctx> { // because we remove it before the end of this function. self.gen_ctx = Some(unsafe { mem::transmute(&ctx) }); + self.assert_no_dangling_references(); + if !self.collected_typerefs() { self.resolve_typerefs(); self.process_replacements(); @@ -455,6 +471,36 @@ impl<'ctx> BindgenContext<'ctx> { ret } + /// This function trying to find any dangling references inside of `items` + fn assert_no_dangling_references(&self) { + if cfg!(debug_assertions) { + for _ in self.assert_no_dangling_item_traversal() { + // The iterator's next method does the asserting for us. + } + } + } + + fn assert_no_dangling_item_traversal<'me> + (&'me self) + -> AssertNoDanglingItemIter<'me, 'ctx> { + assert!(self.in_codegen_phase()); + assert!(self.current_module == self.root_module); + + let mut roots = self.items().map(|(&id, _)| id); + + let mut seen = BTreeMap::::new(); + let next_child = roots.next().map(|id| id).unwrap(); + seen.insert(next_child, next_child); + + let to_iterate = seen.iter().map(|(&id, _)| id).rev().collect(); + + AssertNoDanglingItemIter { + ctx: self, + seen: seen, + to_iterate: to_iterate, + } + } + // This deserves a comment. Builtin types don't get a valid declaration, so // we can't add it to the cursor->type map. // @@ -1086,3 +1132,71 @@ impl<'ctx, 'gen> Iterator for WhitelistedItemsIter<'ctx, 'gen> Some(id) } } + +/// An iterator to find any dangling items. +/// +/// See `BindgenContext::assert_no_dangling_item_traversal` for more information. +pub struct AssertNoDanglingItemIter<'ctx, 'gen> + where 'gen: 'ctx, +{ + ctx: &'ctx BindgenContext<'gen>, + seen: BTreeMap, + to_iterate: VecDeque, +} + +impl<'ctx, 'gen> Iterator for AssertNoDanglingItemIter<'ctx, 'gen> + where 'gen: 'ctx, +{ + type Item = ItemId; + + fn next(&mut self) -> Option { + let id = match self.to_iterate.pop_front() { + None => { + // We've traversed everything reachable from the previous root(s), see if + // we have any more roots. + match self.ctx + .items() + .filter(|&(id, _)| !self.seen.contains_key(id)) + .next() + .map(|(id, _)| *id) { + None => return None, + Some(id) => { + // This is a new root. + self.seen.insert(id, id); + id + } + } + } + Some(id) => id, + }; + + let mut sub_types = ItemSet::new(); + id.collect_types(self.ctx, &mut sub_types, &()); + + if self.ctx.resolve_item_fallible(id).is_none() { + let mut path = vec![]; + let mut current = id; + loop { + let predecessor = *self.seen.get(¤t) + .expect("We know we found this item id, so it must have a predecessor"); + if predecessor == current { + break; + } + path.push(predecessor); + current = predecessor; + } + path.reverse(); + panic!("Found reference to dangling id = {:?}\nvia path = {:?}", + id, + path); + } + + for sub_id in sub_types { + if let Some(value) = self.seen.insert(id, sub_id) { + self.to_iterate.push_back(value); + } + } + + Some(id) + } +} From 15c687e0f1bec97448168f981ec93d207884a775 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 15 Dec 2016 08:17:30 -0800 Subject: [PATCH 0181/2291] Use a feature to control dangling item assertions These checks are expensive enough that we only want to do them when hacking on bindgen itself, not anytime someone does a debug build of something that depends on bindgen. --- .travis.yml | 4 ++-- libbindgen/Cargo.toml | 1 + libbindgen/src/ir/context.rs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index df1a515691..d5fb44555f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,8 +26,8 @@ before_install: . ./ci/before_install.sh before_script: cd libbindgen script: - - cargo test --features "$BINDGEN_FEATURES" - - cargo test --release --features "$BINDGEN_FEATURES" + - cargo test --features "$BINDGEN_FEATURES assert_no_dangling_items" + - cargo test --release --features "$BINDGEN_FEATURES assert_no_dangling_items" - git add -A - git diff @ - git diff-index --quiet HEAD diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 6e6b045511..df22afdd75 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -50,6 +50,7 @@ features = ["with-syntex"] version = "0.26" [features] +assert_no_dangling_items = [] default = ["logging"] llvm_stable = [] logging = ["env_logger", "log"] diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 4cf772dccd..ba8ffe8226 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -473,7 +473,7 @@ impl<'ctx> BindgenContext<'ctx> { /// This function trying to find any dangling references inside of `items` fn assert_no_dangling_references(&self) { - if cfg!(debug_assertions) { + if cfg!(feature = "assert_no_dangling_items") { for _ in self.assert_no_dangling_item_traversal() { // The iterator's next method does the asserting for us. } From 59987f142bbd97e44437532a640eb66c4d3a3e52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 15 Dec 2016 17:48:15 +0100 Subject: [PATCH 0182/2291] codegen: Properly mangle nested anonymous enums with duplicated variants. --- libbindgen/src/codegen/mod.rs | 16 +++++-- .../expectations/tests/anon_enum_trait.rs | 47 +++++++++++++++++++ libbindgen/tests/headers/anon_enum_trait.hpp | 22 +++++++++ 3 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/anon_enum_trait.rs create mode 100644 libbindgen/tests/headers/anon_enum_trait.hpp diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 9ab264c671..2f18036a92 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1660,11 +1660,21 @@ impl CodeGenerator for Enum { match seen_values.entry(variant.val()) { Entry::Occupied(ref entry) => { if is_rust_enum { - let existing_variant_name = entry.get(); let variant_name = ctx.rust_mangle(variant.name()); + let mangled_name = if is_toplevel || enum_ty.name().is_some() { + variant_name + } else { + let parent_name = parent_canonical_name.as_ref() + .unwrap(); + + Cow::Owned( + format!("{}_{}", parent_name, variant_name)) + }; + + let existing_variant_name = entry.get(); add_constant(enum_ty, &name, - &*variant_name, + &*mangled_name, existing_variant_name, enum_rust_ty.clone(), result); @@ -1688,8 +1698,6 @@ impl CodeGenerator for Enum { // If it's an unnamed enum, we also generate a constant so // it can be properly accessed. if is_rust_enum && enum_ty.name().is_none() { - // NB: if we want to do this for other kind of nested - // enums we can probably mangle the name. let mangled_name = if is_toplevel { variant_name.clone() } else { diff --git a/libbindgen/tests/expectations/tests/anon_enum_trait.rs b/libbindgen/tests/expectations/tests/anon_enum_trait.rs new file mode 100644 index 0000000000..8198bc15ce --- /dev/null +++ b/libbindgen/tests/expectations/tests/anon_enum_trait.rs @@ -0,0 +1,47 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct DataType<_Tp> { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData<_Tp>, +} +pub type DataType_value_type<_Tp> = _Tp; +pub type DataType_work_type<_Tp> = DataType_value_type<_Tp>; +pub type DataType_channel_type<_Tp> = DataType_value_type<_Tp>; +pub type DataType_vec_type<_Tp> = DataType_value_type<_Tp>; +pub const DataType_generic_type: DataType__bindgen_ty_1 = + DataType__bindgen_ty_1::generic_type; +pub const DataType_depth: DataType__bindgen_ty_1 = + DataType__bindgen_ty_1::generic_type; +pub const DataType_channels: DataType__bindgen_ty_1 = + DataType__bindgen_ty_1::generic_type; +pub const DataType_fmt: DataType__bindgen_ty_1 = + DataType__bindgen_ty_1::generic_type; +pub const DataType_type_: DataType__bindgen_ty_1 = + DataType__bindgen_ty_1::generic_type; +#[repr(i32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum DataType__bindgen_ty_1 { generic_type = 0, } +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Foo { + pub _address: u8, +} +pub const Foo_Bar: Foo__bindgen_ty_1 = Foo__bindgen_ty_1::Bar; +pub const Foo_Baz: Foo__bindgen_ty_1 = Foo__bindgen_ty_1::Bar; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum Foo__bindgen_ty_1 { Bar = 0, } +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/headers/anon_enum_trait.hpp b/libbindgen/tests/headers/anon_enum_trait.hpp new file mode 100644 index 0000000000..e1ec394c30 --- /dev/null +++ b/libbindgen/tests/headers/anon_enum_trait.hpp @@ -0,0 +1,22 @@ + +template +class DataType { +public: + typedef _Tp value_type; + typedef value_type work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 1, + depth = -1, + channels = 1, + fmt = 0, + type = -1, + }; +}; + +struct Foo { + enum { + Bar = 0, + Baz = 0, + }; +}; From 1129431b00cb3ab76dce0ab8b2956d319d939f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 15 Dec 2016 18:02:49 +0100 Subject: [PATCH 0183/2291] ir: Don't parse constructors twice. --- libbindgen/src/ir/function.rs | 7 +++- .../expectations/tests/constructor-tp.rs | 37 +++++++++++++++++++ libbindgen/tests/headers/constructor-tp.hpp | 19 ++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 libbindgen/tests/expectations/tests/constructor-tp.rs create mode 100644 libbindgen/tests/headers/constructor-tp.hpp diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs index 76576dbdd0..1b930ac3cf 100644 --- a/libbindgen/src/ir/function.rs +++ b/libbindgen/src/ir/function.rs @@ -186,8 +186,13 @@ impl FunctionSig { }; let is_method = cursor.kind() == CXCursor_CXXMethod; + let is_constructor = cursor.kind() == CXCursor_Constructor; + if is_constructor && cursor.lexical_parent() != cursor.semantic_parent() { + // Only parse constructors once. + return Err(ParseError::Continue); + } - if is_method || cursor.kind() == CXCursor_Constructor { + if is_method || is_constructor { let is_const = is_method && cursor.method_is_const(); let is_virtual = is_method && cursor.method_is_virtual(); let is_static = is_method && cursor.method_is_static(); diff --git a/libbindgen/tests/expectations/tests/constructor-tp.rs b/libbindgen/tests/expectations/tests/constructor-tp.rs new file mode 100644 index 0000000000..5022048910 --- /dev/null +++ b/libbindgen/tests/expectations/tests/constructor-tp.rs @@ -0,0 +1,37 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Foo { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Bar { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +extern "C" { + #[link_name = "_ZN3BarC1Ev"] + pub fn Bar_Bar(this: *mut Bar); +} +impl Clone for Bar { + fn clone(&self) -> Self { *self } +} +impl Bar { + #[inline] + pub unsafe fn new() -> Self { + let mut __bindgen_tmp = ::std::mem::uninitialized(); + Bar_Bar(&mut __bindgen_tmp); + __bindgen_tmp + } +} diff --git a/libbindgen/tests/headers/constructor-tp.hpp b/libbindgen/tests/headers/constructor-tp.hpp new file mode 100644 index 0000000000..7a42041390 --- /dev/null +++ b/libbindgen/tests/headers/constructor-tp.hpp @@ -0,0 +1,19 @@ + +template +class Foo { +public: + Foo(); +}; + +class Bar { +public: + Bar(); +}; + +template +Foo::Foo() { +} + +inline +Bar::Bar() { +} From ce0a254131be56e3c437199c21f48a2d5428c91d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 15 Dec 2016 18:09:00 +0100 Subject: [PATCH 0184/2291] ir: Do the proper thing for methods. --- libbindgen/src/ir/function.rs | 3 ++- libbindgen/tests/headers/constructor-tp.hpp | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs index 1b930ac3cf..516c486e86 100644 --- a/libbindgen/src/ir/function.rs +++ b/libbindgen/src/ir/function.rs @@ -187,7 +187,8 @@ impl FunctionSig { let is_method = cursor.kind() == CXCursor_CXXMethod; let is_constructor = cursor.kind() == CXCursor_Constructor; - if is_constructor && cursor.lexical_parent() != cursor.semantic_parent() { + if (is_constructor || is_method) && + cursor.lexical_parent() != cursor.semantic_parent() { // Only parse constructors once. return Err(ParseError::Continue); } diff --git a/libbindgen/tests/headers/constructor-tp.hpp b/libbindgen/tests/headers/constructor-tp.hpp index 7a42041390..6e55ea7852 100644 --- a/libbindgen/tests/headers/constructor-tp.hpp +++ b/libbindgen/tests/headers/constructor-tp.hpp @@ -3,8 +3,15 @@ template class Foo { public: Foo(); + + void doBaz(); }; +template +inline void +Foo::doBaz() { +} + class Bar { public: Bar(); From 5417d97e3b791048628e0a97897f0f4312c11031 Mon Sep 17 00:00:00 2001 From: Artem Biryukov Date: Thu, 15 Dec 2016 22:43:38 +0300 Subject: [PATCH 0185/2291] Wrap Type into Option --- libbindgen/src/clang.rs | 12 ++++++------ libbindgen/src/ir/ty.rs | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 3f272607df..192ce09dbc 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -402,12 +402,12 @@ impl Cursor { /// Given that this cursor's referent is a `typedef`, get the `Type` that is /// being aliased. - pub fn typedef_type(&self) -> Type { - unsafe { - Type { - x: clang_getTypedefDeclUnderlyingType(self.x), - } - } + pub fn typedef_type(&self) -> Option { + let inner = Type { + x: unsafe { clang_getTypedefDeclUnderlyingType(self.x) } + }; + + if inner.is_valid() { Some(inner) } else { None } } /// Get the linkage kind for this cursor's referent. diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 58ac7c871f..3d3799695d 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -660,7 +660,7 @@ impl Type { name = current.spelling(); - let inner_ty = cur.typedef_type(); + let inner_ty = cur.typedef_type().expect("Not valid Type?"); inner = Item::from_ty( &inner_ty, Some(cur), @@ -825,7 +825,7 @@ impl Type { TypeKind::Function(signature) } CXType_Typedef => { - let inner = cursor.typedef_type(); + let inner = cursor.typedef_type().expect("Not valid Type?"); let inner = Item::from_ty_or_ref(inner, location, parent_id, ctx); TypeKind::Alias(ty.spelling(), inner) From 981e5c5a4fd10400edb33b9f58cfea3affaf295d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 16 Dec 2016 08:06:14 +0100 Subject: [PATCH 0186/2291] Bump version. --- libbindgen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index df22afdd75..408d9fc1ad 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -12,7 +12,7 @@ license = "BSD-3-Clause" name = "libbindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" -version = "0.1.2" +version = "0.1.3" workspace = ".." [dev-dependencies] From 50a3a6ba89f6e3104ce50f72995b01850f6aff55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 21 Dec 2016 19:53:24 +0100 Subject: [PATCH 0187/2291] ir: Handle CXType_Auto. --- libbindgen/src/ir/ty.rs | 9 +++++++++ libbindgen/tests/expectations/tests/auto.rs | 20 ++++++++++++++++++++ libbindgen/tests/headers/auto.hpp | 6 ++++++ 3 files changed, 35 insertions(+) create mode 100644 libbindgen/tests/expectations/tests/auto.rs create mode 100644 libbindgen/tests/headers/auto.hpp diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 3d3799695d..ada3d9b1bc 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -780,6 +780,15 @@ impl Type { return Err(ParseError::Continue); } } + CXType_Auto => { + // We don't want to blow the stack. + assert!(canonical_ty != *ty, "Couldn't find deduced type"); + return Self::from_clang_ty(potential_id, + &canonical_ty, + location, + parent_id, + ctx); + } // NOTE: We don't resolve pointers eagerly because the pointee type // might not have been parsed, and if it contains templates or // something else we might get confused, see the comment inside diff --git a/libbindgen/tests/expectations/tests/auto.rs b/libbindgen/tests/expectations/tests/auto.rs new file mode 100644 index 0000000000..e35f5ed28b --- /dev/null +++ b/libbindgen/tests/expectations/tests/auto.rs @@ -0,0 +1,20 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Foo { + pub _address: u8, +} +pub const Foo_kBar: bool = true; +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/headers/auto.hpp b/libbindgen/tests/headers/auto.hpp new file mode 100644 index 0000000000..64025295eb --- /dev/null +++ b/libbindgen/tests/headers/auto.hpp @@ -0,0 +1,6 @@ +// bindgen-flags: -- -std=c++11 +// bindgen-unstable + +class Foo { + static constexpr auto kBar = 2 == 2; +}; From 924c74096b34f343376d1fec925365b68c20bf14 Mon Sep 17 00:00:00 2001 From: Paul Faria Date: Wed, 21 Dec 2016 14:53:19 -0500 Subject: [PATCH 0188/2291] Followed Resolved Type Ref instead of panicking --- libbindgen/src/codegen/mod.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 2f18036a92..be95b72648 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -2005,7 +2005,11 @@ impl CodeGenerator for Function { let signature = signature_item.kind().expect_type(); let signature = match *signature.kind() { TypeKind::Function(ref sig) => sig, - _ => panic!("How?"), + TypeKind::ResolvedTypeRef(ref item_id) => { + let item = ctx.resolve_item(*item_id); + return self.codegen(ctx, result, _whitelisted_items, item); + }, + _ => panic!("How?") }; let fndecl = utils::rust_fndecl_from_signature(ctx, signature_item); From a336b01ec19045a7ea89dcfee588967df506a033 Mon Sep 17 00:00:00 2001 From: Paul Faria Date: Wed, 21 Dec 2016 17:30:10 -0500 Subject: [PATCH 0189/2291] Add test for following ResolvedTypeRef --- .../tests/expectations/tests/resolved_type_def_function.rs | 7 +++++++ libbindgen/tests/headers/resolved_type_def_function.h | 2 ++ 2 files changed, 9 insertions(+) create mode 100644 libbindgen/tests/expectations/tests/resolved_type_def_function.rs create mode 100644 libbindgen/tests/headers/resolved_type_def_function.h diff --git a/libbindgen/tests/expectations/tests/resolved_type_def_function.rs b/libbindgen/tests/expectations/tests/resolved_type_def_function.rs new file mode 100644 index 0000000000..fb308fa47d --- /dev/null +++ b/libbindgen/tests/expectations/tests/resolved_type_def_function.rs @@ -0,0 +1,7 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub type FuncType = ::std::option::Option; diff --git a/libbindgen/tests/headers/resolved_type_def_function.h b/libbindgen/tests/headers/resolved_type_def_function.h new file mode 100644 index 0000000000..139b8c3e85 --- /dev/null +++ b/libbindgen/tests/headers/resolved_type_def_function.h @@ -0,0 +1,2 @@ +typedef void (FuncType) (); +extern FuncType Func; \ No newline at end of file From 3fa229919196d2be4610b2e2f84d0f05f0be8c09 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 21 Dec 2016 16:07:09 -0800 Subject: [PATCH 0190/2291] Ensure that we only load `libclang` once across all threads, and that it is not prematurely dropped. Honestly, I'm still not 100% sure what the root cause of the Clang and LLVM issues I was seeing were, but when I ensure that we only have one libclang loaded across all threads and that it is never dropped, the assertions go away. Fixes #350. --- libbindgen/src/lib.rs | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 4ef8b54ca9..5bec040682 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -87,6 +87,7 @@ use std::collections::HashSet; use std::fs::OpenOptions; use std::io::{self, Write}; use std::path::Path; +use std::sync::{Arc, Mutex}; use syntax::ast; use syntax::codemap::{DUMMY_SP, Span}; @@ -495,6 +496,34 @@ pub enum LinkType { Framework, } +fn ensure_libclang_is_loaded() { + if clang_sys::is_loaded() { + return; + } + + // XXX (issue #350): Ensure that our dynamically loaded `libclang` + // doesn't get dropped prematurely, nor is loaded multiple times + // across different threads. + + lazy_static! { + static ref LIBCLANG: Mutex>> = { + Mutex::new(None) + }; + } + + let mut libclang = LIBCLANG.lock().unwrap(); + if !clang_sys::is_loaded() { + if libclang.is_none() { + // TODO(emilio): Return meaningful error (breaking). + clang_sys::load().expect("Unable to find libclang"); + *libclang = Some(clang_sys::get_library() + .expect("We just loaded libclang and it had better still be here!")); + } else { + clang_sys::set_library(libclang.clone()); + } + } +} + /// Generated Rust bindings. #[derive(Debug)] pub struct Bindings<'ctx> { @@ -511,10 +540,7 @@ impl<'ctx> Bindings<'ctx> { span: Option) -> Result, ()> { let span = span.unwrap_or(DUMMY_SP); - if !clang_sys::is_loaded() { - // TODO(emilio): Return meaningful error (breaking). - clang_sys::load().expect("Unable to find libclang"); - } + ensure_libclang_is_loaded(); // TODO: Make this path fixup configurable? if let Some(clang) = clang_sys::support::Clang::find(None) { From c109c7384d1e9d03e7694b7b86f4ff53ddbd8856 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 21 Dec 2016 16:09:09 -0800 Subject: [PATCH 0191/2291] Run `cargo fmt` on the sources --- libbindgen/src/clang.rs | 31 ++++++++++++++----------------- libbindgen/src/codegen/mod.rs | 28 ++++++++++++++++++---------- libbindgen/src/ir/annotations.rs | 10 +++++----- libbindgen/src/ir/comp.rs | 18 ++++++------------ libbindgen/src/ir/enum_ty.rs | 5 ++--- libbindgen/src/ir/function.rs | 2 +- libbindgen/src/ir/item.rs | 32 +++++++++++++------------------- libbindgen/src/ir/ty.rs | 29 ++++++++++++++++------------- libbindgen/src/lib.rs | 5 +++-- 9 files changed, 78 insertions(+), 82 deletions(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index 192ce09dbc..fc5575b38c 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -351,7 +351,7 @@ impl Cursor { /// Is the referent an inlined function? pub fn is_inlined_function(&self) -> bool { clang_Cursor_isFunctionInlined::is_loaded() && - unsafe { clang_Cursor_isFunctionInlined(self.x) != 0 } + unsafe { clang_Cursor_isFunctionInlined(self.x) != 0 } } /// Get the width of this cursor's referent bit field, or `None` if the @@ -404,7 +404,7 @@ impl Cursor { /// being aliased. pub fn typedef_type(&self) -> Option { let inner = Type { - x: unsafe { clang_getTypedefDeclUnderlyingType(self.x) } + x: unsafe { clang_getTypedefDeclUnderlyingType(self.x) }, }; if inner.is_valid() { Some(inner) } else { None } @@ -603,9 +603,7 @@ impl Type { /// Get a raw display name for this type. pub fn spelling(&self) -> String { - unsafe { - cxstring_into_string(clang_getTypeSpelling(self.x)) - } + unsafe { cxstring_into_string(clang_getTypeSpelling(self.x)) } } /// Is this type const qualified? @@ -879,9 +877,7 @@ impl Comment { /// Given that this comment is the start or end of an HTML tag, get its tag /// name. pub fn get_tag_name(&self) -> String { - unsafe { - cxstring_into_string(clang_HTMLTagComment_getTagName(self.x)) - } + unsafe { cxstring_into_string(clang_HTMLTagComment_getTagName(self.x)) } } /// Given that this comment is an HTML start tag, get its attributes. @@ -964,9 +960,7 @@ impl File { if self.x.is_null() { return None; } - Some(unsafe { - cxstring_into_string(clang_getFileName(self.x)) - }) + Some(unsafe { cxstring_into_string(clang_getFileName(self.x)) }) } } @@ -1117,8 +1111,8 @@ impl TranslationUnit { num_tokens as usize); for &token in token_array.iter() { let kind = clang_getTokenKind(token); - let spelling = cxstring_into_string( - clang_getTokenSpelling(self.x, token)); + let spelling = + cxstring_into_string(clang_getTokenSpelling(self.x, token)); tokens.push(Token { kind: kind, @@ -1175,7 +1169,9 @@ impl TranslationUnit { // NB: cexpr is not too happy about comments inside // expressions, so we strip them down here. CXToken_Comment => return None, - _ => panic!("Found unexpected token kind: {:?}", token.kind), + _ => { + panic!("Found unexpected token kind: {:?}", token.kind) + } }; Some(token::Token { @@ -1207,8 +1203,8 @@ impl Diagnostic { pub fn format(&self) -> String { unsafe { let opts = clang_defaultDiagnosticDisplayOptions(); - cxstring_into_string( - clang_formatDiagnostic(self.x, opts)) } + cxstring_into_string(clang_formatDiagnostic(self.x, opts)) + } } /// What is the severity of this diagnostic message? @@ -1312,7 +1308,8 @@ impl EvalResult { // `CXType_Unexposed` from evaluation. let mut found_cant_eval = false; cursor.visit(|c| { - if c.kind() == CXCursor_TypeRef && c.cur_type().kind() == CXType_Unexposed { + if c.kind() == CXCursor_TypeRef && + c.cur_type().kind() == CXType_Unexposed { found_cant_eval = true; CXChildVisit_Break } else { diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 2f18036a92..9734a520cc 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -39,8 +39,7 @@ fn root_import(ctx: &BindgenContext, module: &Item) -> P { let root_ident = ctx.rust_ident(&root); let super_ = aster::AstBuilder::new().id("super"); - let supers = module - .ancestors(ctx) + let supers = module.ancestors(ctx) .filter(|id| ctx.resolve_item(*id).is_module()) .map(|_| super_.clone()) .chain(iter::once(super_)); @@ -309,7 +308,8 @@ impl CodeGenerator for Module { item: &Item) { debug!("::codegen: item = {:?}", item); - let codegen_self = |result: &mut CodegenResult, found_any: &mut bool| { + let codegen_self = |result: &mut CodegenResult, + found_any: &mut bool| { for child in self.children() { if whitelisted_items.contains(child) { *found_any = true; @@ -742,7 +742,8 @@ impl CodeGenerator for CompInfo { fn $fn_name() { assert_eq!($size_of_expr, $size); assert_eq!($align_of_expr, $align); - }).unwrap(); + }) + .unwrap(); result.push(item); } return; @@ -1196,7 +1197,10 @@ impl CodeGenerator for CompInfo { if ctx.options().codegen_config.constructors { for sig in self.constructors() { - Method::new(MethodKind::Constructor, *sig, /* const */ false) + Method::new(MethodKind::Constructor, + *sig, + /* const */ + false) .codegen_method(ctx, &mut methods, &mut method_names, @@ -1342,7 +1346,8 @@ impl MethodCodegen for Method { // return-type = void. if self.is_constructor() { fndecl.inputs.remove(0); - fndecl.output = ast::FunctionRetTy::Ty(quote_ty!(ctx.ext_cx(), Self)); + fndecl.output = + ast::FunctionRetTy::Ty(quote_ty!(ctx.ext_cx(), Self)); } let sig = ast::MethodSig { @@ -1353,8 +1358,8 @@ impl MethodCodegen for Method { constness: respan(ctx.span(), ast::Constness::NotConst), }; - let mut exprs = - helpers::ast_ty::arguments_from_signature(&signature, ctx); + let mut exprs = helpers::ast_ty::arguments_from_signature(&signature, + ctx); let mut stmts = vec![]; @@ -1661,7 +1666,8 @@ impl CodeGenerator for Enum { Entry::Occupied(ref entry) => { if is_rust_enum { let variant_name = ctx.rust_mangle(variant.name()); - let mangled_name = if is_toplevel || enum_ty.name().is_some() { + let mangled_name = if is_toplevel || + enum_ty.name().is_some() { variant_name } else { let parent_name = parent_canonical_name.as_ref() @@ -1762,7 +1768,9 @@ impl ToRustTy for Type { TypeKind::Void => raw_type(ctx, "c_void"), // TODO: we should do something smart with nullptr, or maybe *const // c_void is enough? - TypeKind::NullPtr => raw_type(ctx, "c_void").to_ptr(true, ctx.span()), + TypeKind::NullPtr => { + raw_type(ctx, "c_void").to_ptr(true, ctx.span()) + } TypeKind::Int(ik) => { match ik { IntKind::Bool => aster::ty::TyBuilder::new().bool(), diff --git a/libbindgen/src/ir/annotations.rs b/libbindgen/src/ir/annotations.rs index 968e2da187..3598c78cd2 100644 --- a/libbindgen/src/ir/annotations.rs +++ b/libbindgen/src/ir/annotations.rs @@ -139,11 +139,11 @@ impl Annotations { "hide" => self.hide = true, "nocopy" => self.disallow_copy = true, "replaces" => { - self.use_instead_of = - Some(attr.value.split("::") - .map(Into::into) - .collect()) - }, + self.use_instead_of = Some(attr.value + .split("::") + .map(Into::into) + .collect()) + } "private" => { self.private_fields = Some(attr.value != "false") } diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index 66937b0c44..d5d3426245 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -533,11 +533,7 @@ impl CompInfo { warn!("warning: Template parameter is not a type"); } - if specialization { - args - } else { - vec![] - } + if specialization { args } else { vec![] } } }; @@ -717,16 +713,15 @@ impl CompInfo { // NB: This gets us an owned `Function`, not a // `FunctionSig`. - let signature = - Item::parse(cur, Some(potential_id), ctx) - .expect("CXXMethod"); + let signature = Item::parse(cur, Some(potential_id), ctx) + .expect("CXXMethod"); match cur.kind() { CXCursor_Constructor => { ci.constructors.push(signature); } // TODO(emilio): Bind the destructor? - CXCursor_Destructor => {}, + CXCursor_Destructor => {} CXCursor_CXXMethod => { let is_const = cur.method_is_const(); let method_kind = if is_static { @@ -737,9 +732,8 @@ impl CompInfo { MethodKind::Normal }; - let method = Method::new(method_kind, - signature, - is_const); + let method = + Method::new(method_kind, signature, is_const); ci.methods.push(method); } diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index dc6a866519..d7e4de099b 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -49,9 +49,8 @@ impl Enum { } let declaration = ty.declaration().canonical(); - let repr = declaration.enum_type().and_then(|et| { - Item::from_ty(&et, None, None, ctx).ok() - }); + let repr = declaration.enum_type() + .and_then(|et| Item::from_ty(&et, None, None, ctx).ok()); let mut variants = vec![]; let is_signed = match repr { diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs index 516c486e86..7aed3d7ebf 100644 --- a/libbindgen/src/ir/function.rs +++ b/libbindgen/src/ir/function.rs @@ -188,7 +188,7 @@ impl FunctionSig { let is_method = cursor.kind() == CXCursor_CXXMethod; let is_constructor = cursor.kind() == CXCursor_Constructor; if (is_constructor || is_method) && - cursor.lexical_parent() != cursor.semantic_parent() { + cursor.lexical_parent() != cursor.semantic_parent() { // Only parse constructors once. return Err(ParseError::Continue); } diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 00c2982209..b330291924 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -91,8 +91,8 @@ pub struct ItemAncestorsIter<'a, 'b> seen: DebugOnlyItemSet, } -impl <'a, 'b> ItemAncestorsIter<'a, 'b> - where 'b: 'a +impl<'a, 'b> ItemAncestorsIter<'a, 'b> + where 'b: 'a, { fn new(ctx: &'a BindgenContext<'b>, item: ItemId) -> Self { ItemAncestorsIter { @@ -606,9 +606,7 @@ impl Item { } /// Get the target item id for name generation. - fn name_target(&self, - ctx: &BindgenContext) - -> ItemId { + fn name_target(&self, ctx: &BindgenContext) -> ItemId { let mut targets_seen = DebugOnlyItemSet::new(); let mut item = self; @@ -673,7 +671,7 @@ impl Item { func.name() == func_name }) .position(|m| m.signature() == self.id()) - }) + }); } } @@ -682,9 +680,7 @@ impl Item { } /// Get this item's base name (aka non-namespaced name). - fn base_name(&self, - ctx: &BindgenContext) - -> String { + fn base_name(&self, ctx: &BindgenContext) -> String { if let Some(path) = self.annotations().use_instead_of() { return path.last().unwrap().clone(); } @@ -737,8 +733,7 @@ impl Item { ctx: &BindgenContext, opt: &NameOptions) -> String { - let target = - ctx.resolve_item(self.name_target(ctx)); + let target = ctx.resolve_item(self.name_target(ctx)); // Short-circuit if the target has an override, and just use that. if let Some(path) = target.annotations.use_instead_of() { @@ -1080,7 +1075,7 @@ impl ClangItemParser for Item { } if let Some(ty) = - ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { + ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { return Ok(ty); } @@ -1098,10 +1093,9 @@ impl ClangItemParser for Item { }; if valid_decl { - if let Some(&(_, item_id)) = - ctx.currently_parsed_types - .iter() - .find(|&&(d, _)| d == declaration_to_look_for) { + if let Some(&(_, item_id)) = ctx.currently_parsed_types + .iter() + .find(|&&(d, _)| d == declaration_to_look_for) { debug!("Avoiding recursion parsing type: {:?}", ty); return Ok(item_id); } @@ -1272,9 +1266,9 @@ impl ItemCanonicalPath for Item { .filter(|item| item.is_module() || item.id() == target.id()) .map(|item| { ctx.resolve_item(item.name_target(ctx)) - .name(ctx) - .within_namespaces() - .get() + .name(ctx) + .within_namespaces() + .get() }) .collect(); path.reverse(); diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index ada3d9b1bc..1878471dc2 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -660,12 +660,13 @@ impl Type { name = current.spelling(); - let inner_ty = cur.typedef_type().expect("Not valid Type?"); - inner = Item::from_ty( - &inner_ty, - Some(cur), - Some(potential_id), - ctx); + let inner_ty = cur.typedef_type() + .expect("Not valid Type?"); + inner = + Item::from_ty(&inner_ty, + Some(cur), + Some(potential_id), + ctx); } CXCursor_TemplateTypeParameter => { // See the comment in src/ir/comp.rs @@ -701,7 +702,9 @@ impl Type { } }; - TypeKind::TemplateAlias(name.clone(), inner_type, args) + TypeKind::TemplateAlias(name.clone(), + inner_type, + args) } CXCursor_TemplateRef => { let referenced = location.referenced().unwrap(); @@ -709,9 +712,9 @@ impl Type { debug!("TemplateRef: location = {:?}; referenced = \ {:?}; referenced_ty = {:?}", - location, - referenced, - referenced_ty); + location, + referenced, + referenced_ty); return Self::from_clang_ty(potential_id, &referenced_ty, @@ -726,9 +729,9 @@ impl Type { debug!("TypeRef: location = {:?}; referenced = \ {:?}; referenced_ty = {:?}", - location, - referenced, - referenced_ty); + location, + referenced, + referenced_ty); let item = Item::from_ty_or_ref_with_id(potential_id, diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 5bec040682..473dcf2997 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -546,7 +546,8 @@ impl<'ctx> Bindings<'ctx> { if let Some(clang) = clang_sys::support::Clang::find(None) { // If --target is specified, assume caller knows what they're doing // and don't mess with include paths for them - let has_target_arg = options.clang_args.iter() + let has_target_arg = options.clang_args + .iter() .rposition(|arg| arg.starts_with("--target")) .is_some(); if !has_target_arg { @@ -670,7 +671,7 @@ pub fn parse_one(ctx: &mut BindgenContext, use clang_sys::CXChildVisit_Continue; match Item::parse(cursor, parent, ctx) { - Ok(..) => {}, + Ok(..) => {} Err(ParseError::Continue) => {} Err(ParseError::Recurse) => { cursor.visit(|child| parse_one(ctx, child, parent)); From 44690e3a5c73f9df364d3548bf367a4198953eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 22 Dec 2016 12:00:47 +0100 Subject: [PATCH 0192/2291] codegen: Use the canonical type to generate function signatures. --- libbindgen/src/codegen/mod.rs | 10 +++------- .../expectations/tests/resolved_type_def_function.rs | 3 +++ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 192eb674a1..e9141b9c56 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -2010,14 +2010,10 @@ impl CodeGenerator for Function { } let signature_item = ctx.resolve_item(self.signature()); - let signature = signature_item.kind().expect_type(); + let signature = signature_item.kind().expect_type().canonical_type(ctx); let signature = match *signature.kind() { TypeKind::Function(ref sig) => sig, - TypeKind::ResolvedTypeRef(ref item_id) => { - let item = ctx.resolve_item(*item_id); - return self.codegen(ctx, result, _whitelisted_items, item); - }, - _ => panic!("How?") + _ => panic!("Signature kind is not a Function: {:?}", signature), }; let fndecl = utils::rust_fndecl_from_signature(ctx, signature_item); @@ -2268,7 +2264,7 @@ mod utils { -> P { use codegen::ToRustTy; - let signature = sig.kind().expect_type(); + let signature = sig.kind().expect_type().canonical_type(ctx); let signature = match *signature.kind() { TypeKind::Function(ref sig) => sig, _ => panic!("How?"), diff --git a/libbindgen/tests/expectations/tests/resolved_type_def_function.rs b/libbindgen/tests/expectations/tests/resolved_type_def_function.rs index fb308fa47d..83f07dd0c8 100644 --- a/libbindgen/tests/expectations/tests/resolved_type_def_function.rs +++ b/libbindgen/tests/expectations/tests/resolved_type_def_function.rs @@ -5,3 +5,6 @@ pub type FuncType = ::std::option::Option; +extern "C" { + pub fn Func(); +} From ab1d2122b29054e8682c21255fe25a2948b1ac2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 22 Dec 2016 12:43:29 +0100 Subject: [PATCH 0193/2291] ir: Be more resistent to failure when parsing enums. --- libbindgen/src/codegen/mod.rs | 6 +++++- libbindgen/src/ir/enum_ty.rs | 16 ++++++---------- libbindgen/src/ir/int.rs | 15 +++++++++++++++ .../tests/enum_in_template_with_typedef.rs | 18 ++++++++++++++++++ .../headers/enum_in_template_with_typedef.hpp | 16 ++++++++++++++++ 5 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/enum_in_template_with_typedef.rs create mode 100644 libbindgen/tests/headers/enum_in_template_with_typedef.hpp diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index e9141b9c56..6213a06843 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1562,7 +1562,11 @@ impl CodeGenerator for Enum { }; let signed = repr.is_signed(); - let size = layout.map(|l| l.size).unwrap_or(0); + let size = layout + .map(|l| l.size) + .or_else(|| repr.known_size()) + .unwrap_or(0); + let repr_name = match (signed, size) { (true, 1) => "i8", (false, 1) => "u8", diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index d7e4de099b..b65d3c068b 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -53,22 +53,18 @@ impl Enum { .and_then(|et| Item::from_ty(&et, None, None, ctx).ok()); let mut variants = vec![]; - let is_signed = match repr { - Some(repr) => { - let repr_type = ctx.resolve_type(repr); - match *repr_type.canonical_type(ctx).kind() { + // Assume signedness since the default type by the C standard is an int. + let is_signed = repr + .and_then(|r| ctx.resolve_type(r).safe_canonical_type(ctx)) + .map_or(true, |ty| { + match *ty.kind() { TypeKind::Int(ref int_kind) => int_kind.is_signed(), ref other => { panic!("Since when enums can be non-integers? {:?}", other) } } - } - // Assume signedness since the default type by the C - // standard is an - // int. - None => true, - }; + }); declaration.visit(|cursor| { if cursor.kind() == CXCursor_EnumConstantDecl { diff --git a/libbindgen/src/ir/int.rs b/libbindgen/src/ir/int.rs index 179ebb96ce..89068e0fab 100644 --- a/libbindgen/src/ir/int.rs +++ b/libbindgen/src/ir/int.rs @@ -91,6 +91,21 @@ impl IntKind { } } + /// If this type has a known size, return it (in bytes). This is to + /// alleviate libclang sometimes not giving us a layout (like in the case + /// when an enum is defined inside a class with template parameters). + pub fn known_size(&self) -> Option { + use self::IntKind::*; + Some(match *self { + Bool | UChar | Char | U8 | I8 => 1, + U16 | I16 => 2, + U32 | I32 => 4, + U64 | I64 => 8, + I128 | U128 => 16, + _ => return None, + }) + } + /// Whether this type's signedness matches the value. pub fn signedness_matches(&self, val: i64) -> bool { val >= 0 || self.is_signed() diff --git a/libbindgen/tests/expectations/tests/enum_in_template_with_typedef.rs b/libbindgen/tests/expectations/tests/enum_in_template_with_typedef.rs new file mode 100644 index 0000000000..66a304aa95 --- /dev/null +++ b/libbindgen/tests/expectations/tests/enum_in_template_with_typedef.rs @@ -0,0 +1,18 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct std_fbstring_core { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +pub type std_fbstring_core_category_type = u8; +pub const std_fbstring_core_Category_Bar: std_fbstring_core_Category = + std_fbstring_core_Category::Foo; +#[repr(u8)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum std_fbstring_core_Category { Foo = 0, } diff --git a/libbindgen/tests/headers/enum_in_template_with_typedef.hpp b/libbindgen/tests/headers/enum_in_template_with_typedef.hpp new file mode 100644 index 0000000000..ac19b7813c --- /dev/null +++ b/libbindgen/tests/headers/enum_in_template_with_typedef.hpp @@ -0,0 +1,16 @@ +// bindgen-flags: -- -std=c++11 + +namespace std { + template class fbstring_core; +} + +typedef unsigned char uint8_t; +namespace std { + template class fbstring_core { + typedef uint8_t category_type; + enum Category : category_type { + Foo = 1, + Bar = 4, + }; + }; +} From f2099ad4d0c4d19fc75b1613dbc1e6ada2625c29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 22 Dec 2016 12:46:27 +0100 Subject: [PATCH 0194/2291] libbindgen: run `cargo fmt`. --- bindgen/src/options.rs | 6 +++--- libbindgen/src/clang.rs | 4 ++-- libbindgen/src/codegen/mod.rs | 15 ++++++++------- libbindgen/src/ir/context.rs | 13 ++++++++----- libbindgen/src/ir/enum_ty.rs | 18 +++++++++--------- libbindgen/src/ir/item.rs | 13 ++++++++----- libbindgen/src/ir/ty.rs | 4 ++-- libbindgen/src/lib.rs | 23 ++++++++++++----------- libbindgen/tests/tests.rs | 26 +++++++++++++++----------- 9 files changed, 67 insertions(+), 55 deletions(-) diff --git a/bindgen/src/options.rs b/bindgen/src/options.rs index a783696ec4..41a8a90574 100644 --- a/bindgen/src/options.rs +++ b/bindgen/src/options.rs @@ -1,5 +1,5 @@ use clap::{App, Arg}; -use libbindgen::{Builder, builder, CodegenConfig}; +use libbindgen::{Builder, CodegenConfig, builder}; use std::fs::File; use std::io::{self, Error, ErrorKind}; @@ -200,8 +200,8 @@ pub fn builder_from_flags(args: I) "vars" => config.vars = true, "methods" => config.methods = true, _ => { - return Err( - Error::new(ErrorKind::Other, "Unknown generate item")); + return Err(Error::new(ErrorKind::Other, + "Unknown generate item")); } } } diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index fc5575b38c..de0ebf156c 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -832,8 +832,8 @@ impl SourceLocation { &mut col, &mut off); (File { - x: file, - }, + x: file, + }, line as usize, col as usize, off as usize) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 6213a06843..69d5f65136 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -727,14 +727,15 @@ impl CodeGenerator for CompInfo { let layout = item.kind().expect_type().layout(ctx); if let Some(layout) = layout { - let fn_name = format!("__bindgen_test_layout_template_{}", result.next_id()); + let fn_name = format!("__bindgen_test_layout_template_{}", + result.next_id()); let fn_name = ctx.rust_ident_raw(&fn_name); let ident = item.to_rust_ty(ctx); let prefix = ctx.trait_prefix(); let size_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::size_of::<$ident>()); + ::$prefix::mem::size_of::<$ident>()); let align_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::align_of::<$ident>()); + ::$prefix::mem::align_of::<$ident>()); let size = layout.size; let align = layout.align; let item = quote_item!(ctx.ext_cx(), @@ -894,7 +895,7 @@ impl CodeGenerator for CompInfo { // Try to catch a bitfield contination early. if let (Some(ref mut bitfield_width), Some(width)) = - (current_bitfield_width, field.bitfield()) { + (current_bitfield_width, field.bitfield()) { let layout = current_bitfield_layout.unwrap(); debug!("Testing bitfield continuation {} {} {:?}", *bitfield_width, width, layout); @@ -1562,8 +1563,7 @@ impl CodeGenerator for Enum { }; let signed = repr.is_signed(); - let size = layout - .map(|l| l.size) + let size = layout.map(|l| l.size) .or_else(|| repr.known_size()) .unwrap_or(0); @@ -1621,7 +1621,8 @@ impl CodeGenerator for Enum { // Only to avoid recomputing every time. enum_canonical_name: &str, // May be the same as "variant" if it's because the - // enum is unnamed and we still haven't seen the value. + // enum is unnamed and we still haven't seen the + // value. variant_name: &str, referenced_name: &str, enum_rust_ty: P, diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index ba8ffe8226..3ffe50c835 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -1135,7 +1135,8 @@ impl<'ctx, 'gen> Iterator for WhitelistedItemsIter<'ctx, 'gen> /// An iterator to find any dangling items. /// -/// See `BindgenContext::assert_no_dangling_item_traversal` for more information. +/// See `BindgenContext::assert_no_dangling_item_traversal` for more +/// information. pub struct AssertNoDanglingItemIter<'ctx, 'gen> where 'gen: 'ctx, { @@ -1152,8 +1153,8 @@ impl<'ctx, 'gen> Iterator for AssertNoDanglingItemIter<'ctx, 'gen> fn next(&mut self) -> Option { let id = match self.to_iterate.pop_front() { None => { - // We've traversed everything reachable from the previous root(s), see if - // we have any more roots. + // We've traversed everything reachable from the previous + // root(s), see if we have any more roots. match self.ctx .items() .filter(|&(id, _)| !self.seen.contains_key(id)) @@ -1177,8 +1178,10 @@ impl<'ctx, 'gen> Iterator for AssertNoDanglingItemIter<'ctx, 'gen> let mut path = vec![]; let mut current = id; loop { - let predecessor = *self.seen.get(¤t) - .expect("We know we found this item id, so it must have a predecessor"); + let predecessor = *self.seen + .get(¤t) + .expect("We know we found this item id, so it must have a \ + predecessor"); if predecessor == current { break; } diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index b65d3c068b..5c1ead4587 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -54,17 +54,17 @@ impl Enum { let mut variants = vec![]; // Assume signedness since the default type by the C standard is an int. - let is_signed = repr - .and_then(|r| ctx.resolve_type(r).safe_canonical_type(ctx)) - .map_or(true, |ty| { - match *ty.kind() { - TypeKind::Int(ref int_kind) => int_kind.is_signed(), - ref other => { - panic!("Since when enums can be non-integers? {:?}", + let is_signed = + repr.and_then(|r| ctx.resolve_type(r).safe_canonical_type(ctx)) + .map_or(true, |ty| { + match *ty.kind() { + TypeKind::Int(ref int_kind) => int_kind.is_signed(), + ref other => { + panic!("Since when enums can be non-integers? {:?}", other) + } } - } - }); + }); declaration.visit(|cursor| { if cursor.kind() == CXCursor_EnumConstantDecl { diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index b330291924..0d5e6ba2ad 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -696,7 +696,9 @@ impl Item { } ItemKind::Type(ref ty) => { let name = match *ty.kind() { - TypeKind::ResolvedTypeRef(..) => panic!("should have resolved this in name_target()"), + TypeKind::ResolvedTypeRef(..) => { + panic!("should have resolved this in name_target()") + } _ => ty.name(), }; name.map(ToOwned::to_owned) @@ -1075,7 +1077,7 @@ impl ClangItemParser for Item { } if let Some(ty) = - ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { + ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { return Ok(ty); } @@ -1093,9 +1095,10 @@ impl ClangItemParser for Item { }; if valid_decl { - if let Some(&(_, item_id)) = ctx.currently_parsed_types - .iter() - .find(|&&(d, _)| d == declaration_to_look_for) { + if let Some(&(_, item_id)) = + ctx.currently_parsed_types + .iter() + .find(|&&(d, _)| d == declaration_to_look_for) { debug!("Avoiding recursion parsing type: {:?}", ty); return Ok(item_id); } diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 1878471dc2..60092d5449 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -696,8 +696,8 @@ impl Type { let inner_type = match inner { Ok(inner) => inner, Err(..) => { - error!("Failed to parse template alias {:?}", - location); + error!("Failed to parse template alias \ + {:?}", location); return Err(ParseError::Continue); } }; diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 473dcf2997..a74c1799e1 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -517,7 +517,8 @@ fn ensure_libclang_is_loaded() { // TODO(emilio): Return meaningful error (breaking). clang_sys::load().expect("Unable to find libclang"); *libclang = Some(clang_sys::get_library() - .expect("We just loaded libclang and it had better still be here!")); + .expect("We just loaded libclang and it had \ + better still be here!")); } else { clang_sys::set_library(libclang.clone()); } @@ -630,16 +631,16 @@ impl<'ctx> Bindings<'ctx> { /// /// See the `uses` module for more information. pub fn write_dummy_uses(&mut self) -> io::Result<()> { - let file = - if let Some(ref dummy_path) = self.context.options().dummy_uses { - Some(try!(OpenOptions::new() - .write(true) - .truncate(true) - .create(true) - .open(dummy_path))) - } else { - None - }; + let file = if let Some(ref dummy_path) = + self.context.options().dummy_uses { + Some(try!(OpenOptions::new() + .write(true) + .truncate(true) + .create(true) + .open(dummy_path))) + } else { + None + }; if let Some(file) = file { try!(uses::generate_dummy_uses(&mut self.context, file)); diff --git a/libbindgen/tests/tests.rs b/libbindgen/tests/tests.rs index 12816c1b0b..014308794f 100644 --- a/libbindgen/tests/tests.rs +++ b/libbindgen/tests/tests.rs @@ -43,7 +43,7 @@ fn compare_generated_header(header: &PathBuf, return Ok(()); } return Err(Error::new(ErrorKind::Other, - "Something's gone really wrong!")) + "Something's gone really wrong!")); } println!("diff expected generated"); @@ -79,10 +79,13 @@ fn create_bindgen_builder(header: &PathBuf) let line = try!(line); if line.contains("bindgen-flags: ") { let extra_flags = line.split("bindgen-flags: ") - .last().and_then(shlex::split).unwrap(); + .last() + .and_then(shlex::split) + .unwrap(); flags.extend(extra_flags.into_iter()); - } else if line.contains("bindgen-unstable") && cfg!(feature = "llvm_stable") { - return Ok(None) + } else if line.contains("bindgen-unstable") && + cfg!(feature = "llvm_stable") { + return Ok(None); } } @@ -94,13 +97,14 @@ fn create_bindgen_builder(header: &PathBuf) let header_str = try!(header.to_str() .ok_or(Error::new(ErrorKind::Other, "Invalid header file name"))); - let prepend = [ - "bindgen", - header_str, - "--raw-line", "", - "--raw-line", "#![allow(non_snake_case)]", - "--raw-line", "", - ]; + let prepend = ["bindgen", + header_str, + "--raw-line", + "", + "--raw-line", + "#![allow(non_snake_case)]", + "--raw-line", + ""]; let args = prepend.into_iter() .map(ToString::to_string) From 1ad2821a83c44384946252cca97c4185399e8f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 22 Dec 2016 12:47:00 +0100 Subject: [PATCH 0195/2291] bindgen-integration: run `cargo fmt` --- bindgen-integration/src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bindgen-integration/src/lib.rs b/bindgen-integration/src/lib.rs index 4f239510f4..5c4b43083f 100644 --- a/bindgen-integration/src/lib.rs +++ b/bindgen-integration/src/lib.rs @@ -7,9 +7,7 @@ use std::ffi::CStr; #[test] fn test_static_method() { let c_str = unsafe { bindings::Test::name() }; - let name = unsafe { - CStr::from_ptr(c_str).to_string_lossy().into_owned() - }; + let name = unsafe { CStr::from_ptr(c_str).to_string_lossy().into_owned() }; assert_eq!(name, "Test", "Calling a static C++ method works!"); } From 276695159b3462a625cf5c42bc07aef19cfb0a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 23 Dec 2016 12:11:03 +0100 Subject: [PATCH 0196/2291] ir: Don't parse default template parameter types. It's a bunch of complexity we don't use nor need. --- libbindgen/src/ir/comp.rs | 6 ------ libbindgen/src/ir/item.rs | 11 ++++------- libbindgen/src/ir/ty.rs | 22 +++++++--------------- libbindgen/src/parse.rs | 2 -- 4 files changed, 11 insertions(+), 30 deletions(-) diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index d5d3426245..eaccda8efa 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -644,13 +644,7 @@ impl CompInfo { return CXChildVisit_Continue; } - let default_type = Item::from_ty(&cur.cur_type(), - Some(cur), - Some(potential_id), - ctx) - .ok(); let param = Item::named_type(cur.spelling(), - default_type, potential_id, ctx); ci.template_args.push(param); diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 0d5e6ba2ad..932b06fc9f 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -499,8 +499,8 @@ impl Item { parent_template_args.iter().any(|parent_item| { let parent_ty = ctx.resolve_type(*parent_item); match (parent_ty.kind(), item_ty.kind()) { - (&TypeKind::Named(ref n, _), - &TypeKind::Named(ref i, _)) => n == i, + (&TypeKind::Named(ref n), + &TypeKind::Named(ref i)) => n == i, _ => false, } }) @@ -1163,7 +1163,6 @@ impl ClangItemParser for Item { ty.spelling()); Ok(Self::named_type_with_id(id, ty.spelling(), - None, relevant_parent_id, ctx)) } else { @@ -1189,7 +1188,6 @@ impl ClangItemParser for Item { /// available yet. fn named_type_with_id(id: ItemId, name: S, - default: Option, parent_id: ItemId, ctx: &mut BindgenContext) -> ItemId @@ -1203,7 +1201,7 @@ impl ClangItemParser for Item { None, None, parent_id, - ItemKind::Type(Type::named(name, default))), + ItemKind::Type(Type::named(name))), None, None); @@ -1211,14 +1209,13 @@ impl ClangItemParser for Item { } fn named_type(name: S, - default: Option, parent_id: ItemId, ctx: &mut BindgenContext) -> ItemId where S: Into, { let id = ctx.next_item_id(); - Self::named_type_with_id(id, name, default, parent_id, ctx) + Self::named_type_with_id(id, name, parent_id, ctx) } } diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 60092d5449..b04afeb6af 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -140,10 +140,10 @@ impl Type { } /// Creates a new named type, with name `name`. - pub fn named(name: String, default: Option) -> Self { + pub fn named(name: String) -> Self { assert!(!name.is_empty()); // TODO: stop duplicating the name, it's stupid. - let kind = TypeKind::Named(name.clone(), default); + let kind = TypeKind::Named(name.clone()); Self::new(Some(name), None, kind, false) } @@ -318,12 +318,12 @@ impl Type { ty: &Type) -> bool { let name = match *ty.kind() { - TypeKind::Named(ref name, _) => name, + TypeKind::Named(ref name) => name, ref other @ _ => unreachable!("Not a named type: {:?}", other), }; match self.kind { - TypeKind::Named(ref this_name, _) => this_name == name, + TypeKind::Named(ref this_name) => this_name == name, TypeKind::ResolvedTypeRef(t) | TypeKind::Array(t, _) | TypeKind::Pointer(t) | @@ -478,9 +478,8 @@ pub enum TypeKind { /// replace one type with another. ResolvedTypeRef(ItemId), - /// A named type, that is, a template parameter, with an optional default - /// type. - Named(String, Option), + /// A named type, that is, a template parameter. + Named(String), } impl Type { @@ -675,15 +674,8 @@ impl Type { return CXChildVisit_Continue; } - let default_type = - Item::from_ty(&cur.cur_type(), - Some(cur), - Some(potential_id), - ctx) - .ok(); let param = Item::named_type(cur.spelling(), - default_type, potential_id, ctx); args.push(param); @@ -903,7 +895,6 @@ impl TypeCollector for Type { TypeKind::Reference(inner) | TypeKind::Array(inner, _) | TypeKind::Alias(_, inner) | - TypeKind::Named(_, Some(inner)) | TypeKind::ResolvedTypeRef(inner) => { types.insert(inner); } @@ -919,6 +910,7 @@ impl TypeCollector for Type { TypeKind::Function(ref sig) => { sig.collect_types(context, types, item) } + TypeKind::Named(_) => {}, // FIXME: Pending types! ref other @ _ => { debug!("::collect_types: Ignoring: \ diff --git a/libbindgen/src/parse.rs b/libbindgen/src/parse.rs index 28e6575945..0e4164f0b3 100644 --- a/libbindgen/src/parse.rs +++ b/libbindgen/src/parse.rs @@ -82,7 +82,6 @@ pub trait ClangItemParser: Sized { /// Create a named template type. fn named_type(name: S, - default: Option, parent: ItemId, context: &mut BindgenContext) -> ItemId @@ -92,7 +91,6 @@ pub trait ClangItemParser: Sized { /// `ItemId`. fn named_type_with_id(id: ItemId, name: S, - default: Option, parent: ItemId, context: &mut BindgenContext) -> ItemId From c681687ed045d0d8e73bae51fa2f22dcf2c6d517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 23 Dec 2016 12:28:51 +0100 Subject: [PATCH 0197/2291] ir: Don't assume that base classes are already resolved. Fixes #359 --- libbindgen/src/ir/comp.rs | 3 +-- .../tests/expectations/tests/anon_union.rs | 14 +++++----- .../bad-namespace-parenthood-inheritance.rs | 20 ++++++++++++++ libbindgen/tests/expectations/tests/crtp.rs | 24 ++++++++--------- .../forward-inherit-struct-with-fields.rs | 10 +++---- .../tests/forward-inherit-struct.rs | 4 +-- .../tests/vtable_recursive_sig.rs | 26 +++++++++---------- .../bad-namespace-parenthood-inheritance.hpp | 15 +++++++++++ 8 files changed, 75 insertions(+), 41 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs create mode 100644 libbindgen/tests/headers/bad-namespace-parenthood-inheritance.hpp diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index eaccda8efa..1c69e6189d 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -654,8 +654,7 @@ impl CompInfo { ci.has_vtable = cur.is_virtual_base(); } let type_id = - Item::from_ty(&cur.cur_type(), Some(cur), None, ctx) - .expect("BaseSpecifier"); + Item::from_ty_or_ref(cur.cur_type(), Some(cur), None, ctx); ci.base_members.push(type_id); } CXCursor_Constructor | diff --git a/libbindgen/tests/expectations/tests/anon_union.rs b/libbindgen/tests/expectations/tests/anon_union.rs index 8ae92b316a..f8559ca920 100644 --- a/libbindgen/tests/expectations/tests/anon_union.rs +++ b/libbindgen/tests/expectations/tests/anon_union.rs @@ -62,13 +62,6 @@ pub struct TErrorResult__bindgen_ty_1 { pub bindgen_union_field: u64, pub _phantom_0: ::std::marker::PhantomData, } -#[test] -fn __bindgen_test_layout_template_1() { - assert_eq!(::std::mem::size_of::>() , - 24usize); - assert_eq!(::std::mem::align_of::>() , - 8usize); -} #[repr(C)] #[derive(Debug, Copy)] pub struct ErrorResult { @@ -82,3 +75,10 @@ fn bindgen_test_layout_ErrorResult() { impl Clone for ErrorResult { fn clone(&self) -> Self { *self } } +#[test] +fn __bindgen_test_layout_template_1() { + assert_eq!(::std::mem::size_of::>() , + 24usize); + assert_eq!(::std::mem::align_of::>() , + 8usize); +} diff --git a/libbindgen/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs b/libbindgen/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs new file mode 100644 index 0000000000..553879b7a8 --- /dev/null +++ b/libbindgen/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs @@ -0,0 +1,20 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct std_char_traits<_CharT> { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData<_CharT>, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct __gnu_cxx_char_traits { + pub _address: u8, +} +impl Clone for __gnu_cxx_char_traits { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/expectations/tests/crtp.rs b/libbindgen/tests/expectations/tests/crtp.rs index 109a768a62..cc488fd6c3 100644 --- a/libbindgen/tests/expectations/tests/crtp.rs +++ b/libbindgen/tests/expectations/tests/crtp.rs @@ -10,11 +10,6 @@ pub struct Base { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } -#[test] -fn __bindgen_test_layout_template_1() { - assert_eq!(::std::mem::size_of::>() , 1usize); - assert_eq!(::std::mem::align_of::>() , 1usize); -} #[repr(C)] #[derive(Debug, Copy)] pub struct Derived { @@ -34,13 +29,6 @@ pub struct BaseWithDestructor { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } -#[test] -fn __bindgen_test_layout_template_2() { - assert_eq!(::std::mem::size_of::>() - , 1usize); - assert_eq!(::std::mem::align_of::>() - , 1usize); -} #[repr(C)] #[derive(Debug)] pub struct DerivedFromBaseWithDestructor { @@ -53,3 +41,15 @@ fn bindgen_test_layout_DerivedFromBaseWithDestructor() { assert_eq!(::std::mem::align_of::() , 1usize); } +#[test] +fn __bindgen_test_layout_template_1() { + assert_eq!(::std::mem::size_of::>() , 1usize); + assert_eq!(::std::mem::align_of::>() , 1usize); +} +#[test] +fn __bindgen_test_layout_template_2() { + assert_eq!(::std::mem::size_of::>() + , 1usize); + assert_eq!(::std::mem::align_of::>() + , 1usize); +} diff --git a/libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs b/libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs index fc24e98921..e377b3ad2a 100644 --- a/libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs +++ b/libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs @@ -6,12 +6,12 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct RootedBase { - pub foo: *mut T, - pub next: *mut Rooted, +pub struct Rooted { + pub _base: js_RootedBase, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct Rooted { - pub _base: RootedBase, +pub struct js_RootedBase { + pub foo: *mut T, + pub next: *mut Rooted, } diff --git a/libbindgen/tests/expectations/tests/forward-inherit-struct.rs b/libbindgen/tests/expectations/tests/forward-inherit-struct.rs index a58058b002..5de70fa9fa 100644 --- a/libbindgen/tests/expectations/tests/forward-inherit-struct.rs +++ b/libbindgen/tests/expectations/tests/forward-inherit-struct.rs @@ -6,13 +6,13 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct RootedBase { +pub struct Rooted { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct Rooted { +pub struct js_RootedBase { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } diff --git a/libbindgen/tests/expectations/tests/vtable_recursive_sig.rs b/libbindgen/tests/expectations/tests/vtable_recursive_sig.rs index 773123367f..ce62eeb0fc 100644 --- a/libbindgen/tests/expectations/tests/vtable_recursive_sig.rs +++ b/libbindgen/tests/expectations/tests/vtable_recursive_sig.rs @@ -4,6 +4,19 @@ #![allow(non_snake_case)] +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Derived { + pub _base: Base, +} +#[test] +fn bindgen_test_layout_Derived() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for Derived { + fn clone(&self) -> Self { *self } +} #[repr(C)] pub struct Base__bindgen_vtable { } @@ -20,16 +33,3 @@ fn bindgen_test_layout_Base() { impl Clone for Base { fn clone(&self) -> Self { *self } } -#[repr(C)] -#[derive(Debug, Copy)] -pub struct Derived { - pub _base: Base, -} -#[test] -fn bindgen_test_layout_Derived() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); -} -impl Clone for Derived { - fn clone(&self) -> Self { *self } -} diff --git a/libbindgen/tests/headers/bad-namespace-parenthood-inheritance.hpp b/libbindgen/tests/headers/bad-namespace-parenthood-inheritance.hpp new file mode 100644 index 0000000000..ce21a40158 --- /dev/null +++ b/libbindgen/tests/headers/bad-namespace-parenthood-inheritance.hpp @@ -0,0 +1,15 @@ +namespace std +{ + template < typename > struct char_traits; +} +namespace __gnu_cxx +{ + template < typename > struct char_traits; +} +namespace std +{ + template < class _CharT > struct char_traits:__gnu_cxx::char_traits < + _CharT > + { + }; +} From e470b4475dcd7f79042a4905d38bf393da23df44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 23 Dec 2016 12:37:16 +0100 Subject: [PATCH 0198/2291] lib: Remove unused libc dependency. --- libbindgen/Cargo.toml | 1 - libbindgen/src/lib.rs | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 408d9fc1ad..0f7b0e183d 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -28,7 +28,6 @@ cexpr = "0.2" cfg-if = "0.1.0" clang-sys = { version = "0.12", features = ["runtime", "clang_3_9"] } lazy_static = "0.2.1" -libc = "0.2" rustc-serialize = "0.3.19" syntex_syntax = "0.50" regex = "0.1" diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index a74c1799e1..5054cd13ef 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -7,6 +7,7 @@ #![deny(missing_docs)] #![deny(warnings)] +#![deny(unused_extern_crates)] // We internally use the deprecated BindgenOptions all over the place. Once we // remove its `pub` declaration, we can un-deprecate it and remove this pragma. @@ -17,13 +18,13 @@ #![allow(non_upper_case_globals)] #[macro_use] +#[allow(unused_extern_crates)] extern crate cfg_if; extern crate cexpr; extern crate syntex_syntax as syntax; extern crate aster; extern crate quasi; extern crate clang_sys; -extern crate libc; extern crate regex; #[macro_use] extern crate lazy_static; From ae84a039ce3790091c529ee8ecf767de919659a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 23 Dec 2016 13:31:12 +0100 Subject: [PATCH 0199/2291] libbindgen: Bump version for crates.io --- libbindgen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index 0f7b0e183d..e6e9a5db29 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -12,7 +12,7 @@ license = "BSD-3-Clause" name = "libbindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" -version = "0.1.3" +version = "0.1.4" workspace = ".." [dev-dependencies] From b93faf9015e91303a9cfb14281c1ebe5ca877acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 23 Dec 2016 17:55:16 +0100 Subject: [PATCH 0200/2291] Add test from #358. --- .../tests/expectations/tests/issue-358.rs | 20 +++++++++++++++++++ libbindgen/tests/headers/issue-358.hpp | 8 ++++++++ 2 files changed, 28 insertions(+) create mode 100644 libbindgen/tests/expectations/tests/issue-358.rs create mode 100644 libbindgen/tests/headers/issue-358.hpp diff --git a/libbindgen/tests/expectations/tests/issue-358.rs b/libbindgen/tests/expectations/tests/issue-358.rs new file mode 100644 index 0000000000..1b933d3437 --- /dev/null +++ b/libbindgen/tests/expectations/tests/issue-358.rs @@ -0,0 +1,20 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct JS_PersistentRooted { + pub _base: a, + pub _phantom_0: ::std::marker::PhantomData, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct a { + pub b: *mut a, +} +impl Clone for a { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/headers/issue-358.hpp b/libbindgen/tests/headers/issue-358.hpp new file mode 100644 index 0000000000..b14521b73b --- /dev/null +++ b/libbindgen/tests/headers/issue-358.hpp @@ -0,0 +1,8 @@ +// bindgen-flags: -- -std=c++11 +namespace JS { +template class PersistentRooted; +} +template class a { a *b; }; +namespace JS { +template class PersistentRooted : a> {}; +} From 912abe5b584960e9c15a3cd050f965ab69bf5f7e Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Wed, 28 Dec 2016 11:58:29 +1100 Subject: [PATCH 0201/2291] ir: Skip function template earlier. This should fix #364. --- libbindgen/Cargo.toml | 2 +- libbindgen/src/ir/function.rs | 5 +++++ .../expectations/tests/template_function_with_auto.rs | 10 ++++++++++ .../tests/headers/template_function_with_auto.hpp | 9 +++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 libbindgen/tests/expectations/tests/template_function_with_auto.rs create mode 100644 libbindgen/tests/headers/template_function_with_auto.hpp diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index e6e9a5db29..dfaba98b36 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -12,7 +12,7 @@ license = "BSD-3-Clause" name = "libbindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" -version = "0.1.4" +version = "0.1.5" workspace = ".." [dev-dependencies] diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs index 7aed3d7ebf..88ab861dcf 100644 --- a/libbindgen/src/ir/function.rs +++ b/libbindgen/src/ir/function.rs @@ -134,6 +134,11 @@ impl FunctionSig { use clang_sys::*; debug!("FunctionSig::from_ty {:?} {:?}", ty, cursor); + // Skip function templates + if cursor.kind() == CXCursor_FunctionTemplate { + return Err(ParseError::Continue); + } + // Don't parse operatorxx functions in C++ let spelling = cursor.spelling(); if spelling.starts_with("operator") { diff --git a/libbindgen/tests/expectations/tests/template_function_with_auto.rs b/libbindgen/tests/expectations/tests/template_function_with_auto.rs new file mode 100644 index 0000000000..b86d822488 --- /dev/null +++ b/libbindgen/tests/expectations/tests/template_function_with_auto.rs @@ -0,0 +1,10 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +extern "C" { + #[link_name = "_Z5Test2v"] + pub fn Test2() -> ::std::os::raw::c_uint; +} diff --git a/libbindgen/tests/headers/template_function_with_auto.hpp b/libbindgen/tests/headers/template_function_with_auto.hpp new file mode 100644 index 0000000000..3bd4a64f7b --- /dev/null +++ b/libbindgen/tests/headers/template_function_with_auto.hpp @@ -0,0 +1,9 @@ +// bindgen-flags: -- -std=c++14 + +template auto Test1() { + return T(1); +} + +auto Test2() { + return Test1(); +} From f7a328a2406e98d93a10453c613f675ce51471a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 28 Dec 2016 11:16:14 +0100 Subject: [PATCH 0202/2291] ir: More generic handling of non-deductible auto types. --- libbindgen/src/ir/comp.rs | 6 +++--- libbindgen/src/ir/ty.rs | 7 +++++-- libbindgen/src/ir/var.rs | 11 +++++++++-- libbindgen/tests/expectations/tests/auto.rs | 12 +++++++++++- .../tests/template_function_with_auto.rs | 10 ---------- libbindgen/tests/headers/auto.hpp | 17 +++++++++++++++-- .../headers/template_function_with_auto.hpp | 9 --------- 7 files changed, 43 insertions(+), 29 deletions(-) delete mode 100644 libbindgen/tests/expectations/tests/template_function_with_auto.rs delete mode 100644 libbindgen/tests/headers/template_function_with_auto.hpp diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index 1c69e6189d..ea3850ccd4 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -748,9 +748,9 @@ impl CompInfo { return CXChildVisit_Continue; } - let item = Item::parse(cur, Some(potential_id), ctx) - .expect("VarDecl"); - ci.inner_vars.push(item); + if let Ok(item) = Item::parse(cur, Some(potential_id), ctx) { + ci.inner_vars.push(item); + } } // Intentionally not handled CXCursor_CXXAccessSpecifier | diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index b04afeb6af..6859b75386 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -776,8 +776,11 @@ impl Type { } } CXType_Auto => { - // We don't want to blow the stack. - assert!(canonical_ty != *ty, "Couldn't find deduced type"); + if canonical_ty == *ty { + debug!("Couldn't find deduced type: {:?}", ty); + return Err(ParseError::Continue); + } + return Self::from_clang_ty(potential_id, &canonical_ty, location, diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index 518141c64b..d9160ecad8 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -186,8 +186,15 @@ impl ClangSubItemParser for Var { // XXX this is redundant, remove! let is_const = ty.is_const(); - let ty = Item::from_ty(&ty, Some(cursor), None, ctx) - .expect("Unable to resolve constant type?"); + let ty = match Item::from_ty(&ty, Some(cursor), None, ctx) { + Ok(ty) => ty, + Err(e) => { + assert_eq!(ty.kind(), CXType_Auto, + "Couldn't resolve constant type, and it \ + wasn't an nondeductible auto type!"); + return Err(e); + } + }; // Note: Ty might not be totally resolved yet, see // tests/headers/inner_const.hpp diff --git a/libbindgen/tests/expectations/tests/auto.rs b/libbindgen/tests/expectations/tests/auto.rs index e35f5ed28b..6224e8073b 100644 --- a/libbindgen/tests/expectations/tests/auto.rs +++ b/libbindgen/tests/expectations/tests/auto.rs @@ -9,7 +9,7 @@ pub struct Foo { pub _address: u8, } -pub const Foo_kBar: bool = true; +pub const Foo_kFoo: bool = true; #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 1usize); @@ -18,3 +18,13 @@ fn bindgen_test_layout_Foo() { impl Clone for Foo { fn clone(&self) -> Self { *self } } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Bar { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +extern "C" { + #[link_name = "_Z5Test2v"] + pub fn Test2() -> ::std::os::raw::c_uint; +} diff --git a/libbindgen/tests/expectations/tests/template_function_with_auto.rs b/libbindgen/tests/expectations/tests/template_function_with_auto.rs deleted file mode 100644 index b86d822488..0000000000 --- a/libbindgen/tests/expectations/tests/template_function_with_auto.rs +++ /dev/null @@ -1,10 +0,0 @@ -/* automatically generated by rust-bindgen */ - - -#![allow(non_snake_case)] - - -extern "C" { - #[link_name = "_Z5Test2v"] - pub fn Test2() -> ::std::os::raw::c_uint; -} diff --git a/libbindgen/tests/headers/auto.hpp b/libbindgen/tests/headers/auto.hpp index 64025295eb..b5f6d5f360 100644 --- a/libbindgen/tests/headers/auto.hpp +++ b/libbindgen/tests/headers/auto.hpp @@ -1,6 +1,19 @@ -// bindgen-flags: -- -std=c++11 +// bindgen-flags: -- -std=c++14 // bindgen-unstable class Foo { - static constexpr auto kBar = 2 == 2; + static constexpr auto kFoo = 2 == 2; }; + +template +class Bar { + static const constexpr auto kBar = T(1); +}; + +template auto Test1() { + return T(1); +} + +auto Test2() { + return Test1(); +} diff --git a/libbindgen/tests/headers/template_function_with_auto.hpp b/libbindgen/tests/headers/template_function_with_auto.hpp deleted file mode 100644 index 3bd4a64f7b..0000000000 --- a/libbindgen/tests/headers/template_function_with_auto.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// bindgen-flags: -- -std=c++14 - -template auto Test1() { - return T(1); -} - -auto Test2() { - return Test1(); -} From a65e825e86f1d3485b85f5485a69e3f0a35defe5 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Wed, 28 Dec 2016 13:54:17 +1100 Subject: [PATCH 0203/2291] Update README.md to reflect the current situation There are several changes: * Announce that Clang 3.9 is the new default * Update the install steps for 3.9 * Add installing steps for Windows * Update stylo's usage of bindgen --- README.md | 73 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index f25b815bb2..3b3f56e60e 100644 --- a/README.md +++ b/README.md @@ -10,43 +10,42 @@ the [Stylo](https://public.etherpad-mozilla.org/p/stylo) project. ## Requirements -The current generator runs on with clang 3.8, but can also run with clang 3.9 -with more features (such as detection of inlined functions). +It is recommended to use clang 3.9 with the current generator. It can run with +clang 3.8 with some features disabled. -### Installing clang 3.8 +### Installing Clang 3.9 -#### OSX +#### Windows -``` -# brew install llvm38 -``` +Download and install the official pre-built binary from +[LLVM download page](http://releases.llvm.org/download.html). -#### On Debian-based Linuxes +#### OSX +If you use Homebrew: ``` -# apt-get install llvm-3.8-dev libclang-3.8-dev +$ brew install llvm ``` -Adding the LLVM repos to get version 3.8 may be necessary, see http://apt.llvm.org/. -#### Arch +If you use MacPorts: ``` -# pacman -S clang clang-tools-extra +$ port install clang-3.9 ``` -### Getting clang 3.9 +#### Debian-based Linuxes -#### From a package manager +``` +# apt-get install llvm-3.9-dev libclang-3.9-dev +``` -Clang 3.9 has ben released about a month ago, and some package managers already -provide it. +Ubuntu 16.10 provides the necessary packages directly. If you are using older +version of Ubuntu or other Debian-based distros, you may need to add the LLVM +repos to get version 3.9. See http://apt.llvm.org/. -For example, for MacPorts: +#### Arch ``` -$ port install clang-3.9 -$ LIBCLANG_PATH=/opt/local/libexec/llvm-3.9/lib \ - LD_LIBRARY_PATH=/opt/local/libexec/llvm-3.9/lib \ - cargo build +# pacman -S clang ``` #### From source @@ -65,19 +64,31 @@ Those instructions list optional steps. For bindgen: ## Building ``` -$ cargo build --features llvm_stable +$ cd bindgen +$ cargo build ``` -If you want a build with extra features (llvm 3.9) then you can use: +If you installed multiple versions of llvm, it may not be able to locate the +latest version of libclang. In that case, you may want to either uninstall +other versions of llvm, or specify the path of the desired libclang explicitly: +``` +$ export LIBCLANG_PATH=path/to/clang-3.9/lib +``` +On Linux and macOS, you may also need to add a path to `libclang.so` (usually +the same path as above) to library search path. This can be done as below: ``` -$ LIBCLANG_PATH=path/to/clang-3.9/build/lib \ - LD_LIBRARY_PATH=path/to/clang-3.9/build/lib \ - cargo build +$ export LD_LIBRARY_PATH=path/to/clang-3.9/lib # for Linux +$ export DYLD_LIBRARY_PATH=path/to/clang-3.9/lib # for macOS ``` # Library usage with `build.rs` +See [the Stylo build script][stylo-script] to see how it is used inside the +Servo organisation. + +[stylo-script]: https://github.com/servo/servo/blob/master/components/style/build_gecko.rs + In `Cargo.toml`: ```toml @@ -85,9 +96,8 @@ In `Cargo.toml`: # ... build = "build.rs" -[build-dependencies.libbindgen] -git = "https://github.com/servo/rust-bindgen" -features = ["llvm_stable"] +[build-dependencies] +libbindgen = "0.1" ``` In `build.rs`: @@ -117,11 +127,10 @@ include!(concat!(env!("OUT_DIR"), "/example.rs")); # Command Line Usage There are a few options documented when running `./bindgen --help`. Other -options might exist (see [the SpiderMonkey script][sm-script] and [the Stylo -scripts][stylo-scripts] to see how is it used inside the Servo organisation. +options might exist (see [the SpiderMonkey script][sm-script] to see how it +is used inside the Servo organisation. [sm-script]: https://github.com/servo/rust-mozjs/blob/master/etc/bindings.sh -[stylo-scripts]: https://github.com/servo/servo/tree/master/components/style/binding_tools ## C++ Usage From cd9ba295447d9f62b6149b4c593f1c57887bec62 Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Thu, 29 Dec 2016 04:12:18 +0900 Subject: [PATCH 0204/2291] Replace all non-fatal `error!`s with `warn!`s --- bindgen/src/main.rs | 2 +- libbindgen/src/codegen/mod.rs | 2 +- libbindgen/src/ir/context.rs | 2 +- libbindgen/src/ir/ty.rs | 4 ++-- libbindgen/src/regex_set.rs | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bindgen/src/main.rs b/bindgen/src/main.rs index b54d4af5ed..515d1d1a29 100644 --- a/bindgen/src/main.rs +++ b/bindgen/src/main.rs @@ -35,7 +35,7 @@ pub fn main() { match version.parsed { None => warn!("Couldn't parse libclang version"), Some(version) if version != expected_version => { - error!("Using clang {:?}, expected {:?}", + warn!("Using clang {:?}, expected {:?}", version, expected_version); } diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 69d5f65136..8b4993a807 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -528,7 +528,7 @@ impl CodeGenerator for Type { if template_arg.is_named() { let name = template_arg.name().unwrap(); if name.contains("typename ") { - error!("Item contained `typename`'d template \ + warn!("Item contained `typename`'d template \ parameter: {:?}", item); return; } diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 3ffe50c835..5a94dd40ac 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -226,7 +226,7 @@ impl<'ctx> BindgenContext<'ctx> { } else if let Some(usr) = declaration.usr() { TypeKey::USR(usr) } else { - error!("Valid declaration with no USR: {:?}, {:?}", + warn!("Valid declaration with no USR: {:?}, {:?}", declaration, location); TypeKey::Declaration(declaration) diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 6859b75386..d234caeac3 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -753,7 +753,7 @@ impl Type { // // https://github.com/jamesmunns/teensy3-rs/issues/9 if !ty.spelling().is_empty() { - error!("invalid type {:?}", ty); + warn!("invalid type {:?}", ty); } else { warn!("invalid type {:?}", ty); } @@ -768,7 +768,7 @@ impl Type { } if !ty.spelling().is_empty() { - error!("invalid type {:?}", ty); + warn!("invalid type {:?}", ty); } else { warn!("invalid type {:?}", ty); } diff --git a/libbindgen/src/regex_set.rs b/libbindgen/src/regex_set.rs index 9313059023..8747d285dd 100644 --- a/libbindgen/src/regex_set.rs +++ b/libbindgen/src/regex_set.rs @@ -37,7 +37,7 @@ impl RegexSet { self.items.push(r); } Err(err) => { - error!("Invalid pattern provided: {}, {:?}", s, err); + warn!("Invalid pattern provided: {}, {:?}", s, err); } } } From 17e20030ea99c7ad036af1aa65110f315f13c61c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 29 Dec 2016 18:03:01 +0100 Subject: [PATCH 0205/2291] codegen: Use the canonical type to determine whether we should convert to a pointer an argument. Fixes https://github.com/Yamakaky/rust-bindgen/issues/407 --- libbindgen/src/codegen/mod.rs | 2 +- .../tests/typedefd-array-as-function-arg.rs | 10 ++++++++++ .../tests/headers/typedefd-array-as-function-arg.h | 3 +++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 libbindgen/tests/expectations/tests/typedefd-array-as-function-arg.rs create mode 100644 libbindgen/tests/headers/typedefd-array-as-function-arg.h diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 69d5f65136..b03c9f2177 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1945,7 +1945,7 @@ impl ToRustTy for FunctionSig { // the array type derivation. // // [1]: http://c0x.coding-guidelines.com/6.7.5.3.html - let arg_ty = if let TypeKind::Array(t, _) = *arg_ty.kind() { + let arg_ty = if let TypeKind::Array(t, _) = *arg_ty.canonical_type(ctx).kind() { t.to_rust_ty(ctx).to_ptr(arg_ty.is_const(), ctx.span()) } else { arg_item.to_rust_ty(ctx) diff --git a/libbindgen/tests/expectations/tests/typedefd-array-as-function-arg.rs b/libbindgen/tests/expectations/tests/typedefd-array-as-function-arg.rs new file mode 100644 index 0000000000..56074f75e5 --- /dev/null +++ b/libbindgen/tests/expectations/tests/typedefd-array-as-function-arg.rs @@ -0,0 +1,10 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub type myVector3 = [f32; 3usize]; +extern "C" { + pub fn modifyVectorFunc(v: *mut f32); +} diff --git a/libbindgen/tests/headers/typedefd-array-as-function-arg.h b/libbindgen/tests/headers/typedefd-array-as-function-arg.h new file mode 100644 index 0000000000..937905918c --- /dev/null +++ b/libbindgen/tests/headers/typedefd-array-as-function-arg.h @@ -0,0 +1,3 @@ +// foo.h +typedef float myVector3[3]; +void modifyVectorFunc(myVector3 v); From bc08b355b2daf10565d368a87462c6d882460e55 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 29 Dec 2016 16:47:13 -0800 Subject: [PATCH 0206/2291] Do not derive Copy/Debug for some opaque types When we treat a type as opaque, either because it is explicitly annotated as such or because it is a template that has a non-type parameter, we need to check if the size is larger than RUST_DERIVE_IN_ARRAY_LIMIT. Performing this check requires information that is up the stack, in the `Item` rather than in the `CompInfo` or `Type`. Therefore, I introduced two traits to encapsulate whether a thing can derive `Debug` and `Copy` (the `CanDeriveDebug` and `CanDeriveCopy` traits, respectively) and implemented them for ALL THE THINGS. This allowes us to perform our various checks at the level where we have access to the necessary info, and to let sub-levels do their own checks with their sub-info. Fixes #372. --- libbindgen/src/codegen/mod.rs | 6 +- libbindgen/src/ir/comp.rs | 202 +++++++++++------- libbindgen/src/ir/context.rs | 21 ++ libbindgen/src/ir/derive.rs | 67 ++++++ libbindgen/src/ir/item.rs | 64 ++++-- libbindgen/src/ir/layout.rs | 32 +++ libbindgen/src/ir/mod.rs | 1 + libbindgen/src/ir/ty.rs | 138 +++++------- .../tests/expectations/tests/issue-372.rs | 63 ++++++ libbindgen/tests/headers/issue-372.hpp | 16 ++ 10 files changed, 436 insertions(+), 174 deletions(-) create mode 100644 libbindgen/src/ir/derive.rs create mode 100644 libbindgen/tests/expectations/tests/issue-372.rs create mode 100644 libbindgen/tests/headers/issue-372.hpp diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 69d5f65136..12aa7223b0 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -6,6 +6,7 @@ use aster; use ir::annotations::FieldAccessorKind; use ir::comp::{CompInfo, CompKind, Field, Method, MethodKind}; use ir::context::{BindgenContext, ItemId}; +use ir::derive::{CanDeriveCopy, CanDeriveDebug}; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; use ir::function::{Function, FunctionSig}; use ir::int::IntKind; @@ -765,12 +766,11 @@ impl CodeGenerator for CompInfo { let is_union = self.kind() == CompKind::Union; let mut derives = vec![]; - let ty = item.expect_type(); - if ty.can_derive_debug(ctx) { + if item.can_derive_debug(ctx, ()) { derives.push("Debug"); } - if item.can_derive_copy(ctx) && !item.annotations().disallow_copy() { + if item.can_derive_copy(ctx, ()) && !item.annotations().disallow_copy() { derives.push("Copy"); if !applicable_template_args.is_empty() { // FIXME: This requires extra logic if you have a big array in a diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index ea3850ccd4..5d09ddbc26 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -6,6 +6,7 @@ use std::cell::Cell; use std::cmp; use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; +use super::derive::{CanDeriveCopy, CanDeriveDebug}; use super::item::Item; use super::layout::Layout; use super::ty::{RUST_DERIVE_IN_ARRAY_LIMIT, Type}; @@ -154,6 +155,26 @@ impl Field { } } +impl CanDeriveDebug for Field { + type Extra = (); + + fn can_derive_debug(&self, ctx: &BindgenContext, _: ()) -> bool { + self.ty.can_derive_debug(ctx, ()) + } +} + +impl<'a> CanDeriveCopy<'a> for Field { + type Extra = (); + + fn can_derive_copy(&self, ctx: &BindgenContext, _: ()) -> bool { + self.ty.can_derive_copy(ctx, ()) + } + + fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { + self.ty.can_derive_copy_in_array(ctx, ()) + } +} + /// A compound type. /// /// Either a struct or union, a compound type is built up from the combination @@ -263,50 +284,6 @@ impl CompInfo { } } - /// Can we derive the `Debug` trait for this compound type? - pub fn can_derive_debug(&self, - ctx: &BindgenContext, - layout: Option) - -> bool { - // We can reach here recursively via template parameters of a member, - // for example. - if self.detect_derive_debug_cycle.get() { - warn!("Derive debug cycle detected!"); - return true; - } - - if self.kind == CompKind::Union { - if ctx.options().unstable_rust { - return false; - } - - let layout = layout.unwrap_or_else(Layout::zero); - let size_divisor = cmp::max(1, layout.align); - return layout.size / size_divisor <= RUST_DERIVE_IN_ARRAY_LIMIT; - } - - self.detect_derive_debug_cycle.set(true); - - let can_derive_debug = { - self.base_members - .iter() - .all(|ty| ctx.resolve_type(*ty).can_derive_debug(ctx)) && - self.template_args - .iter() - .all(|ty| ctx.resolve_type(*ty).can_derive_debug(ctx)) && - self.fields - .iter() - .all(|f| ctx.resolve_type(f.ty).can_derive_debug(ctx)) && - self.ref_template.map_or(true, |template| { - ctx.resolve_type(template).can_derive_debug(ctx) - }) - }; - - self.detect_derive_debug_cycle.set(false); - - can_derive_debug - } - /// Is this compound type unsized? pub fn is_unsized(&self, ctx: &BindgenContext) -> bool { !self.has_vtable(ctx) && self.fields.is_empty() && @@ -356,41 +333,6 @@ impl CompInfo { has_destructor } - /// Can we derive the `Copy` trait for this type? - pub fn can_derive_copy(&self, ctx: &BindgenContext, item: &Item) -> bool { - // NOTE: Take into account that while unions in C and C++ are copied by - // default, the may have an explicit destructor in C++, so we can't - // defer this check just for the union case. - if self.has_destructor(ctx) { - return false; - } - - if self.kind == CompKind::Union { - if !ctx.options().unstable_rust { - return true; - } - - // https://github.com/rust-lang/rust/issues/36640 - if !self.template_args.is_empty() || self.ref_template.is_some() || - !item.applicable_template_args(ctx).is_empty() { - return false; - } - } - - // With template args, use a safe subset of the types, - // since copyability depends on the types itself. - self.ref_template - .as_ref() - .map_or(true, |t| ctx.resolve_item(*t).can_derive_copy(ctx)) && - self.base_members - .iter() - .all(|t| ctx.resolve_item(*t).can_derive_copy(ctx)) && - self.fields.iter().all(|field| { - ctx.resolve_item(field.ty) - .can_derive_copy(ctx) - }) - } - /// Is this type a template specialization? pub fn is_template_specialization(&self) -> bool { self.ref_template.is_some() @@ -858,6 +800,108 @@ impl CompInfo { } } +impl CanDeriveDebug for CompInfo { + type Extra = Option; + + fn can_derive_debug(&self, + ctx: &BindgenContext, + layout: Option) + -> bool { + if self.has_non_type_template_params() { + return layout.map_or(false, |l| l.opaque().can_derive_debug(ctx, ())); + } + + // We can reach here recursively via template parameters of a member, + // for example. + if self.detect_derive_debug_cycle.get() { + warn!("Derive debug cycle detected!"); + return true; + } + + if self.kind == CompKind::Union { + if ctx.options().unstable_rust { + return false; + } + + let layout = layout.unwrap_or_else(Layout::zero); + let size_divisor = cmp::max(1, layout.align); + return layout.size / size_divisor <= RUST_DERIVE_IN_ARRAY_LIMIT; + } + + self.detect_derive_debug_cycle.set(true); + + let can_derive_debug = { + self.base_members + .iter() + .all(|id| id.can_derive_debug(ctx, ())) && + self.template_args + .iter() + .all(|id| id.can_derive_debug(ctx, ())) && + self.fields + .iter() + .all(|f| f.can_derive_debug(ctx, ())) && + self.ref_template.map_or(true, |id| { + id.can_derive_debug(ctx, ()) + }) + }; + + self.detect_derive_debug_cycle.set(false); + + can_derive_debug + } +} + +impl<'a> CanDeriveCopy<'a> for CompInfo { + type Extra = (&'a Item, Option); + + fn can_derive_copy(&self, + ctx: &BindgenContext, + (item, layout): (&Item, Option)) + -> bool { + if self.has_non_type_template_params() { + return layout.map_or(false, |l| l.opaque().can_derive_copy(ctx, ())); + } + + // NOTE: Take into account that while unions in C and C++ are copied by + // default, the may have an explicit destructor in C++, so we can't + // defer this check just for the union case. + if self.has_destructor(ctx) { + return false; + } + + if self.kind == CompKind::Union { + if !ctx.options().unstable_rust { + return true; + } + + // https://github.com/rust-lang/rust/issues/36640 + if !self.template_args.is_empty() || self.ref_template.is_some() || + !item.applicable_template_args(ctx).is_empty() { + return false; + } + } + + // With template args, use a safe subset of the types, + // since copyability depends on the types itself. + self.ref_template + .as_ref() + .map_or(true, |t| t.can_derive_copy(ctx, ())) && + self.base_members + .iter() + .all(|t| t.can_derive_copy(ctx, ())) && + self.fields.iter().all(|field| { + field.can_derive_copy(ctx, ()) + }) + } + + fn can_derive_copy_in_array(&self, + ctx: &BindgenContext, + extra: (&Item, Option)) + -> bool { + self.can_derive_copy(ctx, extra) + } +} + impl TypeCollector for CompInfo { type Extra = Item; diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 3ffe50c835..5dc7886beb 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -9,6 +9,7 @@ use std::cell::Cell; use std::collections::{HashMap, VecDeque, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; +use super::derive::{CanDeriveCopy, CanDeriveDebug}; use super::int::IntKind; use super::item::{Item, ItemCanonicalPath}; use super::item_kind::ItemKind; @@ -32,6 +33,26 @@ impl ItemId { } } +impl CanDeriveDebug for ItemId { + type Extra = (); + + fn can_derive_debug(&self, ctx: &BindgenContext, _: ()) -> bool { + ctx.resolve_item(*self).can_derive_debug(ctx, ()) + } +} + +impl<'a> CanDeriveCopy<'a> for ItemId { + type Extra = (); + + fn can_derive_copy(&self, ctx: &BindgenContext, _: ()) -> bool { + ctx.resolve_item(*self).can_derive_copy(ctx, ()) + } + + fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { + ctx.resolve_item(*self).can_derive_copy_in_array(ctx, ()) + } +} + /// A key used to index a resolved type, so we only process it once. /// /// This is almost always a USR string (an unique identifier generated by diff --git a/libbindgen/src/ir/derive.rs b/libbindgen/src/ir/derive.rs new file mode 100644 index 0000000000..d13a811708 --- /dev/null +++ b/libbindgen/src/ir/derive.rs @@ -0,0 +1,67 @@ +//! Traits for determining whether we can derive traits for a thing or not. + +use super::context::BindgenContext; + +/// A trait that encapsulates the logic for whether or not we can derive `Debug` +/// for a given thing. +/// +/// This should ideally be a no-op that just returns `true`, but instead needs +/// to be a recursive method that checks whether all the proper members can +/// derive debug or not, because of the limit rust has on 32 items as max in the +/// array. +pub trait CanDeriveDebug { + /// Implementations can define this type to get access to any extra + /// information required to determine whether they can derive `Debug`. If + /// extra information is unneeded, then this should simply be the unit type. + type Extra; + + /// Return `true` if `Debug` can be derived for this thing, `false` + /// otherwise. + fn can_derive_debug(&self, + ctx: &BindgenContext, + extra: Self::Extra) + -> bool; +} + +/// A trait that encapsulates the logic for whether or not we can derive `Copy` +/// for a given thing. +pub trait CanDeriveCopy<'a> { + /// Implementations can define this type to get access to any extra + /// information required to determine whether they can derive `Copy`. If + /// extra information is unneeded, then this should simply be the unit type. + type Extra; + + /// Return `true` if `Copy` can be derived for this thing, `false` + /// otherwise. + fn can_derive_copy(&'a self, + ctx: &'a BindgenContext, + extra: Self::Extra) + -> bool; + + /// For some reason, deriving copies of an array of a type that is not known + /// to be `Copy` is a compile error. e.g.: + /// + /// ```rust + /// #[derive(Copy, Clone)] + /// struct A { + /// member: T, + /// } + /// ``` + /// + /// is fine, while: + /// + /// ```rust,ignore + /// #[derive(Copy, Clone)] + /// struct A { + /// member: [T; 1], + /// } + /// ``` + /// + /// is an error. + /// + /// That's the whole point of the existence of `can_derive_copy_in_array`. + fn can_derive_copy_in_array(&'a self, + ctx: &'a BindgenContext, + extra: Self::Extra) + -> bool; +} diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 932b06fc9f..913fb2f2f9 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -8,6 +8,7 @@ use std::fmt::Write; use std::iter; use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; +use super::derive::{CanDeriveCopy, CanDeriveDebug}; use super::function::Function; use super::item_kind::ItemKind; use super::module::Module; @@ -203,6 +204,56 @@ impl TypeCollector for Item { } } +impl CanDeriveDebug for Item { + type Extra = (); + + fn can_derive_debug(&self, ctx: &BindgenContext, _: ()) -> bool { + match self.kind { + ItemKind::Type(ref ty) => { + if self.is_opaque(ctx) { + ty.layout(ctx) + .map_or(true, |l| l.opaque().can_derive_debug(ctx, ())) + } else { + ty.can_derive_debug(ctx, ()) + } + }, + _ => false, + } + } +} + +impl<'a> CanDeriveCopy<'a> for Item { + type Extra = (); + + fn can_derive_copy(&self, ctx: &BindgenContext, _: ()) -> bool { + match self.kind { + ItemKind::Type(ref ty) => { + if self.is_opaque(ctx) { + ty.layout(ctx) + .map_or(true, |l| l.opaque().can_derive_copy(ctx, ())) + } else { + ty.can_derive_copy(ctx, self) + } + } + _ => false, + } + } + + fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { + match self.kind { + ItemKind::Type(ref ty) => { + if self.is_opaque(ctx) { + ty.layout(ctx) + .map_or(true, |l| l.opaque().can_derive_copy_in_array(ctx, ())) + } else { + ty.can_derive_copy_in_array(ctx, self) + } + } + _ => false, + } + } +} + /// An item is the base of the bindgen representation, it can be either a /// module, a type, a function, or a variable (see `ItemKind` for more /// information). @@ -806,19 +857,6 @@ impl Item { _ => None, } } - - /// Can we derive an implementation of the `Copy` trait for this type? - pub fn can_derive_copy(&self, ctx: &BindgenContext) -> bool { - self.expect_type().can_derive_copy(ctx, self) - } - - /// Can we derive an implementation of the `Copy` trait for an array of this - /// type? - /// - /// See `Type::can_derive_copy_in_array` for details. - pub fn can_derive_copy_in_array(&self, ctx: &BindgenContext) -> bool { - self.expect_type().can_derive_copy_in_array(ctx, self) - } } // An utility function to handle recursing inside nested types. diff --git a/libbindgen/src/ir/layout.rs b/libbindgen/src/ir/layout.rs index 3ac4a5f417..075f42c904 100644 --- a/libbindgen/src/ir/layout.rs +++ b/libbindgen/src/ir/layout.rs @@ -1,5 +1,9 @@ //! Intermediate representation for the physical layout of some type. +use super::context::BindgenContext; +use super::derive::{CanDeriveCopy, CanDeriveDebug}; +use super::ty::RUST_DERIVE_IN_ARRAY_LIMIT; + /// A type that represents the struct layout of a type. #[derive(Debug, Clone, Copy)] pub struct Layout { @@ -31,4 +35,32 @@ impl Layout { pub fn zero() -> Self { Self::new(0, 0) } + + /// Get this layout as an opaque type. + pub fn opaque(&self) -> Opaque { + Opaque(*self) + } +} + +/// When we are treating a type as opaque, it is just a blob with a `Layout`. +pub struct Opaque(pub Layout); + +impl CanDeriveDebug for Opaque { + type Extra = (); + + fn can_derive_debug(&self, _: &BindgenContext, _: ()) -> bool { + self.0.size < RUST_DERIVE_IN_ARRAY_LIMIT + } +} + +impl<'a> CanDeriveCopy<'a> for Opaque { + type Extra = (); + + fn can_derive_copy(&self, _: &BindgenContext, _: ()) -> bool { + self.0.size < RUST_DERIVE_IN_ARRAY_LIMIT + } + + fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { + self.can_derive_copy(ctx, ()) + } } diff --git a/libbindgen/src/ir/mod.rs b/libbindgen/src/ir/mod.rs index 3c658a4aad..73793b167f 100644 --- a/libbindgen/src/ir/mod.rs +++ b/libbindgen/src/ir/mod.rs @@ -6,6 +6,7 @@ pub mod annotations; pub mod comp; pub mod context; +pub mod derive; pub mod enum_ty; pub mod function; pub mod int; diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 6859b75386..1c94ddf577 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -4,6 +4,7 @@ use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; use super::comp::CompInfo; use super::context::{BindgenContext, ItemId}; +use super::derive::{CanDeriveCopy, CanDeriveDebug}; use super::enum_ty::Enum; use super::function::FunctionSig; use super::int::IntKind; @@ -207,83 +208,6 @@ impl Type { }) } - /// Wether we can derive rust's `Debug` annotation in Rust. This should - /// ideally be a no-op that just returns `true`, but instead needs to be a - /// recursive method that checks whether all the proper members can derive - /// debug or not, because of the limit rust has on 32 items as max in the - /// array. - pub fn can_derive_debug(&self, ctx: &BindgenContext) -> bool { - match self.kind { - TypeKind::Array(t, len) => { - len <= RUST_DERIVE_IN_ARRAY_LIMIT && - ctx.resolve_type(t).can_derive_debug(ctx) - } - TypeKind::ResolvedTypeRef(t) | - TypeKind::TemplateAlias(_, t, _) | - TypeKind::Alias(_, t) => ctx.resolve_type(t).can_derive_debug(ctx), - TypeKind::Comp(ref info) => { - info.can_derive_debug(ctx, self.layout(ctx)) - } - _ => true, - } - } - - /// For some reason, deriving copies of an array of a type that is not known - /// to be copy is a compile error. e.g.: - /// - /// ```rust - /// #[derive(Copy, Clone)] - /// struct A { - /// member: T, - /// } - /// ``` - /// - /// is fine, while: - /// - /// ```rust,ignore - /// #[derive(Copy, Clone)] - /// struct A { - /// member: [T; 1], - /// } - /// ``` - /// - /// is an error. - /// - /// That's the whole point of the existence of `can_derive_copy_in_array`. - pub fn can_derive_copy_in_array(&self, - ctx: &BindgenContext, - item: &Item) - -> bool { - match self.kind { - TypeKind::ResolvedTypeRef(t) | - TypeKind::TemplateAlias(_, t, _) | - TypeKind::Alias(_, t) | - TypeKind::Array(t, _) => { - ctx.resolve_item(t) - .can_derive_copy_in_array(ctx) - } - TypeKind::Named(..) => false, - _ => self.can_derive_copy(ctx, item), - } - } - - /// Wether we'd be able to derive the `Copy` trait in Rust or not. Same - /// rationale than `can_derive_debug`. - pub fn can_derive_copy(&self, ctx: &BindgenContext, item: &Item) -> bool { - match self.kind { - TypeKind::Array(t, len) => { - len <= RUST_DERIVE_IN_ARRAY_LIMIT && - ctx.resolve_item(t).can_derive_copy_in_array(ctx) - } - TypeKind::ResolvedTypeRef(t) | - TypeKind::TemplateAlias(_, t, _) | - TypeKind::TemplateRef(t, _) | - TypeKind::Alias(_, t) => ctx.resolve_item(t).can_derive_copy(ctx), - TypeKind::Comp(ref info) => info.can_derive_copy(ctx, item), - _ => true, - } - } - /// Whether this type has a vtable. pub fn has_vtable(&self, ctx: &BindgenContext) -> bool { // FIXME: Can we do something about template parameters? Huh... @@ -394,6 +318,61 @@ impl Type { } } +impl CanDeriveDebug for Type { + type Extra = (); + + fn can_derive_debug(&self, ctx: &BindgenContext, _: ()) -> bool { + match self.kind { + TypeKind::Array(t, len) => { + len <= RUST_DERIVE_IN_ARRAY_LIMIT && + t.can_derive_debug(ctx, ()) + } + TypeKind::ResolvedTypeRef(t) | + TypeKind::TemplateAlias(_, t, _) | + TypeKind::Alias(_, t) => t.can_derive_debug(ctx, ()), + TypeKind::Comp(ref info) => { + info.can_derive_debug(ctx, self.layout(ctx)) + } + _ => true, + } + } +} + +impl<'a> CanDeriveCopy<'a> for Type { + type Extra = &'a Item; + + fn can_derive_copy(&self, ctx: &BindgenContext, item: &Item) -> bool { + match self.kind { + TypeKind::Array(t, len) => { + len <= RUST_DERIVE_IN_ARRAY_LIMIT && + t.can_derive_copy_in_array(ctx, ()) + } + TypeKind::ResolvedTypeRef(t) | + TypeKind::TemplateAlias(_, t, _) | + TypeKind::TemplateRef(t, _) | + TypeKind::Alias(_, t) => t.can_derive_copy(ctx, ()), + TypeKind::Comp(ref info) => info.can_derive_copy(ctx, (item, self.layout(ctx))), + _ => true, + } + } + + fn can_derive_copy_in_array(&self, + ctx: &BindgenContext, + item: &Item) + -> bool { + match self.kind { + TypeKind::ResolvedTypeRef(t) | + TypeKind::TemplateAlias(_, t, _) | + TypeKind::Alias(_, t) | + TypeKind::Array(t, _) => { + t.can_derive_copy_in_array(ctx, ()) + } + TypeKind::Named(..) => false, + _ => self.can_derive_copy(ctx, item), + } + } +} + /// The kind of float this type represents. #[derive(Debug, Copy, Clone, PartialEq)] pub enum FloatKind { @@ -689,7 +668,8 @@ impl Type { Ok(inner) => inner, Err(..) => { error!("Failed to parse template alias \ - {:?}", location); + {:?}", + location); return Err(ParseError::Continue); } }; @@ -913,7 +893,7 @@ impl TypeCollector for Type { TypeKind::Function(ref sig) => { sig.collect_types(context, types, item) } - TypeKind::Named(_) => {}, + TypeKind::Named(_) => {} // FIXME: Pending types! ref other @ _ => { debug!("::collect_types: Ignoring: \ diff --git a/libbindgen/tests/expectations/tests/issue-372.rs b/libbindgen/tests/expectations/tests/issue-372.rs new file mode 100644 index 0000000000..c6d9209e26 --- /dev/null +++ b/libbindgen/tests/expectations/tests/issue-372.rs @@ -0,0 +1,63 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use self::super::root; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct d { + pub m: root::i, + } + #[test] + fn bindgen_test_layout_d() { + assert_eq!(::std::mem::size_of::() , 24usize); + assert_eq!(::std::mem::align_of::() , 8usize); + } + impl Clone for d { + fn clone(&self) -> Self { *self } + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct i { + pub j: *mut root::i, + pub k: *mut root::i, + pub l: bool, + } + #[test] + fn bindgen_test_layout_i() { + assert_eq!(::std::mem::size_of::() , 24usize); + assert_eq!(::std::mem::align_of::() , 8usize); + } + impl Clone for i { + fn clone(&self) -> Self { *self } + } + #[repr(u32)] + #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] + pub enum n { + o = 0, + p = 1, + q = 2, + r = 3, + s = 4, + t = 5, + b = 6, + ae = 7, + e = 8, + ag = 9, + ah = 10, + ai = 11, + } + #[repr(C)] + pub struct F { + pub w: [u64; 33usize], + } + #[test] + fn bindgen_test_layout_F() { + assert_eq!(::std::mem::size_of::() , 264usize); + assert_eq!(::std::mem::align_of::() , 8usize); + } +} diff --git a/libbindgen/tests/headers/issue-372.hpp b/libbindgen/tests/headers/issue-372.hpp new file mode 100644 index 0000000000..a072f06127 --- /dev/null +++ b/libbindgen/tests/headers/issue-372.hpp @@ -0,0 +1,16 @@ +// bindgen-flags: --enable-cxx-namespaces +template class c { a e[b]; }; +class d; +template class C { c h; }; +class i { + i *j; + i *k; + bool l; +}; +class d { + i m; +}; +enum n { o, p, q, r, s, t, b, ae, e, ag, ah, ai }; +class F { + C w; +}; From 291174b20f1f8d2aa65a133bac0a2ba77148503e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 29 Dec 2016 16:52:31 -0800 Subject: [PATCH 0207/2291] Run `cargo fmt` on `libbindgen` --- libbindgen/src/clang.rs | 4 ++-- libbindgen/src/codegen/mod.rs | 5 +++-- libbindgen/src/ir/comp.rs | 23 +++++++++++------------ libbindgen/src/ir/item.rs | 16 ++++++++-------- libbindgen/src/ir/ty.rs | 11 +++++------ libbindgen/src/lib.rs | 12 ++++++------ 6 files changed, 35 insertions(+), 36 deletions(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index de0ebf156c..fc5575b38c 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -832,8 +832,8 @@ impl SourceLocation { &mut col, &mut off); (File { - x: file, - }, + x: file, + }, line as usize, col as usize, off as usize) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 12aa7223b0..5515527e02 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -770,7 +770,8 @@ impl CodeGenerator for CompInfo { derives.push("Debug"); } - if item.can_derive_copy(ctx, ()) && !item.annotations().disallow_copy() { + if item.can_derive_copy(ctx, ()) && + !item.annotations().disallow_copy() { derives.push("Copy"); if !applicable_template_args.is_empty() { // FIXME: This requires extra logic if you have a big array in a @@ -895,7 +896,7 @@ impl CodeGenerator for CompInfo { // Try to catch a bitfield contination early. if let (Some(ref mut bitfield_width), Some(width)) = - (current_bitfield_width, field.bitfield()) { + (current_bitfield_width, field.bitfield()) { let layout = current_bitfield_layout.unwrap(); debug!("Testing bitfield continuation {} {} {:?}", *bitfield_width, width, layout); diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index 5d09ddbc26..3a0f58725c 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -586,17 +586,18 @@ impl CompInfo { return CXChildVisit_Continue; } - let param = Item::named_type(cur.spelling(), - potential_id, - ctx); + let param = + Item::named_type(cur.spelling(), potential_id, ctx); ci.template_args.push(param); } CXCursor_CXXBaseSpecifier => { if !ci.has_vtable { ci.has_vtable = cur.is_virtual_base(); } - let type_id = - Item::from_ty_or_ref(cur.cur_type(), Some(cur), None, ctx); + let type_id = Item::from_ty_or_ref(cur.cur_type(), + Some(cur), + None, + ctx); ci.base_members.push(type_id); } CXCursor_Constructor | @@ -690,7 +691,9 @@ impl CompInfo { return CXChildVisit_Continue; } - if let Ok(item) = Item::parse(cur, Some(potential_id), ctx) { + if let Ok(item) = Item::parse(cur, + Some(potential_id), + ctx) { ci.inner_vars.push(item); } } @@ -840,9 +843,7 @@ impl CanDeriveDebug for CompInfo { self.fields .iter() .all(|f| f.can_derive_debug(ctx, ())) && - self.ref_template.map_or(true, |id| { - id.can_derive_debug(ctx, ()) - }) + self.ref_template.map_or(true, |id| id.can_derive_debug(ctx, ())) }; self.detect_derive_debug_cycle.set(false); @@ -889,9 +890,7 @@ impl<'a> CanDeriveCopy<'a> for CompInfo { self.base_members .iter() .all(|t| t.can_derive_copy(ctx, ())) && - self.fields.iter().all(|field| { - field.can_derive_copy(ctx, ()) - }) + self.fields.iter().all(|field| field.can_derive_copy(ctx, ())) } fn can_derive_copy_in_array(&self, diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 913fb2f2f9..f4598654d6 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -216,7 +216,7 @@ impl CanDeriveDebug for Item { } else { ty.can_derive_debug(ctx, ()) } - }, + } _ => false, } } @@ -550,8 +550,9 @@ impl Item { parent_template_args.iter().any(|parent_item| { let parent_ty = ctx.resolve_type(*parent_item); match (parent_ty.kind(), item_ty.kind()) { - (&TypeKind::Named(ref n), - &TypeKind::Named(ref i)) => n == i, + (&TypeKind::Named(ref n), &TypeKind::Named(ref i)) => { + n == i + } _ => false, } }) @@ -1115,7 +1116,7 @@ impl ClangItemParser for Item { } if let Some(ty) = - ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { + ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { return Ok(ty); } @@ -1133,10 +1134,9 @@ impl ClangItemParser for Item { }; if valid_decl { - if let Some(&(_, item_id)) = - ctx.currently_parsed_types - .iter() - .find(|&&(d, _)| d == declaration_to_look_for) { + if let Some(&(_, item_id)) = ctx.currently_parsed_types + .iter() + .find(|&&(d, _)| d == declaration_to_look_for) { debug!("Avoiding recursion parsing type: {:?}", ty); return Ok(item_id); } diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index 1c94ddf577..f15616128c 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -324,8 +324,7 @@ impl CanDeriveDebug for Type { fn can_derive_debug(&self, ctx: &BindgenContext, _: ()) -> bool { match self.kind { TypeKind::Array(t, len) => { - len <= RUST_DERIVE_IN_ARRAY_LIMIT && - t.can_derive_debug(ctx, ()) + len <= RUST_DERIVE_IN_ARRAY_LIMIT && t.can_derive_debug(ctx, ()) } TypeKind::ResolvedTypeRef(t) | TypeKind::TemplateAlias(_, t, _) | @@ -351,7 +350,9 @@ impl<'a> CanDeriveCopy<'a> for Type { TypeKind::TemplateAlias(_, t, _) | TypeKind::TemplateRef(t, _) | TypeKind::Alias(_, t) => t.can_derive_copy(ctx, ()), - TypeKind::Comp(ref info) => info.can_derive_copy(ctx, (item, self.layout(ctx))), + TypeKind::Comp(ref info) => { + info.can_derive_copy(ctx, (item, self.layout(ctx))) + } _ => true, } } @@ -364,9 +365,7 @@ impl<'a> CanDeriveCopy<'a> for Type { TypeKind::ResolvedTypeRef(t) | TypeKind::TemplateAlias(_, t, _) | TypeKind::Alias(_, t) | - TypeKind::Array(t, _) => { - t.can_derive_copy_in_array(ctx, ()) - } + TypeKind::Array(t, _) => t.can_derive_copy_in_array(ctx, ()), TypeKind::Named(..) => false, _ => self.can_derive_copy(ctx, item), } diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 5054cd13ef..372622d361 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -632,16 +632,16 @@ impl<'ctx> Bindings<'ctx> { /// /// See the `uses` module for more information. pub fn write_dummy_uses(&mut self) -> io::Result<()> { - let file = if let Some(ref dummy_path) = - self.context.options().dummy_uses { - Some(try!(OpenOptions::new() + let file = + if let Some(ref dummy_path) = self.context.options().dummy_uses { + Some(try!(OpenOptions::new() .write(true) .truncate(true) .create(true) .open(dummy_path))) - } else { - None - }; + } else { + None + }; if let Some(file) = file { try!(uses::generate_dummy_uses(&mut self.context, file)); From 50b5845c239e2a9ae8b9594bcbedf91174460e84 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 30 Dec 2016 09:03:55 -0800 Subject: [PATCH 0208/2291] Relax opaque layout trait deriving and take alignment into account --- libbindgen/src/ir/comp.rs | 9 ++++----- libbindgen/src/ir/layout.rs | 7 +++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index 3a0f58725c..0af8a99e8e 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -3,13 +3,12 @@ use clang; use parse::{ClangItemParser, ParseError}; use std::cell::Cell; -use std::cmp; use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; use super::derive::{CanDeriveCopy, CanDeriveDebug}; use super::item::Item; use super::layout::Layout; -use super::ty::{RUST_DERIVE_IN_ARRAY_LIMIT, Type}; +use super::ty::Type; use super::type_collector::{ItemSet, TypeCollector}; /// The kind of compound type. @@ -826,9 +825,9 @@ impl CanDeriveDebug for CompInfo { return false; } - let layout = layout.unwrap_or_else(Layout::zero); - let size_divisor = cmp::max(1, layout.align); - return layout.size / size_divisor <= RUST_DERIVE_IN_ARRAY_LIMIT; + return layout.unwrap_or_else(Layout::zero) + .opaque() + .can_derive_debug(ctx, ()); } self.detect_derive_debug_cycle.set(true); diff --git a/libbindgen/src/ir/layout.rs b/libbindgen/src/ir/layout.rs index 075f42c904..3a07f7e8c1 100644 --- a/libbindgen/src/ir/layout.rs +++ b/libbindgen/src/ir/layout.rs @@ -1,5 +1,6 @@ //! Intermediate representation for the physical layout of some type. +use std::cmp; use super::context::BindgenContext; use super::derive::{CanDeriveCopy, CanDeriveDebug}; use super::ty::RUST_DERIVE_IN_ARRAY_LIMIT; @@ -49,7 +50,8 @@ impl CanDeriveDebug for Opaque { type Extra = (); fn can_derive_debug(&self, _: &BindgenContext, _: ()) -> bool { - self.0.size < RUST_DERIVE_IN_ARRAY_LIMIT + let size_divisor = cmp::max(1, self.0.align); + self.0.size / size_divisor <= RUST_DERIVE_IN_ARRAY_LIMIT } } @@ -57,7 +59,8 @@ impl<'a> CanDeriveCopy<'a> for Opaque { type Extra = (); fn can_derive_copy(&self, _: &BindgenContext, _: ()) -> bool { - self.0.size < RUST_DERIVE_IN_ARRAY_LIMIT + let size_divisor = cmp::max(1, self.0.align); + self.0.size / size_divisor <= RUST_DERIVE_IN_ARRAY_LIMIT } fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { From ef676c47cc746ea38e3b99ba6ef47e4b487197b4 Mon Sep 17 00:00:00 2001 From: Jeremy Fitzhardinge Date: Thu, 5 Jan 2017 18:55:44 -0800 Subject: [PATCH 0209/2291] Allow regexps for --blacklist_type and --opaque_type --- libbindgen/src/ir/context.rs | 4 ++-- libbindgen/src/lib.rs | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index d87c8f29e6..e3dc338499 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -924,7 +924,7 @@ impl<'ctx> BindgenContext<'ctx> { pub fn hidden_by_name(&self, path: &[String], id: ItemId) -> bool { debug_assert!(self.in_codegen_phase(), "You're not supposed to call this yet"); - self.options.hidden_types.contains(&path[1..].join("::")) || + self.options.hidden_types.matches(&path[1..].join("::")) || self.is_replaced_type(path, id) } @@ -941,7 +941,7 @@ impl<'ctx> BindgenContext<'ctx> { pub fn opaque_by_name(&self, path: &[String]) -> bool { debug_assert!(self.in_codegen_phase(), "You're not supposed to call this yet"); - self.options.opaque_types.contains(&path[1..].join("::")) + self.options.opaque_types.matches(&path[1..].join("::")) } /// Get the options used to configure this bindgen context. diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 372622d361..375fd2128d 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -84,7 +84,6 @@ use parse::{ClangItemParser, ParseError}; use regex_set::RegexSet; use std::borrow::Borrow; -use std::collections::HashSet; use std::fs::OpenOptions; use std::io::{self, Write}; use std::path::Path; @@ -185,14 +184,14 @@ impl Builder { } /// Hide the given type from the generated bindings. - pub fn hide_type>(mut self, arg: T) -> Builder { - self.options.hidden_types.insert(arg.into()); + pub fn hide_type>(mut self, arg: T) -> Builder { + self.options.hidden_types.insert(&arg); self } /// Treat the given type as opaque in the generated bindings. - pub fn opaque_type>(mut self, arg: T) -> Builder { - self.options.opaque_types.insert(arg.into()); + pub fn opaque_type>(mut self, arg: T) -> Builder { + self.options.opaque_types.insert(&arg); self } @@ -364,11 +363,11 @@ impl Builder { pub struct BindgenOptions { /// The set of types that have been blacklisted and should not appear /// anywhere in the generated code. - pub hidden_types: HashSet, + pub hidden_types: RegexSet, /// The set of types that should be treated as opaque structures in the /// generated code. - pub opaque_types: HashSet, + pub opaque_types: RegexSet, /// The set of types that we should have bindings for in the generated /// code. From bf1c41dc627f26a782c948868a5f270235d58725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 6 Jan 2017 10:24:30 +0100 Subject: [PATCH 0210/2291] ir: Change our representation of base types so they also have a base kind. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This still doesn't change behavior, but it's nice to split it for easier review. Signed-off-by: Emilio Cobos Álvarez --- libbindgen/src/codegen/mod.rs | 10 +++--- libbindgen/src/ir/comp.rs | 62 ++++++++++++++++++++++++++--------- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 24b862bec5..c4dc964446 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -4,7 +4,7 @@ mod helpers; use aster; use ir::annotations::FieldAccessorKind; -use ir::comp::{CompInfo, CompKind, Field, Method, MethodKind}; +use ir::comp::{Base, CompInfo, CompKind, Field, Method, MethodKind}; use ir::context::{BindgenContext, ItemId}; use ir::derive::{CanDeriveCopy, CanDeriveDebug}; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; @@ -556,13 +556,13 @@ struct Vtable<'a> { #[allow(dead_code)] methods: &'a [Method], #[allow(dead_code)] - base_classes: &'a [ItemId], + base_classes: &'a [Base], } impl<'a> Vtable<'a> { fn new(item_id: ItemId, methods: &'a [Method], - base_classes: &'a [ItemId]) + base_classes: &'a [Base]) -> Self { Vtable { item_id: item_id, @@ -835,7 +835,7 @@ impl CodeGenerator for CompInfo { } for (i, base) in self.base_members().iter().enumerate() { - let base_ty = ctx.resolve_type(*base); + let base_ty = ctx.resolve_type(base.ty); // NB: We won't include unsized types in our base chain because they // would contribute to our size given the dummy field we insert for // unsized types. @@ -854,7 +854,7 @@ impl CodeGenerator for CompInfo { } } - let inner = base.to_rust_ty(ctx); + let inner = base.ty.to_rust_ty(ctx); let field_name = if i == 0 { "_base".into() } else { diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index 0af8a99e8e..b9f71241ea 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -174,6 +174,33 @@ impl<'a> CanDeriveCopy<'a> for Field { } } + +/// The kind of inheritance a base class is using. +#[derive(Clone, Debug)] +pub enum BaseKind { + /// Normal inheritance, like: + /// + /// ```cpp + /// class A : public B {}; + /// ``` + Normal, + /// Virtual inheritance, like: + /// + /// ```cpp + /// class A: public virtual B {}; + /// ``` + Virtual, +} + +/// A base class. +#[derive(Clone, Debug)] +pub struct Base { + /// The type of this base class. + pub ty: ItemId, + /// The kind of inheritance we're doing. + pub kind: BaseKind, +} + /// A compound type. /// /// Either a struct or union, a compound type is built up from the combination @@ -199,7 +226,7 @@ pub struct CompInfo { constructors: Vec, /// Vector of classes this one inherits from. - base_members: Vec, + base_members: Vec, /// The parent reference template if any. ref_template: Option, @@ -287,7 +314,7 @@ impl CompInfo { pub fn is_unsized(&self, ctx: &BindgenContext) -> bool { !self.has_vtable(ctx) && self.fields.is_empty() && self.base_members.iter().all(|base| { - ctx.resolve_type(*base).canonical_type(ctx).is_unsized(ctx) + ctx.resolve_type(base.ty).canonical_type(ctx).is_unsized(ctx) }) && self.ref_template .map_or(true, |template| ctx.resolve_type(template).is_unsized(ctx)) @@ -314,12 +341,12 @@ impl CompInfo { self.ref_template.as_ref().map_or(false, |t| { ctx.resolve_type(*t).has_destructor(ctx) }) || - self.template_args - .iter() - .any(|t| ctx.resolve_type(*t).has_destructor(ctx)) || - self.base_members - .iter() - .any(|t| ctx.resolve_type(*t).has_destructor(ctx)) || + self.template_args.iter().any(|t| { + ctx.resolve_type(*t).has_destructor(ctx) + }) || + self.base_members.iter().any(|base| { + ctx.resolve_type(base.ty).has_destructor(ctx) + }) || self.fields.iter().any(|field| { ctx.resolve_type(field.ty) .has_destructor(ctx) @@ -394,7 +421,7 @@ impl CompInfo { pub fn has_vtable(&self, ctx: &BindgenContext) -> bool { self.has_vtable || self.base_members().iter().any(|base| { - ctx.resolve_type(*base) + ctx.resolve_type(base.ty) .has_vtable(ctx) }) || self.ref_template.map_or(false, |template| { @@ -418,7 +445,7 @@ impl CompInfo { } /// The set of types that this one inherits from. - pub fn base_members(&self) -> &[ItemId] { + pub fn base_members(&self) -> &[Base] { &self.base_members } @@ -597,7 +624,10 @@ impl CompInfo { Some(cur), None, ctx); - ci.base_members.push(type_id); + ci.base_members.push(Base { + ty: type_id, + kind: BaseKind::Normal + }); } CXCursor_Constructor | CXCursor_Destructor | @@ -794,7 +824,7 @@ impl CompInfo { // Unfortunately, given the way we implement --match-pat, and also // that you can inherit from templated types, we need to handle // other cases here too. - ctx.resolve_type(*base) + ctx.resolve_type(base.ty) .canonical_type(ctx) .as_comp() .map_or(false, |ci| ci.has_vtable(ctx)) @@ -835,7 +865,7 @@ impl CanDeriveDebug for CompInfo { let can_derive_debug = { self.base_members .iter() - .all(|id| id.can_derive_debug(ctx, ())) && + .all(|base| base.ty.can_derive_debug(ctx, ())) && self.template_args .iter() .all(|id| id.can_derive_debug(ctx, ())) && @@ -888,7 +918,7 @@ impl<'a> CanDeriveCopy<'a> for CompInfo { .map_or(true, |t| t.can_derive_copy(ctx, ())) && self.base_members .iter() - .all(|t| t.can_derive_copy(ctx, ())) && + .all(|base| base.ty.can_derive_copy(ctx, ())) && self.fields.iter().all(|field| field.can_derive_copy(ctx, ())) } @@ -916,8 +946,8 @@ impl TypeCollector for CompInfo { types.insert(arg); } - for &base in self.base_members() { - types.insert(base); + for base in self.base_members() { + types.insert(base.ty); } for field in self.fields() { From 6720a9930a28d5daf8303d5cf6a957f86765b988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 6 Jan 2017 10:32:21 +0100 Subject: [PATCH 0211/2291] ir: More appropriately track whether we're inheriting virtually. --- libbindgen/src/ir/comp.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index b9f71241ea..2740fe8f2e 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -617,16 +617,22 @@ impl CompInfo { ci.template_args.push(param); } CXCursor_CXXBaseSpecifier => { - if !ci.has_vtable { - ci.has_vtable = cur.is_virtual_base(); - } + let is_virtual_base = cur.is_virtual_base(); + ci.has_vtable |= is_virtual_base; + + let kind = if is_virtual_base { + BaseKind::Virtual + } else { + BaseKind::Normal + }; + let type_id = Item::from_ty_or_ref(cur.cur_type(), Some(cur), None, ctx); ci.base_members.push(Base { ty: type_id, - kind: BaseKind::Normal + kind: kind, }); } CXCursor_Constructor | From 9798d92212a590fff0d6f5a55d582e1b45781172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 6 Jan 2017 10:38:03 +0100 Subject: [PATCH 0212/2291] codegen: Properly handle virtual bases. --- libbindgen/src/codegen/mod.rs | 12 ++++++++---- libbindgen/src/ir/comp.rs | 9 ++++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index c4dc964446..c6d5fd39f8 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -835,14 +835,18 @@ impl CodeGenerator for CompInfo { } for (i, base) in self.base_members().iter().enumerate() { + // Virtual bases are already taken into account by the vtable + // pointer. + // + // FIXME(emilio): Is this always right? + if base.is_virtual() { + continue; + } + let base_ty = ctx.resolve_type(base.ty); // NB: We won't include unsized types in our base chain because they // would contribute to our size given the dummy field we insert for // unsized types. - // - // NB: Canonical type is here because it could be inheriting from a - // typedef, for example, and the lack of `unwrap()` is because we - // can inherit from a template parameter, yes. if base_ty.is_unsized(ctx) { continue; } diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index 2740fe8f2e..70dfd4a640 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -176,7 +176,7 @@ impl<'a> CanDeriveCopy<'a> for Field { /// The kind of inheritance a base class is using. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum BaseKind { /// Normal inheritance, like: /// @@ -201,6 +201,13 @@ pub struct Base { pub kind: BaseKind, } +impl Base { + /// Whether this base class is inheriting virtually. + pub fn is_virtual(&self) -> bool { + self.kind == BaseKind::Virtual + } +} + /// A compound type. /// /// Either a struct or union, a compound type is built up from the combination From 12fd256b082f6e269700b043726f9b8494aba269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 6 Jan 2017 10:38:24 +0100 Subject: [PATCH 0213/2291] tests: Add virtual base tests. --- .../expectations/tests/virtual_inheritance.rs | 68 +++++++++++++++++++ .../tests/headers/virtual_inheritance.hpp | 16 +++++ 2 files changed, 84 insertions(+) create mode 100644 libbindgen/tests/expectations/tests/virtual_inheritance.rs create mode 100644 libbindgen/tests/headers/virtual_inheritance.hpp diff --git a/libbindgen/tests/expectations/tests/virtual_inheritance.rs b/libbindgen/tests/expectations/tests/virtual_inheritance.rs new file mode 100644 index 0000000000..f271223f94 --- /dev/null +++ b/libbindgen/tests/expectations/tests/virtual_inheritance.rs @@ -0,0 +1,68 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct A { + pub foo: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_A() { + assert_eq!(::std::mem::size_of::
() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for A { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +pub struct B__bindgen_vtable { +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct B { + pub vtable_: *const B__bindgen_vtable, + pub bar: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_B() { + assert_eq!(::std::mem::size_of::() , 16usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for B { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +pub struct C__bindgen_vtable { +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct C { + pub vtable_: *const C__bindgen_vtable, + pub baz: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_C() { + assert_eq!(::std::mem::size_of::() , 16usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for C { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct D { + pub _base: C, + pub _base_1: B, + pub bazz: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_D() { + assert_eq!(::std::mem::size_of::() , 40usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for D { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/headers/virtual_inheritance.hpp b/libbindgen/tests/headers/virtual_inheritance.hpp new file mode 100644 index 0000000000..5198c51e27 --- /dev/null +++ b/libbindgen/tests/headers/virtual_inheritance.hpp @@ -0,0 +1,16 @@ + +class A { + int foo; +}; + +class B: public virtual A { + int bar; +}; + +class C: public virtual A { + int baz; +}; + +class D: public C, public B { + int bazz; +}; From 51f5162f250a5ec10bc5ba8b91b60b45762bc999 Mon Sep 17 00:00:00 2001 From: Jeremy Fitzhardinge Date: Thu, 5 Jan 2017 23:59:47 -0800 Subject: [PATCH 0214/2291] Update to regex 0.2; use regex::RegexSet for matching Rather than implementing a private RegexSet, implement it in terms of regex::RegexSet, which should be more efficient. Retain the existing RegexSet module and just reimplement its internals, in order to preserve the external API. --- libbindgen/Cargo.toml | 2 +- libbindgen/src/lib.rs | 38 ++++++++++++++++--------- libbindgen/src/regex_set.rs | 55 +++++++++++++++++++------------------ 3 files changed, 55 insertions(+), 40 deletions(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index dfaba98b36..cbe3b13fc3 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -30,7 +30,7 @@ clang-sys = { version = "0.12", features = ["runtime", "clang_3_9"] } lazy_static = "0.2.1" rustc-serialize = "0.3.19" syntex_syntax = "0.50" -regex = "0.1" +regex = "0.2" [dependencies.aster] features = ["with-syntex"] diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 375fd2128d..1834b3f23d 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -83,7 +83,6 @@ use ir::item::Item; use parse::{ClangItemParser, ParseError}; use regex_set::RegexSet; -use std::borrow::Borrow; use std::fs::OpenOptions; use std::io::{self, Write}; use std::path::Path; @@ -184,35 +183,35 @@ impl Builder { } /// Hide the given type from the generated bindings. - pub fn hide_type>(mut self, arg: T) -> Builder { - self.options.hidden_types.insert(&arg); + pub fn hide_type>(mut self, arg: T) -> Builder { + self.options.hidden_types.insert(arg); self } /// Treat the given type as opaque in the generated bindings. - pub fn opaque_type>(mut self, arg: T) -> Builder { - self.options.opaque_types.insert(&arg); + pub fn opaque_type>(mut self, arg: T) -> Builder { + self.options.opaque_types.insert(arg); self } /// Whitelist the given type so that it (and all types that it transitively /// refers to) appears in the generated bindings. - pub fn whitelisted_type>(mut self, arg: T) -> Builder { - self.options.whitelisted_types.insert(&arg); + pub fn whitelisted_type>(mut self, arg: T) -> Builder { + self.options.whitelisted_types.insert(arg); self } /// Whitelist the given function so that it (and all types that it /// transitively refers to) appears in the generated bindings. - pub fn whitelisted_function>(mut self, arg: T) -> Builder { - self.options.whitelisted_functions.insert(&arg); + pub fn whitelisted_function>(mut self, arg: T) -> Builder { + self.options.whitelisted_functions.insert(arg); self } /// Whitelist the given variable so that it (and all types that it /// transitively refers to) appears in the generated bindings. - pub fn whitelisted_var>(mut self, arg: T) -> Builder { - self.options.whitelisted_vars.insert(&arg); + pub fn whitelisted_var>(mut self, arg: T) -> Builder { + self.options.whitelisted_vars.insert(arg); self } @@ -220,8 +219,8 @@ impl Builder { /// bitfield-like. /// /// This makes bindgen generate a type that isn't a rust `enum`. - pub fn bitfield_enum>(mut self, arg: T) -> Builder { - self.options.bitfield_enums.insert(&arg); + pub fn bitfield_enum>(mut self, arg: T) -> Builder { + self.options.bitfield_enums.insert(arg); self } @@ -451,6 +450,17 @@ pub struct BindgenOptions { pub codegen_config: CodegenConfig, } +impl BindgenOptions { + fn build(&mut self) { + self.whitelisted_vars.build(); + self.whitelisted_types.build(); + self.whitelisted_functions.build(); + self.hidden_types.build(); + self.opaque_types.build(); + self.bitfield_enums.build(); + } +} + impl Default for BindgenOptions { fn default() -> BindgenOptions { BindgenOptions { @@ -543,6 +553,8 @@ impl<'ctx> Bindings<'ctx> { let span = span.unwrap_or(DUMMY_SP); ensure_libclang_is_loaded(); + options.build(); + // TODO: Make this path fixup configurable? if let Some(clang) = clang_sys::support::Clang::find(None) { // If --target is specified, assume caller knows what they're doing diff --git a/libbindgen/src/regex_set.rs b/libbindgen/src/regex_set.rs index 8747d285dd..dbdb656567 100644 --- a/libbindgen/src/regex_set.rs +++ b/libbindgen/src/regex_set.rs @@ -1,7 +1,6 @@ //! A type that represents the union of a set of regular expressions. -use regex::Regex; -use std::borrow::Borrow; +use regex::RegexSet as RxSet; // Yeah, I'm aware this is sorta crappy, should be cheaper to compile a regex // ORing all the patterns, I guess... @@ -9,7 +8,8 @@ use std::borrow::Borrow; /// A dynamic set of regular expressions. #[derive(Debug)] pub struct RegexSet { - items: Vec, + items: Vec, + set: Option, } impl RegexSet { @@ -19,41 +19,43 @@ impl RegexSet { } /// Extend this set with every regex in the iterator. - pub fn extend(&mut self, iter: I) - where I: IntoIterator, + pub fn extend(&mut self, iter: I) + where I: IntoIterator, + S: AsRef { for s in iter.into_iter() { - self.insert(&s) + self.insert(s) } } /// Insert a new regex into this set. - pub fn insert(&mut self, string: &S) - where S: Borrow, + pub fn insert(&mut self, string: S) + where S: AsRef { - let s = string.borrow(); - match Regex::new(&format!("^{}$", s)) { - Ok(r) => { - self.items.push(r); - } - Err(err) => { - warn!("Invalid pattern provided: {}, {:?}", s, err); - } + self.items.push(format!("^{}$", string.as_ref())); + self.set = None; + } + + /// Construct a RegexSet from the set of entries we've accumulated. + /// + /// Must be called before calling `matches()`, or it will always return + /// false. + pub fn build(&mut self) { + self.set = match RxSet::new(&self.items) { + Ok(x) => Some(x), + Err(e) => { + error!("Invalid regex in {:?}: {:?}", self.items, e); + None + }, } } /// Does the given `string` match any of the regexes in this set? - pub fn matches(&self, string: &S) -> bool - where S: Borrow, + pub fn matches(&self, string: S) -> bool + where S: AsRef { - let s = string.borrow(); - for r in &self.items { - if r.is_match(s) { - return true; - } - } - - false + let s = string.as_ref(); + self.set.as_ref().map(|set| set.is_match(s)).unwrap_or(false) } } @@ -61,6 +63,7 @@ impl Default for RegexSet { fn default() -> Self { RegexSet { items: vec![], + set: None, } } } From a20cf85dbb8b9f4ffcd656b3a541de24f4c37d95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 9 Jan 2017 23:05:20 +0100 Subject: [PATCH 0215/2291] ir: Evaluate constant strings too. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Emilio Cobos Álvarez --- libbindgen/src/clang.rs | 14 ++++++++++++++ libbindgen/src/ir/var.rs | 4 +++- .../tests/expectations/tests/constant-evaluate.rs | 2 ++ libbindgen/tests/headers/constant-evaluate.h | 3 +++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index fc5575b38c..491aaa07c1 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -1348,6 +1348,20 @@ impl EvalResult { _ => None, } } + + /// Evaluates the expression as a literal string, that may or may not be + /// valid utf-8. + pub fn as_literal_string(&self) -> Option> { + match self.kind() { + CXEval_StrLiteral => { + let ret = unsafe { + CStr::from_ptr(clang_EvalResult_getAsStr(self.x)) + }; + Some(ret.to_bytes().to_vec()) + } + _ => None, + } + } } impl Drop for EvalResult { diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index d9160ecad8..e18af91b19 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -236,7 +236,9 @@ impl ClangSubItemParser for Var { .and_then(|v| v.as_double()) .map(VarType::Float) } else { - None + cursor.evaluate() + .and_then(|v| v.as_literal_string()) + .map(VarType::String) }; let mangling = cursor_mangling(&cursor); diff --git a/libbindgen/tests/expectations/tests/constant-evaluate.rs b/libbindgen/tests/expectations/tests/constant-evaluate.rs index 6947be982b..cdf097a2d8 100644 --- a/libbindgen/tests/expectations/tests/constant-evaluate.rs +++ b/libbindgen/tests/expectations/tests/constant-evaluate.rs @@ -16,3 +16,5 @@ pub const BAZ: ::std::os::raw::c_longlong = 24; pub const fuzz: f64 = 51.; pub const BAZZ: ::std::os::raw::c_char = 53; pub const WAT: ::std::os::raw::c_char = 0; +pub const bytestring: &'static [u8; 4usize] = b"Foo\x00"; +pub const NOT_UTF8: [u8; 5usize] = [240, 40, 140, 40, 0]; diff --git a/libbindgen/tests/headers/constant-evaluate.h b/libbindgen/tests/headers/constant-evaluate.h index b6a0492f17..f9f1fa669f 100644 --- a/libbindgen/tests/headers/constant-evaluate.h +++ b/libbindgen/tests/headers/constant-evaluate.h @@ -14,3 +14,6 @@ const long long BAZ = (1 << foo) | bar; const double fuzz = (1 + 50.0f); const char BAZZ = '5'; const char WAT = '\0'; + +const char* bytestring = "Foo"; +const char* NOT_UTF8 = "\xf0\x28\x8c\x28"; From 3e957dafd4ec2347b8244fdb2a8924ac5c60de4f Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Mon, 9 Jan 2017 15:44:26 -0800 Subject: [PATCH 0216/2291] Bump to 0.1.6 --- libbindgen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index cbe3b13fc3..f5498bc9d2 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -12,7 +12,7 @@ license = "BSD-3-Clause" name = "libbindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" -version = "0.1.5" +version = "0.1.6" workspace = ".." [dev-dependencies] From 643af484d6b2ea585c32d2fa16e3c5de7f18dc27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 10 Jan 2017 12:29:08 +0100 Subject: [PATCH 0217/2291] ir: Add a helper to the context to access the user-provided type chooser. --- libbindgen/src/ir/context.rs | 6 ++++++ libbindgen/src/ir/var.rs | 4 +--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index e3dc338499..2d87792008 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -2,6 +2,7 @@ use BindgenOptions; use cexpr; +use chooser::TypeChooser; use clang::{self, Cursor}; use parse::ClangItemParser; use std::borrow::Cow; @@ -184,6 +185,11 @@ impl<'ctx> BindgenContext<'ctx> { me } + /// Get the user-provided type chooser by reference, if any. + pub fn type_chooser(&self) -> Option<&TypeChooser> { + self.options().type_chooser.as_ref().map(|t| &**t) + } + /// Define a new item. /// /// This inserts it into the internal items set, and its type into the diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index e18af91b19..329393fa5e 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -147,9 +147,7 @@ impl ClangSubItemParser for Var { (TypeKind::Pointer(char_ty), VarType::String(val)) } EvalResult::Int(Wrapping(value)) => { - let kind = ctx.options() - .type_chooser - .as_ref() + let kind = ctx.type_chooser() .and_then(|c| c.int_macro(&name, value)) .unwrap_or_else(|| { if value < 0 { From be1c760928cdcf32e96bc9ff2dacddd4548be40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 10 Jan 2017 12:31:02 +0100 Subject: [PATCH 0218/2291] chooser: Add a programmatic API for choosing whether to constify an enum variant. --- libbindgen/src/chooser.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libbindgen/src/chooser.rs b/libbindgen/src/chooser.rs index 10a77dc9c4..f28b32f124 100644 --- a/libbindgen/src/chooser.rs +++ b/libbindgen/src/chooser.rs @@ -1,6 +1,7 @@ //! A public API for more fine-grained customization of bindgen behavior. pub use ir::int::IntKind; +pub use ir::enum_ty::EnumVariantValue; use std::fmt; /// A trait to allow configuring different kinds of types in different @@ -11,4 +12,14 @@ pub trait TypeChooser: fmt::Debug { fn int_macro(&self, _name: &str, _value: i64) -> Option { None } + + /// This function should return whether, given the a given enum variant + /// name, and value, returns whether this enum variant will forcibly be a + /// constant. + fn constify_enum_variant(&self, + _enum_name: Option<&str>, + _variant_name: &str, + _variant_value: Option) -> bool { + false + } } From 1b9e718b966b325280acd1b7e6fc49958cddc04c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 10 Jan 2017 12:32:07 +0100 Subject: [PATCH 0219/2291] ir: Add an annotation API to constify enum variants. --- libbindgen/src/ir/annotations.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/libbindgen/src/ir/annotations.rs b/libbindgen/src/ir/annotations.rs index 3598c78cd2..70f660516d 100644 --- a/libbindgen/src/ir/annotations.rs +++ b/libbindgen/src/ir/annotations.rs @@ -39,6 +39,20 @@ pub struct Annotations { /// The kind of accessor this field will have. Also can be applied to /// structs so all the fields inside share it by default. accessor_kind: Option, + /// Whether this enum variant should be constified. + /// + /// This is controlled by the `constant` attribute, this way: + /// + /// ```cpp + /// enum Foo { + /// Bar = 0, //<
+ /// Baz = 0, + /// }; + /// ``` + /// + /// In that case, bindgen will generate a constant for `Bar` instead of + /// `Baz`. + constify_enum_variant: bool, } fn parse_accessor(s: &str) -> FieldAccessorKind { @@ -59,6 +73,7 @@ impl Default for Annotations { disallow_copy: false, private_fields: None, accessor_kind: None, + constify_enum_variant: false, } } } @@ -150,6 +165,7 @@ impl Annotations { "accessor" => { self.accessor_kind = Some(parse_accessor(&attr.value)) } + "constant" => self.constify_enum_variant = true, _ => {} } } @@ -159,4 +175,9 @@ impl Annotations { self.parse(&child, matched); } } + + /// Returns whether we've parsed a "constant" attribute. + pub fn constify_enum_variant(&self) -> bool { + self.constify_enum_variant + } } From 4663ae9d7187fb4c7420bca8fedc6acdf0cea39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 10 Jan 2017 12:32:36 +0100 Subject: [PATCH 0220/2291] ir: Parse whether we should constify an enum variant. --- libbindgen/src/ir/enum_ty.rs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index 5c1ead4587..0c20b26645 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -1,6 +1,7 @@ //! Intermediate representation for C/C++ enumerations. use clang; +use ir::annotations::Annotations; use parse::{ClangItemParser, ParseError}; use super::context::{BindgenContext, ItemId}; use super::item::Item; @@ -66,6 +67,10 @@ impl Enum { } }); + let type_name = ty.spelling(); + let type_name = if type_name.is_empty() { None } else { Some(type_name) }; + let type_name = type_name.as_ref().map(String::as_str); + declaration.visit(|cursor| { if cursor.kind() == CXCursor_EnumConstantDecl { let value = if is_signed { @@ -75,8 +80,16 @@ impl Enum { }; if let Some(val) = value { let name = cursor.spelling(); + let should_constify = ctx.type_chooser() + .map_or(false, |c| { + c.constify_enum_variant(type_name, &name, value) + }) || + Annotations::new(&cursor).map_or(false, |anno| { + anno.constify_enum_variant() + }); let comment = cursor.raw_comment(); - variants.push(EnumVariant::new(name, comment, val)); + variants.push( + EnumVariant::new(name, comment, val, should_constify)); } } CXChildVisit_Continue @@ -96,6 +109,11 @@ pub struct EnumVariant { /// The integer value of the variant. val: EnumVariantValue, + + /// Whether this value should explicitly be constified. + /// + /// This allows us to solve situations as described in #392. + force_constify: bool, } /// A constant value assigned to an enumeration variant. @@ -112,12 +130,14 @@ impl EnumVariant { /// Construct a new enumeration variant from the given parts. pub fn new(name: String, comment: Option, - val: EnumVariantValue) + val: EnumVariantValue, + force_constify: bool) -> Self { EnumVariant { name: name, comment: comment, val: val, + force_constify: force_constify, } } @@ -130,4 +150,10 @@ impl EnumVariant { pub fn val(&self) -> EnumVariantValue { self.val } + + /// Returns whether this variant should be enforced to be a constant by code + /// generation. + pub fn force_constification(&self) -> bool { + self.force_constify + } } From d5cd85d1a1ab2368a3dc8443ee5969e66aabc8ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 10 Jan 2017 13:32:44 +0100 Subject: [PATCH 0221/2291] codegen: Constify enum variants. --- libbindgen/src/chooser.rs | 2 +- libbindgen/src/codegen/mod.rs | 25 ++++++++++++++----- libbindgen/src/ir/annotations.rs | 7 +++++- libbindgen/src/ir/enum_ty.rs | 2 +- .../tests/expectations/tests/constify-enum.rs | 22 ++++++++++++++++ libbindgen/tests/headers/constify-enum.h | 13 ++++++++++ 6 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/constify-enum.rs create mode 100644 libbindgen/tests/headers/constify-enum.h diff --git a/libbindgen/src/chooser.rs b/libbindgen/src/chooser.rs index f28b32f124..660f423c1b 100644 --- a/libbindgen/src/chooser.rs +++ b/libbindgen/src/chooser.rs @@ -19,7 +19,7 @@ pub trait TypeChooser: fmt::Debug { fn constify_enum_variant(&self, _enum_name: Option<&str>, _variant_name: &str, - _variant_value: Option) -> bool { + _variant_value: EnumVariantValue) -> bool { false } } diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 24b862bec5..e4dbbd8f53 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1,6 +1,5 @@ mod helpers; - use aster; use ir::annotations::FieldAccessorKind; @@ -21,7 +20,7 @@ use self::helpers::{BlobTyBuilder, attributes}; use std::borrow::Cow; use std::cell::Cell; -use std::collections::HashSet; +use std::collections::{HashSet, VecDeque}; use std::collections::hash_map::{Entry, HashMap}; use std::fmt::Write; use std::iter; @@ -1667,7 +1666,19 @@ impl CodeGenerator for Enum { Some(&name) }; - for variant in self.variants().iter() { + // NB: We defer the creation of constified variants, in case we find + // another variant with the same value (which is the common thing to + // do). + let mut constified_variants = VecDeque::new(); + + let mut iter = self.variants().iter().peekable(); + while let Some(variant) = iter.next().or_else(|| constified_variants.pop_front()) { + + if variant.force_constification() && iter.peek().is_some() { + constified_variants.push_back(variant); + continue; + } + match seen_values.entry(variant.val()) { Entry::Occupied(ref entry) => { if is_rust_enum { @@ -1707,9 +1718,11 @@ impl CodeGenerator for Enum { let variant_name = ctx.rust_mangle(variant.name()); - // If it's an unnamed enum, we also generate a constant so - // it can be properly accessed. - if is_rust_enum && enum_ty.name().is_none() { + // If it's an unnamed enum, or constification is enforced, + // we also generate a constant so it can be properly + // accessed. + if (is_rust_enum && enum_ty.name().is_none()) || + variant.force_constification() { let mangled_name = if is_toplevel { variant_name.clone() } else { diff --git a/libbindgen/src/ir/annotations.rs b/libbindgen/src/ir/annotations.rs index 70f660516d..6ae350cb9a 100644 --- a/libbindgen/src/ir/annotations.rs +++ b/libbindgen/src/ir/annotations.rs @@ -45,13 +45,18 @@ pub struct Annotations { /// /// ```cpp /// enum Foo { - /// Bar = 0, //<
+ /// Bar = 0, /**<
*/ /// Baz = 0, /// }; /// ``` /// /// In that case, bindgen will generate a constant for `Bar` instead of /// `Baz`. + /// + /// You can see the kind of comments that are accepted in the Doxygen + /// documentation: + /// + /// http://www.stack.nl/~dimitri/doxygen/manual/docblocks.html constify_enum_variant: bool, } diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index 0c20b26645..7d6d1a6ec3 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -82,7 +82,7 @@ impl Enum { let name = cursor.spelling(); let should_constify = ctx.type_chooser() .map_or(false, |c| { - c.constify_enum_variant(type_name, &name, value) + c.constify_enum_variant(type_name, &name, val) }) || Annotations::new(&cursor).map_or(false, |anno| { anno.constify_enum_variant() diff --git a/libbindgen/tests/expectations/tests/constify-enum.rs b/libbindgen/tests/expectations/tests/constify-enum.rs new file mode 100644 index 0000000000..356aaa05c6 --- /dev/null +++ b/libbindgen/tests/expectations/tests/constify-enum.rs @@ -0,0 +1,22 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const nsCSSPropertyID_eCSSProperty_COUNT_unexistingVariantValue: + nsCSSPropertyID = + nsCSSPropertyID::eCSSProperty_COUNT_unexistingVariantValue; +pub const nsCSSPropertyID_eCSSProperty_COUNT: nsCSSPropertyID = + nsCSSPropertyID::eCSSPropertyAlias_aa; +pub const nsCSSPropertyID_eCSSProperty_COUNT_DUMMY2: nsCSSPropertyID = + nsCSSPropertyID::eCSSProperty_b; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum nsCSSPropertyID { + eCSSProperty_a = 0, + eCSSProperty_b = 1, + eCSSPropertyAlias_aa = 2, + eCSSPropertyAlias_bb = 3, + eCSSProperty_COUNT_unexistingVariantValue = 4, +} diff --git a/libbindgen/tests/headers/constify-enum.h b/libbindgen/tests/headers/constify-enum.h new file mode 100644 index 0000000000..f2771e5930 --- /dev/null +++ b/libbindgen/tests/headers/constify-enum.h @@ -0,0 +1,13 @@ + +enum nsCSSPropertyID { + eCSSProperty_a, + eCSSProperty_b, + + eCSSProperty_COUNT, /**<
*/ + eCSSProperty_COUNT_DUMMY2 = eCSSProperty_COUNT - 1, /**<
*/ + + eCSSPropertyAlias_aa, + eCSSPropertyAlias_bb, + + eCSSProperty_COUNT_unexistingVariantValue, /**<
*/ +}; From fee7e96875f1d7c805a09e8ec8e02988de25e370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 10 Jan 2017 14:02:49 +0100 Subject: [PATCH 0222/2291] ir: Support hiding enum variants. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Emilio Cobos Álvarez --- libbindgen/src/chooser.rs | 9 ++-- libbindgen/src/codegen/mod.rs | 3 ++ libbindgen/src/ir/annotations.rs | 12 ++--- libbindgen/src/ir/enum_ty.rs | 52 ++++++++++++++----- .../tests/expectations/tests/constify-enum.rs | 2 - libbindgen/tests/headers/constify-enum.h | 2 +- 6 files changed, 53 insertions(+), 27 deletions(-) diff --git a/libbindgen/src/chooser.rs b/libbindgen/src/chooser.rs index 660f423c1b..51392d70e1 100644 --- a/libbindgen/src/chooser.rs +++ b/libbindgen/src/chooser.rs @@ -1,7 +1,7 @@ //! A public API for more fine-grained customization of bindgen behavior. pub use ir::int::IntKind; -pub use ir::enum_ty::EnumVariantValue; +pub use ir::enum_ty::{EnumVariantValue, EnumVariantCustomBehavior}; use std::fmt; /// A trait to allow configuring different kinds of types in different @@ -16,10 +16,11 @@ pub trait TypeChooser: fmt::Debug { /// This function should return whether, given the a given enum variant /// name, and value, returns whether this enum variant will forcibly be a /// constant. - fn constify_enum_variant(&self, + fn enum_variant_behavior(&self, _enum_name: Option<&str>, _variant_name: &str, - _variant_value: EnumVariantValue) -> bool { - false + _variant_value: EnumVariantValue) + -> Option { + None } } diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index e4dbbd8f53..1ff5bf873f 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1673,6 +1673,9 @@ impl CodeGenerator for Enum { let mut iter = self.variants().iter().peekable(); while let Some(variant) = iter.next().or_else(|| constified_variants.pop_front()) { + if variant.hidden() { + continue; + } if variant.force_constification() && iter.peek().is_some() { constified_variants.push_back(variant); diff --git a/libbindgen/src/ir/annotations.rs b/libbindgen/src/ir/annotations.rs index 6ae350cb9a..98be0540f2 100644 --- a/libbindgen/src/ir/annotations.rs +++ b/libbindgen/src/ir/annotations.rs @@ -20,12 +20,17 @@ pub enum FieldAccessorKind { } /// Annotations for a given item, or a field. +/// +/// You can see the kind of comments that are accepted in the Doxygen +/// documentation: +/// +/// http://www.stack.nl/~dimitri/doxygen/manual/docblocks.html #[derive(Clone, PartialEq, Debug)] pub struct Annotations { /// Whether this item is marked as opaque. Only applies to types. opaque: bool, /// Whether this item should be hidden from the output. Only applies to - /// types. + /// types, or enum variants. hide: bool, /// Whether this type should be replaced by another. The name is a /// namespace-aware path. @@ -52,11 +57,6 @@ pub struct Annotations { /// /// In that case, bindgen will generate a constant for `Bar` instead of /// `Baz`. - /// - /// You can see the kind of comments that are accepted in the Doxygen - /// documentation: - /// - /// http://www.stack.nl/~dimitri/doxygen/manual/docblocks.html constify_enum_variant: bool, } diff --git a/libbindgen/src/ir/enum_ty.rs b/libbindgen/src/ir/enum_ty.rs index 7d6d1a6ec3..ca4e77db5e 100644 --- a/libbindgen/src/ir/enum_ty.rs +++ b/libbindgen/src/ir/enum_ty.rs @@ -7,6 +7,15 @@ use super::context::{BindgenContext, ItemId}; use super::item::Item; use super::ty::TypeKind; +/// An enum representing custom handling that can be given to a variant. +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum EnumVariantCustomBehavior { + /// This variant will be constified, that is, forced to generate a constant. + Constify, + /// This variant will be hidden entirely from the resulting enum. + Hide, +} + /// A C/C++ enumeration. #[derive(Debug)] pub struct Enum { @@ -80,16 +89,25 @@ impl Enum { }; if let Some(val) = value { let name = cursor.spelling(); - let should_constify = ctx.type_chooser() - .map_or(false, |c| { - c.constify_enum_variant(type_name, &name, val) - }) || - Annotations::new(&cursor).map_or(false, |anno| { - anno.constify_enum_variant() + let custom_behavior = ctx.type_chooser() + .and_then(|t| { + t.enum_variant_behavior(type_name, &name, val) + }) + .or_else(|| { + Annotations::new(&cursor).and_then(|anno| { + if anno.hide() { + Some(EnumVariantCustomBehavior::Hide) + } else if anno.constify_enum_variant() { + Some(EnumVariantCustomBehavior::Constify) + } else { + None + } + }) }); + let comment = cursor.raw_comment(); variants.push( - EnumVariant::new(name, comment, val, should_constify)); + EnumVariant::new(name, comment, val, custom_behavior)); } } CXChildVisit_Continue @@ -110,10 +128,8 @@ pub struct EnumVariant { /// The integer value of the variant. val: EnumVariantValue, - /// Whether this value should explicitly be constified. - /// - /// This allows us to solve situations as described in #392. - force_constify: bool, + /// The custom behavior this variant may have, if any. + custom_behavior: Option, } /// A constant value assigned to an enumeration variant. @@ -131,13 +147,13 @@ impl EnumVariant { pub fn new(name: String, comment: Option, val: EnumVariantValue, - force_constify: bool) + custom_behavior: Option) -> Self { EnumVariant { name: name, comment: comment, val: val, - force_constify: force_constify, + custom_behavior: custom_behavior, } } @@ -154,6 +170,14 @@ impl EnumVariant { /// Returns whether this variant should be enforced to be a constant by code /// generation. pub fn force_constification(&self) -> bool { - self.force_constify + self.custom_behavior + .map_or(false, |b| b == EnumVariantCustomBehavior::Constify) + } + + /// Returns whether the current variant should be hidden completely from the + /// resulting rust enum. + pub fn hidden(&self) -> bool { + self.custom_behavior + .map_or(false, |b| b == EnumVariantCustomBehavior::Hide) } } diff --git a/libbindgen/tests/expectations/tests/constify-enum.rs b/libbindgen/tests/expectations/tests/constify-enum.rs index 356aaa05c6..989c5197ac 100644 --- a/libbindgen/tests/expectations/tests/constify-enum.rs +++ b/libbindgen/tests/expectations/tests/constify-enum.rs @@ -9,8 +9,6 @@ pub const nsCSSPropertyID_eCSSProperty_COUNT_unexistingVariantValue: nsCSSPropertyID::eCSSProperty_COUNT_unexistingVariantValue; pub const nsCSSPropertyID_eCSSProperty_COUNT: nsCSSPropertyID = nsCSSPropertyID::eCSSPropertyAlias_aa; -pub const nsCSSPropertyID_eCSSProperty_COUNT_DUMMY2: nsCSSPropertyID = - nsCSSPropertyID::eCSSProperty_b; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum nsCSSPropertyID { diff --git a/libbindgen/tests/headers/constify-enum.h b/libbindgen/tests/headers/constify-enum.h index f2771e5930..a5b4052c78 100644 --- a/libbindgen/tests/headers/constify-enum.h +++ b/libbindgen/tests/headers/constify-enum.h @@ -4,7 +4,7 @@ enum nsCSSPropertyID { eCSSProperty_b, eCSSProperty_COUNT, /**<
*/ - eCSSProperty_COUNT_DUMMY2 = eCSSProperty_COUNT - 1, /**<
*/ + eCSSProperty_COUNT_DUMMY2 = eCSSProperty_COUNT - 1, /**<
*/ eCSSPropertyAlias_aa, eCSSPropertyAlias_bb, From 73187fa616dd2a8a42fb1c683ebe82df1a4289c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 7 Jan 2017 01:10:05 +0100 Subject: [PATCH 0223/2291] ir: Define a set of items we want to collect types through unconditionally. --- libbindgen/src/ir/ty.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index df3baf9188..e83ef4fdff 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -316,6 +316,20 @@ impl Type { TypeKind::UnresolvedTypeRef(..) => None, } } + + /// There are some types we don't want to stop at when finding an opaque + /// item, so we can arrive to the proper item that needs to be generated. + pub fn should_be_traced_unconditionally(&self) -> bool { + match self.kind { + TypeKind::Function(..) | + TypeKind::Pointer(..) | + TypeKind::Array(..) | + TypeKind::Reference(..) | + TypeKind::TemplateRef(..) | + TypeKind::ResolvedTypeRef(..) => true, + _ => false, + } + } } impl CanDeriveDebug for Type { From b2987eef09e10a8f941ae41906096be62f0107be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 7 Jan 2017 01:13:25 +0100 Subject: [PATCH 0224/2291] ir: Trace through some types while collecting automatically. This makes sense because there's no special meaning for some of them to be opaque. --- libbindgen/src/ir/item.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index f4598654d6..e9960166e7 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -190,14 +190,17 @@ impl TypeCollector for Item { match *self.kind() { ItemKind::Type(ref ty) => { - if !self.is_opaque(ctx) { + // There are some types, like resolved type references, where we + // don't want to stop collecting types even though they may be + // opaque. + if ty.should_be_traced_unconditionally() || !self.is_opaque(ctx) { ty.collect_types(ctx, types, self); } } ItemKind::Function(ref fun) => { - if !self.is_opaque(ctx) { - types.insert(fun.signature()); - } + // Just the same way, it has not real meaning for a function to + // be opaque, so we trace across it. + types.insert(fun.signature()); } _ => {} // FIXME. } From 2ad1b52277c960ffab05573a0ff6a30a3fa1d617 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 7 Jan 2017 02:04:47 +0100 Subject: [PATCH 0225/2291] codegen: Don't make auto-opaque types without template params. --- libbindgen/src/codegen/mod.rs | 38 ++++++++++--------- .../expectations/tests/opaque_in_struct.rs | 2 +- .../expectations/tests/opaque_pointer.rs | 2 +- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 6e63a79163..d12c3d2a29 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1879,7 +1879,13 @@ impl ToRustTy for Type { TypeKind::ResolvedTypeRef(inner) => inner.to_rust_ty(ctx), TypeKind::TemplateAlias(ref spelling, inner, _) | TypeKind::Alias(ref spelling, inner) => { - if item.is_opaque(ctx) { + let applicable_named_args = + item.applicable_template_args(ctx) + .into_iter() + .filter(|arg| ctx.resolve_type(*arg).is_named()) + .collect::>(); + + if item.is_opaque(ctx) && !applicable_named_args.is_empty() { // Pray if there's no available layout. let layout = self.layout(ctx).unwrap_or_else(Layout::zero); BlobTyBuilder::new(layout).build() @@ -1888,11 +1894,15 @@ impl ToRustTy for Type { inner) { ty } else { - utils::build_templated_path(item, ctx, true) + utils::build_templated_path(item, + ctx, + applicable_named_args) } } TypeKind::Comp(ref info) => { - if item.is_opaque(ctx) || info.has_non_type_template_params() { + let template_args = item.applicable_template_args(ctx); + if info.has_non_type_template_params() || + (item.is_opaque(ctx) && !template_args.is_empty()) { return match self.layout(ctx) { Some(layout) => BlobTyBuilder::new(layout).build(), None => { @@ -1904,7 +1914,7 @@ impl ToRustTy for Type { }; } - utils::build_templated_path(item, ctx, false) + utils::build_templated_path(item, ctx, template_args) } TypeKind::BlockPointer => { let void = raw_type(ctx, "c_void"); @@ -2215,23 +2225,15 @@ mod utils { pub fn build_templated_path(item: &Item, ctx: &BindgenContext, - only_named: bool) + template_args: Vec) -> P { let path = item.namespace_aware_canonical_path(ctx); - let builder = aster::AstBuilder::new().ty().path(); - let template_args = if only_named { - item.applicable_template_args(ctx) - .iter() - .filter(|arg| ctx.resolve_type(**arg).is_named()) - .map(|arg| arg.to_rust_ty(ctx)) - .collect::>() - } else { - item.applicable_template_args(ctx) - .iter() - .map(|arg| arg.to_rust_ty(ctx)) - .collect::>() - }; + + let template_args = template_args + .iter() + .map(|arg| arg.to_rust_ty(ctx)) + .collect::>(); // XXX: I suck at aster. if path.len() == 1 { diff --git a/libbindgen/tests/expectations/tests/opaque_in_struct.rs b/libbindgen/tests/expectations/tests/opaque_in_struct.rs index d537f5c74b..c94caa1fc5 100644 --- a/libbindgen/tests/expectations/tests/opaque_in_struct.rs +++ b/libbindgen/tests/expectations/tests/opaque_in_struct.rs @@ -21,7 +21,7 @@ impl Clone for opaque { #[repr(C)] #[derive(Debug, Copy)] pub struct container { - pub contained: u32, + pub contained: opaque, } #[test] fn bindgen_test_layout_container() { diff --git a/libbindgen/tests/expectations/tests/opaque_pointer.rs b/libbindgen/tests/expectations/tests/opaque_pointer.rs index 067f55bda2..118a1782b1 100644 --- a/libbindgen/tests/expectations/tests/opaque_pointer.rs +++ b/libbindgen/tests/expectations/tests/opaque_pointer.rs @@ -33,7 +33,7 @@ pub struct Opaque { pub struct WithOpaquePtr { pub whatever: *mut Opaque<::std::os::raw::c_int>, pub other: u32, - pub t: u32, + pub t: OtherOpaque, } #[test] fn bindgen_test_layout_WithOpaquePtr() { From 66447ff277181073d14bb04c7947eec805cd0623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 11 Jan 2017 13:12:59 +0100 Subject: [PATCH 0226/2291] Test opaque tracing through function arguments and pointer types. --- .../expectations/tests/opaque-tracing.rs | 23 +++++++++++++++++++ libbindgen/tests/headers/opaque-tracing.hpp | 21 +++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 libbindgen/tests/expectations/tests/opaque-tracing.rs create mode 100644 libbindgen/tests/headers/opaque-tracing.hpp diff --git a/libbindgen/tests/expectations/tests/opaque-tracing.rs b/libbindgen/tests/expectations/tests/opaque-tracing.rs new file mode 100644 index 0000000000..7dcc4eefaa --- /dev/null +++ b/libbindgen/tests/expectations/tests/opaque-tracing.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Container { + pub _bindgen_opaque_blob: [u32; 2usize], +} +#[test] +fn bindgen_test_layout_Container() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for Container { + fn clone(&self) -> Self { *self } +} +extern "C" { + #[link_name = "_Z3fooP9Container"] + pub fn foo(c: *mut Container); +} diff --git a/libbindgen/tests/headers/opaque-tracing.hpp b/libbindgen/tests/headers/opaque-tracing.hpp new file mode 100644 index 0000000000..7356245e55 --- /dev/null +++ b/libbindgen/tests/headers/opaque-tracing.hpp @@ -0,0 +1,21 @@ +// bindgen-flags: --opaque-type=.* --whitelist-function=foo + +class Container; + +// The whitelist tracing should reach the Container type, even though it's +// marked as opaque. +void foo(Container* c); + +template +class Wat { + T foo; +}; + +class OtherOpaque { + int bar; +}; + +class Container { + Wat bar; + OtherOpaque baz; +}; From 8c54a566457a1c4aacabf72977380c25c7fa10a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 7 Jan 2017 02:30:51 +0100 Subject: [PATCH 0227/2291] ir: Handle inline namespaces. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Emilio Cobos Álvarez --- bindgen/src/options.rs | 8 +++ libbindgen/src/codegen/mod.rs | 3 +- libbindgen/src/ir/context.rs | 67 ++++++++++++++----- libbindgen/src/ir/item.rs | 17 ++++- libbindgen/src/ir/module.rs | 19 +++++- libbindgen/src/lib.rs | 39 +++++++++++ .../expectations/tests/inline_namespace.rs | 28 ++++++++ .../tests/inline_namespace_conservative.rs | 33 +++++++++ .../tests/inline_namespace_whitelist.rs | 15 +++++ libbindgen/tests/headers/inline_namespace.hpp | 11 +++ .../headers/inline_namespace_conservative.hpp | 12 ++++ .../headers/inline_namespace_whitelist.hpp | 7 ++ 12 files changed, 239 insertions(+), 20 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/inline_namespace.rs create mode 100644 libbindgen/tests/expectations/tests/inline_namespace_conservative.rs create mode 100644 libbindgen/tests/expectations/tests/inline_namespace_whitelist.rs create mode 100644 libbindgen/tests/headers/inline_namespace.hpp create mode 100644 libbindgen/tests/headers/inline_namespace_conservative.hpp create mode 100644 libbindgen/tests/headers/inline_namespace_whitelist.hpp diff --git a/bindgen/src/options.rs b/bindgen/src/options.rs index 41a8a90574..e6226350c7 100644 --- a/bindgen/src/options.rs +++ b/bindgen/src/options.rs @@ -121,6 +121,10 @@ pub fn builder_from_flags(args: I) Arg::with_name("use-core") .long("use-core") .help("Use types from Rust core instead of std."), + Arg::with_name("conservative-inline-namespaces") + .long("conservative-inline-namespaces") + .help("Conservatively generate inline namespaces to avoid name \ + conflicts."), Arg::with_name("use-msvc-mangling") .long("use-msvc-mangling") .help("MSVC C++ ABI mangling. DEPRECATED: Has no effect."), @@ -268,6 +272,10 @@ pub fn builder_from_flags(args: I) builder = builder.use_core(); } + if matches.is_present("conservative-inline-namespaces") { + builder = builder.conservative_inline_namespaces(); + } + if let Some(whitelist) = matches.values_of("whitelist-function") { for regex in whitelist { builder = builder.whitelisted_function(regex); diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index d12c3d2a29..f8352cc8a2 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -329,7 +329,8 @@ impl CodeGenerator for Module { } }; - if !ctx.options().enable_cxx_namespaces { + if !ctx.options().enable_cxx_namespaces || + (self.is_inline() && !ctx.options().conservative_inline_namespaces) { codegen_self(result, &mut false); return; } diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index 2d87792008..c3de2ca88c 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -14,7 +14,7 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug}; use super::int::IntKind; use super::item::{Item, ItemCanonicalPath}; use super::item_kind::ItemKind; -use super::module::Module; +use super::module::{Module, ModuleKind}; use super::ty::{FloatKind, Type, TypeKind}; use super::type_collector::{ItemSet, TypeCollector}; use syntax::ast::Ident; @@ -545,7 +545,7 @@ impl<'ctx> BindgenContext<'ctx> { } fn build_root_module(id: ItemId) -> Item { - let module = Module::new(Some("root".into())); + let module = Module::new(Some("root".into()), ModuleKind::Normal); Item::new(id, None, None, id, ItemKind::Module(module)) } @@ -955,31 +955,64 @@ impl<'ctx> BindgenContext<'ctx> { &self.options } + /// Tokenizes a namespace cursor in order to get the name and kind of the + /// namespace, + fn tokenize_namespace(&self, + cursor: &clang::Cursor) + -> (Option, ModuleKind) { + assert_eq!(cursor.kind(), ::clang_sys::CXCursor_Namespace, + "Be a nice person"); + let tokens = match self.translation_unit.tokens(&cursor) { + Some(tokens) => tokens, + None => return (None, ModuleKind::Normal), + }; + + let mut iter = tokens.iter(); + let mut kind = ModuleKind::Normal; + let mut found_namespace_keyword = false; + let mut module_name = None; + while let Some(token) = iter.next() { + match &*token.spelling { + "inline" => { + assert!(!found_namespace_keyword); + assert!(kind != ModuleKind::Inline); + kind = ModuleKind::Inline; + } + "namespace" => { + found_namespace_keyword = true; + } + "{" => { + assert!(found_namespace_keyword); + break; + } + name if found_namespace_keyword => { + module_name = Some(name.to_owned()); + break; + } + _ => { + panic!("Unknown token while processing namespace: {:?}", + token); + } + } + }; + + (module_name, kind) + } + /// Given a CXCursor_Namespace cursor, return the item id of the /// corresponding module, or create one on the fly. pub fn module(&mut self, cursor: clang::Cursor) -> ItemId { use clang_sys::*; - assert!(cursor.kind() == CXCursor_Namespace, "Be a nice person"); + assert_eq!(cursor.kind(), CXCursor_Namespace, "Be a nice person"); let cursor = cursor.canonical(); if let Some(id) = self.modules.get(&cursor) { return *id; } - let module_id = self.next_item_id(); - let module_name = self.translation_unit - .tokens(&cursor) - .and_then(|tokens| { - if tokens.len() <= 1 { - None - } else { - match &*tokens[1].spelling { - "{" => None, - s => Some(s.to_owned()), - } - } - }); + let (module_name, kind) = self.tokenize_namespace(&cursor); - let module = Module::new(module_name); + let module_id = self.next_item_id(); + let module = Module::new(module_name, kind); let module = Item::new(module_id, None, None, diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index e9960166e7..3810bc2f87 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -853,6 +853,15 @@ impl Item { format!("id_{}", self.id().as_usize()) } + /// Get a reference to this item's `Module`, or `None` if this is not a + /// `Module` item. + pub fn as_module(&self) -> Option<&Module> { + match self.kind { + ItemKind::Module(ref module) => Some(module), + _ => None, + } + } + /// Get a mutable reference to this item's `Module`, or `None` if this is /// not a `Module` item. pub fn as_module_mut(&mut self) -> Option<&mut Module> { @@ -1304,7 +1313,13 @@ impl ItemCanonicalPath for Item { let mut path: Vec<_> = target.ancestors(ctx) .chain(iter::once(ctx.root_module())) .map(|id| ctx.resolve_item(id)) - .filter(|item| item.is_module() || item.id() == target.id()) + .filter(|item| { + item.id() == target.id() || + item.as_module().map_or(false, |module| { + !module.is_inline() || + ctx.options().conservative_inline_namespaces + }) + }) .map(|item| { ctx.resolve_item(item.name_target(ctx)) .name(ctx) diff --git a/libbindgen/src/ir/module.rs b/libbindgen/src/ir/module.rs index 5fae3932ac..002fe36e6c 100644 --- a/libbindgen/src/ir/module.rs +++ b/libbindgen/src/ir/module.rs @@ -5,20 +5,32 @@ use parse::{ClangSubItemParser, ParseError, ParseResult}; use parse_one; use super::context::{BindgenContext, ItemId}; +/// Whether this module is inline or not. +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum ModuleKind { + /// This module is not inline. + Normal, + /// This module is inline, as in `inline namespace foo {}`. + Inline, +} + /// A module, as in, a C++ namespace. #[derive(Clone, Debug)] pub struct Module { /// The name of the module, or none if it's anonymous. name: Option, + /// The kind of module this is. + kind: ModuleKind, /// The children of this module, just here for convenience. children_ids: Vec, } impl Module { /// Construct a new `Module`. - pub fn new(name: Option) -> Self { + pub fn new(name: Option, kind: ModuleKind) -> Self { Module { name: name, + kind: kind, children_ids: vec![], } } @@ -37,6 +49,11 @@ impl Module { pub fn children(&self) -> &[ItemId] { &self.children_ids } + + /// Whether this namespace is inline. + pub fn is_inline(&self) -> bool { + self.kind == ModuleKind::Inline + } } impl ClangSubItemParser for Module { diff --git a/libbindgen/src/lib.rs b/libbindgen/src/lib.rs index 1834b3f23d..60b750de24 100644 --- a/libbindgen/src/lib.rs +++ b/libbindgen/src/lib.rs @@ -305,6 +305,39 @@ impl Builder { self } + /// Treat inline namespaces conservatively. + /// + /// This is tricky, because in C++ is technically legal to override an item + /// defined in an inline namespace: + /// + /// ```cpp + /// inline namespace foo { + /// using Bar = int; + /// } + /// using Bar = long; + /// ``` + /// + /// Even though referencing `Bar` is a compiler error. + /// + /// We want to support this (arguably esoteric) use case, but we don't want + /// to make the rest of bindgen users pay an usability penalty for that. + /// + /// To support this, we need to keep all the inline namespaces around, but + /// then bindgen usage is a bit more difficult, because you cannot + /// reference, e.g., `std::string` (you'd need to use the proper inline + /// namespace). + /// + /// We could complicate a lot of the logic to detect name collisions, and if + /// not detected generate a `pub use inline_ns::*` or something like that. + /// + /// That's probably something we can do if we see this option is needed in a + /// lot of cases, to improve it's usability, but my guess is that this is + /// not going to be too useful. + pub fn conservative_inline_namespaces(mut self) -> Builder { + self.options.conservative_inline_namespaces = true; + self + } + /// Ignore functions. pub fn ignore_functions(mut self) -> Builder { self.options.codegen_config.functions = false; @@ -448,6 +481,11 @@ pub struct BindgenOptions { /// Which kind of items should we generate? By default, we'll generate all /// of them. pub codegen_config: CodegenConfig, + + /// Whether to treat inline namespaces conservatively. + /// + /// See the builder method description for more details. + pub conservative_inline_namespaces: bool, } impl BindgenOptions { @@ -489,6 +527,7 @@ impl Default for BindgenOptions { dummy_uses: None, type_chooser: None, codegen_config: CodegenConfig::all(), + conservative_inline_namespaces: false, } } } diff --git a/libbindgen/tests/expectations/tests/inline_namespace.rs b/libbindgen/tests/expectations/tests/inline_namespace.rs new file mode 100644 index 0000000000..5f6776b72b --- /dev/null +++ b/libbindgen/tests/expectations/tests/inline_namespace.rs @@ -0,0 +1,28 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use self::super::root; + pub mod foo { + #[allow(unused_imports)] + use self::super::super::root; + pub type Ty = ::std::os::raw::c_int; + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Bar { + pub baz: root::foo::Ty, + } + #[test] + fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); + } + impl Clone for Bar { + fn clone(&self) -> Self { *self } + } +} diff --git a/libbindgen/tests/expectations/tests/inline_namespace_conservative.rs b/libbindgen/tests/expectations/tests/inline_namespace_conservative.rs new file mode 100644 index 0000000000..d759a882ca --- /dev/null +++ b/libbindgen/tests/expectations/tests/inline_namespace_conservative.rs @@ -0,0 +1,33 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use self::super::root; + pub mod foo { + #[allow(unused_imports)] + use self::super::super::root; + pub mod bar { + #[allow(unused_imports)] + use self::super::super::super::root; + pub type Ty = ::std::os::raw::c_int; + } + pub type Ty = ::std::os::raw::c_longlong; + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Bar { + pub baz: root::foo::bar::Ty, + } + #[test] + fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); + } + impl Clone for Bar { + fn clone(&self) -> Self { *self } + } +} diff --git a/libbindgen/tests/expectations/tests/inline_namespace_whitelist.rs b/libbindgen/tests/expectations/tests/inline_namespace_whitelist.rs new file mode 100644 index 0000000000..9b8f87a5cf --- /dev/null +++ b/libbindgen/tests/expectations/tests/inline_namespace_whitelist.rs @@ -0,0 +1,15 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use self::super::root; + pub mod std { + #[allow(unused_imports)] + use self::super::super::root; + pub type string = *const ::std::os::raw::c_char; + } +} diff --git a/libbindgen/tests/headers/inline_namespace.hpp b/libbindgen/tests/headers/inline_namespace.hpp new file mode 100644 index 0000000000..2ccf8ab0e2 --- /dev/null +++ b/libbindgen/tests/headers/inline_namespace.hpp @@ -0,0 +1,11 @@ +// bindgen-flags: --enable-cxx-namespaces -- -std=c++11 + +namespace foo { + inline namespace bar { + using Ty = int; + }; +}; + +class Bar { + foo::Ty baz; +}; diff --git a/libbindgen/tests/headers/inline_namespace_conservative.hpp b/libbindgen/tests/headers/inline_namespace_conservative.hpp new file mode 100644 index 0000000000..50068a2e0a --- /dev/null +++ b/libbindgen/tests/headers/inline_namespace_conservative.hpp @@ -0,0 +1,12 @@ +// bindgen-flags: --enable-cxx-namespaces --conservative-inline-namespaces -- -std=c++11 + +namespace foo { + inline namespace bar { + using Ty = int; + }; + using Ty = long long; +}; + +class Bar { + foo::bar::Ty baz; +}; diff --git a/libbindgen/tests/headers/inline_namespace_whitelist.hpp b/libbindgen/tests/headers/inline_namespace_whitelist.hpp new file mode 100644 index 0000000000..30047bbec1 --- /dev/null +++ b/libbindgen/tests/headers/inline_namespace_whitelist.hpp @@ -0,0 +1,7 @@ +// bindgen-flags: --enable-cxx-namespaces --whitelist-type=std::string -- -std=c++11 + +namespace std { + inline namespace bar { + using string = const char*; + }; +}; From aaa7280a08b65aebe42b5405aec2bf72ae780885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 13 Jan 2017 21:19:10 +0100 Subject: [PATCH 0228/2291] Update aster and syntex. --- libbindgen/Cargo.toml | 6 +++--- libbindgen/src/codegen/helpers.rs | 5 ++--- libbindgen/src/codegen/mod.rs | 11 +++++++---- libbindgen/src/ir/context.rs | 3 ++- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index f5498bc9d2..489434b13c 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -29,12 +29,12 @@ cfg-if = "0.1.0" clang-sys = { version = "0.12", features = ["runtime", "clang_3_9"] } lazy_static = "0.2.1" rustc-serialize = "0.3.19" -syntex_syntax = "0.50" +syntex_syntax = "0.54" regex = "0.2" [dependencies.aster] features = ["with-syntex"] -version = "0.34" +version = "0.38" [dependencies.env_logger] optional = true @@ -46,7 +46,7 @@ version = "0.3" [dependencies.quasi] features = ["with-syntex"] -version = "0.26" +version = "0.29" [features] assert_no_dangling_items = [] diff --git a/libbindgen/src/codegen/helpers.rs b/libbindgen/src/codegen/helpers.rs index c09f007160..b4cc75f5e9 100644 --- a/libbindgen/src/codegen/helpers.rs +++ b/libbindgen/src/codegen/helpers.rs @@ -153,7 +153,7 @@ pub mod ast_ty { } pub fn float_expr(f: f64) -> P { - use aster::str::ToInternedString; + use aster::symbol::ToSymbol; let mut string = f.to_string(); // So it gets properly recognised as a floating point constant. @@ -161,8 +161,7 @@ pub mod ast_ty { string.push('.'); } - let interned_str = string.as_str().to_interned_string(); - let kind = ast::LitKind::FloatUnsuffixed(interned_str); + let kind = ast::LitKind::FloatUnsuffixed(string.as_str().to_symbol()); aster::AstBuilder::new().expr().lit().build_lit(kind) } diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index f8352cc8a2..b223783eca 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1863,16 +1863,19 @@ impl ToRustTy for Type { if let ast::TyKind::Path(_, ref mut path) = inner_ty.node { let template_args = template_args.iter() .map(|arg| arg.to_rust_ty(ctx)) - .collect(); + .collect::>(); - path.segments.last_mut().unwrap().parameters = - ast::PathParameters::AngleBracketed( + path.segments.last_mut().unwrap().parameters = if template_args.is_empty() { + None + } else { + Some(P(ast::PathParameters::AngleBracketed( ast::AngleBracketedParameterData { lifetimes: vec![], types: P::from_vec(template_args), bindings: P::from_vec(vec![]), } - ); + ))) + } } P(inner_ty) diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index c3de2ca88c..06137672e6 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -461,6 +461,7 @@ impl<'ctx> BindgenContext<'ctx> { pub fn gen(&mut self, cb: F) -> Out where F: FnOnce(&Self) -> Out, { + use aster::symbol::ToSymbol; use syntax::ext::expand::ExpansionConfig; use syntax::codemap::{ExpnInfo, MacroBang, NameAndSpan}; use syntax::ext::base; @@ -475,7 +476,7 @@ impl<'ctx> BindgenContext<'ctx> { ctx.0.bt_push(ExpnInfo { call_site: self.span, callee: NameAndSpan { - format: MacroBang(parse::token::intern("")), + format: MacroBang("".to_symbol()), allow_internal_unstable: false, span: None, }, From dfb25b389bec5492b6fd61e92a2552cab03a6afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 13 Jan 2017 21:30:49 +0100 Subject: [PATCH 0229/2291] codegen: Prefer use instead of type aliases. --- libbindgen/src/codegen/mod.rs | 46 +++++++++++++------ libbindgen/src/ir/ty.rs | 8 ++++ .../tests/expectations/tests/anon_enum.rs | 6 +++ .../tests/bitfield_method_mangling.rs | 2 +- .../expectations/tests/inherit_typedef.rs | 2 +- .../tests/reparented_replacement.rs | 2 +- .../tests/expectations/tests/union_fields.rs | 2 +- .../tests/expectations/tests/unknown_attr.rs | 2 +- libbindgen/tests/headers/anon_enum.hpp | 5 ++ 9 files changed, 56 insertions(+), 19 deletions(-) diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index b223783eca..b438802017 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -523,22 +523,40 @@ impl CodeGenerator for Type { typedef = typedef.attr().doc(comment); } - let mut generics = typedef.type_(rust_name).generics(); - for template_arg in applicable_template_args.iter() { - let template_arg = ctx.resolve_type(*template_arg); - if template_arg.is_named() { - let name = template_arg.name().unwrap(); - if name.contains("typename ") { - warn!("Item contained `typename`'d template \ - parameter: {:?}", item); - return; + // We prefer using `pub use` over `pub type` because of: + // https://github.com/rust-lang/rust/issues/26264 + let simple_enum_path = match inner_rust_type.node { + ast::TyKind::Path(None, ref p) => { + if applicable_template_args.is_empty() && + !inner_item.expect_type().canonical_type(ctx).is_builtin_or_named() && + p.segments.iter().all(|p| p.parameters.is_none()) { + Some(p.clone()) + } else { + None } - generics = - generics.ty_param_id(template_arg.name().unwrap()); - } - } + }, + _ => None, + }; - let typedef = generics.build().build_ty(inner_rust_type); + let typedef = if let Some(p) = simple_enum_path { + typedef.use_().build(p).as_(rust_name) + } else { + let mut generics = typedef.type_(rust_name).generics(); + for template_arg in applicable_template_args.iter() { + let template_arg = ctx.resolve_type(*template_arg); + if template_arg.is_named() { + let name = template_arg.name().unwrap(); + if name.contains("typename ") { + warn!("Item contained `typename`'d template \ + parameter: {:?}", item); + return; + } + generics = + generics.ty_param_id(template_arg.name().unwrap()); + } + } + generics.build().build_ty(inner_rust_type) + }; result.push(typedef) } TypeKind::Enum(ref ei) => { diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs index e83ef4fdff..c1ed5b6466 100644 --- a/libbindgen/src/ir/ty.rs +++ b/libbindgen/src/ir/ty.rs @@ -123,6 +123,14 @@ impl Type { } } + /// Is this an enum type? + pub fn is_enum(&self) -> bool { + match self.kind { + TypeKind::Enum(..) => true, + _ => false, + } + } + /// Is this either a builtin or named type? pub fn is_builtin_or_named(&self) -> bool { match self.kind { diff --git a/libbindgen/tests/expectations/tests/anon_enum.rs b/libbindgen/tests/expectations/tests/anon_enum.rs index 075830e6dc..8a287d3d78 100644 --- a/libbindgen/tests/expectations/tests/anon_enum.rs +++ b/libbindgen/tests/expectations/tests/anon_enum.rs @@ -22,3 +22,9 @@ fn bindgen_test_layout_Test() { impl Clone for Test { fn clone(&self) -> Self { *self } } +pub const Foo: _bindgen_ty_1 = _bindgen_ty_1::Foo; +pub const Bar: _bindgen_ty_1 = _bindgen_ty_1::Bar; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum _bindgen_ty_1 { Foo = 0, Bar = 1, } +pub use _bindgen_ty_1 as Baz; diff --git a/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs b/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs index 5aba8abb08..b7869bf8e5 100644 --- a/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs +++ b/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs @@ -46,4 +46,4 @@ impl _bindgen_ty_1 { ((val as u32 as u32) << 24u32) & (4278190080usize as u32); } } -pub type mach_msg_type_descriptor_t = _bindgen_ty_1; +pub use _bindgen_ty_1 as mach_msg_type_descriptor_t; diff --git a/libbindgen/tests/expectations/tests/inherit_typedef.rs b/libbindgen/tests/expectations/tests/inherit_typedef.rs index ca9041e202..b66cb7248f 100644 --- a/libbindgen/tests/expectations/tests/inherit_typedef.rs +++ b/libbindgen/tests/expectations/tests/inherit_typedef.rs @@ -17,7 +17,7 @@ fn bindgen_test_layout_Foo() { impl Clone for Foo { fn clone(&self) -> Self { *self } } -pub type TypedefedFoo = Foo; +pub use Foo as TypedefedFoo; #[repr(C)] #[derive(Debug, Copy)] pub struct Bar { diff --git a/libbindgen/tests/expectations/tests/reparented_replacement.rs b/libbindgen/tests/expectations/tests/reparented_replacement.rs index 74ee229c15..e8ccc9315b 100644 --- a/libbindgen/tests/expectations/tests/reparented_replacement.rs +++ b/libbindgen/tests/expectations/tests/reparented_replacement.rs @@ -25,5 +25,5 @@ pub mod root { fn clone(&self) -> Self { *self } } } - pub type ReferencesBar = root::foo::Bar; + pub use root::foo::Bar as ReferencesBar; } diff --git a/libbindgen/tests/expectations/tests/union_fields.rs b/libbindgen/tests/expectations/tests/union_fields.rs index 495e80f984..655a30ffe1 100644 --- a/libbindgen/tests/expectations/tests/union_fields.rs +++ b/libbindgen/tests/expectations/tests/union_fields.rs @@ -44,4 +44,4 @@ fn bindgen_test_layout__bindgen_ty_1() { impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } } -pub type nsStyleUnion = _bindgen_ty_1; +pub use _bindgen_ty_1 as nsStyleUnion; diff --git a/libbindgen/tests/expectations/tests/unknown_attr.rs b/libbindgen/tests/expectations/tests/unknown_attr.rs index fd9cce4593..8ed508c54a 100644 --- a/libbindgen/tests/expectations/tests/unknown_attr.rs +++ b/libbindgen/tests/expectations/tests/unknown_attr.rs @@ -13,4 +13,4 @@ pub struct _bindgen_ty_1 { impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } } -pub type max_align_t = _bindgen_ty_1; +pub use _bindgen_ty_1 as max_align_t; diff --git a/libbindgen/tests/headers/anon_enum.hpp b/libbindgen/tests/headers/anon_enum.hpp index c740520241..1961fe6cf7 100644 --- a/libbindgen/tests/headers/anon_enum.hpp +++ b/libbindgen/tests/headers/anon_enum.hpp @@ -3,3 +3,8 @@ struct Test { float bar; enum { T_NONE }; }; + +typedef enum { + Foo, + Bar, +} Baz; From 0ceeaf8d34b85da08a127db6668854b9ca5a1a54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 13 Jan 2017 21:40:17 +0100 Subject: [PATCH 0230/2291] codegen: Fix use generation for non-root module. --- bindgen-integration/cpp/Test.h | 2 ++ libbindgen/src/codegen/mod.rs | 8 +++++++- libbindgen/tests/expectations/tests/anon_enum.rs | 2 +- .../tests/expectations/tests/bitfield_method_mangling.rs | 2 +- libbindgen/tests/expectations/tests/inherit_typedef.rs | 2 +- libbindgen/tests/expectations/tests/union_fields.rs | 2 +- libbindgen/tests/expectations/tests/unknown_attr.rs | 2 +- 7 files changed, 14 insertions(+), 6 deletions(-) diff --git a/bindgen-integration/cpp/Test.h b/bindgen-integration/cpp/Test.h index 21f6d1a7bb..ebd58649e8 100644 --- a/bindgen-integration/cpp/Test.h +++ b/bindgen-integration/cpp/Test.h @@ -8,3 +8,5 @@ class Test { Test(int foo); Test(double foo); }; + +typedef Test TypeAlias; diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index b438802017..932e2b7572 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -538,7 +538,13 @@ impl CodeGenerator for Type { _ => None, }; - let typedef = if let Some(p) = simple_enum_path { + let typedef = if let Some(mut p) = simple_enum_path { + if p.segments.len() == 1 { + p.segments.insert(0, ast::PathSegment { + identifier: ctx.ext_cx().ident_of("self"), + parameters: None, + }); + } typedef.use_().build(p).as_(rust_name) } else { let mut generics = typedef.type_(rust_name).generics(); diff --git a/libbindgen/tests/expectations/tests/anon_enum.rs b/libbindgen/tests/expectations/tests/anon_enum.rs index 8a287d3d78..3b05eab842 100644 --- a/libbindgen/tests/expectations/tests/anon_enum.rs +++ b/libbindgen/tests/expectations/tests/anon_enum.rs @@ -27,4 +27,4 @@ pub const Bar: _bindgen_ty_1 = _bindgen_ty_1::Bar; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum _bindgen_ty_1 { Foo = 0, Bar = 1, } -pub use _bindgen_ty_1 as Baz; +pub use self::_bindgen_ty_1 as Baz; diff --git a/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs b/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs index b7869bf8e5..b650a38f8c 100644 --- a/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs +++ b/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs @@ -46,4 +46,4 @@ impl _bindgen_ty_1 { ((val as u32 as u32) << 24u32) & (4278190080usize as u32); } } -pub use _bindgen_ty_1 as mach_msg_type_descriptor_t; +pub use self::_bindgen_ty_1 as mach_msg_type_descriptor_t; diff --git a/libbindgen/tests/expectations/tests/inherit_typedef.rs b/libbindgen/tests/expectations/tests/inherit_typedef.rs index b66cb7248f..2b9742231c 100644 --- a/libbindgen/tests/expectations/tests/inherit_typedef.rs +++ b/libbindgen/tests/expectations/tests/inherit_typedef.rs @@ -17,7 +17,7 @@ fn bindgen_test_layout_Foo() { impl Clone for Foo { fn clone(&self) -> Self { *self } } -pub use Foo as TypedefedFoo; +pub use self::Foo as TypedefedFoo; #[repr(C)] #[derive(Debug, Copy)] pub struct Bar { diff --git a/libbindgen/tests/expectations/tests/union_fields.rs b/libbindgen/tests/expectations/tests/union_fields.rs index 655a30ffe1..21d8791923 100644 --- a/libbindgen/tests/expectations/tests/union_fields.rs +++ b/libbindgen/tests/expectations/tests/union_fields.rs @@ -44,4 +44,4 @@ fn bindgen_test_layout__bindgen_ty_1() { impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } } -pub use _bindgen_ty_1 as nsStyleUnion; +pub use self::_bindgen_ty_1 as nsStyleUnion; diff --git a/libbindgen/tests/expectations/tests/unknown_attr.rs b/libbindgen/tests/expectations/tests/unknown_attr.rs index 8ed508c54a..541bee5d18 100644 --- a/libbindgen/tests/expectations/tests/unknown_attr.rs +++ b/libbindgen/tests/expectations/tests/unknown_attr.rs @@ -13,4 +13,4 @@ pub struct _bindgen_ty_1 { impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } } -pub use _bindgen_ty_1 as max_align_t; +pub use self::_bindgen_ty_1 as max_align_t; From 01cb681c17003cea2af9d7e641f9b97ded4bfcc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 14 Jan 2017 15:37:13 +0100 Subject: [PATCH 0231/2291] ir: Trace types across vars. --- libbindgen/src/ir/comp.rs | 4 ++ libbindgen/src/ir/item.rs | 3 ++ .../tests/expectations/tests/var-tracing.rs | 48 +++++++++++++++++++ libbindgen/tests/headers/var-tracing.hpp | 10 ++++ 4 files changed, 65 insertions(+) create mode 100644 libbindgen/tests/expectations/tests/var-tracing.rs create mode 100644 libbindgen/tests/headers/var-tracing.hpp diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index 70dfd4a640..6dfa1ece23 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -971,6 +971,10 @@ impl TypeCollector for CompInfo { types.insert(ty); } + for &var in self.inner_vars() { + types.insert(var); + } + // FIXME(emilio): Methods, VTable? } } diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs index 3810bc2f87..df8fd22280 100644 --- a/libbindgen/src/ir/item.rs +++ b/libbindgen/src/ir/item.rs @@ -202,6 +202,9 @@ impl TypeCollector for Item { // be opaque, so we trace across it. types.insert(fun.signature()); } + ItemKind::Var(ref var) => { + types.insert(var.ty()); + } _ => {} // FIXME. } } diff --git a/libbindgen/tests/expectations/tests/var-tracing.rs b/libbindgen/tests/expectations/tests/var-tracing.rs new file mode 100644 index 0000000000..75c5ebe3be --- /dev/null +++ b/libbindgen/tests/expectations/tests/var-tracing.rs @@ -0,0 +1,48 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Bar { + pub m_baz: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +extern "C" { + #[link_name = "_ZN3BarC1Ei"] + pub fn Bar_Bar(this: *mut Bar, baz: ::std::os::raw::c_int); +} +impl Clone for Bar { + fn clone(&self) -> Self { *self } +} +impl Bar { + #[inline] + pub unsafe fn new(baz: ::std::os::raw::c_int) -> Self { + let mut __bindgen_tmp = ::std::mem::uninitialized(); + Bar_Bar(&mut __bindgen_tmp, baz); + __bindgen_tmp + } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Baz { + pub _address: u8, +} +extern "C" { + #[link_name = "_ZN3Baz3FOOE"] + pub static mut Baz_FOO: *const Bar; +} +#[test] +fn bindgen_test_layout_Baz() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for Baz { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/headers/var-tracing.hpp b/libbindgen/tests/headers/var-tracing.hpp new file mode 100644 index 0000000000..0d0b0ccac2 --- /dev/null +++ b/libbindgen/tests/headers/var-tracing.hpp @@ -0,0 +1,10 @@ +// bindgen-flags: --whitelist-type Baz + +struct Bar { + const int m_baz; + Bar(int baz); +}; + +class Baz { + static const Bar FOO[]; +}; From a8e5bd07181ef235b406e29bfd4dd7e3b5790fee Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 16 Jan 2017 10:37:08 +0100 Subject: [PATCH 0232/2291] Update env_logger. --- bindgen/Cargo.toml | 4 ++-- libbindgen/Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bindgen/Cargo.toml b/bindgen/Cargo.toml index 22e31ba6e6..a445df6940 100644 --- a/bindgen/Cargo.toml +++ b/bindgen/Cargo.toml @@ -11,7 +11,7 @@ license = "BSD-3-Clause" name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" -version = "0.17.0" +version = "0.17.1" workspace = ".." [dependencies] @@ -19,7 +19,7 @@ clang-sys = "0.12" clap = "2" libbindgen = { path = "../libbindgen" } log = "0.3" -env_logger = "0.3" +env_logger = "0.4" rustc-serialize = "0.3.19" [features] diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml index f5498bc9d2..0ff11a242f 100644 --- a/libbindgen/Cargo.toml +++ b/libbindgen/Cargo.toml @@ -12,7 +12,7 @@ license = "BSD-3-Clause" name = "libbindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" -version = "0.1.6" +version = "0.1.7" workspace = ".." [dev-dependencies] @@ -38,7 +38,7 @@ version = "0.34" [dependencies.env_logger] optional = true -version = "0.3" +version = "0.4" [dependencies.log] optional = true From d021caab5ea0180395cb790eb8ecafa8f66dc7b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 16 Jan 2017 20:03:30 +0100 Subject: [PATCH 0233/2291] ir: Unify function checks so they apply to non-methods. --- libbindgen/src/ir/comp.rs | 29 +++---------------- libbindgen/src/ir/function.rs | 19 ++++++++++++ .../expectations/tests/inline-function.rs | 7 +++++ .../tests/expectations/tests/namespace.rs | 13 +++++++++ libbindgen/tests/headers/inline-function.h | 6 ++++ 5 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/inline-function.rs create mode 100644 libbindgen/tests/headers/inline-function.h diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index 70dfd4a640..3065490178 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -652,29 +652,6 @@ impl CompInfo { ci.has_destructor |= cur.kind() == CXCursor_Destructor; ci.has_vtable |= is_virtual; - let linkage = cur.linkage(); - if linkage != CXLinkage_External { - return CXChildVisit_Continue; - } - - if cur.access_specifier() == CX_CXXPrivate { - return CXChildVisit_Continue; - } - - let visibility = cur.visibility(); - if visibility != CXVisibility_Default { - return CXChildVisit_Continue; - } - - if cur.is_inlined_function() { - return CXChildVisit_Continue; - } - - let spelling = cur.spelling(); - if spelling.starts_with("operator") { - return CXChildVisit_Continue; - } - // This used to not be here, but then I tried generating // stylo bindings with this (without path filters), and // cried a lot with a method in gfx/Point.h @@ -691,8 +668,10 @@ impl CompInfo { // NB: This gets us an owned `Function`, not a // `FunctionSig`. - let signature = Item::parse(cur, Some(potential_id), ctx) - .expect("CXXMethod"); + let signature = match Item::parse(cur, Some(potential_id), ctx) { + Ok(item) if ctx.resolve_item(item).kind().is_function() => item, + _ => return CXChildVisit_Continue, + }; match cur.kind() { CXCursor_Constructor => { diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs index 88ab861dcf..50c442db10 100644 --- a/libbindgen/src/ir/function.rs +++ b/libbindgen/src/ir/function.rs @@ -150,6 +150,7 @@ impl FunctionSig { } else { ty.declaration() }; + let mut args: Vec<_> = match cursor.kind() { CXCursor_FunctionDecl | CXCursor_Constructor | @@ -262,6 +263,24 @@ impl ClangSubItemParser for Function { debug!("Function::parse({:?}, {:?})", cursor, cursor.cur_type()); + let visibility = cursor.visibility(); + if visibility != CXVisibility_Default { + return Err(ParseError::Continue); + } + + if cursor.access_specifier() == CX_CXXPrivate { + return Err(ParseError::Continue); + } + + if cursor.is_inlined_function() { + return Err(ParseError::Continue); + } + + let linkage = cursor.linkage(); + if linkage != CXLinkage_External && linkage != CXLinkage_UniqueExternal { + return Err(ParseError::Continue); + } + // Grab the signature using Item::from_ty. let sig = try!(Item::from_ty(&cursor.cur_type(), Some(cursor), diff --git a/libbindgen/tests/expectations/tests/inline-function.rs b/libbindgen/tests/expectations/tests/inline-function.rs new file mode 100644 index 0000000000..b4b7b2bcee --- /dev/null +++ b/libbindgen/tests/expectations/tests/inline-function.rs @@ -0,0 +1,7 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + + diff --git a/libbindgen/tests/expectations/tests/namespace.rs b/libbindgen/tests/expectations/tests/namespace.rs index 3d6e597484..ece4e3412e 100644 --- a/libbindgen/tests/expectations/tests/namespace.rs +++ b/libbindgen/tests/expectations/tests/namespace.rs @@ -37,9 +37,22 @@ pub mod root { assert_eq!(::std::mem::size_of::
() , 4usize); assert_eq!(::std::mem::align_of::() , 4usize); } + extern "C" { + #[link_name = "_ZN12_GLOBAL__N_11A20lets_hope_this_worksEv"] + pub fn A_lets_hope_this_works(this: + *mut root::_bindgen_mod_id_13::A) + -> ::std::os::raw::c_int; + } impl Clone for A { fn clone(&self) -> Self { *self } } + impl A { + #[inline] + pub unsafe fn lets_hope_this_works(&mut self) + -> ::std::os::raw::c_int { + A_lets_hope_this_works(&mut *self) + } + } } #[repr(C)] #[derive(Debug)] diff --git a/libbindgen/tests/headers/inline-function.h b/libbindgen/tests/headers/inline-function.h new file mode 100644 index 0000000000..02cb7c08ab --- /dev/null +++ b/libbindgen/tests/headers/inline-function.h @@ -0,0 +1,6 @@ +// bindgen-unstable + +/** The point of this test is to _not_ generate these functions. */ + +inline static int myadd(const int x, const int y) { return x + y; } +static int mysub(const int x, const int y) { return x - y; } From b743ab0d5fa222c8d4e7a59a7d3952d042eb2e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 18 Jan 2017 14:40:49 +0100 Subject: [PATCH 0234/2291] codegen: Don't implement variadic methods. Fixes #402 --- libbindgen/src/codegen/mod.rs | 6 +++++ .../expectations/tests/variadic-method.rs | 27 +++++++++++++++++++ libbindgen/tests/headers/variadic-method.hpp | 6 +++++ 3 files changed, 39 insertions(+) create mode 100644 libbindgen/tests/expectations/tests/variadic-method.rs create mode 100644 libbindgen/tests/headers/variadic-method.hpp diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index f8352cc8a2..38cf69586b 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1295,6 +1295,12 @@ impl MethodCodegen for Method { _ => panic!("How in the world?"), }; + // Do not generate variadic methods, since rust does not allow + // implementing them, and we don't do a good job at it anyway. + if signature.is_variadic() { + return; + } + let count = { let mut count = method_names.entry(name.clone()) .or_insert(0); diff --git a/libbindgen/tests/expectations/tests/variadic-method.rs b/libbindgen/tests/expectations/tests/variadic-method.rs new file mode 100644 index 0000000000..343010694b --- /dev/null +++ b/libbindgen/tests/expectations/tests/variadic-method.rs @@ -0,0 +1,27 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +extern "C" { + #[link_name = "_Z3fooPKcz"] + pub fn foo(fmt: *const ::std::os::raw::c_char, ...); +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Bar { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +extern "C" { + #[link_name = "_ZN3Bar3fooEPKcz"] + pub fn Bar_foo(this: *mut Bar, fmt: *const ::std::os::raw::c_char, ...); +} +impl Clone for Bar { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/headers/variadic-method.hpp b/libbindgen/tests/headers/variadic-method.hpp new file mode 100644 index 0000000000..78a8eb45b5 --- /dev/null +++ b/libbindgen/tests/headers/variadic-method.hpp @@ -0,0 +1,6 @@ + +void foo(const char* fmt, ...); + +struct Bar { + void foo(const char* fmt, ...); +}; From e6a9291cb089da2a2b252f78658d125ffcd48802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 19 Jan 2017 16:22:26 +0100 Subject: [PATCH 0235/2291] ir: Fix the assert no danging items traversal to avoid getting hung on a cyclic reference caused by inner_const.hpp. --- libbindgen/src/ir/context.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libbindgen/src/ir/context.rs b/libbindgen/src/ir/context.rs index c3de2ca88c..4d20c053c6 100644 --- a/libbindgen/src/ir/context.rs +++ b/libbindgen/src/ir/context.rs @@ -1255,8 +1255,9 @@ impl<'ctx, 'gen> Iterator for AssertNoDanglingItemIter<'ctx, 'gen> } for sub_id in sub_types { - if let Some(value) = self.seen.insert(id, sub_id) { - self.to_iterate.push_back(value); + if self.seen.insert(sub_id, id).is_none() { + // We've never visited this sub item before. + self.to_iterate.push_back(sub_id); } } From 0409c2cb10f6827cc711704bc555522d34997d1e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 19 Jan 2017 11:24:39 -0800 Subject: [PATCH 0236/2291] Clean up the README.md and CONTRIBUTING.md docs Use the `doctoc` program to generate tables of contents, stop referring to forking and make this the canonical `bindgen`, move the section on building to last. --- CONTRIBUTING.md | 59 +++++++++++---------- README.md | 133 +++++++++++++++++++++++++++++++----------------- 2 files changed, 120 insertions(+), 72 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bab631d653..c4515d7a8f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,28 +1,35 @@ -# Contributing to `servo/rust-bindgen` +# Contributing to `bindgen` Hi! We'd love to have your contributions! If you want help or mentorship, reach -out to us in a GitHub issue, or stop by #servo on irc.mozilla.org and introduce -yourself. - -* [Code of Conduct](#coc) -* [Filing an Issue](#issue) -* [Building](#building) -* [Testing](#tests) - * [Overview](#tests-overview) - * [Running All Tests](#tests-all) - * [Running a Single, Specific Test](#tests-one) - * [Authoring New Tests](#tests-new) -* [Automatic Code Formatting](#formatting) -* [Debug Logging](#logs) -* [Using `creduce` to Minimize Test Cases](#creduce) - -## Code of Conduct +out to us in a GitHub issue, or stop by +[#servo on irc.mozilla.org](irc://irc.mozilla.org#servo) and introduce yourself. + + + + + +- [Code of Conduct](#code-of-conduct) +- [Filing an Issue](#filing-an-issue) +- [Building](#building) +- [Testing](#testing) + - [Overview](#overview) + - [Running All Tests](#running-all-tests) + - [Authoring New Tests](#authoring-new-tests) +- [Automatic code formatting](#automatic-code-formatting) +- [Debug Logging](#debug-logging) +- [Using `creduce` to Minimize Test Cases](#using-creduce-to-minimize-test-cases) + - [Isolating Your Test Case](#isolating-your-test-case) + - [Writing a Predicate Script](#writing-a-predicate-script) + + + +## Code of Conduct We abide by the [Rust Code of Conduct][coc] and ask that you do as well. [coc]: https://www.rust-lang.org/en-US/conduct.html -## Filing an Issue +## Filing an Issue Think you've found a bug? File an issue! To help us understand and reproduce the issue, provide us with: @@ -33,7 +40,7 @@ issue, provide us with: * The actual `bindgen` output * The [debugging logs](#logs) generated when running `bindgen` on this testcase -## Building +## Building Build instructions are in the [README](./README.md). @@ -45,12 +52,12 @@ you forget, but the turn around will be a lot slower ;) $ cd libbindgen && cargo build --features "llvm_stable _docs" ``` -## Testing +## Testing Code for binding generation and testing thereof is in the `libbindgen` crate. The following sections assume you are working in that subdirectory. -### Overview +### Overview Input C/C++ test headers reside in the `tests/headers` directory. Expected output Rust bindings live in `tests/expectations/tests`. For example, @@ -59,13 +66,13 @@ output Rust bindings live in `tests/expectations/tests`. For example, Run `cargo test` to compare generated Rust bindings to the expectations. -### Running All Tests +### Running All Tests ``` $ cargo test [--features llvm_stable] ``` -### Authoring New Tests +### Authoring New Tests To add a new test header to the suite, simply put it in the `tests/headers` directory. Next, run `bindgen` to generate the initial expected output Rust @@ -84,7 +91,7 @@ Then verify the new Rust bindings compile and pass some basic tests: $ cargo test -p tests_expectations ``` -## Automatic code formatting +## Automatic code formatting There's a `rustfmt.toml` file in the repo. Ideally changes should be consistent with the style, though that's not enforced right now. @@ -105,7 +112,7 @@ $ cargo install rustfmt And ensure `~/.cargo/bin` is on your path. -## Debug Logging +## Debug Logging To help debug what `bindgen` is doing, you can define the environment variable `RUST_LOG=bindgen` to get a bunch of debugging log spew. @@ -120,7 +127,7 @@ This logging can also be used when debugging failing tests: $ RUST_LOG=libbindgen cd libbindgen && cargo test ``` -## Using `creduce` to Minimize Test Cases +## Using `creduce` to Minimize Test Cases If you are hacking on `bindgen` and find a test case that causes an unexpected panic, results in bad Rust bindings, or some other incorrectness in `bindgen`, diff --git a/README.md b/README.md index 3b3f56e60e..00d0674b69 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,63 @@ -# Servo's rust-bindgen +# `bindgen` -A binding generator for the Rust language. +Automatically generates Rust FFI bindings to C and C++ libraries. -This is a fork of [crabtw/rust-bindgen](https://github.com/crabtw/rust-bindgen) -designed to work on C++ code as well. + + -Currently this is being used for Servo's SpiderMonkey bindings, and also for -the [Stylo](https://public.etherpad-mozilla.org/p/stylo) project. -## Requirements +- [Usage](#usage) + - [Requirements](#requirements) + - [Installing Clang 3.9](#installing-clang-39) + - [Windows](#windows) + - [OSX](#osx) + - [Debian-based Linuxes](#debian-based-linuxes) + - [Arch](#arch) + - [From source](#from-source) + - [Library usage with `build.rs`](#library-usage-with-buildrs) + - [`build.rs` Tutorial](#buildrs-tutorial) + - [Simple Example: `./bindgen-integration`](#simple-example-bindgen-integration) + - [Real World Example: Stylo](#real-world-example-stylo) + - [Command Line Usage](#command-line-usage) + - [C++](#c) + - [Annotations](#annotations) + - [`opaque`](#opaque) + - [`hide`](#hide) + - [`replaces`](#replaces) + - [`nocopy`](#nocopy) +- [Building From Source](#building-from-source) -It is recommended to use clang 3.9 with the current generator. It can run with -clang 3.8 with some features disabled. + -### Installing Clang 3.9 +## Usage -#### Windows +### Requirements + +It is recommended to use Clang 3.9 or greater, however `bindgen` can run with +older Clangs with some features disabled. + +#### Installing Clang 3.9 + +##### Windows Download and install the official pre-built binary from [LLVM download page](http://releases.llvm.org/download.html). -#### OSX +##### OSX If you use Homebrew: + ``` $ brew install llvm ``` If you use MacPorts: + ``` $ port install clang-3.9 ``` -#### Debian-based Linuxes +##### Debian-based Linuxes ``` # apt-get install llvm-3.9-dev libclang-3.9-dev @@ -42,13 +67,13 @@ Ubuntu 16.10 provides the necessary packages directly. If you are using older version of Ubuntu or other Debian-based distros, you may need to add the LLVM repos to get version 3.9. See http://apt.llvm.org/. -#### Arch +##### Arch ``` # pacman -S clang ``` -#### From source +##### From source If your package manager doesn't yet offer Clang 3.9, you'll need to build from source. For that, follow the instructions @@ -61,31 +86,26 @@ Those instructions list optional steps. For bindgen: * Checkout and build the compiler-rt * You do not need to checkout or build libcxx -## Building +### Library usage with `build.rs` -``` -$ cd bindgen -$ cargo build -``` +#### `build.rs` Tutorial -If you installed multiple versions of llvm, it may not be able to locate the -latest version of libclang. In that case, you may want to either uninstall -other versions of llvm, or specify the path of the desired libclang explicitly: -``` -$ export LIBCLANG_PATH=path/to/clang-3.9/lib -``` +[Here is a step-by-step tutorial for generating FFI bindings to the `bzip2` C library.][tutorial] -On Linux and macOS, you may also need to add a path to `libclang.so` (usually -the same path as above) to library search path. This can be done as below: -``` -$ export LD_LIBRARY_PATH=path/to/clang-3.9/lib # for Linux -$ export DYLD_LIBRARY_PATH=path/to/clang-3.9/lib # for macOS -``` +[tutorial]: http://fitzgeraldnick.com/2016/12/14/using-libbindgen-in-build-rs.html + +#### Simple Example: `./bindgen-integration` + +The [`./bindgen-integration`][integration] directory has an example crate that +generates FFI bindings in `build.rs` and can be used a template for new +projects. -# Library usage with `build.rs` +[integration]: ./bindgen-integration -See [the Stylo build script][stylo-script] to see how it is used inside the -Servo organisation. +#### Real World Example: Stylo + +A real world example is [the Stylo build script][stylo-script] used for +integrating Servo's layout system into Gecko. [stylo-script]: https://github.com/servo/servo/blob/master/components/style/build_gecko.rs @@ -124,28 +144,28 @@ In `src/main.rs`: include!(concat!(env!("OUT_DIR"), "/example.rs")); ``` -# Command Line Usage +### Command Line Usage -There are a few options documented when running `./bindgen --help`. Other -options might exist (see [the SpiderMonkey script][sm-script] to see how it -is used inside the Servo organisation. +``` +$ cargo install bindgen +``` -[sm-script]: https://github.com/servo/rust-mozjs/blob/master/etc/bindings.sh +There are a few options documented when running `./bindgen --help`. -## C++ Usage +### C++ This fork of rust-bindgen can handle a number of C++ features. When passing in header files, the file will automatically be treated as C++ if it ends in ``.hpp``. If it doesn't, ``-x c++`` can be used to force C++ mode. -## Annotations +### Annotations The translation of classes, structs, enums, and typedefs can be adjusted using annotations. Annotations are specifically formatted html tags inside doxygen style comments. -### `opaque` +#### `opaque` The `opaque` annotation instructs bindgen to ignore all fields defined in a struct/class. @@ -154,7 +174,7 @@ a struct/class. ///
``` -### `hide` +#### `hide` The `hide` annotation instructs bindgen to ignore the struct/class/field/enum completely. @@ -163,7 +183,7 @@ completely. ///
``` -### `replaces` +#### `replaces` The `replaces` annotation can be used to use a type as a replacement for other (presumably more complex) type. This is used in Stylo to generate bindings for @@ -188,7 +208,28 @@ public: That way, after code generation, the bindings for the `nsTArray` type are the ones that would be generated for `nsTArray_Simple`. -### `nocopy` +#### `nocopy` The `nocopy` annotation is used to prevent bindgen to autoderive the `Copy` and `Clone` traits for a type. + +## Building From Source + +``` +$ cd bindgen +$ cargo build +``` + +If you installed multiple versions of llvm, it may not be able to locate the +latest version of libclang. In that case, you may want to either uninstall +other versions of llvm, or specify the path of the desired libclang explicitly: +``` +$ export LIBCLANG_PATH=path/to/clang-3.9/lib +``` + +On Linux and macOS, you may also need to add a path to `libclang.so` (usually +the same path as above) to library search path. This can be done as below: +``` +$ export LD_LIBRARY_PATH=path/to/clang-3.9/lib # for Linux +$ export DYLD_LIBRARY_PATH=path/to/clang-3.9/lib # for macOS +``` From 78235aa0e03774fd8a228ca1741b04241fe94387 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 19 Jan 2017 11:47:48 -0800 Subject: [PATCH 0237/2291] Move the building instructions from README.md to CONTRIBUTING.md --- CONTRIBUTING.md | 46 ++++++++++++++++++++++++++++++++++++++-------- README.md | 21 --------------------- 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c4515d7a8f..c1ec96d1a1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,9 +42,37 @@ issue, provide us with: ## Building -Build instructions are in the [README](./README.md). +To build `libbindgen`: -Additionally, you may want to build and test with the `_docs` feature to ensure +``` +$ cd bindgen/libbindgen +$ cargo build +``` + +To build the `bindgen` executable: + +``` +$ cd bindgen/bindgen +$ cargo build +``` + +If you installed multiple versions of llvm, it may not be able to locate the +latest version of libclang. In that case, you may want to either uninstall other +versions of llvm, or specify the path of the desired libclang explicitly: + +``` +$ export LIBCLANG_PATH=path/to/clang-3.9/lib +``` + +On Linux and macOS, you may also need to add a path to `libclang.so` (usually +the same path as above) to library search path. This can be done as below: + +``` +$ export LD_LIBRARY_PATH=path/to/clang-3.9/lib # for Linux +$ export DYLD_LIBRARY_PATH=path/to/clang-3.9/lib # for macOS +``` + +Additionally, you may want to build and test with the `docs_` feature to ensure that you aren't forgetting to document types and functions. CI will catch it if you forget, but the turn around will be a lot slower ;) @@ -59,10 +87,11 @@ The following sections assume you are working in that subdirectory. ### Overview -Input C/C++ test headers reside in the `tests/headers` directory. Expected -output Rust bindings live in `tests/expectations/tests`. For example, -`tests/headers/my_header.h`'s expected generated Rust bindings would be -`tests/expectations/tests/my_header.rs`. +Input C/C++ test headers reside in the `libbindgen/tests/headers` +directory. Expected output Rust bindings live in +`libbindgen/tests/expectations/tests`. For example, +`libbindgen/tests/headers/my_header.h`'s expected generated Rust bindings would +be `libbindgen/tests/expectations/tests/my_header.rs`. Run `cargo test` to compare generated Rust bindings to the expectations. @@ -115,7 +144,7 @@ And ensure `~/.cargo/bin` is on your path. ## Debug Logging To help debug what `bindgen` is doing, you can define the environment variable -`RUST_LOG=bindgen` to get a bunch of debugging log spew. +`RUST_LOG=libbindgen` to get a bunch of debugging log spew. ``` $ RUST_LOG=libbindgen ./target/debug/bindgen [flags...] ~/path/to/some/header.h @@ -124,7 +153,8 @@ $ RUST_LOG=libbindgen ./target/debug/bindgen [flags...] ~/path/to/some/header.h This logging can also be used when debugging failing tests: ``` -$ RUST_LOG=libbindgen cd libbindgen && cargo test +$ cd libbindgen +$ RUST_LOG=libbindgen cargo test ``` ## Using `creduce` to Minimize Test Cases diff --git a/README.md b/README.md index 00d0674b69..15ef6db231 100644 --- a/README.md +++ b/README.md @@ -212,24 +212,3 @@ the ones that would be generated for `nsTArray_Simple`. The `nocopy` annotation is used to prevent bindgen to autoderive the `Copy` and `Clone` traits for a type. - -## Building From Source - -``` -$ cd bindgen -$ cargo build -``` - -If you installed multiple versions of llvm, it may not be able to locate the -latest version of libclang. In that case, you may want to either uninstall -other versions of llvm, or specify the path of the desired libclang explicitly: -``` -$ export LIBCLANG_PATH=path/to/clang-3.9/lib -``` - -On Linux and macOS, you may also need to add a path to `libclang.so` (usually -the same path as above) to library search path. This can be done as below: -``` -$ export LD_LIBRARY_PATH=path/to/clang-3.9/lib # for Linux -$ export DYLD_LIBRARY_PATH=path/to/clang-3.9/lib # for macOS -``` From 30a4722622883459c87d5de7a5ffae37849805d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 21 Jan 2017 14:56:11 +0100 Subject: [PATCH 0238/2291] codegen: Avoid generating invalid Rust code when a struct is not properly aligned. --- libbindgen/src/codegen/helpers.rs | 24 ++-- libbindgen/src/ir/comp.rs | 3 + libbindgen/src/ir/layout.rs | 30 +++- .../expectations/tests/16-byte-alignment.rs | 136 ++++++++++++++++++ libbindgen/tests/headers/16-byte-alignment.h | 33 +++++ 5 files changed, 211 insertions(+), 15 deletions(-) create mode 100644 libbindgen/tests/expectations/tests/16-byte-alignment.rs create mode 100644 libbindgen/tests/headers/16-byte-alignment.h diff --git a/libbindgen/src/codegen/helpers.rs b/libbindgen/src/codegen/helpers.rs index c09f007160..78fd7b6956 100644 --- a/libbindgen/src/codegen/helpers.rs +++ b/libbindgen/src/codegen/helpers.rs @@ -49,20 +49,22 @@ impl BlobTyBuilder { } pub fn build(self) -> P { - use std::cmp; + let opaque = self.layout.opaque(); - let ty_name = match self.layout.align { - 8 => "u64", - 4 => "u32", - 2 => "u16", - 1 | _ => "u8", - }; - let data_len = if ty_name == "u8" { - self.layout.size - } else { - self.layout.size / cmp::max(self.layout.align, 1) + // FIXME(emilio, #412): We fall back to byte alignment, but there are + // some things that legitimately are more than 8-byte aligned. + // + // Eventually we should be able to `unwrap` here, but... + let ty_name = match opaque.known_rust_type_for_array() { + Some(ty) => ty, + None => { + warn!("Found unknown alignment on code generation!"); + "u8" + } }; + let data_len = opaque.array_size().unwrap_or(self.layout.size); + let inner_ty = aster::AstBuilder::new().ty().path().id(ty_name).build(); if data_len == 1 { inner_ty diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs index 6dfa1ece23..ac41b92900 100644 --- a/libbindgen/src/ir/comp.rs +++ b/libbindgen/src/ir/comp.rs @@ -914,6 +914,9 @@ impl<'a> CanDeriveCopy<'a> for CompInfo { if self.kind == CompKind::Union { if !ctx.options().unstable_rust { + // NOTE: If there's no template parameters we can derive copy + // unconditionally, since arrays are magical for rustc, and + // __BindgenUnionField always implements copy. return true; } diff --git a/libbindgen/src/ir/layout.rs b/libbindgen/src/ir/layout.rs index 3a07f7e8c1..033fff6297 100644 --- a/libbindgen/src/ir/layout.rs +++ b/libbindgen/src/ir/layout.rs @@ -46,12 +46,35 @@ impl Layout { /// When we are treating a type as opaque, it is just a blob with a `Layout`. pub struct Opaque(pub Layout); +impl Opaque { + /// Return the known rust type we should use to create a correctly-aligned + /// field with this layout. + pub fn known_rust_type_for_array(&self) -> Option<&'static str> { + Some(match self.0.align { + 8 => "u64", + 4 => "u32", + 2 => "u16", + 1 => "u8", + _ => return None, + }) + } + + /// Return the array size that an opaque type for this layout should have if + /// we know the correct type for it, or `None` otherwise. + pub fn array_size(&self) -> Option { + if self.known_rust_type_for_array().is_some() { + Some(self.0.size / cmp::max(self.0.align, 1)) + } else { + None + } + } +} + impl CanDeriveDebug for Opaque { type Extra = (); fn can_derive_debug(&self, _: &BindgenContext, _: ()) -> bool { - let size_divisor = cmp::max(1, self.0.align); - self.0.size / size_divisor <= RUST_DERIVE_IN_ARRAY_LIMIT + self.array_size().map_or(false, |size| size <= RUST_DERIVE_IN_ARRAY_LIMIT) } } @@ -59,8 +82,7 @@ impl<'a> CanDeriveCopy<'a> for Opaque { type Extra = (); fn can_derive_copy(&self, _: &BindgenContext, _: ()) -> bool { - let size_divisor = cmp::max(1, self.0.align); - self.0.size / size_divisor <= RUST_DERIVE_IN_ARRAY_LIMIT + self.array_size().map_or(false, |size| size <= RUST_DERIVE_IN_ARRAY_LIMIT) } fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { diff --git a/libbindgen/tests/expectations/tests/16-byte-alignment.rs b/libbindgen/tests/expectations/tests/16-byte-alignment.rs new file mode 100644 index 0000000000..b28c0537e6 --- /dev/null +++ b/libbindgen/tests/expectations/tests/16-byte-alignment.rs @@ -0,0 +1,136 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +pub struct __BindgenUnionField(::std::marker::PhantomData); +impl __BindgenUnionField { + #[inline] + pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) } + #[inline] + pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut(&mut self) -> &mut T { ::std::mem::transmute(self) } +} +impl ::std::default::Default for __BindgenUnionField { + #[inline] + fn default() -> Self { Self::new() } +} +impl ::std::clone::Clone for __BindgenUnionField { + #[inline] + fn clone(&self) -> Self { Self::new() } +} +impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_ipv4_tuple { + pub src_addr: u32, + pub dst_addr: u32, + pub __bindgen_anon_1: rte_ipv4_tuple__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_ipv4_tuple__bindgen_ty_1 { + pub __bindgen_anon_1: __BindgenUnionField, + pub sctp_tag: __BindgenUnionField, + pub bindgen_union_field: u32, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 { + pub dport: u16, + pub sport: u16, +} +#[test] +fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() + , 4usize); + assert_eq!(::std::mem::align_of::() + , 2usize); +} +impl Clone for rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 4usize); + assert_eq!(::std::mem::align_of::() , + 4usize); +} +impl Clone for rte_ipv4_tuple__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_ipv4_tuple() { + assert_eq!(::std::mem::size_of::() , 12usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for rte_ipv4_tuple { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_ipv6_tuple { + pub src_addr: [u8; 16usize], + pub dst_addr: [u8; 16usize], + pub __bindgen_anon_1: rte_ipv6_tuple__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_ipv6_tuple__bindgen_ty_1 { + pub __bindgen_anon_1: __BindgenUnionField, + pub sctp_tag: __BindgenUnionField, + pub bindgen_union_field: u32, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 { + pub dport: u16, + pub sport: u16, +} +#[test] +fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() + , 4usize); + assert_eq!(::std::mem::align_of::() + , 2usize); +} +impl Clone for rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 4usize); + assert_eq!(::std::mem::align_of::() , + 4usize); +} +impl Clone for rte_ipv6_tuple__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_ipv6_tuple() { + assert_eq!(::std::mem::size_of::() , 36usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for rte_ipv6_tuple { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Copy)] +pub struct rte_thash_tuple { + pub v4: __BindgenUnionField, + pub v6: __BindgenUnionField, + pub bindgen_union_field: [u8; 48usize], +} +impl Clone for rte_thash_tuple { + fn clone(&self) -> Self { *self } +} diff --git a/libbindgen/tests/headers/16-byte-alignment.h b/libbindgen/tests/headers/16-byte-alignment.h new file mode 100644 index 0000000000..7a7f7548eb --- /dev/null +++ b/libbindgen/tests/headers/16-byte-alignment.h @@ -0,0 +1,33 @@ + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; + +struct rte_ipv4_tuple { + uint32_t src_addr; + uint32_t dst_addr; + union { + struct { + uint16_t dport; + uint16_t sport; + }; + uint32_t sctp_tag; + }; +}; + +struct rte_ipv6_tuple { + uint8_t src_addr[16]; + uint8_t dst_addr[16]; + union { + struct { + uint16_t dport; + uint16_t sport; + }; + uint32_t sctp_tag; + }; +}; + +union rte_thash_tuple { + struct rte_ipv4_tuple v4; + struct rte_ipv6_tuple v6; +} __attribute__((aligned(16))); From b83da2729fc83663f979da05201920e039ae3c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 22 Jan 2017 12:58:12 +0100 Subject: [PATCH 0239/2291] Unify under the `bindgen` name. --- .travis.yml | 7 +- CONTRIBUTING.md | 24 +++---- Cargo.toml | 71 +++++++++++++++++-- README.md | 6 +- bindgen-integration/Cargo.toml | 5 +- bindgen-integration/build.rs | 4 +- bindgen/Cargo.toml | 26 ------- libbindgen/build.rs => build.rs | 0 libbindgen/Cargo.toml | 58 --------------- libbindgen/README.md | 3 - {libbindgen/src => src}/chooser.rs | 0 {libbindgen/src => src}/clang.rs | 0 {libbindgen/src => src}/codegen/helpers.rs | 0 {libbindgen/src => src}/codegen/mod.rs | 0 {libbindgen/src => src}/ir/annotations.rs | 0 {libbindgen/src => src}/ir/comp.rs | 0 {libbindgen/src => src}/ir/context.rs | 0 {libbindgen/src => src}/ir/derive.rs | 0 {libbindgen/src => src}/ir/enum_ty.rs | 0 {libbindgen/src => src}/ir/function.rs | 0 {libbindgen/src => src}/ir/int.rs | 0 {libbindgen/src => src}/ir/item.rs | 0 {libbindgen/src => src}/ir/item_kind.rs | 0 {libbindgen/src => src}/ir/layout.rs | 0 {libbindgen/src => src}/ir/mod.rs | 0 {libbindgen/src => src}/ir/module.rs | 0 {libbindgen/src => src}/ir/ty.rs | 0 {libbindgen/src => src}/ir/type_collector.rs | 0 {libbindgen/src => src}/ir/var.rs | 0 {libbindgen/src => src}/lib.rs | 0 {libbindgen/src => src}/log_stubs.rs | 0 {bindgen/src => src}/main.rs | 4 +- {bindgen/src => src}/options.rs | 2 +- {libbindgen/src => src}/parse.rs | 0 {libbindgen/src => src}/regex_set.rs | 0 {libbindgen/src => src}/uses.rs | 0 .../tests => tests}/expectations/Cargo.toml | 3 +- .../src => tests/expectations}/lib.rs | 0 tests/expectations/src/lib.rs | 0 .../expectations/tests/accessors.rs | 0 .../expectations/tests/annotation_hide.rs | 0 .../expectations/tests/anon_enum.rs | 0 .../expectations/tests/anon_enum_trait.rs | 0 .../expectations/tests/anon_enum_whitelist.rs | 0 .../expectations/tests/anon_union.rs | 0 .../expectations/tests/arg_keyword.rs | 0 .../expectations/tests/auto.rs | 0 .../bad-namespace-parenthood-inheritance.rs | 0 .../expectations/tests/base-to-derived.rs | 0 .../expectations/tests/bitfield-enum-basic.rs | 0 .../tests/bitfield_method_mangling.rs | 0 .../expectations/tests/blocks.rs | 0 .../canonical_path_without_namespacing.rs | 0 .../expectations/tests/class.rs | 0 .../expectations/tests/class_nested.rs | 0 .../expectations/tests/class_no_members.rs | 0 .../expectations/tests/class_static.rs | 0 .../expectations/tests/class_static_const.rs | 0 .../expectations/tests/class_use_as.rs | 0 .../expectations/tests/class_with_dtor.rs | 0 .../tests/class_with_inner_struct.rs | 0 .../expectations/tests/class_with_typedef.rs | 0 .../expectations/tests/complex.rs | 0 .../expectations/tests/complex_global.rs | 0 .../expectations/tests/const_bool.rs | 0 .../expectations/tests/const_enum_unnamed.rs | 0 .../expectations/tests/const_ptr.rs | 0 .../expectations/tests/const_resolved_ty.rs | 0 .../expectations/tests/const_tparam.rs | 0 .../expectations/tests/constant-evaluate.rs | 0 .../expectations/tests/constify-enum.rs | 0 .../expectations/tests/constructor-tp.rs | 0 .../expectations/tests/constructors.rs | 0 .../expectations/tests/convert-floats.rs | 0 .../expectations/tests/crtp.rs | 0 .../expectations/tests/dash_language.rs | 0 .../tests/decl_extern_int_twice.rs | 0 .../expectations/tests/decl_ptr_to_array.rs | 0 .../expectations/tests/disable-namespacing.rs | 0 .../duplicated-namespaces-definitions.rs | 0 .../tests/duplicated-namespaces.rs | 0 .../tests/duplicated_constants_in_ns.rs | 0 .../expectations/tests/elaborated.rs | 0 .../tests/empty_template_param_name.rs | 0 .../expectations/tests/enum.rs | 0 .../expectations/tests/enum_alias.rs | 0 .../tests/enum_and_vtable_mangling.rs | 0 .../expectations/tests/enum_dupe.rs | 0 .../expectations/tests/enum_explicit_type.rs | 0 .../tests/enum_in_template_with_typedef.rs | 0 .../expectations/tests/enum_negative.rs | 0 .../expectations/tests/enum_packed.rs | 0 .../tests/eval-variadic-template-parameter.rs | 0 .../expectations/tests/extern.rs | 0 .../expectations/tests/float128.rs | 0 .../forward-inherit-struct-with-fields.rs | 0 .../tests/forward-inherit-struct.rs | 0 .../tests/forward_declared_struct.rs | 0 .../expectations/tests/func_proto.rs | 0 .../expectations/tests/func_ptr.rs | 0 .../expectations/tests/func_ptr_in_struct.rs | 0 .../expectations/tests/func_with_array_arg.rs | 0 .../tests/func_with_func_ptr_arg.rs | 0 .../expectations/tests/in_class_typedef.rs | 0 .../expectations/tests/inherit-namespaced.rs | 0 .../expectations/tests/inherit_named.rs | 0 .../expectations/tests/inherit_typedef.rs | 0 .../expectations/tests/inline-function.rs | 0 .../expectations/tests/inline_namespace.rs | 0 .../tests/inline_namespace_conservative.rs | 0 .../tests/inline_namespace_whitelist.rs | 0 .../expectations/tests/inner_const.rs | 0 .../expectations/tests/inner_template_self.rs | 0 .../expectations/tests/int128_t.rs | 0 .../expectations/tests/issue-358.rs | 0 .../expectations/tests/issue-372.rs | 0 .../expectations/tests/issue_311.rs | 0 .../expectations/tests/issue_315.rs | 0 .../expectations/tests/jsval_layout_opaque.rs | 0 .../expectations/tests/keywords.rs | 0 .../expectations/tests/macro-expr-basic.rs | 0 .../expectations/tests/macro-redef.rs | 0 .../expectations/tests/macro_const.rs | 0 .../tests/maddness-is-avoidable.rs | 0 .../expectations/tests/method-mangling.rs | 0 .../expectations/tests/module-whitelisted.rs | 0 .../expectations/tests/msvc-no-usr.rs | 0 .../multiple-inherit-empty-correct-layout.rs | 0 .../expectations/tests/mutable.rs | 0 .../expectations/tests/namespace.rs | 0 .../expectations/tests/nested.rs | 0 .../expectations/tests/nested_vtable.rs | 0 .../tests/nested_within_namespace.rs | 0 .../expectations/tests/no-std.rs | 0 .../expectations/tests/no_copy.rs | 0 .../expectations/tests/nsStyleAutoArray.rs | 0 .../expectations/tests/only_bitfields.rs | 0 .../expectations/tests/opaque-tracing.rs | 0 .../expectations/tests/opaque_in_struct.rs | 0 .../expectations/tests/opaque_pointer.rs | 0 .../expectations/tests/opaque_typedef.rs | 0 .../expectations/tests/overflowed_enum.rs | 0 .../expectations/tests/overloading.rs | 0 .../expectations/tests/private.rs | 0 .../expectations/tests/public-dtor.rs | 0 .../expectations/tests/redeclaration.rs | 0 .../expectations/tests/ref_argument_array.rs | 0 .../tests/reparented_replacement.rs | 0 .../tests/replace_template_alias.rs | 0 .../expectations/tests/replace_use.rs | 0 .../expectations/tests/replaces_double.rs | 0 .../tests/resolved_type_def_function.rs | 0 ...ame_struct_name_in_different_namespaces.rs | 0 .../expectations/tests/size_t_template.rs | 0 ...ruct_containing_forward_declared_struct.rs | 0 .../tests/struct_with_anon_struct.rs | 0 .../tests/struct_with_anon_struct_array.rs | 0 .../tests/struct_with_anon_struct_pointer.rs | 0 .../tests/struct_with_anon_union.rs | 0 .../tests/struct_with_anon_unnamed_struct.rs | 0 .../tests/struct_with_anon_unnamed_union.rs | 0 .../tests/struct_with_bitfields.rs | 0 .../tests/struct_with_derive_debug.rs | 0 .../expectations/tests/struct_with_nesting.rs | 0 .../expectations/tests/struct_with_packing.rs | 0 .../expectations/tests/struct_with_struct.rs | 0 .../tests/struct_with_typedef_template_arg.rs | 0 .../expectations/tests/template.rs | 0 .../expectations/tests/template_alias.rs | 0 .../tests/template_alias_basic.rs | 0 .../tests/template_alias_namespace.rs | 0 .../template_typedef_transitive_param.rs | 0 .../expectations/tests/template_typedefs.rs | 0 .../expectations/tests/templateref_opaque.rs | 0 ...type-referenced-by-whitelisted-function.rs | 0 .../expectations/tests/type_alias_empty.rs | 0 ..._alias_partial_template_especialization.rs | 0 .../tests/type_alias_template_specialized.rs | 0 .../tests/typedefd-array-as-function-arg.rs | 0 .../expectations/tests/typeref.rs | 0 .../expectations/tests/union-in-ns.rs | 0 .../expectations/tests/union_dtor.rs | 0 .../expectations/tests/union_fields.rs | 0 .../expectations/tests/union_template.rs | 0 .../tests/union_with_anon_struct.rs | 0 .../tests/union_with_anon_struct_bitfield.rs | 0 .../tests/union_with_anon_union.rs | 0 .../tests/union_with_anon_unnamed_struct.rs | 0 .../tests/union_with_anon_unnamed_union.rs | 0 .../tests/union_with_big_member.rs | 0 .../expectations/tests/union_with_nesting.rs | 0 .../expectations/tests/unknown_attr.rs | 0 .../expectations/tests/use-core.rs | 0 .../expectations/tests/using.rs | 0 .../expectations/tests/var-tracing.rs | 0 .../expectations/tests/variadic-method.rs | 0 .../tests/variadic_template_function.rs | 0 .../expectations/tests/vector.rs | 0 .../expectations/tests/virtual_dtor.rs | 0 .../expectations/tests/virtual_inheritance.rs | 0 .../expectations/tests/virtual_overloaded.rs | 0 .../tests/vtable_recursive_sig.rs | 0 .../expectations/tests/weird_bitfields.rs | 0 .../expectations/tests/what_is_going_on.rs | 0 .../tests/whitelist-namespaces-basic.rs | 0 .../tests/whitelist-namespaces.rs | 0 .../expectations/tests/whitelist_basic.rs | 0 .../expectations/tests/whitelist_fix.rs | 0 .../expectations/tests/whitelist_vars.rs | 0 .../tests => tests}/headers/accessors.hpp | 0 .../headers/annotation_hide.hpp | 0 .../tests => tests}/headers/anon_enum.hpp | 0 .../headers/anon_enum_trait.hpp | 0 .../headers/anon_enum_whitelist.h | 0 .../tests => tests}/headers/anon_union.hpp | 0 .../tests => tests}/headers/arg_keyword.hpp | 0 {libbindgen/tests => tests}/headers/auto.hpp | 0 .../bad-namespace-parenthood-inheritance.hpp | 0 .../headers/base-to-derived.hpp | 0 .../headers/bitfield-enum-basic.hpp | 0 .../headers/bitfield_method_mangling.h | 0 {libbindgen/tests => tests}/headers/blocks.h | 0 .../canonical_path_without_namespacing.hpp | 0 {libbindgen/tests => tests}/headers/class.hpp | 0 .../tests => tests}/headers/class_nested.hpp | 0 .../headers/class_no_members.hpp | 0 .../tests => tests}/headers/class_static.hpp | 0 .../headers/class_static_const.hpp | 0 .../tests => tests}/headers/class_use_as.hpp | 0 .../headers/class_with_dtor.hpp | 0 .../headers/class_with_inner_struct.hpp | 0 .../headers/class_with_typedef.hpp | 0 {libbindgen/tests => tests}/headers/complex.h | 0 .../tests => tests}/headers/complex_global.h | 0 .../tests => tests}/headers/const_bool.hpp | 0 .../headers/const_enum_unnamed.hpp | 0 .../tests => tests}/headers/const_ptr.hpp | 0 .../headers/const_resolved_ty.h | 0 .../tests => tests}/headers/const_tparam.hpp | 0 .../headers/constant-evaluate.h | 0 .../tests => tests}/headers/constify-enum.h | 0 .../headers/constructor-tp.hpp | 0 .../tests => tests}/headers/constructors.hpp | 0 .../tests => tests}/headers/convert-floats.h | 0 {libbindgen/tests => tests}/headers/crtp.hpp | 0 .../tests => tests}/headers/dash_language.h | 0 .../headers/decl_extern_int_twice.h | 0 .../headers/decl_ptr_to_array.h | 0 .../headers/disable-namespacing.hpp | 0 .../duplicated-namespaces-definitions.hpp | 0 .../headers/duplicated-namespaces.hpp | 0 .../headers/duplicated_constants_in_ns.hpp | 0 .../tests => tests}/headers/elaborated.hpp | 0 .../headers/empty_template_param_name.hpp | 0 {libbindgen/tests => tests}/headers/enum.h | 0 .../tests => tests}/headers/enum_alias.hpp | 0 .../headers/enum_and_vtable_mangling.hpp | 0 .../tests => tests}/headers/enum_dupe.h | 0 .../headers/enum_explicit_type.hpp | 0 .../headers/enum_in_template_with_typedef.hpp | 0 .../tests => tests}/headers/enum_negative.h | 0 .../tests => tests}/headers/enum_packed.h | 0 .../eval-variadic-template-parameter.hpp | 0 .../tests => tests}/headers/extern.hpp | 0 .../tests => tests}/headers/float128.hpp | 0 .../forward-inherit-struct-with-fields.hpp | 0 .../headers/forward-inherit-struct.hpp | 0 .../headers/forward_declared_struct.h | 0 .../tests => tests}/headers/func_proto.h | 0 .../tests => tests}/headers/func_ptr.h | 0 .../headers/func_ptr_in_struct.h | 0 .../headers/func_with_array_arg.h | 0 .../headers/func_with_func_ptr_arg.h | 0 .../headers/in_class_typedef.hpp | 0 .../headers/inherit-namespaced.hpp | 0 .../tests => tests}/headers/inherit_named.hpp | 0 .../headers/inherit_typedef.hpp | 0 .../tests => tests}/headers/inline-function.h | 0 .../headers/inline_namespace.hpp | 0 .../headers/inline_namespace_conservative.hpp | 0 .../headers/inline_namespace_whitelist.hpp | 0 .../tests => tests}/headers/inner_const.hpp | 0 .../headers/inner_template_self.hpp | 0 .../tests => tests}/headers/int128_t.h | 0 .../tests => tests}/headers/issue-358.hpp | 0 .../tests => tests}/headers/issue-372.hpp | 0 .../tests => tests}/headers/issue_311.hpp | 0 .../tests => tests}/headers/issue_315.hpp | 0 .../headers/jsval_layout_opaque.hpp | 0 .../tests => tests}/headers/keywords.h | 0 .../headers/macro-expr-basic.h | 0 .../tests => tests}/headers/macro-redef.h | 0 .../tests => tests}/headers/macro_const.h | 0 .../headers/maddness-is-avoidable.hpp | 0 .../headers/method-mangling.hpp | 0 .../headers/module-whitelisted.hpp | 0 .../tests => tests}/headers/msvc-no-usr.hpp | 0 .../multiple-inherit-empty-correct-layout.hpp | 0 .../tests => tests}/headers/mutable.hpp | 0 .../tests => tests}/headers/namespace.hpp | 0 .../tests => tests}/headers/nested.hpp | 0 .../tests => tests}/headers/nested_vtable.hpp | 0 .../headers/nested_within_namespace.hpp | 0 {libbindgen/tests => tests}/headers/no-std.h | 0 .../tests => tests}/headers/no_copy.hpp | 0 .../headers/nsStyleAutoArray.hpp | 0 .../headers/only_bitfields.hpp | 0 .../headers/opaque-tracing.hpp | 0 .../headers/opaque_in_struct.hpp | 0 .../headers/opaque_pointer.hpp | 0 .../headers/opaque_typedef.hpp | 0 .../headers/overflowed_enum.hpp | 0 .../tests => tests}/headers/overloading.hpp | 0 .../tests => tests}/headers/private.hpp | 0 .../tests => tests}/headers/public-dtor.hpp | 0 .../tests => tests}/headers/redeclaration.hpp | 0 .../headers/ref_argument_array.hpp | 0 .../headers/reparented_replacement.hpp | 0 .../headers/replace_template_alias.hpp | 0 .../tests => tests}/headers/replace_use.hpp | 0 .../headers/replaces_double.hpp | 0 .../headers/resolved_type_def_function.h | 0 ...me_struct_name_in_different_namespaces.hpp | 0 .../headers/size_t_template.hpp | 0 ...truct_containing_forward_declared_struct.h | 0 .../headers/struct_with_anon_struct.h | 0 .../headers/struct_with_anon_struct_array.h | 0 .../headers/struct_with_anon_struct_pointer.h | 0 .../headers/struct_with_anon_union.h | 0 .../headers/struct_with_anon_unnamed_struct.h | 0 .../headers/struct_with_anon_unnamed_union.h | 0 .../headers/struct_with_bitfields.h | 0 .../headers/struct_with_derive_debug.h | 0 .../headers/struct_with_nesting.h | 0 .../headers/struct_with_packing.h | 0 .../headers/struct_with_struct.h | 0 .../struct_with_typedef_template_arg.hpp | 0 .../tests => tests}/headers/template.hpp | 0 .../headers/template_alias.hpp | 0 .../headers/template_alias_basic.hpp | 0 .../headers/template_alias_namespace.hpp | 0 .../template_typedef_transitive_param.hpp | 0 .../headers/template_typedefs.hpp | 0 .../headers/templateref_opaque.hpp | 0 .../type-referenced-by-whitelisted-function.h | 0 .../headers/type_alias_empty.hpp | 0 ...alias_partial_template_especialization.hpp | 0 .../type_alias_template_specialized.hpp | 0 .../headers/typedefd-array-as-function-arg.h | 0 .../tests => tests}/headers/typeref.hpp | 0 .../tests => tests}/headers/union-in-ns.hpp | 0 .../tests => tests}/headers/union_dtor.hpp | 0 .../tests => tests}/headers/union_fields.hpp | 0 .../headers/union_template.hpp | 0 .../headers/union_with_anon_struct.h | 0 .../headers/union_with_anon_struct_bitfield.h | 0 .../headers/union_with_anon_union.h | 0 .../headers/union_with_anon_unnamed_struct.h | 0 .../headers/union_with_anon_unnamed_union.h | 0 .../headers/union_with_big_member.h | 0 .../headers/union_with_nesting.h | 0 .../tests => tests}/headers/unknown_attr.h | 0 .../tests => tests}/headers/use-core.h | 0 {libbindgen/tests => tests}/headers/using.hpp | 0 .../tests => tests}/headers/var-tracing.hpp | 0 .../headers/variadic-method.hpp | 0 .../headers/variadic_template_function.hpp | 0 .../tests => tests}/headers/vector.hpp | 0 .../tests => tests}/headers/virtual_dtor.hpp | 0 .../headers/virtual_inheritance.hpp | 0 .../headers/virtual_overloaded.hpp | 0 .../headers/vtable_recursive_sig.hpp | 0 .../headers/weird_bitfields.hpp | 0 .../headers/what_is_going_on.hpp | 0 .../headers/whitelist-namespaces-basic.hpp | 0 .../headers/whitelist-namespaces.hpp | 0 .../headers/whitelist_basic.hpp | 0 .../tests => tests}/headers/whitelist_fix.hpp | 0 .../tests => tests}/headers/whitelist_vars.h | 0 {libbindgen/tests => tests}/tests.rs | 9 +-- {libbindgen/tests => tests}/uses/.gitignore | 0 381 files changed, 93 insertions(+), 129 deletions(-) delete mode 100644 bindgen/Cargo.toml rename libbindgen/build.rs => build.rs (100%) delete mode 100644 libbindgen/Cargo.toml delete mode 100644 libbindgen/README.md rename {libbindgen/src => src}/chooser.rs (100%) rename {libbindgen/src => src}/clang.rs (100%) rename {libbindgen/src => src}/codegen/helpers.rs (100%) rename {libbindgen/src => src}/codegen/mod.rs (100%) rename {libbindgen/src => src}/ir/annotations.rs (100%) rename {libbindgen/src => src}/ir/comp.rs (100%) rename {libbindgen/src => src}/ir/context.rs (100%) rename {libbindgen/src => src}/ir/derive.rs (100%) rename {libbindgen/src => src}/ir/enum_ty.rs (100%) rename {libbindgen/src => src}/ir/function.rs (100%) rename {libbindgen/src => src}/ir/int.rs (100%) rename {libbindgen/src => src}/ir/item.rs (100%) rename {libbindgen/src => src}/ir/item_kind.rs (100%) rename {libbindgen/src => src}/ir/layout.rs (100%) rename {libbindgen/src => src}/ir/mod.rs (100%) rename {libbindgen/src => src}/ir/module.rs (100%) rename {libbindgen/src => src}/ir/ty.rs (100%) rename {libbindgen/src => src}/ir/type_collector.rs (100%) rename {libbindgen/src => src}/ir/var.rs (100%) rename {libbindgen/src => src}/lib.rs (100%) rename {libbindgen/src => src}/log_stubs.rs (100%) rename {bindgen/src => src}/main.rs (96%) rename {bindgen/src => src}/options.rs (99%) rename {libbindgen/src => src}/parse.rs (100%) rename {libbindgen/src => src}/regex_set.rs (100%) rename {libbindgen/src => src}/uses.rs (100%) rename {libbindgen/tests => tests}/expectations/Cargo.toml (75%) rename {libbindgen/tests/expectations/src => tests/expectations}/lib.rs (100%) create mode 100644 tests/expectations/src/lib.rs rename {libbindgen/tests => tests}/expectations/tests/accessors.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/annotation_hide.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/anon_enum.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/anon_enum_trait.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/anon_enum_whitelist.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/anon_union.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/arg_keyword.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/auto.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/bad-namespace-parenthood-inheritance.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/base-to-derived.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/bitfield-enum-basic.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/bitfield_method_mangling.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/blocks.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/canonical_path_without_namespacing.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/class.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/class_nested.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/class_no_members.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/class_static.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/class_static_const.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/class_use_as.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/class_with_dtor.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/class_with_inner_struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/class_with_typedef.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/complex.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/complex_global.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/const_bool.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/const_enum_unnamed.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/const_ptr.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/const_resolved_ty.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/const_tparam.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/constant-evaluate.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/constify-enum.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/constructor-tp.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/constructors.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/convert-floats.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/crtp.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/dash_language.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/decl_extern_int_twice.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/decl_ptr_to_array.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/disable-namespacing.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/duplicated-namespaces-definitions.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/duplicated-namespaces.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/duplicated_constants_in_ns.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/elaborated.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/empty_template_param_name.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/enum.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/enum_alias.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/enum_and_vtable_mangling.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/enum_dupe.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/enum_explicit_type.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/enum_in_template_with_typedef.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/enum_negative.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/enum_packed.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/eval-variadic-template-parameter.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/extern.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/float128.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/forward-inherit-struct-with-fields.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/forward-inherit-struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/forward_declared_struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/func_proto.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/func_ptr.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/func_ptr_in_struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/func_with_array_arg.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/func_with_func_ptr_arg.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/in_class_typedef.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/inherit-namespaced.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/inherit_named.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/inherit_typedef.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/inline-function.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/inline_namespace.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/inline_namespace_conservative.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/inline_namespace_whitelist.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/inner_const.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/inner_template_self.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/int128_t.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/issue-358.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/issue-372.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/issue_311.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/issue_315.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/jsval_layout_opaque.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/keywords.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/macro-expr-basic.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/macro-redef.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/macro_const.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/maddness-is-avoidable.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/method-mangling.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/module-whitelisted.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/msvc-no-usr.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/multiple-inherit-empty-correct-layout.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/mutable.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/namespace.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/nested.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/nested_vtable.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/nested_within_namespace.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/no-std.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/no_copy.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/nsStyleAutoArray.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/only_bitfields.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/opaque-tracing.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/opaque_in_struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/opaque_pointer.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/opaque_typedef.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/overflowed_enum.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/overloading.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/private.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/public-dtor.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/redeclaration.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/ref_argument_array.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/reparented_replacement.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/replace_template_alias.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/replace_use.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/replaces_double.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/resolved_type_def_function.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/same_struct_name_in_different_namespaces.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/size_t_template.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_containing_forward_declared_struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_anon_struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_anon_struct_array.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_anon_struct_pointer.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_anon_union.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_anon_unnamed_struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_anon_unnamed_union.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_bitfields.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_derive_debug.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_nesting.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_packing.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/struct_with_typedef_template_arg.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/template.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/template_alias.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/template_alias_basic.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/template_alias_namespace.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/template_typedef_transitive_param.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/template_typedefs.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/templateref_opaque.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/type-referenced-by-whitelisted-function.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/type_alias_empty.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/type_alias_partial_template_especialization.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/type_alias_template_specialized.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/typedefd-array-as-function-arg.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/typeref.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union-in-ns.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union_dtor.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union_fields.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union_template.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union_with_anon_struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union_with_anon_struct_bitfield.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union_with_anon_union.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union_with_anon_unnamed_struct.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union_with_anon_unnamed_union.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union_with_big_member.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/union_with_nesting.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/unknown_attr.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/use-core.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/using.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/var-tracing.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/variadic-method.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/variadic_template_function.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/vector.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/virtual_dtor.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/virtual_inheritance.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/virtual_overloaded.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/vtable_recursive_sig.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/weird_bitfields.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/what_is_going_on.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/whitelist-namespaces-basic.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/whitelist-namespaces.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/whitelist_basic.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/whitelist_fix.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/whitelist_vars.rs (100%) rename {libbindgen/tests => tests}/headers/accessors.hpp (100%) rename {libbindgen/tests => tests}/headers/annotation_hide.hpp (100%) rename {libbindgen/tests => tests}/headers/anon_enum.hpp (100%) rename {libbindgen/tests => tests}/headers/anon_enum_trait.hpp (100%) rename {libbindgen/tests => tests}/headers/anon_enum_whitelist.h (100%) rename {libbindgen/tests => tests}/headers/anon_union.hpp (100%) rename {libbindgen/tests => tests}/headers/arg_keyword.hpp (100%) rename {libbindgen/tests => tests}/headers/auto.hpp (100%) rename {libbindgen/tests => tests}/headers/bad-namespace-parenthood-inheritance.hpp (100%) rename {libbindgen/tests => tests}/headers/base-to-derived.hpp (100%) rename {libbindgen/tests => tests}/headers/bitfield-enum-basic.hpp (100%) rename {libbindgen/tests => tests}/headers/bitfield_method_mangling.h (100%) rename {libbindgen/tests => tests}/headers/blocks.h (100%) rename {libbindgen/tests => tests}/headers/canonical_path_without_namespacing.hpp (100%) rename {libbindgen/tests => tests}/headers/class.hpp (100%) rename {libbindgen/tests => tests}/headers/class_nested.hpp (100%) rename {libbindgen/tests => tests}/headers/class_no_members.hpp (100%) rename {libbindgen/tests => tests}/headers/class_static.hpp (100%) rename {libbindgen/tests => tests}/headers/class_static_const.hpp (100%) rename {libbindgen/tests => tests}/headers/class_use_as.hpp (100%) rename {libbindgen/tests => tests}/headers/class_with_dtor.hpp (100%) rename {libbindgen/tests => tests}/headers/class_with_inner_struct.hpp (100%) rename {libbindgen/tests => tests}/headers/class_with_typedef.hpp (100%) rename {libbindgen/tests => tests}/headers/complex.h (100%) rename {libbindgen/tests => tests}/headers/complex_global.h (100%) rename {libbindgen/tests => tests}/headers/const_bool.hpp (100%) rename {libbindgen/tests => tests}/headers/const_enum_unnamed.hpp (100%) rename {libbindgen/tests => tests}/headers/const_ptr.hpp (100%) rename {libbindgen/tests => tests}/headers/const_resolved_ty.h (100%) rename {libbindgen/tests => tests}/headers/const_tparam.hpp (100%) rename {libbindgen/tests => tests}/headers/constant-evaluate.h (100%) rename {libbindgen/tests => tests}/headers/constify-enum.h (100%) rename {libbindgen/tests => tests}/headers/constructor-tp.hpp (100%) rename {libbindgen/tests => tests}/headers/constructors.hpp (100%) rename {libbindgen/tests => tests}/headers/convert-floats.h (100%) rename {libbindgen/tests => tests}/headers/crtp.hpp (100%) rename {libbindgen/tests => tests}/headers/dash_language.h (100%) rename {libbindgen/tests => tests}/headers/decl_extern_int_twice.h (100%) rename {libbindgen/tests => tests}/headers/decl_ptr_to_array.h (100%) rename {libbindgen/tests => tests}/headers/disable-namespacing.hpp (100%) rename {libbindgen/tests => tests}/headers/duplicated-namespaces-definitions.hpp (100%) rename {libbindgen/tests => tests}/headers/duplicated-namespaces.hpp (100%) rename {libbindgen/tests => tests}/headers/duplicated_constants_in_ns.hpp (100%) rename {libbindgen/tests => tests}/headers/elaborated.hpp (100%) rename {libbindgen/tests => tests}/headers/empty_template_param_name.hpp (100%) rename {libbindgen/tests => tests}/headers/enum.h (100%) rename {libbindgen/tests => tests}/headers/enum_alias.hpp (100%) rename {libbindgen/tests => tests}/headers/enum_and_vtable_mangling.hpp (100%) rename {libbindgen/tests => tests}/headers/enum_dupe.h (100%) rename {libbindgen/tests => tests}/headers/enum_explicit_type.hpp (100%) rename {libbindgen/tests => tests}/headers/enum_in_template_with_typedef.hpp (100%) rename {libbindgen/tests => tests}/headers/enum_negative.h (100%) rename {libbindgen/tests => tests}/headers/enum_packed.h (100%) rename {libbindgen/tests => tests}/headers/eval-variadic-template-parameter.hpp (100%) rename {libbindgen/tests => tests}/headers/extern.hpp (100%) rename {libbindgen/tests => tests}/headers/float128.hpp (100%) rename {libbindgen/tests => tests}/headers/forward-inherit-struct-with-fields.hpp (100%) rename {libbindgen/tests => tests}/headers/forward-inherit-struct.hpp (100%) rename {libbindgen/tests => tests}/headers/forward_declared_struct.h (100%) rename {libbindgen/tests => tests}/headers/func_proto.h (100%) rename {libbindgen/tests => tests}/headers/func_ptr.h (100%) rename {libbindgen/tests => tests}/headers/func_ptr_in_struct.h (100%) rename {libbindgen/tests => tests}/headers/func_with_array_arg.h (100%) rename {libbindgen/tests => tests}/headers/func_with_func_ptr_arg.h (100%) rename {libbindgen/tests => tests}/headers/in_class_typedef.hpp (100%) rename {libbindgen/tests => tests}/headers/inherit-namespaced.hpp (100%) rename {libbindgen/tests => tests}/headers/inherit_named.hpp (100%) rename {libbindgen/tests => tests}/headers/inherit_typedef.hpp (100%) rename {libbindgen/tests => tests}/headers/inline-function.h (100%) rename {libbindgen/tests => tests}/headers/inline_namespace.hpp (100%) rename {libbindgen/tests => tests}/headers/inline_namespace_conservative.hpp (100%) rename {libbindgen/tests => tests}/headers/inline_namespace_whitelist.hpp (100%) rename {libbindgen/tests => tests}/headers/inner_const.hpp (100%) rename {libbindgen/tests => tests}/headers/inner_template_self.hpp (100%) rename {libbindgen/tests => tests}/headers/int128_t.h (100%) rename {libbindgen/tests => tests}/headers/issue-358.hpp (100%) rename {libbindgen/tests => tests}/headers/issue-372.hpp (100%) rename {libbindgen/tests => tests}/headers/issue_311.hpp (100%) rename {libbindgen/tests => tests}/headers/issue_315.hpp (100%) rename {libbindgen/tests => tests}/headers/jsval_layout_opaque.hpp (100%) rename {libbindgen/tests => tests}/headers/keywords.h (100%) rename {libbindgen/tests => tests}/headers/macro-expr-basic.h (100%) rename {libbindgen/tests => tests}/headers/macro-redef.h (100%) rename {libbindgen/tests => tests}/headers/macro_const.h (100%) rename {libbindgen/tests => tests}/headers/maddness-is-avoidable.hpp (100%) rename {libbindgen/tests => tests}/headers/method-mangling.hpp (100%) rename {libbindgen/tests => tests}/headers/module-whitelisted.hpp (100%) rename {libbindgen/tests => tests}/headers/msvc-no-usr.hpp (100%) rename {libbindgen/tests => tests}/headers/multiple-inherit-empty-correct-layout.hpp (100%) rename {libbindgen/tests => tests}/headers/mutable.hpp (100%) rename {libbindgen/tests => tests}/headers/namespace.hpp (100%) rename {libbindgen/tests => tests}/headers/nested.hpp (100%) rename {libbindgen/tests => tests}/headers/nested_vtable.hpp (100%) rename {libbindgen/tests => tests}/headers/nested_within_namespace.hpp (100%) rename {libbindgen/tests => tests}/headers/no-std.h (100%) rename {libbindgen/tests => tests}/headers/no_copy.hpp (100%) rename {libbindgen/tests => tests}/headers/nsStyleAutoArray.hpp (100%) rename {libbindgen/tests => tests}/headers/only_bitfields.hpp (100%) rename {libbindgen/tests => tests}/headers/opaque-tracing.hpp (100%) rename {libbindgen/tests => tests}/headers/opaque_in_struct.hpp (100%) rename {libbindgen/tests => tests}/headers/opaque_pointer.hpp (100%) rename {libbindgen/tests => tests}/headers/opaque_typedef.hpp (100%) rename {libbindgen/tests => tests}/headers/overflowed_enum.hpp (100%) rename {libbindgen/tests => tests}/headers/overloading.hpp (100%) rename {libbindgen/tests => tests}/headers/private.hpp (100%) rename {libbindgen/tests => tests}/headers/public-dtor.hpp (100%) rename {libbindgen/tests => tests}/headers/redeclaration.hpp (100%) rename {libbindgen/tests => tests}/headers/ref_argument_array.hpp (100%) rename {libbindgen/tests => tests}/headers/reparented_replacement.hpp (100%) rename {libbindgen/tests => tests}/headers/replace_template_alias.hpp (100%) rename {libbindgen/tests => tests}/headers/replace_use.hpp (100%) rename {libbindgen/tests => tests}/headers/replaces_double.hpp (100%) rename {libbindgen/tests => tests}/headers/resolved_type_def_function.h (100%) rename {libbindgen/tests => tests}/headers/same_struct_name_in_different_namespaces.hpp (100%) rename {libbindgen/tests => tests}/headers/size_t_template.hpp (100%) rename {libbindgen/tests => tests}/headers/struct_containing_forward_declared_struct.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_anon_struct.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_anon_struct_array.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_anon_struct_pointer.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_anon_union.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_anon_unnamed_struct.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_anon_unnamed_union.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_bitfields.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_derive_debug.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_nesting.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_packing.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_struct.h (100%) rename {libbindgen/tests => tests}/headers/struct_with_typedef_template_arg.hpp (100%) rename {libbindgen/tests => tests}/headers/template.hpp (100%) rename {libbindgen/tests => tests}/headers/template_alias.hpp (100%) rename {libbindgen/tests => tests}/headers/template_alias_basic.hpp (100%) rename {libbindgen/tests => tests}/headers/template_alias_namespace.hpp (100%) rename {libbindgen/tests => tests}/headers/template_typedef_transitive_param.hpp (100%) rename {libbindgen/tests => tests}/headers/template_typedefs.hpp (100%) rename {libbindgen/tests => tests}/headers/templateref_opaque.hpp (100%) rename {libbindgen/tests => tests}/headers/type-referenced-by-whitelisted-function.h (100%) rename {libbindgen/tests => tests}/headers/type_alias_empty.hpp (100%) rename {libbindgen/tests => tests}/headers/type_alias_partial_template_especialization.hpp (100%) rename {libbindgen/tests => tests}/headers/type_alias_template_specialized.hpp (100%) rename {libbindgen/tests => tests}/headers/typedefd-array-as-function-arg.h (100%) rename {libbindgen/tests => tests}/headers/typeref.hpp (100%) rename {libbindgen/tests => tests}/headers/union-in-ns.hpp (100%) rename {libbindgen/tests => tests}/headers/union_dtor.hpp (100%) rename {libbindgen/tests => tests}/headers/union_fields.hpp (100%) rename {libbindgen/tests => tests}/headers/union_template.hpp (100%) rename {libbindgen/tests => tests}/headers/union_with_anon_struct.h (100%) rename {libbindgen/tests => tests}/headers/union_with_anon_struct_bitfield.h (100%) rename {libbindgen/tests => tests}/headers/union_with_anon_union.h (100%) rename {libbindgen/tests => tests}/headers/union_with_anon_unnamed_struct.h (100%) rename {libbindgen/tests => tests}/headers/union_with_anon_unnamed_union.h (100%) rename {libbindgen/tests => tests}/headers/union_with_big_member.h (100%) rename {libbindgen/tests => tests}/headers/union_with_nesting.h (100%) rename {libbindgen/tests => tests}/headers/unknown_attr.h (100%) rename {libbindgen/tests => tests}/headers/use-core.h (100%) rename {libbindgen/tests => tests}/headers/using.hpp (100%) rename {libbindgen/tests => tests}/headers/var-tracing.hpp (100%) rename {libbindgen/tests => tests}/headers/variadic-method.hpp (100%) rename {libbindgen/tests => tests}/headers/variadic_template_function.hpp (100%) rename {libbindgen/tests => tests}/headers/vector.hpp (100%) rename {libbindgen/tests => tests}/headers/virtual_dtor.hpp (100%) rename {libbindgen/tests => tests}/headers/virtual_inheritance.hpp (100%) rename {libbindgen/tests => tests}/headers/virtual_overloaded.hpp (100%) rename {libbindgen/tests => tests}/headers/vtable_recursive_sig.hpp (100%) rename {libbindgen/tests => tests}/headers/weird_bitfields.hpp (100%) rename {libbindgen/tests => tests}/headers/what_is_going_on.hpp (100%) rename {libbindgen/tests => tests}/headers/whitelist-namespaces-basic.hpp (100%) rename {libbindgen/tests => tests}/headers/whitelist-namespaces.hpp (100%) rename {libbindgen/tests => tests}/headers/whitelist_basic.hpp (100%) rename {libbindgen/tests => tests}/headers/whitelist_fix.hpp (100%) rename {libbindgen/tests => tests}/headers/whitelist_vars.h (100%) rename {libbindgen/tests => tests}/tests.rs (95%) rename {libbindgen/tests => tests}/uses/.gitignore (100%) diff --git a/.travis.yml b/.travis.yml index d5fb44555f..dd271f22e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,8 +23,6 @@ cache: before_install: . ./ci/before_install.sh -before_script: cd libbindgen - script: - cargo test --features "$BINDGEN_FEATURES assert_no_dangling_items" - cargo test --release --features "$BINDGEN_FEATURES assert_no_dangling_items" @@ -34,10 +32,7 @@ script: - cargo build --features "$BINDGEN_FEATURES docs_" - cd tests/expectations - cargo test - - cd ../../../bindgen - - cargo test --features "$BINDGEN_FEATURES" - - cargo test --release --features "$BINDGEN_FEATURES" - - cd ../bindgen-integration + - cd ../../bindgen-integration - cargo test --features "$BINDGEN_FEATURES" - cargo test --release --features "$BINDGEN_FEATURES" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c1ec96d1a1..d30df68dbe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,10 +42,9 @@ issue, provide us with: ## Building -To build `libbindgen`: +To build `bindgen`: ``` -$ cd bindgen/libbindgen $ cargo build ``` @@ -77,21 +76,21 @@ that you aren't forgetting to document types and functions. CI will catch it if you forget, but the turn around will be a lot slower ;) ``` -$ cd libbindgen && cargo build --features "llvm_stable _docs" +$ cargo build --features "llvm_stable _docs" ``` ## Testing -Code for binding generation and testing thereof is in the `libbindgen` crate. +Code for binding generation and testing thereof is in the `bindgen` crate. The following sections assume you are working in that subdirectory. ### Overview -Input C/C++ test headers reside in the `libbindgen/tests/headers` -directory. Expected output Rust bindings live in -`libbindgen/tests/expectations/tests`. For example, -`libbindgen/tests/headers/my_header.h`'s expected generated Rust bindings would -be `libbindgen/tests/expectations/tests/my_header.rs`. +Input C/C++ test headers reside in the `tests/headers` directory. Expected +output Rust bindings live in `tests/expectations/tests`. + +For example, `tests/headers/my_header.h`'s expected generated Rust bindings +would be `tests/expectations/tests/my_header.rs`. Run `cargo test` to compare generated Rust bindings to the expectations. @@ -144,17 +143,16 @@ And ensure `~/.cargo/bin` is on your path. ## Debug Logging To help debug what `bindgen` is doing, you can define the environment variable -`RUST_LOG=libbindgen` to get a bunch of debugging log spew. +`RUST_LOG=bindgen` to get a bunch of debugging log spew. ``` -$ RUST_LOG=libbindgen ./target/debug/bindgen [flags...] ~/path/to/some/header.h +$ RUST_LOG=bindgen ./target/debug/bindgen [flags...] ~/path/to/some/header.h ``` This logging can also be used when debugging failing tests: ``` -$ cd libbindgen -$ RUST_LOG=libbindgen cargo test +$ RUST_LOG=bindgen cargo test ``` ## Using `creduce` to Minimize Test Cases diff --git a/Cargo.toml b/Cargo.toml index 106e652be5..d8c7131974 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,66 @@ -[workspace] -members = [ - "bindgen", - "bindgen-integration", - "libbindgen", - "libbindgen/tests/expectations", +[package] +authors = [ + "Jyun-Yan You ", + "Emilio Cobos Álvarez ", + "The Servo project developers", ] +description = "A binding generator for Rust" +homepage = "https://github.com/servo/rust-bindgen" +keywords = ["bindings", "ffi", "code-generation"] +license = "BSD-3-Clause" +name = "bindgen" +readme = "README.md" +repository = "https://github.com/servo/rust-bindgen" +version = "0.1.7" +build = "build.rs" + +[lib] +path = "src/lib.rs" + +[[bin]] +name = "bindgen" +path = "src/main.rs" + +[dev-dependencies] +diff = "0.1" +clap = "2" +shlex = "0.1" + +[build-dependencies] +quasi_codegen = "0.26" + +[dependencies] +cexpr = "0.2" +cfg-if = "0.1.0" +clang-sys = { version = "0.12", features = ["runtime", "clang_3_9"] } +lazy_static = "0.2.1" +rustc-serialize = "0.3.19" +syntex_syntax = "0.54" +regex = "0.2" +# This kinda sucks: https://github.com/rust-lang/cargo/issues/1982 +clap = "2" + +[dependencies.aster] +features = ["with-syntex"] +version = "0.38" + +[dependencies.env_logger] +optional = true +version = "0.4" + +[dependencies.log] +optional = true +version = "0.3" + +[dependencies.quasi] +features = ["with-syntex"] +version = "0.29" + +[features] +assert_no_dangling_items = [] +default = ["logging"] +llvm_stable = [] +logging = ["env_logger", "log"] +static = [] +# This feature only exists for CI -- don't use it! +docs_ = [] diff --git a/README.md b/README.md index 15ef6db231..0f7247c4dc 100644 --- a/README.md +++ b/README.md @@ -117,20 +117,20 @@ In `Cargo.toml`: build = "build.rs" [build-dependencies] -libbindgen = "0.1" +bindgen = "0.1" ``` In `build.rs`: ```rust -extern crate libbindgen; +extern crate bindgen; use std::env; use std::path::Path; fn main() { let out_dir = env::var("OUT_DIR").unwrap(); - let _ = libbindgen::builder() + let _ = bindgen::builder() .header("example.h") .use_core() .generate().unwrap() diff --git a/bindgen-integration/Cargo.toml b/bindgen-integration/Cargo.toml index e0687f9959..9b8e341d7b 100644 --- a/bindgen-integration/Cargo.toml +++ b/bindgen-integration/Cargo.toml @@ -3,13 +3,12 @@ name = "bindgen-integration" description = "A package to test various bindgen features" version = "0.1.0" authors = ["Emilio Cobos Álvarez "] -workspace = ".." publish = false build = "build.rs" [build-dependencies] -libbindgen = { path = "../libbindgen" } +bindgen = { path = ".." } gcc = "0.3" [features] -llvm_stable = ["libbindgen/llvm_stable"] +llvm_stable = ["bindgen/llvm_stable"] diff --git a/bindgen-integration/build.rs b/bindgen-integration/build.rs index ff8ba172f6..2c18c94a44 100644 --- a/bindgen-integration/build.rs +++ b/bindgen-integration/build.rs @@ -1,9 +1,9 @@ -extern crate libbindgen; +extern crate bindgen; extern crate gcc; use std::env; use std::path::PathBuf; -use libbindgen::Builder; +use bindgen::Builder; fn main() { gcc::Config::new() diff --git a/bindgen/Cargo.toml b/bindgen/Cargo.toml deleted file mode 100644 index a445df6940..0000000000 --- a/bindgen/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -authors = [ - "Jyun-Yan You ", - "Emilio Cobos Álvarez ", - "The Servo project developers", -] -description = "A binding generator for Rust" -homepage = "https://github.com/servo/rust-bindgen" -keywords = ["bindings", "ffi", "code-generation"] -license = "BSD-3-Clause" -name = "bindgen" -readme = "README.md" -repository = "https://github.com/servo/rust-bindgen" -version = "0.17.1" -workspace = ".." - -[dependencies] -clang-sys = "0.12" -clap = "2" -libbindgen = { path = "../libbindgen" } -log = "0.3" -env_logger = "0.4" -rustc-serialize = "0.3.19" - -[features] -llvm_stable = ["libbindgen/llvm_stable"] diff --git a/libbindgen/build.rs b/build.rs similarity index 100% rename from libbindgen/build.rs rename to build.rs diff --git a/libbindgen/Cargo.toml b/libbindgen/Cargo.toml deleted file mode 100644 index 2615b822f1..0000000000 --- a/libbindgen/Cargo.toml +++ /dev/null @@ -1,58 +0,0 @@ -[package] -authors = [ - "Jyun-Yan You ", - "Emilio Cobos Álvarez ", - "The Servo project developers", -] -build = "build.rs" -description = "A binding generator for Rust" -homepage = "https://github.com/servo/rust-bindgen" -keywords = ["bindings", "ffi", "code-generation"] -license = "BSD-3-Clause" -name = "libbindgen" -readme = "README.md" -repository = "https://github.com/servo/rust-bindgen" -version = "0.1.7" -workspace = ".." - -[dev-dependencies] -diff = "0.1" -clap = "2" -shlex = "0.1" - -[build-dependencies] -quasi_codegen = "0.26" - -[dependencies] -cexpr = "0.2" -cfg-if = "0.1.0" -clang-sys = { version = "0.12", features = ["runtime", "clang_3_9"] } -lazy_static = "0.2.1" -rustc-serialize = "0.3.19" -syntex_syntax = "0.54" -regex = "0.2" - -[dependencies.aster] -features = ["with-syntex"] -version = "0.38" - -[dependencies.env_logger] -optional = true -version = "0.4" - -[dependencies.log] -optional = true -version = "0.3" - -[dependencies.quasi] -features = ["with-syntex"] -version = "0.29" - -[features] -assert_no_dangling_items = [] -default = ["logging"] -llvm_stable = [] -logging = ["env_logger", "log"] -static = [] -# This feature only exists for CI -- don't use it! -docs_ = [] diff --git a/libbindgen/README.md b/libbindgen/README.md deleted file mode 100644 index e0bbddf50b..0000000000 --- a/libbindgen/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `libbindgen` - -Generate Rust FFI bindings from C/C++ header files. diff --git a/libbindgen/src/chooser.rs b/src/chooser.rs similarity index 100% rename from libbindgen/src/chooser.rs rename to src/chooser.rs diff --git a/libbindgen/src/clang.rs b/src/clang.rs similarity index 100% rename from libbindgen/src/clang.rs rename to src/clang.rs diff --git a/libbindgen/src/codegen/helpers.rs b/src/codegen/helpers.rs similarity index 100% rename from libbindgen/src/codegen/helpers.rs rename to src/codegen/helpers.rs diff --git a/libbindgen/src/codegen/mod.rs b/src/codegen/mod.rs similarity index 100% rename from libbindgen/src/codegen/mod.rs rename to src/codegen/mod.rs diff --git a/libbindgen/src/ir/annotations.rs b/src/ir/annotations.rs similarity index 100% rename from libbindgen/src/ir/annotations.rs rename to src/ir/annotations.rs diff --git a/libbindgen/src/ir/comp.rs b/src/ir/comp.rs similarity index 100% rename from libbindgen/src/ir/comp.rs rename to src/ir/comp.rs diff --git a/libbindgen/src/ir/context.rs b/src/ir/context.rs similarity index 100% rename from libbindgen/src/ir/context.rs rename to src/ir/context.rs diff --git a/libbindgen/src/ir/derive.rs b/src/ir/derive.rs similarity index 100% rename from libbindgen/src/ir/derive.rs rename to src/ir/derive.rs diff --git a/libbindgen/src/ir/enum_ty.rs b/src/ir/enum_ty.rs similarity index 100% rename from libbindgen/src/ir/enum_ty.rs rename to src/ir/enum_ty.rs diff --git a/libbindgen/src/ir/function.rs b/src/ir/function.rs similarity index 100% rename from libbindgen/src/ir/function.rs rename to src/ir/function.rs diff --git a/libbindgen/src/ir/int.rs b/src/ir/int.rs similarity index 100% rename from libbindgen/src/ir/int.rs rename to src/ir/int.rs diff --git a/libbindgen/src/ir/item.rs b/src/ir/item.rs similarity index 100% rename from libbindgen/src/ir/item.rs rename to src/ir/item.rs diff --git a/libbindgen/src/ir/item_kind.rs b/src/ir/item_kind.rs similarity index 100% rename from libbindgen/src/ir/item_kind.rs rename to src/ir/item_kind.rs diff --git a/libbindgen/src/ir/layout.rs b/src/ir/layout.rs similarity index 100% rename from libbindgen/src/ir/layout.rs rename to src/ir/layout.rs diff --git a/libbindgen/src/ir/mod.rs b/src/ir/mod.rs similarity index 100% rename from libbindgen/src/ir/mod.rs rename to src/ir/mod.rs diff --git a/libbindgen/src/ir/module.rs b/src/ir/module.rs similarity index 100% rename from libbindgen/src/ir/module.rs rename to src/ir/module.rs diff --git a/libbindgen/src/ir/ty.rs b/src/ir/ty.rs similarity index 100% rename from libbindgen/src/ir/ty.rs rename to src/ir/ty.rs diff --git a/libbindgen/src/ir/type_collector.rs b/src/ir/type_collector.rs similarity index 100% rename from libbindgen/src/ir/type_collector.rs rename to src/ir/type_collector.rs diff --git a/libbindgen/src/ir/var.rs b/src/ir/var.rs similarity index 100% rename from libbindgen/src/ir/var.rs rename to src/ir/var.rs diff --git a/libbindgen/src/lib.rs b/src/lib.rs similarity index 100% rename from libbindgen/src/lib.rs rename to src/lib.rs diff --git a/libbindgen/src/log_stubs.rs b/src/log_stubs.rs similarity index 100% rename from libbindgen/src/log_stubs.rs rename to src/log_stubs.rs diff --git a/bindgen/src/main.rs b/src/main.rs similarity index 96% rename from bindgen/src/main.rs rename to src/main.rs index 515d1d1a29..a7bd961890 100644 --- a/bindgen/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -extern crate libbindgen; +extern crate bindgen; extern crate env_logger; #[macro_use] extern crate log; @@ -6,7 +6,7 @@ extern crate clang_sys; extern crate clap; extern crate rustc_serialize; -use libbindgen::clang_version; +use bindgen::clang_version; use std::env; mod options; diff --git a/bindgen/src/options.rs b/src/options.rs similarity index 99% rename from bindgen/src/options.rs rename to src/options.rs index e6226350c7..3456bfea9b 100644 --- a/bindgen/src/options.rs +++ b/src/options.rs @@ -1,5 +1,5 @@ use clap::{App, Arg}; -use libbindgen::{Builder, CodegenConfig, builder}; +use bindgen::{Builder, CodegenConfig, builder}; use std::fs::File; use std::io::{self, Error, ErrorKind}; diff --git a/libbindgen/src/parse.rs b/src/parse.rs similarity index 100% rename from libbindgen/src/parse.rs rename to src/parse.rs diff --git a/libbindgen/src/regex_set.rs b/src/regex_set.rs similarity index 100% rename from libbindgen/src/regex_set.rs rename to src/regex_set.rs diff --git a/libbindgen/src/uses.rs b/src/uses.rs similarity index 100% rename from libbindgen/src/uses.rs rename to src/uses.rs diff --git a/libbindgen/tests/expectations/Cargo.toml b/tests/expectations/Cargo.toml similarity index 75% rename from libbindgen/tests/expectations/Cargo.toml rename to tests/expectations/Cargo.toml index 0980c56432..034aa14151 100644 --- a/libbindgen/tests/expectations/Cargo.toml +++ b/tests/expectations/Cargo.toml @@ -4,9 +4,8 @@ description = "bindgen results when ran on ../headers/*" version = "0.1.0" authors = [ "Jyun-Yan You ", - "Emilio Cobos Álvarez ", + "Emilio Cobos Álvarez ", "The Servo project developers", ] -workspace = "../../.." [dependencies] diff --git a/libbindgen/tests/expectations/src/lib.rs b/tests/expectations/lib.rs similarity index 100% rename from libbindgen/tests/expectations/src/lib.rs rename to tests/expectations/lib.rs diff --git a/tests/expectations/src/lib.rs b/tests/expectations/src/lib.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libbindgen/tests/expectations/tests/accessors.rs b/tests/expectations/tests/accessors.rs similarity index 100% rename from libbindgen/tests/expectations/tests/accessors.rs rename to tests/expectations/tests/accessors.rs diff --git a/libbindgen/tests/expectations/tests/annotation_hide.rs b/tests/expectations/tests/annotation_hide.rs similarity index 100% rename from libbindgen/tests/expectations/tests/annotation_hide.rs rename to tests/expectations/tests/annotation_hide.rs diff --git a/libbindgen/tests/expectations/tests/anon_enum.rs b/tests/expectations/tests/anon_enum.rs similarity index 100% rename from libbindgen/tests/expectations/tests/anon_enum.rs rename to tests/expectations/tests/anon_enum.rs diff --git a/libbindgen/tests/expectations/tests/anon_enum_trait.rs b/tests/expectations/tests/anon_enum_trait.rs similarity index 100% rename from libbindgen/tests/expectations/tests/anon_enum_trait.rs rename to tests/expectations/tests/anon_enum_trait.rs diff --git a/libbindgen/tests/expectations/tests/anon_enum_whitelist.rs b/tests/expectations/tests/anon_enum_whitelist.rs similarity index 100% rename from libbindgen/tests/expectations/tests/anon_enum_whitelist.rs rename to tests/expectations/tests/anon_enum_whitelist.rs diff --git a/libbindgen/tests/expectations/tests/anon_union.rs b/tests/expectations/tests/anon_union.rs similarity index 100% rename from libbindgen/tests/expectations/tests/anon_union.rs rename to tests/expectations/tests/anon_union.rs diff --git a/libbindgen/tests/expectations/tests/arg_keyword.rs b/tests/expectations/tests/arg_keyword.rs similarity index 100% rename from libbindgen/tests/expectations/tests/arg_keyword.rs rename to tests/expectations/tests/arg_keyword.rs diff --git a/libbindgen/tests/expectations/tests/auto.rs b/tests/expectations/tests/auto.rs similarity index 100% rename from libbindgen/tests/expectations/tests/auto.rs rename to tests/expectations/tests/auto.rs diff --git a/libbindgen/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs b/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs similarity index 100% rename from libbindgen/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs rename to tests/expectations/tests/bad-namespace-parenthood-inheritance.rs diff --git a/libbindgen/tests/expectations/tests/base-to-derived.rs b/tests/expectations/tests/base-to-derived.rs similarity index 100% rename from libbindgen/tests/expectations/tests/base-to-derived.rs rename to tests/expectations/tests/base-to-derived.rs diff --git a/libbindgen/tests/expectations/tests/bitfield-enum-basic.rs b/tests/expectations/tests/bitfield-enum-basic.rs similarity index 100% rename from libbindgen/tests/expectations/tests/bitfield-enum-basic.rs rename to tests/expectations/tests/bitfield-enum-basic.rs diff --git a/libbindgen/tests/expectations/tests/bitfield_method_mangling.rs b/tests/expectations/tests/bitfield_method_mangling.rs similarity index 100% rename from libbindgen/tests/expectations/tests/bitfield_method_mangling.rs rename to tests/expectations/tests/bitfield_method_mangling.rs diff --git a/libbindgen/tests/expectations/tests/blocks.rs b/tests/expectations/tests/blocks.rs similarity index 100% rename from libbindgen/tests/expectations/tests/blocks.rs rename to tests/expectations/tests/blocks.rs diff --git a/libbindgen/tests/expectations/tests/canonical_path_without_namespacing.rs b/tests/expectations/tests/canonical_path_without_namespacing.rs similarity index 100% rename from libbindgen/tests/expectations/tests/canonical_path_without_namespacing.rs rename to tests/expectations/tests/canonical_path_without_namespacing.rs diff --git a/libbindgen/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs similarity index 100% rename from libbindgen/tests/expectations/tests/class.rs rename to tests/expectations/tests/class.rs diff --git a/libbindgen/tests/expectations/tests/class_nested.rs b/tests/expectations/tests/class_nested.rs similarity index 100% rename from libbindgen/tests/expectations/tests/class_nested.rs rename to tests/expectations/tests/class_nested.rs diff --git a/libbindgen/tests/expectations/tests/class_no_members.rs b/tests/expectations/tests/class_no_members.rs similarity index 100% rename from libbindgen/tests/expectations/tests/class_no_members.rs rename to tests/expectations/tests/class_no_members.rs diff --git a/libbindgen/tests/expectations/tests/class_static.rs b/tests/expectations/tests/class_static.rs similarity index 100% rename from libbindgen/tests/expectations/tests/class_static.rs rename to tests/expectations/tests/class_static.rs diff --git a/libbindgen/tests/expectations/tests/class_static_const.rs b/tests/expectations/tests/class_static_const.rs similarity index 100% rename from libbindgen/tests/expectations/tests/class_static_const.rs rename to tests/expectations/tests/class_static_const.rs diff --git a/libbindgen/tests/expectations/tests/class_use_as.rs b/tests/expectations/tests/class_use_as.rs similarity index 100% rename from libbindgen/tests/expectations/tests/class_use_as.rs rename to tests/expectations/tests/class_use_as.rs diff --git a/libbindgen/tests/expectations/tests/class_with_dtor.rs b/tests/expectations/tests/class_with_dtor.rs similarity index 100% rename from libbindgen/tests/expectations/tests/class_with_dtor.rs rename to tests/expectations/tests/class_with_dtor.rs diff --git a/libbindgen/tests/expectations/tests/class_with_inner_struct.rs b/tests/expectations/tests/class_with_inner_struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/class_with_inner_struct.rs rename to tests/expectations/tests/class_with_inner_struct.rs diff --git a/libbindgen/tests/expectations/tests/class_with_typedef.rs b/tests/expectations/tests/class_with_typedef.rs similarity index 100% rename from libbindgen/tests/expectations/tests/class_with_typedef.rs rename to tests/expectations/tests/class_with_typedef.rs diff --git a/libbindgen/tests/expectations/tests/complex.rs b/tests/expectations/tests/complex.rs similarity index 100% rename from libbindgen/tests/expectations/tests/complex.rs rename to tests/expectations/tests/complex.rs diff --git a/libbindgen/tests/expectations/tests/complex_global.rs b/tests/expectations/tests/complex_global.rs similarity index 100% rename from libbindgen/tests/expectations/tests/complex_global.rs rename to tests/expectations/tests/complex_global.rs diff --git a/libbindgen/tests/expectations/tests/const_bool.rs b/tests/expectations/tests/const_bool.rs similarity index 100% rename from libbindgen/tests/expectations/tests/const_bool.rs rename to tests/expectations/tests/const_bool.rs diff --git a/libbindgen/tests/expectations/tests/const_enum_unnamed.rs b/tests/expectations/tests/const_enum_unnamed.rs similarity index 100% rename from libbindgen/tests/expectations/tests/const_enum_unnamed.rs rename to tests/expectations/tests/const_enum_unnamed.rs diff --git a/libbindgen/tests/expectations/tests/const_ptr.rs b/tests/expectations/tests/const_ptr.rs similarity index 100% rename from libbindgen/tests/expectations/tests/const_ptr.rs rename to tests/expectations/tests/const_ptr.rs diff --git a/libbindgen/tests/expectations/tests/const_resolved_ty.rs b/tests/expectations/tests/const_resolved_ty.rs similarity index 100% rename from libbindgen/tests/expectations/tests/const_resolved_ty.rs rename to tests/expectations/tests/const_resolved_ty.rs diff --git a/libbindgen/tests/expectations/tests/const_tparam.rs b/tests/expectations/tests/const_tparam.rs similarity index 100% rename from libbindgen/tests/expectations/tests/const_tparam.rs rename to tests/expectations/tests/const_tparam.rs diff --git a/libbindgen/tests/expectations/tests/constant-evaluate.rs b/tests/expectations/tests/constant-evaluate.rs similarity index 100% rename from libbindgen/tests/expectations/tests/constant-evaluate.rs rename to tests/expectations/tests/constant-evaluate.rs diff --git a/libbindgen/tests/expectations/tests/constify-enum.rs b/tests/expectations/tests/constify-enum.rs similarity index 100% rename from libbindgen/tests/expectations/tests/constify-enum.rs rename to tests/expectations/tests/constify-enum.rs diff --git a/libbindgen/tests/expectations/tests/constructor-tp.rs b/tests/expectations/tests/constructor-tp.rs similarity index 100% rename from libbindgen/tests/expectations/tests/constructor-tp.rs rename to tests/expectations/tests/constructor-tp.rs diff --git a/libbindgen/tests/expectations/tests/constructors.rs b/tests/expectations/tests/constructors.rs similarity index 100% rename from libbindgen/tests/expectations/tests/constructors.rs rename to tests/expectations/tests/constructors.rs diff --git a/libbindgen/tests/expectations/tests/convert-floats.rs b/tests/expectations/tests/convert-floats.rs similarity index 100% rename from libbindgen/tests/expectations/tests/convert-floats.rs rename to tests/expectations/tests/convert-floats.rs diff --git a/libbindgen/tests/expectations/tests/crtp.rs b/tests/expectations/tests/crtp.rs similarity index 100% rename from libbindgen/tests/expectations/tests/crtp.rs rename to tests/expectations/tests/crtp.rs diff --git a/libbindgen/tests/expectations/tests/dash_language.rs b/tests/expectations/tests/dash_language.rs similarity index 100% rename from libbindgen/tests/expectations/tests/dash_language.rs rename to tests/expectations/tests/dash_language.rs diff --git a/libbindgen/tests/expectations/tests/decl_extern_int_twice.rs b/tests/expectations/tests/decl_extern_int_twice.rs similarity index 100% rename from libbindgen/tests/expectations/tests/decl_extern_int_twice.rs rename to tests/expectations/tests/decl_extern_int_twice.rs diff --git a/libbindgen/tests/expectations/tests/decl_ptr_to_array.rs b/tests/expectations/tests/decl_ptr_to_array.rs similarity index 100% rename from libbindgen/tests/expectations/tests/decl_ptr_to_array.rs rename to tests/expectations/tests/decl_ptr_to_array.rs diff --git a/libbindgen/tests/expectations/tests/disable-namespacing.rs b/tests/expectations/tests/disable-namespacing.rs similarity index 100% rename from libbindgen/tests/expectations/tests/disable-namespacing.rs rename to tests/expectations/tests/disable-namespacing.rs diff --git a/libbindgen/tests/expectations/tests/duplicated-namespaces-definitions.rs b/tests/expectations/tests/duplicated-namespaces-definitions.rs similarity index 100% rename from libbindgen/tests/expectations/tests/duplicated-namespaces-definitions.rs rename to tests/expectations/tests/duplicated-namespaces-definitions.rs diff --git a/libbindgen/tests/expectations/tests/duplicated-namespaces.rs b/tests/expectations/tests/duplicated-namespaces.rs similarity index 100% rename from libbindgen/tests/expectations/tests/duplicated-namespaces.rs rename to tests/expectations/tests/duplicated-namespaces.rs diff --git a/libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs b/tests/expectations/tests/duplicated_constants_in_ns.rs similarity index 100% rename from libbindgen/tests/expectations/tests/duplicated_constants_in_ns.rs rename to tests/expectations/tests/duplicated_constants_in_ns.rs diff --git a/libbindgen/tests/expectations/tests/elaborated.rs b/tests/expectations/tests/elaborated.rs similarity index 100% rename from libbindgen/tests/expectations/tests/elaborated.rs rename to tests/expectations/tests/elaborated.rs diff --git a/libbindgen/tests/expectations/tests/empty_template_param_name.rs b/tests/expectations/tests/empty_template_param_name.rs similarity index 100% rename from libbindgen/tests/expectations/tests/empty_template_param_name.rs rename to tests/expectations/tests/empty_template_param_name.rs diff --git a/libbindgen/tests/expectations/tests/enum.rs b/tests/expectations/tests/enum.rs similarity index 100% rename from libbindgen/tests/expectations/tests/enum.rs rename to tests/expectations/tests/enum.rs diff --git a/libbindgen/tests/expectations/tests/enum_alias.rs b/tests/expectations/tests/enum_alias.rs similarity index 100% rename from libbindgen/tests/expectations/tests/enum_alias.rs rename to tests/expectations/tests/enum_alias.rs diff --git a/libbindgen/tests/expectations/tests/enum_and_vtable_mangling.rs b/tests/expectations/tests/enum_and_vtable_mangling.rs similarity index 100% rename from libbindgen/tests/expectations/tests/enum_and_vtable_mangling.rs rename to tests/expectations/tests/enum_and_vtable_mangling.rs diff --git a/libbindgen/tests/expectations/tests/enum_dupe.rs b/tests/expectations/tests/enum_dupe.rs similarity index 100% rename from libbindgen/tests/expectations/tests/enum_dupe.rs rename to tests/expectations/tests/enum_dupe.rs diff --git a/libbindgen/tests/expectations/tests/enum_explicit_type.rs b/tests/expectations/tests/enum_explicit_type.rs similarity index 100% rename from libbindgen/tests/expectations/tests/enum_explicit_type.rs rename to tests/expectations/tests/enum_explicit_type.rs diff --git a/libbindgen/tests/expectations/tests/enum_in_template_with_typedef.rs b/tests/expectations/tests/enum_in_template_with_typedef.rs similarity index 100% rename from libbindgen/tests/expectations/tests/enum_in_template_with_typedef.rs rename to tests/expectations/tests/enum_in_template_with_typedef.rs diff --git a/libbindgen/tests/expectations/tests/enum_negative.rs b/tests/expectations/tests/enum_negative.rs similarity index 100% rename from libbindgen/tests/expectations/tests/enum_negative.rs rename to tests/expectations/tests/enum_negative.rs diff --git a/libbindgen/tests/expectations/tests/enum_packed.rs b/tests/expectations/tests/enum_packed.rs similarity index 100% rename from libbindgen/tests/expectations/tests/enum_packed.rs rename to tests/expectations/tests/enum_packed.rs diff --git a/libbindgen/tests/expectations/tests/eval-variadic-template-parameter.rs b/tests/expectations/tests/eval-variadic-template-parameter.rs similarity index 100% rename from libbindgen/tests/expectations/tests/eval-variadic-template-parameter.rs rename to tests/expectations/tests/eval-variadic-template-parameter.rs diff --git a/libbindgen/tests/expectations/tests/extern.rs b/tests/expectations/tests/extern.rs similarity index 100% rename from libbindgen/tests/expectations/tests/extern.rs rename to tests/expectations/tests/extern.rs diff --git a/libbindgen/tests/expectations/tests/float128.rs b/tests/expectations/tests/float128.rs similarity index 100% rename from libbindgen/tests/expectations/tests/float128.rs rename to tests/expectations/tests/float128.rs diff --git a/libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs b/tests/expectations/tests/forward-inherit-struct-with-fields.rs similarity index 100% rename from libbindgen/tests/expectations/tests/forward-inherit-struct-with-fields.rs rename to tests/expectations/tests/forward-inherit-struct-with-fields.rs diff --git a/libbindgen/tests/expectations/tests/forward-inherit-struct.rs b/tests/expectations/tests/forward-inherit-struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/forward-inherit-struct.rs rename to tests/expectations/tests/forward-inherit-struct.rs diff --git a/libbindgen/tests/expectations/tests/forward_declared_struct.rs b/tests/expectations/tests/forward_declared_struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/forward_declared_struct.rs rename to tests/expectations/tests/forward_declared_struct.rs diff --git a/libbindgen/tests/expectations/tests/func_proto.rs b/tests/expectations/tests/func_proto.rs similarity index 100% rename from libbindgen/tests/expectations/tests/func_proto.rs rename to tests/expectations/tests/func_proto.rs diff --git a/libbindgen/tests/expectations/tests/func_ptr.rs b/tests/expectations/tests/func_ptr.rs similarity index 100% rename from libbindgen/tests/expectations/tests/func_ptr.rs rename to tests/expectations/tests/func_ptr.rs diff --git a/libbindgen/tests/expectations/tests/func_ptr_in_struct.rs b/tests/expectations/tests/func_ptr_in_struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/func_ptr_in_struct.rs rename to tests/expectations/tests/func_ptr_in_struct.rs diff --git a/libbindgen/tests/expectations/tests/func_with_array_arg.rs b/tests/expectations/tests/func_with_array_arg.rs similarity index 100% rename from libbindgen/tests/expectations/tests/func_with_array_arg.rs rename to tests/expectations/tests/func_with_array_arg.rs diff --git a/libbindgen/tests/expectations/tests/func_with_func_ptr_arg.rs b/tests/expectations/tests/func_with_func_ptr_arg.rs similarity index 100% rename from libbindgen/tests/expectations/tests/func_with_func_ptr_arg.rs rename to tests/expectations/tests/func_with_func_ptr_arg.rs diff --git a/libbindgen/tests/expectations/tests/in_class_typedef.rs b/tests/expectations/tests/in_class_typedef.rs similarity index 100% rename from libbindgen/tests/expectations/tests/in_class_typedef.rs rename to tests/expectations/tests/in_class_typedef.rs diff --git a/libbindgen/tests/expectations/tests/inherit-namespaced.rs b/tests/expectations/tests/inherit-namespaced.rs similarity index 100% rename from libbindgen/tests/expectations/tests/inherit-namespaced.rs rename to tests/expectations/tests/inherit-namespaced.rs diff --git a/libbindgen/tests/expectations/tests/inherit_named.rs b/tests/expectations/tests/inherit_named.rs similarity index 100% rename from libbindgen/tests/expectations/tests/inherit_named.rs rename to tests/expectations/tests/inherit_named.rs diff --git a/libbindgen/tests/expectations/tests/inherit_typedef.rs b/tests/expectations/tests/inherit_typedef.rs similarity index 100% rename from libbindgen/tests/expectations/tests/inherit_typedef.rs rename to tests/expectations/tests/inherit_typedef.rs diff --git a/libbindgen/tests/expectations/tests/inline-function.rs b/tests/expectations/tests/inline-function.rs similarity index 100% rename from libbindgen/tests/expectations/tests/inline-function.rs rename to tests/expectations/tests/inline-function.rs diff --git a/libbindgen/tests/expectations/tests/inline_namespace.rs b/tests/expectations/tests/inline_namespace.rs similarity index 100% rename from libbindgen/tests/expectations/tests/inline_namespace.rs rename to tests/expectations/tests/inline_namespace.rs diff --git a/libbindgen/tests/expectations/tests/inline_namespace_conservative.rs b/tests/expectations/tests/inline_namespace_conservative.rs similarity index 100% rename from libbindgen/tests/expectations/tests/inline_namespace_conservative.rs rename to tests/expectations/tests/inline_namespace_conservative.rs diff --git a/libbindgen/tests/expectations/tests/inline_namespace_whitelist.rs b/tests/expectations/tests/inline_namespace_whitelist.rs similarity index 100% rename from libbindgen/tests/expectations/tests/inline_namespace_whitelist.rs rename to tests/expectations/tests/inline_namespace_whitelist.rs diff --git a/libbindgen/tests/expectations/tests/inner_const.rs b/tests/expectations/tests/inner_const.rs similarity index 100% rename from libbindgen/tests/expectations/tests/inner_const.rs rename to tests/expectations/tests/inner_const.rs diff --git a/libbindgen/tests/expectations/tests/inner_template_self.rs b/tests/expectations/tests/inner_template_self.rs similarity index 100% rename from libbindgen/tests/expectations/tests/inner_template_self.rs rename to tests/expectations/tests/inner_template_self.rs diff --git a/libbindgen/tests/expectations/tests/int128_t.rs b/tests/expectations/tests/int128_t.rs similarity index 100% rename from libbindgen/tests/expectations/tests/int128_t.rs rename to tests/expectations/tests/int128_t.rs diff --git a/libbindgen/tests/expectations/tests/issue-358.rs b/tests/expectations/tests/issue-358.rs similarity index 100% rename from libbindgen/tests/expectations/tests/issue-358.rs rename to tests/expectations/tests/issue-358.rs diff --git a/libbindgen/tests/expectations/tests/issue-372.rs b/tests/expectations/tests/issue-372.rs similarity index 100% rename from libbindgen/tests/expectations/tests/issue-372.rs rename to tests/expectations/tests/issue-372.rs diff --git a/libbindgen/tests/expectations/tests/issue_311.rs b/tests/expectations/tests/issue_311.rs similarity index 100% rename from libbindgen/tests/expectations/tests/issue_311.rs rename to tests/expectations/tests/issue_311.rs diff --git a/libbindgen/tests/expectations/tests/issue_315.rs b/tests/expectations/tests/issue_315.rs similarity index 100% rename from libbindgen/tests/expectations/tests/issue_315.rs rename to tests/expectations/tests/issue_315.rs diff --git a/libbindgen/tests/expectations/tests/jsval_layout_opaque.rs b/tests/expectations/tests/jsval_layout_opaque.rs similarity index 100% rename from libbindgen/tests/expectations/tests/jsval_layout_opaque.rs rename to tests/expectations/tests/jsval_layout_opaque.rs diff --git a/libbindgen/tests/expectations/tests/keywords.rs b/tests/expectations/tests/keywords.rs similarity index 100% rename from libbindgen/tests/expectations/tests/keywords.rs rename to tests/expectations/tests/keywords.rs diff --git a/libbindgen/tests/expectations/tests/macro-expr-basic.rs b/tests/expectations/tests/macro-expr-basic.rs similarity index 100% rename from libbindgen/tests/expectations/tests/macro-expr-basic.rs rename to tests/expectations/tests/macro-expr-basic.rs diff --git a/libbindgen/tests/expectations/tests/macro-redef.rs b/tests/expectations/tests/macro-redef.rs similarity index 100% rename from libbindgen/tests/expectations/tests/macro-redef.rs rename to tests/expectations/tests/macro-redef.rs diff --git a/libbindgen/tests/expectations/tests/macro_const.rs b/tests/expectations/tests/macro_const.rs similarity index 100% rename from libbindgen/tests/expectations/tests/macro_const.rs rename to tests/expectations/tests/macro_const.rs diff --git a/libbindgen/tests/expectations/tests/maddness-is-avoidable.rs b/tests/expectations/tests/maddness-is-avoidable.rs similarity index 100% rename from libbindgen/tests/expectations/tests/maddness-is-avoidable.rs rename to tests/expectations/tests/maddness-is-avoidable.rs diff --git a/libbindgen/tests/expectations/tests/method-mangling.rs b/tests/expectations/tests/method-mangling.rs similarity index 100% rename from libbindgen/tests/expectations/tests/method-mangling.rs rename to tests/expectations/tests/method-mangling.rs diff --git a/libbindgen/tests/expectations/tests/module-whitelisted.rs b/tests/expectations/tests/module-whitelisted.rs similarity index 100% rename from libbindgen/tests/expectations/tests/module-whitelisted.rs rename to tests/expectations/tests/module-whitelisted.rs diff --git a/libbindgen/tests/expectations/tests/msvc-no-usr.rs b/tests/expectations/tests/msvc-no-usr.rs similarity index 100% rename from libbindgen/tests/expectations/tests/msvc-no-usr.rs rename to tests/expectations/tests/msvc-no-usr.rs diff --git a/libbindgen/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs b/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs similarity index 100% rename from libbindgen/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs rename to tests/expectations/tests/multiple-inherit-empty-correct-layout.rs diff --git a/libbindgen/tests/expectations/tests/mutable.rs b/tests/expectations/tests/mutable.rs similarity index 100% rename from libbindgen/tests/expectations/tests/mutable.rs rename to tests/expectations/tests/mutable.rs diff --git a/libbindgen/tests/expectations/tests/namespace.rs b/tests/expectations/tests/namespace.rs similarity index 100% rename from libbindgen/tests/expectations/tests/namespace.rs rename to tests/expectations/tests/namespace.rs diff --git a/libbindgen/tests/expectations/tests/nested.rs b/tests/expectations/tests/nested.rs similarity index 100% rename from libbindgen/tests/expectations/tests/nested.rs rename to tests/expectations/tests/nested.rs diff --git a/libbindgen/tests/expectations/tests/nested_vtable.rs b/tests/expectations/tests/nested_vtable.rs similarity index 100% rename from libbindgen/tests/expectations/tests/nested_vtable.rs rename to tests/expectations/tests/nested_vtable.rs diff --git a/libbindgen/tests/expectations/tests/nested_within_namespace.rs b/tests/expectations/tests/nested_within_namespace.rs similarity index 100% rename from libbindgen/tests/expectations/tests/nested_within_namespace.rs rename to tests/expectations/tests/nested_within_namespace.rs diff --git a/libbindgen/tests/expectations/tests/no-std.rs b/tests/expectations/tests/no-std.rs similarity index 100% rename from libbindgen/tests/expectations/tests/no-std.rs rename to tests/expectations/tests/no-std.rs diff --git a/libbindgen/tests/expectations/tests/no_copy.rs b/tests/expectations/tests/no_copy.rs similarity index 100% rename from libbindgen/tests/expectations/tests/no_copy.rs rename to tests/expectations/tests/no_copy.rs diff --git a/libbindgen/tests/expectations/tests/nsStyleAutoArray.rs b/tests/expectations/tests/nsStyleAutoArray.rs similarity index 100% rename from libbindgen/tests/expectations/tests/nsStyleAutoArray.rs rename to tests/expectations/tests/nsStyleAutoArray.rs diff --git a/libbindgen/tests/expectations/tests/only_bitfields.rs b/tests/expectations/tests/only_bitfields.rs similarity index 100% rename from libbindgen/tests/expectations/tests/only_bitfields.rs rename to tests/expectations/tests/only_bitfields.rs diff --git a/libbindgen/tests/expectations/tests/opaque-tracing.rs b/tests/expectations/tests/opaque-tracing.rs similarity index 100% rename from libbindgen/tests/expectations/tests/opaque-tracing.rs rename to tests/expectations/tests/opaque-tracing.rs diff --git a/libbindgen/tests/expectations/tests/opaque_in_struct.rs b/tests/expectations/tests/opaque_in_struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/opaque_in_struct.rs rename to tests/expectations/tests/opaque_in_struct.rs diff --git a/libbindgen/tests/expectations/tests/opaque_pointer.rs b/tests/expectations/tests/opaque_pointer.rs similarity index 100% rename from libbindgen/tests/expectations/tests/opaque_pointer.rs rename to tests/expectations/tests/opaque_pointer.rs diff --git a/libbindgen/tests/expectations/tests/opaque_typedef.rs b/tests/expectations/tests/opaque_typedef.rs similarity index 100% rename from libbindgen/tests/expectations/tests/opaque_typedef.rs rename to tests/expectations/tests/opaque_typedef.rs diff --git a/libbindgen/tests/expectations/tests/overflowed_enum.rs b/tests/expectations/tests/overflowed_enum.rs similarity index 100% rename from libbindgen/tests/expectations/tests/overflowed_enum.rs rename to tests/expectations/tests/overflowed_enum.rs diff --git a/libbindgen/tests/expectations/tests/overloading.rs b/tests/expectations/tests/overloading.rs similarity index 100% rename from libbindgen/tests/expectations/tests/overloading.rs rename to tests/expectations/tests/overloading.rs diff --git a/libbindgen/tests/expectations/tests/private.rs b/tests/expectations/tests/private.rs similarity index 100% rename from libbindgen/tests/expectations/tests/private.rs rename to tests/expectations/tests/private.rs diff --git a/libbindgen/tests/expectations/tests/public-dtor.rs b/tests/expectations/tests/public-dtor.rs similarity index 100% rename from libbindgen/tests/expectations/tests/public-dtor.rs rename to tests/expectations/tests/public-dtor.rs diff --git a/libbindgen/tests/expectations/tests/redeclaration.rs b/tests/expectations/tests/redeclaration.rs similarity index 100% rename from libbindgen/tests/expectations/tests/redeclaration.rs rename to tests/expectations/tests/redeclaration.rs diff --git a/libbindgen/tests/expectations/tests/ref_argument_array.rs b/tests/expectations/tests/ref_argument_array.rs similarity index 100% rename from libbindgen/tests/expectations/tests/ref_argument_array.rs rename to tests/expectations/tests/ref_argument_array.rs diff --git a/libbindgen/tests/expectations/tests/reparented_replacement.rs b/tests/expectations/tests/reparented_replacement.rs similarity index 100% rename from libbindgen/tests/expectations/tests/reparented_replacement.rs rename to tests/expectations/tests/reparented_replacement.rs diff --git a/libbindgen/tests/expectations/tests/replace_template_alias.rs b/tests/expectations/tests/replace_template_alias.rs similarity index 100% rename from libbindgen/tests/expectations/tests/replace_template_alias.rs rename to tests/expectations/tests/replace_template_alias.rs diff --git a/libbindgen/tests/expectations/tests/replace_use.rs b/tests/expectations/tests/replace_use.rs similarity index 100% rename from libbindgen/tests/expectations/tests/replace_use.rs rename to tests/expectations/tests/replace_use.rs diff --git a/libbindgen/tests/expectations/tests/replaces_double.rs b/tests/expectations/tests/replaces_double.rs similarity index 100% rename from libbindgen/tests/expectations/tests/replaces_double.rs rename to tests/expectations/tests/replaces_double.rs diff --git a/libbindgen/tests/expectations/tests/resolved_type_def_function.rs b/tests/expectations/tests/resolved_type_def_function.rs similarity index 100% rename from libbindgen/tests/expectations/tests/resolved_type_def_function.rs rename to tests/expectations/tests/resolved_type_def_function.rs diff --git a/libbindgen/tests/expectations/tests/same_struct_name_in_different_namespaces.rs b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs similarity index 100% rename from libbindgen/tests/expectations/tests/same_struct_name_in_different_namespaces.rs rename to tests/expectations/tests/same_struct_name_in_different_namespaces.rs diff --git a/libbindgen/tests/expectations/tests/size_t_template.rs b/tests/expectations/tests/size_t_template.rs similarity index 100% rename from libbindgen/tests/expectations/tests/size_t_template.rs rename to tests/expectations/tests/size_t_template.rs diff --git a/libbindgen/tests/expectations/tests/struct_containing_forward_declared_struct.rs b/tests/expectations/tests/struct_containing_forward_declared_struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_containing_forward_declared_struct.rs rename to tests/expectations/tests/struct_containing_forward_declared_struct.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_anon_struct.rs b/tests/expectations/tests/struct_with_anon_struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_anon_struct.rs rename to tests/expectations/tests/struct_with_anon_struct.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_anon_struct_array.rs b/tests/expectations/tests/struct_with_anon_struct_array.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_anon_struct_array.rs rename to tests/expectations/tests/struct_with_anon_struct_array.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_anon_struct_pointer.rs b/tests/expectations/tests/struct_with_anon_struct_pointer.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_anon_struct_pointer.rs rename to tests/expectations/tests/struct_with_anon_struct_pointer.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_anon_union.rs b/tests/expectations/tests/struct_with_anon_union.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_anon_union.rs rename to tests/expectations/tests/struct_with_anon_union.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_anon_unnamed_struct.rs b/tests/expectations/tests/struct_with_anon_unnamed_struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_anon_unnamed_struct.rs rename to tests/expectations/tests/struct_with_anon_unnamed_struct.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_anon_unnamed_union.rs b/tests/expectations/tests/struct_with_anon_unnamed_union.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_anon_unnamed_union.rs rename to tests/expectations/tests/struct_with_anon_unnamed_union.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_bitfields.rs b/tests/expectations/tests/struct_with_bitfields.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_bitfields.rs rename to tests/expectations/tests/struct_with_bitfields.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_derive_debug.rs b/tests/expectations/tests/struct_with_derive_debug.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_derive_debug.rs rename to tests/expectations/tests/struct_with_derive_debug.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_nesting.rs b/tests/expectations/tests/struct_with_nesting.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_nesting.rs rename to tests/expectations/tests/struct_with_nesting.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_packing.rs b/tests/expectations/tests/struct_with_packing.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_packing.rs rename to tests/expectations/tests/struct_with_packing.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_struct.rs b/tests/expectations/tests/struct_with_struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_struct.rs rename to tests/expectations/tests/struct_with_struct.rs diff --git a/libbindgen/tests/expectations/tests/struct_with_typedef_template_arg.rs b/tests/expectations/tests/struct_with_typedef_template_arg.rs similarity index 100% rename from libbindgen/tests/expectations/tests/struct_with_typedef_template_arg.rs rename to tests/expectations/tests/struct_with_typedef_template_arg.rs diff --git a/libbindgen/tests/expectations/tests/template.rs b/tests/expectations/tests/template.rs similarity index 100% rename from libbindgen/tests/expectations/tests/template.rs rename to tests/expectations/tests/template.rs diff --git a/libbindgen/tests/expectations/tests/template_alias.rs b/tests/expectations/tests/template_alias.rs similarity index 100% rename from libbindgen/tests/expectations/tests/template_alias.rs rename to tests/expectations/tests/template_alias.rs diff --git a/libbindgen/tests/expectations/tests/template_alias_basic.rs b/tests/expectations/tests/template_alias_basic.rs similarity index 100% rename from libbindgen/tests/expectations/tests/template_alias_basic.rs rename to tests/expectations/tests/template_alias_basic.rs diff --git a/libbindgen/tests/expectations/tests/template_alias_namespace.rs b/tests/expectations/tests/template_alias_namespace.rs similarity index 100% rename from libbindgen/tests/expectations/tests/template_alias_namespace.rs rename to tests/expectations/tests/template_alias_namespace.rs diff --git a/libbindgen/tests/expectations/tests/template_typedef_transitive_param.rs b/tests/expectations/tests/template_typedef_transitive_param.rs similarity index 100% rename from libbindgen/tests/expectations/tests/template_typedef_transitive_param.rs rename to tests/expectations/tests/template_typedef_transitive_param.rs diff --git a/libbindgen/tests/expectations/tests/template_typedefs.rs b/tests/expectations/tests/template_typedefs.rs similarity index 100% rename from libbindgen/tests/expectations/tests/template_typedefs.rs rename to tests/expectations/tests/template_typedefs.rs diff --git a/libbindgen/tests/expectations/tests/templateref_opaque.rs b/tests/expectations/tests/templateref_opaque.rs similarity index 100% rename from libbindgen/tests/expectations/tests/templateref_opaque.rs rename to tests/expectations/tests/templateref_opaque.rs diff --git a/libbindgen/tests/expectations/tests/type-referenced-by-whitelisted-function.rs b/tests/expectations/tests/type-referenced-by-whitelisted-function.rs similarity index 100% rename from libbindgen/tests/expectations/tests/type-referenced-by-whitelisted-function.rs rename to tests/expectations/tests/type-referenced-by-whitelisted-function.rs diff --git a/libbindgen/tests/expectations/tests/type_alias_empty.rs b/tests/expectations/tests/type_alias_empty.rs similarity index 100% rename from libbindgen/tests/expectations/tests/type_alias_empty.rs rename to tests/expectations/tests/type_alias_empty.rs diff --git a/libbindgen/tests/expectations/tests/type_alias_partial_template_especialization.rs b/tests/expectations/tests/type_alias_partial_template_especialization.rs similarity index 100% rename from libbindgen/tests/expectations/tests/type_alias_partial_template_especialization.rs rename to tests/expectations/tests/type_alias_partial_template_especialization.rs diff --git a/libbindgen/tests/expectations/tests/type_alias_template_specialized.rs b/tests/expectations/tests/type_alias_template_specialized.rs similarity index 100% rename from libbindgen/tests/expectations/tests/type_alias_template_specialized.rs rename to tests/expectations/tests/type_alias_template_specialized.rs diff --git a/libbindgen/tests/expectations/tests/typedefd-array-as-function-arg.rs b/tests/expectations/tests/typedefd-array-as-function-arg.rs similarity index 100% rename from libbindgen/tests/expectations/tests/typedefd-array-as-function-arg.rs rename to tests/expectations/tests/typedefd-array-as-function-arg.rs diff --git a/libbindgen/tests/expectations/tests/typeref.rs b/tests/expectations/tests/typeref.rs similarity index 100% rename from libbindgen/tests/expectations/tests/typeref.rs rename to tests/expectations/tests/typeref.rs diff --git a/libbindgen/tests/expectations/tests/union-in-ns.rs b/tests/expectations/tests/union-in-ns.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union-in-ns.rs rename to tests/expectations/tests/union-in-ns.rs diff --git a/libbindgen/tests/expectations/tests/union_dtor.rs b/tests/expectations/tests/union_dtor.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union_dtor.rs rename to tests/expectations/tests/union_dtor.rs diff --git a/libbindgen/tests/expectations/tests/union_fields.rs b/tests/expectations/tests/union_fields.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union_fields.rs rename to tests/expectations/tests/union_fields.rs diff --git a/libbindgen/tests/expectations/tests/union_template.rs b/tests/expectations/tests/union_template.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union_template.rs rename to tests/expectations/tests/union_template.rs diff --git a/libbindgen/tests/expectations/tests/union_with_anon_struct.rs b/tests/expectations/tests/union_with_anon_struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union_with_anon_struct.rs rename to tests/expectations/tests/union_with_anon_struct.rs diff --git a/libbindgen/tests/expectations/tests/union_with_anon_struct_bitfield.rs b/tests/expectations/tests/union_with_anon_struct_bitfield.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union_with_anon_struct_bitfield.rs rename to tests/expectations/tests/union_with_anon_struct_bitfield.rs diff --git a/libbindgen/tests/expectations/tests/union_with_anon_union.rs b/tests/expectations/tests/union_with_anon_union.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union_with_anon_union.rs rename to tests/expectations/tests/union_with_anon_union.rs diff --git a/libbindgen/tests/expectations/tests/union_with_anon_unnamed_struct.rs b/tests/expectations/tests/union_with_anon_unnamed_struct.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union_with_anon_unnamed_struct.rs rename to tests/expectations/tests/union_with_anon_unnamed_struct.rs diff --git a/libbindgen/tests/expectations/tests/union_with_anon_unnamed_union.rs b/tests/expectations/tests/union_with_anon_unnamed_union.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union_with_anon_unnamed_union.rs rename to tests/expectations/tests/union_with_anon_unnamed_union.rs diff --git a/libbindgen/tests/expectations/tests/union_with_big_member.rs b/tests/expectations/tests/union_with_big_member.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union_with_big_member.rs rename to tests/expectations/tests/union_with_big_member.rs diff --git a/libbindgen/tests/expectations/tests/union_with_nesting.rs b/tests/expectations/tests/union_with_nesting.rs similarity index 100% rename from libbindgen/tests/expectations/tests/union_with_nesting.rs rename to tests/expectations/tests/union_with_nesting.rs diff --git a/libbindgen/tests/expectations/tests/unknown_attr.rs b/tests/expectations/tests/unknown_attr.rs similarity index 100% rename from libbindgen/tests/expectations/tests/unknown_attr.rs rename to tests/expectations/tests/unknown_attr.rs diff --git a/libbindgen/tests/expectations/tests/use-core.rs b/tests/expectations/tests/use-core.rs similarity index 100% rename from libbindgen/tests/expectations/tests/use-core.rs rename to tests/expectations/tests/use-core.rs diff --git a/libbindgen/tests/expectations/tests/using.rs b/tests/expectations/tests/using.rs similarity index 100% rename from libbindgen/tests/expectations/tests/using.rs rename to tests/expectations/tests/using.rs diff --git a/libbindgen/tests/expectations/tests/var-tracing.rs b/tests/expectations/tests/var-tracing.rs similarity index 100% rename from libbindgen/tests/expectations/tests/var-tracing.rs rename to tests/expectations/tests/var-tracing.rs diff --git a/libbindgen/tests/expectations/tests/variadic-method.rs b/tests/expectations/tests/variadic-method.rs similarity index 100% rename from libbindgen/tests/expectations/tests/variadic-method.rs rename to tests/expectations/tests/variadic-method.rs diff --git a/libbindgen/tests/expectations/tests/variadic_template_function.rs b/tests/expectations/tests/variadic_template_function.rs similarity index 100% rename from libbindgen/tests/expectations/tests/variadic_template_function.rs rename to tests/expectations/tests/variadic_template_function.rs diff --git a/libbindgen/tests/expectations/tests/vector.rs b/tests/expectations/tests/vector.rs similarity index 100% rename from libbindgen/tests/expectations/tests/vector.rs rename to tests/expectations/tests/vector.rs diff --git a/libbindgen/tests/expectations/tests/virtual_dtor.rs b/tests/expectations/tests/virtual_dtor.rs similarity index 100% rename from libbindgen/tests/expectations/tests/virtual_dtor.rs rename to tests/expectations/tests/virtual_dtor.rs diff --git a/libbindgen/tests/expectations/tests/virtual_inheritance.rs b/tests/expectations/tests/virtual_inheritance.rs similarity index 100% rename from libbindgen/tests/expectations/tests/virtual_inheritance.rs rename to tests/expectations/tests/virtual_inheritance.rs diff --git a/libbindgen/tests/expectations/tests/virtual_overloaded.rs b/tests/expectations/tests/virtual_overloaded.rs similarity index 100% rename from libbindgen/tests/expectations/tests/virtual_overloaded.rs rename to tests/expectations/tests/virtual_overloaded.rs diff --git a/libbindgen/tests/expectations/tests/vtable_recursive_sig.rs b/tests/expectations/tests/vtable_recursive_sig.rs similarity index 100% rename from libbindgen/tests/expectations/tests/vtable_recursive_sig.rs rename to tests/expectations/tests/vtable_recursive_sig.rs diff --git a/libbindgen/tests/expectations/tests/weird_bitfields.rs b/tests/expectations/tests/weird_bitfields.rs similarity index 100% rename from libbindgen/tests/expectations/tests/weird_bitfields.rs rename to tests/expectations/tests/weird_bitfields.rs diff --git a/libbindgen/tests/expectations/tests/what_is_going_on.rs b/tests/expectations/tests/what_is_going_on.rs similarity index 100% rename from libbindgen/tests/expectations/tests/what_is_going_on.rs rename to tests/expectations/tests/what_is_going_on.rs diff --git a/libbindgen/tests/expectations/tests/whitelist-namespaces-basic.rs b/tests/expectations/tests/whitelist-namespaces-basic.rs similarity index 100% rename from libbindgen/tests/expectations/tests/whitelist-namespaces-basic.rs rename to tests/expectations/tests/whitelist-namespaces-basic.rs diff --git a/libbindgen/tests/expectations/tests/whitelist-namespaces.rs b/tests/expectations/tests/whitelist-namespaces.rs similarity index 100% rename from libbindgen/tests/expectations/tests/whitelist-namespaces.rs rename to tests/expectations/tests/whitelist-namespaces.rs diff --git a/libbindgen/tests/expectations/tests/whitelist_basic.rs b/tests/expectations/tests/whitelist_basic.rs similarity index 100% rename from libbindgen/tests/expectations/tests/whitelist_basic.rs rename to tests/expectations/tests/whitelist_basic.rs diff --git a/libbindgen/tests/expectations/tests/whitelist_fix.rs b/tests/expectations/tests/whitelist_fix.rs similarity index 100% rename from libbindgen/tests/expectations/tests/whitelist_fix.rs rename to tests/expectations/tests/whitelist_fix.rs diff --git a/libbindgen/tests/expectations/tests/whitelist_vars.rs b/tests/expectations/tests/whitelist_vars.rs similarity index 100% rename from libbindgen/tests/expectations/tests/whitelist_vars.rs rename to tests/expectations/tests/whitelist_vars.rs diff --git a/libbindgen/tests/headers/accessors.hpp b/tests/headers/accessors.hpp similarity index 100% rename from libbindgen/tests/headers/accessors.hpp rename to tests/headers/accessors.hpp diff --git a/libbindgen/tests/headers/annotation_hide.hpp b/tests/headers/annotation_hide.hpp similarity index 100% rename from libbindgen/tests/headers/annotation_hide.hpp rename to tests/headers/annotation_hide.hpp diff --git a/libbindgen/tests/headers/anon_enum.hpp b/tests/headers/anon_enum.hpp similarity index 100% rename from libbindgen/tests/headers/anon_enum.hpp rename to tests/headers/anon_enum.hpp diff --git a/libbindgen/tests/headers/anon_enum_trait.hpp b/tests/headers/anon_enum_trait.hpp similarity index 100% rename from libbindgen/tests/headers/anon_enum_trait.hpp rename to tests/headers/anon_enum_trait.hpp diff --git a/libbindgen/tests/headers/anon_enum_whitelist.h b/tests/headers/anon_enum_whitelist.h similarity index 100% rename from libbindgen/tests/headers/anon_enum_whitelist.h rename to tests/headers/anon_enum_whitelist.h diff --git a/libbindgen/tests/headers/anon_union.hpp b/tests/headers/anon_union.hpp similarity index 100% rename from libbindgen/tests/headers/anon_union.hpp rename to tests/headers/anon_union.hpp diff --git a/libbindgen/tests/headers/arg_keyword.hpp b/tests/headers/arg_keyword.hpp similarity index 100% rename from libbindgen/tests/headers/arg_keyword.hpp rename to tests/headers/arg_keyword.hpp diff --git a/libbindgen/tests/headers/auto.hpp b/tests/headers/auto.hpp similarity index 100% rename from libbindgen/tests/headers/auto.hpp rename to tests/headers/auto.hpp diff --git a/libbindgen/tests/headers/bad-namespace-parenthood-inheritance.hpp b/tests/headers/bad-namespace-parenthood-inheritance.hpp similarity index 100% rename from libbindgen/tests/headers/bad-namespace-parenthood-inheritance.hpp rename to tests/headers/bad-namespace-parenthood-inheritance.hpp diff --git a/libbindgen/tests/headers/base-to-derived.hpp b/tests/headers/base-to-derived.hpp similarity index 100% rename from libbindgen/tests/headers/base-to-derived.hpp rename to tests/headers/base-to-derived.hpp diff --git a/libbindgen/tests/headers/bitfield-enum-basic.hpp b/tests/headers/bitfield-enum-basic.hpp similarity index 100% rename from libbindgen/tests/headers/bitfield-enum-basic.hpp rename to tests/headers/bitfield-enum-basic.hpp diff --git a/libbindgen/tests/headers/bitfield_method_mangling.h b/tests/headers/bitfield_method_mangling.h similarity index 100% rename from libbindgen/tests/headers/bitfield_method_mangling.h rename to tests/headers/bitfield_method_mangling.h diff --git a/libbindgen/tests/headers/blocks.h b/tests/headers/blocks.h similarity index 100% rename from libbindgen/tests/headers/blocks.h rename to tests/headers/blocks.h diff --git a/libbindgen/tests/headers/canonical_path_without_namespacing.hpp b/tests/headers/canonical_path_without_namespacing.hpp similarity index 100% rename from libbindgen/tests/headers/canonical_path_without_namespacing.hpp rename to tests/headers/canonical_path_without_namespacing.hpp diff --git a/libbindgen/tests/headers/class.hpp b/tests/headers/class.hpp similarity index 100% rename from libbindgen/tests/headers/class.hpp rename to tests/headers/class.hpp diff --git a/libbindgen/tests/headers/class_nested.hpp b/tests/headers/class_nested.hpp similarity index 100% rename from libbindgen/tests/headers/class_nested.hpp rename to tests/headers/class_nested.hpp diff --git a/libbindgen/tests/headers/class_no_members.hpp b/tests/headers/class_no_members.hpp similarity index 100% rename from libbindgen/tests/headers/class_no_members.hpp rename to tests/headers/class_no_members.hpp diff --git a/libbindgen/tests/headers/class_static.hpp b/tests/headers/class_static.hpp similarity index 100% rename from libbindgen/tests/headers/class_static.hpp rename to tests/headers/class_static.hpp diff --git a/libbindgen/tests/headers/class_static_const.hpp b/tests/headers/class_static_const.hpp similarity index 100% rename from libbindgen/tests/headers/class_static_const.hpp rename to tests/headers/class_static_const.hpp diff --git a/libbindgen/tests/headers/class_use_as.hpp b/tests/headers/class_use_as.hpp similarity index 100% rename from libbindgen/tests/headers/class_use_as.hpp rename to tests/headers/class_use_as.hpp diff --git a/libbindgen/tests/headers/class_with_dtor.hpp b/tests/headers/class_with_dtor.hpp similarity index 100% rename from libbindgen/tests/headers/class_with_dtor.hpp rename to tests/headers/class_with_dtor.hpp diff --git a/libbindgen/tests/headers/class_with_inner_struct.hpp b/tests/headers/class_with_inner_struct.hpp similarity index 100% rename from libbindgen/tests/headers/class_with_inner_struct.hpp rename to tests/headers/class_with_inner_struct.hpp diff --git a/libbindgen/tests/headers/class_with_typedef.hpp b/tests/headers/class_with_typedef.hpp similarity index 100% rename from libbindgen/tests/headers/class_with_typedef.hpp rename to tests/headers/class_with_typedef.hpp diff --git a/libbindgen/tests/headers/complex.h b/tests/headers/complex.h similarity index 100% rename from libbindgen/tests/headers/complex.h rename to tests/headers/complex.h diff --git a/libbindgen/tests/headers/complex_global.h b/tests/headers/complex_global.h similarity index 100% rename from libbindgen/tests/headers/complex_global.h rename to tests/headers/complex_global.h diff --git a/libbindgen/tests/headers/const_bool.hpp b/tests/headers/const_bool.hpp similarity index 100% rename from libbindgen/tests/headers/const_bool.hpp rename to tests/headers/const_bool.hpp diff --git a/libbindgen/tests/headers/const_enum_unnamed.hpp b/tests/headers/const_enum_unnamed.hpp similarity index 100% rename from libbindgen/tests/headers/const_enum_unnamed.hpp rename to tests/headers/const_enum_unnamed.hpp diff --git a/libbindgen/tests/headers/const_ptr.hpp b/tests/headers/const_ptr.hpp similarity index 100% rename from libbindgen/tests/headers/const_ptr.hpp rename to tests/headers/const_ptr.hpp diff --git a/libbindgen/tests/headers/const_resolved_ty.h b/tests/headers/const_resolved_ty.h similarity index 100% rename from libbindgen/tests/headers/const_resolved_ty.h rename to tests/headers/const_resolved_ty.h diff --git a/libbindgen/tests/headers/const_tparam.hpp b/tests/headers/const_tparam.hpp similarity index 100% rename from libbindgen/tests/headers/const_tparam.hpp rename to tests/headers/const_tparam.hpp diff --git a/libbindgen/tests/headers/constant-evaluate.h b/tests/headers/constant-evaluate.h similarity index 100% rename from libbindgen/tests/headers/constant-evaluate.h rename to tests/headers/constant-evaluate.h diff --git a/libbindgen/tests/headers/constify-enum.h b/tests/headers/constify-enum.h similarity index 100% rename from libbindgen/tests/headers/constify-enum.h rename to tests/headers/constify-enum.h diff --git a/libbindgen/tests/headers/constructor-tp.hpp b/tests/headers/constructor-tp.hpp similarity index 100% rename from libbindgen/tests/headers/constructor-tp.hpp rename to tests/headers/constructor-tp.hpp diff --git a/libbindgen/tests/headers/constructors.hpp b/tests/headers/constructors.hpp similarity index 100% rename from libbindgen/tests/headers/constructors.hpp rename to tests/headers/constructors.hpp diff --git a/libbindgen/tests/headers/convert-floats.h b/tests/headers/convert-floats.h similarity index 100% rename from libbindgen/tests/headers/convert-floats.h rename to tests/headers/convert-floats.h diff --git a/libbindgen/tests/headers/crtp.hpp b/tests/headers/crtp.hpp similarity index 100% rename from libbindgen/tests/headers/crtp.hpp rename to tests/headers/crtp.hpp diff --git a/libbindgen/tests/headers/dash_language.h b/tests/headers/dash_language.h similarity index 100% rename from libbindgen/tests/headers/dash_language.h rename to tests/headers/dash_language.h diff --git a/libbindgen/tests/headers/decl_extern_int_twice.h b/tests/headers/decl_extern_int_twice.h similarity index 100% rename from libbindgen/tests/headers/decl_extern_int_twice.h rename to tests/headers/decl_extern_int_twice.h diff --git a/libbindgen/tests/headers/decl_ptr_to_array.h b/tests/headers/decl_ptr_to_array.h similarity index 100% rename from libbindgen/tests/headers/decl_ptr_to_array.h rename to tests/headers/decl_ptr_to_array.h diff --git a/libbindgen/tests/headers/disable-namespacing.hpp b/tests/headers/disable-namespacing.hpp similarity index 100% rename from libbindgen/tests/headers/disable-namespacing.hpp rename to tests/headers/disable-namespacing.hpp diff --git a/libbindgen/tests/headers/duplicated-namespaces-definitions.hpp b/tests/headers/duplicated-namespaces-definitions.hpp similarity index 100% rename from libbindgen/tests/headers/duplicated-namespaces-definitions.hpp rename to tests/headers/duplicated-namespaces-definitions.hpp diff --git a/libbindgen/tests/headers/duplicated-namespaces.hpp b/tests/headers/duplicated-namespaces.hpp similarity index 100% rename from libbindgen/tests/headers/duplicated-namespaces.hpp rename to tests/headers/duplicated-namespaces.hpp diff --git a/libbindgen/tests/headers/duplicated_constants_in_ns.hpp b/tests/headers/duplicated_constants_in_ns.hpp similarity index 100% rename from libbindgen/tests/headers/duplicated_constants_in_ns.hpp rename to tests/headers/duplicated_constants_in_ns.hpp diff --git a/libbindgen/tests/headers/elaborated.hpp b/tests/headers/elaborated.hpp similarity index 100% rename from libbindgen/tests/headers/elaborated.hpp rename to tests/headers/elaborated.hpp diff --git a/libbindgen/tests/headers/empty_template_param_name.hpp b/tests/headers/empty_template_param_name.hpp similarity index 100% rename from libbindgen/tests/headers/empty_template_param_name.hpp rename to tests/headers/empty_template_param_name.hpp diff --git a/libbindgen/tests/headers/enum.h b/tests/headers/enum.h similarity index 100% rename from libbindgen/tests/headers/enum.h rename to tests/headers/enum.h diff --git a/libbindgen/tests/headers/enum_alias.hpp b/tests/headers/enum_alias.hpp similarity index 100% rename from libbindgen/tests/headers/enum_alias.hpp rename to tests/headers/enum_alias.hpp diff --git a/libbindgen/tests/headers/enum_and_vtable_mangling.hpp b/tests/headers/enum_and_vtable_mangling.hpp similarity index 100% rename from libbindgen/tests/headers/enum_and_vtable_mangling.hpp rename to tests/headers/enum_and_vtable_mangling.hpp diff --git a/libbindgen/tests/headers/enum_dupe.h b/tests/headers/enum_dupe.h similarity index 100% rename from libbindgen/tests/headers/enum_dupe.h rename to tests/headers/enum_dupe.h diff --git a/libbindgen/tests/headers/enum_explicit_type.hpp b/tests/headers/enum_explicit_type.hpp similarity index 100% rename from libbindgen/tests/headers/enum_explicit_type.hpp rename to tests/headers/enum_explicit_type.hpp diff --git a/libbindgen/tests/headers/enum_in_template_with_typedef.hpp b/tests/headers/enum_in_template_with_typedef.hpp similarity index 100% rename from libbindgen/tests/headers/enum_in_template_with_typedef.hpp rename to tests/headers/enum_in_template_with_typedef.hpp diff --git a/libbindgen/tests/headers/enum_negative.h b/tests/headers/enum_negative.h similarity index 100% rename from libbindgen/tests/headers/enum_negative.h rename to tests/headers/enum_negative.h diff --git a/libbindgen/tests/headers/enum_packed.h b/tests/headers/enum_packed.h similarity index 100% rename from libbindgen/tests/headers/enum_packed.h rename to tests/headers/enum_packed.h diff --git a/libbindgen/tests/headers/eval-variadic-template-parameter.hpp b/tests/headers/eval-variadic-template-parameter.hpp similarity index 100% rename from libbindgen/tests/headers/eval-variadic-template-parameter.hpp rename to tests/headers/eval-variadic-template-parameter.hpp diff --git a/libbindgen/tests/headers/extern.hpp b/tests/headers/extern.hpp similarity index 100% rename from libbindgen/tests/headers/extern.hpp rename to tests/headers/extern.hpp diff --git a/libbindgen/tests/headers/float128.hpp b/tests/headers/float128.hpp similarity index 100% rename from libbindgen/tests/headers/float128.hpp rename to tests/headers/float128.hpp diff --git a/libbindgen/tests/headers/forward-inherit-struct-with-fields.hpp b/tests/headers/forward-inherit-struct-with-fields.hpp similarity index 100% rename from libbindgen/tests/headers/forward-inherit-struct-with-fields.hpp rename to tests/headers/forward-inherit-struct-with-fields.hpp diff --git a/libbindgen/tests/headers/forward-inherit-struct.hpp b/tests/headers/forward-inherit-struct.hpp similarity index 100% rename from libbindgen/tests/headers/forward-inherit-struct.hpp rename to tests/headers/forward-inherit-struct.hpp diff --git a/libbindgen/tests/headers/forward_declared_struct.h b/tests/headers/forward_declared_struct.h similarity index 100% rename from libbindgen/tests/headers/forward_declared_struct.h rename to tests/headers/forward_declared_struct.h diff --git a/libbindgen/tests/headers/func_proto.h b/tests/headers/func_proto.h similarity index 100% rename from libbindgen/tests/headers/func_proto.h rename to tests/headers/func_proto.h diff --git a/libbindgen/tests/headers/func_ptr.h b/tests/headers/func_ptr.h similarity index 100% rename from libbindgen/tests/headers/func_ptr.h rename to tests/headers/func_ptr.h diff --git a/libbindgen/tests/headers/func_ptr_in_struct.h b/tests/headers/func_ptr_in_struct.h similarity index 100% rename from libbindgen/tests/headers/func_ptr_in_struct.h rename to tests/headers/func_ptr_in_struct.h diff --git a/libbindgen/tests/headers/func_with_array_arg.h b/tests/headers/func_with_array_arg.h similarity index 100% rename from libbindgen/tests/headers/func_with_array_arg.h rename to tests/headers/func_with_array_arg.h diff --git a/libbindgen/tests/headers/func_with_func_ptr_arg.h b/tests/headers/func_with_func_ptr_arg.h similarity index 100% rename from libbindgen/tests/headers/func_with_func_ptr_arg.h rename to tests/headers/func_with_func_ptr_arg.h diff --git a/libbindgen/tests/headers/in_class_typedef.hpp b/tests/headers/in_class_typedef.hpp similarity index 100% rename from libbindgen/tests/headers/in_class_typedef.hpp rename to tests/headers/in_class_typedef.hpp diff --git a/libbindgen/tests/headers/inherit-namespaced.hpp b/tests/headers/inherit-namespaced.hpp similarity index 100% rename from libbindgen/tests/headers/inherit-namespaced.hpp rename to tests/headers/inherit-namespaced.hpp diff --git a/libbindgen/tests/headers/inherit_named.hpp b/tests/headers/inherit_named.hpp similarity index 100% rename from libbindgen/tests/headers/inherit_named.hpp rename to tests/headers/inherit_named.hpp diff --git a/libbindgen/tests/headers/inherit_typedef.hpp b/tests/headers/inherit_typedef.hpp similarity index 100% rename from libbindgen/tests/headers/inherit_typedef.hpp rename to tests/headers/inherit_typedef.hpp diff --git a/libbindgen/tests/headers/inline-function.h b/tests/headers/inline-function.h similarity index 100% rename from libbindgen/tests/headers/inline-function.h rename to tests/headers/inline-function.h diff --git a/libbindgen/tests/headers/inline_namespace.hpp b/tests/headers/inline_namespace.hpp similarity index 100% rename from libbindgen/tests/headers/inline_namespace.hpp rename to tests/headers/inline_namespace.hpp diff --git a/libbindgen/tests/headers/inline_namespace_conservative.hpp b/tests/headers/inline_namespace_conservative.hpp similarity index 100% rename from libbindgen/tests/headers/inline_namespace_conservative.hpp rename to tests/headers/inline_namespace_conservative.hpp diff --git a/libbindgen/tests/headers/inline_namespace_whitelist.hpp b/tests/headers/inline_namespace_whitelist.hpp similarity index 100% rename from libbindgen/tests/headers/inline_namespace_whitelist.hpp rename to tests/headers/inline_namespace_whitelist.hpp diff --git a/libbindgen/tests/headers/inner_const.hpp b/tests/headers/inner_const.hpp similarity index 100% rename from libbindgen/tests/headers/inner_const.hpp rename to tests/headers/inner_const.hpp diff --git a/libbindgen/tests/headers/inner_template_self.hpp b/tests/headers/inner_template_self.hpp similarity index 100% rename from libbindgen/tests/headers/inner_template_self.hpp rename to tests/headers/inner_template_self.hpp diff --git a/libbindgen/tests/headers/int128_t.h b/tests/headers/int128_t.h similarity index 100% rename from libbindgen/tests/headers/int128_t.h rename to tests/headers/int128_t.h diff --git a/libbindgen/tests/headers/issue-358.hpp b/tests/headers/issue-358.hpp similarity index 100% rename from libbindgen/tests/headers/issue-358.hpp rename to tests/headers/issue-358.hpp diff --git a/libbindgen/tests/headers/issue-372.hpp b/tests/headers/issue-372.hpp similarity index 100% rename from libbindgen/tests/headers/issue-372.hpp rename to tests/headers/issue-372.hpp diff --git a/libbindgen/tests/headers/issue_311.hpp b/tests/headers/issue_311.hpp similarity index 100% rename from libbindgen/tests/headers/issue_311.hpp rename to tests/headers/issue_311.hpp diff --git a/libbindgen/tests/headers/issue_315.hpp b/tests/headers/issue_315.hpp similarity index 100% rename from libbindgen/tests/headers/issue_315.hpp rename to tests/headers/issue_315.hpp diff --git a/libbindgen/tests/headers/jsval_layout_opaque.hpp b/tests/headers/jsval_layout_opaque.hpp similarity index 100% rename from libbindgen/tests/headers/jsval_layout_opaque.hpp rename to tests/headers/jsval_layout_opaque.hpp diff --git a/libbindgen/tests/headers/keywords.h b/tests/headers/keywords.h similarity index 100% rename from libbindgen/tests/headers/keywords.h rename to tests/headers/keywords.h diff --git a/libbindgen/tests/headers/macro-expr-basic.h b/tests/headers/macro-expr-basic.h similarity index 100% rename from libbindgen/tests/headers/macro-expr-basic.h rename to tests/headers/macro-expr-basic.h diff --git a/libbindgen/tests/headers/macro-redef.h b/tests/headers/macro-redef.h similarity index 100% rename from libbindgen/tests/headers/macro-redef.h rename to tests/headers/macro-redef.h diff --git a/libbindgen/tests/headers/macro_const.h b/tests/headers/macro_const.h similarity index 100% rename from libbindgen/tests/headers/macro_const.h rename to tests/headers/macro_const.h diff --git a/libbindgen/tests/headers/maddness-is-avoidable.hpp b/tests/headers/maddness-is-avoidable.hpp similarity index 100% rename from libbindgen/tests/headers/maddness-is-avoidable.hpp rename to tests/headers/maddness-is-avoidable.hpp diff --git a/libbindgen/tests/headers/method-mangling.hpp b/tests/headers/method-mangling.hpp similarity index 100% rename from libbindgen/tests/headers/method-mangling.hpp rename to tests/headers/method-mangling.hpp diff --git a/libbindgen/tests/headers/module-whitelisted.hpp b/tests/headers/module-whitelisted.hpp similarity index 100% rename from libbindgen/tests/headers/module-whitelisted.hpp rename to tests/headers/module-whitelisted.hpp diff --git a/libbindgen/tests/headers/msvc-no-usr.hpp b/tests/headers/msvc-no-usr.hpp similarity index 100% rename from libbindgen/tests/headers/msvc-no-usr.hpp rename to tests/headers/msvc-no-usr.hpp diff --git a/libbindgen/tests/headers/multiple-inherit-empty-correct-layout.hpp b/tests/headers/multiple-inherit-empty-correct-layout.hpp similarity index 100% rename from libbindgen/tests/headers/multiple-inherit-empty-correct-layout.hpp rename to tests/headers/multiple-inherit-empty-correct-layout.hpp diff --git a/libbindgen/tests/headers/mutable.hpp b/tests/headers/mutable.hpp similarity index 100% rename from libbindgen/tests/headers/mutable.hpp rename to tests/headers/mutable.hpp diff --git a/libbindgen/tests/headers/namespace.hpp b/tests/headers/namespace.hpp similarity index 100% rename from libbindgen/tests/headers/namespace.hpp rename to tests/headers/namespace.hpp diff --git a/libbindgen/tests/headers/nested.hpp b/tests/headers/nested.hpp similarity index 100% rename from libbindgen/tests/headers/nested.hpp rename to tests/headers/nested.hpp diff --git a/libbindgen/tests/headers/nested_vtable.hpp b/tests/headers/nested_vtable.hpp similarity index 100% rename from libbindgen/tests/headers/nested_vtable.hpp rename to tests/headers/nested_vtable.hpp diff --git a/libbindgen/tests/headers/nested_within_namespace.hpp b/tests/headers/nested_within_namespace.hpp similarity index 100% rename from libbindgen/tests/headers/nested_within_namespace.hpp rename to tests/headers/nested_within_namespace.hpp diff --git a/libbindgen/tests/headers/no-std.h b/tests/headers/no-std.h similarity index 100% rename from libbindgen/tests/headers/no-std.h rename to tests/headers/no-std.h diff --git a/libbindgen/tests/headers/no_copy.hpp b/tests/headers/no_copy.hpp similarity index 100% rename from libbindgen/tests/headers/no_copy.hpp rename to tests/headers/no_copy.hpp diff --git a/libbindgen/tests/headers/nsStyleAutoArray.hpp b/tests/headers/nsStyleAutoArray.hpp similarity index 100% rename from libbindgen/tests/headers/nsStyleAutoArray.hpp rename to tests/headers/nsStyleAutoArray.hpp diff --git a/libbindgen/tests/headers/only_bitfields.hpp b/tests/headers/only_bitfields.hpp similarity index 100% rename from libbindgen/tests/headers/only_bitfields.hpp rename to tests/headers/only_bitfields.hpp diff --git a/libbindgen/tests/headers/opaque-tracing.hpp b/tests/headers/opaque-tracing.hpp similarity index 100% rename from libbindgen/tests/headers/opaque-tracing.hpp rename to tests/headers/opaque-tracing.hpp diff --git a/libbindgen/tests/headers/opaque_in_struct.hpp b/tests/headers/opaque_in_struct.hpp similarity index 100% rename from libbindgen/tests/headers/opaque_in_struct.hpp rename to tests/headers/opaque_in_struct.hpp diff --git a/libbindgen/tests/headers/opaque_pointer.hpp b/tests/headers/opaque_pointer.hpp similarity index 100% rename from libbindgen/tests/headers/opaque_pointer.hpp rename to tests/headers/opaque_pointer.hpp diff --git a/libbindgen/tests/headers/opaque_typedef.hpp b/tests/headers/opaque_typedef.hpp similarity index 100% rename from libbindgen/tests/headers/opaque_typedef.hpp rename to tests/headers/opaque_typedef.hpp diff --git a/libbindgen/tests/headers/overflowed_enum.hpp b/tests/headers/overflowed_enum.hpp similarity index 100% rename from libbindgen/tests/headers/overflowed_enum.hpp rename to tests/headers/overflowed_enum.hpp diff --git a/libbindgen/tests/headers/overloading.hpp b/tests/headers/overloading.hpp similarity index 100% rename from libbindgen/tests/headers/overloading.hpp rename to tests/headers/overloading.hpp diff --git a/libbindgen/tests/headers/private.hpp b/tests/headers/private.hpp similarity index 100% rename from libbindgen/tests/headers/private.hpp rename to tests/headers/private.hpp diff --git a/libbindgen/tests/headers/public-dtor.hpp b/tests/headers/public-dtor.hpp similarity index 100% rename from libbindgen/tests/headers/public-dtor.hpp rename to tests/headers/public-dtor.hpp diff --git a/libbindgen/tests/headers/redeclaration.hpp b/tests/headers/redeclaration.hpp similarity index 100% rename from libbindgen/tests/headers/redeclaration.hpp rename to tests/headers/redeclaration.hpp diff --git a/libbindgen/tests/headers/ref_argument_array.hpp b/tests/headers/ref_argument_array.hpp similarity index 100% rename from libbindgen/tests/headers/ref_argument_array.hpp rename to tests/headers/ref_argument_array.hpp diff --git a/libbindgen/tests/headers/reparented_replacement.hpp b/tests/headers/reparented_replacement.hpp similarity index 100% rename from libbindgen/tests/headers/reparented_replacement.hpp rename to tests/headers/reparented_replacement.hpp diff --git a/libbindgen/tests/headers/replace_template_alias.hpp b/tests/headers/replace_template_alias.hpp similarity index 100% rename from libbindgen/tests/headers/replace_template_alias.hpp rename to tests/headers/replace_template_alias.hpp diff --git a/libbindgen/tests/headers/replace_use.hpp b/tests/headers/replace_use.hpp similarity index 100% rename from libbindgen/tests/headers/replace_use.hpp rename to tests/headers/replace_use.hpp diff --git a/libbindgen/tests/headers/replaces_double.hpp b/tests/headers/replaces_double.hpp similarity index 100% rename from libbindgen/tests/headers/replaces_double.hpp rename to tests/headers/replaces_double.hpp diff --git a/libbindgen/tests/headers/resolved_type_def_function.h b/tests/headers/resolved_type_def_function.h similarity index 100% rename from libbindgen/tests/headers/resolved_type_def_function.h rename to tests/headers/resolved_type_def_function.h diff --git a/libbindgen/tests/headers/same_struct_name_in_different_namespaces.hpp b/tests/headers/same_struct_name_in_different_namespaces.hpp similarity index 100% rename from libbindgen/tests/headers/same_struct_name_in_different_namespaces.hpp rename to tests/headers/same_struct_name_in_different_namespaces.hpp diff --git a/libbindgen/tests/headers/size_t_template.hpp b/tests/headers/size_t_template.hpp similarity index 100% rename from libbindgen/tests/headers/size_t_template.hpp rename to tests/headers/size_t_template.hpp diff --git a/libbindgen/tests/headers/struct_containing_forward_declared_struct.h b/tests/headers/struct_containing_forward_declared_struct.h similarity index 100% rename from libbindgen/tests/headers/struct_containing_forward_declared_struct.h rename to tests/headers/struct_containing_forward_declared_struct.h diff --git a/libbindgen/tests/headers/struct_with_anon_struct.h b/tests/headers/struct_with_anon_struct.h similarity index 100% rename from libbindgen/tests/headers/struct_with_anon_struct.h rename to tests/headers/struct_with_anon_struct.h diff --git a/libbindgen/tests/headers/struct_with_anon_struct_array.h b/tests/headers/struct_with_anon_struct_array.h similarity index 100% rename from libbindgen/tests/headers/struct_with_anon_struct_array.h rename to tests/headers/struct_with_anon_struct_array.h diff --git a/libbindgen/tests/headers/struct_with_anon_struct_pointer.h b/tests/headers/struct_with_anon_struct_pointer.h similarity index 100% rename from libbindgen/tests/headers/struct_with_anon_struct_pointer.h rename to tests/headers/struct_with_anon_struct_pointer.h diff --git a/libbindgen/tests/headers/struct_with_anon_union.h b/tests/headers/struct_with_anon_union.h similarity index 100% rename from libbindgen/tests/headers/struct_with_anon_union.h rename to tests/headers/struct_with_anon_union.h diff --git a/libbindgen/tests/headers/struct_with_anon_unnamed_struct.h b/tests/headers/struct_with_anon_unnamed_struct.h similarity index 100% rename from libbindgen/tests/headers/struct_with_anon_unnamed_struct.h rename to tests/headers/struct_with_anon_unnamed_struct.h diff --git a/libbindgen/tests/headers/struct_with_anon_unnamed_union.h b/tests/headers/struct_with_anon_unnamed_union.h similarity index 100% rename from libbindgen/tests/headers/struct_with_anon_unnamed_union.h rename to tests/headers/struct_with_anon_unnamed_union.h diff --git a/libbindgen/tests/headers/struct_with_bitfields.h b/tests/headers/struct_with_bitfields.h similarity index 100% rename from libbindgen/tests/headers/struct_with_bitfields.h rename to tests/headers/struct_with_bitfields.h diff --git a/libbindgen/tests/headers/struct_with_derive_debug.h b/tests/headers/struct_with_derive_debug.h similarity index 100% rename from libbindgen/tests/headers/struct_with_derive_debug.h rename to tests/headers/struct_with_derive_debug.h diff --git a/libbindgen/tests/headers/struct_with_nesting.h b/tests/headers/struct_with_nesting.h similarity index 100% rename from libbindgen/tests/headers/struct_with_nesting.h rename to tests/headers/struct_with_nesting.h diff --git a/libbindgen/tests/headers/struct_with_packing.h b/tests/headers/struct_with_packing.h similarity index 100% rename from libbindgen/tests/headers/struct_with_packing.h rename to tests/headers/struct_with_packing.h diff --git a/libbindgen/tests/headers/struct_with_struct.h b/tests/headers/struct_with_struct.h similarity index 100% rename from libbindgen/tests/headers/struct_with_struct.h rename to tests/headers/struct_with_struct.h diff --git a/libbindgen/tests/headers/struct_with_typedef_template_arg.hpp b/tests/headers/struct_with_typedef_template_arg.hpp similarity index 100% rename from libbindgen/tests/headers/struct_with_typedef_template_arg.hpp rename to tests/headers/struct_with_typedef_template_arg.hpp diff --git a/libbindgen/tests/headers/template.hpp b/tests/headers/template.hpp similarity index 100% rename from libbindgen/tests/headers/template.hpp rename to tests/headers/template.hpp diff --git a/libbindgen/tests/headers/template_alias.hpp b/tests/headers/template_alias.hpp similarity index 100% rename from libbindgen/tests/headers/template_alias.hpp rename to tests/headers/template_alias.hpp diff --git a/libbindgen/tests/headers/template_alias_basic.hpp b/tests/headers/template_alias_basic.hpp similarity index 100% rename from libbindgen/tests/headers/template_alias_basic.hpp rename to tests/headers/template_alias_basic.hpp diff --git a/libbindgen/tests/headers/template_alias_namespace.hpp b/tests/headers/template_alias_namespace.hpp similarity index 100% rename from libbindgen/tests/headers/template_alias_namespace.hpp rename to tests/headers/template_alias_namespace.hpp diff --git a/libbindgen/tests/headers/template_typedef_transitive_param.hpp b/tests/headers/template_typedef_transitive_param.hpp similarity index 100% rename from libbindgen/tests/headers/template_typedef_transitive_param.hpp rename to tests/headers/template_typedef_transitive_param.hpp diff --git a/libbindgen/tests/headers/template_typedefs.hpp b/tests/headers/template_typedefs.hpp similarity index 100% rename from libbindgen/tests/headers/template_typedefs.hpp rename to tests/headers/template_typedefs.hpp diff --git a/libbindgen/tests/headers/templateref_opaque.hpp b/tests/headers/templateref_opaque.hpp similarity index 100% rename from libbindgen/tests/headers/templateref_opaque.hpp rename to tests/headers/templateref_opaque.hpp diff --git a/libbindgen/tests/headers/type-referenced-by-whitelisted-function.h b/tests/headers/type-referenced-by-whitelisted-function.h similarity index 100% rename from libbindgen/tests/headers/type-referenced-by-whitelisted-function.h rename to tests/headers/type-referenced-by-whitelisted-function.h diff --git a/libbindgen/tests/headers/type_alias_empty.hpp b/tests/headers/type_alias_empty.hpp similarity index 100% rename from libbindgen/tests/headers/type_alias_empty.hpp rename to tests/headers/type_alias_empty.hpp diff --git a/libbindgen/tests/headers/type_alias_partial_template_especialization.hpp b/tests/headers/type_alias_partial_template_especialization.hpp similarity index 100% rename from libbindgen/tests/headers/type_alias_partial_template_especialization.hpp rename to tests/headers/type_alias_partial_template_especialization.hpp diff --git a/libbindgen/tests/headers/type_alias_template_specialized.hpp b/tests/headers/type_alias_template_specialized.hpp similarity index 100% rename from libbindgen/tests/headers/type_alias_template_specialized.hpp rename to tests/headers/type_alias_template_specialized.hpp diff --git a/libbindgen/tests/headers/typedefd-array-as-function-arg.h b/tests/headers/typedefd-array-as-function-arg.h similarity index 100% rename from libbindgen/tests/headers/typedefd-array-as-function-arg.h rename to tests/headers/typedefd-array-as-function-arg.h diff --git a/libbindgen/tests/headers/typeref.hpp b/tests/headers/typeref.hpp similarity index 100% rename from libbindgen/tests/headers/typeref.hpp rename to tests/headers/typeref.hpp diff --git a/libbindgen/tests/headers/union-in-ns.hpp b/tests/headers/union-in-ns.hpp similarity index 100% rename from libbindgen/tests/headers/union-in-ns.hpp rename to tests/headers/union-in-ns.hpp diff --git a/libbindgen/tests/headers/union_dtor.hpp b/tests/headers/union_dtor.hpp similarity index 100% rename from libbindgen/tests/headers/union_dtor.hpp rename to tests/headers/union_dtor.hpp diff --git a/libbindgen/tests/headers/union_fields.hpp b/tests/headers/union_fields.hpp similarity index 100% rename from libbindgen/tests/headers/union_fields.hpp rename to tests/headers/union_fields.hpp diff --git a/libbindgen/tests/headers/union_template.hpp b/tests/headers/union_template.hpp similarity index 100% rename from libbindgen/tests/headers/union_template.hpp rename to tests/headers/union_template.hpp diff --git a/libbindgen/tests/headers/union_with_anon_struct.h b/tests/headers/union_with_anon_struct.h similarity index 100% rename from libbindgen/tests/headers/union_with_anon_struct.h rename to tests/headers/union_with_anon_struct.h diff --git a/libbindgen/tests/headers/union_with_anon_struct_bitfield.h b/tests/headers/union_with_anon_struct_bitfield.h similarity index 100% rename from libbindgen/tests/headers/union_with_anon_struct_bitfield.h rename to tests/headers/union_with_anon_struct_bitfield.h diff --git a/libbindgen/tests/headers/union_with_anon_union.h b/tests/headers/union_with_anon_union.h similarity index 100% rename from libbindgen/tests/headers/union_with_anon_union.h rename to tests/headers/union_with_anon_union.h diff --git a/libbindgen/tests/headers/union_with_anon_unnamed_struct.h b/tests/headers/union_with_anon_unnamed_struct.h similarity index 100% rename from libbindgen/tests/headers/union_with_anon_unnamed_struct.h rename to tests/headers/union_with_anon_unnamed_struct.h diff --git a/libbindgen/tests/headers/union_with_anon_unnamed_union.h b/tests/headers/union_with_anon_unnamed_union.h similarity index 100% rename from libbindgen/tests/headers/union_with_anon_unnamed_union.h rename to tests/headers/union_with_anon_unnamed_union.h diff --git a/libbindgen/tests/headers/union_with_big_member.h b/tests/headers/union_with_big_member.h similarity index 100% rename from libbindgen/tests/headers/union_with_big_member.h rename to tests/headers/union_with_big_member.h diff --git a/libbindgen/tests/headers/union_with_nesting.h b/tests/headers/union_with_nesting.h similarity index 100% rename from libbindgen/tests/headers/union_with_nesting.h rename to tests/headers/union_with_nesting.h diff --git a/libbindgen/tests/headers/unknown_attr.h b/tests/headers/unknown_attr.h similarity index 100% rename from libbindgen/tests/headers/unknown_attr.h rename to tests/headers/unknown_attr.h diff --git a/libbindgen/tests/headers/use-core.h b/tests/headers/use-core.h similarity index 100% rename from libbindgen/tests/headers/use-core.h rename to tests/headers/use-core.h diff --git a/libbindgen/tests/headers/using.hpp b/tests/headers/using.hpp similarity index 100% rename from libbindgen/tests/headers/using.hpp rename to tests/headers/using.hpp diff --git a/libbindgen/tests/headers/var-tracing.hpp b/tests/headers/var-tracing.hpp similarity index 100% rename from libbindgen/tests/headers/var-tracing.hpp rename to tests/headers/var-tracing.hpp diff --git a/libbindgen/tests/headers/variadic-method.hpp b/tests/headers/variadic-method.hpp similarity index 100% rename from libbindgen/tests/headers/variadic-method.hpp rename to tests/headers/variadic-method.hpp diff --git a/libbindgen/tests/headers/variadic_template_function.hpp b/tests/headers/variadic_template_function.hpp similarity index 100% rename from libbindgen/tests/headers/variadic_template_function.hpp rename to tests/headers/variadic_template_function.hpp diff --git a/libbindgen/tests/headers/vector.hpp b/tests/headers/vector.hpp similarity index 100% rename from libbindgen/tests/headers/vector.hpp rename to tests/headers/vector.hpp diff --git a/libbindgen/tests/headers/virtual_dtor.hpp b/tests/headers/virtual_dtor.hpp similarity index 100% rename from libbindgen/tests/headers/virtual_dtor.hpp rename to tests/headers/virtual_dtor.hpp diff --git a/libbindgen/tests/headers/virtual_inheritance.hpp b/tests/headers/virtual_inheritance.hpp similarity index 100% rename from libbindgen/tests/headers/virtual_inheritance.hpp rename to tests/headers/virtual_inheritance.hpp diff --git a/libbindgen/tests/headers/virtual_overloaded.hpp b/tests/headers/virtual_overloaded.hpp similarity index 100% rename from libbindgen/tests/headers/virtual_overloaded.hpp rename to tests/headers/virtual_overloaded.hpp diff --git a/libbindgen/tests/headers/vtable_recursive_sig.hpp b/tests/headers/vtable_recursive_sig.hpp similarity index 100% rename from libbindgen/tests/headers/vtable_recursive_sig.hpp rename to tests/headers/vtable_recursive_sig.hpp diff --git a/libbindgen/tests/headers/weird_bitfields.hpp b/tests/headers/weird_bitfields.hpp similarity index 100% rename from libbindgen/tests/headers/weird_bitfields.hpp rename to tests/headers/weird_bitfields.hpp diff --git a/libbindgen/tests/headers/what_is_going_on.hpp b/tests/headers/what_is_going_on.hpp similarity index 100% rename from libbindgen/tests/headers/what_is_going_on.hpp rename to tests/headers/what_is_going_on.hpp diff --git a/libbindgen/tests/headers/whitelist-namespaces-basic.hpp b/tests/headers/whitelist-namespaces-basic.hpp similarity index 100% rename from libbindgen/tests/headers/whitelist-namespaces-basic.hpp rename to tests/headers/whitelist-namespaces-basic.hpp diff --git a/libbindgen/tests/headers/whitelist-namespaces.hpp b/tests/headers/whitelist-namespaces.hpp similarity index 100% rename from libbindgen/tests/headers/whitelist-namespaces.hpp rename to tests/headers/whitelist-namespaces.hpp diff --git a/libbindgen/tests/headers/whitelist_basic.hpp b/tests/headers/whitelist_basic.hpp similarity index 100% rename from libbindgen/tests/headers/whitelist_basic.hpp rename to tests/headers/whitelist_basic.hpp diff --git a/libbindgen/tests/headers/whitelist_fix.hpp b/tests/headers/whitelist_fix.hpp similarity index 100% rename from libbindgen/tests/headers/whitelist_fix.hpp rename to tests/headers/whitelist_fix.hpp diff --git a/libbindgen/tests/headers/whitelist_vars.h b/tests/headers/whitelist_vars.h similarity index 100% rename from libbindgen/tests/headers/whitelist_vars.h rename to tests/headers/whitelist_vars.h diff --git a/libbindgen/tests/tests.rs b/tests/tests.rs similarity index 95% rename from libbindgen/tests/tests.rs rename to tests/tests.rs index 014308794f..05c8ad2c73 100644 --- a/libbindgen/tests/tests.rs +++ b/tests/tests.rs @@ -1,18 +1,19 @@ extern crate clap; extern crate diff; -extern crate libbindgen; +extern crate bindgen; extern crate shlex; +use bindgen::Builder; use std::fs; use std::io::{BufRead, BufReader, Error, ErrorKind, Read, Write}; use std::path::PathBuf; -#[path="../../bindgen/src/options.rs"] +#[path="../src/options.rs"] mod options; use options::builder_from_flags; fn compare_generated_header(header: &PathBuf, - builder: libbindgen::Builder) + builder: Builder) -> Result<(), Error> { let file_name = try!(header.file_name() .ok_or(Error::new(ErrorKind::Other, "spawn_bindgen expects a file"))); @@ -68,7 +69,7 @@ fn compare_generated_header(header: &PathBuf, } fn create_bindgen_builder(header: &PathBuf) - -> Result, Error> { + -> Result, Error> { let source = try!(fs::File::open(header)); let reader = BufReader::new(source); diff --git a/libbindgen/tests/uses/.gitignore b/tests/uses/.gitignore similarity index 100% rename from libbindgen/tests/uses/.gitignore rename to tests/uses/.gitignore From aad93a81bb2ceeeeffc94c856a6d0d37c5ac6aec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 22 Jan 2017 19:00:22 +0100 Subject: [PATCH 0240/2291] Breaking version bump. --- Cargo.toml | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d8c7131974..2187a1964a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ license = "BSD-3-Clause" name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" -version = "0.1.7" +version = "0.20.0" build = "build.rs" [lib] diff --git a/README.md b/README.md index 0f7247c4dc..2f36d11583 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ In `Cargo.toml`: build = "build.rs" [build-dependencies] -bindgen = "0.1" +bindgen = "0.20" ``` In `build.rs`: From 2934b77ac1048a999befee0da7683918375af3ee Mon Sep 17 00:00:00 2001 From: Yamakaky Date: Mon, 23 Jan 2017 10:29:41 -0500 Subject: [PATCH 0241/2291] Improve crate metadata. --- Cargo.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 2187a1964a..dd88c5fb6c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,15 +5,19 @@ authors = [ "The Servo project developers", ] description = "A binding generator for Rust" -homepage = "https://github.com/servo/rust-bindgen" keywords = ["bindings", "ffi", "code-generation"] +categories = ["external-ffi-bindings"] license = "BSD-3-Clause" name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" +documentation = "https://docs.rs/bindgen" version = "0.20.0" build = "build.rs" +[badges] +travis-ci = { repository = "servo/rust-bindgen" } + [lib] path = "src/lib.rs" From eba4f310541141e2c5cfd749976f80574c4f6b8e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 20 Jan 2017 14:00:43 -0800 Subject: [PATCH 0242/2291] Trace methods in CompInfo's TypeCollector impl Fixes #410 --- .../tests/expectations/tests/issue-410.rs | 41 +++++++++++++++++++ libbindgen/tests/headers/issue-410.hpp | 12 ++++++ src/ir/comp.rs | 6 ++- 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 libbindgen/tests/expectations/tests/issue-410.rs create mode 100644 libbindgen/tests/headers/issue-410.hpp diff --git a/libbindgen/tests/expectations/tests/issue-410.rs b/libbindgen/tests/expectations/tests/issue-410.rs new file mode 100644 index 0000000000..a5d9496039 --- /dev/null +++ b/libbindgen/tests/expectations/tests/issue-410.rs @@ -0,0 +1,41 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use self::super::root; + pub mod JS { + #[allow(unused_imports)] + use self::super::super::root; + pub use root::_bindgen_ty_1 as JSWhyMagic; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct Value { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_Value() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); + } + extern "C" { + #[link_name = "_ZN2JS5Value1aE10JSWhyMagic"] + pub fn Value_a(this: *mut root::JS::Value, + arg1: root::JS::JSWhyMagic); + } + impl Clone for Value { + fn clone(&self) -> Self { *self } + } + impl Value { + #[inline] + pub unsafe fn a(&mut self, arg1: root::JS::JSWhyMagic) { + Value_a(&mut *self, arg1) + } + } + } + #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] + pub enum _bindgen_ty_1 { } +} diff --git a/libbindgen/tests/headers/issue-410.hpp b/libbindgen/tests/headers/issue-410.hpp new file mode 100644 index 0000000000..a7a834cfc4 --- /dev/null +++ b/libbindgen/tests/headers/issue-410.hpp @@ -0,0 +1,12 @@ +// bindgen-flags: --enable-cxx-namespaces --whitelist-type JS::Value + +namespace JS { +class Value; +} +typedef enum {} JSWhyMagic; +namespace JS { +class Value { +public: + void a(JSWhyMagic); +}; +} diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 968bf87987..27b2fe4e14 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -957,6 +957,10 @@ impl TypeCollector for CompInfo { types.insert(var); } - // FIXME(emilio): Methods, VTable? + for method in self.methods() { + types.insert(method.signature); + } + + // FIXME(emilio): VTable? } } From 5229dc2f1dba07673138b2bafd40f3ea022fa0ba Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 20 Jan 2017 14:14:23 -0800 Subject: [PATCH 0243/2291] Document why we shouldn't be tracing module -> child edges --- src/ir/item.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ir/item.rs b/src/ir/item.rs index df8fd22280..ac2d122e4e 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -205,7 +205,12 @@ impl TypeCollector for Item { ItemKind::Var(ref var) => { types.insert(var.ty()); } - _ => {} // FIXME. + ItemKind::Module(_) => { + // Module -> children edges are "weak", and we do not want to + // trace them. If we did, then whitelisting wouldn't work as + // expected: everything in every module would end up + // whitelisted. + } } } } From f347ce2ddc7f18a05205b8243ac5d0a61b69f9f1 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 20 Jan 2017 14:21:54 -0800 Subject: [PATCH 0244/2291] Trace all variants of TypeKind --- src/ir/ty.rs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index c1ed5b6466..1e87beb466 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -914,13 +914,24 @@ impl TypeCollector for Type { TypeKind::Function(ref sig) => { sig.collect_types(context, types, item) } - TypeKind::Named(_) => {} - // FIXME: Pending types! - ref other @ _ => { - debug!("::collect_types: Ignoring: \ - {:?}", - other); + TypeKind::Enum(ref en) => { + if let Some(repr) = en.repr() { + types.insert(repr); + } + } + TypeKind::UnresolvedTypeRef(_, _, Some(id)) => { + types.insert(id); } + + // None of these variants have edges to other items and types. + TypeKind::UnresolvedTypeRef(_, _, None) | + TypeKind::Named(_) | + TypeKind::Void | + TypeKind::NullPtr | + TypeKind::Int(_) | + TypeKind::Float(_) | + TypeKind::Complex(_) | + TypeKind::BlockPointer => {} } } } From 5c7030903774bdde07934718f6b184ff9db2c6de Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 23 Jan 2017 10:13:18 -0800 Subject: [PATCH 0245/2291] Move new test files out of libbindgen --- .../tests => tests}/expectations/tests/16-byte-alignment.rs | 0 {libbindgen/tests => tests}/expectations/tests/issue-410.rs | 0 {libbindgen/tests => tests}/headers/16-byte-alignment.h | 0 {libbindgen/tests => tests}/headers/issue-410.hpp | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {libbindgen/tests => tests}/expectations/tests/16-byte-alignment.rs (100%) rename {libbindgen/tests => tests}/expectations/tests/issue-410.rs (100%) rename {libbindgen/tests => tests}/headers/16-byte-alignment.h (100%) rename {libbindgen/tests => tests}/headers/issue-410.hpp (100%) diff --git a/libbindgen/tests/expectations/tests/16-byte-alignment.rs b/tests/expectations/tests/16-byte-alignment.rs similarity index 100% rename from libbindgen/tests/expectations/tests/16-byte-alignment.rs rename to tests/expectations/tests/16-byte-alignment.rs diff --git a/libbindgen/tests/expectations/tests/issue-410.rs b/tests/expectations/tests/issue-410.rs similarity index 100% rename from libbindgen/tests/expectations/tests/issue-410.rs rename to tests/expectations/tests/issue-410.rs diff --git a/libbindgen/tests/headers/16-byte-alignment.h b/tests/headers/16-byte-alignment.h similarity index 100% rename from libbindgen/tests/headers/16-byte-alignment.h rename to tests/headers/16-byte-alignment.h diff --git a/libbindgen/tests/headers/issue-410.hpp b/tests/headers/issue-410.hpp similarity index 100% rename from libbindgen/tests/headers/issue-410.hpp rename to tests/headers/issue-410.hpp From 93dd68f682933a825aa2c3c9396d61e93da40b64 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 23 Jan 2017 10:14:05 -0800 Subject: [PATCH 0246/2291] Remove now unnecessary FIXME We trace all things in the vtable via tracing the base types. --- src/ir/comp.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 27b2fe4e14..ac68b672b3 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -960,7 +960,5 @@ impl TypeCollector for CompInfo { for method in self.methods() { types.insert(method.signature); } - - // FIXME(emilio): VTable? } } From 1fdc79adc83dc795e5e4cc89fe934b7518328d9d Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 23 Jan 2017 10:19:40 -0800 Subject: [PATCH 0247/2291] Re-run doctoc to update README's table of contents --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 2f36d11583..8cd2d96e20 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,6 @@ Automatically generates Rust FFI bindings to C and C++ libraries. - [`hide`](#hide) - [`replaces`](#replaces) - [`nocopy`](#nocopy) -- [Building From Source](#building-from-source) From de914f0eb90445e55cb11dc5329ea4c5f060bcec Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 23 Jan 2017 10:39:34 -0800 Subject: [PATCH 0248/2291] Update Cargo.toml metadata * Use the description from the README, it's a better description. * Add the "development-tools::ffi" category. * Add myself as an author ;) --- Cargo.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index dd88c5fb6c..bf8532633c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,11 +2,12 @@ authors = [ "Jyun-Yan You ", "Emilio Cobos Álvarez ", + "Nick Fitzgerald ", "The Servo project developers", ] -description = "A binding generator for Rust" +description = "Automatically generates Rust FFI bindings to C and C++ libraries." keywords = ["bindings", "ffi", "code-generation"] -categories = ["external-ffi-bindings"] +categories = ["external-ffi-bindings", "development-tools::ffi"] license = "BSD-3-Clause" name = "bindgen" readme = "README.md" From 09cca13cbcbe7d118fcd6cf6b651b4ea0279c584 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 23 Jan 2017 10:43:04 -0800 Subject: [PATCH 0249/2291] Update build instructions We don't need to separately build the library and the executable anymore. --- CONTRIBUTING.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d30df68dbe..cfcee653bb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,19 +42,12 @@ issue, provide us with: ## Building -To build `bindgen`: +To build the `bindgen` library and the `bindgen` executable: ``` $ cargo build ``` -To build the `bindgen` executable: - -``` -$ cd bindgen/bindgen -$ cargo build -``` - If you installed multiple versions of llvm, it may not be able to locate the latest version of libclang. In that case, you may want to either uninstall other versions of llvm, or specify the path of the desired libclang explicitly: From 287c56011183d80a79334ea48d71b4c88f39bcec Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 23 Jan 2017 10:50:46 -0800 Subject: [PATCH 0250/2291] Recommend using `bindgen` with build.rs in the README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2f36d11583..c416489b90 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,8 @@ Those instructions list optional steps. For bindgen: ### Library usage with `build.rs` +💡 This is the recommended way to use `bindgen`. 💡 + #### `build.rs` Tutorial [Here is a step-by-step tutorial for generating FFI bindings to the `bzip2` C library.][tutorial] From 28a3784b778e5d10ce492d8434aa7b489615452d Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 23 Jan 2017 10:57:22 -0800 Subject: [PATCH 0251/2291] Expand documentation about C++ bindings generation --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c416489b90..9ef2f6e8a5 100644 --- a/README.md +++ b/README.md @@ -156,11 +156,23 @@ There are a few options documented when running `./bindgen --help`. ### C++ -This fork of rust-bindgen can handle a number of C++ features. +`bindgen` can handle most C++ features, but not all of them (C++ is hard!) + +Notable C++ features that are unsupported or only partially supported: + +* Partial template specialization +* Traits templates +* SFINAE +* Instantiating new template specializations When passing in header files, the file will automatically be treated as C++ if it ends in ``.hpp``. If it doesn't, ``-x c++`` can be used to force C++ mode. +You must use whitelisting when working with C++ to avoid pulling in all of the +`std::*` types, some of which `bindgen` cannot handle. Additionally, you may +want to blacklist other types that `bindgen` stumbles on, or make `bindgen` +treat certain types as opaque. + ### Annotations The translation of classes, structs, enums, and typedefs can be adjusted using From 56d49379f4ae378459fcaac1a47333cc9b6cfa1b Mon Sep 17 00:00:00 2001 From: Alexander Altman Date: Mon, 23 Jan 2017 12:26:23 -0800 Subject: [PATCH 0252/2291] Add missing highlighting language annotation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 545c917b4c..f0104fc9c9 100644 --- a/README.md +++ b/README.md @@ -192,7 +192,7 @@ a struct/class. The `hide` annotation instructs bindgen to ignore the struct/class/field/enum completely. -``` +```cpp ///
``` From 14f95379efbceddf055d7000db3698353a6c99b2 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 23 Jan 2017 17:52:45 -0500 Subject: [PATCH 0253/2291] Add Cargo.lock file --- .gitignore | 1 - Cargo.lock | 533 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 533 insertions(+), 1 deletion(-) create mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index 049fbc4aa6..12b6e6a6dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ # Cargo target/ -Cargo.lock *~ #*# diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000000..27f549152a --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,533 @@ +[root] +name = "bindgen" +version = "0.20.0" +dependencies = [ + "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "clang-sys 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.19.3 (registry+https://github.com/rust-lang/crates.io-index)", + "diff 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quasi 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quasi_codegen 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "aho-corasick" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ansi_term" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "aster" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "syntex_syntax 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "aster" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bitflags" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cexpr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cfg-if" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "clang-sys" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "libloading 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "clap" +version = "2.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "term_size 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "vec_map 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "diff" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "dtoa" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "env_logger" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "glob" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "itoa" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lazy_static" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "libc" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "libloading" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "target_build_utils 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "log" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "memchr" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "nom" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "num-traits" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "phf" +version = "0.7.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_codegen" +version = "0.7.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_generator" +version = "0.7.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_shared" +version = "0.7.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "siphasher 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quasi" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quasi_codegen" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aster 0.34.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_errors 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rustc-serialize" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "serde" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "serde_json" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "shlex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "siphasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "strsim" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "syntex" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "syntex_errors 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "syntex_errors" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_pos 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "syntex_errors" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "syntex_pos" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "syntex_pos" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "syntex_syntax" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_errors 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_pos 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "syntex_syntax" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "target_build_utils" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "term" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "term_size" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thread-id" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thread_local" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-segmentation" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicode-width" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicode-xid" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicode-xid" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unreachable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "utf8-ranges" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "vec_map" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum aho-corasick 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f660b942762979b56c9f07b4b36bb559776fbad102f05d6771e1b629e8fd5bf" +"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" +"checksum aster 0.34.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88bb8ecdf6a7eaddb7bfd872ebf5e085d343ca42ce98c582dba8046e3450b524" +"checksum aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2c9b49e42a449c0b79d8acb91db37621de0978064dca7d3288ddcf030123e5b3" +"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" +"checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d" +"checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c" +"checksum clang-sys 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "822ea22bbbef9f5934e9477860545fb0311a1759e43a276de42e2856c605aa2b" +"checksum clap 2.19.3 (registry+https://github.com/rust-lang/crates.io-index)" = "95b78f3fe0fc94c13c731714363260e04b557a637166f33a4570d3189d642374" +"checksum diff 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e48977eec6d3b7707462c2dc2e1363ad91b5dd822cf942537ccdc2085dc87587" +"checksum dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0dd841b58510c9618291ffa448da2e4e0f699d984d436122372f446dae62263d" +"checksum env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "99971fb1b635fe7a0ee3c4d065845bb93cca80a23b5613b5613391ece5de4144" +"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" +"checksum itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3088ea4baeceb0284ee9eea42f591226e6beaecf65373e41b38d95a1b8e7a1" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6abe0ee2e758cd6bc8a2cd56726359007748fbf4128da998b65d0b70f881e19b" +"checksum libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)" = "684f330624d8c3784fb9558ca46c4ce488073a8d22450415c5eb4f4cfb0d11b5" +"checksum libloading 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "84816a8c6ed8163dfe0dbdd2b09d35c6723270ea77a4c7afa4bedf038a36cb99" +"checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054" +"checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4" +"checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce" +"checksum num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "a16a42856a256b39c6d3484f097f6713e14feacd9bfb02290917904fae46c81c" +"checksum phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "cb325642290f28ee14d8c6201159949a872f220c62af6e110a56ea914fbe42fc" +"checksum phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d62594c0bb54c464f633175d502038177e90309daf2e0158be42ed5f023ce88f" +"checksum phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "6b07ffcc532ccc85e3afc45865469bf5d9e4ef5bfcf9622e3cfe80c2d275ec03" +"checksum phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "07e24b0ca9643bdecd0632f2b3da6b1b89bbb0030e0b992afc1113b23a7bc2f2" +"checksum quasi 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dcbf815446dc6a0afbc72d88f9a8aa71b608d10b168e09437c80c0fd6fd410c9" +"checksum quasi_codegen 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d52e5e2c92ffdad67a9b86ad27ad999bf1a652723f1d4cc93b7cf6c272b5f8e0" +"checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d" +"checksum regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4278c17d0f6d62dfef0ab00028feb45bd7d2102843f80763474eeb1be8a10c01" +"checksum regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9191b1f57603095f105d317e375d19b1c9c5c3185ea9633a99a6dcbed04457" +"checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b" +"checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" +"checksum serde_json 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "67f7d2e9edc3523a9c8ec8cd6ec481b3a27810aafee3e625d311febd3e656b4c" +"checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" +"checksum siphasher 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3922130881aed4b3ee4549cd586eaf4d272544021656e084d626cccbae7fb338" +"checksum strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "67f84c44fbb2f91db7fef94554e6b2ac05909c9c0b0bc23bb98d3a1aebfe7f7c" +"checksum syntex 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bd253b0d7d787723a33384d426f0ebec7f8edccfaeb2022d0177162bb134da0" +"checksum syntex_errors 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "84822a1178204a191239ad844599f8c85c128cf9f4173397def4eb46b55b0aa1" +"checksum syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dee2f6e49c075f71332bb775219d5982bee6732d26227fa1ae1b53cdb12f5cc5" +"checksum syntex_pos 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a43abded5057c75bac8555e46ec913ce502efb418267b1ab8e9783897470c7db" +"checksum syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df3921c7945dfb9ffc53aa35adb2cf4313b5ab5f079c3619b3d4eb82a0efc2b" +"checksum syntex_syntax 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ef781e4b60f03431f1b5b59843546ce60ae029a787770cf8e0969ac1fd063a5" +"checksum syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc960085bae44591e22d01f6c0e82a8aec832f8659aca556cdf8ecbdac2bb47b" +"checksum target_build_utils 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54c550e226618cd35334b75e92bfa5437c61474bdb75c38bf330ab5a8037b77c" +"checksum term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3deff8a2b3b6607d6d7cc32ac25c0b33709453ca9cceac006caac51e963cf94a" +"checksum term_size 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f7f5f3f71b0040cecc71af239414c23fd3c73570f5ff54cf50e03cef637f2a0" +"checksum thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4437c97558c70d129e40629a5b385b3fb1ffac301e63941335e4d354081ec14a" +"checksum thread_local 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7793b722f0f77ce716e7f1acf416359ca32ff24d04ffbac4269f44a4a83be05d" +"checksum unicode-segmentation 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c3bc443ded17b11305ffffe6b37e2076f328a5a8cb6aa877b1b98f77699e98b5" +"checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" +"checksum unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "36dff09cafb4ec7c8cf0023eb0b686cb6ce65499116a12201c9e11840ca01beb" +"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" +"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" +"checksum vec_map 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cac5efe5cb0fa14ec2f84f83c701c562ee63f6dcc680861b21d65c682adfb05f" +"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" From 90d440443520287e74a61644b806697814a72007 Mon Sep 17 00:00:00 2001 From: jethrogb Date: Tue, 24 Jan 2017 00:51:19 -0800 Subject: [PATCH 0254/2291] Minor documentation changes --- src/lib.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 60b750de24..88da1a4866 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -182,41 +182,41 @@ impl Builder { self } - /// Hide the given type from the generated bindings. + /// Hide the given type from the generated bindings. Regular expressions are supported. pub fn hide_type>(mut self, arg: T) -> Builder { self.options.hidden_types.insert(arg); self } - /// Treat the given type as opaque in the generated bindings. + /// Treat the given type as opaque in the generated bindings. Regular expressions are supported. pub fn opaque_type>(mut self, arg: T) -> Builder { self.options.opaque_types.insert(arg); self } /// Whitelist the given type so that it (and all types that it transitively - /// refers to) appears in the generated bindings. + /// refers to) appears in the generated bindings. Regular expressions are supported. pub fn whitelisted_type>(mut self, arg: T) -> Builder { self.options.whitelisted_types.insert(arg); self } /// Whitelist the given function so that it (and all types that it - /// transitively refers to) appears in the generated bindings. + /// transitively refers to) appears in the generated bindings. Regular expressions are supported. pub fn whitelisted_function>(mut self, arg: T) -> Builder { self.options.whitelisted_functions.insert(arg); self } /// Whitelist the given variable so that it (and all types that it - /// transitively refers to) appears in the generated bindings. + /// transitively refers to) appears in the generated bindings. Regular expressions are supported. pub fn whitelisted_var>(mut self, arg: T) -> Builder { self.options.whitelisted_vars.insert(arg); self } /// Mark the given enum (or set of enums, if using a pattern) as being - /// bitfield-like. + /// bitfield-like. Regular expressions are supported. /// /// This makes bindgen generate a type that isn't a rust `enum`. pub fn bitfield_enum>(mut self, arg: T) -> Builder { @@ -350,7 +350,7 @@ impl Builder { self } - /// Avoid generating any unstable Rust in the generated bindings. + /// Avoid generating any unstable Rust, such as Rust unions, in the generated bindings. pub fn no_unstable_rust(mut self) -> Builder { self.options.unstable_rust = false; self From c6a9b3b9fa4abfc4801d83162a6405ec32571d18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 24 Jan 2017 09:58:58 +0100 Subject: [PATCH 0255/2291] codegen: Fix typedef re-export in namespaces when bindings aren't at the root. --- .gitignore | 1 + bindgen-integration/build.rs | 2 ++ bindgen-integration/cpp/Test.h | 6 ++++++ src/codegen/mod.rs | 10 ++++------ tests/expectations/tests/issue-410.rs | 2 +- tests/expectations/tests/reparented_replacement.rs | 2 +- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 12b6e6a6dc..7c2aef6614 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # Cargo target/ *~ +./bindgen-integration/Cargo.lock #*# diff --git a/bindgen-integration/build.rs b/bindgen-integration/build.rs index 2c18c94a44..9b157c5aab 100644 --- a/bindgen-integration/build.rs +++ b/bindgen-integration/build.rs @@ -13,6 +13,8 @@ fn main() { let bindings = Builder::default() .no_unstable_rust() + .enable_cxx_namespaces() + .raw_line("pub use self::root::*;") .header("cpp/Test.h") .clang_arg("-x") .clang_arg("c++") diff --git a/bindgen-integration/cpp/Test.h b/bindgen-integration/cpp/Test.h index ebd58649e8..f1e38c40f6 100644 --- a/bindgen-integration/cpp/Test.h +++ b/bindgen-integration/cpp/Test.h @@ -9,4 +9,10 @@ class Test { Test(double foo); }; +namespace testing { + typedef Test TypeAlias; + +} // namespace testing + +typedef testing::TypeAlias TypeAlias; diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 7451dd1120..0385b56d38 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -539,12 +539,10 @@ impl CodeGenerator for Type { }; let typedef = if let Some(mut p) = simple_enum_path { - if p.segments.len() == 1 { - p.segments.insert(0, ast::PathSegment { - identifier: ctx.ext_cx().ident_of("self"), - parameters: None, - }); - } + p.segments.insert(0, ast::PathSegment { + identifier: ctx.ext_cx().ident_of("self"), + parameters: None, + }); typedef.use_().build(p).as_(rust_name) } else { let mut generics = typedef.type_(rust_name).generics(); diff --git a/tests/expectations/tests/issue-410.rs b/tests/expectations/tests/issue-410.rs index a5d9496039..570e88baf7 100644 --- a/tests/expectations/tests/issue-410.rs +++ b/tests/expectations/tests/issue-410.rs @@ -10,7 +10,7 @@ pub mod root { pub mod JS { #[allow(unused_imports)] use self::super::super::root; - pub use root::_bindgen_ty_1 as JSWhyMagic; + pub use self::root::_bindgen_ty_1 as JSWhyMagic; #[repr(C)] #[derive(Debug, Copy)] pub struct Value { diff --git a/tests/expectations/tests/reparented_replacement.rs b/tests/expectations/tests/reparented_replacement.rs index e8ccc9315b..a50a446d33 100644 --- a/tests/expectations/tests/reparented_replacement.rs +++ b/tests/expectations/tests/reparented_replacement.rs @@ -25,5 +25,5 @@ pub mod root { fn clone(&self) -> Self { *self } } } - pub use root::foo::Bar as ReferencesBar; + pub use self::root::foo::Bar as ReferencesBar; } From f804f9eb6fcd7caf032b337c448e7314d3247664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 24 Jan 2017 11:31:18 +0100 Subject: [PATCH 0256/2291] codegen: Factor out some bits of root_import. --- src/codegen/mod.rs | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 0385b56d38..578a8d0c74 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -23,7 +23,6 @@ use std::cell::Cell; use std::collections::{HashSet, VecDeque}; use std::collections::hash_map::{Entry, HashMap}; use std::fmt::Write; -use std::iter; use std::mem; use std::ops; use syntax::abi::Abi; @@ -31,28 +30,40 @@ use syntax::ast; use syntax::codemap::{Span, respan}; use syntax::ptr::P; -fn root_import(ctx: &BindgenContext, module: &Item) -> P { - assert!(ctx.options().enable_cxx_namespaces, "Somebody messed it up"); - assert!(module.is_module()); +fn root_import_depth(ctx: &BindgenContext, item: &Item) -> usize { + if !ctx.options().enable_cxx_namespaces { + return 0; + } + + item.ancestors(ctx) + .filter(|id| ctx.resolve_item(*id).is_module()) + .fold(1, |i, _| i + 1) +} + +fn top_level_module_path(ctx: &BindgenContext, item: &Item) -> Vec { + let mut path = vec![ctx.rust_ident_raw("self")]; + + let super_ = ctx.rust_ident_raw("super"); + + for _ in 0..root_import_depth(ctx, item) { + path.push(super_.clone()); + } let root = ctx.root_module().canonical_name(ctx); let root_ident = ctx.rust_ident(&root); - let super_ = aster::AstBuilder::new().id("super"); - let supers = module.ancestors(ctx) - .filter(|id| ctx.resolve_item(*id).is_module()) - .map(|_| super_.clone()) - .chain(iter::once(super_)); - - let self_ = iter::once(aster::AstBuilder::new().id("self")); - let root_ident = iter::once(root_ident); + path.push(root_ident); + path +} - let path = self_.chain(supers).chain(root_ident); +fn root_import(ctx: &BindgenContext, module: &Item) -> P { + assert!(ctx.options().enable_cxx_namespaces, "Somebody messed it up"); + assert!(module.is_module()); let use_root = aster::AstBuilder::new() .item() .use_() - .ids(path) + .ids(top_level_module_path(ctx, module)) .build() .build(); From 15630c6562d8a1f2f95169a09344ef6e2becd56c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 24 Jan 2017 11:51:34 +0100 Subject: [PATCH 0257/2291] Make it work in rust stable, and incidentally fix #425 The problem with #425 was the following: We were parsing the methods after reaching the JS::Value definition. Those methods contained a JSWhyMagic that we hadn't seen, so we parsed it as being in the JS:: module. --- src/codegen/mod.rs | 32 +++++++++++-------- src/ir/function.rs | 8 ++--- tests/expectations/tests/issue-410.rs | 6 ++-- .../tests/reparented_replacement.rs | 2 +- tests/expectations/tests/template.rs | 14 ++++---- 5 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 578a8d0c74..45a7b1b777 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -40,19 +40,17 @@ fn root_import_depth(ctx: &BindgenContext, item: &Item) -> usize { .fold(1, |i, _| i + 1) } -fn top_level_module_path(ctx: &BindgenContext, item: &Item) -> Vec { +fn top_level_path(ctx: &BindgenContext, item: &Item) -> Vec { let mut path = vec![ctx.rust_ident_raw("self")]; - let super_ = ctx.rust_ident_raw("super"); + if ctx.options().enable_cxx_namespaces { + let super_ = ctx.rust_ident_raw("super"); - for _ in 0..root_import_depth(ctx, item) { - path.push(super_.clone()); + for _ in 0..root_import_depth(ctx, item) { + path.push(super_.clone()); + } } - let root = ctx.root_module().canonical_name(ctx); - let root_ident = ctx.rust_ident(&root); - - path.push(root_ident); path } @@ -60,10 +58,16 @@ fn root_import(ctx: &BindgenContext, module: &Item) -> P { assert!(ctx.options().enable_cxx_namespaces, "Somebody messed it up"); assert!(module.is_module()); + let mut path = top_level_path(ctx, module); + + let root = ctx.root_module().canonical_name(ctx); + let root_ident = ctx.rust_ident(&root); + path.push(root_ident); + let use_root = aster::AstBuilder::new() .item() .use_() - .ids(top_level_module_path(ctx, module)) + .ids(path) .build() .build(); @@ -550,10 +554,12 @@ impl CodeGenerator for Type { }; let typedef = if let Some(mut p) = simple_enum_path { - p.segments.insert(0, ast::PathSegment { - identifier: ctx.ext_cx().ident_of("self"), - parameters: None, - }); + for ident in top_level_path(ctx, item).into_iter().rev() { + p.segments.insert(0, ast::PathSegment { + identifier: ident, + parameters: None, + }); + } typedef.use_().build(p).as_(rust_name) } else { let mut generics = typedef.type_(rust_name).generics(); diff --git a/src/ir/function.rs b/src/ir/function.rs index 50c442db10..6e205f1b0f 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -165,8 +165,7 @@ impl FunctionSig { let name = arg.spelling(); let name = if name.is_empty() { None } else { Some(name) }; - let ty = Item::from_ty(&arg_ty, Some(*arg), None, ctx) - .expect("Argument?"); + let ty = Item::from_ty_or_ref(arg_ty, Some(*arg), None, ctx); (name, ty) }) .collect() @@ -178,8 +177,7 @@ impl FunctionSig { cursor.visit(|c| { if c.kind() == CXCursor_ParmDecl { let ty = - Item::from_ty(&c.cur_type(), Some(c), None, ctx) - .expect("ParmDecl?"); + Item::from_ty_or_ref(c.cur_type(), Some(c), None, ctx); let name = c.spelling(); let name = if name.is_empty() { None } else { Some(name) }; @@ -218,7 +216,7 @@ impl FunctionSig { } let ty_ret_type = try!(ty.ret_type().ok_or(ParseError::Continue)); - let ret = try!(Item::from_ty(&ty_ret_type, None, None, ctx)); + let ret = Item::from_ty_or_ref(ty_ret_type, None, None, ctx); let abi = get_abi(ty.call_conv()); Ok(Self::new(ret, args, ty.is_variadic(), abi)) diff --git a/tests/expectations/tests/issue-410.rs b/tests/expectations/tests/issue-410.rs index 570e88baf7..0c91e2b7de 100644 --- a/tests/expectations/tests/issue-410.rs +++ b/tests/expectations/tests/issue-410.rs @@ -10,7 +10,6 @@ pub mod root { pub mod JS { #[allow(unused_imports)] use self::super::super::root; - pub use self::root::_bindgen_ty_1 as JSWhyMagic; #[repr(C)] #[derive(Debug, Copy)] pub struct Value { @@ -24,18 +23,19 @@ pub mod root { extern "C" { #[link_name = "_ZN2JS5Value1aE10JSWhyMagic"] pub fn Value_a(this: *mut root::JS::Value, - arg1: root::JS::JSWhyMagic); + arg1: root::JSWhyMagic); } impl Clone for Value { fn clone(&self) -> Self { *self } } impl Value { #[inline] - pub unsafe fn a(&mut self, arg1: root::JS::JSWhyMagic) { + pub unsafe fn a(&mut self, arg1: root::JSWhyMagic) { Value_a(&mut *self, arg1) } } } #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum _bindgen_ty_1 { } + pub use self::super::root::_bindgen_ty_1 as JSWhyMagic; } diff --git a/tests/expectations/tests/reparented_replacement.rs b/tests/expectations/tests/reparented_replacement.rs index a50a446d33..684c75ed9c 100644 --- a/tests/expectations/tests/reparented_replacement.rs +++ b/tests/expectations/tests/reparented_replacement.rs @@ -25,5 +25,5 @@ pub mod root { fn clone(&self) -> Self { *self } } } - pub use self::root::foo::Bar as ReferencesBar; + pub use self::super::root::foo::Bar as ReferencesBar; } diff --git a/tests/expectations/tests/template.rs b/tests/expectations/tests/template.rs index 5864ac73dd..22e5a08774 100644 --- a/tests/expectations/tests/template.rs +++ b/tests/expectations/tests/template.rs @@ -12,13 +12,6 @@ pub struct Foo { pub m_member_arr: [T; 1usize], pub _phantom_1: ::std::marker::PhantomData, } -#[test] -fn __bindgen_test_layout_template_1() { - assert_eq!(::std::mem::size_of::>() - , 24usize); - assert_eq!(::std::mem::align_of::>() - , 8usize); -} extern "C" { #[link_name = "_Z3bar3FooIiiE"] pub fn bar(foo: Foo<::std::os::raw::c_int, ::std::os::raw::c_int>); @@ -176,6 +169,13 @@ pub struct TemplateWithVar { pub _phantom_0: ::std::marker::PhantomData, } #[test] +fn __bindgen_test_layout_template_1() { + assert_eq!(::std::mem::size_of::>() + , 24usize); + assert_eq!(::std::mem::align_of::>() + , 8usize); +} +#[test] fn __bindgen_test_layout_template_2() { assert_eq!(::std::mem::size_of::>() , 4usize); From d6fc044fdcac28e000cc04a747b54d87cb41bfa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 24 Jan 2017 13:34:27 +0100 Subject: [PATCH 0258/2291] codegen: don't generate extra use statements for non-enums. There's just no advantage in doing so. --- src/codegen/mod.rs | 2 +- tests/expectations/tests/bitfield_method_mangling.rs | 2 +- tests/expectations/tests/inherit_typedef.rs | 2 +- tests/expectations/tests/reparented_replacement.rs | 2 +- tests/expectations/tests/union_fields.rs | 2 +- tests/expectations/tests/unknown_attr.rs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 45a7b1b777..fa34d341c7 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -543,7 +543,7 @@ impl CodeGenerator for Type { let simple_enum_path = match inner_rust_type.node { ast::TyKind::Path(None, ref p) => { if applicable_template_args.is_empty() && - !inner_item.expect_type().canonical_type(ctx).is_builtin_or_named() && + inner_item.expect_type().canonical_type(ctx).is_enum() && p.segments.iter().all(|p| p.parameters.is_none()) { Some(p.clone()) } else { diff --git a/tests/expectations/tests/bitfield_method_mangling.rs b/tests/expectations/tests/bitfield_method_mangling.rs index b650a38f8c..5aba8abb08 100644 --- a/tests/expectations/tests/bitfield_method_mangling.rs +++ b/tests/expectations/tests/bitfield_method_mangling.rs @@ -46,4 +46,4 @@ impl _bindgen_ty_1 { ((val as u32 as u32) << 24u32) & (4278190080usize as u32); } } -pub use self::_bindgen_ty_1 as mach_msg_type_descriptor_t; +pub type mach_msg_type_descriptor_t = _bindgen_ty_1; diff --git a/tests/expectations/tests/inherit_typedef.rs b/tests/expectations/tests/inherit_typedef.rs index 2b9742231c..ca9041e202 100644 --- a/tests/expectations/tests/inherit_typedef.rs +++ b/tests/expectations/tests/inherit_typedef.rs @@ -17,7 +17,7 @@ fn bindgen_test_layout_Foo() { impl Clone for Foo { fn clone(&self) -> Self { *self } } -pub use self::Foo as TypedefedFoo; +pub type TypedefedFoo = Foo; #[repr(C)] #[derive(Debug, Copy)] pub struct Bar { diff --git a/tests/expectations/tests/reparented_replacement.rs b/tests/expectations/tests/reparented_replacement.rs index 684c75ed9c..74ee229c15 100644 --- a/tests/expectations/tests/reparented_replacement.rs +++ b/tests/expectations/tests/reparented_replacement.rs @@ -25,5 +25,5 @@ pub mod root { fn clone(&self) -> Self { *self } } } - pub use self::super::root::foo::Bar as ReferencesBar; + pub type ReferencesBar = root::foo::Bar; } diff --git a/tests/expectations/tests/union_fields.rs b/tests/expectations/tests/union_fields.rs index 21d8791923..495e80f984 100644 --- a/tests/expectations/tests/union_fields.rs +++ b/tests/expectations/tests/union_fields.rs @@ -44,4 +44,4 @@ fn bindgen_test_layout__bindgen_ty_1() { impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } } -pub use self::_bindgen_ty_1 as nsStyleUnion; +pub type nsStyleUnion = _bindgen_ty_1; diff --git a/tests/expectations/tests/unknown_attr.rs b/tests/expectations/tests/unknown_attr.rs index 541bee5d18..fd9cce4593 100644 --- a/tests/expectations/tests/unknown_attr.rs +++ b/tests/expectations/tests/unknown_attr.rs @@ -13,4 +13,4 @@ pub struct _bindgen_ty_1 { impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } } -pub use self::_bindgen_ty_1 as max_align_t; +pub type max_align_t = _bindgen_ty_1; From 0df8441e6eed35fdde27d2ebc3a4da629d5ec732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 24 Jan 2017 10:51:19 +0100 Subject: [PATCH 0259/2291] codegen: Respect original repr for bitfield-like enums, add a constifying variant. --- src/codegen/mod.rs | 81 +++++++++++++++---- src/lib.rs | 33 ++++++-- src/options.rs | 14 ++++ .../expectations/tests/bitfield-enum-basic.rs | 8 +- .../expectations/tests/constify-all-enums.rs | 23 ++++++ tests/headers/constify-all-enums.h | 11 +++ 6 files changed, 143 insertions(+), 27 deletions(-) create mode 100644 tests/expectations/tests/constify-all-enums.rs create mode 100644 tests/headers/constify-all-enums.h diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 7451dd1120..b2e5606bde 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1464,6 +1464,7 @@ enum EnumBuilder<'a> { canonical_name: &'a str, aster: P, }, + Consts { aster: P, } } impl<'a> EnumBuilder<'a> { @@ -1471,21 +1472,25 @@ impl<'a> EnumBuilder<'a> { /// the representation, and whether it should be represented as a rust enum. fn new(aster: aster::item::ItemBuilder, name: &'a str, - repr_name: &str, - is_rust: bool) + repr: P, + bitfield_like: bool, + constify: bool) -> Self { - if is_rust { - EnumBuilder::Rust(aster.enum_(name)) - } else { + if bitfield_like { EnumBuilder::Bitfield { canonical_name: name, aster: aster.tuple_struct(name) .field() .pub_() - .ty() - .id(repr_name) + .build_ty(repr) .build(), } + } else if constify { + EnumBuilder::Consts { + aster: aster.type_(name).build_ty(repr), + } + } else { + EnumBuilder::Rust(aster.enum_(name)) } } @@ -1535,6 +1540,25 @@ impl<'a> EnumBuilder<'a> { result.push(constant); self } + EnumBuilder::Consts { .. } => { + let constant_name = match mangling_prefix { + Some(prefix) => { + Cow::Owned(format!("{}_{}", prefix, variant_name)) + } + None => variant_name, + }; + + let constant = aster::AstBuilder::new() + .item() + .pub_() + .const_(&*constant_name) + .expr() + .build(expr) + .build(rust_ty); + + result.push(constant); + self + } } } @@ -1564,6 +1588,7 @@ impl<'a> EnumBuilder<'a> { result.push(impl_); aster } + EnumBuilder::Consts { aster, .. } => aster, } } } @@ -1619,6 +1644,8 @@ impl CodeGenerator for Enum { let mut builder = aster::AstBuilder::new().item().pub_(); + // FIXME(emilio): These should probably use the path so it can + // disambiguate between namespaces, just like is_opaque etc. let is_bitfield = { ctx.options().bitfield_enums.matches(&name) || (enum_ty.name().is_none() && @@ -1627,15 +1654,25 @@ impl CodeGenerator for Enum { .any(|v| ctx.options().bitfield_enums.matches(&v.name()))) }; - let is_rust_enum = !is_bitfield; + let is_constified_enum = { + ctx.options().constified_enums.matches(&name) || + (enum_ty.name().is_none() && + self.variants() + .iter() + .any(|v| ctx.options().constified_enums.matches(&v.name()))) + }; + + let is_rust_enum = !is_bitfield && !is_constified_enum; // FIXME: Rust forbids repr with empty enums. Remove this condition when // this is allowed. + // + // TODO(emilio): Delegate this to the builders? if is_rust_enum { if !self.variants().is_empty() { builder = builder.with_attr(attributes::repr(repr_name)); } - } else { + } else if is_bitfield { builder = builder.with_attr(attributes::repr("C")); } @@ -1643,14 +1680,16 @@ impl CodeGenerator for Enum { builder = builder.with_attr(attributes::doc(comment)); } - let derives = attributes::derives(&["Debug", - "Copy", - "Clone", - "PartialEq", - "Eq", - "Hash"]); + if !is_constified_enum { + let derives = attributes::derives(&["Debug", + "Copy", + "Clone", + "PartialEq", + "Eq", + "Hash"]); - builder = builder.with_attr(derives); + builder = builder.with_attr(derives); + } fn add_constant<'a>(enum_: &Type, // Only to avoid recomputing every time. @@ -1680,8 +1719,16 @@ impl CodeGenerator for Enum { result.push(constant); } + let repr = self.repr() + .map(|repr| repr.to_rust_ty(ctx)) + .unwrap_or_else(|| helpers::ast_ty::raw_type(ctx, repr_name)); + let mut builder = - EnumBuilder::new(builder, &name, repr_name, is_rust_enum); + EnumBuilder::new(builder, + &name, + repr, + is_bitfield, + is_constified_enum); // A map where we keep a value -> variant relation. let mut seen_values = HashMap::<_, String>::new(); diff --git a/src/lib.rs b/src/lib.rs index 88da1a4866..1348dd83ea 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -182,34 +182,39 @@ impl Builder { self } - /// Hide the given type from the generated bindings. Regular expressions are supported. + /// Hide the given type from the generated bindings. Regular expressions are + /// supported. pub fn hide_type>(mut self, arg: T) -> Builder { self.options.hidden_types.insert(arg); self } - /// Treat the given type as opaque in the generated bindings. Regular expressions are supported. + /// Treat the given type as opaque in the generated bindings. Regular + /// expressions are supported. pub fn opaque_type>(mut self, arg: T) -> Builder { self.options.opaque_types.insert(arg); self } /// Whitelist the given type so that it (and all types that it transitively - /// refers to) appears in the generated bindings. Regular expressions are supported. + /// refers to) appears in the generated bindings. Regular expressions are + /// supported. pub fn whitelisted_type>(mut self, arg: T) -> Builder { self.options.whitelisted_types.insert(arg); self } /// Whitelist the given function so that it (and all types that it - /// transitively refers to) appears in the generated bindings. Regular expressions are supported. + /// transitively refers to) appears in the generated bindings. Regular + /// expressions are supported. pub fn whitelisted_function>(mut self, arg: T) -> Builder { self.options.whitelisted_functions.insert(arg); self } /// Whitelist the given variable so that it (and all types that it - /// transitively refers to) appears in the generated bindings. Regular expressions are supported. + /// transitively refers to) appears in the generated bindings. Regular + /// expressions are supported. pub fn whitelisted_var>(mut self, arg: T) -> Builder { self.options.whitelisted_vars.insert(arg); self @@ -218,12 +223,23 @@ impl Builder { /// Mark the given enum (or set of enums, if using a pattern) as being /// bitfield-like. Regular expressions are supported. /// - /// This makes bindgen generate a type that isn't a rust `enum`. + /// This makes bindgen generate a type that isn't a rust `enum`. Regular + /// expressions are supported. pub fn bitfield_enum>(mut self, arg: T) -> Builder { self.options.bitfield_enums.insert(arg); self } + /// Mark the given enum (or set of enums, if using a pattern) as being + /// constant. + /// + /// This makes bindgen generate constants instead of enums. Regular + /// expressions are supported. + pub fn constified_enum>(mut self, arg: T) -> Builder { + self.options.constified_enums.insert(arg); + self + } + /// Add a string to prepend to the generated bindings. The string is passed /// through without any modification. pub fn raw_line>(mut self, arg: T) -> Builder { @@ -418,6 +434,9 @@ pub struct BindgenOptions { /// The enum patterns to mark an enum as bitfield. pub bitfield_enums: RegexSet, + /// The enum patterns to mark an enum as constant. + pub constified_enums: RegexSet, + /// Whether we should generate builtins or not. pub builtins: bool, @@ -496,6 +515,7 @@ impl BindgenOptions { self.hidden_types.build(); self.opaque_types.build(); self.bitfield_enums.build(); + self.constified_enums.build(); } } @@ -508,6 +528,7 @@ impl Default for BindgenOptions { whitelisted_functions: Default::default(), whitelisted_vars: Default::default(), bitfield_enums: Default::default(), + constified_enums: Default::default(), builtins: false, links: vec![], emit_ast: false, diff --git a/src/options.rs b/src/options.rs index 3456bfea9b..ccec7cf170 100644 --- a/src/options.rs +++ b/src/options.rs @@ -24,6 +24,14 @@ pub fn builder_from_flags(args: I) .takes_value(true) .multiple(true) .number_of_values(1), + Arg::with_name("constified-enum") + .long("constified-enum") + .help("Mark any enum whose name matches as a set of \ + constants instead of an enumeration.") + .value_name("regex") + .takes_value(true) + .multiple(true) + .number_of_values(1), Arg::with_name("blacklist-type") .long("blacklist-type") .help("Mark a type as hidden.") @@ -171,6 +179,12 @@ pub fn builder_from_flags(args: I) } } + if let Some(bitfields) = matches.values_of("constified-enum") { + for regex in bitfields { + builder = builder.constified_enum(regex); + } + } + if let Some(hidden_types) = matches.values_of("blacklist-type") { for ty in hidden_types { builder = builder.hide_type(ty); diff --git a/tests/expectations/tests/bitfield-enum-basic.rs b/tests/expectations/tests/bitfield-enum-basic.rs index 03e07de6b2..7674af8bb1 100644 --- a/tests/expectations/tests/bitfield-enum-basic.rs +++ b/tests/expectations/tests/bitfield-enum-basic.rs @@ -18,7 +18,7 @@ impl ::std::ops::BitOr for Foo { } #[repr(C)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub struct Foo(pub i32); +pub struct Foo(pub ::std::os::raw::c_int); pub const Buz_Bar: Buz = Buz(2); pub const Buz_Baz: Buz = Buz(4); pub const Buz_Duplicated: Buz = Buz(4); @@ -33,7 +33,7 @@ impl ::std::ops::BitOr for Buz { } #[repr(C)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub struct Buz(pub i8); +pub struct Buz(pub ::std::os::raw::c_char); pub const NS_FOO: _bindgen_ty_1 = _bindgen_ty_1(1); pub const NS_BAR: _bindgen_ty_1 = _bindgen_ty_1(2); impl ::std::ops::BitOr<_bindgen_ty_1> for _bindgen_ty_1 { @@ -46,7 +46,7 @@ impl ::std::ops::BitOr<_bindgen_ty_1> for _bindgen_ty_1 { } #[repr(C)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub struct _bindgen_ty_1(pub u32); +pub struct _bindgen_ty_1(pub ::std::os::raw::c_uint); #[repr(C)] #[derive(Debug, Copy)] pub struct Dummy { @@ -66,7 +66,7 @@ impl ::std::ops::BitOr for Dummy__bindgen_ty_1 { } #[repr(C)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub struct Dummy__bindgen_ty_1(pub u32); +pub struct Dummy__bindgen_ty_1(pub ::std::os::raw::c_uint); #[test] fn bindgen_test_layout_Dummy() { assert_eq!(::std::mem::size_of::() , 1usize); diff --git a/tests/expectations/tests/constify-all-enums.rs b/tests/expectations/tests/constify-all-enums.rs new file mode 100644 index 0000000000..a676bb1019 --- /dev/null +++ b/tests/expectations/tests/constify-all-enums.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const foo_THIS: foo = 0; +pub const foo_SHOULD_BE: foo = 1; +pub const foo_A_CONSTANT: foo = 2; +pub type foo = ::std::os::raw::c_uint; +#[repr(C)] +#[derive(Debug, Copy)] +pub struct bar { + pub this_should_work: foo, +} +#[test] +fn bindgen_test_layout_bar() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for bar { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/constify-all-enums.h b/tests/headers/constify-all-enums.h new file mode 100644 index 0000000000..7138bf2018 --- /dev/null +++ b/tests/headers/constify-all-enums.h @@ -0,0 +1,11 @@ +// bindgen-flags: --constified-enum foo + +enum foo { + THIS, + SHOULD_BE, + A_CONSTANT, +}; + +struct bar { + enum foo this_should_work; +}; From 5d8019b7dc2f0581fc560fbc12d504c516a8476d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 24 Jan 2017 09:49:49 +0100 Subject: [PATCH 0260/2291] Honor and expose the derive_debug option. Fixes #432 --- src/ir/item.rs | 2 +- src/lib.rs | 6 +++++ src/options.rs | 7 ++++++ tests/expectations/tests/no-derive-debug.rs | 26 +++++++++++++++++++++ tests/headers/no-derive-debug.h | 15 ++++++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/tests/no-derive-debug.rs create mode 100644 tests/headers/no-derive-debug.h diff --git a/src/ir/item.rs b/src/ir/item.rs index ac2d122e4e..7b18b3317b 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -219,7 +219,7 @@ impl CanDeriveDebug for Item { type Extra = (); fn can_derive_debug(&self, ctx: &BindgenContext, _: ()) -> bool { - match self.kind { + ctx.options().derive_debug && match self.kind { ItemKind::Type(ref ty) => { if self.is_opaque(ctx) { ty.layout(ctx) diff --git a/src/lib.rs b/src/lib.rs index 88da1a4866..bb6217184a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -268,6 +268,12 @@ impl Builder { self } + /// Set whether `Debug` should be derived by default. + pub fn derive_debug(mut self, doit: bool) -> Self { + self.options.derive_debug = doit; + self + } + /// Emit Clang AST. pub fn emit_clang_ast(mut self) -> Builder { self.options.emit_ast = true; diff --git a/src/options.rs b/src/options.rs index 3456bfea9b..c5c80d634b 100644 --- a/src/options.rs +++ b/src/options.rs @@ -31,6 +31,9 @@ pub fn builder_from_flags(args: I) .takes_value(true) .multiple(true) .number_of_values(1), + Arg::with_name("no-derive-debug") + .long("no-derive-debug") + .help("Avoid deriving Debug on any type."), Arg::with_name("builtins") .long("builtins") .help("Output bindings for builtin definitions, e.g. \ @@ -181,6 +184,10 @@ pub fn builder_from_flags(args: I) builder = builder.emit_builtins(); } + if matches.is_present("no-derive-debug") { + builder = builder.derive_debug(false); + } + if let Some(prefix) = matches.value_of("ctypes-prefix") { builder = builder.ctypes_prefix(prefix); } diff --git a/tests/expectations/tests/no-derive-debug.rs b/tests/expectations/tests/no-derive-debug.rs new file mode 100644 index 0000000000..e45b267823 --- /dev/null +++ b/tests/expectations/tests/no-derive-debug.rs @@ -0,0 +1,26 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#[repr(C)] #[derive(Copy, Clone)] pub struct foo { bar: ::std::os::raw::c_int, } + +/** + * bar should compile. It will normally derive debug, but our blacklist of foo + * and replacement for another type that doesn't implement it would prevent it + * from building if --no-derive-debug didn't work. + */ +#[repr(C)] +#[derive(Copy)] +pub struct bar { + pub foo: foo, + pub baz: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_bar() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for bar { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/no-derive-debug.h b/tests/headers/no-derive-debug.h new file mode 100644 index 0000000000..4a49e40422 --- /dev/null +++ b/tests/headers/no-derive-debug.h @@ -0,0 +1,15 @@ +// bindgen-flags: --no-derive-debug --blacklist-type foo --raw-line "#[repr(C)] #[derive(Copy, Clone)] pub struct foo { bar: ::std::os::raw::c_int, }" + +struct foo { + int bar; +}; + +/** + * bar should compile. It will normally derive debug, but our blacklist of foo + * and replacement for another type that doesn't implement it would prevent it + * from building if --no-derive-debug didn't work. + */ +struct bar { + struct foo foo; + int baz; +}; From bb63f323955ea31dc1214902d7f2f2c1abc335a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 24 Jan 2017 22:32:58 +0100 Subject: [PATCH 0261/2291] Version bump, ignore expectations' Cargo.lock --- .gitignore | 1 + Cargo.lock | 2 +- Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 7c2aef6614..e9421ffcf5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ target/ *~ ./bindgen-integration/Cargo.lock +./tests/expectations/Cargo.lock #*# diff --git a/Cargo.lock b/Cargo.lock index 27f549152a..fb1d0a9588 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ [root] name = "bindgen" -version = "0.20.0" +version = "0.20.1" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index bf8532633c..f357ec385d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.20.0" +version = "0.20.1" build = "build.rs" [badges] From 783ac6e065c275aee90b3f0622f3864075e955b8 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Wed, 25 Jan 2017 14:50:25 +0100 Subject: [PATCH 0262/2291] Update quasi_codegen to 0.29 This avoids compiling two versions of some crates. --- Cargo.lock | 84 ++++++++++-------------------------------------------- Cargo.toml | 4 +-- 2 files changed, 17 insertions(+), 71 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fb1d0a9588..4624cf517d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ [root] name = "bindgen" -version = "0.20.1" +version = "0.20.2" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -12,7 +12,7 @@ dependencies = [ "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "quasi 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quasi_codegen 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quasi_codegen 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -32,14 +32,6 @@ name = "ansi_term" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "aster" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "syntex_syntax 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "aster" version = "0.38.0" @@ -206,7 +198,7 @@ name = "phf_shared" version = "0.7.21" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "siphasher 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "siphasher 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -220,13 +212,13 @@ dependencies = [ [[package]] name = "quasi_codegen" -version = "0.26.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aster 0.34.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_errors 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_syntax 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -282,7 +274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "siphasher" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -292,24 +284,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syntex" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "syntex_errors 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_syntax 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "syntex_errors" -version = "0.50.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_pos 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -325,14 +304,6 @@ dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "syntex_pos" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "syntex_pos" version = "0.54.0" @@ -341,21 +312,6 @@ dependencies = [ "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "syntex_syntax" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_errors 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_pos 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)", - "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "syntex_syntax" version = "0.54.0" @@ -428,11 +384,6 @@ name = "unicode-width" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "unicode-xid" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "unicode-xid" version = "0.0.4" @@ -474,7 +425,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum aho-corasick 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f660b942762979b56c9f07b4b36bb559776fbad102f05d6771e1b629e8fd5bf" "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" -"checksum aster 0.34.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88bb8ecdf6a7eaddb7bfd872ebf5e085d343ca42ce98c582dba8046e3450b524" "checksum aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2c9b49e42a449c0b79d8acb91db37621de0978064dca7d3288ddcf030123e5b3" "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d" @@ -499,7 +449,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "6b07ffcc532ccc85e3afc45865469bf5d9e4ef5bfcf9622e3cfe80c2d275ec03" "checksum phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "07e24b0ca9643bdecd0632f2b3da6b1b89bbb0030e0b992afc1113b23a7bc2f2" "checksum quasi 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dcbf815446dc6a0afbc72d88f9a8aa71b608d10b168e09437c80c0fd6fd410c9" -"checksum quasi_codegen 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d52e5e2c92ffdad67a9b86ad27ad999bf1a652723f1d4cc93b7cf6c272b5f8e0" +"checksum quasi_codegen 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b06172e92ab0099427609854ffb1512c377be5fc4beaf572ae5d5a01b8359596" "checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d" "checksum regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4278c17d0f6d62dfef0ab00028feb45bd7d2102843f80763474eeb1be8a10c01" "checksum regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9191b1f57603095f105d317e375d19b1c9c5c3185ea9633a99a6dcbed04457" @@ -507,14 +457,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" "checksum serde_json 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "67f7d2e9edc3523a9c8ec8cd6ec481b3a27810aafee3e625d311febd3e656b4c" "checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" -"checksum siphasher 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3922130881aed4b3ee4549cd586eaf4d272544021656e084d626cccbae7fb338" +"checksum siphasher 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2ffc669b726f2bc9a3bcff66e5e23b56ba6bf70e22a34c3d7b6d0b3450b65b84" "checksum strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "67f84c44fbb2f91db7fef94554e6b2ac05909c9c0b0bc23bb98d3a1aebfe7f7c" -"checksum syntex 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bd253b0d7d787723a33384d426f0ebec7f8edccfaeb2022d0177162bb134da0" -"checksum syntex_errors 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "84822a1178204a191239ad844599f8c85c128cf9f4173397def4eb46b55b0aa1" +"checksum syntex 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb3f52553a966675982404dc34028291b347e0c9a9c0b0b34f2da6be8a0443f8" "checksum syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dee2f6e49c075f71332bb775219d5982bee6732d26227fa1ae1b53cdb12f5cc5" -"checksum syntex_pos 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a43abded5057c75bac8555e46ec913ce502efb418267b1ab8e9783897470c7db" "checksum syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df3921c7945dfb9ffc53aa35adb2cf4313b5ab5f079c3619b3d4eb82a0efc2b" -"checksum syntex_syntax 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ef781e4b60f03431f1b5b59843546ce60ae029a787770cf8e0969ac1fd063a5" "checksum syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc960085bae44591e22d01f6c0e82a8aec832f8659aca556cdf8ecbdac2bb47b" "checksum target_build_utils 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54c550e226618cd35334b75e92bfa5437c61474bdb75c38bf330ab5a8037b77c" "checksum term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3deff8a2b3b6607d6d7cc32ac25c0b33709453ca9cceac006caac51e963cf94a" @@ -523,7 +470,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum thread_local 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7793b722f0f77ce716e7f1acf416359ca32ff24d04ffbac4269f44a4a83be05d" "checksum unicode-segmentation 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c3bc443ded17b11305ffffe6b37e2076f328a5a8cb6aa877b1b98f77699e98b5" "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" -"checksum unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "36dff09cafb4ec7c8cf0023eb0b686cb6ce65499116a12201c9e11840ca01beb" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" "checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" diff --git a/Cargo.toml b/Cargo.toml index f357ec385d..1969591917 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.20.1" +version = "0.20.2" build = "build.rs" [badges] @@ -32,7 +32,7 @@ clap = "2" shlex = "0.1" [build-dependencies] -quasi_codegen = "0.26" +quasi_codegen = "0.29" [dependencies] cexpr = "0.2" From 8eb9e3f406f83f297ccacf687791948cfd4ba872 Mon Sep 17 00:00:00 2001 From: Nikhil Shagrithaya Date: Thu, 29 Dec 2016 18:26:25 +0530 Subject: [PATCH 0263/2291] Forward declared structs now generate opaque enums --- src/clang.rs | 5 +++++ src/codegen/mod.rs | 18 ++++++++++++++++-- src/ir/comp.rs | 18 ++++++++++++++++++ ...same_struct_name_in_different_namespaces.rs | 8 +------- 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 491aaa07c1..9cf51436df 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -190,6 +190,11 @@ impl Cursor { unsafe { clang_getCursorKind(self.x) } } + /// Returns true is the cursor is a definition + pub fn is_definition(&self) -> bool { + unsafe { clang_isCursorDefinition(self.x) != 0 } + } + /// Is the referent an anonymous record definition? pub fn is_anonymous(&self) -> bool { unsafe { clang_Cursor_isAnonymous(self.x) != 0 } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 7451dd1120..0cc5a63716 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -748,6 +748,22 @@ impl CodeGenerator for CompInfo { return; } + let applicable_template_args = item.applicable_template_args(ctx); + + // generate tuple struct if struct or union is a forward declaration, + // skip for now if template parameters are needed. + if self.is_forward_declaration() && applicable_template_args.is_empty(){ + let struct_name = item.canonical_name(ctx); + let struct_name = ctx.rust_ident_raw(&struct_name); + let tuple_struct = quote_item!(ctx.ext_cx(), + #[repr(C)] + pub struct $struct_name([u8; 0]); + ) + .unwrap(); + result.push(tuple_struct); + return; + } + if self.is_template_specialization() { let layout = item.kind().expect_type().layout(ctx); @@ -775,8 +791,6 @@ impl CodeGenerator for CompInfo { return; } - let applicable_template_args = item.applicable_template_args(ctx); - let mut attributes = vec![]; let mut needs_clone_impl = false; if let Some(comment) = item.comment() { diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 968bf87987..ada6c06451 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -290,6 +290,10 @@ pub struct CompInfo { /// Used to detect if we've run in a has_destructor cycle while cycling /// around the template arguments. detect_has_destructor_cycle: Cell, + + /// Used to indicate when a struct has been forward declared. Usually used + /// in headers so that APIs can't modify them directly. + is_forward_declaration: bool, } impl CompInfo { @@ -314,6 +318,7 @@ impl CompInfo { found_unknown_attr: false, detect_derive_debug_cycle: Cell::new(false), detect_has_destructor_cycle: Cell::new(false), + is_forward_declaration: false, } } @@ -481,6 +486,14 @@ impl CompInfo { debug!("CompInfo::from_ty({:?}, {:?})", kind, cursor); let mut ci = CompInfo::new(kind); + ci.is_forward_declaration = location.map_or(true, |cur| { + match cur.kind() { + CXCursor_StructDecl | + CXCursor_UnionDecl | + CXCursor_ClassDecl => !cur.is_definition(), + _ => false, + } + }); ci.is_anonymous = cursor.is_anonymous(); ci.template_args = match ty.template_args() { // In forward declarations and not specializations, @@ -822,6 +835,11 @@ impl CompInfo { .map_or(false, |ci| ci.has_vtable(ctx)) }) } + + /// Returns true if compound type has been forward declared + pub fn is_forward_declaration(&self) -> bool { + self.is_forward_declaration + } } impl CanDeriveDebug for CompInfo { diff --git a/tests/expectations/tests/same_struct_name_in_different_namespaces.rs b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs index 8e7c177b8a..c59e4d44b7 100644 --- a/tests/expectations/tests/same_struct_name_in_different_namespaces.rs +++ b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs @@ -5,13 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] -pub struct JS_Zone { - pub _address: u8, -} -impl Clone for JS_Zone { - fn clone(&self) -> Self { *self } -} +pub struct JS_Zone([u8; 0]); #[repr(C)] #[derive(Debug, Copy)] pub struct JS_shadow_Zone { From 78aaa32037880c28cce640aa8f989f738280f164 Mon Sep 17 00:00:00 2001 From: Nikhil Shagrithaya Date: Thu, 26 Jan 2017 18:30:31 +0530 Subject: [PATCH 0264/2291] Added test for forward declared complex types --- .../tests/forward_declared_complex_types.rs | 50 +++++++++++++++++++ .../forward_declared_complex_types.hpp | 16 ++++++ 2 files changed, 66 insertions(+) create mode 100644 tests/expectations/tests/forward_declared_complex_types.rs create mode 100644 tests/headers/forward_declared_complex_types.hpp diff --git a/tests/expectations/tests/forward_declared_complex_types.rs b/tests/expectations/tests/forward_declared_complex_types.rs new file mode 100644 index 0000000000..77849a91fd --- /dev/null +++ b/tests/expectations/tests/forward_declared_complex_types.rs @@ -0,0 +1,50 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Foo_empty { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Foo_empty() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); +} +impl Clone for Foo_empty { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +pub struct Foo([u8; 0]); +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Bar { + pub f: *mut Foo, +} +#[test] +fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for Bar { + fn clone(&self) -> Self { *self } +} +extern "C" { + #[link_name = "_Z10baz_structP3Foo"] + pub fn baz_struct(f: *mut Foo); +} +#[repr(C)] +pub struct Union([u8; 0]); +extern "C" { + #[link_name = "_Z9baz_unionP5Union"] + pub fn baz_union(u: *mut Union); +} +#[repr(C)] +pub struct Quux([u8; 0]); +extern "C" { + #[link_name = "_Z9baz_classP4Quux"] + pub fn baz_class(q: *mut Quux); +} diff --git a/tests/headers/forward_declared_complex_types.hpp b/tests/headers/forward_declared_complex_types.hpp new file mode 100644 index 0000000000..ffc779adec --- /dev/null +++ b/tests/headers/forward_declared_complex_types.hpp @@ -0,0 +1,16 @@ +struct Foo_empty {}; +struct Foo; + +struct Bar { + Foo *f; +}; + +void baz_struct(Foo* f); + +union Union; + +void baz_union(Union* u); + +class Quux; + +void baz_class(Quux* q); From 7d7c49aaa3b9b5c01d2afac70660575f1bb562b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 26 Jan 2017 17:09:28 +0100 Subject: [PATCH 0265/2291] codegen: Add an option to skip comment generation. This is mostly a work around https://github.com/servo/rust-bindgen/issues/426, until we implement the proper fix. --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/codegen/mod.rs | 30 ++++++++++++++++--------- src/lib.rs | 19 ++++++++++++++++ src/options.rs | 8 +++++++ tests/expectations/tests/no-comments.rs | 19 ++++++++++++++++ tests/headers/no-comments.h | 5 +++++ 7 files changed, 73 insertions(+), 12 deletions(-) create mode 100644 tests/expectations/tests/no-comments.rs create mode 100644 tests/headers/no-comments.h diff --git a/Cargo.lock b/Cargo.lock index 4624cf517d..618a02f6de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ [root] name = "bindgen" -version = "0.20.2" +version = "0.20.3" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 1969591917..085b9df8d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.20.2" +version = "0.20.3" build = "build.rs" [badges] diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index c92e95fa8c..b4ef860692 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -534,8 +534,10 @@ impl CodeGenerator for Type { let rust_name = ctx.rust_ident(&name); let mut typedef = aster::AstBuilder::new().item().pub_(); - if let Some(comment) = item.comment() { - typedef = typedef.attr().doc(comment); + if ctx.options().generate_comments { + if let Some(comment) = item.comment() { + typedef = typedef.attr().doc(comment); + } } // We prefer using `pub use` over `pub type` because of: @@ -808,8 +810,10 @@ impl CodeGenerator for CompInfo { let mut attributes = vec![]; let mut needs_clone_impl = false; - if let Some(comment) = item.comment() { - attributes.push(attributes::doc(comment)); + if ctx.options().generate_comments { + if let Some(comment) = item.comment() { + attributes.push(attributes::doc(comment)); + } } if self.packed() { attributes.push(attributes::repr_list(&["C", "packed"])); @@ -1007,8 +1011,10 @@ impl CodeGenerator for CompInfo { }; let mut attrs = vec![]; - if let Some(comment) = field.comment() { - attrs.push(attributes::doc(comment)); + if ctx.options().generate_comments { + if let Some(comment) = field.comment() { + attrs.push(attributes::doc(comment)); + } } let field_name = match field.name() { Some(name) => ctx.rust_mangle(name).into_owned(), @@ -1705,8 +1711,10 @@ impl CodeGenerator for Enum { builder = builder.with_attr(attributes::repr("C")); } - if let Some(comment) = item.comment() { - builder = builder.with_attr(attributes::doc(comment)); + if ctx.options().generate_comments { + if let Some(comment) = item.comment() { + builder = builder.with_attr(attributes::doc(comment)); + } } if !is_constified_enum { @@ -2166,8 +2174,10 @@ impl CodeGenerator for Function { let mut attributes = vec![]; - if let Some(comment) = item.comment() { - attributes.push(attributes::doc(comment)); + if ctx.options().generate_comments { + if let Some(comment) = item.comment() { + attributes.push(attributes::doc(comment)); + } } if let Some(mangled) = mangled_name { diff --git a/src/lib.rs b/src/lib.rs index 5052bb563a..c28e3168b3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -175,6 +175,19 @@ impl Builder { self } + /// Whether the generated bindings should contain documentation comments or + /// not. + /// + /// This ideally will always be true, but it may need to be false until we + /// implement some processing on comments to work around issues as described + /// in: + /// + /// https://github.com/servo/rust-bindgen/issues/426 + pub fn generate_comments(mut self, doit: bool) -> Self { + self.options.generate_comments = doit; + self + } + /// Generate a C/C++ file that includes the header and has dummy uses of /// every type defined in the header. pub fn dummy_uses>(mut self, dummy_uses: T) -> Builder { @@ -495,6 +508,7 @@ pub struct BindgenOptions { /// The input header file. pub input_header: Option, + /// Generate a dummy C/C++ file that includes the header and has dummy uses /// of all types defined therein. See the `uses` module for more. pub dummy_uses: Option, @@ -511,6 +525,10 @@ pub struct BindgenOptions { /// /// See the builder method description for more details. pub conservative_inline_namespaces: bool, + + /// Wether to keep documentation comments in the generated output. See the + /// documentation for more details. + pub generate_comments: bool, } impl BindgenOptions { @@ -555,6 +573,7 @@ impl Default for BindgenOptions { type_chooser: None, codegen_config: CodegenConfig::all(), conservative_inline_namespaces: false, + generate_comments: true, } } } diff --git a/src/options.rs b/src/options.rs index fa69ecbac2..7b18eb0306 100644 --- a/src/options.rs +++ b/src/options.rs @@ -42,6 +42,10 @@ pub fn builder_from_flags(args: I) Arg::with_name("no-derive-debug") .long("no-derive-debug") .help("Avoid deriving Debug on any type."), + Arg::with_name("no-doc-comments") + .long("no-doc-comments") + .help("Avoid including doc comments in the output, see: \ + https://github.com/servo/rust-bindgen/issues/426"), Arg::with_name("builtins") .long("builtins") .help("Output bindings for builtin definitions, e.g. \ @@ -271,6 +275,10 @@ pub fn builder_from_flags(args: I) builder = builder.no_convert_floats(); } + if matches.is_present("no-doc-comments") { + builder = builder.generate_comments(false); + } + if let Some(opaque_types) = matches.values_of("opaque-type") { for ty in opaque_types { builder = builder.opaque_type(ty); diff --git a/tests/expectations/tests/no-comments.rs b/tests/expectations/tests/no-comments.rs new file mode 100644 index 0000000000..8a4371e7a1 --- /dev/null +++ b/tests/expectations/tests/no-comments.rs @@ -0,0 +1,19 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Foo { + pub s: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/no-comments.h b/tests/headers/no-comments.h new file mode 100644 index 0000000000..1ddb1a3b1f --- /dev/null +++ b/tests/headers/no-comments.h @@ -0,0 +1,5 @@ +// bindgen-flags: --no-doc-comments + +struct Foo { + int s; /*!< Including this will prevent rustc for compiling it */ +}; From 78e425f921085030585c93ed1eb0b96b5cb3b4b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 26 Jan 2017 17:26:02 +0100 Subject: [PATCH 0266/2291] ir: Allow whitelisting non-recursively Fixes #429 --- src/ir/context.rs | 26 ++++++++++--------- src/lib.rs | 14 ++++++++++ src/options.rs | 7 +++++ .../tests/no-recursive-whitelisting.rs | 20 ++++++++++++++ tests/headers/no-recursive-whitelisting.h | 7 +++++ 5 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 tests/expectations/tests/no-recursive-whitelisting.rs create mode 100644 tests/headers/no-recursive-whitelisting.h diff --git a/src/ir/context.rs b/src/ir/context.rs index b0143bd55f..50774a434d 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -1155,15 +1155,15 @@ pub struct WhitelistedItemsIter<'ctx, 'gen> { ctx: &'ctx BindgenContext<'gen>, - // The set of whitelisted items we have seen. If you think of traversing - // whitelisted items like GC tracing, this is the mark bits, and contains - // both black and gray items. + /// The set of whitelisted items we have seen. If you think of traversing + /// whitelisted items like GC tracing, this is the mark bits, and contains + /// both black and gray items. seen: ItemSet, - // The set of whitelisted items that we have seen but have yet to iterate - // over and collect transitive references from. To return to the GC analogy, - // this is the mark stack, containing the set of gray items which we have - // not finished tracing yet. + /// The set of whitelisted items that we have seen but have yet to iterate + /// over and collect transitive references from. To return to the GC analogy, + /// this is the mark stack, containing the set of gray items which we have + /// not finished tracing yet. to_iterate: Vec, } @@ -1181,12 +1181,14 @@ impl<'ctx, 'gen> Iterator for WhitelistedItemsIter<'ctx, 'gen> debug_assert!(self.seen.contains(&id)); debug_assert!(self.ctx.items.contains_key(&id)); - let mut sub_types = ItemSet::new(); - id.collect_types(self.ctx, &mut sub_types, &()); + if self.ctx.options().whitelist_recursively { + let mut sub_types = ItemSet::new(); + id.collect_types(self.ctx, &mut sub_types, &()); - for id in sub_types { - if self.seen.insert(id) { - self.to_iterate.push(id); + for id in sub_types { + if self.seen.insert(id) { + self.to_iterate.push(id); + } } } diff --git a/src/lib.rs b/src/lib.rs index c28e3168b3..dabab15289 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -188,6 +188,16 @@ impl Builder { self } + /// Whether to whitelist types recursively or not. Defaults to true. + /// + /// This can be used to get bindgen to generate _exactly_ the types you want + /// in your bindings, and then import other types manually via other means + /// (like `raw_line`). + pub fn whitelist_recursively(mut self, doit: bool) -> Self { + self.options.whitelist_recursively = doit; + self + } + /// Generate a C/C++ file that includes the header and has dummy uses of /// every type defined in the header. pub fn dummy_uses>(mut self, dummy_uses: T) -> Builder { @@ -529,6 +539,9 @@ pub struct BindgenOptions { /// Wether to keep documentation comments in the generated output. See the /// documentation for more details. pub generate_comments: bool, + + /// Wether to whitelist types recursively. Defaults to true. + pub whitelist_recursively: bool, } impl BindgenOptions { @@ -574,6 +587,7 @@ impl Default for BindgenOptions { codegen_config: CodegenConfig::all(), conservative_inline_namespaces: false, generate_comments: true, + whitelist_recursively: true, } } } diff --git a/src/options.rs b/src/options.rs index 7b18eb0306..307ea6b073 100644 --- a/src/options.rs +++ b/src/options.rs @@ -46,6 +46,9 @@ pub fn builder_from_flags(args: I) .long("no-doc-comments") .help("Avoid including doc comments in the output, see: \ https://github.com/servo/rust-bindgen/issues/426"), + Arg::with_name("no-recursive-whitelist") + .long("no-recursive-whitelist") + .help("Avoid whitelisting types recursively"), Arg::with_name("builtins") .long("builtins") .help("Output bindings for builtin definitions, e.g. \ @@ -279,6 +282,10 @@ pub fn builder_from_flags(args: I) builder = builder.generate_comments(false); } + if matches.is_present("no-recursive-whitelist") { + builder = builder.whitelist_recursively(false); + } + if let Some(opaque_types) = matches.values_of("opaque-type") { for ty in opaque_types { builder = builder.opaque_type(ty); diff --git a/tests/expectations/tests/no-recursive-whitelisting.rs b/tests/expectations/tests/no-recursive-whitelisting.rs new file mode 100644 index 0000000000..5bc2166503 --- /dev/null +++ b/tests/expectations/tests/no-recursive-whitelisting.rs @@ -0,0 +1,20 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +pub enum Bar {} + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Foo { + pub baz: *mut Bar, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/no-recursive-whitelisting.h b/tests/headers/no-recursive-whitelisting.h new file mode 100644 index 0000000000..1d805d9301 --- /dev/null +++ b/tests/headers/no-recursive-whitelisting.h @@ -0,0 +1,7 @@ +// bindgen-flags: --no-recursive-whitelist --whitelist-type "Foo" --raw-line "pub enum Bar {}" + +struct Bar; + +struct Foo { + struct Bar* baz; +}; From dd3eb89fa19545c43f4332182e4206c19ec78455 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 26 Jan 2017 16:17:48 -0800 Subject: [PATCH 0267/2291] Trace constructors in CompInfo's TypeCollector impl Fixes #447 --- src/ir/comp.rs | 4 ++ tests/expectations/tests/issue-447.rs | 63 +++++++++++++++++++++++++++ tests/headers/issue-447.hpp | 27 ++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 tests/expectations/tests/issue-447.rs create mode 100644 tests/headers/issue-447.hpp diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 4eea1d7ada..bad661dad3 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -978,5 +978,9 @@ impl TypeCollector for CompInfo { for method in self.methods() { types.insert(method.signature); } + + for &ctor in self.constructors() { + types.insert(ctor); + } } } diff --git a/tests/expectations/tests/issue-447.rs b/tests/expectations/tests/issue-447.rs new file mode 100644 index 0000000000..b49caa5477 --- /dev/null +++ b/tests/expectations/tests/issue-447.rs @@ -0,0 +1,63 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use self::super::root; + pub mod mozilla { + #[allow(unused_imports)] + use self::super::super::root; + pub mod detail { + #[allow(unused_imports)] + use self::super::super::super::root; + #[repr(C)] + #[derive(Debug, Copy)] + pub struct GuardObjectNotifier { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_GuardObjectNotifier() { + assert_eq!(::std::mem::size_of::() , + 1usize); + assert_eq!(::std::mem::align_of::() , + 1usize); + } + impl Clone for GuardObjectNotifier { + fn clone(&self) -> Self { *self } + } + } + } + #[repr(C)] + #[derive(Debug, Copy)] + pub struct JSAutoCompartment { + pub _address: u8, + } + #[test] + fn bindgen_test_layout_JSAutoCompartment() { + assert_eq!(::std::mem::size_of::() , 1usize); + assert_eq!(::std::mem::align_of::() , 1usize); + } + extern "C" { + #[link_name = + "_ZN17JSAutoCompartmentC1EN7mozilla6detail19GuardObjectNotifierE"] + pub fn JSAutoCompartment_JSAutoCompartment(this: + *mut root::JSAutoCompartment, + arg1: + root::mozilla::detail::GuardObjectNotifier); + } + impl Clone for JSAutoCompartment { + fn clone(&self) -> Self { *self } + } + impl JSAutoCompartment { + #[inline] + pub unsafe fn new(arg1: root::mozilla::detail::GuardObjectNotifier) + -> Self { + let mut __bindgen_tmp = ::std::mem::uninitialized(); + JSAutoCompartment_JSAutoCompartment(&mut __bindgen_tmp, arg1); + __bindgen_tmp + } + } +} diff --git a/tests/headers/issue-447.hpp b/tests/headers/issue-447.hpp new file mode 100644 index 0000000000..017838c42f --- /dev/null +++ b/tests/headers/issue-447.hpp @@ -0,0 +1,27 @@ +// bindgen-flags: --enable-cxx-namespaces --whitelist-type JSAutoCompartment -- -std=c++11 + +namespace mozilla { + template class a {}; + namespace detail { + class GuardObjectNotifier {}; + struct b; + } + class c { + typedef detail::b d; + }; +} +namespace js { + class D { + mozilla::a e; + }; +} +struct f { + js::D g; +}; +namespace js { + struct ContextFriendFields : f {}; +} +class JSAutoCompartment { +public: + JSAutoCompartment(mozilla::detail::GuardObjectNotifier); +}; From 0f4403653ebe833cb70c79f58c53fe6d19b8d562 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 26 Jan 2017 16:25:22 -0800 Subject: [PATCH 0268/2291] Fix .gitignore and extra crates' Cargo.lock files The leading ./ breaks git, apparently. --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index e9421ffcf5..71a7df6d78 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # Cargo target/ *~ -./bindgen-integration/Cargo.lock -./tests/expectations/Cargo.lock +bindgen-integration/Cargo.lock +tests/expectations/Cargo.lock #*# From 44ed608a55cbdde778b9abd95e9953a9b14fc40e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 26 Jan 2017 16:19:20 -0800 Subject: [PATCH 0269/2291] Assert that if we generating code for an item, than it is whitelisted This is a useful debugging tool for us to catch when code generation and whitelisting have different understandings of the world. --- src/codegen/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index b4ef860692..3a5ae69036 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -287,6 +287,7 @@ impl CodeGenerator for Item { } debug!("::codegen: self = {:?}", self); + assert!(whitelisted_items.contains(&self.id())); result.set_seen(self.id()); From 1bdd1a50d50d7679e02d283043a7edcd20e948a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 27 Jan 2017 14:00:05 +0100 Subject: [PATCH 0270/2291] codegen: Derive stuff in forward declarations. So Rust is happy when you use them in template parameters, since the Derive implementations can't catch this otherwise. --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/codegen/mod.rs | 1 + .../tests/forward-declaration-autoptr.rs | 27 +++++++++++++++++++ .../tests/forward_declared_complex_types.rs | 3 +++ ...ame_struct_name_in_different_namespaces.rs | 1 + tests/headers/forward-declaration-autoptr.hpp | 10 +++++++ 7 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 tests/expectations/tests/forward-declaration-autoptr.rs create mode 100644 tests/headers/forward-declaration-autoptr.hpp diff --git a/Cargo.lock b/Cargo.lock index 618a02f6de..007c6b145d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ [root] name = "bindgen" -version = "0.20.3" +version = "0.20.4" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 085b9df8d7..cfb648b23f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.20.3" +version = "0.20.4" build = "build.rs" [badges] diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 3a5ae69036..db17a3d1bd 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -775,6 +775,7 @@ impl CodeGenerator for CompInfo { let struct_name = ctx.rust_ident_raw(&struct_name); let tuple_struct = quote_item!(ctx.ext_cx(), #[repr(C)] + #[derive(Debug, Copy, Clone)] pub struct $struct_name([u8; 0]); ) .unwrap(); diff --git a/tests/expectations/tests/forward-declaration-autoptr.rs b/tests/expectations/tests/forward-declaration-autoptr.rs new file mode 100644 index 0000000000..31013d3aef --- /dev/null +++ b/tests/expectations/tests/forward-declaration-autoptr.rs @@ -0,0 +1,27 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Foo([u8; 0]); +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RefPtr { + pub m_inner: *mut T, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct Bar { + pub m_member: RefPtr, +} +#[test] +fn bindgen_test_layout_Bar() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for Bar { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/forward_declared_complex_types.rs b/tests/expectations/tests/forward_declared_complex_types.rs index 77849a91fd..119ea2b535 100644 --- a/tests/expectations/tests/forward_declared_complex_types.rs +++ b/tests/expectations/tests/forward_declared_complex_types.rs @@ -18,6 +18,7 @@ impl Clone for Foo_empty { fn clone(&self) -> Self { *self } } #[repr(C)] +#[derive(Debug, Copy, Clone)] pub struct Foo([u8; 0]); #[repr(C)] #[derive(Debug, Copy)] @@ -37,12 +38,14 @@ extern "C" { pub fn baz_struct(f: *mut Foo); } #[repr(C)] +#[derive(Debug, Copy, Clone)] pub struct Union([u8; 0]); extern "C" { #[link_name = "_Z9baz_unionP5Union"] pub fn baz_union(u: *mut Union); } #[repr(C)] +#[derive(Debug, Copy, Clone)] pub struct Quux([u8; 0]); extern "C" { #[link_name = "_Z9baz_classP4Quux"] diff --git a/tests/expectations/tests/same_struct_name_in_different_namespaces.rs b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs index c59e4d44b7..dbf93daadb 100644 --- a/tests/expectations/tests/same_struct_name_in_different_namespaces.rs +++ b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs @@ -5,6 +5,7 @@ #[repr(C)] +#[derive(Debug, Copy, Clone)] pub struct JS_Zone([u8; 0]); #[repr(C)] #[derive(Debug, Copy)] diff --git a/tests/headers/forward-declaration-autoptr.hpp b/tests/headers/forward-declaration-autoptr.hpp new file mode 100644 index 0000000000..a26c1cd2eb --- /dev/null +++ b/tests/headers/forward-declaration-autoptr.hpp @@ -0,0 +1,10 @@ +class Foo; + +template +struct RefPtr { + T* m_inner; +}; + +struct Bar { + RefPtr m_member; +}; From d4f772b83ab0ed5d957ab51dbd096dec1d88076d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 27 Jan 2017 18:48:46 +0100 Subject: [PATCH 0271/2291] Remove recently-added assertion pending investigation. This fails under BaseErrorResult in Stylo builds. I have no idea right now why that isn't whitelisted (should be, given we're calling it from TErrorResult's code generation). Let's disable this pending further investigation since I don't have time to dig into it right now. --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/codegen/mod.rs | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 007c6b145d..476019961d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ [root] name = "bindgen" -version = "0.20.4" +version = "0.20.5" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index cfb648b23f..8ee91b041e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.20.4" +version = "0.20.5" build = "build.rs" [badges] diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index db17a3d1bd..7af70e9890 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -287,7 +287,12 @@ impl CodeGenerator for Item { } debug!("::codegen: self = {:?}", self); - assert!(whitelisted_items.contains(&self.id())); + if !whitelisted_items.contains(&self.id()) { + // TODO(emilio, #453): Figure out what to do when this happens + // legitimately, we could track the opaque stuff and disable the + // assertion there I guess. + error!("Found non-whitelisted item in code generation: {:?}", self); + } result.set_seen(self.id()); From a00e8b03da825e13a809234abcace81d6cf59335 Mon Sep 17 00:00:00 2001 From: Flier Lu Date: Sat, 28 Jan 2017 22:12:42 +0800 Subject: [PATCH 0272/2291] treat incomplete array as zero length array fix issue #455 --- src/ir/ty.rs | 11 +++++++++-- tests/expectations/tests/class.rs | 2 ++ tests/expectations/tests/var-tracing.rs | 2 +- tests/headers/class.hpp | 2 ++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 1e87beb466..96a6e6a203 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -816,8 +816,7 @@ impl Type { } // XXX DependentSizedArray is wrong CXType_VariableArray | - CXType_DependentSizedArray | - CXType_IncompleteArray => { + CXType_DependentSizedArray => { let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), location, parent_id, @@ -825,6 +824,14 @@ impl Type { .expect("Not able to resolve array element?"); TypeKind::Pointer(inner) } + CXType_IncompleteArray => { + let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), + location, + parent_id, + ctx) + .expect("Not able to resolve array element?"); + TypeKind::Array(inner, 0) + } CXType_FunctionNoProto | CXType_FunctionProto => { let signature = try!(FunctionSig::from_ty(ty, diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index 579c24a44b..951b259a86 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -32,6 +32,8 @@ impl ::std::fmt::Debug for __BindgenUnionField { pub struct C { pub a: ::std::os::raw::c_int, pub big_array: [::std::os::raw::c_char; 33usize], + pub zero_length_array: [::std::os::raw::c_char; 0usize], + pub incomplete_array: [::std::os::raw::c_char; 0usize], } #[test] fn bindgen_test_layout_C() { diff --git a/tests/expectations/tests/var-tracing.rs b/tests/expectations/tests/var-tracing.rs index 75c5ebe3be..ef5660eb57 100644 --- a/tests/expectations/tests/var-tracing.rs +++ b/tests/expectations/tests/var-tracing.rs @@ -36,7 +36,7 @@ pub struct Baz { } extern "C" { #[link_name = "_ZN3Baz3FOOE"] - pub static mut Baz_FOO: *const Bar; + pub static mut Baz_FOO: [Bar; 0usize]; } #[test] fn bindgen_test_layout_Baz() { diff --git a/tests/headers/class.hpp b/tests/headers/class.hpp index e753f186cf..402f8b2b91 100644 --- a/tests/headers/class.hpp +++ b/tests/headers/class.hpp @@ -2,6 +2,8 @@ class C { int a; // More than rust limits (32) char big_array[33]; + char zero_length_array[0]; + char incomplete_array[]; }; class WithDtor { From 0958c7d46ad7e5f9eca21c3bfe5de998559cecde Mon Sep 17 00:00:00 2001 From: Flier Lu Date: Sat, 28 Jan 2017 23:46:46 +0800 Subject: [PATCH 0273/2291] generate helper class to access incomplete array --- src/codegen/mod.rs | 76 +++++++++++++++++++++++++++++++ src/ir/ty.rs | 9 ++++ tests/expectations/tests/class.rs | 25 +++++++++- 3 files changed, 108 insertions(+), 2 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 7af70e9890..4783e821b9 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -84,6 +84,9 @@ struct CodegenResult<'a> { /// Whether an union has been generated at least once. saw_union: bool, + /// Whether an incomplete array has been generated at least once. + saw_incomplete_array: bool, + items_seen: HashSet, /// The set of generated function/var names, needed because in C/C++ is /// legal to do something like: @@ -115,6 +118,7 @@ impl<'a> CodegenResult<'a> { CodegenResult { items: vec![], saw_union: false, + saw_incomplete_array: false, codegen_id: codegen_id, items_seen: Default::default(), functions_seen: Default::default(), @@ -132,6 +136,10 @@ impl<'a> CodegenResult<'a> { self.saw_union = true; } + fn saw_incomplete_array(&mut self) { + self.saw_incomplete_array = true; + } + fn seen(&self, item: ItemId) -> bool { self.items_seen.contains(&item) } @@ -175,6 +183,7 @@ impl<'a> CodegenResult<'a> { cb(&mut new); self.saw_union |= new.saw_union; + self.saw_incomplete_array |= new.saw_incomplete_array; new.items } @@ -344,6 +353,10 @@ impl CodeGenerator for Module { if saw_union && !ctx.options().unstable_rust { utils::prepend_union_types(ctx, &mut *result); } + let saw_incomplete_array = result.saw_incomplete_array; + if saw_incomplete_array && !ctx.options().unstable_rust { + utils::prepend_incomplete_array_types(ctx, &mut *result); + } if ctx.need_bindegen_complex_type() { utils::prepend_complex_type(ctx, &mut *result); } @@ -1013,6 +1026,16 @@ impl CodeGenerator for CompInfo { } else { quote_ty!(ctx.ext_cx(), __BindgenUnionField<$ty>) } + } else if let Some(item) = field_ty.is_incomplete_array(ctx) { + result.saw_incomplete_array(); + + let inner = item.to_rust_ty(ctx); + + if ctx.options().enable_cxx_namespaces { + quote_ty!(ctx.ext_cx(), root::__IncompleteArrayField<$inner>) + } else { + quote_ty!(ctx.ext_cx(), __IncompleteArrayField<$inner>) + } } else { ty }; @@ -2333,6 +2356,59 @@ mod utils { result.extend(old_items.into_iter()); } + pub fn prepend_incomplete_array_types(ctx: &BindgenContext, + result: &mut Vec>) { + let prefix = ctx.trait_prefix(); + + // TODO(emilio): The fmt::Debug impl could be way nicer with + // std::intrinsics::type_name, but... + let incomplete_array_decl = quote_item!(ctx.ext_cx(), + #[repr(C)] + pub struct __IncompleteArrayField( + ::$prefix::marker::PhantomData); + ) + .unwrap(); + + let incomplete_array_impl = quote_item!(&ctx.ext_cx(), + impl __IncompleteArrayField { + #[inline] + pub fn new() -> Self { + __IncompleteArrayField(::$prefix::marker::PhantomData) + } + + #[inline] + pub unsafe fn as_slice(&self, len: usize) -> &[T] { + ::std::slice::from_raw_parts(::std::mem::transmute(self), len) + } + + #[inline] + pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { + ::std::slice::from_raw_parts_mut(::std::mem::transmute(self), len) + } + } + ) + .unwrap(); + + let incomplete_array_debug_impl = quote_item!(ctx.ext_cx(), + impl ::std::fmt::Debug for __IncompleteArrayField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + fmt.write_str("__IncompleteArrayField") + } + } + ) + .unwrap(); + + let items = vec![ + incomplete_array_decl, + incomplete_array_impl, + incomplete_array_debug_impl, + ]; + + let old_items = mem::replace(result, items); + result.extend(old_items.into_iter()); + } + pub fn prepend_complex_type(ctx: &BindgenContext, result: &mut Vec>) { let complex_type = quote_item!(ctx.ext_cx(), diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 96a6e6a203..f120e180c5 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -194,6 +194,15 @@ impl Type { } } + /// Is this a incomplete array type? + pub fn is_incomplete_array(&self, ctx: &BindgenContext) -> Option { + match self.kind { + TypeKind::Array(item, len) => if len == 0 { Some(item) } else { None }, + TypeKind::ResolvedTypeRef(inner) => ctx.resolve_type(inner).is_incomplete_array(ctx), + _ => None, + } + } + /// What is the layout of this type? pub fn layout(&self, ctx: &BindgenContext) -> Option { use std::mem; diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index 951b259a86..3852cc0416 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -4,6 +4,27 @@ #![allow(non_snake_case)] +#[repr(C)] +pub struct __IncompleteArrayField(::std::marker::PhantomData); +impl __IncompleteArrayField { + #[inline] + pub fn new() -> Self { + __IncompleteArrayField(::std::marker::PhantomData) + } + #[inline] + pub unsafe fn as_slice(&self, len: usize) -> &[T] { + ::std::slice::from_raw_parts(::std::mem::transmute(self), len) + } + #[inline] + pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { + ::std::slice::from_raw_parts_mut(::std::mem::transmute(self), len) + } +} +impl ::std::fmt::Debug for __IncompleteArrayField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__IncompleteArrayField") + } +} #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -32,8 +53,8 @@ impl ::std::fmt::Debug for __BindgenUnionField { pub struct C { pub a: ::std::os::raw::c_int, pub big_array: [::std::os::raw::c_char; 33usize], - pub zero_length_array: [::std::os::raw::c_char; 0usize], - pub incomplete_array: [::std::os::raw::c_char; 0usize], + pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>, + pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>, } #[test] fn bindgen_test_layout_C() { From 4eccd3cf2d6518ceed42156d76cf054a97360e58 Mon Sep 17 00:00:00 2001 From: Flier Lu Date: Sun, 29 Jan 2017 00:00:24 +0800 Subject: [PATCH 0274/2291] more test cases for zero length array and incomplete array --- tests/expectations/tests/class.rs | 38 +++++++++++++++++++++++++++++-- tests/headers/class.hpp | 20 ++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index 3852cc0416..1b8235cbe7 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -53,8 +53,6 @@ impl ::std::fmt::Debug for __BindgenUnionField { pub struct C { pub a: ::std::os::raw::c_int, pub big_array: [::std::os::raw::c_char; 33usize], - pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>, - pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>, } #[test] fn bindgen_test_layout_C() { @@ -62,6 +60,42 @@ fn bindgen_test_layout_C() { assert_eq!(::std::mem::align_of::() , 4usize); } #[repr(C)] +pub struct C_with_zero_length_array { + pub a: ::std::os::raw::c_int, + pub big_array: [::std::os::raw::c_char; 33usize], + pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>, +} +#[test] +fn bindgen_test_layout_C_with_zero_length_array() { + assert_eq!(::std::mem::size_of::() , 40usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +#[repr(C)] +pub struct C_with_incomplete_array { + pub a: ::std::os::raw::c_int, + pub big_array: [::std::os::raw::c_char; 33usize], + pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>, +} +#[test] +fn bindgen_test_layout_C_with_incomplete_array() { + assert_eq!(::std::mem::size_of::() , 40usize); + assert_eq!(::std::mem::align_of::() , 4usize); +} +#[repr(C)] +pub struct C_with_zero_length_array_and_incomplete_array { + pub a: ::std::os::raw::c_int, + pub big_array: [::std::os::raw::c_char; 33usize], + pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>, + pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>, +} +#[test] +fn bindgen_test_layout_C_with_zero_length_array_and_incomplete_array() { + assert_eq!(::std::mem::size_of::() + , 40usize); + assert_eq!(::std::mem::align_of::() + , 4usize); +} +#[repr(C)] #[derive(Debug)] pub struct WithDtor { pub b: ::std::os::raw::c_int, diff --git a/tests/headers/class.hpp b/tests/headers/class.hpp index 402f8b2b91..67ecb37b24 100644 --- a/tests/headers/class.hpp +++ b/tests/headers/class.hpp @@ -2,6 +2,26 @@ class C { int a; // More than rust limits (32) char big_array[33]; +}; + +class C_with_zero_length_array { + int a; + // More than rust limits (32) + char big_array[33]; + char zero_length_array[0]; +}; + +class C_with_incomplete_array { + int a; + // More than rust limits (32) + char big_array[33]; + char incomplete_array[]; +}; + +class C_with_zero_length_array_and_incomplete_array { + int a; + // More than rust limits (32) + char big_array[33]; char zero_length_array[0]; char incomplete_array[]; }; From edf7f35aefbe966537f7d20544aa1f692b6ba0ba Mon Sep 17 00:00:00 2001 From: Flier Lu Date: Sun, 29 Jan 2017 00:47:17 +0800 Subject: [PATCH 0275/2291] extract unsafe ZeroedSizeArray trait --- src/codegen/mod.rs | 19 +++++++++++++------ tests/expectations/tests/class.rs | 10 ++++++++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 4783e821b9..0a6737bb66 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -353,8 +353,7 @@ impl CodeGenerator for Module { if saw_union && !ctx.options().unstable_rust { utils::prepend_union_types(ctx, &mut *result); } - let saw_incomplete_array = result.saw_incomplete_array; - if saw_incomplete_array && !ctx.options().unstable_rust { + if result.saw_incomplete_array { utils::prepend_incomplete_array_types(ctx, &mut *result); } if ctx.need_bindegen_complex_type() { @@ -2360,8 +2359,6 @@ mod utils { result: &mut Vec>) { let prefix = ctx.trait_prefix(); - // TODO(emilio): The fmt::Debug impl could be way nicer with - // std::intrinsics::type_name, but... let incomplete_array_decl = quote_item!(ctx.ext_cx(), #[repr(C)] pub struct __IncompleteArrayField( @@ -2376,14 +2373,24 @@ mod utils { __IncompleteArrayField(::$prefix::marker::PhantomData) } + #[inline] + pub unsafe fn as_ptr(&self) -> *const T { + ::$prefix::mem::transmute(self) + } + + #[inline] + pub unsafe fn as_mut_ptr(&mut self) -> *mut T { + ::$prefix::mem::transmute(self) + } + #[inline] pub unsafe fn as_slice(&self, len: usize) -> &[T] { - ::std::slice::from_raw_parts(::std::mem::transmute(self), len) + ::std::slice::from_raw_parts(self.as_ptr(), len) } #[inline] pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { - ::std::slice::from_raw_parts_mut(::std::mem::transmute(self), len) + ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) } } ) diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index 1b8235cbe7..29d1e90480 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -12,12 +12,18 @@ impl __IncompleteArrayField { __IncompleteArrayField(::std::marker::PhantomData) } #[inline] + pub unsafe fn as_ptr(&self) -> *const T { ::std::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut_ptr(&mut self) -> *mut T { + ::std::mem::transmute(self) + } + #[inline] pub unsafe fn as_slice(&self, len: usize) -> &[T] { - ::std::slice::from_raw_parts(::std::mem::transmute(self), len) + ::std::slice::from_raw_parts(self.as_ptr(), len) } #[inline] pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { - ::std::slice::from_raw_parts_mut(::std::mem::transmute(self), len) + ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) } } impl ::std::fmt::Debug for __IncompleteArrayField { From be02472fced1b558262c6bbbc0f92f6a0c95ca70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 29 Jan 2017 10:38:16 +0100 Subject: [PATCH 0276/2291] tests: Add an integration test for static arrays. Turns out they were broken before https://github.com/servo/rust-bindgen/issues/456. Let's test it so it doesn't regress. --- bindgen-integration/cpp/Test.cc | 7 +++++++ bindgen-integration/cpp/Test.h | 4 ++++ bindgen-integration/src/lib.rs | 23 +++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/bindgen-integration/cpp/Test.cc b/bindgen-integration/cpp/Test.cc index d9c13a7671..fa0ff827e3 100644 --- a/bindgen-integration/cpp/Test.cc +++ b/bindgen-integration/cpp/Test.cc @@ -1,5 +1,12 @@ #include "Test.h" +const int Test::COUNTDOWN[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; +const int* Test::COUNTDOWN_PTR = Test::COUNTDOWN; + +const int* Test::countdown() { + return COUNTDOWN; +} + const char* Test::name() { return "Test"; } diff --git a/bindgen-integration/cpp/Test.h b/bindgen-integration/cpp/Test.h index f1e38c40f6..db90f4d7b9 100644 --- a/bindgen-integration/cpp/Test.h +++ b/bindgen-integration/cpp/Test.h @@ -7,6 +7,10 @@ class Test { static const char* name(); Test(int foo); Test(double foo); + + static const int COUNTDOWN[]; + static const int* COUNTDOWN_PTR; + static const int* countdown(); }; namespace testing { diff --git a/bindgen-integration/src/lib.rs b/bindgen-integration/src/lib.rs index 5c4b43083f..c64589a8bc 100644 --- a/bindgen-integration/src/lib.rs +++ b/bindgen-integration/src/lib.rs @@ -3,6 +3,29 @@ mod bindings { } use std::ffi::CStr; +use std::os::raw::c_int; + +#[test] +fn test_static_array() { + let mut test = unsafe { bindings::Test_COUNTDOWN.as_ptr() }; + let expected = unsafe { bindings::Test_countdown()}; + let also_expected = unsafe { bindings::Test_COUNTDOWN_PTR }; + assert!(!test.is_null()); + assert_eq!(also_expected, expected); + assert_eq!(test, also_expected); + + let mut expected = 10; + unsafe { + loop { + assert_eq!(*test, expected); + if *test == 0 { + break; + } + test = test.offset(1); + expected -= 1; + } + } +} #[test] fn test_static_method() { From fedca4883881b3d589df06a8808fef22ce205808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 29 Jan 2017 13:37:07 +0100 Subject: [PATCH 0277/2291] Force copy for incomplete arrays. These aren't extremely great, since this usually requires extra bookkeeping. But C allows it, so let's keep the same semantics. --- src/codegen/mod.rs | 27 ++++++++++++++++++++++----- tests/expectations/tests/class.rs | 15 +++++++++++++++ tests/headers/class.hpp | 5 +++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 0a6737bb66..313ca8b0d3 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2385,31 +2385,48 @@ mod utils { #[inline] pub unsafe fn as_slice(&self, len: usize) -> &[T] { - ::std::slice::from_raw_parts(self.as_ptr(), len) + ::$prefix::slice::from_raw_parts(self.as_ptr(), len) } #[inline] pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { - ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + ::$prefix::slice::from_raw_parts_mut(self.as_mut_ptr(), len) } } ) .unwrap(); let incomplete_array_debug_impl = quote_item!(ctx.ext_cx(), - impl ::std::fmt::Debug for __IncompleteArrayField { - fn fmt(&self, fmt: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { + impl ::$prefix::fmt::Debug for __IncompleteArrayField { + fn fmt(&self, fmt: &mut ::$prefix::fmt::Formatter) + -> ::$prefix::fmt::Result { fmt.write_str("__IncompleteArrayField") } } ) .unwrap(); + let incomplete_array_clone_impl = quote_item!(&ctx.ext_cx(), + impl ::$prefix::clone::Clone for __IncompleteArrayField { + #[inline] + fn clone(&self) -> Self { + Self::new() + } + } + ) + .unwrap(); + + let incomplete_array_copy_impl = quote_item!(&ctx.ext_cx(), + impl ::$prefix::marker::Copy for __IncompleteArrayField {} + ) + .unwrap(); + let items = vec![ incomplete_array_decl, incomplete_array_impl, incomplete_array_debug_impl, + incomplete_array_clone_impl, + incomplete_array_copy_impl, ]; let old_items = mem::replace(result, items); diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index 29d1e90480..e55a9fe357 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -31,6 +31,11 @@ impl ::std::fmt::Debug for __IncompleteArrayField { fmt.write_str("__IncompleteArrayField") } } +impl ::std::clone::Clone for __IncompleteArrayField { + #[inline] + fn clone(&self) -> Self { Self::new() } +} +impl ::std::marker::Copy for __IncompleteArrayField { } #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); impl __BindgenUnionField { @@ -112,6 +117,16 @@ fn bindgen_test_layout_WithDtor() { assert_eq!(::std::mem::align_of::() , 4usize); } #[repr(C)] +pub struct IncompleteArrayNonCopiable { + pub whatever: *mut ::std::os::raw::c_void, + pub incomplete_array: __IncompleteArrayField, +} +#[test] +fn bindgen_test_layout_IncompleteArrayNonCopiable() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +#[repr(C)] #[derive(Debug, Copy)] pub struct Union { pub d: __BindgenUnionField, diff --git a/tests/headers/class.hpp b/tests/headers/class.hpp index 67ecb37b24..1de164710d 100644 --- a/tests/headers/class.hpp +++ b/tests/headers/class.hpp @@ -32,6 +32,11 @@ class WithDtor { ~WithDtor() {} }; +class IncompleteArrayNonCopiable { + void* whatever; + C incomplete_array[]; +}; + union Union { float d; int i; From f4d4994c1481baaf0a6e643bf3d3466d35bf950b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 6 Jan 2017 12:15:52 +0100 Subject: [PATCH 0278/2291] codegen: ignore aliases for decltypes we can't resolve. We do the same for template parameters with `typename` on aliases. This is not great, but it's better than generating invalid code. --- src/codegen/mod.rs | 25 ++++++++++++++++--- src/ir/ty.rs | 21 ++++++++++++++++ .../expectations/tests/381-decltype-alias.rs | 12 +++++++++ tests/headers/381-decltype-alias.hpp | 7 ++++++ 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 tests/expectations/tests/381-decltype-alias.rs create mode 100644 tests/headers/381-decltype-alias.hpp diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 313ca8b0d3..c36dd64448 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -549,6 +549,26 @@ impl CodeGenerator for Type { inner_item.to_rust_ty(ctx) }; + { + // FIXME(emilio): This is a workaround to avoid generating + // incorrect type aliases because of types that we haven't + // been able to resolve (because, eg, they depend on a + // template parameter). + // + // It's kind of a shame not generating them even when they + // could be referenced, but we already do the same for items + // with invalid template parameters, and at least this way + // they can be replaced, instead of generating plain invalid + // code. + let inner_canon_type = + inner_item.expect_type().canonical_type(ctx); + if inner_canon_type.is_invalid_named_type() { + warn!("Item contained invalid named type, skipping: \ + {:?}, {:?}", item, inner_item); + return; + } + } + let rust_name = ctx.rust_ident(&name); let mut typedef = aster::AstBuilder::new().item().pub_(); @@ -586,9 +606,8 @@ impl CodeGenerator for Type { for template_arg in applicable_template_args.iter() { let template_arg = ctx.resolve_type(*template_arg); if template_arg.is_named() { - let name = template_arg.name().unwrap(); - if name.contains("typename ") { - warn!("Item contained `typename`'d template \ + if template_arg.is_invalid_named_type() { + warn!("Item contained invalid template \ parameter: {:?}", item); return; } diff --git a/src/ir/ty.rs b/src/ir/ty.rs index f120e180c5..005caccac7 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -292,6 +292,27 @@ impl Type { } } + /// Whether this named type is an invalid C++ identifier. This is done to + /// avoid generating invalid code with some cases we can't handle, see: + /// + /// tests/headers/381-decltype-alias.hpp + pub fn is_invalid_named_type(&self) -> bool { + match self.kind { + TypeKind::Named(ref name) => { + assert!(!name.is_empty()); + let mut chars = name.chars(); + let first = chars.next().unwrap(); + let mut remaining = chars; + + let valid = (first.is_alphabetic() || first == '_') && + remaining.all(|c| c.is_alphanumeric() || c == '_'); + + !valid + } + _ => false, + } + } + /// See safe_canonical_type. pub fn canonical_type<'tr>(&'tr self, ctx: &'tr BindgenContext) diff --git a/tests/expectations/tests/381-decltype-alias.rs b/tests/expectations/tests/381-decltype-alias.rs new file mode 100644 index 0000000000..766be3bced --- /dev/null +++ b/tests/expectations/tests/381-decltype-alias.rs @@ -0,0 +1,12 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct std_allocator_traits<_Alloc> { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData<_Alloc>, +} diff --git a/tests/headers/381-decltype-alias.hpp b/tests/headers/381-decltype-alias.hpp new file mode 100644 index 0000000000..0bec2fc7d1 --- /dev/null +++ b/tests/headers/381-decltype-alias.hpp @@ -0,0 +1,7 @@ +// bindgen-flags: -- -std=c++11 + +namespace std { + template struct allocator_traits { + typedef decltype ( _S_size_type_helper ( ( _Alloc * ) 0 ) ) __size_type; + }; +} From a46971c201c276b9a9706f22876a67b51d08de97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 30 Jan 2017 19:41:13 +0100 Subject: [PATCH 0279/2291] ir: Cleanup name duplication in aliases and named types. It's just dumb. --- src/codegen/mod.rs | 14 ++++---- src/ir/item.rs | 10 +++--- src/ir/ty.rs | 87 ++++++++++++++++++---------------------------- 3 files changed, 47 insertions(+), 64 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index c36dd64448..436c2bd7d9 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -507,7 +507,7 @@ impl CodeGenerator for Type { TypeKind::TemplateRef(..) | TypeKind::Function(..) | TypeKind::ResolvedTypeRef(..) | - TypeKind::Named(..) => { + TypeKind::Named => { // These items don't need code generation, they only need to be // converted to rust types in fields, arguments, and such. return; @@ -517,8 +517,8 @@ impl CodeGenerator for Type { } // NB: The code below will pick the correct // applicable_template_args. - TypeKind::TemplateAlias(ref spelling, inner, _) | - TypeKind::Alias(ref spelling, inner) => { + TypeKind::TemplateAlias(inner, _) | + TypeKind::Alias(inner) => { let inner_item = ctx.resolve_item(inner); let name = item.canonical_name(ctx); @@ -534,6 +534,7 @@ impl CodeGenerator for Type { // If this is a known named type, disallow generating anything // for it too. + let spelling = self.name().expect("Unnamed alias?"); if utils::type_from_named(ctx, spelling, inner).is_some() { return; } @@ -2043,14 +2044,15 @@ impl ToRustTy for Type { P(inner_ty) } TypeKind::ResolvedTypeRef(inner) => inner.to_rust_ty(ctx), - TypeKind::TemplateAlias(ref spelling, inner, _) | - TypeKind::Alias(ref spelling, inner) => { + TypeKind::TemplateAlias(inner, _) | + TypeKind::Alias(inner) => { let applicable_named_args = item.applicable_template_args(ctx) .into_iter() .filter(|arg| ctx.resolve_type(*arg).is_named()) .collect::>(); + let spelling = self.name().expect("Unnamed alias?"); if item.is_opaque(ctx) && !applicable_named_args.is_empty() { // Pray if there's no available layout. let layout = self.layout(ctx).unwrap_or_else(Layout::zero); @@ -2104,7 +2106,7 @@ impl ToRustTy for Type { ty.to_ptr(is_const, ctx.span()) } } - TypeKind::Named(..) => { + TypeKind::Named => { let name = item.canonical_name(ctx); let ident = ctx.rust_ident(&name); quote_ty!(ctx.ext_cx(), $ident) diff --git a/src/ir/item.rs b/src/ir/item.rs index 7b18b3317b..aef35d0b2d 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -561,8 +561,8 @@ impl Item { parent_template_args.iter().any(|parent_item| { let parent_ty = ctx.resolve_type(*parent_item); match (parent_ty.kind(), item_ty.kind()) { - (&TypeKind::Named(ref n), &TypeKind::Named(ref i)) => { - n == i + (&TypeKind::Named, &TypeKind::Named) => { + parent_ty.name() == item_ty.name() } _ => false, } @@ -570,14 +570,14 @@ impl Item { } match *ty.kind() { - TypeKind::Named(..) => vec![self.id()], + TypeKind::Named => vec![self.id()], TypeKind::Array(inner, _) | TypeKind::Pointer(inner) | TypeKind::Reference(inner) | TypeKind::ResolvedTypeRef(inner) => { ctx.resolve_item(inner).applicable_template_args(ctx) } - TypeKind::Alias(_, inner) => { + TypeKind::Alias(inner) => { let parent_args = ctx.resolve_item(self.parent_id()) .applicable_template_args(ctx); let inner = ctx.resolve_item(inner); @@ -594,7 +594,7 @@ impl Item { } // XXX Is this completely correct? Partial template specialization // is hard anyways, sigh... - TypeKind::TemplateAlias(_, _, ref args) | + TypeKind::TemplateAlias(_, ref args) | TypeKind::TemplateRef(_, ref args) => args.clone(), // In a template specialization we've got all we want. TypeKind::Comp(ref ci) if ci.is_template_specialization() => { diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 005caccac7..d0de72a08b 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -65,22 +65,6 @@ impl Type { &self.kind } - /// Overrides the kind of the item. This is mostly a template alias - /// implementation detail, and debug assertions guard it like so. - pub fn set_kind(&mut self, kind: TypeKind) { - if cfg!(debug_assertions) { - match (&self.kind, &kind) { - (&TypeKind::Alias(ref alias_name, alias_inner), - &TypeKind::TemplateAlias(ref name, inner, _)) => { - assert_eq!(alias_name, name); - assert_eq!(alias_inner, inner); - } - _ => panic!("Unexpected kind in `set_kind`!"), - }; - } - self.kind = kind; - } - /// Get a mutable reference to this type's kind. pub fn kind_mut(&mut self) -> &mut TypeKind { &mut self.kind @@ -102,7 +86,7 @@ impl Type { /// Is this a named type? pub fn is_named(&self) -> bool { match self.kind { - TypeKind::Named(..) => true, + TypeKind::Named => true, _ => false, } } @@ -143,7 +127,7 @@ impl Type { TypeKind::BlockPointer | TypeKind::Int(..) | TypeKind::Float(..) | - TypeKind::Named(..) => true, + TypeKind::Named => true, _ => false, } } @@ -151,9 +135,7 @@ impl Type { /// Creates a new named type, with name `name`. pub fn named(name: String) -> Self { assert!(!name.is_empty()); - // TODO: stop duplicating the name, it's stupid. - let kind = TypeKind::Named(name.clone()); - Self::new(Some(name), None, kind, false) + Self::new(Some(name), None, TypeKind::Named, false) } /// Is this a floating point type? @@ -230,8 +212,8 @@ impl Type { // FIXME: Can we do something about template parameters? Huh... match self.kind { TypeKind::TemplateRef(t, _) | - TypeKind::TemplateAlias(_, t, _) | - TypeKind::Alias(_, t) | + TypeKind::TemplateAlias(t, _) | + TypeKind::Alias(t) | TypeKind::ResolvedTypeRef(t) => ctx.resolve_type(t).has_vtable(ctx), TypeKind::Comp(ref info) => info.has_vtable(ctx), _ => false, @@ -243,8 +225,8 @@ impl Type { pub fn has_destructor(&self, ctx: &BindgenContext) -> bool { match self.kind { TypeKind::TemplateRef(t, _) | - TypeKind::TemplateAlias(_, t, _) | - TypeKind::Alias(_, t) | + TypeKind::TemplateAlias(t, _) | + TypeKind::Alias(t) | TypeKind::ResolvedTypeRef(t) => { ctx.resolve_type(t).has_destructor(ctx) } @@ -259,16 +241,16 @@ impl Type { ty: &Type) -> bool { let name = match *ty.kind() { - TypeKind::Named(ref name) => name, + TypeKind::Named => ty.name(), ref other @ _ => unreachable!("Not a named type: {:?}", other), }; match self.kind { - TypeKind::Named(ref this_name) => this_name == name, + TypeKind::Named => self.name() == name, TypeKind::ResolvedTypeRef(t) | TypeKind::Array(t, _) | TypeKind::Pointer(t) | - TypeKind::Alias(_, t) => { + TypeKind::Alias(t) => { ctx.resolve_type(t) .signature_contains_named_type(ctx, ty) } @@ -280,7 +262,7 @@ impl Type { ctx.resolve_type(sig.return_type()) .signature_contains_named_type(ctx, ty) } - TypeKind::TemplateAlias(_, _, ref template_args) | + TypeKind::TemplateAlias(_, ref template_args) | TypeKind::TemplateRef(_, ref template_args) => { template_args.iter().any(|arg| { ctx.resolve_type(*arg) @@ -298,8 +280,8 @@ impl Type { /// tests/headers/381-decltype-alias.hpp pub fn is_invalid_named_type(&self) -> bool { match self.kind { - TypeKind::Named(ref name) => { - assert!(!name.is_empty()); + TypeKind::Named => { + let name = self.name().expect("Unnamed named type?"); let mut chars = name.chars(); let first = chars.next().unwrap(); let mut remaining = chars; @@ -330,7 +312,7 @@ impl Type { ctx: &'tr BindgenContext) -> Option<&'tr Type> { match self.kind { - TypeKind::Named(..) | + TypeKind::Named | TypeKind::Array(..) | TypeKind::Comp(..) | TypeKind::Int(..) | @@ -345,8 +327,8 @@ impl Type { TypeKind::Pointer(..) => Some(self), TypeKind::ResolvedTypeRef(inner) | - TypeKind::Alias(_, inner) | - TypeKind::TemplateAlias(_, inner, _) | + TypeKind::Alias(inner) | + TypeKind::TemplateAlias(inner, _) | TypeKind::TemplateRef(inner, _) => { ctx.resolve_type(inner).safe_canonical_type(ctx) } @@ -379,8 +361,8 @@ impl CanDeriveDebug for Type { len <= RUST_DERIVE_IN_ARRAY_LIMIT && t.can_derive_debug(ctx, ()) } TypeKind::ResolvedTypeRef(t) | - TypeKind::TemplateAlias(_, t, _) | - TypeKind::Alias(_, t) => t.can_derive_debug(ctx, ()), + TypeKind::TemplateAlias(t, _) | + TypeKind::Alias(t) => t.can_derive_debug(ctx, ()), TypeKind::Comp(ref info) => { info.can_derive_debug(ctx, self.layout(ctx)) } @@ -399,9 +381,9 @@ impl<'a> CanDeriveCopy<'a> for Type { t.can_derive_copy_in_array(ctx, ()) } TypeKind::ResolvedTypeRef(t) | - TypeKind::TemplateAlias(_, t, _) | + TypeKind::TemplateAlias(t, _) | TypeKind::TemplateRef(t, _) | - TypeKind::Alias(_, t) => t.can_derive_copy(ctx, ()), + TypeKind::Alias(t) => t.can_derive_copy(ctx, ()), TypeKind::Comp(ref info) => { info.can_derive_copy(ctx, (item, self.layout(ctx))) } @@ -415,10 +397,10 @@ impl<'a> CanDeriveCopy<'a> for Type { -> bool { match self.kind { TypeKind::ResolvedTypeRef(t) | - TypeKind::TemplateAlias(_, t, _) | - TypeKind::Alias(_, t) | + TypeKind::TemplateAlias(t, _) | + TypeKind::Alias(t) | TypeKind::Array(t, _) => t.can_derive_copy_in_array(ctx, ()), - TypeKind::Named(..) => false, + TypeKind::Named => false, _ => self.can_derive_copy(ctx, item), } } @@ -460,11 +442,11 @@ pub enum TypeKind { Complex(FloatKind), /// A type alias, with a name, that points to another type. - Alias(String, ItemId), + Alias(ItemId), /// A templated alias, pointing to an inner type, just as `Alias`, but with /// template parameters. - TemplateAlias(String, ItemId, Vec), + TemplateAlias(ItemId, Vec), /// An array of a type and a lenght. Array(ItemId, usize), @@ -509,7 +491,7 @@ pub enum TypeKind { ResolvedTypeRef(ItemId), /// A named type, that is, a template parameter. - Named(String), + Named, } impl Type { @@ -527,12 +509,12 @@ impl Type { size == 0 || ctx.resolve_type(inner).is_unsized(ctx) } TypeKind::ResolvedTypeRef(inner) | - TypeKind::Alias(_, inner) | - TypeKind::TemplateAlias(_, inner, _) | + TypeKind::Alias(inner) | + TypeKind::TemplateAlias(inner, _) | TypeKind::TemplateRef(inner, _) => { ctx.resolve_type(inner).is_unsized(ctx) } - TypeKind::Named(..) | + TypeKind::Named | TypeKind::Int(..) | TypeKind::Float(..) | TypeKind::Complex(..) | @@ -725,8 +707,7 @@ impl Type { } }; - TypeKind::TemplateAlias(name.clone(), - inner_type, + TypeKind::TemplateAlias(inner_type, args) } CXCursor_TemplateRef => { @@ -873,7 +854,7 @@ impl Type { let inner = cursor.typedef_type().expect("Not valid Type?"); let inner = Item::from_ty_or_ref(inner, location, parent_id, ctx); - TypeKind::Alias(ty.spelling(), inner) + TypeKind::Alias(inner) } CXType_Enum => { let enum_ = Enum::from_ty(ty, ctx).expect("Not an enum?"); @@ -935,12 +916,12 @@ impl TypeCollector for Type { TypeKind::Pointer(inner) | TypeKind::Reference(inner) | TypeKind::Array(inner, _) | - TypeKind::Alias(_, inner) | + TypeKind::Alias(inner) | TypeKind::ResolvedTypeRef(inner) => { types.insert(inner); } - TypeKind::TemplateAlias(_, inner, ref template_args) | + TypeKind::TemplateAlias(inner, ref template_args) | TypeKind::TemplateRef(inner, ref template_args) => { types.insert(inner); for &item in template_args { @@ -962,7 +943,7 @@ impl TypeCollector for Type { // None of these variants have edges to other items and types. TypeKind::UnresolvedTypeRef(_, _, None) | - TypeKind::Named(_) | + TypeKind::Named | TypeKind::Void | TypeKind::NullPtr | TypeKind::Int(_) | From 4736263931176916c3c21a51795dd3ad74e62e3d Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Sun, 29 Jan 2017 01:10:38 +0200 Subject: [PATCH 0280/2291] Add initial Objective C support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It parses interfaces and protocol but ignores base classes, and their methods which don’t have arguments, the method signature is currently ignored. Also you can pass objc class instances to C functions. Next steps are inheritance/base classes, method signatures, properties, categories. Then check with system headers what is missing. --- src/clang.rs | 3 +- src/codegen/mod.rs | 144 +++++++++++++++++- src/ir/mod.rs | 1 + src/ir/objc.rs | 99 ++++++++++++ src/ir/ty.rs | 43 +++++- src/lib.rs | 12 ++ src/options.rs | 3 + tests/expectations/Cargo.toml | 1 + tests/expectations/tests/objc_interface.rs | 15 ++ .../expectations/tests/objc_interface_type.rs | 33 ++++ tests/expectations/tests/objc_method.rs | 17 +++ tests/headers/objc_interface.h | 8 + tests/headers/objc_interface_type.h | 13 ++ tests/headers/objc_method.h | 7 + tests/tests.rs | 8 +- 15 files changed, 394 insertions(+), 13 deletions(-) create mode 100644 src/ir/objc.rs create mode 100644 tests/expectations/tests/objc_interface.rs create mode 100644 tests/expectations/tests/objc_interface_type.rs create mode 100644 tests/expectations/tests/objc_method.rs create mode 100644 tests/headers/objc_interface.h create mode 100644 tests/headers/objc_interface_type.h create mode 100644 tests/headers/objc_method.h diff --git a/src/clang.rs b/src/clang.rs index 9cf51436df..f0c5124c3b 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -688,7 +688,8 @@ impl Type { CXType_Pointer | CXType_RValueReference | CXType_LValueReference | - CXType_MemberPointer => { + CXType_MemberPointer | + CXType_ObjCObjectPointer => { let ret = Type { x: unsafe { clang_getPointeeType(self.x) }, }; diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 436c2bd7d9..9dd3b6b9bf 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -13,6 +13,7 @@ use ir::item::{Item, ItemAncestors, ItemCanonicalName, ItemCanonicalPath}; use ir::item_kind::ItemKind; use ir::layout::Layout; use ir::module::Module; +use ir::objc::ObjCInterface; use ir::ty::{Type, TypeKind}; use ir::type_collector::ItemSet; use ir::var::Var; @@ -87,6 +88,9 @@ struct CodegenResult<'a> { /// Whether an incomplete array has been generated at least once. saw_incomplete_array: bool, + /// Whether Objective C types have been seen at least once. + saw_objc: bool, + items_seen: HashSet, /// The set of generated function/var names, needed because in C/C++ is /// legal to do something like: @@ -119,6 +123,7 @@ impl<'a> CodegenResult<'a> { items: vec![], saw_union: false, saw_incomplete_array: false, + saw_objc: false, codegen_id: codegen_id, items_seen: Default::default(), functions_seen: Default::default(), @@ -140,6 +145,10 @@ impl<'a> CodegenResult<'a> { self.saw_incomplete_array = true; } + fn saw_objc(&mut self) { + self.saw_objc = true; + } + fn seen(&self, item: ItemId) -> bool { self.items_seen.contains(&item) } @@ -184,6 +193,7 @@ impl<'a> CodegenResult<'a> { self.saw_union |= new.saw_union; self.saw_incomplete_array |= new.saw_incomplete_array; + self.saw_objc |= new.saw_objc; new.items } @@ -359,6 +369,9 @@ impl CodeGenerator for Module { if ctx.need_bindegen_complex_type() { utils::prepend_complex_type(ctx, &mut *result); } + if result.saw_objc { + utils::prepend_objc_header(ctx, &mut *result); + } } }; @@ -623,6 +636,9 @@ impl CodeGenerator for Type { TypeKind::Enum(ref ei) => { ei.codegen(ctx, result, whitelisted_items, item) } + TypeKind::ObjCInterface(ref interface) => { + interface.codegen(ctx, result, whitelisted_items, item) + } ref u @ TypeKind::UnresolvedTypeRef(..) => { unreachable!("Should have been resolved after parsing {:?}!", u) } @@ -2111,6 +2127,9 @@ impl ToRustTy for Type { let ident = ctx.rust_ident(&name); quote_ty!(ctx.ext_cx(), $ident) } + TypeKind::ObjCInterface(..) => { + quote_ty!(ctx.ext_cx(), id) + }, ref u @ TypeKind::UnresolvedTypeRef(..) => { unreachable!("Should have been resolved after parsing {:?}!", u) } @@ -2144,10 +2163,22 @@ impl ToRustTy for FunctionSig { // the array type derivation. // // [1]: http://c0x.coding-guidelines.com/6.7.5.3.html - let arg_ty = if let TypeKind::Array(t, _) = *arg_ty.canonical_type(ctx).kind() { - t.to_rust_ty(ctx).to_ptr(arg_ty.is_const(), ctx.span()) - } else { - arg_item.to_rust_ty(ctx) + let arg_ty = match *arg_ty.canonical_type(ctx).kind() { + TypeKind::Array(t, _) => { + t.to_rust_ty(ctx).to_ptr(arg_ty.is_const(), ctx.span()) + }, + TypeKind::Pointer(inner) => { + let inner = ctx.resolve_item(inner); + let inner_ty = inner.expect_type(); + if let TypeKind::ObjCInterface(_) = *inner_ty.canonical_type(ctx).kind() { + quote_ty!(ctx.ext_cx(), id) + } else { + arg_item.to_rust_ty(ctx) + } + }, + _ => { + arg_item.to_rust_ty(ctx) + } }; let arg_name = match *name { @@ -2263,6 +2294,85 @@ impl CodeGenerator for Function { } } +impl CodeGenerator for ObjCInterface { + type Extra = Item; + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + _whitelisted_items: &ItemSet, + _: &Item) { + let mut impl_items = vec![]; + let mut trait_items = vec![]; + + for method in self.methods() { + let method_name = ctx.rust_ident(method.name()); + + let body = quote_stmt!(ctx.ext_cx(), msg_send![self, $method_name]) + .unwrap(); + let block = ast::Block { + stmts: vec![body], + id: ast::DUMMY_NODE_ID, + rules: ast::BlockCheckMode::Default, + span: ctx.span(), + }; + + let sig = aster::AstBuilder::new() + .method_sig() + .unsafe_() + .fn_decl() + .self_() + .build(ast::SelfKind::Value(ast::Mutability::Immutable)) + .build(ast::FunctionRetTy::Default(ctx.span())); + let attrs = vec![]; + + let impl_item = ast::ImplItem { + id: ast::DUMMY_NODE_ID, + ident: ctx.rust_ident(method.rust_name()), + vis: ast::Visibility::Inherited, // Public, + attrs: attrs.clone(), + node: ast::ImplItemKind::Method(sig.clone(), P(block)), + defaultness: ast::Defaultness::Final, + span: ctx.span(), + }; + + let trait_item = ast::TraitItem { + id: ast::DUMMY_NODE_ID, + ident: ctx.rust_ident(method.rust_name()), + attrs: attrs, + node: ast::TraitItemKind::Method(sig, None), + span: ctx.span(), + }; + + impl_items.push(impl_item); + trait_items.push(trait_item) + } + + + let trait_block = aster::AstBuilder::new() + .item() + .pub_() + .trait_(self.name()) + .with_items(trait_items) + .build(); + + let ty_for_impl = quote_ty!(ctx.ext_cx(), id); + let impl_block = aster::AstBuilder::new() + .item() + .impl_() + .trait_() + .id(self.name()) + .build() + .with_items(impl_items) + .build_ty(ty_for_impl); + + result.push(trait_block); + result.push(impl_block); + result.saw_objc(); + } +} + + + pub fn codegen(context: &mut BindgenContext) -> Vec> { context.gen(|context| { let counter = Cell::new(0); @@ -2296,6 +2406,32 @@ mod utils { use syntax::ast; use syntax::ptr::P; + + pub fn prepend_objc_header(ctx: &BindgenContext, + result: &mut Vec>) { + let use_objc = if ctx.options().objc_extern_crate { + quote_item!(ctx.ext_cx(), + use objc; + ).unwrap() + } else { + quote_item!(ctx.ext_cx(), + #[macro_use] + extern crate objc; + ).unwrap() + }; + + + let id_type = quote_item!(ctx.ext_cx(), + #[allow(non_camel_case_types)] + pub type id = *mut objc::runtime::Object; + ) + .unwrap(); + + let items = vec![use_objc, id_type]; + let old_items = mem::replace(result, items); + result.extend(old_items.into_iter()); + } + pub fn prepend_union_types(ctx: &BindgenContext, result: &mut Vec>) { let prefix = ctx.trait_prefix(); diff --git a/src/ir/mod.rs b/src/ir/mod.rs index 73793b167f..d424fcdfaa 100644 --- a/src/ir/mod.rs +++ b/src/ir/mod.rs @@ -17,3 +17,4 @@ pub mod module; pub mod ty; pub mod type_collector; pub mod var; +pub mod objc; diff --git a/src/ir/objc.rs b/src/ir/objc.rs new file mode 100644 index 0000000000..b9fe280b0d --- /dev/null +++ b/src/ir/objc.rs @@ -0,0 +1,99 @@ +//! Objective C types + +use clang; +use clang_sys::CXChildVisit_Continue; +use clang_sys::CXCursor_ObjCInstanceMethodDecl; +// use clang_sys::CXCursor_ObjCSuperClassRef; +use super::context::BindgenContext; + +/// Objective C interface as used in TypeKind +/// +/// Also protocols are parsed as this type +#[derive(Debug)] +pub struct ObjCInterface { + /// The name + /// like, NSObject + name: String, + + /// List of the methods defined in this interfae + methods: Vec, +} + +/// The objective c methods +#[derive(Debug)] +pub struct ObjCInstanceMethod { + /// The original method selector name + /// like, dataWithBytes:length: + name: String, + + /// Method name as converted to rust + /// like, dataWithBytes_length_ + rust_name: String, +} + +impl ObjCInterface { + fn new(name: &str) -> ObjCInterface { + ObjCInterface { + name: name.to_owned(), + methods: Vec::new(), + } + } + + /// The name + /// like, NSObject + pub fn name(&self) -> &str { + self.name.as_ref() + } + + /// List of the methods defined in this interfae + pub fn methods(&self) -> &Vec { + &self.methods + } + + /// Parses the Objective C interface from the cursor + pub fn from_ty(cursor: &clang::Cursor, + _ctx: &mut BindgenContext) + -> Option { + let name = cursor.spelling(); + let mut interface = Self::new(&name); + + cursor.visit(|cursor| { + match cursor.kind() { + CXCursor_ObjCInstanceMethodDecl => { + let name = cursor.spelling(); + let method = ObjCInstanceMethod::new(&name); + + interface.methods.push(method); + } + _ => {} + } + CXChildVisit_Continue + }); + Some(interface) + } +} + +impl ObjCInstanceMethod { + fn new(name: &str) -> ObjCInstanceMethod { + let split_name: Vec<&str> = name.split(':').collect(); + + let rust_name = split_name.join("_"); + + ObjCInstanceMethod { + name: name.to_owned(), + rust_name: rust_name.to_owned(), + } + } + + /// The original method selector name + /// like, dataWithBytes:length: + pub fn name(&self) -> &str { + self.name.as_ref() + } + + /// Method name as converted to rust + /// like, dataWithBytes_length_ + pub fn rust_name(&self) -> &str { + self.rust_name.as_ref() + } +} diff --git a/src/ir/ty.rs b/src/ir/ty.rs index d0de72a08b..8d01d905b5 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -10,6 +10,7 @@ use super::function::FunctionSig; use super::int::IntKind; use super::item::Item; use super::layout::Layout; +use super::objc::ObjCInterface; use super::type_collector::{ItemSet, TypeCollector}; /// The base representation of a type in bindgen. @@ -179,8 +180,12 @@ impl Type { /// Is this a incomplete array type? pub fn is_incomplete_array(&self, ctx: &BindgenContext) -> Option { match self.kind { - TypeKind::Array(item, len) => if len == 0 { Some(item) } else { None }, - TypeKind::ResolvedTypeRef(inner) => ctx.resolve_type(inner).is_incomplete_array(ctx), + TypeKind::Array(item, len) => { + if len == 0 { Some(item) } else { None } + } + TypeKind::ResolvedTypeRef(inner) => { + ctx.resolve_type(inner).is_incomplete_array(ctx) + } _ => None, } } @@ -287,7 +292,7 @@ impl Type { let mut remaining = chars; let valid = (first.is_alphabetic() || first == '_') && - remaining.all(|c| c.is_alphanumeric() || c == '_'); + remaining.all(|c| c.is_alphanumeric() || c == '_'); !valid } @@ -324,7 +329,8 @@ impl Type { TypeKind::Void | TypeKind::NullPtr | TypeKind::BlockPointer | - TypeKind::Pointer(..) => Some(self), + TypeKind::Pointer(..) | + TypeKind::ObjCInterface(..) => Some(self), TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(inner) | @@ -492,6 +498,9 @@ pub enum TypeKind { /// A named type, that is, a template parameter. Named, + + /// Objective C interface. Always referenced through a pointer + ObjCInterface(ObjCInterface), } impl Type { @@ -525,6 +534,8 @@ impl Type { TypeKind::BlockPointer | TypeKind::Pointer(..) => false, + TypeKind::ObjCInterface(..) => true, // dunno? + TypeKind::UnresolvedTypeRef(..) => { unreachable!("Should have been resolved after parsing!"); } @@ -566,7 +577,16 @@ impl Type { debug!("currently_parsed_types: {:?}", ctx.currently_parsed_types); let canonical_ty = ty.canonical_type(); - let kind = match ty.kind() { + + // Parse objc protocols as if they were interfaces + let mut ty_kind = ty.kind(); + if let Some(loc) = location { + if loc.kind() == CXCursor_ObjCProtocolDecl { + ty_kind = CXType_ObjCInterface; + } + } + + let kind = match ty_kind { CXType_Unexposed if *ty != canonical_ty && canonical_ty.kind() != CXType_Invalid => { debug!("Looking for canonical type: {:?}", canonical_ty); @@ -707,8 +727,7 @@ impl Type { } }; - TypeKind::TemplateAlias(inner_type, - args) + TypeKind::TemplateAlias(inner_type, args) } CXCursor_TemplateRef => { let referenced = location.referenced().unwrap(); @@ -806,6 +825,7 @@ impl Type { // // We might need to, though, if the context is already in the // process of resolving them. + CXType_ObjCObjectPointer | CXType_MemberPointer | CXType_Pointer => { let inner = Item::from_ty_or_ref(ty.pointee_type().unwrap(), @@ -887,6 +907,11 @@ impl Type { parent_id, ctx); } + CXType_ObjCInterface => { + let interface = ObjCInterface::from_ty(&location.unwrap(), ctx) + .expect("Not a valid objc interface?"); + TypeKind::ObjCInterface(interface) + } _ => { error!("unsupported type: kind = {:?}; ty = {:?}; at {:?}", ty.kind(), @@ -941,6 +966,10 @@ impl TypeCollector for Type { types.insert(id); } + TypeKind::ObjCInterface(_) => { + // TODO: + } + // None of these variants have edges to other items and types. TypeKind::UnresolvedTypeRef(_, _, None) | TypeKind::Named | diff --git a/src/lib.rs b/src/lib.rs index dabab15289..d6f3c66ea4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -198,6 +198,13 @@ impl Builder { self } + /// Generate '#[macro_use] extern crate objc;' instead of 'use objc;' + /// in the prologue of the files generated from objective-c files + pub fn objc_extern_crate(mut self, doit: bool) -> Self { + self.options.objc_extern_crate = doit; + self + } + /// Generate a C/C++ file that includes the header and has dummy uses of /// every type defined in the header. pub fn dummy_uses>(mut self, dummy_uses: T) -> Builder { @@ -542,6 +549,10 @@ pub struct BindgenOptions { /// Wether to whitelist types recursively. Defaults to true. pub whitelist_recursively: bool, + + /// Intead of emitting 'use objc;' to files generated from objective c files, + /// generate '#[macro_use] extern crate objc;' + pub objc_extern_crate: bool, } impl BindgenOptions { @@ -588,6 +599,7 @@ impl Default for BindgenOptions { conservative_inline_namespaces: false, generate_comments: true, whitelist_recursively: true, + objc_extern_crate: false, } } } diff --git a/src/options.rs b/src/options.rs index 307ea6b073..535eac4bb0 100644 --- a/src/options.rs +++ b/src/options.rs @@ -49,6 +49,9 @@ pub fn builder_from_flags(args: I) Arg::with_name("no-recursive-whitelist") .long("no-recursive-whitelist") .help("Avoid whitelisting types recursively"), + Arg::with_name("objc-extern-crate") + .long("objc-extern-crate") + .help("Use extern crate instead of use for objc"), Arg::with_name("builtins") .long("builtins") .help("Output bindings for builtin definitions, e.g. \ diff --git a/tests/expectations/Cargo.toml b/tests/expectations/Cargo.toml index 034aa14151..e0da6d5a96 100644 --- a/tests/expectations/Cargo.toml +++ b/tests/expectations/Cargo.toml @@ -9,3 +9,4 @@ authors = [ ] [dependencies] +objc = "0.2" diff --git a/tests/expectations/tests/objc_interface.rs b/tests/expectations/tests/objc_interface.rs new file mode 100644 index 0000000000..027cf57e4f --- /dev/null +++ b/tests/expectations/tests/objc_interface.rs @@ -0,0 +1,15 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#![cfg(target_os="macos")] + +#[macro_use] +extern crate objc; +#[allow(non_camel_case_types)] +pub type id = *mut objc::runtime::Object; +pub trait Foo { } +impl Foo for id { } +pub trait bar { } +impl bar for id { } diff --git a/tests/expectations/tests/objc_interface_type.rs b/tests/expectations/tests/objc_interface_type.rs new file mode 100644 index 0000000000..2d68ee5078 --- /dev/null +++ b/tests/expectations/tests/objc_interface_type.rs @@ -0,0 +1,33 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#![cfg(target_os="macos")] + +#[macro_use] +extern crate objc; +#[allow(non_camel_case_types)] +pub type id = *mut objc::runtime::Object; +pub trait Foo { } +impl Foo for id { } +#[repr(C)] +#[derive(Debug, Copy)] +pub struct FooStruct { + pub foo: *mut id, +} +#[test] +fn bindgen_test_layout_FooStruct() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq!(::std::mem::align_of::() , 8usize); +} +impl Clone for FooStruct { + fn clone(&self) -> Self { *self } +} +extern "C" { + pub fn fooFunc(foo: id); +} +extern "C" { + #[link_name = "kFoo"] + pub static mut kFoo: *const id; +} diff --git a/tests/expectations/tests/objc_method.rs b/tests/expectations/tests/objc_method.rs new file mode 100644 index 0000000000..e2db24f69d --- /dev/null +++ b/tests/expectations/tests/objc_method.rs @@ -0,0 +1,17 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#![cfg(target_os="macos")] + +#[macro_use] +extern crate objc; +#[allow(non_camel_case_types)] +pub type id = *mut objc::runtime::Object; +pub trait Foo { + unsafe fn method(self); +} +impl Foo for id { + unsafe fn method(self) { msg_send!(self , method) } +} diff --git a/tests/headers/objc_interface.h b/tests/headers/objc_interface.h new file mode 100644 index 0000000000..af84bf925a --- /dev/null +++ b/tests/headers/objc_interface.h @@ -0,0 +1,8 @@ +// bindgen-flags: --objc-extern-crate -- -x objective-c +// bindgen-osx-only + +@interface Foo +@end + +@protocol bar +@end diff --git a/tests/headers/objc_interface_type.h b/tests/headers/objc_interface_type.h new file mode 100644 index 0000000000..31d33664c1 --- /dev/null +++ b/tests/headers/objc_interface_type.h @@ -0,0 +1,13 @@ +// bindgen-flags: --objc-extern-crate -- -x objective-c +// bindgen-osx-only + +@interface Foo +@end + +struct FooStruct { + Foo *foo; +}; + +void fooFunc(Foo *foo); + +static const Foo *kFoo; diff --git a/tests/headers/objc_method.h b/tests/headers/objc_method.h new file mode 100644 index 0000000000..91645f16d1 --- /dev/null +++ b/tests/headers/objc_method.h @@ -0,0 +1,7 @@ +// bindgen-flags: --objc-extern-crate -- -x objective-c +// bindgen-osx-only + +@interface Foo +- (void)method; +// TODO: argument methods +@end diff --git a/tests/tests.rs b/tests/tests.rs index 05c8ad2c73..2886f8db5b 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -76,7 +76,7 @@ fn create_bindgen_builder(header: &PathBuf) // Scoop up bindgen-flags from test header let mut flags = Vec::with_capacity(2); - for line in reader.lines().take(2) { + for line in reader.lines().take(3) { let line = try!(line); if line.contains("bindgen-flags: ") { let extra_flags = line.split("bindgen-flags: ") @@ -87,6 +87,12 @@ fn create_bindgen_builder(header: &PathBuf) } else if line.contains("bindgen-unstable") && cfg!(feature = "llvm_stable") { return Ok(None); + } else if line.contains("bindgen-osx-only") { + let prepend_flags = ["--raw-line", "#![cfg(target_os=\"macos\")]"]; + flags = prepend_flags.into_iter() + .map(ToString::to_string) + .chain(flags) + .collect(); } } From 993a95922c12fd4e46efa368e2a8b0807d38eff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 1 Feb 2017 18:59:33 +0100 Subject: [PATCH 0281/2291] ir: Fix is_in_non_fully_specialized_template check. Fixes https://github.com/servo/rust-bindgen/issues/462 --- src/clang.rs | 16 +++++++++---- src/ir/function.rs | 2 +- .../tests/constant-non-specialized-tp.rs | 24 +++++++++++++++++++ tests/headers/constant-non-specialized-tp.hpp | 15 ++++++++++++ 4 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 tests/expectations/tests/constant-non-specialized-tp.rs create mode 100644 tests/headers/constant-non-specialized-tp.hpp diff --git a/src/clang.rs b/src/clang.rs index 9cf51436df..b659343e51 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -201,14 +201,14 @@ impl Cursor { } /// Is the referent a template specialization? - pub fn is_template(&self) -> bool { + pub fn is_template_specialization(&self) -> bool { self.specialized().is_some() } /// Is the referent a fully specialized template specialization without any /// remaining free template arguments? pub fn is_fully_specialized_template(&self) -> bool { - self.is_template() && self.num_template_args().unwrap_or(0) > 0 + self.is_template_specialization() && self.num_template_args().unwrap_or(0) > 0 } /// Is the referent a template specialization that still has remaining free @@ -217,9 +217,17 @@ impl Cursor { if self.is_toplevel() { return false; } + let parent = self.semantic_parent(); - (parent.is_template() && !parent.is_fully_specialized_template()) || - parent.is_in_non_fully_specialized_template() + if parent.is_fully_specialized_template() { + return false; + } + + if !parent.is_template_like() { + return parent.is_in_non_fully_specialized_template(); + } + + return true; } /// Is this cursor pointing a valid referent? diff --git a/src/ir/function.rs b/src/ir/function.rs index 6e205f1b0f..a50edfde7a 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -93,7 +93,7 @@ fn get_abi(cc: CXCallingConv) -> abi::Abi { pub fn cursor_mangling(cursor: &clang::Cursor) -> Option { // We early return here because libclang may crash in some case // if we pass in a variable inside a partial specialized template. - // See servo/rust-bindgen#67. + // See servo/rust-bindgen#67, and servo/rust-bindgen#462. if cursor.is_in_non_fully_specialized_template() { return None; } diff --git a/tests/expectations/tests/constant-non-specialized-tp.rs b/tests/expectations/tests/constant-non-specialized-tp.rs new file mode 100644 index 0000000000..bbadf8a2df --- /dev/null +++ b/tests/expectations/tests/constant-non-specialized-tp.rs @@ -0,0 +1,24 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Test { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Outer { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Outer_Inner { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} diff --git a/tests/headers/constant-non-specialized-tp.hpp b/tests/headers/constant-non-specialized-tp.hpp new file mode 100644 index 0000000000..539c28870b --- /dev/null +++ b/tests/headers/constant-non-specialized-tp.hpp @@ -0,0 +1,15 @@ +// bindgen-flags: -- -std=c++11 + +// This test ensure we protect ourselves from an LLVM crash. + +template +struct Test { + static constexpr bool x[] = {Args::x...}; +}; + +template +struct Outer { + struct Inner { + static constexpr int value[] = { T::value... }; + }; +}; From 86af08fb32ecbab92c50ebb0c7a701ada54aa0bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 31 Jan 2017 23:45:48 +0100 Subject: [PATCH 0282/2291] Re-enable OSX builds on Travis CI This reverts commit fc38f9b18a9dacc76b7e8a5c8633f0f02289daae. --- .travis.yml | 1 + ci/before_install.sh | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index dd271f22e5..47af4eeb41 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ addons: os: - linux + - osx rust: - stable diff --git a/ci/before_install.sh b/ci/before_install.sh index 06c75218dc..ebe4f4fb94 100644 --- a/ci/before_install.sh +++ b/ci/before_install.sh @@ -1,6 +1,11 @@ set -e pushd ~ +# Workaround for Travis CI macOS bug (https://github.com/travis-ci/travis-ci/issues/6307) +if [ "${TRAVIS_OS_NAME}" == "osx" ]; then + rvm get head || true +fi + function llvm_version_triple() { if [ "$1" == "3.8" ]; then echo "3.8.0" @@ -18,9 +23,17 @@ function llvm_download() { tar -xf ${LLVM}.tar.xz -C llvm --strip-components=1 export LLVM_CONFIG_PATH=`pwd`/llvm/bin/llvm-config + if [ "${TRAVIS_OS_NAME}" == "osx" ]; then + cp llvm/lib/libclang.dylib /usr/local/lib/libclang.dylib + fi } -llvm_download linux-gnu-ubuntu-14.04 + +if [ "${TRAVIS_OS_NAME}" == "linux" ]; then + llvm_download linux-gnu-ubuntu-14.04 +else + llvm_download apple-darwin +fi popd set +e From 42b721def01aba5034c857780a4bced3c9995a2e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 2 Feb 2017 12:57:15 -0800 Subject: [PATCH 0283/2291] Enhance Clang AST dumping This commit extends our existing Clang AST dumping to include more information, such as a cursor's canonical, referenced, and declarations cursors if they exist. It prints out most of the information that libclang gives us directly, but not the information that we attempt to (re)construct on top of the libclang APIs. --- src/clang.rs | 153 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 144 insertions(+), 9 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index a40abfcae3..3b669cd576 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -1273,21 +1273,156 @@ pub fn type_to_str(x: CXTypeKind) -> String { /// Dump the Clang AST to stdout for debugging purposes. pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { - fn print_indent(depth: isize, s: &str) { + fn print_indent>(depth: isize, s: S) { for _ in 0..depth { - print!("\t"); + print!(" "); + } + println!("{}", s.as_ref()); + } + + fn print_cursor>(depth: isize, prefix: S, c: &Cursor) { + let prefix = prefix.as_ref(); + print_indent(depth, format!(" {}kind = {}", prefix, kind_to_str(c.kind()))); + print_indent(depth, format!(" {}spelling = \"{}\"", prefix, c.spelling())); + print_indent(depth, format!(" {}location = {}", prefix, c.location())); + print_indent(depth, format!(" {}is-definition? {}", prefix, c.is_definition())); + print_indent(depth, format!(" {}is-declaration? {}", prefix, c.is_declaration())); + print_indent(depth, format!(" {}is-anonymous? {}", prefix, c.is_anonymous())); + print_indent(depth, format!(" {}is-inlined-function? {}", prefix, c.is_inlined_function())); + + let templ_kind = c.template_kind(); + if templ_kind != CXCursor_NoDeclFound { + print_indent(depth, format!(" {}template-kind = {}", prefix, kind_to_str(templ_kind))); + } + if let Some(usr) = c.usr() { + print_indent(depth, format!(" {}usr = \"{}\"", prefix, usr)); + } + if let Ok(num) = c.num_args() { + print_indent(depth, format!(" {}number-of-args = {}", prefix, num)); + } + if let Some(num) = c.num_template_args() { + print_indent(depth, format!(" {}number-of-template-args = {}", prefix, num)); + } + if let Some(width) = c.bit_width() { + print_indent(depth, format!(" {}bit-width = {}", prefix, width)); + } + if let Some(ty) = c.enum_type() { + print_indent(depth, format!(" {}enum-type = {}", prefix, type_to_str(ty.kind()))); + } + if let Some(val) = c.enum_val_signed() { + print_indent(depth, format!(" {}enum-val = {}", prefix, val)); + } + if let Some(ty) = c.typedef_type() { + print_indent(depth, format!(" {}typedef-type = {}", prefix, type_to_str(ty.kind()))); + } + + if let Some(def) = c.definition() { + if def != *c { + println!(); + print_cursor(depth, String::from(prefix) + "definition.", &def); + } + } + + if let Some(refd) = c.referenced() { + if refd != *c { + println!(); + print_cursor(depth, String::from(prefix) + "referenced.", &refd); + } + } + + let canonical = c.canonical(); + if canonical != *c { + println!(); + print_cursor(depth, String::from(prefix) + "canonical.", &canonical); + } + + if let Some(specialized) = c.specialized() { + if specialized != *c { + println!(); + print_cursor(depth, String::from(prefix) + "specialized.", &specialized); + } + } + } + + fn print_type>(depth: isize, prefix: S, ty: &Type) { + let prefix = prefix.as_ref(); + + let kind = ty.kind(); + print_indent(depth, format!(" {}kind = {}", prefix, type_to_str(kind))); + if kind == CXType_Invalid { + return; + } + + print_indent(depth, format!(" {}spelling = \"{}\"", prefix, ty.spelling())); + let num_template_args = unsafe { + clang_Type_getNumTemplateArguments(ty.x) + }; + if num_template_args >= 0 { + print_indent(depth, format!(" {}number-of-template-args = {}", + prefix, + num_template_args)); + } + if let Some(num) = ty.num_elements() { + print_indent(depth, format!(" {}number-of-elements = {}", prefix, num)); + } + print_indent(depth, format!(" {}is-variadic? {}", prefix, ty.is_variadic())); + + let canonical = ty.canonical_type(); + if canonical != *ty { + println!(); + print_type(depth, String::from(prefix) + "canonical.", &canonical); + } + + if let Some(pointee) = ty.pointee_type() { + if pointee != *ty { + println!(); + print_type(depth, String::from(prefix) + "pointee.", &pointee); + } + } + + if let Some(elem) = ty.elem_type() { + if elem != *ty { + println!(); + print_type(depth, String::from(prefix) + "elements.", &elem); + } + } + + if let Some(ret) = ty.ret_type() { + if ret != *ty { + println!(); + print_type(depth, String::from(prefix) + "return.", &ret); + } + } + + let named = ty.named(); + if named != *ty && named.is_valid() { + println!(); + print_type(depth, String::from(prefix) + "named.", &named); } - println!("{}", s); } - print_indent(depth, - &format!("(kind: {}, spelling: {}, type: {}", - kind_to_str(c.kind()), - c.spelling(), - type_to_str(c.cur_type().kind()))); + print_indent(depth, "("); + print_cursor(depth, "", c); + + println!(); + let ty = c.cur_type(); + print_type(depth, "type.", &ty); + + let declaration = ty.declaration(); + if declaration != *c && declaration.kind() != CXCursor_NoDeclFound { + println!(); + print_cursor(depth, "type.declaration.", &declaration); + } // Recurse. - c.visit(|s| ast_dump(&s, depth + 1)); + let mut found_children = false; + c.visit(|s| { + if !found_children { + println!(); + found_children = true; + } + ast_dump(&s, depth + 1) + }); print_indent(depth, ")"); From 63d83982e963bbdb1150508e53888e10f0320594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 2 Feb 2017 13:23:35 +0100 Subject: [PATCH 0284/2291] ir: Don't recurse too much looking for canonical types. --- src/ir/ty.rs | 15 +++++++++- tests/expectations/tests/template-fun-ty.rs | 31 +++++++++++++++++++++ tests/headers/template-fun-ty.hpp | 16 +++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/tests/template-fun-ty.rs create mode 100644 tests/headers/template-fun-ty.hpp diff --git a/src/ir/ty.rs b/src/ir/ty.rs index d0de72a08b..5474aa5701 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -568,7 +568,20 @@ impl Type { let canonical_ty = ty.canonical_type(); let kind = match ty.kind() { CXType_Unexposed if *ty != canonical_ty && - canonical_ty.kind() != CXType_Invalid => { + canonical_ty.kind() != CXType_Invalid && + // Sometime clang desugars some types more than + // what we need, specially with function + // pointers. + // + // We should also try the solution of inverting + // those checks instead of doing this, that is, + // something like: + // + // CXType_Unexposed if ty.ret_type().is_some() + // => { ... } + // + // etc. + !canonical_ty.spelling().contains("type-parameter") => { debug!("Looking for canonical type: {:?}", canonical_ty); return Self::from_clang_ty(potential_id, &canonical_ty, diff --git a/tests/expectations/tests/template-fun-ty.rs b/tests/expectations/tests/template-fun-ty.rs new file mode 100644 index 0000000000..c2a8a028da --- /dev/null +++ b/tests/expectations/tests/template-fun-ty.rs @@ -0,0 +1,31 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Foo { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +pub type Foo_FunctionPtr = + ::std::option::Option T>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RefPtr { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RefPtr_Proxy { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData, + pub _phantom_1: ::std::marker::PhantomData, + pub _phantom_2: ::std::marker::PhantomData, +} +pub type RefPtr_Proxy_member_function = + ::std::option::Option R>; +pub type Returner = ::std::option::Option T>; diff --git a/tests/headers/template-fun-ty.hpp b/tests/headers/template-fun-ty.hpp new file mode 100644 index 0000000000..1e8e1c25f7 --- /dev/null +++ b/tests/headers/template-fun-ty.hpp @@ -0,0 +1,16 @@ +template +class Foo +{ + typedef T (FunctionPtr)(); +}; + +template +class RefPtr { + template + class Proxy { + typedef R (T::*member_function)(Args...); + }; +}; + +template +using Returner = T(*)(); From 09bc83526b51f8c2728dbaee2754a3020243d752 Mon Sep 17 00:00:00 2001 From: Jeffrey Deng Date: Mon, 30 Jan 2017 11:36:56 -0500 Subject: [PATCH 0285/2291] Added catch_unwind to catch panic at generator due to missing or incorrect flags --- src/chooser.rs | 3 ++- src/lib.rs | 5 +++++ src/main.rs | 21 +++++++++++++++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/chooser.rs b/src/chooser.rs index 51392d70e1..d7a2077182 100644 --- a/src/chooser.rs +++ b/src/chooser.rs @@ -3,10 +3,11 @@ pub use ir::int::IntKind; pub use ir::enum_ty::{EnumVariantValue, EnumVariantCustomBehavior}; use std::fmt; +use std::panic::UnwindSafe; /// A trait to allow configuring different kinds of types in different /// situations. -pub trait TypeChooser: fmt::Debug { +pub trait TypeChooser: fmt::Debug + UnwindSafe { /// The integer kind an integer macro should have, given a name and the /// value of that macro, or `None` if you want the default to be chosen. fn int_macro(&self, _name: &str, _value: i64) -> Option { diff --git a/src/lib.rs b/src/lib.rs index d6f3c66ea4..f2fdc7b4c9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -555,6 +555,11 @@ pub struct BindgenOptions { pub objc_extern_crate: bool, } +/// TODO(emilio): This is sort of a lie (see the error message that results from +/// removing this), but since we don't share references across panic boundaries +/// it's ok. +impl ::std::panic::UnwindSafe for BindgenOptions {} + impl BindgenOptions { fn build(&mut self) { self.whitelisted_vars.build(); diff --git a/src/main.rs b/src/main.rs index a7bd961890..c5d2b063f5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ extern crate rustc_serialize; use bindgen::clang_version; use std::env; +use std::panic; mod options; use options::builder_from_flags; @@ -44,8 +45,24 @@ pub fn main() { match builder_from_flags(bind_args.into_iter()) { Ok((builder, output)) => { - let mut bindings = builder.generate() - .expect("Unable to generate bindings"); + + let builder_result = + panic::catch_unwind(|| + builder.generate().expect("Unable to generate bindings") + ); + + if builder_result.is_err() { + println!("Bindgen unexpectedly panicked"); + println!("This may be caused by one of the known-unsupported \ + things (https://github.com/servo/rust-bindgen#c), \ + please modify the bindgen flags to work around it as \ + described in https://github.com/servo/rust-bindgen#c"); + println!("Otherwise, please file an issue at \ + https://github.com/servo/rust-bindgen/issues/new"); + std::process::exit(1); + } + + let mut bindings = builder_result.unwrap(); bindings.write(output) .expect("Unable to write output"); bindings.write_dummy_uses() From 62f8ed1174f140b754291b8029828de06da0583b Mon Sep 17 00:00:00 2001 From: Jeffrey Deng Date: Thu, 2 Feb 2017 16:34:01 -0500 Subject: [PATCH 0286/2291] Added false-by-default verbose option flag --- src/lib.rs | 19 +++++++++++++++++-- src/main.rs | 21 ++++++++++++++------- src/options.rs | 7 +++++++ 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index f2fdc7b4c9..9bdbadb44f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -433,6 +433,17 @@ impl Builder { self } + /// Set to output verbose messages + pub fn verbose(mut self) -> Self { + self.options.verbose = true; + self + } + + /// Is set to output verbose messages + pub fn is_verbose(&self) -> bool { + return self.options.verbose; + } + /// Generate the Rust bindings using the options built up thus far. pub fn generate<'ctx>(self) -> Result, ()> { Bindings::generate(self.options, None) @@ -543,16 +554,19 @@ pub struct BindgenOptions { /// See the builder method description for more details. pub conservative_inline_namespaces: bool, - /// Wether to keep documentation comments in the generated output. See the + /// Whether to keep documentation comments in the generated output. See the /// documentation for more details. pub generate_comments: bool, - /// Wether to whitelist types recursively. Defaults to true. + /// Whether to whitelist types recursively. Defaults to true. pub whitelist_recursively: bool, /// Intead of emitting 'use objc;' to files generated from objective c files, /// generate '#[macro_use] extern crate objc;' pub objc_extern_crate: bool, + + /// Whether we should print verbose messages. + pub verbose: bool, } /// TODO(emilio): This is sort of a lie (see the error message that results from @@ -605,6 +619,7 @@ impl Default for BindgenOptions { generate_comments: true, whitelist_recursively: true, objc_extern_crate: false, + verbose: false, } } } diff --git a/src/main.rs b/src/main.rs index c5d2b063f5..a73b0feef4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -46,19 +46,16 @@ pub fn main() { match builder_from_flags(bind_args.into_iter()) { Ok((builder, output)) => { + let verbose = (&builder).is_verbose(); let builder_result = panic::catch_unwind(|| builder.generate().expect("Unable to generate bindings") ); if builder_result.is_err() { - println!("Bindgen unexpectedly panicked"); - println!("This may be caused by one of the known-unsupported \ - things (https://github.com/servo/rust-bindgen#c), \ - please modify the bindgen flags to work around it as \ - described in https://github.com/servo/rust-bindgen#c"); - println!("Otherwise, please file an issue at \ - https://github.com/servo/rust-bindgen/issues/new"); + if verbose { + print_verbose_err(); + } std::process::exit(1); } @@ -74,3 +71,13 @@ pub fn main() { } }; } + +fn print_verbose_err() { + println!("Bindgen unexpectedly panicked"); + println!("This may be caused by one of the known-unsupported \ + things (https://github.com/servo/rust-bindgen#c), \ + please modify the bindgen flags to work around it as \ + described in https://github.com/servo/rust-bindgen#c"); + println!("Otherwise, please file an issue at \ + https://github.com/servo/rust-bindgen/issues/new"); +} diff --git a/src/options.rs b/src/options.rs index 535eac4bb0..f341b5dda6 100644 --- a/src/options.rs +++ b/src/options.rs @@ -175,6 +175,9 @@ pub fn builder_from_flags(args: I) .takes_value(true) .multiple(true) .number_of_values(1), + Arg::with_name("verbose") + .long("verbose") + .help("Print verbose error messages"), ]) // .args() .get_matches_from(args); @@ -346,5 +349,9 @@ pub fn builder_from_flags(args: I) Box::new(io::BufWriter::new(io::stdout())) as Box }; + if matches.is_present("verbose") { + builder = builder.verbose(); + } + Ok((builder, output)) } From 67ba2ad0d8c1e431ed894b111443727aaf3d45b0 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 2 Feb 2017 15:03:08 -0800 Subject: [PATCH 0287/2291] Do not dump cursor definitions This can lead to infinite loops with forward declarations and blow the stack. --- src/clang.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 3b669cd576..63f9123e0e 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -1316,13 +1316,6 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { print_indent(depth, format!(" {}typedef-type = {}", prefix, type_to_str(ty.kind()))); } - if let Some(def) = c.definition() { - if def != *c { - println!(); - print_cursor(depth, String::from(prefix) + "definition.", &def); - } - } - if let Some(refd) = c.referenced() { if refd != *c { println!(); From 876c5a29a297edfc3b90dbb84e1c303deb64bcc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 3 Feb 2017 13:55:53 +0100 Subject: [PATCH 0288/2291] clang: Make the is_fully_specialized_template check less insane. This fixes a regression with stylo bindings after the function pointer PR. --- src/clang.rs | 14 ++++++++------ src/ir/ty.rs | 3 ++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 9cf51436df..b436a78de6 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -778,12 +778,14 @@ impl Type { // Yep, the spelling of this containing type-parameter is extremely // nasty... But can happen in . Unfortunately I couldn't // reduce it enough :( - !self.spelling().contains("type-parameter") && - self.template_args() - .map_or(false, |mut args| { - args.len() > 0 && - !args.any(|t| t.spelling().contains("type-parameter")) - }) + self.template_args().map_or(false, |args| { + args.len() > 0 + }) && match self.declaration().kind() { + CXCursor_ClassTemplatePartialSpecialization | + CXCursor_TypeAliasTemplateDecl | + CXCursor_TemplateTemplateParameter => false, + _ => true, + } } } diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 5474aa5701..cb566fb31b 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -602,7 +602,8 @@ impl Type { // Same here, with template specialisations we can safely // assume this is a Comp(..) } else if ty.is_fully_specialized_template() { - debug!("Template specialization: {:?}", ty); + debug!("Template specialization: {:?}, {:?} {:?}", + ty, location, canonical_ty); let complex = CompInfo::from_ty(potential_id, ty, location, ctx) .expect("C'mon"); From 439d89dd62b8f2c6f5f124c4d4feb4cabce53339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 3 Feb 2017 14:07:45 +0100 Subject: [PATCH 0289/2291] Version bump. --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 476019961d..30584cd7a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ [root] name = "bindgen" -version = "0.20.5" +version = "0.21.0" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 8ee91b041e..7d90a96c61 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.20.5" +version = "0.21.0" build = "build.rs" [badges] From 58b3ed1279674dd9ed7eda72b174f2ca1a7fc530 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 3 Feb 2017 10:03:23 -0800 Subject: [PATCH 0290/2291] Run `cargo fmt` --- src/chooser.rs | 2 +- src/clang.rs | 110 +++++++++++++++++++----------- src/codegen/mod.rs | 141 +++++++++++++++++++++------------------ src/ir/comp.rs | 37 +++++----- src/ir/context.rs | 23 ++++--- src/ir/enum_ty.rs | 38 ++++++----- src/ir/function.rs | 18 +++-- src/ir/item.rs | 37 +++++----- src/ir/layout.rs | 8 ++- src/ir/module.rs | 2 +- src/ir/objc.rs | 4 +- src/ir/ty.rs | 4 +- src/ir/type_collector.rs | 2 +- src/ir/var.rs | 41 ++++++------ src/lib.rs | 13 ++-- src/main.rs | 4 +- src/options.rs | 2 +- src/regex_set.rs | 8 +-- tests/tests.rs | 3 +- 19 files changed, 273 insertions(+), 224 deletions(-) diff --git a/src/chooser.rs b/src/chooser.rs index 51392d70e1..bf610b2812 100644 --- a/src/chooser.rs +++ b/src/chooser.rs @@ -1,7 +1,7 @@ //! A public API for more fine-grained customization of bindgen behavior. +pub use ir::enum_ty::{EnumVariantCustomBehavior, EnumVariantValue}; pub use ir::int::IntKind; -pub use ir::enum_ty::{EnumVariantValue, EnumVariantCustomBehavior}; use std::fmt; /// A trait to allow configuring different kinds of types in different diff --git a/src/clang.rs b/src/clang.rs index 63f9123e0e..c008effef6 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -208,7 +208,8 @@ impl Cursor { /// Is the referent a fully specialized template specialization without any /// remaining free template arguments? pub fn is_fully_specialized_template(&self) -> bool { - self.is_template_specialization() && self.num_template_args().unwrap_or(0) > 0 + self.is_template_specialization() && + self.num_template_args().unwrap_or(0) > 0 } /// Is the referent a template specialization that still has remaining free @@ -349,13 +350,11 @@ impl Cursor { pub fn contains_cursor(&self, kind: CXCursorKind) -> bool { let mut found = false; - self.visit(|c| { - if c.kind() == kind { - found = true; - CXChildVisit_Break - } else { - CXChildVisit_Continue - } + self.visit(|c| if c.kind() == kind { + found = true; + CXChildVisit_Break + } else { + CXChildVisit_Continue }); found @@ -846,8 +845,8 @@ impl SourceLocation { &mut col, &mut off); (File { - x: file, - }, + x: file, + }, line as usize, col as usize, off as usize) @@ -1282,17 +1281,32 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { fn print_cursor>(depth: isize, prefix: S, c: &Cursor) { let prefix = prefix.as_ref(); - print_indent(depth, format!(" {}kind = {}", prefix, kind_to_str(c.kind()))); - print_indent(depth, format!(" {}spelling = \"{}\"", prefix, c.spelling())); + print_indent(depth, + format!(" {}kind = {}", prefix, kind_to_str(c.kind()))); + print_indent(depth, + format!(" {}spelling = \"{}\"", prefix, c.spelling())); print_indent(depth, format!(" {}location = {}", prefix, c.location())); - print_indent(depth, format!(" {}is-definition? {}", prefix, c.is_definition())); - print_indent(depth, format!(" {}is-declaration? {}", prefix, c.is_declaration())); - print_indent(depth, format!(" {}is-anonymous? {}", prefix, c.is_anonymous())); - print_indent(depth, format!(" {}is-inlined-function? {}", prefix, c.is_inlined_function())); + print_indent(depth, + format!(" {}is-definition? {}", + prefix, + c.is_definition())); + print_indent(depth, + format!(" {}is-declaration? {}", + prefix, + c.is_declaration())); + print_indent(depth, + format!(" {}is-anonymous? {}", prefix, c.is_anonymous())); + print_indent(depth, + format!(" {}is-inlined-function? {}", + prefix, + c.is_inlined_function())); let templ_kind = c.template_kind(); if templ_kind != CXCursor_NoDeclFound { - print_indent(depth, format!(" {}template-kind = {}", prefix, kind_to_str(templ_kind))); + print_indent(depth, + format!(" {}template-kind = {}", + prefix, + kind_to_str(templ_kind))); } if let Some(usr) = c.usr() { print_indent(depth, format!(" {}usr = \"{}\"", prefix, usr)); @@ -1301,38 +1315,53 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { print_indent(depth, format!(" {}number-of-args = {}", prefix, num)); } if let Some(num) = c.num_template_args() { - print_indent(depth, format!(" {}number-of-template-args = {}", prefix, num)); + print_indent(depth, + format!(" {}number-of-template-args = {}", + prefix, + num)); } if let Some(width) = c.bit_width() { print_indent(depth, format!(" {}bit-width = {}", prefix, width)); } if let Some(ty) = c.enum_type() { - print_indent(depth, format!(" {}enum-type = {}", prefix, type_to_str(ty.kind()))); + print_indent(depth, + format!(" {}enum-type = {}", + prefix, + type_to_str(ty.kind()))); } if let Some(val) = c.enum_val_signed() { print_indent(depth, format!(" {}enum-val = {}", prefix, val)); } if let Some(ty) = c.typedef_type() { - print_indent(depth, format!(" {}typedef-type = {}", prefix, type_to_str(ty.kind()))); + print_indent(depth, + format!(" {}typedef-type = {}", + prefix, + type_to_str(ty.kind()))); } if let Some(refd) = c.referenced() { if refd != *c { println!(); - print_cursor(depth, String::from(prefix) + "referenced.", &refd); + print_cursor(depth, + String::from(prefix) + "referenced.", + &refd); } } let canonical = c.canonical(); if canonical != *c { println!(); - print_cursor(depth, String::from(prefix) + "canonical.", &canonical); + print_cursor(depth, + String::from(prefix) + "canonical.", + &canonical); } if let Some(specialized) = c.specialized() { if specialized != *c { println!(); - print_cursor(depth, String::from(prefix) + "specialized.", &specialized); + print_cursor(depth, + String::from(prefix) + "specialized.", + &specialized); } } } @@ -1346,19 +1375,22 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { return; } - print_indent(depth, format!(" {}spelling = \"{}\"", prefix, ty.spelling())); - let num_template_args = unsafe { - clang_Type_getNumTemplateArguments(ty.x) - }; + print_indent(depth, + format!(" {}spelling = \"{}\"", prefix, ty.spelling())); + let num_template_args = + unsafe { clang_Type_getNumTemplateArguments(ty.x) }; if num_template_args >= 0 { - print_indent(depth, format!(" {}number-of-template-args = {}", - prefix, - num_template_args)); + print_indent(depth, + format!(" {}number-of-template-args = {}", + prefix, + num_template_args)); } if let Some(num) = ty.num_elements() { - print_indent(depth, format!(" {}number-of-elements = {}", prefix, num)); + print_indent(depth, + format!(" {}number-of-elements = {}", prefix, num)); } - print_indent(depth, format!(" {}is-variadic? {}", prefix, ty.is_variadic())); + print_indent(depth, + format!(" {}is-variadic? {}", prefix, ty.is_variadic())); let canonical = ty.canonical_type(); if canonical != *ty { @@ -1449,14 +1481,12 @@ impl EvalResult { // unexposed type. Our solution is to just flat out ban all // `CXType_Unexposed` from evaluation. let mut found_cant_eval = false; - cursor.visit(|c| { - if c.kind() == CXCursor_TypeRef && - c.cur_type().kind() == CXType_Unexposed { - found_cant_eval = true; - CXChildVisit_Break - } else { - CXChildVisit_Recurse - } + cursor.visit(|c| if c.kind() == CXCursor_TypeRef && + c.cur_type().kind() == CXType_Unexposed { + found_cant_eval = true; + CXChildVisit_Break + } else { + CXChildVisit_Recurse }); if found_cant_eval { return None; diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 9dd3b6b9bf..9c71e99343 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1,5 +1,6 @@ mod helpers; +use self::helpers::{BlobTyBuilder, attributes}; use aster; use ir::annotations::FieldAccessorKind; @@ -17,7 +18,6 @@ use ir::objc::ObjCInterface; use ir::ty::{Type, TypeKind}; use ir::type_collector::ItemSet; use ir::var::Var; -use self::helpers::{BlobTyBuilder, attributes}; use std::borrow::Cow; use std::cell::Cell; @@ -301,7 +301,8 @@ impl CodeGenerator for Item { _extra: &()) { if self.is_hidden(ctx) || result.seen(self.id()) { debug!("::codegen: Ignoring hidden or seen: \ - self = {:?}", self); + self = {:?}", + self); return; } @@ -376,7 +377,7 @@ impl CodeGenerator for Module { }; if !ctx.options().enable_cxx_namespaces || - (self.is_inline() && !ctx.options().conservative_inline_namespaces) { + (self.is_inline() && !ctx.options().conservative_inline_namespaces) { codegen_self(result, &mut false); return; } @@ -574,11 +575,13 @@ impl CodeGenerator for Type { // with invalid template parameters, and at least this way // they can be replaced, instead of generating plain invalid // code. - let inner_canon_type = - inner_item.expect_type().canonical_type(ctx); + let inner_canon_type = inner_item.expect_type() + .canonical_type(ctx); if inner_canon_type.is_invalid_named_type() { warn!("Item contained invalid named type, skipping: \ - {:?}, {:?}", item, inner_item); + {:?}, {:?}", + item, + inner_item); return; } } @@ -597,22 +600,25 @@ impl CodeGenerator for Type { let simple_enum_path = match inner_rust_type.node { ast::TyKind::Path(None, ref p) => { if applicable_template_args.is_empty() && - inner_item.expect_type().canonical_type(ctx).is_enum() && - p.segments.iter().all(|p| p.parameters.is_none()) { + inner_item.expect_type() + .canonical_type(ctx) + .is_enum() && + p.segments.iter().all(|p| p.parameters.is_none()) { Some(p.clone()) } else { None } - }, + } _ => None, }; let typedef = if let Some(mut p) = simple_enum_path { for ident in top_level_path(ctx, item).into_iter().rev() { - p.segments.insert(0, ast::PathSegment { - identifier: ident, - parameters: None, - }); + p.segments.insert(0, + ast::PathSegment { + identifier: ident, + parameters: None, + }); } typedef.use_().build(p).as_(rust_name) } else { @@ -622,7 +628,8 @@ impl CodeGenerator for Type { if template_arg.is_named() { if template_arg.is_invalid_named_type() { warn!("Item contained invalid template \ - parameter: {:?}", item); + parameter: {:?}", + item); return; } generics = @@ -823,7 +830,8 @@ impl CodeGenerator for CompInfo { // generate tuple struct if struct or union is a forward declaration, // skip for now if template parameters are needed. - if self.is_forward_declaration() && applicable_template_args.is_empty(){ + if self.is_forward_declaration() && + applicable_template_args.is_empty() { let struct_name = item.canonical_name(ctx); let struct_name = ctx.rust_ident_raw(&struct_name); let tuple_struct = quote_item!(ctx.ext_cx(), @@ -1012,10 +1020,12 @@ impl CodeGenerator for CompInfo { // Try to catch a bitfield contination early. if let (Some(ref mut bitfield_width), Some(width)) = - (current_bitfield_width, field.bitfield()) { + (current_bitfield_width, field.bitfield()) { let layout = current_bitfield_layout.unwrap(); debug!("Testing bitfield continuation {} {} {:?}", - *bitfield_width, width, layout); + *bitfield_width, + width, + layout); if *bitfield_width + width <= (layout.size * 8) as u32 { *bitfield_width += width; current_bitfield_fields.push(field); @@ -1061,7 +1071,8 @@ impl CodeGenerator for CompInfo { } else { quote_ty!(ctx.ext_cx(), __BindgenUnionField<$ty>) } - } else if let Some(item) = field_ty.is_incomplete_array(ctx) { + } else if let Some(item) = + field_ty.is_incomplete_array(ctx) { result.saw_incomplete_array(); let inner = item.to_rust_ty(ctx); @@ -1239,10 +1250,10 @@ impl CodeGenerator for CompInfo { let prefix = ctx.trait_prefix(); let phantom = quote_ty!(ctx.ext_cx(), ::$prefix::marker::PhantomData<$ident>); - let field = - StructFieldBuilder::named(format!("_phantom_{}", i)) - .pub_() - .build_ty(phantom); + let field = StructFieldBuilder::named(format!("_phantom_{}", + i)) + .pub_() + .build_ty(phantom); fields.push(field) } } @@ -1482,8 +1493,8 @@ impl MethodCodegen for Method { // return-type = void. if self.is_constructor() { fndecl.inputs.remove(0); - fndecl.output = - ast::FunctionRetTy::Ty(quote_ty!(ctx.ext_cx(), Self)); + fndecl.output = ast::FunctionRetTy::Ty(quote_ty!(ctx.ext_cx(), + Self)); } let sig = ast::MethodSig { @@ -1564,7 +1575,7 @@ enum EnumBuilder<'a> { canonical_name: &'a str, aster: P, }, - Consts { aster: P, } + Consts { aster: P }, } impl<'a> EnumBuilder<'a> { @@ -1825,12 +1836,11 @@ impl CodeGenerator for Enum { .map(|repr| repr.to_rust_ty(ctx)) .unwrap_or_else(|| helpers::ast_ty::raw_type(ctx, repr_name)); - let mut builder = - EnumBuilder::new(builder, - &name, - repr, - is_bitfield, - is_constified_enum); + let mut builder = EnumBuilder::new(builder, + &name, + repr, + is_bitfield, + is_constified_enum); // A map where we keep a value -> variant relation. let mut seen_values = HashMap::<_, String>::new(); @@ -1856,7 +1866,8 @@ impl CodeGenerator for Enum { let mut constified_variants = VecDeque::new(); let mut iter = self.variants().iter().peekable(); - while let Some(variant) = iter.next().or_else(|| constified_variants.pop_front()) { + while let Some(variant) = iter.next() + .or_else(|| constified_variants.pop_front()) { if variant.hidden() { continue; } @@ -1877,8 +1888,9 @@ impl CodeGenerator for Enum { let parent_name = parent_canonical_name.as_ref() .unwrap(); - Cow::Owned( - format!("{}_{}", parent_name, variant_name)) + Cow::Owned(format!("{}_{}", + parent_name, + variant_name)) }; let existing_variant_name = entry.get(); @@ -1909,15 +1921,16 @@ impl CodeGenerator for Enum { // we also generate a constant so it can be properly // accessed. if (is_rust_enum && enum_ty.name().is_none()) || - variant.force_constification() { + variant.force_constification() { let mangled_name = if is_toplevel { variant_name.clone() } else { let parent_name = parent_canonical_name.as_ref() .unwrap(); - Cow::Owned( - format!("{}_{}", parent_name, variant_name)) + Cow::Owned(format!("{}_{}", + parent_name, + variant_name)) }; add_constant(enum_ty, @@ -2044,7 +2057,8 @@ impl ToRustTy for Type { .map(|arg| arg.to_rust_ty(ctx)) .collect::>(); - path.segments.last_mut().unwrap().parameters = if template_args.is_empty() { + path.segments.last_mut().unwrap().parameters = if + template_args.is_empty() { None } else { Some(P(ast::PathParameters::AngleBracketed( @@ -2062,11 +2076,10 @@ impl ToRustTy for Type { TypeKind::ResolvedTypeRef(inner) => inner.to_rust_ty(ctx), TypeKind::TemplateAlias(inner, _) | TypeKind::Alias(inner) => { - let applicable_named_args = - item.applicable_template_args(ctx) - .into_iter() - .filter(|arg| ctx.resolve_type(*arg).is_named()) - .collect::>(); + let applicable_named_args = item.applicable_template_args(ctx) + .into_iter() + .filter(|arg| ctx.resolve_type(*arg).is_named()) + .collect::>(); let spelling = self.name().expect("Unnamed alias?"); if item.is_opaque(ctx) && !applicable_named_args.is_empty() { @@ -2086,7 +2099,7 @@ impl ToRustTy for Type { TypeKind::Comp(ref info) => { let template_args = item.applicable_template_args(ctx); if info.has_non_type_template_params() || - (item.is_opaque(ctx) && !template_args.is_empty()) { + (item.is_opaque(ctx) && !template_args.is_empty()) { return match self.layout(ctx) { Some(layout) => BlobTyBuilder::new(layout).build(), None => { @@ -2127,9 +2140,7 @@ impl ToRustTy for Type { let ident = ctx.rust_ident(&name); quote_ty!(ctx.ext_cx(), $ident) } - TypeKind::ObjCInterface(..) => { - quote_ty!(ctx.ext_cx(), id) - }, + TypeKind::ObjCInterface(..) => quote_ty!(ctx.ext_cx(), id), ref u @ TypeKind::UnresolvedTypeRef(..) => { unreachable!("Should have been resolved after parsing {:?}!", u) } @@ -2397,12 +2408,12 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { } mod utils { + use super::ItemToRustTy; use aster; use ir::context::{BindgenContext, ItemId}; use ir::item::{Item, ItemCanonicalPath}; use ir::ty::TypeKind; use std::mem; - use super::ItemToRustTy; use syntax::ast; use syntax::ptr::P; @@ -2412,12 +2423,14 @@ mod utils { let use_objc = if ctx.options().objc_extern_crate { quote_item!(ctx.ext_cx(), use objc; - ).unwrap() + ) + .unwrap() } else { quote_item!(ctx.ext_cx(), #[macro_use] extern crate objc; - ).unwrap() + ) + .unwrap() }; @@ -2500,13 +2513,12 @@ mod utils { ) .unwrap(); - let items = vec![ - union_field_decl, union_field_impl, - union_field_default_impl, - union_field_clone_impl, - union_field_copy_impl, - union_field_debug_impl, - ]; + let items = vec![union_field_decl, + union_field_impl, + union_field_default_impl, + union_field_clone_impl, + union_field_copy_impl, + union_field_debug_impl]; let old_items = mem::replace(result, items); result.extend(old_items.into_iter()); @@ -2578,13 +2590,11 @@ mod utils { ) .unwrap(); - let items = vec![ - incomplete_array_decl, - incomplete_array_impl, - incomplete_array_debug_impl, - incomplete_array_clone_impl, - incomplete_array_copy_impl, - ]; + let items = vec![incomplete_array_decl, + incomplete_array_impl, + incomplete_array_debug_impl, + incomplete_array_clone_impl, + incomplete_array_copy_impl]; let old_items = mem::replace(result, items); result.extend(old_items.into_iter()); @@ -2614,8 +2624,7 @@ mod utils { let path = item.namespace_aware_canonical_path(ctx); let builder = aster::AstBuilder::new().ty().path(); - let template_args = template_args - .iter() + let template_args = template_args.iter() .map(|arg| arg.to_rust_ty(ctx)) .collect::>(); diff --git a/src/ir/comp.rs b/src/ir/comp.rs index bad661dad3..34bd7a541c 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -1,8 +1,5 @@ //! Compound types (unions and structs) in our intermediate representation. -use clang; -use parse::{ClangItemParser, ParseError}; -use std::cell::Cell; use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; use super::derive::{CanDeriveCopy, CanDeriveDebug}; @@ -10,6 +7,9 @@ use super::item::Item; use super::layout::Layout; use super::ty::Type; use super::type_collector::{ItemSet, TypeCollector}; +use clang; +use parse::{ClangItemParser, ParseError}; +use std::cell::Cell; /// The kind of compound type. #[derive(Debug, Copy, Clone, PartialEq)] @@ -486,14 +486,13 @@ impl CompInfo { debug!("CompInfo::from_ty({:?}, {:?})", kind, cursor); let mut ci = CompInfo::new(kind); - ci.is_forward_declaration = location.map_or(true, |cur| { - match cur.kind() { + ci.is_forward_declaration = + location.map_or(true, |cur| match cur.kind() { CXCursor_StructDecl | CXCursor_UnionDecl | CXCursor_ClassDecl => !cur.is_definition(), _ => false, - } - }); + }); ci.is_anonymous = cursor.is_anonymous(); ci.template_args = match ty.template_args() { // In forward declarations and not specializations, @@ -506,13 +505,12 @@ impl CompInfo { let mut specialization = true; let args = arg_types.filter(|t| t.kind() != CXType_Invalid) - .filter_map(|t| { - if t.spelling().starts_with("type-parameter") { - specialization = false; - None - } else { - Some(Item::from_ty_or_ref(t, None, None, ctx)) - } + .filter_map(|t| if t.spelling() + .starts_with("type-parameter") { + specialization = false; + None + } else { + Some(Item::from_ty_or_ref(t, None, None, ctx)) }) .collect::>(); @@ -681,10 +679,13 @@ impl CompInfo { // NB: This gets us an owned `Function`, not a // `FunctionSig`. - let signature = match Item::parse(cur, Some(potential_id), ctx) { - Ok(item) if ctx.resolve_item(item).kind().is_function() => item, - _ => return CXChildVisit_Continue, - }; + let signature = + match Item::parse(cur, Some(potential_id), ctx) { + Ok(item) if ctx.resolve_item(item) + .kind() + .is_function() => item, + _ => return CXChildVisit_Continue, + }; match cur.kind() { CXCursor_Constructor => { diff --git a/src/ir/context.rs b/src/ir/context.rs index 50774a434d..38ecdf1701 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -1,5 +1,12 @@ //! Common context that is passed around during parsing and codegen. +use super::derive::{CanDeriveCopy, CanDeriveDebug}; +use super::int::IntKind; +use super::item::{Item, ItemCanonicalPath}; +use super::item_kind::ItemKind; +use super::module::{Module, ModuleKind}; +use super::ty::{FloatKind, Type, TypeKind}; +use super::type_collector::{ItemSet, TypeCollector}; use BindgenOptions; use cexpr; use chooser::TypeChooser; @@ -10,13 +17,6 @@ use std::cell::Cell; use std::collections::{HashMap, VecDeque, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; -use super::derive::{CanDeriveCopy, CanDeriveDebug}; -use super::int::IntKind; -use super::item::{Item, ItemCanonicalPath}; -use super::item_kind::ItemKind; -use super::module::{Module, ModuleKind}; -use super::ty::{FloatKind, Type, TypeKind}; -use super::type_collector::{ItemSet, TypeCollector}; use syntax::ast::Ident; use syntax::codemap::{DUMMY_SP, Span}; use syntax::ext::base::ExtCtxt; @@ -254,8 +254,8 @@ impl<'ctx> BindgenContext<'ctx> { TypeKey::USR(usr) } else { warn!("Valid declaration with no USR: {:?}, {:?}", - declaration, - location); + declaration, + location); TypeKey::Declaration(declaration) }; @@ -961,7 +961,8 @@ impl<'ctx> BindgenContext<'ctx> { fn tokenize_namespace(&self, cursor: &clang::Cursor) -> (Option, ModuleKind) { - assert_eq!(cursor.kind(), ::clang_sys::CXCursor_Namespace, + assert_eq!(cursor.kind(), + ::clang_sys::CXCursor_Namespace, "Be a nice person"); let tokens = match self.translation_unit.tokens(&cursor) { Some(tokens) => tokens, @@ -995,7 +996,7 @@ impl<'ctx> BindgenContext<'ctx> { token); } } - }; + } (module_name, kind) } diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index ca4e77db5e..8ea7a8dcbc 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -1,11 +1,11 @@ //! Intermediate representation for C/C++ enumerations. -use clang; -use ir::annotations::Annotations; -use parse::{ClangItemParser, ParseError}; use super::context::{BindgenContext, ItemId}; use super::item::Item; use super::ty::TypeKind; +use clang; +use ir::annotations::Annotations; +use parse::{ClangItemParser, ParseError}; /// An enum representing custom handling that can be given to a variant. #[derive(Copy, Clone, Debug, PartialEq, Eq)] @@ -66,18 +66,20 @@ impl Enum { // Assume signedness since the default type by the C standard is an int. let is_signed = repr.and_then(|r| ctx.resolve_type(r).safe_canonical_type(ctx)) - .map_or(true, |ty| { - match *ty.kind() { - TypeKind::Int(ref int_kind) => int_kind.is_signed(), - ref other => { - panic!("Since when enums can be non-integers? {:?}", + .map_or(true, |ty| match *ty.kind() { + TypeKind::Int(ref int_kind) => int_kind.is_signed(), + ref other => { + panic!("Since when enums can be non-integers? {:?}", other) - } } }); let type_name = ty.spelling(); - let type_name = if type_name.is_empty() { None } else { Some(type_name) }; + let type_name = if type_name.is_empty() { + None + } else { + Some(type_name) + }; let type_name = type_name.as_ref().map(String::as_str); declaration.visit(|cursor| { @@ -94,20 +96,22 @@ impl Enum { t.enum_variant_behavior(type_name, &name, val) }) .or_else(|| { - Annotations::new(&cursor).and_then(|anno| { - if anno.hide() { + Annotations::new(&cursor) + .and_then(|anno| if anno.hide() { Some(EnumVariantCustomBehavior::Hide) - } else if anno.constify_enum_variant() { + } else if + anno.constify_enum_variant() { Some(EnumVariantCustomBehavior::Constify) } else { None - } - }) + }) }); let comment = cursor.raw_comment(); - variants.push( - EnumVariant::new(name, comment, val, custom_behavior)); + variants.push(EnumVariant::new(name, + comment, + val, + custom_behavior)); } } CXChildVisit_Continue diff --git a/src/ir/function.rs b/src/ir/function.rs index a50edfde7a..cc31867939 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -1,12 +1,12 @@ //! Intermediate representation for C/C++ functions and methods. -use clang; -use clang_sys::CXCallingConv; -use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use super::context::{BindgenContext, ItemId}; use super::item::Item; use super::ty::TypeKind; use super::type_collector::{ItemSet, TypeCollector}; +use clang; +use clang_sys::CXCallingConv; +use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use syntax::abi; /// A function declaration, with a signature, arguments, and argument names. @@ -165,7 +165,8 @@ impl FunctionSig { let name = arg.spelling(); let name = if name.is_empty() { None } else { Some(name) }; - let ty = Item::from_ty_or_ref(arg_ty, Some(*arg), None, ctx); + let ty = + Item::from_ty_or_ref(arg_ty, Some(*arg), None, ctx); (name, ty) }) .collect() @@ -176,8 +177,10 @@ impl FunctionSig { let mut args = vec![]; cursor.visit(|c| { if c.kind() == CXCursor_ParmDecl { - let ty = - Item::from_ty_or_ref(c.cur_type(), Some(c), None, ctx); + let ty = Item::from_ty_or_ref(c.cur_type(), + Some(c), + None, + ctx); let name = c.spelling(); let name = if name.is_empty() { None } else { Some(name) }; @@ -275,7 +278,8 @@ impl ClangSubItemParser for Function { } let linkage = cursor.linkage(); - if linkage != CXLinkage_External && linkage != CXLinkage_UniqueExternal { + if linkage != CXLinkage_External && + linkage != CXLinkage_UniqueExternal { return Err(ParseError::Continue); } diff --git a/src/ir/item.rs b/src/ir/item.rs index aef35d0b2d..a5d10e418d 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -1,11 +1,5 @@ //! Bindgen's core intermediate representation type. -use clang; -use clang_sys; -use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; -use std::cell::{Cell, RefCell}; -use std::fmt::Write; -use std::iter; use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; use super::derive::{CanDeriveCopy, CanDeriveDebug}; @@ -14,6 +8,12 @@ use super::item_kind::ItemKind; use super::module::Module; use super::ty::{Type, TypeKind}; use super::type_collector::{ItemSet, TypeCollector}; +use clang; +use clang_sys; +use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; +use std::cell::{Cell, RefCell}; +use std::fmt::Write; +use std::iter; /// A trait to get the canonical name from an item. /// @@ -193,7 +193,8 @@ impl TypeCollector for Item { // There are some types, like resolved type references, where we // don't want to stop collecting types even though they may be // opaque. - if ty.should_be_traced_unconditionally() || !self.is_opaque(ctx) { + if ty.should_be_traced_unconditionally() || + !self.is_opaque(ctx) { ty.collect_types(ctx, types, self); } } @@ -219,7 +220,8 @@ impl CanDeriveDebug for Item { type Extra = (); fn can_derive_debug(&self, ctx: &BindgenContext, _: ()) -> bool { - ctx.options().derive_debug && match self.kind { + ctx.options().derive_debug && + match self.kind { ItemKind::Type(ref ty) => { if self.is_opaque(ctx) { ty.layout(ctx) @@ -255,7 +257,9 @@ impl<'a> CanDeriveCopy<'a> for Item { ItemKind::Type(ref ty) => { if self.is_opaque(ctx) { ty.layout(ctx) - .map_or(true, |l| l.opaque().can_derive_copy_in_array(ctx, ())) + .map_or(true, |l| { + l.opaque().can_derive_copy_in_array(ctx, ()) + }) } else { ty.can_derive_copy_in_array(ctx, self) } @@ -759,9 +763,7 @@ impl Item { } ItemKind::Type(ref ty) => { let name = match *ty.kind() { - TypeKind::ResolvedTypeRef(..) => { - panic!("should have resolved this in name_target()") - } + TypeKind::ResolvedTypeRef(..) => panic!("should have resolved this in name_target()"), _ => ty.name(), }; name.map(ToOwned::to_owned) @@ -1136,7 +1138,7 @@ impl ClangItemParser for Item { } if let Some(ty) = - ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { + ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { return Ok(ty); } @@ -1154,9 +1156,10 @@ impl ClangItemParser for Item { }; if valid_decl { - if let Some(&(_, item_id)) = ctx.currently_parsed_types - .iter() - .find(|&&(d, _)| d == declaration_to_look_for) { + if let Some(&(_, item_id)) = + ctx.currently_parsed_types + .iter() + .find(|&&(d, _)| d == declaration_to_look_for) { debug!("Avoiding recursion parsing type: {:?}", ty); return Ok(item_id); } @@ -1325,7 +1328,7 @@ impl ItemCanonicalPath for Item { item.id() == target.id() || item.as_module().map_or(false, |module| { !module.is_inline() || - ctx.options().conservative_inline_namespaces + ctx.options().conservative_inline_namespaces }) }) .map(|item| { diff --git a/src/ir/layout.rs b/src/ir/layout.rs index 033fff6297..e8c6c32bf9 100644 --- a/src/ir/layout.rs +++ b/src/ir/layout.rs @@ -1,9 +1,9 @@ //! Intermediate representation for the physical layout of some type. -use std::cmp; use super::context::BindgenContext; use super::derive::{CanDeriveCopy, CanDeriveDebug}; use super::ty::RUST_DERIVE_IN_ARRAY_LIMIT; +use std::cmp; /// A type that represents the struct layout of a type. #[derive(Debug, Clone, Copy)] @@ -74,7 +74,8 @@ impl CanDeriveDebug for Opaque { type Extra = (); fn can_derive_debug(&self, _: &BindgenContext, _: ()) -> bool { - self.array_size().map_or(false, |size| size <= RUST_DERIVE_IN_ARRAY_LIMIT) + self.array_size() + .map_or(false, |size| size <= RUST_DERIVE_IN_ARRAY_LIMIT) } } @@ -82,7 +83,8 @@ impl<'a> CanDeriveCopy<'a> for Opaque { type Extra = (); fn can_derive_copy(&self, _: &BindgenContext, _: ()) -> bool { - self.array_size().map_or(false, |size| size <= RUST_DERIVE_IN_ARRAY_LIMIT) + self.array_size() + .map_or(false, |size| size <= RUST_DERIVE_IN_ARRAY_LIMIT) } fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { diff --git a/src/ir/module.rs b/src/ir/module.rs index 002fe36e6c..6b6c535bc7 100644 --- a/src/ir/module.rs +++ b/src/ir/module.rs @@ -1,9 +1,9 @@ //! Intermediate representation for modules (AKA C++ namespaces). +use super::context::{BindgenContext, ItemId}; use clang; use parse::{ClangSubItemParser, ParseError, ParseResult}; use parse_one; -use super::context::{BindgenContext, ItemId}; /// Whether this module is inline or not. #[derive(Debug, Copy, Clone, PartialEq, Eq)] diff --git a/src/ir/objc.rs b/src/ir/objc.rs index b9fe280b0d..92356d923a 100644 --- a/src/ir/objc.rs +++ b/src/ir/objc.rs @@ -1,10 +1,10 @@ //! Objective C types +// use clang_sys::CXCursor_ObjCSuperClassRef; +use super::context::BindgenContext; use clang; use clang_sys::CXChildVisit_Continue; use clang_sys::CXCursor_ObjCInstanceMethodDecl; -// use clang_sys::CXCursor_ObjCSuperClassRef; -use super::context::BindgenContext; /// Objective C interface as used in TypeKind /// diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 1246057bbf..3a9d508244 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1,7 +1,5 @@ //! Everything related to types in our intermediate representation. -use clang::{self, Cursor}; -use parse::{ClangItemParser, ParseError, ParseResult}; use super::comp::CompInfo; use super::context::{BindgenContext, ItemId}; use super::derive::{CanDeriveCopy, CanDeriveDebug}; @@ -12,6 +10,8 @@ use super::item::Item; use super::layout::Layout; use super::objc::ObjCInterface; use super::type_collector::{ItemSet, TypeCollector}; +use clang::{self, Cursor}; +use parse::{ClangItemParser, ParseError, ParseResult}; /// The base representation of a type in bindgen. /// diff --git a/src/ir/type_collector.rs b/src/ir/type_collector.rs index 0f10152d4a..25285b23f2 100644 --- a/src/ir/type_collector.rs +++ b/src/ir/type_collector.rs @@ -1,7 +1,7 @@ //! Collecting type items. -use std::collections::BTreeSet; use super::context::{BindgenContext, ItemId}; +use std::collections::BTreeSet; /// A set of items. pub type ItemSet = BTreeSet; diff --git a/src/ir/var.rs b/src/ir/var.rs index 329393fa5e..6cfcdae735 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -1,14 +1,14 @@ //! Intermediate representation of variables. -use cexpr; -use clang; -use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; -use std::num::Wrapping; use super::context::{BindgenContext, ItemId}; use super::function::cursor_mangling; use super::int::IntKind; use super::item::Item; use super::ty::{FloatKind, TypeKind}; +use cexpr; +use clang; +use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; +use std::num::Wrapping; /// The type for a constant variable. #[derive(Debug)] @@ -149,18 +149,18 @@ impl ClangSubItemParser for Var { EvalResult::Int(Wrapping(value)) => { let kind = ctx.type_chooser() .and_then(|c| c.int_macro(&name, value)) - .unwrap_or_else(|| { - if value < 0 { - if value < i32::min_value() as i64 { - IntKind::LongLong - } else { - IntKind::Int - } - } else if value > u32::max_value() as i64 { - IntKind::ULongLong + .unwrap_or_else(|| if value < 0 { + if value < i32::min_value() as i64 { + IntKind::LongLong } else { - IntKind::UInt + IntKind::Int } + } else if value > + u32::max_value() as + i64 { + IntKind::ULongLong + } else { + IntKind::UInt }); (TypeKind::Int(kind), VarType::Int(value)) @@ -187,7 +187,8 @@ impl ClangSubItemParser for Var { let ty = match Item::from_ty(&ty, Some(cursor), None, ctx) { Ok(ty) => ty, Err(e) => { - assert_eq!(ty.kind(), CXType_Auto, + assert_eq!(ty.kind(), + CXType_Auto, "Couldn't resolve constant type, and it \ wasn't an nondeductible auto type!"); return Err(e); @@ -222,12 +223,10 @@ impl ClangSubItemParser for Var { val = get_integer_literal_from_cursor(&cursor, tu); } - val.map(|val| { - if kind == IntKind::Bool { - VarType::Bool(val != 0) - } else { - VarType::Int(val) - } + val.map(|val| if kind == IntKind::Bool { + VarType::Bool(val != 0) + } else { + VarType::Int(val) }) } else if is_float { cursor.evaluate() diff --git a/src/lib.rs b/src/lib.rs index d6f3c66ea4..84a2ee6708 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -525,7 +525,6 @@ pub struct BindgenOptions { /// The input header file. pub input_header: Option, - /// Generate a dummy C/C++ file that includes the header and has dummy uses /// of all types defined therein. See the `uses` module for more. pub dummy_uses: Option, @@ -754,16 +753,16 @@ impl<'ctx> Bindings<'ctx> { /// /// See the `uses` module for more information. pub fn write_dummy_uses(&mut self) -> io::Result<()> { - let file = - if let Some(ref dummy_path) = self.context.options().dummy_uses { - Some(try!(OpenOptions::new() + let file = if let Some(ref dummy_path) = + self.context.options().dummy_uses { + Some(try!(OpenOptions::new() .write(true) .truncate(true) .create(true) .open(dummy_path))) - } else { - None - }; + } else { + None + }; if let Some(file) = file { try!(uses::generate_dummy_uses(&mut self.context, file)); diff --git a/src/main.rs b/src/main.rs index a7bd961890..9b037ef8bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -35,9 +35,7 @@ pub fn main() { match version.parsed { None => warn!("Couldn't parse libclang version"), Some(version) if version != expected_version => { - warn!("Using clang {:?}, expected {:?}", - version, - expected_version); + warn!("Using clang {:?}, expected {:?}", version, expected_version); } _ => {} } diff --git a/src/options.rs b/src/options.rs index 535eac4bb0..8d11be2d2a 100644 --- a/src/options.rs +++ b/src/options.rs @@ -1,5 +1,5 @@ -use clap::{App, Arg}; use bindgen::{Builder, CodegenConfig, builder}; +use clap::{App, Arg}; use std::fs::File; use std::io::{self, Error, ErrorKind}; diff --git a/src/regex_set.rs b/src/regex_set.rs index dbdb656567..2eff740b86 100644 --- a/src/regex_set.rs +++ b/src/regex_set.rs @@ -21,7 +21,7 @@ impl RegexSet { /// Extend this set with every regex in the iterator. pub fn extend(&mut self, iter: I) where I: IntoIterator, - S: AsRef + S: AsRef, { for s in iter.into_iter() { self.insert(s) @@ -30,7 +30,7 @@ impl RegexSet { /// Insert a new regex into this set. pub fn insert(&mut self, string: S) - where S: AsRef + where S: AsRef, { self.items.push(format!("^{}$", string.as_ref())); self.set = None; @@ -46,13 +46,13 @@ impl RegexSet { Err(e) => { error!("Invalid regex in {:?}: {:?}", self.items, e); None - }, + } } } /// Does the given `string` match any of the regexes in this set? pub fn matches(&self, string: S) -> bool - where S: AsRef + where S: AsRef, { let s = string.as_ref(); self.set.as_ref().map(|set| set.is_match(s)).unwrap_or(false) diff --git a/tests/tests.rs b/tests/tests.rs index 2886f8db5b..5b0ccd1112 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -68,8 +68,7 @@ fn compare_generated_header(header: &PathBuf, Err(Error::new(ErrorKind::Other, "Header and binding differ!")) } -fn create_bindgen_builder(header: &PathBuf) - -> Result, Error> { +fn create_bindgen_builder(header: &PathBuf) -> Result, Error> { let source = try!(fs::File::open(header)); let reader = BufReader::new(source); From 2723539b0115edf323b9c1222af2281d7b286598 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 3 Feb 2017 10:32:51 -0800 Subject: [PATCH 0291/2291] Make Cursor::num_template_args slightly more reliable --- src/clang.rs | 57 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 63f9123e0e..f231de5939 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -122,20 +122,37 @@ impl Cursor { } /// Return the number of template arguments used by this cursor's referent, - /// if the referent is either a template specialization or - /// declaration. Returns -1 otherwise. + /// if the referent is either a template specialization or declaration. + /// Returns `None` otherwise. /// /// NOTE: This may not return `Some` for some non-fully specialized /// templates, see #193 and #194. pub fn num_template_args(&self) -> Option { - let n: c_int = unsafe { clang_Cursor_getNumTemplateArguments(self.x) }; + // XXX: `clang_Type_getNumTemplateArguments` is sort of reliable, while + // `clang_Cursor_getNumTemplateArguments` is totally unreliable. + // Therefore, try former first, and only fallback to the latter if we + // have to. + self.cur_type().num_template_args() + .or_else(|| { + let n: c_int = unsafe { + clang_Cursor_getNumTemplateArguments(self.x) + }; - if n >= 0 { - Some(n as u32) - } else { - debug_assert_eq!(n, -1); - None - } + if n >= 0 { + Some(n as u32) + } else { + debug_assert_eq!(n, -1); + None + } + }) + .or_else(|| { + let canonical = self.canonical(); + if canonical != *self { + canonical.num_template_args() + } else { + None + } + }) } /// Get a cursor pointing to this referent's containing translation unit. @@ -673,22 +690,28 @@ impl Type { Ok(Layout::new(size, align)) } - /// If this type is a class template specialization, return its - /// template arguments. Otherwise, return None. - pub fn template_args(&self) -> Option { + /// Get the number of template arguments this type has, or `None` if it is + /// not some kind of template. + pub fn num_template_args(&self) -> Option { let n = unsafe { clang_Type_getNumTemplateArguments(self.x) }; if n >= 0 { - Some(TypeTemplateArgIterator { - x: self.x, - length: n as u32, - index: 0, - }) + Some(n as u32) } else { debug_assert_eq!(n, -1); None } } + /// If this type is a class template specialization, return its + /// template arguments. Otherwise, return None. + pub fn template_args(&self) -> Option { + self.num_template_args().map(|n| TypeTemplateArgIterator { + x: self.x, + length: n, + index: 0, + }) + } + /// Given that this type is a pointer type, return the type that it points /// to. pub fn pointee_type(&self) -> Option { From 9c2e6f01a3e3284f8560eae7f1d333681e95f195 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 3 Feb 2017 11:10:24 -0800 Subject: [PATCH 0292/2291] Assert that code is properly `rustfmt`ed in CI This commit makes Travis CI reject code which has not been run through the latest version of `rustfmt`. Additionally, it refactors our CI testing out into a couple little scripts. --- .travis.yml | 14 +++----------- ci/assert-docs.sh | 6 ++++++ ci/assert-no-diff.sh | 8 ++++++++ ci/assert-rustfmt.sh | 16 ++++++++++++++++ ci/test.sh | 26 ++++++++++++++++++++++++++ src/ir/objc.rs | 1 + 6 files changed, 60 insertions(+), 11 deletions(-) create mode 100755 ci/assert-docs.sh create mode 100755 ci/assert-no-diff.sh create mode 100755 ci/assert-rustfmt.sh create mode 100755 ci/test.sh diff --git a/.travis.yml b/.travis.yml index 47af4eeb41..aaa4b2e690 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,17 +25,9 @@ cache: before_install: . ./ci/before_install.sh script: - - cargo test --features "$BINDGEN_FEATURES assert_no_dangling_items" - - cargo test --release --features "$BINDGEN_FEATURES assert_no_dangling_items" - - git add -A - - git diff @ - - git diff-index --quiet HEAD - - cargo build --features "$BINDGEN_FEATURES docs_" - - cd tests/expectations - - cargo test - - cd ../../bindgen-integration - - cargo test --features "$BINDGEN_FEATURES" - - cargo test --release --features "$BINDGEN_FEATURES" + - ./ci/assert-rustfmt.sh + - ./ci/assert-docs.sh + - ./ci/test.sh notifications: webhooks: http://build.servo.org:54856/travis diff --git a/ci/assert-docs.sh b/ci/assert-docs.sh new file mode 100755 index 0000000000..aa4b90ac04 --- /dev/null +++ b/ci/assert-docs.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -xeu +cd "$(dirname "$0")/.." + +cargo build --features "$BINDGEN_FEATURES docs_" diff --git a/ci/assert-no-diff.sh b/ci/assert-no-diff.sh new file mode 100755 index 0000000000..14f2aa2161 --- /dev/null +++ b/ci/assert-no-diff.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -xeu +cd "$(dirname "$0")/.." + +git add -u +git diff @ +git diff-index --quiet HEAD diff --git a/ci/assert-rustfmt.sh b/ci/assert-rustfmt.sh new file mode 100755 index 0000000000..bd268600ec --- /dev/null +++ b/ci/assert-rustfmt.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +set -xeu +cd "$(dirname "$0")/.." + +# Ensure we have the most up-to-date `rustfmt`. +cargo install -f rustfmt + +# Run `rustfmt` on the crate! If `rustfmt` can't make a long line shorter, it +# prints an error and exits non-zero, so tell it to kindly shut its yapper and +# make sure it doesn't cause us to exit this whole script non-zero. +cargo fmt --quiet || true + +# Exit non-zero if this resulted in any diffs. +./ci/assert-no-diff.sh + diff --git a/ci/test.sh b/ci/test.sh new file mode 100755 index 0000000000..9bfccfd8f1 --- /dev/null +++ b/ci/test.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +set -xeu +cd "$(dirname "$0")/.." + +# Regenerate the test headers' bindings in debug and release modes, and assert +# that we always get the expected generated bindings. + +cargo test --features "$BINDGEN_FEATURES assert_no_dangling_items" +./ci/assert-no-diff.sh + +cargo test --release --features "$BINDGEN_FEATURES assert_no_dangling_items" +./ci/assert-no-diff.sh + +# Now test the expectations' size and alignment tests. + +pushd tests/expectations +cargo test +cargo test --release +popd + +# And finally, test our example bindgen + build.rs integration template project. + +cd bindgen-integration +cargo test --features "$BINDGEN_FEATURES" +cargo test --release --features "$BINDGEN_FEATURES" diff --git a/src/ir/objc.rs b/src/ir/objc.rs index 92356d923a..08cab1cce7 100644 --- a/src/ir/objc.rs +++ b/src/ir/objc.rs @@ -1,6 +1,7 @@ //! Objective C types // use clang_sys::CXCursor_ObjCSuperClassRef; + use super::context::BindgenContext; use clang; use clang_sys::CXChildVisit_Continue; From 916dfa421f3b96fd4e6d3d3c1f40e99bd015090c Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 3 Feb 2017 11:54:57 -0800 Subject: [PATCH 0293/2291] Source CI scripts to inherit environment vars --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index aaa4b2e690..69ed0c6fae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,9 +25,9 @@ cache: before_install: . ./ci/before_install.sh script: - - ./ci/assert-rustfmt.sh - - ./ci/assert-docs.sh - - ./ci/test.sh + - . ./ci/assert-rustfmt.sh + - . ./ci/assert-docs.sh + - . ./ci/test.sh notifications: webhooks: http://build.servo.org:54856/travis From 42d8133c39fd8097b6fb276f28ac637bb7565862 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 3 Feb 2017 12:05:11 -0800 Subject: [PATCH 0294/2291] Padd BINDGEN_FEATURES through to the ci scripts --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 69ed0c6fae..4dd55c86ef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,9 +25,9 @@ cache: before_install: . ./ci/before_install.sh script: - - . ./ci/assert-rustfmt.sh - - . ./ci/assert-docs.sh - - . ./ci/test.sh + - ./ci/assert-rustfmt.sh + - BINDGEN_FEATURES="$BINDGEN_FEATURES" ./ci/assert-docs.sh + - BINDGEN_FEATURES="$BINDGEN_FEATURES" ./ci/test.sh notifications: webhooks: http://build.servo.org:54856/travis From 50dc79237b9cb4d822d449f9b5b674a0798f429a Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 3 Feb 2017 12:44:41 -0800 Subject: [PATCH 0295/2291] Update CONTRIBUTING.md to talk about rustfmt in CI --- CONTRIBUTING.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cfcee653bb..9ee1b4ac33 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -114,24 +114,26 @@ $ cargo test -p tests_expectations ## Automatic code formatting -There's a `rustfmt.toml` file in the repo. Ideally changes should be consistent -with the style, though that's not enforced right now. +We use [`rustfmt`](https://github.com/rust-lang-nursery/rustfmt) to enforce a +consistent code style across the whole `bindgen` code base. This is enforced in +CI, and your pull requests will get automatically rejected if you don't +re-format with the latest `rustfmt` before pushing. -[`rustfmt`](https://github.com/rust-lang-nursery/rustfmt) can catch and fix -automatically all the coding style issues it finds. In order to use it it -suffices to do: +You can install the latest version of `rustfmt` with this command: ``` -$ cargo fmt +$ cargo install -f rustfmt ``` -For it to work, you need to have `rustfmt` installed. To do so: +Ensure that `~/.cargo/bin` is on your path. + +Once that is taken care of, you can (re)format all code by running this command: ``` -$ cargo install rustfmt +$ cargo fmt ``` -And ensure `~/.cargo/bin` is on your path. +The code style is described in the `rustfmt.toml` file in top level of the repo. ## Debug Logging From 0a0afb7e632131b476344aa322e491b11064ba70 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 3 Feb 2017 17:29:32 -0800 Subject: [PATCH 0296/2291] Don't publish tests --- Cargo.lock | 2 +- Cargo.toml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 30584cd7a0..a6a7de6402 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ [root] name = "bindgen" -version = "0.21.0" +version = "0.21.1" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 7d90a96c61..d99411478a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,9 +13,11 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.21.0" +version = "0.21.1" build = "build.rs" +exclude = ["tests/headers", "tests/expectations"] + [badges] travis-ci = { repository = "servo/rust-bindgen" } From 1228df657da852473afac69e14e7cc544ab27423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 3 Feb 2017 21:20:59 +0100 Subject: [PATCH 0297/2291] Don't break the build so fast for older rust versions. --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/clang.rs | 25 ++++++++++++++----------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6a7de6402..0acb10e823 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ [root] name = "bindgen" -version = "0.21.1" +version = "0.21.2" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index d99411478a..5f82c49406 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.21.1" +version = "0.21.2" build = "build.rs" exclude = ["tests/headers", "tests/expectations"] diff --git a/src/clang.rs b/src/clang.rs index 7e6c357b1c..8741663d85 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -1366,27 +1366,30 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { if let Some(refd) = c.referenced() { if refd != *c { - println!(); + println!(""); print_cursor(depth, String::from(prefix) + "referenced.", &refd); + print_cursor(depth, String::from(prefix) + "referenced.", &refd); } } let canonical = c.canonical(); if canonical != *c { - println!(); + println!(""); print_cursor(depth, String::from(prefix) + "canonical.", &canonical); + print_cursor(depth, String::from(prefix) + "canonical.", &canonical); } if let Some(specialized) = c.specialized() { if specialized != *c { - println!(); + println!(""); print_cursor(depth, String::from(prefix) + "specialized.", &specialized); + print_cursor(depth, String::from(prefix) + "specialized.", &specialized); } } } @@ -1419,34 +1422,34 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { let canonical = ty.canonical_type(); if canonical != *ty { - println!(); + println!(""); print_type(depth, String::from(prefix) + "canonical.", &canonical); } if let Some(pointee) = ty.pointee_type() { if pointee != *ty { - println!(); + println!(""); print_type(depth, String::from(prefix) + "pointee.", &pointee); } } if let Some(elem) = ty.elem_type() { if elem != *ty { - println!(); + println!(""); print_type(depth, String::from(prefix) + "elements.", &elem); } } if let Some(ret) = ty.ret_type() { if ret != *ty { - println!(); + println!(""); print_type(depth, String::from(prefix) + "return.", &ret); } } let named = ty.named(); if named != *ty && named.is_valid() { - println!(); + println!(""); print_type(depth, String::from(prefix) + "named.", &named); } } @@ -1454,13 +1457,13 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { print_indent(depth, "("); print_cursor(depth, "", c); - println!(); + println!(""); let ty = c.cur_type(); print_type(depth, "type.", &ty); let declaration = ty.declaration(); if declaration != *c && declaration.kind() != CXCursor_NoDeclFound { - println!(); + println!(""); print_cursor(depth, "type.declaration.", &declaration); } @@ -1468,7 +1471,7 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { let mut found_children = false; c.visit(|s| { if !found_children { - println!(); + println!(""); found_children = true; } ast_dump(&s, depth + 1) From 7385d1c722b559508d31d3c9773ac4cf043ebec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 4 Feb 2017 12:17:55 +0100 Subject: [PATCH 0298/2291] Also exclude the test crate from packaging. --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 5f82c49406..69a3f00f80 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ documentation = "https://docs.rs/bindgen" version = "0.21.2" build = "build.rs" -exclude = ["tests/headers", "tests/expectations"] +exclude = ["tests/headers", "tests/expectations", "bindgen-integration"] [badges] travis-ci = { repository = "servo/rust-bindgen" } From 8b0246a6e20ec0b619f224d083e342ff0202cb5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 4 Feb 2017 12:19:12 +0100 Subject: [PATCH 0299/2291] Also CI scripts. --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 69a3f00f80..d108c2c9ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ documentation = "https://docs.rs/bindgen" version = "0.21.2" build = "build.rs" -exclude = ["tests/headers", "tests/expectations", "bindgen-integration"] +exclude = ["tests/headers", "tests/expectations", "bindgen-integration", "ci"] [badges] travis-ci = { repository = "servo/rust-bindgen" } From 692ff7420c84f1b00813a247b853caf3ece2c27c Mon Sep 17 00:00:00 2001 From: Jeffrey Deng Date: Sat, 4 Feb 2017 15:22:26 -0500 Subject: [PATCH 0300/2291] Removed verbose option flag from builder, and kept it in options --- src/lib.rs | 19 ++----------------- src/main.rs | 3 +-- src/options.rs | 8 +++----- tests/tests.rs | 2 +- 4 files changed, 7 insertions(+), 25 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9bdbadb44f..f2fdc7b4c9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -433,17 +433,6 @@ impl Builder { self } - /// Set to output verbose messages - pub fn verbose(mut self) -> Self { - self.options.verbose = true; - self - } - - /// Is set to output verbose messages - pub fn is_verbose(&self) -> bool { - return self.options.verbose; - } - /// Generate the Rust bindings using the options built up thus far. pub fn generate<'ctx>(self) -> Result, ()> { Bindings::generate(self.options, None) @@ -554,19 +543,16 @@ pub struct BindgenOptions { /// See the builder method description for more details. pub conservative_inline_namespaces: bool, - /// Whether to keep documentation comments in the generated output. See the + /// Wether to keep documentation comments in the generated output. See the /// documentation for more details. pub generate_comments: bool, - /// Whether to whitelist types recursively. Defaults to true. + /// Wether to whitelist types recursively. Defaults to true. pub whitelist_recursively: bool, /// Intead of emitting 'use objc;' to files generated from objective c files, /// generate '#[macro_use] extern crate objc;' pub objc_extern_crate: bool, - - /// Whether we should print verbose messages. - pub verbose: bool, } /// TODO(emilio): This is sort of a lie (see the error message that results from @@ -619,7 +605,6 @@ impl Default for BindgenOptions { generate_comments: true, whitelist_recursively: true, objc_extern_crate: false, - verbose: false, } } } diff --git a/src/main.rs b/src/main.rs index a73b0feef4..7f424318e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,9 +44,8 @@ pub fn main() { } match builder_from_flags(bind_args.into_iter()) { - Ok((builder, output)) => { + Ok((builder, output, verbose)) => { - let verbose = (&builder).is_verbose(); let builder_result = panic::catch_unwind(|| builder.generate().expect("Unable to generate bindings") diff --git a/src/options.rs b/src/options.rs index f341b5dda6..63df8b2a43 100644 --- a/src/options.rs +++ b/src/options.rs @@ -5,7 +5,7 @@ use std::io::{self, Error, ErrorKind}; /// Construct a new [`Builder`](./struct.Builder.html) from command line flags. pub fn builder_from_flags(args: I) - -> Result<(Builder, Box), io::Error> + -> Result<(Builder, Box, bool), io::Error> where I: Iterator, { let matches = App::new("bindgen") @@ -349,9 +349,7 @@ pub fn builder_from_flags(args: I) Box::new(io::BufWriter::new(io::stdout())) as Box }; - if matches.is_present("verbose") { - builder = builder.verbose(); - } + let verbose = matches.is_present("verbose"); - Ok((builder, output)) + Ok((builder, output, verbose)) } diff --git a/tests/tests.rs b/tests/tests.rs index 2886f8db5b..81f3e15c48 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -118,7 +118,7 @@ fn create_bindgen_builder(header: &PathBuf) .chain(flags.into_iter()); builder_from_flags(args) - .map(|(builder, _)| Some(builder.no_unstable_rust())) + .map(|(builder, _, _)| Some(builder.no_unstable_rust())) } macro_rules! test_header { From 8128b2a6c909fac6131f41c140dfd32f00fe71f7 Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Sat, 4 Feb 2017 02:10:34 +0200 Subject: [PATCH 0301/2291] objc: Support method arguments --- src/clang.rs | 11 ++ src/codegen/mod.rs | 160 ++++++++++++++---------- src/ir/function.rs | 10 +- src/ir/objc.rs | 46 ++++++- tests/expectations/tests/objc_method.rs | 31 +++++ tests/headers/objc_method.h | 6 +- 6 files changed, 191 insertions(+), 73 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 8741663d85..4a46b694e3 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -523,6 +523,14 @@ impl Cursor { pub fn evaluate(&self) -> Option { EvalResult::new(*self) } + + /// Return the result type for this cursor + pub fn ret_type(&self) -> Option { + let rt = Type { + x: unsafe { clang_getCursorResultType(self.x) }, + }; + if rt.is_valid() { Some(rt) } else { None } + } } extern "C" fn visit_children(cur: CXCursor, @@ -1363,6 +1371,9 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { prefix, type_to_str(ty.kind()))); } + if let Some(ty) = c.ret_type() { + print_indent(depth, format!(" {}ret-type = {}", prefix, type_to_str(ty.kind()))); + } if let Some(refd) = c.referenced() { if refd != *c { diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 9c71e99343..9700918581 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2153,61 +2153,8 @@ impl ToRustTy for FunctionSig { fn to_rust_ty(&self, ctx: &BindgenContext, _item: &Item) -> P { // TODO: we might want to consider ignoring the reference return value. - let return_item = ctx.resolve_item(self.return_type()); - let ret = - if let TypeKind::Void = *return_item.kind().expect_type().kind() { - ast::FunctionRetTy::Default(ctx.span()) - } else { - ast::FunctionRetTy::Ty(return_item.to_rust_ty(ctx)) - }; - - let mut unnamed_arguments = 0; - let arguments = self.argument_types().iter().map(|&(ref name, ty)| { - let arg_item = ctx.resolve_item(ty); - let arg_ty = arg_item.kind().expect_type(); - - // From the C90 standard[1]: - // - // A declaration of a parameter as "array of type" shall be - // adjusted to "qualified pointer to type", where the type - // qualifiers (if any) are those specified within the [ and ] of - // the array type derivation. - // - // [1]: http://c0x.coding-guidelines.com/6.7.5.3.html - let arg_ty = match *arg_ty.canonical_type(ctx).kind() { - TypeKind::Array(t, _) => { - t.to_rust_ty(ctx).to_ptr(arg_ty.is_const(), ctx.span()) - }, - TypeKind::Pointer(inner) => { - let inner = ctx.resolve_item(inner); - let inner_ty = inner.expect_type(); - if let TypeKind::ObjCInterface(_) = *inner_ty.canonical_type(ctx).kind() { - quote_ty!(ctx.ext_cx(), id) - } else { - arg_item.to_rust_ty(ctx) - } - }, - _ => { - arg_item.to_rust_ty(ctx) - } - }; - - let arg_name = match *name { - Some(ref name) => ctx.rust_mangle(name).into_owned(), - None => { - unnamed_arguments += 1; - format!("arg{}", unnamed_arguments) - } - }; - - assert!(!arg_name.is_empty()); - - ast::Arg { - ty: arg_ty, - pat: aster::AstBuilder::new().pat().id(arg_name), - id: ast::DUMMY_NODE_ID, - } - }).collect::>(); + let ret = utils::fnsig_return_ty(ctx, &self); + let arguments = utils::fnsig_arguments(ctx, &self); let decl = P(ast::FnDecl { inputs: arguments, @@ -2316,9 +2263,36 @@ impl CodeGenerator for ObjCInterface { let mut trait_items = vec![]; for method in self.methods() { - let method_name = ctx.rust_ident(method.name()); + let signature = method.signature(); + let fn_args = utils::fnsig_arguments(ctx, signature); + let fn_ret = utils::fnsig_return_ty(ctx, signature); + let sig = aster::AstBuilder::new() + .method_sig() + .unsafe_() + .fn_decl() + .self_() + .build(ast::SelfKind::Value(ast::Mutability::Immutable)) + .with_args(fn_args.clone()) + .build(fn_ret); + + // Collect the actual used argument names + let arg_names: Vec<_> = fn_args.iter() + .map(|ref arg| { + match arg.pat.node { + ast::PatKind::Ident(_, ref spanning, _) => { + spanning.node.name.as_str().to_string() + } + _ => { + panic!("odd argument!"); + } + } + }) + .collect(); - let body = quote_stmt!(ctx.ext_cx(), msg_send![self, $method_name]) + let methods_and_args = + ctx.rust_ident(&method.format_method_call(&arg_names)); + let body = + quote_stmt!(ctx.ext_cx(), msg_send![self, $methods_and_args]) .unwrap(); let block = ast::Block { stmts: vec![body], @@ -2327,13 +2301,6 @@ impl CodeGenerator for ObjCInterface { span: ctx.span(), }; - let sig = aster::AstBuilder::new() - .method_sig() - .unsafe_() - .fn_decl() - .self_() - .build(ast::SelfKind::Value(ast::Mutability::Immutable)) - .build(ast::FunctionRetTy::Default(ctx.span())); let attrs = vec![]; let impl_item = ast::ImplItem { @@ -2697,4 +2664,69 @@ mod utils { _ => panic!("How did this happen exactly?"), } } + + pub fn fnsig_return_ty(ctx: &BindgenContext, + sig: &super::FunctionSig) + -> ast::FunctionRetTy { + let return_item = ctx.resolve_item(sig.return_type()); + if let TypeKind::Void = *return_item.kind().expect_type().kind() { + ast::FunctionRetTy::Default(ctx.span()) + } else { + ast::FunctionRetTy::Ty(return_item.to_rust_ty(ctx)) + } + } + + pub fn fnsig_arguments(ctx: &BindgenContext, + sig: &super::FunctionSig) + -> Vec { + use super::ToPtr; + let mut unnamed_arguments = 0; + sig.argument_types().iter().map(|&(ref name, ty)| { + let arg_item = ctx.resolve_item(ty); + let arg_ty = arg_item.kind().expect_type(); + + // From the C90 standard[1]: + // + // A declaration of a parameter as "array of type" shall be + // adjusted to "qualified pointer to type", where the type + // qualifiers (if any) are those specified within the [ and ] of + // the array type derivation. + // + // [1]: http://c0x.coding-guidelines.com/6.7.5.3.html + let arg_ty = match *arg_ty.canonical_type(ctx).kind() { + TypeKind::Array(t, _) => { + t.to_rust_ty(ctx).to_ptr(arg_ty.is_const(), ctx.span()) + }, + TypeKind::Pointer(inner) => { + let inner = ctx.resolve_item(inner); + let inner_ty = inner.expect_type(); + if let TypeKind::ObjCInterface(_) = *inner_ty.canonical_type(ctx).kind() { + quote_ty!(ctx.ext_cx(), id) + } else { + arg_item.to_rust_ty(ctx) + } + }, + _ => { + arg_item.to_rust_ty(ctx) + } + }; + + let arg_name = match *name { + Some(ref name) => ctx.rust_mangle(name).into_owned(), + None => { + unnamed_arguments += 1; + format!("arg{}", unnamed_arguments) + } + }; + + assert!(!arg_name.is_empty()); + + ast::Arg { + ty: arg_ty, + pat: aster::AstBuilder::new().pat().id(arg_name), + id: ast::DUMMY_NODE_ID, + } + }).collect::>() + } + } diff --git a/src/ir/function.rs b/src/ir/function.rs index cc31867939..147557f316 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -85,6 +85,7 @@ fn get_abi(cc: CXCallingConv) -> abi::Abi { CXCallingConv_X86FastCall => abi::Abi::Fastcall, CXCallingConv_AAPCS => abi::Abi::Aapcs, CXCallingConv_X86_64Win64 => abi::Abi::Win64, + CXCallingConv_Invalid => abi::Abi::C, // TODO: other => panic!("unsupported calling convention: {:?}", other), } } @@ -154,7 +155,8 @@ impl FunctionSig { let mut args: Vec<_> = match cursor.kind() { CXCursor_FunctionDecl | CXCursor_Constructor | - CXCursor_CXXMethod => { + CXCursor_CXXMethod | + CXCursor_ObjCInstanceMethodDecl => { // For CXCursor_FunctionDecl, cursor.args() is the reliable way // to get parameter names and types. cursor.args() @@ -218,7 +220,11 @@ impl FunctionSig { } } - let ty_ret_type = try!(ty.ret_type().ok_or(ParseError::Continue)); + let ty_ret_type = if cursor.kind() == CXCursor_ObjCInstanceMethodDecl { + try!(cursor.ret_type().ok_or(ParseError::Continue)) + } else { + try!(ty.ret_type().ok_or(ParseError::Continue)) + }; let ret = Item::from_ty_or_ref(ty_ret_type, None, None, ctx); let abi = get_abi(ty.call_conv()); diff --git a/src/ir/objc.rs b/src/ir/objc.rs index 08cab1cce7..ea2cc0c887 100644 --- a/src/ir/objc.rs +++ b/src/ir/objc.rs @@ -1,11 +1,10 @@ //! Objective C types -// use clang_sys::CXCursor_ObjCSuperClassRef; - -use super::context::BindgenContext; use clang; use clang_sys::CXChildVisit_Continue; use clang_sys::CXCursor_ObjCInstanceMethodDecl; +use super::context::BindgenContext; +use super::function::FunctionSig; /// Objective C interface as used in TypeKind /// @@ -30,6 +29,8 @@ pub struct ObjCInstanceMethod { /// Method name as converted to rust /// like, dataWithBytes_length_ rust_name: String, + + signature: FunctionSig, } impl ObjCInterface { @@ -53,7 +54,7 @@ impl ObjCInterface { /// Parses the Objective C interface from the cursor pub fn from_ty(cursor: &clang::Cursor, - _ctx: &mut BindgenContext) + ctx: &mut BindgenContext) -> Option { let name = cursor.spelling(); let mut interface = Self::new(&name); @@ -62,7 +63,10 @@ impl ObjCInterface { match cursor.kind() { CXCursor_ObjCInstanceMethodDecl => { let name = cursor.spelling(); - let method = ObjCInstanceMethod::new(&name); + let signature = + FunctionSig::from_ty(&cursor.cur_type(), &cursor, ctx) + .expect("Invalid function sig"); + let method = ObjCInstanceMethod::new(&name, signature); interface.methods.push(method); } @@ -75,7 +79,7 @@ impl ObjCInterface { } impl ObjCInstanceMethod { - fn new(name: &str) -> ObjCInstanceMethod { + fn new(name: &str, signature: FunctionSig) -> ObjCInstanceMethod { let split_name: Vec<&str> = name.split(':').collect(); let rust_name = split_name.join("_"); @@ -83,6 +87,7 @@ impl ObjCInstanceMethod { ObjCInstanceMethod { name: name.to_owned(), rust_name: rust_name.to_owned(), + signature: signature, } } @@ -97,4 +102,33 @@ impl ObjCInstanceMethod { pub fn rust_name(&self) -> &str { self.rust_name.as_ref() } + + /// Returns the methods signature as FunctionSig + pub fn signature(&self) -> &FunctionSig { + &self.signature + } + + /// Formats the method call + pub fn format_method_call(&self, args: &[String]) -> String { + let split_name: Vec<&str> = + self.name.split(':').filter(|p| !p.is_empty()).collect(); + + // No arguments + if args.len() == 0 && split_name.len() == 1 { + return split_name[0].to_string(); + } + + // Check right amount of arguments + if args.len() != split_name.len() { + panic!("Incorrect method name or arguments for objc method, {:?} vs {:?}", + args, + split_name); + } + + split_name.iter() + .zip(args.iter()) + .map(|parts| format!("{}:{} ", parts.0, parts.1)) + .collect::>() + .join("") + } } diff --git a/tests/expectations/tests/objc_method.rs b/tests/expectations/tests/objc_method.rs index e2db24f69d..d0342a2129 100644 --- a/tests/expectations/tests/objc_method.rs +++ b/tests/expectations/tests/objc_method.rs @@ -11,7 +11,38 @@ extern crate objc; pub type id = *mut objc::runtime::Object; pub trait Foo { unsafe fn method(self); + unsafe fn methodWithInt_(self, foo: ::std::os::raw::c_int); + unsafe fn methodWithFoo_(self, foo: id); + unsafe fn methodReturningInt(self) + -> ::std::os::raw::c_int; + unsafe fn methodReturningFoo(self) + -> *mut id; + unsafe fn methodWithArg1_andArg2_andArg3_(self, + intvalue: ::std::os::raw::c_int, + ptr: + *mut ::std::os::raw::c_char, + floatvalue: f32); } impl Foo for id { unsafe fn method(self) { msg_send!(self , method) } + unsafe fn methodWithInt_(self, foo: ::std::os::raw::c_int) { + msg_send!(self , methodWithInt:foo ) + } + unsafe fn methodWithFoo_(self, foo: id) { + msg_send!(self , methodWithFoo:foo ) + } + unsafe fn methodReturningInt(self) -> ::std::os::raw::c_int { + msg_send!(self , methodReturningInt) + } + unsafe fn methodReturningFoo(self) -> *mut id { + msg_send!(self , methodReturningFoo) + } + unsafe fn methodWithArg1_andArg2_andArg3_(self, + intvalue: ::std::os::raw::c_int, + ptr: + *mut ::std::os::raw::c_char, + floatvalue: f32) { + msg_send!(self , + methodWithArg1:intvalue andArg2:ptr andArg3:floatvalue ) + } } diff --git a/tests/headers/objc_method.h b/tests/headers/objc_method.h index 91645f16d1..7a22e8e44e 100644 --- a/tests/headers/objc_method.h +++ b/tests/headers/objc_method.h @@ -3,5 +3,9 @@ @interface Foo - (void)method; -// TODO: argument methods +- (void)methodWithInt:(int)foo; +- (void)methodWithFoo:(Foo*)foo; +- (int)methodReturningInt; +- (Foo*)methodReturningFoo; +- (void)methodWithArg1:(int)intvalue andArg2:(char*)ptr andArg3:(float)floatvalue; @end From bc87b2aece7dfb947051c8ecd7a0723c58978379 Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Sun, 5 Feb 2017 23:33:16 +0200 Subject: [PATCH 0302/2291] Make abi optional for FunctionSig --- src/codegen/mod.rs | 5 +++-- src/ir/function.rs | 27 ++++++++++++++++----------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 9700918581..3b0882afcb 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2164,7 +2164,7 @@ impl ToRustTy for FunctionSig { let fnty = ast::TyKind::BareFn(P(ast::BareFnTy { unsafety: ast::Unsafety::Unsafe, - abi: self.abi(), + abi: self.abi().expect("Invalid abi for function!"), lifetimes: vec![], decl: decl, })); @@ -2244,7 +2244,8 @@ impl CodeGenerator for Function { vis: ast::Visibility::Public, }; - let item = ForeignModBuilder::new(signature.abi()) + let item = ForeignModBuilder::new(signature.abi() + .expect("Invalid abi for function!")) .with_foreign_item(foreign_item) .build(ctx); diff --git a/src/ir/function.rs b/src/ir/function.rs index 147557f316..9ef9c3a73c 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -73,19 +73,19 @@ pub struct FunctionSig { is_variadic: bool, /// The ABI of this function. - abi: abi::Abi, + abi: Option, } -fn get_abi(cc: CXCallingConv) -> abi::Abi { +fn get_abi(cc: CXCallingConv) -> Option { use clang_sys::*; match cc { - CXCallingConv_Default => abi::Abi::C, - CXCallingConv_C => abi::Abi::C, - CXCallingConv_X86StdCall => abi::Abi::Stdcall, - CXCallingConv_X86FastCall => abi::Abi::Fastcall, - CXCallingConv_AAPCS => abi::Abi::Aapcs, - CXCallingConv_X86_64Win64 => abi::Abi::Win64, - CXCallingConv_Invalid => abi::Abi::C, // TODO: + CXCallingConv_Default => Some(abi::Abi::C), + CXCallingConv_C => Some(abi::Abi::C), + CXCallingConv_X86StdCall => Some(abi::Abi::Stdcall), + CXCallingConv_X86FastCall => Some(abi::Abi::Fastcall), + CXCallingConv_AAPCS => Some(abi::Abi::Aapcs), + CXCallingConv_X86_64Win64 => Some(abi::Abi::Win64), + CXCallingConv_Invalid => None, other => panic!("unsupported calling convention: {:?}", other), } } @@ -117,7 +117,7 @@ impl FunctionSig { pub fn new(return_type: ItemId, arguments: Vec<(Option, ItemId)>, is_variadic: bool, - abi: abi::Abi) + abi: Option) -> Self { FunctionSig { return_type: return_type, @@ -228,6 +228,11 @@ impl FunctionSig { let ret = Item::from_ty_or_ref(ty_ret_type, None, None, ctx); let abi = get_abi(ty.call_conv()); + if abi.is_none() { + assert_eq!(cursor.kind(), CXCursor_ObjCInstanceMethodDecl, + "Invalid ABI for function signature") + } + Ok(Self::new(ret, args, ty.is_variadic(), abi)) } @@ -242,7 +247,7 @@ impl FunctionSig { } /// Get this function signature's ABI. - pub fn abi(&self) -> abi::Abi { + pub fn abi(&self) -> Option { self.abi } From 7fd707004b03a8110c6d82e82165f9e1a8ad6985 Mon Sep 17 00:00:00 2001 From: Flier Lu Date: Thu, 2 Feb 2017 01:02:39 +0800 Subject: [PATCH 0303/2291] add padding bytes to align strcture --- src/clang.rs | 11 + src/codegen/mod.rs | 119 +- src/codegen/struct_layout.rs | 193 +++ src/ir/comp.rs | 138 ++- src/ir/enum_ty.rs | 15 + src/ir/ty.rs | 50 +- tests/expectations/tests/16-byte-alignment.rs | 64 +- tests/expectations/tests/accessors.rs | 54 +- tests/expectations/tests/annotation_hide.rs | 7 +- tests/expectations/tests/anon_enum.rs | 8 +- tests/expectations/tests/anon_enum_trait.rs | 2 +- tests/expectations/tests/anon_union.rs | 2 +- tests/expectations/tests/auto.rs | 2 +- tests/expectations/tests/base-to-derived.rs | 2 +- .../expectations/tests/bitfield-enum-basic.rs | 2 +- .../tests/bitfield_method_mangling.rs | 2 +- .../canonical_path_without_namespacing.rs | 2 +- tests/expectations/tests/class.rs | 49 +- tests/expectations/tests/class_nested.rs | 15 +- tests/expectations/tests/class_no_members.rs | 10 +- tests/expectations/tests/class_static.rs | 2 +- .../expectations/tests/class_static_const.rs | 2 +- tests/expectations/tests/class_use_as.rs | 10 +- tests/expectations/tests/class_with_dtor.rs | 5 +- .../tests/class_with_inner_struct.rs | 80 +- .../expectations/tests/class_with_typedef.rs | 20 +- tests/expectations/tests/complex.rs | 20 +- tests/expectations/tests/const_bool.rs | 2 +- .../expectations/tests/const_enum_unnamed.rs | 2 +- .../expectations/tests/constify-all-enums.rs | 5 +- tests/expectations/tests/constructor-tp.rs | 2 +- tests/expectations/tests/constructors.rs | 4 +- tests/expectations/tests/convert-floats.rs | 20 +- tests/expectations/tests/crtp.rs | 6 +- .../duplicated-namespaces-definitions.rs | 13 +- .../tests/enum_and_vtable_mangling.rs | 4 +- .../tests/forward-declaration-autoptr.rs | 5 +- .../tests/forward_declared_complex_types.rs | 7 +- .../tests/forward_declared_struct.rs | 8 +- .../expectations/tests/func_ptr_in_struct.rs | 5 +- tests/expectations/tests/inherit_typedef.rs | 4 +- tests/expectations/tests/inline_namespace.rs | 5 +- .../tests/inline_namespace_conservative.rs | 5 +- tests/expectations/tests/inner_const.rs | 5 +- .../expectations/tests/inner_template_self.rs | 5 +- tests/expectations/tests/issue-372.rs | 21 +- tests/expectations/tests/issue-410.rs | 2 +- tests/expectations/tests/issue-447.rs | 6 +- tests/expectations/tests/issue_311.rs | 6 +- .../expectations/tests/jsval_layout_opaque.rs | 56 +- tests/expectations/tests/layout.rs | 53 + tests/expectations/tests/layout_align.rs | 118 ++ tests/expectations/tests/layout_arp.rs | 116 ++ tests/expectations/tests/layout_array.rs | 206 ++++ .../tests/layout_cmdline_token.rs | 157 +++ tests/expectations/tests/layout_eth_conf.rs | 1039 +++++++++++++++++ tests/expectations/tests/layout_kni_mbuf.rs | 82 ++ tests/expectations/tests/layout_mbuf.rs | 602 ++++++++++ tests/expectations/tests/method-mangling.rs | 2 +- .../expectations/tests/module-whitelisted.rs | 2 +- tests/expectations/tests/msvc-no-usr.rs | 5 +- .../multiple-inherit-empty-correct-layout.rs | 6 +- tests/expectations/tests/mutable.rs | 20 +- tests/expectations/tests/namespace.rs | 5 +- tests/expectations/tests/nested.rs | 17 +- tests/expectations/tests/nested_vtable.rs | 6 +- .../tests/nested_within_namespace.rs | 15 +- tests/expectations/tests/no-comments.rs | 5 +- tests/expectations/tests/no-derive-debug.rs | 8 +- .../tests/no-recursive-whitelisting.rs | 5 +- tests/expectations/tests/no-std.rs | 11 +- .../expectations/tests/objc_interface_type.rs | 5 +- tests/expectations/tests/only_bitfields.rs | 2 +- tests/expectations/tests/opaque-tracing.rs | 2 +- tests/expectations/tests/opaque_in_struct.rs | 7 +- tests/expectations/tests/opaque_pointer.rs | 13 +- tests/expectations/tests/private.rs | 24 +- tests/expectations/tests/public-dtor.rs | 2 +- .../expectations/tests/ref_argument_array.rs | 2 +- .../tests/reparented_replacement.rs | 5 +- tests/expectations/tests/replace_use.rs | 5 +- ...ame_struct_name_in_different_namespaces.rs | 8 +- tests/expectations/tests/size_t_template.rs | 5 +- ...ruct_containing_forward_declared_struct.rs | 10 +- .../tests/struct_with_anon_struct.rs | 13 +- .../tests/struct_with_anon_struct_array.rs | 24 +- .../tests/struct_with_anon_struct_pointer.rs | 13 +- .../tests/struct_with_anon_union.rs | 13 +- .../tests/struct_with_anon_unnamed_struct.rs | 10 +- .../tests/struct_with_anon_unnamed_union.rs | 10 +- .../tests/struct_with_bitfields.rs | 5 +- .../tests/struct_with_derive_debug.rs | 20 +- .../expectations/tests/struct_with_nesting.rs | 36 +- .../expectations/tests/struct_with_packing.rs | 6 +- .../expectations/tests/struct_with_struct.rs | 13 +- tests/expectations/tests/template.rs | 17 +- ...type-referenced-by-whitelisted-function.rs | 5 +- .../tests/type_alias_template_specialized.rs | 5 +- tests/expectations/tests/typeref.rs | 17 +- tests/expectations/tests/union-in-ns.rs | 5 +- tests/expectations/tests/union_dtor.rs | 8 +- tests/expectations/tests/union_fields.rs | 11 +- .../tests/union_with_anon_struct.rs | 13 +- .../tests/union_with_anon_struct_bitfield.rs | 7 +- .../tests/union_with_anon_union.rs | 13 +- .../tests/union_with_anon_unnamed_struct.rs | 19 +- .../tests/union_with_anon_unnamed_union.rs | 13 +- .../tests/union_with_big_member.rs | 24 +- .../expectations/tests/union_with_nesting.rs | 27 +- tests/expectations/tests/unknown_attr.rs | 12 + tests/expectations/tests/use-core.rs | 11 +- tests/expectations/tests/var-tracing.rs | 7 +- tests/expectations/tests/variadic-method.rs | 2 +- tests/expectations/tests/vector.rs | 5 +- tests/expectations/tests/virtual_dtor.rs | 2 +- .../expectations/tests/virtual_inheritance.rs | 17 +- .../expectations/tests/virtual_overloaded.rs | 2 +- .../tests/vtable_recursive_sig.rs | 4 +- tests/expectations/tests/weird_bitfields.rs | 38 +- tests/expectations/tests/what_is_going_on.rs | 2 +- .../tests/whitelist-namespaces-basic.rs | 2 +- .../tests/whitelist-namespaces.rs | 7 +- tests/headers/layout.h | 6 + tests/headers/layout_align.h | 20 + tests/headers/layout_arp.h | 52 + tests/headers/layout_array.h | 109 ++ tests/headers/layout_cmdline_token.h | 63 + tests/headers/layout_eth_conf.h | 427 +++++++ tests/headers/layout_kni_mbuf.h | 32 + tests/headers/layout_mbuf.h | 187 +++ 130 files changed, 4720 insertions(+), 288 deletions(-) create mode 100644 src/codegen/struct_layout.rs create mode 100644 tests/expectations/tests/layout.rs create mode 100644 tests/expectations/tests/layout_align.rs create mode 100644 tests/expectations/tests/layout_arp.rs create mode 100644 tests/expectations/tests/layout_array.rs create mode 100644 tests/expectations/tests/layout_cmdline_token.rs create mode 100644 tests/expectations/tests/layout_eth_conf.rs create mode 100644 tests/expectations/tests/layout_kni_mbuf.rs create mode 100644 tests/expectations/tests/layout_mbuf.rs create mode 100644 tests/headers/layout.h create mode 100644 tests/headers/layout_align.h create mode 100644 tests/headers/layout_arp.h create mode 100644 tests/headers/layout_array.h create mode 100644 tests/headers/layout_cmdline_token.h create mode 100644 tests/headers/layout_eth_conf.h create mode 100644 tests/headers/layout_kni_mbuf.h create mode 100644 tests/headers/layout_mbuf.h diff --git a/src/clang.rs b/src/clang.rs index 4a46b694e3..ffe9d5d04d 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -499,6 +499,17 @@ impl Cursor { unsafe { clang_CXXField_isMutable(self.x) != 0 } } + /// Get the offset of the field represented by the Cursor. + pub fn offset_of_field(&self) -> Result { + let offset = unsafe { clang_Cursor_getOffsetOfField(self.x) }; + + if offset < 0 { + Err(LayoutError::from(offset as i32)) + } else { + Ok(offset as usize) + } + } + /// Is this cursor's referent a member function that is declared `static`? pub fn method_is_static(&self) -> bool { unsafe { clang_CXXMethod_isStatic(self.x) != 0 } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 3b0882afcb..f4da014ef8 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1,6 +1,8 @@ mod helpers; +mod struct_layout; use self::helpers::{BlobTyBuilder, attributes}; +use self::struct_layout::StructLayoutTracker; use aster; use ir::annotations::FieldAccessorKind; @@ -21,6 +23,7 @@ use ir::var::Var; use std::borrow::Cow; use std::cell::Cell; +use std::cmp; use std::collections::{HashSet, VecDeque}; use std::collections::hash_map::{Entry, HashMap}; use std::fmt::Write; @@ -723,9 +726,9 @@ impl<'a> Bitfield<'a> { fn codegen_fields(self, ctx: &BindgenContext, fields: &mut Vec, - methods: &mut Vec) { + methods: &mut Vec) + -> Layout { use aster::struct_field::StructFieldBuilder; - use std::cmp; let mut total_width = self.fields .iter() .fold(0u32, |acc, f| acc + f.bitfield().unwrap()); @@ -736,10 +739,9 @@ impl<'a> Bitfield<'a> { debug_assert_eq!(total_width % 8, 0); let total_width_in_bytes = total_width as usize / 8; - let bitfield_type = - BlobTyBuilder::new(Layout::new(total_width_in_bytes, - total_width_in_bytes)) - .build(); + let bitfield_layout = Layout::new(total_width_in_bytes, + total_width_in_bytes); + let bitfield_type = BlobTyBuilder::new(bitfield_layout).build(); let field_name = format!("_bitfield_{}", self.index); let field_ident = ctx.ext_cx().ident_of(&field_name); let field = StructFieldBuilder::named(&field_name) @@ -805,6 +807,8 @@ impl<'a> Bitfield<'a> { methods.extend(items.into_iter()); offset += width; } + + bitfield_layout } } @@ -940,6 +944,7 @@ impl CodeGenerator for CompInfo { // Also, we need to generate the vtable in such a way it "inherits" from // the parent too. let mut fields = vec![]; + let mut struct_layout = StructLayoutTracker::new(ctx, self); if self.needs_explicit_vtable(ctx) { let vtable = Vtable::new(item.id(), self.methods(), self.base_members()); @@ -951,6 +956,8 @@ impl CodeGenerator for CompInfo { .pub_() .build_ty(vtable_type); + struct_layout.saw_vtable(); + fields.push(vtable_field); } @@ -985,6 +992,8 @@ impl CodeGenerator for CompInfo { format!("_base_{}", i) }; + struct_layout.saw_base(base_ty); + let field = StructFieldBuilder::named(field_name) .pub_() .build_ty(inner); @@ -1039,8 +1048,12 @@ impl CodeGenerator for CompInfo { let bitfield_fields = mem::replace(&mut current_bitfield_fields, vec![]); bitfield_count += 1; - Bitfield::new(bitfield_count, bitfield_fields) + let bitfield_layout = Bitfield::new(bitfield_count, + bitfield_fields) .codegen_fields(ctx, &mut fields, &mut methods); + + struct_layout.saw_bitfield(bitfield_layout); + current_bitfield_width = None; current_bitfield_layout = None; } @@ -1100,6 +1113,11 @@ impl CodeGenerator for CompInfo { } }; + if let Some(padding_field) = + struct_layout.pad_field(&field_name, field_ty, field.offset()) { + fields.push(padding_field); + } + let is_private = field.annotations() .private_fields() .unwrap_or(fields_should_be_private); @@ -1192,8 +1210,11 @@ impl CodeGenerator for CompInfo { let bitfield_fields = mem::replace(&mut current_bitfield_fields, vec![]); bitfield_count += 1; - Bitfield::new(bitfield_count, bitfield_fields) + let bitfield_layout = Bitfield::new(bitfield_count, + bitfield_fields) .codegen_fields(ctx, &mut fields, &mut methods); + + struct_layout.saw_bitfield(bitfield_layout); } debug_assert!(current_bitfield_fields.is_empty()); @@ -1203,6 +1224,9 @@ impl CodeGenerator for CompInfo { let field = StructFieldBuilder::named("bindgen_union_field") .pub_() .build_ty(ty); + + struct_layout.saw_union(layout); + fields.push(field); } @@ -1227,6 +1251,16 @@ impl CodeGenerator for CompInfo { warn!("Opaque type without layout! Expect dragons!"); } } + } else if !is_union && !self.is_unsized(ctx) { + if let Some(padding_field) = + layout.and_then(|layout| struct_layout.pad_struct(layout)) { + fields.push(padding_field); + } + + if let Some(align_field) = + layout.and_then(|layout| struct_layout.align_struct(layout)) { + fields.push(align_field); + } } // C requires every struct to be addressable, so what C compilers do is @@ -1296,7 +1330,7 @@ impl CodeGenerator for CompInfo { canonical_name); } - if applicable_template_args.is_empty() && !self.found_unknown_attr() { + if applicable_template_args.is_empty() { for var in self.inner_vars() { ctx.resolve_item(*var) .codegen(ctx, result, whitelisted_items, &()); @@ -1313,11 +1347,57 @@ impl CodeGenerator for CompInfo { ::$prefix::mem::align_of::<$ident>()); let size = layout.size; let align = layout.align; + + let check_struct_align = if align > mem::size_of::<*mut ()>() { + // FIXME when [RFC 1358](https://github.com/rust-lang/rust/issues/33626) ready + None + } else { + quote_item!(ctx.ext_cx(), + assert_eq!($align_of_expr, $align); + ) + }; + + // FIXME when [issue #465](https://github.com/servo/rust-bindgen/issues/465) ready + let too_many_base_vtables = self.base_members() + .iter() + .filter(|base| ctx.resolve_type(base.ty).has_vtable(ctx)) + .count() > + 1; + + let should_skip_field_offset_checks = item.is_opaque(ctx) || + too_many_base_vtables; + + let check_field_offset = if should_skip_field_offset_checks { + None + } else { + let type_name = ctx.rust_ident(&canonical_name); + + let asserts = self.fields() + .iter() + .filter(|field| field.bitfield().is_none()) + .flat_map(|field| { + field.name().and_then(|name| { + field.offset().and_then(|offset| { + let field_offset = offset / 8; + let field_name = ctx.rust_ident(name); + + quote_item!(ctx.ext_cx(), + assert_eq!(unsafe { &(*(0 as *const $type_name)).$field_name as *const _ as usize }, $field_offset); + ) + }) + }) + }).collect::>>(); + + Some(asserts) + }; + let item = quote_item!(ctx.ext_cx(), #[test] fn $fn_name() { assert_eq!($size_of_expr, $size); - assert_eq!($align_of_expr, $align); + + $check_struct_align + $check_field_offset }) .unwrap(); result.push(item); @@ -2278,22 +2358,20 @@ impl CodeGenerator for ObjCInterface { // Collect the actual used argument names let arg_names: Vec<_> = fn_args.iter() - .map(|ref arg| { - match arg.pat.node { - ast::PatKind::Ident(_, ref spanning, _) => { - spanning.node.name.as_str().to_string() - } - _ => { - panic!("odd argument!"); - } + .map(|ref arg| match arg.pat.node { + ast::PatKind::Ident(_, ref spanning, _) => { + spanning.node.name.as_str().to_string() + } + _ => { + panic!("odd argument!"); } }) .collect(); let methods_and_args = ctx.rust_ident(&method.format_method_call(&arg_names)); - let body = - quote_stmt!(ctx.ext_cx(), msg_send![self, $methods_and_args]) + let body = quote_stmt!(ctx.ext_cx(), + msg_send![self, $methods_and_args]) .unwrap(); let block = ast::Block { stmts: vec![body], @@ -2729,5 +2807,4 @@ mod utils { } }).collect::>() } - } diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs new file mode 100644 index 0000000000..3006a31ab3 --- /dev/null +++ b/src/codegen/struct_layout.rs @@ -0,0 +1,193 @@ +//! Helpers for code generation that need struct layout + +use super::helpers::BlobTyBuilder; + +use aster::struct_field::StructFieldBuilder; + +use ir::comp::CompInfo; +use ir::context::BindgenContext; +use ir::layout::Layout; +use ir::ty::Type; +use std::cmp; +use std::mem; + +use syntax::ast; + +/// Trace the layout of struct. +pub struct StructLayoutTracker<'a, 'ctx: 'a> { + ctx: &'a BindgenContext<'ctx>, + comp: &'a CompInfo, + latest_offset: usize, + padding_count: usize, + latest_field_layout: Option, + max_field_align: usize, +} + +impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { + pub fn new(ctx: &'a BindgenContext<'ctx>, comp: &'a CompInfo) -> Self { + StructLayoutTracker { + ctx: ctx, + comp: comp, + latest_offset: 0, + padding_count: 0, + latest_field_layout: None, + max_field_align: 0, + } + } + + pub fn saw_vtable(&mut self) { + let ptr_size = mem::size_of::<*mut ()>(); + self.latest_offset += ptr_size; + self.latest_field_layout = Some(Layout::new(ptr_size, ptr_size)); + self.max_field_align = ptr_size; + } + + pub fn saw_base(&mut self, base_ty: &Type) { + self.align_to_latest_field(); + + if let Some(layout) = base_ty.layout(self.ctx) { + self.latest_offset += self.padding_bytes(layout) + layout.size; + self.latest_field_layout = Some(layout); + self.max_field_align = cmp::max(self.max_field_align, layout.align); + } + } + + pub fn saw_bitfield(&mut self, layout: Layout) { + self.align_to_latest_field(); + + self.latest_offset += self.padding_bytes(layout) + layout.size; + self.latest_field_layout = Some(layout); + self.max_field_align = cmp::max(self.max_field_align, layout.align); + } + + pub fn saw_union(&mut self, layout: Layout) { + self.align_to_latest_field(); + + self.latest_offset += self.padding_bytes(layout) + layout.size; + self.latest_field_layout = Some(layout); + self.max_field_align = cmp::max(self.max_field_align, layout.align); + } + + pub fn pad_field(&mut self, + field_name: &str, + field_ty: &Type, + field_offset: Option) + -> Option { + field_ty.layout(self.ctx).and_then(|field_layout| { + self.align_to_latest_field(); + + let padding_layout = if self.comp.packed() { + None + } else { + let calculated_layout = field_ty.as_comp() + .and_then(|comp| comp.calc_layout(self.ctx)) + .unwrap_or(field_layout); + + let align = cmp::min(calculated_layout.align, mem::size_of::<*mut ()>()); + + let (padding_bytes, need_padding) = match field_offset { + Some(offset) if offset / 8 > self.latest_offset => { + (offset / 8 - self.latest_offset, true) + } + _ => { + (self.padding_bytes(field_layout), (self.latest_offset % field_layout.align) != 0) + } + }; + + self.latest_offset += padding_bytes; + + debug!("align field {} to {}/{} with {} padding bytes {:?}, calculated {:?}", + field_name, + self.latest_offset, + field_offset.unwrap_or(0) / 8, + padding_bytes, + field_layout, + calculated_layout); + + if need_padding && + (padding_bytes > calculated_layout.align || + field_layout.align > mem::size_of::<*mut ()>()) { + Some(Layout::new(padding_bytes, align)) + } else { + None + } + }; + + self.latest_offset += field_ty.calc_size(self.ctx).unwrap_or(field_layout.size); + + self.latest_field_layout = Some(field_layout); + self.max_field_align = cmp::max(self.max_field_align, field_layout.align); + + padding_layout.map(|layout| self.padding_field(layout)) + }) + } + + pub fn pad_struct(&mut self, layout: Layout) -> Option { + if layout.size < self.latest_offset { + warn!("calculate struct layout incorrect, too more {} bytes", + self.latest_offset - layout.size); + + None + } else { + let padding_bytes = layout.size - self.latest_offset; + let struct_align = cmp::min(layout.align, + mem::size_of::<*mut ()>()); + + if padding_bytes > struct_align || + (layout.align > mem::size_of::<*mut ()>() && padding_bytes > 0) { + let padding_align = if self.comp.packed() { + 1 + } else { + cmp::min(1 << padding_bytes.trailing_zeros(), + mem::size_of::<*mut ()>()) + }; + + Some(self.padding_field(Layout::new(padding_bytes, padding_align))) + } else { + None + } + } + } + + pub fn align_struct(&self, layout: Layout) -> Option { + if self.max_field_align < layout.align && + layout.align <= mem::size_of::<*mut ()>() { + let ty = BlobTyBuilder::new(Layout::new(0, layout.align)).build(); + + Some(StructFieldBuilder::named("__bindgen_align") + .pub_() + .build_ty(ty)) + } else { + None + } + } + + fn padding_bytes(&self, layout: Layout) -> usize { + if self.latest_offset % layout.align == 0 { + 0 + } else { + layout.align - (self.latest_offset % layout.align) + } + } + + fn padding_field(&mut self, layout: Layout) -> ast::StructField { + let ty = BlobTyBuilder::new(layout).build(); + let padding_count = self.padding_count; + + self.padding_count += 1; + + let padding_field_name = format!("__bindgen_padding_{}", padding_count); + + self.max_field_align = cmp::max(self.max_field_align, layout.align); + + StructFieldBuilder::named(padding_field_name).pub_().build_ty(ty) + } + + fn align_to_latest_field(&mut self) { + if self.comp.packed() { + // skip to align field when packed + } else if let Some(layout) = self.latest_field_layout { + self.latest_offset += self.padding_bytes(layout); + } + } +} diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 34bd7a541c..53efd278bf 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -102,6 +102,8 @@ pub struct Field { bitfield: Option, /// If the C++ field is marked as `mutable` mutable: bool, + /// The offset of the field (in bits) + offset: Option, } impl Field { @@ -111,7 +113,8 @@ impl Field { comment: Option, annotations: Option, bitfield: Option, - mutable: bool) + mutable: bool, + offset: Option) -> Field { Field { name: name, @@ -120,6 +123,7 @@ impl Field { annotations: annotations.unwrap_or_default(), bitfield: bitfield, mutable: mutable, + offset: offset, } } @@ -152,6 +156,11 @@ impl Field { pub fn annotations(&self) -> &Annotations { &self.annotations } + + /// The offset of the field (in bits) + pub fn offset(&self) -> Option { + self.offset + } } impl CanDeriveDebug for Field { @@ -390,26 +399,73 @@ impl CompInfo { /// members. This is not ideal, but clang fails to report the size for these /// kind of unions, see test/headers/template_union.hpp pub fn layout(&self, ctx: &BindgenContext) -> Option { - use std::cmp; - // We can't do better than clang here, sorry. if self.kind == CompKind::Struct { - return None; + None + } else { + self.calc_layout(ctx) } + } + + /// Compute the layout of this type. + pub fn calc_layout(&self, ctx: &BindgenContext) -> Option { + use std::cmp; + use std::mem; - let mut max_size = 0; - let mut max_align = 0; - for field in &self.fields { - let field_layout = ctx.resolve_type(field.ty) - .layout(ctx); + if self.kind == CompKind::Struct { + let mut latest_offset_in_bits = 0; + let mut max_align = 0; - if let Some(layout) = field_layout { - max_size = cmp::max(max_size, layout.size); - max_align = cmp::max(max_align, layout.align); + if self.needs_explicit_vtable(ctx) { + latest_offset_in_bits += mem::size_of::<*mut ()>() * 8; + max_align = mem::size_of::<*mut ()>(); } - } - Some(Layout::new(max_size, max_align)) + for field in &self.fields { + if let Some(bits) = field.bitfield() { + latest_offset_in_bits += bits as usize; + } else { + let field_ty = ctx.resolve_type(field.ty); + + if let Some(field_layout) = + field_ty.as_comp() + .and_then(|comp| comp.calc_layout(ctx)) + .or_else(|| field_ty.layout(ctx)) { + + let n = (latest_offset_in_bits / 8) % + field_layout.align; + + if !self.packed && n != 0 { + latest_offset_in_bits += (field_layout.align - n) * + 8; + } + + latest_offset_in_bits += field_layout.size * 8; + max_align = cmp::max(max_align, field_layout.align); + } + } + } + + if latest_offset_in_bits == 0 && max_align == 0 { + None + } else { + Some(Layout::new((latest_offset_in_bits + 7) / 8, max_align)) + } + } else { + let mut max_size = 0; + let mut max_align = 0; + for field in &self.fields { + let field_layout = ctx.resolve_type(field.ty) + .layout(ctx); + + if let Some(layout) = field_layout { + max_size = cmp::max(max_size, layout.size); + max_align = cmp::max(max_align, layout.align); + } + } + + Some(Layout::new(max_size, max_align)) + } } /// Get this type's set of fields. @@ -529,35 +585,35 @@ impl CompInfo { let mut maybe_anonymous_struct_field = None; cursor.visit(|cur| { if cur.kind() != CXCursor_FieldDecl { - if let Some((ty, _)) = maybe_anonymous_struct_field { - let field = Field::new(None, ty, None, None, None, false); + if let Some((ty, _, offset)) = + maybe_anonymous_struct_field.take() { + let field = + Field::new(None, ty, None, None, None, false, offset); ci.fields.push(field); } - maybe_anonymous_struct_field = None; } match cur.kind() { CXCursor_FieldDecl => { - match maybe_anonymous_struct_field.take() { - Some((ty, clang_ty)) => { - let mut used = false; - cur.visit(|child| { - if child.cur_type() == clang_ty { - used = true; - } - CXChildVisit_Continue - }); - if !used { - let field = Field::new(None, - ty, - None, - None, - None, - false); - ci.fields.push(field); + if let Some((ty, clang_ty, offset)) = + maybe_anonymous_struct_field.take() { + let mut used = false; + cur.visit(|child| { + if child.cur_type() == clang_ty { + used = true; } + CXChildVisit_Continue + }); + if !used { + let field = Field::new(None, + ty, + None, + None, + None, + false, + offset); + ci.fields.push(field); } - None => {} } let bit_width = cur.bit_width(); @@ -570,6 +626,7 @@ impl CompInfo { let annotations = Annotations::new(&cur); let name = cur.spelling(); let is_mutable = cursor.is_mutable_field(); + let offset = cur.offset_of_field().ok(); // Name can be empty if there are bitfields, for example, // see tests/headers/struct_with_bitfields.h @@ -583,7 +640,8 @@ impl CompInfo { comment, annotations, bit_width, - is_mutable); + is_mutable, + offset); ci.fields.push(field); // No we look for things like attributes and stuff. @@ -615,7 +673,9 @@ impl CompInfo { if cur.spelling().is_empty() && cur.kind() != CXCursor_EnumDecl { let ty = cur.cur_type(); - maybe_anonymous_struct_field = Some((inner, ty)); + let offset = cur.offset_of_field().ok(); + maybe_anonymous_struct_field = + Some((inner, ty, offset)); } } CXCursor_PackedAttr => { @@ -748,8 +808,8 @@ impl CompInfo { CXChildVisit_Continue }); - if let Some((ty, _)) = maybe_anonymous_struct_field { - let field = Field::new(None, ty, None, None, None, false); + if let Some((ty, _, offset)) = maybe_anonymous_struct_field { + let field = Field::new(None, ty, None, None, None, false, offset); ci.fields.push(field); } diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index 8ea7a8dcbc..0a85577eea 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -5,6 +5,8 @@ use super::item::Item; use super::ty::TypeKind; use clang; use ir::annotations::Annotations; +use ir::int::IntKind; +use ir::layout::Layout; use parse::{ClangItemParser, ParseError}; /// An enum representing custom handling that can be given to a variant. @@ -49,6 +51,19 @@ impl Enum { &self.variants } + /// Compute the layout of this type. + pub fn calc_layout(&self, ctx: &BindgenContext) -> Option { + self.repr + .map(|repr| ctx.resolve_type(repr)) + .and_then(|repr| match *repr.canonical_type(ctx).kind() { + TypeKind::Int(int_kind) => Some(int_kind), + _ => None, + }) + .unwrap_or(IntKind::Int) + .known_size() + .map(|size| Layout::new(size, size)) + } + /// Construct an enumeration from the given Clang type. pub fn from_ty(ty: &clang::Type, ctx: &mut BindgenContext) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index f0a8c54540..5903430c91 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -12,6 +12,7 @@ use super::objc::ObjCInterface; use super::type_collector::{ItemSet, TypeCollector}; use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; +use std::mem; /// The base representation of a type in bindgen. /// @@ -356,6 +357,40 @@ impl Type { _ => false, } } + + /// If this type has a known size, return it (in bytes). + pub fn calc_size(&self, ctx: &BindgenContext) -> Option { + match self.kind { + TypeKind::Comp(ref ci) => { + ci.calc_layout(ctx).map(|layout| layout.size) + } + TypeKind::Enum(ref enum_ty) => { + enum_ty.calc_layout(ctx).map(|layout| layout.size) + } + TypeKind::Int(int_kind) => int_kind.known_size(), + TypeKind::Float(float_kind) => Some(float_kind.known_size()), + TypeKind::Complex(float_kind) => Some(float_kind.known_size() * 2), + TypeKind::Reference(..) | + TypeKind::NullPtr | + TypeKind::Pointer(..) | + TypeKind::BlockPointer | + TypeKind::Function(..) | + TypeKind::ObjCInterface(..) => Some(mem::size_of::<*mut ()>()), + TypeKind::ResolvedTypeRef(inner) | + TypeKind::Alias(inner) | + TypeKind::TemplateAlias(inner, _) | + TypeKind::TemplateRef(inner, _) => { + ctx.resolve_type(inner).calc_size(ctx) + } + TypeKind::Array(inner, len) => { + ctx.resolve_type(inner) + .layout(ctx) + .map(|layout| layout.size * len) + } + TypeKind::Void | TypeKind::Named => None, + TypeKind::UnresolvedTypeRef(..) => unreachable!(), + } + } } impl CanDeriveDebug for Type { @@ -425,6 +460,17 @@ pub enum FloatKind { Float128, } +impl FloatKind { + /// If this type has a known size, return it (in bytes). + pub fn known_size(&self) -> usize { + match *self { + FloatKind::Float => mem::size_of::(), + FloatKind::Double | FloatKind::LongDouble => mem::size_of::(), + FloatKind::Float128 => mem::size_of::() * 2, + } + } +} + /// The different kinds of types that we can parse. #[derive(Debug)] pub enum TypeKind { @@ -623,7 +669,9 @@ impl Type { // assume this is a Comp(..) } else if ty.is_fully_specialized_template() { debug!("Template specialization: {:?}, {:?} {:?}", - ty, location, canonical_ty); + ty, + location, + canonical_ty); let complex = CompInfo::from_ty(potential_id, ty, location, ctx) .expect("C'mon"); diff --git a/tests/expectations/tests/16-byte-alignment.rs b/tests/expectations/tests/16-byte-alignment.rs index b28c0537e6..9894a37a38 100644 --- a/tests/expectations/tests/16-byte-alignment.rs +++ b/tests/expectations/tests/16-byte-alignment.rs @@ -52,8 +52,16 @@ pub struct rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 { fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() - , 2usize); + assert_eq! (::std::mem::align_of::() + , 2usize); + assert_eq! (unsafe { + & ( + * ( 0 as * const rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 ) + ) . dport as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( + * ( 0 as * const rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 ) + ) . sport as * const _ as usize } , 2usize); } impl Clone for rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -62,8 +70,11 @@ impl Clone for rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 { fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , - 4usize); + assert_eq! (::std::mem::align_of::() , + 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ipv4_tuple__bindgen_ty_1 ) ) . + sctp_tag as * const _ as usize } , 0usize); } impl Clone for rte_ipv4_tuple__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -71,7 +82,13 @@ impl Clone for rte_ipv4_tuple__bindgen_ty_1 { #[test] fn bindgen_test_layout_rte_ipv4_tuple() { assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ipv4_tuple ) ) . src_addr as * const + _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ipv4_tuple ) ) . dst_addr as * const + _ as usize } , 4usize); } impl Clone for rte_ipv4_tuple { fn clone(&self) -> Self { *self } @@ -100,8 +117,16 @@ pub struct rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 { fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() - , 2usize); + assert_eq! (::std::mem::align_of::() + , 2usize); + assert_eq! (unsafe { + & ( + * ( 0 as * const rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 ) + ) . dport as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( + * ( 0 as * const rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 ) + ) . sport as * const _ as usize } , 2usize); } impl Clone for rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -110,8 +135,11 @@ impl Clone for rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 { fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , - 4usize); + assert_eq! (::std::mem::align_of::() , + 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ipv6_tuple__bindgen_ty_1 ) ) . + sctp_tag as * const _ as usize } , 0usize); } impl Clone for rte_ipv6_tuple__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -119,7 +147,13 @@ impl Clone for rte_ipv6_tuple__bindgen_ty_1 { #[test] fn bindgen_test_layout_rte_ipv6_tuple() { assert_eq!(::std::mem::size_of::() , 36usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ipv6_tuple ) ) . src_addr as * const + _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ipv6_tuple ) ) . dst_addr as * const + _ as usize } , 16usize); } impl Clone for rte_ipv6_tuple { fn clone(&self) -> Self { *self } @@ -131,6 +165,16 @@ pub struct rte_thash_tuple { pub v6: __BindgenUnionField, pub bindgen_union_field: [u8; 48usize], } +#[test] +fn bindgen_test_layout_rte_thash_tuple() { + assert_eq!(::std::mem::size_of::() , 48usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_thash_tuple ) ) . v4 as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_thash_tuple ) ) . v6 as * const _ as + usize } , 0usize); +} impl Clone for rte_thash_tuple { fn clone(&self) -> Self { *self } } diff --git a/tests/expectations/tests/accessors.rs b/tests/expectations/tests/accessors.rs index b721980c4c..435b811947 100644 --- a/tests/expectations/tests/accessors.rs +++ b/tests/expectations/tests/accessors.rs @@ -18,7 +18,19 @@ pub struct SomeAccessors { #[test] fn bindgen_test_layout_SomeAccessors() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const SomeAccessors ) ) . mNoAccessor as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const SomeAccessors ) ) . mBothAccessors as * + const _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const SomeAccessors ) ) . mUnsafeAccessors as * + const _ as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const SomeAccessors ) ) . mImmutableAccessor as + * const _ as usize } , 12usize); } impl Clone for SomeAccessors { fn clone(&self) -> Self { *self } @@ -56,7 +68,13 @@ pub struct AllAccessors { #[test] fn bindgen_test_layout_AllAccessors() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const AllAccessors ) ) . mBothAccessors as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const AllAccessors ) ) . mAlsoBothAccessors as + * const _ as usize } , 4usize); } impl Clone for AllAccessors { fn clone(&self) -> Self { *self } @@ -90,7 +108,13 @@ pub struct AllUnsafeAccessors { #[test] fn bindgen_test_layout_AllUnsafeAccessors() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const AllUnsafeAccessors ) ) . mBothAccessors + as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const AllUnsafeAccessors ) ) . + mAlsoBothAccessors as * const _ as usize } , 4usize); } impl Clone for AllUnsafeAccessors { fn clone(&self) -> Self { *self } @@ -130,7 +154,19 @@ pub struct ContradictAccessors { #[test] fn bindgen_test_layout_ContradictAccessors() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const ContradictAccessors ) ) . mBothAccessors + as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const ContradictAccessors ) ) . mNoAccessors as + * const _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const ContradictAccessors ) ) . + mUnsafeAccessors as * const _ as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const ContradictAccessors ) ) . + mImmutableAccessor as * const _ as usize } , 12usize); } impl Clone for ContradictAccessors { fn clone(&self) -> Self { *self } @@ -167,7 +203,10 @@ pub struct Replaced { #[test] fn bindgen_test_layout_Replaced() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Replaced ) ) . mAccessor as * const _ as + usize } , 0usize); } impl Clone for Replaced { fn clone(&self) -> Self { *self } @@ -189,7 +228,10 @@ pub struct Wrapper { #[test] fn bindgen_test_layout_Wrapper() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Wrapper ) ) . mReplaced as * const _ as + usize } , 0usize); } impl Clone for Wrapper { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/annotation_hide.rs b/tests/expectations/tests/annotation_hide.rs index dcaf7997b6..31097b6f9d 100644 --- a/tests/expectations/tests/annotation_hide.rs +++ b/tests/expectations/tests/annotation_hide.rs @@ -15,7 +15,7 @@ pub struct D { #[test] fn bindgen_test_layout_D() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); } impl Clone for D { fn clone(&self) -> Self { *self } @@ -28,7 +28,10 @@ pub struct NotAnnotated { #[test] fn bindgen_test_layout_NotAnnotated() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const NotAnnotated ) ) . f as * const _ as + usize } , 0usize); } impl Clone for NotAnnotated { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/anon_enum.rs b/tests/expectations/tests/anon_enum.rs index 3b05eab842..7130ac0c04 100644 --- a/tests/expectations/tests/anon_enum.rs +++ b/tests/expectations/tests/anon_enum.rs @@ -17,7 +17,13 @@ pub enum Test__bindgen_ty_1 { T_NONE = 0, } #[test] fn bindgen_test_layout_Test() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . foo as * const _ as usize } , + 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . bar as * const _ as usize } , + 4usize); } impl Clone for Test { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/anon_enum_trait.rs b/tests/expectations/tests/anon_enum_trait.rs index 8198bc15ce..264b4c4674 100644 --- a/tests/expectations/tests/anon_enum_trait.rs +++ b/tests/expectations/tests/anon_enum_trait.rs @@ -40,7 +40,7 @@ pub enum Foo__bindgen_ty_1 { Bar = 0, } #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/anon_union.rs b/tests/expectations/tests/anon_union.rs index f8559ca920..758150e465 100644 --- a/tests/expectations/tests/anon_union.rs +++ b/tests/expectations/tests/anon_union.rs @@ -70,7 +70,7 @@ pub struct ErrorResult { #[test] fn bindgen_test_layout_ErrorResult() { assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); } impl Clone for ErrorResult { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/auto.rs b/tests/expectations/tests/auto.rs index 6224e8073b..d7f96e77b3 100644 --- a/tests/expectations/tests/auto.rs +++ b/tests/expectations/tests/auto.rs @@ -13,7 +13,7 @@ pub const Foo_kFoo: bool = true; #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/base-to-derived.rs b/tests/expectations/tests/base-to-derived.rs index c2af2c4380..e8eb374541 100644 --- a/tests/expectations/tests/base-to-derived.rs +++ b/tests/expectations/tests/base-to-derived.rs @@ -12,7 +12,7 @@ pub struct false_type { #[test] fn bindgen_test_layout_false_type() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for false_type { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/bitfield-enum-basic.rs b/tests/expectations/tests/bitfield-enum-basic.rs index 7674af8bb1..45adee0fad 100644 --- a/tests/expectations/tests/bitfield-enum-basic.rs +++ b/tests/expectations/tests/bitfield-enum-basic.rs @@ -70,7 +70,7 @@ pub struct Dummy__bindgen_ty_1(pub ::std::os::raw::c_uint); #[test] fn bindgen_test_layout_Dummy() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Dummy { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/bitfield_method_mangling.rs b/tests/expectations/tests/bitfield_method_mangling.rs index 5aba8abb08..b9165121c7 100644 --- a/tests/expectations/tests/bitfield_method_mangling.rs +++ b/tests/expectations/tests/bitfield_method_mangling.rs @@ -12,7 +12,7 @@ pub struct _bindgen_ty_1 { #[test] fn bindgen_test_layout__bindgen_ty_1() { assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize); - assert_eq!(::std::mem::align_of::<_bindgen_ty_1>() , 4usize); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize); } impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/canonical_path_without_namespacing.rs b/tests/expectations/tests/canonical_path_without_namespacing.rs index 0b1f561c74..c175c471c6 100644 --- a/tests/expectations/tests/canonical_path_without_namespacing.rs +++ b/tests/expectations/tests/canonical_path_without_namespacing.rs @@ -12,7 +12,7 @@ pub struct Bar { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index e55a9fe357..a1426347e7 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -68,7 +68,12 @@ pub struct C { #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 40usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . a as * const _ as usize + } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C ) ) . big_array as * const _ as usize } + , 4usize); } #[repr(C)] pub struct C_with_zero_length_array { @@ -79,7 +84,16 @@ pub struct C_with_zero_length_array { #[test] fn bindgen_test_layout_C_with_zero_length_array() { assert_eq!(::std::mem::size_of::() , 40usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C_with_zero_length_array ) ) . a as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C_with_zero_length_array ) ) . big_array + as * const _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C_with_zero_length_array ) ) . + zero_length_array as * const _ as usize } , 37usize); } #[repr(C)] pub struct C_with_incomplete_array { @@ -90,7 +104,7 @@ pub struct C_with_incomplete_array { #[test] fn bindgen_test_layout_C_with_incomplete_array() { assert_eq!(::std::mem::size_of::() , 40usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); } #[repr(C)] pub struct C_with_zero_length_array_and_incomplete_array { @@ -103,8 +117,8 @@ pub struct C_with_zero_length_array_and_incomplete_array { fn bindgen_test_layout_C_with_zero_length_array_and_incomplete_array() { assert_eq!(::std::mem::size_of::() , 40usize); - assert_eq!(::std::mem::align_of::() - , 4usize); + assert_eq! (::std::mem::align_of::() + , 4usize); } #[repr(C)] #[derive(Debug)] @@ -114,7 +128,10 @@ pub struct WithDtor { #[test] fn bindgen_test_layout_WithDtor() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithDtor ) ) . b as * const _ as usize } + , 0usize); } #[repr(C)] pub struct IncompleteArrayNonCopiable { @@ -124,7 +141,8 @@ pub struct IncompleteArrayNonCopiable { #[test] fn bindgen_test_layout_IncompleteArrayNonCopiable() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , + 8usize); } #[repr(C)] #[derive(Debug, Copy)] @@ -136,7 +154,13 @@ pub struct Union { #[test] fn bindgen_test_layout_Union() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Union ) ) . d as * const _ as usize } , + 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Union ) ) . i as * const _ as usize } , + 0usize); } impl Clone for Union { fn clone(&self) -> Self { *self } @@ -149,7 +173,10 @@ pub struct WithUnion { #[test] fn bindgen_test_layout_WithUnion() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithUnion ) ) . data as * const _ as + usize } , 0usize); } impl Clone for WithUnion { fn clone(&self) -> Self { *self } @@ -163,8 +190,8 @@ pub struct RealAbstractionWithTonsOfMethods { fn bindgen_test_layout_RealAbstractionWithTonsOfMethods() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , - 1usize); + assert_eq! (::std::mem::align_of::() , + 1usize); } extern "C" { #[link_name = "_ZNK32RealAbstractionWithTonsOfMethods3barEv"] diff --git a/tests/expectations/tests/class_nested.rs b/tests/expectations/tests/class_nested.rs index 593e156d36..4df281988a 100644 --- a/tests/expectations/tests/class_nested.rs +++ b/tests/expectations/tests/class_nested.rs @@ -17,7 +17,10 @@ pub struct A_B { #[test] fn bindgen_test_layout_A_B() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const A_B ) ) . member_b as * const _ as usize + } , 0usize); } impl Clone for A_B { fn clone(&self) -> Self { *self } @@ -25,7 +28,10 @@ impl Clone for A_B { #[test] fn bindgen_test_layout_A() { assert_eq!(::std::mem::size_of::
() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const A ) ) . member_a as * const _ as usize } + , 0usize); } impl Clone for A { fn clone(&self) -> Self { *self } @@ -42,7 +48,10 @@ pub struct D { #[test] fn bindgen_test_layout_D() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const D ) ) . member as * const _ as usize } , + 0usize); } impl Clone for D { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_no_members.rs b/tests/expectations/tests/class_no_members.rs index 017f7c2266..1e3ace3b85 100644 --- a/tests/expectations/tests/class_no_members.rs +++ b/tests/expectations/tests/class_no_members.rs @@ -12,7 +12,7 @@ pub struct whatever { #[test] fn bindgen_test_layout_whatever() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for whatever { fn clone(&self) -> Self { *self } @@ -25,7 +25,7 @@ pub struct whatever_child { #[test] fn bindgen_test_layout_whatever_child() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for whatever_child { fn clone(&self) -> Self { *self } @@ -38,7 +38,11 @@ pub struct whatever_child_with_member { #[test] fn bindgen_test_layout_whatever_child_with_member() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , + 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const whatever_child_with_member ) ) . m_member + as * const _ as usize } , 0usize); } impl Clone for whatever_child_with_member { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_static.rs b/tests/expectations/tests/class_static.rs index 8108be2da3..7730d279c9 100644 --- a/tests/expectations/tests/class_static.rs +++ b/tests/expectations/tests/class_static.rs @@ -21,7 +21,7 @@ extern "C" { #[test] fn bindgen_test_layout_MyClass() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for MyClass { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_static_const.rs b/tests/expectations/tests/class_static_const.rs index eed6590cc8..0723325d14 100644 --- a/tests/expectations/tests/class_static_const.rs +++ b/tests/expectations/tests/class_static_const.rs @@ -15,7 +15,7 @@ pub const A_c: u32 = 255; #[test] fn bindgen_test_layout_A() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for A { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_use_as.rs b/tests/expectations/tests/class_use_as.rs index c3843b31ee..6861815542 100644 --- a/tests/expectations/tests/class_use_as.rs +++ b/tests/expectations/tests/class_use_as.rs @@ -15,7 +15,10 @@ pub struct whatever { #[test] fn bindgen_test_layout_whatever() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const whatever ) ) . replacement as * const _ + as usize } , 0usize); } impl Clone for whatever { fn clone(&self) -> Self { *self } @@ -28,7 +31,10 @@ pub struct container { #[test] fn bindgen_test_layout_container() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const container ) ) . c as * const _ as usize } + , 0usize); } impl Clone for container { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_with_dtor.rs b/tests/expectations/tests/class_with_dtor.rs index 8fa0951f8f..e3bed7b11e 100644 --- a/tests/expectations/tests/class_with_dtor.rs +++ b/tests/expectations/tests/class_with_dtor.rs @@ -18,7 +18,10 @@ pub struct WithoutDtor { #[test] fn bindgen_test_layout_WithoutDtor() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithoutDtor ) ) . shouldBeWithDtor as * + const _ as usize } , 0usize); } #[test] fn __bindgen_test_layout_template_1() { diff --git a/tests/expectations/tests/class_with_inner_struct.rs b/tests/expectations/tests/class_with_inner_struct.rs index a1bacbdb78..8c800e2912 100644 --- a/tests/expectations/tests/class_with_inner_struct.rs +++ b/tests/expectations/tests/class_with_inner_struct.rs @@ -44,7 +44,13 @@ pub struct A_Segment { #[test] fn bindgen_test_layout_A_Segment() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const A_Segment ) ) . begin as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const A_Segment ) ) . end as * const _ as usize + } , 4usize); } impl Clone for A_Segment { fn clone(&self) -> Self { *self } @@ -58,7 +64,10 @@ pub struct A__bindgen_ty_1 { #[test] fn bindgen_test_layout_A__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const A__bindgen_ty_1 ) ) . f as * const _ as + usize } , 0usize); } impl Clone for A__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -72,7 +81,10 @@ pub struct A__bindgen_ty_2 { #[test] fn bindgen_test_layout_A__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const A__bindgen_ty_2 ) ) . d as * const _ as + usize } , 0usize); } impl Clone for A__bindgen_ty_2 { fn clone(&self) -> Self { *self } @@ -80,7 +92,12 @@ impl Clone for A__bindgen_ty_2 { #[test] fn bindgen_test_layout_A() { assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { & ( * ( 0 as * const A ) ) . c as * const _ as usize + } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const A ) ) . named_union as * const _ as usize + } , 4usize); } impl Clone for A { fn clone(&self) -> Self { *self } @@ -99,7 +116,13 @@ pub struct B_Segment { #[test] fn bindgen_test_layout_B_Segment() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const B_Segment ) ) . begin as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const B_Segment ) ) . end as * const _ as usize + } , 4usize); } impl Clone for B_Segment { fn clone(&self) -> Self { *self } @@ -107,7 +130,9 @@ impl Clone for B_Segment { #[test] fn bindgen_test_layout_B() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { & ( * ( 0 as * const B ) ) . d as * const _ as usize + } , 0usize); } impl Clone for B { fn clone(&self) -> Self { *self } @@ -145,8 +170,20 @@ pub struct C__bindgen_ty_1__bindgen_ty_1 { fn bindgen_test_layout_C__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , - 4usize); + assert_eq! (::std::mem::align_of::() , + 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_1 ) ) . mX1 + as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_1 ) ) . mY1 + as * const _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_1 ) ) . mX2 + as * const _ as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_1 ) ) . mY2 + as * const _ as usize } , 12usize); } impl Clone for C__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -161,8 +198,14 @@ pub struct C__bindgen_ty_1__bindgen_ty_2 { fn bindgen_test_layout_C__bindgen_ty_1__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , - 4usize); + assert_eq! (::std::mem::align_of::() , + 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_2 ) ) . + mStepSyntax as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_2 ) ) . + mSteps as * const _ as usize } , 4usize); } impl Clone for C__bindgen_ty_1__bindgen_ty_2 { fn clone(&self) -> Self { *self } @@ -170,7 +213,10 @@ impl Clone for C__bindgen_ty_1__bindgen_ty_2 { #[test] fn bindgen_test_layout_C__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C__bindgen_ty_1 ) ) . mFunc as * const _ + as usize } , 0usize); } impl Clone for C__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -184,7 +230,13 @@ pub struct C_Segment { #[test] fn bindgen_test_layout_C_Segment() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C_Segment ) ) . begin as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C_Segment ) ) . end as * const _ as usize + } , 4usize); } impl Clone for C_Segment { fn clone(&self) -> Self { *self } @@ -192,7 +244,9 @@ impl Clone for C_Segment { #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 20usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . d as * const _ as usize + } , 0usize); } impl Clone for C { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_with_typedef.rs b/tests/expectations/tests/class_with_typedef.rs index bc19f2bd0d..2a7da809ff 100644 --- a/tests/expectations/tests/class_with_typedef.rs +++ b/tests/expectations/tests/class_with_typedef.rs @@ -19,7 +19,20 @@ pub type C_Lookup = *const ::std::os::raw::c_char; #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 72usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . c as * const _ as usize + } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C ) ) . ptr as * const _ as usize } , + 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C ) ) . arr as * const _ as usize } , + 16usize); + assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . d as * const _ as usize + } , 56usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C ) ) . other_ptr as * const _ as usize } + , 64usize); } extern "C" { #[link_name = "_ZN1C6methodEi"] @@ -65,7 +78,10 @@ pub struct D { #[test] fn bindgen_test_layout_D() { assert_eq!(::std::mem::size_of::() , 80usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const D ) ) . ptr as * const _ as usize } , + 72usize); } impl Clone for D { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/complex.rs b/tests/expectations/tests/complex.rs index f2a97952bf..3f85616aed 100644 --- a/tests/expectations/tests/complex.rs +++ b/tests/expectations/tests/complex.rs @@ -18,7 +18,10 @@ pub struct TestDouble { #[test] fn bindgen_test_layout_TestDouble() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const TestDouble ) ) . mMember as * const _ as + usize } , 0usize); } impl Clone for TestDouble { fn clone(&self) -> Self { *self } @@ -31,7 +34,10 @@ pub struct TestDoublePtr { #[test] fn bindgen_test_layout_TestDoublePtr() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const TestDoublePtr ) ) . mMember as * const _ + as usize } , 0usize); } impl Clone for TestDoublePtr { fn clone(&self) -> Self { *self } @@ -44,7 +50,10 @@ pub struct TestFloat { #[test] fn bindgen_test_layout_TestFloat() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const TestFloat ) ) . mMember as * const _ as + usize } , 0usize); } impl Clone for TestFloat { fn clone(&self) -> Self { *self } @@ -57,7 +66,10 @@ pub struct TestFloatPtr { #[test] fn bindgen_test_layout_TestFloatPtr() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const TestFloatPtr ) ) . mMember as * const _ + as usize } , 0usize); } impl Clone for TestFloatPtr { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/const_bool.rs b/tests/expectations/tests/const_bool.rs index 8a50a0944e..8a56811333 100644 --- a/tests/expectations/tests/const_bool.rs +++ b/tests/expectations/tests/const_bool.rs @@ -14,7 +14,7 @@ pub const A_k: bool = false; #[test] fn bindgen_test_layout_A() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for A { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/const_enum_unnamed.rs b/tests/expectations/tests/const_enum_unnamed.rs index 0bd3987a3b..9d586dee42 100644 --- a/tests/expectations/tests/const_enum_unnamed.rs +++ b/tests/expectations/tests/const_enum_unnamed.rs @@ -21,7 +21,7 @@ pub enum Foo__bindgen_ty_1 { FOO_BAR = 10, } #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/constify-all-enums.rs b/tests/expectations/tests/constify-all-enums.rs index a676bb1019..e5b23a68af 100644 --- a/tests/expectations/tests/constify-all-enums.rs +++ b/tests/expectations/tests/constify-all-enums.rs @@ -16,7 +16,10 @@ pub struct bar { #[test] fn bindgen_test_layout_bar() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const bar ) ) . this_should_work as * const _ + as usize } , 0usize); } impl Clone for bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/constructor-tp.rs b/tests/expectations/tests/constructor-tp.rs index 5022048910..4e8bcf67f7 100644 --- a/tests/expectations/tests/constructor-tp.rs +++ b/tests/expectations/tests/constructor-tp.rs @@ -18,7 +18,7 @@ pub struct Bar { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } extern "C" { #[link_name = "_ZN3BarC1Ev"] diff --git a/tests/expectations/tests/constructors.rs b/tests/expectations/tests/constructors.rs index 95afb82da8..8bea85c717 100644 --- a/tests/expectations/tests/constructors.rs +++ b/tests/expectations/tests/constructors.rs @@ -12,7 +12,7 @@ pub struct TestOverload { #[test] fn bindgen_test_layout_TestOverload() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } extern "C" { #[link_name = "_ZN12TestOverloadC1Ei"] @@ -48,7 +48,7 @@ pub struct TestPublicNoArgs { #[test] fn bindgen_test_layout_TestPublicNoArgs() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } extern "C" { #[link_name = "_ZN16TestPublicNoArgsC1Ev"] diff --git a/tests/expectations/tests/convert-floats.rs b/tests/expectations/tests/convert-floats.rs index 5cd38c133c..75cbb4b242 100644 --- a/tests/expectations/tests/convert-floats.rs +++ b/tests/expectations/tests/convert-floats.rs @@ -23,7 +23,25 @@ pub struct foo { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 48usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , + 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . baz as * const _ as usize } , + 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bazz as * const _ as usize } , + 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bazzz as * const _ as usize } , + 16usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . complexFloat as * const _ as + usize } , 24usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . complexDouble as * const _ as + usize } , 32usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/crtp.rs b/tests/expectations/tests/crtp.rs index cc488fd6c3..295732d01b 100644 --- a/tests/expectations/tests/crtp.rs +++ b/tests/expectations/tests/crtp.rs @@ -18,7 +18,7 @@ pub struct Derived { #[test] fn bindgen_test_layout_Derived() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Derived { fn clone(&self) -> Self { *self } @@ -38,8 +38,8 @@ pub struct DerivedFromBaseWithDestructor { fn bindgen_test_layout_DerivedFromBaseWithDestructor() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , - 1usize); + assert_eq! (::std::mem::align_of::() , + 1usize); } #[test] fn __bindgen_test_layout_template_1() { diff --git a/tests/expectations/tests/duplicated-namespaces-definitions.rs b/tests/expectations/tests/duplicated-namespaces-definitions.rs index da06a2a9c3..abc4310ce1 100644 --- a/tests/expectations/tests/duplicated-namespaces-definitions.rs +++ b/tests/expectations/tests/duplicated-namespaces-definitions.rs @@ -19,7 +19,13 @@ pub mod root { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar ) ) . foo as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar ) ) . baz as * const _ as + usize } , 4usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } @@ -36,7 +42,10 @@ pub mod root { #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Foo ) ) . ptr as * const _ as + usize } , 0usize); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/enum_and_vtable_mangling.rs b/tests/expectations/tests/enum_and_vtable_mangling.rs index a55c344e50..420246b585 100644 --- a/tests/expectations/tests/enum_and_vtable_mangling.rs +++ b/tests/expectations/tests/enum_and_vtable_mangling.rs @@ -21,7 +21,9 @@ pub struct C { #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . i as * const _ as usize + } , 8usize); } impl Clone for C { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/forward-declaration-autoptr.rs b/tests/expectations/tests/forward-declaration-autoptr.rs index 31013d3aef..a26d476ee7 100644 --- a/tests/expectations/tests/forward-declaration-autoptr.rs +++ b/tests/expectations/tests/forward-declaration-autoptr.rs @@ -20,7 +20,10 @@ pub struct Bar { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar ) ) . m_member as * const _ as usize + } , 0usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/forward_declared_complex_types.rs b/tests/expectations/tests/forward_declared_complex_types.rs index 119ea2b535..c169ef6991 100644 --- a/tests/expectations/tests/forward_declared_complex_types.rs +++ b/tests/expectations/tests/forward_declared_complex_types.rs @@ -12,7 +12,7 @@ pub struct Foo_empty { #[test] fn bindgen_test_layout_Foo_empty() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Foo_empty { fn clone(&self) -> Self { *self } @@ -28,7 +28,10 @@ pub struct Bar { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar ) ) . f as * const _ as usize } , + 0usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/forward_declared_struct.rs b/tests/expectations/tests/forward_declared_struct.rs index 5c2764e106..060156b2e6 100644 --- a/tests/expectations/tests/forward_declared_struct.rs +++ b/tests/expectations/tests/forward_declared_struct.rs @@ -12,7 +12,9 @@ pub struct a { #[test] fn bindgen_test_layout_a() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { & ( * ( 0 as * const a ) ) . b as * const _ as usize + } , 0usize); } impl Clone for a { fn clone(&self) -> Self { *self } @@ -25,7 +27,9 @@ pub struct c { #[test] fn bindgen_test_layout_c() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { & ( * ( 0 as * const c ) ) . d as * const _ as usize + } , 0usize); } impl Clone for c { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/func_ptr_in_struct.rs b/tests/expectations/tests/func_ptr_in_struct.rs index dcae771b06..e1fac5e49a 100644 --- a/tests/expectations/tests/func_ptr_in_struct.rs +++ b/tests/expectations/tests/func_ptr_in_struct.rs @@ -18,7 +18,10 @@ pub struct Foo { #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Foo ) ) . bar as * const _ as usize } , + 0usize); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/inherit_typedef.rs b/tests/expectations/tests/inherit_typedef.rs index ca9041e202..bc8eb472ee 100644 --- a/tests/expectations/tests/inherit_typedef.rs +++ b/tests/expectations/tests/inherit_typedef.rs @@ -12,7 +12,7 @@ pub struct Foo { #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Foo { fn clone(&self) -> Self { *self } @@ -26,7 +26,7 @@ pub struct Bar { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/inline_namespace.rs b/tests/expectations/tests/inline_namespace.rs index 5f6776b72b..0c00724176 100644 --- a/tests/expectations/tests/inline_namespace.rs +++ b/tests/expectations/tests/inline_namespace.rs @@ -20,7 +20,10 @@ pub mod root { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar ) ) . baz as * const _ as usize } + , 0usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/inline_namespace_conservative.rs b/tests/expectations/tests/inline_namespace_conservative.rs index d759a882ca..4bd06cd9a2 100644 --- a/tests/expectations/tests/inline_namespace_conservative.rs +++ b/tests/expectations/tests/inline_namespace_conservative.rs @@ -25,7 +25,10 @@ pub mod root { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar ) ) . baz as * const _ as usize } + , 0usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/inner_const.rs b/tests/expectations/tests/inner_const.rs index 666b8ce2ec..bc7dd7ac99 100644 --- a/tests/expectations/tests/inner_const.rs +++ b/tests/expectations/tests/inner_const.rs @@ -20,7 +20,10 @@ extern "C" { #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Foo ) ) . bar as * const _ as usize } , + 0usize); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/inner_template_self.rs b/tests/expectations/tests/inner_template_self.rs index b965b92d7c..02ffea3d14 100644 --- a/tests/expectations/tests/inner_template_self.rs +++ b/tests/expectations/tests/inner_template_self.rs @@ -18,7 +18,10 @@ pub struct InstantiateIt { #[test] fn bindgen_test_layout_InstantiateIt() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const InstantiateIt ) ) . m_list as * const _ + as usize } , 0usize); } impl Clone for InstantiateIt { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/issue-372.rs b/tests/expectations/tests/issue-372.rs index c6d9209e26..810be82c79 100644 --- a/tests/expectations/tests/issue-372.rs +++ b/tests/expectations/tests/issue-372.rs @@ -15,7 +15,10 @@ pub mod root { #[test] fn bindgen_test_layout_d() { assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const d ) ) . m as * const _ as usize } , + 0usize); } impl Clone for d { fn clone(&self) -> Self { *self } @@ -30,7 +33,16 @@ pub mod root { #[test] fn bindgen_test_layout_i() { assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const i ) ) . j as * const _ as usize } , + 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const i ) ) . k as * const _ as usize } , + 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const i ) ) . l as * const _ as usize } , + 16usize); } impl Clone for i { fn clone(&self) -> Self { *self } @@ -58,6 +70,9 @@ pub mod root { #[test] fn bindgen_test_layout_F() { assert_eq!(::std::mem::size_of::() , 264usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const F ) ) . w as * const _ as usize } , + 0usize); } } diff --git a/tests/expectations/tests/issue-410.rs b/tests/expectations/tests/issue-410.rs index 0c91e2b7de..69bf32a08e 100644 --- a/tests/expectations/tests/issue-410.rs +++ b/tests/expectations/tests/issue-410.rs @@ -18,7 +18,7 @@ pub mod root { #[test] fn bindgen_test_layout_Value() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } extern "C" { #[link_name = "_ZN2JS5Value1aE10JSWhyMagic"] diff --git a/tests/expectations/tests/issue-447.rs b/tests/expectations/tests/issue-447.rs index b49caa5477..b315e00814 100644 --- a/tests/expectations/tests/issue-447.rs +++ b/tests/expectations/tests/issue-447.rs @@ -22,8 +22,8 @@ pub mod root { fn bindgen_test_layout_GuardObjectNotifier() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , - 1usize); + assert_eq! (::std::mem::align_of::() , + 1usize); } impl Clone for GuardObjectNotifier { fn clone(&self) -> Self { *self } @@ -38,7 +38,7 @@ pub mod root { #[test] fn bindgen_test_layout_JSAutoCompartment() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } extern "C" { #[link_name = diff --git a/tests/expectations/tests/issue_311.rs b/tests/expectations/tests/issue_311.rs index f01a9d9354..62b95806f0 100644 --- a/tests/expectations/tests/issue_311.rs +++ b/tests/expectations/tests/issue_311.rs @@ -21,8 +21,8 @@ pub mod root { fn bindgen_test_layout_jsval_layout__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , - 1usize); + assert_eq! (::std::mem::align_of::() , + 1usize); } impl Clone for jsval_layout__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -30,7 +30,7 @@ pub mod root { #[test] fn bindgen_test_layout_jsval_layout() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for jsval_layout { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/jsval_layout_opaque.rs b/tests/expectations/tests/jsval_layout_opaque.rs index 530fdb22c5..d77493c722 100644 --- a/tests/expectations/tests/jsval_layout_opaque.rs +++ b/tests/expectations/tests/jsval_layout_opaque.rs @@ -115,7 +115,8 @@ pub struct jsval_layout__bindgen_ty_1 { #[test] fn bindgen_test_layout_jsval_layout__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , + 8usize); } impl Clone for jsval_layout__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -168,8 +169,20 @@ pub struct jsval_layout__bindgen_ty_2__bindgen_ty_1 { fn bindgen_test_layout_jsval_layout__bindgen_ty_2__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() - , 4usize); + assert_eq! (::std::mem::align_of::() + , 4usize); + assert_eq! (unsafe { + & ( + * ( 0 as * const jsval_layout__bindgen_ty_2__bindgen_ty_1 ) ) + . i32 as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( + * ( 0 as * const jsval_layout__bindgen_ty_2__bindgen_ty_1 ) ) + . u32 as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( + * ( 0 as * const jsval_layout__bindgen_ty_2__bindgen_ty_1 ) ) + . why as * const _ as usize } , 0usize); } impl Clone for jsval_layout__bindgen_ty_2__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -177,11 +190,41 @@ impl Clone for jsval_layout__bindgen_ty_2__bindgen_ty_1 { #[test] fn bindgen_test_layout_jsval_layout__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , + 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const jsval_layout__bindgen_ty_2 ) ) . payload + as * const _ as usize } , 0usize); } impl Clone for jsval_layout__bindgen_ty_2 { fn clone(&self) -> Self { *self } } +#[test] +fn bindgen_test_layout_jsval_layout() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const jsval_layout ) ) . asBits as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const jsval_layout ) ) . debugView as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const jsval_layout ) ) . s as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const jsval_layout ) ) . asDouble as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const jsval_layout ) ) . asPtr as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const jsval_layout ) ) . asWord as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const jsval_layout ) ) . asUIntPtr as * const _ + as usize } , 0usize); +} impl Clone for jsval_layout { fn clone(&self) -> Self { *self } } @@ -193,7 +236,10 @@ pub struct Value { #[test] fn bindgen_test_layout_Value() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Value ) ) . data as * const _ as usize } + , 0usize); } impl Clone for Value { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/layout.rs b/tests/expectations/tests/layout.rs new file mode 100644 index 0000000000..2946112fcb --- /dev/null +++ b/tests/expectations/tests/layout.rs @@ -0,0 +1,53 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +pub struct __IncompleteArrayField(::std::marker::PhantomData); +impl __IncompleteArrayField { + #[inline] + pub fn new() -> Self { + __IncompleteArrayField(::std::marker::PhantomData) + } + #[inline] + pub unsafe fn as_ptr(&self) -> *const T { ::std::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut_ptr(&mut self) -> *mut T { + ::std::mem::transmute(self) + } + #[inline] + pub unsafe fn as_slice(&self, len: usize) -> &[T] { + ::std::slice::from_raw_parts(self.as_ptr(), len) + } + #[inline] + pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { + ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + } +} +impl ::std::fmt::Debug for __IncompleteArrayField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__IncompleteArrayField") + } +} +impl ::std::clone::Clone for __IncompleteArrayField { + #[inline] + fn clone(&self) -> Self { Self::new() } +} +impl ::std::marker::Copy for __IncompleteArrayField { } +#[repr(C, packed)] +#[derive(Debug, Copy)] +pub struct header { + pub proto: ::std::os::raw::c_char, + pub size: ::std::os::raw::c_uint, + pub data: __IncompleteArrayField<::std::os::raw::c_uchar>, + pub __bindgen_padding_0: [u8; 11usize], +} +#[test] +fn bindgen_test_layout_header() { + assert_eq!(::std::mem::size_of::
() , 16usize); +} +impl Clone for header { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/layout_align.rs b/tests/expectations/tests/layout_align.rs new file mode 100644 index 0000000000..8b243f5397 --- /dev/null +++ b/tests/expectations/tests/layout_align.rs @@ -0,0 +1,118 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +pub struct __IncompleteArrayField(::std::marker::PhantomData); +impl __IncompleteArrayField { + #[inline] + pub fn new() -> Self { + __IncompleteArrayField(::std::marker::PhantomData) + } + #[inline] + pub unsafe fn as_ptr(&self) -> *const T { ::std::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut_ptr(&mut self) -> *mut T { + ::std::mem::transmute(self) + } + #[inline] + pub unsafe fn as_slice(&self, len: usize) -> &[T] { + ::std::slice::from_raw_parts(self.as_ptr(), len) + } + #[inline] + pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { + ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + } +} +impl ::std::fmt::Debug for __IncompleteArrayField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__IncompleteArrayField") + } +} +impl ::std::clone::Clone for __IncompleteArrayField { + #[inline] + fn clone(&self) -> Self { Self::new() } +} +impl ::std::marker::Copy for __IncompleteArrayField { } +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_kni_fifo { + /**< Next position to be written*/ + pub write: ::std::os::raw::c_uint, + /**< Next position to be read */ + pub read: ::std::os::raw::c_uint, + /**< Circular buffer length */ + pub len: ::std::os::raw::c_uint, + /**< Pointer size - for 32/64 bit OS */ + pub elem_size: ::std::os::raw::c_uint, + /**< The buffer contains mbuf pointers */ + pub buffer: __IncompleteArrayField<*mut ::std::os::raw::c_void>, + pub __bindgen_align: [u64; 0usize], +} +#[test] +fn bindgen_test_layout_rte_kni_fifo() { + assert_eq!(::std::mem::size_of::() , 16usize); + assert_eq! (::std::mem::align_of::() , 8usize); +} +impl Clone for rte_kni_fifo { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_link { + /**< ETH_SPEED_NUM_ */ + pub link_speed: u32, + pub _bitfield_1: u8, + pub __bindgen_align: [u64; 0usize], +} +#[test] +fn bindgen_test_layout_rte_eth_link() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_link ) ) . link_speed as * const + _ as usize } , 0usize); +} +impl Clone for rte_eth_link { + fn clone(&self) -> Self { *self } +} +impl rte_eth_link { + #[inline] + pub fn link_duplex(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (1usize as u8)) >> + 0u32) as u16) + } + } + #[inline] + pub fn set_link_duplex(&mut self, val: u16) { + self._bitfield_1 &= !(1usize as u8); + self._bitfield_1 |= ((val as u16 as u8) << 0u32) & (1usize as u8); + } + #[inline] + pub fn link_autoneg(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (2usize as u8)) >> + 1u32) as u16) + } + } + #[inline] + pub fn set_link_autoneg(&mut self, val: u16) { + self._bitfield_1 &= !(2usize as u8); + self._bitfield_1 |= ((val as u16 as u8) << 1u32) & (2usize as u8); + } + #[inline] + pub fn link_status(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (4usize as u8)) >> + 2u32) as u16) + } + } + #[inline] + pub fn set_link_status(&mut self, val: u16) { + self._bitfield_1 &= !(4usize as u8); + self._bitfield_1 |= ((val as u16 as u8) << 2u32) & (4usize as u8); + } +} diff --git a/tests/expectations/tests/layout_arp.rs b/tests/expectations/tests/layout_arp.rs new file mode 100644 index 0000000000..f1feb92bf0 --- /dev/null +++ b/tests/expectations/tests/layout_arp.rs @@ -0,0 +1,116 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const ETHER_ADDR_LEN: ::std::os::raw::c_uint = 6; +pub const ARP_HRD_ETHER: ::std::os::raw::c_uint = 1; +pub const ARP_OP_REQUEST: ::std::os::raw::c_uint = 1; +pub const ARP_OP_REPLY: ::std::os::raw::c_uint = 2; +pub const ARP_OP_REVREQUEST: ::std::os::raw::c_uint = 3; +pub const ARP_OP_REVREPLY: ::std::os::raw::c_uint = 4; +pub const ARP_OP_INVREQUEST: ::std::os::raw::c_uint = 8; +pub const ARP_OP_INVREPLY: ::std::os::raw::c_uint = 9; +/** + * Ethernet address: + * A universally administered address is uniquely assigned to a device by its + * manufacturer. The first three octets (in transmission order) contain the + * Organizationally Unique Identifier (OUI). The following three (MAC-48 and + * EUI-48) octets are assigned by that organization with the only constraint + * of uniqueness. + * A locally administered address is assigned to a device by a network + * administrator and does not contain OUIs. + * See http://standards.ieee.org/regauth/groupmac/tutorial.html + */ +#[repr(C, packed)] +#[derive(Debug, Copy)] +pub struct ether_addr { + /**< Addr bytes in tx order */ + pub addr_bytes: [u8; 6usize], +} +#[test] +fn bindgen_test_layout_ether_addr() { + assert_eq!(::std::mem::size_of::() , 6usize); + assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq! (unsafe { + & ( * ( 0 as * const ether_addr ) ) . addr_bytes as * const _ + as usize } , 0usize); +} +impl Clone for ether_addr { + fn clone(&self) -> Self { *self } +} +/** + * ARP header IPv4 payload. + */ +#[repr(C, packed)] +#[derive(Debug, Copy)] +pub struct arp_ipv4 { + /**< sender hardware address */ + pub arp_sha: ether_addr, + /**< sender IP address */ + pub arp_sip: u32, + /**< target hardware address */ + pub arp_tha: ether_addr, + /**< target IP address */ + pub arp_tip: u32, +} +#[test] +fn bindgen_test_layout_arp_ipv4() { + assert_eq!(::std::mem::size_of::() , 20usize); + assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq! (unsafe { + & ( * ( 0 as * const arp_ipv4 ) ) . arp_sha as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const arp_ipv4 ) ) . arp_sip as * const _ as + usize } , 6usize); + assert_eq! (unsafe { + & ( * ( 0 as * const arp_ipv4 ) ) . arp_tha as * const _ as + usize } , 10usize); + assert_eq! (unsafe { + & ( * ( 0 as * const arp_ipv4 ) ) . arp_tip as * const _ as + usize } , 16usize); +} +impl Clone for arp_ipv4 { + fn clone(&self) -> Self { *self } +} +/** + * ARP header. + */ +#[repr(C, packed)] +#[derive(Debug, Copy)] +pub struct arp_hdr { + pub arp_hrd: u16, + pub arp_pro: u16, + pub arp_hln: u8, + pub arp_pln: u8, + pub arp_op: u16, + pub arp_data: arp_ipv4, +} +#[test] +fn bindgen_test_layout_arp_hdr() { + assert_eq!(::std::mem::size_of::() , 28usize); + assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq! (unsafe { + & ( * ( 0 as * const arp_hdr ) ) . arp_hrd as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const arp_hdr ) ) . arp_pro as * const _ as + usize } , 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const arp_hdr ) ) . arp_hln as * const _ as + usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const arp_hdr ) ) . arp_pln as * const _ as + usize } , 5usize); + assert_eq! (unsafe { + & ( * ( 0 as * const arp_hdr ) ) . arp_op as * const _ as + usize } , 6usize); + assert_eq! (unsafe { + & ( * ( 0 as * const arp_hdr ) ) . arp_data as * const _ as + usize } , 8usize); +} +impl Clone for arp_hdr { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/layout_array.rs b/tests/expectations/tests/layout_array.rs new file mode 100644 index 0000000000..080a0a8377 --- /dev/null +++ b/tests/expectations/tests/layout_array.rs @@ -0,0 +1,206 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const RTE_CACHE_LINE_SIZE: ::std::os::raw::c_uint = 64; +pub const RTE_MEMPOOL_OPS_NAMESIZE: ::std::os::raw::c_uint = 32; +pub const RTE_MEMPOOL_MAX_OPS_IDX: ::std::os::raw::c_uint = 16; +pub const RTE_HEAP_NUM_FREELISTS: ::std::os::raw::c_uint = 13; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rte_mempool([u8; 0]); +/** + * Prototype for implementation specific data provisioning function. + * + * The function should provide the implementation specific memory for + * for use by the other mempool ops functions in a given mempool ops struct. + * E.g. the default ops provides an instance of the rte_ring for this purpose. + * it will most likely point to a different type of data structure, and + * will be transparent to the application programmer. + * This function should set mp->pool_data. + */ +pub type rte_mempool_alloc_t = + ::std::option::Option ::std::os::raw::c_int>; +/** + * Free the opaque private data pointed to by mp->pool_data pointer. + */ +pub type rte_mempool_free_t = + ::std::option::Option; +/** + * Enqueue an object into the external pool. + */ +pub type rte_mempool_enqueue_t = + ::std::option::Option ::std::os::raw::c_int>; +/** + * Dequeue an object from the external pool. + */ +pub type rte_mempool_dequeue_t = + ::std::option::Option ::std::os::raw::c_int>; +/** + * Return the number of available objects in the external pool. + */ +pub type rte_mempool_get_count = + ::std::option::Option ::std::os::raw::c_uint>; +/** Structure defining mempool operations structure */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mempool_ops { + /**< Name of mempool ops struct. */ + pub name: [::std::os::raw::c_char; 32usize], + /**< Allocate private data. */ + pub alloc: rte_mempool_alloc_t, + /**< Free the external pool. */ + pub free: rte_mempool_free_t, + /**< Enqueue an object. */ + pub enqueue: rte_mempool_enqueue_t, + /**< Dequeue an object. */ + pub dequeue: rte_mempool_dequeue_t, + /**< Get qty of available objs. */ + pub get_count: rte_mempool_get_count, + pub __bindgen_padding_0: [u64; 7usize], +} +#[test] +fn bindgen_test_layout_rte_mempool_ops() { + assert_eq!(::std::mem::size_of::() , 128usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mempool_ops ) ) . name as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mempool_ops ) ) . alloc as * const _ + as usize } , 32usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mempool_ops ) ) . free as * const _ + as usize } , 40usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mempool_ops ) ) . enqueue as * const + _ as usize } , 48usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mempool_ops ) ) . dequeue as * const + _ as usize } , 56usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mempool_ops ) ) . get_count as * + const _ as usize } , 64usize); +} +impl Clone for rte_mempool_ops { + fn clone(&self) -> Self { *self } +} +/** + * The rte_spinlock_t type. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct _bindgen_ty_1 { + /**< lock status 0 = unlocked, 1 = locked */ + pub locked: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . locked as * const _ + as usize } , 0usize); +} +impl Clone for _bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +pub type rte_spinlock_t = _bindgen_ty_1; +/** + * Structure storing the table of registered ops structs, each of which contain + * the function pointers for the mempool ops functions. + * Each process has its own storage for this ops struct array so that + * the mempools can be shared across primary and secondary processes. + * The indices used to access the array are valid across processes, whereas + * any function pointers stored directly in the mempool struct would not be. + * This results in us simply having "ops_index" in the mempool struct. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mempool_ops_table { + /**< Spinlock for add/delete. */ + pub sl: rte_spinlock_t, + /**< Number of used ops structs in the table. */ + pub num_ops: u32, + pub __bindgen_padding_0: [u64; 7usize], + /** + * Storage for all possible ops structs. + */ + pub ops: [rte_mempool_ops; 16usize], +} +#[test] +fn bindgen_test_layout_rte_mempool_ops_table() { + assert_eq!(::std::mem::size_of::() , 2112usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mempool_ops_table ) ) . sl as * const + _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mempool_ops_table ) ) . num_ops as * + const _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mempool_ops_table ) ) . ops as * + const _ as usize } , 64usize); +} +impl Clone for rte_mempool_ops_table { + fn clone(&self) -> Self { *self } +} +/** + * Structure to hold malloc heap + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct malloc_heap { + pub lock: rte_spinlock_t, + pub free_head: [malloc_heap__bindgen_ty_1; 13usize], + pub alloc_count: ::std::os::raw::c_uint, + pub total_size: usize, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct malloc_heap__bindgen_ty_1 { + pub lh_first: *mut malloc_heap__bindgen_ty_1_malloc_elem, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct malloc_heap__bindgen_ty_1_malloc_elem([u8; 0]); +#[test] +fn bindgen_test_layout_malloc_heap__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const malloc_heap__bindgen_ty_1 ) ) . lh_first + as * const _ as usize } , 0usize); +} +impl Clone for malloc_heap__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_malloc_heap() { + assert_eq!(::std::mem::size_of::() , 128usize); + assert_eq! (unsafe { + & ( * ( 0 as * const malloc_heap ) ) . lock as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const malloc_heap ) ) . free_head as * const _ + as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const malloc_heap ) ) . alloc_count as * const + _ as usize } , 112usize); + assert_eq! (unsafe { + & ( * ( 0 as * const malloc_heap ) ) . total_size as * const _ + as usize } , 120usize); +} +impl Clone for malloc_heap { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/layout_cmdline_token.rs b/tests/expectations/tests/layout_cmdline_token.rs new file mode 100644 index 0000000000..4966b307b6 --- /dev/null +++ b/tests/expectations/tests/layout_cmdline_token.rs @@ -0,0 +1,157 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +/** + * Stores a pointer to the ops struct, and the offset: the place to + * write the parsed result in the destination structure. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct cmdline_token_hdr { + pub ops: *mut cmdline_token_hdr_cmdline_token_ops, + pub offset: ::std::os::raw::c_uint, +} +/** + * A token is defined by this structure. + * + * parse() takes the token as first argument, then the source buffer + * starting at the token we want to parse. The 3rd arg is a pointer + * where we store the parsed data (as binary). It returns the number of + * parsed chars on success and a negative value on error. + * + * complete_get_nb() returns the number of possible values for this + * token if completion is possible. If it is NULL or if it returns 0, + * no completion is possible. + * + * complete_get_elt() copy in dstbuf (the size is specified in the + * parameter) the i-th possible completion for this token. returns 0 + * on success or and a negative value on error. + * + * get_help() fills the dstbuf with the help for the token. It returns + * -1 on error and 0 on success. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct cmdline_token_hdr_cmdline_token_ops { + /** parse(token ptr, buf, res pts, buf len) */ + pub parse: ::std::option::Option ::std::os::raw::c_int>, + /** return the num of possible choices for this token */ + pub complete_get_nb: ::std::option::Option ::std::os::raw::c_int>, + /** return the elt x for this token (token, idx, dstbuf, size) */ + pub complete_get_elt: ::std::option::Option ::std::os::raw::c_int>, + /** get help for this token (token, dstbuf, size) */ + pub get_help: ::std::option::Option ::std::os::raw::c_int>, +} +#[test] +fn bindgen_test_layout_cmdline_token_hdr_cmdline_token_ops() { + assert_eq!(::std::mem::size_of::() , + 32usize); + assert_eq! (::std::mem::align_of::() + , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . + parse as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . + complete_get_nb as * const _ as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . + complete_get_elt as * const _ as usize } , 16usize); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . + get_help as * const _ as usize } , 24usize); +} +impl Clone for cmdline_token_hdr_cmdline_token_ops { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_cmdline_token_hdr() { + assert_eq!(::std::mem::size_of::() , 16usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_hdr ) ) . ops as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_hdr ) ) . offset as * const + _ as usize } , 8usize); +} +impl Clone for cmdline_token_hdr { + fn clone(&self) -> Self { *self } +} +pub type cmdline_parse_token_hdr_t = cmdline_token_hdr; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum cmdline_numtype { + UINT8 = 0, + UINT16 = 1, + UINT32 = 2, + UINT64 = 3, + INT8 = 4, + INT16 = 5, + INT32 = 6, + INT64 = 7, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct cmdline_token_num_data { + pub type_: cmdline_numtype, +} +#[test] +fn bindgen_test_layout_cmdline_token_num_data() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_num_data ) ) . type_ as * + const _ as usize } , 0usize); +} +impl Clone for cmdline_token_num_data { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct cmdline_token_num { + pub hdr: cmdline_token_hdr, + pub num_data: cmdline_token_num_data, +} +#[test] +fn bindgen_test_layout_cmdline_token_num() { + assert_eq!(::std::mem::size_of::() , 24usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_num ) ) . hdr as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_num ) ) . num_data as * + const _ as usize } , 16usize); +} +impl Clone for cmdline_token_num { + fn clone(&self) -> Self { *self } +} +pub type cmdline_parse_token_num_t = cmdline_token_num; diff --git a/tests/expectations/tests/layout_eth_conf.rs b/tests/expectations/tests/layout_eth_conf.rs new file mode 100644 index 0000000000..70d050b00d --- /dev/null +++ b/tests/expectations/tests/layout_eth_conf.rs @@ -0,0 +1,1039 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +pub struct __BindgenUnionField(::std::marker::PhantomData); +impl __BindgenUnionField { + #[inline] + pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) } + #[inline] + pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut(&mut self) -> &mut T { ::std::mem::transmute(self) } +} +impl ::std::default::Default for __BindgenUnionField { + #[inline] + fn default() -> Self { Self::new() } +} +impl ::std::clone::Clone for __BindgenUnionField { + #[inline] + fn clone(&self) -> Self { Self::new() } +} +impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} +pub const ETH_MQ_RX_RSS_FLAG: ::std::os::raw::c_uint = 1; +pub const ETH_MQ_RX_DCB_FLAG: ::std::os::raw::c_uint = 2; +pub const ETH_MQ_RX_VMDQ_FLAG: ::std::os::raw::c_uint = 4; +pub const ETH_VMDQ_MAX_VLAN_FILTERS: ::std::os::raw::c_uint = 64; +pub const ETH_DCB_NUM_USER_PRIORITIES: ::std::os::raw::c_uint = 8; +pub const ETH_VMDQ_DCB_NUM_QUEUES: ::std::os::raw::c_uint = 128; +pub const ETH_DCB_NUM_QUEUES: ::std::os::raw::c_uint = 128; +pub const RTE_ETH_FDIR_MAX_FLEXLEN: ::std::os::raw::c_uint = 16; +pub const RTE_ETH_INSET_SIZE_MAX: ::std::os::raw::c_uint = 128; +pub const RTE_ETH_FLOW_UNKNOWN: ::std::os::raw::c_uint = 0; +pub const RTE_ETH_FLOW_RAW: ::std::os::raw::c_uint = 1; +pub const RTE_ETH_FLOW_IPV4: ::std::os::raw::c_uint = 2; +pub const RTE_ETH_FLOW_FRAG_IPV4: ::std::os::raw::c_uint = 3; +pub const RTE_ETH_FLOW_NONFRAG_IPV4_TCP: ::std::os::raw::c_uint = 4; +pub const RTE_ETH_FLOW_NONFRAG_IPV4_UDP: ::std::os::raw::c_uint = 5; +pub const RTE_ETH_FLOW_NONFRAG_IPV4_SCTP: ::std::os::raw::c_uint = 6; +pub const RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: ::std::os::raw::c_uint = 7; +pub const RTE_ETH_FLOW_IPV6: ::std::os::raw::c_uint = 8; +pub const RTE_ETH_FLOW_FRAG_IPV6: ::std::os::raw::c_uint = 9; +pub const RTE_ETH_FLOW_NONFRAG_IPV6_TCP: ::std::os::raw::c_uint = 10; +pub const RTE_ETH_FLOW_NONFRAG_IPV6_UDP: ::std::os::raw::c_uint = 11; +pub const RTE_ETH_FLOW_NONFRAG_IPV6_SCTP: ::std::os::raw::c_uint = 12; +pub const RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: ::std::os::raw::c_uint = 13; +pub const RTE_ETH_FLOW_L2_PAYLOAD: ::std::os::raw::c_uint = 14; +pub const RTE_ETH_FLOW_IPV6_EX: ::std::os::raw::c_uint = 15; +pub const RTE_ETH_FLOW_IPV6_TCP_EX: ::std::os::raw::c_uint = 16; +pub const RTE_ETH_FLOW_IPV6_UDP_EX: ::std::os::raw::c_uint = 17; +pub const RTE_ETH_FLOW_PORT: ::std::os::raw::c_uint = 18; +pub const RTE_ETH_FLOW_VXLAN: ::std::os::raw::c_uint = 19; +pub const RTE_ETH_FLOW_GENEVE: ::std::os::raw::c_uint = 20; +pub const RTE_ETH_FLOW_NVGRE: ::std::os::raw::c_uint = 21; +pub const RTE_ETH_FLOW_MAX: ::std::os::raw::c_uint = 22; +#[repr(u32)] +/** + * A set of values to identify what method is to be used to route + * packets to multiple queues. + */ +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum rte_eth_rx_mq_mode { + ETH_MQ_RX_NONE = 0, + ETH_MQ_RX_RSS = 1, + ETH_MQ_RX_DCB = 2, + ETH_MQ_RX_DCB_RSS = 3, + ETH_MQ_RX_VMDQ_ONLY = 4, + ETH_MQ_RX_VMDQ_RSS = 5, + ETH_MQ_RX_VMDQ_DCB = 6, + ETH_MQ_RX_VMDQ_DCB_RSS = 7, +} +/** + * A structure used to configure the RX features of an Ethernet port. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_rxmode { + /** The multi-queue packet distribution mode to be used, e.g. RSS. */ + pub mq_mode: rte_eth_rx_mq_mode, + /**< Only used if jumbo_frame enabled. */ + pub max_rx_pkt_len: u32, + /**< hdr buf size (header_split enabled).*/ + pub split_hdr_size: u16, + pub _bitfield_1: u16, +} +#[test] +fn bindgen_test_layout_rte_eth_rxmode() { + assert_eq!(::std::mem::size_of::() , 12usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_rxmode ) ) . mq_mode as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_rxmode ) ) . max_rx_pkt_len as * + const _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_rxmode ) ) . split_hdr_size as * + const _ as usize } , 8usize); +} +impl Clone for rte_eth_rxmode { + fn clone(&self) -> Self { *self } +} +impl rte_eth_rxmode { + #[inline] + pub fn header_split(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (1usize as u16)) >> + 0u32) as u16) + } + } + #[inline] + pub fn set_header_split(&mut self, val: u16) { + self._bitfield_1 &= !(1usize as u16); + self._bitfield_1 |= ((val as u16 as u16) << 0u32) & (1usize as u16); + } + #[inline] + pub fn hw_ip_checksum(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (2usize as u16)) >> + 1u32) as u16) + } + } + #[inline] + pub fn set_hw_ip_checksum(&mut self, val: u16) { + self._bitfield_1 &= !(2usize as u16); + self._bitfield_1 |= ((val as u16 as u16) << 1u32) & (2usize as u16); + } + #[inline] + pub fn hw_vlan_filter(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (4usize as u16)) >> + 2u32) as u16) + } + } + #[inline] + pub fn set_hw_vlan_filter(&mut self, val: u16) { + self._bitfield_1 &= !(4usize as u16); + self._bitfield_1 |= ((val as u16 as u16) << 2u32) & (4usize as u16); + } + #[inline] + pub fn hw_vlan_strip(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (8usize as u16)) >> + 3u32) as u16) + } + } + #[inline] + pub fn set_hw_vlan_strip(&mut self, val: u16) { + self._bitfield_1 &= !(8usize as u16); + self._bitfield_1 |= ((val as u16 as u16) << 3u32) & (8usize as u16); + } + #[inline] + pub fn hw_vlan_extend(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (16usize as u16)) >> + 4u32) as u16) + } + } + #[inline] + pub fn set_hw_vlan_extend(&mut self, val: u16) { + self._bitfield_1 &= !(16usize as u16); + self._bitfield_1 |= ((val as u16 as u16) << 4u32) & (16usize as u16); + } + #[inline] + pub fn jumbo_frame(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (32usize as u16)) >> + 5u32) as u16) + } + } + #[inline] + pub fn set_jumbo_frame(&mut self, val: u16) { + self._bitfield_1 &= !(32usize as u16); + self._bitfield_1 |= ((val as u16 as u16) << 5u32) & (32usize as u16); + } + #[inline] + pub fn hw_strip_crc(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (64usize as u16)) >> + 6u32) as u16) + } + } + #[inline] + pub fn set_hw_strip_crc(&mut self, val: u16) { + self._bitfield_1 &= !(64usize as u16); + self._bitfield_1 |= ((val as u16 as u16) << 6u32) & (64usize as u16); + } + #[inline] + pub fn enable_scatter(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (128usize as u16)) >> + 7u32) as u16) + } + } + #[inline] + pub fn set_enable_scatter(&mut self, val: u16) { + self._bitfield_1 &= !(128usize as u16); + self._bitfield_1 |= ((val as u16 as u16) << 7u32) & (128usize as u16); + } + #[inline] + pub fn enable_lro(&self) -> u16 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (256usize as u16)) >> + 8u32) as u16) + } + } + #[inline] + pub fn set_enable_lro(&mut self, val: u16) { + self._bitfield_1 &= !(256usize as u16); + self._bitfield_1 |= ((val as u16 as u16) << 8u32) & (256usize as u16); + } +} +#[repr(u32)] +/** + * A set of values to identify what method is to be used to transmit + * packets using multi-TCs. + */ +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum rte_eth_tx_mq_mode { + ETH_MQ_TX_NONE = 0, + ETH_MQ_TX_DCB = 1, + ETH_MQ_TX_VMDQ_DCB = 2, + ETH_MQ_TX_VMDQ_ONLY = 3, +} +/** + * A structure used to configure the TX features of an Ethernet port. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_txmode { + /**< TX multi-queues mode. */ + pub mq_mode: rte_eth_tx_mq_mode, + pub pvid: u16, + pub _bitfield_1: u8, +} +#[test] +fn bindgen_test_layout_rte_eth_txmode() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_txmode ) ) . mq_mode as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_txmode ) ) . pvid as * const _ as + usize } , 4usize); +} +impl Clone for rte_eth_txmode { + fn clone(&self) -> Self { *self } +} +impl rte_eth_txmode { + #[inline] + pub fn hw_vlan_reject_tagged(&self) -> u8 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (1usize as u8)) >> + 0u32) as u8) + } + } + #[inline] + pub fn set_hw_vlan_reject_tagged(&mut self, val: u8) { + self._bitfield_1 &= !(1usize as u8); + self._bitfield_1 |= ((val as u8 as u8) << 0u32) & (1usize as u8); + } + #[inline] + pub fn hw_vlan_reject_untagged(&self) -> u8 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (2usize as u8)) >> + 1u32) as u8) + } + } + #[inline] + pub fn set_hw_vlan_reject_untagged(&mut self, val: u8) { + self._bitfield_1 &= !(2usize as u8); + self._bitfield_1 |= ((val as u8 as u8) << 1u32) & (2usize as u8); + } + #[inline] + pub fn hw_vlan_insert_pvid(&self) -> u8 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (4usize as u8)) >> + 2u32) as u8) + } + } + #[inline] + pub fn set_hw_vlan_insert_pvid(&mut self, val: u8) { + self._bitfield_1 &= !(4usize as u8); + self._bitfield_1 |= ((val as u8 as u8) << 2u32) & (4usize as u8); + } +} +/** + * A structure used to configure the Receive Side Scaling (RSS) feature + * of an Ethernet port. + * If not NULL, the *rss_key* pointer of the *rss_conf* structure points + * to an array holding the RSS key to use for hashing specific header + * fields of received packets. The length of this array should be indicated + * by *rss_key_len* below. Otherwise, a default random hash key is used by + * the device driver. + * + * The *rss_key_len* field of the *rss_conf* structure indicates the length + * in bytes of the array pointed by *rss_key*. To be compatible, this length + * will be checked in i40e only. Others assume 40 bytes to be used as before. + * + * The *rss_hf* field of the *rss_conf* structure indicates the different + * types of IPv4/IPv6 packets to which the RSS hashing must be applied. + * Supplying an *rss_hf* equal to zero disables the RSS feature. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_rss_conf { + /**< If not NULL, 40-byte hash key. */ + pub rss_key: *mut u8, + /**< hash key length in bytes. */ + pub rss_key_len: u8, + /**< Hash functions to apply - see below. */ + pub rss_hf: u64, +} +#[test] +fn bindgen_test_layout_rte_eth_rss_conf() { + assert_eq!(::std::mem::size_of::() , 24usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_rss_conf ) ) . rss_key as * const + _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_rss_conf ) ) . rss_key_len as * + const _ as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_rss_conf ) ) . rss_hf as * const + _ as usize } , 16usize); +} +impl Clone for rte_eth_rss_conf { + fn clone(&self) -> Self { *self } +} +#[repr(u32)] +/** + * This enum indicates the possible number of traffic classes + * in DCB configratioins + */ +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum rte_eth_nb_tcs { ETH_4_TCS = 4, ETH_8_TCS = 8, } +#[repr(u32)] +/** + * This enum indicates the possible number of queue pools + * in VMDQ configurations. + */ +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum rte_eth_nb_pools { + ETH_8_POOLS = 8, + ETH_16_POOLS = 16, + ETH_32_POOLS = 32, + ETH_64_POOLS = 64, +} +/** + * A structure used to configure the VMDQ+DCB feature + * of an Ethernet port. + * + * Using this feature, packets are routed to a pool of queues, based + * on the vlan id in the vlan tag, and then to a specific queue within + * that pool, using the user priority vlan tag field. + * + * A default pool may be used, if desired, to route all traffic which + * does not match the vlan filter rules. + */ +#[repr(C)] +pub struct rte_eth_vmdq_dcb_conf { + /**< With DCB, 16 or 32 pools */ + pub nb_queue_pools: rte_eth_nb_pools, + /**< If non-zero, use a default pool */ + pub enable_default_pool: u8, + /**< The default pool, if applicable */ + pub default_pool: u8, + /**< We can have up to 64 filters/mappings */ + pub nb_pool_maps: u8, + /**< VMDq vlan pool maps. */ + pub pool_map: [rte_eth_vmdq_dcb_conf__bindgen_ty_1; 64usize], + pub dcb_tc: [u8; 8usize], +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_vmdq_dcb_conf__bindgen_ty_1 { + /**< The vlan id of the received frame */ + pub vlan_id: u16, + /**< Bitmask of pools for packet rx */ + pub pools: u64, +} +#[test] +fn bindgen_test_layout_rte_eth_vmdq_dcb_conf__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 16usize); + assert_eq! (::std::mem::align_of::() + , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) ) . + vlan_id as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) ) . + pools as * const _ as usize } , 8usize); +} +impl Clone for rte_eth_vmdq_dcb_conf__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_eth_vmdq_dcb_conf() { + assert_eq!(::std::mem::size_of::() , 1040usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . + nb_queue_pools as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . + enable_default_pool as * const _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . default_pool + as * const _ as usize } , 5usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . nb_pool_maps + as * const _ as usize } , 6usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . pool_map as * + const _ as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . dcb_tc as * + const _ as usize } , 1032usize); +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_dcb_rx_conf { + /**< Possible DCB TCs, 4 or 8 TCs */ + pub nb_tcs: rte_eth_nb_tcs, + /** Traffic class each UP mapped to. */ + pub dcb_tc: [u8; 8usize], +} +#[test] +fn bindgen_test_layout_rte_eth_dcb_rx_conf() { + assert_eq!(::std::mem::size_of::() , 12usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_dcb_rx_conf ) ) . nb_tcs as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_dcb_rx_conf ) ) . dcb_tc as * + const _ as usize } , 4usize); +} +impl Clone for rte_eth_dcb_rx_conf { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_vmdq_dcb_tx_conf { + /**< With DCB, 16 or 32 pools. */ + pub nb_queue_pools: rte_eth_nb_pools, + /** Traffic class each UP mapped to. */ + pub dcb_tc: [u8; 8usize], +} +#[test] +fn bindgen_test_layout_rte_eth_vmdq_dcb_tx_conf() { + assert_eq!(::std::mem::size_of::() , 12usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_dcb_tx_conf ) ) . + nb_queue_pools as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_dcb_tx_conf ) ) . dcb_tc as + * const _ as usize } , 4usize); +} +impl Clone for rte_eth_vmdq_dcb_tx_conf { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_dcb_tx_conf { + /**< Possible DCB TCs, 4 or 8 TCs. */ + pub nb_tcs: rte_eth_nb_tcs, + /** Traffic class each UP mapped to. */ + pub dcb_tc: [u8; 8usize], +} +#[test] +fn bindgen_test_layout_rte_eth_dcb_tx_conf() { + assert_eq!(::std::mem::size_of::() , 12usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_dcb_tx_conf ) ) . nb_tcs as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_dcb_tx_conf ) ) . dcb_tc as * + const _ as usize } , 4usize); +} +impl Clone for rte_eth_dcb_tx_conf { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_vmdq_tx_conf { + /**< VMDq mode, 64 pools. */ + pub nb_queue_pools: rte_eth_nb_pools, +} +#[test] +fn bindgen_test_layout_rte_eth_vmdq_tx_conf() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_tx_conf ) ) . nb_queue_pools + as * const _ as usize } , 0usize); +} +impl Clone for rte_eth_vmdq_tx_conf { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +pub struct rte_eth_vmdq_rx_conf { + /**< VMDq only mode, 8 or 64 pools */ + pub nb_queue_pools: rte_eth_nb_pools, + /**< If non-zero, use a default pool */ + pub enable_default_pool: u8, + /**< The default pool, if applicable */ + pub default_pool: u8, + /**< Enable VT loop back */ + pub enable_loop_back: u8, + /**< We can have up to 64 filters/mappings */ + pub nb_pool_maps: u8, + /**< Flags from ETH_VMDQ_ACCEPT_* */ + pub rx_mode: u32, + /**< VMDq vlan pool maps. */ + pub pool_map: [rte_eth_vmdq_rx_conf__bindgen_ty_1; 64usize], +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_vmdq_rx_conf__bindgen_ty_1 { + /**< The vlan id of the received frame */ + pub vlan_id: u16, + /**< Bitmask of pools for packet rx */ + pub pools: u64, +} +#[test] +fn bindgen_test_layout_rte_eth_vmdq_rx_conf__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 16usize); + assert_eq! (::std::mem::align_of::() , + 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_rx_conf__bindgen_ty_1 ) ) . + vlan_id as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_rx_conf__bindgen_ty_1 ) ) . + pools as * const _ as usize } , 8usize); +} +impl Clone for rte_eth_vmdq_rx_conf__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_eth_vmdq_rx_conf() { + assert_eq!(::std::mem::size_of::() , 1040usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . nb_queue_pools + as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . + enable_default_pool as * const _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . default_pool + as * const _ as usize } , 5usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . + enable_loop_back as * const _ as usize } , 6usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . nb_pool_maps + as * const _ as usize } , 7usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . rx_mode as * + const _ as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . pool_map as * + const _ as usize } , 16usize); +} +#[repr(u32)] +/** + * Flow Director setting modes: none, signature or perfect. + */ +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum rte_fdir_mode { + RTE_FDIR_MODE_NONE = 0, + RTE_FDIR_MODE_SIGNATURE = 1, + RTE_FDIR_MODE_PERFECT = 2, + RTE_FDIR_MODE_PERFECT_MAC_VLAN = 3, + RTE_FDIR_MODE_PERFECT_TUNNEL = 4, +} +#[repr(u32)] +/** + * Memory space that can be configured to store Flow Director filters + * in the board memory. + */ +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum rte_fdir_pballoc_type { + RTE_FDIR_PBALLOC_64K = 0, + RTE_FDIR_PBALLOC_128K = 1, + RTE_FDIR_PBALLOC_256K = 2, +} +#[repr(u32)] +/** + * Select report mode of FDIR hash information in RX descriptors. + */ +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum rte_fdir_status_mode { + RTE_FDIR_NO_REPORT_STATUS = 0, + RTE_FDIR_REPORT_STATUS = 1, + RTE_FDIR_REPORT_STATUS_ALWAYS = 2, +} +/** + * A structure used to define the input for IPV4 flow + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_ipv4_flow { + /**< IPv4 source address in big endian. */ + pub src_ip: u32, + /**< IPv4 destination address in big endian. */ + pub dst_ip: u32, + /**< Type of service to match. */ + pub tos: u8, + /**< Time to live to match. */ + pub ttl: u8, + /**< Protocol, next header in big endian. */ + pub proto: u8, +} +#[test] +fn bindgen_test_layout_rte_eth_ipv4_flow() { + assert_eq!(::std::mem::size_of::() , 12usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . src_ip as * const + _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . dst_ip as * const + _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . tos as * const _ + as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . ttl as * const _ + as usize } , 9usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . proto as * const + _ as usize } , 10usize); +} +impl Clone for rte_eth_ipv4_flow { + fn clone(&self) -> Self { *self } +} +/** + * A structure used to define the input for IPV6 flow + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_ipv6_flow { + /**< IPv6 source address in big endian. */ + pub src_ip: [u32; 4usize], + /**< IPv6 destination address in big endian. */ + pub dst_ip: [u32; 4usize], + /**< Traffic class to match. */ + pub tc: u8, + /**< Protocol, next header to match. */ + pub proto: u8, + /**< Hop limits to match. */ + pub hop_limits: u8, +} +#[test] +fn bindgen_test_layout_rte_eth_ipv6_flow() { + assert_eq!(::std::mem::size_of::() , 36usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . src_ip as * const + _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . dst_ip as * const + _ as usize } , 16usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . tc as * const _ + as usize } , 32usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . proto as * const + _ as usize } , 33usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . hop_limits as * + const _ as usize } , 34usize); +} +impl Clone for rte_eth_ipv6_flow { + fn clone(&self) -> Self { *self } +} +/** + * A structure used to configure FDIR masks that are used by the device + * to match the various fields of RX packet headers. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_fdir_masks { + /**< Bit mask for vlan_tci in big endian */ + pub vlan_tci_mask: u16, + /** Bit mask for ipv4 flow in big endian. */ + pub ipv4_mask: rte_eth_ipv4_flow, + /** Bit maks for ipv6 flow in big endian. */ + pub ipv6_mask: rte_eth_ipv6_flow, + /** Bit mask for L4 source port in big endian. */ + pub src_port_mask: u16, + /** Bit mask for L4 destination port in big endian. */ + pub dst_port_mask: u16, + /** 6 bit mask for proper 6 bytes of Mac address, bit 0 matches the + first byte on the wire */ + pub mac_addr_byte_mask: u8, + /** Bit mask for tunnel ID in big endian. */ + pub tunnel_id_mask: u32, + /**< 1 - Match tunnel type, + 0 - Ignore tunnel type. */ + pub tunnel_type_mask: u8, +} +#[test] +fn bindgen_test_layout_rte_eth_fdir_masks() { + assert_eq!(::std::mem::size_of::() , 68usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_masks ) ) . vlan_tci_mask as + * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_masks ) ) . ipv4_mask as * + const _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_masks ) ) . ipv6_mask as * + const _ as usize } , 16usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_masks ) ) . src_port_mask as + * const _ as usize } , 52usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_masks ) ) . dst_port_mask as + * const _ as usize } , 54usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_masks ) ) . + mac_addr_byte_mask as * const _ as usize } , 56usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_masks ) ) . tunnel_id_mask + as * const _ as usize } , 60usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_masks ) ) . tunnel_type_mask + as * const _ as usize } , 64usize); +} +impl Clone for rte_eth_fdir_masks { + fn clone(&self) -> Self { *self } +} +#[repr(u32)] +/** + * Payload type + */ +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum rte_eth_payload_type { + RTE_ETH_PAYLOAD_UNKNOWN = 0, + RTE_ETH_RAW_PAYLOAD = 1, + RTE_ETH_L2_PAYLOAD = 2, + RTE_ETH_L3_PAYLOAD = 3, + RTE_ETH_L4_PAYLOAD = 4, + RTE_ETH_PAYLOAD_MAX = 8, +} +/** + * A structure used to select bytes extracted from the protocol layers to + * flexible payload for filter + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_flex_payload_cfg { + /**< Payload type */ + pub type_: rte_eth_payload_type, + pub src_offset: [u16; 16usize], +} +#[test] +fn bindgen_test_layout_rte_eth_flex_payload_cfg() { + assert_eq!(::std::mem::size_of::() , 36usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_flex_payload_cfg ) ) . type_ as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_flex_payload_cfg ) ) . src_offset + as * const _ as usize } , 4usize); +} +impl Clone for rte_eth_flex_payload_cfg { + fn clone(&self) -> Self { *self } +} +/** + * A structure used to define FDIR masks for flexible payload + * for each flow type + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_fdir_flex_mask { + pub flow_type: u16, + pub mask: [u8; 16usize], +} +#[test] +fn bindgen_test_layout_rte_eth_fdir_flex_mask() { + assert_eq!(::std::mem::size_of::() , 18usize); + assert_eq! (::std::mem::align_of::() , 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_flex_mask ) ) . flow_type as + * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_flex_mask ) ) . mask as * + const _ as usize } , 2usize); +} +impl Clone for rte_eth_fdir_flex_mask { + fn clone(&self) -> Self { *self } +} +/** + * A structure used to define all flexible payload related setting + * include flex payload and flex mask + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_fdir_flex_conf { + /**< The number of following payload cfg */ + pub nb_payloads: u16, + /**< The number of following mask */ + pub nb_flexmasks: u16, + pub flex_set: [rte_eth_flex_payload_cfg; 8usize], + pub flex_mask: [rte_eth_fdir_flex_mask; 22usize], +} +#[test] +fn bindgen_test_layout_rte_eth_fdir_flex_conf() { + assert_eq!(::std::mem::size_of::() , 688usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . nb_payloads + as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . nb_flexmasks + as * const _ as usize } , 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . flex_set as + * const _ as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . flex_mask as + * const _ as usize } , 292usize); +} +impl Clone for rte_eth_fdir_flex_conf { + fn clone(&self) -> Self { *self } +} +/** + * A structure used to configure the Flow Director (FDIR) feature + * of an Ethernet port. + * + * If mode is RTE_FDIR_DISABLE, the pballoc value is ignored. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_fdir_conf { + /**< Flow Director mode. */ + pub mode: rte_fdir_mode, + /**< Space for FDIR filters. */ + pub pballoc: rte_fdir_pballoc_type, + /**< How to report FDIR hash. */ + pub status: rte_fdir_status_mode, + /** RX queue of packets matching a "drop" filter in perfect mode. */ + pub drop_queue: u8, + pub mask: rte_eth_fdir_masks, + pub flex_conf: rte_eth_fdir_flex_conf, +} +#[test] +fn bindgen_test_layout_rte_fdir_conf() { + assert_eq!(::std::mem::size_of::() , 772usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_fdir_conf ) ) . mode as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_fdir_conf ) ) . pballoc as * const _ + as usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_fdir_conf ) ) . status as * const _ + as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_fdir_conf ) ) . drop_queue as * const + _ as usize } , 12usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_fdir_conf ) ) . mask as * const _ as + usize } , 16usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_fdir_conf ) ) . flex_conf as * const + _ as usize } , 84usize); +} +impl Clone for rte_fdir_conf { + fn clone(&self) -> Self { *self } +} +/** + * A structure used to enable/disable specific device interrupts. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_intr_conf { + /** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */ + pub lsc: u16, + /** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */ + pub rxq: u16, +} +#[test] +fn bindgen_test_layout_rte_intr_conf() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_intr_conf ) ) . lsc as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_intr_conf ) ) . rxq as * const _ as + usize } , 2usize); +} +impl Clone for rte_intr_conf { + fn clone(&self) -> Self { *self } +} +/** + * A structure used to configure an Ethernet port. + * Depending upon the RX multi-queue mode, extra advanced + * configuration settings may be needed. + */ +#[repr(C)] +pub struct rte_eth_conf { + /**< bitmap of ETH_LINK_SPEED_XXX of speeds to be + used. ETH_LINK_SPEED_FIXED disables link + autonegotiation, and a unique speed shall be + set. Otherwise, the bitmap defines the set of + speeds to be advertised. If the special value + ETH_LINK_SPEED_AUTONEG (0) is used, all speeds + supported are advertised. */ + pub link_speeds: u32, + /**< Port RX configuration. */ + pub rxmode: rte_eth_rxmode, + /**< Port TX configuration. */ + pub txmode: rte_eth_txmode, + /**< Loopback operation mode. By default the value + is 0, meaning the loopback mode is disabled. + Read the datasheet of given ethernet controller + for details. The possible values of this field + are defined in implementation of each driver. */ + pub lpbk_mode: u32, + /**< Port RX filtering configuration (union). */ + pub rx_adv_conf: rte_eth_conf__bindgen_ty_1, + /**< Port TX DCB configuration (union). */ + pub tx_adv_conf: rte_eth_conf__bindgen_ty_2, + /** Currently,Priority Flow Control(PFC) are supported,if DCB with PFC + is needed,and the variable must be set ETH_DCB_PFC_SUPPORT. */ + pub dcb_capability_en: u32, + /**< FDIR configuration. */ + pub fdir_conf: rte_fdir_conf, + /**< Interrupt mode configuration. */ + pub intr_conf: rte_intr_conf, +} +#[repr(C)] +pub struct rte_eth_conf__bindgen_ty_1 { + /**< Port RSS configuration */ + pub rss_conf: rte_eth_rss_conf, + pub vmdq_dcb_conf: rte_eth_vmdq_dcb_conf, + pub dcb_rx_conf: rte_eth_dcb_rx_conf, + pub vmdq_rx_conf: rte_eth_vmdq_rx_conf, +} +#[test] +fn bindgen_test_layout_rte_eth_conf__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 2120usize); + assert_eq! (::std::mem::align_of::() , + 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) . rss_conf + as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) . + vmdq_dcb_conf as * const _ as usize } , 24usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) . + dcb_rx_conf as * const _ as usize } , 1064usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) . + vmdq_rx_conf as * const _ as usize } , 1080usize); +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_eth_conf__bindgen_ty_2 { + pub vmdq_dcb_tx_conf: __BindgenUnionField, + pub dcb_tx_conf: __BindgenUnionField, + pub vmdq_tx_conf: __BindgenUnionField, + pub bindgen_union_field: [u32; 3usize], +} +#[test] +fn bindgen_test_layout_rte_eth_conf__bindgen_ty_2() { + assert_eq!(::std::mem::size_of::() , 12usize); + assert_eq! (::std::mem::align_of::() , + 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf__bindgen_ty_2 ) ) . + vmdq_dcb_tx_conf as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf__bindgen_ty_2 ) ) . + dcb_tx_conf as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf__bindgen_ty_2 ) ) . + vmdq_tx_conf as * const _ as usize } , 0usize); +} +impl Clone for rte_eth_conf__bindgen_ty_2 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_eth_conf() { + assert_eq!(::std::mem::size_of::() , 2944usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf ) ) . link_speeds as * const + _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf ) ) . rxmode as * const _ as + usize } , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf ) ) . txmode as * const _ as + usize } , 16usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf ) ) . lpbk_mode as * const _ + as usize } , 24usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf ) ) . rx_adv_conf as * const + _ as usize } , 32usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf ) ) . tx_adv_conf as * const + _ as usize } , 2152usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf ) ) . dcb_capability_en as * + const _ as usize } , 2164usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf ) ) . fdir_conf as * const _ + as usize } , 2168usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_eth_conf ) ) . intr_conf as * const _ + as usize } , 2940usize); +} diff --git a/tests/expectations/tests/layout_kni_mbuf.rs b/tests/expectations/tests/layout_kni_mbuf.rs new file mode 100644 index 0000000000..bdaf0845e9 --- /dev/null +++ b/tests/expectations/tests/layout_kni_mbuf.rs @@ -0,0 +1,82 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const RTE_CACHE_LINE_MIN_SIZE: ::std::os::raw::c_uint = 64; +pub const RTE_CACHE_LINE_SIZE: ::std::os::raw::c_uint = 64; +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_kni_mbuf { + pub buf_addr: *mut ::std::os::raw::c_void, + pub buf_physaddr: u64, + pub pad0: [::std::os::raw::c_char; 2usize], + /**< Start address of data in segment buffer. */ + pub data_off: u16, + pub pad1: [::std::os::raw::c_char; 2usize], + /**< Number of segments. */ + pub nb_segs: u8, + pub pad4: [::std::os::raw::c_char; 1usize], + /**< Offload features. */ + pub ol_flags: u64, + pub pad2: [::std::os::raw::c_char; 4usize], + /**< Total pkt len: sum of all segment data_len. */ + pub pkt_len: u32, + /**< Amount of data in segment buffer. */ + pub data_len: u16, + pub __bindgen_padding_0: [u8; 22usize], + pub pad3: [::std::os::raw::c_char; 8usize], + pub pool: *mut ::std::os::raw::c_void, + pub next: *mut ::std::os::raw::c_void, + pub __bindgen_padding_1: [u64; 5usize], +} +#[test] +fn bindgen_test_layout_rte_kni_mbuf() { + assert_eq!(::std::mem::size_of::() , 128usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . buf_addr as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . buf_physaddr as * + const _ as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . pad0 as * const _ as + usize } , 16usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . data_off as * const _ + as usize } , 18usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . pad1 as * const _ as + usize } , 20usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . nb_segs as * const _ + as usize } , 22usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . pad4 as * const _ as + usize } , 23usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . ol_flags as * const _ + as usize } , 24usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . pad2 as * const _ as + usize } , 32usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . pkt_len as * const _ + as usize } , 36usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . data_len as * const _ + as usize } , 40usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . pad3 as * const _ as + usize } , 64usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . pool as * const _ as + usize } , 72usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_kni_mbuf ) ) . next as * const _ as + usize } , 80usize); +} +impl Clone for rte_kni_mbuf { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/layout_mbuf.rs b/tests/expectations/tests/layout_mbuf.rs new file mode 100644 index 0000000000..163a62ec18 --- /dev/null +++ b/tests/expectations/tests/layout_mbuf.rs @@ -0,0 +1,602 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +pub struct __BindgenUnionField(::std::marker::PhantomData); +impl __BindgenUnionField { + #[inline] + pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) } + #[inline] + pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut(&mut self) -> &mut T { ::std::mem::transmute(self) } +} +impl ::std::default::Default for __BindgenUnionField { + #[inline] + fn default() -> Self { Self::new() } +} +impl ::std::clone::Clone for __BindgenUnionField { + #[inline] + fn clone(&self) -> Self { Self::new() } +} +impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} +pub const RTE_CACHE_LINE_MIN_SIZE: ::std::os::raw::c_uint = 64; +pub const RTE_CACHE_LINE_SIZE: ::std::os::raw::c_uint = 64; +pub type phys_addr_t = u64; +pub type MARKER = [*mut ::std::os::raw::c_void; 0usize]; +pub type MARKER8 = [u8; 0usize]; +pub type MARKER64 = [u64; 0usize]; +/** + * The atomic counter structure. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct _bindgen_ty_1 { + /**< An internal counter value. */ + pub cnt: i16, +} +#[test] +fn bindgen_test_layout__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 2usize); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . cnt as * const _ as + usize } , 0usize); +} +impl Clone for _bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +pub type rte_atomic16_t = _bindgen_ty_1; +/** + * The generic rte_mbuf, containing a packet mbuf. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf { + pub cacheline0: MARKER, + /**< Virtual address of segment buffer. */ + pub buf_addr: *mut ::std::os::raw::c_void, + /**< Physical address of segment buffer. */ + pub buf_physaddr: phys_addr_t, + /**< Length of segment buffer. */ + pub buf_len: u16, + pub rearm_data: MARKER8, + pub data_off: u16, + pub __bindgen_anon_1: rte_mbuf__bindgen_ty_1, + /**< Number of segments. */ + pub nb_segs: u8, + /**< Input port. */ + pub port: u8, + /**< Offload features. */ + pub ol_flags: u64, + pub rx_descriptor_fields1: MARKER, + pub __bindgen_anon_2: rte_mbuf__bindgen_ty_2, + /**< Total pkt len: sum of all segments. */ + pub pkt_len: u32, + /**< Amount of data in segment buffer. */ + pub data_len: u16, + /** VLAN TCI (CPU order), valid if PKT_RX_VLAN_STRIPPED is set. */ + pub vlan_tci: u16, + /**< hash information */ + pub hash: rte_mbuf__bindgen_ty_3, + /**< Sequence number. See also rte_reorder_insert() */ + pub seqn: u32, + /** Outer VLAN TCI (CPU order), valid if PKT_RX_QINQ_STRIPPED is set. */ + pub vlan_tci_outer: u16, + pub cacheline1: MARKER, + pub __bindgen_anon_3: rte_mbuf__bindgen_ty_4, + /**< Pool from which mbuf was allocated. */ + pub pool: *mut rte_mbuf_rte_mempool, + /**< Next segment of scattered packet. */ + pub next: *mut rte_mbuf, + pub __bindgen_anon_4: rte_mbuf__bindgen_ty_5, + /** Size of the application private data. In case of an indirect + * mbuf, it stores the direct mbuf private data size. */ + pub priv_size: u16, + /** Timesync flags for use with IEEE1588. */ + pub timesync: u16, + pub __bindgen_padding_0: [u32; 7usize], +} +/** + * 16-bit Reference counter. + * It should only be accessed using the following functions: + * rte_mbuf_refcnt_update(), rte_mbuf_refcnt_read(), and + * rte_mbuf_refcnt_set(). The functionality of these functions (atomic, + * or non-atomic) is controlled by the CONFIG_RTE_MBUF_REFCNT_ATOMIC + * config option. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_1 { + /**< Atomically accessed refcnt */ + pub refcnt_atomic: __BindgenUnionField, + /**< Non-atomically accessed refcnt */ + pub refcnt: __BindgenUnionField, + pub bindgen_union_field: u16, +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , 2usize); + assert_eq! (::std::mem::align_of::() , 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_1 ) ) . + refcnt_atomic as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_1 ) ) . refcnt as * + const _ as usize } , 0usize); +} +impl Clone for rte_mbuf__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_2 { + /**< L2/L3/L4 and tunnel information. */ + pub packet_type: __BindgenUnionField, + pub __bindgen_anon_1: __BindgenUnionField, + pub bindgen_union_field: u32, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_2__bindgen_ty_1 { + pub _bitfield_1: u32, +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_2__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 4usize); + assert_eq! (::std::mem::align_of::() + , 4usize); +} +impl Clone for rte_mbuf__bindgen_ty_2__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +impl rte_mbuf__bindgen_ty_2__bindgen_ty_1 { + #[inline] + pub fn l2_type(&self) -> u32 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (15usize as u32)) >> + 0u32) as u32) + } + } + #[inline] + pub fn set_l2_type(&mut self, val: u32) { + self._bitfield_1 &= !(15usize as u32); + self._bitfield_1 |= ((val as u32 as u32) << 0u32) & (15usize as u32); + } + #[inline] + pub fn l3_type(&self) -> u32 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (240usize as u32)) >> + 4u32) as u32) + } + } + #[inline] + pub fn set_l3_type(&mut self, val: u32) { + self._bitfield_1 &= !(240usize as u32); + self._bitfield_1 |= ((val as u32 as u32) << 4u32) & (240usize as u32); + } + #[inline] + pub fn l4_type(&self) -> u32 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (3840usize as u32)) >> + 8u32) as u32) + } + } + #[inline] + pub fn set_l4_type(&mut self, val: u32) { + self._bitfield_1 &= !(3840usize as u32); + self._bitfield_1 |= + ((val as u32 as u32) << 8u32) & (3840usize as u32); + } + #[inline] + pub fn tun_type(&self) -> u32 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (61440usize as u32)) >> + 12u32) as u32) + } + } + #[inline] + pub fn set_tun_type(&mut self, val: u32) { + self._bitfield_1 &= !(61440usize as u32); + self._bitfield_1 |= + ((val as u32 as u32) << 12u32) & (61440usize as u32); + } + #[inline] + pub fn inner_l2_type(&self) -> u32 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (983040usize as u32)) + >> 16u32) as u32) + } + } + #[inline] + pub fn set_inner_l2_type(&mut self, val: u32) { + self._bitfield_1 &= !(983040usize as u32); + self._bitfield_1 |= + ((val as u32 as u32) << 16u32) & (983040usize as u32); + } + #[inline] + pub fn inner_l3_type(&self) -> u32 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (15728640usize as u32)) + >> 20u32) as u32) + } + } + #[inline] + pub fn set_inner_l3_type(&mut self, val: u32) { + self._bitfield_1 &= !(15728640usize as u32); + self._bitfield_1 |= + ((val as u32 as u32) << 20u32) & (15728640usize as u32); + } + #[inline] + pub fn inner_l4_type(&self) -> u32 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & + (251658240usize as u32)) >> 24u32) as + u32) + } + } + #[inline] + pub fn set_inner_l4_type(&mut self, val: u32) { + self._bitfield_1 &= !(251658240usize as u32); + self._bitfield_1 |= + ((val as u32 as u32) << 24u32) & (251658240usize as u32); + } +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_2() { + assert_eq!(::std::mem::size_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_2 ) ) . packet_type + as * const _ as usize } , 0usize); +} +impl Clone for rte_mbuf__bindgen_ty_2 { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_3 { + /**< RSS hash result if RSS enabled */ + pub rss: __BindgenUnionField, + /**< Filter identifier if FDIR enabled */ + pub fdir: __BindgenUnionField, + /**< Hierarchical scheduler */ + pub sched: __BindgenUnionField, + /**< User defined tags. See rte_distributor_process() */ + pub usr: __BindgenUnionField, + pub bindgen_union_field: [u32; 2usize], +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_1 { + pub __bindgen_anon_1: rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1, + pub hi: u32, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 { + pub __bindgen_anon_1: __BindgenUnionField, + pub lo: __BindgenUnionField, + pub bindgen_union_field: u32, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + pub hash: u16, + pub id: u16, +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() + , 4usize); + assert_eq! (::std::mem::align_of::() + , 2usize); + assert_eq! (unsafe { + & ( + * ( + 0 as * const + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 + ) ) . hash as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( + * ( + 0 as * const + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 + ) ) . id as * const _ as usize } , 2usize); +} +impl Clone for + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() + , 4usize); + assert_eq! (::std::mem::align_of::() + , 4usize); + assert_eq! (unsafe { + & ( + * ( + 0 as * const + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 ) ) . lo as + * const _ as usize } , 0usize); +} +impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 8usize); + assert_eq! (::std::mem::align_of::() + , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_1 ) ) + . hi as * const _ as usize } , 4usize); +} +impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_2 { + pub lo: u32, + pub hi: u32, +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_2() { + assert_eq!(::std::mem::size_of::() , + 8usize); + assert_eq! (::std::mem::align_of::() + , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) ) + . lo as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) ) + . hi as * const _ as usize } , 4usize); +} +impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_2 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_3() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . rss as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . fdir as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . sched as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . usr as * + const _ as usize } , 0usize); +} +impl Clone for rte_mbuf__bindgen_ty_3 { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_4 { + /**< Can be used for external metadata */ + pub userdata: __BindgenUnionField<*mut ::std::os::raw::c_void>, + /**< Allow 8-byte userdata on 32-bit */ + pub udata64: __BindgenUnionField, + pub bindgen_union_field: u64, +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_4() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_4 ) ) . userdata as + * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_4 ) ) . udata64 as * + const _ as usize } , 0usize); +} +impl Clone for rte_mbuf__bindgen_ty_4 { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct rte_mbuf_rte_mempool([u8; 0]); +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_5 { + /**< combined for easy fetch */ + pub tx_offload: __BindgenUnionField, + pub __bindgen_anon_1: __BindgenUnionField, + pub bindgen_union_field: u64, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_mbuf__bindgen_ty_5__bindgen_ty_1 { + pub _bitfield_1: u64, +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_5__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , + 8usize); + assert_eq! (::std::mem::align_of::() + , 8usize); +} +impl Clone for rte_mbuf__bindgen_ty_5__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +impl rte_mbuf__bindgen_ty_5__bindgen_ty_1 { + #[inline] + pub fn l2_len(&self) -> u64 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (127usize as u64)) >> + 0u32) as u64) + } + } + #[inline] + pub fn set_l2_len(&mut self, val: u64) { + self._bitfield_1 &= !(127usize as u64); + self._bitfield_1 |= ((val as u64 as u64) << 0u32) & (127usize as u64); + } + #[inline] + pub fn l3_len(&self) -> u64 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (65408usize as u64)) >> + 7u32) as u64) + } + } + #[inline] + pub fn set_l3_len(&mut self, val: u64) { + self._bitfield_1 &= !(65408usize as u64); + self._bitfield_1 |= + ((val as u64 as u64) << 7u32) & (65408usize as u64); + } + #[inline] + pub fn l4_len(&self) -> u64 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & (16711680usize as u64)) + >> 16u32) as u64) + } + } + #[inline] + pub fn set_l4_len(&mut self, val: u64) { + self._bitfield_1 &= !(16711680usize as u64); + self._bitfield_1 |= + ((val as u64 as u64) << 16u32) & (16711680usize as u64); + } + #[inline] + pub fn tso_segsz(&self) -> u64 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & + (1099494850560usize as u64)) >> 24u32) + as u64) + } + } + #[inline] + pub fn set_tso_segsz(&mut self, val: u64) { + self._bitfield_1 &= !(1099494850560usize as u64); + self._bitfield_1 |= + ((val as u64 as u64) << 24u32) & (1099494850560usize as u64); + } + #[inline] + pub fn outer_l3_len(&self) -> u64 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & + (561850441793536usize as u64)) >> + 40u32) as u64) + } + } + #[inline] + pub fn set_outer_l3_len(&mut self, val: u64) { + self._bitfield_1 &= !(561850441793536usize as u64); + self._bitfield_1 |= + ((val as u64 as u64) << 40u32) & (561850441793536usize as u64); + } + #[inline] + pub fn outer_l2_len(&self) -> u64 { + unsafe { + ::std::mem::transmute(((self._bitfield_1 & + (71494644084506624usize as u64)) >> + 49u32) as u64) + } + } + #[inline] + pub fn set_outer_l2_len(&mut self, val: u64) { + self._bitfield_1 &= !(71494644084506624usize as u64); + self._bitfield_1 |= + ((val as u64 as u64) << 49u32) & (71494644084506624usize as u64); + } +} +#[test] +fn bindgen_test_layout_rte_mbuf__bindgen_ty_5() { + assert_eq!(::std::mem::size_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf__bindgen_ty_5 ) ) . tx_offload + as * const _ as usize } , 0usize); +} +impl Clone for rte_mbuf__bindgen_ty_5 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_rte_mbuf() { + assert_eq!(::std::mem::size_of::() , 128usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . cacheline0 as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . buf_addr as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . buf_physaddr as * const _ + as usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . buf_len as * const _ as + usize } , 16usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . rearm_data as * const _ as + usize } , 18usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . data_off as * const _ as + usize } , 18usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . nb_segs as * const _ as + usize } , 22usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . port as * const _ as usize + } , 23usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . ol_flags as * const _ as + usize } , 24usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . rx_descriptor_fields1 as * + const _ as usize } , 32usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . pkt_len as * const _ as + usize } , 36usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . data_len as * const _ as + usize } , 40usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . vlan_tci as * const _ as + usize } , 42usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . hash as * const _ as usize + } , 44usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . seqn as * const _ as usize + } , 52usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . vlan_tci_outer as * const + _ as usize } , 56usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . cacheline1 as * const _ as + usize } , 64usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . pool as * const _ as usize + } , 72usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . next as * const _ as usize + } , 80usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . priv_size as * const _ as + usize } , 96usize); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_mbuf ) ) . timesync as * const _ as + usize } , 98usize); +} +impl Clone for rte_mbuf { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/method-mangling.rs b/tests/expectations/tests/method-mangling.rs index 3b5107a8f8..99a6e9b896 100644 --- a/tests/expectations/tests/method-mangling.rs +++ b/tests/expectations/tests/method-mangling.rs @@ -12,7 +12,7 @@ pub struct Foo { #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } extern "C" { #[link_name = "_ZN3Foo4typeEv"] diff --git a/tests/expectations/tests/module-whitelisted.rs b/tests/expectations/tests/module-whitelisted.rs index 6f88c54b1d..9cf4b05103 100644 --- a/tests/expectations/tests/module-whitelisted.rs +++ b/tests/expectations/tests/module-whitelisted.rs @@ -15,7 +15,7 @@ pub mod root { #[test] fn bindgen_test_layout_Test() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Test { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/msvc-no-usr.rs b/tests/expectations/tests/msvc-no-usr.rs index 8cab8cdc2f..e2f9a31913 100644 --- a/tests/expectations/tests/msvc-no-usr.rs +++ b/tests/expectations/tests/msvc-no-usr.rs @@ -12,7 +12,10 @@ pub struct A { #[test] fn bindgen_test_layout_A() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const A ) ) . foo as * const _ as usize } , + 0usize); } impl Clone for A { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs b/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs index 5e9cf5224c..45537eefa5 100644 --- a/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs +++ b/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs @@ -12,7 +12,7 @@ pub struct Foo { #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Foo { fn clone(&self) -> Self { *self } @@ -25,7 +25,7 @@ pub struct Bar { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } @@ -38,7 +38,7 @@ pub struct Baz { #[test] fn bindgen_test_layout_Baz() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Baz { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/mutable.rs b/tests/expectations/tests/mutable.rs index 0d0d6ea341..01ef8e8b84 100644 --- a/tests/expectations/tests/mutable.rs +++ b/tests/expectations/tests/mutable.rs @@ -13,7 +13,13 @@ pub struct C { #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C ) ) . m_member as * const _ as usize } + , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C ) ) . m_other as * const _ as usize } , + 4usize); } impl Clone for C { fn clone(&self) -> Self { *self } @@ -26,7 +32,10 @@ pub struct NonCopiable { #[test] fn bindgen_test_layout_NonCopiable() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const NonCopiable ) ) . m_member as * const _ + as usize } , 0usize); } #[repr(C)] #[derive(Debug)] @@ -37,6 +46,9 @@ pub struct NonCopiableWithNonCopiableMutableMember { fn bindgen_test_layout_NonCopiableWithNonCopiableMutableMember() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() - , 4usize); + assert_eq! (::std::mem::align_of::() + , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const NonCopiableWithNonCopiableMutableMember ) + ) . m_member as * const _ as usize } , 0usize); } diff --git a/tests/expectations/tests/namespace.rs b/tests/expectations/tests/namespace.rs index ece4e3412e..4958b51996 100644 --- a/tests/expectations/tests/namespace.rs +++ b/tests/expectations/tests/namespace.rs @@ -35,7 +35,10 @@ pub mod root { #[test] fn bindgen_test_layout_A() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const A ) ) . b as * const _ as usize } + , 0usize); } extern "C" { #[link_name = "_ZN12_GLOBAL__N_11A20lets_hope_this_worksEv"] diff --git a/tests/expectations/tests/nested.rs b/tests/expectations/tests/nested.rs index fdd435aaba..5b9ce5a65e 100644 --- a/tests/expectations/tests/nested.rs +++ b/tests/expectations/tests/nested.rs @@ -12,7 +12,10 @@ pub struct Calc { #[test] fn bindgen_test_layout_Calc() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Calc ) ) . w as * const _ as usize } , + 0usize); } impl Clone for Calc { fn clone(&self) -> Self { *self } @@ -36,7 +39,7 @@ pub struct Test_Size_Dimension { #[test] fn bindgen_test_layout_Test_Size_Dimension() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); } impl Clone for Test_Size_Dimension { fn clone(&self) -> Self { *self } @@ -44,7 +47,13 @@ impl Clone for Test_Size_Dimension { #[test] fn bindgen_test_layout_Test_Size() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Test_Size ) ) . mWidth as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Test_Size ) ) . mHeight as * const _ as + usize } , 4usize); } impl Clone for Test_Size { fn clone(&self) -> Self { *self } @@ -52,7 +61,7 @@ impl Clone for Test_Size { #[test] fn bindgen_test_layout_Test() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Test { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/nested_vtable.rs b/tests/expectations/tests/nested_vtable.rs index d74ad55f36..e0d81d187a 100644 --- a/tests/expectations/tests/nested_vtable.rs +++ b/tests/expectations/tests/nested_vtable.rs @@ -15,7 +15,7 @@ pub struct nsISupports { #[test] fn bindgen_test_layout_nsISupports() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); } impl Clone for nsISupports { fn clone(&self) -> Self { *self } @@ -28,7 +28,7 @@ pub struct nsIRunnable { #[test] fn bindgen_test_layout_nsIRunnable() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); } impl Clone for nsIRunnable { fn clone(&self) -> Self { *self } @@ -41,7 +41,7 @@ pub struct Runnable { #[test] fn bindgen_test_layout_Runnable() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); } impl Clone for Runnable { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/nested_within_namespace.rs b/tests/expectations/tests/nested_within_namespace.rs index 0c9c31ef74..355ab100da 100644 --- a/tests/expectations/tests/nested_within_namespace.rs +++ b/tests/expectations/tests/nested_within_namespace.rs @@ -23,7 +23,10 @@ pub mod root { #[test] fn bindgen_test_layout_Bar_Baz() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar_Baz ) ) . foo as * const _ as + usize } , 0usize); } impl Clone for Bar_Baz { fn clone(&self) -> Self { *self } @@ -31,7 +34,10 @@ pub mod root { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar ) ) . foo as * const _ as + usize } , 0usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } @@ -44,7 +50,10 @@ pub mod root { #[test] fn bindgen_test_layout_Baz() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Baz ) ) . baz as * const _ as + usize } , 0usize); } impl Clone for Baz { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/no-comments.rs b/tests/expectations/tests/no-comments.rs index 8a4371e7a1..947ed5908e 100644 --- a/tests/expectations/tests/no-comments.rs +++ b/tests/expectations/tests/no-comments.rs @@ -12,7 +12,10 @@ pub struct Foo { #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Foo ) ) . s as * const _ as usize } , + 0usize); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/no-derive-debug.rs b/tests/expectations/tests/no-derive-debug.rs index e45b267823..9c35f78e23 100644 --- a/tests/expectations/tests/no-derive-debug.rs +++ b/tests/expectations/tests/no-derive-debug.rs @@ -19,7 +19,13 @@ pub struct bar { #[test] fn bindgen_test_layout_bar() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const bar ) ) . foo as * const _ as usize } , + 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const bar ) ) . baz as * const _ as usize } , + 4usize); } impl Clone for bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/no-recursive-whitelisting.rs b/tests/expectations/tests/no-recursive-whitelisting.rs index 5bc2166503..249090195b 100644 --- a/tests/expectations/tests/no-recursive-whitelisting.rs +++ b/tests/expectations/tests/no-recursive-whitelisting.rs @@ -13,7 +13,10 @@ pub struct Foo { #[test] fn bindgen_test_layout_Foo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Foo ) ) . baz as * const _ as usize } , + 0usize); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/no-std.rs b/tests/expectations/tests/no-std.rs index f50a889d4c..110255ad9a 100644 --- a/tests/expectations/tests/no-std.rs +++ b/tests/expectations/tests/no-std.rs @@ -16,7 +16,16 @@ pub struct foo { #[test] fn bindgen_test_layout_foo() { assert_eq!(::core::mem::size_of::() , 16usize); - assert_eq!(::core::mem::align_of::() , 8usize); + assert_eq! (::core::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , + 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . b as * const _ as usize } , + 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , + 8usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/objc_interface_type.rs b/tests/expectations/tests/objc_interface_type.rs index 2d68ee5078..1730f824b2 100644 --- a/tests/expectations/tests/objc_interface_type.rs +++ b/tests/expectations/tests/objc_interface_type.rs @@ -19,7 +19,10 @@ pub struct FooStruct { #[test] fn bindgen_test_layout_FooStruct() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const FooStruct ) ) . foo as * const _ as usize + } , 0usize); } impl Clone for FooStruct { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/only_bitfields.rs b/tests/expectations/tests/only_bitfields.rs index 68968826b1..97363a8725 100644 --- a/tests/expectations/tests/only_bitfields.rs +++ b/tests/expectations/tests/only_bitfields.rs @@ -12,7 +12,7 @@ pub struct C { #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for C { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/opaque-tracing.rs b/tests/expectations/tests/opaque-tracing.rs index 7dcc4eefaa..86e01665f8 100644 --- a/tests/expectations/tests/opaque-tracing.rs +++ b/tests/expectations/tests/opaque-tracing.rs @@ -12,7 +12,7 @@ pub struct Container { #[test] fn bindgen_test_layout_Container() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); } impl Clone for Container { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/opaque_in_struct.rs b/tests/expectations/tests/opaque_in_struct.rs index c94caa1fc5..427692fdc4 100644 --- a/tests/expectations/tests/opaque_in_struct.rs +++ b/tests/expectations/tests/opaque_in_struct.rs @@ -13,7 +13,7 @@ pub struct opaque { #[test] fn bindgen_test_layout_opaque() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); } impl Clone for opaque { fn clone(&self) -> Self { *self } @@ -26,7 +26,10 @@ pub struct container { #[test] fn bindgen_test_layout_container() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const container ) ) . contained as * const _ as + usize } , 0usize); } impl Clone for container { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/opaque_pointer.rs b/tests/expectations/tests/opaque_pointer.rs index 118a1782b1..0dee14df25 100644 --- a/tests/expectations/tests/opaque_pointer.rs +++ b/tests/expectations/tests/opaque_pointer.rs @@ -15,7 +15,7 @@ pub struct OtherOpaque { #[test] fn bindgen_test_layout_OtherOpaque() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); } impl Clone for OtherOpaque { fn clone(&self) -> Self { *self } @@ -38,7 +38,16 @@ pub struct WithOpaquePtr { #[test] fn bindgen_test_layout_WithOpaquePtr() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithOpaquePtr ) ) . whatever as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithOpaquePtr ) ) . other as * const _ as + usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithOpaquePtr ) ) . t as * const _ as + usize } , 12usize); } impl Clone for WithOpaquePtr { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/private.rs b/tests/expectations/tests/private.rs index c4ac37d171..1379aa616b 100644 --- a/tests/expectations/tests/private.rs +++ b/tests/expectations/tests/private.rs @@ -14,7 +14,13 @@ pub struct HasPrivate { #[test] fn bindgen_test_layout_HasPrivate() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const HasPrivate ) ) . mNotPrivate as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const HasPrivate ) ) . mIsPrivate as * const _ + as usize } , 4usize); } impl Clone for HasPrivate { fn clone(&self) -> Self { *self } @@ -29,7 +35,13 @@ pub struct VeryPrivate { #[test] fn bindgen_test_layout_VeryPrivate() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const VeryPrivate ) ) . mIsPrivate as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const VeryPrivate ) ) . mIsAlsoPrivate as * + const _ as usize } , 4usize); } impl Clone for VeryPrivate { fn clone(&self) -> Self { *self } @@ -45,7 +57,13 @@ pub struct ContradictPrivate { #[test] fn bindgen_test_layout_ContradictPrivate() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const ContradictPrivate ) ) . mNotPrivate as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const ContradictPrivate ) ) . mIsPrivate as * + const _ as usize } , 4usize); } impl Clone for ContradictPrivate { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/public-dtor.rs b/tests/expectations/tests/public-dtor.rs index 851857eeaa..ce05f173e3 100644 --- a/tests/expectations/tests/public-dtor.rs +++ b/tests/expectations/tests/public-dtor.rs @@ -12,5 +12,5 @@ pub struct cv_String { #[test] fn bindgen_test_layout_cv_String() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } diff --git a/tests/expectations/tests/ref_argument_array.rs b/tests/expectations/tests/ref_argument_array.rs index c88492d778..28c8c00dda 100644 --- a/tests/expectations/tests/ref_argument_array.rs +++ b/tests/expectations/tests/ref_argument_array.rs @@ -16,7 +16,7 @@ pub struct nsID { #[test] fn bindgen_test_layout_nsID() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); } impl Clone for nsID { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/reparented_replacement.rs b/tests/expectations/tests/reparented_replacement.rs index 74ee229c15..72fc8563e9 100644 --- a/tests/expectations/tests/reparented_replacement.rs +++ b/tests/expectations/tests/reparented_replacement.rs @@ -19,7 +19,10 @@ pub mod root { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar ) ) . bazz as * const _ as + usize } , 0usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/replace_use.rs b/tests/expectations/tests/replace_use.rs index f4fee44209..201ec2fda8 100644 --- a/tests/expectations/tests/replace_use.rs +++ b/tests/expectations/tests/replace_use.rs @@ -21,7 +21,10 @@ pub struct Test { #[test] fn bindgen_test_layout_Test() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . a as * const _ as usize } , + 0usize); } impl Clone for Test { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/same_struct_name_in_different_namespaces.rs b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs index dbf93daadb..859284d18d 100644 --- a/tests/expectations/tests/same_struct_name_in_different_namespaces.rs +++ b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs @@ -16,7 +16,13 @@ pub struct JS_shadow_Zone { #[test] fn bindgen_test_layout_JS_shadow_Zone() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const JS_shadow_Zone ) ) . x as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const JS_shadow_Zone ) ) . y as * const _ as + usize } , 4usize); } impl Clone for JS_shadow_Zone { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/size_t_template.rs b/tests/expectations/tests/size_t_template.rs index 78351ecc2e..66868178dc 100644 --- a/tests/expectations/tests/size_t_template.rs +++ b/tests/expectations/tests/size_t_template.rs @@ -12,7 +12,10 @@ pub struct C { #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C ) ) . arr as * const _ as usize } , + 0usize); } impl Clone for C { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_containing_forward_declared_struct.rs b/tests/expectations/tests/struct_containing_forward_declared_struct.rs index 388cc59592..d0b139d4bb 100644 --- a/tests/expectations/tests/struct_containing_forward_declared_struct.rs +++ b/tests/expectations/tests/struct_containing_forward_declared_struct.rs @@ -17,7 +17,10 @@ pub struct a_b { #[test] fn bindgen_test_layout_a_b() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const a_b ) ) . val_b as * const _ as usize } , + 0usize); } impl Clone for a_b { fn clone(&self) -> Self { *self } @@ -25,7 +28,10 @@ impl Clone for a_b { #[test] fn bindgen_test_layout_a() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const a ) ) . val_a as * const _ as usize } , + 0usize); } impl Clone for a { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_struct.rs b/tests/expectations/tests/struct_with_anon_struct.rs index 1c49675d53..b617fb291c 100644 --- a/tests/expectations/tests/struct_with_anon_struct.rs +++ b/tests/expectations/tests/struct_with_anon_struct.rs @@ -18,7 +18,13 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as + usize } , 4usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -26,7 +32,10 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , + 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_struct_array.rs b/tests/expectations/tests/struct_with_anon_struct_array.rs index 6e1c03158f..4235c14b25 100644 --- a/tests/expectations/tests/struct_with_anon_struct_array.rs +++ b/tests/expectations/tests/struct_with_anon_struct_array.rs @@ -19,7 +19,13 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as + usize } , 4usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -33,7 +39,13 @@ pub struct foo__bindgen_ty_2 { #[test] fn bindgen_test_layout_foo__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_2 ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_2 ) ) . b as * const _ as + usize } , 4usize); } impl Clone for foo__bindgen_ty_2 { fn clone(&self) -> Self { *self } @@ -41,7 +53,13 @@ impl Clone for foo__bindgen_ty_2 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 208usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , + 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . baz as * const _ as usize } , + 16usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_struct_pointer.rs b/tests/expectations/tests/struct_with_anon_struct_pointer.rs index aa77d4b693..5ffc975587 100644 --- a/tests/expectations/tests/struct_with_anon_struct_pointer.rs +++ b/tests/expectations/tests/struct_with_anon_struct_pointer.rs @@ -18,7 +18,13 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as + usize } , 4usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -26,7 +32,10 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , + 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_union.rs b/tests/expectations/tests/struct_with_anon_union.rs index 0d2e937ac3..02ccb8b1ee 100644 --- a/tests/expectations/tests/struct_with_anon_union.rs +++ b/tests/expectations/tests/struct_with_anon_union.rs @@ -43,7 +43,13 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as + usize } , 0usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -51,7 +57,10 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , + 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_unnamed_struct.rs b/tests/expectations/tests/struct_with_anon_unnamed_struct.rs index 1b77fccca4..224b711fc1 100644 --- a/tests/expectations/tests/struct_with_anon_unnamed_struct.rs +++ b/tests/expectations/tests/struct_with_anon_unnamed_struct.rs @@ -18,7 +18,13 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as + usize } , 4usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -26,7 +32,7 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_unnamed_union.rs b/tests/expectations/tests/struct_with_anon_unnamed_union.rs index 2914eb41ff..e8beffd7d5 100644 --- a/tests/expectations/tests/struct_with_anon_unnamed_union.rs +++ b/tests/expectations/tests/struct_with_anon_unnamed_union.rs @@ -43,7 +43,13 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as + usize } , 0usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -51,7 +57,7 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_bitfields.rs b/tests/expectations/tests/struct_with_bitfields.rs index 3fb83a47ed..11fa2d682f 100644 --- a/tests/expectations/tests/struct_with_bitfields.rs +++ b/tests/expectations/tests/struct_with_bitfields.rs @@ -15,7 +15,10 @@ pub struct bitfield { #[test] fn bindgen_test_layout_bitfield() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const bitfield ) ) . e as * const _ as usize } + , 4usize); } impl Clone for bitfield { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_derive_debug.rs b/tests/expectations/tests/struct_with_derive_debug.rs index 52906a8106..f34c67f4fe 100644 --- a/tests/expectations/tests/struct_with_derive_debug.rs +++ b/tests/expectations/tests/struct_with_derive_debug.rs @@ -12,7 +12,10 @@ pub struct LittleArray { #[test] fn bindgen_test_layout_LittleArray() { assert_eq!(::std::mem::size_of::() , 128usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const LittleArray ) ) . a as * const _ as usize + } , 0usize); } impl Clone for LittleArray { fn clone(&self) -> Self { *self } @@ -24,7 +27,10 @@ pub struct BigArray { #[test] fn bindgen_test_layout_BigArray() { assert_eq!(::std::mem::size_of::() , 132usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const BigArray ) ) . a as * const _ as usize } + , 0usize); } #[repr(C)] #[derive(Debug, Copy)] @@ -34,7 +40,10 @@ pub struct WithLittleArray { #[test] fn bindgen_test_layout_WithLittleArray() { assert_eq!(::std::mem::size_of::() , 128usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithLittleArray ) ) . a as * const _ as + usize } , 0usize); } impl Clone for WithLittleArray { fn clone(&self) -> Self { *self } @@ -46,5 +55,8 @@ pub struct WithBigArray { #[test] fn bindgen_test_layout_WithBigArray() { assert_eq!(::std::mem::size_of::() , 132usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithBigArray ) ) . a as * const _ as + usize } , 0usize); } diff --git a/tests/expectations/tests/struct_with_nesting.rs b/tests/expectations/tests/struct_with_nesting.rs index b3e0a5ca88..e69268d6d7 100644 --- a/tests/expectations/tests/struct_with_nesting.rs +++ b/tests/expectations/tests/struct_with_nesting.rs @@ -52,8 +52,14 @@ pub struct foo__bindgen_ty_1__bindgen_ty_1 { fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , - 2usize); + assert_eq! (::std::mem::align_of::() , + 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_1 ) ) . c1 + as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_1 ) ) . c2 + as * const _ as usize } , 2usize); } impl Clone for foo__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -70,8 +76,20 @@ pub struct foo__bindgen_ty_1__bindgen_ty_2 { fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , - 1usize); + assert_eq! (::std::mem::align_of::() , + 1usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . d1 + as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . d2 + as * const _ as usize } , 1usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . d3 + as * const _ as usize } , 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . d4 + as * const _ as usize } , 3usize); } impl Clone for foo__bindgen_ty_1__bindgen_ty_2 { fn clone(&self) -> Self { *self } @@ -79,7 +97,10 @@ impl Clone for foo__bindgen_ty_1__bindgen_ty_2 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as + usize } , 0usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -87,7 +108,10 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , + 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_packing.rs b/tests/expectations/tests/struct_with_packing.rs index 93fc3f11b2..51ff70242a 100644 --- a/tests/expectations/tests/struct_with_packing.rs +++ b/tests/expectations/tests/struct_with_packing.rs @@ -13,7 +13,11 @@ pub struct a { #[test] fn bindgen_test_layout_a() { assert_eq!(::std::mem::size_of::() , 3usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq! (unsafe { & ( * ( 0 as * const a ) ) . b as * const _ as usize + } , 0usize); + assert_eq! (unsafe { & ( * ( 0 as * const a ) ) . c as * const _ as usize + } , 1usize); } impl Clone for a { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_struct.rs b/tests/expectations/tests/struct_with_struct.rs index c8cdc927f0..cae2d677b3 100644 --- a/tests/expectations/tests/struct_with_struct.rs +++ b/tests/expectations/tests/struct_with_struct.rs @@ -18,7 +18,13 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . x as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . y as * const _ as + usize } , 4usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -26,7 +32,10 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , + 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/template.rs b/tests/expectations/tests/template.rs index 22e5a08774..800451420b 100644 --- a/tests/expectations/tests/template.rs +++ b/tests/expectations/tests/template.rs @@ -45,7 +45,10 @@ pub struct RootedContainer { #[test] fn bindgen_test_layout_RootedContainer() { assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const RootedContainer ) ) . root as * const _ + as usize } , 0usize); } impl Clone for RootedContainer { fn clone(&self) -> Self { *self } @@ -64,7 +67,10 @@ pub struct PODButContainsDtor { #[test] fn bindgen_test_layout_PODButContainsDtor() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const PODButContainsDtor ) ) . member as * + const _ as usize } , 0usize); } /**
*/ #[repr(C)] @@ -80,7 +86,10 @@ pub struct POD { #[test] fn bindgen_test_layout_POD() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const POD ) ) . opaque_member as * const _ as + usize } , 0usize); } impl Clone for POD { fn clone(&self) -> Self { *self } @@ -119,7 +128,7 @@ pub struct Untemplated { #[test] fn bindgen_test_layout_Untemplated() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Untemplated { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/type-referenced-by-whitelisted-function.rs b/tests/expectations/tests/type-referenced-by-whitelisted-function.rs index c968650115..0fd411d2ab 100644 --- a/tests/expectations/tests/type-referenced-by-whitelisted-function.rs +++ b/tests/expectations/tests/type-referenced-by-whitelisted-function.rs @@ -12,7 +12,10 @@ pub struct dl_phdr_info { #[test] fn bindgen_test_layout_dl_phdr_info() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const dl_phdr_info ) ) . x as * const _ as + usize } , 0usize); } impl Clone for dl_phdr_info { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/type_alias_template_specialized.rs b/tests/expectations/tests/type_alias_template_specialized.rs index 11813bc6a2..d898561de7 100644 --- a/tests/expectations/tests/type_alias_template_specialized.rs +++ b/tests/expectations/tests/type_alias_template_specialized.rs @@ -12,7 +12,10 @@ pub struct Rooted { #[test] fn bindgen_test_layout_Rooted() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Rooted ) ) . ptr as * const _ as usize } + , 0usize); } impl Clone for Rooted { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/typeref.rs b/tests/expectations/tests/typeref.rs index 1188393dd3..1153374fea 100644 --- a/tests/expectations/tests/typeref.rs +++ b/tests/expectations/tests/typeref.rs @@ -36,7 +36,10 @@ pub struct nsFoo { #[test] fn bindgen_test_layout_nsFoo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const nsFoo ) ) . mBar as * const _ as usize } + , 0usize); } impl Clone for nsFoo { fn clone(&self) -> Self { *self } @@ -49,7 +52,10 @@ pub struct mozilla_FragmentOrURL { #[test] fn bindgen_test_layout_mozilla_FragmentOrURL() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq! (unsafe { + & ( * ( 0 as * const mozilla_FragmentOrURL ) ) . mIsLocalRef + as * const _ as usize } , 0usize); } impl Clone for mozilla_FragmentOrURL { fn clone(&self) -> Self { *self } @@ -62,7 +68,7 @@ pub struct mozilla_Position { #[test] fn bindgen_test_layout_mozilla_Position() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for mozilla_Position { fn clone(&self) -> Self { *self } @@ -89,7 +95,10 @@ pub struct Bar { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar ) ) . mFoo as * const _ as usize } , + 0usize); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union-in-ns.rs b/tests/expectations/tests/union-in-ns.rs index fa511e512f..b6cbfd8618 100644 --- a/tests/expectations/tests/union-in-ns.rs +++ b/tests/expectations/tests/union-in-ns.rs @@ -44,7 +44,10 @@ pub mod root { #[test] fn bindgen_test_layout_bar() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const bar ) ) . baz as * const _ as usize } + , 0usize); } impl Clone for bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_dtor.rs b/tests/expectations/tests/union_dtor.rs index 9be626ffa8..47bca484e6 100644 --- a/tests/expectations/tests/union_dtor.rs +++ b/tests/expectations/tests/union_dtor.rs @@ -38,5 +38,11 @@ pub struct UnionWithDtor { #[test] fn bindgen_test_layout_UnionWithDtor() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const UnionWithDtor ) ) . mFoo as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const UnionWithDtor ) ) . mBar as * const _ as + usize } , 0usize); } diff --git a/tests/expectations/tests/union_fields.rs b/tests/expectations/tests/union_fields.rs index 495e80f984..1dfe1ef1f5 100644 --- a/tests/expectations/tests/union_fields.rs +++ b/tests/expectations/tests/union_fields.rs @@ -39,7 +39,16 @@ pub struct _bindgen_ty_1 { #[test] fn bindgen_test_layout__bindgen_ty_1() { assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 8usize); - assert_eq!(::std::mem::align_of::<_bindgen_ty_1>() , 8usize); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . mInt as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . mFloat as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . mPointer as * const _ + as usize } , 0usize); } impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_anon_struct.rs b/tests/expectations/tests/union_with_anon_struct.rs index f0a2151223..6a3469dc14 100644 --- a/tests/expectations/tests/union_with_anon_struct.rs +++ b/tests/expectations/tests/union_with_anon_struct.rs @@ -43,7 +43,13 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as + usize } , 4usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -51,7 +57,10 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , + 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_anon_struct_bitfield.rs b/tests/expectations/tests/union_with_anon_struct_bitfield.rs index 548b0dc48a..af06fea780 100644 --- a/tests/expectations/tests/union_with_anon_struct_bitfield.rs +++ b/tests/expectations/tests/union_with_anon_struct_bitfield.rs @@ -43,7 +43,7 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -79,7 +79,10 @@ impl foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , + 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_anon_union.rs b/tests/expectations/tests/union_with_anon_union.rs index 9527855640..f5bb4dd95e 100644 --- a/tests/expectations/tests/union_with_anon_union.rs +++ b/tests/expectations/tests/union_with_anon_union.rs @@ -44,7 +44,13 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as + usize } , 0usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -52,7 +58,10 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , + 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_anon_unnamed_struct.rs b/tests/expectations/tests/union_with_anon_unnamed_struct.rs index 2d6fab97b7..4e5fe9152d 100644 --- a/tests/expectations/tests/union_with_anon_unnamed_struct.rs +++ b/tests/expectations/tests/union_with_anon_unnamed_struct.rs @@ -46,7 +46,19 @@ pub struct pixel__bindgen_ty_1 { #[test] fn bindgen_test_layout_pixel__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq! (unsafe { + & ( * ( 0 as * const pixel__bindgen_ty_1 ) ) . r as * const _ + as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const pixel__bindgen_ty_1 ) ) . g as * const _ + as usize } , 1usize); + assert_eq! (unsafe { + & ( * ( 0 as * const pixel__bindgen_ty_1 ) ) . b as * const _ + as usize } , 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const pixel__bindgen_ty_1 ) ) . a as * const _ + as usize } , 3usize); } impl Clone for pixel__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -54,7 +66,10 @@ impl Clone for pixel__bindgen_ty_1 { #[test] fn bindgen_test_layout_pixel() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const pixel ) ) . rgba as * const _ as usize } + , 0usize); } impl Clone for pixel { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_anon_unnamed_union.rs b/tests/expectations/tests/union_with_anon_unnamed_union.rs index eb214017fe..e9197ad7e2 100644 --- a/tests/expectations/tests/union_with_anon_unnamed_union.rs +++ b/tests/expectations/tests/union_with_anon_unnamed_union.rs @@ -45,7 +45,13 @@ pub struct foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 2usize); - assert_eq!(::std::mem::align_of::() , 2usize); + assert_eq! (::std::mem::align_of::() , 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . c as * const _ as + usize } , 0usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -53,7 +59,10 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , + 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_big_member.rs b/tests/expectations/tests/union_with_big_member.rs index b921f33c95..f055625944 100644 --- a/tests/expectations/tests/union_with_big_member.rs +++ b/tests/expectations/tests/union_with_big_member.rs @@ -38,7 +38,13 @@ pub struct WithBigArray { #[test] fn bindgen_test_layout_WithBigArray() { assert_eq!(::std::mem::size_of::() , 132usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithBigArray ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithBigArray ) ) . b as * const _ as + usize } , 0usize); } impl Clone for WithBigArray { fn clone(&self) -> Self { *self } @@ -53,7 +59,13 @@ pub struct WithBigArray2 { #[test] fn bindgen_test_layout_WithBigArray2() { assert_eq!(::std::mem::size_of::() , 36usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithBigArray2 ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithBigArray2 ) ) . b as * const _ as + usize } , 0usize); } impl Clone for WithBigArray2 { fn clone(&self) -> Self { *self } @@ -68,7 +80,13 @@ pub struct WithBigMember { #[test] fn bindgen_test_layout_WithBigMember() { assert_eq!(::std::mem::size_of::() , 132usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithBigMember ) ) . a as * const _ as + usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const WithBigMember ) ) . b as * const _ as + usize } , 0usize); } impl Clone for WithBigMember { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_nesting.rs b/tests/expectations/tests/union_with_nesting.rs index af9e442d10..819dff6ead 100644 --- a/tests/expectations/tests/union_with_nesting.rs +++ b/tests/expectations/tests/union_with_nesting.rs @@ -52,8 +52,14 @@ pub struct foo__bindgen_ty_1__bindgen_ty_1 { fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 2usize); - assert_eq!(::std::mem::align_of::() , - 2usize); + assert_eq! (::std::mem::align_of::() , + 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_1 ) ) . b1 + as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_1 ) ) . b2 + as * const _ as usize } , 0usize); } impl Clone for foo__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -69,8 +75,14 @@ pub struct foo__bindgen_ty_1__bindgen_ty_2 { fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , 2usize); - assert_eq!(::std::mem::align_of::() , - 2usize); + assert_eq! (::std::mem::align_of::() , + 2usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . c1 + as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . c2 + as * const _ as usize } , 0usize); } impl Clone for foo__bindgen_ty_1__bindgen_ty_2 { fn clone(&self) -> Self { *self } @@ -78,7 +90,7 @@ impl Clone for foo__bindgen_ty_1__bindgen_ty_2 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 2usize); + assert_eq! (::std::mem::align_of::() , 2usize); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -86,7 +98,10 @@ impl Clone for foo__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , + 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/unknown_attr.rs b/tests/expectations/tests/unknown_attr.rs index fd9cce4593..c58281e90e 100644 --- a/tests/expectations/tests/unknown_attr.rs +++ b/tests/expectations/tests/unknown_attr.rs @@ -8,7 +8,19 @@ #[derive(Debug, Copy)] pub struct _bindgen_ty_1 { pub __clang_max_align_nonce1: ::std::os::raw::c_longlong, + pub __bindgen_padding_0: u64, pub __clang_max_align_nonce2: f64, + pub __bindgen_padding_1: u64, +} +#[test] +fn bindgen_test_layout__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 32usize); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . + __clang_max_align_nonce1 as * const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . + __clang_max_align_nonce2 as * const _ as usize } , 16usize); } impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/use-core.rs b/tests/expectations/tests/use-core.rs index b0900f5fa6..023d9ee38f 100644 --- a/tests/expectations/tests/use-core.rs +++ b/tests/expectations/tests/use-core.rs @@ -15,7 +15,16 @@ pub struct foo { #[test] fn bindgen_test_layout_foo() { assert_eq!(::core::mem::size_of::() , 16usize); - assert_eq!(::core::mem::align_of::() , 8usize); + assert_eq! (::core::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , + 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . b as * const _ as usize } , + 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , + 8usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/var-tracing.rs b/tests/expectations/tests/var-tracing.rs index ef5660eb57..25d58aa48a 100644 --- a/tests/expectations/tests/var-tracing.rs +++ b/tests/expectations/tests/var-tracing.rs @@ -12,7 +12,10 @@ pub struct Bar { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Bar ) ) . m_baz as * const _ as usize } , + 0usize); } extern "C" { #[link_name = "_ZN3BarC1Ei"] @@ -41,7 +44,7 @@ extern "C" { #[test] fn bindgen_test_layout_Baz() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Baz { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/variadic-method.rs b/tests/expectations/tests/variadic-method.rs index 343010694b..c4e0d3c075 100644 --- a/tests/expectations/tests/variadic-method.rs +++ b/tests/expectations/tests/variadic-method.rs @@ -16,7 +16,7 @@ pub struct Bar { #[test] fn bindgen_test_layout_Bar() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } extern "C" { #[link_name = "_ZN3Bar3fooEPKcz"] diff --git a/tests/expectations/tests/vector.rs b/tests/expectations/tests/vector.rs index b8ca573511..9b63adb141 100644 --- a/tests/expectations/tests/vector.rs +++ b/tests/expectations/tests/vector.rs @@ -12,7 +12,10 @@ pub struct foo { #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const foo ) ) . mMember as * const _ as usize } + , 0usize); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/virtual_dtor.rs b/tests/expectations/tests/virtual_dtor.rs index 9571f084b9..07cc7ee7b5 100644 --- a/tests/expectations/tests/virtual_dtor.rs +++ b/tests/expectations/tests/virtual_dtor.rs @@ -15,5 +15,5 @@ pub struct nsSlots { #[test] fn bindgen_test_layout_nsSlots() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); } diff --git a/tests/expectations/tests/virtual_inheritance.rs b/tests/expectations/tests/virtual_inheritance.rs index f271223f94..e93d28640d 100644 --- a/tests/expectations/tests/virtual_inheritance.rs +++ b/tests/expectations/tests/virtual_inheritance.rs @@ -12,7 +12,10 @@ pub struct A { #[test] fn bindgen_test_layout_A() { assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const A ) ) . foo as * const _ as usize } , + 0usize); } impl Clone for A { fn clone(&self) -> Self { *self } @@ -29,7 +32,10 @@ pub struct B { #[test] fn bindgen_test_layout_B() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const B ) ) . bar as * const _ as usize } , + 8usize); } impl Clone for B { fn clone(&self) -> Self { *self } @@ -46,7 +52,10 @@ pub struct C { #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const C ) ) . baz as * const _ as usize } , + 8usize); } impl Clone for C { fn clone(&self) -> Self { *self } @@ -61,7 +70,7 @@ pub struct D { #[test] fn bindgen_test_layout_D() { assert_eq!(::std::mem::size_of::() , 40usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); } impl Clone for D { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/virtual_overloaded.rs b/tests/expectations/tests/virtual_overloaded.rs index 7833cdbfa4..b101a0a268 100644 --- a/tests/expectations/tests/virtual_overloaded.rs +++ b/tests/expectations/tests/virtual_overloaded.rs @@ -15,7 +15,7 @@ pub struct C { #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); } impl Clone for C { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/vtable_recursive_sig.rs b/tests/expectations/tests/vtable_recursive_sig.rs index ce62eeb0fc..8d69f212c0 100644 --- a/tests/expectations/tests/vtable_recursive_sig.rs +++ b/tests/expectations/tests/vtable_recursive_sig.rs @@ -12,7 +12,7 @@ pub struct Derived { #[test] fn bindgen_test_layout_Derived() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); } impl Clone for Derived { fn clone(&self) -> Self { *self } @@ -28,7 +28,7 @@ pub struct Base { #[test] fn bindgen_test_layout_Base() { assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq!(::std::mem::align_of::() , 8usize); + assert_eq! (::std::mem::align_of::() , 8usize); } impl Clone for Base { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/weird_bitfields.rs b/tests/expectations/tests/weird_bitfields.rs index 56ee76a59e..927b91f8ab 100644 --- a/tests/expectations/tests/weird_bitfields.rs +++ b/tests/expectations/tests/weird_bitfields.rs @@ -32,7 +32,43 @@ pub struct Weird { #[test] fn bindgen_test_layout_Weird() { assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq!(::std::mem::align_of::() , 4usize); + assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mStrokeDasharrayLength as * + const _ as usize } , 0usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mClipRule as * const _ as + usize } , 8usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mColorInterpolation as * + const _ as usize } , 9usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mColorInterpolationFilters as + * const _ as usize } , 10usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mFillRule as * const _ as + usize } , 11usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mImageRendering as * const _ + as usize } , 12usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mPaintOrder as * const _ as + usize } , 13usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mShapeRendering as * const _ + as usize } , 14usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mStrokeLinecap as * const _ + as usize } , 15usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mStrokeLinejoin as * const _ + as usize } , 16usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mTextAnchor as * const _ as + usize } , 17usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Weird ) ) . mTextRendering as * const _ + as usize } , 18usize); } impl Clone for Weird { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/what_is_going_on.rs b/tests/expectations/tests/what_is_going_on.rs index 6f1998d198..c4d54d05d1 100644 --- a/tests/expectations/tests/what_is_going_on.rs +++ b/tests/expectations/tests/what_is_going_on.rs @@ -12,7 +12,7 @@ pub struct UnknownUnits { #[test] fn bindgen_test_layout_UnknownUnits() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for UnknownUnits { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/whitelist-namespaces-basic.rs b/tests/expectations/tests/whitelist-namespaces-basic.rs index cbb12f6bbb..cfd9e5f3af 100644 --- a/tests/expectations/tests/whitelist-namespaces-basic.rs +++ b/tests/expectations/tests/whitelist-namespaces-basic.rs @@ -21,7 +21,7 @@ pub mod root { #[test] fn bindgen_test_layout_Helper() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Helper { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/whitelist-namespaces.rs b/tests/expectations/tests/whitelist-namespaces.rs index bc257af642..858167210a 100644 --- a/tests/expectations/tests/whitelist-namespaces.rs +++ b/tests/expectations/tests/whitelist-namespaces.rs @@ -21,7 +21,7 @@ pub mod root { #[test] fn bindgen_test_layout_Helper() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); } impl Clone for Helper { fn clone(&self) -> Self { *self } @@ -35,7 +35,10 @@ pub mod root { #[test] fn bindgen_test_layout_Test() { assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq!(::std::mem::align_of::() , 1usize); + assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . helper as * const _ as + usize } , 0usize); } impl Clone for Test { fn clone(&self) -> Self { *self } diff --git a/tests/headers/layout.h b/tests/headers/layout.h new file mode 100644 index 0000000000..d1822a04de --- /dev/null +++ b/tests/headers/layout.h @@ -0,0 +1,6 @@ +struct header +{ + char proto; + unsigned int size __attribute__ ((packed)); + unsigned char data[] __attribute__ ((aligned(8))); +} __attribute__ ((aligned, packed)); \ No newline at end of file diff --git a/tests/headers/layout_align.h b/tests/headers/layout_align.h new file mode 100644 index 0000000000..0201877e79 --- /dev/null +++ b/tests/headers/layout_align.h @@ -0,0 +1,20 @@ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +struct rte_kni_fifo { + volatile unsigned write; /**< Next position to be written*/ + volatile unsigned read; /**< Next position to be read */ + unsigned len; /**< Circular buffer length */ + unsigned elem_size; /**< Pointer size - for 32/64 bit OS */ + void *volatile buffer[]; /**< The buffer contains mbuf pointers */ +}; + +__extension__ +struct rte_eth_link { + uint32_t link_speed; /**< ETH_SPEED_NUM_ */ + uint16_t link_duplex : 1; /**< ETH_LINK_[HALF/FULL]_DUPLEX */ + uint16_t link_autoneg : 1; /**< ETH_LINK_SPEED_[AUTONEG/FIXED] */ + uint16_t link_status : 1; /**< ETH_LINK_[DOWN/UP] */ +} __attribute__((aligned(8))); /**< aligned for atomic64 read/write */ \ No newline at end of file diff --git a/tests/headers/layout_arp.h b/tests/headers/layout_arp.h new file mode 100644 index 0000000000..8682cbe0ee --- /dev/null +++ b/tests/headers/layout_arp.h @@ -0,0 +1,52 @@ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +#define ETHER_ADDR_LEN 6 /**< Length of Ethernet address. */ + +/** + * Ethernet address: + * A universally administered address is uniquely assigned to a device by its + * manufacturer. The first three octets (in transmission order) contain the + * Organizationally Unique Identifier (OUI). The following three (MAC-48 and + * EUI-48) octets are assigned by that organization with the only constraint + * of uniqueness. + * A locally administered address is assigned to a device by a network + * administrator and does not contain OUIs. + * See http://standards.ieee.org/regauth/groupmac/tutorial.html + */ +struct ether_addr { + uint8_t addr_bytes[ETHER_ADDR_LEN]; /**< Addr bytes in tx order */ +} __attribute__((__packed__)); + +/** + * ARP header IPv4 payload. + */ +struct arp_ipv4 { + struct ether_addr arp_sha; /**< sender hardware address */ + uint32_t arp_sip; /**< sender IP address */ + struct ether_addr arp_tha; /**< target hardware address */ + uint32_t arp_tip; /**< target IP address */ +} __attribute__((__packed__)); + +/** + * ARP header. + */ +struct arp_hdr { + uint16_t arp_hrd; /* format of hardware address */ +#define ARP_HRD_ETHER 1 /* ARP Ethernet address format */ + + uint16_t arp_pro; /* format of protocol address */ + uint8_t arp_hln; /* length of hardware address */ + uint8_t arp_pln; /* length of protocol address */ + uint16_t arp_op; /* ARP opcode (command) */ +#define ARP_OP_REQUEST 1 /* request to resolve address */ +#define ARP_OP_REPLY 2 /* response to previous request */ +#define ARP_OP_REVREQUEST 3 /* request proto addr given hardware */ +#define ARP_OP_REVREPLY 4 /* response giving protocol address */ +#define ARP_OP_INVREQUEST 8 /* request to identify peer */ +#define ARP_OP_INVREPLY 9 /* response identifying peer */ + + struct arp_ipv4 arp_data; +} __attribute__((__packed__)); \ No newline at end of file diff --git a/tests/headers/layout_array.h b/tests/headers/layout_array.h new file mode 100644 index 0000000000..4b99e0ed42 --- /dev/null +++ b/tests/headers/layout_array.h @@ -0,0 +1,109 @@ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +typedef long long size_t; + +#define RTE_CACHE_LINE_SIZE 64 + +/** + * Force alignment + */ +#define __rte_aligned(a) __attribute__((__aligned__(a))) + +/** + * Force alignment to cache line. + */ +#define __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE) + +#define RTE_MEMPOOL_OPS_NAMESIZE 32 /**< Max length of ops struct name. */ + +/** + * Prototype for implementation specific data provisioning function. + * + * The function should provide the implementation specific memory for + * for use by the other mempool ops functions in a given mempool ops struct. + * E.g. the default ops provides an instance of the rte_ring for this purpose. + * it will most likely point to a different type of data structure, and + * will be transparent to the application programmer. + * This function should set mp->pool_data. + */ +typedef int (*rte_mempool_alloc_t)(struct rte_mempool *mp); + +/** + * Free the opaque private data pointed to by mp->pool_data pointer. + */ +typedef void (*rte_mempool_free_t)(struct rte_mempool *mp); + +/** + * Enqueue an object into the external pool. + */ +typedef int (*rte_mempool_enqueue_t)(struct rte_mempool *mp, + void * const *obj_table, unsigned int n); + +/** + * Dequeue an object from the external pool. + */ +typedef int (*rte_mempool_dequeue_t)(struct rte_mempool *mp, + void **obj_table, unsigned int n); + +/** + * Return the number of available objects in the external pool. + */ +typedef unsigned (*rte_mempool_get_count)(const struct rte_mempool *mp); +/** Structure defining mempool operations structure */ +struct rte_mempool_ops { + char name[RTE_MEMPOOL_OPS_NAMESIZE]; /**< Name of mempool ops struct. */ + rte_mempool_alloc_t alloc; /**< Allocate private data. */ + rte_mempool_free_t free; /**< Free the external pool. */ + rte_mempool_enqueue_t enqueue; /**< Enqueue an object. */ + rte_mempool_dequeue_t dequeue; /**< Dequeue an object. */ + rte_mempool_get_count get_count; /**< Get qty of available objs. */ +} __rte_cache_aligned; + +#define RTE_MEMPOOL_MAX_OPS_IDX 16 /**< Max registered ops structs */ + +/** + * The rte_spinlock_t type. + */ +typedef struct { + volatile int locked; /**< lock status 0 = unlocked, 1 = locked */ +} rte_spinlock_t; + +/** + * Structure storing the table of registered ops structs, each of which contain + * the function pointers for the mempool ops functions. + * Each process has its own storage for this ops struct array so that + * the mempools can be shared across primary and secondary processes. + * The indices used to access the array are valid across processes, whereas + * any function pointers stored directly in the mempool struct would not be. + * This results in us simply having "ops_index" in the mempool struct. + */ +struct rte_mempool_ops_table { + rte_spinlock_t sl; /**< Spinlock for add/delete. */ + uint32_t num_ops; /**< Number of used ops structs in the table. */ + /** + * Storage for all possible ops structs. + */ + struct rte_mempool_ops ops[RTE_MEMPOOL_MAX_OPS_IDX]; +} __rte_cache_aligned; + + +/* Number of free lists per heap, grouped by size. */ +#define RTE_HEAP_NUM_FREELISTS 13 + +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +/** + * Structure to hold malloc heap + */ +struct malloc_heap { + rte_spinlock_t lock; + LIST_HEAD(, malloc_elem) free_head[RTE_HEAP_NUM_FREELISTS]; + unsigned alloc_count; + size_t total_size; +} __rte_cache_aligned; diff --git a/tests/headers/layout_cmdline_token.h b/tests/headers/layout_cmdline_token.h new file mode 100644 index 0000000000..34ebd017de --- /dev/null +++ b/tests/headers/layout_cmdline_token.h @@ -0,0 +1,63 @@ + +/** + * Stores a pointer to the ops struct, and the offset: the place to + * write the parsed result in the destination structure. + */ +struct cmdline_token_hdr { + struct cmdline_token_ops *ops; + unsigned int offset; +}; +typedef struct cmdline_token_hdr cmdline_parse_token_hdr_t; + +/** + * A token is defined by this structure. + * + * parse() takes the token as first argument, then the source buffer + * starting at the token we want to parse. The 3rd arg is a pointer + * where we store the parsed data (as binary). It returns the number of + * parsed chars on success and a negative value on error. + * + * complete_get_nb() returns the number of possible values for this + * token if completion is possible. If it is NULL or if it returns 0, + * no completion is possible. + * + * complete_get_elt() copy in dstbuf (the size is specified in the + * parameter) the i-th possible completion for this token. returns 0 + * on success or and a negative value on error. + * + * get_help() fills the dstbuf with the help for the token. It returns + * -1 on error and 0 on success. + */ +struct cmdline_token_ops { + /** parse(token ptr, buf, res pts, buf len) */ + int (*parse)(cmdline_parse_token_hdr_t *, const char *, void *, + unsigned int); + /** return the num of possible choices for this token */ + int (*complete_get_nb)(cmdline_parse_token_hdr_t *); + /** return the elt x for this token (token, idx, dstbuf, size) */ + int (*complete_get_elt)(cmdline_parse_token_hdr_t *, int, char *, + unsigned int); + /** get help for this token (token, dstbuf, size) */ + int (*get_help)(cmdline_parse_token_hdr_t *, char *, unsigned int); +}; + +enum cmdline_numtype { + UINT8 = 0, + UINT16, + UINT32, + UINT64, + INT8, + INT16, + INT32, + INT64 +}; + +struct cmdline_token_num_data { + enum cmdline_numtype type; +}; + +struct cmdline_token_num { + struct cmdline_token_hdr hdr; + struct cmdline_token_num_data num_data; +}; +typedef struct cmdline_token_num cmdline_parse_token_num_t; \ No newline at end of file diff --git a/tests/headers/layout_eth_conf.h b/tests/headers/layout_eth_conf.h new file mode 100644 index 0000000000..a742ee5f99 --- /dev/null +++ b/tests/headers/layout_eth_conf.h @@ -0,0 +1,427 @@ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +/** + * Simple flags are used for rte_eth_conf.rxmode.mq_mode. + */ +#define ETH_MQ_RX_RSS_FLAG 0x1 +#define ETH_MQ_RX_DCB_FLAG 0x2 +#define ETH_MQ_RX_VMDQ_FLAG 0x4 + +/* Definitions used for VMDQ and DCB functionality */ +#define ETH_VMDQ_MAX_VLAN_FILTERS 64 /**< Maximum nb. of VMDQ vlan filters. */ +#define ETH_DCB_NUM_USER_PRIORITIES 8 /**< Maximum nb. of DCB priorities. */ +#define ETH_VMDQ_DCB_NUM_QUEUES 128 /**< Maximum nb. of VMDQ DCB queues. */ +#define ETH_DCB_NUM_QUEUES 128 /**< Maximum nb. of DCB queues. */ + +/** + * A set of values to identify what method is to be used to route + * packets to multiple queues. + */ +enum rte_eth_rx_mq_mode { + /** None of DCB,RSS or VMDQ mode */ + ETH_MQ_RX_NONE = 0, + + /** For RX side, only RSS is on */ + ETH_MQ_RX_RSS = ETH_MQ_RX_RSS_FLAG, + /** For RX side,only DCB is on. */ + ETH_MQ_RX_DCB = ETH_MQ_RX_DCB_FLAG, + /** Both DCB and RSS enable */ + ETH_MQ_RX_DCB_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_DCB_FLAG, + + /** Only VMDQ, no RSS nor DCB */ + ETH_MQ_RX_VMDQ_ONLY = ETH_MQ_RX_VMDQ_FLAG, + /** RSS mode with VMDQ */ + ETH_MQ_RX_VMDQ_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_VMDQ_FLAG, + /** Use VMDQ+DCB to route traffic to queues */ + ETH_MQ_RX_VMDQ_DCB = ETH_MQ_RX_VMDQ_FLAG | ETH_MQ_RX_DCB_FLAG, + /** Enable both VMDQ and DCB in VMDq */ + ETH_MQ_RX_VMDQ_DCB_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_DCB_FLAG | + ETH_MQ_RX_VMDQ_FLAG, +}; + +/** + * A structure used to configure the RX features of an Ethernet port. + */ +struct rte_eth_rxmode { + /** The multi-queue packet distribution mode to be used, e.g. RSS. */ + enum rte_eth_rx_mq_mode mq_mode; + uint32_t max_rx_pkt_len; /**< Only used if jumbo_frame enabled. */ + uint16_t split_hdr_size; /**< hdr buf size (header_split enabled).*/ + __extension__ + uint16_t header_split : 1, /**< Header Split enable. */ + hw_ip_checksum : 1, /**< IP/UDP/TCP checksum offload enable. */ + hw_vlan_filter : 1, /**< VLAN filter enable. */ + hw_vlan_strip : 1, /**< VLAN strip enable. */ + hw_vlan_extend : 1, /**< Extended VLAN enable. */ + jumbo_frame : 1, /**< Jumbo Frame Receipt enable. */ + hw_strip_crc : 1, /**< Enable CRC stripping by hardware. */ + enable_scatter : 1, /**< Enable scatter packets rx handler */ + enable_lro : 1; /**< Enable LRO */ +}; + +/** + * A set of values to identify what method is to be used to transmit + * packets using multi-TCs. + */ +enum rte_eth_tx_mq_mode { + ETH_MQ_TX_NONE = 0, /**< It is in neither DCB nor VT mode. */ + ETH_MQ_TX_DCB, /**< For TX side,only DCB is on. */ + ETH_MQ_TX_VMDQ_DCB, /**< For TX side,both DCB and VT is on. */ + ETH_MQ_TX_VMDQ_ONLY, /**< Only VT on, no DCB */ +}; + +/** + * A structure used to configure the TX features of an Ethernet port. + */ +struct rte_eth_txmode { + enum rte_eth_tx_mq_mode mq_mode; /**< TX multi-queues mode. */ + + /* For i40e specifically */ + uint16_t pvid; + __extension__ + uint8_t hw_vlan_reject_tagged : 1, + /**< If set, reject sending out tagged pkts */ + hw_vlan_reject_untagged : 1, + /**< If set, reject sending out untagged pkts */ + hw_vlan_insert_pvid : 1; + /**< If set, enable port based VLAN insertion */ +}; + +/** + * A structure used to configure the Receive Side Scaling (RSS) feature + * of an Ethernet port. + * If not NULL, the *rss_key* pointer of the *rss_conf* structure points + * to an array holding the RSS key to use for hashing specific header + * fields of received packets. The length of this array should be indicated + * by *rss_key_len* below. Otherwise, a default random hash key is used by + * the device driver. + * + * The *rss_key_len* field of the *rss_conf* structure indicates the length + * in bytes of the array pointed by *rss_key*. To be compatible, this length + * will be checked in i40e only. Others assume 40 bytes to be used as before. + * + * The *rss_hf* field of the *rss_conf* structure indicates the different + * types of IPv4/IPv6 packets to which the RSS hashing must be applied. + * Supplying an *rss_hf* equal to zero disables the RSS feature. + */ +struct rte_eth_rss_conf { + uint8_t *rss_key; /**< If not NULL, 40-byte hash key. */ + uint8_t rss_key_len; /**< hash key length in bytes. */ + uint64_t rss_hf; /**< Hash functions to apply - see below. */ +}; + +/** + * This enum indicates the possible number of traffic classes + * in DCB configratioins + */ +enum rte_eth_nb_tcs { + ETH_4_TCS = 4, /**< 4 TCs with DCB. */ + ETH_8_TCS = 8 /**< 8 TCs with DCB. */ +}; + +/** + * This enum indicates the possible number of queue pools + * in VMDQ configurations. + */ +enum rte_eth_nb_pools { + ETH_8_POOLS = 8, /**< 8 VMDq pools. */ + ETH_16_POOLS = 16, /**< 16 VMDq pools. */ + ETH_32_POOLS = 32, /**< 32 VMDq pools. */ + ETH_64_POOLS = 64 /**< 64 VMDq pools. */ +}; + +/** + * A structure used to configure the VMDQ+DCB feature + * of an Ethernet port. + * + * Using this feature, packets are routed to a pool of queues, based + * on the vlan id in the vlan tag, and then to a specific queue within + * that pool, using the user priority vlan tag field. + * + * A default pool may be used, if desired, to route all traffic which + * does not match the vlan filter rules. + */ +struct rte_eth_vmdq_dcb_conf { + enum rte_eth_nb_pools nb_queue_pools; /**< With DCB, 16 or 32 pools */ + uint8_t enable_default_pool; /**< If non-zero, use a default pool */ + uint8_t default_pool; /**< The default pool, if applicable */ + uint8_t nb_pool_maps; /**< We can have up to 64 filters/mappings */ + struct { + uint16_t vlan_id; /**< The vlan id of the received frame */ + uint64_t pools; /**< Bitmask of pools for packet rx */ + } pool_map[ETH_VMDQ_MAX_VLAN_FILTERS]; /**< VMDq vlan pool maps. */ + uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES]; + /**< Selects a queue in a pool */ +}; + +/* This structure may be extended in future. */ +struct rte_eth_dcb_rx_conf { + enum rte_eth_nb_tcs nb_tcs; /**< Possible DCB TCs, 4 or 8 TCs */ + /** Traffic class each UP mapped to. */ + uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES]; +}; + +struct rte_eth_vmdq_dcb_tx_conf { + enum rte_eth_nb_pools nb_queue_pools; /**< With DCB, 16 or 32 pools. */ + /** Traffic class each UP mapped to. */ + uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES]; +}; + +struct rte_eth_dcb_tx_conf { + enum rte_eth_nb_tcs nb_tcs; /**< Possible DCB TCs, 4 or 8 TCs. */ + /** Traffic class each UP mapped to. */ + uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES]; +}; + +struct rte_eth_vmdq_tx_conf { + enum rte_eth_nb_pools nb_queue_pools; /**< VMDq mode, 64 pools. */ +}; + +struct rte_eth_vmdq_rx_conf { + enum rte_eth_nb_pools nb_queue_pools; /**< VMDq only mode, 8 or 64 pools */ + uint8_t enable_default_pool; /**< If non-zero, use a default pool */ + uint8_t default_pool; /**< The default pool, if applicable */ + uint8_t enable_loop_back; /**< Enable VT loop back */ + uint8_t nb_pool_maps; /**< We can have up to 64 filters/mappings */ + uint32_t rx_mode; /**< Flags from ETH_VMDQ_ACCEPT_* */ + struct { + uint16_t vlan_id; /**< The vlan id of the received frame */ + uint64_t pools; /**< Bitmask of pools for packet rx */ + } pool_map[ETH_VMDQ_MAX_VLAN_FILTERS]; /**< VMDq vlan pool maps. */ +}; + +/** + * Flow Director setting modes: none, signature or perfect. + */ +enum rte_fdir_mode { + RTE_FDIR_MODE_NONE = 0, /**< Disable FDIR support. */ + RTE_FDIR_MODE_SIGNATURE, /**< Enable FDIR signature filter mode. */ + RTE_FDIR_MODE_PERFECT, /**< Enable FDIR perfect filter mode. */ + RTE_FDIR_MODE_PERFECT_MAC_VLAN, /**< Enable FDIR filter mode - MAC VLAN. */ + RTE_FDIR_MODE_PERFECT_TUNNEL, /**< Enable FDIR filter mode - tunnel. */ +}; + +/** + * Memory space that can be configured to store Flow Director filters + * in the board memory. + */ +enum rte_fdir_pballoc_type { + RTE_FDIR_PBALLOC_64K = 0, /**< 64k. */ + RTE_FDIR_PBALLOC_128K, /**< 128k. */ + RTE_FDIR_PBALLOC_256K, /**< 256k. */ +}; + +/** + * Select report mode of FDIR hash information in RX descriptors. + */ +enum rte_fdir_status_mode { + RTE_FDIR_NO_REPORT_STATUS = 0, /**< Never report FDIR hash. */ + RTE_FDIR_REPORT_STATUS, /**< Only report FDIR hash for matching pkts. */ + RTE_FDIR_REPORT_STATUS_ALWAYS, /**< Always report FDIR hash. */ +}; + +/** + * A structure used to define the input for IPV4 flow + */ +struct rte_eth_ipv4_flow { + uint32_t src_ip; /**< IPv4 source address in big endian. */ + uint32_t dst_ip; /**< IPv4 destination address in big endian. */ + uint8_t tos; /**< Type of service to match. */ + uint8_t ttl; /**< Time to live to match. */ + uint8_t proto; /**< Protocol, next header in big endian. */ +}; + +/** + * A structure used to define the input for IPV6 flow + */ +struct rte_eth_ipv6_flow { + uint32_t src_ip[4]; /**< IPv6 source address in big endian. */ + uint32_t dst_ip[4]; /**< IPv6 destination address in big endian. */ + uint8_t tc; /**< Traffic class to match. */ + uint8_t proto; /**< Protocol, next header to match. */ + uint8_t hop_limits; /**< Hop limits to match. */ +}; + +/** + * A structure used to configure FDIR masks that are used by the device + * to match the various fields of RX packet headers. + */ +struct rte_eth_fdir_masks { + uint16_t vlan_tci_mask; /**< Bit mask for vlan_tci in big endian */ + /** Bit mask for ipv4 flow in big endian. */ + struct rte_eth_ipv4_flow ipv4_mask; + /** Bit maks for ipv6 flow in big endian. */ + struct rte_eth_ipv6_flow ipv6_mask; + /** Bit mask for L4 source port in big endian. */ + uint16_t src_port_mask; + /** Bit mask for L4 destination port in big endian. */ + uint16_t dst_port_mask; + /** 6 bit mask for proper 6 bytes of Mac address, bit 0 matches the + first byte on the wire */ + uint8_t mac_addr_byte_mask; + /** Bit mask for tunnel ID in big endian. */ + uint32_t tunnel_id_mask; + uint8_t tunnel_type_mask; /**< 1 - Match tunnel type, + 0 - Ignore tunnel type. */ +}; + +/** + * Payload type + */ +enum rte_eth_payload_type { + RTE_ETH_PAYLOAD_UNKNOWN = 0, + RTE_ETH_RAW_PAYLOAD, + RTE_ETH_L2_PAYLOAD, + RTE_ETH_L3_PAYLOAD, + RTE_ETH_L4_PAYLOAD, + RTE_ETH_PAYLOAD_MAX = 8, +}; + +#define RTE_ETH_FDIR_MAX_FLEXLEN 16 /**< Max length of flexbytes. */ +#define RTE_ETH_INSET_SIZE_MAX 128 /**< Max length of input set. */ + +/** + * A structure used to select bytes extracted from the protocol layers to + * flexible payload for filter + */ +struct rte_eth_flex_payload_cfg { + enum rte_eth_payload_type type; /**< Payload type */ + uint16_t src_offset[RTE_ETH_FDIR_MAX_FLEXLEN]; + /**< Offset in bytes from the beginning of packet's payload + src_offset[i] indicates the flexbyte i's offset in original + packet payload. This value should be less than + flex_payload_limit in struct rte_eth_fdir_info.*/ +}; + +/** + * A structure used to define FDIR masks for flexible payload + * for each flow type + */ +struct rte_eth_fdir_flex_mask { + uint16_t flow_type; + uint8_t mask[RTE_ETH_FDIR_MAX_FLEXLEN]; + /**< Mask for the whole flexible payload */ +}; + + +/* + * A packet can be identified by hardware as different flow types. Different + * NIC hardwares may support different flow types. + * Basically, the NIC hardware identifies the flow type as deep protocol as + * possible, and exclusively. For example, if a packet is identified as + * 'RTE_ETH_FLOW_NONFRAG_IPV4_TCP', it will not be any of other flow types, + * though it is an actual IPV4 packet. + * Note that the flow types are used to define RSS offload types in + * rte_ethdev.h. + */ +#define RTE_ETH_FLOW_UNKNOWN 0 +#define RTE_ETH_FLOW_RAW 1 +#define RTE_ETH_FLOW_IPV4 2 +#define RTE_ETH_FLOW_FRAG_IPV4 3 +#define RTE_ETH_FLOW_NONFRAG_IPV4_TCP 4 +#define RTE_ETH_FLOW_NONFRAG_IPV4_UDP 5 +#define RTE_ETH_FLOW_NONFRAG_IPV4_SCTP 6 +#define RTE_ETH_FLOW_NONFRAG_IPV4_OTHER 7 +#define RTE_ETH_FLOW_IPV6 8 +#define RTE_ETH_FLOW_FRAG_IPV6 9 +#define RTE_ETH_FLOW_NONFRAG_IPV6_TCP 10 +#define RTE_ETH_FLOW_NONFRAG_IPV6_UDP 11 +#define RTE_ETH_FLOW_NONFRAG_IPV6_SCTP 12 +#define RTE_ETH_FLOW_NONFRAG_IPV6_OTHER 13 +#define RTE_ETH_FLOW_L2_PAYLOAD 14 +#define RTE_ETH_FLOW_IPV6_EX 15 +#define RTE_ETH_FLOW_IPV6_TCP_EX 16 +#define RTE_ETH_FLOW_IPV6_UDP_EX 17 +#define RTE_ETH_FLOW_PORT 18 + /**< Consider device port number as a flow differentiator */ +#define RTE_ETH_FLOW_VXLAN 19 /**< VXLAN protocol based flow */ +#define RTE_ETH_FLOW_GENEVE 20 /**< GENEVE protocol based flow */ +#define RTE_ETH_FLOW_NVGRE 21 /**< NVGRE protocol based flow */ +#define RTE_ETH_FLOW_MAX 22 + +/** + * A structure used to define all flexible payload related setting + * include flex payload and flex mask + */ +struct rte_eth_fdir_flex_conf { + uint16_t nb_payloads; /**< The number of following payload cfg */ + uint16_t nb_flexmasks; /**< The number of following mask */ + struct rte_eth_flex_payload_cfg flex_set[RTE_ETH_PAYLOAD_MAX]; + /**< Flex payload configuration for each payload type */ + struct rte_eth_fdir_flex_mask flex_mask[RTE_ETH_FLOW_MAX]; + /**< Flex mask configuration for each flow type */ +}; + +/** + * A structure used to configure the Flow Director (FDIR) feature + * of an Ethernet port. + * + * If mode is RTE_FDIR_DISABLE, the pballoc value is ignored. + */ +struct rte_fdir_conf { + enum rte_fdir_mode mode; /**< Flow Director mode. */ + enum rte_fdir_pballoc_type pballoc; /**< Space for FDIR filters. */ + enum rte_fdir_status_mode status; /**< How to report FDIR hash. */ + /** RX queue of packets matching a "drop" filter in perfect mode. */ + uint8_t drop_queue; + struct rte_eth_fdir_masks mask; + struct rte_eth_fdir_flex_conf flex_conf; + /**< Flex payload configuration. */ +}; + +/** + * A structure used to enable/disable specific device interrupts. + */ +struct rte_intr_conf { + /** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */ + uint16_t lsc; + /** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */ + uint16_t rxq; +}; + +/** + * A structure used to configure an Ethernet port. + * Depending upon the RX multi-queue mode, extra advanced + * configuration settings may be needed. + */ +struct rte_eth_conf { + uint32_t link_speeds; /**< bitmap of ETH_LINK_SPEED_XXX of speeds to be + used. ETH_LINK_SPEED_FIXED disables link + autonegotiation, and a unique speed shall be + set. Otherwise, the bitmap defines the set of + speeds to be advertised. If the special value + ETH_LINK_SPEED_AUTONEG (0) is used, all speeds + supported are advertised. */ + struct rte_eth_rxmode rxmode; /**< Port RX configuration. */ + struct rte_eth_txmode txmode; /**< Port TX configuration. */ + uint32_t lpbk_mode; /**< Loopback operation mode. By default the value + is 0, meaning the loopback mode is disabled. + Read the datasheet of given ethernet controller + for details. The possible values of this field + are defined in implementation of each driver. */ + struct { + struct rte_eth_rss_conf rss_conf; /**< Port RSS configuration */ + struct rte_eth_vmdq_dcb_conf vmdq_dcb_conf; + /**< Port vmdq+dcb configuration. */ + struct rte_eth_dcb_rx_conf dcb_rx_conf; + /**< Port dcb RX configuration. */ + struct rte_eth_vmdq_rx_conf vmdq_rx_conf; + /**< Port vmdq RX configuration. */ + } rx_adv_conf; /**< Port RX filtering configuration (union). */ + union { + struct rte_eth_vmdq_dcb_tx_conf vmdq_dcb_tx_conf; + /**< Port vmdq+dcb TX configuration. */ + struct rte_eth_dcb_tx_conf dcb_tx_conf; + /**< Port dcb TX configuration. */ + struct rte_eth_vmdq_tx_conf vmdq_tx_conf; + /**< Port vmdq TX configuration. */ + } tx_adv_conf; /**< Port TX DCB configuration (union). */ + /** Currently,Priority Flow Control(PFC) are supported,if DCB with PFC + is needed,and the variable must be set ETH_DCB_PFC_SUPPORT. */ + uint32_t dcb_capability_en; + struct rte_fdir_conf fdir_conf; /**< FDIR configuration. */ + struct rte_intr_conf intr_conf; /**< Interrupt mode configuration. */ +}; \ No newline at end of file diff --git a/tests/headers/layout_kni_mbuf.h b/tests/headers/layout_kni_mbuf.h new file mode 100644 index 0000000000..ff161144a3 --- /dev/null +++ b/tests/headers/layout_kni_mbuf.h @@ -0,0 +1,32 @@ + +#define RTE_CACHE_LINE_MIN_SIZE 64 /**< Minimum Cache line size. */ + +#define RTE_CACHE_LINE_SIZE 64 + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +/* + * The kernel image of the rte_mbuf struct, with only the relevant fields. + * Padding is necessary to assure the offsets of these fields + */ +struct rte_kni_mbuf { + void *buf_addr __attribute__((__aligned__(RTE_CACHE_LINE_SIZE))); + uint64_t buf_physaddr; + char pad0[2]; + uint16_t data_off; /**< Start address of data in segment buffer. */ + char pad1[2]; + uint8_t nb_segs; /**< Number of segments. */ + char pad4[1]; + uint64_t ol_flags; /**< Offload features. */ + char pad2[4]; + uint32_t pkt_len; /**< Total pkt len: sum of all segment data_len. */ + uint16_t data_len; /**< Amount of data in segment buffer. */ + + /* fields on second cache line */ + char pad3[8] __attribute__((__aligned__(RTE_CACHE_LINE_MIN_SIZE))); + void *pool; + void *next; +}; diff --git a/tests/headers/layout_mbuf.h b/tests/headers/layout_mbuf.h new file mode 100644 index 0000000000..dc1c1b242b --- /dev/null +++ b/tests/headers/layout_mbuf.h @@ -0,0 +1,187 @@ + +#define RTE_CACHE_LINE_MIN_SIZE 64 /**< Minimum Cache line size. */ + +#define RTE_CACHE_LINE_SIZE 64 + +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef long long int64_t; + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +typedef uint64_t phys_addr_t; + +/** + * Force alignment + */ +#define __rte_aligned(a) __attribute__((__aligned__(a))) + +/** + * Force alignment to cache line. + */ +#define __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE) + +/** + * Force minimum cache line alignment. + */ +#define __rte_cache_min_aligned __rte_aligned(RTE_CACHE_LINE_MIN_SIZE) + +/* define a set of marker types that can be used to refer to set points in the + * mbuf */ +__extension__ +typedef void *MARKER[0]; /**< generic marker for a point in a structure */ +__extension__ +typedef uint8_t MARKER8[0]; /**< generic marker with 1B alignment */ +__extension__ +typedef uint64_t MARKER64[0]; /**< marker that allows us to overwrite 8 bytes + * with a single assignment */ + +/** C extension macro for environments lacking C11 features. */ +#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L +#define RTE_STD_C11 __extension__ +#else +#define RTE_STD_C11 +#endif + +/** + * The atomic counter structure. + */ +typedef struct { + volatile int16_t cnt; /**< An internal counter value. */ +} rte_atomic16_t; + +/** + * The generic rte_mbuf, containing a packet mbuf. + */ +struct rte_mbuf { + MARKER cacheline0; + + void *buf_addr; /**< Virtual address of segment buffer. */ + phys_addr_t buf_physaddr; /**< Physical address of segment buffer. */ + + uint16_t buf_len; /**< Length of segment buffer. */ + + /* next 6 bytes are initialised on RX descriptor rearm */ + MARKER8 rearm_data; + uint16_t data_off; + + /** + * 16-bit Reference counter. + * It should only be accessed using the following functions: + * rte_mbuf_refcnt_update(), rte_mbuf_refcnt_read(), and + * rte_mbuf_refcnt_set(). The functionality of these functions (atomic, + * or non-atomic) is controlled by the CONFIG_RTE_MBUF_REFCNT_ATOMIC + * config option. + */ + RTE_STD_C11 + union { + rte_atomic16_t refcnt_atomic; /**< Atomically accessed refcnt */ + uint16_t refcnt; /**< Non-atomically accessed refcnt */ + }; + uint8_t nb_segs; /**< Number of segments. */ + uint8_t port; /**< Input port. */ + + uint64_t ol_flags; /**< Offload features. */ + + /* remaining bytes are set on RX when pulling packet from descriptor */ + MARKER rx_descriptor_fields1; + + /* + * The packet type, which is the combination of outer/inner L2, L3, L4 + * and tunnel types. The packet_type is about data really present in the + * mbuf. Example: if vlan stripping is enabled, a received vlan packet + * would have RTE_PTYPE_L2_ETHER and not RTE_PTYPE_L2_VLAN because the + * vlan is stripped from the data. + */ + RTE_STD_C11 + union { + uint32_t packet_type; /**< L2/L3/L4 and tunnel information. */ + struct { + uint32_t l2_type:4; /**< (Outer) L2 type. */ + uint32_t l3_type:4; /**< (Outer) L3 type. */ + uint32_t l4_type:4; /**< (Outer) L4 type. */ + uint32_t tun_type:4; /**< Tunnel type. */ + uint32_t inner_l2_type:4; /**< Inner L2 type. */ + uint32_t inner_l3_type:4; /**< Inner L3 type. */ + uint32_t inner_l4_type:4; /**< Inner L4 type. */ + }; + }; + + uint32_t pkt_len; /**< Total pkt len: sum of all segments. */ + uint16_t data_len; /**< Amount of data in segment buffer. */ + /** VLAN TCI (CPU order), valid if PKT_RX_VLAN_STRIPPED is set. */ + uint16_t vlan_tci; + + union { + uint32_t rss; /**< RSS hash result if RSS enabled */ + struct { + RTE_STD_C11 + union { + struct { + uint16_t hash; + uint16_t id; + }; + uint32_t lo; + /**< Second 4 flexible bytes */ + }; + uint32_t hi; + /**< First 4 flexible bytes or FD ID, dependent on + PKT_RX_FDIR_* flag in ol_flags. */ + } fdir; /**< Filter identifier if FDIR enabled */ + struct { + uint32_t lo; + uint32_t hi; + } sched; /**< Hierarchical scheduler */ + uint32_t usr; /**< User defined tags. See rte_distributor_process() */ + } hash; /**< hash information */ + + uint32_t seqn; /**< Sequence number. See also rte_reorder_insert() */ + + /** Outer VLAN TCI (CPU order), valid if PKT_RX_QINQ_STRIPPED is set. */ + uint16_t vlan_tci_outer; + + /* second cache line - fields only used in slow path or on TX */ + MARKER cacheline1 __rte_cache_min_aligned; + + RTE_STD_C11 + union { + void *userdata; /**< Can be used for external metadata */ + uint64_t udata64; /**< Allow 8-byte userdata on 32-bit */ + }; + + struct rte_mempool *pool; /**< Pool from which mbuf was allocated. */ + struct rte_mbuf *next; /**< Next segment of scattered packet. */ + + /* fields to support TX offloads */ + RTE_STD_C11 + union { + uint64_t tx_offload; /**< combined for easy fetch */ + __extension__ + struct { + uint64_t l2_len:7; + /**< L2 (MAC) Header Length for non-tunneling pkt. + * Outer_L4_len + ... + Inner_L2_len for tunneling pkt. + */ + uint64_t l3_len:9; /**< L3 (IP) Header Length. */ + uint64_t l4_len:8; /**< L4 (TCP/UDP) Header Length. */ + uint64_t tso_segsz:16; /**< TCP TSO segment size */ + + /* fields for TX offloading of tunnels */ + uint64_t outer_l3_len:9; /**< Outer L3 (IP) Hdr Length. */ + uint64_t outer_l2_len:7; /**< Outer L2 (MAC) Hdr Length. */ + + /* uint64_t unused:8; */ + }; + }; + + /** Size of the application private data. In case of an indirect + * mbuf, it stores the direct mbuf private data size. */ + uint16_t priv_size; + + /** Timesync flags for use with IEEE1588. */ + uint16_t timesync; +} __rte_cache_aligned; \ No newline at end of file From 1c6985175d14dd3a596ac079340dbb19ff56f9bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 7 Feb 2017 16:51:31 +0100 Subject: [PATCH 0304/2291] codegen: Fix the build in older rustc versions. --- src/codegen/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index f4da014ef8..f19331f429 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2458,12 +2458,12 @@ mod utils { use aster; use ir::context::{BindgenContext, ItemId}; use ir::item::{Item, ItemCanonicalPath}; + use ir::function::FunctionSig; use ir::ty::TypeKind; use std::mem; use syntax::ast; use syntax::ptr::P; - pub fn prepend_objc_header(ctx: &BindgenContext, result: &mut Vec>) { let use_objc = if ctx.options().objc_extern_crate { @@ -2745,7 +2745,7 @@ mod utils { } pub fn fnsig_return_ty(ctx: &BindgenContext, - sig: &super::FunctionSig) + sig: &FunctionSig) -> ast::FunctionRetTy { let return_item = ctx.resolve_item(sig.return_type()); if let TypeKind::Void = *return_item.kind().expect_type().kind() { @@ -2756,7 +2756,7 @@ mod utils { } pub fn fnsig_arguments(ctx: &BindgenContext, - sig: &super::FunctionSig) + sig: &FunctionSig) -> Vec { use super::ToPtr; let mut unnamed_arguments = 0; From 193a103bf5333082bba69b7f541b51ba1f723443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 7 Feb 2017 16:51:51 +0100 Subject: [PATCH 0305/2291] codegen: Improve the assertion message of the failing layout tests. --- src/codegen/mod.rs | 28 +- tests/expectations/tests/16-byte-alignment.rs | 103 +++- tests/expectations/tests/accessors.rs | 95 +++- tests/expectations/tests/annotation_hide.rs | 16 +- tests/expectations/tests/anon_enum.rs | 14 +- tests/expectations/tests/anon_enum_trait.rs | 6 +- tests/expectations/tests/anon_union.rs | 14 +- tests/expectations/tests/auto.rs | 6 +- tests/expectations/tests/base-to-derived.rs | 6 +- .../expectations/tests/bitfield-enum-basic.rs | 6 +- .../tests/bitfield_method_mangling.rs | 6 +- .../canonical_path_without_namespacing.rs | 6 +- tests/expectations/tests/class.rs | 105 +++- tests/expectations/tests/class_nested.rs | 30 +- tests/expectations/tests/class_no_members.rs | 27 +- tests/expectations/tests/class_static.rs | 6 +- .../expectations/tests/class_static_const.rs | 6 +- tests/expectations/tests/class_use_as.rs | 20 +- tests/expectations/tests/class_with_dtor.rs | 18 +- .../tests/class_with_inner_struct.rs | 152 ++++-- .../expectations/tests/class_with_typedef.rs | 36 +- tests/expectations/tests/complex.rs | 40 +- tests/expectations/tests/const_bool.rs | 6 +- .../expectations/tests/const_enum_unnamed.rs | 6 +- .../expectations/tests/constify-all-enums.rs | 10 +- tests/expectations/tests/constructor-tp.rs | 6 +- tests/expectations/tests/constructors.rs | 12 +- tests/expectations/tests/convert-floats.rs | 30 +- tests/expectations/tests/crtp.rs | 31 +- .../duplicated-namespaces-definitions.rs | 24 +- .../tests/enum_and_vtable_mangling.rs | 10 +- .../tests/forward-declaration-autoptr.rs | 10 +- .../tests/forward_declared_complex_types.rs | 16 +- .../tests/forward_declared_struct.rs | 20 +- .../expectations/tests/func_ptr_in_struct.rs | 10 +- tests/expectations/tests/inherit_typedef.rs | 12 +- tests/expectations/tests/inline_namespace.rs | 10 +- .../tests/inline_namespace_conservative.rs | 10 +- tests/expectations/tests/inner_const.rs | 10 +- .../expectations/tests/inner_template_self.rs | 10 +- tests/expectations/tests/issue-372.rs | 38 +- tests/expectations/tests/issue-410.rs | 6 +- tests/expectations/tests/issue-447.rs | 16 +- tests/expectations/tests/issue_311.rs | 14 +- .../expectations/tests/jsval_layout_opaque.rs | 92 +++- tests/expectations/tests/layout.rs | 3 +- tests/expectations/tests/layout_align.rs | 16 +- tests/expectations/tests/layout_arp.rs | 62 ++- tests/expectations/tests/layout_array.rs | 86 ++- .../tests/layout_cmdline_token.rs | 69 ++- tests/expectations/tests/layout_eth_conf.rs | 504 +++++++++++++----- tests/expectations/tests/layout_kni_mbuf.rs | 59 +- tests/expectations/tests/layout_mbuf.rs | 257 ++++++--- tests/expectations/tests/method-mangling.rs | 6 +- .../expectations/tests/module-whitelisted.rs | 6 +- tests/expectations/tests/msvc-no-usr.rs | 10 +- .../multiple-inherit-empty-correct-layout.rs | 18 +- tests/expectations/tests/mutable.rs | 37 +- tests/expectations/tests/namespace.rs | 10 +- tests/expectations/tests/nested.rs | 37 +- tests/expectations/tests/nested_vtable.rs | 18 +- .../tests/nested_within_namespace.rs | 30 +- tests/expectations/tests/no-comments.rs | 10 +- tests/expectations/tests/no-derive-debug.rs | 14 +- .../tests/no-recursive-whitelisting.rs | 10 +- tests/expectations/tests/no-std.rs | 18 +- .../expectations/tests/objc_interface_type.rs | 10 +- tests/expectations/tests/only_bitfields.rs | 6 +- tests/expectations/tests/opaque-tracing.rs | 6 +- tests/expectations/tests/opaque_in_struct.rs | 16 +- tests/expectations/tests/opaque_pointer.rs | 24 +- tests/expectations/tests/private.rs | 42 +- tests/expectations/tests/public-dtor.rs | 6 +- .../expectations/tests/ref_argument_array.rs | 6 +- .../tests/reparented_replacement.rs | 10 +- tests/expectations/tests/replace_use.rs | 10 +- ...ame_struct_name_in_different_namespaces.rs | 14 +- tests/expectations/tests/size_t_template.rs | 10 +- ...ruct_containing_forward_declared_struct.rs | 20 +- .../tests/struct_with_anon_struct.rs | 24 +- .../tests/struct_with_anon_struct_array.rs | 42 +- .../tests/struct_with_anon_struct_pointer.rs | 24 +- .../tests/struct_with_anon_union.rs | 24 +- .../tests/struct_with_anon_unnamed_struct.rs | 20 +- .../tests/struct_with_anon_unnamed_union.rs | 20 +- .../tests/struct_with_bitfields.rs | 10 +- .../tests/struct_with_derive_debug.rs | 40 +- .../expectations/tests/struct_with_nesting.rs | 66 ++- .../expectations/tests/struct_with_packing.rs | 14 +- .../expectations/tests/struct_with_struct.rs | 24 +- tests/expectations/tests/template.rs | 52 +- ...type-referenced-by-whitelisted-function.rs | 10 +- .../tests/type_alias_template_specialized.rs | 10 +- tests/expectations/tests/typeref.rs | 38 +- tests/expectations/tests/union-in-ns.rs | 10 +- tests/expectations/tests/union_dtor.rs | 14 +- tests/expectations/tests/union_fields.rs | 18 +- .../tests/union_with_anon_struct.rs | 24 +- .../tests/union_with_anon_struct_bitfield.rs | 16 +- .../tests/union_with_anon_union.rs | 24 +- .../tests/union_with_anon_unnamed_struct.rs | 33 +- .../tests/union_with_anon_unnamed_union.rs | 24 +- .../tests/union_with_big_member.rs | 42 +- .../expectations/tests/union_with_nesting.rs | 52 +- tests/expectations/tests/unknown_attr.rs | 13 +- tests/expectations/tests/use-core.rs | 18 +- tests/expectations/tests/var-tracing.rs | 16 +- tests/expectations/tests/variadic-method.rs | 6 +- tests/expectations/tests/vector.rs | 10 +- tests/expectations/tests/virtual_dtor.rs | 6 +- .../expectations/tests/virtual_inheritance.rs | 36 +- .../expectations/tests/virtual_overloaded.rs | 6 +- .../tests/vtable_recursive_sig.rs | 12 +- tests/expectations/tests/weird_bitfields.rs | 54 +- tests/expectations/tests/what_is_going_on.rs | 6 +- .../tests/whitelist-namespaces-basic.rs | 6 +- .../tests/whitelist-namespaces.rs | 16 +- 117 files changed, 2523 insertions(+), 972 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index f19331f429..0fdfaad0a9 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -866,8 +866,10 @@ impl CodeGenerator for CompInfo { let item = quote_item!(ctx.ext_cx(), #[test] fn $fn_name() { - assert_eq!($size_of_expr, $size); - assert_eq!($align_of_expr, $align); + assert_eq!($size_of_expr, $size, + concat!("Size of template specialization: ", stringify!($ident))); + assert_eq!($align_of_expr, $align, + concat!("Alignment of template specialization: ", stringify!($ident))); }) .unwrap(); result.push(item); @@ -1339,12 +1341,12 @@ impl CodeGenerator for CompInfo { if let Some(layout) = layout { let fn_name = format!("bindgen_test_layout_{}", canonical_name); let fn_name = ctx.rust_ident_raw(&fn_name); - let ident = ctx.rust_ident_raw(&canonical_name); + let type_name = ctx.rust_ident_raw(&canonical_name); let prefix = ctx.trait_prefix(); let size_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::size_of::<$ident>()); + ::$prefix::mem::size_of::<$type_name>()); let align_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::align_of::<$ident>()); + ::$prefix::mem::align_of::<$type_name>()); let size = layout.size; let align = layout.align; @@ -1353,7 +1355,9 @@ impl CodeGenerator for CompInfo { None } else { quote_item!(ctx.ext_cx(), - assert_eq!($align_of_expr, $align); + assert_eq!($align_of_expr, + $align, + concat!("Alignment of ", stringify!($type_name))); ) }; @@ -1370,8 +1374,6 @@ impl CodeGenerator for CompInfo { let check_field_offset = if should_skip_field_offset_checks { None } else { - let type_name = ctx.rust_ident(&canonical_name); - let asserts = self.fields() .iter() .filter(|field| field.bitfield().is_none()) @@ -1382,7 +1384,9 @@ impl CodeGenerator for CompInfo { let field_name = ctx.rust_ident(name); quote_item!(ctx.ext_cx(), - assert_eq!(unsafe { &(*(0 as *const $type_name)).$field_name as *const _ as usize }, $field_offset); + assert_eq!(unsafe { &(*(0 as *const $type_name)).$field_name as *const _ as usize }, + $field_offset, + concat!("Alignment of field: ", stringify!($type_name), "::", stringify!($field_name))); ) }) }) @@ -1394,7 +1398,9 @@ impl CodeGenerator for CompInfo { let item = quote_item!(ctx.ext_cx(), #[test] fn $fn_name() { - assert_eq!($size_of_expr, $size); + assert_eq!($size_of_expr, + $size, + concat!("Size of: ", stringify!($type_name))); $check_struct_align $check_field_offset @@ -2137,7 +2143,7 @@ impl ToRustTy for Type { .map(|arg| arg.to_rust_ty(ctx)) .collect::>(); - path.segments.last_mut().unwrap().parameters = if + path.segments.last_mut().unwrap().parameters = if template_args.is_empty() { None } else { diff --git a/tests/expectations/tests/16-byte-alignment.rs b/tests/expectations/tests/16-byte-alignment.rs index 9894a37a38..b9dd74e37c 100644 --- a/tests/expectations/tests/16-byte-alignment.rs +++ b/tests/expectations/tests/16-byte-alignment.rs @@ -51,44 +51,66 @@ pub struct rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 { #[test] fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() - , 4usize); + , 4usize , concat ! ( + "Size of: " , stringify ! ( + rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 ) )); assert_eq! (::std::mem::align_of::() - , 2usize); + , 2usize , concat ! ( + "Alignment of " , stringify ! ( + rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 ) - ) . dport as * const _ as usize } , 0usize); + ) . dport as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 ) , "::" , + stringify ! ( dport ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 ) - ) . sport as * const _ as usize } , 2usize); + ) . sport as * const _ as usize } , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 ) , "::" , + stringify ! ( sport ) )); } impl Clone for rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_rte_ipv4_tuple__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , - 4usize); + assert_eq!(::std::mem::size_of::() , 4usize + , concat ! ( + "Size of: " , stringify ! ( rte_ipv4_tuple__bindgen_ty_1 ) )); assert_eq! (::std::mem::align_of::() , - 4usize); + 4usize , concat ! ( + "Alignment of " , stringify ! ( rte_ipv4_tuple__bindgen_ty_1 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const rte_ipv4_tuple__bindgen_ty_1 ) ) . - sctp_tag as * const _ as usize } , 0usize); + sctp_tag as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_ipv4_tuple__bindgen_ty_1 ) , "::" , stringify ! ( sctp_tag + ) )); } impl Clone for rte_ipv4_tuple__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_rte_ipv4_tuple() { - assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 12usize , concat ! ( + "Size of: " , stringify ! ( rte_ipv4_tuple ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( rte_ipv4_tuple ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_ipv4_tuple ) ) . src_addr as * const - _ as usize } , 0usize); + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ipv4_tuple ) , "::" + , stringify ! ( src_addr ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_ipv4_tuple ) ) . dst_addr as * const - _ as usize } , 4usize); + _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ipv4_tuple ) , "::" + , stringify ! ( dst_addr ) )); } impl Clone for rte_ipv4_tuple { fn clone(&self) -> Self { *self } @@ -116,44 +138,66 @@ pub struct rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 { #[test] fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() - , 4usize); + , 4usize , concat ! ( + "Size of: " , stringify ! ( + rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 ) )); assert_eq! (::std::mem::align_of::() - , 2usize); + , 2usize , concat ! ( + "Alignment of " , stringify ! ( + rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 ) - ) . dport as * const _ as usize } , 0usize); + ) . dport as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 ) , "::" , + stringify ! ( dport ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 ) - ) . sport as * const _ as usize } , 2usize); + ) . sport as * const _ as usize } , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 ) , "::" , + stringify ! ( sport ) )); } impl Clone for rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_rte_ipv6_tuple__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , - 4usize); + assert_eq!(::std::mem::size_of::() , 4usize + , concat ! ( + "Size of: " , stringify ! ( rte_ipv6_tuple__bindgen_ty_1 ) )); assert_eq! (::std::mem::align_of::() , - 4usize); + 4usize , concat ! ( + "Alignment of " , stringify ! ( rte_ipv6_tuple__bindgen_ty_1 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const rte_ipv6_tuple__bindgen_ty_1 ) ) . - sctp_tag as * const _ as usize } , 0usize); + sctp_tag as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_ipv6_tuple__bindgen_ty_1 ) , "::" , stringify ! ( sctp_tag + ) )); } impl Clone for rte_ipv6_tuple__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_rte_ipv6_tuple() { - assert_eq!(::std::mem::size_of::() , 36usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 36usize , concat ! ( + "Size of: " , stringify ! ( rte_ipv6_tuple ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( rte_ipv6_tuple ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_ipv6_tuple ) ) . src_addr as * const - _ as usize } , 0usize); + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ipv6_tuple ) , "::" + , stringify ! ( src_addr ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_ipv6_tuple ) ) . dst_addr as * const - _ as usize } , 16usize); + _ as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ipv6_tuple ) , "::" + , stringify ! ( dst_addr ) )); } impl Clone for rte_ipv6_tuple { fn clone(&self) -> Self { *self } @@ -167,13 +211,18 @@ pub struct rte_thash_tuple { } #[test] fn bindgen_test_layout_rte_thash_tuple() { - assert_eq!(::std::mem::size_of::() , 48usize); + assert_eq!(::std::mem::size_of::() , 48usize , concat ! ( + "Size of: " , stringify ! ( rte_thash_tuple ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_thash_tuple ) ) . v4 as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_thash_tuple ) , + "::" , stringify ! ( v4 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_thash_tuple ) ) . v6 as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_thash_tuple ) , + "::" , stringify ! ( v6 ) )); } impl Clone for rte_thash_tuple { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/accessors.rs b/tests/expectations/tests/accessors.rs index 435b811947..c0d95bfb08 100644 --- a/tests/expectations/tests/accessors.rs +++ b/tests/expectations/tests/accessors.rs @@ -17,20 +17,30 @@ pub struct SomeAccessors { } #[test] fn bindgen_test_layout_SomeAccessors() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( SomeAccessors ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( SomeAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const SomeAccessors ) ) . mNoAccessor as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( SomeAccessors ) , "::" + , stringify ! ( mNoAccessor ) )); assert_eq! (unsafe { & ( * ( 0 as * const SomeAccessors ) ) . mBothAccessors as * - const _ as usize } , 4usize); + const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( SomeAccessors ) , "::" + , stringify ! ( mBothAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const SomeAccessors ) ) . mUnsafeAccessors as * - const _ as usize } , 8usize); + const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( SomeAccessors ) , "::" + , stringify ! ( mUnsafeAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const SomeAccessors ) ) . mImmutableAccessor as - * const _ as usize } , 12usize); + * const _ as usize } , 12usize , concat ! ( + "Alignment of field: " , stringify ! ( SomeAccessors ) , "::" + , stringify ! ( mImmutableAccessor ) )); } impl Clone for SomeAccessors { fn clone(&self) -> Self { *self } @@ -67,14 +77,20 @@ pub struct AllAccessors { } #[test] fn bindgen_test_layout_AllAccessors() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( AllAccessors ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( AllAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const AllAccessors ) ) . mBothAccessors as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( AllAccessors ) , "::" , + stringify ! ( mBothAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const AllAccessors ) ) . mAlsoBothAccessors as - * const _ as usize } , 4usize); + * const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( AllAccessors ) , "::" , + stringify ! ( mAlsoBothAccessors ) )); } impl Clone for AllAccessors { fn clone(&self) -> Self { *self } @@ -107,14 +123,21 @@ pub struct AllUnsafeAccessors { } #[test] fn bindgen_test_layout_AllUnsafeAccessors() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( AllUnsafeAccessors ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( AllUnsafeAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const AllUnsafeAccessors ) ) . mBothAccessors - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( AllUnsafeAccessors ) , + "::" , stringify ! ( mBothAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const AllUnsafeAccessors ) ) . - mAlsoBothAccessors as * const _ as usize } , 4usize); + mAlsoBothAccessors as * const _ as usize } , 4usize , concat ! + ( + "Alignment of field: " , stringify ! ( AllUnsafeAccessors ) , + "::" , stringify ! ( mAlsoBothAccessors ) )); } impl Clone for AllUnsafeAccessors { fn clone(&self) -> Self { *self } @@ -153,20 +176,32 @@ pub struct ContradictAccessors { } #[test] fn bindgen_test_layout_ContradictAccessors() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat + ! ( "Size of: " , stringify ! ( ContradictAccessors ) )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( ContradictAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const ContradictAccessors ) ) . mBothAccessors - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ContradictAccessors ) , + "::" , stringify ! ( mBothAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const ContradictAccessors ) ) . mNoAccessors as - * const _ as usize } , 4usize); + * const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( ContradictAccessors ) , + "::" , stringify ! ( mNoAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const ContradictAccessors ) ) . - mUnsafeAccessors as * const _ as usize } , 8usize); + mUnsafeAccessors as * const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( ContradictAccessors ) , + "::" , stringify ! ( mUnsafeAccessors ) )); assert_eq! (unsafe { & ( * ( 0 as * const ContradictAccessors ) ) . - mImmutableAccessor as * const _ as usize } , 12usize); + mImmutableAccessor as * const _ as usize } , 12usize , concat + ! ( + "Alignment of field: " , stringify ! ( ContradictAccessors ) , + "::" , stringify ! ( mImmutableAccessor ) )); } impl Clone for ContradictAccessors { fn clone(&self) -> Self { *self } @@ -202,11 +237,15 @@ pub struct Replaced { } #[test] fn bindgen_test_layout_Replaced() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Replaced ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Replaced ) )); assert_eq! (unsafe { & ( * ( 0 as * const Replaced ) ) . mAccessor as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Replaced ) , "::" , + stringify ! ( mAccessor ) )); } impl Clone for Replaced { fn clone(&self) -> Self { *self } @@ -227,11 +266,15 @@ pub struct Wrapper { } #[test] fn bindgen_test_layout_Wrapper() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Wrapper ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Wrapper ) )); assert_eq! (unsafe { & ( * ( 0 as * const Wrapper ) ) . mReplaced as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Wrapper ) , "::" , + stringify ! ( mReplaced ) )); } impl Clone for Wrapper { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/annotation_hide.rs b/tests/expectations/tests/annotation_hide.rs index 31097b6f9d..62840b13b6 100644 --- a/tests/expectations/tests/annotation_hide.rs +++ b/tests/expectations/tests/annotation_hide.rs @@ -14,8 +14,10 @@ pub struct D { } #[test] fn bindgen_test_layout_D() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( D ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( D ) )); } impl Clone for D { fn clone(&self) -> Self { *self } @@ -27,11 +29,15 @@ pub struct NotAnnotated { } #[test] fn bindgen_test_layout_NotAnnotated() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( NotAnnotated ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( NotAnnotated ) )); assert_eq! (unsafe { & ( * ( 0 as * const NotAnnotated ) ) . f as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( NotAnnotated ) , "::" , + stringify ! ( f ) )); } impl Clone for NotAnnotated { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/anon_enum.rs b/tests/expectations/tests/anon_enum.rs index 7130ac0c04..b2c7f5fc54 100644 --- a/tests/expectations/tests/anon_enum.rs +++ b/tests/expectations/tests/anon_enum.rs @@ -16,14 +16,20 @@ pub const Test_T_NONE: Test__bindgen_ty_1 = Test__bindgen_ty_1::T_NONE; pub enum Test__bindgen_ty_1 { T_NONE = 0, } #[test] fn bindgen_test_layout_Test() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Test ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Test ) )); assert_eq! (unsafe { & ( * ( 0 as * const Test ) ) . foo as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const Test ) ) . bar as * const _ as usize } , - 4usize); + 4usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( bar ) )); } impl Clone for Test { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/anon_enum_trait.rs b/tests/expectations/tests/anon_enum_trait.rs index 264b4c4674..c258f7d6fd 100644 --- a/tests/expectations/tests/anon_enum_trait.rs +++ b/tests/expectations/tests/anon_enum_trait.rs @@ -39,8 +39,10 @@ pub const Foo_Baz: Foo__bindgen_ty_1 = Foo__bindgen_ty_1::Bar; pub enum Foo__bindgen_ty_1 { Bar = 0, } #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/anon_union.rs b/tests/expectations/tests/anon_union.rs index 758150e465..6ded1e5706 100644 --- a/tests/expectations/tests/anon_union.rs +++ b/tests/expectations/tests/anon_union.rs @@ -69,8 +69,10 @@ pub struct ErrorResult { } #[test] fn bindgen_test_layout_ErrorResult() { - assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 24usize , concat ! ( + "Size of: " , stringify ! ( ErrorResult ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( ErrorResult ) )); } impl Clone for ErrorResult { fn clone(&self) -> Self { *self } @@ -78,7 +80,11 @@ impl Clone for ErrorResult { #[test] fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() , - 24usize); + 24usize , concat ! ( + "Size of template specialization: " , stringify ! ( + TErrorResult<::std::os::raw::c_int> ) )); assert_eq!(::std::mem::align_of::>() , - 8usize); + 8usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + TErrorResult<::std::os::raw::c_int> ) )); } diff --git a/tests/expectations/tests/auto.rs b/tests/expectations/tests/auto.rs index d7f96e77b3..554546af0e 100644 --- a/tests/expectations/tests/auto.rs +++ b/tests/expectations/tests/auto.rs @@ -12,8 +12,10 @@ pub struct Foo { pub const Foo_kFoo: bool = true; #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/base-to-derived.rs b/tests/expectations/tests/base-to-derived.rs index e8eb374541..4749096ba6 100644 --- a/tests/expectations/tests/base-to-derived.rs +++ b/tests/expectations/tests/base-to-derived.rs @@ -11,8 +11,10 @@ pub struct false_type { } #[test] fn bindgen_test_layout_false_type() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( false_type ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( false_type ) )); } impl Clone for false_type { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/bitfield-enum-basic.rs b/tests/expectations/tests/bitfield-enum-basic.rs index 45adee0fad..a8d3ecc5cc 100644 --- a/tests/expectations/tests/bitfield-enum-basic.rs +++ b/tests/expectations/tests/bitfield-enum-basic.rs @@ -69,8 +69,10 @@ impl ::std::ops::BitOr for Dummy__bindgen_ty_1 { pub struct Dummy__bindgen_ty_1(pub ::std::os::raw::c_uint); #[test] fn bindgen_test_layout_Dummy() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Dummy ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Dummy ) )); } impl Clone for Dummy { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/bitfield_method_mangling.rs b/tests/expectations/tests/bitfield_method_mangling.rs index b9165121c7..94f0aa8e4c 100644 --- a/tests/expectations/tests/bitfield_method_mangling.rs +++ b/tests/expectations/tests/bitfield_method_mangling.rs @@ -11,8 +11,10 @@ pub struct _bindgen_ty_1 { } #[test] fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize); - assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize); + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize , concat ! ( + "Size of: " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize , concat ! ( + "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); } impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/canonical_path_without_namespacing.rs b/tests/expectations/tests/canonical_path_without_namespacing.rs index c175c471c6..dff6b7071f 100644 --- a/tests/expectations/tests/canonical_path_without_namespacing.rs +++ b/tests/expectations/tests/canonical_path_without_namespacing.rs @@ -11,8 +11,10 @@ pub struct Bar { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Bar ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Bar ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index a1426347e7..46adbc2940 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -67,13 +67,19 @@ pub struct C { } #[test] fn bindgen_test_layout_C() { - assert_eq!(::std::mem::size_of::() , 40usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 40usize , concat ! ( + "Size of: " , stringify ! ( C ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( C ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . a as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . big_array as * const _ as usize } - , 4usize); + , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( big_array ) )); } #[repr(C)] pub struct C_with_zero_length_array { @@ -83,17 +89,30 @@ pub struct C_with_zero_length_array { } #[test] fn bindgen_test_layout_C_with_zero_length_array() { - assert_eq!(::std::mem::size_of::() , 40usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 40usize , + concat ! ( + "Size of: " , stringify ! ( C_with_zero_length_array ) )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( C_with_zero_length_array ) )); assert_eq! (unsafe { & ( * ( 0 as * const C_with_zero_length_array ) ) . a as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + C_with_zero_length_array ) , "::" , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const C_with_zero_length_array ) ) . big_array - as * const _ as usize } , 4usize); + as * const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( + C_with_zero_length_array ) , "::" , stringify ! ( big_array ) + )); assert_eq! (unsafe { & ( * ( 0 as * const C_with_zero_length_array ) ) . - zero_length_array as * const _ as usize } , 37usize); + zero_length_array as * const _ as usize } , 37usize , concat ! + ( + "Alignment of field: " , stringify ! ( + C_with_zero_length_array ) , "::" , stringify ! ( + zero_length_array ) )); } #[repr(C)] pub struct C_with_incomplete_array { @@ -103,8 +122,12 @@ pub struct C_with_incomplete_array { } #[test] fn bindgen_test_layout_C_with_incomplete_array() { - assert_eq!(::std::mem::size_of::() , 40usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 40usize , + concat ! ( + "Size of: " , stringify ! ( C_with_incomplete_array ) )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( C_with_incomplete_array ) )); } #[repr(C)] pub struct C_with_zero_length_array_and_incomplete_array { @@ -116,9 +139,13 @@ pub struct C_with_zero_length_array_and_incomplete_array { #[test] fn bindgen_test_layout_C_with_zero_length_array_and_incomplete_array() { assert_eq!(::std::mem::size_of::() - , 40usize); + , 40usize , concat ! ( + "Size of: " , stringify ! ( + C_with_zero_length_array_and_incomplete_array ) )); assert_eq! (::std::mem::align_of::() - , 4usize); + , 4usize , concat ! ( + "Alignment of " , stringify ! ( + C_with_zero_length_array_and_incomplete_array ) )); } #[repr(C)] #[derive(Debug)] @@ -127,11 +154,15 @@ pub struct WithDtor { } #[test] fn bindgen_test_layout_WithDtor() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( WithDtor ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( WithDtor ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithDtor ) ) . b as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithDtor ) , "::" , + stringify ! ( b ) )); } #[repr(C)] pub struct IncompleteArrayNonCopiable { @@ -140,9 +171,13 @@ pub struct IncompleteArrayNonCopiable { } #[test] fn bindgen_test_layout_IncompleteArrayNonCopiable() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , - 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , + concat ! ( + "Size of: " , stringify ! ( IncompleteArrayNonCopiable ) )); + assert_eq! (::std::mem::align_of::() , 8usize + , concat ! ( + "Alignment of " , stringify ! ( IncompleteArrayNonCopiable ) + )); } #[repr(C)] #[derive(Debug, Copy)] @@ -153,14 +188,20 @@ pub struct Union { } #[test] fn bindgen_test_layout_Union() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Union ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Union ) )); assert_eq! (unsafe { & ( * ( 0 as * const Union ) ) . d as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Union ) , "::" , + stringify ! ( d ) )); assert_eq! (unsafe { & ( * ( 0 as * const Union ) ) . i as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Union ) , "::" , + stringify ! ( i ) )); } impl Clone for Union { fn clone(&self) -> Self { *self } @@ -172,11 +213,15 @@ pub struct WithUnion { } #[test] fn bindgen_test_layout_WithUnion() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( WithUnion ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( WithUnion ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithUnion ) ) . data as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithUnion ) , "::" , + stringify ! ( data ) )); } impl Clone for WithUnion { fn clone(&self) -> Self { *self } @@ -189,9 +234,13 @@ pub struct RealAbstractionWithTonsOfMethods { #[test] fn bindgen_test_layout_RealAbstractionWithTonsOfMethods() { assert_eq!(::std::mem::size_of::() , - 1usize); + 1usize , concat ! ( + "Size of: " , stringify ! ( RealAbstractionWithTonsOfMethods ) + )); assert_eq! (::std::mem::align_of::() , - 1usize); + 1usize , concat ! ( + "Alignment of " , stringify ! ( + RealAbstractionWithTonsOfMethods ) )); } extern "C" { #[link_name = "_ZNK32RealAbstractionWithTonsOfMethods3barEv"] diff --git a/tests/expectations/tests/class_nested.rs b/tests/expectations/tests/class_nested.rs index 4df281988a..8a4125c904 100644 --- a/tests/expectations/tests/class_nested.rs +++ b/tests/expectations/tests/class_nested.rs @@ -16,22 +16,30 @@ pub struct A_B { } #[test] fn bindgen_test_layout_A_B() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( A_B ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( A_B ) )); assert_eq! (unsafe { & ( * ( 0 as * const A_B ) ) . member_b as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A_B ) , "::" , + stringify ! ( member_b ) )); } impl Clone for A_B { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_A() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( A ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( A ) )); assert_eq! (unsafe { & ( * ( 0 as * const A ) ) . member_a as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A ) , "::" , stringify + ! ( member_a ) )); } impl Clone for A { fn clone(&self) -> Self { *self } @@ -47,11 +55,15 @@ pub struct D { } #[test] fn bindgen_test_layout_D() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( D ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( D ) )); assert_eq! (unsafe { & ( * ( 0 as * const D ) ) . member as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( D ) , "::" , stringify + ! ( member ) )); } impl Clone for D { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_no_members.rs b/tests/expectations/tests/class_no_members.rs index 1e3ace3b85..e41e3ffc7d 100644 --- a/tests/expectations/tests/class_no_members.rs +++ b/tests/expectations/tests/class_no_members.rs @@ -11,8 +11,10 @@ pub struct whatever { } #[test] fn bindgen_test_layout_whatever() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( whatever ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( whatever ) )); } impl Clone for whatever { fn clone(&self) -> Self { *self } @@ -24,8 +26,10 @@ pub struct whatever_child { } #[test] fn bindgen_test_layout_whatever_child() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( whatever_child ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( whatever_child ) )); } impl Clone for whatever_child { fn clone(&self) -> Self { *self } @@ -37,12 +41,19 @@ pub struct whatever_child_with_member { } #[test] fn bindgen_test_layout_whatever_child_with_member() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , - 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , + concat ! ( + "Size of: " , stringify ! ( whatever_child_with_member ) )); + assert_eq! (::std::mem::align_of::() , 4usize + , concat ! ( + "Alignment of " , stringify ! ( whatever_child_with_member ) + )); assert_eq! (unsafe { & ( * ( 0 as * const whatever_child_with_member ) ) . m_member - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + whatever_child_with_member ) , "::" , stringify ! ( m_member ) + )); } impl Clone for whatever_child_with_member { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_static.rs b/tests/expectations/tests/class_static.rs index 7730d279c9..207295b6c0 100644 --- a/tests/expectations/tests/class_static.rs +++ b/tests/expectations/tests/class_static.rs @@ -20,8 +20,10 @@ extern "C" { } #[test] fn bindgen_test_layout_MyClass() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( MyClass ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( MyClass ) )); } impl Clone for MyClass { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_static_const.rs b/tests/expectations/tests/class_static_const.rs index 0723325d14..5e59485bc2 100644 --- a/tests/expectations/tests/class_static_const.rs +++ b/tests/expectations/tests/class_static_const.rs @@ -14,8 +14,10 @@ pub const A_b: i32 = 63; pub const A_c: u32 = 255; #[test] fn bindgen_test_layout_A() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( A ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( A ) )); } impl Clone for A { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_use_as.rs b/tests/expectations/tests/class_use_as.rs index 6861815542..9184c9c84b 100644 --- a/tests/expectations/tests/class_use_as.rs +++ b/tests/expectations/tests/class_use_as.rs @@ -14,11 +14,15 @@ pub struct whatever { } #[test] fn bindgen_test_layout_whatever() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( whatever ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( whatever ) )); assert_eq! (unsafe { & ( * ( 0 as * const whatever ) ) . replacement as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( whatever ) , "::" , + stringify ! ( replacement ) )); } impl Clone for whatever { fn clone(&self) -> Self { *self } @@ -30,11 +34,15 @@ pub struct container { } #[test] fn bindgen_test_layout_container() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( container ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( container ) )); assert_eq! (unsafe { & ( * ( 0 as * const container ) ) . c as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( container ) , "::" , + stringify ! ( c ) )); } impl Clone for container { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_with_dtor.rs b/tests/expectations/tests/class_with_dtor.rs index e3bed7b11e..1d8e6b4dd3 100644 --- a/tests/expectations/tests/class_with_dtor.rs +++ b/tests/expectations/tests/class_with_dtor.rs @@ -17,16 +17,24 @@ pub struct WithoutDtor { } #[test] fn bindgen_test_layout_WithoutDtor() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( WithoutDtor ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( WithoutDtor ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithoutDtor ) ) . shouldBeWithDtor as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithoutDtor ) , "::" , + stringify ! ( shouldBeWithDtor ) )); } #[test] fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() - , 8usize); + , 8usize , concat ! ( + "Size of template specialization: " , stringify ! ( + HandleWithDtor<::std::os::raw::c_int> ) )); assert_eq!(::std::mem::align_of::>() - , 8usize); + , 8usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + HandleWithDtor<::std::os::raw::c_int> ) )); } diff --git a/tests/expectations/tests/class_with_inner_struct.rs b/tests/expectations/tests/class_with_inner_struct.rs index 8c800e2912..1056fd69c3 100644 --- a/tests/expectations/tests/class_with_inner_struct.rs +++ b/tests/expectations/tests/class_with_inner_struct.rs @@ -43,14 +43,20 @@ pub struct A_Segment { } #[test] fn bindgen_test_layout_A_Segment() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( A_Segment ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( A_Segment ) )); assert_eq! (unsafe { & ( * ( 0 as * const A_Segment ) ) . begin as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A_Segment ) , "::" , + stringify ! ( begin ) )); assert_eq! (unsafe { & ( * ( 0 as * const A_Segment ) ) . end as * const _ as usize - } , 4usize); + } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( A_Segment ) , "::" , + stringify ! ( end ) )); } impl Clone for A_Segment { fn clone(&self) -> Self { *self } @@ -63,11 +69,15 @@ pub struct A__bindgen_ty_1 { } #[test] fn bindgen_test_layout_A__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( A__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! + ( "Alignment of " , stringify ! ( A__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const A__bindgen_ty_1 ) ) . f as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A__bindgen_ty_1 ) , + "::" , stringify ! ( f ) )); } impl Clone for A__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -80,24 +90,34 @@ pub struct A__bindgen_ty_2 { } #[test] fn bindgen_test_layout_A__bindgen_ty_2() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( A__bindgen_ty_2 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! + ( "Alignment of " , stringify ! ( A__bindgen_ty_2 ) )); assert_eq! (unsafe { & ( * ( 0 as * const A__bindgen_ty_2 ) ) . d as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A__bindgen_ty_2 ) , + "::" , stringify ! ( d ) )); } impl Clone for A__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_A() { - assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 12usize , concat ! ( + "Size of: " , stringify ! ( A ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( A ) )); assert_eq! (unsafe { & ( * ( 0 as * const A ) ) . c as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A ) , "::" , stringify + ! ( c ) )); assert_eq! (unsafe { & ( * ( 0 as * const A ) ) . named_union as * const _ as usize - } , 4usize); + } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( A ) , "::" , stringify + ! ( named_union ) )); } impl Clone for A { fn clone(&self) -> Self { *self } @@ -115,24 +135,34 @@ pub struct B_Segment { } #[test] fn bindgen_test_layout_B_Segment() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( B_Segment ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( B_Segment ) )); assert_eq! (unsafe { & ( * ( 0 as * const B_Segment ) ) . begin as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( B_Segment ) , "::" , + stringify ! ( begin ) )); assert_eq! (unsafe { & ( * ( 0 as * const B_Segment ) ) . end as * const _ as usize - } , 4usize); + } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( B_Segment ) , "::" , + stringify ! ( end ) )); } impl Clone for B_Segment { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_B() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( B ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( B ) )); assert_eq! (unsafe { & ( * ( 0 as * const B ) ) . d as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( B ) , "::" , stringify + ! ( d ) )); } impl Clone for B { fn clone(&self) -> Self { *self } @@ -169,21 +199,36 @@ pub struct C__bindgen_ty_1__bindgen_ty_1 { #[test] fn bindgen_test_layout_C__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , - 16usize); + 16usize , concat ! ( + "Size of: " , stringify ! ( C__bindgen_ty_1__bindgen_ty_1 ) )); assert_eq! (::std::mem::align_of::() , - 4usize); + 4usize , concat ! ( + "Alignment of " , stringify ! ( C__bindgen_ty_1__bindgen_ty_1 + ) )); assert_eq! (unsafe { & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_1 ) ) . mX1 - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + C__bindgen_ty_1__bindgen_ty_1 ) , "::" , stringify ! ( mX1 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_1 ) ) . mY1 - as * const _ as usize } , 4usize); + as * const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( + C__bindgen_ty_1__bindgen_ty_1 ) , "::" , stringify ! ( mY1 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_1 ) ) . mX2 - as * const _ as usize } , 8usize); + as * const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( + C__bindgen_ty_1__bindgen_ty_1 ) , "::" , stringify ! ( mX2 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_1 ) ) . mY2 - as * const _ as usize } , 12usize); + as * const _ as usize } , 12usize , concat ! ( + "Alignment of field: " , stringify ! ( + C__bindgen_ty_1__bindgen_ty_1 ) , "::" , stringify ! ( mY2 ) + )); } impl Clone for C__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -196,27 +241,40 @@ pub struct C__bindgen_ty_1__bindgen_ty_2 { } #[test] fn bindgen_test_layout_C__bindgen_ty_1__bindgen_ty_2() { - assert_eq!(::std::mem::size_of::() , - 8usize); + assert_eq!(::std::mem::size_of::() , 8usize + , concat ! ( + "Size of: " , stringify ! ( C__bindgen_ty_1__bindgen_ty_2 ) )); assert_eq! (::std::mem::align_of::() , - 4usize); + 4usize , concat ! ( + "Alignment of " , stringify ! ( C__bindgen_ty_1__bindgen_ty_2 + ) )); assert_eq! (unsafe { & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_2 ) ) . - mStepSyntax as * const _ as usize } , 0usize); + mStepSyntax as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + C__bindgen_ty_1__bindgen_ty_2 ) , "::" , stringify ! ( + mStepSyntax ) )); assert_eq! (unsafe { & ( * ( 0 as * const C__bindgen_ty_1__bindgen_ty_2 ) ) . - mSteps as * const _ as usize } , 4usize); + mSteps as * const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( + C__bindgen_ty_1__bindgen_ty_2 ) , "::" , stringify ! ( mSteps + ) )); } impl Clone for C__bindgen_ty_1__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_C__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( C__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! + ( "Alignment of " , stringify ! ( C__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const C__bindgen_ty_1 ) ) . mFunc as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( C__bindgen_ty_1 ) , + "::" , stringify ! ( mFunc ) )); } impl Clone for C__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -229,24 +287,34 @@ pub struct C_Segment { } #[test] fn bindgen_test_layout_C_Segment() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( C_Segment ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( C_Segment ) )); assert_eq! (unsafe { & ( * ( 0 as * const C_Segment ) ) . begin as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( C_Segment ) , "::" , + stringify ! ( begin ) )); assert_eq! (unsafe { & ( * ( 0 as * const C_Segment ) ) . end as * const _ as usize - } , 4usize); + } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( C_Segment ) , "::" , + stringify ! ( end ) )); } impl Clone for C_Segment { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_C() { - assert_eq!(::std::mem::size_of::() , 20usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 20usize , concat ! ( + "Size of: " , stringify ! ( C ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( C ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . d as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( d ) )); } impl Clone for C { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/class_with_typedef.rs b/tests/expectations/tests/class_with_typedef.rs index 2a7da809ff..d3141fd99d 100644 --- a/tests/expectations/tests/class_with_typedef.rs +++ b/tests/expectations/tests/class_with_typedef.rs @@ -18,21 +18,33 @@ pub type C_MyInt = ::std::os::raw::c_int; pub type C_Lookup = *const ::std::os::raw::c_char; #[test] fn bindgen_test_layout_C() { - assert_eq!(::std::mem::size_of::() , 72usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 72usize , concat ! ( + "Size of: " , stringify ! ( C ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( C ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . c as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( c ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . ptr as * const _ as usize } , - 8usize); + 8usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( ptr ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . arr as * const _ as usize } , - 16usize); + 16usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( arr ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . d as * const _ as usize - } , 56usize); + } , 56usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( d ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . other_ptr as * const _ as usize } - , 64usize); + , 64usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( other_ptr ) )); } extern "C" { #[link_name = "_ZN1C6methodEi"] @@ -77,11 +89,15 @@ pub struct D { } #[test] fn bindgen_test_layout_D() { - assert_eq!(::std::mem::size_of::() , 80usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 80usize , concat ! ( + "Size of: " , stringify ! ( D ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( D ) )); assert_eq! (unsafe { & ( * ( 0 as * const D ) ) . ptr as * const _ as usize } , - 72usize); + 72usize , concat ! ( + "Alignment of field: " , stringify ! ( D ) , "::" , stringify + ! ( ptr ) )); } impl Clone for D { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/complex.rs b/tests/expectations/tests/complex.rs index 3f85616aed..1048138eb7 100644 --- a/tests/expectations/tests/complex.rs +++ b/tests/expectations/tests/complex.rs @@ -17,11 +17,15 @@ pub struct TestDouble { } #[test] fn bindgen_test_layout_TestDouble() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( TestDouble ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( TestDouble ) )); assert_eq! (unsafe { & ( * ( 0 as * const TestDouble ) ) . mMember as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( TestDouble ) , "::" , + stringify ! ( mMember ) )); } impl Clone for TestDouble { fn clone(&self) -> Self { *self } @@ -33,11 +37,15 @@ pub struct TestDoublePtr { } #[test] fn bindgen_test_layout_TestDoublePtr() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( TestDoublePtr ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( TestDoublePtr ) )); assert_eq! (unsafe { & ( * ( 0 as * const TestDoublePtr ) ) . mMember as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( TestDoublePtr ) , "::" + , stringify ! ( mMember ) )); } impl Clone for TestDoublePtr { fn clone(&self) -> Self { *self } @@ -49,11 +57,15 @@ pub struct TestFloat { } #[test] fn bindgen_test_layout_TestFloat() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( TestFloat ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( TestFloat ) )); assert_eq! (unsafe { & ( * ( 0 as * const TestFloat ) ) . mMember as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( TestFloat ) , "::" , + stringify ! ( mMember ) )); } impl Clone for TestFloat { fn clone(&self) -> Self { *self } @@ -65,11 +77,15 @@ pub struct TestFloatPtr { } #[test] fn bindgen_test_layout_TestFloatPtr() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( TestFloatPtr ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( TestFloatPtr ) )); assert_eq! (unsafe { & ( * ( 0 as * const TestFloatPtr ) ) . mMember as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( TestFloatPtr ) , "::" , + stringify ! ( mMember ) )); } impl Clone for TestFloatPtr { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/const_bool.rs b/tests/expectations/tests/const_bool.rs index 8a56811333..2c8ba788c3 100644 --- a/tests/expectations/tests/const_bool.rs +++ b/tests/expectations/tests/const_bool.rs @@ -13,8 +13,10 @@ pub struct A { pub const A_k: bool = false; #[test] fn bindgen_test_layout_A() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( A ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( A ) )); } impl Clone for A { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/const_enum_unnamed.rs b/tests/expectations/tests/const_enum_unnamed.rs index 9d586dee42..8a5f0f23a9 100644 --- a/tests/expectations/tests/const_enum_unnamed.rs +++ b/tests/expectations/tests/const_enum_unnamed.rs @@ -20,8 +20,10 @@ pub const Foo_FOO_BAR: Foo__bindgen_ty_1 = Foo__bindgen_ty_1::FOO_BAR; pub enum Foo__bindgen_ty_1 { FOO_BAR = 10, } #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/constify-all-enums.rs b/tests/expectations/tests/constify-all-enums.rs index e5b23a68af..ae89a9b72c 100644 --- a/tests/expectations/tests/constify-all-enums.rs +++ b/tests/expectations/tests/constify-all-enums.rs @@ -15,11 +15,15 @@ pub struct bar { } #[test] fn bindgen_test_layout_bar() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + 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 { & ( * ( 0 as * const bar ) ) . this_should_work as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( bar ) , "::" , + stringify ! ( this_should_work ) )); } impl Clone for bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/constructor-tp.rs b/tests/expectations/tests/constructor-tp.rs index 4e8bcf67f7..0f53317b4e 100644 --- a/tests/expectations/tests/constructor-tp.rs +++ b/tests/expectations/tests/constructor-tp.rs @@ -17,8 +17,10 @@ pub struct Bar { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Bar ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Bar ) )); } extern "C" { #[link_name = "_ZN3BarC1Ev"] diff --git a/tests/expectations/tests/constructors.rs b/tests/expectations/tests/constructors.rs index 8bea85c717..3abb2da783 100644 --- a/tests/expectations/tests/constructors.rs +++ b/tests/expectations/tests/constructors.rs @@ -11,8 +11,10 @@ pub struct TestOverload { } #[test] fn bindgen_test_layout_TestOverload() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( TestOverload ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( TestOverload ) )); } extern "C" { #[link_name = "_ZN12TestOverloadC1Ei"] @@ -47,8 +49,10 @@ pub struct TestPublicNoArgs { } #[test] fn bindgen_test_layout_TestPublicNoArgs() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( TestPublicNoArgs ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! + ( "Alignment of " , stringify ! ( TestPublicNoArgs ) )); } extern "C" { #[link_name = "_ZN16TestPublicNoArgsC1Ev"] diff --git a/tests/expectations/tests/convert-floats.rs b/tests/expectations/tests/convert-floats.rs index 75cbb4b242..5971db0630 100644 --- a/tests/expectations/tests/convert-floats.rs +++ b/tests/expectations/tests/convert-floats.rs @@ -22,26 +22,40 @@ pub struct foo { } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 48usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 48usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bar ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . baz as * const _ as usize } , - 4usize); + 4usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( baz ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bazz as * const _ as usize } , - 8usize); + 8usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bazz ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bazzz as * const _ as usize } , - 16usize); + 16usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bazzz ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . complexFloat as * const _ as - usize } , 24usize); + usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( complexFloat ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . complexDouble as * const _ as - usize } , 32usize); + usize } , 32usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( complexDouble ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/crtp.rs b/tests/expectations/tests/crtp.rs index 295732d01b..8fe0a5ae2e 100644 --- a/tests/expectations/tests/crtp.rs +++ b/tests/expectations/tests/crtp.rs @@ -17,8 +17,10 @@ pub struct Derived { } #[test] fn bindgen_test_layout_Derived() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Derived ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Derived ) )); } impl Clone for Derived { fn clone(&self) -> Self { *self } @@ -36,20 +38,31 @@ pub struct DerivedFromBaseWithDestructor { } #[test] fn bindgen_test_layout_DerivedFromBaseWithDestructor() { - assert_eq!(::std::mem::size_of::() , - 1usize); + assert_eq!(::std::mem::size_of::() , 1usize + , concat ! ( + "Size of: " , stringify ! ( DerivedFromBaseWithDestructor ) )); assert_eq! (::std::mem::align_of::() , - 1usize); + 1usize , concat ! ( + "Alignment of " , stringify ! ( DerivedFromBaseWithDestructor + ) )); } #[test] fn __bindgen_test_layout_template_1() { - assert_eq!(::std::mem::size_of::>() , 1usize); - assert_eq!(::std::mem::align_of::>() , 1usize); + assert_eq!(::std::mem::size_of::>() , 1usize , concat ! ( + "Size of template specialization: " , stringify ! ( + Base ) )); + assert_eq!(::std::mem::align_of::>() , 1usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + Base ) )); } #[test] fn __bindgen_test_layout_template_2() { assert_eq!(::std::mem::size_of::>() - , 1usize); + , 1usize , concat ! ( + "Size of template specialization: " , stringify ! ( + BaseWithDestructor ) )); assert_eq!(::std::mem::align_of::>() - , 1usize); + , 1usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + BaseWithDestructor ) )); } diff --git a/tests/expectations/tests/duplicated-namespaces-definitions.rs b/tests/expectations/tests/duplicated-namespaces-definitions.rs index abc4310ce1..1b785fd7f2 100644 --- a/tests/expectations/tests/duplicated-namespaces-definitions.rs +++ b/tests/expectations/tests/duplicated-namespaces-definitions.rs @@ -18,14 +18,20 @@ pub mod root { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Bar ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Bar ) )); assert_eq! (unsafe { & ( * ( 0 as * const Bar ) ) . foo as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar ) , "::" , + stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const Bar ) ) . baz as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar ) , "::" , + stringify ! ( baz ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } @@ -41,11 +47,15 @@ pub mod root { } #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const Foo ) ) . ptr as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Foo ) , "::" , + stringify ! ( ptr ) )); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/enum_and_vtable_mangling.rs b/tests/expectations/tests/enum_and_vtable_mangling.rs index 420246b585..e372d98bba 100644 --- a/tests/expectations/tests/enum_and_vtable_mangling.rs +++ b/tests/expectations/tests/enum_and_vtable_mangling.rs @@ -20,10 +20,14 @@ pub struct C { } #[test] fn bindgen_test_layout_C() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( C ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( C ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . i as * const _ as usize - } , 8usize); + } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( i ) )); } impl Clone for C { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/forward-declaration-autoptr.rs b/tests/expectations/tests/forward-declaration-autoptr.rs index a26d476ee7..ffe5b7b626 100644 --- a/tests/expectations/tests/forward-declaration-autoptr.rs +++ b/tests/expectations/tests/forward-declaration-autoptr.rs @@ -19,11 +19,15 @@ pub struct Bar { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Bar ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Bar ) )); assert_eq! (unsafe { & ( * ( 0 as * const Bar ) ) . m_member as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar ) , "::" , + stringify ! ( m_member ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/forward_declared_complex_types.rs b/tests/expectations/tests/forward_declared_complex_types.rs index c169ef6991..0637fea3fb 100644 --- a/tests/expectations/tests/forward_declared_complex_types.rs +++ b/tests/expectations/tests/forward_declared_complex_types.rs @@ -11,8 +11,10 @@ pub struct Foo_empty { } #[test] fn bindgen_test_layout_Foo_empty() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo_empty ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo_empty ) )); } impl Clone for Foo_empty { fn clone(&self) -> Self { *self } @@ -27,11 +29,15 @@ pub struct Bar { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Bar ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Bar ) )); assert_eq! (unsafe { & ( * ( 0 as * const Bar ) ) . f as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar ) , "::" , + stringify ! ( f ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/forward_declared_struct.rs b/tests/expectations/tests/forward_declared_struct.rs index 060156b2e6..51c61cdf0d 100644 --- a/tests/expectations/tests/forward_declared_struct.rs +++ b/tests/expectations/tests/forward_declared_struct.rs @@ -11,10 +11,14 @@ pub struct a { } #[test] fn bindgen_test_layout_a() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( a ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const a ) ) . b as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( a ) , "::" , stringify + ! ( b ) )); } impl Clone for a { fn clone(&self) -> Self { *self } @@ -26,10 +30,14 @@ pub struct c { } #[test] fn bindgen_test_layout_c() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( c ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( c ) )); assert_eq! (unsafe { & ( * ( 0 as * const c ) ) . d as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( c ) , "::" , stringify + ! ( d ) )); } impl Clone for c { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/func_ptr_in_struct.rs b/tests/expectations/tests/func_ptr_in_struct.rs index e1fac5e49a..eba6c7e2dc 100644 --- a/tests/expectations/tests/func_ptr_in_struct.rs +++ b/tests/expectations/tests/func_ptr_in_struct.rs @@ -17,11 +17,15 @@ pub struct Foo { } #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const Foo ) ) . bar as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Foo ) , "::" , + stringify ! ( bar ) )); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/inherit_typedef.rs b/tests/expectations/tests/inherit_typedef.rs index bc8eb472ee..ff6a62d3ce 100644 --- a/tests/expectations/tests/inherit_typedef.rs +++ b/tests/expectations/tests/inherit_typedef.rs @@ -11,8 +11,10 @@ pub struct Foo { } #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); } impl Clone for Foo { fn clone(&self) -> Self { *self } @@ -25,8 +27,10 @@ pub struct Bar { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Bar ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Bar ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/inline_namespace.rs b/tests/expectations/tests/inline_namespace.rs index 0c00724176..6b2c4f80c9 100644 --- a/tests/expectations/tests/inline_namespace.rs +++ b/tests/expectations/tests/inline_namespace.rs @@ -19,11 +19,15 @@ pub mod root { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + 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 { & ( * ( 0 as * const Bar ) ) . baz as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar ) , "::" , + stringify ! ( baz ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/inline_namespace_conservative.rs b/tests/expectations/tests/inline_namespace_conservative.rs index 4bd06cd9a2..5b74a5f6b9 100644 --- a/tests/expectations/tests/inline_namespace_conservative.rs +++ b/tests/expectations/tests/inline_namespace_conservative.rs @@ -24,11 +24,15 @@ pub mod root { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + 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 { & ( * ( 0 as * const Bar ) ) . baz as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar ) , "::" , + stringify ! ( baz ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/inner_const.rs b/tests/expectations/tests/inner_const.rs index bc7dd7ac99..3422f1683b 100644 --- a/tests/expectations/tests/inner_const.rs +++ b/tests/expectations/tests/inner_const.rs @@ -19,11 +19,15 @@ extern "C" { } #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const Foo ) ) . bar as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Foo ) , "::" , + stringify ! ( bar ) )); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/inner_template_self.rs b/tests/expectations/tests/inner_template_self.rs index 02ffea3d14..4345e422cb 100644 --- a/tests/expectations/tests/inner_template_self.rs +++ b/tests/expectations/tests/inner_template_self.rs @@ -17,11 +17,15 @@ pub struct InstantiateIt { } #[test] fn bindgen_test_layout_InstantiateIt() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( InstantiateIt ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( InstantiateIt ) )); assert_eq! (unsafe { & ( * ( 0 as * const InstantiateIt ) ) . m_list as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( InstantiateIt ) , "::" + , stringify ! ( m_list ) )); } impl Clone for InstantiateIt { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/issue-372.rs b/tests/expectations/tests/issue-372.rs index 810be82c79..8fcfd33dc7 100644 --- a/tests/expectations/tests/issue-372.rs +++ b/tests/expectations/tests/issue-372.rs @@ -14,11 +14,15 @@ pub mod root { } #[test] fn bindgen_test_layout_d() { - assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 24usize , concat ! ( + "Size of: " , stringify ! ( d ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( d ) )); assert_eq! (unsafe { & ( * ( 0 as * const d ) ) . m as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( d ) , "::" , + stringify ! ( m ) )); } impl Clone for d { fn clone(&self) -> Self { *self } @@ -32,17 +36,25 @@ pub mod root { } #[test] fn bindgen_test_layout_i() { - assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 24usize , concat ! ( + "Size of: " , stringify ! ( i ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( i ) )); assert_eq! (unsafe { & ( * ( 0 as * const i ) ) . j as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( i ) , "::" , + stringify ! ( j ) )); assert_eq! (unsafe { & ( * ( 0 as * const i ) ) . k as * const _ as usize } , - 8usize); + 8usize , concat ! ( + "Alignment of field: " , stringify ! ( i ) , "::" , + stringify ! ( k ) )); assert_eq! (unsafe { & ( * ( 0 as * const i ) ) . l as * const _ as usize } , - 16usize); + 16usize , concat ! ( + "Alignment of field: " , stringify ! ( i ) , "::" , + stringify ! ( l ) )); } impl Clone for i { fn clone(&self) -> Self { *self } @@ -69,10 +81,14 @@ pub mod root { } #[test] fn bindgen_test_layout_F() { - assert_eq!(::std::mem::size_of::() , 264usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 264usize , concat ! ( + "Size of: " , stringify ! ( F ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( F ) )); assert_eq! (unsafe { & ( * ( 0 as * const F ) ) . w as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( F ) , "::" , + stringify ! ( w ) )); } } diff --git a/tests/expectations/tests/issue-410.rs b/tests/expectations/tests/issue-410.rs index 69bf32a08e..a8e0d8d469 100644 --- a/tests/expectations/tests/issue-410.rs +++ b/tests/expectations/tests/issue-410.rs @@ -17,8 +17,10 @@ pub mod root { } #[test] fn bindgen_test_layout_Value() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Value ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Value ) )); } extern "C" { #[link_name = "_ZN2JS5Value1aE10JSWhyMagic"] diff --git a/tests/expectations/tests/issue-447.rs b/tests/expectations/tests/issue-447.rs index b315e00814..0582f4129e 100644 --- a/tests/expectations/tests/issue-447.rs +++ b/tests/expectations/tests/issue-447.rs @@ -21,9 +21,13 @@ pub mod root { #[test] fn bindgen_test_layout_GuardObjectNotifier() { assert_eq!(::std::mem::size_of::() , - 1usize); + 1usize , concat ! ( + "Size of: " , stringify ! ( GuardObjectNotifier ) + )); assert_eq! (::std::mem::align_of::() , - 1usize); + 1usize , concat ! ( + "Alignment of " , stringify ! ( + GuardObjectNotifier ) )); } impl Clone for GuardObjectNotifier { fn clone(&self) -> Self { *self } @@ -37,8 +41,12 @@ pub mod root { } #[test] fn bindgen_test_layout_JSAutoCompartment() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , + concat ! ( "Size of: " , stringify ! ( JSAutoCompartment ) + )); + assert_eq! (::std::mem::align_of::() , 1usize , + concat ! ( + "Alignment of " , stringify ! ( JSAutoCompartment ) )); } extern "C" { #[link_name = diff --git a/tests/expectations/tests/issue_311.rs b/tests/expectations/tests/issue_311.rs index 62b95806f0..debc893d57 100644 --- a/tests/expectations/tests/issue_311.rs +++ b/tests/expectations/tests/issue_311.rs @@ -20,17 +20,23 @@ pub mod root { #[test] fn bindgen_test_layout_jsval_layout__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , - 1usize); + 1usize , concat ! ( + "Size of: " , stringify ! ( jsval_layout__bindgen_ty_1 ) + )); assert_eq! (::std::mem::align_of::() , - 1usize); + 1usize , concat ! ( + "Alignment of " , stringify ! ( jsval_layout__bindgen_ty_1 + ) )); } impl Clone for jsval_layout__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_jsval_layout() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( jsval_layout ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! + ( "Alignment of " , stringify ! ( jsval_layout ) )); } impl Clone for jsval_layout { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/jsval_layout_opaque.rs b/tests/expectations/tests/jsval_layout_opaque.rs index d77493c722..ac09258736 100644 --- a/tests/expectations/tests/jsval_layout_opaque.rs +++ b/tests/expectations/tests/jsval_layout_opaque.rs @@ -114,9 +114,13 @@ pub struct jsval_layout__bindgen_ty_1 { } #[test] fn bindgen_test_layout_jsval_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , - 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , + concat ! ( + "Size of: " , stringify ! ( jsval_layout__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 8usize + , concat ! ( + "Alignment of " , stringify ! ( jsval_layout__bindgen_ty_1 ) + )); } impl Clone for jsval_layout__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -168,62 +172,98 @@ pub struct jsval_layout__bindgen_ty_2__bindgen_ty_1 { #[test] fn bindgen_test_layout_jsval_layout__bindgen_ty_2__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() - , 4usize); + , 4usize , concat ! ( + "Size of: " , stringify ! ( + jsval_layout__bindgen_ty_2__bindgen_ty_1 ) )); assert_eq! (::std::mem::align_of::() - , 4usize); + , 4usize , concat ! ( + "Alignment of " , stringify ! ( + jsval_layout__bindgen_ty_2__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout__bindgen_ty_2__bindgen_ty_1 ) ) - . i32 as * const _ as usize } , 0usize); + . i32 as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + jsval_layout__bindgen_ty_2__bindgen_ty_1 ) , "::" , stringify + ! ( i32 ) )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout__bindgen_ty_2__bindgen_ty_1 ) ) - . u32 as * const _ as usize } , 0usize); + . u32 as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + jsval_layout__bindgen_ty_2__bindgen_ty_1 ) , "::" , stringify + ! ( u32 ) )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout__bindgen_ty_2__bindgen_ty_1 ) ) - . why as * const _ as usize } , 0usize); + . why as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + jsval_layout__bindgen_ty_2__bindgen_ty_1 ) , "::" , stringify + ! ( why ) )); } impl Clone for jsval_layout__bindgen_ty_2__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_jsval_layout__bindgen_ty_2() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , - 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , + concat ! ( + "Size of: " , stringify ! ( jsval_layout__bindgen_ty_2 ) )); + assert_eq! (::std::mem::align_of::() , 4usize + , concat ! ( + "Alignment of " , stringify ! ( jsval_layout__bindgen_ty_2 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout__bindgen_ty_2 ) ) . payload - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + jsval_layout__bindgen_ty_2 ) , "::" , stringify ! ( payload ) + )); } impl Clone for jsval_layout__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_jsval_layout() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( jsval_layout ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( jsval_layout ) )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout ) ) . asBits as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( jsval_layout ) , "::" , + stringify ! ( asBits ) )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout ) ) . debugView as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( jsval_layout ) , "::" , + stringify ! ( debugView ) )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout ) ) . s as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( jsval_layout ) , "::" , + stringify ! ( s ) )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout ) ) . asDouble as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( jsval_layout ) , "::" , + stringify ! ( asDouble ) )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout ) ) . asPtr as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( jsval_layout ) , "::" , + stringify ! ( asPtr ) )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout ) ) . asWord as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( jsval_layout ) , "::" , + stringify ! ( asWord ) )); assert_eq! (unsafe { & ( * ( 0 as * const jsval_layout ) ) . asUIntPtr as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( jsval_layout ) , "::" , + stringify ! ( asUIntPtr ) )); } impl Clone for jsval_layout { fn clone(&self) -> Self { *self } @@ -235,11 +275,15 @@ pub struct Value { } #[test] fn bindgen_test_layout_Value() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Value ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Value ) )); assert_eq! (unsafe { & ( * ( 0 as * const Value ) ) . data as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Value ) , "::" , + stringify ! ( data ) )); } impl Clone for Value { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/layout.rs b/tests/expectations/tests/layout.rs index 2946112fcb..5fae570c9d 100644 --- a/tests/expectations/tests/layout.rs +++ b/tests/expectations/tests/layout.rs @@ -46,7 +46,8 @@ pub struct header { } #[test] fn bindgen_test_layout_header() { - assert_eq!(::std::mem::size_of::
() , 16usize); + assert_eq!(::std::mem::size_of::
() , 16usize , concat ! ( + "Size of: " , stringify ! ( header ) )); } impl Clone for header { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/layout_align.rs b/tests/expectations/tests/layout_align.rs index 8b243f5397..0479521cee 100644 --- a/tests/expectations/tests/layout_align.rs +++ b/tests/expectations/tests/layout_align.rs @@ -53,8 +53,10 @@ pub struct rte_kni_fifo { } #[test] fn bindgen_test_layout_rte_kni_fifo() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( rte_kni_fifo ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( rte_kni_fifo ) )); } impl Clone for rte_kni_fifo { fn clone(&self) -> Self { *self } @@ -69,11 +71,15 @@ pub struct rte_eth_link { } #[test] fn bindgen_test_layout_rte_eth_link() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( rte_eth_link ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( rte_eth_link ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_link ) ) . link_speed as * const - _ as usize } , 0usize); + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_link ) , "::" , + stringify ! ( link_speed ) )); } impl Clone for rte_eth_link { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/layout_arp.rs b/tests/expectations/tests/layout_arp.rs index f1feb92bf0..c868f627d5 100644 --- a/tests/expectations/tests/layout_arp.rs +++ b/tests/expectations/tests/layout_arp.rs @@ -31,11 +31,15 @@ pub struct ether_addr { } #[test] fn bindgen_test_layout_ether_addr() { - assert_eq!(::std::mem::size_of::() , 6usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 6usize , concat ! ( + "Size of: " , stringify ! ( ether_addr ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( ether_addr ) )); assert_eq! (unsafe { & ( * ( 0 as * const ether_addr ) ) . addr_bytes as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ether_addr ) , "::" , + stringify ! ( addr_bytes ) )); } impl Clone for ether_addr { fn clone(&self) -> Self { *self } @@ -57,20 +61,30 @@ pub struct arp_ipv4 { } #[test] fn bindgen_test_layout_arp_ipv4() { - assert_eq!(::std::mem::size_of::() , 20usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 20usize , concat ! ( + "Size of: " , stringify ! ( arp_ipv4 ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( arp_ipv4 ) )); assert_eq! (unsafe { & ( * ( 0 as * const arp_ipv4 ) ) . arp_sha as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( arp_ipv4 ) , "::" , + stringify ! ( arp_sha ) )); assert_eq! (unsafe { & ( * ( 0 as * const arp_ipv4 ) ) . arp_sip as * const _ as - usize } , 6usize); + usize } , 6usize , concat ! ( + "Alignment of field: " , stringify ! ( arp_ipv4 ) , "::" , + stringify ! ( arp_sip ) )); assert_eq! (unsafe { & ( * ( 0 as * const arp_ipv4 ) ) . arp_tha as * const _ as - usize } , 10usize); + usize } , 10usize , concat ! ( + "Alignment of field: " , stringify ! ( arp_ipv4 ) , "::" , + stringify ! ( arp_tha ) )); assert_eq! (unsafe { & ( * ( 0 as * const arp_ipv4 ) ) . arp_tip as * const _ as - usize } , 16usize); + usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( arp_ipv4 ) , "::" , + stringify ! ( arp_tip ) )); } impl Clone for arp_ipv4 { fn clone(&self) -> Self { *self } @@ -90,26 +104,40 @@ pub struct arp_hdr { } #[test] fn bindgen_test_layout_arp_hdr() { - assert_eq!(::std::mem::size_of::() , 28usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 28usize , concat ! ( + "Size of: " , stringify ! ( arp_hdr ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( arp_hdr ) )); assert_eq! (unsafe { & ( * ( 0 as * const arp_hdr ) ) . arp_hrd as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( arp_hdr ) , "::" , + stringify ! ( arp_hrd ) )); assert_eq! (unsafe { & ( * ( 0 as * const arp_hdr ) ) . arp_pro as * const _ as - usize } , 2usize); + usize } , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( arp_hdr ) , "::" , + stringify ! ( arp_pro ) )); assert_eq! (unsafe { & ( * ( 0 as * const arp_hdr ) ) . arp_hln as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( arp_hdr ) , "::" , + stringify ! ( arp_hln ) )); assert_eq! (unsafe { & ( * ( 0 as * const arp_hdr ) ) . arp_pln as * const _ as - usize } , 5usize); + usize } , 5usize , concat ! ( + "Alignment of field: " , stringify ! ( arp_hdr ) , "::" , + stringify ! ( arp_pln ) )); assert_eq! (unsafe { & ( * ( 0 as * const arp_hdr ) ) . arp_op as * const _ as - usize } , 6usize); + usize } , 6usize , concat ! ( + "Alignment of field: " , stringify ! ( arp_hdr ) , "::" , + stringify ! ( arp_op ) )); assert_eq! (unsafe { & ( * ( 0 as * const arp_hdr ) ) . arp_data as * const _ as - usize } , 8usize); + usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( arp_hdr ) , "::" , + stringify ! ( arp_data ) )); } impl Clone for arp_hdr { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/layout_array.rs b/tests/expectations/tests/layout_array.rs index 080a0a8377..bc690fb6e5 100644 --- a/tests/expectations/tests/layout_array.rs +++ b/tests/expectations/tests/layout_array.rs @@ -73,25 +73,38 @@ pub struct rte_mempool_ops { } #[test] fn bindgen_test_layout_rte_mempool_ops() { - assert_eq!(::std::mem::size_of::() , 128usize); + assert_eq!(::std::mem::size_of::() , 128usize , concat ! + ( "Size of: " , stringify ! ( rte_mempool_ops ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mempool_ops ) ) . name as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mempool_ops ) , + "::" , stringify ! ( name ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mempool_ops ) ) . alloc as * const _ - as usize } , 32usize); + as usize } , 32usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mempool_ops ) , + "::" , stringify ! ( alloc ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mempool_ops ) ) . free as * const _ - as usize } , 40usize); + as usize } , 40usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mempool_ops ) , + "::" , stringify ! ( free ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mempool_ops ) ) . enqueue as * const - _ as usize } , 48usize); + _ as usize } , 48usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mempool_ops ) , + "::" , stringify ! ( enqueue ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mempool_ops ) ) . dequeue as * const - _ as usize } , 56usize); + _ as usize } , 56usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mempool_ops ) , + "::" , stringify ! ( dequeue ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mempool_ops ) ) . get_count as * - const _ as usize } , 64usize); + const _ as usize } , 64usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mempool_ops ) , + "::" , stringify ! ( get_count ) )); } impl Clone for rte_mempool_ops { fn clone(&self) -> Self { *self } @@ -107,11 +120,15 @@ pub struct _bindgen_ty_1 { } #[test] fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize); - assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize); + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize , concat ! ( + "Size of: " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize , concat ! ( + "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const _bindgen_ty_1 ) ) . locked as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( locked ) )); } impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -141,16 +158,24 @@ pub struct rte_mempool_ops_table { } #[test] fn bindgen_test_layout_rte_mempool_ops_table() { - assert_eq!(::std::mem::size_of::() , 2112usize); + assert_eq!(::std::mem::size_of::() , 2112usize , + concat ! ( "Size of: " , stringify ! ( rte_mempool_ops_table ) + )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mempool_ops_table ) ) . sl as * const - _ as usize } , 0usize); + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mempool_ops_table ) + , "::" , stringify ! ( sl ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mempool_ops_table ) ) . num_ops as * - const _ as usize } , 4usize); + const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mempool_ops_table ) + , "::" , stringify ! ( num_ops ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mempool_ops_table ) ) . ops as * - const _ as usize } , 64usize); + const _ as usize } , 64usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mempool_ops_table ) + , "::" , stringify ! ( ops ) )); } impl Clone for rte_mempool_ops_table { fn clone(&self) -> Self { *self } @@ -176,30 +201,47 @@ pub struct malloc_heap__bindgen_ty_1 { pub struct malloc_heap__bindgen_ty_1_malloc_elem([u8; 0]); #[test] fn bindgen_test_layout_malloc_heap__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , + concat ! ( + "Size of: " , stringify ! ( malloc_heap__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 8usize , + concat ! ( + "Alignment of " , stringify ! ( malloc_heap__bindgen_ty_1 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const malloc_heap__bindgen_ty_1 ) ) . lh_first - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + malloc_heap__bindgen_ty_1 ) , "::" , stringify ! ( lh_first ) + )); } impl Clone for malloc_heap__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_malloc_heap() { - assert_eq!(::std::mem::size_of::() , 128usize); + assert_eq!(::std::mem::size_of::() , 128usize , concat ! ( + "Size of: " , stringify ! ( malloc_heap ) )); assert_eq! (unsafe { & ( * ( 0 as * const malloc_heap ) ) . lock as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( malloc_heap ) , "::" , + stringify ! ( lock ) )); assert_eq! (unsafe { & ( * ( 0 as * const malloc_heap ) ) . free_head as * const _ - as usize } , 8usize); + as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( malloc_heap ) , "::" , + stringify ! ( free_head ) )); assert_eq! (unsafe { & ( * ( 0 as * const malloc_heap ) ) . alloc_count as * const - _ as usize } , 112usize); + _ as usize } , 112usize , concat ! ( + "Alignment of field: " , stringify ! ( malloc_heap ) , "::" , + stringify ! ( alloc_count ) )); assert_eq! (unsafe { & ( * ( 0 as * const malloc_heap ) ) . total_size as * const _ - as usize } , 120usize); + as usize } , 120usize , concat ! ( + "Alignment of field: " , stringify ! ( malloc_heap ) , "::" , + stringify ! ( total_size ) )); } impl Clone for malloc_heap { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/layout_cmdline_token.rs b/tests/expectations/tests/layout_cmdline_token.rs index 4966b307b6..be4944bbfa 100644 --- a/tests/expectations/tests/layout_cmdline_token.rs +++ b/tests/expectations/tests/layout_cmdline_token.rs @@ -72,35 +72,58 @@ pub struct cmdline_token_hdr_cmdline_token_ops { #[test] fn bindgen_test_layout_cmdline_token_hdr_cmdline_token_ops() { assert_eq!(::std::mem::size_of::() , - 32usize); + 32usize , concat ! ( + "Size of: " , stringify ! ( cmdline_token_hdr_cmdline_token_ops + ) )); assert_eq! (::std::mem::align_of::() - , 8usize); + , 8usize , concat ! ( + "Alignment of " , stringify ! ( + cmdline_token_hdr_cmdline_token_ops ) )); assert_eq! (unsafe { & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . - parse as * const _ as usize } , 0usize); + parse as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + cmdline_token_hdr_cmdline_token_ops ) , "::" , stringify ! ( + parse ) )); assert_eq! (unsafe { & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . - complete_get_nb as * const _ as usize } , 8usize); + complete_get_nb as * const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( + cmdline_token_hdr_cmdline_token_ops ) , "::" , stringify ! ( + complete_get_nb ) )); assert_eq! (unsafe { & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . - complete_get_elt as * const _ as usize } , 16usize); + complete_get_elt as * const _ as usize } , 16usize , concat ! + ( + "Alignment of field: " , stringify ! ( + cmdline_token_hdr_cmdline_token_ops ) , "::" , stringify ! ( + complete_get_elt ) )); assert_eq! (unsafe { & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . - get_help as * const _ as usize } , 24usize); + get_help as * const _ as usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( + cmdline_token_hdr_cmdline_token_ops ) , "::" , stringify ! ( + get_help ) )); } impl Clone for cmdline_token_hdr_cmdline_token_ops { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_cmdline_token_hdr() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! + ( "Size of: " , stringify ! ( cmdline_token_hdr ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat + ! ( "Alignment of " , stringify ! ( cmdline_token_hdr ) )); assert_eq! (unsafe { & ( * ( 0 as * const cmdline_token_hdr ) ) . ops as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_hdr ) , + "::" , stringify ! ( ops ) )); assert_eq! (unsafe { & ( * ( 0 as * const cmdline_token_hdr ) ) . offset as * const - _ as usize } , 8usize); + _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_hdr ) , + "::" , stringify ! ( offset ) )); } impl Clone for cmdline_token_hdr { fn clone(&self) -> Self { *self } @@ -125,11 +148,17 @@ pub struct cmdline_token_num_data { } #[test] fn bindgen_test_layout_cmdline_token_num_data() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , + concat ! ( "Size of: " , stringify ! ( cmdline_token_num_data ) + )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( cmdline_token_num_data ) )); assert_eq! (unsafe { & ( * ( 0 as * const cmdline_token_num_data ) ) . type_ as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_num_data + ) , "::" , stringify ! ( type_ ) )); } impl Clone for cmdline_token_num_data { fn clone(&self) -> Self { *self } @@ -142,14 +171,20 @@ pub struct cmdline_token_num { } #[test] fn bindgen_test_layout_cmdline_token_num() { - assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 24usize , concat ! + ( "Size of: " , stringify ! ( cmdline_token_num ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat + ! ( "Alignment of " , stringify ! ( cmdline_token_num ) )); assert_eq! (unsafe { & ( * ( 0 as * const cmdline_token_num ) ) . hdr as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_num ) , + "::" , stringify ! ( hdr ) )); assert_eq! (unsafe { & ( * ( 0 as * const cmdline_token_num ) ) . num_data as * - const _ as usize } , 16usize); + const _ as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_num ) , + "::" , stringify ! ( num_data ) )); } impl Clone for cmdline_token_num { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/layout_eth_conf.rs b/tests/expectations/tests/layout_eth_conf.rs index 70d050b00d..0034e707b9 100644 --- a/tests/expectations/tests/layout_eth_conf.rs +++ b/tests/expectations/tests/layout_eth_conf.rs @@ -92,17 +92,25 @@ pub struct rte_eth_rxmode { } #[test] fn bindgen_test_layout_rte_eth_rxmode() { - assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 12usize , concat ! ( + "Size of: " , stringify ! ( rte_eth_rxmode ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( rte_eth_rxmode ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_rxmode ) ) . mq_mode as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_rxmode ) , "::" + , stringify ! ( mq_mode ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_rxmode ) ) . max_rx_pkt_len as * - const _ as usize } , 4usize); + const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_rxmode ) , "::" + , stringify ! ( max_rx_pkt_len ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_rxmode ) ) . split_hdr_size as * - const _ as usize } , 8usize); + const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_rxmode ) , "::" + , stringify ! ( split_hdr_size ) )); } impl Clone for rte_eth_rxmode { fn clone(&self) -> Self { *self } @@ -242,14 +250,20 @@ pub struct rte_eth_txmode { } #[test] fn bindgen_test_layout_rte_eth_txmode() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( rte_eth_txmode ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( rte_eth_txmode ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_txmode ) ) . mq_mode as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_txmode ) , "::" + , stringify ! ( mq_mode ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_txmode ) ) . pvid as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_txmode ) , "::" + , stringify ! ( pvid ) )); } impl Clone for rte_eth_txmode { fn clone(&self) -> Self { *self } @@ -321,17 +335,25 @@ pub struct rte_eth_rss_conf { } #[test] fn bindgen_test_layout_rte_eth_rss_conf() { - assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 24usize , concat ! + ( "Size of: " , stringify ! ( rte_eth_rss_conf ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! + ( "Alignment of " , stringify ! ( rte_eth_rss_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_rss_conf ) ) . rss_key as * const - _ as usize } , 0usize); + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_rss_conf ) , + "::" , stringify ! ( rss_key ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_rss_conf ) ) . rss_key_len as * - const _ as usize } , 8usize); + const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_rss_conf ) , + "::" , stringify ! ( rss_key_len ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_rss_conf ) ) . rss_hf as * const - _ as usize } , 16usize); + _ as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_rss_conf ) , + "::" , stringify ! ( rss_hf ) )); } impl Clone for rte_eth_rss_conf { fn clone(&self) -> Self { *self } @@ -391,41 +413,68 @@ pub struct rte_eth_vmdq_dcb_conf__bindgen_ty_1 { #[test] fn bindgen_test_layout_rte_eth_vmdq_dcb_conf__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , - 16usize); + 16usize , concat ! ( + "Size of: " , stringify ! ( rte_eth_vmdq_dcb_conf__bindgen_ty_1 + ) )); assert_eq! (::std::mem::align_of::() - , 8usize); + , 8usize , concat ! ( + "Alignment of " , stringify ! ( + rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) ) . - vlan_id as * const _ as usize } , 0usize); + vlan_id as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) , "::" , stringify ! ( + vlan_id ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) ) . - pools as * const _ as usize } , 8usize); + pools as * const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) , "::" , stringify ! ( + pools ) )); } impl Clone for rte_eth_vmdq_dcb_conf__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_rte_eth_vmdq_dcb_conf() { - assert_eq!(::std::mem::size_of::() , 1040usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 1040usize , + concat ! ( "Size of: " , stringify ! ( rte_eth_vmdq_dcb_conf ) + )); + assert_eq! (::std::mem::align_of::() , 8usize , + concat ! ( + "Alignment of " , stringify ! ( rte_eth_vmdq_dcb_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . - nb_queue_pools as * const _ as usize } , 0usize); + nb_queue_pools as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf ) + , "::" , stringify ! ( nb_queue_pools ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . - enable_default_pool as * const _ as usize } , 4usize); + enable_default_pool as * const _ as usize } , 4usize , concat + ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf ) + , "::" , stringify ! ( enable_default_pool ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . default_pool - as * const _ as usize } , 5usize); + as * const _ as usize } , 5usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf ) + , "::" , stringify ! ( default_pool ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . nb_pool_maps - as * const _ as usize } , 6usize); + as * const _ as usize } , 6usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf ) + , "::" , stringify ! ( nb_pool_maps ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . pool_map as * - const _ as usize } , 8usize); + const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf ) + , "::" , stringify ! ( pool_map ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . dcb_tc as * - const _ as usize } , 1032usize); + const _ as usize } , 1032usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf ) + , "::" , stringify ! ( dcb_tc ) )); } #[repr(C)] #[derive(Debug, Copy)] @@ -437,14 +486,21 @@ pub struct rte_eth_dcb_rx_conf { } #[test] fn bindgen_test_layout_rte_eth_dcb_rx_conf() { - assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 12usize , concat + ! ( "Size of: " , stringify ! ( rte_eth_dcb_rx_conf ) )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( rte_eth_dcb_rx_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_dcb_rx_conf ) ) . nb_tcs as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_dcb_rx_conf ) , + "::" , stringify ! ( nb_tcs ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_dcb_rx_conf ) ) . dcb_tc as * - const _ as usize } , 4usize); + const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_dcb_rx_conf ) , + "::" , stringify ! ( dcb_tc ) )); } impl Clone for rte_eth_dcb_rx_conf { fn clone(&self) -> Self { *self } @@ -459,14 +515,23 @@ pub struct rte_eth_vmdq_dcb_tx_conf { } #[test] fn bindgen_test_layout_rte_eth_vmdq_dcb_tx_conf() { - assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 12usize , + concat ! ( + "Size of: " , stringify ! ( rte_eth_vmdq_dcb_tx_conf ) )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( rte_eth_vmdq_dcb_tx_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_dcb_tx_conf ) ) . - nb_queue_pools as * const _ as usize } , 0usize); + nb_queue_pools as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_vmdq_dcb_tx_conf ) , "::" , stringify ! ( + nb_queue_pools ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_dcb_tx_conf ) ) . dcb_tc as - * const _ as usize } , 4usize); + * const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_vmdq_dcb_tx_conf ) , "::" , stringify ! ( dcb_tc ) )); } impl Clone for rte_eth_vmdq_dcb_tx_conf { fn clone(&self) -> Self { *self } @@ -481,14 +546,21 @@ pub struct rte_eth_dcb_tx_conf { } #[test] fn bindgen_test_layout_rte_eth_dcb_tx_conf() { - assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 12usize , concat + ! ( "Size of: " , stringify ! ( rte_eth_dcb_tx_conf ) )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( rte_eth_dcb_tx_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_dcb_tx_conf ) ) . nb_tcs as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_dcb_tx_conf ) , + "::" , stringify ! ( nb_tcs ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_dcb_tx_conf ) ) . dcb_tc as * - const _ as usize } , 4usize); + const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_dcb_tx_conf ) , + "::" , stringify ! ( dcb_tc ) )); } impl Clone for rte_eth_dcb_tx_conf { fn clone(&self) -> Self { *self } @@ -501,11 +573,16 @@ pub struct rte_eth_vmdq_tx_conf { } #[test] fn bindgen_test_layout_rte_eth_vmdq_tx_conf() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat + ! ( "Size of: " , stringify ! ( rte_eth_vmdq_tx_conf ) )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( rte_eth_vmdq_tx_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_tx_conf ) ) . nb_queue_pools - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_tx_conf ) + , "::" , stringify ! ( nb_queue_pools ) )); } impl Clone for rte_eth_vmdq_tx_conf { fn clone(&self) -> Self { *self } @@ -538,44 +615,73 @@ pub struct rte_eth_vmdq_rx_conf__bindgen_ty_1 { #[test] fn bindgen_test_layout_rte_eth_vmdq_rx_conf__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , - 16usize); + 16usize , concat ! ( + "Size of: " , stringify ! ( rte_eth_vmdq_rx_conf__bindgen_ty_1 + ) )); assert_eq! (::std::mem::align_of::() , - 8usize); + 8usize , concat ! ( + "Alignment of " , stringify ! ( + rte_eth_vmdq_rx_conf__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_rx_conf__bindgen_ty_1 ) ) . - vlan_id as * const _ as usize } , 0usize); + vlan_id as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_vmdq_rx_conf__bindgen_ty_1 ) , "::" , stringify ! ( + vlan_id ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_rx_conf__bindgen_ty_1 ) ) . - pools as * const _ as usize } , 8usize); + pools as * const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_vmdq_rx_conf__bindgen_ty_1 ) , "::" , stringify ! ( + pools ) )); } impl Clone for rte_eth_vmdq_rx_conf__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_rte_eth_vmdq_rx_conf() { - assert_eq!(::std::mem::size_of::() , 1040usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 1040usize , + concat ! ( "Size of: " , stringify ! ( rte_eth_vmdq_rx_conf ) + )); + assert_eq! (::std::mem::align_of::() , 8usize , + concat ! ( + "Alignment of " , stringify ! ( rte_eth_vmdq_rx_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . nb_queue_pools - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf ) + , "::" , stringify ! ( nb_queue_pools ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . - enable_default_pool as * const _ as usize } , 4usize); + enable_default_pool as * const _ as usize } , 4usize , concat + ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf ) + , "::" , stringify ! ( enable_default_pool ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . default_pool - as * const _ as usize } , 5usize); + as * const _ as usize } , 5usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf ) + , "::" , stringify ! ( default_pool ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . - enable_loop_back as * const _ as usize } , 6usize); + enable_loop_back as * const _ as usize } , 6usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf ) + , "::" , stringify ! ( enable_loop_back ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . nb_pool_maps - as * const _ as usize } , 7usize); + as * const _ as usize } , 7usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf ) + , "::" , stringify ! ( nb_pool_maps ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . rx_mode as * - const _ as usize } , 8usize); + const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf ) + , "::" , stringify ! ( rx_mode ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . pool_map as * - const _ as usize } , 16usize); + const _ as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf ) + , "::" , stringify ! ( pool_map ) )); } #[repr(u32)] /** @@ -629,23 +735,35 @@ pub struct rte_eth_ipv4_flow { } #[test] fn bindgen_test_layout_rte_eth_ipv4_flow() { - assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 12usize , concat ! + ( "Size of: " , stringify ! ( rte_eth_ipv4_flow ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( rte_eth_ipv4_flow ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . src_ip as * const - _ as usize } , 0usize); + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_ipv4_flow ) , + "::" , stringify ! ( src_ip ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . dst_ip as * const - _ as usize } , 4usize); + _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_ipv4_flow ) , + "::" , stringify ! ( dst_ip ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . tos as * const _ - as usize } , 8usize); + as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_ipv4_flow ) , + "::" , stringify ! ( tos ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . ttl as * const _ - as usize } , 9usize); + as usize } , 9usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_ipv4_flow ) , + "::" , stringify ! ( ttl ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . proto as * const - _ as usize } , 10usize); + _ as usize } , 10usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_ipv4_flow ) , + "::" , stringify ! ( proto ) )); } impl Clone for rte_eth_ipv4_flow { fn clone(&self) -> Self { *self } @@ -669,23 +787,35 @@ pub struct rte_eth_ipv6_flow { } #[test] fn bindgen_test_layout_rte_eth_ipv6_flow() { - assert_eq!(::std::mem::size_of::() , 36usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 36usize , concat ! + ( "Size of: " , stringify ! ( rte_eth_ipv6_flow ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( rte_eth_ipv6_flow ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . src_ip as * const - _ as usize } , 0usize); + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_ipv6_flow ) , + "::" , stringify ! ( src_ip ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . dst_ip as * const - _ as usize } , 16usize); + _ as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_ipv6_flow ) , + "::" , stringify ! ( dst_ip ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . tc as * const _ - as usize } , 32usize); + as usize } , 32usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_ipv6_flow ) , + "::" , stringify ! ( tc ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . proto as * const - _ as usize } , 33usize); + _ as usize } , 33usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_ipv6_flow ) , + "::" , stringify ! ( proto ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . hop_limits as * - const _ as usize } , 34usize); + const _ as usize } , 34usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_ipv6_flow ) , + "::" , stringify ! ( hop_limits ) )); } impl Clone for rte_eth_ipv6_flow { fn clone(&self) -> Self { *self } @@ -718,32 +848,51 @@ pub struct rte_eth_fdir_masks { } #[test] fn bindgen_test_layout_rte_eth_fdir_masks() { - assert_eq!(::std::mem::size_of::() , 68usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 68usize , concat + ! ( "Size of: " , stringify ! ( rte_eth_fdir_masks ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( rte_eth_fdir_masks ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_masks ) ) . vlan_tci_mask as - * const _ as usize } , 0usize); + * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) , + "::" , stringify ! ( vlan_tci_mask ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_masks ) ) . ipv4_mask as * - const _ as usize } , 4usize); + const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) , + "::" , stringify ! ( ipv4_mask ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_masks ) ) . ipv6_mask as * - const _ as usize } , 16usize); + const _ as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) , + "::" , stringify ! ( ipv6_mask ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_masks ) ) . src_port_mask as - * const _ as usize } , 52usize); + * const _ as usize } , 52usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) , + "::" , stringify ! ( src_port_mask ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_masks ) ) . dst_port_mask as - * const _ as usize } , 54usize); + * const _ as usize } , 54usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) , + "::" , stringify ! ( dst_port_mask ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_masks ) ) . - mac_addr_byte_mask as * const _ as usize } , 56usize); + mac_addr_byte_mask as * const _ as usize } , 56usize , concat + ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) , + "::" , stringify ! ( mac_addr_byte_mask ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_masks ) ) . tunnel_id_mask - as * const _ as usize } , 60usize); + as * const _ as usize } , 60usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) , + "::" , stringify ! ( tunnel_id_mask ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_masks ) ) . tunnel_type_mask - as * const _ as usize } , 64usize); + as * const _ as usize } , 64usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) , + "::" , stringify ! ( tunnel_type_mask ) )); } impl Clone for rte_eth_fdir_masks { fn clone(&self) -> Self { *self } @@ -774,14 +923,23 @@ pub struct rte_eth_flex_payload_cfg { } #[test] fn bindgen_test_layout_rte_eth_flex_payload_cfg() { - assert_eq!(::std::mem::size_of::() , 36usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 36usize , + concat ! ( + "Size of: " , stringify ! ( rte_eth_flex_payload_cfg ) )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( rte_eth_flex_payload_cfg ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_flex_payload_cfg ) ) . type_ as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_flex_payload_cfg ) , "::" , stringify ! ( type_ ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_flex_payload_cfg ) ) . src_offset - as * const _ as usize } , 4usize); + as * const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_flex_payload_cfg ) , "::" , stringify ! ( src_offset ) + )); } impl Clone for rte_eth_flex_payload_cfg { fn clone(&self) -> Self { *self } @@ -798,14 +956,22 @@ pub struct rte_eth_fdir_flex_mask { } #[test] fn bindgen_test_layout_rte_eth_fdir_flex_mask() { - assert_eq!(::std::mem::size_of::() , 18usize); - assert_eq! (::std::mem::align_of::() , 2usize); + assert_eq!(::std::mem::size_of::() , 18usize , + concat ! ( "Size of: " , stringify ! ( rte_eth_fdir_flex_mask ) + )); + assert_eq! (::std::mem::align_of::() , 2usize , + concat ! ( + "Alignment of " , stringify ! ( rte_eth_fdir_flex_mask ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_flex_mask ) ) . flow_type as - * const _ as usize } , 0usize); + * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_mask + ) , "::" , stringify ! ( flow_type ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_flex_mask ) ) . mask as * - const _ as usize } , 2usize); + const _ as usize } , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_mask + ) , "::" , stringify ! ( mask ) )); } impl Clone for rte_eth_fdir_flex_mask { fn clone(&self) -> Self { *self } @@ -826,20 +992,32 @@ pub struct rte_eth_fdir_flex_conf { } #[test] fn bindgen_test_layout_rte_eth_fdir_flex_conf() { - assert_eq!(::std::mem::size_of::() , 688usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 688usize , + concat ! ( "Size of: " , stringify ! ( rte_eth_fdir_flex_conf ) + )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( rte_eth_fdir_flex_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . nb_payloads - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_conf + ) , "::" , stringify ! ( nb_payloads ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . nb_flexmasks - as * const _ as usize } , 2usize); + as * const _ as usize } , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_conf + ) , "::" , stringify ! ( nb_flexmasks ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . flex_set as - * const _ as usize } , 4usize); + * const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_conf + ) , "::" , stringify ! ( flex_set ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . flex_mask as - * const _ as usize } , 292usize); + * const _ as usize } , 292usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_conf + ) , "::" , stringify ! ( flex_mask ) )); } impl Clone for rte_eth_fdir_flex_conf { fn clone(&self) -> Self { *self } @@ -866,26 +1044,40 @@ pub struct rte_fdir_conf { } #[test] fn bindgen_test_layout_rte_fdir_conf() { - assert_eq!(::std::mem::size_of::() , 772usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 772usize , concat ! ( + "Size of: " , stringify ! ( rte_fdir_conf ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( rte_fdir_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_fdir_conf ) ) . mode as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::" + , stringify ! ( mode ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_fdir_conf ) ) . pballoc as * const _ - as usize } , 4usize); + as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::" + , stringify ! ( pballoc ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_fdir_conf ) ) . status as * const _ - as usize } , 8usize); + as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::" + , stringify ! ( status ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_fdir_conf ) ) . drop_queue as * const - _ as usize } , 12usize); + _ as usize } , 12usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::" + , stringify ! ( drop_queue ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_fdir_conf ) ) . mask as * const _ as - usize } , 16usize); + usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::" + , stringify ! ( mask ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_fdir_conf ) ) . flex_conf as * const - _ as usize } , 84usize); + _ as usize } , 84usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::" + , stringify ! ( flex_conf ) )); } impl Clone for rte_fdir_conf { fn clone(&self) -> Self { *self } @@ -903,14 +1095,20 @@ pub struct rte_intr_conf { } #[test] fn bindgen_test_layout_rte_intr_conf() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 2usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( rte_intr_conf ) )); + assert_eq! (::std::mem::align_of::() , 2usize , concat ! ( + "Alignment of " , stringify ! ( rte_intr_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_intr_conf ) ) . lsc as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_intr_conf ) , "::" + , stringify ! ( lsc ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_intr_conf ) ) . rxq as * const _ as - usize } , 2usize); + usize } , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_intr_conf ) , "::" + , stringify ! ( rxq ) )); } impl Clone for rte_intr_conf { fn clone(&self) -> Self { *self } @@ -962,22 +1160,37 @@ pub struct rte_eth_conf__bindgen_ty_1 { } #[test] fn bindgen_test_layout_rte_eth_conf__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , - 2120usize); - assert_eq! (::std::mem::align_of::() , - 8usize); + assert_eq!(::std::mem::size_of::() , 2120usize + , concat ! ( + "Size of: " , stringify ! ( rte_eth_conf__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 8usize + , concat ! ( + "Alignment of " , stringify ! ( rte_eth_conf__bindgen_ty_1 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) . rss_conf - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_conf__bindgen_ty_1 ) , "::" , stringify ! ( rss_conf ) + )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) . - vmdq_dcb_conf as * const _ as usize } , 24usize); + vmdq_dcb_conf as * const _ as usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_conf__bindgen_ty_1 ) , "::" , stringify ! ( + vmdq_dcb_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) . - dcb_rx_conf as * const _ as usize } , 1064usize); + dcb_rx_conf as * const _ as usize } , 1064usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_conf__bindgen_ty_1 ) , "::" , stringify ! ( + dcb_rx_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) . - vmdq_rx_conf as * const _ as usize } , 1080usize); + vmdq_rx_conf as * const _ as usize } , 1080usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_conf__bindgen_ty_1 ) , "::" , stringify ! ( + vmdq_rx_conf ) )); } #[repr(C)] #[derive(Debug, Copy)] @@ -989,51 +1202,84 @@ pub struct rte_eth_conf__bindgen_ty_2 { } #[test] fn bindgen_test_layout_rte_eth_conf__bindgen_ty_2() { - assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq! (::std::mem::align_of::() , - 4usize); + assert_eq!(::std::mem::size_of::() , 12usize , + concat ! ( + "Size of: " , stringify ! ( rte_eth_conf__bindgen_ty_2 ) )); + assert_eq! (::std::mem::align_of::() , 4usize + , concat ! ( + "Alignment of " , stringify ! ( rte_eth_conf__bindgen_ty_2 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf__bindgen_ty_2 ) ) . - vmdq_dcb_tx_conf as * const _ as usize } , 0usize); + vmdq_dcb_tx_conf as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_conf__bindgen_ty_2 ) , "::" , stringify ! ( + vmdq_dcb_tx_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf__bindgen_ty_2 ) ) . - dcb_tx_conf as * const _ as usize } , 0usize); + dcb_tx_conf as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_conf__bindgen_ty_2 ) , "::" , stringify ! ( + dcb_tx_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf__bindgen_ty_2 ) ) . - vmdq_tx_conf as * const _ as usize } , 0usize); + vmdq_tx_conf as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_eth_conf__bindgen_ty_2 ) , "::" , stringify ! ( + vmdq_tx_conf ) )); } impl Clone for rte_eth_conf__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_rte_eth_conf() { - assert_eq!(::std::mem::size_of::() , 2944usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 2944usize , concat ! ( + "Size of: " , stringify ! ( rte_eth_conf ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( rte_eth_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf ) ) . link_speeds as * const - _ as usize } , 0usize); + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" , + stringify ! ( link_speeds ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf ) ) . rxmode as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" , + stringify ! ( rxmode ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf ) ) . txmode as * const _ as - usize } , 16usize); + usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" , + stringify ! ( txmode ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf ) ) . lpbk_mode as * const _ - as usize } , 24usize); + as usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" , + stringify ! ( lpbk_mode ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf ) ) . rx_adv_conf as * const - _ as usize } , 32usize); + _ as usize } , 32usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" , + stringify ! ( rx_adv_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf ) ) . tx_adv_conf as * const - _ as usize } , 2152usize); + _ as usize } , 2152usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" , + stringify ! ( tx_adv_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf ) ) . dcb_capability_en as * - const _ as usize } , 2164usize); + const _ as usize } , 2164usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" , + stringify ! ( dcb_capability_en ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf ) ) . fdir_conf as * const _ - as usize } , 2168usize); + as usize } , 2168usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" , + stringify ! ( fdir_conf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_eth_conf ) ) . intr_conf as * const _ - as usize } , 2940usize); + as usize } , 2940usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" , + stringify ! ( intr_conf ) )); } diff --git a/tests/expectations/tests/layout_kni_mbuf.rs b/tests/expectations/tests/layout_kni_mbuf.rs index bdaf0845e9..e0e3579aca 100644 --- a/tests/expectations/tests/layout_kni_mbuf.rs +++ b/tests/expectations/tests/layout_kni_mbuf.rs @@ -33,49 +33,78 @@ pub struct rte_kni_mbuf { } #[test] fn bindgen_test_layout_rte_kni_mbuf() { - assert_eq!(::std::mem::size_of::() , 128usize); + assert_eq!(::std::mem::size_of::() , 128usize , concat ! ( + "Size of: " , stringify ! ( rte_kni_mbuf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . buf_addr as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( buf_addr ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . buf_physaddr as * - const _ as usize } , 8usize); + const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( buf_physaddr ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . pad0 as * const _ as - usize } , 16usize); + usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( pad0 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . data_off as * const _ - as usize } , 18usize); + as usize } , 18usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( data_off ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . pad1 as * const _ as - usize } , 20usize); + usize } , 20usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( pad1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . nb_segs as * const _ - as usize } , 22usize); + as usize } , 22usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( nb_segs ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . pad4 as * const _ as - usize } , 23usize); + usize } , 23usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( pad4 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . ol_flags as * const _ - as usize } , 24usize); + as usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( ol_flags ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . pad2 as * const _ as - usize } , 32usize); + usize } , 32usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( pad2 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . pkt_len as * const _ - as usize } , 36usize); + as usize } , 36usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( pkt_len ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . data_len as * const _ - as usize } , 40usize); + as usize } , 40usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( data_len ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . pad3 as * const _ as - usize } , 64usize); + usize } , 64usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( pad3 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . pool as * const _ as - usize } , 72usize); + usize } , 72usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( pool ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_kni_mbuf ) ) . next as * const _ as - usize } , 80usize); + usize } , 80usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_kni_mbuf ) , "::" , + stringify ! ( next ) )); } impl Clone for rte_kni_mbuf { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/layout_mbuf.rs b/tests/expectations/tests/layout_mbuf.rs index 163a62ec18..f1702673f4 100644 --- a/tests/expectations/tests/layout_mbuf.rs +++ b/tests/expectations/tests/layout_mbuf.rs @@ -45,11 +45,15 @@ pub struct _bindgen_ty_1 { } #[test] fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 2usize); - assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 2usize); + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 2usize , concat ! ( + "Size of: " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 2usize , concat ! ( + "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const _bindgen_ty_1 ) ) . cnt as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( cnt ) )); } impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -124,14 +128,22 @@ pub struct rte_mbuf__bindgen_ty_1 { } #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 2usize); - assert_eq! (::std::mem::align_of::() , 2usize); + assert_eq!(::std::mem::size_of::() , 2usize , + concat ! ( "Size of: " , stringify ! ( rte_mbuf__bindgen_ty_1 ) + )); + assert_eq! (::std::mem::align_of::() , 2usize , + concat ! ( + "Alignment of " , stringify ! ( rte_mbuf__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_1 ) ) . - refcnt_atomic as * const _ as usize } , 0usize); + refcnt_atomic as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_1 + ) , "::" , stringify ! ( refcnt_atomic ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_1 ) ) . refcnt as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_1 + ) , "::" , stringify ! ( refcnt ) )); } impl Clone for rte_mbuf__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -152,9 +164,13 @@ pub struct rte_mbuf__bindgen_ty_2__bindgen_ty_1 { #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_2__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , - 4usize); + 4usize , concat ! ( + "Size of: " , stringify ! ( + rte_mbuf__bindgen_ty_2__bindgen_ty_1 ) )); assert_eq! (::std::mem::align_of::() - , 4usize); + , 4usize , concat ! ( + "Alignment of " , stringify ! ( + rte_mbuf__bindgen_ty_2__bindgen_ty_1 ) )); } impl Clone for rte_mbuf__bindgen_ty_2__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -253,11 +269,17 @@ impl rte_mbuf__bindgen_ty_2__bindgen_ty_1 { } #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_2() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , + concat ! ( "Size of: " , stringify ! ( rte_mbuf__bindgen_ty_2 ) + )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( rte_mbuf__bindgen_ty_2 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_2 ) ) . packet_type - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_2 + ) , "::" , stringify ! ( packet_type ) )); } impl Clone for rte_mbuf__bindgen_ty_2 { fn clone(&self) -> Self { *self } @@ -297,21 +319,33 @@ pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() - , 4usize); + , 4usize , concat ! ( + "Size of: " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 + ) )); assert_eq! (::std::mem::align_of::() - , 2usize); + , 2usize , concat ! ( + "Alignment of " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 + ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 - ) ) . hash as * const _ as usize } , 0usize); + ) ) . hash as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 + ) , "::" , stringify ! ( hash ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 - ) ) . id as * const _ as usize } , 2usize); + ) ) . id as * const _ as usize } , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 + ) , "::" , stringify ! ( id ) )); } impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { @@ -320,15 +354,22 @@ impl Clone for #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() - , 4usize); + , 4usize , concat ! ( + "Size of: " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 ) )); assert_eq! (::std::mem::align_of::() - , 4usize); + , 4usize , concat ! ( + "Alignment of " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 ) ) . lo as - * const _ as usize } , 0usize); + * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 ) , "::" , + stringify ! ( lo ) )); } impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -336,12 +377,19 @@ impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 { #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , - 8usize); + 8usize , concat ! ( + "Size of: " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_1 ) )); assert_eq! (::std::mem::align_of::() - , 4usize); + , 4usize , concat ! ( + "Alignment of " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_1 ) ) - . hi as * const _ as usize } , 4usize); + . hi as * const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_1 ) , "::" , stringify ! ( + hi ) )); } impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -355,35 +403,57 @@ pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_2 { #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , - 8usize); + 8usize , concat ! ( + "Size of: " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) )); assert_eq! (::std::mem::align_of::() - , 4usize); + , 4usize , concat ! ( + "Alignment of " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) ) - . lo as * const _ as usize } , 0usize); + . lo as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) , "::" , stringify ! ( + lo ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) ) - . hi as * const _ as usize } , 4usize); + . hi as * const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( + rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) , "::" , stringify ! ( + hi ) )); } impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_3() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , + concat ! ( "Size of: " , stringify ! ( rte_mbuf__bindgen_ty_3 ) + )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( rte_mbuf__bindgen_ty_3 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . rss as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_3 + ) , "::" , stringify ! ( rss ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . fdir as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_3 + ) , "::" , stringify ! ( fdir ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . sched as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_3 + ) , "::" , stringify ! ( sched ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . usr as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_3 + ) , "::" , stringify ! ( usr ) )); } impl Clone for rte_mbuf__bindgen_ty_3 { fn clone(&self) -> Self { *self } @@ -399,14 +469,22 @@ pub struct rte_mbuf__bindgen_ty_4 { } #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_4() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , + concat ! ( "Size of: " , stringify ! ( rte_mbuf__bindgen_ty_4 ) + )); + assert_eq! (::std::mem::align_of::() , 8usize , + concat ! ( + "Alignment of " , stringify ! ( rte_mbuf__bindgen_ty_4 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_4 ) ) . userdata as - * const _ as usize } , 0usize); + * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_4 + ) , "::" , stringify ! ( userdata ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_4 ) ) . udata64 as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_4 + ) , "::" , stringify ! ( udata64 ) )); } impl Clone for rte_mbuf__bindgen_ty_4 { fn clone(&self) -> Self { *self } @@ -430,9 +508,13 @@ pub struct rte_mbuf__bindgen_ty_5__bindgen_ty_1 { #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_5__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , - 8usize); + 8usize , concat ! ( + "Size of: " , stringify ! ( + rte_mbuf__bindgen_ty_5__bindgen_ty_1 ) )); assert_eq! (::std::mem::align_of::() - , 8usize); + , 8usize , concat ! ( + "Alignment of " , stringify ! ( + rte_mbuf__bindgen_ty_5__bindgen_ty_1 ) )); } impl Clone for rte_mbuf__bindgen_ty_5__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -521,81 +603,130 @@ impl rte_mbuf__bindgen_ty_5__bindgen_ty_1 { } #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_5() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , + concat ! ( "Size of: " , stringify ! ( rte_mbuf__bindgen_ty_5 ) + )); + assert_eq! (::std::mem::align_of::() , 8usize , + concat ! ( + "Alignment of " , stringify ! ( rte_mbuf__bindgen_ty_5 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf__bindgen_ty_5 ) ) . tx_offload - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_5 + ) , "::" , stringify ! ( tx_offload ) )); } impl Clone for rte_mbuf__bindgen_ty_5 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_rte_mbuf() { - assert_eq!(::std::mem::size_of::() , 128usize); + assert_eq!(::std::mem::size_of::() , 128usize , concat ! ( + "Size of: " , stringify ! ( rte_mbuf ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . cacheline0 as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( cacheline0 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . buf_addr as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( buf_addr ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . buf_physaddr as * const _ - as usize } , 8usize); + as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( buf_physaddr ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . buf_len as * const _ as - usize } , 16usize); + usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( buf_len ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . rearm_data as * const _ as - usize } , 18usize); + usize } , 18usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( rearm_data ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . data_off as * const _ as - usize } , 18usize); + usize } , 18usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( data_off ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . nb_segs as * const _ as - usize } , 22usize); + usize } , 22usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( nb_segs ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . port as * const _ as usize - } , 23usize); + } , 23usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( port ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . ol_flags as * const _ as - usize } , 24usize); + usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( ol_flags ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . rx_descriptor_fields1 as * - const _ as usize } , 32usize); + const _ as usize } , 32usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( rx_descriptor_fields1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . pkt_len as * const _ as - usize } , 36usize); + usize } , 36usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( pkt_len ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . data_len as * const _ as - usize } , 40usize); + usize } , 40usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( data_len ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . vlan_tci as * const _ as - usize } , 42usize); + usize } , 42usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( vlan_tci ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . hash as * const _ as usize - } , 44usize); + } , 44usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( hash ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . seqn as * const _ as usize - } , 52usize); + } , 52usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( seqn ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . vlan_tci_outer as * const - _ as usize } , 56usize); + _ as usize } , 56usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( vlan_tci_outer ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . cacheline1 as * const _ as - usize } , 64usize); + usize } , 64usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( cacheline1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . pool as * const _ as usize - } , 72usize); + } , 72usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( pool ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . next as * const _ as usize - } , 80usize); + } , 80usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( next ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . priv_size as * const _ as - usize } , 96usize); + usize } , 96usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( priv_size ) )); assert_eq! (unsafe { & ( * ( 0 as * const rte_mbuf ) ) . timesync as * const _ as - usize } , 98usize); + usize } , 98usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" , + stringify ! ( timesync ) )); } impl Clone for rte_mbuf { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/method-mangling.rs b/tests/expectations/tests/method-mangling.rs index 99a6e9b896..94877dca56 100644 --- a/tests/expectations/tests/method-mangling.rs +++ b/tests/expectations/tests/method-mangling.rs @@ -11,8 +11,10 @@ pub struct Foo { } #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); } extern "C" { #[link_name = "_ZN3Foo4typeEv"] diff --git a/tests/expectations/tests/module-whitelisted.rs b/tests/expectations/tests/module-whitelisted.rs index 9cf4b05103..cee913058f 100644 --- a/tests/expectations/tests/module-whitelisted.rs +++ b/tests/expectations/tests/module-whitelisted.rs @@ -14,8 +14,10 @@ pub mod root { } #[test] fn bindgen_test_layout_Test() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Test ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Test ) )); } impl Clone for Test { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/msvc-no-usr.rs b/tests/expectations/tests/msvc-no-usr.rs index e2f9a31913..842ca1f3e6 100644 --- a/tests/expectations/tests/msvc-no-usr.rs +++ b/tests/expectations/tests/msvc-no-usr.rs @@ -11,11 +11,15 @@ pub struct A { } #[test] fn bindgen_test_layout_A() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( A ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( A ) )); assert_eq! (unsafe { & ( * ( 0 as * const A ) ) . foo as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A ) , "::" , stringify + ! ( foo ) )); } impl Clone for A { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs b/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs index 45537eefa5..008ed56526 100644 --- a/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs +++ b/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs @@ -11,8 +11,10 @@ pub struct Foo { } #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); } impl Clone for Foo { fn clone(&self) -> Self { *self } @@ -24,8 +26,10 @@ pub struct Bar { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Bar ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Bar ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } @@ -37,8 +41,10 @@ pub struct Baz { } #[test] fn bindgen_test_layout_Baz() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Baz ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Baz ) )); } impl Clone for Baz { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/mutable.rs b/tests/expectations/tests/mutable.rs index 01ef8e8b84..82689ce1b8 100644 --- a/tests/expectations/tests/mutable.rs +++ b/tests/expectations/tests/mutable.rs @@ -12,14 +12,20 @@ pub struct C { } #[test] fn bindgen_test_layout_C() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( C ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( C ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . m_member as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( m_member ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . m_other as * const _ as usize } , - 4usize); + 4usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( m_other ) )); } impl Clone for C { fn clone(&self) -> Self { *self } @@ -31,11 +37,15 @@ pub struct NonCopiable { } #[test] fn bindgen_test_layout_NonCopiable() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( NonCopiable ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( NonCopiable ) )); assert_eq! (unsafe { & ( * ( 0 as * const NonCopiable ) ) . m_member as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( NonCopiable ) , "::" , + stringify ! ( m_member ) )); } #[repr(C)] #[derive(Debug)] @@ -45,10 +55,17 @@ pub struct NonCopiableWithNonCopiableMutableMember { #[test] fn bindgen_test_layout_NonCopiableWithNonCopiableMutableMember() { assert_eq!(::std::mem::size_of::() - , 4usize); + , 4usize , concat ! ( + "Size of: " , stringify ! ( + NonCopiableWithNonCopiableMutableMember ) )); assert_eq! (::std::mem::align_of::() - , 4usize); + , 4usize , concat ! ( + "Alignment of " , stringify ! ( + NonCopiableWithNonCopiableMutableMember ) )); assert_eq! (unsafe { & ( * ( 0 as * const NonCopiableWithNonCopiableMutableMember ) - ) . m_member as * const _ as usize } , 0usize); + ) . m_member as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + NonCopiableWithNonCopiableMutableMember ) , "::" , stringify ! + ( m_member ) )); } diff --git a/tests/expectations/tests/namespace.rs b/tests/expectations/tests/namespace.rs index 4958b51996..4d27385d3c 100644 --- a/tests/expectations/tests/namespace.rs +++ b/tests/expectations/tests/namespace.rs @@ -34,11 +34,15 @@ pub mod root { } #[test] fn bindgen_test_layout_A() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( A ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( A ) )); assert_eq! (unsafe { & ( * ( 0 as * const A ) ) . b as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A ) , "::" , + stringify ! ( b ) )); } extern "C" { #[link_name = "_ZN12_GLOBAL__N_11A20lets_hope_this_worksEv"] diff --git a/tests/expectations/tests/nested.rs b/tests/expectations/tests/nested.rs index 5b9ce5a65e..4c119bc7fe 100644 --- a/tests/expectations/tests/nested.rs +++ b/tests/expectations/tests/nested.rs @@ -11,11 +11,15 @@ pub struct Calc { } #[test] fn bindgen_test_layout_Calc() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Calc ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Calc ) )); assert_eq! (unsafe { & ( * ( 0 as * const Calc ) ) . w as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Calc ) , "::" , + stringify ! ( w ) )); } impl Clone for Calc { fn clone(&self) -> Self { *self } @@ -38,30 +42,41 @@ pub struct Test_Size_Dimension { } #[test] fn bindgen_test_layout_Test_Size_Dimension() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat + ! ( "Size of: " , stringify ! ( Test_Size_Dimension ) )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( Test_Size_Dimension ) )); } impl Clone for Test_Size_Dimension { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_Test_Size() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Test_Size ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Test_Size ) )); assert_eq! (unsafe { & ( * ( 0 as * const Test_Size ) ) . mWidth as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Test_Size ) , "::" , + stringify ! ( mWidth ) )); assert_eq! (unsafe { & ( * ( 0 as * const Test_Size ) ) . mHeight as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( Test_Size ) , "::" , + stringify ! ( mHeight ) )); } impl Clone for Test_Size { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_Test() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Test ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Test ) )); } impl Clone for Test { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/nested_vtable.rs b/tests/expectations/tests/nested_vtable.rs index e0d81d187a..7cc3042341 100644 --- a/tests/expectations/tests/nested_vtable.rs +++ b/tests/expectations/tests/nested_vtable.rs @@ -14,8 +14,10 @@ pub struct nsISupports { } #[test] fn bindgen_test_layout_nsISupports() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsISupports ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( nsISupports ) )); } impl Clone for nsISupports { fn clone(&self) -> Self { *self } @@ -27,8 +29,10 @@ pub struct nsIRunnable { } #[test] fn bindgen_test_layout_nsIRunnable() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsIRunnable ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( nsIRunnable ) )); } impl Clone for nsIRunnable { fn clone(&self) -> Self { *self } @@ -40,8 +44,10 @@ pub struct Runnable { } #[test] fn bindgen_test_layout_Runnable() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Runnable ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Runnable ) )); } impl Clone for Runnable { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/nested_within_namespace.rs b/tests/expectations/tests/nested_within_namespace.rs index 355ab100da..db4e049311 100644 --- a/tests/expectations/tests/nested_within_namespace.rs +++ b/tests/expectations/tests/nested_within_namespace.rs @@ -22,22 +22,30 @@ pub mod root { } #[test] fn bindgen_test_layout_Bar_Baz() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Bar_Baz ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! + ( "Alignment of " , stringify ! ( Bar_Baz ) )); assert_eq! (unsafe { & ( * ( 0 as * const Bar_Baz ) ) . foo as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar_Baz ) , + "::" , stringify ! ( foo ) )); } impl Clone for Bar_Baz { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + 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 { & ( * ( 0 as * const Bar ) ) . foo as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar ) , "::" , + stringify ! ( foo ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } @@ -49,11 +57,15 @@ pub mod root { } #[test] fn bindgen_test_layout_Baz() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Baz ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Baz ) )); assert_eq! (unsafe { & ( * ( 0 as * const Baz ) ) . baz as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Baz ) , "::" , + stringify ! ( baz ) )); } impl Clone for Baz { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/no-comments.rs b/tests/expectations/tests/no-comments.rs index 947ed5908e..c3bb13c47b 100644 --- a/tests/expectations/tests/no-comments.rs +++ b/tests/expectations/tests/no-comments.rs @@ -11,11 +11,15 @@ pub struct Foo { } #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const Foo ) ) . s as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Foo ) , "::" , + stringify ! ( s ) )); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/no-derive-debug.rs b/tests/expectations/tests/no-derive-debug.rs index 9c35f78e23..4de7579776 100644 --- a/tests/expectations/tests/no-derive-debug.rs +++ b/tests/expectations/tests/no-derive-debug.rs @@ -18,14 +18,20 @@ pub struct bar { } #[test] fn bindgen_test_layout_bar() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( bar ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( bar ) )); assert_eq! (unsafe { & ( * ( 0 as * const bar ) ) . foo as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( bar ) , "::" , + stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const bar ) ) . baz as * const _ as usize } , - 4usize); + 4usize , concat ! ( + "Alignment of field: " , stringify ! ( bar ) , "::" , + stringify ! ( baz ) )); } impl Clone for bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/no-recursive-whitelisting.rs b/tests/expectations/tests/no-recursive-whitelisting.rs index 249090195b..c8341990f2 100644 --- a/tests/expectations/tests/no-recursive-whitelisting.rs +++ b/tests/expectations/tests/no-recursive-whitelisting.rs @@ -12,11 +12,15 @@ pub struct Foo { } #[test] fn bindgen_test_layout_Foo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const Foo ) ) . baz as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Foo ) , "::" , + stringify ! ( baz ) )); } impl Clone for Foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/no-std.rs b/tests/expectations/tests/no-std.rs index 110255ad9a..21cfda00bd 100644 --- a/tests/expectations/tests/no-std.rs +++ b/tests/expectations/tests/no-std.rs @@ -15,17 +15,25 @@ pub struct foo { } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::core::mem::size_of::() , 16usize); - assert_eq! (::core::mem::align_of::() , 8usize); + assert_eq!(::core::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::core::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . b as * const _ as usize } , - 4usize); + 4usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( b ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , - 8usize); + 8usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bar ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/objc_interface_type.rs b/tests/expectations/tests/objc_interface_type.rs index 1730f824b2..544ced074e 100644 --- a/tests/expectations/tests/objc_interface_type.rs +++ b/tests/expectations/tests/objc_interface_type.rs @@ -18,11 +18,15 @@ pub struct FooStruct { } #[test] fn bindgen_test_layout_FooStruct() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( FooStruct ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( FooStruct ) )); assert_eq! (unsafe { & ( * ( 0 as * const FooStruct ) ) . foo as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( FooStruct ) , "::" , + stringify ! ( foo ) )); } impl Clone for FooStruct { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/only_bitfields.rs b/tests/expectations/tests/only_bitfields.rs index 97363a8725..7811584bd4 100644 --- a/tests/expectations/tests/only_bitfields.rs +++ b/tests/expectations/tests/only_bitfields.rs @@ -11,8 +11,10 @@ pub struct C { } #[test] fn bindgen_test_layout_C() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( C ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( C ) )); } impl Clone for C { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/opaque-tracing.rs b/tests/expectations/tests/opaque-tracing.rs index 86e01665f8..b19a1e6869 100644 --- a/tests/expectations/tests/opaque-tracing.rs +++ b/tests/expectations/tests/opaque-tracing.rs @@ -11,8 +11,10 @@ pub struct Container { } #[test] fn bindgen_test_layout_Container() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Container ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Container ) )); } impl Clone for Container { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/opaque_in_struct.rs b/tests/expectations/tests/opaque_in_struct.rs index 427692fdc4..cba5952eb5 100644 --- a/tests/expectations/tests/opaque_in_struct.rs +++ b/tests/expectations/tests/opaque_in_struct.rs @@ -12,8 +12,10 @@ pub struct opaque { } #[test] fn bindgen_test_layout_opaque() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( opaque ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( opaque ) )); } impl Clone for opaque { fn clone(&self) -> Self { *self } @@ -25,11 +27,15 @@ pub struct container { } #[test] fn bindgen_test_layout_container() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( container ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( container ) )); assert_eq! (unsafe { & ( * ( 0 as * const container ) ) . contained as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( container ) , "::" , + stringify ! ( contained ) )); } impl Clone for container { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/opaque_pointer.rs b/tests/expectations/tests/opaque_pointer.rs index 0dee14df25..3cfa6d870b 100644 --- a/tests/expectations/tests/opaque_pointer.rs +++ b/tests/expectations/tests/opaque_pointer.rs @@ -14,8 +14,10 @@ pub struct OtherOpaque { } #[test] fn bindgen_test_layout_OtherOpaque() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( OtherOpaque ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( OtherOpaque ) )); } impl Clone for OtherOpaque { fn clone(&self) -> Self { *self } @@ -37,17 +39,25 @@ pub struct WithOpaquePtr { } #[test] fn bindgen_test_layout_WithOpaquePtr() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( WithOpaquePtr ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( WithOpaquePtr ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithOpaquePtr ) ) . whatever as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithOpaquePtr ) , "::" + , stringify ! ( whatever ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithOpaquePtr ) ) . other as * const _ as - usize } , 8usize); + usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( WithOpaquePtr ) , "::" + , stringify ! ( other ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithOpaquePtr ) ) . t as * const _ as - usize } , 12usize); + usize } , 12usize , concat ! ( + "Alignment of field: " , stringify ! ( WithOpaquePtr ) , "::" + , stringify ! ( t ) )); } impl Clone for WithOpaquePtr { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/private.rs b/tests/expectations/tests/private.rs index 1379aa616b..809e224a7b 100644 --- a/tests/expectations/tests/private.rs +++ b/tests/expectations/tests/private.rs @@ -13,14 +13,20 @@ pub struct HasPrivate { } #[test] fn bindgen_test_layout_HasPrivate() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( HasPrivate ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( HasPrivate ) )); assert_eq! (unsafe { & ( * ( 0 as * const HasPrivate ) ) . mNotPrivate as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( HasPrivate ) , "::" , + stringify ! ( mNotPrivate ) )); assert_eq! (unsafe { & ( * ( 0 as * const HasPrivate ) ) . mIsPrivate as * const _ - as usize } , 4usize); + as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( HasPrivate ) , "::" , + stringify ! ( mIsPrivate ) )); } impl Clone for HasPrivate { fn clone(&self) -> Self { *self } @@ -34,14 +40,20 @@ pub struct VeryPrivate { } #[test] fn bindgen_test_layout_VeryPrivate() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( VeryPrivate ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( VeryPrivate ) )); assert_eq! (unsafe { & ( * ( 0 as * const VeryPrivate ) ) . mIsPrivate as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( VeryPrivate ) , "::" , + stringify ! ( mIsPrivate ) )); assert_eq! (unsafe { & ( * ( 0 as * const VeryPrivate ) ) . mIsAlsoPrivate as * - const _ as usize } , 4usize); + const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( VeryPrivate ) , "::" , + stringify ! ( mIsAlsoPrivate ) )); } impl Clone for VeryPrivate { fn clone(&self) -> Self { *self } @@ -56,14 +68,20 @@ pub struct ContradictPrivate { } #[test] fn bindgen_test_layout_ContradictPrivate() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( ContradictPrivate ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( ContradictPrivate ) )); assert_eq! (unsafe { & ( * ( 0 as * const ContradictPrivate ) ) . mNotPrivate as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ContradictPrivate ) , + "::" , stringify ! ( mNotPrivate ) )); assert_eq! (unsafe { & ( * ( 0 as * const ContradictPrivate ) ) . mIsPrivate as * - const _ as usize } , 4usize); + const _ as usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( ContradictPrivate ) , + "::" , stringify ! ( mIsPrivate ) )); } impl Clone for ContradictPrivate { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/public-dtor.rs b/tests/expectations/tests/public-dtor.rs index ce05f173e3..d4c18c6bd9 100644 --- a/tests/expectations/tests/public-dtor.rs +++ b/tests/expectations/tests/public-dtor.rs @@ -11,6 +11,8 @@ pub struct cv_String { } #[test] fn bindgen_test_layout_cv_String() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( cv_String ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( cv_String ) )); } diff --git a/tests/expectations/tests/ref_argument_array.rs b/tests/expectations/tests/ref_argument_array.rs index 28c8c00dda..675bbbca6a 100644 --- a/tests/expectations/tests/ref_argument_array.rs +++ b/tests/expectations/tests/ref_argument_array.rs @@ -15,8 +15,10 @@ pub struct nsID { } #[test] fn bindgen_test_layout_nsID() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsID ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( nsID ) )); } impl Clone for nsID { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/reparented_replacement.rs b/tests/expectations/tests/reparented_replacement.rs index 72fc8563e9..baeab03e83 100644 --- a/tests/expectations/tests/reparented_replacement.rs +++ b/tests/expectations/tests/reparented_replacement.rs @@ -18,11 +18,15 @@ pub mod root { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + 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 { & ( * ( 0 as * const Bar ) ) . bazz as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar ) , "::" , + stringify ! ( bazz ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/replace_use.rs b/tests/expectations/tests/replace_use.rs index 201ec2fda8..ed55080a0e 100644 --- a/tests/expectations/tests/replace_use.rs +++ b/tests/expectations/tests/replace_use.rs @@ -20,11 +20,15 @@ pub struct Test { } #[test] fn bindgen_test_layout_Test() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Test ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Test ) )); assert_eq! (unsafe { & ( * ( 0 as * const Test ) ) . a as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( a ) )); } impl Clone for Test { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/same_struct_name_in_different_namespaces.rs b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs index 859284d18d..4dde8266d8 100644 --- a/tests/expectations/tests/same_struct_name_in_different_namespaces.rs +++ b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs @@ -15,14 +15,20 @@ pub struct JS_shadow_Zone { } #[test] fn bindgen_test_layout_JS_shadow_Zone() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( JS_shadow_Zone ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( JS_shadow_Zone ) )); assert_eq! (unsafe { & ( * ( 0 as * const JS_shadow_Zone ) ) . x as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( JS_shadow_Zone ) , "::" + , stringify ! ( x ) )); assert_eq! (unsafe { & ( * ( 0 as * const JS_shadow_Zone ) ) . y as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( JS_shadow_Zone ) , "::" + , stringify ! ( y ) )); } impl Clone for JS_shadow_Zone { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/size_t_template.rs b/tests/expectations/tests/size_t_template.rs index 66868178dc..87df768d62 100644 --- a/tests/expectations/tests/size_t_template.rs +++ b/tests/expectations/tests/size_t_template.rs @@ -11,11 +11,15 @@ pub struct C { } #[test] fn bindgen_test_layout_C() { - assert_eq!(::std::mem::size_of::() , 12usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 12usize , concat ! ( + "Size of: " , stringify ! ( C ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( C ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . arr as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( arr ) )); } impl Clone for C { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_containing_forward_declared_struct.rs b/tests/expectations/tests/struct_containing_forward_declared_struct.rs index d0b139d4bb..60f1226272 100644 --- a/tests/expectations/tests/struct_containing_forward_declared_struct.rs +++ b/tests/expectations/tests/struct_containing_forward_declared_struct.rs @@ -16,22 +16,30 @@ pub struct a_b { } #[test] fn bindgen_test_layout_a_b() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( a_b ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( a_b ) )); assert_eq! (unsafe { & ( * ( 0 as * const a_b ) ) . val_b as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( a_b ) , "::" , + stringify ! ( val_b ) )); } impl Clone for a_b { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_a() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( a ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const a ) ) . val_a as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( a ) , "::" , stringify + ! ( val_a ) )); } impl Clone for a { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_struct.rs b/tests/expectations/tests/struct_with_anon_struct.rs index b617fb291c..75baf354da 100644 --- a/tests/expectations/tests/struct_with_anon_struct.rs +++ b/tests/expectations/tests/struct_with_anon_struct.rs @@ -17,25 +17,35 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bar ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_struct_array.rs b/tests/expectations/tests/struct_with_anon_struct_array.rs index 4235c14b25..f20f03d851 100644 --- a/tests/expectations/tests/struct_with_anon_struct_array.rs +++ b/tests/expectations/tests/struct_with_anon_struct_array.rs @@ -18,14 +18,20 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -38,28 +44,40 @@ pub struct foo__bindgen_ty_2 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_2() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_2 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_2 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_2 ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_2 ) , + "::" , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_2 ) ) . b as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_2 ) , + "::" , stringify ! ( b ) )); } impl Clone for foo__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 208usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 208usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bar ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . baz as * const _ as usize } , - 16usize); + 16usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( baz ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_struct_pointer.rs b/tests/expectations/tests/struct_with_anon_struct_pointer.rs index 5ffc975587..087ff3d8d2 100644 --- a/tests/expectations/tests/struct_with_anon_struct_pointer.rs +++ b/tests/expectations/tests/struct_with_anon_struct_pointer.rs @@ -17,25 +17,35 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bar ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_union.rs b/tests/expectations/tests/struct_with_anon_union.rs index 02ccb8b1ee..ac4b6f7591 100644 --- a/tests/expectations/tests/struct_with_anon_union.rs +++ b/tests/expectations/tests/struct_with_anon_union.rs @@ -42,25 +42,35 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bar ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_unnamed_struct.rs b/tests/expectations/tests/struct_with_anon_unnamed_struct.rs index 224b711fc1..982b3bdcca 100644 --- a/tests/expectations/tests/struct_with_anon_unnamed_struct.rs +++ b/tests/expectations/tests/struct_with_anon_unnamed_struct.rs @@ -17,22 +17,30 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_anon_unnamed_union.rs b/tests/expectations/tests/struct_with_anon_unnamed_union.rs index e8beffd7d5..26edbceb87 100644 --- a/tests/expectations/tests/struct_with_anon_unnamed_union.rs +++ b/tests/expectations/tests/struct_with_anon_unnamed_union.rs @@ -42,22 +42,30 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_bitfields.rs b/tests/expectations/tests/struct_with_bitfields.rs index 11fa2d682f..90f2fba288 100644 --- a/tests/expectations/tests/struct_with_bitfields.rs +++ b/tests/expectations/tests/struct_with_bitfields.rs @@ -14,11 +14,15 @@ pub struct bitfield { } #[test] fn bindgen_test_layout_bitfield() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( bitfield ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( bitfield ) )); assert_eq! (unsafe { & ( * ( 0 as * const bitfield ) ) . e as * const _ as usize } - , 4usize); + , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( bitfield ) , "::" , + stringify ! ( e ) )); } impl Clone for bitfield { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_derive_debug.rs b/tests/expectations/tests/struct_with_derive_debug.rs index f34c67f4fe..b81baa002e 100644 --- a/tests/expectations/tests/struct_with_derive_debug.rs +++ b/tests/expectations/tests/struct_with_derive_debug.rs @@ -11,11 +11,15 @@ pub struct LittleArray { } #[test] fn bindgen_test_layout_LittleArray() { - assert_eq!(::std::mem::size_of::() , 128usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 128usize , concat ! ( + "Size of: " , stringify ! ( LittleArray ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( LittleArray ) )); assert_eq! (unsafe { & ( * ( 0 as * const LittleArray ) ) . a as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( LittleArray ) , "::" , + stringify ! ( a ) )); } impl Clone for LittleArray { fn clone(&self) -> Self { *self } @@ -26,11 +30,15 @@ pub struct BigArray { } #[test] fn bindgen_test_layout_BigArray() { - assert_eq!(::std::mem::size_of::() , 132usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 132usize , concat ! ( + "Size of: " , stringify ! ( BigArray ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( BigArray ) )); assert_eq! (unsafe { & ( * ( 0 as * const BigArray ) ) . a as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( BigArray ) , "::" , + stringify ! ( a ) )); } #[repr(C)] #[derive(Debug, Copy)] @@ -39,11 +47,15 @@ pub struct WithLittleArray { } #[test] fn bindgen_test_layout_WithLittleArray() { - assert_eq!(::std::mem::size_of::() , 128usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 128usize , concat ! + ( "Size of: " , stringify ! ( WithLittleArray ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! + ( "Alignment of " , stringify ! ( WithLittleArray ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithLittleArray ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithLittleArray ) , + "::" , stringify ! ( a ) )); } impl Clone for WithLittleArray { fn clone(&self) -> Self { *self } @@ -54,9 +66,13 @@ pub struct WithBigArray { } #[test] fn bindgen_test_layout_WithBigArray() { - assert_eq!(::std::mem::size_of::() , 132usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 132usize , concat ! ( + "Size of: " , stringify ! ( WithBigArray ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( WithBigArray ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithBigArray ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithBigArray ) , "::" , + stringify ! ( a ) )); } diff --git a/tests/expectations/tests/struct_with_nesting.rs b/tests/expectations/tests/struct_with_nesting.rs index e69268d6d7..4bd5586bb6 100644 --- a/tests/expectations/tests/struct_with_nesting.rs +++ b/tests/expectations/tests/struct_with_nesting.rs @@ -51,15 +51,25 @@ pub struct foo__bindgen_ty_1__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , - 4usize); + 4usize , concat ! ( + "Size of: " , stringify ! ( foo__bindgen_ty_1__bindgen_ty_1 ) + )); assert_eq! (::std::mem::align_of::() , - 2usize); + 2usize , concat ! ( + "Alignment of " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_1 ) ) . c1 - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_1 ) , "::" , stringify ! ( c1 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_1 ) ) . c2 - as * const _ as usize } , 2usize); + as * const _ as usize } , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_1 ) , "::" , stringify ! ( c2 ) + )); } impl Clone for foo__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -75,43 +85,67 @@ pub struct foo__bindgen_ty_1__bindgen_ty_2 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , - 4usize); + 4usize , concat ! ( + "Size of: " , stringify ! ( foo__bindgen_ty_1__bindgen_ty_2 ) + )); assert_eq! (::std::mem::align_of::() , - 1usize); + 1usize , concat ! ( + "Alignment of " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_2 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . d1 - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_2 ) , "::" , stringify ! ( d1 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . d2 - as * const _ as usize } , 1usize); + as * const _ as usize } , 1usize , concat ! ( + "Alignment of field: " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_2 ) , "::" , stringify ! ( d2 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . d3 - as * const _ as usize } , 2usize); + as * const _ as usize } , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_2 ) , "::" , stringify ! ( d3 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . d4 - as * const _ as usize } , 3usize); + as * const _ as usize } , 3usize , concat ! ( + "Alignment of field: " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_2 ) , "::" , stringify ! ( d4 ) + )); } impl Clone for foo__bindgen_ty_1__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( a ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_packing.rs b/tests/expectations/tests/struct_with_packing.rs index 51ff70242a..b7afdafefd 100644 --- a/tests/expectations/tests/struct_with_packing.rs +++ b/tests/expectations/tests/struct_with_packing.rs @@ -12,12 +12,18 @@ pub struct a { } #[test] fn bindgen_test_layout_a() { - assert_eq!(::std::mem::size_of::() , 3usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 3usize , concat ! ( + "Size of: " , stringify ! ( a ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const a ) ) . b as * const _ as usize - } , 0usize); + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( a ) , "::" , stringify + ! ( b ) )); assert_eq! (unsafe { & ( * ( 0 as * const a ) ) . c as * const _ as usize - } , 1usize); + } , 1usize , concat ! ( + "Alignment of field: " , stringify ! ( a ) , "::" , stringify + ! ( c ) )); } impl Clone for a { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/struct_with_struct.rs b/tests/expectations/tests/struct_with_struct.rs index cae2d677b3..d28806c44b 100644 --- a/tests/expectations/tests/struct_with_struct.rs +++ b/tests/expectations/tests/struct_with_struct.rs @@ -17,25 +17,35 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . x as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( x ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . y as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( y ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bar ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/template.rs b/tests/expectations/tests/template.rs index 800451420b..844dc6c2a9 100644 --- a/tests/expectations/tests/template.rs +++ b/tests/expectations/tests/template.rs @@ -44,11 +44,15 @@ pub struct RootedContainer { } #[test] fn bindgen_test_layout_RootedContainer() { - assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 24usize , concat ! ( + "Size of: " , stringify ! ( RootedContainer ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! + ( "Alignment of " , stringify ! ( RootedContainer ) )); assert_eq! (unsafe { & ( * ( 0 as * const RootedContainer ) ) . root as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( RootedContainer ) , + "::" , stringify ! ( root ) )); } impl Clone for RootedContainer { fn clone(&self) -> Self { *self } @@ -66,11 +70,15 @@ pub struct PODButContainsDtor { } #[test] fn bindgen_test_layout_PODButContainsDtor() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! + ( "Size of: " , stringify ! ( PODButContainsDtor ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( PODButContainsDtor ) )); assert_eq! (unsafe { & ( * ( 0 as * const PODButContainsDtor ) ) . member as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( PODButContainsDtor ) , + "::" , stringify ! ( member ) )); } /**
*/ #[repr(C)] @@ -85,11 +93,15 @@ pub struct POD { } #[test] fn bindgen_test_layout_POD() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( POD ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( POD ) )); assert_eq! (unsafe { & ( * ( 0 as * const POD ) ) . opaque_member as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( POD ) , "::" , + stringify ! ( opaque_member ) )); } impl Clone for POD { fn clone(&self) -> Self { *self } @@ -127,8 +139,10 @@ pub struct Untemplated { } #[test] fn bindgen_test_layout_Untemplated() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Untemplated ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Untemplated ) )); } impl Clone for Untemplated { fn clone(&self) -> Self { *self } @@ -180,14 +194,22 @@ pub struct TemplateWithVar { #[test] fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() - , 24usize); + , 24usize , concat ! ( + "Size of template specialization: " , stringify ! ( + Foo<::std::os::raw::c_int, ::std::os::raw::c_int> ) )); assert_eq!(::std::mem::align_of::>() - , 8usize); + , 8usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + Foo<::std::os::raw::c_int, ::std::os::raw::c_int> ) )); } #[test] fn __bindgen_test_layout_template_2() { assert_eq!(::std::mem::size_of::>() , - 4usize); + 4usize , concat ! ( + "Size of template specialization: " , stringify ! ( + WithDtor<::std::os::raw::c_int> ) )); assert_eq!(::std::mem::align_of::>() , - 4usize); + 4usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + WithDtor<::std::os::raw::c_int> ) )); } diff --git a/tests/expectations/tests/type-referenced-by-whitelisted-function.rs b/tests/expectations/tests/type-referenced-by-whitelisted-function.rs index 0fd411d2ab..f4201a5610 100644 --- a/tests/expectations/tests/type-referenced-by-whitelisted-function.rs +++ b/tests/expectations/tests/type-referenced-by-whitelisted-function.rs @@ -11,11 +11,15 @@ pub struct dl_phdr_info { } #[test] fn bindgen_test_layout_dl_phdr_info() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( dl_phdr_info ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( dl_phdr_info ) )); assert_eq! (unsafe { & ( * ( 0 as * const dl_phdr_info ) ) . x as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( dl_phdr_info ) , "::" , + stringify ! ( x ) )); } impl Clone for dl_phdr_info { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/type_alias_template_specialized.rs b/tests/expectations/tests/type_alias_template_specialized.rs index d898561de7..5dd2038fe6 100644 --- a/tests/expectations/tests/type_alias_template_specialized.rs +++ b/tests/expectations/tests/type_alias_template_specialized.rs @@ -11,11 +11,15 @@ pub struct Rooted { } #[test] fn bindgen_test_layout_Rooted() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Rooted ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Rooted ) )); assert_eq! (unsafe { & ( * ( 0 as * const Rooted ) ) . ptr as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Rooted ) , "::" , + stringify ! ( ptr ) )); } impl Clone for Rooted { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/typeref.rs b/tests/expectations/tests/typeref.rs index 1153374fea..c199b7abc9 100644 --- a/tests/expectations/tests/typeref.rs +++ b/tests/expectations/tests/typeref.rs @@ -35,11 +35,15 @@ pub struct nsFoo { } #[test] fn bindgen_test_layout_nsFoo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsFoo ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( nsFoo ) )); assert_eq! (unsafe { & ( * ( 0 as * const nsFoo ) ) . mBar as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( nsFoo ) , "::" , + stringify ! ( mBar ) )); } impl Clone for nsFoo { fn clone(&self) -> Self { *self } @@ -51,11 +55,17 @@ pub struct mozilla_FragmentOrURL { } #[test] fn bindgen_test_layout_mozilla_FragmentOrURL() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , + concat ! ( "Size of: " , stringify ! ( mozilla_FragmentOrURL ) + )); + assert_eq! (::std::mem::align_of::() , 1usize , + concat ! ( + "Alignment of " , stringify ! ( mozilla_FragmentOrURL ) )); assert_eq! (unsafe { & ( * ( 0 as * const mozilla_FragmentOrURL ) ) . mIsLocalRef - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( mozilla_FragmentOrURL ) + , "::" , stringify ! ( mIsLocalRef ) )); } impl Clone for mozilla_FragmentOrURL { fn clone(&self) -> Self { *self } @@ -67,8 +77,10 @@ pub struct mozilla_Position { } #[test] fn bindgen_test_layout_mozilla_Position() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( mozilla_Position ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! + ( "Alignment of " , stringify ! ( mozilla_Position ) )); } impl Clone for mozilla_Position { fn clone(&self) -> Self { *self } @@ -94,11 +106,15 @@ pub struct Bar { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Bar ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Bar ) )); assert_eq! (unsafe { & ( * ( 0 as * const Bar ) ) . mFoo as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar ) , "::" , + stringify ! ( mFoo ) )); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union-in-ns.rs b/tests/expectations/tests/union-in-ns.rs index b6cbfd8618..cb69d60347 100644 --- a/tests/expectations/tests/union-in-ns.rs +++ b/tests/expectations/tests/union-in-ns.rs @@ -43,11 +43,15 @@ pub mod root { } #[test] fn bindgen_test_layout_bar() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + 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 { & ( * ( 0 as * const bar ) ) . baz as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( bar ) , "::" , + stringify ! ( baz ) )); } impl Clone for bar { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_dtor.rs b/tests/expectations/tests/union_dtor.rs index 47bca484e6..ad707b63a7 100644 --- a/tests/expectations/tests/union_dtor.rs +++ b/tests/expectations/tests/union_dtor.rs @@ -37,12 +37,18 @@ pub struct UnionWithDtor { } #[test] fn bindgen_test_layout_UnionWithDtor() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( UnionWithDtor ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( UnionWithDtor ) )); assert_eq! (unsafe { & ( * ( 0 as * const UnionWithDtor ) ) . mFoo as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( UnionWithDtor ) , "::" + , stringify ! ( mFoo ) )); assert_eq! (unsafe { & ( * ( 0 as * const UnionWithDtor ) ) . mBar as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( UnionWithDtor ) , "::" + , stringify ! ( mBar ) )); } diff --git a/tests/expectations/tests/union_fields.rs b/tests/expectations/tests/union_fields.rs index 1dfe1ef1f5..64eb3fe43f 100644 --- a/tests/expectations/tests/union_fields.rs +++ b/tests/expectations/tests/union_fields.rs @@ -38,17 +38,25 @@ pub struct _bindgen_ty_1 { } #[test] fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 8usize); - assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 8usize); + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 8usize , concat ! ( + "Size of: " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 8usize , concat ! ( + "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const _bindgen_ty_1 ) ) . mInt as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( mInt ) )); assert_eq! (unsafe { & ( * ( 0 as * const _bindgen_ty_1 ) ) . mFloat as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( mFloat ) )); assert_eq! (unsafe { & ( * ( 0 as * const _bindgen_ty_1 ) ) . mPointer as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( mPointer ) )); } impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_anon_struct.rs b/tests/expectations/tests/union_with_anon_struct.rs index 6a3469dc14..4b9c635f04 100644 --- a/tests/expectations/tests/union_with_anon_struct.rs +++ b/tests/expectations/tests/union_with_anon_struct.rs @@ -42,25 +42,35 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as - usize } , 4usize); + usize } , 4usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bar ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_anon_struct_bitfield.rs b/tests/expectations/tests/union_with_anon_struct_bitfield.rs index af06fea780..449fd44004 100644 --- a/tests/expectations/tests/union_with_anon_struct_bitfield.rs +++ b/tests/expectations/tests/union_with_anon_struct_bitfield.rs @@ -42,8 +42,10 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -78,11 +80,15 @@ impl foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( a ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_anon_union.rs b/tests/expectations/tests/union_with_anon_union.rs index f5bb4dd95e..16b33551bc 100644 --- a/tests/expectations/tests/union_with_anon_union.rs +++ b/tests/expectations/tests/union_with_anon_union.rs @@ -43,25 +43,35 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bar ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_anon_unnamed_struct.rs b/tests/expectations/tests/union_with_anon_unnamed_struct.rs index 4e5fe9152d..7982728a51 100644 --- a/tests/expectations/tests/union_with_anon_unnamed_struct.rs +++ b/tests/expectations/tests/union_with_anon_unnamed_struct.rs @@ -45,31 +45,46 @@ pub struct pixel__bindgen_ty_1 { } #[test] fn bindgen_test_layout_pixel__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat + ! ( "Size of: " , stringify ! ( pixel__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 1usize , + concat ! ( + "Alignment of " , stringify ! ( pixel__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const pixel__bindgen_ty_1 ) ) . r as * const _ - as usize } , 0usize); + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( pixel__bindgen_ty_1 ) , + "::" , stringify ! ( r ) )); assert_eq! (unsafe { & ( * ( 0 as * const pixel__bindgen_ty_1 ) ) . g as * const _ - as usize } , 1usize); + as usize } , 1usize , concat ! ( + "Alignment of field: " , stringify ! ( pixel__bindgen_ty_1 ) , + "::" , stringify ! ( g ) )); assert_eq! (unsafe { & ( * ( 0 as * const pixel__bindgen_ty_1 ) ) . b as * const _ - as usize } , 2usize); + as usize } , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( pixel__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); assert_eq! (unsafe { & ( * ( 0 as * const pixel__bindgen_ty_1 ) ) . a as * const _ - as usize } , 3usize); + as usize } , 3usize , concat ! ( + "Alignment of field: " , stringify ! ( pixel__bindgen_ty_1 ) , + "::" , stringify ! ( a ) )); } impl Clone for pixel__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_pixel() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( pixel ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( pixel ) )); assert_eq! (unsafe { & ( * ( 0 as * const pixel ) ) . rgba as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( pixel ) , "::" , + stringify ! ( rgba ) )); } impl Clone for pixel { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_anon_unnamed_union.rs b/tests/expectations/tests/union_with_anon_unnamed_union.rs index e9197ad7e2..1e7f918c41 100644 --- a/tests/expectations/tests/union_with_anon_unnamed_union.rs +++ b/tests/expectations/tests/union_with_anon_unnamed_union.rs @@ -44,25 +44,35 @@ pub struct foo__bindgen_ty_1 { } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 2usize); - assert_eq! (::std::mem::align_of::() , 2usize); + assert_eq!(::std::mem::size_of::() , 2usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 2usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . b as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( b ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1 ) ) . c as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo__bindgen_ty_1 ) , + "::" , stringify ! ( c ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( a ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_big_member.rs b/tests/expectations/tests/union_with_big_member.rs index f055625944..58407cdb10 100644 --- a/tests/expectations/tests/union_with_big_member.rs +++ b/tests/expectations/tests/union_with_big_member.rs @@ -37,14 +37,20 @@ pub struct WithBigArray { } #[test] fn bindgen_test_layout_WithBigArray() { - assert_eq!(::std::mem::size_of::() , 132usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 132usize , concat ! ( + "Size of: " , stringify ! ( WithBigArray ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( WithBigArray ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithBigArray ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithBigArray ) , "::" , + stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithBigArray ) ) . b as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithBigArray ) , "::" , + stringify ! ( b ) )); } impl Clone for WithBigArray { fn clone(&self) -> Self { *self } @@ -58,14 +64,20 @@ pub struct WithBigArray2 { } #[test] fn bindgen_test_layout_WithBigArray2() { - assert_eq!(::std::mem::size_of::() , 36usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 36usize , concat ! ( + "Size of: " , stringify ! ( WithBigArray2 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( WithBigArray2 ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithBigArray2 ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithBigArray2 ) , "::" + , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithBigArray2 ) ) . b as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithBigArray2 ) , "::" + , stringify ! ( b ) )); } impl Clone for WithBigArray2 { fn clone(&self) -> Self { *self } @@ -79,14 +91,20 @@ pub struct WithBigMember { } #[test] fn bindgen_test_layout_WithBigMember() { - assert_eq!(::std::mem::size_of::() , 132usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 132usize , concat ! ( + "Size of: " , stringify ! ( WithBigMember ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( WithBigMember ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithBigMember ) ) . a as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithBigMember ) , "::" + , stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const WithBigMember ) ) . b as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( WithBigMember ) , "::" + , stringify ! ( b ) )); } impl Clone for WithBigMember { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/union_with_nesting.rs b/tests/expectations/tests/union_with_nesting.rs index 819dff6ead..17c3c8f07b 100644 --- a/tests/expectations/tests/union_with_nesting.rs +++ b/tests/expectations/tests/union_with_nesting.rs @@ -51,15 +51,25 @@ pub struct foo__bindgen_ty_1__bindgen_ty_1 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , - 2usize); + 2usize , concat ! ( + "Size of: " , stringify ! ( foo__bindgen_ty_1__bindgen_ty_1 ) + )); assert_eq! (::std::mem::align_of::() , - 2usize); + 2usize , concat ! ( + "Alignment of " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_1 ) ) . b1 - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_1 ) , "::" , stringify ! ( b1 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_1 ) ) . b2 - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_1 ) , "::" , stringify ! ( b2 ) + )); } impl Clone for foo__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } @@ -74,34 +84,50 @@ pub struct foo__bindgen_ty_1__bindgen_ty_2 { #[test] fn bindgen_test_layout_foo__bindgen_ty_1__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , - 2usize); + 2usize , concat ! ( + "Size of: " , stringify ! ( foo__bindgen_ty_1__bindgen_ty_2 ) + )); assert_eq! (::std::mem::align_of::() , - 2usize); + 2usize , concat ! ( + "Alignment of " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_2 ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . c1 - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_2 ) , "::" , stringify ! ( c1 ) + )); assert_eq! (unsafe { & ( * ( 0 as * const foo__bindgen_ty_1__bindgen_ty_2 ) ) . c2 - as * const _ as usize } , 0usize); + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + foo__bindgen_ty_1__bindgen_ty_2 ) , "::" , stringify ! ( c2 ) + )); } impl Clone for foo__bindgen_ty_1__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 2usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! + ( "Size of: " , stringify ! ( foo__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 2usize , concat + ! ( "Alignment of " , stringify ! ( foo__bindgen_ty_1 ) )); } impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( a ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/unknown_attr.rs b/tests/expectations/tests/unknown_attr.rs index c58281e90e..12a35760dd 100644 --- a/tests/expectations/tests/unknown_attr.rs +++ b/tests/expectations/tests/unknown_attr.rs @@ -14,13 +14,20 @@ pub struct _bindgen_ty_1 { } #[test] fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 32usize); + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 32usize , concat ! ( + "Size of: " , stringify ! ( _bindgen_ty_1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const _bindgen_ty_1 ) ) . - __clang_max_align_nonce1 as * const _ as usize } , 0usize); + __clang_max_align_nonce1 as * const _ as usize } , 0usize , + concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( __clang_max_align_nonce1 ) )); assert_eq! (unsafe { & ( * ( 0 as * const _bindgen_ty_1 ) ) . - __clang_max_align_nonce2 as * const _ as usize } , 16usize); + __clang_max_align_nonce2 as * const _ as usize } , 16usize , + concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( __clang_max_align_nonce2 ) )); } impl Clone for _bindgen_ty_1 { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/use-core.rs b/tests/expectations/tests/use-core.rs index 023d9ee38f..f09d151994 100644 --- a/tests/expectations/tests/use-core.rs +++ b/tests/expectations/tests/use-core.rs @@ -14,17 +14,25 @@ pub struct foo { } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::core::mem::size_of::() , 16usize); - assert_eq! (::core::mem::align_of::() , 8usize); + assert_eq!(::core::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::core::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . a as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( a ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . b as * const _ as usize } , - 4usize); + 4usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( b ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . bar as * const _ as usize } , - 8usize); + 8usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( bar ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/var-tracing.rs b/tests/expectations/tests/var-tracing.rs index 25d58aa48a..7a09bcb60d 100644 --- a/tests/expectations/tests/var-tracing.rs +++ b/tests/expectations/tests/var-tracing.rs @@ -11,11 +11,15 @@ pub struct Bar { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + 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 { & ( * ( 0 as * const Bar ) ) . m_baz as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Bar ) , "::" , + stringify ! ( m_baz ) )); } extern "C" { #[link_name = "_ZN3BarC1Ei"] @@ -43,8 +47,10 @@ extern "C" { } #[test] fn bindgen_test_layout_Baz() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Baz ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Baz ) )); } impl Clone for Baz { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/variadic-method.rs b/tests/expectations/tests/variadic-method.rs index c4e0d3c075..4515512829 100644 --- a/tests/expectations/tests/variadic-method.rs +++ b/tests/expectations/tests/variadic-method.rs @@ -15,8 +15,10 @@ pub struct Bar { } #[test] fn bindgen_test_layout_Bar() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Bar ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Bar ) )); } extern "C" { #[link_name = "_ZN3Bar3fooEPKcz"] diff --git a/tests/expectations/tests/vector.rs b/tests/expectations/tests/vector.rs index 9b63adb141..4b68974465 100644 --- a/tests/expectations/tests/vector.rs +++ b/tests/expectations/tests/vector.rs @@ -11,11 +11,15 @@ pub struct foo { } #[test] fn bindgen_test_layout_foo() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( foo ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( foo ) )); assert_eq! (unsafe { & ( * ( 0 as * const foo ) ) . mMember as * const _ as usize } - , 0usize); + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( foo ) , "::" , + stringify ! ( mMember ) )); } impl Clone for foo { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/virtual_dtor.rs b/tests/expectations/tests/virtual_dtor.rs index 07cc7ee7b5..de5e01afd9 100644 --- a/tests/expectations/tests/virtual_dtor.rs +++ b/tests/expectations/tests/virtual_dtor.rs @@ -14,6 +14,8 @@ pub struct nsSlots { } #[test] fn bindgen_test_layout_nsSlots() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsSlots ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( nsSlots ) )); } diff --git a/tests/expectations/tests/virtual_inheritance.rs b/tests/expectations/tests/virtual_inheritance.rs index e93d28640d..e051073078 100644 --- a/tests/expectations/tests/virtual_inheritance.rs +++ b/tests/expectations/tests/virtual_inheritance.rs @@ -11,11 +11,15 @@ pub struct A { } #[test] fn bindgen_test_layout_A() { - assert_eq!(::std::mem::size_of::() , 4usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( A ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( A ) )); assert_eq! (unsafe { & ( * ( 0 as * const A ) ) . foo as * const _ as usize } , - 0usize); + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A ) , "::" , stringify + ! ( foo ) )); } impl Clone for A { fn clone(&self) -> Self { *self } @@ -31,11 +35,15 @@ pub struct B { } #[test] fn bindgen_test_layout_B() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( B ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( B ) )); assert_eq! (unsafe { & ( * ( 0 as * const B ) ) . bar as * const _ as usize } , - 8usize); + 8usize , concat ! ( + "Alignment of field: " , stringify ! ( B ) , "::" , stringify + ! ( bar ) )); } impl Clone for B { fn clone(&self) -> Self { *self } @@ -51,11 +59,15 @@ pub struct C { } #[test] fn bindgen_test_layout_C() { - assert_eq!(::std::mem::size_of::() , 16usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( C ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( C ) )); assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . baz as * const _ as usize } , - 8usize); + 8usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( baz ) )); } impl Clone for C { fn clone(&self) -> Self { *self } @@ -69,8 +81,10 @@ pub struct D { } #[test] fn bindgen_test_layout_D() { - assert_eq!(::std::mem::size_of::() , 40usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 40usize , concat ! ( + "Size of: " , stringify ! ( D ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( D ) )); } impl Clone for D { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/virtual_overloaded.rs b/tests/expectations/tests/virtual_overloaded.rs index b101a0a268..9937cf5db6 100644 --- a/tests/expectations/tests/virtual_overloaded.rs +++ b/tests/expectations/tests/virtual_overloaded.rs @@ -14,8 +14,10 @@ pub struct C { } #[test] fn bindgen_test_layout_C() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( C ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( C ) )); } impl Clone for C { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/vtable_recursive_sig.rs b/tests/expectations/tests/vtable_recursive_sig.rs index 8d69f212c0..6cf3135f5b 100644 --- a/tests/expectations/tests/vtable_recursive_sig.rs +++ b/tests/expectations/tests/vtable_recursive_sig.rs @@ -11,8 +11,10 @@ pub struct Derived { } #[test] fn bindgen_test_layout_Derived() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Derived ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Derived ) )); } impl Clone for Derived { fn clone(&self) -> Self { *self } @@ -27,8 +29,10 @@ pub struct Base { } #[test] fn bindgen_test_layout_Base() { - assert_eq!(::std::mem::size_of::() , 8usize); - assert_eq! (::std::mem::align_of::() , 8usize); + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Base ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Base ) )); } impl Clone for Base { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/weird_bitfields.rs b/tests/expectations/tests/weird_bitfields.rs index 927b91f8ab..98765b092d 100644 --- a/tests/expectations/tests/weird_bitfields.rs +++ b/tests/expectations/tests/weird_bitfields.rs @@ -31,44 +31,70 @@ pub struct Weird { } #[test] fn bindgen_test_layout_Weird() { - assert_eq!(::std::mem::size_of::() , 24usize); - assert_eq! (::std::mem::align_of::() , 4usize); + assert_eq!(::std::mem::size_of::() , 24usize , concat ! ( + "Size of: " , stringify ! ( Weird ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Weird ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mStrokeDasharrayLength as * - const _ as usize } , 0usize); + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mStrokeDasharrayLength ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mClipRule as * const _ as - usize } , 8usize); + usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mClipRule ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mColorInterpolation as * - const _ as usize } , 9usize); + const _ as usize } , 9usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mColorInterpolation ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mColorInterpolationFilters as - * const _ as usize } , 10usize); + * const _ as usize } , 10usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mColorInterpolationFilters ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mFillRule as * const _ as - usize } , 11usize); + usize } , 11usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mFillRule ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mImageRendering as * const _ - as usize } , 12usize); + as usize } , 12usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mImageRendering ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mPaintOrder as * const _ as - usize } , 13usize); + usize } , 13usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mPaintOrder ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mShapeRendering as * const _ - as usize } , 14usize); + as usize } , 14usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mShapeRendering ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mStrokeLinecap as * const _ - as usize } , 15usize); + as usize } , 15usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mStrokeLinecap ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mStrokeLinejoin as * const _ - as usize } , 16usize); + as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mStrokeLinejoin ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mTextAnchor as * const _ as - usize } , 17usize); + usize } , 17usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mTextAnchor ) )); assert_eq! (unsafe { & ( * ( 0 as * const Weird ) ) . mTextRendering as * const _ - as usize } , 18usize); + as usize } , 18usize , concat ! ( + "Alignment of field: " , stringify ! ( Weird ) , "::" , + stringify ! ( mTextRendering ) )); } impl Clone for Weird { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/what_is_going_on.rs b/tests/expectations/tests/what_is_going_on.rs index c4d54d05d1..d0265c4ea4 100644 --- a/tests/expectations/tests/what_is_going_on.rs +++ b/tests/expectations/tests/what_is_going_on.rs @@ -11,8 +11,10 @@ pub struct UnknownUnits { } #[test] fn bindgen_test_layout_UnknownUnits() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( UnknownUnits ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( UnknownUnits ) )); } impl Clone for UnknownUnits { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/whitelist-namespaces-basic.rs b/tests/expectations/tests/whitelist-namespaces-basic.rs index cfd9e5f3af..06f24ff01d 100644 --- a/tests/expectations/tests/whitelist-namespaces-basic.rs +++ b/tests/expectations/tests/whitelist-namespaces-basic.rs @@ -20,8 +20,10 @@ pub mod root { } #[test] fn bindgen_test_layout_Helper() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! + ( "Size of: " , stringify ! ( Helper ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat + ! ( "Alignment of " , stringify ! ( Helper ) )); } impl Clone for Helper { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/whitelist-namespaces.rs b/tests/expectations/tests/whitelist-namespaces.rs index 858167210a..d3707800b6 100644 --- a/tests/expectations/tests/whitelist-namespaces.rs +++ b/tests/expectations/tests/whitelist-namespaces.rs @@ -20,8 +20,10 @@ pub mod root { } #[test] fn bindgen_test_layout_Helper() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! + ( "Size of: " , stringify ! ( Helper ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat + ! ( "Alignment of " , stringify ! ( Helper ) )); } impl Clone for Helper { fn clone(&self) -> Self { *self } @@ -34,11 +36,15 @@ pub mod root { } #[test] fn bindgen_test_layout_Test() { - assert_eq!(::std::mem::size_of::() , 1usize); - assert_eq! (::std::mem::align_of::() , 1usize); + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Test ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Test ) )); assert_eq! (unsafe { & ( * ( 0 as * const Test ) ) . helper as * const _ as - usize } , 0usize); + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( helper ) )); } impl Clone for Test { fn clone(&self) -> Self { *self } From c4eb4b2e4ed933d00586a227915abae37acf8643 Mon Sep 17 00:00:00 2001 From: Manuel Woelker Date: Tue, 7 Feb 2017 21:05:44 +0100 Subject: [PATCH 0306/2291] ty: add tests for Type.is_invalid_named_type() (#460) --- src/ir/ty.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 5903430c91..f1e439838c 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -392,6 +392,51 @@ impl Type { } } } +#[test] +fn is_invalid_named_type_valid() { + let ty = Type::new(Some("foo".into()), None, TypeKind::Named, false); + assert!(!ty.is_invalid_named_type()) +} + +#[test] +fn is_invalid_named_type_valid_underscore_and_numbers() { + let ty = + Type::new(Some("_foo123456789_".into()), None, TypeKind::Named, false); + assert!(!ty.is_invalid_named_type()) +} + +#[test] +fn is_invalid_named_type_valid_unnamed_kind() { + let ty = Type::new(Some("foo".into()), None, TypeKind::Void, false); + assert!(!ty.is_invalid_named_type()) +} + +#[test] +fn is_invalid_named_type_invalid_start() { + let ty = Type::new(Some("1foo".into()), None, TypeKind::Named, false); + assert!(ty.is_invalid_named_type()) +} + +#[test] +fn is_invalid_named_type_invalid_remaing() { + let ty = Type::new(Some("foo-".into()), None, TypeKind::Named, false); + assert!(ty.is_invalid_named_type()) +} + +#[test] +#[should_panic] +fn is_invalid_named_type_unnamed() { + let ty = Type::new(None, None, TypeKind::Named, false); + assert!(ty.is_invalid_named_type()) +} + +#[test] +#[should_panic] +fn is_invalid_named_type_empty_name() { + let ty = Type::new(Some("".into()), None, TypeKind::Named, false); + assert!(ty.is_invalid_named_type()) +} + impl CanDeriveDebug for Type { type Extra = (); From 25b68ba8bda4cdacaf7f04260f91709233fe0d45 Mon Sep 17 00:00:00 2001 From: Flier Lu Date: Sun, 5 Feb 2017 17:12:05 +0800 Subject: [PATCH 0307/2291] implement Default trait --- src/codegen/mod.rs | 54 ++++++++++++++-- src/ir/comp.rs | 61 ++++++++++++++++++- src/ir/context.rs | 10 ++- src/ir/derive.rs | 21 +++++++ src/ir/item.rs | 22 ++++++- src/ir/layout.rs | 11 +++- src/ir/ty.rs | 35 ++++++++++- src/lib.rs | 11 ++++ src/options.rs | 15 +++++ tests/expectations/tests/16-byte-alignment.rs | 15 +++-- .../expectations/tests/381-decltype-alias.rs | 3 + tests/expectations/tests/accessors.rs | 12 ++-- tests/expectations/tests/annotation_hide.rs | 4 +- tests/expectations/tests/anon_enum.rs | 2 +- tests/expectations/tests/anon_enum_trait.rs | 5 +- tests/expectations/tests/anon_union.rs | 12 +++- tests/expectations/tests/auto.rs | 5 +- .../bad-namespace-parenthood-inheritance.rs | 5 +- tests/expectations/tests/base-to-derived.rs | 2 +- .../expectations/tests/bitfield-enum-basic.rs | 2 +- .../tests/bitfield_method_mangling.rs | 2 +- .../canonical_path_without_namespacing.rs | 2 +- tests/expectations/tests/class.rs | 24 ++++++-- tests/expectations/tests/class_nested.rs | 12 +++- tests/expectations/tests/class_no_members.rs | 6 +- tests/expectations/tests/class_static.rs | 2 +- .../expectations/tests/class_static_const.rs | 2 +- tests/expectations/tests/class_use_as.rs | 4 +- tests/expectations/tests/class_with_dtor.rs | 6 ++ .../tests/class_with_inner_struct.rs | 23 ++++--- .../expectations/tests/class_with_typedef.rs | 6 ++ tests/expectations/tests/complex.rs | 10 ++- tests/expectations/tests/const_bool.rs | 2 +- .../expectations/tests/const_enum_unnamed.rs | 2 +- tests/expectations/tests/const_tparam.rs | 3 + .../tests/constant-non-specialized-tp.rs | 8 ++- .../expectations/tests/constify-all-enums.rs | 3 + tests/expectations/tests/constructor-tp.rs | 5 +- tests/expectations/tests/constructors.rs | 4 +- tests/expectations/tests/convert-floats.rs | 3 + tests/expectations/tests/crtp.rs | 12 ++++ tests/expectations/tests/dash_language.rs | 3 + .../duplicated-namespaces-definitions.rs | 5 +- .../tests/empty_template_param_name.rs | 3 + .../tests/enum_and_vtable_mangling.rs | 4 ++ .../tests/enum_in_template_with_typedef.rs | 3 + .../tests/eval-variadic-template-parameter.rs | 3 + .../tests/forward-declaration-autoptr.rs | 6 ++ .../forward-inherit-struct-with-fields.rs | 6 ++ .../tests/forward-inherit-struct.rs | 6 ++ .../tests/forward_declared_complex_types.rs | 5 +- .../tests/forward_declared_struct.rs | 4 +- .../expectations/tests/func_ptr_in_struct.rs | 3 + tests/expectations/tests/in_class_typedef.rs | 5 +- .../expectations/tests/inherit-namespaced.rs | 6 ++ tests/expectations/tests/inherit_named.rs | 6 ++ tests/expectations/tests/inherit_typedef.rs | 4 +- tests/expectations/tests/inline_namespace.rs | 2 +- .../tests/inline_namespace_conservative.rs | 2 +- tests/expectations/tests/inner_const.rs | 2 +- .../expectations/tests/inner_template_self.rs | 6 ++ tests/expectations/tests/issue-358.rs | 6 ++ tests/expectations/tests/issue-372.rs | 9 +++ tests/expectations/tests/issue-410.rs | 2 +- tests/expectations/tests/issue-447.rs | 4 +- tests/expectations/tests/issue_311.rs | 4 +- .../expectations/tests/jsval_layout_opaque.rs | 11 ++-- tests/expectations/tests/layout.rs | 3 +- tests/expectations/tests/layout_align.rs | 6 +- tests/expectations/tests/layout_arp.rs | 6 +- tests/expectations/tests/layout_array.rs | 14 ++++- .../tests/layout_cmdline_token.rs | 12 ++++ tests/expectations/tests/layout_eth_conf.rs | 58 +++++++++++++++--- tests/expectations/tests/layout_kni_mbuf.rs | 3 + tests/expectations/tests/layout_mbuf.rs | 27 ++++---- .../tests/maddness-is-avoidable.rs | 6 ++ tests/expectations/tests/method-mangling.rs | 2 +- .../expectations/tests/module-whitelisted.rs | 2 +- tests/expectations/tests/msvc-no-usr.rs | 2 +- .../multiple-inherit-empty-correct-layout.rs | 6 +- tests/expectations/tests/mutable.rs | 6 +- tests/expectations/tests/namespace.rs | 8 ++- tests/expectations/tests/nested.rs | 8 +-- tests/expectations/tests/nested_vtable.rs | 10 +++ .../tests/nested_within_namespace.rs | 6 +- tests/expectations/tests/no-comments.rs | 2 +- tests/expectations/tests/no-derive-debug.rs | 4 +- tests/expectations/tests/no-derive-default.rs | 38 ++++++++++++ .../tests/no-recursive-whitelisting.rs | 3 + tests/expectations/tests/no-std.rs | 3 + tests/expectations/tests/no_copy.rs | 3 + tests/expectations/tests/nsStyleAutoArray.rs | 6 ++ .../expectations/tests/objc_interface_type.rs | 3 + tests/expectations/tests/only_bitfields.rs | 2 +- tests/expectations/tests/opaque-tracing.rs | 2 +- tests/expectations/tests/opaque_in_struct.rs | 4 +- tests/expectations/tests/opaque_pointer.rs | 8 ++- tests/expectations/tests/opaque_typedef.rs | 3 + tests/expectations/tests/private.rs | 6 +- tests/expectations/tests/public-dtor.rs | 2 +- .../expectations/tests/ref_argument_array.rs | 4 ++ .../tests/reparented_replacement.rs | 2 +- .../tests/replace_template_alias.rs | 3 + tests/expectations/tests/replace_use.rs | 6 ++ tests/expectations/tests/replaces_double.rs | 3 + ...ame_struct_name_in_different_namespaces.rs | 2 +- tests/expectations/tests/size_t_template.rs | 3 + ...ruct_containing_forward_declared_struct.rs | 5 +- .../tests/struct_with_anon_struct.rs | 4 +- .../tests/struct_with_anon_struct_array.rs | 6 +- .../tests/struct_with_anon_struct_pointer.rs | 5 +- .../tests/struct_with_anon_union.rs | 4 +- .../tests/struct_with_anon_unnamed_struct.rs | 4 +- .../tests/struct_with_anon_unnamed_union.rs | 4 +- .../tests/struct_with_bitfields.rs | 2 +- .../tests/struct_with_derive_debug.rs | 10 ++- .../expectations/tests/struct_with_nesting.rs | 8 +-- .../expectations/tests/struct_with_packing.rs | 2 +- .../expectations/tests/struct_with_struct.rs | 4 +- .../tests/struct_with_typedef_template_arg.rs | 3 + tests/expectations/tests/template-fun-ty.rs | 9 +++ tests/expectations/tests/template.rs | 58 +++++++++++++++++- tests/expectations/tests/template_alias.rs | 3 + .../tests/template_alias_namespace.rs | 3 + .../template_typedef_transitive_param.rs | 6 ++ tests/expectations/tests/template_typedefs.rs | 3 + .../expectations/tests/templateref_opaque.rs | 6 ++ ...type-referenced-by-whitelisted-function.rs | 2 +- ..._alias_partial_template_especialization.rs | 3 + .../tests/type_alias_template_specialized.rs | 2 +- tests/expectations/tests/typeref.rs | 15 ++++- tests/expectations/tests/union-in-ns.rs | 2 +- tests/expectations/tests/union_dtor.rs | 2 +- tests/expectations/tests/union_fields.rs | 2 +- tests/expectations/tests/union_template.rs | 9 ++- .../tests/union_with_anon_struct.rs | 4 +- .../tests/union_with_anon_struct_bitfield.rs | 4 +- .../tests/union_with_anon_union.rs | 4 +- .../tests/union_with_anon_unnamed_struct.rs | 4 +- .../tests/union_with_anon_unnamed_union.rs | 4 +- .../tests/union_with_big_member.rs | 8 ++- .../expectations/tests/union_with_nesting.rs | 8 +-- tests/expectations/tests/unknown_attr.rs | 2 +- tests/expectations/tests/use-core.rs | 3 + tests/expectations/tests/using.rs | 3 + tests/expectations/tests/var-tracing.rs | 4 +- tests/expectations/tests/variadic-method.rs | 2 +- .../tests/variadic_template_function.rs | 3 + tests/expectations/tests/vector.rs | 2 +- tests/expectations/tests/virtual_dtor.rs | 4 ++ .../expectations/tests/virtual_inheritance.rs | 13 +++- .../expectations/tests/virtual_overloaded.rs | 4 ++ .../tests/vtable_recursive_sig.rs | 7 +++ tests/expectations/tests/weird_bitfields.rs | 3 + tests/expectations/tests/what_is_going_on.rs | 5 +- .../tests/whitelist-namespaces-basic.rs | 2 +- .../tests/whitelist-namespaces.rs | 4 +- tests/expectations/tests/whitelist_basic.rs | 6 ++ tests/headers/no-derive-debug.h | 2 +- tests/headers/no-derive-default.h | 15 +++++ tests/tests.rs | 1 + 161 files changed, 968 insertions(+), 204 deletions(-) create mode 100644 tests/expectations/tests/no-derive-default.rs create mode 100644 tests/headers/no-derive-default.h diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 0fdfaad0a9..5ee43173c8 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -8,7 +8,7 @@ use aster; use ir::annotations::FieldAccessorKind; use ir::comp::{Base, CompInfo, CompKind, Field, Method, MethodKind}; use ir::context::{BindgenContext, ItemId}; -use ir::derive::{CanDeriveCopy, CanDeriveDebug}; +use ir::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; use ir::function::{Function, FunctionSig}; use ir::int::IntKind; @@ -688,10 +688,16 @@ impl<'a> CodeGenerator for Vtable<'a> { assert_eq!(item.id(), self.item_id); // For now, generate an empty struct, later we should generate function // pointers and whatnot. + let mut attributes = vec![attributes::repr("C")]; + + if ctx.options().derive_default { + attributes.push(attributes::derives(&["Default"])) + } + let vtable = aster::AstBuilder::new() .item() .pub_() - .with_attr(attributes::repr("C")) + .with_attrs(attributes) .struct_(self.canonical_name(ctx)) .build(); result.push(vtable); @@ -879,6 +885,7 @@ impl CodeGenerator for CompInfo { let mut attributes = vec![]; let mut needs_clone_impl = false; + let mut needs_default_impl = false; if ctx.options().generate_comments { if let Some(comment) = item.comment() { attributes.push(attributes::doc(comment)); @@ -896,6 +903,12 @@ impl CodeGenerator for CompInfo { derives.push("Debug"); } + if item.can_derive_default(ctx, ()) { + derives.push("Default"); + } else { + needs_default_impl = ctx.options().derive_default; + } + if item.can_derive_copy(ctx, ()) && !item.annotations().disallow_copy() { derives.push("Copy"); @@ -1440,8 +1453,14 @@ impl CodeGenerator for CompInfo { // NB: We can't use to_rust_ty here since for opaque types this tries to // use the specialization knowledge to generate a blob field. - let ty_for_impl = - aster::AstBuilder::new().ty().path().id(&canonical_name).build(); + let ty_for_impl = aster::AstBuilder::new() + .ty() + .path() + .segment(&canonical_name) + .with_generics(generics.clone()) + .build() + .build(); + if needs_clone_impl { let impl_ = quote_item!(ctx.ext_cx(), impl X { @@ -1467,6 +1486,32 @@ impl CodeGenerator for CompInfo { result.push(clone_impl); } + if needs_default_impl { + let prefix = ctx.trait_prefix(); + let impl_ = quote_item!(ctx.ext_cx(), + impl X { + fn default() -> Self { unsafe { ::$prefix::mem::zeroed() } } + } + ); + + let impl_ = match impl_.unwrap().node { + ast::ItemKind::Impl(_, _, _, _, _, ref items) => items.clone(), + _ => unreachable!(), + }; + + let default_impl = aster::AstBuilder::new() + .item() + .impl_() + .trait_() + .id("Default") + .build() + .with_generics(generics.clone()) + .with_items(impl_) + .build_ty(ty_for_impl.clone()); + + result.push(default_impl); + } + if !methods.is_empty() { let methods = aster::AstBuilder::new() .item() @@ -2582,6 +2627,7 @@ mod utils { let incomplete_array_decl = quote_item!(ctx.ext_cx(), #[repr(C)] + #[derive(Default)] pub struct __IncompleteArrayField( ::$prefix::marker::PhantomData); ) diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 53efd278bf..1ca3955993 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -2,7 +2,7 @@ use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; -use super::derive::{CanDeriveCopy, CanDeriveDebug}; +use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::item::Item; use super::layout::Layout; use super::ty::Type; @@ -171,6 +171,14 @@ impl CanDeriveDebug for Field { } } +impl CanDeriveDefault for Field { + type Extra = (); + + fn can_derive_default(&self, ctx: &BindgenContext, _: ()) -> bool { + self.ty.can_derive_default(ctx, ()) + } +} + impl<'a> CanDeriveCopy<'a> for Field { type Extra = (); @@ -296,6 +304,10 @@ pub struct CompInfo { /// around the template arguments. detect_derive_debug_cycle: Cell, + /// Used to detect if we've run in a can_derive_default cycle while cycling + /// around the template arguments. + detect_derive_default_cycle: Cell, + /// Used to detect if we've run in a has_destructor cycle while cycling /// around the template arguments. detect_has_destructor_cycle: Cell, @@ -326,6 +338,7 @@ impl CompInfo { is_anonymous: false, found_unknown_attr: false, detect_derive_debug_cycle: Cell::new(false), + detect_derive_default_cycle: Cell::new(false), detect_has_destructor_cycle: Cell::new(false), is_forward_declaration: false, } @@ -952,6 +965,52 @@ impl CanDeriveDebug for CompInfo { } } +impl CanDeriveDefault for CompInfo { + type Extra = Option; + + fn can_derive_default(&self, + ctx: &BindgenContext, + layout: Option) + -> bool { + // We can reach here recursively via template parameters of a member, + // for example. + if self.detect_derive_default_cycle.get() { + warn!("Derive default cycle detected!"); + return true; + } + + if self.kind == CompKind::Union { + if ctx.options().unstable_rust { + return false; + } + + return layout.unwrap_or_else(Layout::zero) + .opaque() + .can_derive_debug(ctx, ()); + } + + self.detect_derive_default_cycle.set(true); + + let can_derive_default = !self.has_vtable(ctx) && + !self.needs_explicit_vtable(ctx) && + self.base_members + .iter() + .all(|base| base.ty.can_derive_default(ctx, ())) && + self.template_args + .iter() + .all(|id| id.can_derive_default(ctx, ())) && + self.fields + .iter() + .all(|f| f.can_derive_default(ctx, ())) && + self.ref_template + .map_or(true, |id| id.can_derive_default(ctx, ())); + + self.detect_derive_default_cycle.set(false); + + can_derive_default + } +} + impl<'a> CanDeriveCopy<'a> for CompInfo { type Extra = (&'a Item, Option); diff --git a/src/ir/context.rs b/src/ir/context.rs index 38ecdf1701..a748239496 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -1,6 +1,6 @@ //! Common context that is passed around during parsing and codegen. -use super::derive::{CanDeriveCopy, CanDeriveDebug}; +use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::int::IntKind; use super::item::{Item, ItemCanonicalPath}; use super::item_kind::ItemKind; @@ -42,6 +42,14 @@ impl CanDeriveDebug for ItemId { } } +impl CanDeriveDefault for ItemId { + type Extra = (); + + fn can_derive_default(&self, ctx: &BindgenContext, _: ()) -> bool { + ctx.resolve_item(*self).can_derive_default(ctx, ()) + } +} + impl<'a> CanDeriveCopy<'a> for ItemId { type Extra = (); diff --git a/src/ir/derive.rs b/src/ir/derive.rs index d13a811708..6d9f368ba2 100644 --- a/src/ir/derive.rs +++ b/src/ir/derive.rs @@ -65,3 +65,24 @@ pub trait CanDeriveCopy<'a> { extra: Self::Extra) -> bool; } + +/// A trait that encapsulates the logic for whether or not we can derive `Default` +/// for a given thing. +/// +/// This should ideally be a no-op that just returns `true`, but instead needs +/// to be a recursive method that checks whether all the proper members can +/// derive default or not, because of the limit rust has on 32 items as max in the +/// array. +pub trait CanDeriveDefault { + /// Implementations can define this type to get access to any extra + /// information required to determine whether they can derive `Default`. If + /// extra information is unneeded, then this should simply be the unit type. + type Extra; + + /// Return `true` if `Default` can be derived for this thing, `false` + /// otherwise. + fn can_derive_default(&self, + ctx: &BindgenContext, + extra: Self::Extra) + -> bool; +} \ No newline at end of file diff --git a/src/ir/item.rs b/src/ir/item.rs index a5d10e418d..c8de95c072 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -2,7 +2,7 @@ use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; -use super::derive::{CanDeriveCopy, CanDeriveDebug}; +use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::function::Function; use super::item_kind::ItemKind; use super::module::Module; @@ -235,6 +235,26 @@ impl CanDeriveDebug for Item { } } +impl CanDeriveDefault for Item { + type Extra = (); + + fn can_derive_default(&self, ctx: &BindgenContext, _: ()) -> bool { + ctx.options().derive_default && + match self.kind { + ItemKind::Type(ref ty) => { + if self.is_opaque(ctx) { + ty.layout(ctx) + .map_or(false, + |l| l.opaque().can_derive_default(ctx, ())) + } else { + ty.can_derive_default(ctx, ()) + } + } + _ => false, + } + } +} + impl<'a> CanDeriveCopy<'a> for Item { type Extra = (); diff --git a/src/ir/layout.rs b/src/ir/layout.rs index e8c6c32bf9..03d43b51ba 100644 --- a/src/ir/layout.rs +++ b/src/ir/layout.rs @@ -1,7 +1,7 @@ //! Intermediate representation for the physical layout of some type. use super::context::BindgenContext; -use super::derive::{CanDeriveCopy, CanDeriveDebug}; +use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::ty::RUST_DERIVE_IN_ARRAY_LIMIT; use std::cmp; @@ -79,6 +79,15 @@ impl CanDeriveDebug for Opaque { } } +impl CanDeriveDefault for Opaque { + type Extra = (); + + fn can_derive_default(&self, _: &BindgenContext, _: ()) -> bool { + self.array_size() + .map_or(false, |size| size <= RUST_DERIVE_IN_ARRAY_LIMIT) + } +} + impl<'a> CanDeriveCopy<'a> for Opaque { type Extra = (); diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 5903430c91..c3a35f0f31 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -2,7 +2,7 @@ use super::comp::CompInfo; use super::context::{BindgenContext, ItemId}; -use super::derive::{CanDeriveCopy, CanDeriveDebug}; +use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::enum_ty::Enum; use super::function::FunctionSig; use super::int::IntKind; @@ -412,6 +412,39 @@ impl CanDeriveDebug for Type { } } +impl CanDeriveDefault for Type { + type Extra = (); + + fn can_derive_default(&self, ctx: &BindgenContext, _: ()) -> bool { + match self.kind { + TypeKind::Array(t, len) => { + len <= RUST_DERIVE_IN_ARRAY_LIMIT && + t.can_derive_default(ctx, ()) + } + TypeKind::ResolvedTypeRef(t) | + TypeKind::TemplateAlias(t, _) | + TypeKind::Alias(t) => t.can_derive_default(ctx, ()), + TypeKind::Comp(ref info) => { + info.can_derive_default(ctx, self.layout(ctx)) + } + TypeKind::Void | + TypeKind::Named | + TypeKind::TemplateRef(..) | + TypeKind::Reference(..) | + TypeKind::NullPtr | + TypeKind::Pointer(..) | + TypeKind::BlockPointer | + TypeKind::ObjCInterface(..) | + TypeKind::Enum(..) => false, + TypeKind::Function(..) | + TypeKind::Int(..) | + TypeKind::Float(..) | + TypeKind::Complex(..) => true, + TypeKind::UnresolvedTypeRef(..) => unreachable!(), + } + } +} + impl<'a> CanDeriveCopy<'a> for Type { type Extra = &'a Item; diff --git a/src/lib.rs b/src/lib.rs index 84a2ee6708..38ff3619fd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -320,6 +320,12 @@ impl Builder { self } + /// Set whether `Default` should be derived by default. + pub fn derive_default(mut self, doit: bool) -> Self { + self.options.derive_default = doit; + self + } + /// Emit Clang AST. pub fn emit_clang_ast(mut self) -> Builder { self.options.emit_ast = true; @@ -496,6 +502,10 @@ pub struct BindgenOptions { /// and types. pub derive_debug: bool, + /// True if we shold derive Default trait implementations for C/C++ structures + /// and types. + pub derive_default: bool, + /// True if we can use unstable Rust code in the bindings, false if we /// cannot. pub unstable_rust: bool, @@ -581,6 +591,7 @@ impl Default for BindgenOptions { emit_ast: false, emit_ir: false, derive_debug: true, + derive_default: false, enable_cxx_namespaces: false, disable_name_namespacing: false, unstable_rust: true, diff --git a/src/options.rs b/src/options.rs index 8d11be2d2a..cc5f48459a 100644 --- a/src/options.rs +++ b/src/options.rs @@ -42,6 +42,13 @@ pub fn builder_from_flags(args: I) Arg::with_name("no-derive-debug") .long("no-derive-debug") .help("Avoid deriving Debug on any type."), + Arg::with_name("no-derive-default") + .long("no-derive-default") + .hidden(true) + .help("Avoid deriving Default on any type."), + Arg::with_name("with-derive-default") + .long("with-derive-default") + .help("Deriving Default on any type."), Arg::with_name("no-doc-comments") .long("no-doc-comments") .help("Avoid including doc comments in the output, see: \ @@ -212,6 +219,14 @@ pub fn builder_from_flags(args: I) builder = builder.derive_debug(false); } + if matches.is_present("with-derive-default") { + builder = builder.derive_default(true); + } + + if matches.is_present("no-derive-default") { + builder = builder.derive_default(false); + } + if let Some(prefix) = matches.value_of("ctypes-prefix") { builder = builder.ctypes_prefix(prefix); } diff --git a/tests/expectations/tests/16-byte-alignment.rs b/tests/expectations/tests/16-byte-alignment.rs index b9dd74e37c..2ab00679b9 100644 --- a/tests/expectations/tests/16-byte-alignment.rs +++ b/tests/expectations/tests/16-byte-alignment.rs @@ -29,21 +29,21 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_ipv4_tuple { pub src_addr: u32, pub dst_addr: u32, pub __bindgen_anon_1: rte_ipv4_tuple__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_ipv4_tuple__bindgen_ty_1 { pub __bindgen_anon_1: __BindgenUnionField, pub sctp_tag: __BindgenUnionField, pub bindgen_union_field: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_ipv4_tuple__bindgen_ty_1__bindgen_ty_1 { pub dport: u16, pub sport: u16, @@ -116,21 +116,21 @@ impl Clone for rte_ipv4_tuple { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_ipv6_tuple { pub src_addr: [u8; 16usize], pub dst_addr: [u8; 16usize], pub __bindgen_anon_1: rte_ipv6_tuple__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_ipv6_tuple__bindgen_ty_1 { pub __bindgen_anon_1: __BindgenUnionField, pub sctp_tag: __BindgenUnionField, pub bindgen_union_field: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_ipv6_tuple__bindgen_ty_1__bindgen_ty_1 { pub dport: u16, pub sport: u16, @@ -227,3 +227,6 @@ fn bindgen_test_layout_rte_thash_tuple() { impl Clone for rte_thash_tuple { fn clone(&self) -> Self { *self } } +impl Default for rte_thash_tuple { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/381-decltype-alias.rs b/tests/expectations/tests/381-decltype-alias.rs index 766be3bced..45b0cfdd55 100644 --- a/tests/expectations/tests/381-decltype-alias.rs +++ b/tests/expectations/tests/381-decltype-alias.rs @@ -10,3 +10,6 @@ pub struct std_allocator_traits<_Alloc> { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData<_Alloc>, } +impl <_Alloc> Default for std_allocator_traits<_Alloc> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/accessors.rs b/tests/expectations/tests/accessors.rs index c0d95bfb08..753188bdd0 100644 --- a/tests/expectations/tests/accessors.rs +++ b/tests/expectations/tests/accessors.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct SomeAccessors { pub mNoAccessor: ::std::os::raw::c_int, /**
*/ @@ -70,7 +70,7 @@ impl SomeAccessors { } /**
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct AllAccessors { pub mBothAccessors: ::std::os::raw::c_int, pub mAlsoBothAccessors: ::std::os::raw::c_int, @@ -116,7 +116,7 @@ impl AllAccessors { } /**
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct AllUnsafeAccessors { pub mBothAccessors: ::std::os::raw::c_int, pub mAlsoBothAccessors: ::std::os::raw::c_int, @@ -164,7 +164,7 @@ impl AllUnsafeAccessors { } /**
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct ContradictAccessors { pub mBothAccessors: ::std::os::raw::c_int, /**
*/ @@ -231,7 +231,7 @@ impl ContradictAccessors { } /**
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Replaced { pub mAccessor: ::std::os::raw::c_int, } @@ -260,7 +260,7 @@ impl Replaced { } /**
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Wrapper { pub mReplaced: Replaced, } diff --git a/tests/expectations/tests/annotation_hide.rs b/tests/expectations/tests/annotation_hide.rs index 62840b13b6..1ad8fd8337 100644 --- a/tests/expectations/tests/annotation_hide.rs +++ b/tests/expectations/tests/annotation_hide.rs @@ -8,7 +8,7 @@ *
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct D { pub _bindgen_opaque_blob: u32, } @@ -23,7 +23,7 @@ impl Clone for D { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct NotAnnotated { pub f: ::std::os::raw::c_int, } diff --git a/tests/expectations/tests/anon_enum.rs b/tests/expectations/tests/anon_enum.rs index b2c7f5fc54..07ea481062 100644 --- a/tests/expectations/tests/anon_enum.rs +++ b/tests/expectations/tests/anon_enum.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Test { pub foo: ::std::os::raw::c_int, pub bar: f32, diff --git a/tests/expectations/tests/anon_enum_trait.rs b/tests/expectations/tests/anon_enum_trait.rs index c258f7d6fd..31eaca8399 100644 --- a/tests/expectations/tests/anon_enum_trait.rs +++ b/tests/expectations/tests/anon_enum_trait.rs @@ -27,8 +27,11 @@ pub const DataType_type_: DataType__bindgen_ty_1 = #[repr(i32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum DataType__bindgen_ty_1 { generic_type = 0, } +impl <_Tp> Default for DataType<_Tp> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Foo { pub _address: u8, } diff --git a/tests/expectations/tests/anon_union.rs b/tests/expectations/tests/anon_union.rs index 6ded1e5706..4418bc7780 100644 --- a/tests/expectations/tests/anon_union.rs +++ b/tests/expectations/tests/anon_union.rs @@ -43,25 +43,28 @@ pub const TErrorResult_UnionState_HasException: TErrorResult_UnionState = #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum TErrorResult_UnionState { HasMessage = 0, } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] pub struct TErrorResult_Message { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] pub struct TErrorResult_DOMExceptionInfo { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] pub struct TErrorResult__bindgen_ty_1 { pub mMessage: __BindgenUnionField<*mut TErrorResult_Message>, pub mDOMExceptionInfo: __BindgenUnionField<*mut TErrorResult_DOMExceptionInfo>, pub bindgen_union_field: u64, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for TErrorResult { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct ErrorResult { @@ -77,6 +80,9 @@ fn bindgen_test_layout_ErrorResult() { impl Clone for ErrorResult { fn clone(&self) -> Self { *self } } +impl Default for ErrorResult { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[test] fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() , diff --git a/tests/expectations/tests/auto.rs b/tests/expectations/tests/auto.rs index 554546af0e..4551f70314 100644 --- a/tests/expectations/tests/auto.rs +++ b/tests/expectations/tests/auto.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Foo { pub _address: u8, } @@ -26,6 +26,9 @@ pub struct Bar { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Bar { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} extern "C" { #[link_name = "_Z5Test2v"] pub fn Test2() -> ::std::os::raw::c_uint; diff --git a/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs b/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs index 553879b7a8..b0c91e8ca9 100644 --- a/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs +++ b/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs @@ -10,8 +10,11 @@ pub struct std_char_traits<_CharT> { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData<_CharT>, } +impl <_CharT> Default for std_char_traits<_CharT> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct __gnu_cxx_char_traits { pub _address: u8, } diff --git a/tests/expectations/tests/base-to-derived.rs b/tests/expectations/tests/base-to-derived.rs index 4749096ba6..6ff4ce9a97 100644 --- a/tests/expectations/tests/base-to-derived.rs +++ b/tests/expectations/tests/base-to-derived.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct false_type { pub _address: u8, } diff --git a/tests/expectations/tests/bitfield-enum-basic.rs b/tests/expectations/tests/bitfield-enum-basic.rs index a8d3ecc5cc..362cf28030 100644 --- a/tests/expectations/tests/bitfield-enum-basic.rs +++ b/tests/expectations/tests/bitfield-enum-basic.rs @@ -48,7 +48,7 @@ impl ::std::ops::BitOr<_bindgen_ty_1> for _bindgen_ty_1 { #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub struct _bindgen_ty_1(pub ::std::os::raw::c_uint); #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Dummy { pub _address: u8, } diff --git a/tests/expectations/tests/bitfield_method_mangling.rs b/tests/expectations/tests/bitfield_method_mangling.rs index 94f0aa8e4c..0ab5fce557 100644 --- a/tests/expectations/tests/bitfield_method_mangling.rs +++ b/tests/expectations/tests/bitfield_method_mangling.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct _bindgen_ty_1 { pub _bitfield_1: u32, } diff --git a/tests/expectations/tests/canonical_path_without_namespacing.rs b/tests/expectations/tests/canonical_path_without_namespacing.rs index dff6b7071f..43bec38d2f 100644 --- a/tests/expectations/tests/canonical_path_without_namespacing.rs +++ b/tests/expectations/tests/canonical_path_without_namespacing.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Bar { pub _address: u8, } diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index 46adbc2940..92389cbefa 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -5,6 +5,7 @@ #[repr(C)] +#[derive(Default)] pub struct __IncompleteArrayField(::std::marker::PhantomData); impl __IncompleteArrayField { #[inline] @@ -81,6 +82,9 @@ fn bindgen_test_layout_C() { "Alignment of field: " , stringify ! ( C ) , "::" , stringify ! ( big_array ) )); } +impl Default for C { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] pub struct C_with_zero_length_array { pub a: ::std::os::raw::c_int, @@ -114,6 +118,9 @@ fn bindgen_test_layout_C_with_zero_length_array() { C_with_zero_length_array ) , "::" , stringify ! ( zero_length_array ) )); } +impl Default for C_with_zero_length_array { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] pub struct C_with_incomplete_array { pub a: ::std::os::raw::c_int, @@ -129,6 +136,9 @@ fn bindgen_test_layout_C_with_incomplete_array() { concat ! ( "Alignment of " , stringify ! ( C_with_incomplete_array ) )); } +impl Default for C_with_incomplete_array { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] pub struct C_with_zero_length_array_and_incomplete_array { pub a: ::std::os::raw::c_int, @@ -147,8 +157,11 @@ fn bindgen_test_layout_C_with_zero_length_array_and_incomplete_array() { "Alignment of " , stringify ! ( C_with_zero_length_array_and_incomplete_array ) )); } +impl Default for C_with_zero_length_array_and_incomplete_array { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug)] +#[derive(Debug, Default)] pub struct WithDtor { pub b: ::std::os::raw::c_int, } @@ -179,8 +192,11 @@ fn bindgen_test_layout_IncompleteArrayNonCopiable() { "Alignment of " , stringify ! ( IncompleteArrayNonCopiable ) )); } +impl Default for IncompleteArrayNonCopiable { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Union { pub d: __BindgenUnionField, pub i: __BindgenUnionField<::std::os::raw::c_int>, @@ -207,7 +223,7 @@ impl Clone for Union { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct WithUnion { pub data: Union, } @@ -227,7 +243,7 @@ impl Clone for WithUnion { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct RealAbstractionWithTonsOfMethods { pub _address: u8, } diff --git a/tests/expectations/tests/class_nested.rs b/tests/expectations/tests/class_nested.rs index 8a4125c904..19d70e5034 100644 --- a/tests/expectations/tests/class_nested.rs +++ b/tests/expectations/tests/class_nested.rs @@ -5,12 +5,12 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct A { pub member_a: ::std::os::raw::c_int, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct A_B { pub member_b: ::std::os::raw::c_int, } @@ -49,7 +49,7 @@ extern "C" { pub static mut var: A_B; } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct D { pub member: A_B, } @@ -78,3 +78,9 @@ pub struct Templated { pub struct Templated_Templated_inner { pub member_ptr: *mut T, } +impl Default for Templated_Templated_inner { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl Default for Templated { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/class_no_members.rs b/tests/expectations/tests/class_no_members.rs index e41e3ffc7d..ad532100ec 100644 --- a/tests/expectations/tests/class_no_members.rs +++ b/tests/expectations/tests/class_no_members.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct whatever { pub _address: u8, } @@ -20,7 +20,7 @@ impl Clone for whatever { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct whatever_child { pub _address: u8, } @@ -35,7 +35,7 @@ impl Clone for whatever_child { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct whatever_child_with_member { pub m_member: ::std::os::raw::c_int, } diff --git a/tests/expectations/tests/class_static.rs b/tests/expectations/tests/class_static.rs index 207295b6c0..521621a760 100644 --- a/tests/expectations/tests/class_static.rs +++ b/tests/expectations/tests/class_static.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct MyClass { pub _address: u8, } diff --git a/tests/expectations/tests/class_static_const.rs b/tests/expectations/tests/class_static_const.rs index 5e59485bc2..4b0108a17d 100644 --- a/tests/expectations/tests/class_static_const.rs +++ b/tests/expectations/tests/class_static_const.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct A { pub _address: u8, } diff --git a/tests/expectations/tests/class_use_as.rs b/tests/expectations/tests/class_use_as.rs index 9184c9c84b..f4db9013cb 100644 --- a/tests/expectations/tests/class_use_as.rs +++ b/tests/expectations/tests/class_use_as.rs @@ -8,7 +8,7 @@ *
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct whatever { pub replacement: ::std::os::raw::c_int, } @@ -28,7 +28,7 @@ impl Clone for whatever { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct container { pub c: whatever, } diff --git a/tests/expectations/tests/class_with_dtor.rs b/tests/expectations/tests/class_with_dtor.rs index 1d8e6b4dd3..4c1d271878 100644 --- a/tests/expectations/tests/class_with_dtor.rs +++ b/tests/expectations/tests/class_with_dtor.rs @@ -9,6 +9,9 @@ pub struct HandleWithDtor { pub ptr: *mut T, } +impl Default for HandleWithDtor { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} pub type HandleValue = HandleWithDtor<::std::os::raw::c_int>; #[repr(C)] #[derive(Debug)] @@ -27,6 +30,9 @@ fn bindgen_test_layout_WithoutDtor() { "Alignment of field: " , stringify ! ( WithoutDtor ) , "::" , stringify ! ( shouldBeWithDtor ) )); } +impl Default for WithoutDtor { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[test] fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() diff --git a/tests/expectations/tests/class_with_inner_struct.rs b/tests/expectations/tests/class_with_inner_struct.rs index 1056fd69c3..a99aada553 100644 --- a/tests/expectations/tests/class_with_inner_struct.rs +++ b/tests/expectations/tests/class_with_inner_struct.rs @@ -29,14 +29,14 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct A { pub c: ::std::os::raw::c_uint, pub named_union: A__bindgen_ty_1, pub __bindgen_anon_1: A__bindgen_ty_2, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct A_Segment { pub begin: ::std::os::raw::c_int, pub end: ::std::os::raw::c_int, @@ -62,7 +62,7 @@ impl Clone for A_Segment { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct A__bindgen_ty_1 { pub f: __BindgenUnionField<::std::os::raw::c_int>, pub bindgen_union_field: u32, @@ -83,7 +83,7 @@ impl Clone for A__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct A__bindgen_ty_2 { pub d: __BindgenUnionField<::std::os::raw::c_int>, pub bindgen_union_field: u32, @@ -123,12 +123,12 @@ impl Clone for A { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct B { pub d: ::std::os::raw::c_uint, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct B_Segment { pub begin: ::std::os::raw::c_int, pub end: ::std::os::raw::c_int, @@ -176,20 +176,20 @@ pub enum StepSyntax { FunctionalWithEndKeyword = 3, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct C { pub d: ::std::os::raw::c_uint, pub __bindgen_anon_1: C__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct C__bindgen_ty_1 { pub mFunc: __BindgenUnionField, pub __bindgen_anon_1: __BindgenUnionField, pub bindgen_union_field: [u32; 4usize], } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct C__bindgen_ty_1__bindgen_ty_1 { pub mX1: f32, pub mY1: f32, @@ -264,6 +264,9 @@ fn bindgen_test_layout_C__bindgen_ty_1__bindgen_ty_2() { impl Clone for C__bindgen_ty_1__bindgen_ty_2 { fn clone(&self) -> Self { *self } } +impl Default for C__bindgen_ty_1__bindgen_ty_2 { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[test] fn bindgen_test_layout_C__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( @@ -280,7 +283,7 @@ impl Clone for C__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct C_Segment { pub begin: ::std::os::raw::c_int, pub end: ::std::os::raw::c_int, diff --git a/tests/expectations/tests/class_with_typedef.rs b/tests/expectations/tests/class_with_typedef.rs index d3141fd99d..1a92b98603 100644 --- a/tests/expectations/tests/class_with_typedef.rs +++ b/tests/expectations/tests/class_with_typedef.rs @@ -65,6 +65,9 @@ extern "C" { impl Clone for C { fn clone(&self) -> Self { *self } } +impl Default for C { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} impl C { #[inline] pub unsafe fn method(&mut self, c: C_MyInt) { C_method(&mut *self, c) } @@ -102,3 +105,6 @@ fn bindgen_test_layout_D() { impl Clone for D { fn clone(&self) -> Self { *self } } +impl Default for D { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/complex.rs b/tests/expectations/tests/complex.rs index 1048138eb7..d250f6b118 100644 --- a/tests/expectations/tests/complex.rs +++ b/tests/expectations/tests/complex.rs @@ -11,7 +11,7 @@ pub struct __BindgenComplex { pub im: T, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct TestDouble { pub mMember: __BindgenComplex, } @@ -50,8 +50,11 @@ fn bindgen_test_layout_TestDoublePtr() { impl Clone for TestDoublePtr { fn clone(&self) -> Self { *self } } +impl Default for TestDoublePtr { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct TestFloat { pub mMember: __BindgenComplex, } @@ -90,3 +93,6 @@ fn bindgen_test_layout_TestFloatPtr() { impl Clone for TestFloatPtr { fn clone(&self) -> Self { *self } } +impl Default for TestFloatPtr { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/const_bool.rs b/tests/expectations/tests/const_bool.rs index 2c8ba788c3..de9e81b02e 100644 --- a/tests/expectations/tests/const_bool.rs +++ b/tests/expectations/tests/const_bool.rs @@ -6,7 +6,7 @@ pub const k: bool = true; #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct A { pub _address: u8, } diff --git a/tests/expectations/tests/const_enum_unnamed.rs b/tests/expectations/tests/const_enum_unnamed.rs index 8a5f0f23a9..b6f61b356d 100644 --- a/tests/expectations/tests/const_enum_unnamed.rs +++ b/tests/expectations/tests/const_enum_unnamed.rs @@ -10,7 +10,7 @@ pub const FOO_BAZ: _bindgen_ty_1 = _bindgen_ty_1::FOO_BAZ; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum _bindgen_ty_1 { FOO_BAR = 0, FOO_BAZ = 1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Foo { pub _address: u8, } diff --git a/tests/expectations/tests/const_tparam.rs b/tests/expectations/tests/const_tparam.rs index 3ed10d28b5..f47ca08244 100644 --- a/tests/expectations/tests/const_tparam.rs +++ b/tests/expectations/tests/const_tparam.rs @@ -10,3 +10,6 @@ pub struct C { pub foo: *const T, pub bar: *mut T, } +impl Default for C { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/constant-non-specialized-tp.rs b/tests/expectations/tests/constant-non-specialized-tp.rs index bbadf8a2df..f2aa5a7584 100644 --- a/tests/expectations/tests/constant-non-specialized-tp.rs +++ b/tests/expectations/tests/constant-non-specialized-tp.rs @@ -10,6 +10,9 @@ pub struct Test { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Test { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Outer { @@ -17,8 +20,11 @@ pub struct Outer { pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] pub struct Outer_Inner { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Outer { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/constify-all-enums.rs b/tests/expectations/tests/constify-all-enums.rs index ae89a9b72c..e1210d9a1f 100644 --- a/tests/expectations/tests/constify-all-enums.rs +++ b/tests/expectations/tests/constify-all-enums.rs @@ -28,3 +28,6 @@ fn bindgen_test_layout_bar() { impl Clone for bar { fn clone(&self) -> Self { *self } } +impl Default for bar { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/constructor-tp.rs b/tests/expectations/tests/constructor-tp.rs index 0f53317b4e..ee04d3c5d9 100644 --- a/tests/expectations/tests/constructor-tp.rs +++ b/tests/expectations/tests/constructor-tp.rs @@ -10,8 +10,11 @@ pub struct Foo { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Bar { pub _address: u8, } diff --git a/tests/expectations/tests/constructors.rs b/tests/expectations/tests/constructors.rs index 3abb2da783..13a4dcf877 100644 --- a/tests/expectations/tests/constructors.rs +++ b/tests/expectations/tests/constructors.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct TestOverload { pub _address: u8, } @@ -43,7 +43,7 @@ impl TestOverload { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct TestPublicNoArgs { pub _address: u8, } diff --git a/tests/expectations/tests/convert-floats.rs b/tests/expectations/tests/convert-floats.rs index 5971db0630..ba35da3314 100644 --- a/tests/expectations/tests/convert-floats.rs +++ b/tests/expectations/tests/convert-floats.rs @@ -60,3 +60,6 @@ fn bindgen_test_layout_foo() { impl Clone for foo { fn clone(&self) -> Self { *self } } +impl Default for foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/crtp.rs b/tests/expectations/tests/crtp.rs index 8fe0a5ae2e..7143f50e6d 100644 --- a/tests/expectations/tests/crtp.rs +++ b/tests/expectations/tests/crtp.rs @@ -10,6 +10,9 @@ pub struct Base { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Base { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct Derived { @@ -25,12 +28,18 @@ fn bindgen_test_layout_Derived() { impl Clone for Derived { fn clone(&self) -> Self { *self } } +impl Default for Derived { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug)] pub struct BaseWithDestructor { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for BaseWithDestructor { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug)] pub struct DerivedFromBaseWithDestructor { @@ -46,6 +55,9 @@ fn bindgen_test_layout_DerivedFromBaseWithDestructor() { "Alignment of " , stringify ! ( DerivedFromBaseWithDestructor ) )); } +impl Default for DerivedFromBaseWithDestructor { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[test] fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() , 1usize , concat ! ( diff --git a/tests/expectations/tests/dash_language.rs b/tests/expectations/tests/dash_language.rs index 148f9c32d7..24df101487 100644 --- a/tests/expectations/tests/dash_language.rs +++ b/tests/expectations/tests/dash_language.rs @@ -10,3 +10,6 @@ pub struct Foo { pub bar: ::std::os::raw::c_int, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/duplicated-namespaces-definitions.rs b/tests/expectations/tests/duplicated-namespaces-definitions.rs index 1b785fd7f2..196cfc46d1 100644 --- a/tests/expectations/tests/duplicated-namespaces-definitions.rs +++ b/tests/expectations/tests/duplicated-namespaces-definitions.rs @@ -11,7 +11,7 @@ pub mod root { #[allow(unused_imports)] use self::super::super::root; #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Bar { pub foo: ::std::os::raw::c_int, pub baz: bool, @@ -60,5 +60,8 @@ pub mod root { impl Clone for Foo { fn clone(&self) -> Self { *self } } + impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } + } } } diff --git a/tests/expectations/tests/empty_template_param_name.rs b/tests/expectations/tests/empty_template_param_name.rs index e10b56db71..6ee8fce396 100644 --- a/tests/expectations/tests/empty_template_param_name.rs +++ b/tests/expectations/tests/empty_template_param_name.rs @@ -11,3 +11,6 @@ pub struct __iterator_traits<_Iterator> { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData<_Iterator>, } +impl <_Iterator> Default for __iterator_traits<_Iterator> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/enum_and_vtable_mangling.rs b/tests/expectations/tests/enum_and_vtable_mangling.rs index e372d98bba..300edd3931 100644 --- a/tests/expectations/tests/enum_and_vtable_mangling.rs +++ b/tests/expectations/tests/enum_and_vtable_mangling.rs @@ -10,6 +10,7 @@ pub const whatever_else: _bindgen_ty_1 = _bindgen_ty_1::whatever_else; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum _bindgen_ty_1 { match_ = 0, whatever_else = 1, } #[repr(C)] +#[derive(Default)] pub struct C__bindgen_vtable { } #[repr(C)] @@ -32,3 +33,6 @@ fn bindgen_test_layout_C() { impl Clone for C { fn clone(&self) -> Self { *self } } +impl Default for C { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/enum_in_template_with_typedef.rs b/tests/expectations/tests/enum_in_template_with_typedef.rs index 66a304aa95..e4725b8386 100644 --- a/tests/expectations/tests/enum_in_template_with_typedef.rs +++ b/tests/expectations/tests/enum_in_template_with_typedef.rs @@ -16,3 +16,6 @@ pub const std_fbstring_core_Category_Bar: std_fbstring_core_Category = #[repr(u8)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum std_fbstring_core_Category { Foo = 0, } +impl Default for std_fbstring_core { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/eval-variadic-template-parameter.rs b/tests/expectations/tests/eval-variadic-template-parameter.rs index f8c937e2a8..acc6f34c61 100644 --- a/tests/expectations/tests/eval-variadic-template-parameter.rs +++ b/tests/expectations/tests/eval-variadic-template-parameter.rs @@ -10,3 +10,6 @@ pub struct B { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for B { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/forward-declaration-autoptr.rs b/tests/expectations/tests/forward-declaration-autoptr.rs index ffe5b7b626..b05984c8c8 100644 --- a/tests/expectations/tests/forward-declaration-autoptr.rs +++ b/tests/expectations/tests/forward-declaration-autoptr.rs @@ -12,6 +12,9 @@ pub struct Foo([u8; 0]); pub struct RefPtr { pub m_inner: *mut T, } +impl Default for RefPtr { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct Bar { @@ -32,3 +35,6 @@ fn bindgen_test_layout_Bar() { impl Clone for Bar { fn clone(&self) -> Self { *self } } +impl Default for Bar { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/forward-inherit-struct-with-fields.rs b/tests/expectations/tests/forward-inherit-struct-with-fields.rs index e377b3ad2a..ce61a5459c 100644 --- a/tests/expectations/tests/forward-inherit-struct-with-fields.rs +++ b/tests/expectations/tests/forward-inherit-struct-with-fields.rs @@ -9,9 +9,15 @@ pub struct Rooted { pub _base: js_RootedBase, } +impl Default for Rooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct js_RootedBase { pub foo: *mut T, pub next: *mut Rooted, } +impl Default for js_RootedBase { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/forward-inherit-struct.rs b/tests/expectations/tests/forward-inherit-struct.rs index 5de70fa9fa..1057e70c06 100644 --- a/tests/expectations/tests/forward-inherit-struct.rs +++ b/tests/expectations/tests/forward-inherit-struct.rs @@ -10,9 +10,15 @@ pub struct Rooted { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Rooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct js_RootedBase { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for js_RootedBase { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/forward_declared_complex_types.rs b/tests/expectations/tests/forward_declared_complex_types.rs index 0637fea3fb..a6e67f7b77 100644 --- a/tests/expectations/tests/forward_declared_complex_types.rs +++ b/tests/expectations/tests/forward_declared_complex_types.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Foo_empty { pub _address: u8, } @@ -42,6 +42,9 @@ fn bindgen_test_layout_Bar() { impl Clone for Bar { fn clone(&self) -> Self { *self } } +impl Default for Bar { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} extern "C" { #[link_name = "_Z10baz_structP3Foo"] pub fn baz_struct(f: *mut Foo); diff --git a/tests/expectations/tests/forward_declared_struct.rs b/tests/expectations/tests/forward_declared_struct.rs index 51c61cdf0d..ec8b15d1e3 100644 --- a/tests/expectations/tests/forward_declared_struct.rs +++ b/tests/expectations/tests/forward_declared_struct.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct a { pub b: ::std::os::raw::c_int, } @@ -24,7 +24,7 @@ impl Clone for a { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct c { pub d: ::std::os::raw::c_int, } diff --git a/tests/expectations/tests/func_ptr_in_struct.rs b/tests/expectations/tests/func_ptr_in_struct.rs index eba6c7e2dc..ce14586615 100644 --- a/tests/expectations/tests/func_ptr_in_struct.rs +++ b/tests/expectations/tests/func_ptr_in_struct.rs @@ -30,3 +30,6 @@ fn bindgen_test_layout_Foo() { impl Clone for Foo { fn clone(&self) -> Self { *self } } +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/in_class_typedef.rs b/tests/expectations/tests/in_class_typedef.rs index 4e95ca8c6a..3634a6313c 100644 --- a/tests/expectations/tests/in_class_typedef.rs +++ b/tests/expectations/tests/in_class_typedef.rs @@ -13,9 +13,12 @@ pub struct Foo { pub type Foo_elem_type = T; pub type Foo_ptr_type = *mut T; #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] pub struct Foo_Bar { pub x: ::std::os::raw::c_int, pub y: ::std::os::raw::c_int, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/inherit-namespaced.rs b/tests/expectations/tests/inherit-namespaced.rs index c0d2e5a643..e5d5f875ee 100644 --- a/tests/expectations/tests/inherit-namespaced.rs +++ b/tests/expectations/tests/inherit-namespaced.rs @@ -10,9 +10,15 @@ pub struct js_RootedBase { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for js_RootedBase { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Rooted { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Rooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/inherit_named.rs b/tests/expectations/tests/inherit_named.rs index 8081c649b7..31c4bee911 100644 --- a/tests/expectations/tests/inherit_named.rs +++ b/tests/expectations/tests/inherit_named.rs @@ -10,8 +10,14 @@ pub struct Wohoo { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Wohoo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Weeee { pub _base: T, } +impl Default for Weeee { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/inherit_typedef.rs b/tests/expectations/tests/inherit_typedef.rs index ff6a62d3ce..76d7c35f8c 100644 --- a/tests/expectations/tests/inherit_typedef.rs +++ b/tests/expectations/tests/inherit_typedef.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Foo { pub _address: u8, } @@ -21,7 +21,7 @@ impl Clone for Foo { } pub type TypedefedFoo = Foo; #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Bar { pub _address: u8, } diff --git a/tests/expectations/tests/inline_namespace.rs b/tests/expectations/tests/inline_namespace.rs index 6b2c4f80c9..8f2243ba2c 100644 --- a/tests/expectations/tests/inline_namespace.rs +++ b/tests/expectations/tests/inline_namespace.rs @@ -13,7 +13,7 @@ pub mod root { pub type Ty = ::std::os::raw::c_int; } #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Bar { pub baz: root::foo::Ty, } diff --git a/tests/expectations/tests/inline_namespace_conservative.rs b/tests/expectations/tests/inline_namespace_conservative.rs index 5b74a5f6b9..7cf7c26421 100644 --- a/tests/expectations/tests/inline_namespace_conservative.rs +++ b/tests/expectations/tests/inline_namespace_conservative.rs @@ -18,7 +18,7 @@ pub mod root { pub type Ty = ::std::os::raw::c_longlong; } #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Bar { pub baz: root::foo::bar::Ty, } diff --git a/tests/expectations/tests/inner_const.rs b/tests/expectations/tests/inner_const.rs index 3422f1683b..fd2793a434 100644 --- a/tests/expectations/tests/inner_const.rs +++ b/tests/expectations/tests/inner_const.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Foo { pub bar: ::std::os::raw::c_int, } diff --git a/tests/expectations/tests/inner_template_self.rs b/tests/expectations/tests/inner_template_self.rs index 4345e422cb..3510fa7c77 100644 --- a/tests/expectations/tests/inner_template_self.rs +++ b/tests/expectations/tests/inner_template_self.rs @@ -10,6 +10,9 @@ pub struct LinkedList { pub next: *mut LinkedList, pub prev: *mut LinkedList, } +impl Default for LinkedList { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct InstantiateIt { @@ -30,3 +33,6 @@ fn bindgen_test_layout_InstantiateIt() { impl Clone for InstantiateIt { fn clone(&self) -> Self { *self } } +impl Default for InstantiateIt { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/issue-358.rs b/tests/expectations/tests/issue-358.rs index 1b933d3437..d3be3c4374 100644 --- a/tests/expectations/tests/issue-358.rs +++ b/tests/expectations/tests/issue-358.rs @@ -10,6 +10,9 @@ pub struct JS_PersistentRooted { pub _base: a, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for JS_PersistentRooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct a { @@ -18,3 +21,6 @@ pub struct a { impl Clone for a { fn clone(&self) -> Self { *self } } +impl Default for a { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/issue-372.rs b/tests/expectations/tests/issue-372.rs index 8fcfd33dc7..1693f46a2d 100644 --- a/tests/expectations/tests/issue-372.rs +++ b/tests/expectations/tests/issue-372.rs @@ -27,6 +27,9 @@ pub mod root { impl Clone for d { fn clone(&self) -> Self { *self } } + impl Default for d { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } + } #[repr(C)] #[derive(Debug, Copy)] pub struct i { @@ -59,6 +62,9 @@ pub mod root { impl Clone for i { fn clone(&self) -> Self { *self } } + impl Default for i { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } + } #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum n { @@ -91,4 +97,7 @@ pub mod root { "Alignment of field: " , stringify ! ( F ) , "::" , stringify ! ( w ) )); } + impl Default for F { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } + } } diff --git a/tests/expectations/tests/issue-410.rs b/tests/expectations/tests/issue-410.rs index a8e0d8d469..2fe0f99b27 100644 --- a/tests/expectations/tests/issue-410.rs +++ b/tests/expectations/tests/issue-410.rs @@ -11,7 +11,7 @@ pub mod root { #[allow(unused_imports)] use self::super::super::root; #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Value { pub _address: u8, } diff --git a/tests/expectations/tests/issue-447.rs b/tests/expectations/tests/issue-447.rs index 0582f4129e..7ac9d714ab 100644 --- a/tests/expectations/tests/issue-447.rs +++ b/tests/expectations/tests/issue-447.rs @@ -14,7 +14,7 @@ pub mod root { #[allow(unused_imports)] use self::super::super::super::root; #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct GuardObjectNotifier { pub _address: u8, } @@ -35,7 +35,7 @@ pub mod root { } } #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct JSAutoCompartment { pub _address: u8, } diff --git a/tests/expectations/tests/issue_311.rs b/tests/expectations/tests/issue_311.rs index debc893d57..6576b8b5fb 100644 --- a/tests/expectations/tests/issue_311.rs +++ b/tests/expectations/tests/issue_311.rs @@ -8,12 +8,12 @@ pub mod root { #[allow(unused_imports)] use self::super::root; #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct jsval_layout { pub __bindgen_anon_1: root::jsval_layout__bindgen_ty_1, } #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct jsval_layout__bindgen_ty_1 { pub _address: u8, } diff --git a/tests/expectations/tests/jsval_layout_opaque.rs b/tests/expectations/tests/jsval_layout_opaque.rs index ac09258736..848286e7ea 100644 --- a/tests/expectations/tests/jsval_layout_opaque.rs +++ b/tests/expectations/tests/jsval_layout_opaque.rs @@ -96,7 +96,7 @@ pub enum JSWhyMagic { JS_WHY_MAGIC_COUNT = 18, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct jsval_layout { pub asBits: __BindgenUnionField, pub debugView: __BindgenUnionField, @@ -125,6 +125,9 @@ fn bindgen_test_layout_jsval_layout__bindgen_ty_1() { impl Clone for jsval_layout__bindgen_ty_1 { fn clone(&self) -> Self { *self } } +impl Default for jsval_layout__bindgen_ty_1 { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} impl jsval_layout__bindgen_ty_1 { #[inline] pub fn payload47(&self) -> u64 { @@ -157,12 +160,12 @@ impl jsval_layout__bindgen_ty_1 { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct jsval_layout__bindgen_ty_2 { pub payload: jsval_layout__bindgen_ty_2__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct jsval_layout__bindgen_ty_2__bindgen_ty_1 { pub i32: __BindgenUnionField, pub u32: __BindgenUnionField, @@ -269,7 +272,7 @@ impl Clone for jsval_layout { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Value { pub data: jsval_layout, } diff --git a/tests/expectations/tests/layout.rs b/tests/expectations/tests/layout.rs index 5fae570c9d..115a108a2e 100644 --- a/tests/expectations/tests/layout.rs +++ b/tests/expectations/tests/layout.rs @@ -5,6 +5,7 @@ #[repr(C)] +#[derive(Default)] pub struct __IncompleteArrayField(::std::marker::PhantomData); impl __IncompleteArrayField { #[inline] @@ -37,7 +38,7 @@ impl ::std::clone::Clone for __IncompleteArrayField { } impl ::std::marker::Copy for __IncompleteArrayField { } #[repr(C, packed)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct header { pub proto: ::std::os::raw::c_char, pub size: ::std::os::raw::c_uint, diff --git a/tests/expectations/tests/layout_align.rs b/tests/expectations/tests/layout_align.rs index 0479521cee..a21fa4d6ec 100644 --- a/tests/expectations/tests/layout_align.rs +++ b/tests/expectations/tests/layout_align.rs @@ -5,6 +5,7 @@ #[repr(C)] +#[derive(Default)] pub struct __IncompleteArrayField(::std::marker::PhantomData); impl __IncompleteArrayField { #[inline] @@ -61,8 +62,11 @@ fn bindgen_test_layout_rte_kni_fifo() { impl Clone for rte_kni_fifo { fn clone(&self) -> Self { *self } } +impl Default for rte_kni_fifo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_eth_link { /**< ETH_SPEED_NUM_ */ pub link_speed: u32, diff --git a/tests/expectations/tests/layout_arp.rs b/tests/expectations/tests/layout_arp.rs index c868f627d5..f3c59eb412 100644 --- a/tests/expectations/tests/layout_arp.rs +++ b/tests/expectations/tests/layout_arp.rs @@ -24,7 +24,7 @@ pub const ARP_OP_INVREPLY: ::std::os::raw::c_uint = 9; * See http://standards.ieee.org/regauth/groupmac/tutorial.html */ #[repr(C, packed)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct ether_addr { /**< Addr bytes in tx order */ pub addr_bytes: [u8; 6usize], @@ -48,7 +48,7 @@ impl Clone for ether_addr { * ARP header IPv4 payload. */ #[repr(C, packed)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct arp_ipv4 { /**< sender hardware address */ pub arp_sha: ether_addr, @@ -93,7 +93,7 @@ impl Clone for arp_ipv4 { * ARP header. */ #[repr(C, packed)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct arp_hdr { pub arp_hrd: u16, pub arp_pro: u16, diff --git a/tests/expectations/tests/layout_array.rs b/tests/expectations/tests/layout_array.rs index bc690fb6e5..3f86cda9a5 100644 --- a/tests/expectations/tests/layout_array.rs +++ b/tests/expectations/tests/layout_array.rs @@ -109,11 +109,14 @@ fn bindgen_test_layout_rte_mempool_ops() { impl Clone for rte_mempool_ops { fn clone(&self) -> Self { *self } } +impl Default for rte_mempool_ops { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} /** * The rte_spinlock_t type. */ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct _bindgen_ty_1 { /**< lock status 0 = unlocked, 1 = locked */ pub locked: ::std::os::raw::c_int, @@ -180,6 +183,9 @@ fn bindgen_test_layout_rte_mempool_ops_table() { impl Clone for rte_mempool_ops_table { fn clone(&self) -> Self { *self } } +impl Default for rte_mempool_ops_table { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} /** * Structure to hold malloc heap */ @@ -218,6 +224,9 @@ fn bindgen_test_layout_malloc_heap__bindgen_ty_1() { impl Clone for malloc_heap__bindgen_ty_1 { fn clone(&self) -> Self { *self } } +impl Default for malloc_heap__bindgen_ty_1 { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[test] fn bindgen_test_layout_malloc_heap() { assert_eq!(::std::mem::size_of::() , 128usize , concat ! ( @@ -246,3 +255,6 @@ fn bindgen_test_layout_malloc_heap() { impl Clone for malloc_heap { fn clone(&self) -> Self { *self } } +impl Default for malloc_heap { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/layout_cmdline_token.rs b/tests/expectations/tests/layout_cmdline_token.rs index be4944bbfa..35127399e3 100644 --- a/tests/expectations/tests/layout_cmdline_token.rs +++ b/tests/expectations/tests/layout_cmdline_token.rs @@ -108,6 +108,9 @@ fn bindgen_test_layout_cmdline_token_hdr_cmdline_token_ops() { impl Clone for cmdline_token_hdr_cmdline_token_ops { fn clone(&self) -> Self { *self } } +impl Default for cmdline_token_hdr_cmdline_token_ops { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[test] fn bindgen_test_layout_cmdline_token_hdr() { assert_eq!(::std::mem::size_of::() , 16usize , concat ! @@ -128,6 +131,9 @@ fn bindgen_test_layout_cmdline_token_hdr() { impl Clone for cmdline_token_hdr { fn clone(&self) -> Self { *self } } +impl Default for cmdline_token_hdr { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} pub type cmdline_parse_token_hdr_t = cmdline_token_hdr; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] @@ -163,6 +169,9 @@ fn bindgen_test_layout_cmdline_token_num_data() { impl Clone for cmdline_token_num_data { fn clone(&self) -> Self { *self } } +impl Default for cmdline_token_num_data { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct cmdline_token_num { @@ -189,4 +198,7 @@ fn bindgen_test_layout_cmdline_token_num() { impl Clone for cmdline_token_num { fn clone(&self) -> Self { *self } } +impl Default for cmdline_token_num { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} pub type cmdline_parse_token_num_t = cmdline_token_num; diff --git a/tests/expectations/tests/layout_eth_conf.rs b/tests/expectations/tests/layout_eth_conf.rs index 0034e707b9..16788d06f5 100644 --- a/tests/expectations/tests/layout_eth_conf.rs +++ b/tests/expectations/tests/layout_eth_conf.rs @@ -115,6 +115,9 @@ fn bindgen_test_layout_rte_eth_rxmode() { impl Clone for rte_eth_rxmode { fn clone(&self) -> Self { *self } } +impl Default for rte_eth_rxmode { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} impl rte_eth_rxmode { #[inline] pub fn header_split(&self) -> u16 { @@ -268,6 +271,9 @@ fn bindgen_test_layout_rte_eth_txmode() { impl Clone for rte_eth_txmode { fn clone(&self) -> Self { *self } } +impl Default for rte_eth_txmode { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} impl rte_eth_txmode { #[inline] pub fn hw_vlan_reject_tagged(&self) -> u8 { @@ -358,6 +364,9 @@ fn bindgen_test_layout_rte_eth_rss_conf() { impl Clone for rte_eth_rss_conf { fn clone(&self) -> Self { *self } } +impl Default for rte_eth_rss_conf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(u32)] /** * This enum indicates the possible number of traffic classes @@ -403,7 +412,7 @@ pub struct rte_eth_vmdq_dcb_conf { pub dcb_tc: [u8; 8usize], } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_eth_vmdq_dcb_conf__bindgen_ty_1 { /**< The vlan id of the received frame */ pub vlan_id: u16, @@ -476,6 +485,9 @@ fn bindgen_test_layout_rte_eth_vmdq_dcb_conf() { "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf ) , "::" , stringify ! ( dcb_tc ) )); } +impl Default for rte_eth_vmdq_dcb_conf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct rte_eth_dcb_rx_conf { @@ -505,6 +517,9 @@ fn bindgen_test_layout_rte_eth_dcb_rx_conf() { impl Clone for rte_eth_dcb_rx_conf { fn clone(&self) -> Self { *self } } +impl Default for rte_eth_dcb_rx_conf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct rte_eth_vmdq_dcb_tx_conf { @@ -536,6 +551,9 @@ fn bindgen_test_layout_rte_eth_vmdq_dcb_tx_conf() { impl Clone for rte_eth_vmdq_dcb_tx_conf { fn clone(&self) -> Self { *self } } +impl Default for rte_eth_vmdq_dcb_tx_conf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct rte_eth_dcb_tx_conf { @@ -565,6 +583,9 @@ fn bindgen_test_layout_rte_eth_dcb_tx_conf() { impl Clone for rte_eth_dcb_tx_conf { fn clone(&self) -> Self { *self } } +impl Default for rte_eth_dcb_tx_conf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct rte_eth_vmdq_tx_conf { @@ -587,6 +608,9 @@ fn bindgen_test_layout_rte_eth_vmdq_tx_conf() { impl Clone for rte_eth_vmdq_tx_conf { fn clone(&self) -> Self { *self } } +impl Default for rte_eth_vmdq_tx_conf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] pub struct rte_eth_vmdq_rx_conf { /**< VMDq only mode, 8 or 64 pools */ @@ -605,7 +629,7 @@ pub struct rte_eth_vmdq_rx_conf { pub pool_map: [rte_eth_vmdq_rx_conf__bindgen_ty_1; 64usize], } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_eth_vmdq_rx_conf__bindgen_ty_1 { /**< The vlan id of the received frame */ pub vlan_id: u16, @@ -683,6 +707,9 @@ fn bindgen_test_layout_rte_eth_vmdq_rx_conf() { "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf ) , "::" , stringify ! ( pool_map ) )); } +impl Default for rte_eth_vmdq_rx_conf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(u32)] /** * Flow Director setting modes: none, signature or perfect. @@ -720,7 +747,7 @@ pub enum rte_fdir_status_mode { * A structure used to define the input for IPV4 flow */ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_eth_ipv4_flow { /**< IPv4 source address in big endian. */ pub src_ip: u32, @@ -772,7 +799,7 @@ impl Clone for rte_eth_ipv4_flow { * A structure used to define the input for IPV6 flow */ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_eth_ipv6_flow { /**< IPv6 source address in big endian. */ pub src_ip: [u32; 4usize], @@ -825,7 +852,7 @@ impl Clone for rte_eth_ipv6_flow { * to match the various fields of RX packet headers. */ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_eth_fdir_masks { /**< Bit mask for vlan_tci in big endian */ pub vlan_tci_mask: u16, @@ -944,12 +971,15 @@ fn bindgen_test_layout_rte_eth_flex_payload_cfg() { impl Clone for rte_eth_flex_payload_cfg { fn clone(&self) -> Self { *self } } +impl Default for rte_eth_flex_payload_cfg { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} /** * A structure used to define FDIR masks for flexible payload * for each flow type */ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_eth_fdir_flex_mask { pub flow_type: u16, pub mask: [u8; 16usize], @@ -1022,6 +1052,9 @@ fn bindgen_test_layout_rte_eth_fdir_flex_conf() { impl Clone for rte_eth_fdir_flex_conf { fn clone(&self) -> Self { *self } } +impl Default for rte_eth_fdir_flex_conf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} /** * A structure used to configure the Flow Director (FDIR) feature * of an Ethernet port. @@ -1082,11 +1115,14 @@ fn bindgen_test_layout_rte_fdir_conf() { impl Clone for rte_fdir_conf { fn clone(&self) -> Self { *self } } +impl Default for rte_fdir_conf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} /** * A structure used to enable/disable specific device interrupts. */ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_intr_conf { /** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */ pub lsc: u16, @@ -1192,8 +1228,11 @@ fn bindgen_test_layout_rte_eth_conf__bindgen_ty_1() { rte_eth_conf__bindgen_ty_1 ) , "::" , stringify ! ( vmdq_rx_conf ) )); } +impl Default for rte_eth_conf__bindgen_ty_1 { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_eth_conf__bindgen_ty_2 { pub vmdq_dcb_tx_conf: __BindgenUnionField, pub dcb_tx_conf: __BindgenUnionField, @@ -1283,3 +1322,6 @@ fn bindgen_test_layout_rte_eth_conf() { "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" , stringify ! ( intr_conf ) )); } +impl Default for rte_eth_conf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/layout_kni_mbuf.rs b/tests/expectations/tests/layout_kni_mbuf.rs index e0e3579aca..d704267dee 100644 --- a/tests/expectations/tests/layout_kni_mbuf.rs +++ b/tests/expectations/tests/layout_kni_mbuf.rs @@ -109,3 +109,6 @@ fn bindgen_test_layout_rte_kni_mbuf() { impl Clone for rte_kni_mbuf { fn clone(&self) -> Self { *self } } +impl Default for rte_kni_mbuf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/layout_mbuf.rs b/tests/expectations/tests/layout_mbuf.rs index f1702673f4..c0c2cce28b 100644 --- a/tests/expectations/tests/layout_mbuf.rs +++ b/tests/expectations/tests/layout_mbuf.rs @@ -38,7 +38,7 @@ pub type MARKER64 = [u64; 0usize]; * The atomic counter structure. */ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct _bindgen_ty_1 { /**< An internal counter value. */ pub cnt: i16, @@ -118,7 +118,7 @@ pub struct rte_mbuf { * config option. */ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_1 { /**< Atomically accessed refcnt */ pub refcnt_atomic: __BindgenUnionField, @@ -149,7 +149,7 @@ impl Clone for rte_mbuf__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_2 { /**< L2/L3/L4 and tunnel information. */ pub packet_type: __BindgenUnionField, @@ -157,7 +157,7 @@ pub struct rte_mbuf__bindgen_ty_2 { pub bindgen_union_field: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_2__bindgen_ty_1 { pub _bitfield_1: u32, } @@ -285,7 +285,7 @@ impl Clone for rte_mbuf__bindgen_ty_2 { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_3 { /**< RSS hash result if RSS enabled */ pub rss: __BindgenUnionField, @@ -298,20 +298,20 @@ pub struct rte_mbuf__bindgen_ty_3 { pub bindgen_union_field: [u32; 2usize], } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_1 { pub __bindgen_anon_1: rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1, pub hi: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 { pub __bindgen_anon_1: __BindgenUnionField, pub lo: __BindgenUnionField, pub bindgen_union_field: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { pub hash: u16, pub id: u16, @@ -395,7 +395,7 @@ impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_2 { pub lo: u32, pub hi: u32, @@ -459,7 +459,7 @@ impl Clone for rte_mbuf__bindgen_ty_3 { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_4 { /**< Can be used for external metadata */ pub userdata: __BindgenUnionField<*mut ::std::os::raw::c_void>, @@ -493,7 +493,7 @@ impl Clone for rte_mbuf__bindgen_ty_4 { #[derive(Debug, Copy, Clone)] pub struct rte_mbuf_rte_mempool([u8; 0]); #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_5 { /**< combined for easy fetch */ pub tx_offload: __BindgenUnionField, @@ -501,7 +501,7 @@ pub struct rte_mbuf__bindgen_ty_5 { pub bindgen_union_field: u64, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_5__bindgen_ty_1 { pub _bitfield_1: u64, } @@ -731,3 +731,6 @@ fn bindgen_test_layout_rte_mbuf() { impl Clone for rte_mbuf { fn clone(&self) -> Self { *self } } +impl Default for rte_mbuf { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/maddness-is-avoidable.rs b/tests/expectations/tests/maddness-is-avoidable.rs index d31345ba67..2fb5e540e3 100644 --- a/tests/expectations/tests/maddness-is-avoidable.rs +++ b/tests/expectations/tests/maddness-is-avoidable.rs @@ -18,3 +18,9 @@ pub struct RefPtr_Proxy { pub _phantom_1: ::std::marker::PhantomData, pub _phantom_2: ::std::marker::PhantomData, } +impl Default for RefPtr_Proxy { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl Default for RefPtr { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/method-mangling.rs b/tests/expectations/tests/method-mangling.rs index 94877dca56..23f1228018 100644 --- a/tests/expectations/tests/method-mangling.rs +++ b/tests/expectations/tests/method-mangling.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Foo { pub _address: u8, } diff --git a/tests/expectations/tests/module-whitelisted.rs b/tests/expectations/tests/module-whitelisted.rs index cee913058f..cb6dd6a6c1 100644 --- a/tests/expectations/tests/module-whitelisted.rs +++ b/tests/expectations/tests/module-whitelisted.rs @@ -8,7 +8,7 @@ pub mod root { #[allow(unused_imports)] use self::super::root; #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Test { pub _address: u8, } diff --git a/tests/expectations/tests/msvc-no-usr.rs b/tests/expectations/tests/msvc-no-usr.rs index 842ca1f3e6..7ea253b694 100644 --- a/tests/expectations/tests/msvc-no-usr.rs +++ b/tests/expectations/tests/msvc-no-usr.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct A { pub foo: usize, } diff --git a/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs b/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs index 008ed56526..253d58435b 100644 --- a/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs +++ b/tests/expectations/tests/multiple-inherit-empty-correct-layout.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Foo { pub _address: u8, } @@ -20,7 +20,7 @@ impl Clone for Foo { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Bar { pub _address: u8, } @@ -35,7 +35,7 @@ impl Clone for Bar { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Baz { pub _address: u8, } diff --git a/tests/expectations/tests/mutable.rs b/tests/expectations/tests/mutable.rs index 82689ce1b8..cde3dac1b3 100644 --- a/tests/expectations/tests/mutable.rs +++ b/tests/expectations/tests/mutable.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct C { pub m_member: ::std::os::raw::c_int, pub m_other: ::std::os::raw::c_int, @@ -31,7 +31,7 @@ impl Clone for C { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug)] +#[derive(Debug, Default)] pub struct NonCopiable { pub m_member: ::std::os::raw::c_int, } @@ -48,7 +48,7 @@ fn bindgen_test_layout_NonCopiable() { stringify ! ( m_member ) )); } #[repr(C)] -#[derive(Debug)] +#[derive(Debug, Default)] pub struct NonCopiableWithNonCopiableMutableMember { pub m_member: NonCopiable, } diff --git a/tests/expectations/tests/namespace.rs b/tests/expectations/tests/namespace.rs index 4d27385d3c..dda4cd2690 100644 --- a/tests/expectations/tests/namespace.rs +++ b/tests/expectations/tests/namespace.rs @@ -28,7 +28,7 @@ pub mod root { pub fn foo(); } #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct A { pub b: root::whatever::whatever_int_t, } @@ -69,6 +69,9 @@ pub mod root { pub m_c_ptr: *mut T, pub m_c_arr: [T; 10usize], } + impl Default for C { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } + } pub mod w { #[allow(unused_imports)] use self::super::super::root; @@ -78,6 +81,9 @@ pub mod root { pub struct D { pub m_c: root::C, } + impl Default for D { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } + } extern "C" { #[link_name = "_ZN1w3hehEv"] pub fn heh() -> root::w::whatever_int_t; diff --git a/tests/expectations/tests/nested.rs b/tests/expectations/tests/nested.rs index 4c119bc7fe..d50f8e1703 100644 --- a/tests/expectations/tests/nested.rs +++ b/tests/expectations/tests/nested.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Calc { pub w: ::std::os::raw::c_int, } @@ -25,18 +25,18 @@ impl Clone for Calc { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Test { pub _address: u8, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Test_Size { pub mWidth: Test_Size_Dimension, pub mHeight: Test_Size_Dimension, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Test_Size_Dimension { pub _base: Calc, } diff --git a/tests/expectations/tests/nested_vtable.rs b/tests/expectations/tests/nested_vtable.rs index 7cc3042341..e16a23d71d 100644 --- a/tests/expectations/tests/nested_vtable.rs +++ b/tests/expectations/tests/nested_vtable.rs @@ -5,6 +5,7 @@ #[repr(C)] +#[derive(Default)] pub struct nsISupports__bindgen_vtable { } #[repr(C)] @@ -22,6 +23,9 @@ fn bindgen_test_layout_nsISupports() { impl Clone for nsISupports { fn clone(&self) -> Self { *self } } +impl Default for nsISupports { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct nsIRunnable { @@ -37,6 +41,9 @@ fn bindgen_test_layout_nsIRunnable() { impl Clone for nsIRunnable { fn clone(&self) -> Self { *self } } +impl Default for nsIRunnable { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct Runnable { @@ -52,3 +59,6 @@ fn bindgen_test_layout_Runnable() { impl Clone for Runnable { fn clone(&self) -> Self { *self } } +impl Default for Runnable { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/nested_within_namespace.rs b/tests/expectations/tests/nested_within_namespace.rs index db4e049311..cb6eead35c 100644 --- a/tests/expectations/tests/nested_within_namespace.rs +++ b/tests/expectations/tests/nested_within_namespace.rs @@ -11,12 +11,12 @@ pub mod root { #[allow(unused_imports)] use self::super::super::root; #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Bar { pub foo: ::std::os::raw::c_int, } #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Bar_Baz { pub foo: ::std::os::raw::c_int, } @@ -51,7 +51,7 @@ pub mod root { fn clone(&self) -> Self { *self } } #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Baz { pub baz: ::std::os::raw::c_int, } diff --git a/tests/expectations/tests/no-comments.rs b/tests/expectations/tests/no-comments.rs index c3bb13c47b..058f2045dc 100644 --- a/tests/expectations/tests/no-comments.rs +++ b/tests/expectations/tests/no-comments.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Foo { pub s: ::std::os::raw::c_int, } diff --git a/tests/expectations/tests/no-derive-debug.rs b/tests/expectations/tests/no-derive-debug.rs index 4de7579776..07e6ae8228 100644 --- a/tests/expectations/tests/no-derive-debug.rs +++ b/tests/expectations/tests/no-derive-debug.rs @@ -3,7 +3,7 @@ #![allow(non_snake_case)] -#[repr(C)] #[derive(Copy, Clone)] pub struct foo { bar: ::std::os::raw::c_int, } +#[repr(C)] #[derive(Copy, Clone, Default)] pub struct foo { bar: ::std::os::raw::c_int, } /** * bar should compile. It will normally derive debug, but our blacklist of foo @@ -11,7 +11,7 @@ * from building if --no-derive-debug didn't work. */ #[repr(C)] -#[derive(Copy)] +#[derive(Default, Copy)] pub struct bar { pub foo: foo, pub baz: ::std::os::raw::c_int, diff --git a/tests/expectations/tests/no-derive-default.rs b/tests/expectations/tests/no-derive-default.rs new file mode 100644 index 0000000000..2cec9d19b5 --- /dev/null +++ b/tests/expectations/tests/no-derive-default.rs @@ -0,0 +1,38 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#[repr(C)] #[derive(Copy, Clone, Debug)] pub struct foo { bar: ::std::os::raw::c_int, } + +/** + * bar should compile. It will normally derive default, but our blacklist of foo + * and replacement for another type that doesn't implement it would prevent it + * from building if --no-derive-default didn't work. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct bar { + pub foo: foo, + pub baz: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_bar() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( bar ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( bar ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const bar ) ) . foo as * const _ as usize } , + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( bar ) , "::" , + stringify ! ( foo ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const bar ) ) . baz as * const _ as usize } , + 4usize , concat ! ( + "Alignment of field: " , stringify ! ( bar ) , "::" , + stringify ! ( baz ) )); +} +impl Clone for bar { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/no-recursive-whitelisting.rs b/tests/expectations/tests/no-recursive-whitelisting.rs index c8341990f2..7cc3d89e04 100644 --- a/tests/expectations/tests/no-recursive-whitelisting.rs +++ b/tests/expectations/tests/no-recursive-whitelisting.rs @@ -25,3 +25,6 @@ fn bindgen_test_layout_Foo() { impl Clone for Foo { fn clone(&self) -> Self { *self } } +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/no-std.rs b/tests/expectations/tests/no-std.rs index 21cfda00bd..998ac2a87c 100644 --- a/tests/expectations/tests/no-std.rs +++ b/tests/expectations/tests/no-std.rs @@ -38,3 +38,6 @@ fn bindgen_test_layout_foo() { impl Clone for foo { fn clone(&self) -> Self { *self } } +impl Default for foo { + fn default() -> Self { unsafe { ::core::mem::zeroed() } } +} diff --git a/tests/expectations/tests/no_copy.rs b/tests/expectations/tests/no_copy.rs index 53ab967700..3590241fce 100644 --- a/tests/expectations/tests/no_copy.rs +++ b/tests/expectations/tests/no_copy.rs @@ -11,3 +11,6 @@ pub struct CopiableButWait { pub whatever: ::std::os::raw::c_int, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for CopiableButWait { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/nsStyleAutoArray.rs b/tests/expectations/tests/nsStyleAutoArray.rs index c150ec4609..bc5f5184cb 100644 --- a/tests/expectations/tests/nsStyleAutoArray.rs +++ b/tests/expectations/tests/nsStyleAutoArray.rs @@ -9,6 +9,9 @@ pub struct nsTArray { pub mBuff: *mut T, } +impl Default for nsTArray { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct nsStyleAutoArray { @@ -20,3 +23,6 @@ pub struct nsStyleAutoArray { pub enum nsStyleAutoArray_WithSingleInitialElement { WITH_SINGLE_INITIAL_ELEMENT = 0, } +impl Default for nsStyleAutoArray { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/objc_interface_type.rs b/tests/expectations/tests/objc_interface_type.rs index 544ced074e..edf551d354 100644 --- a/tests/expectations/tests/objc_interface_type.rs +++ b/tests/expectations/tests/objc_interface_type.rs @@ -31,6 +31,9 @@ fn bindgen_test_layout_FooStruct() { impl Clone for FooStruct { fn clone(&self) -> Self { *self } } +impl Default for FooStruct { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} extern "C" { pub fn fooFunc(foo: id); } diff --git a/tests/expectations/tests/only_bitfields.rs b/tests/expectations/tests/only_bitfields.rs index 7811584bd4..9252097d66 100644 --- a/tests/expectations/tests/only_bitfields.rs +++ b/tests/expectations/tests/only_bitfields.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct C { pub _bitfield_1: u8, } diff --git a/tests/expectations/tests/opaque-tracing.rs b/tests/expectations/tests/opaque-tracing.rs index b19a1e6869..c7534d97ce 100644 --- a/tests/expectations/tests/opaque-tracing.rs +++ b/tests/expectations/tests/opaque-tracing.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Container { pub _bindgen_opaque_blob: [u32; 2usize], } diff --git a/tests/expectations/tests/opaque_in_struct.rs b/tests/expectations/tests/opaque_in_struct.rs index cba5952eb5..f689b02bc0 100644 --- a/tests/expectations/tests/opaque_in_struct.rs +++ b/tests/expectations/tests/opaque_in_struct.rs @@ -6,7 +6,7 @@ /**
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct opaque { pub _bindgen_opaque_blob: u32, } @@ -21,7 +21,7 @@ impl Clone for opaque { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct container { pub contained: opaque, } diff --git a/tests/expectations/tests/opaque_pointer.rs b/tests/expectations/tests/opaque_pointer.rs index 3cfa6d870b..15b01db448 100644 --- a/tests/expectations/tests/opaque_pointer.rs +++ b/tests/expectations/tests/opaque_pointer.rs @@ -8,7 +8,7 @@ *
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct OtherOpaque { pub _bindgen_opaque_blob: u32, } @@ -30,6 +30,9 @@ impl Clone for OtherOpaque { pub struct Opaque { pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Opaque { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct WithOpaquePtr { @@ -62,3 +65,6 @@ fn bindgen_test_layout_WithOpaquePtr() { impl Clone for WithOpaquePtr { fn clone(&self) -> Self { *self } } +impl Default for WithOpaquePtr { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/opaque_typedef.rs b/tests/expectations/tests/opaque_typedef.rs index c45cbc6f5e..d6d5ac5de6 100644 --- a/tests/expectations/tests/opaque_typedef.rs +++ b/tests/expectations/tests/opaque_typedef.rs @@ -10,6 +10,9 @@ pub struct RandomTemplate { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for RandomTemplate { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} /**
*/ pub type ShouldBeOpaque = [u8; 0usize]; pub type ShouldNotBeOpaque = RandomTemplate; diff --git a/tests/expectations/tests/private.rs b/tests/expectations/tests/private.rs index 809e224a7b..a9fbef9f50 100644 --- a/tests/expectations/tests/private.rs +++ b/tests/expectations/tests/private.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct HasPrivate { pub mNotPrivate: ::std::os::raw::c_int, /**
*/ @@ -33,7 +33,7 @@ impl Clone for HasPrivate { } /**
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct VeryPrivate { mIsPrivate: ::std::os::raw::c_int, mIsAlsoPrivate: ::std::os::raw::c_int, @@ -60,7 +60,7 @@ impl Clone for VeryPrivate { } /**
*/ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct ContradictPrivate { /**
*/ pub mNotPrivate: ::std::os::raw::c_int, diff --git a/tests/expectations/tests/public-dtor.rs b/tests/expectations/tests/public-dtor.rs index d4c18c6bd9..1accf49cb5 100644 --- a/tests/expectations/tests/public-dtor.rs +++ b/tests/expectations/tests/public-dtor.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug)] +#[derive(Debug, Default)] pub struct cv_String { pub _address: u8, } diff --git a/tests/expectations/tests/ref_argument_array.rs b/tests/expectations/tests/ref_argument_array.rs index 675bbbca6a..714467f6f3 100644 --- a/tests/expectations/tests/ref_argument_array.rs +++ b/tests/expectations/tests/ref_argument_array.rs @@ -6,6 +6,7 @@ pub const NSID_LENGTH: ::std::os::raw::c_uint = 10; #[repr(C)] +#[derive(Default)] pub struct nsID__bindgen_vtable { } #[repr(C)] @@ -23,3 +24,6 @@ fn bindgen_test_layout_nsID() { impl Clone for nsID { fn clone(&self) -> Self { *self } } +impl Default for nsID { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/reparented_replacement.rs b/tests/expectations/tests/reparented_replacement.rs index baeab03e83..6965f767d7 100644 --- a/tests/expectations/tests/reparented_replacement.rs +++ b/tests/expectations/tests/reparented_replacement.rs @@ -12,7 +12,7 @@ pub mod root { use self::super::super::root; ///
#[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Bar { pub bazz: ::std::os::raw::c_int, } diff --git a/tests/expectations/tests/replace_template_alias.rs b/tests/expectations/tests/replace_template_alias.rs index f922ac7750..dbd0d283de 100644 --- a/tests/expectations/tests/replace_template_alias.rs +++ b/tests/expectations/tests/replace_template_alias.rs @@ -13,3 +13,6 @@ pub type JS_detail_MaybeWrapped = T; pub struct JS_Rooted { pub ptr: JS_detail_MaybeWrapped, } +impl Default for JS_Rooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/replace_use.rs b/tests/expectations/tests/replace_use.rs index ed55080a0e..d93121d3dd 100644 --- a/tests/expectations/tests/replace_use.rs +++ b/tests/expectations/tests/replace_use.rs @@ -13,6 +13,9 @@ pub struct nsTArray { pub y: ::std::os::raw::c_uint, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for nsTArray { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct Test { @@ -33,3 +36,6 @@ fn bindgen_test_layout_Test() { impl Clone for Test { fn clone(&self) -> Self { *self } } +impl Default for Test { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/replaces_double.rs b/tests/expectations/tests/replaces_double.rs index 50dafd4249..99b812db39 100644 --- a/tests/expectations/tests/replaces_double.rs +++ b/tests/expectations/tests/replaces_double.rs @@ -13,3 +13,6 @@ pub struct Rooted { *
*/ pub type Rooted_MaybeWrapped = T; +impl Default for Rooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/same_struct_name_in_different_namespaces.rs b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs index 4dde8266d8..820b5e71e0 100644 --- a/tests/expectations/tests/same_struct_name_in_different_namespaces.rs +++ b/tests/expectations/tests/same_struct_name_in_different_namespaces.rs @@ -8,7 +8,7 @@ #[derive(Debug, Copy, Clone)] pub struct JS_Zone([u8; 0]); #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct JS_shadow_Zone { pub x: ::std::os::raw::c_int, pub y: ::std::os::raw::c_int, diff --git a/tests/expectations/tests/size_t_template.rs b/tests/expectations/tests/size_t_template.rs index 87df768d62..4d81651e9d 100644 --- a/tests/expectations/tests/size_t_template.rs +++ b/tests/expectations/tests/size_t_template.rs @@ -24,3 +24,6 @@ fn bindgen_test_layout_C() { impl Clone for C { fn clone(&self) -> Self { *self } } +impl Default for C { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/struct_containing_forward_declared_struct.rs b/tests/expectations/tests/struct_containing_forward_declared_struct.rs index 60f1226272..ff16490a3a 100644 --- a/tests/expectations/tests/struct_containing_forward_declared_struct.rs +++ b/tests/expectations/tests/struct_containing_forward_declared_struct.rs @@ -10,7 +10,7 @@ pub struct a { pub val_a: *mut a_b, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct a_b { pub val_b: ::std::os::raw::c_int, } @@ -44,3 +44,6 @@ fn bindgen_test_layout_a() { impl Clone for a { fn clone(&self) -> Self { *self } } +impl Default for a { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/struct_with_anon_struct.rs b/tests/expectations/tests/struct_with_anon_struct.rs index 75baf354da..b02fdd0ed7 100644 --- a/tests/expectations/tests/struct_with_anon_struct.rs +++ b/tests/expectations/tests/struct_with_anon_struct.rs @@ -5,12 +5,12 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub bar: foo__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub a: ::std::os::raw::c_int, pub b: ::std::os::raw::c_int, diff --git a/tests/expectations/tests/struct_with_anon_struct_array.rs b/tests/expectations/tests/struct_with_anon_struct_array.rs index f20f03d851..a19c957b35 100644 --- a/tests/expectations/tests/struct_with_anon_struct_array.rs +++ b/tests/expectations/tests/struct_with_anon_struct_array.rs @@ -5,13 +5,13 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub bar: [foo__bindgen_ty_1; 2usize], pub baz: [[[foo__bindgen_ty_2; 4usize]; 3usize]; 2usize], } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub a: ::std::os::raw::c_int, pub b: ::std::os::raw::c_int, @@ -37,7 +37,7 @@ impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_2 { pub a: ::std::os::raw::c_int, pub b: ::std::os::raw::c_int, diff --git a/tests/expectations/tests/struct_with_anon_struct_pointer.rs b/tests/expectations/tests/struct_with_anon_struct_pointer.rs index 087ff3d8d2..e0b06f7682 100644 --- a/tests/expectations/tests/struct_with_anon_struct_pointer.rs +++ b/tests/expectations/tests/struct_with_anon_struct_pointer.rs @@ -10,7 +10,7 @@ pub struct foo { pub bar: *mut foo__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub a: ::std::os::raw::c_int, pub b: ::std::os::raw::c_int, @@ -50,3 +50,6 @@ fn bindgen_test_layout_foo() { impl Clone for foo { fn clone(&self) -> Self { *self } } +impl Default for foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/struct_with_anon_union.rs b/tests/expectations/tests/struct_with_anon_union.rs index ac4b6f7591..aff61c4542 100644 --- a/tests/expectations/tests/struct_with_anon_union.rs +++ b/tests/expectations/tests/struct_with_anon_union.rs @@ -29,12 +29,12 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub bar: foo__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub a: __BindgenUnionField<::std::os::raw::c_uint>, pub b: __BindgenUnionField<::std::os::raw::c_ushort>, diff --git a/tests/expectations/tests/struct_with_anon_unnamed_struct.rs b/tests/expectations/tests/struct_with_anon_unnamed_struct.rs index 982b3bdcca..80039415bb 100644 --- a/tests/expectations/tests/struct_with_anon_unnamed_struct.rs +++ b/tests/expectations/tests/struct_with_anon_unnamed_struct.rs @@ -5,12 +5,12 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub __bindgen_anon_1: foo__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub a: ::std::os::raw::c_uint, pub b: ::std::os::raw::c_uint, diff --git a/tests/expectations/tests/struct_with_anon_unnamed_union.rs b/tests/expectations/tests/struct_with_anon_unnamed_union.rs index 26edbceb87..f55d8e3867 100644 --- a/tests/expectations/tests/struct_with_anon_unnamed_union.rs +++ b/tests/expectations/tests/struct_with_anon_unnamed_union.rs @@ -29,12 +29,12 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub __bindgen_anon_1: foo__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub a: __BindgenUnionField<::std::os::raw::c_uint>, pub b: __BindgenUnionField<::std::os::raw::c_ushort>, diff --git a/tests/expectations/tests/struct_with_bitfields.rs b/tests/expectations/tests/struct_with_bitfields.rs index 90f2fba288..861ad66277 100644 --- a/tests/expectations/tests/struct_with_bitfields.rs +++ b/tests/expectations/tests/struct_with_bitfields.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct bitfield { pub _bitfield_1: u8, pub e: ::std::os::raw::c_int, diff --git a/tests/expectations/tests/struct_with_derive_debug.rs b/tests/expectations/tests/struct_with_derive_debug.rs index b81baa002e..58a94853be 100644 --- a/tests/expectations/tests/struct_with_derive_debug.rs +++ b/tests/expectations/tests/struct_with_derive_debug.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct LittleArray { pub a: [::std::os::raw::c_int; 32usize], } @@ -40,8 +40,11 @@ fn bindgen_test_layout_BigArray() { "Alignment of field: " , stringify ! ( BigArray ) , "::" , stringify ! ( a ) )); } +impl Default for BigArray { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct WithLittleArray { pub a: LittleArray, } @@ -76,3 +79,6 @@ fn bindgen_test_layout_WithBigArray() { "Alignment of field: " , stringify ! ( WithBigArray ) , "::" , stringify ! ( a ) )); } +impl Default for WithBigArray { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/struct_with_nesting.rs b/tests/expectations/tests/struct_with_nesting.rs index 4bd5586bb6..30ba124b94 100644 --- a/tests/expectations/tests/struct_with_nesting.rs +++ b/tests/expectations/tests/struct_with_nesting.rs @@ -29,13 +29,13 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub a: ::std::os::raw::c_uint, pub __bindgen_anon_1: foo__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub b: __BindgenUnionField<::std::os::raw::c_uint>, pub __bindgen_anon_1: __BindgenUnionField, @@ -43,7 +43,7 @@ pub struct foo__bindgen_ty_1 { pub bindgen_union_field: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1__bindgen_ty_1 { pub c1: ::std::os::raw::c_ushort, pub c2: ::std::os::raw::c_ushort, @@ -75,7 +75,7 @@ impl Clone for foo__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1__bindgen_ty_2 { pub d1: ::std::os::raw::c_uchar, pub d2: ::std::os::raw::c_uchar, diff --git a/tests/expectations/tests/struct_with_packing.rs b/tests/expectations/tests/struct_with_packing.rs index b7afdafefd..cba3d4759e 100644 --- a/tests/expectations/tests/struct_with_packing.rs +++ b/tests/expectations/tests/struct_with_packing.rs @@ -5,7 +5,7 @@ #[repr(C, packed)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct a { pub b: ::std::os::raw::c_char, pub c: ::std::os::raw::c_short, diff --git a/tests/expectations/tests/struct_with_struct.rs b/tests/expectations/tests/struct_with_struct.rs index d28806c44b..bcdaada225 100644 --- a/tests/expectations/tests/struct_with_struct.rs +++ b/tests/expectations/tests/struct_with_struct.rs @@ -5,12 +5,12 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub bar: foo__bindgen_ty_1, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub x: ::std::os::raw::c_uint, pub y: ::std::os::raw::c_uint, diff --git a/tests/expectations/tests/struct_with_typedef_template_arg.rs b/tests/expectations/tests/struct_with_typedef_template_arg.rs index 6f8d71f183..f882c65d54 100644 --- a/tests/expectations/tests/struct_with_typedef_template_arg.rs +++ b/tests/expectations/tests/struct_with_typedef_template_arg.rs @@ -13,3 +13,6 @@ pub struct Proxy { } pub type Proxy_foo = ::std::option::Option; +impl Default for Proxy { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-fun-ty.rs b/tests/expectations/tests/template-fun-ty.rs index c2a8a028da..b894920ff0 100644 --- a/tests/expectations/tests/template-fun-ty.rs +++ b/tests/expectations/tests/template-fun-ty.rs @@ -12,6 +12,9 @@ pub struct Foo { } pub type Foo_FunctionPtr = ::std::option::Option T>; +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct RefPtr { @@ -28,4 +31,10 @@ pub struct RefPtr_Proxy { } pub type RefPtr_Proxy_member_function = ::std::option::Option R>; +impl Default for RefPtr_Proxy { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl Default for RefPtr { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} pub type Returner = ::std::option::Option T>; diff --git a/tests/expectations/tests/template.rs b/tests/expectations/tests/template.rs index 844dc6c2a9..131a54fdae 100644 --- a/tests/expectations/tests/template.rs +++ b/tests/expectations/tests/template.rs @@ -12,6 +12,9 @@ pub struct Foo { pub m_member_arr: [T; 1usize], pub _phantom_1: ::std::marker::PhantomData, } +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} extern "C" { #[link_name = "_Z3bar3FooIiiE"] pub fn bar(foo: Foo<::std::os::raw::c_int, ::std::os::raw::c_int>); @@ -30,6 +33,12 @@ pub struct D_U { pub m_baz: Z, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for D_U { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl Default for D { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Rooted { @@ -37,6 +46,9 @@ pub struct Rooted { pub next: *mut Rooted<*mut ::std::os::raw::c_void>, pub ptr: T, } +impl Default for Rooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct RootedContainer { @@ -57,11 +69,17 @@ fn bindgen_test_layout_RootedContainer() { impl Clone for RootedContainer { fn clone(&self) -> Self { *self } } +impl Default for RootedContainer { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug)] pub struct WithDtor { pub member: T, } +impl Default for WithDtor { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} pub type WithDtorIntFwd = WithDtor<::std::os::raw::c_int>; #[repr(C)] #[derive(Debug)] @@ -80,14 +98,20 @@ fn bindgen_test_layout_PODButContainsDtor() { "Alignment of field: " , stringify ! ( PODButContainsDtor ) , "::" , stringify ! ( member ) )); } +impl Default for PODButContainsDtor { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} /**
*/ #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Opaque { pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Opaque { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct POD { pub opaque_member: u32, } @@ -114,17 +138,26 @@ impl Clone for POD { pub struct NestedReplaced { pub buff: *mut T, } +impl Default for NestedReplaced { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct NestedBase { pub buff: *mut T, pub _phantom_1: ::std::marker::PhantomData, } +impl Default for NestedBase { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct Incomplete { pub d: T, } +impl Default for Incomplete { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct NestedContainer { @@ -132,8 +165,11 @@ pub struct NestedContainer { pub nested: NestedReplaced, pub inc: Incomplete, } +impl Default for NestedContainer { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Untemplated { pub _address: u8, } @@ -153,6 +189,9 @@ pub struct Templated { pub m_untemplated: Untemplated, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for Templated { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} /** * If the replacement doesn't happen at the parse level the container would be * copy and the replacement wouldn't, so this wouldn't compile. @@ -164,16 +203,25 @@ pub struct Templated { pub struct ReplacedWithoutDestructor { pub buff: *mut T, } +impl Default for ReplacedWithoutDestructor { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug)] pub struct ShouldNotBeCopiable { pub m_member: ReplacedWithoutDestructor, } +impl Default for ShouldNotBeCopiable { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug)] pub struct ShouldNotBeCopiableAsWell { pub m_member: ReplacedWithoutDestructorFwd, } +impl Default for ShouldNotBeCopiableAsWell { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} /** * If the replacement doesn't happen at the parse level the container would be * copy and the replacement wouldn't, so this wouldn't compile. @@ -185,12 +233,18 @@ pub struct ShouldNotBeCopiableAsWell { pub struct ReplacedWithoutDestructorFwd { pub buff: *mut T, } +impl Default for ReplacedWithoutDestructorFwd { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct TemplateWithVar { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for TemplateWithVar { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[test] fn __bindgen_test_layout_template_1() { assert_eq!(::std::mem::size_of::>() diff --git a/tests/expectations/tests/template_alias.rs b/tests/expectations/tests/template_alias.rs index d301a11c42..44f7830f66 100644 --- a/tests/expectations/tests/template_alias.rs +++ b/tests/expectations/tests/template_alias.rs @@ -10,3 +10,6 @@ pub type JS_detail_Wrapped = T; pub struct JS_Rooted { pub ptr: JS_detail_Wrapped, } +impl Default for JS_Rooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template_alias_namespace.rs b/tests/expectations/tests/template_alias_namespace.rs index cf4a079c7e..dd4add4083 100644 --- a/tests/expectations/tests/template_alias_namespace.rs +++ b/tests/expectations/tests/template_alias_namespace.rs @@ -20,5 +20,8 @@ pub mod root { pub struct Rooted { pub ptr: root::JS::detail::Wrapped, } + impl Default for Rooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } + } } } diff --git a/tests/expectations/tests/template_typedef_transitive_param.rs b/tests/expectations/tests/template_typedef_transitive_param.rs index 166ddc3c4c..cc801f3574 100644 --- a/tests/expectations/tests/template_typedef_transitive_param.rs +++ b/tests/expectations/tests/template_typedef_transitive_param.rs @@ -15,4 +15,10 @@ pub struct Wrapper { pub struct Wrapper_Wrapped { pub t: T, } +impl Default for Wrapper_Wrapped { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} pub type Wrapper_Type = Wrapper_Wrapped; +impl Default for Wrapper { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template_typedefs.rs b/tests/expectations/tests/template_typedefs.rs index 5f0d80b901..9213c0d234 100644 --- a/tests/expectations/tests/template_typedefs.rs +++ b/tests/expectations/tests/template_typedefs.rs @@ -20,3 +20,6 @@ pub type Foo_nsCOMArrayEnumFunc = aData: *mut ::std::os::raw::c_void) -> bool>; +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/templateref_opaque.rs b/tests/expectations/tests/templateref_opaque.rs index d69254c814..dfe941af83 100644 --- a/tests/expectations/tests/templateref_opaque.rs +++ b/tests/expectations/tests/templateref_opaque.rs @@ -11,6 +11,9 @@ pub struct detail_PointerType { pub _phantom_0: ::std::marker::PhantomData, } pub type detail_PointerType_Type = *mut T; +impl Default for detail_PointerType { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct UniquePtr { @@ -18,3 +21,6 @@ pub struct UniquePtr { pub _phantom_0: ::std::marker::PhantomData, } pub type UniquePtr_Pointer = detail_PointerType; +impl Default for UniquePtr { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/type-referenced-by-whitelisted-function.rs b/tests/expectations/tests/type-referenced-by-whitelisted-function.rs index f4201a5610..67381d41eb 100644 --- a/tests/expectations/tests/type-referenced-by-whitelisted-function.rs +++ b/tests/expectations/tests/type-referenced-by-whitelisted-function.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct dl_phdr_info { pub x: ::std::os::raw::c_int, } diff --git a/tests/expectations/tests/type_alias_partial_template_especialization.rs b/tests/expectations/tests/type_alias_partial_template_especialization.rs index 70b5f66c50..2e0f2f4d6c 100644 --- a/tests/expectations/tests/type_alias_partial_template_especialization.rs +++ b/tests/expectations/tests/type_alias_partial_template_especialization.rs @@ -10,3 +10,6 @@ pub type MaybeWrapped = A; pub struct Rooted { pub ptr: MaybeWrapped, } +impl Default for Rooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/type_alias_template_specialized.rs b/tests/expectations/tests/type_alias_template_specialized.rs index 5dd2038fe6..20665af67d 100644 --- a/tests/expectations/tests/type_alias_template_specialized.rs +++ b/tests/expectations/tests/type_alias_template_specialized.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Rooted { pub ptr: ::std::os::raw::c_int, } diff --git a/tests/expectations/tests/typeref.rs b/tests/expectations/tests/typeref.rs index c199b7abc9..47b7a66a55 100644 --- a/tests/expectations/tests/typeref.rs +++ b/tests/expectations/tests/typeref.rs @@ -48,8 +48,11 @@ fn bindgen_test_layout_nsFoo() { impl Clone for nsFoo { fn clone(&self) -> Self { *self } } +impl Default for nsFoo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct mozilla_FragmentOrURL { pub mIsLocalRef: bool, } @@ -71,7 +74,7 @@ impl Clone for mozilla_FragmentOrURL { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct mozilla_Position { pub _address: u8, } @@ -92,13 +95,16 @@ pub struct mozilla_StyleShapeSource { pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] pub struct mozilla_StyleShapeSource__bindgen_ty_1 { pub mPosition: __BindgenUnionField<*mut mozilla_Position>, pub mFragmentOrURL: __BindgenUnionField<*mut mozilla_FragmentOrURL>, pub bindgen_union_field: u64, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for mozilla_StyleShapeSource { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct Bar { @@ -119,3 +125,6 @@ fn bindgen_test_layout_Bar() { impl Clone for Bar { fn clone(&self) -> Self { *self } } +impl Default for Bar { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/union-in-ns.rs b/tests/expectations/tests/union-in-ns.rs index cb69d60347..208b62832a 100644 --- a/tests/expectations/tests/union-in-ns.rs +++ b/tests/expectations/tests/union-in-ns.rs @@ -36,7 +36,7 @@ pub mod root { #[allow(unused_imports)] use self::super::root; #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct bar { pub baz: root::__BindgenUnionField<::std::os::raw::c_int>, pub bindgen_union_field: u32, diff --git a/tests/expectations/tests/union_dtor.rs b/tests/expectations/tests/union_dtor.rs index ad707b63a7..bfd573e021 100644 --- a/tests/expectations/tests/union_dtor.rs +++ b/tests/expectations/tests/union_dtor.rs @@ -29,7 +29,7 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug)] +#[derive(Debug, Default)] pub struct UnionWithDtor { pub mFoo: __BindgenUnionField<::std::os::raw::c_int>, pub mBar: __BindgenUnionField<*mut ::std::os::raw::c_void>, diff --git a/tests/expectations/tests/union_fields.rs b/tests/expectations/tests/union_fields.rs index 64eb3fe43f..823a0b8b36 100644 --- a/tests/expectations/tests/union_fields.rs +++ b/tests/expectations/tests/union_fields.rs @@ -29,7 +29,7 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct _bindgen_ty_1 { pub mInt: __BindgenUnionField<::std::os::raw::c_int>, pub mFloat: __BindgenUnionField, diff --git a/tests/expectations/tests/union_template.rs b/tests/expectations/tests/union_template.rs index fc92afb83e..2eba0f0a4f 100644 --- a/tests/expectations/tests/union_template.rs +++ b/tests/expectations/tests/union_template.rs @@ -37,7 +37,7 @@ pub struct NastyStruct { pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] pub struct NastyStruct__bindgen_ty_1 { pub mFoo: __BindgenUnionField<*mut ::std::os::raw::c_void>, pub mDummy: __BindgenUnionField<::std::os::raw::c_ulong>, @@ -45,15 +45,18 @@ pub struct NastyStruct__bindgen_ty_1 { pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] pub struct NastyStruct__bindgen_ty_2 { pub wat: __BindgenUnionField<::std::os::raw::c_short>, pub wut: __BindgenUnionField<*mut ::std::os::raw::c_int>, pub bindgen_union_field: u64, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for NastyStruct { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Default, Copy, Clone)] pub struct Whatever { pub mTPtr: __BindgenUnionField<*mut ::std::os::raw::c_void>, pub mInt: __BindgenUnionField<::std::os::raw::c_int>, diff --git a/tests/expectations/tests/union_with_anon_struct.rs b/tests/expectations/tests/union_with_anon_struct.rs index 4b9c635f04..59f8fcab79 100644 --- a/tests/expectations/tests/union_with_anon_struct.rs +++ b/tests/expectations/tests/union_with_anon_struct.rs @@ -29,13 +29,13 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub bar: __BindgenUnionField, pub bindgen_union_field: [u32; 2usize], } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub a: ::std::os::raw::c_uint, pub b: ::std::os::raw::c_uint, diff --git a/tests/expectations/tests/union_with_anon_struct_bitfield.rs b/tests/expectations/tests/union_with_anon_struct_bitfield.rs index 449fd44004..d14a38bb3f 100644 --- a/tests/expectations/tests/union_with_anon_struct_bitfield.rs +++ b/tests/expectations/tests/union_with_anon_struct_bitfield.rs @@ -29,14 +29,14 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub a: __BindgenUnionField<::std::os::raw::c_int>, pub __bindgen_anon_1: __BindgenUnionField, pub bindgen_union_field: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub _bitfield_1: u32, } diff --git a/tests/expectations/tests/union_with_anon_union.rs b/tests/expectations/tests/union_with_anon_union.rs index 16b33551bc..9e182d218d 100644 --- a/tests/expectations/tests/union_with_anon_union.rs +++ b/tests/expectations/tests/union_with_anon_union.rs @@ -29,13 +29,13 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub bar: __BindgenUnionField, pub bindgen_union_field: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub a: __BindgenUnionField<::std::os::raw::c_uint>, pub b: __BindgenUnionField<::std::os::raw::c_ushort>, diff --git a/tests/expectations/tests/union_with_anon_unnamed_struct.rs b/tests/expectations/tests/union_with_anon_unnamed_struct.rs index 7982728a51..4d0b639f2d 100644 --- a/tests/expectations/tests/union_with_anon_unnamed_struct.rs +++ b/tests/expectations/tests/union_with_anon_unnamed_struct.rs @@ -29,14 +29,14 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct pixel { pub rgba: __BindgenUnionField<::std::os::raw::c_uint>, pub __bindgen_anon_1: __BindgenUnionField, pub bindgen_union_field: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct pixel__bindgen_ty_1 { pub r: ::std::os::raw::c_uchar, pub g: ::std::os::raw::c_uchar, diff --git a/tests/expectations/tests/union_with_anon_unnamed_union.rs b/tests/expectations/tests/union_with_anon_unnamed_union.rs index 1e7f918c41..fd6f82fc5a 100644 --- a/tests/expectations/tests/union_with_anon_unnamed_union.rs +++ b/tests/expectations/tests/union_with_anon_unnamed_union.rs @@ -29,14 +29,14 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub a: __BindgenUnionField<::std::os::raw::c_uint>, pub __bindgen_anon_1: __BindgenUnionField, pub bindgen_union_field: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub b: __BindgenUnionField<::std::os::raw::c_ushort>, pub c: __BindgenUnionField<::std::os::raw::c_uchar>, diff --git a/tests/expectations/tests/union_with_big_member.rs b/tests/expectations/tests/union_with_big_member.rs index 58407cdb10..2b7a8eefd3 100644 --- a/tests/expectations/tests/union_with_big_member.rs +++ b/tests/expectations/tests/union_with_big_member.rs @@ -55,8 +55,11 @@ fn bindgen_test_layout_WithBigArray() { impl Clone for WithBigArray { fn clone(&self) -> Self { *self } } +impl Default for WithBigArray { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct WithBigArray2 { pub a: __BindgenUnionField<::std::os::raw::c_int>, pub b: __BindgenUnionField<[::std::os::raw::c_char; 33usize]>, @@ -109,3 +112,6 @@ fn bindgen_test_layout_WithBigMember() { impl Clone for WithBigMember { fn clone(&self) -> Self { *self } } +impl Default for WithBigMember { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/union_with_nesting.rs b/tests/expectations/tests/union_with_nesting.rs index 17c3c8f07b..d92e8efae2 100644 --- a/tests/expectations/tests/union_with_nesting.rs +++ b/tests/expectations/tests/union_with_nesting.rs @@ -29,20 +29,20 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub a: __BindgenUnionField<::std::os::raw::c_uint>, pub __bindgen_anon_1: __BindgenUnionField, pub bindgen_union_field: u32, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub __bindgen_anon_1: foo__bindgen_ty_1__bindgen_ty_1, pub __bindgen_anon_2: foo__bindgen_ty_1__bindgen_ty_2, } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1__bindgen_ty_1 { pub b1: __BindgenUnionField<::std::os::raw::c_ushort>, pub b2: __BindgenUnionField<::std::os::raw::c_ushort>, @@ -75,7 +75,7 @@ impl Clone for foo__bindgen_ty_1__bindgen_ty_1 { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1__bindgen_ty_2 { pub c1: __BindgenUnionField<::std::os::raw::c_ushort>, pub c2: __BindgenUnionField<::std::os::raw::c_ushort>, diff --git a/tests/expectations/tests/unknown_attr.rs b/tests/expectations/tests/unknown_attr.rs index 12a35760dd..efb8610229 100644 --- a/tests/expectations/tests/unknown_attr.rs +++ b/tests/expectations/tests/unknown_attr.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct _bindgen_ty_1 { pub __clang_max_align_nonce1: ::std::os::raw::c_longlong, pub __bindgen_padding_0: u64, diff --git a/tests/expectations/tests/use-core.rs b/tests/expectations/tests/use-core.rs index f09d151994..dd13156f68 100644 --- a/tests/expectations/tests/use-core.rs +++ b/tests/expectations/tests/use-core.rs @@ -37,5 +37,8 @@ fn bindgen_test_layout_foo() { impl Clone for foo { fn clone(&self) -> Self { *self } } +impl Default for foo { + fn default() -> Self { unsafe { ::core::mem::zeroed() } } +} pub type fooFunction = ::core::option::Option; diff --git a/tests/expectations/tests/using.rs b/tests/expectations/tests/using.rs index dbb6c84f23..1638287ab6 100644 --- a/tests/expectations/tests/using.rs +++ b/tests/expectations/tests/using.rs @@ -10,5 +10,8 @@ pub struct Point { pub x: T, pub y: T, } +impl Default for Point { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} pub type IntPoint2D = Point<::std::os::raw::c_int>; pub type IntVec2D = Point<::std::os::raw::c_int>; diff --git a/tests/expectations/tests/var-tracing.rs b/tests/expectations/tests/var-tracing.rs index 7a09bcb60d..ba10cf2285 100644 --- a/tests/expectations/tests/var-tracing.rs +++ b/tests/expectations/tests/var-tracing.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Bar { pub m_baz: ::std::os::raw::c_int, } @@ -37,7 +37,7 @@ impl Bar { } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Baz { pub _address: u8, } diff --git a/tests/expectations/tests/variadic-method.rs b/tests/expectations/tests/variadic-method.rs index 4515512829..542e1e75b4 100644 --- a/tests/expectations/tests/variadic-method.rs +++ b/tests/expectations/tests/variadic-method.rs @@ -9,7 +9,7 @@ extern "C" { pub fn foo(fmt: *const ::std::os::raw::c_char, ...); } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct Bar { pub _address: u8, } diff --git a/tests/expectations/tests/variadic_template_function.rs b/tests/expectations/tests/variadic_template_function.rs index cd99df960d..32be9f682b 100644 --- a/tests/expectations/tests/variadic_template_function.rs +++ b/tests/expectations/tests/variadic_template_function.rs @@ -10,3 +10,6 @@ pub struct VariadicFunctionObject { pub _address: u8, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for VariadicFunctionObject { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/vector.rs b/tests/expectations/tests/vector.rs index 4b68974465..31bc8fd7a0 100644 --- a/tests/expectations/tests/vector.rs +++ b/tests/expectations/tests/vector.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct foo { pub mMember: [::std::os::raw::c_longlong; 1usize], } diff --git a/tests/expectations/tests/virtual_dtor.rs b/tests/expectations/tests/virtual_dtor.rs index de5e01afd9..0c4109776d 100644 --- a/tests/expectations/tests/virtual_dtor.rs +++ b/tests/expectations/tests/virtual_dtor.rs @@ -5,6 +5,7 @@ #[repr(C)] +#[derive(Default)] pub struct nsSlots__bindgen_vtable { } #[repr(C)] @@ -19,3 +20,6 @@ fn bindgen_test_layout_nsSlots() { assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( "Alignment of " , stringify ! ( nsSlots ) )); } +impl Default for nsSlots { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/virtual_inheritance.rs b/tests/expectations/tests/virtual_inheritance.rs index e051073078..6896eb31c9 100644 --- a/tests/expectations/tests/virtual_inheritance.rs +++ b/tests/expectations/tests/virtual_inheritance.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct A { pub foo: ::std::os::raw::c_int, } @@ -25,6 +25,7 @@ impl Clone for A { fn clone(&self) -> Self { *self } } #[repr(C)] +#[derive(Default)] pub struct B__bindgen_vtable { } #[repr(C)] @@ -48,7 +49,11 @@ fn bindgen_test_layout_B() { impl Clone for B { fn clone(&self) -> Self { *self } } +impl Default for B { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] +#[derive(Default)] pub struct C__bindgen_vtable { } #[repr(C)] @@ -72,6 +77,9 @@ fn bindgen_test_layout_C() { impl Clone for C { fn clone(&self) -> Self { *self } } +impl Default for C { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] #[derive(Debug, Copy)] pub struct D { @@ -89,3 +97,6 @@ fn bindgen_test_layout_D() { impl Clone for D { fn clone(&self) -> Self { *self } } +impl Default for D { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/virtual_overloaded.rs b/tests/expectations/tests/virtual_overloaded.rs index 9937cf5db6..e7ae9f4a73 100644 --- a/tests/expectations/tests/virtual_overloaded.rs +++ b/tests/expectations/tests/virtual_overloaded.rs @@ -5,6 +5,7 @@ #[repr(C)] +#[derive(Default)] pub struct C__bindgen_vtable { } #[repr(C)] @@ -22,3 +23,6 @@ fn bindgen_test_layout_C() { impl Clone for C { fn clone(&self) -> Self { *self } } +impl Default for C { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/vtable_recursive_sig.rs b/tests/expectations/tests/vtable_recursive_sig.rs index 6cf3135f5b..716ce39f5c 100644 --- a/tests/expectations/tests/vtable_recursive_sig.rs +++ b/tests/expectations/tests/vtable_recursive_sig.rs @@ -19,7 +19,11 @@ fn bindgen_test_layout_Derived() { impl Clone for Derived { fn clone(&self) -> Self { *self } } +impl Default for Derived { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] +#[derive(Default)] pub struct Base__bindgen_vtable { } #[repr(C)] @@ -37,3 +41,6 @@ fn bindgen_test_layout_Base() { impl Clone for Base { fn clone(&self) -> Self { *self } } +impl Default for Base { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/weird_bitfields.rs b/tests/expectations/tests/weird_bitfields.rs index 98765b092d..a2841e341f 100644 --- a/tests/expectations/tests/weird_bitfields.rs +++ b/tests/expectations/tests/weird_bitfields.rs @@ -99,6 +99,9 @@ fn bindgen_test_layout_Weird() { impl Clone for Weird { fn clone(&self) -> Self { *self } } +impl Default for Weird { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} impl Weird { #[inline] pub fn bitTest(&self) -> ::std::os::raw::c_uint { diff --git a/tests/expectations/tests/what_is_going_on.rs b/tests/expectations/tests/what_is_going_on.rs index d0265c4ea4..46af013991 100644 --- a/tests/expectations/tests/what_is_going_on.rs +++ b/tests/expectations/tests/what_is_going_on.rs @@ -5,7 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Default, Copy)] pub struct UnknownUnits { pub _address: u8, } @@ -27,4 +27,7 @@ pub struct PointTyped { pub y: F, pub _phantom_0: ::std::marker::PhantomData, } +impl Default for PointTyped { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} pub type IntPoint = PointTyped; diff --git a/tests/expectations/tests/whitelist-namespaces-basic.rs b/tests/expectations/tests/whitelist-namespaces-basic.rs index 06f24ff01d..ba96895b62 100644 --- a/tests/expectations/tests/whitelist-namespaces-basic.rs +++ b/tests/expectations/tests/whitelist-namespaces-basic.rs @@ -14,7 +14,7 @@ pub mod root { #[allow(unused_imports)] use self::super::super::super::root; #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Helper { pub _address: u8, } diff --git a/tests/expectations/tests/whitelist-namespaces.rs b/tests/expectations/tests/whitelist-namespaces.rs index d3707800b6..5e47c9d6bb 100644 --- a/tests/expectations/tests/whitelist-namespaces.rs +++ b/tests/expectations/tests/whitelist-namespaces.rs @@ -14,7 +14,7 @@ pub mod root { #[allow(unused_imports)] use self::super::super::super::root; #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Helper { pub _address: u8, } @@ -30,7 +30,7 @@ pub mod root { } } #[repr(C)] - #[derive(Debug, Copy)] + #[derive(Debug, Default, Copy)] pub struct Test { pub helper: root::outer::inner::Helper, } diff --git a/tests/expectations/tests/whitelist_basic.rs b/tests/expectations/tests/whitelist_basic.rs index 0104f04959..d67fb7a36a 100644 --- a/tests/expectations/tests/whitelist_basic.rs +++ b/tests/expectations/tests/whitelist_basic.rs @@ -16,3 +16,9 @@ pub struct WhitelistMe { pub struct WhitelistMe_Inner { pub bar: T, } +impl Default for WhitelistMe_Inner { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl Default for WhitelistMe { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/headers/no-derive-debug.h b/tests/headers/no-derive-debug.h index 4a49e40422..c780d2d8f8 100644 --- a/tests/headers/no-derive-debug.h +++ b/tests/headers/no-derive-debug.h @@ -1,4 +1,4 @@ -// bindgen-flags: --no-derive-debug --blacklist-type foo --raw-line "#[repr(C)] #[derive(Copy, Clone)] pub struct foo { bar: ::std::os::raw::c_int, }" +// bindgen-flags: --no-derive-debug --blacklist-type foo --raw-line "#[repr(C)] #[derive(Copy, Clone, Default)] pub struct foo { bar: ::std::os::raw::c_int, }" struct foo { int bar; diff --git a/tests/headers/no-derive-default.h b/tests/headers/no-derive-default.h new file mode 100644 index 0000000000..207b93b62f --- /dev/null +++ b/tests/headers/no-derive-default.h @@ -0,0 +1,15 @@ +// bindgen-flags: --no-derive-default --blacklist-type foo --raw-line "#[repr(C)] #[derive(Copy, Clone, Debug)] pub struct foo { bar: ::std::os::raw::c_int, }" + +struct foo { + int bar; +}; + +/** + * bar should compile. It will normally derive default, but our blacklist of foo + * and replacement for another type that doesn't implement it would prevent it + * from building if --no-derive-default didn't work. + */ +struct bar { + struct foo foo; + int baz; +}; diff --git a/tests/tests.rs b/tests/tests.rs index 5b0ccd1112..ef5b2c2489 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -104,6 +104,7 @@ fn create_bindgen_builder(header: &PathBuf) -> Result, Error> { .ok_or(Error::new(ErrorKind::Other, "Invalid header file name"))); let prepend = ["bindgen", + "--with-derive-default", header_str, "--raw-line", "", From df2ff4f9fe9156989ced59ffd4bcce68764b6ca4 Mon Sep 17 00:00:00 2001 From: Flier Lu Date: Wed, 8 Feb 2017 19:45:56 +0800 Subject: [PATCH 0308/2291] check empty layout --- src/codegen/struct_layout.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs index 3006a31ab3..9864057026 100644 --- a/src/codegen/struct_layout.rs +++ b/src/codegen/struct_layout.rs @@ -163,7 +163,11 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { } fn padding_bytes(&self, layout: Layout) -> usize { - if self.latest_offset % layout.align == 0 { + if layout.align == 0 { + warn!("try to padding bytes without layout"); + + 0 + } else if self.latest_offset % layout.align == 0 { 0 } else { layout.align - (self.latest_offset % layout.align) From 60361505fbce24fb564edc56e1b9bb7299932457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 7 Feb 2017 20:22:08 +0100 Subject: [PATCH 0309/2291] codegen: Fix remaining cases of missing core prefix. --- src/codegen/helpers.rs | 4 +- src/codegen/mod.rs | 9 +++-- tests/expectations/tests/use-core.rs | 55 ++++++++++++++++++++++++++++ tests/headers/use-core.h | 5 +++ 4 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/codegen/helpers.rs b/src/codegen/helpers.rs index 06dadab0c9..9e19637c50 100644 --- a/src/codegen/helpers.rs +++ b/src/codegen/helpers.rs @@ -89,7 +89,9 @@ pub mod ast_ty { let prefix = ctx.rust_ident_raw(prefix); quote_ty!(ctx.ext_cx(), $prefix::$ident) } - None => quote_ty!(ctx.ext_cx(), ::std::os::raw::$ident), + None => { + quote_ty!(ctx.ext_cx(), ::std::os::raw::$ident) + } } } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 5ee43173c8..d3e204ce91 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1644,9 +1644,10 @@ impl MethodCodegen for Method { // If it's a constructor, we need to insert an extra parameter with a // variable called `__bindgen_tmp` we're going to create. if self.is_constructor() { + let prefix = ctx.trait_prefix(); let tmp_variable_decl = quote_stmt!(ctx.ext_cx(), - let mut __bindgen_tmp = ::std::mem::uninitialized()) + let mut __bindgen_tmp = ::$prefix::mem::uninitialized()) .unwrap(); stmts.push(tmp_variable_decl); exprs[0] = quote_expr!(ctx.ext_cx(), &mut __bindgen_tmp); @@ -2601,9 +2602,9 @@ mod utils { .unwrap(); let union_field_debug_impl = quote_item!(ctx.ext_cx(), - impl ::std::fmt::Debug for __BindgenUnionField { - fn fmt(&self, fmt: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { + impl ::$prefix::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::$prefix::fmt::Formatter) + -> ::$prefix::fmt::Result { fmt.write_str("__BindgenUnionField") } } diff --git a/tests/expectations/tests/use-core.rs b/tests/expectations/tests/use-core.rs index dd13156f68..c2996f74d5 100644 --- a/tests/expectations/tests/use-core.rs +++ b/tests/expectations/tests/use-core.rs @@ -5,6 +5,30 @@ extern crate core; +#[repr(C)] +pub struct __BindgenUnionField(::core::marker::PhantomData); +impl __BindgenUnionField { + #[inline] + pub fn new() -> Self { __BindgenUnionField(::core::marker::PhantomData) } + #[inline] + pub unsafe fn as_ref(&self) -> &T { ::core::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut(&mut self) -> &mut T { ::core::mem::transmute(self) } +} +impl ::core::default::Default for __BindgenUnionField { + #[inline] + fn default() -> Self { Self::new() } +} +impl ::core::clone::Clone for __BindgenUnionField { + #[inline] + fn clone(&self) -> Self { Self::new() } +} +impl ::core::marker::Copy for __BindgenUnionField { } +impl ::core::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} #[repr(C)] #[derive(Debug, Copy)] pub struct foo { @@ -40,5 +64,36 @@ impl Clone for foo { impl Default for foo { fn default() -> Self { unsafe { ::core::mem::zeroed() } } } +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct _bindgen_ty_1 { + pub bar: __BindgenUnionField<::std::os::raw::c_int>, + pub baz: __BindgenUnionField<::std::os::raw::c_long>, + pub bindgen_union_field: u64, +} +#[test] +fn bindgen_test_layout__bindgen_ty_1() { + assert_eq!(::core::mem::size_of::<_bindgen_ty_1>() , 8usize , concat ! ( + "Size of: " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (::core::mem::align_of::<_bindgen_ty_1>() , 8usize , concat ! ( + "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . bar as * const _ as + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( bar ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . baz as * const _ as + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( baz ) )); +} +impl Clone for _bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +extern "C" { + #[link_name = "bazz"] + pub static mut bazz: _bindgen_ty_1; +} pub type fooFunction = ::core::option::Option; diff --git a/tests/headers/use-core.h b/tests/headers/use-core.h index 42bb10d9d1..0e8a8d6e5d 100644 --- a/tests/headers/use-core.h +++ b/tests/headers/use-core.h @@ -5,4 +5,9 @@ struct foo { void* bar; }; +union { + int bar; + long baz; +} bazz; + typedef void (*fooFunction)(int bar); From e08072a1c9343c9c513e059a8a31ee2d1af129a9 Mon Sep 17 00:00:00 2001 From: Flier Lu Date: Wed, 8 Feb 2017 22:08:38 +0800 Subject: [PATCH 0310/2291] check layout align before padding bytes --- src/codegen/struct_layout.rs | 5 +- tests/expectations/tests/issue-493.rs | 152 ++++++++++++++++++++++++++ tests/headers/issue-493.hpp | 47 ++++++++ 3 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/tests/issue-493.rs create mode 100644 tests/headers/issue-493.hpp diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs index 9864057026..f8a88bc24b 100644 --- a/src/codegen/struct_layout.rs +++ b/src/codegen/struct_layout.rs @@ -89,9 +89,12 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { Some(offset) if offset / 8 > self.latest_offset => { (offset / 8 - self.latest_offset, true) } - _ => { + _ if field_layout.align != 0 => { (self.padding_bytes(field_layout), (self.latest_offset % field_layout.align) != 0) } + _ => { + (0, false) + } }; self.latest_offset += padding_bytes; diff --git a/tests/expectations/tests/issue-493.rs b/tests/expectations/tests/issue-493.rs new file mode 100644 index 0000000000..f8814bd396 --- /dev/null +++ b/tests/expectations/tests/issue-493.rs @@ -0,0 +1,152 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +pub struct __BindgenUnionField(::std::marker::PhantomData); +impl __BindgenUnionField { + #[inline] + pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) } + #[inline] + pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut(&mut self) -> &mut T { ::std::mem::transmute(self) } +} +impl ::std::default::Default for __BindgenUnionField { + #[inline] + fn default() -> Self { Self::new() } +} +impl ::std::clone::Clone for __BindgenUnionField { + #[inline] + fn clone(&self) -> Self { Self::new() } +} +impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct basic_string<_CharT, _Traits, _Allocator> { + pub _address: u8, + pub _phantom_0: ::std::marker::PhantomData<_CharT>, + pub _phantom_1: ::std::marker::PhantomData<_Traits>, + pub _phantom_2: ::std::marker::PhantomData<_Allocator>, +} +pub type basic_string_size_type = ::std::os::raw::c_ulonglong; +pub type basic_string_value_type = ::std::os::raw::c_char; +pub type basic_string_pointer = *mut basic_string_value_type; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct basic_string___long<_CharT, _Traits, _Allocator> { + pub __cap_: basic_string_size_type, + pub __size_: basic_string_size_type, + pub __data_: basic_string_pointer, + pub _phantom_0: ::std::marker::PhantomData<_CharT>, + pub _phantom_1: ::std::marker::PhantomData<_Traits>, + pub _phantom_2: ::std::marker::PhantomData<_Allocator>, +} +impl <_CharT, _Traits, _Allocator> Default for + basic_string___long<_CharT, _Traits, _Allocator> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +pub const basic_string___min_cap: basic_string__bindgen_ty_1 = + basic_string__bindgen_ty_1::__min_cap; +#[repr(i32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum basic_string__bindgen_ty_1 { __min_cap = 0, } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct basic_string___short<_CharT, _Traits, _Allocator> { + pub __bindgen_anon_1: basic_string___short__bindgen_ty_1<_CharT, _Traits, + _Allocator>, + pub __data_: *mut basic_string_value_type, + pub _phantom_0: ::std::marker::PhantomData<_CharT>, + pub _phantom_1: ::std::marker::PhantomData<_Traits>, + pub _phantom_2: ::std::marker::PhantomData<_Allocator>, +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct basic_string___short__bindgen_ty_1<_CharT, _Traits, _Allocator> { + pub __size_: __BindgenUnionField<::std::os::raw::c_uchar>, + pub __lx: __BindgenUnionField, + pub bindgen_union_field: u8, + pub _phantom_0: ::std::marker::PhantomData<_CharT>, + pub _phantom_1: ::std::marker::PhantomData<_Traits>, + pub _phantom_2: ::std::marker::PhantomData<_Allocator>, +} +impl <_CharT, _Traits, _Allocator> Default for + basic_string___short<_CharT, _Traits, _Allocator> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct basic_string___ulx<_CharT, _Traits, _Allocator> { + pub __lx: __BindgenUnionField>, + pub __lxx: __BindgenUnionField>, + pub bindgen_union_field: [u8; 0usize], + pub _phantom_0: ::std::marker::PhantomData<_CharT>, + pub _phantom_1: ::std::marker::PhantomData<_Traits>, + pub _phantom_2: ::std::marker::PhantomData<_Allocator>, +} +impl <_CharT, _Traits, _Allocator> Default for + basic_string___ulx<_CharT, _Traits, _Allocator> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +pub const basic_string___n_words: basic_string__bindgen_ty_2 = + basic_string__bindgen_ty_2::__n_words; +#[repr(i32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum basic_string__bindgen_ty_2 { __n_words = 0, } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct basic_string___raw<_CharT, _Traits, _Allocator> { + pub __words: *mut basic_string_size_type, + pub _phantom_0: ::std::marker::PhantomData<_CharT>, + pub _phantom_1: ::std::marker::PhantomData<_Traits>, + pub _phantom_2: ::std::marker::PhantomData<_Allocator>, +} +impl <_CharT, _Traits, _Allocator> Default for + basic_string___raw<_CharT, _Traits, _Allocator> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct basic_string___rep<_CharT, _Traits, _Allocator> { + pub __bindgen_anon_1: basic_string___rep__bindgen_ty_1<_CharT, _Traits, + _Allocator>, + pub _phantom_0: ::std::marker::PhantomData<_CharT>, + pub _phantom_1: ::std::marker::PhantomData<_Traits>, + pub _phantom_2: ::std::marker::PhantomData<_Allocator>, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct basic_string___rep__bindgen_ty_1<_CharT, _Traits, _Allocator> { + pub __l: __BindgenUnionField>, + pub __s: __BindgenUnionField>, + pub __r: __BindgenUnionField>, + pub bindgen_union_field: [u8; 0usize], + pub _phantom_0: ::std::marker::PhantomData<_CharT>, + pub _phantom_1: ::std::marker::PhantomData<_Traits>, + pub _phantom_2: ::std::marker::PhantomData<_Allocator>, +} +impl <_CharT, _Traits, _Allocator> Default for + basic_string___rep__bindgen_ty_1<_CharT, _Traits, _Allocator> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl <_CharT, _Traits, _Allocator> Default for + basic_string___rep<_CharT, _Traits, _Allocator> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl <_CharT, _Traits, _Allocator> Default for + basic_string<_CharT, _Traits, _Allocator> { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/headers/issue-493.hpp b/tests/headers/issue-493.hpp new file mode 100644 index 0000000000..975ef5ceea --- /dev/null +++ b/tests/headers/issue-493.hpp @@ -0,0 +1,47 @@ +template +class basic_string +{ +public: + typedef unsigned long long size_type; + typedef char value_type; + typedef value_type * pointer; + + struct __long + { + size_type __cap_; + size_type __size_; + pointer __data_; + }; + + enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ? + (sizeof(__long) - 1)/sizeof(value_type) : 2}; + + struct __short + { + union + { + unsigned char __size_; + value_type __lx; + }; + value_type __data_[__min_cap]; + }; + + union __ulx{__long __lx; __short __lxx;}; + + enum {__n_words = sizeof(__ulx) / sizeof(size_type)}; + + struct __raw + { + size_type __words[__n_words]; + }; + + struct __rep + { + union + { + __long __l; + __short __s; + __raw __r; + }; + }; +}; \ No newline at end of file From 86380b55a6103d6f01bd5a573d216fafce52c374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Lesin=CC=81ski?= Date: Wed, 8 Feb 2017 16:25:56 +0000 Subject: [PATCH 0311/2291] Use conditionally functions absent from Clang 3.5 --- src/clang.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/clang.rs b/src/clang.rs index ffe9d5d04d..86eccd0c0a 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -448,7 +448,11 @@ impl Cursor { /// Get the visibility of this cursor's referent. pub fn visibility(&self) -> CXVisibilityKind { - unsafe { clang_getCursorVisibility(self.x) } + if clang_getCursorVisibility::is_loaded() { + unsafe { clang_getCursorVisibility(self.x) } + } else { + CXVisibility_Default + } } /// Given that this cursor's referent is a function, return cursors to its @@ -496,11 +500,16 @@ impl Cursor { /// Is this cursor's referent a field declaration that is marked as /// `mutable`? pub fn is_mutable_field(&self) -> bool { + clang_CXXField_isMutable::is_loaded() && unsafe { clang_CXXField_isMutable(self.x) != 0 } } /// Get the offset of the field represented by the Cursor. pub fn offset_of_field(&self) -> Result { + if !clang_Cursor_getOffsetOfField::is_loaded() { + return Err(LayoutError::from(-1)); + } + let offset = unsafe { clang_Cursor_getOffsetOfField(self.x) }; if offset < 0 { From 51c3ac628fd96ded822f12a60f3940bbff205564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Lesin=CC=81ski?= Date: Wed, 8 Feb 2017 16:53:06 +0000 Subject: [PATCH 0312/2291] Fallback for clang_Cursor_getMangling absent in Clang 3.5 --- src/clang.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/clang.rs b/src/clang.rs index 86eccd0c0a..a2b4ee0f1a 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -69,7 +69,11 @@ impl Cursor { /// Get the mangled name of this cursor's referent. pub fn mangling(&self) -> String { - unsafe { cxstring_into_string(clang_Cursor_getMangling(self.x)) } + if clang_Cursor_getMangling::is_loaded() { + unsafe { cxstring_into_string(clang_Cursor_getMangling(self.x)) } + } else { + self.spelling() + } } /// Get the `Cursor` for this cursor's referent's lexical parent. From 290707f9d3d4d507eef6bc3cdd75f9555fa372d2 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 3 Feb 2017 15:07:13 -0800 Subject: [PATCH 0313/2291] Derive Copy for clang::Type --- src/clang.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clang.rs b/src/clang.rs index ffe9d5d04d..72cd567cef 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -573,7 +573,7 @@ impl Hash for Cursor { } /// The type of a node in clang's AST. -#[derive(Clone)] +#[derive(Clone, Copy)] pub struct Type { x: CXType, } From 910b0d6458f51e553b0e229af41fa313b3d3f10c Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 7 Feb 2017 14:26:05 -0800 Subject: [PATCH 0314/2291] Add children-related helper methods to Cursor This commit adds collect_children, has_children, and has_at_least_num_children methods to Cursor. --- src/clang.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/clang.rs b/src/clang.rs index 72cd567cef..b35d218787 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -361,6 +361,41 @@ impl Cursor { } } + /// Collect all of this cursor's children into a vec and return them. + pub fn collect_children(&self) -> Vec { + let mut children = vec![]; + self.visit(|c| { + children.push(c); + CXChildVisit_Continue + }); + children + } + + /// Does this cursor have any children? + pub fn has_children(&self) -> bool { + let mut has_children = false; + self.visit(|_| { + has_children = true; + CXChildVisit_Break + }); + has_children + } + + /// Does this cursor have at least `n` children? + pub fn has_at_least_num_children(&self, n: usize) -> bool { + assert!(n > 0); + let mut num_left = n; + self.visit(|_| { + num_left -= 1; + if num_left == 0 { + CXChildVisit_Break + } else { + CXChildVisit_Continue + } + }); + num_left == 0 + } + /// Returns whether the given location contains a cursor with the given /// kind in the first level of nesting underneath (doesn't look /// recursively). From 775c15c3dcfa488c0ca4236805606f345fbbc2e2 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 7 Feb 2017 14:33:57 -0800 Subject: [PATCH 0315/2291] Introduce a CanonicalDeclaration type The `CanonicalTypeDeclaration` type exists as proof-by-construction that its cursor is the canonical declaration for its type. If you have a `CanonicalTypeDeclaration` instance, you know for sure that the type and cursor match up in a canonical declaration relationship, and it simply cannot be otherwise. --- src/clang.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/clang.rs b/src/clang.rs index b35d218787..6474db2cee 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -684,6 +684,31 @@ impl Type { } } + /// Get the canonical declaration of this type, if it is available. + pub fn canonical_declaration(&self, + location: Option<&Cursor>) + -> Option { + let mut declaration = self.declaration(); + if !declaration.is_valid() { + if let Some(location) = location { + let mut location = *location; + if let Some(referenced) = location.referenced() { + location = referenced; + } + if location.is_template_like() { + declaration = location; + } + } + } + + let canonical = declaration.canonical(); + if canonical.is_valid() && canonical.kind() != CXCursor_NoDeclFound { + Some(CanonicalTypeDeclaration(*self, canonical)) + } else { + None + } + } + /// Get a raw display name for this type. pub fn spelling(&self) -> String { unsafe { cxstring_into_string(clang_getTypeSpelling(self.x)) } @@ -874,6 +899,26 @@ impl Type { } } +/// The `CanonicalTypeDeclaration` type exists as proof-by-construction that its +/// cursor is the canonical declaration for its type. If you have a +/// `CanonicalTypeDeclaration` instance, you know for sure that the type and +/// cursor match up in a canonical declaration relationship, and it simply +/// cannot be otherwise. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct CanonicalTypeDeclaration(Type, Cursor); + +impl CanonicalTypeDeclaration { + /// Get the type. + pub fn ty(&self) -> &Type { + &self.0 + } + + /// Get the type's canonical declaration cursor. + pub fn cursor(&self) -> &Cursor { + &self.1 + } +} + /// An iterator for a type's template arguments. pub struct TypeTemplateArgIterator { x: CXType, From abb10933a43599db506138c01285ada9f5fce114 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 7 Feb 2017 14:36:13 -0800 Subject: [PATCH 0316/2291] Rustfmt on src/clang.rs --- src/clang.rs | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 6474db2cee..86105fc1fc 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -132,11 +132,11 @@ impl Cursor { // `clang_Cursor_getNumTemplateArguments` is totally unreliable. // Therefore, try former first, and only fallback to the latter if we // have to. - self.cur_type().num_template_args() + self.cur_type() + .num_template_args() .or_else(|| { - let n: c_int = unsafe { - clang_Cursor_getNumTemplateArguments(self.x) - }; + let n: c_int = + unsafe { clang_Cursor_getNumTemplateArguments(self.x) }; if n >= 0 { Some(n as u32) @@ -783,10 +783,12 @@ impl Type { /// If this type is a class template specialization, return its /// template arguments. Otherwise, return None. pub fn template_args(&self) -> Option { - self.num_template_args().map(|n| TypeTemplateArgIterator { - x: self.x, - length: n, - index: 0, + self.num_template_args().map(|n| { + TypeTemplateArgIterator { + x: self.x, + length: n, + index: 0, + } }) } @@ -888,9 +890,8 @@ impl Type { // Yep, the spelling of this containing type-parameter is extremely // nasty... But can happen in . Unfortunately I couldn't // reduce it enough :( - self.template_args().map_or(false, |args| { - args.len() > 0 - }) && match self.declaration().kind() { + self.template_args().map_or(false, |args| args.len() > 0) && + match self.declaration().kind() { CXCursor_ClassTemplatePartialSpecialization | CXCursor_TypeAliasTemplateDecl | CXCursor_TemplateTemplateParameter => false, From a69b50b01641f797d25a8caa60b036eb360550e3 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 7 Feb 2017 14:40:59 -0800 Subject: [PATCH 0317/2291] Rename TypeKind::TemplateRef to TypeKind::TemplateInstantiation --- src/codegen/mod.rs | 4 ++-- src/ir/item.rs | 4 ++-- src/ir/ty.rs | 27 +++++++++++++-------------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index d3e204ce91..0d605c1482 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -521,7 +521,7 @@ impl CodeGenerator for Type { TypeKind::Pointer(..) | TypeKind::BlockPointer | TypeKind::Reference(..) | - TypeKind::TemplateRef(..) | + TypeKind::TemplateInstantiation(..) | TypeKind::Function(..) | TypeKind::ResolvedTypeRef(..) | TypeKind::Named => { @@ -2180,7 +2180,7 @@ impl ToRustTy for Type { let path = item.namespace_aware_canonical_path(ctx); aster::AstBuilder::new().ty().path().ids(path).build() } - TypeKind::TemplateRef(inner, ref template_args) => { + TypeKind::TemplateInstantiation(inner, ref template_args) => { // PS: Sorry for the duplication here. let mut inner_ty = inner.to_rust_ty(ctx).unwrap(); diff --git a/src/ir/item.rs b/src/ir/item.rs index c8de95c072..f3d7a64478 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -619,7 +619,7 @@ impl Item { // XXX Is this completely correct? Partial template specialization // is hard anyways, sigh... TypeKind::TemplateAlias(_, ref args) | - TypeKind::TemplateRef(_, ref args) => args.clone(), + TypeKind::TemplateInstantiation(_, ref args) => args.clone(), // In a template specialization we've got all we want. TypeKind::Comp(ref ci) if ci.is_template_specialization() => { ci.template_args().iter().cloned().collect() @@ -718,7 +718,7 @@ impl Item { } // Same as above. TypeKind::ResolvedTypeRef(inner) | - TypeKind::TemplateRef(inner, _) => { + TypeKind::TemplateInstantiation(inner, _) => { item = ctx.resolve_item(inner); } _ => return item.id(), diff --git a/src/ir/ty.rs b/src/ir/ty.rs index be108cc0b8..a2a6562342 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -217,7 +217,7 @@ impl Type { pub fn has_vtable(&self, ctx: &BindgenContext) -> bool { // FIXME: Can we do something about template parameters? Huh... match self.kind { - TypeKind::TemplateRef(t, _) | + TypeKind::TemplateInstantiation(t, _) | TypeKind::TemplateAlias(t, _) | TypeKind::Alias(t) | TypeKind::ResolvedTypeRef(t) => ctx.resolve_type(t).has_vtable(ctx), @@ -230,7 +230,7 @@ impl Type { /// Returns whether this type has a destructor. pub fn has_destructor(&self, ctx: &BindgenContext) -> bool { match self.kind { - TypeKind::TemplateRef(t, _) | + TypeKind::TemplateInstantiation(t, _) | TypeKind::TemplateAlias(t, _) | TypeKind::Alias(t) | TypeKind::ResolvedTypeRef(t) => { @@ -269,7 +269,7 @@ impl Type { .signature_contains_named_type(ctx, ty) } TypeKind::TemplateAlias(_, ref template_args) | - TypeKind::TemplateRef(_, ref template_args) => { + TypeKind::TemplateInstantiation(_, ref template_args) => { template_args.iter().any(|arg| { ctx.resolve_type(*arg) .signature_contains_named_type(ctx, ty) @@ -336,7 +336,7 @@ impl Type { TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(inner) | TypeKind::TemplateAlias(inner, _) | - TypeKind::TemplateRef(inner, _) => { + TypeKind::TemplateInstantiation(inner, _) => { ctx.resolve_type(inner).safe_canonical_type(ctx) } @@ -352,7 +352,7 @@ impl Type { TypeKind::Pointer(..) | TypeKind::Array(..) | TypeKind::Reference(..) | - TypeKind::TemplateRef(..) | + TypeKind::TemplateInstantiation(..) | TypeKind::ResolvedTypeRef(..) => true, _ => false, } @@ -379,7 +379,7 @@ impl Type { TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(inner) | TypeKind::TemplateAlias(inner, _) | - TypeKind::TemplateRef(inner, _) => { + TypeKind::TemplateInstantiation(inner, _) => { ctx.resolve_type(inner).calc_size(ctx) } TypeKind::Array(inner, len) => { @@ -474,7 +474,7 @@ impl CanDeriveDefault for Type { } TypeKind::Void | TypeKind::Named | - TypeKind::TemplateRef(..) | + TypeKind::TemplateInstantiation(..) | TypeKind::Reference(..) | TypeKind::NullPtr | TypeKind::Pointer(..) | @@ -501,7 +501,7 @@ impl<'a> CanDeriveCopy<'a> for Type { } TypeKind::ResolvedTypeRef(t) | TypeKind::TemplateAlias(t, _) | - TypeKind::TemplateRef(t, _) | + TypeKind::TemplateInstantiation(t, _) | TypeKind::Alias(t) => t.can_derive_copy(ctx, ()), TypeKind::Comp(ref info) => { info.can_derive_copy(ctx, (item, self.layout(ctx))) @@ -597,10 +597,9 @@ pub enum TypeKind { /// A reference to a type, as in: int& foo(). Reference(ItemId), - /// A reference to a template, with different template parameter names. To - /// see why this is needed, check out the creation of this variant in - /// `Type::from_clang_ty`. - TemplateRef(ItemId, Vec), + /// An instantiation of an abstract template declaration (first tuple + /// member) with a set of concrete template arguments (second tuple member). + TemplateInstantiation(ItemId, Vec), /// A reference to a yet-to-resolve type. This stores the clang cursor /// itself, and postpones its resolution. @@ -644,7 +643,7 @@ impl Type { TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(inner) | TypeKind::TemplateAlias(inner, _) | - TypeKind::TemplateRef(inner, _) => { + TypeKind::TemplateInstantiation(inner, _) => { ctx.resolve_type(inner).is_unsized(ctx) } TypeKind::Named | @@ -1087,7 +1086,7 @@ impl TypeCollector for Type { } TypeKind::TemplateAlias(inner, ref template_args) | - TypeKind::TemplateRef(inner, ref template_args) => { + TypeKind::TemplateInstantiation(inner, ref template_args) => { types.insert(inner); for &item in template_args { types.insert(item); From 19fe07d8cbef3124cad9394f005c96878422f085 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 7 Feb 2017 14:44:18 -0800 Subject: [PATCH 0318/2291] Introduce the TemplateDeclaration trait The TemplateDeclaration trait aggregates information about template declarations (separate from instantiations and specializations) and their template parameters into a single source of truth. --- src/ir/comp.rs | 18 +++++++++++---- src/ir/context.rs | 2 +- src/ir/item.rs | 28 ++++++++++++++++++++++- src/ir/ty.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 7 deletions(-) diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 1ca3955993..80372cabcc 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -5,7 +5,7 @@ use super::context::{BindgenContext, ItemId}; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::item::Item; use super::layout::Layout; -use super::ty::Type; +use super::ty::{TemplateDeclaration, Type}; use super::type_collector::{ItemSet, TypeCollector}; use clang; use parse::{ClangItemParser, ParseError}; @@ -564,10 +564,8 @@ impl CompInfo { }); ci.is_anonymous = cursor.is_anonymous(); ci.template_args = match ty.template_args() { - // In forward declarations and not specializations, - // etc, they are in - // the ast, we'll meet them in - // CXCursor_TemplateTypeParameter + // In forward declarations and not specializations, etc, they are in + // the ast, we'll meet them in CXCursor_TemplateTypeParameter None => vec![], Some(arg_types) => { let num_arg_types = arg_types.len(); @@ -916,6 +914,16 @@ impl CompInfo { } } +impl TemplateDeclaration for CompInfo { + fn template_params(&self, _ctx: &BindgenContext) -> Option> { + if self.template_args.is_empty() { + None + } else { + Some(self.template_args.clone()) + } + } +} + impl CanDeriveDebug for CompInfo { type Extra = Option; diff --git a/src/ir/context.rs b/src/ir/context.rs index a748239496..edf42ec8ea 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -5,7 +5,7 @@ use super::int::IntKind; use super::item::{Item, ItemCanonicalPath}; use super::item_kind::ItemKind; use super::module::{Module, ModuleKind}; -use super::ty::{FloatKind, Type, TypeKind}; +use super::ty::{FloatKind, TemplateDeclaration, Type, TypeKind}; use super::type_collector::{ItemSet, TypeCollector}; use BindgenOptions; use cexpr; diff --git a/src/ir/item.rs b/src/ir/item.rs index f3d7a64478..3ce228b65e 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -6,7 +6,7 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::function::Function; use super::item_kind::ItemKind; use super::module::Module; -use super::ty::{Type, TypeKind}; +use super::ty::{TemplateDeclaration, Type, TypeKind}; use super::type_collector::{ItemSet, TypeCollector}; use clang; use clang_sys; @@ -902,6 +902,32 @@ impl Item { } } +impl TemplateDeclaration for ItemId { + fn template_params(&self, ctx: &BindgenContext) -> Option> { + ctx.resolve_item_fallible(*self) + .and_then(|item| item.template_params(ctx)) + } +} + +impl TemplateDeclaration for Item { + fn template_params(&self, ctx: &BindgenContext) -> Option> { + self.kind.template_params(ctx) + } +} + +impl TemplateDeclaration for ItemKind { + fn template_params(&self, ctx: &BindgenContext) -> Option> { + match *self { + ItemKind::Type(ref ty) => ty.template_params(ctx), + // TODO FITZGEN: shouldn't functions be able to have free template + // params? + ItemKind::Module(_) | + ItemKind::Function(_) | + ItemKind::Var(_) => None, + } + } +} + // An utility function to handle recursing inside nested types. fn visit_child(cur: clang::Cursor, id: ItemId, diff --git a/src/ir/ty.rs b/src/ir/ty.rs index a2a6562342..0c90547e09 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -14,6 +14,29 @@ use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; use std::mem; +/// Template declaration related methods. +pub trait TemplateDeclaration { + /// Get the set of `ItemId`s that make up this template declaration's free + /// template parameters. + /// + /// Note that these might *not* all be named types: C++ allows + /// constant-value template parameters. Of course, Rust does not allow + /// generic parameters to be anything but types, so we must treat them as + /// opaque, and avoid instantiating them. + fn template_params(&self, ctx: &BindgenContext) -> Option>; + + /// Get the number of free template parameters this template declaration + /// has. + /// + /// Implementations *may* return `Some` from this method when + /// `template_params` returns `None`. This is useful when we only have + /// partial information about the template declaration, such as when we are + /// in the middle of parsing it. + fn num_template_params(&self, ctx: &BindgenContext) -> Option { + self.template_params(ctx).map(|params| params.len()) + } +} + /// The base representation of a type in bindgen. /// /// A type has an optional name, which if present cannot be empty, a `layout` @@ -438,6 +461,41 @@ fn is_invalid_named_type_empty_name() { } +impl TemplateDeclaration for Type { + fn template_params(&self, ctx: &BindgenContext) -> Option> { + self.kind.template_params(ctx) + } +} + +impl TemplateDeclaration for TypeKind { + fn template_params(&self, ctx: &BindgenContext) -> Option> { + match *self { + TypeKind::ResolvedTypeRef(id) => { + ctx.resolve_type(id).template_params(ctx) + } + TypeKind::Comp(ref comp) => comp.template_params(ctx), + TypeKind::TemplateAlias(_, ref args) => Some(args.clone()), + + TypeKind::TemplateInstantiation(..) | + TypeKind::Void | + TypeKind::NullPtr | + TypeKind::Int(_) | + TypeKind::Float(_) | + TypeKind::Complex(_) | + TypeKind::Array(..) | + TypeKind::Function(_) | + TypeKind::Enum(_) | + TypeKind::Pointer(_) | + TypeKind::BlockPointer | + TypeKind::Reference(_) | + TypeKind::UnresolvedTypeRef(..) | + TypeKind::Named | + TypeKind::Alias(_) | + TypeKind::ObjCInterface(_) => None, + } + } +} + impl CanDeriveDebug for Type { type Extra = (); From c8a223e898e883c70f1d4d6b758ffc0cf3dc28d2 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 7 Feb 2017 14:48:48 -0800 Subject: [PATCH 0319/2291] Create PartialType for types we are in the middle of parsing This commit create the PartialType type to represent types that we are in the middle of parsing and their cursor where we found them. Additionally, it fixes a long standing FIXME to make `currently_parsed_types` private. Finally, it implements `TemplateDeclaration` for `PartialType` so that we can get information about a partially parsed template declaration type's template parameters. --- src/ir/context.rs | 86 +++++++++++++++++++++++++++++++++++++++++++++-- src/ir/item.rs | 28 +++++++-------- src/ir/ty.rs | 2 +- 3 files changed, 98 insertions(+), 18 deletions(-) diff --git a/src/ir/context.rs b/src/ir/context.rs index edf42ec8ea..a2277b398f 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -120,9 +120,7 @@ pub struct BindgenContext<'ctx> { /// We could also use the `types` HashMap, but my intention with it is that /// only valid types and declarations end up there, and this could /// potentially break that assumption. - /// - /// FIXME: Should not be public, though... meh. - pub currently_parsed_types: Vec<(Cursor, ItemId)>, + currently_parsed_types: Vec, /// A HashSet with all the already parsed macro names. This is done to avoid /// hard errors while parsing duplicated macros, as well to allow macro @@ -193,6 +191,26 @@ impl<'ctx> BindgenContext<'ctx> { me } + /// Get the stack of partially parsed types that we are in the middle of + /// parsing. + pub fn currently_parsed_types(&self) -> &[PartialType] { + &self.currently_parsed_types[..] + } + + /// Begin parsing the given partial type, and push it onto the + /// `currently_parsed_types` stack so that we won't infinite recurse if we + /// run into a reference to it while parsing it. + pub fn begin_parsing(&mut self, partial_ty: PartialType) { + self.currently_parsed_types.push(partial_ty); + } + + /// Finish parsing the current partial type, pop it off the + /// `currently_parsed_types` stack, and return it. + pub fn finish_parsing(&mut self) -> PartialType { + self.currently_parsed_types.pop() + .expect("should have been parsing a type, if we finished parsing a type") + } + /// Get the user-provided type chooser by reference, if any. pub fn type_chooser(&self) -> Option<&TypeChooser> { self.options().type_chooser.as_ref().map(|t| &**t) @@ -1156,6 +1174,68 @@ impl<'ctx> BindgenContext<'ctx> { } } +/// A type that we are in the middle of parsing. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct PartialType { + decl: Cursor, + id: ItemId, +} + +impl PartialType { + /// Construct a new `PartialType`. + pub fn new(decl: Cursor, id: ItemId) -> PartialType { + // assert!(decl == decl.canonical()); + PartialType { + decl: decl, + id: id, + } + } + + /// The cursor pointing to this partial type's declaration location. + pub fn decl(&self) -> &Cursor { + &self.decl + } + + /// The item ID allocated for this type. This is *NOT* a key for an entry in + /// the context's item set yet! + pub fn id(&self) -> ItemId { + self.id + } +} + +impl TemplateDeclaration for PartialType { + fn template_params(&self, _ctx: &BindgenContext) -> Option> { + // Maybe at some point we will eagerly parse named types, but for now we + // don't and this information is unavailable. + None + } + + fn num_template_params(&self, _ctx: &BindgenContext) -> Option { + // Wouldn't it be nice if libclang would reliably give us this + // information‽ + match self.decl().kind() { + clang_sys::CXCursor_ClassTemplate | + clang_sys::CXCursor_FunctionTemplate | + clang_sys::CXCursor_TypeAliasTemplateDecl => { + let mut num_params = 0; + self.decl().visit(|c| { + match c.kind() { + clang_sys::CXCursor_TemplateTypeParameter | + clang_sys::CXCursor_TemplateTemplateParameter | + clang_sys::CXCursor_NonTypeTemplateParameter => { + num_params += 1; + } + _ => {} + }; + clang_sys::CXChildVisit_Continue + }); + Some(num_params) + } + _ => None, + } + } +} + /// An iterator over whitelisted items. /// /// See `BindgenContext::whitelisted_items` for more information. diff --git a/src/ir/item.rs b/src/ir/item.rs index 3ce228b65e..83e2a41f4e 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -1,7 +1,7 @@ //! Bindgen's core intermediate representation type. use super::annotations::Annotations; -use super::context::{BindgenContext, ItemId}; +use super::context::{BindgenContext, ItemId, PartialType}; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::function::Function; use super::item_kind::ItemKind; @@ -1202,18 +1202,18 @@ impl ClangItemParser for Item { }; if valid_decl { - if let Some(&(_, item_id)) = - ctx.currently_parsed_types - .iter() - .find(|&&(d, _)| d == declaration_to_look_for) { + if let Some(partial) = ctx.currently_parsed_types() + .iter() + .find(|ty| *ty.decl() == declaration_to_look_for) { debug!("Avoiding recursion parsing type: {:?}", ty); - return Ok(item_id); + return Ok(partial.id()); } } let current_module = ctx.current_module(); + let partial_ty = PartialType::new(declaration_to_look_for, id); if valid_decl { - ctx.currently_parsed_types.push((declaration_to_look_for, id)); + ctx.begin_parsing(partial_ty); } let result = Type::from_clang_ty(id, ty, location, parent_id, ctx); @@ -1241,9 +1241,8 @@ impl ClangItemParser for Item { // declaration_to_look_for suspiciously shares a lot of // logic with ir::context, so we should refactor that. if valid_decl { - let (popped_decl, _) = - ctx.currently_parsed_types.pop().unwrap(); - assert_eq!(popped_decl, declaration_to_look_for); + let finished = ctx.finish_parsing(); + assert_eq!(*finished.decl(), declaration_to_look_for); } location.visit(|cur| { @@ -1251,8 +1250,9 @@ impl ClangItemParser for Item { }); if valid_decl { - ctx.currently_parsed_types - .push((declaration_to_look_for, id)); + let partial_ty = + PartialType::new(declaration_to_look_for, id); + ctx.begin_parsing(partial_ty); } } // If we have recursed into the AST all we know, and we still @@ -1279,8 +1279,8 @@ impl ClangItemParser for Item { }; if valid_decl { - let (popped_decl, _) = ctx.currently_parsed_types.pop().unwrap(); - assert_eq!(popped_decl, declaration_to_look_for); + let partial_ty = ctx.finish_parsing(); + assert_eq!(*partial_ty.decl(), declaration_to_look_for); } ret diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 0c90547e09..a98ca446a7 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -755,7 +755,7 @@ impl Type { potential_id, ty, location); - debug!("currently_parsed_types: {:?}", ctx.currently_parsed_types); + debug!("currently_parsed_types: {:?}", ctx.currently_parsed_types()); let canonical_ty = ty.canonical_type(); From 4348fb0c4c7e558705d573bf11d3d8262ccf39fc Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 7 Feb 2017 14:54:02 -0800 Subject: [PATCH 0320/2291] Refactor how template instantiation is performed This commit renames `build_template_wrapper` to `instantiate_template` because that is what it is really doing. Additionally, it completely reworks its logic. Sometimes clang gives us rather sorry ASTs for template instantiations (particularly when they involve incomplete template declarations) and we need to manually reconstruct the template argument nesting. --- src/ir/context.rs | 377 +++++++++++++++++++++++++++++----------------- 1 file changed, 240 insertions(+), 137 deletions(-) diff --git a/src/ir/context.rs b/src/ir/context.rs index a2277b398f..f25eaf3ffb 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -11,12 +11,14 @@ use BindgenOptions; use cexpr; use chooser::TypeChooser; use clang::{self, Cursor}; +use clang_sys; use parse::ClangItemParser; use std::borrow::Cow; use std::cell::Cell; use std::collections::{HashMap, VecDeque, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; +use std::iter::IntoIterator; use syntax::ast::Ident; use syntax::codemap::{DUMMY_SP, Span}; use syntax::ext::base::ExtCtxt; @@ -618,119 +620,239 @@ impl<'ctx> BindgenContext<'ctx> { self.current_module } - /// This is one of the hackiest methods in all the parsing code. This method - /// is used to allow having templates with another argument names instead of - /// the canonical ones. + /// Given a cursor pointing to the location of a template instantiation, + /// return a tuple of the form `(declaration_cursor, declaration_id, + /// num_expected_template_args)`. + /// + /// Note that `declaration_id` is not guaranteed to be in the context's item + /// set! It is possible that it is a partial type that we are still in the + /// middle of parsign. + fn get_declaration_info_for_template_instantiation + (&self, + instantiation: &Cursor) + -> (Cursor, ItemId, usize) { + instantiation.cur_type() + .canonical_declaration(Some(instantiation)) + .and_then(|canon_decl| { + self.get_resolved_type(&canon_decl) + .and_then(|template_decl_id| { + template_decl_id + .num_template_params(self) + .map(|num_params| { + (*canon_decl.cursor(), template_decl_id, num_params) + }) + }) + }) + .unwrap_or_else(|| { + // If we haven't already parsed the declaration of + // the template being instantiated, then it *must* + // be on the stack of types we are currently + // parsing. If it wasn't then clang would have + // already errored out before we started + // constructing our IR because you can't instantiate + // a template until it is fully defined. + let referenced = instantiation.referenced() + .expect("TemplateRefs should reference a template declaration"); + let template_decl = self.currently_parsed_types() + .iter() + .find(|partial_ty| *partial_ty.decl() == referenced) + .cloned() + .expect("template decl must be on the parse stack"); + let num_template_params = template_decl + .num_template_params(self) + .expect("and it had better be a template declaration"); + (*template_decl.decl(), template_decl.id(), num_template_params) + }) + } + + /// Parse a template instantiation, eg `Foo`. /// /// This is surprisingly difficult to do with libclang, due to the fact that - /// partial template specializations don't provide explicit template - /// argument information. + /// it doesn't provide explicit template argument information, except for + /// function template declarations(!?!??!). /// - /// The only way to do this as far as I know, is inspecting manually the - /// AST, looking for TypeRefs inside. This, unfortunately, doesn't work for + /// The only way to do this is manually inspecting the AST and looking for + /// TypeRefs and TemplateRefs inside. This, unfortunately, doesn't work for /// more complex cases, see the comment on the assertion below. /// - /// To see an example of what this handles: + /// To add insult to injury, the AST itself has structure that doesn't make + /// sense. Sometimes `Foo>` has an AST with nesting like you might + /// expect: `(Foo (Bar (int)))`. Other times, the AST we get is completely + /// flat: `(Foo Bar int)`. + /// + /// To see an example of what this method handles: /// /// ```c++ - /// template - /// class Incomplete { - /// T p; - /// }; + /// template + /// class Incomplete { + /// T p; + /// }; /// - /// template - /// class Foo { - /// Incomplete bar; - /// }; + /// template + /// class Foo { + /// Incomplete bar; + /// }; /// ``` - fn build_template_wrapper(&mut self, - with_id: ItemId, - wrapping: ItemId, - parent_id: ItemId, - ty: &clang::Type, - location: clang::Cursor, - declaration: clang::Cursor) - -> ItemId { - use clang_sys::*; + fn instantiate_template(&mut self, + with_id: ItemId, + template: ItemId, + parent_id: ItemId, + ty: &clang::Type, + location: clang::Cursor) + -> ItemId { + use clang_sys; + + let num_expected_args = self.resolve_type(template) + .num_template_params(self) + .expect("template types should have template params"); + let mut args = vec![]; - location.visit(|c| { - if c.kind() == CXCursor_TypeRef { - // The `with_id` id will potentially end up unused if we give up - // on this type (for example, its a tricky partial template - // specialization), so if we pass `with_id` as the parent, it is - // potentially a dangling reference. Instead, use the canonical - // template declaration as the parent. It is already parsed and - // has a known-resolvable `ItemId`. - let new_ty = Item::from_ty_or_ref(c.cur_type(), - Some(c), - Some(wrapping), - self); - args.push(new_ty); + let mut found_const_arg = false; + + let mut children = location.collect_children(); + + if children.iter().all(|c| !c.has_children()) { + // This is insanity... If clang isn't giving us a properly nested + // AST for which template arguments belong to which template we are + // instantiating, we'll need to construct it ourselves. However, + // there is an extra `NamespaceRef, NamespaceRef, ..., TemplateRef` + // representing a reference to the outermost template declaration + // that we need to filter out of the children. We need to do this + // filtering because we already know which template declaration is + // being specialized via the `location`'s type, and if we do not + // filter it out, we'll add an extra layer of template instantiation + // on accident. + let idx = children.iter() + .position(|c| c.kind() == clang_sys::CXCursor_TemplateRef); + if let Some(idx) = idx { + if children.iter() + .take(idx) + .all(|c| c.kind() == clang_sys::CXCursor_NamespaceRef) { + children = children.into_iter().skip(idx + 1).collect(); + } } - CXChildVisit_Continue - }); - - let item = { - let wrapping_type = self.resolve_type(wrapping); - if let TypeKind::Comp(ref ci) = *wrapping_type.kind() { - let old_args = ci.template_args(); + } - // The following assertion actually fails with partial template - // specialization. But as far as I know there's no way at all to - // grab the specialized types from neither the AST or libclang, - // which sucks. The same happens for specialized type alias - // template declarations, where we have that ugly hack up there. - // - // This flaw was already on the old parser, but I now think it - // has no clear solution (apart from patching libclang to - // somehow expose them, of course). - // - // For an easy example in which there's no way at all of getting - // the `int` type, except manually parsing the spelling: - // - // template - // class Incomplete { - // T d; - // U p; - // }; - // - // template - // class Foo { - // Incomplete bar; - // }; - // - // debug_assert_eq!(old_args.len(), args.len()); - // - // That being said, this is not so common, so just error! and - // hope for the best, returning the previous type, who knows. - if old_args.len() != args.len() { - error!("Found partial template specialization, \ - expect dragons!"); - return wrapping; + for child in children.iter().rev() { + match child.kind() { + clang_sys::CXCursor_TypeRef => { + // The `with_id` id will potentially end up unused if we give up + // on this type (for example, because it has const value + // template args), so if we pass `with_id` as the parent, it is + // potentially a dangling reference. Instead, use the canonical + // template declaration as the parent. It is already parsed and + // has a known-resolvable `ItemId`. + let ty = Item::from_ty_or_ref(child.cur_type(), + Some(*child), + Some(template), + self); + args.push(ty); + } + clang_sys::CXCursor_TemplateRef => { + let (template_decl_cursor, template_decl_id, num_expected_template_args) = + self.get_declaration_info_for_template_instantiation(child); + + if num_expected_template_args == 0 || + child.has_at_least_num_children(num_expected_template_args) { + // Do a happy little parse. See comment in the TypeRef + // match arm about parent IDs. + let ty = Item::from_ty_or_ref(child.cur_type(), + Some(*child), + Some(template), + self); + args.push(ty); + } else { + // This is the case mentioned in the doc comment where + // clang gives us a flattened AST and we have to + // reconstruct which template arguments go to which + // instantiation :( + let args_len = args.len(); + assert!(args_len >= num_expected_template_args); + let mut sub_args: Vec<_> = + args.drain(args_len - num_expected_template_args..) + .collect(); + sub_args.reverse(); + + let sub_name = Some(template_decl_cursor.spelling()); + let sub_kind = + TypeKind::TemplateInstantiation(template_decl_id, + sub_args); + let sub_ty = Type::new(sub_name, + template_decl_cursor.cur_type() + .fallible_layout() + .ok(), + sub_kind, + false); + let sub_id = self.next_item_id(); + let sub_item = Item::new(sub_id, + None, + None, + template_decl_id, + ItemKind::Type(sub_ty)); + + // Bypass all the validations in add_item explicitly. + debug!("instantiate_template: inserting nested \ + instantiation item: {:?}", + sub_item); + debug_assert!(sub_id == sub_item.id()); + self.items.insert(sub_id, sub_item); + args.push(sub_id); + } + } + _ => { + warn!("Found template arg cursor we can't handle: {:?}", + child); + found_const_arg = true; } - } else { - assert_eq!(declaration.kind(), - ::clang_sys::CXCursor_TypeAliasTemplateDecl, - "Expected wrappable type"); } + } - let type_kind = TypeKind::TemplateRef(wrapping, args); - let name = ty.spelling(); - let name = if name.is_empty() { None } else { Some(name) }; - let ty = Type::new(name, - ty.fallible_layout().ok(), - type_kind, - ty.is_const()); - Item::new(with_id, None, None, parent_id, ItemKind::Type(ty)) - }; + assert!(args.len() <= num_expected_args); + if found_const_arg || args.len() < num_expected_args { + // This is a dependently typed template instantiation. That is, an + // instantiation of a template with one or more const values as + // template arguments, rather than only types as template + // arguments. For example, `Foo` versus `Bar`. + // We can't handle these instantiations, so just punt in this + // situation... + warn!("Found template instantiated with a const value; \ + bindgen can't handle this kind of template instantiation!"); + return template; + } + + args.reverse(); + let type_kind = TypeKind::TemplateInstantiation(template, args); + let name = ty.spelling(); + let name = if name.is_empty() { None } else { Some(name) }; + let ty = Type::new(name, + ty.fallible_layout().ok(), + type_kind, + ty.is_const()); + let item = + Item::new(with_id, None, None, parent_id, ItemKind::Type(ty)); // Bypass all the validations in add_item explicitly. - debug!("build_template_wrapper: inserting item: {:?}", item); + debug!("instantiate_template: inserting item: {:?}", item); debug_assert!(with_id == item.id()); self.items.insert(with_id, item); with_id } + /// If we have already resolved the type for the given type declaration, + /// return its `ItemId`. Otherwise, return `None`. + fn get_resolved_type(&self, + decl: &clang::CanonicalTypeDeclaration) + -> Option { + self.types + .get(&TypeKey::Declaration(*decl.cursor())) + .or_else(|| { + decl.cursor() + .usr() + .and_then(|usr| self.types.get(&TypeKey::USR(usr))) + }) + .cloned() + } + /// Looks up for an already resolved type, either because it's builtin, or /// because we already have it in the map. pub fn builtin_or_resolved_ty(&mut self, @@ -744,45 +866,32 @@ impl<'ctx> BindgenContext<'ctx> { ty, location, parent_id); - let mut declaration = ty.declaration(); - if !declaration.is_valid() { - if let Some(location) = location { - if location.is_template_like() { - declaration = location; - } - } - } - let canonical_declaration = declaration.canonical(); - if canonical_declaration.is_valid() { - let id = self.types - .get(&TypeKey::Declaration(canonical_declaration)) - .map(|id| *id) - .or_else(|| { - canonical_declaration.usr() - .and_then(|usr| self.types.get(&TypeKey::USR(usr))) - .map(|id| *id) - }); - if let Some(id) = id { + + if let Some(decl) = ty.canonical_declaration(location.as_ref()) { + if let Some(id) = self.get_resolved_type(&decl) { debug!("Already resolved ty {:?}, {:?}, {:?} {:?}", id, - declaration, + decl, ty, location); - - // If the declaration existed, we *might* be done, but it's not - // the case for class templates, where the template arguments - // may vary. + // If the declaration already exists, then either: // - // In this case, we create a TemplateRef with the new template - // arguments, pointing to the canonical template. + // * the declaration is a template declaration of some sort, + // and we are looking at an instantiation or specialization + // of it, or + // * we have already parsed and resolved this type, and + // there's nothing left to do. // - // Note that we only do it if parent_id is some, and we have a - // location for building the new arguments, the template - // argument names don't matter in the global context. - if declaration.is_template_like() && - *ty != canonical_declaration.cur_type() && + // Note that we only do the former if the `parent_id` exists, + // and we have a location for building the new arguments. The + // template argument names don't matter in the global context. + if decl.cursor().is_template_like() && + *ty != decl.cursor().cur_type() && location.is_some() && parent_id.is_some() { + let location = location.unwrap(); + let parent_id = parent_id.unwrap(); + // For specialized type aliases, there's no way to get the // template parameters as of this writing (for a struct // specialization we wouldn't be in this branch anyway). @@ -793,18 +902,17 @@ impl<'ctx> BindgenContext<'ctx> { // exposed. // // This is _tricky_, I know :( - if declaration.kind() == CXCursor_TypeAliasTemplateDecl && - !location.unwrap().contains_cursor(CXCursor_TypeRef) && + if decl.cursor().kind() == CXCursor_TypeAliasTemplateDecl && + !location.contains_cursor(CXCursor_TypeRef) && ty.canonical_type().is_valid_and_exposed() { return None; } - return Some(self.build_template_wrapper(with_id, - id, - parent_id.unwrap(), - ty, - location.unwrap(), - declaration)); + return Some(self.instantiate_template(with_id, + id, + parent_id, + ty, + location)); } return Some(self.build_ty_wrapper(with_id, id, parent_id, ty)); @@ -812,9 +920,7 @@ impl<'ctx> BindgenContext<'ctx> { } debug!("Not resolved, maybe builtin?"); - - // Else, build it. - self.build_builtin_ty(ty, declaration) + self.build_builtin_ty(ty) } // This is unfortunately a lot of bloat, but is needed to properly track @@ -849,10 +955,7 @@ impl<'ctx> BindgenContext<'ctx> { ret } - fn build_builtin_ty(&mut self, - ty: &clang::Type, - _declaration: Cursor) - -> Option { + fn build_builtin_ty(&mut self, ty: &clang::Type) -> Option { use clang_sys::*; let type_kind = match ty.kind() { CXType_NullPtr => TypeKind::NullPtr, From de35b8a4c510722480c7af2e02f4322aad45ec55 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 7 Feb 2017 15:02:56 -0800 Subject: [PATCH 0321/2291] Add a test case for issue #446 --- tests/expectations/tests/issue-446.rs | 22 ++++++++++++++++++++++ tests/headers/issue-446.hpp | 11 +++++++++++ 2 files changed, 33 insertions(+) create mode 100644 tests/expectations/tests/issue-446.rs create mode 100644 tests/headers/issue-446.hpp diff --git a/tests/expectations/tests/issue-446.rs b/tests/expectations/tests/issue-446.rs new file mode 100644 index 0000000000..fa736bccf6 --- /dev/null +++ b/tests/expectations/tests/issue-446.rs @@ -0,0 +1,22 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct List { + pub next: *mut List, +} +impl Default for List { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct PersistentRooted { + pub root_list: List>, +} +impl Default for PersistentRooted { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/headers/issue-446.hpp b/tests/headers/issue-446.hpp new file mode 100644 index 0000000000..2e09c2745b --- /dev/null +++ b/tests/headers/issue-446.hpp @@ -0,0 +1,11 @@ +// bindgen-flags: -- -std=c++14 + +template +class List { + List *next; +}; + +template +class PersistentRooted { + List> root_list; +}; From 41a109ac25d24863dc5d70cc7e96857a0a9de54c Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 7 Feb 2017 15:13:06 -0800 Subject: [PATCH 0322/2291] Run `cargo fmt` --- src/clang.rs | 17 +++++++++++++---- src/ir/function.rs | 5 +++-- src/ir/objc.rs | 4 ++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 86105fc1fc..15cd60fc1d 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -1464,7 +1464,10 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { type_to_str(ty.kind()))); } if let Some(ty) = c.ret_type() { - print_indent(depth, format!(" {}ret-type = {}", prefix, type_to_str(ty.kind()))); + print_indent(depth, + format!(" {}ret-type = {}", + prefix, + type_to_str(ty.kind()))); } if let Some(refd) = c.referenced() { @@ -1473,7 +1476,9 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { print_cursor(depth, String::from(prefix) + "referenced.", &refd); - print_cursor(depth, String::from(prefix) + "referenced.", &refd); + print_cursor(depth, + String::from(prefix) + "referenced.", + &refd); } } @@ -1483,7 +1488,9 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { print_cursor(depth, String::from(prefix) + "canonical.", &canonical); - print_cursor(depth, String::from(prefix) + "canonical.", &canonical); + print_cursor(depth, + String::from(prefix) + "canonical.", + &canonical); } if let Some(specialized) = c.specialized() { @@ -1492,7 +1499,9 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { print_cursor(depth, String::from(prefix) + "specialized.", &specialized); - print_cursor(depth, String::from(prefix) + "specialized.", &specialized); + print_cursor(depth, + String::from(prefix) + "specialized.", + &specialized); } } } diff --git a/src/ir/function.rs b/src/ir/function.rs index 9ef9c3a73c..6273de283b 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -229,8 +229,9 @@ impl FunctionSig { let abi = get_abi(ty.call_conv()); if abi.is_none() { - assert_eq!(cursor.kind(), CXCursor_ObjCInstanceMethodDecl, - "Invalid ABI for function signature") + assert_eq!(cursor.kind(), + CXCursor_ObjCInstanceMethodDecl, + "Invalid ABI for function signature") } Ok(Self::new(ret, args, ty.is_variadic(), abi)) diff --git a/src/ir/objc.rs b/src/ir/objc.rs index ea2cc0c887..b3c3688b37 100644 --- a/src/ir/objc.rs +++ b/src/ir/objc.rs @@ -1,10 +1,10 @@ //! Objective C types +use super::context::BindgenContext; +use super::function::FunctionSig; use clang; use clang_sys::CXChildVisit_Continue; use clang_sys::CXCursor_ObjCInstanceMethodDecl; -use super::context::BindgenContext; -use super::function::FunctionSig; /// Objective C interface as used in TypeKind /// From a8fedb498cf8bac29cea76f19ddc0d813a2ca9d3 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 8 Feb 2017 11:08:09 -0800 Subject: [PATCH 0323/2291] Make instantiate_template fallible --- src/ir/context.rs | 82 ++++++++++++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/src/ir/context.rs b/src/ir/context.rs index f25eaf3ffb..ebb6520b1f 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -630,7 +630,7 @@ impl<'ctx> BindgenContext<'ctx> { fn get_declaration_info_for_template_instantiation (&self, instantiation: &Cursor) - -> (Cursor, ItemId, usize) { + -> Option<(Cursor, ItemId, usize)> { instantiation.cur_type() .canonical_declaration(Some(instantiation)) .and_then(|canon_decl| { @@ -643,7 +643,7 @@ impl<'ctx> BindgenContext<'ctx> { }) }) }) - .unwrap_or_else(|| { + .or_else(|| { // If we haven't already parsed the declaration of // the template being instantiated, then it *must* // be on the stack of types we are currently @@ -651,17 +651,19 @@ impl<'ctx> BindgenContext<'ctx> { // already errored out before we started // constructing our IR because you can't instantiate // a template until it is fully defined. - let referenced = instantiation.referenced() - .expect("TemplateRefs should reference a template declaration"); - let template_decl = self.currently_parsed_types() - .iter() - .find(|partial_ty| *partial_ty.decl() == referenced) - .cloned() - .expect("template decl must be on the parse stack"); - let num_template_params = template_decl - .num_template_params(self) - .expect("and it had better be a template declaration"); - (*template_decl.decl(), template_decl.id(), num_template_params) + instantiation.referenced() + .and_then(|referenced| { + self.currently_parsed_types() + .iter() + .find(|partial_ty| *partial_ty.decl() == referenced) + .cloned() + }) + .and_then(|template_decl| { + template_decl.num_template_params(self) + .map(|num_template_params| { + (*template_decl.decl(), template_decl.id(), num_template_params) + }) + }) }) } @@ -699,16 +701,20 @@ impl<'ctx> BindgenContext<'ctx> { parent_id: ItemId, ty: &clang::Type, location: clang::Cursor) - -> ItemId { + -> Option { use clang_sys; - let num_expected_args = self.resolve_type(template) - .num_template_params(self) - .expect("template types should have template params"); + let num_expected_args = match self.resolve_type(template).num_template_params(self) { + Some(n) => n, + None => { + warn!("Tried to instantiate a template for which we could not \ + determine any template parameters"); + return None; + } + }; let mut args = vec![]; let mut found_const_arg = false; - let mut children = location.collect_children(); if children.iter().all(|c| !c.has_children()) { @@ -735,7 +741,9 @@ impl<'ctx> BindgenContext<'ctx> { for child in children.iter().rev() { match child.kind() { - clang_sys::CXCursor_TypeRef => { + clang_sys::CXCursor_TypeRef | + clang_sys::CXCursor_TypedefDecl | + clang_sys::CXCursor_TypeAliasDecl => { // The `with_id` id will potentially end up unused if we give up // on this type (for example, because it has const value // template args), so if we pass `with_id` as the parent, it is @@ -750,7 +758,10 @@ impl<'ctx> BindgenContext<'ctx> { } clang_sys::CXCursor_TemplateRef => { let (template_decl_cursor, template_decl_id, num_expected_template_args) = - self.get_declaration_info_for_template_instantiation(child); + match self.get_declaration_info_for_template_instantiation(child) { + Some(info) => info, + None => return None, + }; if num_expected_template_args == 0 || child.has_at_least_num_children(num_expected_template_args) { @@ -767,7 +778,12 @@ impl<'ctx> BindgenContext<'ctx> { // reconstruct which template arguments go to which // instantiation :( let args_len = args.len(); - assert!(args_len >= num_expected_template_args); + if args_len < num_expected_template_args { + warn!("Found a template instantiation without \ + enough template arguments"); + return None; + } + let mut sub_args: Vec<_> = args.drain(args_len - num_expected_template_args..) .collect(); @@ -807,8 +823,7 @@ impl<'ctx> BindgenContext<'ctx> { } } - assert!(args.len() <= num_expected_args); - if found_const_arg || args.len() < num_expected_args { + if found_const_arg { // This is a dependently typed template instantiation. That is, an // instantiation of a template with one or more const values as // template arguments, rather than only types as template @@ -817,7 +832,13 @@ impl<'ctx> BindgenContext<'ctx> { // situation... warn!("Found template instantiated with a const value; \ bindgen can't handle this kind of template instantiation!"); - return template; + return None; + } + + if args.len() != num_expected_args { + warn!("Found a template with an unexpected number of template \ + arguments"); + return None; } args.reverse(); @@ -835,7 +856,7 @@ impl<'ctx> BindgenContext<'ctx> { debug!("instantiate_template: inserting item: {:?}", item); debug_assert!(with_id == item.id()); self.items.insert(with_id, item); - with_id + Some(with_id) } /// If we have already resolved the type for the given type declaration, @@ -908,11 +929,12 @@ impl<'ctx> BindgenContext<'ctx> { return None; } - return Some(self.instantiate_template(with_id, - id, - parent_id, - ty, - location)); + return self.instantiate_template(with_id, + id, + parent_id, + ty, + location) + .or_else(|| Some(id)); } return Some(self.build_ty_wrapper(with_id, id, parent_id, ty)); From 5b5d4f8783e82432441c11691712d57c3af5844a Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 8 Feb 2017 11:08:33 -0800 Subject: [PATCH 0324/2291] Run `cargo fmt` --- src/codegen/helpers.rs | 4 +--- src/codegen/mod.rs | 11 ++++++----- src/ir/context.rs | 26 +++++++++++++++----------- src/ir/derive.rs | 2 +- src/main.rs | 7 +++---- src/options.rs | 5 +++-- 6 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/codegen/helpers.rs b/src/codegen/helpers.rs index 9e19637c50..06dadab0c9 100644 --- a/src/codegen/helpers.rs +++ b/src/codegen/helpers.rs @@ -89,9 +89,7 @@ pub mod ast_ty { let prefix = ctx.rust_ident_raw(prefix); quote_ty!(ctx.ext_cx(), $prefix::$ident) } - None => { - quote_ty!(ctx.ext_cx(), ::std::os::raw::$ident) - } + None => quote_ty!(ctx.ext_cx(), ::std::os::raw::$ident), } } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 0d605c1482..7469abb981 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1377,9 +1377,10 @@ impl CodeGenerator for CompInfo { // FIXME when [issue #465](https://github.com/servo/rust-bindgen/issues/465) ready let too_many_base_vtables = self.base_members() .iter() - .filter(|base| ctx.resolve_type(base.ty).has_vtable(ctx)) - .count() > - 1; + .filter(|base| { + ctx.resolve_type(base.ty).has_vtable(ctx) + }) + .count() > 1; let should_skip_field_offset_checks = item.is_opaque(ctx) || too_many_base_vtables; @@ -2189,7 +2190,7 @@ impl ToRustTy for Type { .map(|arg| arg.to_rust_ty(ctx)) .collect::>(); - path.segments.last_mut().unwrap().parameters = if + path.segments.last_mut().unwrap().parameters = if template_args.is_empty() { None } else { @@ -2509,8 +2510,8 @@ mod utils { use super::ItemToRustTy; use aster; use ir::context::{BindgenContext, ItemId}; - use ir::item::{Item, ItemCanonicalPath}; use ir::function::FunctionSig; + use ir::item::{Item, ItemCanonicalPath}; use ir::ty::TypeKind; use std::mem; use syntax::ast; diff --git a/src/ir/context.rs b/src/ir/context.rs index ebb6520b1f..91ce579c33 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -636,10 +636,11 @@ impl<'ctx> BindgenContext<'ctx> { .and_then(|canon_decl| { self.get_resolved_type(&canon_decl) .and_then(|template_decl_id| { - template_decl_id - .num_template_params(self) + template_decl_id.num_template_params(self) .map(|num_params| { - (*canon_decl.cursor(), template_decl_id, num_params) + (*canon_decl.cursor(), + template_decl_id, + num_params) }) }) }) @@ -661,7 +662,9 @@ impl<'ctx> BindgenContext<'ctx> { .and_then(|template_decl| { template_decl.num_template_params(self) .map(|num_template_params| { - (*template_decl.decl(), template_decl.id(), num_template_params) + (*template_decl.decl(), + template_decl.id(), + num_template_params) }) }) }) @@ -704,7 +707,8 @@ impl<'ctx> BindgenContext<'ctx> { -> Option { use clang_sys; - let num_expected_args = match self.resolve_type(template).num_template_params(self) { + let num_expected_args = match self.resolve_type(template) + .num_template_params(self) { Some(n) => n, None => { warn!("Tried to instantiate a template for which we could not \ @@ -929,12 +933,12 @@ impl<'ctx> BindgenContext<'ctx> { return None; } - return self.instantiate_template(with_id, - id, - parent_id, - ty, - location) - .or_else(|| Some(id)); + return self.instantiate_template(with_id, + id, + parent_id, + ty, + location) + .or_else(|| Some(id)); } return Some(self.build_ty_wrapper(with_id, id, parent_id, ty)); diff --git a/src/ir/derive.rs b/src/ir/derive.rs index 6d9f368ba2..0fc8debffa 100644 --- a/src/ir/derive.rs +++ b/src/ir/derive.rs @@ -85,4 +85,4 @@ pub trait CanDeriveDefault { ctx: &BindgenContext, extra: Self::Extra) -> bool; -} \ No newline at end of file +} diff --git a/src/main.rs b/src/main.rs index 68f3d0a865..fc1ef8e28c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,10 +44,9 @@ pub fn main() { match builder_from_flags(bind_args.into_iter()) { Ok((builder, output, verbose)) => { - let builder_result = - panic::catch_unwind(|| - builder.generate().expect("Unable to generate bindings") - ); + let builder_result = panic::catch_unwind(|| { + builder.generate().expect("Unable to generate bindings") + }); if builder_result.is_err() { if verbose { diff --git a/src/options.rs b/src/options.rs index 7a6fde964e..49bad841c3 100644 --- a/src/options.rs +++ b/src/options.rs @@ -4,8 +4,9 @@ use std::fs::File; use std::io::{self, Error, ErrorKind}; /// Construct a new [`Builder`](./struct.Builder.html) from command line flags. -pub fn builder_from_flags(args: I) - -> Result<(Builder, Box, bool), io::Error> +pub fn builder_from_flags + (args: I) + -> Result<(Builder, Box, bool), io::Error> where I: Iterator, { let matches = App::new("bindgen") From e31836fc631fc02e14d97bbaed022f4bd25065e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 8 Feb 2017 17:07:24 +0100 Subject: [PATCH 0325/2291] ir: Remove unused call to clang_Cursor_isAnonymous. Fixes #496 --- src/clang.rs | 7 ------- src/ir/comp.rs | 5 ----- 2 files changed, 12 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index ffe9d5d04d..1a346898c3 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -212,11 +212,6 @@ impl Cursor { unsafe { clang_isCursorDefinition(self.x) != 0 } } - /// Is the referent an anonymous record definition? - pub fn is_anonymous(&self) -> bool { - unsafe { clang_Cursor_isAnonymous(self.x) != 0 } - } - /// Is the referent a template specialization? pub fn is_template_specialization(&self) -> bool { self.specialized().is_some() @@ -1338,8 +1333,6 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { format!(" {}is-declaration? {}", prefix, c.is_declaration())); - print_indent(depth, - format!(" {}is-anonymous? {}", prefix, c.is_anonymous())); print_indent(depth, format!(" {}is-inlined-function? {}", prefix, diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 1ca3955993..69569efae3 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -289,9 +289,6 @@ pub struct CompInfo { /// Whether this struct layout is packed. packed: bool, - /// Whether this struct is anonymous. - is_anonymous: bool, - /// Used to know if we've found an opaque attribute that could cause us to /// generate a type with invalid layout. This is explicitly used to avoid us /// generating bad alignments when parsing types like max_align_t. @@ -335,7 +332,6 @@ impl CompInfo { has_nonempty_base: false, has_non_type_template_params: false, packed: false, - is_anonymous: false, found_unknown_attr: false, detect_derive_debug_cycle: Cell::new(false), detect_derive_default_cycle: Cell::new(false), @@ -562,7 +558,6 @@ impl CompInfo { CXCursor_ClassDecl => !cur.is_definition(), _ => false, }); - ci.is_anonymous = cursor.is_anonymous(); ci.template_args = match ty.template_args() { // In forward declarations and not specializations, // etc, they are in From f63ed7cce6b0932c0e3749ba1c6a68f9d107e66a Mon Sep 17 00:00:00 2001 From: Rafael Bachmann Date: Thu, 9 Feb 2017 16:33:43 +0100 Subject: [PATCH 0326/2291] Clarify/correct command line usage cargo installs bindgen to the local bin repo and not the current directory. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f0104fc9c9..f1a85cecb7 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,7 @@ include!(concat!(env!("OUT_DIR"), "/example.rs")); $ cargo install bindgen ``` -There are a few options documented when running `./bindgen --help`. +There are a few options documented when running `bindgen --help`. Bindgen is installed to `~/.cargo/bin`. You have to add that directory to your path to use `bindgen`. ### C++ From 5e34f0ab9b27bb6e8c43ccaf507614b3bb45bf63 Mon Sep 17 00:00:00 2001 From: faineance Date: Thu, 9 Feb 2017 22:21:45 +0000 Subject: [PATCH 0327/2291] rename llvm_stable feature, and remove references from docs --- .travis.yml | 2 +- CONTRIBUTING.md | 2 +- Cargo.toml | 2 +- bindgen-integration/Cargo.toml | 2 +- src/main.rs | 2 +- tests/tests.rs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4dd55c86ef..b3d8456243 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ rust: - stable env: - - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.8 BINDGEN_FEATURES=llvm_stable + - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.8 BINDGEN_FEATURES=__testing_only_llvm_stable - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.9 BINDGEN_FEATURES= cache: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9ee1b4ac33..a42bec24df 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -90,7 +90,7 @@ Run `cargo test` to compare generated Rust bindings to the expectations. ### Running All Tests ``` -$ cargo test [--features llvm_stable] +$ cargo test ``` ### Authoring New Tests diff --git a/Cargo.toml b/Cargo.toml index d108c2c9ad..7f505bbe16 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ version = "0.29" [features] assert_no_dangling_items = [] default = ["logging"] -llvm_stable = [] +__testing_only_llvm_stable = [] logging = ["env_logger", "log"] static = [] # This feature only exists for CI -- don't use it! diff --git a/bindgen-integration/Cargo.toml b/bindgen-integration/Cargo.toml index 9b8e341d7b..2aeec28ab9 100644 --- a/bindgen-integration/Cargo.toml +++ b/bindgen-integration/Cargo.toml @@ -11,4 +11,4 @@ bindgen = { path = ".." } gcc = "0.3" [features] -llvm_stable = ["bindgen/llvm_stable"] +__testing_only_llvm_stable = ["bindgen/__testing_only_llvm_stable"] diff --git a/src/main.rs b/src/main.rs index 68f3d0a865..2b18f1ab0d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,7 +25,7 @@ pub fn main() { let bind_args: Vec<_> = env::args().collect(); let version = clang_version(); - let expected_version = if cfg!(feature = "llvm_stable") { + let expected_version = if cfg!(feature = "__testing_only_llvm_stable") { (3, 8) } else { (3, 9) diff --git a/tests/tests.rs b/tests/tests.rs index ab1c00c3de..f1d229c563 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -84,7 +84,7 @@ fn create_bindgen_builder(header: &PathBuf) -> Result, Error> { .unwrap(); flags.extend(extra_flags.into_iter()); } else if line.contains("bindgen-unstable") && - cfg!(feature = "llvm_stable") { + cfg!(feature = "__testing_only_llvm_stable") { return Ok(None); } else if line.contains("bindgen-osx-only") { let prepend_flags = ["--raw-line", "#![cfg(target_os=\"macos\")]"]; From 979452b7b89653b7373b668eff8ebfc7c8dc5953 Mon Sep 17 00:00:00 2001 From: faineance Date: Thu, 9 Feb 2017 22:23:04 +0000 Subject: [PATCH 0328/2291] test command in contributing --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a42bec24df..3720842631 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -90,7 +90,7 @@ Run `cargo test` to compare generated Rust bindings to the expectations. ### Running All Tests ``` -$ cargo test +$ cargo test --all-features ``` ### Authoring New Tests From 0a897c91b6d4989a5566003408733a98b8fa82f5 Mon Sep 17 00:00:00 2001 From: faineance Date: Thu, 9 Feb 2017 22:25:33 +0000 Subject: [PATCH 0329/2291] fix contributing --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3720842631..328b08705c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,7 +69,7 @@ that you aren't forgetting to document types and functions. CI will catch it if you forget, but the turn around will be a lot slower ;) ``` -$ cargo build --features "llvm_stable _docs" +$ cargo build --features _docs ``` ## Testing @@ -90,7 +90,7 @@ Run `cargo test` to compare generated Rust bindings to the expectations. ### Running All Tests ``` -$ cargo test --all-features +$ cargo test [--all-features] ``` ### Authoring New Tests From bb98fbcc687f2420f0737d39dfa335b4af03e566 Mon Sep 17 00:00:00 2001 From: faineance Date: Thu, 9 Feb 2017 22:27:15 +0000 Subject: [PATCH 0330/2291] fix contributing instructions --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 328b08705c..cbaaf3c4ee 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,7 +69,7 @@ that you aren't forgetting to document types and functions. CI will catch it if you forget, but the turn around will be a lot slower ;) ``` -$ cargo build --features _docs +$ cargo build --features docs_ ``` ## Testing From 0db962b148e38cee515f1326ee9fcd4c97c143db Mon Sep 17 00:00:00 2001 From: faineance Date: Thu, 9 Feb 2017 22:31:55 +0000 Subject: [PATCH 0331/2291] remove underscore prefix from feature name --- .travis.yml | 2 +- Cargo.toml | 2 +- bindgen-integration/Cargo.toml | 2 +- src/main.rs | 2 +- tests/tests.rs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index b3d8456243..ba5ec867c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ rust: - stable env: - - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.8 BINDGEN_FEATURES=__testing_only_llvm_stable + - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.8 BINDGEN_FEATURES=testing_only_llvm_stable - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.9 BINDGEN_FEATURES= cache: diff --git a/Cargo.toml b/Cargo.toml index 7f505bbe16..9ac60ed0b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ version = "0.29" [features] assert_no_dangling_items = [] default = ["logging"] -__testing_only_llvm_stable = [] +testing_only_llvm_stable = [] logging = ["env_logger", "log"] static = [] # This feature only exists for CI -- don't use it! diff --git a/bindgen-integration/Cargo.toml b/bindgen-integration/Cargo.toml index 2aeec28ab9..3b1083d4e3 100644 --- a/bindgen-integration/Cargo.toml +++ b/bindgen-integration/Cargo.toml @@ -11,4 +11,4 @@ bindgen = { path = ".." } gcc = "0.3" [features] -__testing_only_llvm_stable = ["bindgen/__testing_only_llvm_stable"] +testing_only_llvm_stable = ["bindgen/testing_only_llvm_stable"] diff --git a/src/main.rs b/src/main.rs index 2b18f1ab0d..ea3da06d4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,7 +25,7 @@ pub fn main() { let bind_args: Vec<_> = env::args().collect(); let version = clang_version(); - let expected_version = if cfg!(feature = "__testing_only_llvm_stable") { + let expected_version = if cfg!(feature = "testing_only_llvm_stable") { (3, 8) } else { (3, 9) diff --git a/tests/tests.rs b/tests/tests.rs index f1d229c563..6b69e0d42c 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -84,7 +84,7 @@ fn create_bindgen_builder(header: &PathBuf) -> Result, Error> { .unwrap(); flags.extend(extra_flags.into_iter()); } else if line.contains("bindgen-unstable") && - cfg!(feature = "__testing_only_llvm_stable") { + cfg!(feature = "testing_only_llvm_stable") { return Ok(None); } else if line.contains("bindgen-osx-only") { let prepend_flags = ["--raw-line", "#![cfg(target_os=\"macos\")]"]; From 7e1b7d98d1da5a449ae18f6f60bac29b9079b9ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 7 Feb 2017 13:35:34 +0100 Subject: [PATCH 0332/2291] ir: Don't parse non-semantic-children cursor as inner structs. Fixes: https://github.com/servo/rust-bindgen/issues/482 --- src/codegen/mod.rs | 2 +- src/ir/comp.rs | 15 ++- tests/expectations/tests/class_nested.rs | 43 +++++++ tests/expectations/tests/layout_array.rs | 3 - .../tests/layout_cmdline_token.rs | 107 ++++++++---------- tests/expectations/tests/layout_mbuf.rs | 3 - ...ruct_containing_forward_declared_struct.rs | 42 +++---- tests/headers/class_nested.hpp | 12 ++ 8 files changed, 138 insertions(+), 89 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 7469abb981..99400f7a16 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2190,7 +2190,7 @@ impl ToRustTy for Type { .map(|arg| arg.to_rust_ty(ctx)) .collect::>(); - path.segments.last_mut().unwrap().parameters = if + path.segments.last_mut().unwrap().parameters = if template_args.is_empty() { None } else { diff --git a/src/ir/comp.rs b/src/ir/comp.rs index b02cd3429d..7c58e233cf 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -669,11 +669,20 @@ impl CompInfo { CXCursor_UnionDecl | CXCursor_ClassTemplate | CXCursor_ClassDecl => { + // We can find non-semantic children here, clang uses a + // StructDecl to note incomplete structs that hasn't been + // forward-declared before, see: + // + // https://github.com/servo/rust-bindgen/issues/482 + if cur.semantic_parent() != cursor { + return CXChildVisit_Continue; + } + let inner = Item::parse(cur, Some(potential_id), ctx) .expect("Inner ClassDecl"); - if !ci.inner_types.contains(&inner) { - ci.inner_types.push(inner); - } + + ci.inner_types.push(inner); + // A declaration of an union or a struct without name could // also be an unnamed field, unfortunately. if cur.spelling().is_empty() && diff --git a/tests/expectations/tests/class_nested.rs b/tests/expectations/tests/class_nested.rs index 19d70e5034..6ddcf91b23 100644 --- a/tests/expectations/tests/class_nested.rs +++ b/tests/expectations/tests/class_nested.rs @@ -29,6 +29,34 @@ fn bindgen_test_layout_A_B() { impl Clone for A_B { fn clone(&self) -> Self { *self } } +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct A_C { + pub baz: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_A_C() { + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( A_C ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( A_C ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const A_C ) ) . baz as * const _ as usize } , + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A_C ) , "::" , + stringify ! ( baz ) )); +} +impl Clone for A_C { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct A_D { + pub foo: T, +} +impl Default for A_D { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[test] fn bindgen_test_layout_A() { assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( @@ -48,6 +76,21 @@ extern "C" { #[link_name = "var"] pub static mut var: A_B; } +#[test] +fn __bindgen_test_layout_template_1() { + assert_eq!(::std::mem::size_of::>() , 4usize , + concat ! ( + "Size of template specialization: " , stringify ! ( + A_D<::std::os::raw::c_int> ) )); + assert_eq!(::std::mem::align_of::>() , 4usize , + concat ! ( + "Alignment of template specialization: " , stringify ! ( + A_D<::std::os::raw::c_int> ) )); +} +extern "C" { + #[link_name = "baz"] + pub static mut baz: A_D<::std::os::raw::c_int>; +} #[repr(C)] #[derive(Debug, Default, Copy)] pub struct D { diff --git a/tests/expectations/tests/layout_array.rs b/tests/expectations/tests/layout_array.rs index 3f86cda9a5..facf9462aa 100644 --- a/tests/expectations/tests/layout_array.rs +++ b/tests/expectations/tests/layout_array.rs @@ -202,9 +202,6 @@ pub struct malloc_heap { pub struct malloc_heap__bindgen_ty_1 { pub lh_first: *mut malloc_heap__bindgen_ty_1_malloc_elem, } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct malloc_heap__bindgen_ty_1_malloc_elem([u8; 0]); #[test] fn bindgen_test_layout_malloc_heap__bindgen_ty_1() { assert_eq!(::std::mem::size_of::() , 8usize , diff --git a/tests/expectations/tests/layout_cmdline_token.rs b/tests/expectations/tests/layout_cmdline_token.rs index 35127399e3..791ea9b3e2 100644 --- a/tests/expectations/tests/layout_cmdline_token.rs +++ b/tests/expectations/tests/layout_cmdline_token.rs @@ -11,9 +11,33 @@ #[repr(C)] #[derive(Debug, Copy)] pub struct cmdline_token_hdr { - pub ops: *mut cmdline_token_hdr_cmdline_token_ops, + pub ops: *mut cmdline_token_ops, pub offset: ::std::os::raw::c_uint, } +#[test] +fn bindgen_test_layout_cmdline_token_hdr() { + assert_eq!(::std::mem::size_of::() , 16usize , concat ! + ( "Size of: " , stringify ! ( cmdline_token_hdr ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat + ! ( "Alignment of " , stringify ! ( cmdline_token_hdr ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_hdr ) ) . ops as * const _ + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_hdr ) , + "::" , stringify ! ( ops ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const cmdline_token_hdr ) ) . offset as * const + _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_hdr ) , + "::" , stringify ! ( offset ) )); +} +impl Clone for cmdline_token_hdr { + fn clone(&self) -> Self { *self } +} +impl Default for cmdline_token_hdr { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +pub type cmdline_parse_token_hdr_t = cmdline_token_hdr; /** * A token is defined by this structure. * @@ -35,7 +59,7 @@ pub struct cmdline_token_hdr { */ #[repr(C)] #[derive(Debug, Copy)] -pub struct cmdline_token_hdr_cmdline_token_ops { +pub struct cmdline_token_ops { /** parse(token ptr, buf, res pts, buf len) */ pub parse: ::std::option::Option ::std::os::raw::c_int>, } #[test] -fn bindgen_test_layout_cmdline_token_hdr_cmdline_token_ops() { - assert_eq!(::std::mem::size_of::() , - 32usize , concat ! ( - "Size of: " , stringify ! ( cmdline_token_hdr_cmdline_token_ops - ) )); - assert_eq! (::std::mem::align_of::() - , 8usize , concat ! ( - "Alignment of " , stringify ! ( - cmdline_token_hdr_cmdline_token_ops ) )); +fn bindgen_test_layout_cmdline_token_ops() { + assert_eq!(::std::mem::size_of::() , 32usize , concat ! + ( "Size of: " , stringify ! ( cmdline_token_ops ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat + ! ( "Alignment of " , stringify ! ( cmdline_token_ops ) )); assert_eq! (unsafe { - & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . - parse as * const _ as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( - cmdline_token_hdr_cmdline_token_ops ) , "::" , stringify ! ( - parse ) )); + & ( * ( 0 as * const cmdline_token_ops ) ) . parse as * const + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_ops ) , + "::" , stringify ! ( parse ) )); assert_eq! (unsafe { - & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . - complete_get_nb as * const _ as usize } , 8usize , concat ! ( - "Alignment of field: " , stringify ! ( - cmdline_token_hdr_cmdline_token_ops ) , "::" , stringify ! ( - complete_get_nb ) )); + & ( * ( 0 as * const cmdline_token_ops ) ) . complete_get_nb + as * const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_ops ) , + "::" , stringify ! ( complete_get_nb ) )); assert_eq! (unsafe { - & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . - complete_get_elt as * const _ as usize } , 16usize , concat ! - ( - "Alignment of field: " , stringify ! ( - cmdline_token_hdr_cmdline_token_ops ) , "::" , stringify ! ( - complete_get_elt ) )); + & ( * ( 0 as * const cmdline_token_ops ) ) . complete_get_elt + as * const _ as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_ops ) , + "::" , stringify ! ( complete_get_elt ) )); assert_eq! (unsafe { - & ( * ( 0 as * const cmdline_token_hdr_cmdline_token_ops ) ) . - get_help as * const _ as usize } , 24usize , concat ! ( - "Alignment of field: " , stringify ! ( - cmdline_token_hdr_cmdline_token_ops ) , "::" , stringify ! ( - get_help ) )); + & ( * ( 0 as * const cmdline_token_ops ) ) . get_help as * + const _ as usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( cmdline_token_ops ) , + "::" , stringify ! ( get_help ) )); } -impl Clone for cmdline_token_hdr_cmdline_token_ops { +impl Clone for cmdline_token_ops { fn clone(&self) -> Self { *self } } -impl Default for cmdline_token_hdr_cmdline_token_ops { +impl Default for cmdline_token_ops { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -#[test] -fn bindgen_test_layout_cmdline_token_hdr() { - assert_eq!(::std::mem::size_of::() , 16usize , concat ! - ( "Size of: " , stringify ! ( cmdline_token_hdr ) )); - assert_eq! (::std::mem::align_of::() , 8usize , concat - ! ( "Alignment of " , stringify ! ( cmdline_token_hdr ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const cmdline_token_hdr ) ) . ops as * const _ - as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( cmdline_token_hdr ) , - "::" , stringify ! ( ops ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const cmdline_token_hdr ) ) . offset as * const - _ as usize } , 8usize , concat ! ( - "Alignment of field: " , stringify ! ( cmdline_token_hdr ) , - "::" , stringify ! ( offset ) )); -} -impl Clone for cmdline_token_hdr { - fn clone(&self) -> Self { *self } -} -impl Default for cmdline_token_hdr { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} -pub type cmdline_parse_token_hdr_t = cmdline_token_hdr; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum cmdline_numtype { diff --git a/tests/expectations/tests/layout_mbuf.rs b/tests/expectations/tests/layout_mbuf.rs index c0c2cce28b..7bd3bf1af6 100644 --- a/tests/expectations/tests/layout_mbuf.rs +++ b/tests/expectations/tests/layout_mbuf.rs @@ -490,9 +490,6 @@ impl Clone for rte_mbuf__bindgen_ty_4 { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rte_mbuf_rte_mempool([u8; 0]); -#[repr(C)] #[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_5 { /**< combined for easy fetch */ diff --git a/tests/expectations/tests/struct_containing_forward_declared_struct.rs b/tests/expectations/tests/struct_containing_forward_declared_struct.rs index ff16490a3a..58ab04c946 100644 --- a/tests/expectations/tests/struct_containing_forward_declared_struct.rs +++ b/tests/expectations/tests/struct_containing_forward_declared_struct.rs @@ -7,27 +7,7 @@ #[repr(C)] #[derive(Debug, Copy)] pub struct a { - pub val_a: *mut a_b, -} -#[repr(C)] -#[derive(Debug, Default, Copy)] -pub struct a_b { - pub val_b: ::std::os::raw::c_int, -} -#[test] -fn bindgen_test_layout_a_b() { - assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( - "Size of: " , stringify ! ( a_b ) )); - assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( - "Alignment of " , stringify ! ( a_b ) )); - assert_eq! (unsafe { - & ( * ( 0 as * const a_b ) ) . val_b as * const _ as usize } , - 0usize , concat ! ( - "Alignment of field: " , stringify ! ( a_b ) , "::" , - stringify ! ( val_b ) )); -} -impl Clone for a_b { - fn clone(&self) -> Self { *self } + pub val_a: *mut b, } #[test] fn bindgen_test_layout_a() { @@ -47,3 +27,23 @@ impl Clone for a { impl Default for a { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct b { + pub val_b: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_b() { + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( b ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( b ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const b ) ) . val_b as * const _ as usize } , + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( b ) , "::" , stringify + ! ( val_b ) )); +} +impl Clone for b { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/class_nested.hpp b/tests/headers/class_nested.hpp index ab38d50067..ccf2f8954e 100644 --- a/tests/headers/class_nested.hpp +++ b/tests/headers/class_nested.hpp @@ -4,9 +4,21 @@ class A { class B { int member_b; }; + + class C; + + template + class D { + T foo; + }; +}; + +class A::C { + int baz; }; A::B var; +A::D baz; class D { A::B member; From fc7a5e47ebb1b1ac3afab3faa4a44b20c16ec1c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 7 Feb 2017 14:21:38 +0100 Subject: [PATCH 0333/2291] Remove duplicated functions that had sneaked in. --- src/clang.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index bcb22e06ad..5da42b5249 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -1482,9 +1482,6 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { print_cursor(depth, String::from(prefix) + "referenced.", &refd); - print_cursor(depth, - String::from(prefix) + "referenced.", - &refd); } } @@ -1494,9 +1491,6 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { print_cursor(depth, String::from(prefix) + "canonical.", &canonical); - print_cursor(depth, - String::from(prefix) + "canonical.", - &canonical); } if let Some(specialized) = c.specialized() { @@ -1505,9 +1499,6 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { print_cursor(depth, String::from(prefix) + "specialized.", &specialized); - print_cursor(depth, - String::from(prefix) + "specialized.", - &specialized); } } } From 331ecab3404051662aece2fce3e07c9fd4387718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 8 Feb 2017 17:03:48 +0100 Subject: [PATCH 0334/2291] ir: Cut the parenthood chain in pointers, references and arrays. --- src/ir/ty.rs | 14 ++++++-------- tests/expectations/tests/layout_array.rs | 10 +++++++++- tests/expectations/tests/layout_mbuf.rs | 11 ++++++++++- tests/expectations/tests/template.rs | 11 +++++++++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index a98ca446a7..a47c14706c 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1026,9 +1026,7 @@ impl Type { CXType_MemberPointer | CXType_Pointer => { let inner = Item::from_ty_or_ref(ty.pointee_type().unwrap(), - location, - parent_id, - ctx); + location, None, ctx); TypeKind::Pointer(inner) } CXType_BlockPointer => TypeKind::BlockPointer, @@ -1038,7 +1036,7 @@ impl Type { CXType_LValueReference => { let inner = Item::from_ty_or_ref(ty.pointee_type().unwrap(), location, - parent_id, + None, ctx); TypeKind::Reference(inner) } @@ -1047,7 +1045,7 @@ impl Type { CXType_DependentSizedArray => { let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), location, - parent_id, + None, ctx) .expect("Not able to resolve array element?"); TypeKind::Pointer(inner) @@ -1055,7 +1053,7 @@ impl Type { CXType_IncompleteArray => { let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), location, - parent_id, + None, ctx) .expect("Not able to resolve array element?"); TypeKind::Array(inner, 0) @@ -1070,7 +1068,7 @@ impl Type { CXType_Typedef => { let inner = cursor.typedef_type().expect("Not valid Type?"); let inner = - Item::from_ty_or_ref(inner, location, parent_id, ctx); + Item::from_ty_or_ref(inner, location, None, ctx); TypeKind::Alias(inner) } CXType_Enum => { @@ -1092,7 +1090,7 @@ impl Type { CXType_ConstantArray => { let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), location, - parent_id, + None, ctx) .expect("Not able to resolve array element?"); TypeKind::Array(inner, ty.num_elements().unwrap()) diff --git a/tests/expectations/tests/layout_array.rs b/tests/expectations/tests/layout_array.rs index facf9462aa..c28d3ec843 100644 --- a/tests/expectations/tests/layout_array.rs +++ b/tests/expectations/tests/layout_array.rs @@ -200,7 +200,7 @@ pub struct malloc_heap { #[repr(C)] #[derive(Debug, Copy)] pub struct malloc_heap__bindgen_ty_1 { - pub lh_first: *mut malloc_heap__bindgen_ty_1_malloc_elem, + pub lh_first: *mut malloc_elem, } #[test] fn bindgen_test_layout_malloc_heap__bindgen_ty_1() { @@ -255,3 +255,11 @@ impl Clone for malloc_heap { impl Default for malloc_heap { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct malloc_elem { + pub _address: u8, +} +impl Clone for malloc_elem { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/layout_mbuf.rs b/tests/expectations/tests/layout_mbuf.rs index 7bd3bf1af6..189b50a5d4 100644 --- a/tests/expectations/tests/layout_mbuf.rs +++ b/tests/expectations/tests/layout_mbuf.rs @@ -98,7 +98,7 @@ pub struct rte_mbuf { pub cacheline1: MARKER, pub __bindgen_anon_3: rte_mbuf__bindgen_ty_4, /**< Pool from which mbuf was allocated. */ - pub pool: *mut rte_mbuf_rte_mempool, + pub pool: *mut rte_mempool, /**< Next segment of scattered packet. */ pub next: *mut rte_mbuf, pub __bindgen_anon_4: rte_mbuf__bindgen_ty_5, @@ -731,3 +731,12 @@ impl Clone for rte_mbuf { impl Default for rte_mbuf { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } +/**< Pool from which mbuf was allocated. */ +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct rte_mempool { + pub _address: u8, +} +impl Clone for rte_mempool { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/template.rs b/tests/expectations/tests/template.rs index 131a54fdae..3c829f070e 100644 --- a/tests/expectations/tests/template.rs +++ b/tests/expectations/tests/template.rs @@ -258,6 +258,17 @@ fn __bindgen_test_layout_template_1() { } #[test] fn __bindgen_test_layout_template_2() { + assert_eq!(::std::mem::size_of::>() , + 24usize , concat ! ( + "Size of template specialization: " , stringify ! ( + Rooted<*mut ::std::os::raw::c_void> ) )); + assert_eq!(::std::mem::align_of::>() , + 8usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + Rooted<*mut ::std::os::raw::c_void> ) )); +} +#[test] +fn __bindgen_test_layout_template_3() { assert_eq!(::std::mem::size_of::>() , 4usize , concat ! ( "Size of template specialization: " , stringify ! ( From c952b14b651e45e4ad5d438c2c10e329d804e9bf Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Fri, 10 Feb 2017 12:13:42 +1100 Subject: [PATCH 0335/2291] Don't mangle name in partial specification --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/clang.rs | 1 + .../tests/template_partial_specification.rs | 7 +++++++ tests/headers/template_partial_specification.hpp | 10 ++++++++++ 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 tests/expectations/tests/template_partial_specification.rs create mode 100644 tests/headers/template_partial_specification.hpp diff --git a/Cargo.lock b/Cargo.lock index 0acb10e823..0958343507 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ [root] name = "bindgen" -version = "0.21.2" +version = "0.21.3" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index d108c2c9ad..c88f949ac1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.21.2" +version = "0.21.3" build = "build.rs" exclude = ["tests/headers", "tests/expectations", "bindgen-integration", "ci"] diff --git a/src/clang.rs b/src/clang.rs index bcb22e06ad..84609ca696 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -225,6 +225,7 @@ impl Cursor { /// remaining free template arguments? pub fn is_fully_specialized_template(&self) -> bool { self.is_template_specialization() && + self.kind() != CXCursor_ClassTemplatePartialSpecialization && self.num_template_args().unwrap_or(0) > 0 } diff --git a/tests/expectations/tests/template_partial_specification.rs b/tests/expectations/tests/template_partial_specification.rs new file mode 100644 index 0000000000..b4b7b2bcee --- /dev/null +++ b/tests/expectations/tests/template_partial_specification.rs @@ -0,0 +1,7 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + + diff --git a/tests/headers/template_partial_specification.hpp b/tests/headers/template_partial_specification.hpp new file mode 100644 index 0000000000..fe1be65868 --- /dev/null +++ b/tests/headers/template_partial_specification.hpp @@ -0,0 +1,10 @@ +// bindgen-flags: -- --target=x86_64-pc-win32 + +template +struct nsRunnableMethodTraits; + +template +struct nsRunnableMethodTraits +{ + static const bool can_cancel = Cancelable; +}; From 57416dfc1aa7389e311f8699d40adad787826e22 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 10 Feb 2017 13:14:15 -0800 Subject: [PATCH 0336/2291] Rename WhitelistedItemsIter to ItemTraversal Also moves it out to its own ir::traversal module, and moves ItemSet to the ir::item module. --- src/codegen/mod.rs | 3 +- src/ir/comp.rs | 4 +-- src/ir/context.rs | 69 +++-------------------------------- src/ir/function.rs | 4 +-- src/ir/item.rs | 6 +++- src/ir/mod.rs | 1 + src/ir/traversal.rs | 78 ++++++++++++++++++++++++++++++++++++++++ src/ir/ty.rs | 4 +-- src/ir/type_collector.rs | 7 ++-- 9 files changed, 98 insertions(+), 78 deletions(-) create mode 100644 src/ir/traversal.rs diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 99400f7a16..6f9291f77d 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -12,13 +12,12 @@ use ir::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; use ir::function::{Function, FunctionSig}; use ir::int::IntKind; -use ir::item::{Item, ItemAncestors, ItemCanonicalName, ItemCanonicalPath}; +use ir::item::{Item, ItemSet, ItemAncestors, ItemCanonicalName, ItemCanonicalPath}; use ir::item_kind::ItemKind; use ir::layout::Layout; use ir::module::Module; use ir::objc::ObjCInterface; use ir::ty::{Type, TypeKind}; -use ir::type_collector::ItemSet; use ir::var::Var; use std::borrow::Cow; diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 7c58e233cf..2ca254799d 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -3,10 +3,10 @@ use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; -use super::item::Item; +use super::item::{Item, ItemSet}; use super::layout::Layout; use super::ty::{TemplateDeclaration, Type}; -use super::type_collector::{ItemSet, TypeCollector}; +use super::type_collector::TypeCollector; use clang; use parse::{ClangItemParser, ParseError}; use std::cell::Cell; diff --git a/src/ir/context.rs b/src/ir/context.rs index 91ce579c33..e251f0c393 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -2,11 +2,12 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::int::IntKind; -use super::item::{Item, ItemCanonicalPath}; +use super::item::{Item, ItemSet, ItemCanonicalPath}; use super::item_kind::ItemKind; use super::module::{Module, ModuleKind}; +use super::traversal::ItemTraversal; use super::ty::{FloatKind, TemplateDeclaration, Type, TypeKind}; -use super::type_collector::{ItemSet, TypeCollector}; +use super::type_collector::TypeCollector; use BindgenOptions; use cexpr; use chooser::TypeChooser; @@ -1203,7 +1204,7 @@ impl<'ctx> BindgenContext<'ctx> { /// If no items are explicitly whitelisted, then all items are considered /// whitelisted. pub fn whitelisted_items<'me>(&'me self) - -> WhitelistedItemsIter<'me, 'ctx> { + -> ItemTraversal<'me, 'ctx> { assert!(self.in_codegen_phase()); assert!(self.current_module == self.root_module); @@ -1268,18 +1269,7 @@ impl<'ctx> BindgenContext<'ctx> { }) .map(|(&id, _)| id); - let seen: ItemSet = roots.collect(); - - // The .rev() preserves the expected ordering traversal, resulting in - // more stable-ish bindgen-generated names for anonymous types (like - // unions). - let to_iterate = seen.iter().cloned().rev().collect(); - - WhitelistedItemsIter { - ctx: self, - seen: seen, - to_iterate: to_iterate, - } + ItemTraversal::new(self, roots) } /// Convenient method for getting the prefix to use for most traits in @@ -1365,55 +1355,6 @@ impl TemplateDeclaration for PartialType { } } -/// An iterator over whitelisted items. -/// -/// See `BindgenContext::whitelisted_items` for more information. -pub struct WhitelistedItemsIter<'ctx, 'gen> - where 'gen: 'ctx, -{ - ctx: &'ctx BindgenContext<'gen>, - - /// The set of whitelisted items we have seen. If you think of traversing - /// whitelisted items like GC tracing, this is the mark bits, and contains - /// both black and gray items. - seen: ItemSet, - - /// The set of whitelisted items that we have seen but have yet to iterate - /// over and collect transitive references from. To return to the GC analogy, - /// this is the mark stack, containing the set of gray items which we have - /// not finished tracing yet. - to_iterate: Vec, -} - -impl<'ctx, 'gen> Iterator for WhitelistedItemsIter<'ctx, 'gen> - where 'gen: 'ctx, -{ - type Item = ItemId; - - fn next(&mut self) -> Option { - let id = match self.to_iterate.pop() { - None => return None, - Some(id) => id, - }; - - debug_assert!(self.seen.contains(&id)); - debug_assert!(self.ctx.items.contains_key(&id)); - - if self.ctx.options().whitelist_recursively { - let mut sub_types = ItemSet::new(); - id.collect_types(self.ctx, &mut sub_types, &()); - - for id in sub_types { - if self.seen.insert(id) { - self.to_iterate.push(id); - } - } - } - - Some(id) - } -} - /// An iterator to find any dangling items. /// /// See `BindgenContext::assert_no_dangling_item_traversal` for more diff --git a/src/ir/function.rs b/src/ir/function.rs index 6273de283b..be8c49d5f5 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -1,9 +1,9 @@ //! Intermediate representation for C/C++ functions and methods. use super::context::{BindgenContext, ItemId}; -use super::item::Item; +use super::item::{Item, ItemSet}; use super::ty::TypeKind; -use super::type_collector::{ItemSet, TypeCollector}; +use super::type_collector::TypeCollector; use clang; use clang_sys::CXCallingConv; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; diff --git a/src/ir/item.rs b/src/ir/item.rs index 83e2a41f4e..2717c79270 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -7,11 +7,12 @@ use super::function::Function; use super::item_kind::ItemKind; use super::module::Module; use super::ty::{TemplateDeclaration, Type, TypeKind}; -use super::type_collector::{ItemSet, TypeCollector}; +use super::type_collector::TypeCollector; use clang; use clang_sys; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use std::cell::{Cell, RefCell}; +use std::collections::BTreeSet; use std::fmt::Write; use std::iter; @@ -902,6 +903,9 @@ impl Item { } } +/// A set of items. +pub type ItemSet = BTreeSet; + impl TemplateDeclaration for ItemId { fn template_params(&self, ctx: &BindgenContext) -> Option> { ctx.resolve_item_fallible(*self) diff --git a/src/ir/mod.rs b/src/ir/mod.rs index d424fcdfaa..9e53c1846a 100644 --- a/src/ir/mod.rs +++ b/src/ir/mod.rs @@ -14,6 +14,7 @@ pub mod item; pub mod item_kind; pub mod layout; pub mod module; +pub mod traversal; pub mod ty; pub mod type_collector; pub mod var; diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs new file mode 100644 index 0000000000..d8e9a6e2e8 --- /dev/null +++ b/src/ir/traversal.rs @@ -0,0 +1,78 @@ +//! Traversal of the graph of IR items and types. + +use super::context::{BindgenContext, ItemId}; +use super::item::ItemSet; +use super::type_collector::TypeCollector; + +/// An graph traversal of the transitive closure of references between items. +/// +/// See `BindgenContext::whitelisted_items` for more information. +pub struct ItemTraversal<'ctx, 'gen> + where 'gen: 'ctx, +{ + ctx: &'ctx BindgenContext<'gen>, + + /// The set of whitelisted items we have seen. If you think of traversing + /// whitelisted items like GC tracing, this is the mark bits, and contains + /// both black and gray items. + seen: ItemSet, + + /// The set of whitelisted items that we have seen but have yet to iterate + /// over and collect transitive references from. To return to the GC analogy, + /// this is the mark stack, containing the set of gray items which we have + /// not finished tracing yet. + to_iterate: Vec, +} + +impl<'ctx, 'gen> ItemTraversal<'ctx, 'gen> + where 'gen: 'ctx, +{ + /// Begin a new traversal, starting from the given roots. + pub fn new(ctx: &'ctx BindgenContext<'gen>, + roots: R) + -> ItemTraversal<'ctx, 'gen> + where R: IntoIterator, + { + // Construct the ItemSet first. Because its underlying storage is a + // BTreeSet, its iteration over its entries is ordered, and the roots + // end up ordered as well. This contributes enables stable, + // deterministic generated names in the bindings. + let seen: ItemSet = roots.into_iter().collect(); + let roots: Vec<_> = seen.iter().cloned().collect(); + + ItemTraversal { + ctx: ctx, + seen: seen, + to_iterate: roots, + } + } +} + +impl<'ctx, 'gen> Iterator for ItemTraversal<'ctx, 'gen> + where 'gen: 'ctx, +{ + type Item = ItemId; + + fn next(&mut self) -> Option { + let id = match self.to_iterate.pop() { + None => return None, + Some(id) => id, + }; + + debug_assert!(self.seen.contains(&id)); + debug_assert!(self.ctx.resolve_item_fallible(id).is_some()); + + if self.ctx.options().whitelist_recursively { + let mut sub_types = ItemSet::new(); + id.collect_types(self.ctx, &mut sub_types, &()); + + for id in sub_types { + if self.seen.insert(id) { + self.to_iterate.push(id); + } + } + } + + Some(id) + } +} diff --git a/src/ir/ty.rs b/src/ir/ty.rs index a47c14706c..b51054b741 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -6,10 +6,10 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::enum_ty::Enum; use super::function::FunctionSig; use super::int::IntKind; -use super::item::Item; +use super::item::{Item, ItemSet}; use super::layout::Layout; use super::objc::ObjCInterface; -use super::type_collector::{ItemSet, TypeCollector}; +use super::type_collector::TypeCollector; use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; use std::mem; diff --git a/src/ir/type_collector.rs b/src/ir/type_collector.rs index 25285b23f2..424007a18f 100644 --- a/src/ir/type_collector.rs +++ b/src/ir/type_collector.rs @@ -1,10 +1,7 @@ //! Collecting type items. -use super::context::{BindgenContext, ItemId}; -use std::collections::BTreeSet; - -/// A set of items. -pub type ItemSet = BTreeSet; +use super::context::BindgenContext; +use super::item::ItemSet; /// Collect all the type items referenced by this item. pub trait TypeCollector { From b94b2716765f0deed29845879ac009b8b53921e0 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 10 Feb 2017 13:20:17 -0800 Subject: [PATCH 0337/2291] Move TypeCollector to the ir::traversal module --- src/ir/comp.rs | 2 +- src/ir/context.rs | 3 +-- src/ir/function.rs | 2 +- src/ir/item.rs | 2 +- src/ir/mod.rs | 1 - src/ir/traversal.rs | 16 +++++++++++++++- src/ir/ty.rs | 2 +- src/ir/type_collector.rs | 19 ------------------- 8 files changed, 20 insertions(+), 27 deletions(-) delete mode 100644 src/ir/type_collector.rs diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 2ca254799d..e829b912aa 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -6,7 +6,7 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::item::{Item, ItemSet}; use super::layout::Layout; use super::ty::{TemplateDeclaration, Type}; -use super::type_collector::TypeCollector; +use super::traversal::TypeCollector; use clang; use parse::{ClangItemParser, ParseError}; use std::cell::Cell; diff --git a/src/ir/context.rs b/src/ir/context.rs index e251f0c393..cc2ee560b9 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -5,9 +5,8 @@ use super::int::IntKind; use super::item::{Item, ItemSet, ItemCanonicalPath}; use super::item_kind::ItemKind; use super::module::{Module, ModuleKind}; -use super::traversal::ItemTraversal; +use super::traversal::{ItemTraversal, TypeCollector}; use super::ty::{FloatKind, TemplateDeclaration, Type, TypeKind}; -use super::type_collector::TypeCollector; use BindgenOptions; use cexpr; use chooser::TypeChooser; diff --git a/src/ir/function.rs b/src/ir/function.rs index be8c49d5f5..17d0353241 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -3,7 +3,7 @@ use super::context::{BindgenContext, ItemId}; use super::item::{Item, ItemSet}; use super::ty::TypeKind; -use super::type_collector::TypeCollector; +use super::traversal::TypeCollector; use clang; use clang_sys::CXCallingConv; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; diff --git a/src/ir/item.rs b/src/ir/item.rs index 2717c79270..86fe652542 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -7,7 +7,7 @@ use super::function::Function; use super::item_kind::ItemKind; use super::module::Module; use super::ty::{TemplateDeclaration, Type, TypeKind}; -use super::type_collector::TypeCollector; +use super::traversal::TypeCollector; use clang; use clang_sys; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; diff --git a/src/ir/mod.rs b/src/ir/mod.rs index 9e53c1846a..9fe0beb590 100644 --- a/src/ir/mod.rs +++ b/src/ir/mod.rs @@ -16,6 +16,5 @@ pub mod layout; pub mod module; pub mod traversal; pub mod ty; -pub mod type_collector; pub mod var; pub mod objc; diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs index d8e9a6e2e8..442c54497b 100644 --- a/src/ir/traversal.rs +++ b/src/ir/traversal.rs @@ -2,7 +2,21 @@ use super::context::{BindgenContext, ItemId}; use super::item::ItemSet; -use super::type_collector::TypeCollector; + +/// Collect all the type items referenced by this item. +pub trait TypeCollector { + /// If a particular type needs extra information beyond what it has in + /// `self` and `context` to find its referenced type items, its + /// implementation can define this associated type, forcing callers to pass + /// the needed information through. + type Extra; + + /// Add each type item referenced by `self` into the `types` set. + fn collect_types(&self, + context: &BindgenContext, + types: &mut ItemSet, + extra: &Self::Extra); +} /// An graph traversal of the transitive closure of references between items. /// diff --git a/src/ir/ty.rs b/src/ir/ty.rs index b51054b741..c9ee453cc5 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -9,7 +9,7 @@ use super::int::IntKind; use super::item::{Item, ItemSet}; use super::layout::Layout; use super::objc::ObjCInterface; -use super::type_collector::TypeCollector; +use super::traversal::TypeCollector; use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; use std::mem; diff --git a/src/ir/type_collector.rs b/src/ir/type_collector.rs deleted file mode 100644 index 424007a18f..0000000000 --- a/src/ir/type_collector.rs +++ /dev/null @@ -1,19 +0,0 @@ -//! Collecting type items. - -use super::context::BindgenContext; -use super::item::ItemSet; - -/// Collect all the type items referenced by this item. -pub trait TypeCollector { - /// If a particular type needs extra information beyond what it has in - /// `self` and `context` to find its referenced type items, its - /// implementation can define this associated type, forcing callers to pass - /// the needed information through. - type Extra; - - /// Add each type item referenced by `self` into the `types` set. - fn collect_types(&self, - context: &BindgenContext, - types: &mut ItemSet, - extra: &Self::Extra); -} From a0bb2ce70e71d8758213b65a2d61fd5a8a97ab89 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 10 Feb 2017 13:24:11 -0800 Subject: [PATCH 0338/2291] Rename ir::traversal::TypeCollector to ir::traversal::Trace And its `collect_types` method to `trace`. --- src/ir/comp.rs | 6 +++--- src/ir/context.rs | 4 ++-- src/ir/function.rs | 6 +++--- src/ir/item.rs | 14 +++++++------- src/ir/traversal.rs | 6 +++--- src/ir/ty.rs | 10 +++++----- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/ir/comp.rs b/src/ir/comp.rs index e829b912aa..bcc386ad79 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -6,7 +6,7 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::item::{Item, ItemSet}; use super::layout::Layout; use super::ty::{TemplateDeclaration, Type}; -use super::traversal::TypeCollector; +use super::traversal::Trace; use clang; use parse::{ClangItemParser, ParseError}; use std::cell::Cell; @@ -1075,10 +1075,10 @@ impl<'a> CanDeriveCopy<'a> for CompInfo { } } -impl TypeCollector for CompInfo { +impl Trace for CompInfo { type Extra = Item; - fn collect_types(&self, + fn trace(&self, context: &BindgenContext, types: &mut ItemSet, item: &Item) { diff --git a/src/ir/context.rs b/src/ir/context.rs index cc2ee560b9..7ce7f775ed 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -5,7 +5,7 @@ use super::int::IntKind; use super::item::{Item, ItemSet, ItemCanonicalPath}; use super::item_kind::ItemKind; use super::module::{Module, ModuleKind}; -use super::traversal::{ItemTraversal, TypeCollector}; +use super::traversal::{ItemTraversal, Trace}; use super::ty::{FloatKind, TemplateDeclaration, Type, TypeKind}; use BindgenOptions; use cexpr; @@ -1393,7 +1393,7 @@ impl<'ctx, 'gen> Iterator for AssertNoDanglingItemIter<'ctx, 'gen> }; let mut sub_types = ItemSet::new(); - id.collect_types(self.ctx, &mut sub_types, &()); + id.trace(self.ctx, &mut sub_types, &()); if self.ctx.resolve_item_fallible(id).is_none() { let mut path = vec![]; diff --git a/src/ir/function.rs b/src/ir/function.rs index 17d0353241..7beb35a4ae 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -3,7 +3,7 @@ use super::context::{BindgenContext, ItemId}; use super::item::{Item, ItemSet}; use super::ty::TypeKind; -use super::traversal::TypeCollector; +use super::traversal::Trace; use clang; use clang_sys::CXCallingConv; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; @@ -316,10 +316,10 @@ impl ClangSubItemParser for Function { } } -impl TypeCollector for FunctionSig { +impl Trace for FunctionSig { type Extra = Item; - fn collect_types(&self, + fn trace(&self, _context: &BindgenContext, types: &mut ItemSet, _item: &Item) { diff --git a/src/ir/item.rs b/src/ir/item.rs index 86fe652542..04831f7512 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -7,7 +7,7 @@ use super::function::Function; use super::item_kind::ItemKind; use super::module::Module; use super::ty::{TemplateDeclaration, Type, TypeKind}; -use super::traversal::TypeCollector; +use super::traversal::Trace; use clang; use clang_sys; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; @@ -167,21 +167,21 @@ impl ItemAncestors for Item { } } -impl TypeCollector for ItemId { +impl Trace for ItemId { type Extra = (); - fn collect_types(&self, + fn trace(&self, ctx: &BindgenContext, types: &mut ItemSet, extra: &()) { - ctx.resolve_item(*self).collect_types(ctx, types, extra); + ctx.resolve_item(*self).trace(ctx, types, extra); } } -impl TypeCollector for Item { +impl Trace for Item { type Extra = (); - fn collect_types(&self, + fn trace(&self, ctx: &BindgenContext, types: &mut ItemSet, _extra: &()) { @@ -196,7 +196,7 @@ impl TypeCollector for Item { // opaque. if ty.should_be_traced_unconditionally() || !self.is_opaque(ctx) { - ty.collect_types(ctx, types, self); + ty.trace(ctx, types, self); } } ItemKind::Function(ref fun) => { diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs index 442c54497b..4965b6cb8b 100644 --- a/src/ir/traversal.rs +++ b/src/ir/traversal.rs @@ -4,7 +4,7 @@ use super::context::{BindgenContext, ItemId}; use super::item::ItemSet; /// Collect all the type items referenced by this item. -pub trait TypeCollector { +pub trait Trace { /// If a particular type needs extra information beyond what it has in /// `self` and `context` to find its referenced type items, its /// implementation can define this associated type, forcing callers to pass @@ -12,7 +12,7 @@ pub trait TypeCollector { type Extra; /// Add each type item referenced by `self` into the `types` set. - fn collect_types(&self, + fn trace(&self, context: &BindgenContext, types: &mut ItemSet, extra: &Self::Extra); @@ -78,7 +78,7 @@ impl<'ctx, 'gen> Iterator for ItemTraversal<'ctx, 'gen> if self.ctx.options().whitelist_recursively { let mut sub_types = ItemSet::new(); - id.collect_types(self.ctx, &mut sub_types, &()); + id.trace(self.ctx, &mut sub_types, &()); for id in sub_types { if self.seen.insert(id) { diff --git a/src/ir/ty.rs b/src/ir/ty.rs index c9ee453cc5..030b012e77 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -9,7 +9,7 @@ use super::int::IntKind; use super::item::{Item, ItemSet}; use super::layout::Layout; use super::objc::ObjCInterface; -use super::traversal::TypeCollector; +use super::traversal::Trace; use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; use std::mem; @@ -1125,10 +1125,10 @@ impl Type { } } -impl TypeCollector for Type { +impl Trace for Type { type Extra = Item; - fn collect_types(&self, + fn trace(&self, context: &BindgenContext, types: &mut ItemSet, item: &Item) { @@ -1148,9 +1148,9 @@ impl TypeCollector for Type { types.insert(item); } } - TypeKind::Comp(ref ci) => ci.collect_types(context, types, item), + TypeKind::Comp(ref ci) => ci.trace(context, types, item), TypeKind::Function(ref sig) => { - sig.collect_types(context, types, item) + sig.trace(context, types, item) } TypeKind::Enum(ref en) => { if let Some(repr) = en.repr() { From 67ff630d656e3c422f28b02c6b6e2c057ab3282d Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 10 Feb 2017 17:00:53 -0800 Subject: [PATCH 0339/2291] Refactor IR graph traversal infrastructure This makes the IR traversal infrastructure generic. It makes it so we can use the same traversal code for whitelisting traversals and asserting no dangling item references. Therefore the queue of items to visit is generic (whitelisting uses DFS, while asserting against dangling uses BFS), the storage for the seen set (whitelisting uses a simple set, asserting against dangling uses a map from item to the item from which it was discovered). It also introduces the concept of different kinds of edges in the IR graph, and the ability to choose which edges to follow. This means we can simplify non-transitive whitelisting to a simple function that always returns "no do not follow this edge". It plays an important part for future analysis of which template declaration type parameters are used or not. --- src/ir/comp.rs | 49 ++++--- src/ir/context.rs | 114 +++------------ src/ir/function.rs | 19 +-- src/ir/item.rs | 35 ++--- src/ir/traversal.rs | 333 ++++++++++++++++++++++++++++++++++++++------ src/ir/ty.rs | 30 ++-- 6 files changed, 390 insertions(+), 190 deletions(-) diff --git a/src/ir/comp.rs b/src/ir/comp.rs index bcc386ad79..ecc0442bf2 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -3,8 +3,9 @@ use super::annotations::Annotations; use super::context::{BindgenContext, ItemId}; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; -use super::item::{Item, ItemSet}; +use super::item::Item; use super::layout::Layout; +use super::traversal::{EdgeKind, Trace, Tracer}; use super::ty::{TemplateDeclaration, Type}; use super::traversal::Trace; use clang; @@ -1078,41 +1079,55 @@ impl<'a> CanDeriveCopy<'a> for CompInfo { impl Trace for CompInfo { type Extra = Item; - fn trace(&self, - context: &BindgenContext, - types: &mut ItemSet, - item: &Item) { + fn trace(&self, + context: &BindgenContext, + tracer: &mut T, + item: &Item) + where T: Tracer + { + // TODO: We should properly distinguish template instantiations from + // template declarations at the type level. Why are some template + // instantiations represented here instead of as + // TypeKind::TemplateInstantiation? if let Some(template) = self.specialized_template() { - types.insert(template); - } - - let applicable_template_args = item.applicable_template_args(context); - for arg in applicable_template_args { - types.insert(arg); + // This is an instantiation of a template declaration with concrete + // template type arguments. + tracer.visit(template); + let args = item.applicable_template_args(context); + for a in args { + tracer.visit(a); + } + } else { + let params = item.applicable_template_args(context); + // This is a template declaration with abstract template type + // parameters. + for p in params { + tracer.visit_kind(p, EdgeKind::TemplateParameterDefinition); + } } for base in self.base_members() { - types.insert(base.ty); + tracer.visit(base.ty); } for field in self.fields() { - types.insert(field.ty()); + tracer.visit(field.ty()); } for &ty in self.inner_types() { - types.insert(ty); + tracer.visit(ty); } for &var in self.inner_vars() { - types.insert(var); + tracer.visit(var); } for method in self.methods() { - types.insert(method.signature); + tracer.visit(method.signature); } for &ctor in self.constructors() { - types.insert(ctor); + tracer.visit(ctor); } } } diff --git a/src/ir/context.rs b/src/ir/context.rs index 7ce7f775ed..63d451a8fb 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -5,7 +5,7 @@ use super::int::IntKind; use super::item::{Item, ItemSet, ItemCanonicalPath}; use super::item_kind::ItemKind; use super::module::{Module, ModuleKind}; -use super::traversal::{ItemTraversal, Trace}; +use super::traversal::{self, Edge, ItemTraversal}; use super::ty::{FloatKind, TemplateDeclaration, Type, TypeKind}; use BindgenOptions; use cexpr; @@ -15,7 +15,7 @@ use clang_sys; use parse::ClangItemParser; use std::borrow::Cow; use std::cell::Cell; -use std::collections::{HashMap, VecDeque, hash_map}; +use std::collections::{HashMap, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; use std::iter::IntoIterator; @@ -151,6 +151,10 @@ pub struct BindgenContext<'ctx> { generated_bindegen_complex: Cell, } +/// A traversal of whitelisted items. +pub type WhitelistedItems<'ctx, 'gen> = + ItemTraversal<'ctx, 'gen, ItemSet, Vec, fn(Edge) -> bool>; + impl<'ctx> BindgenContext<'ctx> { /// Construct the context for the given `options`. pub fn new(options: BindgenOptions) -> Self { @@ -538,23 +542,12 @@ impl<'ctx> BindgenContext<'ctx> { fn assert_no_dangling_item_traversal<'me> (&'me self) - -> AssertNoDanglingItemIter<'me, 'ctx> { + -> traversal::AssertNoDanglingItemsTraversal<'me, 'ctx> { assert!(self.in_codegen_phase()); assert!(self.current_module == self.root_module); - let mut roots = self.items().map(|(&id, _)| id); - - let mut seen = BTreeMap::::new(); - let next_child = roots.next().map(|id| id).unwrap(); - seen.insert(next_child, next_child); - - let to_iterate = seen.iter().map(|(&id, _)| id).rev().collect(); - - AssertNoDanglingItemIter { - ctx: self, - seen: seen, - to_iterate: to_iterate, - } + let roots = self.items().map(|(&id, _)| id); + traversal::AssertNoDanglingItemsTraversal::new(self, roots, traversal::all_edges) } // This deserves a comment. Builtin types don't get a valid declaration, so @@ -1202,8 +1195,7 @@ impl<'ctx> BindgenContext<'ctx> { /// /// If no items are explicitly whitelisted, then all items are considered /// whitelisted. - pub fn whitelisted_items<'me>(&'me self) - -> ItemTraversal<'me, 'ctx> { + pub fn whitelisted_items<'me>(&'me self) -> WhitelistedItems<'me, 'ctx> { assert!(self.in_codegen_phase()); assert!(self.current_module == self.root_module); @@ -1268,7 +1260,19 @@ impl<'ctx> BindgenContext<'ctx> { }) .map(|(&id, _)| id); - ItemTraversal::new(self, roots) + // The reversal preserves the expected ordering of traversal, resulting + // in more stable-ish bindgen-generated names for anonymous types (like + // unions). + let mut roots: Vec<_> = roots.collect(); + roots.reverse(); + + let predicate = if self.options().whitelist_recursively { + traversal::all_edges + } else { + traversal::no_edges + }; + + WhitelistedItems::new(self, roots, predicate) } /// Convenient method for getting the prefix to use for most traits in @@ -1353,75 +1357,3 @@ impl TemplateDeclaration for PartialType { } } } - -/// An iterator to find any dangling items. -/// -/// See `BindgenContext::assert_no_dangling_item_traversal` for more -/// information. -pub struct AssertNoDanglingItemIter<'ctx, 'gen> - where 'gen: 'ctx, -{ - ctx: &'ctx BindgenContext<'gen>, - seen: BTreeMap, - to_iterate: VecDeque, -} - -impl<'ctx, 'gen> Iterator for AssertNoDanglingItemIter<'ctx, 'gen> - where 'gen: 'ctx, -{ - type Item = ItemId; - - fn next(&mut self) -> Option { - let id = match self.to_iterate.pop_front() { - None => { - // We've traversed everything reachable from the previous - // root(s), see if we have any more roots. - match self.ctx - .items() - .filter(|&(id, _)| !self.seen.contains_key(id)) - .next() - .map(|(id, _)| *id) { - None => return None, - Some(id) => { - // This is a new root. - self.seen.insert(id, id); - id - } - } - } - Some(id) => id, - }; - - let mut sub_types = ItemSet::new(); - id.trace(self.ctx, &mut sub_types, &()); - - if self.ctx.resolve_item_fallible(id).is_none() { - let mut path = vec![]; - let mut current = id; - loop { - let predecessor = *self.seen - .get(¤t) - .expect("We know we found this item id, so it must have a \ - predecessor"); - if predecessor == current { - break; - } - path.push(predecessor); - current = predecessor; - } - path.reverse(); - panic!("Found reference to dangling id = {:?}\nvia path = {:?}", - id, - path); - } - - for sub_id in sub_types { - if self.seen.insert(sub_id, id).is_none() { - // We've never visited this sub item before. - self.to_iterate.push_back(sub_id); - } - } - - Some(id) - } -} diff --git a/src/ir/function.rs b/src/ir/function.rs index 7beb35a4ae..cd504b9c03 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -1,7 +1,8 @@ //! Intermediate representation for C/C++ functions and methods. use super::context::{BindgenContext, ItemId}; -use super::item::{Item, ItemSet}; +use super::item::Item; +use super::traversal::{Trace, Tracer}; use super::ty::TypeKind; use super::traversal::Trace; use clang; @@ -317,16 +318,18 @@ impl ClangSubItemParser for Function { } impl Trace for FunctionSig { - type Extra = Item; + type Extra = (); - fn trace(&self, - _context: &BindgenContext, - types: &mut ItemSet, - _item: &Item) { - types.insert(self.return_type()); + fn trace(&self, + _: &BindgenContext, + tracer: &mut T, + _: &()) + where T: Tracer + { + tracer.visit(self.return_type()); for &(_, ty) in self.argument_types() { - types.insert(ty); + tracer.visit(ty); } } } diff --git a/src/ir/item.rs b/src/ir/item.rs index 04831f7512..f168579ef0 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -6,6 +6,7 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::function::Function; use super::item_kind::ItemKind; use super::module::Module; +use super::traversal::{Trace, Tracer}; use super::ty::{TemplateDeclaration, Type, TypeKind}; use super::traversal::Trace; use clang; @@ -170,22 +171,20 @@ impl ItemAncestors for Item { impl Trace for ItemId { type Extra = (); - fn trace(&self, - ctx: &BindgenContext, - types: &mut ItemSet, - extra: &()) { - ctx.resolve_item(*self).trace(ctx, types, extra); + fn trace(&self, ctx: &BindgenContext, tracer: &mut T, extra: &()) + where T: Tracer + { + ctx.resolve_item(*self).trace(ctx, tracer, extra); } } impl Trace for Item { type Extra = (); - fn trace(&self, - ctx: &BindgenContext, - types: &mut ItemSet, - _extra: &()) { - if self.is_hidden(ctx) || types.contains(&self.id()) { + fn trace(&self, ctx: &BindgenContext, tracer: &mut T, _extra: &()) + where T: Tracer + { + if self.is_hidden(ctx) { return; } @@ -196,22 +195,25 @@ impl Trace for Item { // opaque. if ty.should_be_traced_unconditionally() || !self.is_opaque(ctx) { - ty.trace(ctx, types, self); + ty.trace(ctx, tracer, self); } } ItemKind::Function(ref fun) => { // Just the same way, it has not real meaning for a function to // be opaque, so we trace across it. - types.insert(fun.signature()); + tracer.visit(fun.signature()); } ItemKind::Var(ref var) => { - types.insert(var.ty()); + tracer.visit(var.ty()); } ItemKind::Module(_) => { // Module -> children edges are "weak", and we do not want to // trace them. If we did, then whitelisting wouldn't work as // expected: everything in every module would end up // whitelisted. + // + // TODO: make a new edge kind for module -> children edges and + // filter them during whitelisting traversals. } } } @@ -923,10 +925,11 @@ impl TemplateDeclaration for ItemKind { fn template_params(&self, ctx: &BindgenContext) -> Option> { match *self { ItemKind::Type(ref ty) => ty.template_params(ctx), - // TODO FITZGEN: shouldn't functions be able to have free template - // params? - ItemKind::Module(_) | + // If we start emitting bindings to explicitly instantiated + // functions, then we'll need to check ItemKind::Function for + // template params. ItemKind::Function(_) | + ItemKind::Module(_) | ItemKind::Var(_) => None, } } diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs index 4965b6cb8b..4e78ce2a98 100644 --- a/src/ir/traversal.rs +++ b/src/ir/traversal.rs @@ -1,92 +1,339 @@ //! Traversal of the graph of IR items and types. +use std::collections::{BTreeMap, VecDeque}; use super::context::{BindgenContext, ItemId}; use super::item::ItemSet; -/// Collect all the type items referenced by this item. +/// An outgoing edge in the IR graph is a reference from some item to another +/// item: +/// +/// from --> to +/// +/// The `from` is left implicit: it is the concrete `Trace` implementor which +/// yielded this outgoing edge. +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct Edge { + to: ItemId, + kind: EdgeKind +} + +impl Edge { + /// Construct a new edge whose referent is `to` and is of the given `kind`. + pub fn new(to: ItemId, kind: EdgeKind) -> Edge { + Edge { + to: to, + kind: kind, + } + } + + /// Get the item that this edge is pointing to. + pub fn to(&self) -> ItemId { + self.to + } + + /// Get the kind of edge that this is. + pub fn kind(&self) -> EdgeKind { + self.kind + } +} + +impl Into for Edge { + fn into(self) -> ItemId { + self.to + } +} + +/// The kind of edge reference. This is useful when we wish to only consider +/// certain kinds of edges for a particular traversal. +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum EdgeKind { + /// A generic, catch-all edge. + Generic, + + /// An edge from a template declaration, to the definition of a named type + /// parameter. For example, the edge Foo -> T in the following snippet: + /// + /// ```C++ + /// template + /// class Foo { + /// int x; + /// }; + /// ``` + TemplateParameterDefinition, +} + +/// A predicate to allow visiting only sub-sets of the whole IR graph by +/// excluding certain edges from being followed by the traversal. +pub trait TraversalPredicate { + /// Should the traversal follow this edge, and visit everything that is + /// reachable through it? + fn should_follow(&self, edge: Edge) -> bool; +} + +impl TraversalPredicate for fn(Edge) -> bool { + fn should_follow(&self, edge: Edge) -> bool { + (*self)(edge) + } +} + +/// A `TraversalPredicate` implementation that follows all edges, and therefore +/// traversals using this predicate will see the whole IR graph reachable from +/// the traversal's roots. +pub fn all_edges(_: Edge) -> bool { + true +} + +/// A `TraversalPredicate` implementation that never follows any edges, and +/// therefore traversals using this predicate will only visit the traversal's +/// roots. +pub fn no_edges(_: Edge) -> bool { + false +} + +/// The storage for the set of items that have been seen (although their +/// outgoing edges might not have been fully traversed yet) in an active +/// traversal. +pub trait TraversalStorage<'ctx, 'gen> { + /// Construct a new instance of this TraversalStorage, for a new traversal. + fn new(ctx: &'ctx BindgenContext<'gen>) -> Self; + + /// Add the given item to the storage. If the item has never been seen + /// before, return `true`. Otherwise, return `false`. + /// + /// The `from` item is the item from which we discovered this item, or is + /// `None` if this item is a root. + fn add(&mut self, from: Option, item: ItemId) -> bool; +} + +impl<'ctx, 'gen> TraversalStorage<'ctx, 'gen> for ItemSet { + fn new(_: &'ctx BindgenContext<'gen>) -> Self { + ItemSet::new() + } + + fn add(&mut self, _: Option, item: ItemId) -> bool { + self.insert(item) + } +} + +/// A `TraversalStorage` implementation that keeps track of how we first reached +/// each item. This is useful for providing debug assertions with meaningful +/// diagnostic messages about dangling items. +#[derive(Debug)] +pub struct Paths<'ctx, 'gen>(BTreeMap, &'ctx BindgenContext<'gen>) + where 'gen: 'ctx; + +impl<'ctx, 'gen> TraversalStorage<'ctx, 'gen> for Paths<'ctx, 'gen> + where 'gen: 'ctx +{ + fn new(ctx: &'ctx BindgenContext<'gen>) -> Self { + Paths(BTreeMap::new(), ctx) + } + + fn add(&mut self, from: Option, item: ItemId) -> bool { + let newly_discovered = self.0.insert(item, from.unwrap_or(item)).is_none(); + + if self.1.resolve_item_fallible(item).is_none() { + let mut path = vec![]; + let mut current = item; + loop { + let predecessor = *self.0 + .get(¤t) + .expect("We know we found this item id, so it must have a \ + predecessor"); + if predecessor == current { + break; + } + path.push(predecessor); + current = predecessor; + } + path.reverse(); + panic!("Found reference to dangling id = {:?}\nvia path = {:?}", + item, + path); + } + + newly_discovered + } +} + +/// The queue of seen-but-not-yet-traversed items. +/// +/// Using a FIFO queue with a traversal will yield a breadth-first traversal, +/// while using a LIFO queue will result in a depth-first traversal of the IR +/// graph. +pub trait TraversalQueue: Default { + /// Add a newly discovered item to the queue. + fn push(&mut self, item: ItemId); + + /// Pop the next item to traverse, if any. + fn next(&mut self) -> Option; +} + +impl TraversalQueue for Vec { + fn push(&mut self, item: ItemId) { + self.push(item); + } + + fn next(&mut self) -> Option { + self.pop() + } +} + +impl TraversalQueue for VecDeque { + fn push(&mut self, item: ItemId) { + self.push_back(item); + } + + fn next(&mut self) -> Option { + self.pop_front() + } +} + +/// Something that can receive edges from a `Trace` implementation. +pub trait Tracer { + /// Note an edge between items. Called from within a `Trace` implementation. + fn visit_kind(&mut self, item: ItemId, kind: EdgeKind); + + /// A synonym for `tracer.visit_kind(item, EdgeKind::Generic)`. + fn visit(&mut self, item: ItemId) { + self.visit_kind(item, EdgeKind::Generic); + } +} + +/// Trace all of the outgoing edges to other items. Implementations should call +/// `tracer.visit(edge)` for each of their outgoing edges. pub trait Trace { /// If a particular type needs extra information beyond what it has in - /// `self` and `context` to find its referenced type items, its - /// implementation can define this associated type, forcing callers to pass - /// the needed information through. + /// `self` and `context` to find its referenced items, its implementation + /// can define this associated type, forcing callers to pass the needed + /// information through. type Extra; - /// Add each type item referenced by `self` into the `types` set. - fn trace(&self, - context: &BindgenContext, - types: &mut ItemSet, - extra: &Self::Extra); + /// Trace all of this item's outgoing edges to other items. + fn trace(&self, + context: &BindgenContext, + tracer: &mut T, + extra: &Self::Extra) + where T: Tracer; } /// An graph traversal of the transitive closure of references between items. /// /// See `BindgenContext::whitelisted_items` for more information. -pub struct ItemTraversal<'ctx, 'gen> +pub struct ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> where 'gen: 'ctx, + Storage: TraversalStorage<'ctx, 'gen>, + Queue: TraversalQueue, + Predicate: TraversalPredicate, { ctx: &'ctx BindgenContext<'gen>, - /// The set of whitelisted items we have seen. If you think of traversing - /// whitelisted items like GC tracing, this is the mark bits, and contains - /// both black and gray items. - seen: ItemSet, + /// The set of items we have seen thus far in this traversal. + seen: Storage, - /// The set of whitelisted items that we have seen but have yet to iterate - /// over and collect transitive references from. To return to the GC analogy, - /// this is the mark stack, containing the set of gray items which we have - /// not finished tracing yet. - to_iterate: Vec, + /// The set of items that we have seen, but have yet to traverse. + queue: Queue, + + /// The predicate that determins which edges this traversal will follow. + predicate: Predicate, + + /// The item we are currently traversing. + currently_traversing: Option, } -impl<'ctx, 'gen> ItemTraversal<'ctx, 'gen> +impl<'ctx, 'gen, Storage, Queue, Predicate> ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> where 'gen: 'ctx, + Storage: TraversalStorage<'ctx, 'gen>, + Queue: TraversalQueue, + Predicate: TraversalPredicate, { /// Begin a new traversal, starting from the given roots. pub fn new(ctx: &'ctx BindgenContext<'gen>, - roots: R) - -> ItemTraversal<'ctx, 'gen> + roots: R, + predicate: Predicate) + -> ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> where R: IntoIterator, { - // Construct the ItemSet first. Because its underlying storage is a - // BTreeSet, its iteration over its entries is ordered, and the roots - // end up ordered as well. This contributes enables stable, - // deterministic generated names in the bindings. - let seen: ItemSet = roots.into_iter().collect(); - let roots: Vec<_> = seen.iter().cloned().collect(); + let mut seen = Storage::new(ctx); + let mut queue = Queue::default(); + + for id in roots { + seen.add(None, id); + queue.push(id); + } ItemTraversal { ctx: ctx, seen: seen, - to_iterate: roots, + queue: queue, + predicate: predicate, + currently_traversing: None, + } + } +} + +impl<'ctx, 'gen, Storage, Queue, Predicate> Tracer for ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> + where 'gen: 'ctx, + Storage: TraversalStorage<'ctx, 'gen>, + Queue: TraversalQueue, + Predicate: TraversalPredicate, +{ + fn visit_kind(&mut self, item: ItemId, kind: EdgeKind) { + let edge = Edge::new(item, kind); + if !self.predicate.should_follow(edge) { + return; + } + + let is_newly_discovered = self.seen.add(self.currently_traversing, item); + if is_newly_discovered { + self.queue.push(item) } } } -impl<'ctx, 'gen> Iterator for ItemTraversal<'ctx, 'gen> +impl<'ctx, 'gen, Storage, Queue, Predicate> Iterator for ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> where 'gen: 'ctx, + Storage: TraversalStorage<'ctx, 'gen>, + Queue: TraversalQueue, + Predicate: TraversalPredicate, { type Item = ItemId; fn next(&mut self) -> Option { - let id = match self.to_iterate.pop() { + let id = match self.queue.next() { None => return None, Some(id) => id, }; - debug_assert!(self.seen.contains(&id)); - debug_assert!(self.ctx.resolve_item_fallible(id).is_some()); + let newly_discovered = self.seen.add(None, id); + debug_assert!(!newly_discovered, + "should have already seen anything we get out of our queue"); + debug_assert!(self.ctx.resolve_item_fallible(id).is_some(), + "should only get IDs of actual items in our context during traversal"); - if self.ctx.options().whitelist_recursively { - let mut sub_types = ItemSet::new(); - id.trace(self.ctx, &mut sub_types, &()); - - for id in sub_types { - if self.seen.insert(id) { - self.to_iterate.push(id); - } - } - } + self.currently_traversing = Some(id); + id.trace(self.ctx, self, &()); + self.currently_traversing = None; Some(id) } } + +/// An iterator to find any dangling items. +/// +/// See `BindgenContext::assert_no_dangling_item_traversal` for more +/// information. +pub type AssertNoDanglingItemsTraversal<'ctx, 'gen> = + ItemTraversal<'ctx, 'gen, Paths<'ctx, 'gen>, VecDeque, fn(Edge) -> bool>; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[allow(dead_code)] + fn traversal_predicate_is_object_safe() { + // This should compile only if TraversalPredicate is object safe. + fn takes_by_trait_object(_: &TraversalPredicate) {} + } +} diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 030b012e77..236eae8bef 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -6,10 +6,10 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::enum_ty::Enum; use super::function::FunctionSig; use super::int::IntKind; -use super::item::{Item, ItemSet}; +use super::item::Item; use super::layout::Layout; use super::objc::ObjCInterface; -use super::traversal::Trace; +use super::traversal::{Trace, Tracer}; use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; use std::mem; @@ -1128,37 +1128,37 @@ impl Type { impl Trace for Type { type Extra = Item; - fn trace(&self, - context: &BindgenContext, - types: &mut ItemSet, - item: &Item) { + fn trace(&self, + context: &BindgenContext, + tracer: &mut T, + item: &Item) + where T: Tracer + { match *self.kind() { TypeKind::Pointer(inner) | TypeKind::Reference(inner) | TypeKind::Array(inner, _) | TypeKind::Alias(inner) | TypeKind::ResolvedTypeRef(inner) => { - types.insert(inner); + tracer.visit(inner); } TypeKind::TemplateAlias(inner, ref template_args) | TypeKind::TemplateInstantiation(inner, ref template_args) => { - types.insert(inner); + tracer.visit(inner); for &item in template_args { - types.insert(item); + tracer.visit(item); } } - TypeKind::Comp(ref ci) => ci.trace(context, types, item), - TypeKind::Function(ref sig) => { - sig.trace(context, types, item) - } + TypeKind::Comp(ref ci) => ci.trace(context, tracer, item), + TypeKind::Function(ref sig) => sig.trace(context, tracer, &()), TypeKind::Enum(ref en) => { if let Some(repr) = en.repr() { - types.insert(repr); + tracer.visit(repr); } } TypeKind::UnresolvedTypeRef(_, _, Some(id)) => { - types.insert(id); + tracer.visit(id); } TypeKind::ObjCInterface(_) => { From 6d2f9073d04e26fea4f01283f1bfd80de21f8f5d Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 13 Feb 2017 11:35:19 -0800 Subject: [PATCH 0340/2291] Run `cargo fmt` --- src/codegen/mod.rs | 5 +++-- src/ir/comp.rs | 8 ++------ src/ir/context.rs | 13 +++++++++---- src/ir/function.rs | 8 ++------ src/ir/item.rs | 5 ++--- src/ir/traversal.rs | 35 ++++++++++++++++++++++++----------- src/ir/ty.rs | 14 ++++++-------- 7 files changed, 48 insertions(+), 40 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 6f9291f77d..b626fe3415 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -12,7 +12,8 @@ use ir::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; use ir::function::{Function, FunctionSig}; use ir::int::IntKind; -use ir::item::{Item, ItemSet, ItemAncestors, ItemCanonicalName, ItemCanonicalPath}; +use ir::item::{Item, ItemAncestors, ItemCanonicalName, ItemCanonicalPath, + ItemSet}; use ir::item_kind::ItemKind; use ir::layout::Layout; use ir::module::Module; @@ -2189,7 +2190,7 @@ impl ToRustTy for Type { .map(|arg| arg.to_rust_ty(ctx)) .collect::>(); - path.segments.last_mut().unwrap().parameters = if + path.segments.last_mut().unwrap().parameters = if template_args.is_empty() { None } else { diff --git a/src/ir/comp.rs b/src/ir/comp.rs index ecc0442bf2..fff4655c31 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -7,7 +7,6 @@ use super::item::Item; use super::layout::Layout; use super::traversal::{EdgeKind, Trace, Tracer}; use super::ty::{TemplateDeclaration, Type}; -use super::traversal::Trace; use clang; use parse::{ClangItemParser, ParseError}; use std::cell::Cell; @@ -1079,11 +1078,8 @@ impl<'a> CanDeriveCopy<'a> for CompInfo { impl Trace for CompInfo { type Extra = Item; - fn trace(&self, - context: &BindgenContext, - tracer: &mut T, - item: &Item) - where T: Tracer + fn trace(&self, context: &BindgenContext, tracer: &mut T, item: &Item) + where T: Tracer, { // TODO: We should properly distinguish template instantiations from // template declarations at the type level. Why are some template diff --git a/src/ir/context.rs b/src/ir/context.rs index 63d451a8fb..d2fb2befc6 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -2,7 +2,7 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::int::IntKind; -use super::item::{Item, ItemSet, ItemCanonicalPath}; +use super::item::{Item, ItemCanonicalPath, ItemSet}; use super::item_kind::ItemKind; use super::module::{Module, ModuleKind}; use super::traversal::{self, Edge, ItemTraversal}; @@ -152,8 +152,11 @@ pub struct BindgenContext<'ctx> { } /// A traversal of whitelisted items. -pub type WhitelistedItems<'ctx, 'gen> = - ItemTraversal<'ctx, 'gen, ItemSet, Vec, fn(Edge) -> bool>; +pub type WhitelistedItems<'ctx, 'gen> = ItemTraversal<'ctx, + 'gen, + ItemSet, + Vec, + fn(Edge) -> bool>; impl<'ctx> BindgenContext<'ctx> { /// Construct the context for the given `options`. @@ -547,7 +550,9 @@ impl<'ctx> BindgenContext<'ctx> { assert!(self.current_module == self.root_module); let roots = self.items().map(|(&id, _)| id); - traversal::AssertNoDanglingItemsTraversal::new(self, roots, traversal::all_edges) + traversal::AssertNoDanglingItemsTraversal::new(self, + roots, + traversal::all_edges) } // This deserves a comment. Builtin types don't get a valid declaration, so diff --git a/src/ir/function.rs b/src/ir/function.rs index cd504b9c03..22b9c9b04a 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -4,7 +4,6 @@ use super::context::{BindgenContext, ItemId}; use super::item::Item; use super::traversal::{Trace, Tracer}; use super::ty::TypeKind; -use super::traversal::Trace; use clang; use clang_sys::CXCallingConv; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; @@ -320,11 +319,8 @@ impl ClangSubItemParser for Function { impl Trace for FunctionSig { type Extra = (); - fn trace(&self, - _: &BindgenContext, - tracer: &mut T, - _: &()) - where T: Tracer + fn trace(&self, _: &BindgenContext, tracer: &mut T, _: &()) + where T: Tracer, { tracer.visit(self.return_type()); diff --git a/src/ir/item.rs b/src/ir/item.rs index f168579ef0..4c65c43355 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -8,7 +8,6 @@ use super::item_kind::ItemKind; use super::module::Module; use super::traversal::{Trace, Tracer}; use super::ty::{TemplateDeclaration, Type, TypeKind}; -use super::traversal::Trace; use clang; use clang_sys; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; @@ -172,7 +171,7 @@ impl Trace for ItemId { type Extra = (); fn trace(&self, ctx: &BindgenContext, tracer: &mut T, extra: &()) - where T: Tracer + where T: Tracer, { ctx.resolve_item(*self).trace(ctx, tracer, extra); } @@ -182,7 +181,7 @@ impl Trace for Item { type Extra = (); fn trace(&self, ctx: &BindgenContext, tracer: &mut T, _extra: &()) - where T: Tracer + where T: Tracer, { if self.is_hidden(ctx) { return; diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs index 4e78ce2a98..eb4fc68601 100644 --- a/src/ir/traversal.rs +++ b/src/ir/traversal.rs @@ -1,8 +1,8 @@ //! Traversal of the graph of IR items and types. -use std::collections::{BTreeMap, VecDeque}; use super::context::{BindgenContext, ItemId}; use super::item::ItemSet; +use std::collections::{BTreeMap, VecDeque}; /// An outgoing edge in the IR graph is a reference from some item to another /// item: @@ -14,7 +14,7 @@ use super::item::ItemSet; #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Edge { to: ItemId, - kind: EdgeKind + kind: EdgeKind, } impl Edge { @@ -119,18 +119,20 @@ impl<'ctx, 'gen> TraversalStorage<'ctx, 'gen> for ItemSet { /// each item. This is useful for providing debug assertions with meaningful /// diagnostic messages about dangling items. #[derive(Debug)] -pub struct Paths<'ctx, 'gen>(BTreeMap, &'ctx BindgenContext<'gen>) +pub struct Paths<'ctx, 'gen>(BTreeMap, + &'ctx BindgenContext<'gen>) where 'gen: 'ctx; impl<'ctx, 'gen> TraversalStorage<'ctx, 'gen> for Paths<'ctx, 'gen> - where 'gen: 'ctx + where 'gen: 'ctx, { fn new(ctx: &'ctx BindgenContext<'gen>) -> Self { Paths(BTreeMap::new(), ctx) } fn add(&mut self, from: Option, item: ItemId) -> bool { - let newly_discovered = self.0.insert(item, from.unwrap_or(item)).is_none(); + let newly_discovered = + self.0.insert(item, from.unwrap_or(item)).is_none(); if self.1.resolve_item_fallible(item).is_none() { let mut path = vec![]; @@ -241,7 +243,11 @@ pub struct ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> currently_traversing: Option, } -impl<'ctx, 'gen, Storage, Queue, Predicate> ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> +impl<'ctx, 'gen, Storage, Queue, Predicate> ItemTraversal<'ctx, + 'gen, + Storage, + Queue, + Predicate> where 'gen: 'ctx, Storage: TraversalStorage<'ctx, 'gen>, Queue: TraversalQueue, @@ -272,7 +278,8 @@ impl<'ctx, 'gen, Storage, Queue, Predicate> ItemTraversal<'ctx, 'gen, Storage, Q } } -impl<'ctx, 'gen, Storage, Queue, Predicate> Tracer for ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> +impl<'ctx, 'gen, Storage, Queue, Predicate> Tracer + for ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> where 'gen: 'ctx, Storage: TraversalStorage<'ctx, 'gen>, Queue: TraversalQueue, @@ -283,15 +290,17 @@ impl<'ctx, 'gen, Storage, Queue, Predicate> Tracer for ItemTraversal<'ctx, 'gen, if !self.predicate.should_follow(edge) { return; } - - let is_newly_discovered = self.seen.add(self.currently_traversing, item); + + let is_newly_discovered = self.seen + .add(self.currently_traversing, item); if is_newly_discovered { self.queue.push(item) } } } -impl<'ctx, 'gen, Storage, Queue, Predicate> Iterator for ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> +impl<'ctx, 'gen, Storage, Queue, Predicate> Iterator + for ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate> where 'gen: 'ctx, Storage: TraversalStorage<'ctx, 'gen>, Queue: TraversalQueue, @@ -324,7 +333,11 @@ impl<'ctx, 'gen, Storage, Queue, Predicate> Iterator for ItemTraversal<'ctx, 'ge /// See `BindgenContext::assert_no_dangling_item_traversal` for more /// information. pub type AssertNoDanglingItemsTraversal<'ctx, 'gen> = - ItemTraversal<'ctx, 'gen, Paths<'ctx, 'gen>, VecDeque, fn(Edge) -> bool>; + ItemTraversal<'ctx, + 'gen, + Paths<'ctx, 'gen>, + VecDeque, + fn(Edge) -> bool>; #[cfg(test)] mod tests { diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 236eae8bef..ec168f0239 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1026,7 +1026,9 @@ impl Type { CXType_MemberPointer | CXType_Pointer => { let inner = Item::from_ty_or_ref(ty.pointee_type().unwrap(), - location, None, ctx); + location, + None, + ctx); TypeKind::Pointer(inner) } CXType_BlockPointer => TypeKind::BlockPointer, @@ -1067,8 +1069,7 @@ impl Type { } CXType_Typedef => { let inner = cursor.typedef_type().expect("Not valid Type?"); - let inner = - Item::from_ty_or_ref(inner, location, None, ctx); + let inner = Item::from_ty_or_ref(inner, location, None, ctx); TypeKind::Alias(inner) } CXType_Enum => { @@ -1128,11 +1129,8 @@ impl Type { impl Trace for Type { type Extra = Item; - fn trace(&self, - context: &BindgenContext, - tracer: &mut T, - item: &Item) - where T: Tracer + fn trace(&self, context: &BindgenContext, tracer: &mut T, item: &Item) + where T: Tracer, { match *self.kind() { TypeKind::Pointer(inner) | From af6d59c29a9b7a4c43ae857eb03b653cf598c852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 14 Feb 2017 01:18:26 +0100 Subject: [PATCH 0341/2291] codegen: Use the constness of the inner type when converting array function arguments. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/servo/rust-bindgen/issues/509 I'm actually surprised we had no tests for this. Signed-off-by: Emilio Cobos Álvarez --- src/codegen/mod.rs | 2 +- tests/expectations/tests/const_array_fn_arg.rs | 9 +++++++++ tests/headers/const_array_fn_arg.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/tests/const_array_fn_arg.rs create mode 100644 tests/headers/const_array_fn_arg.h diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 99400f7a16..d5c38aa8ac 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2828,7 +2828,7 @@ mod utils { // [1]: http://c0x.coding-guidelines.com/6.7.5.3.html let arg_ty = match *arg_ty.canonical_type(ctx).kind() { TypeKind::Array(t, _) => { - t.to_rust_ty(ctx).to_ptr(arg_ty.is_const(), ctx.span()) + t.to_rust_ty(ctx).to_ptr(ctx.resolve_type(t).is_const(), ctx.span()) }, TypeKind::Pointer(inner) => { let inner = ctx.resolve_item(inner); diff --git a/tests/expectations/tests/const_array_fn_arg.rs b/tests/expectations/tests/const_array_fn_arg.rs new file mode 100644 index 0000000000..623d28b202 --- /dev/null +++ b/tests/expectations/tests/const_array_fn_arg.rs @@ -0,0 +1,9 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +extern "C" { + pub fn f(a: *const ::std::os::raw::c_int); +} diff --git a/tests/headers/const_array_fn_arg.h b/tests/headers/const_array_fn_arg.h new file mode 100644 index 0000000000..ebe2286137 --- /dev/null +++ b/tests/headers/const_array_fn_arg.h @@ -0,0 +1 @@ +void f(const int a[]); From 6fbc343032307ff6d5b1705dc6cb0284601873e3 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 14 Feb 2017 14:50:21 -0800 Subject: [PATCH 0342/2291] Add the `Item::is_named` helper method --- src/ir/item.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ir/item.rs b/src/ir/item.rs index 4c65c43355..5b78551385 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -472,6 +472,13 @@ impl Item { self.kind().as_type() } + /// Is this item a named template type parameter? + pub fn is_named(&self) -> bool { + self.as_type() + .map(|ty| ty.is_named()) + .unwrap_or(false) + } + /// Get a reference to this item's underlying `Function`. Panic if this is /// some other kind of item. pub fn expect_function(&self) -> &Function { From 12b245276a4be2ca7804ef5c0905fed895eb88d2 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 13 Feb 2017 17:28:49 -0800 Subject: [PATCH 0343/2291] Discover which template type parameters are actually used MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit C++ allows ignoring template parameters, while Rust does not. Usually we can blindly stick a `PhantomData` inside a generic Rust struct to make up for this. That doesn't work for templated type aliases, however: ```C++ template using Fml = int; ``` If we generate the naive Rust code for this alias, we get: ```ignore pub type Fml = ::std::os::raw::int; ``` And this is rejected by `rustc` due to the unused type parameter. (Aside: in these simple cases, `libclang` will often just give us the aliased type directly, and we will never even know we were dealing with aliases, let alone templated aliases. It's the more convoluted scenarios where we get to have some fun...) For such problematic template aliases, we could generate a tuple whose second member is a `PhantomData`. Or, if we wanted to go the extra mile, we could even generate some smarter wrapper that implements `Deref`, `DerefMut`, `From`, `Into`, `AsRef`, and `AsMut` to the actually aliased type. However, this is still lackluster: 1. Even with a billion conversion-trait implementations, using the generated bindings is rather un-ergonomic. 2. With either of these solutions, we need to keep track of which aliases we've transformed like this in order to generate correct uses of the wrapped type. Given that we have to properly track which template parameters ended up used for (2), we might as well leverage that information to make ergonomic bindings that don't contain any unused type parameters at all, and completely avoid the pain of (1). Determining which template parameters are actually used is a trickier problem than it might seem at a glance. On the one hand, trivial uses are easy to detect: ```C++ template class Foo { T trivial_use_of_t; }; ``` It gets harder when determining if one template parameter is used depends on determining if another template parameter is used. In this example, whether `U` is used depends on whether `T` is used. ```C++ template class DoesntUseT { int x; }; template class Fml { DoesntUseT lololol; }; ``` We can express the set of used template parameters as a constraint solving problem (where the set of template parameters used by a given IR item is the union of its sub-item's used template parameters) and iterate to a fixed-point. We use the "monotone framework" for this fix-point analysis where our lattice is the powerset of the template parameters that appear in the input C++ header, our join function is set union, and we use the `ir::traversal::Trace` trait to implement the work-list optimization so we don't have to revisit every node in the graph when for every iteration towards the fix-point. For a deeper introduction to the general form of this kind of analysis, see [Static Program Analysis by Anders Møller and Michael I. Schwartzbach][spa]. [spa]: https://cs.au.dk/~amoeller/spa/spa.pdf --- src/ir/mod.rs | 1 + src/ir/named.rs | 471 ++++++++++++++++++++++++++++++++++++++++++++ src/ir/traversal.rs | 8 + 3 files changed, 480 insertions(+) create mode 100644 src/ir/named.rs diff --git a/src/ir/mod.rs b/src/ir/mod.rs index 9fe0beb590..e624e46bd2 100644 --- a/src/ir/mod.rs +++ b/src/ir/mod.rs @@ -14,6 +14,7 @@ pub mod item; pub mod item_kind; pub mod layout; pub mod module; +pub mod named; pub mod traversal; pub mod ty; pub mod var; diff --git a/src/ir/named.rs b/src/ir/named.rs new file mode 100644 index 0000000000..7a6c597ca2 --- /dev/null +++ b/src/ir/named.rs @@ -0,0 +1,471 @@ +//! Discover which template type parameters are actually used. +//! +//! ### Why do we care? +//! +//! C++ allows ignoring template parameters, while Rust does not. Usually we can +//! blindly stick a `PhantomData` inside a generic Rust struct to make up for +//! this. That doesn't work for templated type aliases, however: +//! +//! ```C++ +//! template +//! using Fml = int; +//! ``` +//! +//! If we generate the naive Rust code for this alias, we get: +//! +//! ```ignore +//! pub type Fml = ::std::os::raw::int; +//! ``` +//! +//! And this is rejected by `rustc` due to the unused type parameter. +//! +//! (Aside: in these simple cases, `libclang` will often just give us the +//! aliased type directly, and we will never even know we were dealing with +//! aliases, let alone templated aliases. It's the more convoluted scenarios +//! where we get to have some fun...) +//! +//! For such problematic template aliases, we could generate a tuple whose +//! second member is a `PhantomData`. Or, if we wanted to go the extra mile, +//! we could even generate some smarter wrapper that implements `Deref`, +//! `DerefMut`, `From`, `Into`, `AsRef`, and `AsMut` to the actually aliased +//! type. However, this is still lackluster: +//! +//! 1. Even with a billion conversion-trait implementations, using the generated +//! bindings is rather un-ergonomic. +//! 2. With either of these solutions, we need to keep track of which aliases +//! we've transformed like this in order to generate correct uses of the +//! wrapped type. +//! +//! Given that we have to properly track which template parameters ended up used +//! for (2), we might as well leverage that information to make ergonomic +//! bindings that don't contain any unused type parameters at all, and +//! completely avoid the pain of (1). +//! +//! ### How do we determine which template parameters are used? +//! +//! Determining which template parameters are actually used is a trickier +//! problem than it might seem at a glance. On the one hand, trivial uses are +//! easy to detect: +//! +//! ```C++ +//! template +//! class Foo { +//! T trivial_use_of_t; +//! }; +//! ``` +//! +//! It gets harder when determining if one template parameter is used depends on +//! determining if another template parameter is used. In this example, whether +//! `U` is used depends on whether `T` is used. +//! +//! ```C++ +//! template +//! class DoesntUseT { +//! int x; +//! }; +//! +//! template +//! class Fml { +//! DoesntUseT lololol; +//! }; +//! ``` +//! +//! We can express the set of used template parameters as a constraint solving +//! problem (where the set of template parameters used by a given IR item is the +//! union of its sub-item's used template parameters) and iterate to a +//! fixed-point. +//! +//! We use the "monotone framework" for this fix-point analysis where our +//! lattice is the powerset of the template parameters that appear in the input +//! C++ header, our join function is set union, and we use the +//! `ir::traversal::Trace` trait to implement the work-list optimization so we +//! don't have to revisit every node in the graph when for every iteration +//! towards the fix-point. +//! +//! For a deeper introduction to the general form of this kind of analysis, see +//! [Static Program Analysis by Anders Møller and Michael I. Schwartzbach][spa]. +//! +//! [spa]: https://cs.au.dk/~amoeller/spa/spa.pdf + +use std::collections::HashMap; +use std::fmt; +use super::context::{BindgenContext, ItemId}; +use super::item::ItemSet; +use super::traversal::{EdgeKind, Trace}; +use super::ty::{TemplateDeclaration, TypeKind}; + +/// An analysis in the monotone framework. +/// +/// Implementors of this trait must maintain the following two invariants: +/// +/// 1. The concrete data must be a member of a finite-height lattice. +/// 2. The concrete `constrain` method must be monotone: that is, +/// if `x <= y`, then `constrain(x) <= constrain(y)`. +/// +/// If these invariants do not hold, iteration to a fix-point might never +/// complete. +/// +/// For a simple example analysis, see the `ReachableFrom` type in the `tests` +/// module below. +pub trait MonotoneFramework: Sized + fmt::Debug { + /// The type of node in our dependency graph. + /// + /// This is just generic (and not `ItemId`) so that we can easily unit test + /// without constructing real `Item`s and their `ItemId`s. + type Node: Copy; + + /// Any extra data that is needed during computation. + /// + /// Again, this is just generic (and not `&BindgenContext`) so that we can + /// easily unit test without constructing real `BindgenContext`s full of + /// real `Item`s and real `ItemId`s. + type Extra: Sized; + + /// The final output of this analysis. Once we have reached a fix-point, we + /// convert `self` into this type, and return it as the final result of the + /// analysis. + type Output: From; + + /// Construct a new instance of this analysis. + fn new(extra: Self::Extra) -> Self; + + /// Get the initial set of nodes from which to start the analysis. Unless + /// you are sure of some domain-specific knowledge, this should be the + /// complete set of nodes. + fn initial_worklist(&self) -> Vec; + + /// Update the analysis for the given node. + /// + /// If this results in changing our internal state (ie, we discovered that + /// we have not reached a fix-point and iteration should continue), return + /// `true`. Otherwise, return `false`. When `constrain` returns false for + /// all nodes in the set, we have reached a fix-point and the analysis is + /// complete. + fn constrain(&mut self, node: Self::Node) -> bool; + + /// For each node `d` that depends on the given `node`'s current answer when + /// running `constrain(d)`, call `f(d)`. This informs us which new nodes to + /// queue up in the worklist when `constrain(node)` reports updated + /// information. + fn each_depending_on(&self, node: Self::Node, f: F) + where F: FnMut(Self::Node); +} + +/// Run an analysis in the monotone framework. +// TODO: This allow(...) is just temporary until we replace +// `Item::signature_contains_named_type` with +// `analyze::`. +#[allow(dead_code)] +pub fn analyze(extra: Analysis::Extra) -> Analysis::Output + where Analysis: MonotoneFramework +{ + let mut analysis = Analysis::new(extra); + let mut worklist = analysis.initial_worklist(); + + while let Some(node) = worklist.pop() { + if analysis.constrain(node) { + analysis.each_depending_on(node, |needs_work| { + worklist.push(needs_work); + }); + } + } + + analysis.into() +} + +/// An analysis that finds the set of template parameters that actually end up +/// used in our generated bindings. +#[derive(Debug, Clone)] +pub struct UsedTemplateParameters<'a> { + ctx: &'a BindgenContext<'a>, + used: ItemSet, + dependencies: HashMap>, +} + +impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { + type Node = ItemId; + type Extra = &'a BindgenContext<'a>; + type Output = ItemSet; + + fn new(ctx: &'a BindgenContext<'a>) -> UsedTemplateParameters<'a> { + let mut dependencies = HashMap::new(); + + for item in ctx.whitelisted_items() { + { + // We reverse our natural IR graph edges to find dependencies + // between nodes. + let mut add_reverse_edge = |sub_item, _| { + dependencies.entry(sub_item).or_insert(vec![]).push(item); + }; + item.trace(ctx, &mut add_reverse_edge, &()); + } + + // Additionally, whether a template instantiation's template + // arguments are used depends on whether the template declaration's + // generic template parameters are used. + ctx.resolve_item_fallible(item) + .and_then(|item| item.as_type()) + .map(|ty| match ty.kind() { + &TypeKind::TemplateInstantiation(decl, ref args) => { + let decl = ctx.resolve_type(decl); + let params = decl.template_params(ctx) + .expect("a template instantiation's referenced \ + template declaration should have template \ + parameters"); + for (arg, param) in args.iter().zip(params.iter()) { + dependencies.entry(*arg).or_insert(vec![]).push(*param); + } + } + _ => {} + }); + } + + UsedTemplateParameters { + ctx: ctx, + used: ItemSet::new(), + dependencies: dependencies, + } + } + + fn initial_worklist(&self) -> Vec { + self.ctx.whitelisted_items().collect() + } + + fn constrain(&mut self, item: ItemId) -> bool { + let original_size = self.used.len(); + + item.trace(self.ctx, &mut |item, edge_kind| { + if edge_kind == EdgeKind::TemplateParameterDefinition { + // The definition of a template parameter is not considered a + // use of said template parameter. Ignore this edge. + return; + } + + let ty_kind = self.ctx.resolve_item(item) + .as_type() + .map(|ty| ty.kind()); + + match ty_kind { + Some(&TypeKind::Named) => { + // This is a "trivial" use of the template type parameter. + self.used.insert(item); + }, + Some(&TypeKind::TemplateInstantiation(decl, ref args)) => { + // A template instantiation's concrete template argument is + // only used if the template declaration uses the + // corresponding template parameter. + let decl = self.ctx.resolve_type(decl); + let params = decl.template_params(self.ctx) + .expect("a template instantiation's referenced \ + template declaration should have template \ + parameters"); + for (arg, param) in args.iter().zip(params.iter()) { + if self.used.contains(param) { + if self.ctx.resolve_item(*arg).is_named() { + self.used.insert(*arg); + } + } + } + }, + _ => return, + } + }, &()); + + let new_size = self.used.len(); + new_size != original_size + } + + fn each_depending_on(&self, item: ItemId, mut f: F) + where F: FnMut(Self::Node) + { + if let Some(edges) = self.dependencies.get(&item) { + for item in edges { + f(*item); + } + } + } +} + +impl<'a> From> for ItemSet { + fn from(used_templ_params: UsedTemplateParameters) -> ItemSet { + used_templ_params.used + } +} + +#[cfg(test)] +mod tests { + use std::collections::{HashMap, HashSet}; + use super::*; + + // Here we find the set of nodes that are reachable from any given + // node. This is a lattice mapping nodes to subsets of all nodes. Our join + // function is set union. + // + // This is our test graph: + // + // +---+ +---+ + // | | | | + // | 1 | .----| 2 | + // | | | | | + // +---+ | +---+ + // | | ^ + // | | | + // | +---+ '------' + // '----->| | + // | 3 | + // .------| |------. + // | +---+ | + // | ^ | + // v | v + // +---+ | +---+ +---+ + // | | | | | | | + // | 4 | | | 5 |--->| 6 | + // | | | | | | | + // +---+ | +---+ +---+ + // | | | | + // | | | v + // | +---+ | +---+ + // | | | | | | + // '----->| 7 |<-----' | 8 | + // | | | | + // +---+ +---+ + // + // And here is the mapping from a node to the set of nodes that are + // reachable from it within the test graph: + // + // 1: {3,4,5,6,7,8} + // 2: {2} + // 3: {3,4,5,6,7,8} + // 4: {3,4,5,6,7,8} + // 5: {3,4,5,6,7,8} + // 6: {8} + // 7: {3,4,5,6,7,8} + // 8: {} + + #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)] + struct Node(usize); + + #[derive(Clone, Debug, Default, PartialEq, Eq)] + struct Graph(HashMap>); + + impl Graph { + fn make_test_graph() -> Graph { + let mut g = Graph::default(); + g.0.insert(Node(1), vec![Node(3)]); + g.0.insert(Node(2), vec![Node(2)]); + g.0.insert(Node(3), vec![Node(4), Node(5)]); + g.0.insert(Node(4), vec![Node(7)]); + g.0.insert(Node(5), vec![Node(6), Node(7)]); + g.0.insert(Node(6), vec![Node(8)]); + g.0.insert(Node(7), vec![Node(3)]); + g.0.insert(Node(8), vec![]); + g + } + + fn reverse(&self) -> Graph { + let mut reversed = Graph::default(); + for (node, edges) in self.0.iter() { + reversed.0.entry(*node).or_insert(vec![]); + for referent in edges.iter() { + reversed.0.entry(*referent).or_insert(vec![]).push(*node); + } + } + reversed + } + } + + #[derive(Clone, Debug, PartialEq, Eq)] + struct ReachableFrom<'a> { + reachable: HashMap>, + graph: &'a Graph, + reversed: Graph, + } + + impl<'a> MonotoneFramework for ReachableFrom<'a> { + type Node = Node; + type Extra = &'a Graph; + type Output = HashMap>; + + fn new(graph: &'a Graph) -> ReachableFrom { + let reversed = graph.reverse(); + ReachableFrom { + reachable: Default::default(), + graph: graph, + reversed: reversed, + } + } + + fn initial_worklist(&self) -> Vec { + self.graph.0.keys().cloned().collect() + } + + fn constrain(&mut self, node: Node) -> bool { + // The set of nodes reachable from a node `x` is + // + // reachable(x) = s_0 U s_1 U ... U reachable(s_0) U reachable(s_1) U ... + // + // where there exist edges from `x` to each of `s_0, s_1, ...`. + // + // Yes, what follows is a **terribly** inefficient set union + // implementation. Don't copy this code outside of this test! + + let original_size = self.reachable.entry(node).or_insert(HashSet::new()).len(); + + for sub_node in self.graph.0[&node].iter() { + self.reachable.get_mut(&node).unwrap().insert(*sub_node); + + let sub_reachable = self.reachable + .entry(*sub_node) + .or_insert(HashSet::new()) + .clone(); + + for transitive in sub_reachable { + self.reachable.get_mut(&node).unwrap().insert(transitive); + } + } + + let new_size = self.reachable[&node].len(); + original_size != new_size + } + + fn each_depending_on(&self, node: Node, mut f: F) + where F: FnMut(Node) + { + for dep in self.reversed.0[&node].iter() { + f(*dep); + } + } + } + + impl<'a> From> for HashMap> { + fn from(reachable: ReachableFrom<'a>) -> Self { + reachable.reachable + } + } + + #[test] + fn monotone() { + let g = Graph::make_test_graph(); + let reachable = analyze::(&g); + println!("reachable = {:#?}", reachable); + + fn nodes(nodes: A) -> HashSet + where A: AsRef<[usize]> + { + nodes.as_ref().iter().cloned().map(Node).collect() + } + + let mut expected = HashMap::new(); + expected.insert(Node(1), nodes([3,4,5,6,7,8])); + expected.insert(Node(2), nodes([2])); + expected.insert(Node(3), nodes([3,4,5,6,7,8])); + expected.insert(Node(4), nodes([3,4,5,6,7,8])); + expected.insert(Node(5), nodes([3,4,5,6,7,8])); + expected.insert(Node(6), nodes([8])); + expected.insert(Node(7), nodes([3,4,5,6,7,8])); + expected.insert(Node(8), nodes([])); + println!("expected = {:#?}", expected); + + assert_eq!(reachable, expected); + } +} diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs index eb4fc68601..8c5e32cfc3 100644 --- a/src/ir/traversal.rs +++ b/src/ir/traversal.rs @@ -202,6 +202,14 @@ pub trait Tracer { } } +impl Tracer for F + where F: FnMut(ItemId, EdgeKind) +{ + fn visit_kind(&mut self, item: ItemId, kind: EdgeKind) { + (*self)(item, kind) + } +} + /// Trace all of the outgoing edges to other items. Implementations should call /// `tracer.visit(edge)` for each of their outgoing edges. pub trait Trace { From aed97c56356fedadf511b04b982a6f04185c2eff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 15 Feb 2017 14:07:33 +0100 Subject: [PATCH 0344/2291] Update clang-sys. Fixes https://github.com/servo/rust-bindgen/issues/439 --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- src/clang.rs | 4 ---- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0958343507..0ae1dc41ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,7 +5,7 @@ dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "clang-sys 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "clang-sys 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.19.3 (registry+https://github.com/rust-lang/crates.io-index)", "diff 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -60,7 +60,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "clang-sys" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -429,7 +429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d" "checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c" -"checksum clang-sys 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "822ea22bbbef9f5934e9477860545fb0311a1759e43a276de42e2856c605aa2b" +"checksum clang-sys 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f98f0715ff67f27ca6a2f8f0ffc2a56f8edbc7acd57489c29eadc3a15c4eafe" "checksum clap 2.19.3 (registry+https://github.com/rust-lang/crates.io-index)" = "95b78f3fe0fc94c13c731714363260e04b557a637166f33a4570d3189d642374" "checksum diff 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e48977eec6d3b7707462c2dc2e1363ad91b5dd822cf942537ccdc2085dc87587" "checksum dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0dd841b58510c9618291ffa448da2e4e0f699d984d436122372f446dae62263d" diff --git a/Cargo.toml b/Cargo.toml index a5472af31d..c732337ee3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,7 +39,7 @@ quasi_codegen = "0.29" [dependencies] cexpr = "0.2" cfg-if = "0.1.0" -clang-sys = { version = "0.12", features = ["runtime", "clang_3_9"] } +clang-sys = { version = "0.14", features = ["runtime", "clang_3_9"] } lazy_static = "0.2.1" rustc-serialize = "0.3.19" syntex_syntax = "0.54" diff --git a/src/clang.rs b/src/clang.rs index e62ff74c74..613e08e849 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -662,10 +662,6 @@ pub enum LayoutError { impl ::std::convert::From for LayoutError { fn from(val: i32) -> Self { use self::LayoutError::*; - let val = match CXTypeLayoutError::from_raw(val) { - Some(val) => val, - None => return Unknown, - }; match val { CXTypeLayoutError_Invalid => Invalid, From 73a2b347f2760efaad035d07a1aae7e713bf6c99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Lesin=CC=81ski?= Date: Wed, 15 Feb 2017 13:54:58 +0000 Subject: [PATCH 0345/2291] Support older clang --- src/clang.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/clang.rs b/src/clang.rs index e62ff74c74..4b3ae6967c 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -879,7 +879,11 @@ impl Type { pub fn named(&self) -> Type { unsafe { Type { - x: clang_Type_getNamedType(self.x), + x: if clang_Type_getNamedType::is_loaded() { + clang_Type_getNamedType(self.x) + } else { + self.x + }, } } } From 4d628c9f0da7b35f933db00b6d686c04dedbbf22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Lesin=CC=81ski?= Date: Wed, 15 Feb 2017 15:45:53 +0000 Subject: [PATCH 0346/2291] Use typedef-derived name for anonymous structs and unions --- src/ir/ty.rs | 15 ++++++++ .../tests/bitfield_method_mangling.rs | 20 ++++++----- tests/expectations/tests/layout_array.rs | 19 +++++----- tests/expectations/tests/layout_mbuf.rs | 19 +++++----- tests/expectations/tests/union_fields.rs | 35 +++++++++---------- tests/expectations/tests/unknown_attr.rs | 23 ++++++------ 6 files changed, 72 insertions(+), 59 deletions(-) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index ec168f0239..78ae6cb251 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1080,6 +1080,16 @@ impl Type { let complex = CompInfo::from_ty(potential_id, ty, location, ctx) .expect("Not a complex type?"); + + if name.is_empty() { + // The pretty-printed name may contain typedefed name, + // but may also be "struct (anonymous at .h:1)" + let pretty_name = ty.spelling(); + if Self::is_valid_identifier(&pretty_name) { + name = pretty_name; + } + } + TypeKind::Comp(complex) } // FIXME: We stub vectors as arrays since in 99% of the cases the @@ -1124,6 +1134,11 @@ impl Type { // TODO: maybe declaration.canonical()? Ok(ParseResult::New(ty, Some(cursor.canonical()))) } + + fn is_valid_identifier(name: &str) -> bool { + name.chars().next().map(|first|first.is_alphabetic()).unwrap_or(false) && + name.chars().all(|ch|ch.is_alphanumeric() || ch == '_') + } } impl Trace for Type { diff --git a/tests/expectations/tests/bitfield_method_mangling.rs b/tests/expectations/tests/bitfield_method_mangling.rs index 0ab5fce557..0a6c9fddb8 100644 --- a/tests/expectations/tests/bitfield_method_mangling.rs +++ b/tests/expectations/tests/bitfield_method_mangling.rs @@ -6,20 +6,23 @@ #[repr(C)] #[derive(Debug, Default, Copy)] -pub struct _bindgen_ty_1 { +pub struct mach_msg_type_descriptor_t { pub _bitfield_1: u32, } #[test] -fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize , concat ! ( - "Size of: " , stringify ! ( _bindgen_ty_1 ) )); - assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize , concat ! ( - "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); +fn bindgen_test_layout_mach_msg_type_descriptor_t() { + assert_eq!(::std::mem::size_of::() , 4usize , + concat ! ( + "Size of: " , stringify ! ( mach_msg_type_descriptor_t ) )); + assert_eq! (::std::mem::align_of::() , 4usize + , concat ! ( + "Alignment of " , stringify ! ( mach_msg_type_descriptor_t ) + )); } -impl Clone for _bindgen_ty_1 { +impl Clone for mach_msg_type_descriptor_t { fn clone(&self) -> Self { *self } } -impl _bindgen_ty_1 { +impl mach_msg_type_descriptor_t { #[inline] pub fn pad3(&self) -> ::std::os::raw::c_uint { unsafe { @@ -48,4 +51,3 @@ impl _bindgen_ty_1 { ((val as u32 as u32) << 24u32) & (4278190080usize as u32); } } -pub type mach_msg_type_descriptor_t = _bindgen_ty_1; diff --git a/tests/expectations/tests/layout_array.rs b/tests/expectations/tests/layout_array.rs index c28d3ec843..2cc8578519 100644 --- a/tests/expectations/tests/layout_array.rs +++ b/tests/expectations/tests/layout_array.rs @@ -117,26 +117,25 @@ impl Default for rte_mempool_ops { */ #[repr(C)] #[derive(Debug, Default, Copy)] -pub struct _bindgen_ty_1 { +pub struct rte_spinlock_t { /**< lock status 0 = unlocked, 1 = locked */ pub locked: ::std::os::raw::c_int, } #[test] -fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize , concat ! ( - "Size of: " , stringify ! ( _bindgen_ty_1 ) )); - assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize , concat ! ( - "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); +fn bindgen_test_layout_rte_spinlock_t() { + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( rte_spinlock_t ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( rte_spinlock_t ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _bindgen_ty_1 ) ) . locked as * const _ + & ( * ( 0 as * const rte_spinlock_t ) ) . locked as * const _ as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + "Alignment of field: " , stringify ! ( rte_spinlock_t ) , "::" , stringify ! ( locked ) )); } -impl Clone for _bindgen_ty_1 { +impl Clone for rte_spinlock_t { fn clone(&self) -> Self { *self } } -pub type rte_spinlock_t = _bindgen_ty_1; /** * Structure storing the table of registered ops structs, each of which contain * the function pointers for the mempool ops functions. diff --git a/tests/expectations/tests/layout_mbuf.rs b/tests/expectations/tests/layout_mbuf.rs index 189b50a5d4..5732831a0f 100644 --- a/tests/expectations/tests/layout_mbuf.rs +++ b/tests/expectations/tests/layout_mbuf.rs @@ -39,26 +39,25 @@ pub type MARKER64 = [u64; 0usize]; */ #[repr(C)] #[derive(Debug, Default, Copy)] -pub struct _bindgen_ty_1 { +pub struct rte_atomic16_t { /**< An internal counter value. */ pub cnt: i16, } #[test] -fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 2usize , concat ! ( - "Size of: " , stringify ! ( _bindgen_ty_1 ) )); - assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 2usize , concat ! ( - "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); +fn bindgen_test_layout_rte_atomic16_t() { + assert_eq!(::std::mem::size_of::() , 2usize , concat ! ( + "Size of: " , stringify ! ( rte_atomic16_t ) )); + assert_eq! (::std::mem::align_of::() , 2usize , concat ! ( + "Alignment of " , stringify ! ( rte_atomic16_t ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _bindgen_ty_1 ) ) . cnt as * const _ as + & ( * ( 0 as * const rte_atomic16_t ) ) . cnt as * const _ as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + "Alignment of field: " , stringify ! ( rte_atomic16_t ) , "::" , stringify ! ( cnt ) )); } -impl Clone for _bindgen_ty_1 { +impl Clone for rte_atomic16_t { fn clone(&self) -> Self { *self } } -pub type rte_atomic16_t = _bindgen_ty_1; /** * The generic rte_mbuf, containing a packet mbuf. */ diff --git a/tests/expectations/tests/union_fields.rs b/tests/expectations/tests/union_fields.rs index 823a0b8b36..8c8ef7d58e 100644 --- a/tests/expectations/tests/union_fields.rs +++ b/tests/expectations/tests/union_fields.rs @@ -30,35 +30,34 @@ impl ::std::fmt::Debug for __BindgenUnionField { } #[repr(C)] #[derive(Debug, Default, Copy)] -pub struct _bindgen_ty_1 { +pub struct nsStyleUnion { pub mInt: __BindgenUnionField<::std::os::raw::c_int>, pub mFloat: __BindgenUnionField, pub mPointer: __BindgenUnionField<*mut ::std::os::raw::c_void>, pub bindgen_union_field: u64, } #[test] -fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 8usize , concat ! ( - "Size of: " , stringify ! ( _bindgen_ty_1 ) )); - assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 8usize , concat ! ( - "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); +fn bindgen_test_layout_nsStyleUnion() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( nsStyleUnion ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( nsStyleUnion ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _bindgen_ty_1 ) ) . mInt as * const _ as + & ( * ( 0 as * const nsStyleUnion ) ) . mInt as * const _ as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" - , stringify ! ( mInt ) )); + "Alignment of field: " , stringify ! ( nsStyleUnion ) , "::" , + stringify ! ( mInt ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _bindgen_ty_1 ) ) . mFloat as * const _ - as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" - , stringify ! ( mFloat ) )); + & ( * ( 0 as * const nsStyleUnion ) ) . mFloat as * const _ as + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( nsStyleUnion ) , "::" , + stringify ! ( mFloat ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _bindgen_ty_1 ) ) . mPointer as * const _ + & ( * ( 0 as * const nsStyleUnion ) ) . mPointer as * const _ as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" - , stringify ! ( mPointer ) )); + "Alignment of field: " , stringify ! ( nsStyleUnion ) , "::" , + stringify ! ( mPointer ) )); } -impl Clone for _bindgen_ty_1 { +impl Clone for nsStyleUnion { fn clone(&self) -> Self { *self } } -pub type nsStyleUnion = _bindgen_ty_1; diff --git a/tests/expectations/tests/unknown_attr.rs b/tests/expectations/tests/unknown_attr.rs index efb8610229..2c50c36543 100644 --- a/tests/expectations/tests/unknown_attr.rs +++ b/tests/expectations/tests/unknown_attr.rs @@ -6,30 +6,29 @@ #[repr(C)] #[derive(Debug, Default, Copy)] -pub struct _bindgen_ty_1 { +pub struct max_align_t { pub __clang_max_align_nonce1: ::std::os::raw::c_longlong, pub __bindgen_padding_0: u64, pub __clang_max_align_nonce2: f64, pub __bindgen_padding_1: u64, } #[test] -fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 32usize , concat ! ( - "Size of: " , stringify ! ( _bindgen_ty_1 ) )); +fn bindgen_test_layout_max_align_t() { + assert_eq!(::std::mem::size_of::() , 32usize , concat ! ( + "Size of: " , stringify ! ( max_align_t ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _bindgen_ty_1 ) ) . + & ( * ( 0 as * const max_align_t ) ) . __clang_max_align_nonce1 as * const _ as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" - , stringify ! ( __clang_max_align_nonce1 ) )); + "Alignment of field: " , stringify ! ( max_align_t ) , "::" , + stringify ! ( __clang_max_align_nonce1 ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _bindgen_ty_1 ) ) . + & ( * ( 0 as * const max_align_t ) ) . __clang_max_align_nonce2 as * const _ as usize } , 16usize , concat ! ( - "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" - , stringify ! ( __clang_max_align_nonce2 ) )); + "Alignment of field: " , stringify ! ( max_align_t ) , "::" , + stringify ! ( __clang_max_align_nonce2 ) )); } -impl Clone for _bindgen_ty_1 { +impl Clone for max_align_t { fn clone(&self) -> Self { *self } } -pub type max_align_t = _bindgen_ty_1; From 06268ebcc0bc20330e4985b6d765c2976124e60d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Lesin=CC=81ski?= Date: Wed, 15 Feb 2017 16:13:30 +0000 Subject: [PATCH 0347/2291] Use typedef-derived name for anonymous enums --- src/ir/ty.rs | 8 +++ tests/expectations/tests/anon_enum.rs | 5 +- tests/expectations/tests/issue-410.rs | 3 +- tests/expectations/tests/struct_typedef.rs | 61 ++++++++++++++++++++++ tests/headers/struct_typedef.h | 15 ++++++ 5 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 tests/expectations/tests/struct_typedef.rs create mode 100644 tests/headers/struct_typedef.h diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 78ae6cb251..91fbc6e9cc 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1074,6 +1074,14 @@ impl Type { } CXType_Enum => { let enum_ = Enum::from_ty(ty, ctx).expect("Not an enum?"); + + if name.is_empty() { + let pretty_name = ty.spelling(); + if Self::is_valid_identifier(&pretty_name) { + name = pretty_name; + } + } + TypeKind::Enum(enum_) } CXType_Record => { diff --git a/tests/expectations/tests/anon_enum.rs b/tests/expectations/tests/anon_enum.rs index 07ea481062..71abc77be8 100644 --- a/tests/expectations/tests/anon_enum.rs +++ b/tests/expectations/tests/anon_enum.rs @@ -34,9 +34,6 @@ fn bindgen_test_layout_Test() { impl Clone for Test { fn clone(&self) -> Self { *self } } -pub const Foo: _bindgen_ty_1 = _bindgen_ty_1::Foo; -pub const Bar: _bindgen_ty_1 = _bindgen_ty_1::Bar; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub enum _bindgen_ty_1 { Foo = 0, Bar = 1, } -pub use self::_bindgen_ty_1 as Baz; +pub enum Baz { Foo = 0, Bar = 1, } diff --git a/tests/expectations/tests/issue-410.rs b/tests/expectations/tests/issue-410.rs index 2fe0f99b27..3c6cd2809d 100644 --- a/tests/expectations/tests/issue-410.rs +++ b/tests/expectations/tests/issue-410.rs @@ -38,6 +38,5 @@ pub mod root { } } #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] - pub enum _bindgen_ty_1 { } - pub use self::super::root::_bindgen_ty_1 as JSWhyMagic; + pub enum JSWhyMagic { } } diff --git a/tests/expectations/tests/struct_typedef.rs b/tests/expectations/tests/struct_typedef.rs new file mode 100644 index 0000000000..63811bda7a --- /dev/null +++ b/tests/expectations/tests/struct_typedef.rs @@ -0,0 +1,61 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct typedef_named_struct { + pub has_name: bool, +} +#[test] +fn bindgen_test_layout_typedef_named_struct() { + assert_eq!(::std::mem::size_of::() , 1usize , concat + ! ( "Size of: " , stringify ! ( typedef_named_struct ) )); + assert_eq! (::std::mem::align_of::() , 1usize , + concat ! ( + "Alignment of " , stringify ! ( typedef_named_struct ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const typedef_named_struct ) ) . has_name as * + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( typedef_named_struct ) + , "::" , stringify ! ( has_name ) )); +} +impl Clone for typedef_named_struct { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct _bindgen_ty_1 { + pub no_name: *mut ::std::os::raw::c_void, +} +#[test] +fn bindgen_test_layout__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 8usize , concat ! ( + "Size of: " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 8usize , concat ! ( + "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . no_name as * const _ + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( no_name ) )); +} +impl Clone for _bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +impl Default for _bindgen_ty_1 { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +pub type struct_ptr_t = *mut _bindgen_ty_1; +pub type struct_ptr_ptr_t = *mut *mut _bindgen_ty_1; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum typedef_named_enum { ENUM_HAS_NAME = 1, } +pub const ENUM_IS_ANON: _bindgen_ty_2 = _bindgen_ty_2::ENUM_IS_ANON; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum _bindgen_ty_2 { ENUM_IS_ANON = 0, } +pub type enum_ptr_t = *mut _bindgen_ty_2; +pub type enum_ptr_ptr_t = *mut *mut _bindgen_ty_2; diff --git a/tests/headers/struct_typedef.h b/tests/headers/struct_typedef.h new file mode 100644 index 0000000000..fdce9a721d --- /dev/null +++ b/tests/headers/struct_typedef.h @@ -0,0 +1,15 @@ +typedef struct { + _Bool has_name; +} typedef_named_struct; + +typedef struct { + void *no_name; +} *struct_ptr_t, **struct_ptr_ptr_t; + +typedef enum { + ENUM_HAS_NAME=1 +} typedef_named_enum; + +typedef enum { + ENUM_IS_ANON +} *enum_ptr_t, **enum_ptr_ptr_t; From fd70398e7b6e315fed9500beb5e726bb3108eb0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Lesin=CC=81ski?= Date: Wed, 15 Feb 2017 17:17:24 +0000 Subject: [PATCH 0348/2291] Test typedefed anon structs in C++ --- tests/expectations/tests/struct_typedef_ns.rs | 79 +++++++++++++++++++ tests/headers/struct_typedef_ns.hpp | 21 +++++ 2 files changed, 100 insertions(+) create mode 100644 tests/expectations/tests/struct_typedef_ns.rs create mode 100644 tests/headers/struct_typedef_ns.hpp diff --git a/tests/expectations/tests/struct_typedef_ns.rs b/tests/expectations/tests/struct_typedef_ns.rs new file mode 100644 index 0000000000..d7ada7fd1e --- /dev/null +++ b/tests/expectations/tests/struct_typedef_ns.rs @@ -0,0 +1,79 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub mod root { + #[allow(unused_imports)] + use self::super::root; + pub mod whatever { + #[allow(unused_imports)] + use self::super::super::root; + #[repr(C)] + #[derive(Debug, Default, Copy)] + pub struct _bindgen_ty_1 { + pub foo: ::std::os::raw::c_int, + } + #[test] + fn bindgen_test_layout__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize , + concat ! ( "Size of: " , stringify ! ( _bindgen_ty_1 ) + )); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . foo as * + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) + , "::" , stringify ! ( foo ) )); + } + impl Clone for _bindgen_ty_1 { + fn clone(&self) -> Self { *self } + } + pub type typedef_struct = root::whatever::_bindgen_ty_1; + pub const whatever_BAR: root::whatever::_bindgen_ty_2 = + _bindgen_ty_2::BAR; + #[repr(u32)] + #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] + pub enum _bindgen_ty_2 { BAR = 1, } + pub use self::super::super::root::whatever::_bindgen_ty_2 as + typedef_enum; + } + pub mod _bindgen_mod_id_12 { + #[allow(unused_imports)] + use self::super::super::root; + #[repr(C)] + #[derive(Debug, Default, Copy)] + pub struct _bindgen_ty_1 { + pub foo: ::std::os::raw::c_int, + } + #[test] + fn bindgen_test_layout__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize , + concat ! ( "Size of: " , stringify ! ( _bindgen_ty_1 ) + )); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . foo as * + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) + , "::" , stringify ! ( foo ) )); + } + impl Clone for _bindgen_ty_1 { + fn clone(&self) -> Self { *self } + } + pub type typedef_struct = root::_bindgen_mod_id_12::_bindgen_ty_1; + pub const _bindgen_mod_id_12_BAR: + root::_bindgen_mod_id_12::_bindgen_ty_2 = + _bindgen_ty_2::BAR; + #[repr(u32)] + #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] + pub enum _bindgen_ty_2 { BAR = 1, } + pub use self::super::super::root::_bindgen_mod_id_12::_bindgen_ty_2 as + typedef_enum; + } +} diff --git a/tests/headers/struct_typedef_ns.hpp b/tests/headers/struct_typedef_ns.hpp new file mode 100644 index 0000000000..bc89eb2be3 --- /dev/null +++ b/tests/headers/struct_typedef_ns.hpp @@ -0,0 +1,21 @@ +// bindgen-flags: --enable-cxx-namespaces + +namespace whatever { + typedef struct { + int foo; + } typedef_struct; + + typedef enum { + BAR=1 + } typedef_enum; +} + +namespace { + typedef struct { + int foo; + } typedef_struct; + + typedef enum { + BAR=1 + } typedef_enum; +} From 4a14681bf8f224e0eb19d09bf75bebfa2b40d8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Lesin=CC=81ski?= Date: Wed, 15 Feb 2017 17:01:56 +0000 Subject: [PATCH 0349/2291] Reuse valid identifier check --- src/ir/ty.rs | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 91fbc6e9cc..470d953646 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -311,18 +311,17 @@ impl Type { match self.kind { TypeKind::Named => { let name = self.name().expect("Unnamed named type?"); - let mut chars = name.chars(); - let first = chars.next().unwrap(); - let mut remaining = chars; - - let valid = (first.is_alphabetic() || first == '_') && - remaining.all(|c| c.is_alphanumeric() || c == '_'); - - !valid + !Self::is_valid_identifier(&name) } _ => false, } } + pub fn is_valid_identifier(name: &str) -> bool { + let mut chars = name.chars(); + let first_valid = chars.next().map(|c| c.is_alphabetic() || c == '_').unwrap_or(false); + + first_valid && chars.all(|c| c.is_alphanumeric() || c == '_') + } /// See safe_canonical_type. pub fn canonical_type<'tr>(&'tr self, @@ -454,7 +453,6 @@ fn is_invalid_named_type_unnamed() { } #[test] -#[should_panic] fn is_invalid_named_type_empty_name() { let ty = Type::new(Some("".into()), None, TypeKind::Named, false); assert!(ty.is_invalid_named_type()) @@ -1142,11 +1140,6 @@ impl Type { // TODO: maybe declaration.canonical()? Ok(ParseResult::New(ty, Some(cursor.canonical()))) } - - fn is_valid_identifier(name: &str) -> bool { - name.chars().next().map(|first|first.is_alphabetic()).unwrap_or(false) && - name.chars().all(|ch|ch.is_alphanumeric() || ch == '_') - } } impl Trace for Type { From 70c61e1ebd1b0270953b8e33b74bfff578ccc82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Lesin=CC=81ski?= Date: Wed, 15 Feb 2017 19:12:22 +0000 Subject: [PATCH 0350/2291] Docs --- src/ir/ty.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 470d953646..332ad23687 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -316,6 +316,9 @@ impl Type { _ => false, } } + + /// Checks whether the name looks like an identifier, + /// i.e. is alphanumeric (including '_') and does not start with a digit. pub fn is_valid_identifier(name: &str) -> bool { let mut chars = name.chars(); let first_valid = chars.next().map(|c| c.is_alphabetic() || c == '_').unwrap_or(false); From da544124a2dcf5183ca0598bb7cce7af8b71b518 Mon Sep 17 00:00:00 2001 From: Artem Biryukov Date: Mon, 13 Feb 2017 22:35:28 +0300 Subject: [PATCH 0351/2291] Graphviz implementation --- CONTRIBUTING.md | 22 ++++++++++++++++++++++ src/codegen/mod.rs | 7 +++++++ src/ir/context.rs | 31 ++++++++++++++++++++++++++++++- src/ir/item.rs | 14 ++++++++++++++ src/ir/item_kind.rs | 10 ++++++++++ src/lib.rs | 11 +++++++++++ src/options.rs | 9 +++++++++ 7 files changed, 103 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cbaaf3c4ee..8c34710713 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,6 +15,7 @@ out to us in a GitHub issue, or stop by - [Overview](#overview) - [Running All Tests](#running-all-tests) - [Authoring New Tests](#authoring-new-tests) +- [Generating Graphviz Dot File](#generating-graphviz-dot-file) - [Automatic code formatting](#automatic-code-formatting) - [Debug Logging](#debug-logging) - [Using `creduce` to Minimize Test Cases](#using-creduce-to-minimize-test-cases) @@ -112,6 +113,27 @@ Then verify the new Rust bindings compile and pass some basic tests: $ cargo test -p tests_expectations ``` +## Generating Graphviz Dot Files + +We have a special thing which will help you debug your codegen context if something +will go wrong. It will generate a [`graphviz`](http://graphviz.org/pdf/dotguide.pdf) +dot file and then you can create a PNG from it with `graphviz` tool in your OS. + +Here is an example how it could be done: + +``` +$ cargo run -- example.hpp --emit-ir-graphviz output.dot +``` + +It will generate your graphviz dot file and then you will need tog +create a PNG from it with `graphviz`. + +Something like this: + +``` +$ dot -Tpng output.dot -o output.png +``` + ## Automatic code formatting We use [`rustfmt`](https://github.com/rust-lang-nursery/rustfmt) to enforce a diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 92e3487410..ad6736b074 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2499,6 +2499,13 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { } } + if let Some(path) = context.options().emit_ir_graphviz.as_ref() { + match context.emit_ir_graphviz(path.clone()) { + Ok(()) => info!("Your dot file was generated successfully into: {}", path), + Err(e) => error!("{}", e), + } + } + context.resolve_item(context.root_module()) .codegen(context, &mut result, &whitelisted_items, &()); diff --git a/src/ir/context.rs b/src/ir/context.rs index d2fb2befc6..7383c09a4c 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -5,7 +5,7 @@ use super::int::IntKind; use super::item::{Item, ItemCanonicalPath, ItemSet}; use super::item_kind::ItemKind; use super::module::{Module, ModuleKind}; -use super::traversal::{self, Edge, ItemTraversal}; +use super::traversal::{self, Edge, ItemTraversal, Trace}; use super::ty::{FloatKind, TemplateDeclaration, Type, TypeKind}; use BindgenOptions; use cexpr; @@ -18,6 +18,8 @@ use std::cell::Cell; use std::collections::{HashMap, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; +use std::fs::File; +use std::io::{self, Write}; use std::iter::IntoIterator; use syntax::ast::Ident; use syntax::codemap::{DUMMY_SP, Span}; @@ -1109,6 +1111,33 @@ impl<'ctx> BindgenContext<'ctx> { &self.options } + /// Output graphviz dot file. + pub fn emit_ir_graphviz(&self, path: String) -> io::Result<()> { + let file = try!(File::create(path)); + let mut dot_file = io::BufWriter::new(file); + writeln!(&mut dot_file, "digraph {{")?; + + let mut err: Option> = None; + + for (id, item) in self.items() { + writeln!(&mut dot_file, "{} {};", id.0, item.dot_attributes(self))?; + + item.trace(self, &mut |sub_id: ItemId, _edge_kind| { + match writeln!(&mut dot_file, "{} -> {};", id.0, sub_id.as_usize()) { + Ok(_) => {}, + Err(e) => err = Some(Err(e)), + } + }, &()); + + if err.is_some() { + return err.unwrap(); + } + } + + writeln!(&mut dot_file, "}}")?; + Ok(()) + } + /// Tokenizes a namespace cursor in order to get the name and kind of the /// namespace, fn tokenize_namespace(&self, diff --git a/src/ir/item.rs b/src/ir/item.rs index 5b78551385..8f16a96ff6 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -372,6 +372,20 @@ impl Item { self.id } + /// Get this `Item`'s dot attributes. + pub fn dot_attributes(&self, ctx: &BindgenContext) -> String { + format!("[fontname=\"courier\", label=< \ + \ + \ + \ + \ +
ItemId({})
name{}
kind{}
\ + >]", + self.id.as_usize(), + self.name(ctx).get(), + self.kind.kind_name()) + } + /// Get this `Item`'s parent's identifier. /// /// For the root module, the parent's ID is its own ID. diff --git a/src/ir/item_kind.rs b/src/ir/item_kind.rs index d9e4690cb4..3ff0673169 100644 --- a/src/ir/item_kind.rs +++ b/src/ir/item_kind.rs @@ -32,6 +32,16 @@ impl ItemKind { } } + /// Transform our `ItemKind` into a string. + pub fn kind_name(&self) -> &'static str { + match *self { + ItemKind::Module(..) => "Module", + ItemKind::Type(..) => "Type", + ItemKind::Function(..) => "Function", + ItemKind::Var(..) => "Var" + } + } + /// Is this a module? pub fn is_module(&self) -> bool { self.as_module().is_some() diff --git a/src/lib.rs b/src/lib.rs index 7bf9806487..42363ebdb1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -175,6 +175,13 @@ impl Builder { self } + /// Set the output graphviz file. + pub fn emit_ir_graphviz>(mut self, path: T) -> Builder { + let path = path.into(); + self.options.emit_ir_graphviz = Some(path); + self + } + /// Whether the generated bindings should contain documentation comments or /// not. /// @@ -491,6 +498,9 @@ pub struct BindgenOptions { /// True if we should dump our internal IR for debugging purposes. pub emit_ir: bool, + /// Output graphviz dot file. + pub emit_ir_graphviz: Option, + /// True if we should emulate C++ namespaces with Rust modules in the /// generated bindings. pub enable_cxx_namespaces: bool, @@ -595,6 +605,7 @@ impl Default for BindgenOptions { links: vec![], emit_ast: false, emit_ir: false, + emit_ir_graphviz: None, derive_debug: true, derive_default: false, enable_cxx_namespaces: false, diff --git a/src/options.rs b/src/options.rs index 49bad841c3..e54ee0124e 100644 --- a/src/options.rs +++ b/src/options.rs @@ -84,6 +84,11 @@ pub fn builder_from_flags Arg::with_name("emit-ir") .long("emit-ir") .help("Output our internal IR for debugging purposes."), + Arg::with_name("emit-ir-graphviz") + .long("emit-ir-graphviz") + .help("Dump graphviz dot file.") + .value_name("path") + .takes_value(true), Arg::with_name("enable-cxx-namespaces") .long("enable-cxx-namespaces") .help("Enable support for C++ namespaces."), @@ -270,6 +275,10 @@ pub fn builder_from_flags builder = builder.emit_ir(); } + if let Some(path) = matches.value_of("emit-ir-graphviz") { + builder = builder.emit_ir_graphviz(path); + } + if matches.is_present("enable-cxx-namespaces") { builder = builder.enable_cxx_namespaces(); } From 0d128822a01acaf26e6f6b5393e91ff3016afdb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 13 Feb 2017 22:48:22 +0100 Subject: [PATCH 0352/2291] Rework how bitfields are handled. --- build.rs | 1 + src/codegen/mod.rs | 170 +++++----- src/codegen/struct_layout.rs | 306 +++++++++++++----- src/ir/comp.rs | 72 +---- src/ir/enum_ty.rs | 17 +- src/ir/layout.rs | 25 +- src/ir/ty.rs | 35 +- tests/expectations/tests/bitfield_align.rs | 114 +++++++ .../tests/bitfield_method_mangling.rs | 30 +- .../expectations/tests/jsval_layout_opaque.rs | 32 +- tests/expectations/tests/layout_align.rs | 39 +-- tests/expectations/tests/layout_eth_conf.rs | 151 +-------- tests/expectations/tests/layout_mbuf.rs | 180 +---------- tests/expectations/tests/only_bitfields.rs | 27 +- .../tests/struct_with_bitfields.rs | 100 ------ .../tests/union_with_anon_struct_bitfield.rs | 29 +- tests/expectations/tests/unknown_attr.rs | 2 +- tests/expectations/tests/weird_bitfields.rs | 94 +----- tests/headers/bitfield_align.h | 41 +++ tests/headers/unknown_attr.h | 2 +- 20 files changed, 515 insertions(+), 952 deletions(-) create mode 100644 tests/expectations/tests/bitfield_align.rs create mode 100644 tests/headers/bitfield_align.h diff --git a/build.rs b/build.rs index c3633cd4fd..4e99c77949 100644 --- a/build.rs +++ b/build.rs @@ -11,6 +11,7 @@ mod codegen { quasi_codegen::expand(&src, &dst).unwrap(); println!("cargo:rerun-if-changed=src/codegen/mod.rs"); println!("cargo:rerun-if-changed=src/codegen/helpers.rs"); + println!("cargo:rerun-if-changed=src/codegen/struct_layout.rs"); } } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index ad6736b074..77f654e6e6 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2,7 +2,8 @@ mod helpers; mod struct_layout; use self::helpers::{BlobTyBuilder, attributes}; -use self::struct_layout::StructLayoutTracker; +use self::struct_layout::{align_to, bytes_from_bits}; +use self::struct_layout::{bytes_from_bits_pow2, StructLayoutTracker}; use aster; use ir::annotations::FieldAccessorKind; @@ -363,8 +364,7 @@ impl CodeGenerator for Module { } if item.id() == ctx.root_module() { - let saw_union = result.saw_union; - if saw_union && !ctx.options().unstable_rust { + if result.saw_union && !ctx.options().unstable_rust { utils::prepend_union_types(ctx, &mut *result); } if result.saw_incomplete_array { @@ -717,12 +717,12 @@ impl<'a> ItemToRustTy for Vtable<'a> { } struct Bitfield<'a> { - index: usize, + index: &'a mut usize, fields: Vec<&'a Field>, } impl<'a> Bitfield<'a> { - fn new(index: usize, fields: Vec<&'a Field>) -> Self { + fn new(index: &'a mut usize, fields: Vec<&'a Field>) -> Self { Bitfield { index: index, fields: fields, @@ -732,89 +732,96 @@ impl<'a> Bitfield<'a> { fn codegen_fields(self, ctx: &BindgenContext, fields: &mut Vec, - methods: &mut Vec) + _methods: &mut Vec) -> Layout { use aster::struct_field::StructFieldBuilder; - let mut total_width = self.fields - .iter() - .fold(0u32, |acc, f| acc + f.bitfield().unwrap()); - - if !total_width.is_power_of_two() || total_width < 8 { - total_width = cmp::max(8, total_width.next_power_of_two()); - } - debug_assert_eq!(total_width % 8, 0); - let total_width_in_bytes = total_width as usize / 8; - - let bitfield_layout = Layout::new(total_width_in_bytes, - total_width_in_bytes); - let bitfield_type = BlobTyBuilder::new(bitfield_layout).build(); - let field_name = format!("_bitfield_{}", self.index); - let field_ident = ctx.ext_cx().ident_of(&field_name); - let field = StructFieldBuilder::named(&field_name) - .pub_() - .build_ty(bitfield_type.clone()); - fields.push(field); + // NOTE: What follows is reverse-engineered from LLVM's + // lib/AST/RecordLayoutBuilder.cpp + // + // FIXME(emilio): There are some differences between Microsoft and the + // Itanium ABI, but we'll ignore those and stick to Itanium for now. + // + // Also, we need to handle packed bitfields and stuff. + // TODO(emilio): Take into account C++'s wide bitfields, and + // packing, sigh. + let mut total_size_in_bits = 0; + let mut max_align = 0; + let mut unfilled_bits_in_last_unit = 0; + let mut field_size_in_bits = 0; + *self.index += 1; + let mut last_field_name = format!("_bitfield_{}", self.index); + let mut last_field_align = 0; - let mut offset = 0; for field in self.fields { let width = field.bitfield().unwrap(); - let field_name = field.name() - .map(ToOwned::to_owned) - .unwrap_or_else(|| format!("at_offset_{}", offset)); - let field_item = ctx.resolve_item(field.ty()); let field_ty_layout = field_item.kind() .expect_type() .layout(ctx) .expect("Bitfield without layout? Gah!"); - let field_type = field_item.to_rust_ty(ctx); - let int_type = BlobTyBuilder::new(field_ty_layout).build(); + let field_align = field_ty_layout.align; - let getter_name = ctx.rust_ident(&field_name); - let setter_name = ctx.ext_cx() - .ident_of(&format!("set_{}", &field_name)); - let mask = ((1usize << width) - 1) << offset; - let prefix = ctx.trait_prefix(); - // The transmute is unfortunate, but it's needed for enums in - // bitfields. - let item = quote_item!(ctx.ext_cx(), - impl X { - #[inline] - pub fn $getter_name(&self) -> $field_type { - unsafe { - ::$prefix::mem::transmute( - ( - (self.$field_ident & - ($mask as $bitfield_type)) - >> $offset - ) as $int_type - ) - } - } + if field_size_in_bits != 0 && + (width == 0 || width as usize > unfilled_bits_in_last_unit) { + field_size_in_bits = align_to(field_size_in_bits, field_align); + // Push the new field. + let ty = + BlobTyBuilder::new(Layout::new(bytes_from_bits_pow2(field_size_in_bits), + bytes_from_bits_pow2(last_field_align))) + .build(); - #[inline] - pub fn $setter_name(&mut self, val: $field_type) { - self.$field_ident &= !($mask as $bitfield_type); - self.$field_ident |= - (val as $int_type as $bitfield_type << $offset) & - ($mask as $bitfield_type); - } - } - ) - .unwrap(); + let field = StructFieldBuilder::named(&last_field_name) + .pub_() + .build_ty(ty); + fields.push(field); - let items = match item.unwrap().node { - ast::ItemKind::Impl(_, _, _, _, _, items) => items, - _ => unreachable!(), - }; + // TODO(emilio): dedup this. + *self.index += 1; + last_field_name = format!("_bitfield_{}", self.index); + + // Now reset the size and the rest of stuff. + // unfilled_bits_in_last_unit = 0; + field_size_in_bits = 0; + last_field_align = 0; + } + + // TODO(emilio): Create the accessors. Problem here is that we still + // don't know which one is going to be the final alignment of the + // bitfield, and whether we have to index in it. Thus, we don't know + // which integer type do we need. + // + // We could push them to a Vec or something, but given how buggy + // they where maybe it's not a great idea? + field_size_in_bits += width as usize; + total_size_in_bits += width as usize; + + + let data_size = align_to(field_size_in_bits, field_align * 8); + + max_align = cmp::max(max_align, field_align); + + // NB: The width here is completely, absolutely intentional. + last_field_align = cmp::max(last_field_align, width as usize); + + unfilled_bits_in_last_unit = data_size - field_size_in_bits; + } + + if field_size_in_bits != 0 { + // Push the last field. + let ty = + BlobTyBuilder::new(Layout::new(bytes_from_bits_pow2(field_size_in_bits), + bytes_from_bits_pow2(last_field_align))) + .build(); - methods.extend(items.into_iter()); - offset += width; + let field = StructFieldBuilder::named(&last_field_name) + .pub_() + .build_ty(ty); + fields.push(field); } - bitfield_layout + Layout::new(bytes_from_bits(total_size_in_bits), max_align) } } @@ -1062,12 +1069,10 @@ impl CodeGenerator for CompInfo { debug_assert!(!current_bitfield_fields.is_empty()); let bitfield_fields = mem::replace(&mut current_bitfield_fields, vec![]); - bitfield_count += 1; - let bitfield_layout = Bitfield::new(bitfield_count, + let bitfield_layout = Bitfield::new(&mut bitfield_count, bitfield_fields) .codegen_fields(ctx, &mut fields, &mut methods); - - struct_layout.saw_bitfield(bitfield_layout); + struct_layout.saw_bitfield_batch(bitfield_layout); current_bitfield_width = None; current_bitfield_layout = None; @@ -1099,8 +1104,7 @@ impl CodeGenerator for CompInfo { } else { quote_ty!(ctx.ext_cx(), __BindgenUnionField<$ty>) } - } else if let Some(item) = - field_ty.is_incomplete_array(ctx) { + } else if let Some(item) = field_ty.is_incomplete_array(ctx) { result.saw_incomplete_array(); let inner = item.to_rust_ty(ctx); @@ -1224,12 +1228,10 @@ impl CodeGenerator for CompInfo { debug_assert!(!current_bitfield_fields.is_empty()); let bitfield_fields = mem::replace(&mut current_bitfield_fields, vec![]); - bitfield_count += 1; - let bitfield_layout = Bitfield::new(bitfield_count, + let bitfield_layout = Bitfield::new(&mut bitfield_count, bitfield_fields) .codegen_fields(ctx, &mut fields, &mut methods); - - struct_layout.saw_bitfield(bitfield_layout); + struct_layout.saw_bitfield_batch(bitfield_layout); } debug_assert!(current_bitfield_fields.is_empty()); @@ -1268,7 +1270,7 @@ impl CodeGenerator for CompInfo { } } else if !is_union && !self.is_unsized(ctx) { if let Some(padding_field) = - layout.and_then(|layout| struct_layout.pad_struct(layout)) { + layout.and_then(|layout| struct_layout.pad_struct(&canonical_name, layout)) { fields.push(padding_field); } @@ -2174,8 +2176,8 @@ impl ToRustTy for Type { quote_ty!(ctx.ext_cx(), ::$prefix::option::Option<$ty>) } TypeKind::Array(item, len) => { - let inner = item.to_rust_ty(ctx); - aster::ty::TyBuilder::new().array(len).build(inner) + let ty = item.to_rust_ty(ctx); + aster::ty::TyBuilder::new().array(len).build(ty) } TypeKind::Enum(..) => { let path = item.namespace_aware_canonical_path(ctx); @@ -2190,7 +2192,7 @@ impl ToRustTy for Type { .map(|arg| arg.to_rust_ty(ctx)) .collect::>(); - path.segments.last_mut().unwrap().parameters = if + path.segments.last_mut().unwrap().parameters = if template_args.is_empty() { None } else { diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs index f8a88bc24b..24938c1608 100644 --- a/src/codegen/struct_layout.rs +++ b/src/codegen/struct_layout.rs @@ -7,7 +7,7 @@ use aster::struct_field::StructFieldBuilder; use ir::comp::CompInfo; use ir::context::BindgenContext; use ir::layout::Layout; -use ir::ty::Type; +use ir::ty::{Type, TypeKind}; use std::cmp; use std::mem; @@ -21,6 +21,84 @@ pub struct StructLayoutTracker<'a, 'ctx: 'a> { padding_count: usize, latest_field_layout: Option, max_field_align: usize, + last_field_was_bitfield: bool, +} + +/// Returns a size aligned to a given value. +pub fn align_to(size: usize, align: usize) -> usize { + if align == 0 { + return size; + } + + let rem = size % align; + if rem == 0 { + return size; + } + + size + align - rem +} + +/// Returns the amount of bytes from a given amount of bytes, rounding up. +pub fn bytes_from_bits(n: usize) -> usize { + if n % 8 == 0 { + return n / 8; + } + + n / 8 + 1 +} + +/// Returns the lower power of two byte count that can hold at most n bits. +pub fn bytes_from_bits_pow2(mut n: usize) -> usize { + if n == 0 { + return 0; + } + + if n <= 8 { + return 1; + } + + if !n.is_power_of_two() { + n = n.next_power_of_two(); + } + + n / 8 +} + +#[test] +fn test_align_to() { + assert_eq!(align_to(1, 1), 1); + assert_eq!(align_to(1, 2), 2); + assert_eq!(align_to(1, 4), 4); + assert_eq!(align_to(5, 1), 5); + assert_eq!(align_to(17, 4), 20); +} + +#[test] +fn test_bytes_from_bits_pow2() { + assert_eq!(bytes_from_bits_pow2(0), 0); + for i in 1..9 { + assert_eq!(bytes_from_bits_pow2(i), 1); + } + for i in 9..17 { + assert_eq!(bytes_from_bits_pow2(i), 2); + } + for i in 17..33 { + assert_eq!(bytes_from_bits_pow2(i), 4); + } +} + +#[test] +fn test_bytes_from_bits() { + assert_eq!(bytes_from_bits(0), 0); + for i in 1..9 { + assert_eq!(bytes_from_bits(i), 1); + } + for i in 9..17 { + assert_eq!(bytes_from_bits(i), 2); + } + for i in 17..25 { + assert_eq!(bytes_from_bits(i), 3); + } } impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { @@ -32,6 +110,7 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { padding_count: 0, latest_field_layout: None, max_field_align: 0, + last_field_was_bitfield: false, } } @@ -43,112 +122,149 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { } pub fn saw_base(&mut self, base_ty: &Type) { - self.align_to_latest_field(); - if let Some(layout) = base_ty.layout(self.ctx) { + self.align_to_latest_field(layout); + self.latest_offset += self.padding_bytes(layout) + layout.size; self.latest_field_layout = Some(layout); self.max_field_align = cmp::max(self.max_field_align, layout.align); } } - pub fn saw_bitfield(&mut self, layout: Layout) { - self.align_to_latest_field(); + pub fn saw_bitfield_batch(&mut self, layout: Layout) { + self.align_to_latest_field(layout); + + self.latest_offset += layout.size; + + debug!("Offset: : {} -> {}", + self.latest_offset - layout.size, + self.latest_offset); - self.latest_offset += self.padding_bytes(layout) + layout.size; self.latest_field_layout = Some(layout); - self.max_field_align = cmp::max(self.max_field_align, layout.align); + self.last_field_was_bitfield = true; + // NB: We intentionally don't update the max_field_align here, since our + // bitfields code doesn't necessarily guarantee it, so we need to + // actually generate the dummy alignment. } pub fn saw_union(&mut self, layout: Layout) { - self.align_to_latest_field(); + self.align_to_latest_field(layout); self.latest_offset += self.padding_bytes(layout) + layout.size; self.latest_field_layout = Some(layout); self.max_field_align = cmp::max(self.max_field_align, layout.align); } + /// Add a padding field if necessary for a given new field _before_ adding + /// that field. pub fn pad_field(&mut self, field_name: &str, field_ty: &Type, field_offset: Option) -> Option { - field_ty.layout(self.ctx).and_then(|field_layout| { - self.align_to_latest_field(); + let mut field_layout = match field_ty.layout(self.ctx) { + Some(l) => l, + None => return None, + }; + + if let TypeKind::Array(inner, len) = *field_ty.canonical_type(self.ctx).kind() { + // FIXME(emilio): As an _ultra_ hack, we correct the layout returned + // by arrays of structs that have a bigger alignment than what we + // can support. + // + // This means that the structs in the array are super-unsafe to + // access, since they won't be properly aligned, but *shrug*. + if let Some(layout) = self.ctx.resolve_type(inner).layout(self.ctx) { + if layout.align > mem::size_of::<*mut ()>() { + field_layout.size = + align_to(layout.size, layout.align) * len; + field_layout.align = mem::size_of::<*mut ()>(); + } + } + } - let padding_layout = if self.comp.packed() { - None - } else { - let calculated_layout = field_ty.as_comp() - .and_then(|comp| comp.calc_layout(self.ctx)) - .unwrap_or(field_layout); - - let align = cmp::min(calculated_layout.align, mem::size_of::<*mut ()>()); - - let (padding_bytes, need_padding) = match field_offset { - Some(offset) if offset / 8 > self.latest_offset => { - (offset / 8 - self.latest_offset, true) - } - _ if field_layout.align != 0 => { - (self.padding_bytes(field_layout), (self.latest_offset % field_layout.align) != 0) - } - _ => { - (0, false) - } - }; - - self.latest_offset += padding_bytes; - - debug!("align field {} to {}/{} with {} padding bytes {:?}, calculated {:?}", - field_name, - self.latest_offset, - field_offset.unwrap_or(0) / 8, - padding_bytes, - field_layout, - calculated_layout); - - if need_padding && - (padding_bytes > calculated_layout.align || - field_layout.align > mem::size_of::<*mut ()>()) { - Some(Layout::new(padding_bytes, align)) - } else { - None + let will_merge_with_bitfield = self.align_to_latest_field(field_layout); + + let padding_layout = if self.comp.packed() { + None + } else { + let padding_bytes = match field_offset { + Some(offset) if offset / 8 > self.latest_offset => { + offset / 8 - self.latest_offset } + _ if will_merge_with_bitfield || field_layout.align == 0 => 0, + _ => self.padding_bytes(field_layout), }; - self.latest_offset += field_ty.calc_size(self.ctx).unwrap_or(field_layout.size); + // Otherwise the padding is useless. + let need_padding = padding_bytes >= field_layout.align; - self.latest_field_layout = Some(field_layout); - self.max_field_align = cmp::max(self.max_field_align, field_layout.align); + self.latest_offset += padding_bytes; - padding_layout.map(|layout| self.padding_field(layout)) - }) - } + debug!("Offset: : {} -> {}", + self.latest_offset - padding_bytes, + self.latest_offset); - pub fn pad_struct(&mut self, layout: Layout) -> Option { - if layout.size < self.latest_offset { - warn!("calculate struct layout incorrect, too more {} bytes", - self.latest_offset - layout.size); + debug!("align field {} to {}/{} with {} padding bytes {:?}", + field_name, + self.latest_offset, + field_offset.unwrap_or(0) / 8, + padding_bytes, + field_layout); - None - } else { - let padding_bytes = layout.size - self.latest_offset; - let struct_align = cmp::min(layout.align, - mem::size_of::<*mut ()>()); - - if padding_bytes > struct_align || - (layout.align > mem::size_of::<*mut ()>() && padding_bytes > 0) { - let padding_align = if self.comp.packed() { - 1 - } else { - cmp::min(1 << padding_bytes.trailing_zeros(), - mem::size_of::<*mut ()>()) - }; - - Some(self.padding_field(Layout::new(padding_bytes, padding_align))) + if need_padding && padding_bytes != 0 { + Some(Layout::new(padding_bytes, field_layout.align)) } else { None } + }; + + self.latest_offset += field_layout.size; + self.latest_field_layout = Some(field_layout); + self.max_field_align = cmp::max(self.max_field_align, field_layout.align); + self.last_field_was_bitfield = false; + + debug!("Offset: {}: {} -> {}", + field_name, + self.latest_offset - field_layout.size, + self.latest_offset); + + padding_layout.map(|layout| self.padding_field(layout)) + } + + pub fn pad_struct(&mut self, name: &str, layout: Layout) -> Option { + if layout.size < self.latest_offset { + error!("Calculated wrong layout for {}, too more {} bytes", + name, self.latest_offset - layout.size); + return None + } + + let padding_bytes = layout.size - self.latest_offset; + + // We always pad to get to the correct size if the struct is one of + // those we can't align properly. + // + // Note that if the last field we saw was a bitfield, we may need to pad + // regardless, because bitfields don't respect alignment as strictly as + // other fields. + if padding_bytes > 0 && + (padding_bytes >= layout.align || + (self.last_field_was_bitfield && + padding_bytes >= self.latest_field_layout.unwrap().align) || + layout.align > mem::size_of::<*mut ()>()) { + let layout = if self.comp.packed() { + Layout::new(padding_bytes, 1) + } else if self.last_field_was_bitfield || + layout.align > mem::size_of::<*mut ()>() { + // We've already given up on alignment here. + Layout::for_size(padding_bytes) + } else { + Layout::new(padding_bytes, layout.align) + }; + + Some(self.padding_field(layout)) + } else { + None } } @@ -166,15 +282,7 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { } fn padding_bytes(&self, layout: Layout) -> usize { - if layout.align == 0 { - warn!("try to padding bytes without layout"); - - 0 - } else if self.latest_offset % layout.align == 0 { - 0 - } else { - layout.align - (self.latest_offset % layout.align) - } + align_to(self.latest_offset, layout.align) - self.latest_offset } fn padding_field(&mut self, layout: Layout) -> ast::StructField { @@ -190,11 +298,37 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { StructFieldBuilder::named(padding_field_name).pub_().build_ty(ty) } - fn align_to_latest_field(&mut self) { + /// Returns whether the new field is known to merge with a bitfield. + /// + /// This is just to avoid doing the same check also in pad_field. + fn align_to_latest_field(&mut self, new_field_layout: Layout) -> bool { if self.comp.packed() { - // skip to align field when packed - } else if let Some(layout) = self.latest_field_layout { - self.latest_offset += self.padding_bytes(layout); + // Skip to align fields when packed. + return false; + } + + let layout = match self.latest_field_layout { + Some(l) => l, + None => return false, + }; + + // If it was, we may or may not need to align, depending on what the + // current field alignment and the bitfield size and alignment are. + debug!("align_to_bitfield? {}: {:?} {:?}", self.last_field_was_bitfield, + layout, new_field_layout); + + if self.last_field_was_bitfield && + new_field_layout.align <= layout.size % layout.align && + new_field_layout.size <= layout.size % layout.align { + // The new field will be coalesced into some of the remaining bits. + // + // FIXME(emilio): I think this may not catch everything? + debug!("Will merge with bitfield"); + return true; } + + // Else, just align the obvious way. + self.latest_offset += self.padding_bytes(layout); + return false; } } diff --git a/src/ir/comp.rs b/src/ir/comp.rs index fff4655c31..ce6ec25d14 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -408,73 +408,25 @@ impl CompInfo { /// members. This is not ideal, but clang fails to report the size for these /// kind of unions, see test/headers/template_union.hpp pub fn layout(&self, ctx: &BindgenContext) -> Option { + use std::cmp; // We can't do better than clang here, sorry. if self.kind == CompKind::Struct { - None - } else { - self.calc_layout(ctx) + return None } - } - - /// Compute the layout of this type. - pub fn calc_layout(&self, ctx: &BindgenContext) -> Option { - use std::cmp; - use std::mem; - - if self.kind == CompKind::Struct { - let mut latest_offset_in_bits = 0; - let mut max_align = 0; - - if self.needs_explicit_vtable(ctx) { - latest_offset_in_bits += mem::size_of::<*mut ()>() * 8; - max_align = mem::size_of::<*mut ()>(); - } - - for field in &self.fields { - if let Some(bits) = field.bitfield() { - latest_offset_in_bits += bits as usize; - } else { - let field_ty = ctx.resolve_type(field.ty); - if let Some(field_layout) = - field_ty.as_comp() - .and_then(|comp| comp.calc_layout(ctx)) - .or_else(|| field_ty.layout(ctx)) { + let mut max_size = 0; + let mut max_align = 0; + for field in &self.fields { + let field_layout = ctx.resolve_type(field.ty) + .layout(ctx); - let n = (latest_offset_in_bits / 8) % - field_layout.align; - - if !self.packed && n != 0 { - latest_offset_in_bits += (field_layout.align - n) * - 8; - } - - latest_offset_in_bits += field_layout.size * 8; - max_align = cmp::max(max_align, field_layout.align); - } - } - } - - if latest_offset_in_bits == 0 && max_align == 0 { - None - } else { - Some(Layout::new((latest_offset_in_bits + 7) / 8, max_align)) - } - } else { - let mut max_size = 0; - let mut max_align = 0; - for field in &self.fields { - let field_layout = ctx.resolve_type(field.ty) - .layout(ctx); - - if let Some(layout) = field_layout { - max_size = cmp::max(max_size, layout.size); - max_align = cmp::max(max_align, layout.align); - } + if let Some(layout) = field_layout { + max_size = cmp::max(max_size, layout.size); + max_align = cmp::max(max_align, layout.align); } - - Some(Layout::new(max_size, max_align)) } + + Some(Layout::new(max_size, max_align)) } /// Get this type's set of fields. diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index 0a85577eea..3470e03373 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -5,8 +5,6 @@ use super::item::Item; use super::ty::TypeKind; use clang; use ir::annotations::Annotations; -use ir::int::IntKind; -use ir::layout::Layout; use parse::{ClangItemParser, ParseError}; /// An enum representing custom handling that can be given to a variant. @@ -51,19 +49,6 @@ impl Enum { &self.variants } - /// Compute the layout of this type. - pub fn calc_layout(&self, ctx: &BindgenContext) -> Option { - self.repr - .map(|repr| ctx.resolve_type(repr)) - .and_then(|repr| match *repr.canonical_type(ctx).kind() { - TypeKind::Int(int_kind) => Some(int_kind), - _ => None, - }) - .unwrap_or(IntKind::Int) - .known_size() - .map(|size| Layout::new(size, size)) - } - /// Construct an enumeration from the given Clang type. pub fn from_ty(ty: &clang::Type, ctx: &mut BindgenContext) @@ -114,7 +99,7 @@ impl Enum { Annotations::new(&cursor) .and_then(|anno| if anno.hide() { Some(EnumVariantCustomBehavior::Hide) - } else if + } else if anno.constify_enum_variant() { Some(EnumVariantCustomBehavior::Constify) } else { diff --git a/src/ir/layout.rs b/src/ir/layout.rs index 03d43b51ba..3837926107 100644 --- a/src/ir/layout.rs +++ b/src/ir/layout.rs @@ -3,10 +3,10 @@ use super::context::BindgenContext; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::ty::RUST_DERIVE_IN_ARRAY_LIMIT; -use std::cmp; +use std::{cmp, mem}; /// A type that represents the struct layout of a type. -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] pub struct Layout { /// The size (in bytes) of this layout. pub size: usize, @@ -16,6 +16,13 @@ pub struct Layout { pub packed: bool, } +#[test] +fn test_layout_for_size() { + let ptr_size = mem::size_of::<*mut ()>(); + assert_eq!(Layout::for_size(ptr_size), Layout::new(ptr_size, ptr_size)); + assert_eq!(Layout::for_size(3 * ptr_size), Layout::new(3 * ptr_size, ptr_size)); +} + impl Layout { /// Construct a new `Layout` with the given `size` and `align`. It is not /// packed. @@ -27,6 +34,20 @@ impl Layout { } } + /// Creates a non-packed layout for a given size, trying to use the maximum + /// alignment possible. + pub fn for_size(size: usize) -> Self { + let mut next_align = 2; + while size % next_align == 0 && next_align <= 2 * mem::size_of::<*mut ()>() { + next_align *= 2; + } + Layout { + size: size, + align: next_align / 2, + packed: false, + } + } + /// Is this a zero-sized layout? pub fn is_zero(&self) -> bool { self.size == 0 && self.align == 0 diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 332ad23687..c3ec4039ca 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -382,41 +382,8 @@ impl Type { _ => false, } } - - /// If this type has a known size, return it (in bytes). - pub fn calc_size(&self, ctx: &BindgenContext) -> Option { - match self.kind { - TypeKind::Comp(ref ci) => { - ci.calc_layout(ctx).map(|layout| layout.size) - } - TypeKind::Enum(ref enum_ty) => { - enum_ty.calc_layout(ctx).map(|layout| layout.size) - } - TypeKind::Int(int_kind) => int_kind.known_size(), - TypeKind::Float(float_kind) => Some(float_kind.known_size()), - TypeKind::Complex(float_kind) => Some(float_kind.known_size() * 2), - TypeKind::Reference(..) | - TypeKind::NullPtr | - TypeKind::Pointer(..) | - TypeKind::BlockPointer | - TypeKind::Function(..) | - TypeKind::ObjCInterface(..) => Some(mem::size_of::<*mut ()>()), - TypeKind::ResolvedTypeRef(inner) | - TypeKind::Alias(inner) | - TypeKind::TemplateAlias(inner, _) | - TypeKind::TemplateInstantiation(inner, _) => { - ctx.resolve_type(inner).calc_size(ctx) - } - TypeKind::Array(inner, len) => { - ctx.resolve_type(inner) - .layout(ctx) - .map(|layout| layout.size * len) - } - TypeKind::Void | TypeKind::Named => None, - TypeKind::UnresolvedTypeRef(..) => unreachable!(), - } - } } + #[test] fn is_invalid_named_type_valid() { let ty = Type::new(Some("foo".into()), None, TypeKind::Named, false); diff --git a/tests/expectations/tests/bitfield_align.rs b/tests/expectations/tests/bitfield_align.rs new file mode 100644 index 0000000000..ffc170b1bd --- /dev/null +++ b/tests/expectations/tests/bitfield_align.rs @@ -0,0 +1,114 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct A { + pub x: ::std::os::raw::c_uchar, + pub _bitfield_1: [u8; 2usize], + pub y: ::std::os::raw::c_uchar, + pub __bindgen_align: [u32; 0usize], +} +#[test] +fn bindgen_test_layout_A() { + assert_eq!(::std::mem::size_of::
() , 4usize , concat ! ( + "Size of: " , stringify ! ( A ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( A ) )); + assert_eq! (unsafe { & ( * ( 0 as * const A ) ) . x as * const _ as usize + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( A ) , "::" , stringify + ! ( x ) )); + assert_eq! (unsafe { & ( * ( 0 as * const A ) ) . y as * const _ as usize + } , 3usize , concat ! ( + "Alignment of field: " , stringify ! ( A ) , "::" , stringify + ! ( y ) )); +} +impl Clone for A { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct B { + pub _bitfield_1: u32, + pub __bindgen_align: [u32; 0usize], +} +#[test] +fn bindgen_test_layout_B() { + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( B ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( B ) )); +} +impl Clone for B { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct C { + pub x: ::std::os::raw::c_uchar, + pub _bitfield_1: u8, + pub baz: ::std::os::raw::c_uint, +} +#[test] +fn bindgen_test_layout_C() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( C ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( C ) )); + assert_eq! (unsafe { & ( * ( 0 as * const C ) ) . x as * const _ as usize + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( x ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const C ) ) . baz as * const _ as usize } , + 4usize , concat ! ( + "Alignment of field: " , stringify ! ( C ) , "::" , stringify + ! ( baz ) )); +} +impl Clone for C { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct Date1 { + pub _bitfield_1: [u8; 2usize], + pub _bitfield_2: u8, + pub __bindgen_align: [u16; 0usize], +} +#[test] +fn bindgen_test_layout_Date1() { + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Date1 ) )); + assert_eq! (::std::mem::align_of::() , 2usize , concat ! ( + "Alignment of " , stringify ! ( Date1 ) )); +} +impl Clone for Date1 { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct Date2 { + pub _bitfield_1: [u8; 2usize], + pub _bitfield_2: u8, + pub byte: ::std::os::raw::c_uchar, + pub __bindgen_align: [u16; 0usize], +} +#[test] +fn bindgen_test_layout_Date2() { + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Date2 ) )); + assert_eq! (::std::mem::align_of::() , 2usize , concat ! ( + "Alignment of " , stringify ! ( Date2 ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Date2 ) ) . byte as * const _ as usize } + , 3usize , concat ! ( + "Alignment of field: " , stringify ! ( Date2 ) , "::" , + stringify ! ( byte ) )); +} +impl Clone for Date2 { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/bitfield_method_mangling.rs b/tests/expectations/tests/bitfield_method_mangling.rs index 0a6c9fddb8..f21b208939 100644 --- a/tests/expectations/tests/bitfield_method_mangling.rs +++ b/tests/expectations/tests/bitfield_method_mangling.rs @@ -8,6 +8,7 @@ #[derive(Debug, Default, Copy)] pub struct mach_msg_type_descriptor_t { pub _bitfield_1: u32, + pub __bindgen_align: [u32; 0usize], } #[test] fn bindgen_test_layout_mach_msg_type_descriptor_t() { @@ -22,32 +23,3 @@ fn bindgen_test_layout_mach_msg_type_descriptor_t() { impl Clone for mach_msg_type_descriptor_t { fn clone(&self) -> Self { *self } } -impl mach_msg_type_descriptor_t { - #[inline] - pub fn pad3(&self) -> ::std::os::raw::c_uint { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (16777215usize as u32)) - >> 0u32) as u32) - } - } - #[inline] - pub fn set_pad3(&mut self, val: ::std::os::raw::c_uint) { - self._bitfield_1 &= !(16777215usize as u32); - self._bitfield_1 |= - ((val as u32 as u32) << 0u32) & (16777215usize as u32); - } - #[inline] - pub fn type_(&self) -> ::std::os::raw::c_uint { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & - (4278190080usize as u32)) >> 24u32) as - u32) - } - } - #[inline] - pub fn set_type(&mut self, val: ::std::os::raw::c_uint) { - self._bitfield_1 &= !(4278190080usize as u32); - self._bitfield_1 |= - ((val as u32 as u32) << 24u32) & (4278190080usize as u32); - } -} diff --git a/tests/expectations/tests/jsval_layout_opaque.rs b/tests/expectations/tests/jsval_layout_opaque.rs index 848286e7ea..eb5306d27b 100644 --- a/tests/expectations/tests/jsval_layout_opaque.rs +++ b/tests/expectations/tests/jsval_layout_opaque.rs @@ -111,6 +111,7 @@ pub struct jsval_layout { #[derive(Debug, Copy)] pub struct jsval_layout__bindgen_ty_1 { pub _bitfield_1: u64, + pub __bindgen_align: [u64; 0usize], } #[test] fn bindgen_test_layout_jsval_layout__bindgen_ty_1() { @@ -128,37 +129,6 @@ impl Clone for jsval_layout__bindgen_ty_1 { impl Default for jsval_layout__bindgen_ty_1 { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -impl jsval_layout__bindgen_ty_1 { - #[inline] - pub fn payload47(&self) -> u64 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & - (140737488355327usize as u64)) >> - 0u32) as u64) - } - } - #[inline] - pub fn set_payload47(&mut self, val: u64) { - self._bitfield_1 &= !(140737488355327usize as u64); - self._bitfield_1 |= - ((val as u64 as u64) << 0u32) & (140737488355327usize as u64); - } - #[inline] - pub fn tag(&self) -> JSValueTag { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & - (18446603336221196288usize as u64)) >> - 47u32) as u32) - } - } - #[inline] - pub fn set_tag(&mut self, val: JSValueTag) { - self._bitfield_1 &= !(18446603336221196288usize as u64); - self._bitfield_1 |= - ((val as u32 as u64) << 47u32) & - (18446603336221196288usize as u64); - } -} #[repr(C)] #[derive(Debug, Default, Copy)] pub struct jsval_layout__bindgen_ty_2 { diff --git a/tests/expectations/tests/layout_align.rs b/tests/expectations/tests/layout_align.rs index a21fa4d6ec..9085480caa 100644 --- a/tests/expectations/tests/layout_align.rs +++ b/tests/expectations/tests/layout_align.rs @@ -71,6 +71,7 @@ pub struct rte_eth_link { /**< ETH_SPEED_NUM_ */ pub link_speed: u32, pub _bitfield_1: u8, + pub __bindgen_padding_0: [u8; 3usize], pub __bindgen_align: [u64; 0usize], } #[test] @@ -88,41 +89,3 @@ fn bindgen_test_layout_rte_eth_link() { impl Clone for rte_eth_link { fn clone(&self) -> Self { *self } } -impl rte_eth_link { - #[inline] - pub fn link_duplex(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (1usize as u8)) >> - 0u32) as u16) - } - } - #[inline] - pub fn set_link_duplex(&mut self, val: u16) { - self._bitfield_1 &= !(1usize as u8); - self._bitfield_1 |= ((val as u16 as u8) << 0u32) & (1usize as u8); - } - #[inline] - pub fn link_autoneg(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (2usize as u8)) >> - 1u32) as u16) - } - } - #[inline] - pub fn set_link_autoneg(&mut self, val: u16) { - self._bitfield_1 &= !(2usize as u8); - self._bitfield_1 |= ((val as u16 as u8) << 1u32) & (2usize as u8); - } - #[inline] - pub fn link_status(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (4usize as u8)) >> - 2u32) as u16) - } - } - #[inline] - pub fn set_link_status(&mut self, val: u16) { - self._bitfield_1 &= !(4usize as u8); - self._bitfield_1 |= ((val as u16 as u8) << 2u32) & (4usize as u8); - } -} diff --git a/tests/expectations/tests/layout_eth_conf.rs b/tests/expectations/tests/layout_eth_conf.rs index 16788d06f5..ae46f5c6be 100644 --- a/tests/expectations/tests/layout_eth_conf.rs +++ b/tests/expectations/tests/layout_eth_conf.rs @@ -88,7 +88,7 @@ pub struct rte_eth_rxmode { pub max_rx_pkt_len: u32, /**< hdr buf size (header_split enabled).*/ pub split_hdr_size: u16, - pub _bitfield_1: u16, + pub _bitfield_1: [u8; 2usize], } #[test] fn bindgen_test_layout_rte_eth_rxmode() { @@ -118,116 +118,6 @@ impl Clone for rte_eth_rxmode { impl Default for rte_eth_rxmode { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -impl rte_eth_rxmode { - #[inline] - pub fn header_split(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (1usize as u16)) >> - 0u32) as u16) - } - } - #[inline] - pub fn set_header_split(&mut self, val: u16) { - self._bitfield_1 &= !(1usize as u16); - self._bitfield_1 |= ((val as u16 as u16) << 0u32) & (1usize as u16); - } - #[inline] - pub fn hw_ip_checksum(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (2usize as u16)) >> - 1u32) as u16) - } - } - #[inline] - pub fn set_hw_ip_checksum(&mut self, val: u16) { - self._bitfield_1 &= !(2usize as u16); - self._bitfield_1 |= ((val as u16 as u16) << 1u32) & (2usize as u16); - } - #[inline] - pub fn hw_vlan_filter(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (4usize as u16)) >> - 2u32) as u16) - } - } - #[inline] - pub fn set_hw_vlan_filter(&mut self, val: u16) { - self._bitfield_1 &= !(4usize as u16); - self._bitfield_1 |= ((val as u16 as u16) << 2u32) & (4usize as u16); - } - #[inline] - pub fn hw_vlan_strip(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (8usize as u16)) >> - 3u32) as u16) - } - } - #[inline] - pub fn set_hw_vlan_strip(&mut self, val: u16) { - self._bitfield_1 &= !(8usize as u16); - self._bitfield_1 |= ((val as u16 as u16) << 3u32) & (8usize as u16); - } - #[inline] - pub fn hw_vlan_extend(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (16usize as u16)) >> - 4u32) as u16) - } - } - #[inline] - pub fn set_hw_vlan_extend(&mut self, val: u16) { - self._bitfield_1 &= !(16usize as u16); - self._bitfield_1 |= ((val as u16 as u16) << 4u32) & (16usize as u16); - } - #[inline] - pub fn jumbo_frame(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (32usize as u16)) >> - 5u32) as u16) - } - } - #[inline] - pub fn set_jumbo_frame(&mut self, val: u16) { - self._bitfield_1 &= !(32usize as u16); - self._bitfield_1 |= ((val as u16 as u16) << 5u32) & (32usize as u16); - } - #[inline] - pub fn hw_strip_crc(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (64usize as u16)) >> - 6u32) as u16) - } - } - #[inline] - pub fn set_hw_strip_crc(&mut self, val: u16) { - self._bitfield_1 &= !(64usize as u16); - self._bitfield_1 |= ((val as u16 as u16) << 6u32) & (64usize as u16); - } - #[inline] - pub fn enable_scatter(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (128usize as u16)) >> - 7u32) as u16) - } - } - #[inline] - pub fn set_enable_scatter(&mut self, val: u16) { - self._bitfield_1 &= !(128usize as u16); - self._bitfield_1 |= ((val as u16 as u16) << 7u32) & (128usize as u16); - } - #[inline] - pub fn enable_lro(&self) -> u16 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (256usize as u16)) >> - 8u32) as u16) - } - } - #[inline] - pub fn set_enable_lro(&mut self, val: u16) { - self._bitfield_1 &= !(256usize as u16); - self._bitfield_1 |= ((val as u16 as u16) << 8u32) & (256usize as u16); - } -} #[repr(u32)] /** * A set of values to identify what method is to be used to transmit @@ -250,6 +140,7 @@ pub struct rte_eth_txmode { pub mq_mode: rte_eth_tx_mq_mode, pub pvid: u16, pub _bitfield_1: u8, + pub __bindgen_padding_0: u8, } #[test] fn bindgen_test_layout_rte_eth_txmode() { @@ -274,44 +165,6 @@ impl Clone for rte_eth_txmode { impl Default for rte_eth_txmode { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -impl rte_eth_txmode { - #[inline] - pub fn hw_vlan_reject_tagged(&self) -> u8 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (1usize as u8)) >> - 0u32) as u8) - } - } - #[inline] - pub fn set_hw_vlan_reject_tagged(&mut self, val: u8) { - self._bitfield_1 &= !(1usize as u8); - self._bitfield_1 |= ((val as u8 as u8) << 0u32) & (1usize as u8); - } - #[inline] - pub fn hw_vlan_reject_untagged(&self) -> u8 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (2usize as u8)) >> - 1u32) as u8) - } - } - #[inline] - pub fn set_hw_vlan_reject_untagged(&mut self, val: u8) { - self._bitfield_1 &= !(2usize as u8); - self._bitfield_1 |= ((val as u8 as u8) << 1u32) & (2usize as u8); - } - #[inline] - pub fn hw_vlan_insert_pvid(&self) -> u8 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (4usize as u8)) >> - 2u32) as u8) - } - } - #[inline] - pub fn set_hw_vlan_insert_pvid(&mut self, val: u8) { - self._bitfield_1 &= !(4usize as u8); - self._bitfield_1 |= ((val as u8 as u8) << 2u32) & (4usize as u8); - } -} /** * A structure used to configure the Receive Side Scaling (RSS) feature * of an Ethernet port. diff --git a/tests/expectations/tests/layout_mbuf.rs b/tests/expectations/tests/layout_mbuf.rs index 5732831a0f..8ad13f11a4 100644 --- a/tests/expectations/tests/layout_mbuf.rs +++ b/tests/expectations/tests/layout_mbuf.rs @@ -158,7 +158,8 @@ pub struct rte_mbuf__bindgen_ty_2 { #[repr(C)] #[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_2__bindgen_ty_1 { - pub _bitfield_1: u32, + pub _bitfield_1: [u8; 4usize], + pub __bindgen_align: [u32; 0usize], } #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_2__bindgen_ty_1() { @@ -174,98 +175,6 @@ fn bindgen_test_layout_rte_mbuf__bindgen_ty_2__bindgen_ty_1() { impl Clone for rte_mbuf__bindgen_ty_2__bindgen_ty_1 { fn clone(&self) -> Self { *self } } -impl rte_mbuf__bindgen_ty_2__bindgen_ty_1 { - #[inline] - pub fn l2_type(&self) -> u32 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (15usize as u32)) >> - 0u32) as u32) - } - } - #[inline] - pub fn set_l2_type(&mut self, val: u32) { - self._bitfield_1 &= !(15usize as u32); - self._bitfield_1 |= ((val as u32 as u32) << 0u32) & (15usize as u32); - } - #[inline] - pub fn l3_type(&self) -> u32 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (240usize as u32)) >> - 4u32) as u32) - } - } - #[inline] - pub fn set_l3_type(&mut self, val: u32) { - self._bitfield_1 &= !(240usize as u32); - self._bitfield_1 |= ((val as u32 as u32) << 4u32) & (240usize as u32); - } - #[inline] - pub fn l4_type(&self) -> u32 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (3840usize as u32)) >> - 8u32) as u32) - } - } - #[inline] - pub fn set_l4_type(&mut self, val: u32) { - self._bitfield_1 &= !(3840usize as u32); - self._bitfield_1 |= - ((val as u32 as u32) << 8u32) & (3840usize as u32); - } - #[inline] - pub fn tun_type(&self) -> u32 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (61440usize as u32)) >> - 12u32) as u32) - } - } - #[inline] - pub fn set_tun_type(&mut self, val: u32) { - self._bitfield_1 &= !(61440usize as u32); - self._bitfield_1 |= - ((val as u32 as u32) << 12u32) & (61440usize as u32); - } - #[inline] - pub fn inner_l2_type(&self) -> u32 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (983040usize as u32)) - >> 16u32) as u32) - } - } - #[inline] - pub fn set_inner_l2_type(&mut self, val: u32) { - self._bitfield_1 &= !(983040usize as u32); - self._bitfield_1 |= - ((val as u32 as u32) << 16u32) & (983040usize as u32); - } - #[inline] - pub fn inner_l3_type(&self) -> u32 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (15728640usize as u32)) - >> 20u32) as u32) - } - } - #[inline] - pub fn set_inner_l3_type(&mut self, val: u32) { - self._bitfield_1 &= !(15728640usize as u32); - self._bitfield_1 |= - ((val as u32 as u32) << 20u32) & (15728640usize as u32); - } - #[inline] - pub fn inner_l4_type(&self) -> u32 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & - (251658240usize as u32)) >> 24u32) as - u32) - } - } - #[inline] - pub fn set_inner_l4_type(&mut self, val: u32) { - self._bitfield_1 &= !(251658240usize as u32); - self._bitfield_1 |= - ((val as u32 as u32) << 24u32) & (251658240usize as u32); - } -} #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , 4usize , @@ -499,7 +408,8 @@ pub struct rte_mbuf__bindgen_ty_5 { #[repr(C)] #[derive(Debug, Default, Copy)] pub struct rte_mbuf__bindgen_ty_5__bindgen_ty_1 { - pub _bitfield_1: u64, + pub _bitfield_1: [u16; 4usize], + pub __bindgen_align: [u64; 0usize], } #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_5__bindgen_ty_1() { @@ -515,88 +425,6 @@ fn bindgen_test_layout_rte_mbuf__bindgen_ty_5__bindgen_ty_1() { impl Clone for rte_mbuf__bindgen_ty_5__bindgen_ty_1 { fn clone(&self) -> Self { *self } } -impl rte_mbuf__bindgen_ty_5__bindgen_ty_1 { - #[inline] - pub fn l2_len(&self) -> u64 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (127usize as u64)) >> - 0u32) as u64) - } - } - #[inline] - pub fn set_l2_len(&mut self, val: u64) { - self._bitfield_1 &= !(127usize as u64); - self._bitfield_1 |= ((val as u64 as u64) << 0u32) & (127usize as u64); - } - #[inline] - pub fn l3_len(&self) -> u64 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (65408usize as u64)) >> - 7u32) as u64) - } - } - #[inline] - pub fn set_l3_len(&mut self, val: u64) { - self._bitfield_1 &= !(65408usize as u64); - self._bitfield_1 |= - ((val as u64 as u64) << 7u32) & (65408usize as u64); - } - #[inline] - pub fn l4_len(&self) -> u64 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (16711680usize as u64)) - >> 16u32) as u64) - } - } - #[inline] - pub fn set_l4_len(&mut self, val: u64) { - self._bitfield_1 &= !(16711680usize as u64); - self._bitfield_1 |= - ((val as u64 as u64) << 16u32) & (16711680usize as u64); - } - #[inline] - pub fn tso_segsz(&self) -> u64 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & - (1099494850560usize as u64)) >> 24u32) - as u64) - } - } - #[inline] - pub fn set_tso_segsz(&mut self, val: u64) { - self._bitfield_1 &= !(1099494850560usize as u64); - self._bitfield_1 |= - ((val as u64 as u64) << 24u32) & (1099494850560usize as u64); - } - #[inline] - pub fn outer_l3_len(&self) -> u64 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & - (561850441793536usize as u64)) >> - 40u32) as u64) - } - } - #[inline] - pub fn set_outer_l3_len(&mut self, val: u64) { - self._bitfield_1 &= !(561850441793536usize as u64); - self._bitfield_1 |= - ((val as u64 as u64) << 40u32) & (561850441793536usize as u64); - } - #[inline] - pub fn outer_l2_len(&self) -> u64 { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & - (71494644084506624usize as u64)) >> - 49u32) as u64) - } - } - #[inline] - pub fn set_outer_l2_len(&mut self, val: u64) { - self._bitfield_1 &= !(71494644084506624usize as u64); - self._bitfield_1 |= - ((val as u64 as u64) << 49u32) & (71494644084506624usize as u64); - } -} #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_5() { assert_eq!(::std::mem::size_of::() , 8usize , diff --git a/tests/expectations/tests/only_bitfields.rs b/tests/expectations/tests/only_bitfields.rs index 9252097d66..643725d9f9 100644 --- a/tests/expectations/tests/only_bitfields.rs +++ b/tests/expectations/tests/only_bitfields.rs @@ -8,6 +8,7 @@ #[derive(Debug, Default, Copy)] pub struct C { pub _bitfield_1: u8, + pub __bindgen_align: [u8; 0usize], } #[test] fn bindgen_test_layout_C() { @@ -19,29 +20,3 @@ fn bindgen_test_layout_C() { impl Clone for C { fn clone(&self) -> Self { *self } } -impl C { - #[inline] - pub fn a(&self) -> bool { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (1usize as u8)) >> - 0u32) as u8) - } - } - #[inline] - pub fn set_a(&mut self, val: bool) { - self._bitfield_1 &= !(1usize as u8); - self._bitfield_1 |= ((val as u8 as u8) << 0u32) & (1usize as u8); - } - #[inline] - pub fn b(&self) -> bool { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (254usize as u8)) >> - 1u32) as u8) - } - } - #[inline] - pub fn set_b(&mut self, val: bool) { - self._bitfield_1 &= !(254usize as u8); - self._bitfield_1 |= ((val as u8 as u8) << 1u32) & (254usize as u8); - } -} diff --git a/tests/expectations/tests/struct_with_bitfields.rs b/tests/expectations/tests/struct_with_bitfields.rs index 861ad66277..2f9ba42d38 100644 --- a/tests/expectations/tests/struct_with_bitfields.rs +++ b/tests/expectations/tests/struct_with_bitfields.rs @@ -27,103 +27,3 @@ fn bindgen_test_layout_bitfield() { impl Clone for bitfield { fn clone(&self) -> Self { *self } } -impl bitfield { - #[inline] - pub fn a(&self) -> ::std::os::raw::c_ushort { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (1usize as u8)) >> - 0u32) as u16) - } - } - #[inline] - pub fn set_a(&mut self, val: ::std::os::raw::c_ushort) { - self._bitfield_1 &= !(1usize as u8); - self._bitfield_1 |= ((val as u16 as u8) << 0u32) & (1usize as u8); - } - #[inline] - pub fn b(&self) -> ::std::os::raw::c_ushort { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (2usize as u8)) >> - 1u32) as u16) - } - } - #[inline] - pub fn set_b(&mut self, val: ::std::os::raw::c_ushort) { - self._bitfield_1 &= !(2usize as u8); - self._bitfield_1 |= ((val as u16 as u8) << 1u32) & (2usize as u8); - } - #[inline] - pub fn c(&self) -> ::std::os::raw::c_ushort { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (4usize as u8)) >> - 2u32) as u16) - } - } - #[inline] - pub fn set_c(&mut self, val: ::std::os::raw::c_ushort) { - self._bitfield_1 &= !(4usize as u8); - self._bitfield_1 |= ((val as u16 as u8) << 2u32) & (4usize as u8); - } - #[inline] - pub fn at_offset_3(&self) -> ::std::os::raw::c_ushort { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (8usize as u8)) >> - 3u32) as u16) - } - } - #[inline] - pub fn set_at_offset_3(&mut self, val: ::std::os::raw::c_ushort) { - self._bitfield_1 &= !(8usize as u8); - self._bitfield_1 |= ((val as u16 as u8) << 3u32) & (8usize as u8); - } - #[inline] - pub fn at_offset_4(&self) -> ::std::os::raw::c_ushort { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (48usize as u8)) >> - 4u32) as u16) - } - } - #[inline] - pub fn set_at_offset_4(&mut self, val: ::std::os::raw::c_ushort) { - self._bitfield_1 &= !(48usize as u8); - self._bitfield_1 |= ((val as u16 as u8) << 4u32) & (48usize as u8); - } - #[inline] - pub fn d(&self) -> ::std::os::raw::c_ushort { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (192usize as u8)) >> - 6u32) as u16) - } - } - #[inline] - pub fn set_d(&mut self, val: ::std::os::raw::c_ushort) { - self._bitfield_1 &= !(192usize as u8); - self._bitfield_1 |= ((val as u16 as u8) << 6u32) & (192usize as u8); - } - #[inline] - pub fn f(&self) -> ::std::os::raw::c_uint { - unsafe { - ::std::mem::transmute(((self._bitfield_2 & (3usize as u8)) >> - 0u32) as u32) - } - } - #[inline] - pub fn set_f(&mut self, val: ::std::os::raw::c_uint) { - self._bitfield_2 &= !(3usize as u8); - self._bitfield_2 |= ((val as u32 as u8) << 0u32) & (3usize as u8); - } - #[inline] - pub fn g(&self) -> ::std::os::raw::c_uint { - unsafe { - ::std::mem::transmute(((self._bitfield_3 & - (4294967295usize as u32)) >> 0u32) as - u32) - } - } - #[inline] - pub fn set_g(&mut self, val: ::std::os::raw::c_uint) { - self._bitfield_3 &= !(4294967295usize as u32); - self._bitfield_3 |= - ((val as u32 as u32) << 0u32) & (4294967295usize as u32); - } -} diff --git a/tests/expectations/tests/union_with_anon_struct_bitfield.rs b/tests/expectations/tests/union_with_anon_struct_bitfield.rs index d14a38bb3f..f102117f10 100644 --- a/tests/expectations/tests/union_with_anon_struct_bitfield.rs +++ b/tests/expectations/tests/union_with_anon_struct_bitfield.rs @@ -39,6 +39,7 @@ pub struct foo { #[derive(Debug, Default, Copy)] pub struct foo__bindgen_ty_1 { pub _bitfield_1: u32, + pub __bindgen_align: [u32; 0usize], } #[test] fn bindgen_test_layout_foo__bindgen_ty_1() { @@ -50,34 +51,6 @@ fn bindgen_test_layout_foo__bindgen_ty_1() { impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } -impl foo__bindgen_ty_1 { - #[inline] - pub fn b(&self) -> ::std::os::raw::c_int { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (127usize as u32)) >> - 0u32) as u32) - } - } - #[inline] - pub fn set_b(&mut self, val: ::std::os::raw::c_int) { - self._bitfield_1 &= !(127usize as u32); - self._bitfield_1 |= ((val as u32 as u32) << 0u32) & (127usize as u32); - } - #[inline] - pub fn c(&self) -> ::std::os::raw::c_int { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & - (4294967168usize as u32)) >> 7u32) as - u32) - } - } - #[inline] - pub fn set_c(&mut self, val: ::std::os::raw::c_int) { - self._bitfield_1 &= !(4294967168usize as u32); - self._bitfield_1 |= - ((val as u32 as u32) << 7u32) & (4294967168usize as u32); - } -} #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( diff --git a/tests/expectations/tests/unknown_attr.rs b/tests/expectations/tests/unknown_attr.rs index 2c50c36543..23d9ff7519 100644 --- a/tests/expectations/tests/unknown_attr.rs +++ b/tests/expectations/tests/unknown_attr.rs @@ -9,7 +9,7 @@ pub struct max_align_t { pub __clang_max_align_nonce1: ::std::os::raw::c_longlong, pub __bindgen_padding_0: u64, - pub __clang_max_align_nonce2: f64, + pub __clang_max_align_nonce2: ::std::os::raw::c_longlong, pub __bindgen_padding_1: u64, } #[test] diff --git a/tests/expectations/tests/weird_bitfields.rs b/tests/expectations/tests/weird_bitfields.rs index a2841e341f..466904e851 100644 --- a/tests/expectations/tests/weird_bitfields.rs +++ b/tests/expectations/tests/weird_bitfields.rs @@ -15,7 +15,7 @@ pub enum nsStyleSVGOpacitySource { #[derive(Debug, Copy)] pub struct Weird { pub mStrokeDasharrayLength: ::std::os::raw::c_uint, - pub _bitfield_1: u32, + pub _bitfield_1: [u16; 2usize], pub mClipRule: ::std::os::raw::c_uchar, pub mColorInterpolation: ::std::os::raw::c_uchar, pub mColorInterpolationFilters: ::std::os::raw::c_uchar, @@ -27,7 +27,8 @@ pub struct Weird { pub mStrokeLinejoin: ::std::os::raw::c_uchar, pub mTextAnchor: ::std::os::raw::c_uchar, pub mTextRendering: ::std::os::raw::c_uchar, - pub _bitfield_2: u16, + pub _bitfield_2: u8, + pub _bitfield_3: u8, } #[test] fn bindgen_test_layout_Weird() { @@ -102,92 +103,3 @@ impl Clone for Weird { impl Default for Weird { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -impl Weird { - #[inline] - pub fn bitTest(&self) -> ::std::os::raw::c_uint { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & (65535usize as u32)) >> - 0u32) as u32) - } - } - #[inline] - pub fn set_bitTest(&mut self, val: ::std::os::raw::c_uint) { - self._bitfield_1 &= !(65535usize as u32); - self._bitfield_1 |= - ((val as u32 as u32) << 0u32) & (65535usize as u32); - } - #[inline] - pub fn bitTest2(&self) -> ::std::os::raw::c_uint { - unsafe { - ::std::mem::transmute(((self._bitfield_1 & - (2147418112usize as u32)) >> 16u32) as - u32) - } - } - #[inline] - pub fn set_bitTest2(&mut self, val: ::std::os::raw::c_uint) { - self._bitfield_1 &= !(2147418112usize as u32); - self._bitfield_1 |= - ((val as u32 as u32) << 16u32) & (2147418112usize as u32); - } - #[inline] - pub fn mFillOpacitySource(&self) -> nsStyleSVGOpacitySource { - unsafe { - ::std::mem::transmute(((self._bitfield_2 & (7usize as u16)) >> - 0u32) as u32) - } - } - #[inline] - pub fn set_mFillOpacitySource(&mut self, val: nsStyleSVGOpacitySource) { - self._bitfield_2 &= !(7usize as u16); - self._bitfield_2 |= ((val as u32 as u16) << 0u32) & (7usize as u16); - } - #[inline] - pub fn mStrokeOpacitySource(&self) -> nsStyleSVGOpacitySource { - unsafe { - ::std::mem::transmute(((self._bitfield_2 & (56usize as u16)) >> - 3u32) as u32) - } - } - #[inline] - pub fn set_mStrokeOpacitySource(&mut self, val: nsStyleSVGOpacitySource) { - self._bitfield_2 &= !(56usize as u16); - self._bitfield_2 |= ((val as u32 as u16) << 3u32) & (56usize as u16); - } - #[inline] - pub fn mStrokeDasharrayFromObject(&self) -> bool { - unsafe { - ::std::mem::transmute(((self._bitfield_2 & (64usize as u16)) >> - 6u32) as u8) - } - } - #[inline] - pub fn set_mStrokeDasharrayFromObject(&mut self, val: bool) { - self._bitfield_2 &= !(64usize as u16); - self._bitfield_2 |= ((val as u8 as u16) << 6u32) & (64usize as u16); - } - #[inline] - pub fn mStrokeDashoffsetFromObject(&self) -> bool { - unsafe { - ::std::mem::transmute(((self._bitfield_2 & (128usize as u16)) >> - 7u32) as u8) - } - } - #[inline] - pub fn set_mStrokeDashoffsetFromObject(&mut self, val: bool) { - self._bitfield_2 &= !(128usize as u16); - self._bitfield_2 |= ((val as u8 as u16) << 7u32) & (128usize as u16); - } - #[inline] - pub fn mStrokeWidthFromObject(&self) -> bool { - unsafe { - ::std::mem::transmute(((self._bitfield_2 & (256usize as u16)) >> - 8u32) as u8) - } - } - #[inline] - pub fn set_mStrokeWidthFromObject(&mut self, val: bool) { - self._bitfield_2 &= !(256usize as u16); - self._bitfield_2 |= ((val as u8 as u16) << 8u32) & (256usize as u16); - } -} diff --git a/tests/headers/bitfield_align.h b/tests/headers/bitfield_align.h new file mode 100644 index 0000000000..82b5309937 --- /dev/null +++ b/tests/headers/bitfield_align.h @@ -0,0 +1,41 @@ +struct A { + unsigned char x; + unsigned b1 : 1; + unsigned b2 : 1; + unsigned b3 : 1; + unsigned b4 : 1; + unsigned b5 : 1; + unsigned b6 : 1; + unsigned b7 : 1; + unsigned b8 : 1; + unsigned b9 : 1; + unsigned b10 : 1; + unsigned char y; +}; + +struct B { + unsigned foo : 31; + unsigned char bar : 1; +}; + +struct C { + unsigned char x; + unsigned b1 : 1; + unsigned b2 : 1; + unsigned baz; +}; + +struct Date1 { + unsigned short nWeekDay : 3; // 0..7 (3 bits) + unsigned short nMonthDay : 6; // 0..31 (6 bits) + unsigned short nMonth : 5; // 0..12 (5 bits) + unsigned short nYear : 8; // 0..100 (8 bits) +}; + +struct Date2 { + unsigned short nWeekDay : 3; // 0..7 (3 bits) + unsigned short nMonthDay : 6; // 0..31 (6 bits) + unsigned short nMonth : 5; // 0..12 (5 bits) + unsigned short nYear : 8; // 0..100 (8 bits) + unsigned char byte; +}; diff --git a/tests/headers/unknown_attr.h b/tests/headers/unknown_attr.h index f87e9f0b3a..1e89fb14dd 100644 --- a/tests/headers/unknown_attr.h +++ b/tests/headers/unknown_attr.h @@ -1,6 +1,6 @@ typedef struct { long long __clang_max_align_nonce1 __attribute__((__aligned__(__alignof__(long long)))); - long double __clang_max_align_nonce2 + long long __clang_max_align_nonce2 __attribute__((__aligned__(__alignof__(long double)))); } max_align_t; From 98f43d01d9692b49b3858e4a45d9a7ec05b009dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 16 Feb 2017 00:05:42 +0100 Subject: [PATCH 0353/2291] Breaking version bump. --- Cargo.lock | 76 +++++++++++++++++++++++++++--------------------------- Cargo.toml | 2 +- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ae1dc41ac..089e0f242d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,12 +1,12 @@ [root] name = "bindgen" -version = "0.21.3" +version = "0.22.0" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "clang-sys 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.19.3 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.20.4 (registry+https://github.com/rust-lang/crates.io-index)", "diff 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -21,7 +21,7 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -67,20 +67,20 @@ dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", - "libloading 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libloading 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "clap" -version = "2.19.3" +version = "2.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "term_size 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-segmentation 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "term_size 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "vec_map 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -92,7 +92,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "dtoa" -version = "0.2.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -111,7 +111,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "itoa" -version = "0.1.1" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -135,12 +135,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libloading" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "target_build_utils 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "target_build_utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -234,7 +234,7 @@ name = "regex" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -253,18 +253,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "0.8.23" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_json" -version = "0.8.6" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -279,7 +279,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "strsim" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -300,7 +300,7 @@ dependencies = [ "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", - "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -323,23 +323,23 @@ dependencies = [ "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", "syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", - "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "target_build_utils" -version = "0.1.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "term" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -348,7 +348,7 @@ dependencies = [ [[package]] name = "term_size" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -376,7 +376,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "0.1.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -423,23 +423,23 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum aho-corasick 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f660b942762979b56c9f07b4b36bb559776fbad102f05d6771e1b629e8fd5bf" +"checksum aho-corasick 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0638fd549427caa90c499814196d1b9e3725eb4d15d7339d6de073a680ed0ca2" "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" "checksum aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2c9b49e42a449c0b79d8acb91db37621de0978064dca7d3288ddcf030123e5b3" "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d" "checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c" "checksum clang-sys 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f98f0715ff67f27ca6a2f8f0ffc2a56f8edbc7acd57489c29eadc3a15c4eafe" -"checksum clap 2.19.3 (registry+https://github.com/rust-lang/crates.io-index)" = "95b78f3fe0fc94c13c731714363260e04b557a637166f33a4570d3189d642374" +"checksum clap 2.20.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a60af5cb867dd4ee2378398acde80c73b466b58a963f598061ce7e394800998d" "checksum diff 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e48977eec6d3b7707462c2dc2e1363ad91b5dd822cf942537ccdc2085dc87587" -"checksum dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0dd841b58510c9618291ffa448da2e4e0f699d984d436122372f446dae62263d" +"checksum dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90" "checksum env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "99971fb1b635fe7a0ee3c4d065845bb93cca80a23b5613b5613391ece5de4144" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" -"checksum itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3088ea4baeceb0284ee9eea42f591226e6beaecf65373e41b38d95a1b8e7a1" +"checksum itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6abe0ee2e758cd6bc8a2cd56726359007748fbf4128da998b65d0b70f881e19b" "checksum libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)" = "684f330624d8c3784fb9558ca46c4ce488073a8d22450415c5eb4f4cfb0d11b5" -"checksum libloading 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "84816a8c6ed8163dfe0dbdd2b09d35c6723270ea77a4c7afa4bedf038a36cb99" +"checksum libloading 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fd1835a714c1f67ba073a493493c23686a480e2614e208c921834808b1f19d8f" "checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054" "checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4" "checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce" @@ -454,21 +454,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4278c17d0f6d62dfef0ab00028feb45bd7d2102843f80763474eeb1be8a10c01" "checksum regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9191b1f57603095f105d317e375d19b1c9c5c3185ea9633a99a6dcbed04457" "checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b" -"checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" -"checksum serde_json 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "67f7d2e9edc3523a9c8ec8cd6ec481b3a27810aafee3e625d311febd3e656b4c" +"checksum serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1e0ed773960f90a78567fcfbe935284adf50c5d7cf119aa2cf43bb0b4afa69bb" +"checksum serde_json 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e095e4e94e7382b76f48e93bd845ffddda62df8dfd4c163b1bfa93d40e22e13a" "checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" "checksum siphasher 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2ffc669b726f2bc9a3bcff66e5e23b56ba6bf70e22a34c3d7b6d0b3450b65b84" -"checksum strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "67f84c44fbb2f91db7fef94554e6b2ac05909c9c0b0bc23bb98d3a1aebfe7f7c" +"checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" "checksum syntex 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb3f52553a966675982404dc34028291b347e0c9a9c0b0b34f2da6be8a0443f8" "checksum syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dee2f6e49c075f71332bb775219d5982bee6732d26227fa1ae1b53cdb12f5cc5" "checksum syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df3921c7945dfb9ffc53aa35adb2cf4313b5ab5f079c3619b3d4eb82a0efc2b" "checksum syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc960085bae44591e22d01f6c0e82a8aec832f8659aca556cdf8ecbdac2bb47b" -"checksum target_build_utils 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54c550e226618cd35334b75e92bfa5437c61474bdb75c38bf330ab5a8037b77c" -"checksum term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3deff8a2b3b6607d6d7cc32ac25c0b33709453ca9cceac006caac51e963cf94a" -"checksum term_size 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f7f5f3f71b0040cecc71af239414c23fd3c73570f5ff54cf50e03cef637f2a0" +"checksum target_build_utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f42dc058080c19c6a58bdd1bf962904ee4f5ef1fe2a81b529f31dacc750c679f" +"checksum term 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d168af3930b369cfe245132550579d47dfd873d69470755a19c2c6568dbbd989" +"checksum term_size 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "71662702fe5cd2cf95edd4ad655eea42f24a87a0e44059cbaa4e55260b7bc331" "checksum thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4437c97558c70d129e40629a5b385b3fb1ffac301e63941335e4d354081ec14a" "checksum thread_local 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7793b722f0f77ce716e7f1acf416359ca32ff24d04ffbac4269f44a4a83be05d" -"checksum unicode-segmentation 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c3bc443ded17b11305ffffe6b37e2076f328a5a8cb6aa877b1b98f77699e98b5" +"checksum unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18127285758f0e2c6cf325bb3f3d138a12fee27de4f23e146cd6a179f26c2cf3" "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" "checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" diff --git a/Cargo.toml b/Cargo.toml index c732337ee3..a9521be507 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.21.3" +version = "0.22.0" build = "build.rs" exclude = ["tests/headers", "tests/expectations", "bindgen-integration", "ci"] From 39391a421ab229d28bb2026cf95f545e71fcdf79 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 16 Feb 2017 11:35:22 -0800 Subject: [PATCH 0354/2291] Create ISSUE_TEMPLATE.md Github will automatically fill this in when people file new issues. --- .github/ISSUE_TEMPLATE.md | 63 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..68dfb68e13 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,63 @@ +### Input C/C++ Header + +```C++ +// Insert your (minimal) C/C++ header here +``` + +### Bindgen Invokation + + + +### Actual Results + + + +### Expected Results + + + +### `RUST_LOG=bindgen` Output + +``` +Insert debug logging when running bindgen with the RUST_LOG=bindgen environment +variable set. +``` From 49846a8b0527ed5f008e67548a39f57b7ec776cd Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 17 Feb 2017 08:34:37 -0800 Subject: [PATCH 0355/2291] Add an example image of our IR rendered with graphviz --- CONTRIBUTING.md | 54 ++++++++++++++++++++++++---------------- example-graphviz-ir.png | Bin 0 -> 842576 bytes 2 files changed, 32 insertions(+), 22 deletions(-) create mode 100644 example-graphviz-ir.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8c34710713..df32998b15 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,8 +15,8 @@ out to us in a GitHub issue, or stop by - [Overview](#overview) - [Running All Tests](#running-all-tests) - [Authoring New Tests](#authoring-new-tests) -- [Generating Graphviz Dot File](#generating-graphviz-dot-file) - [Automatic code formatting](#automatic-code-formatting) +- [Generating Graphviz Dot Files](#generating-graphviz-dot-files) - [Debug Logging](#debug-logging) - [Using `creduce` to Minimize Test Cases](#using-creduce-to-minimize-test-cases) - [Isolating Your Test Case](#isolating-your-test-case) @@ -113,27 +113,6 @@ Then verify the new Rust bindings compile and pass some basic tests: $ cargo test -p tests_expectations ``` -## Generating Graphviz Dot Files - -We have a special thing which will help you debug your codegen context if something -will go wrong. It will generate a [`graphviz`](http://graphviz.org/pdf/dotguide.pdf) -dot file and then you can create a PNG from it with `graphviz` tool in your OS. - -Here is an example how it could be done: - -``` -$ cargo run -- example.hpp --emit-ir-graphviz output.dot -``` - -It will generate your graphviz dot file and then you will need tog -create a PNG from it with `graphviz`. - -Something like this: - -``` -$ dot -Tpng output.dot -o output.png -``` - ## Automatic code formatting We use [`rustfmt`](https://github.com/rust-lang-nursery/rustfmt) to enforce a @@ -157,6 +136,37 @@ $ cargo fmt The code style is described in the `rustfmt.toml` file in top level of the repo. +## Generating Graphviz Dot Files + +We can generate [Graphviz](http://graphviz.org/pdf/dotguide.pdf) dot files from +our internal representation of a C/C++ input header, and then you can create a +PNG or PDF from it with Graphviz's `dot` program. This is very useful when +debugging bindgen! + +First, make sure you have Graphviz and `dot` installed: + +``` +$ brew install graphviz # OS X +$ sudo dnf install graphviz # Fedora +$ # Etc... +``` + +Then, use the `--emit-ir-graphviz` flag to generate a `dot` file from our IR: + +``` +$ cargo run -- example.hpp --emit-ir-graphviz output.dot +``` + +Finally, convert the `dot` file to an image: + +``` +$ dot -Tpng output.dot -o output.png +``` + +The final result will look something like this: + +[![An example graphviz rendering of our IR](./example-graphviz-ir.png)](./example-graphviz-ir.png) + ## Debug Logging To help debug what `bindgen` is doing, you can define the environment variable diff --git a/example-graphviz-ir.png b/example-graphviz-ir.png new file mode 100644 index 0000000000000000000000000000000000000000..c990f7e7b415cf4ce7db865c8c7a0c441ec254cb GIT binary patch literal 842576 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%0AK6GzSc6ij$6``&|Tl1P=8)DFK@+?#;w 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

*oIH5 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 Date: Fri, 17 Feb 2017 09:13:46 -0800 Subject: [PATCH 0356/2291] Make an ir::dot module and DotAttributes trait --- src/codegen/mod.rs | 3 ++- src/ir/context.rs | 31 +-------------------------- src/ir/dot.rs | 53 ++++++++++++++++++++++++++++++++++++++++++++++ src/ir/item.rs | 30 ++++++++++++++------------ src/ir/mod.rs | 1 + 5 files changed, 73 insertions(+), 45 deletions(-) create mode 100644 src/ir/dot.rs diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 77f654e6e6..aab5994628 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -10,6 +10,7 @@ use ir::annotations::FieldAccessorKind; use ir::comp::{Base, CompInfo, CompKind, Field, Method, MethodKind}; use ir::context::{BindgenContext, ItemId}; use ir::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; +use ir::dot; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; use ir::function::{Function, FunctionSig}; use ir::int::IntKind; @@ -2502,7 +2503,7 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { } if let Some(path) = context.options().emit_ir_graphviz.as_ref() { - match context.emit_ir_graphviz(path.clone()) { + match dot::write_dot_file(context, path) { Ok(()) => info!("Your dot file was generated successfully into: {}", path), Err(e) => error!("{}", e), } diff --git a/src/ir/context.rs b/src/ir/context.rs index 7383c09a4c..d2fb2befc6 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -5,7 +5,7 @@ use super::int::IntKind; use super::item::{Item, ItemCanonicalPath, ItemSet}; use super::item_kind::ItemKind; use super::module::{Module, ModuleKind}; -use super::traversal::{self, Edge, ItemTraversal, Trace}; +use super::traversal::{self, Edge, ItemTraversal}; use super::ty::{FloatKind, TemplateDeclaration, Type, TypeKind}; use BindgenOptions; use cexpr; @@ -18,8 +18,6 @@ use std::cell::Cell; use std::collections::{HashMap, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; -use std::fs::File; -use std::io::{self, Write}; use std::iter::IntoIterator; use syntax::ast::Ident; use syntax::codemap::{DUMMY_SP, Span}; @@ -1111,33 +1109,6 @@ impl<'ctx> BindgenContext<'ctx> { &self.options } - /// Output graphviz dot file. - pub fn emit_ir_graphviz(&self, path: String) -> io::Result<()> { - let file = try!(File::create(path)); - let mut dot_file = io::BufWriter::new(file); - writeln!(&mut dot_file, "digraph {{")?; - - let mut err: Option> = None; - - for (id, item) in self.items() { - writeln!(&mut dot_file, "{} {};", id.0, item.dot_attributes(self))?; - - item.trace(self, &mut |sub_id: ItemId, _edge_kind| { - match writeln!(&mut dot_file, "{} -> {};", id.0, sub_id.as_usize()) { - Ok(_) => {}, - Err(e) => err = Some(Err(e)), - } - }, &()); - - if err.is_some() { - return err.unwrap(); - } - } - - writeln!(&mut dot_file, "}}")?; - Ok(()) - } - /// Tokenizes a namespace cursor in order to get the name and kind of the /// namespace, fn tokenize_namespace(&self, diff --git a/src/ir/dot.rs b/src/ir/dot.rs new file mode 100644 index 0000000000..b7a117bba1 --- /dev/null +++ b/src/ir/dot.rs @@ -0,0 +1,53 @@ +//! Generating Graphviz `dot` files from our IR. + +use std::fs::File; +use std::io::{self, Write}; +use std::path::Path; +use super::context::{BindgenContext, ItemId}; +use super::traversal::Trace; + +/// A trait for anything that can write attributes as `` rows to a dot +/// file. +pub trait DotAttributes { + /// Write this thing's attributes to the given output. Each attribute must + /// be its own `...`. + fn dot_attributes(&self, ctx: &BindgenContext, out: &mut W) -> io::Result<()> + where W: io::Write; +} + +/// Write a graphviz dot file containing our IR. +pub fn write_dot_file

(ctx: &BindgenContext, path: P) -> io::Result<()> + where P: AsRef +{ + let file = try!(File::create(path)); + let mut dot_file = io::BufWriter::new(file); + try!(writeln!(&mut dot_file, "digraph {{")); + + let mut err: Option> = None; + + for (id, item) in ctx.items() { + try!(writeln!(&mut dot_file, + r#"{} [fontname="courier", label=<

"#, + id.as_usize())); + try!(item.dot_attributes(ctx, &mut dot_file)); + try!(writeln!(&mut dot_file, r#"
>];"#)); + + item.trace(ctx, &mut |sub_id: ItemId, _edge_kind| { + if err.is_some() { + return; + } + + match writeln!(&mut dot_file, "{} -> {};", id.as_usize(), sub_id.as_usize()) { + Ok(_) => {}, + Err(e) => err = Some(Err(e)), + } + }, &()); + + if let Some(err) = err { + return err; + } + } + + try!(writeln!(&mut dot_file, "}}")); + Ok(()) +} diff --git a/src/ir/item.rs b/src/ir/item.rs index 8f16a96ff6..48a70fc698 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -3,6 +3,7 @@ use super::annotations::Annotations; use super::context::{BindgenContext, ItemId, PartialType}; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; +use super::dot::{DotAttributes}; use super::function::Function; use super::item_kind::ItemKind; use super::module::Module; @@ -15,6 +16,7 @@ use std::cell::{Cell, RefCell}; use std::collections::BTreeSet; use std::fmt::Write; use std::iter; +use std::io; /// A trait to get the canonical name from an item. /// @@ -372,20 +374,6 @@ impl Item { self.id } - /// Get this `Item`'s dot attributes. - pub fn dot_attributes(&self, ctx: &BindgenContext) -> String { - format!("[fontname=\"courier\", label=< \ - \ - \ - \ - \ -
ItemId({})
name{}
kind{}
\ - >]", - self.id.as_usize(), - self.name(ctx).get(), - self.kind.kind_name()) - } - /// Get this `Item`'s parent's identifier. /// /// For the root module, the parent's ID is its own ID. @@ -928,6 +916,20 @@ impl Item { /// A set of items. pub type ItemSet = BTreeSet; +impl DotAttributes for Item { + fn dot_attributes(&self, ctx: &BindgenContext, out: &mut W) -> io::Result<()> + where W: io::Write + { + writeln!(out, + "{:?} + name{} + kind{}", + self.id, + self.name(ctx).get(), + self.kind.kind_name()) + } +} + impl TemplateDeclaration for ItemId { fn template_params(&self, ctx: &BindgenContext) -> Option> { ctx.resolve_item_fallible(*self) diff --git a/src/ir/mod.rs b/src/ir/mod.rs index e624e46bd2..ba549c5115 100644 --- a/src/ir/mod.rs +++ b/src/ir/mod.rs @@ -7,6 +7,7 @@ pub mod annotations; pub mod comp; pub mod context; pub mod derive; +pub mod dot; pub mod enum_ty; pub mod function; pub mod int; From 40943962f21cecad4c3e558b03287cd315a4fd84 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 17 Feb 2017 10:34:47 -0800 Subject: [PATCH 0357/2291] Implement DotAttribute for a bunch of types This gives us more debug information in the emitted graphviz dot files. --- src/ir/function.rs | 14 +++++++++++ src/ir/item.rs | 13 +++++------ src/ir/item_kind.rs | 20 +++++++++++++++- src/ir/module.rs | 12 ++++++++++ src/ir/ty.rs | 57 +++++++++++++++++++++++++++++++++++++++++++++ src/ir/var.rs | 18 ++++++++++++++ 6 files changed, 126 insertions(+), 8 deletions(-) diff --git a/src/ir/function.rs b/src/ir/function.rs index 22b9c9b04a..daa30b893b 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -1,12 +1,14 @@ //! Intermediate representation for C/C++ functions and methods. use super::context::{BindgenContext, ItemId}; +use super::dot::DotAttributes; use super::item::Item; use super::traversal::{Trace, Tracer}; use super::ty::TypeKind; use clang; use clang_sys::CXCallingConv; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; +use std::io; use syntax::abi; /// A function declaration, with a signature, arguments, and argument names. @@ -59,6 +61,18 @@ impl Function { } } +impl DotAttributes for Function { + fn dot_attributes(&self, _ctx: &BindgenContext, out: &mut W) -> io::Result<()> + where W: io::Write + { + if let Some(ref mangled) = self.mangled_name { + try!(writeln!(out, "mangled name{}", mangled)); + } + + Ok(()) + } +} + /// A function signature. #[derive(Debug)] pub struct FunctionSig { diff --git a/src/ir/item.rs b/src/ir/item.rs index 48a70fc698..bd401abab3 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -920,13 +920,12 @@ impl DotAttributes for Item { fn dot_attributes(&self, ctx: &BindgenContext, out: &mut W) -> io::Result<()> where W: io::Write { - writeln!(out, - "{:?} - name{} - kind{}", - self.id, - self.name(ctx).get(), - self.kind.kind_name()) + try!(writeln!(out, + "{:?} + name{}", + self.id, + self.name(ctx).get())); + self.kind.dot_attributes(ctx, out) } } diff --git a/src/ir/item_kind.rs b/src/ir/item_kind.rs index 3ff0673169..6dfd6764ce 100644 --- a/src/ir/item_kind.rs +++ b/src/ir/item_kind.rs @@ -1,5 +1,8 @@ //! Different variants of an `Item` in our intermediate representation. +use std::io; +use super::context::BindgenContext; +use super::dot::DotAttributes; use super::function::Function; use super::module::Module; use super::ty::Type; @@ -39,7 +42,7 @@ impl ItemKind { ItemKind::Type(..) => "Type", ItemKind::Function(..) => "Function", ItemKind::Var(..) => "Var" - } + } } /// Is this a module? @@ -122,3 +125,18 @@ impl ItemKind { self.as_var().expect("Not a var") } } + +impl DotAttributes for ItemKind { + fn dot_attributes(&self, ctx: &BindgenContext, out: &mut W) -> io::Result<()> + where W: io::Write + { + try!(writeln!(out, "kind{}", self.kind_name())); + + match *self { + ItemKind::Module(ref module) => module.dot_attributes(ctx, out), + ItemKind::Type(ref ty) => ty.dot_attributes(ctx, out), + ItemKind::Function(ref func) => func.dot_attributes(ctx, out), + ItemKind::Var(ref var) => var.dot_attributes(ctx, out), + } + } +} diff --git a/src/ir/module.rs b/src/ir/module.rs index 6b6c535bc7..6787e3f902 100644 --- a/src/ir/module.rs +++ b/src/ir/module.rs @@ -1,6 +1,8 @@ //! Intermediate representation for modules (AKA C++ namespaces). +use std::io; use super::context::{BindgenContext, ItemId}; +use super::dot::DotAttributes; use clang; use parse::{ClangSubItemParser, ParseError, ParseResult}; use parse_one; @@ -56,6 +58,16 @@ impl Module { } } +impl DotAttributes for Module { + fn dot_attributes(&self, _ctx: &BindgenContext, out: &mut W) -> io::Result<()> + where W: io::Write + { + writeln!(out, + "ModuleKind{:?}", + self.kind) + } +} + impl ClangSubItemParser for Module { fn parse(cursor: clang::Cursor, ctx: &mut BindgenContext) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index c3ec4039ca..44a8874440 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -3,6 +3,7 @@ use super::comp::CompInfo; use super::context::{BindgenContext, ItemId}; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; +use super::dot::DotAttributes; use super::enum_ty::Enum; use super::function::FunctionSig; use super::int::IntKind; @@ -12,6 +13,7 @@ use super::objc::ObjCInterface; use super::traversal::{Trace, Tracer}; use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; +use std::io; use std::mem; /// Template declaration related methods. @@ -384,6 +386,61 @@ impl Type { } } +impl DotAttributes for Type { + fn dot_attributes(&self, ctx: &BindgenContext, out: &mut W) -> io::Result<()> + where W: io::Write + { + if let Some(ref layout) = self.layout { + try!(writeln!(out, + "size{} + align{}", + layout.size, + layout.align)); + if layout.packed { + try!(writeln!(out, "packedtrue")); + } + } + + if self.is_const { + try!(writeln!(out, "consttrue")); + } + + self.kind.dot_attributes(ctx, out) + } +} + +impl DotAttributes for TypeKind { + fn dot_attributes(&self, _ctx: &BindgenContext, out: &mut W) -> io::Result<()> + where W: io::Write + { + write!(out, + "TypeKind{}", + match *self { + TypeKind::Void => "Void", + TypeKind::NullPtr => "NullPtr", + TypeKind::Comp(..) => "Comp", + TypeKind::Int(..) => "Int", + TypeKind::Float(..) => "Float", + TypeKind::Complex(..) => "Complex", + TypeKind::Alias(..) => "Alias", + TypeKind::TemplateAlias(..) => "TemplateAlias", + TypeKind::Array(..) => "Array", + TypeKind::Function(..) => "Function", + TypeKind::Enum(..) => "Enum", + TypeKind::Pointer(..) => "Pointer", + TypeKind::BlockPointer => "BlockPointer", + TypeKind::Reference(..) => "Reference", + TypeKind::TemplateInstantiation(..) => "TemplateInstantiation", + TypeKind::ResolvedTypeRef(..) => "ResolvedTypeRef", + TypeKind::Named => "Named", + TypeKind::ObjCInterface(..) => "ObjCInterface", + TypeKind::UnresolvedTypeRef(..) => { + unreachable!("there shouldn't be any more of these anymore") + } + }) + } +} + #[test] fn is_invalid_named_type_valid() { let ty = Type::new(Some("foo".into()), None, TypeKind::Named, false); diff --git a/src/ir/var.rs b/src/ir/var.rs index 6cfcdae735..c6d7a1c55f 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -1,6 +1,7 @@ //! Intermediate representation of variables. use super::context::{BindgenContext, ItemId}; +use super::dot::DotAttributes; use super::function::cursor_mangling; use super::int::IntKind; use super::item::Item; @@ -8,6 +9,7 @@ use super::ty::{FloatKind, TypeKind}; use cexpr; use clang; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; +use std::io; use std::num::Wrapping; /// The type for a constant variable. @@ -84,6 +86,22 @@ impl Var { } } +impl DotAttributes for Var { + fn dot_attributes(&self, _ctx: &BindgenContext, out: &mut W) -> io::Result<()> + where W: io::Write + { + if self.is_const { + try!(writeln!(out, "consttrue")); + } + + if let Some(ref mangled) = self.mangled_name { + try!(writeln!(out, "mangled name{}", mangled)); + } + + Ok(()) + } +} + impl ClangSubItemParser for Var { fn parse(cursor: clang::Cursor, ctx: &mut BindgenContext) From d19a2dd031b42a38398e79cc3e811e107d89376e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 17 Feb 2017 10:35:35 -0800 Subject: [PATCH 0358/2291] Update the example graphviz image --- example-graphviz-ir.png | Bin 842576 -> 1343520 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/example-graphviz-ir.png b/example-graphviz-ir.png index c990f7e7b415cf4ce7db865c8c7a0c441ec254cb..1e554a83ee3b8ac08cd3da05841a0381539b4db2 100644 GIT binary patch literal 1343520 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%0AY|Mxp`r~~{G>V@v|)MW>l1Bav$x}axb8>{n5Of* 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


sG6HEg9nW&3SqG$$5HjNQ!)a{^Avx6}y4m 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 z

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%0AnE8bbD z?@0n`!v`Qs-(MX16j~)9hL_eW`c|R?txT{MU(*3;f1%I-2aI%=(U`KrFZiSwri|o2=Tr^I1AfmTVLc8#ZKhY6hIB6 z3l5bw)*cZbQA2}qN{&hlVtsH_c7#YX=}yrn+zvg>n4BW#O%936M?!>%H0#p=PictZV7m=b(2D;^}=c;nN~T zR2WA`K>zG(OQtZUY7y`OfEq7B(RsGUhw&W6(lVI#o|6I6TecWwKGz?3WuZwsTn=cZ zKCN~jFjDUOY#9`dLf3__*QaG)@sma*1TaWXJQj~?!T>e7la7_NcB|j}7xXOH2t8wm zyy@@2V7XOZw|E@N4UH5^3sr8#TH}FzXb-I9?O%ZQ_mF=WvD0CR%vPZov?eOs5WMJ3 zY4-JAq!dKxgz8)erH;3Jy7I7}&cOOeh0y&36~9b3RQ#*-wuA24dKMU(*(fY7EKKf& zVjYU)PD}U?clooP3;Q^~vXMS*~v;8^%`JJ#m$J%QJ5!PFeD6jbzBy->}Iq zN5GxBO~RDtvK4OjhIuon6zIYfeKh+ahR{Cb%b{f3PjS%aKF3Pc1rSW=XL$Q-feDS| zK-}~)$_oUPIJ#n?mgy5{JZt>uk#0qmlUmN`L*sq+_r5Ikhmt2BsAlZWu3o!=T?6GJ8@`{z(b*-&wkZMUtnw3@GHi zsKWVhkmv;>czAk25x*i;ORss4wf(puZ4+ZU%}SDpD^~Mm31~wLeCMr@V5usm@$XF) zF;e74p#a1BwvON%E^$LT!sMs7^CtaAmxg*&l9WqgX46KOe%D#6UpY8_D~M>xXLq9G z3EU@FU8XY+S`mkWzTf|^Ysd;IO}EbNeCK{5e) zUiP)M37*!6<97y~T>J|$^z>z`yD4%PZBq|7?T;0(2g4|EWgNbycT498sx5)+lj*zv z;FDNPsy50#e81WA%YRU|oVc5zw=n{Gi`Dfq6Yf-}zJkXp>4Iv09s7vsYlYvpughZie;W)1X%ko5?S{!Cha|C!V2?%!*K@uB=M>}q> zGln%>ey?vK{6{|^TvmH5#RMyx-QIl!i3Py_#Y`T@TtG3!x4^cu!bR(Xm~LVY6Yk^& zkf+Q9n1U{Qup=%MW8&@=K5U?WxdY6Ax}b9vF5!F;VaT2ixg{RaZGOYm>sp`8d=Dg9 zQOJICA9B3NCMxOfwZd$`wtlqGzFBfD#Cxhki=JhVcrtF64V?b;>y_Hs|MmiSim6|P zA@2kb#l8@nq2<@Q;~;q#ld6gOW>&!?SJQa<)RD)v#zqF`0w2}z3@|;!*2t=kq{V*x zi0jA*C72T@Ln3=TX}NcHJY1w&X?_&fVM6+@xnerB(`= zm)~7})EycXkGsx?o*6<|KK8srqbp?fbJ)Ej$-NP93iG2?Z%=Cb*#Xg^0K9r!-t3wv z=2d3IJkSJc_L-u2xQ)7kcgLmdY7AWp0uFwWFk^P#+c=5`)VXZk(UXFogiB@sAnRGG zhe!}1DIam(pSMkhZ~OILS(VBbrcJ1-S0u@ZN;;?otrtn}3T!OXjiPd{0agb_TANL{ zu=+Bts5J>B?pOAft+Vh?9$0;IQ(6@MYS38!yg1woD9qBwU5YgQ&6=F7^J@elfp3?3 zW59Le1xYfpt#%`YG>6b8{^Qq(5r*UIk4E=R7TRAO9Wiva{K+D&Km$+_V~-#{P;%K1 z9IdCPPnD_TS(}yV&r(P2Kq?7pMHQ}?D_yyFT2c?67JM(5cv12O#?}xIYli*K^d5z< zxO$c#LH|1lw0>K2ho^CWD)=@2ZX$?%;1l0WUB=-U{P$d&OGT|?W zFh=;We>l%`m=S?$aPO~qnP*Pg7HMPAzYF@8pBuEb1~}DbF#6kgHVBb$?nET)vKbC) zE>o%#M5ez)f5X}OLDW^(J|693d%q5x05+0fy0qji3=l2qT8*WwfwXu4Qej^7U%of% z^yT^ESy!CoNm$eQk!@U$;o})eX9FmCAWgM!EWJTIok#ckRMw!IDoV#d&;^6bjk)>> zO}UBBz_ox#?KX(4#QSBQ0{

  • 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 D(ZL&nuKQN}OUq#&WZ4$P+- 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

    g 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 ^^*Ev5SA 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

    lM{E+0HNlmH7zR;uef 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

    p?yIGv9`k_V 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


    cg!<7vbG#b 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

    *oIH5 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 Date: Sun, 19 Feb 2017 14:45:44 +0800 Subject: [PATCH 0359/2291] fix wrong align lager than pointer size --- src/ir/layout.rs | 2 +- .../tests/layout_array_too_long.rs | 207 ++++++++++++++++++ tests/headers/layout_array_too_long.h | 60 +++++ 3 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/tests/layout_array_too_long.rs create mode 100644 tests/headers/layout_array_too_long.h diff --git a/src/ir/layout.rs b/src/ir/layout.rs index 3837926107..f21a501caf 100644 --- a/src/ir/layout.rs +++ b/src/ir/layout.rs @@ -38,7 +38,7 @@ impl Layout { /// alignment possible. pub fn for_size(size: usize) -> Self { let mut next_align = 2; - while size % next_align == 0 && next_align <= 2 * mem::size_of::<*mut ()>() { + while size % next_align == 0 && next_align <= mem::size_of::<*mut ()>() { next_align *= 2; } Layout { diff --git a/tests/expectations/tests/layout_array_too_long.rs b/tests/expectations/tests/layout_array_too_long.rs new file mode 100644 index 0000000000..c395f08d77 --- /dev/null +++ b/tests/expectations/tests/layout_array_too_long.rs @@ -0,0 +1,207 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const RTE_CACHE_LINE_SIZE: ::std::os::raw::c_uint = 64; +pub const RTE_LIBRTE_IP_FRAG_MAX_FRAG: ::std::os::raw::c_uint = 4; +pub const IP_LAST_FRAG_IDX: _bindgen_ty_1 = _bindgen_ty_1::IP_LAST_FRAG_IDX; +pub const IP_FIRST_FRAG_IDX: _bindgen_ty_1 = _bindgen_ty_1::IP_FIRST_FRAG_IDX; +pub const IP_MIN_FRAG_NUM: _bindgen_ty_1 = _bindgen_ty_1::IP_MIN_FRAG_NUM; +pub const IP_MAX_FRAG_NUM: _bindgen_ty_1 = _bindgen_ty_1::IP_MAX_FRAG_NUM; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum _bindgen_ty_1 { + IP_LAST_FRAG_IDX = 0, + IP_FIRST_FRAG_IDX = 1, + IP_MIN_FRAG_NUM = 2, + IP_MAX_FRAG_NUM = 4, +} +/** @internal fragmented mbuf */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct ip_frag { + /**< offset into the packet */ + pub ofs: u16, + /**< length of fragment */ + pub len: u16, + /**< fragment mbuf */ + pub mb: *mut rte_mbuf, +} +#[test] +fn bindgen_test_layout_ip_frag() { + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( ip_frag ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( ip_frag ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag ) ) . ofs as * const _ as usize } + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag ) , "::" , + stringify ! ( ofs ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag ) ) . len as * const _ as usize } + , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag ) , "::" , + stringify ! ( len ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag ) ) . mb as * const _ as usize } + , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag ) , "::" , + stringify ! ( mb ) )); +} +impl Clone for ip_frag { + fn clone(&self) -> Self { *self } +} +impl Default for ip_frag { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +/** @internal to uniquely indetify fragmented datagram. */ +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct ip_frag_key { + /**< src address, first 8 bytes used for IPv4 */ + pub src_dst: [u64; 4usize], + /**< dst address */ + pub id: u32, + /**< src/dst key length */ + pub key_len: u32, +} +#[test] +fn bindgen_test_layout_ip_frag_key() { + assert_eq!(::std::mem::size_of::() , 40usize , concat ! ( + "Size of: " , stringify ! ( ip_frag_key ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( ip_frag_key ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_key ) ) . src_dst as * const _ as + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_key ) , "::" , + stringify ! ( src_dst ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_key ) ) . id as * const _ as + usize } , 32usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_key ) , "::" , + stringify ! ( id ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_key ) ) . key_len as * const _ as + usize } , 36usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_key ) , "::" , + stringify ! ( key_len ) )); +} +impl Clone for ip_frag_key { + fn clone(&self) -> Self { *self } +} +/** + * @internal Fragmented packet to reassemble. + * First two entries in the frags[] array are for the last and first fragments. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct ip_frag_pkt { + /**< LRU list */ + pub lru: ip_frag_pkt__bindgen_ty_1, + /**< fragmentation key */ + pub key: ip_frag_key, + /**< creation timestamp */ + pub start: u64, + /**< expected reassembled size */ + pub total_size: u32, + /**< size of fragments received */ + pub frag_size: u32, + /**< index of next entry to fill */ + pub last_idx: u32, + /**< fragments */ + pub frags: [ip_frag; 4usize], + pub __bindgen_padding_0: [u64; 6usize], +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct ip_frag_pkt__bindgen_ty_1 { + pub tqe_next: *mut ip_frag_pkt, + pub tqe_prev: *mut *mut ip_frag_pkt, +} +#[test] +fn bindgen_test_layout_ip_frag_pkt__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , 16usize , + concat ! ( + "Size of: " , stringify ! ( ip_frag_pkt__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 8usize , + concat ! ( + "Alignment of " , stringify ! ( ip_frag_pkt__bindgen_ty_1 ) + )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt__bindgen_ty_1 ) ) . tqe_next + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + ip_frag_pkt__bindgen_ty_1 ) , "::" , stringify ! ( tqe_next ) + )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt__bindgen_ty_1 ) ) . tqe_prev + as * const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( + ip_frag_pkt__bindgen_ty_1 ) , "::" , stringify ! ( tqe_prev ) + )); +} +impl Clone for ip_frag_pkt__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +impl Default for ip_frag_pkt__bindgen_ty_1 { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[test] +fn bindgen_test_layout_ip_frag_pkt() { + assert_eq!(::std::mem::size_of::() , 192usize , concat ! ( + "Size of: " , stringify ! ( ip_frag_pkt ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . lru as * const _ as + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( lru ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . key as * const _ as + usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( key ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . start as * const _ as + usize } , 56usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( start ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . total_size as * const _ + as usize } , 64usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( total_size ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . frag_size as * const _ + as usize } , 68usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( frag_size ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . last_idx as * const _ + as usize } , 72usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( last_idx ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . frags as * const _ as + usize } , 80usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( frags ) )); +} +impl Clone for ip_frag_pkt { + fn clone(&self) -> Self { *self } +} +impl Default for ip_frag_pkt { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +/**< fragment mbuf */ +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct rte_mbuf { + pub _address: u8, +} +impl Clone for rte_mbuf { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/layout_array_too_long.h b/tests/headers/layout_array_too_long.h new file mode 100644 index 0000000000..9be037abef --- /dev/null +++ b/tests/headers/layout_array_too_long.h @@ -0,0 +1,60 @@ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +#define RTE_CACHE_LINE_SIZE 64 + +/** + * Force alignment + */ +#define __rte_aligned(a) __attribute__((__aligned__(a))) + +/** + * Force alignment to cache line. + */ +#define __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE) + +#define RTE_LIBRTE_IP_FRAG_MAX_FRAG 4 + +enum { + IP_LAST_FRAG_IDX, /**< index of last fragment */ + IP_FIRST_FRAG_IDX, /**< index of first fragment */ + IP_MIN_FRAG_NUM, /**< minimum number of fragments */ + IP_MAX_FRAG_NUM = RTE_LIBRTE_IP_FRAG_MAX_FRAG, + /**< maximum number of fragments per packet */ +}; + +/** @internal fragmented mbuf */ +struct ip_frag { + uint16_t ofs; /**< offset into the packet */ + uint16_t len; /**< length of fragment */ + struct rte_mbuf *mb; /**< fragment mbuf */ +}; + +/** @internal to uniquely indetify fragmented datagram. */ +struct ip_frag_key { + uint64_t src_dst[4]; /**< src address, first 8 bytes used for IPv4 */ + uint32_t id; /**< dst address */ + uint32_t key_len; /**< src/dst key length */ +}; + +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} + +/** + * @internal Fragmented packet to reassemble. + * First two entries in the frags[] array are for the last and first fragments. + */ +struct ip_frag_pkt { + TAILQ_ENTRY(ip_frag_pkt) lru; /**< LRU list */ + struct ip_frag_key key; /**< fragmentation key */ + uint64_t start; /**< creation timestamp */ + uint32_t total_size; /**< expected reassembled size */ + uint32_t frag_size; /**< size of fragments received */ + uint32_t last_idx; /**< index of next entry to fill */ + struct ip_frag frags[IP_MAX_FRAG_NUM]; /**< fragments */ +} __rte_cache_aligned; From 0494698adde7f35856145cd6a5f99f0adbfbe053 Mon Sep 17 00:00:00 2001 From: Flier Lu Date: Sun, 19 Feb 2017 16:14:50 +0800 Subject: [PATCH 0360/2291] force pad bytes before large align field --- src/codegen/struct_layout.rs | 6 +- src/ir/layout.rs | 2 +- .../tests/layout_large_align_field.rs | 419 ++++++++++++++++++ tests/headers/layout_large_align_field.h | 97 ++++ 4 files changed, 521 insertions(+), 3 deletions(-) create mode 100644 tests/expectations/tests/layout_large_align_field.rs create mode 100644 tests/headers/layout_large_align_field.h diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs index 24938c1608..724bef98fa 100644 --- a/src/codegen/struct_layout.rs +++ b/src/codegen/struct_layout.rs @@ -197,7 +197,7 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { }; // Otherwise the padding is useless. - let need_padding = padding_bytes >= field_layout.align; + let need_padding = padding_bytes >= field_layout.align || field_layout.align > mem::size_of::<*mut ()>(); self.latest_offset += padding_bytes; @@ -213,7 +213,7 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { field_layout); if need_padding && padding_bytes != 0 { - Some(Layout::new(padding_bytes, field_layout.align)) + Some(Layout::new(padding_bytes, cmp::min(field_layout.align, mem::size_of::<*mut ()>()))) } else { None } @@ -262,6 +262,8 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { Layout::new(padding_bytes, layout.align) }; + debug!("pad bytes to struct {}, {:?}", name, layout); + Some(self.padding_field(layout)) } else { None diff --git a/src/ir/layout.rs b/src/ir/layout.rs index 3837926107..f21a501caf 100644 --- a/src/ir/layout.rs +++ b/src/ir/layout.rs @@ -38,7 +38,7 @@ impl Layout { /// alignment possible. pub fn for_size(size: usize) -> Self { let mut next_align = 2; - while size % next_align == 0 && next_align <= 2 * mem::size_of::<*mut ()>() { + while size % next_align == 0 && next_align <= mem::size_of::<*mut ()>() { next_align *= 2; } Layout { diff --git a/tests/expectations/tests/layout_large_align_field.rs b/tests/expectations/tests/layout_large_align_field.rs new file mode 100644 index 0000000000..820e421035 --- /dev/null +++ b/tests/expectations/tests/layout_large_align_field.rs @@ -0,0 +1,419 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Default)] +pub struct __IncompleteArrayField(::std::marker::PhantomData); +impl __IncompleteArrayField { + #[inline] + pub fn new() -> Self { + __IncompleteArrayField(::std::marker::PhantomData) + } + #[inline] + pub unsafe fn as_ptr(&self) -> *const T { ::std::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut_ptr(&mut self) -> *mut T { + ::std::mem::transmute(self) + } + #[inline] + pub unsafe fn as_slice(&self, len: usize) -> &[T] { + ::std::slice::from_raw_parts(self.as_ptr(), len) + } + #[inline] + pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { + ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + } +} +impl ::std::fmt::Debug for __IncompleteArrayField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__IncompleteArrayField") + } +} +impl ::std::clone::Clone for __IncompleteArrayField { + #[inline] + fn clone(&self) -> Self { Self::new() } +} +impl ::std::marker::Copy for __IncompleteArrayField { } +pub const RTE_CACHE_LINE_SIZE: ::std::os::raw::c_uint = 64; +pub const RTE_LIBRTE_IP_FRAG_MAX_FRAG: ::std::os::raw::c_uint = 4; +pub const IP_LAST_FRAG_IDX: _bindgen_ty_1 = _bindgen_ty_1::IP_LAST_FRAG_IDX; +pub const IP_FIRST_FRAG_IDX: _bindgen_ty_1 = _bindgen_ty_1::IP_FIRST_FRAG_IDX; +pub const IP_MIN_FRAG_NUM: _bindgen_ty_1 = _bindgen_ty_1::IP_MIN_FRAG_NUM; +pub const IP_MAX_FRAG_NUM: _bindgen_ty_1 = _bindgen_ty_1::IP_MAX_FRAG_NUM; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum _bindgen_ty_1 { + IP_LAST_FRAG_IDX = 0, + IP_FIRST_FRAG_IDX = 1, + IP_MIN_FRAG_NUM = 2, + IP_MAX_FRAG_NUM = 4, +} +/** @internal fragmented mbuf */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct ip_frag { + /**< offset into the packet */ + pub ofs: u16, + /**< length of fragment */ + pub len: u16, + /**< fragment mbuf */ + pub mb: *mut rte_mbuf, +} +#[test] +fn bindgen_test_layout_ip_frag() { + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( ip_frag ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( ip_frag ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag ) ) . ofs as * const _ as usize } + , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag ) , "::" , + stringify ! ( ofs ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag ) ) . len as * const _ as usize } + , 2usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag ) , "::" , + stringify ! ( len ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag ) ) . mb as * const _ as usize } + , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag ) , "::" , + stringify ! ( mb ) )); +} +impl Clone for ip_frag { + fn clone(&self) -> Self { *self } +} +impl Default for ip_frag { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +/** @internal to uniquely indetify fragmented datagram. */ +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct ip_frag_key { + /**< src address, first 8 bytes used for IPv4 */ + pub src_dst: [u64; 4usize], + /**< dst address */ + pub id: u32, + /**< src/dst key length */ + pub key_len: u32, +} +#[test] +fn bindgen_test_layout_ip_frag_key() { + assert_eq!(::std::mem::size_of::() , 40usize , concat ! ( + "Size of: " , stringify ! ( ip_frag_key ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( ip_frag_key ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_key ) ) . src_dst as * const _ as + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_key ) , "::" , + stringify ! ( src_dst ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_key ) ) . id as * const _ as + usize } , 32usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_key ) , "::" , + stringify ! ( id ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_key ) ) . key_len as * const _ as + usize } , 36usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_key ) , "::" , + stringify ! ( key_len ) )); +} +impl Clone for ip_frag_key { + fn clone(&self) -> Self { *self } +} +/** + * @internal Fragmented packet to reassemble. + * First two entries in the frags[] array are for the last and first fragments. + */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct ip_frag_pkt { + /**< LRU list */ + pub lru: ip_frag_pkt__bindgen_ty_1, + /**< fragmentation key */ + pub key: ip_frag_key, + /**< creation timestamp */ + pub start: u64, + /**< expected reassembled size */ + pub total_size: u32, + /**< size of fragments received */ + pub frag_size: u32, + /**< index of next entry to fill */ + pub last_idx: u32, + /**< fragments */ + pub frags: [ip_frag; 4usize], + pub __bindgen_padding_0: [u64; 6usize], +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct ip_frag_pkt__bindgen_ty_1 { + pub tqe_next: *mut ip_frag_pkt, + pub tqe_prev: *mut *mut ip_frag_pkt, +} +#[test] +fn bindgen_test_layout_ip_frag_pkt__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , 16usize , + concat ! ( + "Size of: " , stringify ! ( ip_frag_pkt__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 8usize , + concat ! ( + "Alignment of " , stringify ! ( ip_frag_pkt__bindgen_ty_1 ) + )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt__bindgen_ty_1 ) ) . tqe_next + as * const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( + ip_frag_pkt__bindgen_ty_1 ) , "::" , stringify ! ( tqe_next ) + )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt__bindgen_ty_1 ) ) . tqe_prev + as * const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( + ip_frag_pkt__bindgen_ty_1 ) , "::" , stringify ! ( tqe_prev ) + )); +} +impl Clone for ip_frag_pkt__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +impl Default for ip_frag_pkt__bindgen_ty_1 { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[test] +fn bindgen_test_layout_ip_frag_pkt() { + assert_eq!(::std::mem::size_of::() , 192usize , concat ! ( + "Size of: " , stringify ! ( ip_frag_pkt ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . lru as * const _ as + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( lru ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . key as * const _ as + usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( key ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . start as * const _ as + usize } , 56usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( start ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . total_size as * const _ + as usize } , 64usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( total_size ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . frag_size as * const _ + as usize } , 68usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( frag_size ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . last_idx as * const _ + as usize } , 72usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( last_idx ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_pkt ) ) . frags as * const _ as + usize } , 80usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_pkt ) , "::" , + stringify ! ( frags ) )); +} +impl Clone for ip_frag_pkt { + fn clone(&self) -> Self { *self } +} +impl Default for ip_frag_pkt { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct ip_pkt_list { + pub tqh_first: *mut ip_frag_pkt, + pub tqh_last: *mut *mut ip_frag_pkt, +} +#[test] +fn bindgen_test_layout_ip_pkt_list() { + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( ip_pkt_list ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( ip_pkt_list ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_pkt_list ) ) . tqh_first as * const _ + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_pkt_list ) , "::" , + stringify ! ( tqh_first ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_pkt_list ) ) . tqh_last as * const _ + as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_pkt_list ) , "::" , + stringify ! ( tqh_last ) )); +} +impl Clone for ip_pkt_list { + fn clone(&self) -> Self { *self } +} +impl Default for ip_pkt_list { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +/** fragmentation table statistics */ +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct ip_frag_tbl_stat { + /**< total # of find/insert attempts. */ + pub find_num: u64, + /**< # of add ops. */ + pub add_num: u64, + /**< # of del ops. */ + pub del_num: u64, + /**< # of reuse (del/add) ops. */ + pub reuse_num: u64, + /**< total # of add failures. */ + pub fail_total: u64, + /**< # of 'no space' add failures. */ + pub fail_nospace: u64, + pub __bindgen_padding_0: [u64; 2usize], +} +#[test] +fn bindgen_test_layout_ip_frag_tbl_stat() { + assert_eq!(::std::mem::size_of::() , 64usize , concat ! + ( "Size of: " , stringify ! ( ip_frag_tbl_stat ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_tbl_stat ) ) . find_num as * + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_tbl_stat ) , + "::" , stringify ! ( find_num ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_tbl_stat ) ) . add_num as * const + _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_tbl_stat ) , + "::" , stringify ! ( add_num ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_tbl_stat ) ) . del_num as * const + _ as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_tbl_stat ) , + "::" , stringify ! ( del_num ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_tbl_stat ) ) . reuse_num as * + const _ as usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_tbl_stat ) , + "::" , stringify ! ( reuse_num ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_tbl_stat ) ) . fail_total as * + const _ as usize } , 32usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_tbl_stat ) , + "::" , stringify ! ( fail_total ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const ip_frag_tbl_stat ) ) . fail_nospace as * + const _ as usize } , 40usize , concat ! ( + "Alignment of field: " , stringify ! ( ip_frag_tbl_stat ) , + "::" , stringify ! ( fail_nospace ) )); +} +impl Clone for ip_frag_tbl_stat { + fn clone(&self) -> Self { *self } +} +/** fragmentation table */ +#[repr(C)] +#[derive(Debug, Copy)] +pub struct rte_ip_frag_tbl { + /**< ttl for table entries. */ + pub max_cycles: u64, + /**< hash value mask. */ + pub entry_mask: u32, + /**< max entries allowed. */ + pub max_entries: u32, + /**< entries in use. */ + pub use_entries: u32, + /**< hash assocaitivity. */ + pub bucket_entries: u32, + /**< total size of the table. */ + pub nb_entries: u32, + /**< num of associativity lines. */ + pub nb_buckets: u32, + /**< last used entry. */ + pub last: *mut ip_frag_pkt, + /**< LRU list for table entries. */ + pub lru: ip_pkt_list, + pub __bindgen_padding_0: u64, + /**< statistics counters. */ + pub stat: ip_frag_tbl_stat, + /**< hash table. */ + pub pkt: __IncompleteArrayField, +} +#[test] +fn bindgen_test_layout_rte_ip_frag_tbl() { + assert_eq!(::std::mem::size_of::() , 128usize , concat ! + ( "Size of: " , stringify ! ( rte_ip_frag_tbl ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . max_cycles as * + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( max_cycles ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . entry_mask as * + const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( entry_mask ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . max_entries as * + const _ as usize } , 12usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( max_entries ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . use_entries as * + const _ as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( use_entries ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . bucket_entries as * + const _ as usize } , 20usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( bucket_entries ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . nb_entries as * + const _ as usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( nb_entries ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . nb_buckets as * + const _ as usize } , 28usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( nb_buckets ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . last as * const _ + as usize } , 32usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( last ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . lru as * const _ as + usize } , 40usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( lru ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . stat as * const _ + as usize } , 64usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( stat ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const rte_ip_frag_tbl ) ) . pkt as * const _ as + usize } , 128usize , concat ! ( + "Alignment of field: " , stringify ! ( rte_ip_frag_tbl ) , + "::" , stringify ! ( pkt ) )); +} +impl Clone for rte_ip_frag_tbl { + fn clone(&self) -> Self { *self } +} +impl Default for rte_ip_frag_tbl { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +/**< fragment mbuf */ +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct rte_mbuf { + pub _address: u8, +} +impl Clone for rte_mbuf { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/layout_large_align_field.h b/tests/headers/layout_large_align_field.h new file mode 100644 index 0000000000..f4f412c6c5 --- /dev/null +++ b/tests/headers/layout_large_align_field.h @@ -0,0 +1,97 @@ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +#define RTE_CACHE_LINE_SIZE 64 + +/** + * Force alignment + */ +#define __rte_aligned(a) __attribute__((__aligned__(a))) + +/** + * Force alignment to cache line. + */ +#define __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE) + +#define RTE_LIBRTE_IP_FRAG_MAX_FRAG 4 + +enum { + IP_LAST_FRAG_IDX, /**< index of last fragment */ + IP_FIRST_FRAG_IDX, /**< index of first fragment */ + IP_MIN_FRAG_NUM, /**< minimum number of fragments */ + IP_MAX_FRAG_NUM = RTE_LIBRTE_IP_FRAG_MAX_FRAG, + /**< maximum number of fragments per packet */ +}; + +/** @internal fragmented mbuf */ +struct ip_frag { + uint16_t ofs; /**< offset into the packet */ + uint16_t len; /**< length of fragment */ + struct rte_mbuf *mb; /**< fragment mbuf */ +}; + +/** @internal to uniquely indetify fragmented datagram. */ +struct ip_frag_key { + uint64_t src_dst[4]; /**< src address, first 8 bytes used for IPv4 */ + uint32_t id; /**< dst address */ + uint32_t key_len; /**< src/dst key length */ +}; + +/* + * Tail queue declarations. + */ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ +} + + +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} + +/** + * @internal Fragmented packet to reassemble. + * First two entries in the frags[] array are for the last and first fragments. + */ +struct ip_frag_pkt { + TAILQ_ENTRY(ip_frag_pkt) lru; /**< LRU list */ + struct ip_frag_key key; /**< fragmentation key */ + uint64_t start; /**< creation timestamp */ + uint32_t total_size; /**< expected reassembled size */ + uint32_t frag_size; /**< size of fragments received */ + uint32_t last_idx; /**< index of next entry to fill */ + struct ip_frag frags[IP_MAX_FRAG_NUM]; /**< fragments */ +} __rte_cache_aligned; + +TAILQ_HEAD(ip_pkt_list, ip_frag_pkt); /**< @internal fragments tailq */ + +/** fragmentation table statistics */ +struct ip_frag_tbl_stat { + uint64_t find_num; /**< total # of find/insert attempts. */ + uint64_t add_num; /**< # of add ops. */ + uint64_t del_num; /**< # of del ops. */ + uint64_t reuse_num; /**< # of reuse (del/add) ops. */ + uint64_t fail_total; /**< total # of add failures. */ + uint64_t fail_nospace; /**< # of 'no space' add failures. */ +} __rte_cache_aligned; + +/** fragmentation table */ +struct rte_ip_frag_tbl { + uint64_t max_cycles; /**< ttl for table entries. */ + uint32_t entry_mask; /**< hash value mask. */ + uint32_t max_entries; /**< max entries allowed. */ + uint32_t use_entries; /**< entries in use. */ + uint32_t bucket_entries; /**< hash assocaitivity. */ + uint32_t nb_entries; /**< total size of the table. */ + uint32_t nb_buckets; /**< num of associativity lines. */ + struct ip_frag_pkt *last; /**< last used entry. */ + struct ip_pkt_list lru; /**< LRU list for table entries. */ + struct ip_frag_tbl_stat stat; /**< statistics counters. */ + __extension__ struct ip_frag_pkt pkt[0]; /**< hash table. */ +}; From 18a7d3e014fc99bdd086feaf1498e8ad67b00c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 18 Feb 2017 19:30:00 +0100 Subject: [PATCH 0361/2291] Add an option to distrust clang mangling. --- src/ir/function.rs | 10 ++++++++-- src/ir/var.rs | 2 +- src/lib.rs | 22 ++++++++++++++++++++++ src/options.rs | 3 +++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/ir/function.rs b/src/ir/function.rs index 22b9c9b04a..afd2adec56 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -91,7 +91,13 @@ fn get_abi(cc: CXCallingConv) -> Option { } /// Get the mangled name for the cursor's referent. -pub fn cursor_mangling(cursor: &clang::Cursor) -> Option { +pub fn cursor_mangling(ctx: &BindgenContext, + cursor: &clang::Cursor) + -> Option { + if !ctx.options().enable_mangling { + return None; + } + // We early return here because libclang may crash in some case // if we pass in a variable inside a partial specialized template. // See servo/rust-bindgen#67, and servo/rust-bindgen#462. @@ -304,7 +310,7 @@ impl ClangSubItemParser for Function { let name = cursor.spelling(); assert!(!name.is_empty(), "Empty function name?"); - let mut mangled_name = cursor_mangling(&cursor); + let mut mangled_name = cursor_mangling(context, &cursor); if mangled_name.as_ref() == Some(&name) { mangled_name = None; } diff --git a/src/ir/var.rs b/src/ir/var.rs index 6cfcdae735..930e07ee03 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -238,7 +238,7 @@ impl ClangSubItemParser for Var { .map(VarType::String) }; - let mangling = cursor_mangling(&cursor); + let mangling = cursor_mangling(ctx, &cursor); let var = Var::new(name, mangling, ty, value, is_const); Ok(ParseResult::New(var, Some(cursor))) diff --git a/src/lib.rs b/src/lib.rs index 42363ebdb1..649be323bf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -212,6 +212,18 @@ impl Builder { self } + /// Whether to use the clang-provided name mangling. This is true and + /// probably needed for C++ features. + /// + /// However, some old libclang versions seem to return incorrect results in + /// some cases for non-mangled functions, see [1], so we allow disabling it. + /// + /// [1]: https://github.com/servo/rust-bindgen/issues/528 + pub fn trust_clang_mangling(mut self, doit: bool) -> Self { + self.options.enable_mangling = doit; + self + } + /// Generate a C/C++ file that includes the header and has dummy uses of /// every type defined in the header. pub fn dummy_uses>(mut self, dummy_uses: T) -> Builder { @@ -572,6 +584,15 @@ pub struct BindgenOptions { /// Intead of emitting 'use objc;' to files generated from objective c files, /// generate '#[macro_use] extern crate objc;' pub objc_extern_crate: bool, + + /// Whether to use the clang-provided name mangling. This is true and + /// probably needed for C++ features. + /// + /// However, some old libclang versions seem to return incorrect results in + /// some cases for non-mangled functions, see [1], so we allow disabling it. + /// + /// [1]: https://github.com/servo/rust-bindgen/issues/528 + pub enable_mangling: bool, } /// TODO(emilio): This is sort of a lie (see the error message that results from @@ -626,6 +647,7 @@ impl Default for BindgenOptions { generate_comments: true, whitelist_recursively: true, objc_extern_crate: false, + enable_mangling: true, } } } diff --git a/src/options.rs b/src/options.rs index e54ee0124e..a62aa73d28 100644 --- a/src/options.rs +++ b/src/options.rs @@ -60,6 +60,9 @@ pub fn builder_from_flags Arg::with_name("objc-extern-crate") .long("objc-extern-crate") .help("Use extern crate instead of use for objc"), + Arg::with_name("distrust-clang-mangling") + .long("distrust-clang-mangling") + .help("Do not trust the libclang-provided mangling"), Arg::with_name("builtins") .long("builtins") .help("Output bindings for builtin definitions, e.g. \ From dd9f25e670d39917118a4ae60897c2d4365e471f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 18 Feb 2017 19:58:27 +0100 Subject: [PATCH 0362/2291] clang: Print the semantic parent when dumping the AST. --- src/clang.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/clang.rs b/src/clang.rs index 613e08e849..f752aaefe4 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -1498,6 +1498,13 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { &specialized); } } + + if let Some(parent) = c.fallible_semantic_parent() { + println!(""); + print_cursor(depth, + String::from(prefix) + "semantic-parent.", + &parent); + } } fn print_type>(depth: isize, prefix: S, ty: &Type) { From 0063bf31566971c61d5d1d743fcb946057318776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 18 Feb 2017 20:02:07 +0100 Subject: [PATCH 0363/2291] comp: parse definitions even when they aren't in the correct scope. --- src/ir/comp.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ir/comp.rs b/src/ir/comp.rs index ce6ec25d14..a4929b7a5c 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -625,8 +625,15 @@ impl CompInfo { // StructDecl to note incomplete structs that hasn't been // forward-declared before, see: // + // Also, clang seems to scope struct definitions inside + // unions to the whole translation unit. Since those are + // anonymous, let's just assume that if the cursor we've + // found is a definition it's a valid inner type. + // // https://github.com/servo/rust-bindgen/issues/482 - if cur.semantic_parent() != cursor { + let is_inner_struct = cur.semantic_parent() == cursor || + cur.is_definition(); + if !is_inner_struct { return CXChildVisit_Continue; } From ea39b98f8d0df40e853cd86c973f71a82f75b7cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 18 Feb 2017 20:08:58 +0100 Subject: [PATCH 0364/2291] ir: Parse cursor definitions in unions as children of the union. --- src/ir/comp.rs | 6 +- .../tests/anon_struct_in_union.rs | 92 +++++++++++++++++++ tests/headers/anon_struct_in_union.h | 7 ++ 3 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/tests/anon_struct_in_union.rs create mode 100644 tests/headers/anon_struct_in_union.h diff --git a/src/ir/comp.rs b/src/ir/comp.rs index a4929b7a5c..e8c8b7085c 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -630,9 +630,13 @@ impl CompInfo { // anonymous, let's just assume that if the cursor we've // found is a definition it's a valid inner type. // + // Note that doing this could be always ok, but let's just + // keep the union check for now. + // // https://github.com/servo/rust-bindgen/issues/482 let is_inner_struct = cur.semantic_parent() == cursor || - cur.is_definition(); + (kind == CompKind::Union && + cur.is_definition()); if !is_inner_struct { return CXChildVisit_Continue; } diff --git a/tests/expectations/tests/anon_struct_in_union.rs b/tests/expectations/tests/anon_struct_in_union.rs new file mode 100644 index 0000000000..97a342cfff --- /dev/null +++ b/tests/expectations/tests/anon_struct_in_union.rs @@ -0,0 +1,92 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +pub struct __BindgenUnionField(::std::marker::PhantomData); +impl __BindgenUnionField { + #[inline] + pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) } + #[inline] + pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) } + #[inline] + pub unsafe fn as_mut(&mut self) -> &mut T { ::std::mem::transmute(self) } +} +impl ::std::default::Default for __BindgenUnionField { + #[inline] + fn default() -> Self { Self::new() } +} +impl ::std::clone::Clone for __BindgenUnionField { + #[inline] + fn clone(&self) -> Self { Self::new() } +} +impl ::std::marker::Copy for __BindgenUnionField { } +impl ::std::fmt::Debug for __BindgenUnionField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + fmt.write_str("__BindgenUnionField") + } +} +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct s { + pub u: s__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct s__bindgen_ty_1 { + pub field: __BindgenUnionField, + pub bindgen_union_field: u32, +} +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct s__bindgen_ty_1_inner { + pub b: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_s__bindgen_ty_1_inner() { + assert_eq!(::std::mem::size_of::() , 4usize , + concat ! ( "Size of: " , stringify ! ( s__bindgen_ty_1_inner ) + )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( s__bindgen_ty_1_inner ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const s__bindgen_ty_1_inner ) ) . b as * const + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( s__bindgen_ty_1_inner ) + , "::" , stringify ! ( b ) )); +} +impl Clone for s__bindgen_ty_1_inner { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_s__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( s__bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! + ( "Alignment of " , stringify ! ( s__bindgen_ty_1 ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const s__bindgen_ty_1 ) ) . field as * const _ + as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( s__bindgen_ty_1 ) , + "::" , stringify ! ( field ) )); +} +impl Clone for s__bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +#[test] +fn bindgen_test_layout_s() { + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( s ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( s ) )); + assert_eq! (unsafe { & ( * ( 0 as * const s ) ) . u as * const _ as usize + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( s ) , "::" , stringify + ! ( u ) )); +} +impl Clone for s { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/anon_struct_in_union.h b/tests/headers/anon_struct_in_union.h new file mode 100644 index 0000000000..880a8b5453 --- /dev/null +++ b/tests/headers/anon_struct_in_union.h @@ -0,0 +1,7 @@ +struct s { + union { + struct inner { + int b; + } field; + } u; +}; From fd8738a0dce693aa09fe17864fb7601e92a76c8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 19 Feb 2017 12:51:30 +0100 Subject: [PATCH 0365/2291] lib: Simplify the libclang setup. --- src/lib.rs | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 42363ebdb1..8340863227 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -86,7 +86,7 @@ use regex_set::RegexSet; use std::fs::OpenOptions; use std::io::{self, Write}; use std::path::Path; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use syntax::ast; use syntax::codemap::{DUMMY_SP, Span}; @@ -653,23 +653,15 @@ fn ensure_libclang_is_loaded() { // across different threads. lazy_static! { - static ref LIBCLANG: Mutex>> = { - Mutex::new(None) + static ref LIBCLANG: Arc = { + clang_sys::load().expect("Unable to find libclang"); + clang_sys::get_library() + .expect("We just loaded libclang and it had better still be \ + here!") }; } - let mut libclang = LIBCLANG.lock().unwrap(); - if !clang_sys::is_loaded() { - if libclang.is_none() { - // TODO(emilio): Return meaningful error (breaking). - clang_sys::load().expect("Unable to find libclang"); - *libclang = Some(clang_sys::get_library() - .expect("We just loaded libclang and it had \ - better still be here!")); - } else { - clang_sys::set_library(libclang.clone()); - } - } + clang_sys::set_library(Some(LIBCLANG.clone())); } /// Generated Rust bindings. From 40fc430d60fbdc62d6c24a2532526c45b9fba9f7 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 9 Feb 2017 13:48:01 -0800 Subject: [PATCH 0366/2291] Rename TemplateDeclaration::{template_params => self_template_params} --- src/ir/comp.rs | 2 +- src/ir/context.rs | 10 +++++----- src/ir/item.rs | 12 ++++++------ src/ir/named.rs | 4 ++-- src/ir/ty.rs | 23 ++++++++++++----------- 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/ir/comp.rs b/src/ir/comp.rs index ce6ec25d14..6a9b8cb189 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -871,7 +871,7 @@ impl CompInfo { } impl TemplateDeclaration for CompInfo { - fn template_params(&self, _ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, _ctx: &BindgenContext) -> Option> { if self.template_args.is_empty() { None } else { diff --git a/src/ir/context.rs b/src/ir/context.rs index d2fb2befc6..27a43f20bf 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -634,7 +634,7 @@ impl<'ctx> BindgenContext<'ctx> { .and_then(|canon_decl| { self.get_resolved_type(&canon_decl) .and_then(|template_decl_id| { - template_decl_id.num_template_params(self) + template_decl_id.num_self_template_params(self) .map(|num_params| { (*canon_decl.cursor(), template_decl_id, @@ -658,7 +658,7 @@ impl<'ctx> BindgenContext<'ctx> { .cloned() }) .and_then(|template_decl| { - template_decl.num_template_params(self) + template_decl.num_self_template_params(self) .map(|num_template_params| { (*template_decl.decl(), template_decl.id(), @@ -706,7 +706,7 @@ impl<'ctx> BindgenContext<'ctx> { use clang_sys; let num_expected_args = match self.resolve_type(template) - .num_template_params(self) { + .num_self_template_params(self) { Some(n) => n, None => { warn!("Tried to instantiate a template for which we could not \ @@ -1331,13 +1331,13 @@ impl PartialType { } impl TemplateDeclaration for PartialType { - fn template_params(&self, _ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, _ctx: &BindgenContext) -> Option> { // Maybe at some point we will eagerly parse named types, but for now we // don't and this information is unavailable. None } - fn num_template_params(&self, _ctx: &BindgenContext) -> Option { + fn num_self_template_params(&self, _ctx: &BindgenContext) -> Option { // Wouldn't it be nice if libclang would reliably give us this // information‽ match self.decl().kind() { diff --git a/src/ir/item.rs b/src/ir/item.rs index bd401abab3..00e3a30d64 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -930,22 +930,22 @@ impl DotAttributes for Item { } impl TemplateDeclaration for ItemId { - fn template_params(&self, ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, ctx: &BindgenContext) -> Option> { ctx.resolve_item_fallible(*self) - .and_then(|item| item.template_params(ctx)) + .and_then(|item| item.self_template_params(ctx)) } } impl TemplateDeclaration for Item { - fn template_params(&self, ctx: &BindgenContext) -> Option> { - self.kind.template_params(ctx) + fn self_template_params(&self, ctx: &BindgenContext) -> Option> { + self.kind.self_template_params(ctx) } } impl TemplateDeclaration for ItemKind { - fn template_params(&self, ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, ctx: &BindgenContext) -> Option> { match *self { - ItemKind::Type(ref ty) => ty.template_params(ctx), + ItemKind::Type(ref ty) => ty.self_template_params(ctx), // If we start emitting bindings to explicitly instantiated // functions, then we'll need to check ItemKind::Function for // template params. diff --git a/src/ir/named.rs b/src/ir/named.rs index 7a6c597ca2..e434a58d95 100644 --- a/src/ir/named.rs +++ b/src/ir/named.rs @@ -208,7 +208,7 @@ impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { .map(|ty| match ty.kind() { &TypeKind::TemplateInstantiation(decl, ref args) => { let decl = ctx.resolve_type(decl); - let params = decl.template_params(ctx) + let params = decl.self_template_params(ctx) .expect("a template instantiation's referenced \ template declaration should have template \ parameters"); @@ -255,7 +255,7 @@ impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { // only used if the template declaration uses the // corresponding template parameter. let decl = self.ctx.resolve_type(decl); - let params = decl.template_params(self.ctx) + let params = decl.self_template_params(self.ctx) .expect("a template instantiation's referenced \ template declaration should have template \ parameters"); diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 44a8874440..661368289c 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -22,10 +22,11 @@ pub trait TemplateDeclaration { /// template parameters. /// /// Note that these might *not* all be named types: C++ allows - /// constant-value template parameters. Of course, Rust does not allow - /// generic parameters to be anything but types, so we must treat them as - /// opaque, and avoid instantiating them. - fn template_params(&self, ctx: &BindgenContext) -> Option>; + /// constant-value template parameters as well as template-template + /// parameters. Of course, Rust does not allow generic parameters to be + /// anything but types, so we must treat them as opaque, and avoid + /// instantiating them. + fn self_template_params(&self, ctx: &BindgenContext) -> Option>; /// Get the number of free template parameters this template declaration /// has. @@ -34,8 +35,8 @@ pub trait TemplateDeclaration { /// `template_params` returns `None`. This is useful when we only have /// partial information about the template declaration, such as when we are /// in the middle of parsing it. - fn num_template_params(&self, ctx: &BindgenContext) -> Option { - self.template_params(ctx).map(|params| params.len()) + fn num_self_template_params(&self, ctx: &BindgenContext) -> Option { + self.self_template_params(ctx).map(|params| params.len()) } } @@ -487,18 +488,18 @@ fn is_invalid_named_type_empty_name() { impl TemplateDeclaration for Type { - fn template_params(&self, ctx: &BindgenContext) -> Option> { - self.kind.template_params(ctx) + fn self_template_params(&self, ctx: &BindgenContext) -> Option> { + self.kind.self_template_params(ctx) } } impl TemplateDeclaration for TypeKind { - fn template_params(&self, ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, ctx: &BindgenContext) -> Option> { match *self { TypeKind::ResolvedTypeRef(id) => { - ctx.resolve_type(id).template_params(ctx) + ctx.resolve_type(id).self_template_params(ctx) } - TypeKind::Comp(ref comp) => comp.template_params(ctx), + TypeKind::Comp(ref comp) => comp.self_template_params(ctx), TypeKind::TemplateAlias(_, ref args) => Some(args.clone()), TypeKind::TemplateInstantiation(..) | From 83c1a9594f5827451b7536352d53889b75230a57 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 9 Feb 2017 13:50:32 -0800 Subject: [PATCH 0367/2291] Add TemplateDeclaration::all_template_parameters The all_template_parameters method gets the complete set of template parameters that can affect a given item. Note that this item doesn't need to be a template declaration itself for `Some` to be returned from this method (in contrast to `self_template_params`). If this item is a member of a template declaration, then the parent's template parameters are included here. See the example in TemplateDeclaration's doc comment for details. --- src/ir/ty.rs | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 661368289c..1b5ecc3cb5 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -7,7 +7,7 @@ use super::dot::DotAttributes; use super::enum_ty::Enum; use super::function::FunctionSig; use super::int::IntKind; -use super::item::Item; +use super::item::{Item, ItemAncestors}; use super::layout::Layout; use super::objc::ObjCInterface; use super::traversal::{Trace, Tracer}; @@ -16,7 +16,40 @@ use parse::{ClangItemParser, ParseError, ParseResult}; use std::io; use std::mem; -/// Template declaration related methods. +/// Template declaration (and such declaration's template parameters) related +/// methods. +/// +/// Consider this example: +/// +/// ```c++ +/// template +/// class Foo { +/// template +/// using Bar = V*; +/// +/// class Inner { +/// T x; +/// U y; +/// Bar z; +/// }; +/// }; +/// +/// class Qux { +/// int y; +/// }; +/// ``` +/// +/// The following table depicts the results of each trait method when invoked on +/// `Foo`, `Bar`, and `Qux`. +/// +/// +------+----------------------+--------------------------+------------------------+ +/// |Decl. | self_template_params | num_self_template_params | all_template_parameters| +/// +------+----------------------+--------------------------+------------------------+ +/// |Foo | Some([T, U]) | Some(2) | Some([T, U]) | +/// |Bar | Some([V]) | Some(1) | Some([T, U, V]) | +/// |Inner | None | None | Some([T, U]) | +/// |Qux | None | None | None | +/// +------+----------------------+--------------------------+------------------------+ pub trait TemplateDeclaration { /// Get the set of `ItemId`s that make up this template declaration's free /// template parameters. @@ -38,6 +71,36 @@ pub trait TemplateDeclaration { fn num_self_template_params(&self, ctx: &BindgenContext) -> Option { self.self_template_params(ctx).map(|params| params.len()) } + + /// Get the complete set of template parameters that can affect this + /// declaration. + /// + /// Note that this item doesn't need to be a template declaration itself for + /// `Some` to be returned here (in contrast to `self_template_params`). If + /// this item is a member of a template declaration, then the parent's + /// template parameters are included here. + /// + /// In the example above, `Inner` depends on both of the `T` and `U` type + /// parameters, even though it is not itself a template declaration and + /// therefore has no type parameters itself. Perhaps it helps to think about + /// how we would fully reference such a member type in C++: + /// `Foo::Inner`. `Foo` *must* be instantiated with template + /// arguments before we can gain access to the `Inner` member type. + fn all_template_params(&self, ctx: &BindgenContext) -> Option> + where Self: ItemAncestors + { + let each_self_params: Vec> = self.ancestors(ctx) + .filter_map(|id| id.self_template_params(ctx)) + .collect(); + if each_self_params.is_empty() { + None + } else { + Some(each_self_params.into_iter() + .rev() + .flat_map(|params| params) + .collect()) + } + } } /// The base representation of a type in bindgen. From cf3b4599d59207d403c682f39f896f512b0b4b76 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 15 Feb 2017 11:28:29 -0800 Subject: [PATCH 0368/2291] Add more `EdgeKind`s --- src/ir/comp.rs | 16 +++--- src/ir/function.rs | 6 +-- src/ir/item.rs | 4 +- src/ir/traversal.rs | 124 ++++++++++++++++++++++++++++++++++++++++++-- src/ir/ty.rs | 16 +++--- 5 files changed, 143 insertions(+), 23 deletions(-) diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 6a9b8cb189..492c1a98e4 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -1040,10 +1040,10 @@ impl Trace for CompInfo { if let Some(template) = self.specialized_template() { // This is an instantiation of a template declaration with concrete // template type arguments. - tracer.visit(template); + tracer.visit_kind(template, EdgeKind::TemplateDeclaration); let args = item.applicable_template_args(context); for a in args { - tracer.visit(a); + tracer.visit_kind(a, EdgeKind::TemplateArgument); } } else { let params = item.applicable_template_args(context); @@ -1055,27 +1055,27 @@ impl Trace for CompInfo { } for base in self.base_members() { - tracer.visit(base.ty); + tracer.visit_kind(base.ty, EdgeKind::BaseMember); } for field in self.fields() { - tracer.visit(field.ty()); + tracer.visit_kind(field.ty(), EdgeKind::Field); } for &ty in self.inner_types() { - tracer.visit(ty); + tracer.visit_kind(ty, EdgeKind::InnerType); } for &var in self.inner_vars() { - tracer.visit(var); + tracer.visit_kind(var, EdgeKind::InnerVar); } for method in self.methods() { - tracer.visit(method.signature); + tracer.visit_kind(method.signature, EdgeKind::Method); } for &ctor in self.constructors() { - tracer.visit(ctor); + tracer.visit_kind(ctor, EdgeKind::Constructor); } } } diff --git a/src/ir/function.rs b/src/ir/function.rs index daa30b893b..2a13b9f0d4 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -3,7 +3,7 @@ use super::context::{BindgenContext, ItemId}; use super::dot::DotAttributes; use super::item::Item; -use super::traversal::{Trace, Tracer}; +use super::traversal::{EdgeKind, Trace, Tracer}; use super::ty::TypeKind; use clang; use clang_sys::CXCallingConv; @@ -336,10 +336,10 @@ impl Trace for FunctionSig { fn trace(&self, _: &BindgenContext, tracer: &mut T, _: &()) where T: Tracer, { - tracer.visit(self.return_type()); + tracer.visit_kind(self.return_type(), EdgeKind::FunctionReturn); for &(_, ty) in self.argument_types() { - tracer.visit(ty); + tracer.visit_kind(ty, EdgeKind::FunctionParameter); } } } diff --git a/src/ir/item.rs b/src/ir/item.rs index 00e3a30d64..21b27f071c 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -7,7 +7,7 @@ use super::dot::{DotAttributes}; use super::function::Function; use super::item_kind::ItemKind; use super::module::Module; -use super::traversal::{Trace, Tracer}; +use super::traversal::{EdgeKind, Trace, Tracer}; use super::ty::{TemplateDeclaration, Type, TypeKind}; use clang; use clang_sys; @@ -205,7 +205,7 @@ impl Trace for Item { tracer.visit(fun.signature()); } ItemKind::Var(ref var) => { - tracer.visit(var.ty()); + tracer.visit_kind(var.ty(), EdgeKind::VarType); } ItemKind::Module(_) => { // Module -> children edges are "weak", and we do not want to diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs index 8c5e32cfc3..30772aadba 100644 --- a/src/ir/traversal.rs +++ b/src/ir/traversal.rs @@ -44,22 +44,137 @@ impl Into for Edge { } /// The kind of edge reference. This is useful when we wish to only consider -/// certain kinds of edges for a particular traversal. +/// certain kinds of edges for a particular traversal or analysis. #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum EdgeKind { /// A generic, catch-all edge. Generic, /// An edge from a template declaration, to the definition of a named type - /// parameter. For example, the edge Foo -> T in the following snippet: + /// parameter. For example, the edge from `Foo` to `T` in the following + /// snippet: /// /// ```C++ /// template + /// class Foo { }; + /// ``` + TemplateParameterDefinition, + + /// An edge from a template instantiation to the template declaration that + /// is being instantiated. For example, the edge from `Foo` to + /// to `Foo`: + /// + /// ```C++ + /// template + /// class Foo { }; + /// + /// using Bar = Foo; + /// ``` + TemplateDeclaration, + + /// An edge from a template instantiation to its template argument. For + /// example, `Foo` to `Bar`: + /// + /// ```C++ + /// template + /// class Foo { }; + /// + /// class Bar { }; + /// + /// using FooBar = Foo; + /// ``` + TemplateArgument, + + /// An edge from a compound type to one of its base member types. For + /// example, the edge from `Bar` to `Foo`: + /// + /// ```C++ + /// class Foo { }; + /// + /// class Bar : public Foo { }; + /// ``` + BaseMember, + + /// An edge from a compound type to the types of one of its fields. For + /// example, the edge from `Foo` to `int`: + /// + /// ```C++ /// class Foo { /// int x; /// }; /// ``` - TemplateParameterDefinition, + Field, + + /// An edge from an class or struct type to an inner type member. For + /// example, the edge from `Foo` to `Foo::Bar` here: + /// + /// ```C++ + /// class Foo { + /// struct Bar { }; + /// }; + /// ``` + InnerType, + + /// An edge from an class or struct type to an inner static variable. For + /// example, the edge from `Foo` to `Foo::BAR` here: + /// + /// ```C++ + /// class Foo { + /// static const char* BAR; + /// }; + /// ``` + InnerVar, + + /// An edge from a class or struct type to one of its method functions. For + /// example, the edge from `Foo` to `Foo::bar`: + /// + /// ```C++ + /// class Foo { + /// bool bar(int x, int y); + /// }; + /// ``` + Method, + + /// An edge from a class or struct type to one of its constructor + /// functions. For example, the edge from `Foo` to `Foo::Foo(int x, int y)`: + /// + /// ```C++ + /// class Foo { + /// int my_x; + /// int my_y; + /// + /// public: + /// Foo(int x, int y); + /// }; + /// ``` + Constructor, + + /// An edge from a function declaration to its return type. For example, the + /// edge from `foo` to `int`: + /// + /// ```C++ + /// int foo(char* string); + /// ``` + FunctionReturn, + + /// An edge from a function declaration to one of its parameter types. For + /// example, the edge from `foo` to `char*`: + /// + /// ```C++ + /// int foo(char* string); + /// ``` + FunctionParameter, + + /// An edge from a static variable to its type. For example, the edge from + /// `FOO` to `const char*`: + /// + /// ```C++ + /// static const char* FOO; + /// ``` + VarType, + + /// An edge from a non-templated alias or typedef to the referenced type. + TypeReference, } /// A predicate to allow visiting only sub-sets of the whole IR graph by @@ -211,7 +326,8 @@ impl Tracer for F } /// Trace all of the outgoing edges to other items. Implementations should call -/// `tracer.visit(edge)` for each of their outgoing edges. +/// one of `tracer.visit(edge)` or `tracer.visit_kind(edge, EdgeKind::Whatever)` +/// for each of their outgoing edges. pub trait Trace { /// If a particular type needs extra information beyond what it has in /// `self` and `context` to find its referenced items, its implementation diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 1b5ecc3cb5..834a5c1bb2 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -10,7 +10,7 @@ use super::int::IntKind; use super::item::{Item, ItemAncestors}; use super::layout::Layout; use super::objc::ObjCInterface; -use super::traversal::{Trace, Tracer}; +use super::traversal::{EdgeKind, Trace, Tracer}; use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; use std::io; @@ -1245,14 +1245,18 @@ impl Trace for Type { TypeKind::Array(inner, _) | TypeKind::Alias(inner) | TypeKind::ResolvedTypeRef(inner) => { - tracer.visit(inner); + tracer.visit_kind(inner, EdgeKind::TypeReference); + } + TypeKind::TemplateAlias(inner, ref template_params) => { + tracer.visit_kind(inner, EdgeKind::TypeReference); + for &item in template_params { + tracer.visit_kind(item, EdgeKind::TemplateParameterDefinition); + } } - - TypeKind::TemplateAlias(inner, ref template_args) | TypeKind::TemplateInstantiation(inner, ref template_args) => { - tracer.visit(inner); + tracer.visit_kind(inner, EdgeKind::TemplateDeclaration); for &item in template_args { - tracer.visit(item); + tracer.visit_kind(item, EdgeKind::TemplateArgument); } } TypeKind::Comp(ref ci) => ci.trace(context, tracer, item), From 7e22fca5151a428c23fc62bc64a1d8d045b8372e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 15 Feb 2017 13:28:17 -0800 Subject: [PATCH 0369/2291] Find the set of template parameters used for any given IR node Rather than determining whether any given template parameter is used at all globally, determine the set of template parameters used by any given IR node. --- src/ir/named.rs | 234 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 181 insertions(+), 53 deletions(-) diff --git a/src/ir/named.rs b/src/ir/named.rs index e434a58d95..3c6766629e 100644 --- a/src/ir/named.rs +++ b/src/ir/named.rs @@ -76,11 +76,50 @@ //! fixed-point. //! //! We use the "monotone framework" for this fix-point analysis where our -//! lattice is the powerset of the template parameters that appear in the input -//! C++ header, our join function is set union, and we use the -//! `ir::traversal::Trace` trait to implement the work-list optimization so we -//! don't have to revisit every node in the graph when for every iteration -//! towards the fix-point. +//! lattice is the mapping from each IR item to the powerset of the template +//! parameters that appear in the input C++ header, our join function is set +//! union, and we use the `ir::traversal::Trace` trait to implement the +//! work-list optimization so we don't have to revisit every node in the graph +//! when for every iteration towards the fix-point. +//! +//! A lattice is a set with a partial ordering between elements, where there is +//! a single least upper bound and a single greatest least bound for every +//! subset. We are dealing with finite lattices, which means that it has a +//! finite number of elements, and it follows that there exists a single top and +//! a single bottom member of the lattice. For example, the power set of a +//! finite set forms a finite lattice where partial ordering is defined by set +//! inclusion, that is `a <= b` if `a` is a subset of `b`. Here is the finite +//! lattice constructed from the set {0,1,2}: +//! +//! ```text +//! .----- Top = {0,1,2} -----. +//! / | \ +//! / | \ +//! / | \ +//! {0,1} -------. {0,2} .--------- {1,2} +//! | \ / \ / | +//! | / \ | +//! | / \ / \ | +//! {0} --------' {1} `---------- {2} +//! \ | / +//! \ | / +//! \ | / +//! `------ Bottom = {} ------' +//! ``` +//! +//! A monotone function `f` is a function where if `x <= y`, then it holds that +//! `f(x) <= f(y)`. It should be clear that running a monotone function to a +//! fix-point on a finite lattice will always terminate: `f` can only "move" +//! along the lattice in a single direction, and therefore can only either find +//! a fix-point in the middle of the lattice or continue to the top or bottom +//! depending if it is ascending or descending the lattice respectively. +//! +//! For our analysis, we are collecting the set of template parameters used by +//! any given IR node. The set of template parameters appearing in the program +//! is finite. Our lattice is their powerset. We start at the bottom element, +//! the empty set. Our analysis only adds members to the set of used template +//! parameters, never removes them, so it is monotone, and therefore iteration +//! to a fix-point will terminate. //! //! For a deeper introduction to the general form of this kind of analysis, see //! [Static Program Analysis by Anders Møller and Michael I. Schwartzbach][spa]. @@ -173,38 +212,119 @@ pub fn analyze(extra: Analysis::Extra) -> Analysis::Output analysis.into() } -/// An analysis that finds the set of template parameters that actually end up -/// used in our generated bindings. +/// An analysis that finds for each IR item its set of template parameters that +/// it uses. +/// +/// We use the following monotone constraint function: +/// +/// ```ignore +/// template_param_usage(v) = +/// self_template_param_usage(v) union +/// template_param_usage(w_0) union +/// template_param_usage(w_1) union +/// ... +/// template_param_usage(w_n) +/// ``` +/// +/// Where `v` has direct edges in the IR graph to each of `w_0`, `w_1`, +/// ..., `w_n` (for example, if `v` were a struct type and `x` and `y` +/// were the types of two of `v`'s fields). We ignore certain edges, such +/// as edges from a template declaration to its template parameters' +/// definitions for this analysis. If we didn't, then we would mistakenly +/// determine that ever template parameter is always used. +/// +/// Finally, `self_template_param_usage` is defined with the following cases: +/// +/// * If `T` is a template parameter: +/// +/// ```ignore +/// self_template_param_usage(T) = { T } +/// ``` +/// +/// * If `inst` is a template instantiation, `inst.args` are the template +/// instantiation's template arguments, and `inst.decl` is the template +/// declaration being instantiated: +/// +/// ```ignore +/// self_template_param_usage(inst) = +/// { T: for T in inst.args, if T in template_param_usage(inst.decl) } +/// ``` +/// +/// * And for all other IR items, the result is the empty set: +/// +/// ```ignore +/// self_template_param_usage(_) = { } +/// ``` #[derive(Debug, Clone)] pub struct UsedTemplateParameters<'a> { ctx: &'a BindgenContext<'a>, - used: ItemSet, + used: HashMap, dependencies: HashMap>, } +impl<'a> UsedTemplateParameters<'a> { + fn consider_edge(kind: EdgeKind) -> bool { + match kind { + // For each of these kinds of edges, if the referent uses a template + // parameter, then it should be considered that the origin of the + // edge also uses the template parameter. + EdgeKind::TemplateArgument | + EdgeKind::BaseMember | + EdgeKind::Field | + EdgeKind::InnerType | + EdgeKind::InnerVar | + EdgeKind::Constructor | + EdgeKind::VarType | + EdgeKind::TypeReference => true, + + // We can't emit machine code for new instantiations of function + // templates and class templates' methods (and don't detect explicit + // instantiations) so we must ignore template parameters that are + // only used by functions. + EdgeKind::Method | + EdgeKind::FunctionReturn | + EdgeKind::FunctionParameter => false, + + // If we considered these edges, we would end up mistakenly claiming + // that every template parameter always used. + EdgeKind::TemplateDeclaration | + EdgeKind::TemplateParameterDefinition => false, + + // Since we have to be careful about which edges we consider for + // this analysis to be correct, we ignore generic edges. We also + // avoid a `_` wild card to force authors of new edge kinds to + // determine whether they need to be considered by this analysis. + EdgeKind::Generic => false, + } + } +} + impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { type Node = ItemId; type Extra = &'a BindgenContext<'a>; - type Output = ItemSet; + type Output = HashMap; fn new(ctx: &'a BindgenContext<'a>) -> UsedTemplateParameters<'a> { + let mut used = HashMap::new(); let mut dependencies = HashMap::new(); for item in ctx.whitelisted_items() { + dependencies.entry(item).or_insert(vec![]); + used.insert(item, ItemSet::new()); + { // We reverse our natural IR graph edges to find dependencies // between nodes. - let mut add_reverse_edge = |sub_item, _| { + item.trace(ctx, &mut |sub_item, _| { dependencies.entry(sub_item).or_insert(vec![]).push(item); - }; - item.trace(ctx, &mut add_reverse_edge, &()); + }, &()); } // Additionally, whether a template instantiation's template // arguments are used depends on whether the template declaration's // generic template parameters are used. - ctx.resolve_item_fallible(item) - .and_then(|item| item.as_type()) + ctx.resolve_item(item) + .as_type() .map(|ty| match ty.kind() { &TypeKind::TemplateInstantiation(decl, ref args) => { let decl = ctx.resolve_type(decl); @@ -222,57 +342,65 @@ impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { UsedTemplateParameters { ctx: ctx, - used: ItemSet::new(), + used: used, dependencies: dependencies, } } - fn initial_worklist(&self) -> Vec { + fn initial_worklist(&self) -> Vec { self.ctx.whitelisted_items().collect() } - fn constrain(&mut self, item: ItemId) -> bool { - let original_size = self.used.len(); + fn constrain(&mut self, id: ItemId) -> bool { + let original_len = self.used[&id].len(); - item.trace(self.ctx, &mut |item, edge_kind| { - if edge_kind == EdgeKind::TemplateParameterDefinition { - // The definition of a template parameter is not considered a - // use of said template parameter. Ignore this edge. - return; + // First, add this item's self template parameter usage. + let item = self.ctx.resolve_item(id); + let ty_kind = item.as_type().map(|ty| ty.kind()); + match ty_kind { + Some(&TypeKind::Named) => { + // This is a trivial use of the template type parameter. + self.used.get_mut(&id).unwrap().insert(id); } - - let ty_kind = self.ctx.resolve_item(item) - .as_type() - .map(|ty| ty.kind()); - - match ty_kind { - Some(&TypeKind::Named) => { - // This is a "trivial" use of the template type parameter. - self.used.insert(item); - }, - Some(&TypeKind::TemplateInstantiation(decl, ref args)) => { - // A template instantiation's concrete template argument is - // only used if the template declaration uses the - // corresponding template parameter. - let decl = self.ctx.resolve_type(decl); - let params = decl.self_template_params(self.ctx) - .expect("a template instantiation's referenced \ - template declaration should have template \ - parameters"); - for (arg, param) in args.iter().zip(params.iter()) { - if self.used.contains(param) { - if self.ctx.resolve_item(*arg).is_named() { - self.used.insert(*arg); - } + Some(&TypeKind::TemplateInstantiation(decl, ref args)) => { + // A template instantiation's concrete template argument is + // only used if the template declaration uses the + // corresponding template parameter. + let params = decl.self_template_params(self.ctx) + .expect("a template instantiation's referenced \ + template declaration should have template \ + parameters"); + for (arg, param) in args.iter().zip(params.iter()) { + if self.used[&decl].contains(param) { + if self.ctx.resolve_item(*arg).is_named() { + self.used.get_mut(&id).unwrap().insert(*arg); } } - }, - _ => return, + } } + _ => {} + } + + // Second, add the union of each of its referent item's template + // parameter usage. + item.trace(self.ctx, &mut |sub_id, edge_kind| { + if sub_id == id || !Self::consider_edge(edge_kind) { + return; + } + + // This clone is unfortunate because we are potentially thrashing + // malloc. We could investigate replacing the ItemSet values with + // Rc> to make the borrow checker happy, but it + // isn't clear that the added indirection wouldn't outweigh the cost + // of malloc'ing a new ItemSet here. Ideally, `HashMap` would have a + // `split_entries` method analogous to `slice::split_at_mut`... + let to_add = self.used[&sub_id].clone(); + self.used.get_mut(&id).unwrap().extend(to_add); }, &()); - let new_size = self.used.len(); - new_size != original_size + let new_len = self.used[&id].len(); + assert!(new_len >= original_len); + new_len != original_len } fn each_depending_on(&self, item: ItemId, mut f: F) @@ -286,8 +414,8 @@ impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { } } -impl<'a> From> for ItemSet { - fn from(used_templ_params: UsedTemplateParameters) -> ItemSet { +impl<'a> From> for HashMap { + fn from(used_templ_params: UsedTemplateParameters) -> Self { used_templ_params.used } } From 5f7636ea752da80dc222d05239dac74a434013ef Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Wed, 22 Feb 2017 00:51:35 +0200 Subject: [PATCH 0370/2291] objc: Implement categories, id, selector --- src/codegen/mod.rs | 11 +++++-- src/ir/objc.rs | 33 +++++++++++++++++---- src/ir/ty.rs | 27 +++++++++++++++-- tests/expectations/tests/objc_category.rs | 23 ++++++++++++++ tests/expectations/tests/objc_class.rs | 21 +++++++++++++ tests/expectations/tests/objc_sel_and_id.rs | 22 ++++++++++++++ tests/headers/objc_category.h | 10 +++++++ tests/headers/objc_class.h | 10 +++++++ tests/headers/objc_sel_and_id.h | 7 +++++ 9 files changed, 155 insertions(+), 9 deletions(-) create mode 100644 tests/expectations/tests/objc_category.rs create mode 100644 tests/expectations/tests/objc_class.rs create mode 100644 tests/expectations/tests/objc_sel_and_id.rs create mode 100644 tests/headers/objc_category.h create mode 100644 tests/headers/objc_class.h create mode 100644 tests/headers/objc_sel_and_id.h diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index aab5994628..46b0a3e766 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -647,6 +647,9 @@ impl CodeGenerator for Type { TypeKind::Enum(ref ei) => { ei.codegen(ctx, result, whitelisted_items, item) } + TypeKind::ObjCId | TypeKind::ObjCSel => { + result.saw_objc(); + } TypeKind::ObjCInterface(ref interface) => { interface.codegen(ctx, result, whitelisted_items, item) } @@ -2276,6 +2279,8 @@ impl ToRustTy for Type { let ident = ctx.rust_ident(&name); quote_ty!(ctx.ext_cx(), $ident) } + TypeKind::ObjCSel => quote_ty!(ctx.ext_cx(), objc::runtime::Sel), + TypeKind::ObjCId | TypeKind::ObjCInterface(..) => quote_ty!(ctx.ext_cx(), id), ref u @ TypeKind::UnresolvedTypeRef(..) => { unreachable!("Should have been resolved after parsing {:?}!", u) @@ -2461,10 +2466,12 @@ impl CodeGenerator for ObjCInterface { } + let trait_name = self.rust_name(); + let trait_block = aster::AstBuilder::new() .item() .pub_() - .trait_(self.name()) + .trait_(&trait_name) .with_items(trait_items) .build(); @@ -2473,7 +2480,7 @@ impl CodeGenerator for ObjCInterface { .item() .impl_() .trait_() - .id(self.name()) + .id(&trait_name) .build() .with_items(impl_items) .build_ty(ty_for_impl); diff --git a/src/ir/objc.rs b/src/ir/objc.rs index b3c3688b37..ff36c7b612 100644 --- a/src/ir/objc.rs +++ b/src/ir/objc.rs @@ -4,17 +4,21 @@ use super::context::BindgenContext; use super::function::FunctionSig; use clang; use clang_sys::CXChildVisit_Continue; +use clang_sys::CXCursor_ObjCCategoryDecl; +use clang_sys::CXCursor_ObjCClassRef; use clang_sys::CXCursor_ObjCInstanceMethodDecl; /// Objective C interface as used in TypeKind /// -/// Also protocols are parsed as this type +/// Also protocols and categories are parsed as this type #[derive(Debug)] pub struct ObjCInterface { /// The name /// like, NSObject name: String, + category: Option, + /// List of the methods defined in this interfae methods: Vec, } @@ -37,6 +41,7 @@ impl ObjCInterface { fn new(name: &str) -> ObjCInterface { ObjCInterface { name: name.to_owned(), + category: None, methods: Vec::new(), } } @@ -47,6 +52,16 @@ impl ObjCInterface { self.name.as_ref() } + /// Formats the name for rust + /// Can be like NSObject, but with categories might be like NSObject_NSCoderMethods + pub fn rust_name(&self) -> String { + if let Some(ref cat) = self.category { + format!("{}_{}", self.name(), cat) + } else { + self.name().to_owned() + } + } + /// List of the methods defined in this interfae pub fn methods(&self) -> &Vec { &self.methods @@ -59,12 +74,20 @@ impl ObjCInterface { let name = cursor.spelling(); let mut interface = Self::new(&name); - cursor.visit(|cursor| { - match cursor.kind() { + cursor.visit(|c| { + match c.kind() { + CXCursor_ObjCClassRef => { + if cursor.kind() == CXCursor_ObjCCategoryDecl { + // We are actually a category extension, and we found the reference + // to the original interface, so name this interface approriately + interface.name = c.spelling(); + interface.category = Some(cursor.spelling()); + } + } CXCursor_ObjCInstanceMethodDecl => { - let name = cursor.spelling(); + let name = c.spelling(); let signature = - FunctionSig::from_ty(&cursor.cur_type(), &cursor, ctx) + FunctionSig::from_ty(&c.cur_type(), &c, ctx) .expect("Invalid function sig"); let method = ObjCInstanceMethod::new(&name, signature); diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 44a8874440..5491ceaf21 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -358,6 +358,8 @@ impl Type { TypeKind::NullPtr | TypeKind::BlockPointer | TypeKind::Pointer(..) | + TypeKind::ObjCId | + TypeKind::ObjCSel | TypeKind::ObjCInterface(..) => Some(self), TypeKind::ResolvedTypeRef(inner) | @@ -433,6 +435,8 @@ impl DotAttributes for TypeKind { TypeKind::TemplateInstantiation(..) => "TemplateInstantiation", TypeKind::ResolvedTypeRef(..) => "ResolvedTypeRef", TypeKind::Named => "Named", + TypeKind::ObjCId => "ObjCId", + TypeKind::ObjCSel => "ObjCSel", TypeKind::ObjCInterface(..) => "ObjCInterface", TypeKind::UnresolvedTypeRef(..) => { unreachable!("there shouldn't be any more of these anymore") @@ -516,6 +520,8 @@ impl TemplateDeclaration for TypeKind { TypeKind::UnresolvedTypeRef(..) | TypeKind::Named | TypeKind::Alias(_) | + TypeKind::ObjCId | + TypeKind::ObjCSel | TypeKind::ObjCInterface(_) => None, } } @@ -562,6 +568,8 @@ impl CanDeriveDefault for Type { TypeKind::NullPtr | TypeKind::Pointer(..) | TypeKind::BlockPointer | + TypeKind::ObjCId | + TypeKind::ObjCSel | TypeKind::ObjCInterface(..) | TypeKind::Enum(..) => false, TypeKind::Function(..) | @@ -707,6 +715,12 @@ pub enum TypeKind { /// Objective C interface. Always referenced through a pointer ObjCInterface(ObjCInterface), + + /// Objective C 'id' type, points to any object + ObjCId, + + /// Objective C selector type + ObjCSel, } impl Type { @@ -738,6 +752,8 @@ impl Type { TypeKind::Reference(..) | TypeKind::NullPtr | TypeKind::BlockPointer | + TypeKind::ObjCId | + TypeKind::ObjCSel | TypeKind::Pointer(..) => false, TypeKind::ObjCInterface(..) => true, // dunno? @@ -787,8 +803,10 @@ impl Type { // Parse objc protocols as if they were interfaces let mut ty_kind = ty.kind(); if let Some(loc) = location { - if loc.kind() == CXCursor_ObjCProtocolDecl { - ty_kind = CXType_ObjCInterface; + match loc.kind() { + CXCursor_ObjCProtocolDecl | + CXCursor_ObjCCategoryDecl => ty_kind = CXType_ObjCInterface, + _ => {} } } @@ -1146,6 +1164,9 @@ impl Type { parent_id, ctx); } + CXType_ObjCId => TypeKind::ObjCId, + CXType_ObjCSel => TypeKind::ObjCSel, + CXType_ObjCClass | CXType_ObjCInterface => { let interface = ObjCInterface::from_ty(&location.unwrap(), ctx) .expect("Not a valid objc interface?"); @@ -1214,6 +1235,8 @@ impl Trace for Type { TypeKind::Int(_) | TypeKind::Float(_) | TypeKind::Complex(_) | + TypeKind::ObjCId | + TypeKind::ObjCSel | TypeKind::BlockPointer => {} } } diff --git a/tests/expectations/tests/objc_category.rs b/tests/expectations/tests/objc_category.rs new file mode 100644 index 0000000000..d358e1329d --- /dev/null +++ b/tests/expectations/tests/objc_category.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#![cfg(target_os="macos")] + +#[macro_use] +extern crate objc; +#[allow(non_camel_case_types)] +pub type id = *mut objc::runtime::Object; +pub trait Foo { + unsafe fn method(self); +} +impl Foo for id { + unsafe fn method(self) { msg_send!(self , method) } +} +pub trait Foo_BarCategory { + unsafe fn categoryMethod(self); +} +impl Foo_BarCategory for id { + unsafe fn categoryMethod(self) { msg_send!(self , categoryMethod) } +} diff --git a/tests/expectations/tests/objc_class.rs b/tests/expectations/tests/objc_class.rs new file mode 100644 index 0000000000..9aa30c1a6f --- /dev/null +++ b/tests/expectations/tests/objc_class.rs @@ -0,0 +1,21 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#![cfg(target_os="macos")] + +#[macro_use] +extern crate objc; +#[allow(non_camel_case_types)] +pub type id = *mut objc::runtime::Object; +pub trait Foo { + unsafe fn method(self); +} +impl Foo for id { + unsafe fn method(self) { msg_send!(self , method) } +} +extern "C" { + #[link_name = "fooVar"] + pub static mut fooVar: *mut id; +} diff --git a/tests/expectations/tests/objc_sel_and_id.rs b/tests/expectations/tests/objc_sel_and_id.rs new file mode 100644 index 0000000000..d72b0bc756 --- /dev/null +++ b/tests/expectations/tests/objc_sel_and_id.rs @@ -0,0 +1,22 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#![cfg(target_os="macos")] + +#[macro_use] +extern crate objc; +#[allow(non_camel_case_types)] +pub type id = *mut objc::runtime::Object; +extern "C" { + #[link_name = "object"] + pub static mut object: id; +} +extern "C" { + #[link_name = "selector"] + pub static mut selector: objc::runtime::Sel; +} +extern "C" { + pub fn f(object: id, selector: objc::runtime::Sel); +} diff --git a/tests/headers/objc_category.h b/tests/headers/objc_category.h new file mode 100644 index 0000000000..c464b72eb2 --- /dev/null +++ b/tests/headers/objc_category.h @@ -0,0 +1,10 @@ +// bindgen-flags: --objc-extern-crate -- -x objective-c +// bindgen-osx-only + +@interface Foo +-(void)method; +@end + +@interface Foo (BarCategory) +-(void)categoryMethod; +@end diff --git a/tests/headers/objc_class.h b/tests/headers/objc_class.h new file mode 100644 index 0000000000..cea72e78aa --- /dev/null +++ b/tests/headers/objc_class.h @@ -0,0 +1,10 @@ +// bindgen-flags: --objc-extern-crate -- -x objective-c +// bindgen-osx-only + +@class Foo; + +Foo* fooVar; + +@interface Foo +-(void)method; +@end diff --git a/tests/headers/objc_sel_and_id.h b/tests/headers/objc_sel_and_id.h new file mode 100644 index 0000000000..3c8c656166 --- /dev/null +++ b/tests/headers/objc_sel_and_id.h @@ -0,0 +1,7 @@ +// bindgen-flags: --objc-extern-crate -- -x objective-c +// bindgen-osx-only + +id object; +SEL selector; + +void f(id object, SEL selector); From fe06265567b9ee1207bc95077932da85c0ed0788 Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Wed, 22 Feb 2017 01:31:55 +0200 Subject: [PATCH 0371/2291] objc: Rename protocol traits with prefix Apparently protocols and interface names live in a separate namespace, so there is a chance of collision, like the NSObject interface implements NSObject category --- src/ir/objc.rs | 15 ++++++++++++++- tests/expectations/tests/objc_interface.rs | 4 ++-- tests/expectations/tests/objc_protocol.rs | 15 +++++++++++++++ tests/headers/objc_protocol.h | 8 ++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 tests/expectations/tests/objc_protocol.rs create mode 100644 tests/headers/objc_protocol.h diff --git a/src/ir/objc.rs b/src/ir/objc.rs index ff36c7b612..963c8e20a4 100644 --- a/src/ir/objc.rs +++ b/src/ir/objc.rs @@ -7,6 +7,7 @@ use clang_sys::CXChildVisit_Continue; use clang_sys::CXCursor_ObjCCategoryDecl; use clang_sys::CXCursor_ObjCClassRef; use clang_sys::CXCursor_ObjCInstanceMethodDecl; +use clang_sys::CXCursor_ObjCProtocolDecl; /// Objective C interface as used in TypeKind /// @@ -19,6 +20,8 @@ pub struct ObjCInterface { category: Option, + is_protocol: bool, + /// List of the methods defined in this interfae methods: Vec, } @@ -42,6 +45,7 @@ impl ObjCInterface { ObjCInterface { name: name.to_owned(), category: None, + is_protocol: false, methods: Vec::new(), } } @@ -54,11 +58,16 @@ impl ObjCInterface { /// Formats the name for rust /// Can be like NSObject, but with categories might be like NSObject_NSCoderMethods + /// and protocols are like protocol_NSObject pub fn rust_name(&self) -> String { if let Some(ref cat) = self.category { format!("{}_{}", self.name(), cat) } else { - self.name().to_owned() + if self.is_protocol { + format!("protocol_{}", self.name()) + } else { + self.name().to_owned() + } } } @@ -74,6 +83,10 @@ impl ObjCInterface { let name = cursor.spelling(); let mut interface = Self::new(&name); + if cursor.kind() == CXCursor_ObjCProtocolDecl { + interface.is_protocol = true; + } + cursor.visit(|c| { match c.kind() { CXCursor_ObjCClassRef => { diff --git a/tests/expectations/tests/objc_interface.rs b/tests/expectations/tests/objc_interface.rs index 027cf57e4f..3ca67b892f 100644 --- a/tests/expectations/tests/objc_interface.rs +++ b/tests/expectations/tests/objc_interface.rs @@ -11,5 +11,5 @@ extern crate objc; pub type id = *mut objc::runtime::Object; pub trait Foo { } impl Foo for id { } -pub trait bar { } -impl bar for id { } +pub trait protocol_bar { } +impl protocol_bar for id { } diff --git a/tests/expectations/tests/objc_protocol.rs b/tests/expectations/tests/objc_protocol.rs new file mode 100644 index 0000000000..a21d4baa50 --- /dev/null +++ b/tests/expectations/tests/objc_protocol.rs @@ -0,0 +1,15 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#![cfg(target_os="macos")] + +#[macro_use] +extern crate objc; +#[allow(non_camel_case_types)] +pub type id = *mut objc::runtime::Object; +pub trait protocol_Foo { } +impl protocol_Foo for id { } +pub trait Foo { } +impl Foo for id { } diff --git a/tests/headers/objc_protocol.h b/tests/headers/objc_protocol.h new file mode 100644 index 0000000000..0c760fa51f --- /dev/null +++ b/tests/headers/objc_protocol.h @@ -0,0 +1,8 @@ +// bindgen-flags: --objc-extern-crate -- -x objective-c +// bindgen-osx-only + +@protocol Foo +@end + +@interface Foo +@end From 84183465281f798e6fcc13a17e2b9d459b7c5078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 22 Feb 2017 12:07:38 +0100 Subject: [PATCH 0372/2291] Disable osx testing. Not only for the large build times, but also because builds have been stalled for long, and I had to merge a few PRs manually already. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ba5ec867c2..0d256172f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,6 @@ addons: os: - linux - - osx rust: - stable From 1bf453cdc5fb278a0c840986a6723ad9c01f5ef3 Mon Sep 17 00:00:00 2001 From: th0rex Date: Mon, 27 Feb 2017 18:17:28 +0100 Subject: [PATCH 0373/2291] Add toggle for prepending enum name to variant Currently the name of a enum is always prepended to the beginning of a const or bitfield like variant. This can result in some quite unintuivite naming, if the library already prefixes its variants. For example hundreds of variants are named like this `cs_arch_CS_ARCH_ARM` when binding to the capstone library. This commit introduces a toggle for prepending the `cs_arch_` part. By default it is enabled to preserve current behaviour. It can be toggled with the `prepend_enum_name` function on the Builder. --- src/codegen/mod.rs | 10 +++++++--- src/lib.rs | 10 ++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 46b0a3e766..120acefad3 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1993,10 +1993,14 @@ impl CodeGenerator for Enum { Some(item.parent_id().canonical_name(ctx)) }; - let constant_mangling_prefix = if enum_ty.name().is_none() { - parent_canonical_name.as_ref().map(|n| &*n) + let constant_mangling_prefix = if ctx.options().prepend_enum_name { + if enum_ty.name().is_none() { + parent_canonical_name.as_ref().map(|n| &*n) + } else { + Some(&name) + } } else { - Some(&name) + None }; // NB: We defer the creation of constified variants, in case we find diff --git a/src/lib.rs b/src/lib.rs index 94a13c61aa..5e14d81eed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -458,6 +458,12 @@ impl Builder { self } + /// Prepend the enum name to constant or bitfield variants. + pub fn prepend_enum_name(mut self, doit: bool) -> Self { + self.options.prepend_enum_name = doit; + self + } + /// Generate the Rust bindings using the options built up thus far. pub fn generate<'ctx>(self) -> Result, ()> { Bindings::generate(self.options, None) @@ -593,6 +599,9 @@ pub struct BindgenOptions { /// /// [1]: https://github.com/servo/rust-bindgen/issues/528 pub enable_mangling: bool, + + /// Whether to prepend the enum name to bitfield or constant variants. + pub prepend_enum_name: bool, } /// TODO(emilio): This is sort of a lie (see the error message that results from @@ -648,6 +657,7 @@ impl Default for BindgenOptions { whitelist_recursively: true, objc_extern_crate: false, enable_mangling: true, + prepend_enum_name: true, } } } From c0d5f706e07234039ac98c7254b02d0f1dac6f05 Mon Sep 17 00:00:00 2001 From: th0rex Date: Mon, 27 Feb 2017 18:24:50 +0100 Subject: [PATCH 0374/2291] Add command line flag for prepend_enum_name --- src/options.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/options.rs b/src/options.rs index a62aa73d28..78a0e30bc4 100644 --- a/src/options.rs +++ b/src/options.rs @@ -127,6 +127,9 @@ pub fn builder_from_flags Arg::with_name("no-convert-floats") .long("no-convert-floats") .help("Don't automatically convert floats to f32/f64."), + Arg::with_name("no-prepend-enum-name") + .long("no-prepend-enum-name") + .help("Do not prepend the enum name to bitfield or constant variants"), Arg::with_name("no-unstable-rust") .long("no-unstable-rust") .help("Do not generate unstable Rust code.") @@ -239,6 +242,10 @@ pub fn builder_from_flags builder = builder.derive_default(false); } + if matches.is_present("no-prepend-enum-name") { + builder = builder.prepend_enum_name(false); + } + if let Some(prefix) = matches.value_of("ctypes-prefix") { builder = builder.ctypes_prefix(prefix); } From 49fa29935d9f2848b00a4936bee757b3e11df0af Mon Sep 17 00:00:00 2001 From: th0rex Date: Mon, 27 Feb 2017 18:31:43 +0100 Subject: [PATCH 0375/2291] Add tests for not prepending the enum name --- tests/expectations/tests/prepend_enum_name.rs | 9 +++++++++ tests/headers/prepend_enum_name.hpp | 6 ++++++ 2 files changed, 15 insertions(+) create mode 100644 tests/expectations/tests/prepend_enum_name.rs create mode 100644 tests/headers/prepend_enum_name.hpp diff --git a/tests/expectations/tests/prepend_enum_name.rs b/tests/expectations/tests/prepend_enum_name.rs new file mode 100644 index 0000000000..d95bd1b4bc --- /dev/null +++ b/tests/expectations/tests/prepend_enum_name.rs @@ -0,0 +1,9 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const FOO_BAR: foo = 0; +pub const FOO_BAZ: foo = 1; +pub type foo = ::std::os::raw::c_uint; diff --git a/tests/headers/prepend_enum_name.hpp b/tests/headers/prepend_enum_name.hpp new file mode 100644 index 0000000000..df4ecf1fa9 --- /dev/null +++ b/tests/headers/prepend_enum_name.hpp @@ -0,0 +1,6 @@ +// bindgen-flags: --constified-enum foo --no-prepend-enum-name + +enum foo { + FOO_BAR, + FOO_BAZ, +}; From cd55e94b20d9e2b2f04712cb655c9075aab4e143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 27 Feb 2017 19:49:02 +0100 Subject: [PATCH 0376/2291] clang: Avoid a hot FFI call for getting the cursor kind. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a sorta-hot call already. I've noticed #544 wants to add more assertions about this, and was going to suggest moving them to `debug_assert!`. But there's an easier way :) Signed-off-by: Emilio Cobos Álvarez --- src/clang.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clang.rs b/src/clang.rs index 1a45eefa06..35dd7cc315 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -208,7 +208,7 @@ impl Cursor { /// Get the kind of referent this cursor is pointing to. pub fn kind(&self) -> CXCursorKind { - unsafe { clang_getCursorKind(self.x) } + self.x.kind } /// Returns true is the cursor is a definition From 56021b28a5150d2f7f7b662a261956d9eff8fe9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 1 Mar 2017 01:43:37 +0100 Subject: [PATCH 0377/2291] Fix calling convention propagation for function pointers. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This sucks, but works. The full solution is a refactoring that needs more thought than the time I'm able to dedicate to bindgen right now, see the comment for details. Signed-off-by: Emilio Cobos Álvarez --- src/clang.rs | 5 ++- src/ir/ty.rs | 28 +++++++++++++++- tests/expectations/tests/call-conv-field.rs | 36 +++++++++++++++++++++ tests/headers/call-conv-field.h | 7 ++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 tests/expectations/tests/call-conv-field.rs create mode 100644 tests/headers/call-conv-field.h diff --git a/src/clang.rs b/src/clang.rs index 1a45eefa06..94463723ad 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -633,9 +633,10 @@ impl Eq for Type {} impl fmt::Debug for Type { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { write!(fmt, - "Type({}, kind: {}, decl: {:?}, canon: {:?})", + "Type({}, kind: {}, cconv: {}, decl: {:?}, canon: {:?})", self.spelling(), type_to_str(self.kind()), + self.call_conv(), self.declaration(), self.declaration().canonical()) } @@ -1520,6 +1521,8 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { return; } + print_indent(depth, format!(" {}cconv = {}", prefix, ty.call_conv())); + print_indent(depth, format!(" {}spelling = \"{}\"", prefix, ty.spelling())); let num_template_args = diff --git a/src/ir/ty.rs b/src/ir/ty.rs index ce42a171af..a664fa79ed 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -877,6 +877,7 @@ impl Type { let kind = match ty_kind { CXType_Unexposed if *ty != canonical_ty && canonical_ty.kind() != CXType_Invalid && + ty.ret_type().is_none() && // Sometime clang desugars some types more than // what we need, specially with function // pointers. @@ -1132,7 +1133,32 @@ impl Type { CXType_ObjCObjectPointer | CXType_MemberPointer | CXType_Pointer => { - let inner = Item::from_ty_or_ref(ty.pointee_type().unwrap(), + // Fun fact: the canonical type of a pointer type may sometimes + // contain information we need but isn't present in the concrete + // type (yeah, I'm equally wat'd). + // + // Yet we still have trouble if we unconditionally trust the + // canonical type, like too-much desugaring (sigh). + // + // See tests/headers/call-conv-field.h for an example. + // + // Since for now the only identifier cause of breakage is the + // ABI for function pointers, and different ABI mixed with + // problematic stuff like that one is _extremely_ unlikely and + // can be bypassed via blacklisting, we do the check explicitly + // (as hacky as it is). + // + // Yet we should probably (somehow) get the best of both worlds, + // presumably special-casing function pointers as a whole, yet + // someone is going to need to care about typedef'd function + // pointers, etc, which isn't trivial given function pointers + // are mostly unexposed. I don't have the time for it right now. + let mut pointee = ty.pointee_type().unwrap(); + let canonical_pointee = canonical_ty.pointee_type().unwrap(); + if pointee.call_conv() != canonical_pointee.call_conv() { + pointee = canonical_pointee; + } + let inner = Item::from_ty_or_ref(pointee, location, None, ctx); diff --git a/tests/expectations/tests/call-conv-field.rs b/tests/expectations/tests/call-conv-field.rs new file mode 100644 index 0000000000..e9a4d873fa --- /dev/null +++ b/tests/expectations/tests/call-conv-field.rs @@ -0,0 +1,36 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct JNINativeInterface_ { + pub GetVersion: ::std::option::Option ::std::os::raw::c_int>, +} +#[test] +fn bindgen_test_layout_JNINativeInterface_() { + assert_eq!(::std::mem::size_of::() , 4usize , concat + ! ( "Size of: " , stringify ! ( JNINativeInterface_ ) )); + assert_eq! (::std::mem::align_of::() , 4usize , + concat ! ( + "Alignment of " , stringify ! ( JNINativeInterface_ ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const JNINativeInterface_ ) ) . GetVersion as * + const _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( JNINativeInterface_ ) , + "::" , stringify ! ( GetVersion ) )); +} +impl Clone for JNINativeInterface_ { + fn clone(&self) -> Self { *self } +} +impl Default for JNINativeInterface_ { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +extern "stdcall" { + #[link_name = "_bar@0"] + pub fn bar(); +} diff --git a/tests/headers/call-conv-field.h b/tests/headers/call-conv-field.h new file mode 100644 index 0000000000..b6d306ebd3 --- /dev/null +++ b/tests/headers/call-conv-field.h @@ -0,0 +1,7 @@ +// bindgen-flags: -- -target i686-pc-win32 + +struct JNINativeInterface_ { + int (__stdcall *GetVersion)(void *env); +}; + +__stdcall void bar(); From 0ce79c3ed392e5f0bcf459c24a2ba7f0cb6136dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 1 Mar 2017 14:57:19 +0100 Subject: [PATCH 0378/2291] Follow proper derive rules for function pointers. --- src/ir/function.rs | 24 +++++++++++ src/ir/ty.rs | 8 ++++ tests/expectations/tests/call-conv-field.rs | 12 ++++-- tests/expectations/tests/derive-fn-ptr.rs | 46 +++++++++++++++++++++ tests/headers/call-conv-field.h | 2 + tests/headers/derive-fn-ptr.h | 8 ++++ 6 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 tests/expectations/tests/derive-fn-ptr.rs create mode 100644 tests/headers/derive-fn-ptr.h diff --git a/src/ir/function.rs b/src/ir/function.rs index 5864bbf86b..ad336c4ba3 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -5,6 +5,7 @@ use super::dot::DotAttributes; use super::item::Item; use super::traversal::{EdgeKind, Trace, Tracer}; use super::ty::TypeKind; +use ir::derive::CanDeriveDebug; use clang; use clang_sys::CXCallingConv; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; @@ -349,3 +350,26 @@ impl Trace for FunctionSig { } } } + +// Function pointers follow special rules, see: +// +// https://github.com/servo/rust-bindgen/issues/547, +// https://github.com/rust-lang/rust/issues/38848, +// and https://github.com/rust-lang/rust/issues/40158 +// +// Note that copy is always derived, so we don't need to implement it. +impl CanDeriveDebug for FunctionSig { + type Extra = (); + + fn can_derive_debug(&self, _ctx: &BindgenContext, _: ()) -> bool { + const RUST_DERIVE_FUNPTR_LIMIT: usize = 12; + if self.argument_types.len() > RUST_DERIVE_FUNPTR_LIMIT { + return false; + } + + match self.abi { + Some(abi::Abi::C) | None => true, + _ => false, + } + } +} diff --git a/src/ir/ty.rs b/src/ir/ty.rs index a664fa79ed..329f4f5408 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -605,6 +605,13 @@ impl CanDeriveDebug for Type { TypeKind::Comp(ref info) => { info.can_derive_debug(ctx, self.layout(ctx)) } + TypeKind::Pointer(inner) => { + let inner = ctx.resolve_type(inner); + if let TypeKind::Function(ref sig) = *inner.canonical_type(ctx).kind() { + return sig.can_derive_debug(ctx, ()); + } + return true; + } _ => true, } } @@ -636,6 +643,7 @@ impl CanDeriveDefault for Type { TypeKind::ObjCSel | TypeKind::ObjCInterface(..) | TypeKind::Enum(..) => false, + TypeKind::Function(..) | TypeKind::Int(..) | TypeKind::Float(..) | diff --git a/tests/expectations/tests/call-conv-field.rs b/tests/expectations/tests/call-conv-field.rs index e9a4d873fa..d6aa9e4e31 100644 --- a/tests/expectations/tests/call-conv-field.rs +++ b/tests/expectations/tests/call-conv-field.rs @@ -5,17 +5,18 @@ #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Copy)] pub struct JNINativeInterface_ { pub GetVersion: ::std::option::Option ::std::os::raw::c_int>, + pub __hack: ::std::os::raw::c_ulonglong, } #[test] fn bindgen_test_layout_JNINativeInterface_() { - assert_eq!(::std::mem::size_of::() , 4usize , concat + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( "Size of: " , stringify ! ( JNINativeInterface_ ) )); - assert_eq! (::std::mem::align_of::() , 4usize , + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( "Alignment of " , stringify ! ( JNINativeInterface_ ) )); assert_eq! (unsafe { @@ -23,6 +24,11 @@ fn bindgen_test_layout_JNINativeInterface_() { const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( JNINativeInterface_ ) , "::" , stringify ! ( GetVersion ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const JNINativeInterface_ ) ) . __hack as * + const _ as usize } , 8usize , concat ! ( + "Alignment of field: " , stringify ! ( JNINativeInterface_ ) , + "::" , stringify ! ( __hack ) )); } impl Clone for JNINativeInterface_ { fn clone(&self) -> Self { *self } diff --git a/tests/expectations/tests/derive-fn-ptr.rs b/tests/expectations/tests/derive-fn-ptr.rs new file mode 100644 index 0000000000..b6a4f3516a --- /dev/null +++ b/tests/expectations/tests/derive-fn-ptr.rs @@ -0,0 +1,46 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub type my_fun_t = + ::std::option::Option; +#[repr(C)] +#[derive(Copy)] +pub struct Foo { + pub callback: my_fun_t, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 8usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Foo ) ) . callback as * const _ as usize + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Foo ) , "::" , + stringify ! ( callback ) )); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/headers/call-conv-field.h b/tests/headers/call-conv-field.h index b6d306ebd3..5702a09a2e 100644 --- a/tests/headers/call-conv-field.h +++ b/tests/headers/call-conv-field.h @@ -2,6 +2,8 @@ struct JNINativeInterface_ { int (__stdcall *GetVersion)(void *env); + unsigned long long __hack; // A hack so the field alignment is the same than + // for 64-bit, where we run CI. }; __stdcall void bar(); diff --git a/tests/headers/derive-fn-ptr.h b/tests/headers/derive-fn-ptr.h new file mode 100644 index 0000000000..39ff76d6f8 --- /dev/null +++ b/tests/headers/derive-fn-ptr.h @@ -0,0 +1,8 @@ +typedef void (*my_fun_t)(int, int, int, int, + int, int, int, int, + int, int, int, int, + int, int, int, int); + +struct Foo { + my_fun_t callback; +}; From 4c07a72f27cb729301c72df656c3f7d50d72b74f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 1 Mar 2017 18:16:34 +0100 Subject: [PATCH 0379/2291] tests: Mark the new test as unstable, since it seems to fail in 3.8. And I don't want nor have the time to debug it right now. --- tests/headers/call-conv-field.h | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/headers/call-conv-field.h b/tests/headers/call-conv-field.h index 5702a09a2e..310b5c32fb 100644 --- a/tests/headers/call-conv-field.h +++ b/tests/headers/call-conv-field.h @@ -1,4 +1,5 @@ // bindgen-flags: -- -target i686-pc-win32 +// bindgen-unstable struct JNINativeInterface_ { int (__stdcall *GetVersion)(void *env); From 0e76c8c51befe73fbbe9423d95bb96258853d1a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 3 Mar 2017 14:37:16 +0100 Subject: [PATCH 0380/2291] codegen: Don't pad union fields. Fixes #553 --- src/codegen/mod.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 120acefad3..fb07eaf8ed 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1136,9 +1136,11 @@ impl CodeGenerator for CompInfo { } }; - if let Some(padding_field) = - struct_layout.pad_field(&field_name, field_ty, field.offset()) { - fields.push(padding_field); + if !is_union { + if let Some(padding_field) = + struct_layout.pad_field(&field_name, field_ty, field.offset()) { + fields.push(padding_field); + } } let is_private = field.annotations() From 598ed63e9594539c863475d733fc38396b4e8764 Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Wed, 1 Mar 2017 23:49:02 +0200 Subject: [PATCH 0381/2291] objc: Use rust_name for the Type name Allows to disambiguate protocols and interfaces in whitelists --- src/ir/ty.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 329f4f5408..4608388155 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1268,6 +1268,7 @@ impl Type { CXType_ObjCInterface => { let interface = ObjCInterface::from_ty(&location.unwrap(), ctx) .expect("Not a valid objc interface?"); + name = interface.rust_name(); TypeKind::ObjCInterface(interface) } _ => { From 4067214465da14e4037be47088d5f0c97de1f9e3 Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Thu, 2 Mar 2017 00:59:58 +0200 Subject: [PATCH 0382/2291] objc: Implement tracing for ObjCInterface Follows all the method signatures --- src/ir/objc.rs | 14 ++++++++++++++ src/ir/ty.rs | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ir/objc.rs b/src/ir/objc.rs index 963c8e20a4..5c721243b3 100644 --- a/src/ir/objc.rs +++ b/src/ir/objc.rs @@ -2,6 +2,7 @@ use super::context::BindgenContext; use super::function::FunctionSig; +use super::traversal::{Trace, Tracer}; use clang; use clang_sys::CXChildVisit_Continue; use clang_sys::CXCursor_ObjCCategoryDecl; @@ -168,3 +169,16 @@ impl ObjCInstanceMethod { .join("") } } + +impl Trace for ObjCInterface { + type Extra = (); + + fn trace(&self, context: &BindgenContext, tracer: &mut T, _: &()) + where T: Tracer, + { + for method in &self.methods + { + method.signature.trace(context, tracer, &()); + } + } +} diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 4608388155..51652000e1 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1326,8 +1326,8 @@ impl Trace for Type { tracer.visit(id); } - TypeKind::ObjCInterface(_) => { - // TODO: + TypeKind::ObjCInterface(ref interface) => { + interface.trace(context, tracer, &()); } // None of these variants have edges to other items and types. From bd6fe14d6ac958985576798da47aaaab81180392 Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Sat, 4 Mar 2017 02:22:50 +0200 Subject: [PATCH 0383/2291] objc: Trace conforming protocols Keeps note of the ItemIds that the Objective C interface conforms to, and when tracing, visits also them. --- src/ir/objc.rs | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/ir/objc.rs b/src/ir/objc.rs index 5c721243b3..485bda8a56 100644 --- a/src/ir/objc.rs +++ b/src/ir/objc.rs @@ -1,14 +1,16 @@ //! Objective C types -use super::context::BindgenContext; +use super::context::{BindgenContext, ItemId}; use super::function::FunctionSig; use super::traversal::{Trace, Tracer}; +use super::ty::TypeKind; use clang; use clang_sys::CXChildVisit_Continue; use clang_sys::CXCursor_ObjCCategoryDecl; use clang_sys::CXCursor_ObjCClassRef; use clang_sys::CXCursor_ObjCInstanceMethodDecl; use clang_sys::CXCursor_ObjCProtocolDecl; +use clang_sys::CXCursor_ObjCProtocolRef; /// Objective C interface as used in TypeKind /// @@ -23,6 +25,8 @@ pub struct ObjCInterface { is_protocol: bool, + conforms_to: Vec, + /// List of the methods defined in this interfae methods: Vec, } @@ -47,6 +51,7 @@ impl ObjCInterface { name: name.to_owned(), category: None, is_protocol: false, + conforms_to: Vec::new(), methods: Vec::new(), } } @@ -98,6 +103,34 @@ impl ObjCInterface { interface.category = Some(cursor.spelling()); } } + CXCursor_ObjCProtocolRef => { + // Gather protocols this interface conforms to + let needle = format!("protocol_{}", c.spelling()); + let items_map = ctx.items(); + debug!("Interface {} conforms to {}, find the item", interface.name, needle); + + for (id, item) in items_map + { + if let Some(ty) = item.as_type() { + match *ty.kind() { + TypeKind::ObjCInterface(ref protocol) => { + if protocol.is_protocol + { + debug!("Checking protocol {}, ty.name {:?}", protocol.name, ty.name()); + if Some(needle.as_ref()) == ty.name() + { + debug!("Found conforming protocol {:?}", item); + interface.conforms_to.push(*id); + break; + } + } + } + _ => {} + } + } + } + + } CXCursor_ObjCInstanceMethodDecl => { let name = c.spelling(); let signature = @@ -176,9 +209,12 @@ impl Trace for ObjCInterface { fn trace(&self, context: &BindgenContext, tracer: &mut T, _: &()) where T: Tracer, { - for method in &self.methods - { + for method in &self.methods { method.signature.trace(context, tracer, &()); } + + for protocol in &self.conforms_to { + tracer.visit(*protocol); + } } } From 35159dc4f6decb6d00199aeca8630fbfe8fb5d53 Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Sat, 4 Mar 2017 22:12:11 +0200 Subject: [PATCH 0384/2291] objc: Whitelisting test --- tests/expectations/tests/objc_whitelist.rs | 25 ++++++++++++++++++++++ tests/headers/objc_whitelist.h | 22 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 tests/expectations/tests/objc_whitelist.rs create mode 100644 tests/headers/objc_whitelist.h diff --git a/tests/expectations/tests/objc_whitelist.rs b/tests/expectations/tests/objc_whitelist.rs new file mode 100644 index 0000000000..332453f1e0 --- /dev/null +++ b/tests/expectations/tests/objc_whitelist.rs @@ -0,0 +1,25 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#![cfg(target_os="macos")] + +#[macro_use] +extern crate objc; +#[allow(non_camel_case_types)] +pub type id = *mut objc::runtime::Object; +pub trait protocol_SomeProtocol { + unsafe fn protocolMethod(self); +} +impl protocol_SomeProtocol for id { + unsafe fn protocolMethod(self) { msg_send!(self , protocolMethod) } +} +pub trait WhitelistMe { + unsafe fn method(self); +} +impl WhitelistMe for id { + unsafe fn method(self) { msg_send!(self , method) } +} +pub trait WhitelistMe_InterestingCategory { } +impl WhitelistMe_InterestingCategory for id { } diff --git a/tests/headers/objc_whitelist.h b/tests/headers/objc_whitelist.h new file mode 100644 index 0000000000..7cbe43d696 --- /dev/null +++ b/tests/headers/objc_whitelist.h @@ -0,0 +1,22 @@ +// bindgen-flags: --objc-extern-crate --whitelist-type WhitelistMe --whitelist-type WhitelistMe_InterestingCategory -- -x objective-c +// bindgen-osx-only + + +// Protocol should be included, since it is used by the WhitelistMe +@protocol SomeProtocol +-(void)protocolMethod; +@end + +// The whitelisted item +@interface WhitelistMe +-(void)method; +@end + +// This was also explicitly whitelisted +@interface WhitelistMe (InterestingCategory) +@end + +// This was not automatically whitelisted +@interface WhitelistMe (IgnoredCategory) +@end + From 4f1e3da8502100c63e9708107a9a13e77ca86f11 Mon Sep 17 00:00:00 2001 From: Tristan Bruns Date: Sun, 5 Mar 2017 14:21:24 +0100 Subject: [PATCH 0385/2291] Use c_schar instead of c_char The signedness of the C type 'char' is implementation defined. The rust type c_schar exists for this reason. Use it. --- src/codegen/mod.rs | 2 +- tests/expectations/tests/arg_keyword.rs | 2 +- tests/expectations/tests/bitfield-enum-basic.rs | 2 +- tests/expectations/tests/class.rs | 16 ++++++++-------- tests/expectations/tests/class_with_typedef.rs | 2 +- tests/expectations/tests/constant-evaluate.rs | 4 ++-- .../tests/inline_namespace_whitelist.rs | 2 +- tests/expectations/tests/issue-493.rs | 2 +- tests/expectations/tests/layout.rs | 2 +- tests/expectations/tests/layout_array.rs | 2 +- tests/expectations/tests/layout_cmdline_token.rs | 6 +++--- tests/expectations/tests/layout_kni_mbuf.rs | 10 +++++----- tests/expectations/tests/objc_method.rs | 4 ++-- tests/expectations/tests/overloading.rs | 2 +- tests/expectations/tests/struct_with_packing.rs | 2 +- .../expectations/tests/union_with_big_member.rs | 2 +- tests/expectations/tests/variadic-method.rs | 4 ++-- 17 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index fb07eaf8ed..77941fa34f 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2138,7 +2138,7 @@ impl ToRustTy for Type { TypeKind::Int(ik) => { match ik { IntKind::Bool => aster::ty::TyBuilder::new().bool(), - IntKind::Char => raw_type(ctx, "c_char"), + IntKind::Char => raw_type(ctx, "c_schar"), IntKind::UChar => raw_type(ctx, "c_uchar"), IntKind::Short => raw_type(ctx, "c_short"), IntKind::UShort => raw_type(ctx, "c_ushort"), diff --git a/tests/expectations/tests/arg_keyword.rs b/tests/expectations/tests/arg_keyword.rs index cb1cc4327a..23818328c4 100644 --- a/tests/expectations/tests/arg_keyword.rs +++ b/tests/expectations/tests/arg_keyword.rs @@ -6,5 +6,5 @@ extern "C" { #[link_name = "_Z3fooPKc"] - pub fn foo(type_: *const ::std::os::raw::c_char); + pub fn foo(type_: *const ::std::os::raw::c_schar); } diff --git a/tests/expectations/tests/bitfield-enum-basic.rs b/tests/expectations/tests/bitfield-enum-basic.rs index 362cf28030..a3eb0d7ad8 100644 --- a/tests/expectations/tests/bitfield-enum-basic.rs +++ b/tests/expectations/tests/bitfield-enum-basic.rs @@ -33,7 +33,7 @@ impl ::std::ops::BitOr for Buz { } #[repr(C)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub struct Buz(pub ::std::os::raw::c_char); +pub struct Buz(pub ::std::os::raw::c_schar); pub const NS_FOO: _bindgen_ty_1 = _bindgen_ty_1(1); pub const NS_BAR: _bindgen_ty_1 = _bindgen_ty_1(2); impl ::std::ops::BitOr<_bindgen_ty_1> for _bindgen_ty_1 { diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index 92389cbefa..3ed5edd243 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -64,7 +64,7 @@ impl ::std::fmt::Debug for __BindgenUnionField { #[repr(C)] pub struct C { pub a: ::std::os::raw::c_int, - pub big_array: [::std::os::raw::c_char; 33usize], + pub big_array: [::std::os::raw::c_schar; 33usize], } #[test] fn bindgen_test_layout_C() { @@ -88,8 +88,8 @@ impl Default for C { #[repr(C)] pub struct C_with_zero_length_array { pub a: ::std::os::raw::c_int, - pub big_array: [::std::os::raw::c_char; 33usize], - pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>, + pub big_array: [::std::os::raw::c_schar; 33usize], + pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_schar>, } #[test] fn bindgen_test_layout_C_with_zero_length_array() { @@ -124,8 +124,8 @@ impl Default for C_with_zero_length_array { #[repr(C)] pub struct C_with_incomplete_array { pub a: ::std::os::raw::c_int, - pub big_array: [::std::os::raw::c_char; 33usize], - pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>, + pub big_array: [::std::os::raw::c_schar; 33usize], + pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_schar>, } #[test] fn bindgen_test_layout_C_with_incomplete_array() { @@ -142,9 +142,9 @@ impl Default for C_with_incomplete_array { #[repr(C)] pub struct C_with_zero_length_array_and_incomplete_array { pub a: ::std::os::raw::c_int, - pub big_array: [::std::os::raw::c_char; 33usize], - pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>, - pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>, + pub big_array: [::std::os::raw::c_schar; 33usize], + pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_schar>, + pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_schar>, } #[test] fn bindgen_test_layout_C_with_zero_length_array_and_incomplete_array() { diff --git a/tests/expectations/tests/class_with_typedef.rs b/tests/expectations/tests/class_with_typedef.rs index 1a92b98603..03822233ff 100644 --- a/tests/expectations/tests/class_with_typedef.rs +++ b/tests/expectations/tests/class_with_typedef.rs @@ -15,7 +15,7 @@ pub struct C { pub other_ptr: *mut AnotherInt, } pub type C_MyInt = ::std::os::raw::c_int; -pub type C_Lookup = *const ::std::os::raw::c_char; +pub type C_Lookup = *const ::std::os::raw::c_schar; #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 72usize , concat ! ( diff --git a/tests/expectations/tests/constant-evaluate.rs b/tests/expectations/tests/constant-evaluate.rs index cdf097a2d8..ae0570ea7f 100644 --- a/tests/expectations/tests/constant-evaluate.rs +++ b/tests/expectations/tests/constant-evaluate.rs @@ -14,7 +14,7 @@ pub const k: EasyToOverflow = 2147483648; pub const k_expr: EasyToOverflow = 0; pub const BAZ: ::std::os::raw::c_longlong = 24; pub const fuzz: f64 = 51.; -pub const BAZZ: ::std::os::raw::c_char = 53; -pub const WAT: ::std::os::raw::c_char = 0; +pub const BAZZ: ::std::os::raw::c_schar = 53; +pub const WAT: ::std::os::raw::c_schar = 0; pub const bytestring: &'static [u8; 4usize] = b"Foo\x00"; pub const NOT_UTF8: [u8; 5usize] = [240, 40, 140, 40, 0]; diff --git a/tests/expectations/tests/inline_namespace_whitelist.rs b/tests/expectations/tests/inline_namespace_whitelist.rs index 9b8f87a5cf..d3a9d95855 100644 --- a/tests/expectations/tests/inline_namespace_whitelist.rs +++ b/tests/expectations/tests/inline_namespace_whitelist.rs @@ -10,6 +10,6 @@ pub mod root { pub mod std { #[allow(unused_imports)] use self::super::super::root; - pub type string = *const ::std::os::raw::c_char; + pub type string = *const ::std::os::raw::c_schar; } } diff --git a/tests/expectations/tests/issue-493.rs b/tests/expectations/tests/issue-493.rs index f8814bd396..a2246ca6a3 100644 --- a/tests/expectations/tests/issue-493.rs +++ b/tests/expectations/tests/issue-493.rs @@ -37,7 +37,7 @@ pub struct basic_string<_CharT, _Traits, _Allocator> { pub _phantom_2: ::std::marker::PhantomData<_Allocator>, } pub type basic_string_size_type = ::std::os::raw::c_ulonglong; -pub type basic_string_value_type = ::std::os::raw::c_char; +pub type basic_string_value_type = ::std::os::raw::c_schar; pub type basic_string_pointer = *mut basic_string_value_type; #[repr(C)] #[derive(Debug, Copy, Clone)] diff --git a/tests/expectations/tests/layout.rs b/tests/expectations/tests/layout.rs index 115a108a2e..d074867284 100644 --- a/tests/expectations/tests/layout.rs +++ b/tests/expectations/tests/layout.rs @@ -40,7 +40,7 @@ impl ::std::marker::Copy for __IncompleteArrayField { } #[repr(C, packed)] #[derive(Debug, Default, Copy)] pub struct header { - pub proto: ::std::os::raw::c_char, + pub proto: ::std::os::raw::c_schar, pub size: ::std::os::raw::c_uint, pub data: __IncompleteArrayField<::std::os::raw::c_uchar>, pub __bindgen_padding_0: [u8; 11usize], diff --git a/tests/expectations/tests/layout_array.rs b/tests/expectations/tests/layout_array.rs index 2cc8578519..eedc32b274 100644 --- a/tests/expectations/tests/layout_array.rs +++ b/tests/expectations/tests/layout_array.rs @@ -58,7 +58,7 @@ pub type rte_mempool_get_count = #[derive(Debug, Copy)] pub struct rte_mempool_ops { /**< Name of mempool ops struct. */ - pub name: [::std::os::raw::c_char; 32usize], + pub name: [::std::os::raw::c_schar; 32usize], /**< Allocate private data. */ pub alloc: rte_mempool_alloc_t, /**< Free the external pool. */ diff --git a/tests/expectations/tests/layout_cmdline_token.rs b/tests/expectations/tests/layout_cmdline_token.rs index 791ea9b3e2..c2b10455c3 100644 --- a/tests/expectations/tests/layout_cmdline_token.rs +++ b/tests/expectations/tests/layout_cmdline_token.rs @@ -64,7 +64,7 @@ pub struct cmdline_token_ops { pub parse: ::std::option::Option ::std::os::raw::c_int>, @@ -88,7 +88,7 @@ pub struct cmdline_token_ops { pub get_help: ::std::option::Option ::std::os::raw::c_int>, diff --git a/tests/expectations/tests/layout_kni_mbuf.rs b/tests/expectations/tests/layout_kni_mbuf.rs index d704267dee..209be0f129 100644 --- a/tests/expectations/tests/layout_kni_mbuf.rs +++ b/tests/expectations/tests/layout_kni_mbuf.rs @@ -11,22 +11,22 @@ pub const RTE_CACHE_LINE_SIZE: ::std::os::raw::c_uint = 64; pub struct rte_kni_mbuf { pub buf_addr: *mut ::std::os::raw::c_void, pub buf_physaddr: u64, - pub pad0: [::std::os::raw::c_char; 2usize], + pub pad0: [::std::os::raw::c_schar; 2usize], /**< Start address of data in segment buffer. */ pub data_off: u16, - pub pad1: [::std::os::raw::c_char; 2usize], + pub pad1: [::std::os::raw::c_schar; 2usize], /**< Number of segments. */ pub nb_segs: u8, - pub pad4: [::std::os::raw::c_char; 1usize], + pub pad4: [::std::os::raw::c_schar; 1usize], /**< Offload features. */ pub ol_flags: u64, - pub pad2: [::std::os::raw::c_char; 4usize], + pub pad2: [::std::os::raw::c_schar; 4usize], /**< Total pkt len: sum of all segment data_len. */ pub pkt_len: u32, /**< Amount of data in segment buffer. */ pub data_len: u16, pub __bindgen_padding_0: [u8; 22usize], - pub pad3: [::std::os::raw::c_char; 8usize], + pub pad3: [::std::os::raw::c_schar; 8usize], pub pool: *mut ::std::os::raw::c_void, pub next: *mut ::std::os::raw::c_void, pub __bindgen_padding_1: [u64; 5usize], diff --git a/tests/expectations/tests/objc_method.rs b/tests/expectations/tests/objc_method.rs index d0342a2129..c9b9504f39 100644 --- a/tests/expectations/tests/objc_method.rs +++ b/tests/expectations/tests/objc_method.rs @@ -20,7 +20,7 @@ pub trait Foo { unsafe fn methodWithArg1_andArg2_andArg3_(self, intvalue: ::std::os::raw::c_int, ptr: - *mut ::std::os::raw::c_char, + *mut ::std::os::raw::c_schar, floatvalue: f32); } impl Foo for id { @@ -40,7 +40,7 @@ impl Foo for id { unsafe fn methodWithArg1_andArg2_andArg3_(self, intvalue: ::std::os::raw::c_int, ptr: - *mut ::std::os::raw::c_char, + *mut ::std::os::raw::c_schar, floatvalue: f32) { msg_send!(self , methodWithArg1:intvalue andArg2:ptr andArg3:floatvalue ) diff --git a/tests/expectations/tests/overloading.rs b/tests/expectations/tests/overloading.rs index 71002e23bc..99efe496d5 100644 --- a/tests/expectations/tests/overloading.rs +++ b/tests/expectations/tests/overloading.rs @@ -6,7 +6,7 @@ extern "C" { #[link_name = "_Z8Evaluatec"] - pub fn Evaluate(r: ::std::os::raw::c_char) -> bool; + pub fn Evaluate(r: ::std::os::raw::c_schar) -> bool; } extern "C" { #[link_name = "_Z8Evaluateii"] diff --git a/tests/expectations/tests/struct_with_packing.rs b/tests/expectations/tests/struct_with_packing.rs index cba3d4759e..293cc5342f 100644 --- a/tests/expectations/tests/struct_with_packing.rs +++ b/tests/expectations/tests/struct_with_packing.rs @@ -7,7 +7,7 @@ #[repr(C, packed)] #[derive(Debug, Default, Copy)] pub struct a { - pub b: ::std::os::raw::c_char, + pub b: ::std::os::raw::c_schar, pub c: ::std::os::raw::c_short, } #[test] diff --git a/tests/expectations/tests/union_with_big_member.rs b/tests/expectations/tests/union_with_big_member.rs index 2b7a8eefd3..0a11b8bc1e 100644 --- a/tests/expectations/tests/union_with_big_member.rs +++ b/tests/expectations/tests/union_with_big_member.rs @@ -62,7 +62,7 @@ impl Default for WithBigArray { #[derive(Debug, Default, Copy)] pub struct WithBigArray2 { pub a: __BindgenUnionField<::std::os::raw::c_int>, - pub b: __BindgenUnionField<[::std::os::raw::c_char; 33usize]>, + pub b: __BindgenUnionField<[::std::os::raw::c_schar; 33usize]>, pub bindgen_union_field: [u32; 9usize], } #[test] diff --git a/tests/expectations/tests/variadic-method.rs b/tests/expectations/tests/variadic-method.rs index 542e1e75b4..6241c2cb80 100644 --- a/tests/expectations/tests/variadic-method.rs +++ b/tests/expectations/tests/variadic-method.rs @@ -6,7 +6,7 @@ extern "C" { #[link_name = "_Z3fooPKcz"] - pub fn foo(fmt: *const ::std::os::raw::c_char, ...); + pub fn foo(fmt: *const ::std::os::raw::c_schar, ...); } #[repr(C)] #[derive(Debug, Default, Copy)] @@ -22,7 +22,7 @@ fn bindgen_test_layout_Bar() { } extern "C" { #[link_name = "_ZN3Bar3fooEPKcz"] - pub fn Bar_foo(this: *mut Bar, fmt: *const ::std::os::raw::c_char, ...); + pub fn Bar_foo(this: *mut Bar, fmt: *const ::std::os::raw::c_schar, ...); } impl Clone for Bar { fn clone(&self) -> Self { *self } From 7463229c6c337a34413f858aa26120d4ab9c4385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 5 Mar 2017 18:17:09 +0100 Subject: [PATCH 0386/2291] Bump to v0.22.1 There've been no breaking changes in v0.22.0..HEAD, only a bunch of bugfixes. --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 089e0f242d..70c29b75e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ [root] name = "bindgen" -version = "0.22.0" +version = "0.22.1" dependencies = [ "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index a9521be507..d0e5011a6f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.22.0" +version = "0.22.1" build = "build.rs" exclude = ["tests/headers", "tests/expectations", "bindgen-integration", "ci"] From 620a0691912b54595d8217d96063c843efbc1c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kornel=20Lesin=CC=81ski?= Date: Mon, 6 Mar 2017 11:52:03 +0000 Subject: [PATCH 0387/2291] Run without logging feature --- src/log_stubs.rs | 6 +++--- src/main.rs | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/log_stubs.rs b/src/log_stubs.rs index 4262e12040..4a72d9a5ea 100644 --- a/src/log_stubs.rs +++ b/src/log_stubs.rs @@ -1,12 +1,12 @@ macro_rules! log { - (target: $target:expr, $lvl:expr, $($arg)+) => { + (target: $target:expr, $lvl:expr, $($arg:tt)+) => { let _ = $target; let _ = log!($lvl, $($arg)+); }; - ($lvl:expr, $($arg:tt)+) => { + ($lvl:expr, $($arg:tt)+) => {{ let _ = $lvl; let _ = format_args!($($arg)+); - }; + }}; } macro_rules! error { (target: $target:expr, $($arg:tt)*) => { log!($target, $($arg)*); }; diff --git a/src/main.rs b/src/main.rs index df596e0b93..2ba2b1394a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,8 @@ extern crate bindgen; +#[cfg(feature="logging")] extern crate env_logger; #[macro_use] +#[cfg(feature="logging")] extern crate log; extern crate clang_sys; extern crate clap; @@ -10,10 +12,15 @@ use bindgen::clang_version; use std::env; use std::panic; +#[macro_use] +#[cfg(not(feature="logging"))] +mod log_stubs; + mod options; use options::builder_from_flags; pub fn main() { + #[cfg(feature="logging")] log::set_logger(|max_log_level| { use env_logger::Logger; let env_logger = Logger::new(); From 5982cd3dc3a4f356131f6c10939d3890f0c05e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 3 Mar 2017 03:39:06 +0100 Subject: [PATCH 0388/2291] codegen: Don't assume unsized structs have address. Per C semantics, they may not. --- src/codegen/mod.rs | 22 +++++++++++++------- tests/expectations/tests/c-empty-layout.rs | 20 ++++++++++++++++++ tests/expectations/tests/cpp-empty-layout.rs | 21 +++++++++++++++++++ tests/headers/c-empty-layout.h | 1 + tests/headers/cpp-empty-layout.hpp | 1 + 5 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 tests/expectations/tests/c-empty-layout.rs create mode 100644 tests/expectations/tests/cpp-empty-layout.rs create mode 100644 tests/headers/c-empty-layout.h create mode 100644 tests/headers/cpp-empty-layout.hpp diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 77941fa34f..99324bc6ac 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1286,17 +1286,25 @@ impl CodeGenerator for CompInfo { } } - // C requires every struct to be addressable, so what C compilers do is - // making the struct 1-byte sized. + // C++ requires every struct to be addressable, so what C++ compilers do + // is making the struct 1-byte sized. + // + // This is apparently not the case for C, see: + // https://github.com/servo/rust-bindgen/issues/551 + // + // Just get the layout, and assume C++ if not. // // NOTE: This check is conveniently here to avoid the dummy fields we // may add for unused template parameters. if self.is_unsized(ctx) { - let ty = BlobTyBuilder::new(Layout::new(1, 1)).build(); - let field = StructFieldBuilder::named("_address") - .pub_() - .build_ty(ty); - fields.push(field); + let has_address = layout.map_or(true, |l| l.size != 0); + if has_address { + let ty = BlobTyBuilder::new(Layout::new(1, 1)).build(); + let field = StructFieldBuilder::named("_address") + .pub_() + .build_ty(ty); + fields.push(field); + } } // Append any extra template arguments that nobody has used so far. diff --git a/tests/expectations/tests/c-empty-layout.rs b/tests/expectations/tests/c-empty-layout.rs new file mode 100644 index 0000000000..7dc16d489f --- /dev/null +++ b/tests/expectations/tests/c-empty-layout.rs @@ -0,0 +1,20 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct Foo { +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 0usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/cpp-empty-layout.rs b/tests/expectations/tests/cpp-empty-layout.rs new file mode 100644 index 0000000000..fbeb3d5e52 --- /dev/null +++ b/tests/expectations/tests/cpp-empty-layout.rs @@ -0,0 +1,21 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct Foo { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/c-empty-layout.h b/tests/headers/c-empty-layout.h new file mode 100644 index 0000000000..1fe02e8978 --- /dev/null +++ b/tests/headers/c-empty-layout.h @@ -0,0 +1 @@ +struct Foo {}; diff --git a/tests/headers/cpp-empty-layout.hpp b/tests/headers/cpp-empty-layout.hpp new file mode 100644 index 0000000000..1fe02e8978 --- /dev/null +++ b/tests/headers/cpp-empty-layout.hpp @@ -0,0 +1 @@ +struct Foo {}; From 839e97768a0429a94aa54c830445c4b2480c3187 Mon Sep 17 00:00:00 2001 From: Simkha Date: Tue, 7 Mar 2017 13:15:01 +0600 Subject: [PATCH 0389/2291] fix clang installation instruction for debian os --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f1a85cecb7..9c219ef566 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ $ port install clang-3.9 ##### Debian-based Linuxes ``` -# apt-get install llvm-3.9-dev libclang-3.9-dev +# apt-get install llvm-3.9-dev libclang-3.9-dev clang-3.9 ``` Ubuntu 16.10 provides the necessary packages directly. If you are using older From 1c4332a1aa3dd299c133f72efb8b28dd5c8aa9d4 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 15 Feb 2017 14:43:38 -0800 Subject: [PATCH 0390/2291] Completely rework templates * Find each item's used template parameters when we begin the codegen phase * Add TemplateDeclaration::used_template_params() This method is available during the codegen phase, and uses the information gleaned by the `ir::named::UsedTemplateParameters` analysis. * Remove Item::{applicable_template_args,signature_contains_named_type} They are replaced by the template parameter usage analysis and TemplateDeclaration::used_template_params. * Parse and de-duplicate named template type parameters * Do not attempt to determine template parameter usage when not recursively whitelisting * Add a proper TemplateInstantiation type This makes it so that CompInfo is always either a compound type definition, or a template compound type definition, never an instantiation of a template. It also pulls out TypeKind::TemplateInstantiation() to a proper ir::TemplateInstantiation type, and TypeKind::TemplateInstantiation just wraps ir::TemplateInstantiation into TypeKind. * Allow template definitions to lack template parameters because of opaque template definitions * Detect and ignore cycles deriving Copy/Debug and whether a type has a vtable * Bail out early in the face of partial template specialization We don't support it, and shouldn't continue trying to parse a type from this cursor. * Do not consider inner type's parameter usage as our own parameter usage * Do not require a parent_id for template instantiations It is not necessary, and in fact was preventing us from creating template instantiations in some places, resulting in such nonsense as a generic template definition as a base for another type. * Only join if this is NOT a named template type or a template instantiation Otherwise, we'll always consider all of a template instantiation's arguments as used, when they should only be considered used if the template definition uses that template parameter. * Consider function return and parameter types as used Although we should not follow class method edges because we cannot create new monomorphizations of methods, code can create aliases of function pointers whose return or parameter types are template parameters, and those template parameters should be considered used. * Add the AsNamed trait for things which might be a named template type This sees through ResolvedTypeReferences to get at the final named type and its canonical item id. By using this in the named template parameter usage analysis, we ensure we don't have bugs where there are ResolvedTypeReferences in the usage sets rather than the canonical named item id, which could cause template parameters to be ignored accidentally. * Do not consider an inner var's template parameter usage as our own * Make the expectations' tests less noisy * Use opaque blobs for unknown template definition types When we don't know how to generate a Rust type from a template definition (eg because it uses non-type template parameters), then we should fall back to using the instantiation's layout to generate the opaque blob. * Implement CanDeriveDebug for TemplateInstantiation We need the template instantiation's layout to determine if we can derive debug for it when the instantiation's template definition has non-type parameters. * Stop thrashing malloc when unioning ItemSets in UsedTemplateParameters Previously, we were cloning an ItemSet, which requires a malloc for non-empty sets, when taking its union with our current id's set. Now, instead of doing that, we wrap each ItemSet in an Option, and take the set out of the hash map when modifying it. This allows us to side-step the borrow checker and HashMap's lack of an analog to `slice::split_at_mut` and mutate what is logically a value in the hash map while also using immutable references of values that are physically in the hash map. * Add some tests explicitly about template parameter usage * Updated test expectations now that we are inferring template parameter usage * Reinstate the layout tests for template instantiations * Generate opaque blobs for uses of partially specialized templates This adds `TypeKind::Opaque` which signifies that we do not understand anything about the given type and that we should just generate an opaque blob based on the type's layout. It explicitly uses the opaque type kind for partially specialized templates. * Add note about None vs Some([]) in TemplateDeclaration * Do not rely on TypeKind implementing PartialEq * Prefer assert_eq!(lhs, rhs) to assert!(lhs == rhs) * Expand some comments for ir::named::UsedTemplateParameters * Expand Item::is_opaque to consider TypeKind::Opaque * Use opaque types instead of panicking Use opaque types as our last resort when resolving type references after we have collected unresolved type references instead of panicking. * Find template definitions that don't want to be found * Recognize associated template types and make them opaque --- src/clang.rs | 48 +- src/codegen/mod.rs | 280 +++-- src/codegen/struct_layout.rs | 61 +- src/ir/comp.rs | 181 +-- src/ir/context.rs | 169 ++- src/ir/dot.rs | 24 +- src/ir/enum_ty.rs | 4 +- src/ir/function.rs | 33 +- src/ir/item.rs | 581 +++++----- src/ir/item_kind.rs | 15 +- src/ir/layout.rs | 17 +- src/ir/mod.rs | 1 + src/ir/module.rs | 13 +- src/ir/named.rs | 204 ++-- src/ir/template.rs | 193 +++ src/ir/traversal.rs | 2 +- src/ir/ty.rs | 1031 +++++++++-------- src/ir/var.rs | 13 +- src/parse.rs | 26 +- src/uses.rs | 7 +- tests/expectations/lib.rs | 3 + .../expectations/tests/381-decltype-alias.rs | 9 +- tests/expectations/tests/anon_enum_trait.rs | 8 +- tests/expectations/tests/anon_union.rs | 34 +- tests/expectations/tests/auto.rs | 8 +- .../bad-namespace-parenthood-inheritance.rs | 8 +- tests/expectations/tests/class_nested.rs | 2 +- tests/expectations/tests/class_with_dtor.rs | 2 +- .../tests/constant-non-specialized-tp.rs | 19 +- tests/expectations/tests/constructor-tp.rs | 8 +- tests/expectations/tests/crtp.rs | 43 +- tests/expectations/tests/dash_language.rs | 8 +- .../tests/empty_template_param_name.rs | 8 +- .../tests/enum_in_template_with_typedef.rs | 8 +- .../tests/eval-variadic-template-parameter.rs | 8 +- .../tests/forward-inherit-struct.rs | 13 +- tests/expectations/tests/in_class_typedef.rs | 11 +- .../expectations/tests/inherit-namespaced.rs | 13 +- tests/expectations/tests/inherit_named.rs | 8 +- .../expectations/tests/inner_template_self.rs | 10 +- tests/expectations/tests/issue-358.rs | 5 +- tests/expectations/tests/issue-446.rs | 12 +- tests/expectations/tests/issue-493.rs | 85 +- .../tests/issue-544-stylo-creduce-2.rs | 15 + .../tests/issue-544-stylo-creduce.rs | 14 + .../tests/maddness-is-avoidable.rs | 18 +- tests/expectations/tests/no_copy.rs | 8 +- tests/expectations/tests/opaque_pointer.rs | 7 +- tests/expectations/tests/opaque_typedef.rs | 10 +- .../partial-specialization-and-inheritance.rs | 44 + tests/expectations/tests/replace_use.rs | 10 +- tests/expectations/tests/size_t_template.rs | 4 - .../tests/struct_with_typedef_template_arg.rs | 9 +- tests/expectations/tests/template-fun-ty.rs | 26 +- .../tests/template-param-usage-0.rs | 14 + .../tests/template-param-usage-1.rs | 11 + .../tests/template-param-usage-10.rs | 25 + .../tests/template-param-usage-11.rs | 11 + .../tests/template-param-usage-12.rs | 23 + .../tests/template-param-usage-13.rs | 20 + .../tests/template-param-usage-14.rs | 20 + .../tests/template-param-usage-15.rs | 23 + .../tests/template-param-usage-2.rs | 22 + .../tests/template-param-usage-3.rs | 24 + .../tests/template-param-usage-4.rs | 19 + .../tests/template-param-usage-5.rs | 15 + .../tests/template-param-usage-6.rs | 12 + .../tests/template-param-usage-7.rs | 16 + .../tests/template-param-usage-8.rs | 17 + .../tests/template-param-usage-9.rs | 22 + tests/expectations/tests/template.rs | 63 +- .../template_typedef_transitive_param.rs | 8 +- tests/expectations/tests/template_typedefs.rs | 9 +- .../expectations/tests/templateref_opaque.rs | 18 +- tests/expectations/tests/typeref.rs | 15 +- tests/expectations/tests/union_template.rs | 21 +- .../tests/variadic_template_function.rs | 8 +- tests/expectations/tests/what_is_going_on.rs | 7 +- tests/expectations/tests/whitelist_basic.rs | 1 - tests/headers/issue-544-stylo-creduce-2.hpp | 8 + tests/headers/issue-544-stylo-creduce.hpp | 5 + ...partial-specialization-and-inheritance.hpp | 40 + tests/headers/template-param-usage-0.hpp | 6 + tests/headers/template-param-usage-1.hpp | 6 + tests/headers/template-param-usage-10.hpp | 14 + tests/headers/template-param-usage-11.hpp | 6 + tests/headers/template-param-usage-12.hpp | 11 + tests/headers/template-param-usage-13.hpp | 11 + tests/headers/template-param-usage-14.hpp | 11 + tests/headers/template-param-usage-15.hpp | 11 + tests/headers/template-param-usage-2.hpp | 10 + tests/headers/template-param-usage-3.hpp | 12 + tests/headers/template-param-usage-4.hpp | 11 + tests/headers/template-param-usage-5.hpp | 8 + tests/headers/template-param-usage-6.hpp | 8 + tests/headers/template-param-usage-7.hpp | 10 + tests/headers/template-param-usage-8.hpp | 10 + tests/headers/template-param-usage-9.hpp | 12 + 98 files changed, 2436 insertions(+), 1619 deletions(-) create mode 100644 src/ir/template.rs mode change 100644 => 100755 tests/expectations/lib.rs create mode 100644 tests/expectations/tests/issue-544-stylo-creduce-2.rs create mode 100644 tests/expectations/tests/issue-544-stylo-creduce.rs create mode 100644 tests/expectations/tests/partial-specialization-and-inheritance.rs create mode 100644 tests/expectations/tests/template-param-usage-0.rs create mode 100644 tests/expectations/tests/template-param-usage-1.rs create mode 100644 tests/expectations/tests/template-param-usage-10.rs create mode 100644 tests/expectations/tests/template-param-usage-11.rs create mode 100644 tests/expectations/tests/template-param-usage-12.rs create mode 100644 tests/expectations/tests/template-param-usage-13.rs create mode 100644 tests/expectations/tests/template-param-usage-14.rs create mode 100644 tests/expectations/tests/template-param-usage-15.rs create mode 100644 tests/expectations/tests/template-param-usage-2.rs create mode 100644 tests/expectations/tests/template-param-usage-3.rs create mode 100644 tests/expectations/tests/template-param-usage-4.rs create mode 100644 tests/expectations/tests/template-param-usage-5.rs create mode 100644 tests/expectations/tests/template-param-usage-6.rs create mode 100644 tests/expectations/tests/template-param-usage-7.rs create mode 100644 tests/expectations/tests/template-param-usage-8.rs create mode 100644 tests/expectations/tests/template-param-usage-9.rs create mode 100644 tests/headers/issue-544-stylo-creduce-2.hpp create mode 100644 tests/headers/issue-544-stylo-creduce.hpp create mode 100644 tests/headers/partial-specialization-and-inheritance.hpp create mode 100644 tests/headers/template-param-usage-0.hpp create mode 100644 tests/headers/template-param-usage-1.hpp create mode 100644 tests/headers/template-param-usage-10.hpp create mode 100644 tests/headers/template-param-usage-11.hpp create mode 100644 tests/headers/template-param-usage-12.hpp create mode 100644 tests/headers/template-param-usage-13.hpp create mode 100644 tests/headers/template-param-usage-14.hpp create mode 100644 tests/headers/template-param-usage-15.hpp create mode 100644 tests/headers/template-param-usage-2.hpp create mode 100644 tests/headers/template-param-usage-3.hpp create mode 100644 tests/headers/template-param-usage-4.hpp create mode 100644 tests/headers/template-param-usage-5.hpp create mode 100644 tests/headers/template-param-usage-6.hpp create mode 100644 tests/headers/template-param-usage-7.hpp create mode 100644 tests/headers/template-param-usage-8.hpp create mode 100644 tests/headers/template-param-usage-9.hpp diff --git a/src/clang.rs b/src/clang.rs index 5e2ab3af88..b8086d9943 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -6,6 +6,7 @@ use cexpr; use clang_sys::*; +use regex; use std::{mem, ptr, slice}; use std::ffi::{CStr, CString}; use std::fmt; @@ -126,11 +127,11 @@ impl Cursor { } /// Return the number of template arguments used by this cursor's referent, - /// if the referent is either a template specialization or declaration. - /// Returns `None` otherwise. + /// if the referent is either a template instantiation. Returns `None` + /// otherwise. /// - /// NOTE: This may not return `Some` for some non-fully specialized - /// templates, see #193 and #194. + /// NOTE: This may not return `Some` for partial template specializations, + /// see #193 and #194. pub fn num_template_args(&self) -> Option { // XXX: `clang_Type_getNumTemplateArguments` is sort of reliable, while // `clang_Cursor_getNumTemplateArguments` is totally unreliable. @@ -302,7 +303,11 @@ impl Cursor { x: clang_getCursorDefinition(self.x), }; - if ret.is_valid() { Some(ret) } else { None } + if ret.is_valid() && ret.kind() != CXCursor_NoDeclFound { + Some(ret) + } else { + None + } } } @@ -331,8 +336,9 @@ impl Cursor { } } - /// Given that this cursor points to a template specialization, get a cursor - /// pointing to the template definition that is being specialized. + /// Given that this cursor points to either a template specialization or a + /// template instantiation, get a cursor pointing to the template definition + /// that is being specialized. pub fn specialized(&self) -> Option { unsafe { let ret = Cursor { @@ -895,8 +901,8 @@ impl Type { self.is_valid() && self.kind() != CXType_Unexposed } - /// Is this type a fully specialized template? - pub fn is_fully_specialized_template(&self) -> bool { + /// Is this type a fully instantiated template? + pub fn is_fully_instantiated_template(&self) -> bool { // Yep, the spelling of this containing type-parameter is extremely // nasty... But can happen in . Unfortunately I couldn't // reduce it enough :( @@ -908,6 +914,30 @@ impl Type { _ => true, } } + + /// Is this type an associated template type? Eg `T::Associated` in + /// this example: + /// + /// ```c++ + /// template + /// class Foo { + /// typename T::Associated member; + /// }; + /// ``` + pub fn is_associated_type(&self) -> bool { + // This is terrible :( + fn hacky_parse_associated_type>(spelling: S) -> bool { + lazy_static! { + static ref ASSOC_TYPE_RE: regex::Regex = + regex::Regex::new(r"typename type\-parameter\-\d+\-\d+::.+").unwrap(); + } + ASSOC_TYPE_RE.is_match(spelling.as_ref()) + } + + self.kind() == CXType_Unexposed && + (hacky_parse_associated_type(self.spelling()) || + hacky_parse_associated_type(self.canonical_type().spelling())) + } } /// The `CanonicalTypeDeclaration` type exists as proof-by-construction that its diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 77941fa34f..7bc8985b04 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2,8 +2,8 @@ mod helpers; mod struct_layout; use self::helpers::{BlobTyBuilder, attributes}; +use self::struct_layout::{StructLayoutTracker, bytes_from_bits_pow2}; use self::struct_layout::{align_to, bytes_from_bits}; -use self::struct_layout::{bytes_from_bits_pow2, StructLayoutTracker}; use aster; use ir::annotations::FieldAccessorKind; @@ -20,7 +20,8 @@ use ir::item_kind::ItemKind; use ir::layout::Layout; use ir::module::Module; use ir::objc::ObjCInterface; -use ir::ty::{Type, TypeKind}; +use ir::template::{AsNamed, TemplateInstantiation}; +use ir::ty::{TemplateDeclaration, Type, TypeKind}; use ir::var::Var; use std::borrow::Cow; @@ -137,11 +138,6 @@ impl<'a> CodegenResult<'a> { } } - fn next_id(&mut self) -> usize { - self.codegen_id.set(self.codegen_id.get() + 1); - self.codegen_id.get() - } - fn saw_union(&mut self) { self.saw_union = true; } @@ -522,19 +518,20 @@ impl CodeGenerator for Type { TypeKind::Pointer(..) | TypeKind::BlockPointer | TypeKind::Reference(..) | - TypeKind::TemplateInstantiation(..) | TypeKind::Function(..) | TypeKind::ResolvedTypeRef(..) | + TypeKind::Opaque | TypeKind::Named => { // These items don't need code generation, they only need to be // converted to rust types in fields, arguments, and such. return; } + TypeKind::TemplateInstantiation(ref inst) => { + inst.codegen(ctx, result, whitelisted_items, item) + } TypeKind::Comp(ref ci) => { ci.codegen(ctx, result, whitelisted_items, item) } - // NB: The code below will pick the correct - // applicable_template_args. TypeKind::TemplateAlias(inner, _) | TypeKind::Alias(inner) => { let inner_item = ctx.resolve_item(inner); @@ -557,10 +554,9 @@ impl CodeGenerator for Type { return; } - let mut applicable_template_args = - item.applicable_template_args(ctx); + let mut used_template_params = item.used_template_params(ctx); let inner_rust_type = if item.is_opaque(ctx) { - applicable_template_args.clear(); + used_template_params = None; // Pray if there's no layout. let layout = self.layout(ctx).unwrap_or_else(Layout::zero); BlobTyBuilder::new(layout).build() @@ -603,7 +599,7 @@ impl CodeGenerator for Type { // https://github.com/rust-lang/rust/issues/26264 let simple_enum_path = match inner_rust_type.node { ast::TyKind::Path(None, ref p) => { - if applicable_template_args.is_empty() && + if used_template_params.is_none() && inner_item.expect_type() .canonical_type(ctx) .is_enum() && @@ -627,17 +623,21 @@ impl CodeGenerator for Type { typedef.use_().build(p).as_(rust_name) } else { let mut generics = typedef.type_(rust_name).generics(); - for template_arg in applicable_template_args.iter() { - let template_arg = ctx.resolve_type(*template_arg); - if template_arg.is_named() { - if template_arg.is_invalid_named_type() { - warn!("Item contained invalid template \ - parameter: {:?}", - item); - return; + if let Some(ref params) = used_template_params { + for template_param in params { + if let Some(id) = + template_param.as_named(ctx, &()) { + let template_param = ctx.resolve_type(id); + if template_param.is_invalid_named_type() { + warn!("Item contained invalid template \ + parameter: {:?}", + item); + return; + } + generics = + generics.ty_param_id(template_param.name() + .unwrap()); } - generics = - generics.ty_param_id(template_arg.name().unwrap()); } } generics.build().build_ty(inner_rust_type) @@ -768,7 +768,7 @@ impl<'a> Bitfield<'a> { let field_align = field_ty_layout.align; if field_size_in_bits != 0 && - (width == 0 || width as usize > unfilled_bits_in_last_unit) { + (width == 0 || width as usize > unfilled_bits_in_last_unit) { field_size_in_bits = align_to(field_size_in_bits, field_align); // Push the new field. let ty = @@ -829,6 +829,53 @@ impl<'a> Bitfield<'a> { } } +impl CodeGenerator for TemplateInstantiation { + type Extra = Item; + + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + _whitelisted_items: &ItemSet, + item: &Item) { + // Although uses of instantiations don't need code generation, and are + // just converted to rust types in fields, vars, etc, we take this + // opportunity to generate tests for their layout here. + + let layout = item.kind().expect_type().layout(ctx); + + if let Some(layout) = layout { + let size = layout.size; + let align = layout.align; + + let name = item.canonical_name(ctx); + let fn_name = format!("__bindgen_test_layout_{}_instantiation_{}", + name, + item.id().as_usize()); + let fn_name = ctx.rust_ident_raw(&fn_name); + + let prefix = ctx.trait_prefix(); + let ident = item.to_rust_ty(ctx); + let size_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::size_of::<$ident>()); + let align_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::align_of::<$ident>()); + + let item = quote_item!( + ctx.ext_cx(), + #[test] + fn $fn_name() { + assert_eq!($size_of_expr, $size, + concat!("Size of template specialization: ", stringify!($ident))); + assert_eq!($align_of_expr, $align, + concat!("Alignment of template specialization: ", stringify!($ident))); + }) + .unwrap(); + + result.push(item); + } + } +} + impl CodeGenerator for CompInfo { type Extra = Item; @@ -847,12 +894,11 @@ impl CodeGenerator for CompInfo { return; } - let applicable_template_args = item.applicable_template_args(ctx); + let used_template_params = item.used_template_params(ctx); // generate tuple struct if struct or union is a forward declaration, // skip for now if template parameters are needed. - if self.is_forward_declaration() && - applicable_template_args.is_empty() { + if self.is_forward_declaration() && used_template_params.is_none() { let struct_name = item.canonical_name(ctx); let struct_name = ctx.rust_ident_raw(&struct_name); let tuple_struct = quote_item!(ctx.ext_cx(), @@ -865,35 +911,6 @@ impl CodeGenerator for CompInfo { return; } - if self.is_template_specialization() { - let layout = item.kind().expect_type().layout(ctx); - - if let Some(layout) = layout { - let fn_name = format!("__bindgen_test_layout_template_{}", - result.next_id()); - let fn_name = ctx.rust_ident_raw(&fn_name); - let ident = item.to_rust_ty(ctx); - let prefix = ctx.trait_prefix(); - let size_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::size_of::<$ident>()); - let align_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::align_of::<$ident>()); - let size = layout.size; - let align = layout.align; - let item = quote_item!(ctx.ext_cx(), - #[test] - fn $fn_name() { - assert_eq!($size_of_expr, $size, - concat!("Size of template specialization: ", stringify!($ident))); - assert_eq!($align_of_expr, $align, - concat!("Alignment of template specialization: ", stringify!($ident))); - }) - .unwrap(); - result.push(item); - } - return; - } - let mut attributes = vec![]; let mut needs_clone_impl = false; let mut needs_default_impl = false; @@ -923,7 +940,7 @@ impl CodeGenerator for CompInfo { if item.can_derive_copy(ctx, ()) && !item.annotations().disallow_copy() { derives.push("Copy"); - if !applicable_template_args.is_empty() { + if used_template_params.is_some() { // FIXME: This requires extra logic if you have a big array in a // templated struct. The reason for this is that the magic: // fn clone(&self) -> Self { *self } @@ -940,8 +957,6 @@ impl CodeGenerator for CompInfo { attributes.push(attributes::derives(&derives)) } - let mut template_args_used = - vec![false; applicable_template_args.len()]; let canonical_name = item.canonical_name(ctx); let builder = if is_union && ctx.options().unstable_rust { aster::AstBuilder::new() @@ -1004,13 +1019,6 @@ impl CodeGenerator for CompInfo { continue; } - for (i, ty_id) in applicable_template_args.iter().enumerate() { - let template_arg_ty = ctx.resolve_type(*ty_id); - if base_ty.signature_contains_named_type(ctx, template_arg_ty) { - template_args_used[i] = true; - } - } - let inner = base.ty.to_rust_ty(ctx); let field_name = if i == 0 { "_base".into() @@ -1092,13 +1100,6 @@ impl CodeGenerator for CompInfo { continue; } - for (i, ty_id) in applicable_template_args.iter().enumerate() { - let template_arg = ctx.resolve_type(*ty_id); - if field_ty.signature_contains_named_type(ctx, template_arg) { - template_args_used[i] = true; - } - } - let ty = field.ty().to_rust_ty(ctx); // NB: In unstable rust we use proper `union` types. @@ -1108,7 +1109,8 @@ impl CodeGenerator for CompInfo { } else { quote_ty!(ctx.ext_cx(), __BindgenUnionField<$ty>) } - } else if let Some(item) = field_ty.is_incomplete_array(ctx) { + } else if let Some(item) = + field_ty.is_incomplete_array(ctx) { result.saw_incomplete_array(); let inner = item.to_rust_ty(ctx); @@ -1257,9 +1259,6 @@ impl CodeGenerator for CompInfo { if item.is_opaque(ctx) { fields.clear(); methods.clear(); - for i in 0..template_args_used.len() { - template_args_used[i] = false; - } match layout { Some(l) => { @@ -1276,7 +1275,9 @@ impl CodeGenerator for CompInfo { } } else if !is_union && !self.is_unsized(ctx) { if let Some(padding_field) = - layout.and_then(|layout| struct_layout.pad_struct(&canonical_name, layout)) { + layout.and_then(|layout| { + struct_layout.pad_struct(&canonical_name, layout) + }) { fields.push(padding_field); } @@ -1299,35 +1300,17 @@ impl CodeGenerator for CompInfo { fields.push(field); } - // Append any extra template arguments that nobody has used so far. - for (i, ty) in applicable_template_args.iter().enumerate() { - if !template_args_used[i] { - let name = ctx.resolve_type(*ty).name().unwrap(); + let mut generics = aster::AstBuilder::new().generics(); + + if let Some(ref params) = used_template_params { + for ty in params.iter() { + let param = ctx.resolve_type(*ty); + let name = param.name().unwrap(); let ident = ctx.rust_ident(name); - let prefix = ctx.trait_prefix(); - let phantom = quote_ty!(ctx.ext_cx(), - ::$prefix::marker::PhantomData<$ident>); - let field = StructFieldBuilder::named(format!("_phantom_{}", - i)) - .pub_() - .build_ty(phantom); - fields.push(field) + generics = generics.ty_param_id(ident); } } - - let mut generics = aster::AstBuilder::new().generics(); - for template_arg in applicable_template_args.iter() { - // Take into account that here only arrive named types, not - // template specialisations that would need to be - // instantiated. - // - // TODO: Add template args from the parent, here and in - // `to_rust_ty`!! - let template_arg = ctx.resolve_type(*template_arg); - generics = generics.ty_param_id(template_arg.name().unwrap()); - } - let generics = generics.build(); let rust_struct = builder.with_generics(generics.clone()) @@ -1353,7 +1336,7 @@ impl CodeGenerator for CompInfo { canonical_name); } - if applicable_template_args.is_empty() { + if used_template_params.is_none() { for var in self.inner_vars() { ctx.resolve_item(*var) .codegen(ctx, result, whitelisted_items, &()); @@ -2193,16 +2176,54 @@ impl ToRustTy for Type { let path = item.namespace_aware_canonical_path(ctx); aster::AstBuilder::new().ty().path().ids(path).build() } - TypeKind::TemplateInstantiation(inner, ref template_args) => { - // PS: Sorry for the duplication here. - let mut inner_ty = inner.to_rust_ty(ctx).unwrap(); + TypeKind::TemplateInstantiation(ref inst) => { + let decl = inst.template_definition(); + let mut ty = decl.to_rust_ty(ctx).unwrap(); - if let ast::TyKind::Path(_, ref mut path) = inner_ty.node { - let template_args = template_args.iter() - .map(|arg| arg.to_rust_ty(ctx)) + // If we gave up when making a type for the template definition, + // check if maybe we can make a better opaque blob for the + // instantiation. + if ty == aster::AstBuilder::new().ty().unit().unwrap() { + if let Some(layout) = self.layout(ctx) { + ty = BlobTyBuilder::new(layout).build().unwrap() + } + } + + let decl_params = if let Some(params) = + decl.self_template_params(ctx) { + params + } else { + // This can happen if we generated an opaque type for a + // partial template specialization, in which case we just + // use the opaque type's layout. If we don't have a layout, + // we cross our fingers and hope for the best :-/ + debug_assert!(ctx.resolve_type_through_type_refs(decl) + .is_opaque()); + let layout = self.layout(ctx).unwrap_or(Layout::zero()); + ty = BlobTyBuilder::new(layout).build().unwrap(); + + vec![] + }; + + // TODO: If the decl type is a template class/struct + // declaration's member template declaration, it could rely on + // generic template parameters from its outer template + // class/struct. When we emit bindings for it, it could require + // *more* type arguments than we have here, and we will need to + // reconstruct them somehow. We don't have any means of doing + // that reconstruction at this time. + + if let ast::TyKind::Path(_, ref mut path) = ty.node { + let template_args = inst.template_arguments() + .iter() + .zip(decl_params.iter()) + // Only pass type arguments for the type parameters that + // the decl uses. + .filter(|&(_, param)| ctx.uses_template_parameter(decl, *param)) + .map(|(arg, _)| arg.to_rust_ty(ctx)) .collect::>(); - path.segments.last_mut().unwrap().parameters = if + path.segments.last_mut().unwrap().parameters = if template_args.is_empty() { None } else { @@ -2216,18 +2237,19 @@ impl ToRustTy for Type { } } - P(inner_ty) + P(ty) } TypeKind::ResolvedTypeRef(inner) => inner.to_rust_ty(ctx), TypeKind::TemplateAlias(inner, _) | TypeKind::Alias(inner) => { - let applicable_named_args = item.applicable_template_args(ctx) + let template_params = item.used_template_params(ctx) + .unwrap_or(vec![]) .into_iter() - .filter(|arg| ctx.resolve_type(*arg).is_named()) + .filter(|param| param.is_named(ctx, &())) .collect::>(); let spelling = self.name().expect("Unnamed alias?"); - if item.is_opaque(ctx) && !applicable_named_args.is_empty() { + if item.is_opaque(ctx) && !template_params.is_empty() { // Pray if there's no available layout. let layout = self.layout(ctx).unwrap_or_else(Layout::zero); BlobTyBuilder::new(layout).build() @@ -2236,15 +2258,13 @@ impl ToRustTy for Type { inner) { ty } else { - utils::build_templated_path(item, - ctx, - applicable_named_args) + utils::build_templated_path(item, ctx, template_params) } } TypeKind::Comp(ref info) => { - let template_args = item.applicable_template_args(ctx); + let template_params = item.used_template_params(ctx); if info.has_non_type_template_params() || - (item.is_opaque(ctx) && !template_args.is_empty()) { + (item.is_opaque(ctx) && template_params.is_some()) { return match self.layout(ctx) { Some(layout) => BlobTyBuilder::new(layout).build(), None => { @@ -2256,7 +2276,13 @@ impl ToRustTy for Type { }; } - utils::build_templated_path(item, ctx, template_args) + utils::build_templated_path(item, + ctx, + template_params.unwrap_or(vec![])) + } + TypeKind::Opaque => { + BlobTyBuilder::new(self.layout(ctx).unwrap_or(Layout::zero())) + .build() } TypeKind::BlockPointer => { let void = raw_type(ctx, "c_void"); @@ -2742,19 +2768,19 @@ mod utils { pub fn build_templated_path(item: &Item, ctx: &BindgenContext, - template_args: Vec) + template_params: Vec) -> P { let path = item.namespace_aware_canonical_path(ctx); let builder = aster::AstBuilder::new().ty().path(); - let template_args = template_args.iter() - .map(|arg| arg.to_rust_ty(ctx)) + let template_params = template_params.iter() + .map(|param| param.to_rust_ty(ctx)) .collect::>(); // XXX: I suck at aster. if path.len() == 1 { return builder.segment(&path[0]) - .with_tys(template_args) + .with_tys(template_params) .build() .build(); } @@ -2765,7 +2791,7 @@ mod utils { builder = if i == path.len() - 2 { // XXX Extra clone courtesy of the borrow checker. builder.segment(&segment) - .with_tys(template_args.clone()) + .with_tys(template_params.clone()) .build() } else { builder.segment(&segment).build() diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs index 724bef98fa..351f76428e 100644 --- a/src/codegen/struct_layout.rs +++ b/src/codegen/struct_layout.rs @@ -167,17 +167,20 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { None => return None, }; - if let TypeKind::Array(inner, len) = *field_ty.canonical_type(self.ctx).kind() { + if let TypeKind::Array(inner, len) = + *field_ty.canonical_type(self.ctx).kind() { // FIXME(emilio): As an _ultra_ hack, we correct the layout returned // by arrays of structs that have a bigger alignment than what we // can support. // // This means that the structs in the array are super-unsafe to // access, since they won't be properly aligned, but *shrug*. - if let Some(layout) = self.ctx.resolve_type(inner).layout(self.ctx) { + if let Some(layout) = self.ctx + .resolve_type(inner) + .layout(self.ctx) { if layout.align > mem::size_of::<*mut ()>() { - field_layout.size = - align_to(layout.size, layout.align) * len; + field_layout.size = align_to(layout.size, layout.align) * + len; field_layout.align = mem::size_of::<*mut ()>(); } } @@ -197,7 +200,8 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { }; // Otherwise the padding is useless. - let need_padding = padding_bytes >= field_layout.align || field_layout.align > mem::size_of::<*mut ()>(); + let need_padding = padding_bytes >= field_layout.align || + field_layout.align > mem::size_of::<*mut ()>(); self.latest_offset += padding_bytes; @@ -206,14 +210,16 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { self.latest_offset); debug!("align field {} to {}/{} with {} padding bytes {:?}", - field_name, - self.latest_offset, - field_offset.unwrap_or(0) / 8, - padding_bytes, - field_layout); + field_name, + self.latest_offset, + field_offset.unwrap_or(0) / 8, + padding_bytes, + field_layout); if need_padding && padding_bytes != 0 { - Some(Layout::new(padding_bytes, cmp::min(field_layout.align, mem::size_of::<*mut ()>()))) + Some(Layout::new(padding_bytes, + cmp::min(field_layout.align, + mem::size_of::<*mut ()>()))) } else { None } @@ -221,7 +227,8 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { self.latest_offset += field_layout.size; self.latest_field_layout = Some(field_layout); - self.max_field_align = cmp::max(self.max_field_align, field_layout.align); + self.max_field_align = cmp::max(self.max_field_align, + field_layout.align); self.last_field_was_bitfield = false; debug!("Offset: {}: {} -> {}", @@ -232,11 +239,15 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { padding_layout.map(|layout| self.padding_field(layout)) } - pub fn pad_struct(&mut self, name: &str, layout: Layout) -> Option { + pub fn pad_struct(&mut self, + name: &str, + layout: Layout) + -> Option { if layout.size < self.latest_offset { error!("Calculated wrong layout for {}, too more {} bytes", - name, self.latest_offset - layout.size); - return None + name, + self.latest_offset - layout.size); + return None; } let padding_bytes = layout.size - self.latest_offset; @@ -248,14 +259,14 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { // regardless, because bitfields don't respect alignment as strictly as // other fields. if padding_bytes > 0 && - (padding_bytes >= layout.align || - (self.last_field_was_bitfield && - padding_bytes >= self.latest_field_layout.unwrap().align) || - layout.align > mem::size_of::<*mut ()>()) { + (padding_bytes >= layout.align || + (self.last_field_was_bitfield && + padding_bytes >= self.latest_field_layout.unwrap().align) || + layout.align > mem::size_of::<*mut ()>()) { let layout = if self.comp.packed() { Layout::new(padding_bytes, 1) } else if self.last_field_was_bitfield || - layout.align > mem::size_of::<*mut ()>() { + layout.align > mem::size_of::<*mut ()>() { // We've already given up on alignment here. Layout::for_size(padding_bytes) } else { @@ -316,12 +327,14 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { // If it was, we may or may not need to align, depending on what the // current field alignment and the bitfield size and alignment are. - debug!("align_to_bitfield? {}: {:?} {:?}", self.last_field_was_bitfield, - layout, new_field_layout); + debug!("align_to_bitfield? {}: {:?} {:?}", + self.last_field_was_bitfield, + layout, + new_field_layout); if self.last_field_was_bitfield && - new_field_layout.align <= layout.size % layout.align && - new_field_layout.size <= layout.size % layout.align { + new_field_layout.align <= layout.size % layout.align && + new_field_layout.size <= layout.size % layout.align { // The new field will be coalesced into some of the remaining bits. // // FIXME(emilio): I think this may not catch everything? diff --git a/src/ir/comp.rs b/src/ir/comp.rs index b97879f710..814204c268 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -6,7 +6,7 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::item::Item; use super::layout::Layout; use super::traversal::{EdgeKind, Trace, Tracer}; -use super::ty::{TemplateDeclaration, Type}; +use super::ty::TemplateDeclaration; use clang; use parse::{ClangItemParser, ParseError}; use std::cell::Cell; @@ -238,10 +238,11 @@ pub struct CompInfo { /// The members of this struct or union. fields: Vec, - /// The template parameters of this class. These are non-concrete, and - /// should always be a Type(TypeKind::Named(name)), but still they need to - /// be registered with an unique type id in the context. - template_args: Vec, + /// The abstract template parameters of this class. These are NOT concrete + /// template arguments, and should always be a + /// Type(TypeKind::Named(name)). For concrete template arguments, see the + /// TypeKind::TemplateInstantiation. + template_params: Vec, /// The method declarations inside this class, if in C++ mode. methods: Vec, @@ -252,9 +253,6 @@ pub struct CompInfo { /// Vector of classes this one inherits from. base_members: Vec, - /// The parent reference template if any. - ref_template: Option, - /// The inner types that were declared inside this class, in something like: /// /// class Foo { @@ -320,11 +318,10 @@ impl CompInfo { CompInfo { kind: kind, fields: vec![], - template_args: vec![], + template_params: vec![], methods: vec![], constructors: vec![], base_members: vec![], - ref_template: None, inner_types: vec![], inner_vars: vec![], has_vtable: false, @@ -345,9 +342,7 @@ impl CompInfo { !self.has_vtable(ctx) && self.fields.is_empty() && self.base_members.iter().all(|base| { ctx.resolve_type(base.ty).canonical_type(ctx).is_unsized(ctx) - }) && - self.ref_template - .map_or(true, |template| ctx.resolve_type(template).is_unsized(ctx)) + }) } /// Does this compound type have a destructor? @@ -364,16 +359,6 @@ impl CompInfo { match self.kind { CompKind::Union => false, CompKind::Struct => { - // NB: We can't rely on a type with type parameters - // not having destructor. - // - // This is unfortunate, but... - self.ref_template.as_ref().map_or(false, |t| { - ctx.resolve_type(*t).has_destructor(ctx) - }) || - self.template_args.iter().any(|t| { - ctx.resolve_type(*t).has_destructor(ctx) - }) || self.base_members.iter().any(|base| { ctx.resolve_type(base.ty).has_destructor(ctx) }) || @@ -389,16 +374,6 @@ impl CompInfo { has_destructor } - /// Is this type a template specialization? - pub fn is_template_specialization(&self) -> bool { - self.ref_template.is_some() - } - - /// Get the template declaration this specialization is specializing. - pub fn specialized_template(&self) -> Option { - self.ref_template - } - /// Compute the layout of this type. /// /// This is called as a fallback under some circumstances where LLVM doesn't @@ -411,7 +386,7 @@ impl CompInfo { use std::cmp; // We can't do better than clang here, sorry. if self.kind == CompKind::Struct { - return None + return None; } let mut max_size = 0; @@ -434,12 +409,6 @@ impl CompInfo { &self.fields } - /// Get this type's set of free template arguments. Empty if this is not a - /// template. - pub fn template_args(&self) -> &[ItemId] { - &self.template_args - } - /// Does this type have any template parameters that aren't types /// (e.g. int)? pub fn has_non_type_template_params(&self) -> bool { @@ -452,9 +421,6 @@ impl CompInfo { self.base_members().iter().any(|base| { ctx.resolve_type(base.ty) .has_vtable(ctx) - }) || - self.ref_template.map_or(false, |template| { - ctx.resolve_type(template).has_vtable(ctx) }) } @@ -485,10 +451,9 @@ impl CompInfo { ctx: &mut BindgenContext) -> Result { use clang_sys::*; - // Sigh... For class templates we want the location, for - // specialisations, we want the declaration... So just try both. - // - // TODO: Yeah, this code reads really bad. + assert!(ty.template_args().is_none(), + "We handle template instantiations elsewhere"); + let mut cursor = ty.declaration(); let mut kind = Self::kind_from_cursor(&cursor); if kind.is_err() { @@ -510,35 +475,6 @@ impl CompInfo { CXCursor_ClassDecl => !cur.is_definition(), _ => false, }); - ci.template_args = match ty.template_args() { - // In forward declarations and not specializations, etc, they are in - // the ast, we'll meet them in CXCursor_TemplateTypeParameter - None => vec![], - Some(arg_types) => { - let num_arg_types = arg_types.len(); - let mut specialization = true; - - let args = arg_types.filter(|t| t.kind() != CXType_Invalid) - .filter_map(|t| if t.spelling() - .starts_with("type-parameter") { - specialization = false; - None - } else { - Some(Item::from_ty_or_ref(t, None, None, ctx)) - }) - .collect::>(); - - if specialization && args.len() != num_arg_types { - ci.has_non_type_template_params = true; - warn!("warning: Template parameter is not a type"); - } - - if specialization { args } else { vec![] } - } - }; - - ci.ref_template = cursor.specialized() - .and_then(|c| Item::parse(c, None, ctx).ok()); let mut maybe_anonymous_struct_field = None; cursor.visit(|cur| { @@ -576,7 +512,7 @@ impl CompInfo { let bit_width = cur.bit_width(); let field_type = Item::from_ty_or_ref(cur.cur_type(), - Some(cur), + cur, Some(potential_id), ctx); @@ -616,6 +552,7 @@ impl CompInfo { } CXCursor_EnumDecl | CXCursor_TypeAliasDecl | + CXCursor_TypeAliasTemplateDecl | CXCursor_TypedefDecl | CXCursor_StructDecl | CXCursor_UnionDecl | @@ -668,9 +605,10 @@ impl CompInfo { return CXChildVisit_Continue; } - let param = - Item::named_type(cur.spelling(), potential_id, ctx); - ci.template_args.push(param); + let param = Item::named_type(None, cur, ctx) + .expect("Item::named_type should't fail when pointing \ + at a TemplateTypeParameter"); + ci.template_params.push(param); } CXCursor_CXXBaseSpecifier => { let is_virtual_base = cur.is_virtual_base(); @@ -682,10 +620,8 @@ impl CompInfo { BaseKind::Normal }; - let type_id = Item::from_ty_or_ref(cur.cur_type(), - Some(cur), - None, - ctx); + let type_id = + Item::from_ty_or_ref(cur.cur_type(), cur, None, ctx); ci.base_members.push(Base { ty: type_id, kind: kind, @@ -711,7 +647,7 @@ impl CompInfo { // Methods of template functions not only use to be inlined, // but also instantiated, and we wouldn't be able to call // them, so just bail out. - if !ci.template_args.is_empty() { + if !ci.template_params.is_empty() { return CXChildVisit_Continue; } @@ -778,7 +714,7 @@ impl CompInfo { _ => { warn!("unhandled comp member `{}` (kind {:?}) in `{}` ({})", cur.spelling(), - cur.kind(), + clang::kind_to_str(cur.kind()), cursor.spelling(), cur.location()); } @@ -816,25 +752,6 @@ impl CompInfo { }) } - /// Do any of the types that participate in this type's "signature" use the - /// named type `ty`? - /// - /// See also documentation for `ir::Item::signature_contains_named_type`. - pub fn signature_contains_named_type(&self, - ctx: &BindgenContext, - ty: &Type) - -> bool { - // We don't generate these, so rather don't make the codegen step to - // think we got it covered. - if self.has_non_type_template_params() { - return false; - } - self.template_args.iter().any(|arg| { - ctx.resolve_type(*arg) - .signature_contains_named_type(ctx, ty) - }) - } - /// Get the set of types that were declared within this compound type /// (e.g. nested class definitions). pub fn inner_types(&self) -> &[ItemId] { @@ -882,11 +799,13 @@ impl CompInfo { } impl TemplateDeclaration for CompInfo { - fn self_template_params(&self, _ctx: &BindgenContext) -> Option> { - if self.template_args.is_empty() { + fn self_template_params(&self, + _ctx: &BindgenContext) + -> Option> { + if self.template_params.is_empty() { None } else { - Some(self.template_args.clone()) + Some(self.template_params.clone()) } } } @@ -925,13 +844,9 @@ impl CanDeriveDebug for CompInfo { self.base_members .iter() .all(|base| base.ty.can_derive_debug(ctx, ())) && - self.template_args - .iter() - .all(|id| id.can_derive_debug(ctx, ())) && self.fields .iter() - .all(|f| f.can_derive_debug(ctx, ())) && - self.ref_template.map_or(true, |id| id.can_derive_debug(ctx, ())) + .all(|f| f.can_derive_debug(ctx, ())) }; self.detect_derive_debug_cycle.set(false); @@ -961,7 +876,7 @@ impl CanDeriveDefault for CompInfo { return layout.unwrap_or_else(Layout::zero) .opaque() - .can_derive_debug(ctx, ()); + .can_derive_default(ctx, ()); } self.detect_derive_default_cycle.set(true); @@ -971,14 +886,9 @@ impl CanDeriveDefault for CompInfo { self.base_members .iter() .all(|base| base.ty.can_derive_default(ctx, ())) && - self.template_args - .iter() - .all(|id| id.can_derive_default(ctx, ())) && self.fields .iter() - .all(|f| f.can_derive_default(ctx, ())) && - self.ref_template - .map_or(true, |id| id.can_derive_default(ctx, ())); + .all(|f| f.can_derive_default(ctx, ())); self.detect_derive_default_cycle.set(false); @@ -1013,17 +923,12 @@ impl<'a> CanDeriveCopy<'a> for CompInfo { } // https://github.com/rust-lang/rust/issues/36640 - if !self.template_args.is_empty() || self.ref_template.is_some() || - !item.applicable_template_args(ctx).is_empty() { + if !self.template_params.is_empty() || + item.used_template_params(ctx).is_some() { return false; } } - // With template args, use a safe subset of the types, - // since copyability depends on the types itself. - self.ref_template - .as_ref() - .map_or(true, |t| t.can_derive_copy(ctx, ())) && self.base_members .iter() .all(|base| base.ty.can_derive_copy(ctx, ())) && @@ -1044,25 +949,9 @@ impl Trace for CompInfo { fn trace(&self, context: &BindgenContext, tracer: &mut T, item: &Item) where T: Tracer, { - // TODO: We should properly distinguish template instantiations from - // template declarations at the type level. Why are some template - // instantiations represented here instead of as - // TypeKind::TemplateInstantiation? - if let Some(template) = self.specialized_template() { - // This is an instantiation of a template declaration with concrete - // template type arguments. - tracer.visit_kind(template, EdgeKind::TemplateDeclaration); - let args = item.applicable_template_args(context); - for a in args { - tracer.visit_kind(a, EdgeKind::TemplateArgument); - } - } else { - let params = item.applicable_template_args(context); - // This is a template declaration with abstract template type - // parameters. - for p in params { - tracer.visit_kind(p, EdgeKind::TemplateParameterDefinition); - } + let params = item.all_template_params(context).unwrap_or(vec![]); + for p in params { + tracer.visit_kind(p, EdgeKind::TemplateParameterDefinition); } for base in self.base_members() { diff --git a/src/ir/context.rs b/src/ir/context.rs index 27a43f20bf..6795a864e7 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -5,6 +5,8 @@ use super::int::IntKind; use super::item::{Item, ItemCanonicalPath, ItemSet}; use super::item_kind::ItemKind; use super::module::{Module, ModuleKind}; +use super::named::{UsedTemplateParameters, analyze}; +use super::template::TemplateInstantiation; use super::traversal::{self, Edge, ItemTraversal}; use super::ty::{FloatKind, TemplateDeclaration, Type, TypeKind}; use BindgenOptions; @@ -102,6 +104,10 @@ pub struct BindgenContext<'ctx> { /// item ids during parsing. types: HashMap, + /// Maps from a cursor to the item id of the named template type parameter + /// for that cursor. + named_types: HashMap, + /// A cursor to module map. Similar reason than above. modules: HashMap, @@ -149,6 +155,11 @@ pub struct BindgenContext<'ctx> { /// Whether a bindgen complex was generated generated_bindegen_complex: Cell, + + /// Map from an item's id to the set of template parameter items that it + /// uses. See `ir::named` for more details. Always `Some` during the codegen + /// phase. + used_template_parameters: Option>, } /// A traversal of whitelisted items. @@ -173,12 +184,13 @@ impl<'ctx> BindgenContext<'ctx> { &options.clang_args, &[], parse_options) - .expect("TranslationUnit::parse"); + .expect("TranslationUnit::parse failed"); let root_module = Self::build_root_module(ItemId(0)); let mut me = BindgenContext { items: Default::default(), types: Default::default(), + named_types: Default::default(), modules: Default::default(), next_item_id: ItemId(1), root_module: root_module.id(), @@ -193,6 +205,7 @@ impl<'ctx> BindgenContext<'ctx> { translation_unit: translation_unit, options: options, generated_bindegen_complex: Cell::new(false), + used_template_parameters: None, }; me.add_item(root_module, None, None); @@ -238,7 +251,8 @@ impl<'ctx> BindgenContext<'ctx> { declaration, location); debug_assert!(declaration.is_some() || !item.kind().is_type() || - item.kind().expect_type().is_builtin_or_named(), + item.kind().expect_type().is_builtin_or_named() || + item.kind().expect_type().is_opaque(), "Adding a type without declaration?"); let id = item.id(); @@ -256,7 +270,8 @@ impl<'ctx> BindgenContext<'ctx> { } let old_item = self.items.insert(id, item); - assert!(old_item.is_none(), "Inserted type twice?"); + assert!(old_item.is_none(), + "should not have already associated an item with the given id"); // Unnamed items can have an USR, but they can't be referenced from // other sites explicitly and the USR can match if the unnamed items are @@ -299,6 +314,35 @@ impl<'ctx> BindgenContext<'ctx> { } } + /// Add a new named template type parameter to this context's item set. + pub fn add_named_type(&mut self, item: Item, definition: clang::Cursor) { + debug!("BindgenContext::add_named_type: item = {:?}; definition = {:?}", + item, + definition); + + assert!(item.expect_type().is_named(), + "Should directly be a named type, not a resolved reference or anything"); + assert_eq!(definition.kind(), + clang_sys::CXCursor_TemplateTypeParameter); + + let id = item.id(); + let old_item = self.items.insert(id, item); + assert!(old_item.is_none(), + "should not have already associated an item with the given id"); + + let old_named_ty = self.named_types.insert(definition, id); + assert!(old_named_ty.is_none(), + "should not have already associated a named type with this id"); + } + + /// Get the named type defined at the given cursor location, if we've + /// already added one. + pub fn get_named_type(&self, definition: &clang::Cursor) -> Option { + assert_eq!(definition.kind(), + clang_sys::CXCursor_TemplateTypeParameter); + self.named_types.get(definition).cloned() + } + // TODO: Move all this syntax crap to other part of the code. /// Given that we are in the codegen phase, get the syntex context. @@ -352,7 +396,7 @@ impl<'ctx> BindgenContext<'ctx> { /// Gather all the unresolved type references. fn collect_typerefs (&mut self) - -> Vec<(ItemId, clang::Type, Option, Option)> { + -> Vec<(ItemId, clang::Type, clang::Cursor, Option)> { debug_assert!(!self.collected_typerefs); self.collected_typerefs = true; let mut typerefs = vec![]; @@ -423,7 +467,7 @@ impl<'ctx> BindgenContext<'ctx> { }; match *ty.kind() { - TypeKind::Comp(ref ci) if !ci.is_template_specialization() => {} + TypeKind::Comp(..) | TypeKind::TemplateAlias(..) | TypeKind::Alias(..) => {} _ => continue, @@ -529,6 +573,8 @@ impl<'ctx> BindgenContext<'ctx> { self.process_replacements(); } + self.find_used_template_parameters(); + let ret = cb(self); self.gen_ctx = None; ret @@ -555,6 +601,45 @@ impl<'ctx> BindgenContext<'ctx> { traversal::all_edges) } + fn find_used_template_parameters(&mut self) { + if self.options.whitelist_recursively { + let used_params = analyze::(self); + self.used_template_parameters = Some(used_params); + } else { + // If you aren't recursively whitelisting, then we can't really make + // any sense of template parameter usage, and you're on your own. + let mut used_params = HashMap::new(); + for id in self.whitelisted_items() { + used_params.entry(id) + .or_insert(id.self_template_params(self) + .map_or(Default::default(), + |params| params.into_iter().collect())); + } + self.used_template_parameters = Some(used_params); + } + } + + /// Return `true` if `item` uses the given `template_param`, `false` + /// otherwise. + /// + /// This method may only be called during the codegen phase, because the + /// template usage information is only computed as we enter the codegen + /// phase. + pub fn uses_template_parameter(&self, + item: ItemId, + template_param: ItemId) + -> bool { + assert!(self.in_codegen_phase(), + "We only compute template parameter usage as we enter codegen"); + + self.used_template_parameters + .as_ref() + .expect("should have found template parameter usage if we're in codegen") + .get(&item) + .map(|items_used_params| items_used_params.contains(&template_param)) + .unwrap_or(false) + } + // This deserves a comment. Builtin types don't get a valid declaration, so // we can't add it to the cursor->type map. // @@ -613,6 +698,21 @@ impl<'ctx> BindgenContext<'ctx> { } } + /// Resolve the given `ItemId` into a `Type`, and keep doing so while we see + /// `ResolvedTypeRef`s to other items until we get to the final `Type`. + pub fn resolve_type_through_type_refs(&self, item_id: ItemId) -> &Type { + assert!(self.collected_typerefs()); + + let mut id = item_id; + loop { + let ty = self.resolve_type(id); + match *ty.kind() { + TypeKind::ResolvedTypeRef(next_id) => id = next_id, + _ => return ty, + } + } + } + /// Get the current module. pub fn current_module(&self) -> ItemId { self.current_module @@ -753,7 +853,7 @@ impl<'ctx> BindgenContext<'ctx> { // template declaration as the parent. It is already parsed and // has a known-resolvable `ItemId`. let ty = Item::from_ty_or_ref(child.cur_type(), - Some(*child), + *child, Some(template), self); args.push(ty); @@ -770,7 +870,7 @@ impl<'ctx> BindgenContext<'ctx> { // Do a happy little parse. See comment in the TypeRef // match arm about parent IDs. let ty = Item::from_ty_or_ref(child.cur_type(), - Some(*child), + *child, Some(template), self); args.push(ty); @@ -792,9 +892,9 @@ impl<'ctx> BindgenContext<'ctx> { sub_args.reverse(); let sub_name = Some(template_decl_cursor.spelling()); + let sub_inst = TemplateInstantiation::new(template_decl_id, sub_args); let sub_kind = - TypeKind::TemplateInstantiation(template_decl_id, - sub_args); + TypeKind::TemplateInstantiation(sub_inst); let sub_ty = Type::new(sub_name, template_decl_cursor.cur_type() .fallible_layout() @@ -844,7 +944,8 @@ impl<'ctx> BindgenContext<'ctx> { } args.reverse(); - let type_kind = TypeKind::TemplateInstantiation(template, args); + let type_kind = TypeKind::TemplateInstantiation( + TemplateInstantiation::new(template, args)); let name = ty.spelling(); let name = if name.is_empty() { None } else { Some(name) }; let ty = Type::new(name, @@ -863,9 +964,9 @@ impl<'ctx> BindgenContext<'ctx> { /// If we have already resolved the type for the given type declaration, /// return its `ItemId`. Otherwise, return `None`. - fn get_resolved_type(&self, - decl: &clang::CanonicalTypeDeclaration) - -> Option { + pub fn get_resolved_type(&self, + decl: &clang::CanonicalTypeDeclaration) + -> Option { self.types .get(&TypeKey::Declaration(*decl.cursor())) .or_else(|| { @@ -904,16 +1005,15 @@ impl<'ctx> BindgenContext<'ctx> { // of it, or // * we have already parsed and resolved this type, and // there's nothing left to do. - // - // Note that we only do the former if the `parent_id` exists, - // and we have a location for building the new arguments. The - // template argument names don't matter in the global context. if decl.cursor().is_template_like() && *ty != decl.cursor().cur_type() && - location.is_some() && - parent_id.is_some() { + location.is_some() { let location = location.unwrap(); - let parent_id = parent_id.unwrap(); + + // It is always safe to hang instantiations off of the root + // module. They use their template definition for naming, + // and don't need the parent for anything else. + let parent_id = self.root_module(); // For specialized type aliases, there's no way to get the // template parameters as of this writing (for a struct @@ -947,17 +1047,20 @@ impl<'ctx> BindgenContext<'ctx> { self.build_builtin_ty(ty) } - // This is unfortunately a lot of bloat, but is needed to properly track - // constness et. al. - // - // We should probably make the constness tracking separate, so it doesn't - // bloat that much, but hey, we already bloat the heck out of builtin types. - fn build_ty_wrapper(&mut self, - with_id: ItemId, - wrapped_id: ItemId, - parent_id: Option, - ty: &clang::Type) - -> ItemId { + /// Make a new item that is a resolved type reference to the `wrapped_id`. + /// + /// This is unfortunately a lot of bloat, but is needed to properly track + /// constness et. al. + /// + /// We should probably make the constness tracking separate, so it doesn't + /// bloat that much, but hey, we already bloat the heck out of builtin + /// types. + pub fn build_ty_wrapper(&mut self, + with_id: ItemId, + wrapped_id: ItemId, + parent_id: Option, + ty: &clang::Type) + -> ItemId { let spelling = ty.spelling(); let is_const = ty.is_const(); let layout = ty.fallible_layout().ok(); @@ -1331,7 +1434,9 @@ impl PartialType { } impl TemplateDeclaration for PartialType { - fn self_template_params(&self, _ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, + _ctx: &BindgenContext) + -> Option> { // Maybe at some point we will eagerly parse named types, but for now we // don't and this information is unavailable. None diff --git a/src/ir/dot.rs b/src/ir/dot.rs index b7a117bba1..e7e1f47bd8 100644 --- a/src/ir/dot.rs +++ b/src/ir/dot.rs @@ -1,23 +1,26 @@ //! Generating Graphviz `dot` files from our IR. +use super::context::{BindgenContext, ItemId}; +use super::traversal::Trace; use std::fs::File; use std::io::{self, Write}; use std::path::Path; -use super::context::{BindgenContext, ItemId}; -use super::traversal::Trace; /// A trait for anything that can write attributes as `` rows to a dot /// file. pub trait DotAttributes { /// Write this thing's attributes to the given output. Each attribute must /// be its own `...`. - fn dot_attributes(&self, ctx: &BindgenContext, out: &mut W) -> io::Result<()> + fn dot_attributes(&self, + ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> where W: io::Write; } /// Write a graphviz dot file containing our IR. pub fn write_dot_file

    (ctx: &BindgenContext, path: P) -> io::Result<()> - where P: AsRef + where P: AsRef, { let file = try!(File::create(path)); let mut dot_file = io::BufWriter::new(file); @@ -32,16 +35,21 @@ pub fn write_dot_file

    (ctx: &BindgenContext, path: P) -> io::Result<()> try!(item.dot_attributes(ctx, &mut dot_file)); try!(writeln!(&mut dot_file, r#"

    >];"#)); - item.trace(ctx, &mut |sub_id: ItemId, _edge_kind| { + item.trace(ctx, + &mut |sub_id: ItemId, _edge_kind| { if err.is_some() { return; } - match writeln!(&mut dot_file, "{} -> {};", id.as_usize(), sub_id.as_usize()) { - Ok(_) => {}, + match writeln!(&mut dot_file, + "{} -> {};", + id.as_usize(), + sub_id.as_usize()) { + Ok(_) => {} Err(e) => err = Some(Err(e)), } - }, &()); + }, + &()); if let Some(err) = err { return err; diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index 3470e03373..d2385a29e8 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -60,7 +60,7 @@ impl Enum { let declaration = ty.declaration().canonical(); let repr = declaration.enum_type() - .and_then(|et| Item::from_ty(&et, None, None, ctx).ok()); + .and_then(|et| Item::from_ty(&et, declaration, None, ctx).ok()); let mut variants = vec![]; // Assume signedness since the default type by the C standard is an int. @@ -99,7 +99,7 @@ impl Enum { Annotations::new(&cursor) .and_then(|anno| if anno.hide() { Some(EnumVariantCustomBehavior::Hide) - } else if + } else if anno.constify_enum_variant() { Some(EnumVariantCustomBehavior::Constify) } else { diff --git a/src/ir/function.rs b/src/ir/function.rs index ad336c4ba3..e82ba83cf2 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -5,9 +5,9 @@ use super::dot::DotAttributes; use super::item::Item; use super::traversal::{EdgeKind, Trace, Tracer}; use super::ty::TypeKind; -use ir::derive::CanDeriveDebug; use clang; use clang_sys::CXCallingConv; +use ir::derive::CanDeriveDebug; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use std::io; use syntax::abi; @@ -63,11 +63,16 @@ impl Function { } impl DotAttributes for Function { - fn dot_attributes(&self, _ctx: &BindgenContext, out: &mut W) -> io::Result<()> - where W: io::Write + fn dot_attributes(&self, + _ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, { if let Some(ref mangled) = self.mangled_name { - try!(writeln!(out, "mangled name{}", mangled)); + try!(writeln!(out, + "mangled name{}", + mangled)); } Ok(()) @@ -188,8 +193,7 @@ impl FunctionSig { let name = arg.spelling(); let name = if name.is_empty() { None } else { Some(name) }; - let ty = - Item::from_ty_or_ref(arg_ty, Some(*arg), None, ctx); + let ty = Item::from_ty_or_ref(arg_ty, *arg, None, ctx); (name, ty) }) .collect() @@ -200,10 +204,8 @@ impl FunctionSig { let mut args = vec![]; cursor.visit(|c| { if c.kind() == CXCursor_ParmDecl { - let ty = Item::from_ty_or_ref(c.cur_type(), - Some(c), - None, - ctx); + let ty = + Item::from_ty_or_ref(c.cur_type(), c, None, ctx); let name = c.spelling(); let name = if name.is_empty() { None } else { Some(name) }; @@ -246,7 +248,7 @@ impl FunctionSig { } else { try!(ty.ret_type().ok_or(ParseError::Continue)) }; - let ret = Item::from_ty_or_ref(ty_ret_type, None, None, ctx); + let ret = Item::from_ty_or_ref(ty_ret_type, cursor, None, ctx); let abi = get_abi(ty.call_conv()); if abi.is_none() { @@ -317,10 +319,8 @@ impl ClangSubItemParser for Function { } // Grab the signature using Item::from_ty. - let sig = try!(Item::from_ty(&cursor.cur_type(), - Some(cursor), - None, - context)); + let sig = + try!(Item::from_ty(&cursor.cur_type(), cursor, None, context)); let name = cursor.spelling(); assert!(!name.is_empty(), "Empty function name?"); @@ -368,7 +368,8 @@ impl CanDeriveDebug for FunctionSig { } match self.abi { - Some(abi::Abi::C) | None => true, + Some(abi::Abi::C) | + None => true, _ => false, } } diff --git a/src/ir/item.rs b/src/ir/item.rs index 21b27f071c..93df9c7730 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -3,10 +3,12 @@ use super::annotations::Annotations; use super::context::{BindgenContext, ItemId, PartialType}; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; -use super::dot::{DotAttributes}; +use super::dot::DotAttributes; use super::function::Function; use super::item_kind::ItemKind; +use super::layout::Opaque; use super::module::Module; +use super::template::AsNamed; use super::traversal::{EdgeKind, Trace, Tracer}; use super::ty::{TemplateDeclaration, Type, TypeKind}; use clang; @@ -15,8 +17,8 @@ use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use std::cell::{Cell, RefCell}; use std::collections::BTreeSet; use std::fmt::Write; -use std::iter; use std::io; +use std::iter; /// A trait to get the canonical name from an item. /// @@ -128,6 +130,35 @@ impl<'a, 'b> Iterator for ItemAncestorsIter<'a, 'b> } } +impl AsNamed for ItemId { + type Extra = (); + + fn as_named(&self, ctx: &BindgenContext, _: &()) -> Option { + ctx.resolve_item(*self).as_named(ctx, &()) + } +} + +impl AsNamed for Item { + type Extra = (); + + fn as_named(&self, ctx: &BindgenContext, _: &()) -> Option { + self.kind.as_named(ctx, self) + } +} + +impl AsNamed for ItemKind { + type Extra = Item; + + fn as_named(&self, ctx: &BindgenContext, item: &Item) -> Option { + match *self { + ItemKind::Type(ref ty) => ty.as_named(ctx, item), + ItemKind::Module(..) | + ItemKind::Function(..) | + ItemKind::Var(..) => None, + } + } +} + // Pure convenience impl ItemCanonicalName for ItemId { fn canonical_name(&self, ctx: &BindgenContext) -> String { @@ -224,8 +255,14 @@ impl CanDeriveDebug for Item { type Extra = (); fn can_derive_debug(&self, ctx: &BindgenContext, _: ()) -> bool { - ctx.options().derive_debug && - match self.kind { + if self.detect_derive_debug_cycle.get() { + return true; + } + + self.detect_derive_debug_cycle.set(true); + + let result = ctx.options().derive_debug && + match self.kind { ItemKind::Type(ref ty) => { if self.is_opaque(ctx) { ty.layout(ctx) @@ -235,7 +272,11 @@ impl CanDeriveDebug for Item { } } _ => false, - } + }; + + self.detect_derive_debug_cycle.set(false); + + result } } @@ -263,7 +304,13 @@ impl<'a> CanDeriveCopy<'a> for Item { type Extra = (); fn can_derive_copy(&self, ctx: &BindgenContext, _: ()) -> bool { - match self.kind { + if self.detect_derive_copy_cycle.get() { + return true; + } + + self.detect_derive_copy_cycle.set(true); + + let result = match self.kind { ItemKind::Type(ref ty) => { if self.is_opaque(ctx) { ty.layout(ctx) @@ -273,7 +320,11 @@ impl<'a> CanDeriveCopy<'a> for Item { } } _ => false, - } + }; + + self.detect_derive_copy_cycle.set(false); + + result } fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { @@ -346,6 +397,16 @@ pub struct Item { parent_id: ItemId, /// The item kind. kind: ItemKind, + /// Detect cycles when determining if we can derive debug/copy or not, and + /// avoid infinite recursion. + detect_derive_debug_cycle: Cell, + detect_derive_copy_cycle: Cell, +} + +impl AsRef for Item { + fn as_ref(&self) -> &ItemId { + &self.id + } } impl Item { @@ -366,9 +427,22 @@ impl Item { comment: comment, annotations: annotations.unwrap_or_default(), kind: kind, + detect_derive_debug_cycle: Cell::new(false), + detect_derive_copy_cycle: Cell::new(false), } } + fn new_opaque_type(with_id: ItemId, + ty: &clang::Type, + ctx: &mut BindgenContext) + -> ItemId { + let ty = Opaque::from_clang_ty(ty); + let kind = ItemKind::Type(ty); + let parent = ctx.root_module(); + ctx.add_item(Item::new(with_id, None, None, parent, kind), None, None); + with_id + } + /// Get this `Item`'s identifier. pub fn id(&self) -> ItemId { self.id @@ -474,184 +548,12 @@ impl Item { self.kind().as_type() } - /// Is this item a named template type parameter? - pub fn is_named(&self) -> bool { - self.as_type() - .map(|ty| ty.is_named()) - .unwrap_or(false) - } - /// Get a reference to this item's underlying `Function`. Panic if this is /// some other kind of item. pub fn expect_function(&self) -> &Function { self.kind().expect_function() } - /// Checks whether an item contains in its "type signature" some named type. - /// - /// This function is used to avoid unused template parameter errors in Rust - /// when generating typedef declarations, and also to know whether we need - /// to generate a `PhantomData` member for a template parameter. - /// - /// For example, in code like the following: - /// - /// ```c++ - /// template - /// struct Foo { - /// T bar; - /// - /// struct Baz { - /// U bas; - /// }; - /// }; - /// ``` - /// - /// Both `Foo` and `Baz` contain both `T` and `U` template parameters in - /// their signature: - /// - /// * `Foo` - /// * `Bar` - /// - /// But the Rust structure for `Foo` would look like: - /// - /// ```rust - /// struct Foo { - /// bar: T, - /// _phantom0: ::std::marker::PhantomData, - /// } - /// ``` - /// - /// because none of its member fields contained the `U` type in the - /// signature. Similarly, `Bar` would contain a `PhantomData` type, for - /// the same reason. - /// - /// Note that this is somewhat similar to `applicable_template_args`, but - /// this also takes into account other kind of types, like arrays, - /// (`[T; 40]`), pointers: `*mut T`, etc... - /// - /// Normally we could do this check just in the `Type` kind, but we also - /// need to check the `applicable_template_args` more generally, since we - /// could need a type transitively from our parent, see the test added in - /// commit 2a3f93074dd2898669dbbce6e97e5cc4405d7cb1. - /// - /// It's kind of unfortunate (in the sense that it's a sort of complex - /// process), but I think it should get all the cases. - fn signature_contains_named_type(&self, - ctx: &BindgenContext, - ty: &Type) - -> bool { - debug_assert!(ty.is_named()); - self.expect_type().signature_contains_named_type(ctx, ty) || - self.applicable_template_args(ctx).iter().any(|template| { - ctx.resolve_type(*template).signature_contains_named_type(ctx, ty) - }) - } - - /// Returns the template arguments that apply to a struct. This is a concept - /// needed because of type declarations inside templates, for example: - /// - /// ```c++ - /// template - /// class Foo { - /// typedef T element_type; - /// typedef int Bar; - /// - /// template - /// class Baz { - /// }; - /// }; - /// ``` - /// - /// In this case, the applicable template arguments for the different types - /// would be: - /// - /// * `Foo`: [`T`] - /// * `Foo::element_type`: [`T`] - /// * `Foo::Bar`: [`T`] - /// * `Foo::Baz`: [`T`, `U`] - /// - /// You might notice that we can't generate something like: - /// - /// ```rust,ignore - /// type Foo_Bar = ::std::os::raw::c_int; - /// ``` - /// - /// since that would be invalid Rust. Still, conceptually, `Bar` *could* use - /// the template parameter type `T`, and that's exactly what this method - /// represents. The unused template parameters get stripped in the - /// `signature_contains_named_type` check. - pub fn applicable_template_args(&self, - ctx: &BindgenContext) - -> Vec { - let ty = match *self.kind() { - ItemKind::Type(ref ty) => ty, - _ => return vec![], - }; - - fn parent_contains(ctx: &BindgenContext, - parent_template_args: &[ItemId], - item: ItemId) - -> bool { - let item_ty = ctx.resolve_type(item); - parent_template_args.iter().any(|parent_item| { - let parent_ty = ctx.resolve_type(*parent_item); - match (parent_ty.kind(), item_ty.kind()) { - (&TypeKind::Named, &TypeKind::Named) => { - parent_ty.name() == item_ty.name() - } - _ => false, - } - }) - } - - match *ty.kind() { - TypeKind::Named => vec![self.id()], - TypeKind::Array(inner, _) | - TypeKind::Pointer(inner) | - TypeKind::Reference(inner) | - TypeKind::ResolvedTypeRef(inner) => { - ctx.resolve_item(inner).applicable_template_args(ctx) - } - TypeKind::Alias(inner) => { - let parent_args = ctx.resolve_item(self.parent_id()) - .applicable_template_args(ctx); - let inner = ctx.resolve_item(inner); - - // Avoid unused type parameters, sigh. - parent_args.iter() - .cloned() - .filter(|arg| { - let arg = ctx.resolve_type(*arg); - arg.is_named() && - inner.signature_contains_named_type(ctx, arg) - }) - .collect() - } - // XXX Is this completely correct? Partial template specialization - // is hard anyways, sigh... - TypeKind::TemplateAlias(_, ref args) | - TypeKind::TemplateInstantiation(_, ref args) => args.clone(), - // In a template specialization we've got all we want. - TypeKind::Comp(ref ci) if ci.is_template_specialization() => { - ci.template_args().iter().cloned().collect() - } - TypeKind::Comp(ref ci) => { - let mut parent_template_args = - ctx.resolve_item(self.parent_id()) - .applicable_template_args(ctx); - - for ty in ci.template_args() { - if !parent_contains(ctx, &parent_template_args, *ty) { - parent_template_args.push(*ty); - } - } - - parent_template_args - } - _ => vec![], - } - } - /// Is this item a module? pub fn is_module(&self) -> bool { match self.kind { @@ -680,6 +582,7 @@ impl Item { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); self.annotations.opaque() || + self.as_type().map_or(false, |ty| ty.is_opaque()) || ctx.opaque_by_name(&self.canonical_path(ctx)) } @@ -719,19 +622,12 @@ impl Item { match *item.kind() { ItemKind::Type(ref ty) => { match *ty.kind() { - // If we're a template specialization, our name is our - // parent's name. - TypeKind::Comp(ref ci) - if ci.is_template_specialization() => { - let specialized = - ci.specialized_template().unwrap(); - item = ctx.resolve_item(specialized); - } - // Same as above. - TypeKind::ResolvedTypeRef(inner) | - TypeKind::TemplateInstantiation(inner, _) => { + TypeKind::ResolvedTypeRef(inner) => { item = ctx.resolve_item(inner); } + TypeKind::TemplateInstantiation(ref inst) => { + item = ctx.resolve_item(inst.template_definition()); + } _ => return item.id(), } } @@ -845,7 +741,7 @@ impl Item { // Named template type arguments are never namespaced, and never // mangled. - if target.as_type().map_or(false, |ty| ty.is_named()) { + if target.is_named(ctx, &()) { return base_name; } @@ -917,8 +813,11 @@ impl Item { pub type ItemSet = BTreeSet; impl DotAttributes for Item { - fn dot_attributes(&self, ctx: &BindgenContext, out: &mut W) -> io::Result<()> - where W: io::Write + fn dot_attributes(&self, + ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, { try!(writeln!(out, "{:?} @@ -930,20 +829,26 @@ impl DotAttributes for Item { } impl TemplateDeclaration for ItemId { - fn self_template_params(&self, ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option> { ctx.resolve_item_fallible(*self) .and_then(|item| item.self_template_params(ctx)) } } impl TemplateDeclaration for Item { - fn self_template_params(&self, ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option> { self.kind.self_template_params(ctx) } } impl TemplateDeclaration for ItemKind { - fn self_template_params(&self, ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option> { match *self { ItemKind::Type(ref ty) => ty.self_template_params(ctx), // If we start emitting bindings to explicitly instantiated @@ -969,7 +874,7 @@ fn visit_child(cur: clang::Cursor, return CXChildVisit_Break; } - *result = Item::from_ty_with_id(id, ty, Some(cur), parent_id, ctx); + *result = Item::from_ty_with_id(id, ty, cur, parent_id, ctx); match *result { Ok(..) => CXChildVisit_Break, @@ -1062,8 +967,8 @@ impl ClangItemParser for Item { // twice, handle them separately. { let applicable_cursor = cursor.definition().unwrap_or(cursor); - match Self::from_ty(&applicable_cursor.cur_type(), - Some(applicable_cursor), + match Item::from_ty(&applicable_cursor.cur_type(), + applicable_cursor, parent_id, ctx) { Ok(ty) => return Ok(ty), @@ -1105,7 +1010,7 @@ impl ClangItemParser for Item { } fn from_ty_or_ref(ty: clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, ctx: &mut BindgenContext) -> ItemId { @@ -1125,7 +1030,7 @@ impl ClangItemParser for Item { /// `BindgenContext::resolve_typerefs`. fn from_ty_or_ref_with_id(potential_id: ItemId, ty: clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, ctx: &mut BindgenContext) -> ItemId { @@ -1137,16 +1042,20 @@ impl ClangItemParser for Item { if ctx.collected_typerefs() { debug!("refs already collected, resolving directly"); - return Self::from_ty_with_id(potential_id, + return Item::from_ty_with_id(potential_id, &ty, location, parent_id, ctx) - .expect("Unable to resolve type"); + .unwrap_or_else(|_| { + Item::new_opaque_type(potential_id, &ty, ctx) + }); } - if let Some(ty) = - ctx.builtin_or_resolved_ty(potential_id, parent_id, &ty, location) { + if let Some(ty) = ctx.builtin_or_resolved_ty(potential_id, + parent_id, + &ty, + Some(location)) { debug!("{:?} already resolved: {:?}", ty, location); return ty; } @@ -1169,14 +1078,13 @@ impl ClangItemParser for Item { potential_id } - fn from_ty(ty: &clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, ctx: &mut BindgenContext) -> Result { let id = ctx.next_item_id(); - Self::from_ty_with_id(id, ty, location, parent_id, ctx) + Item::from_ty_with_id(id, ty, location, parent_id, ctx) } /// This is one of the trickiest methods you'll find (probably along with @@ -1189,21 +1097,41 @@ impl ClangItemParser for Item { /// context. fn from_ty_with_id(id: ItemId, ty: &clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, ctx: &mut BindgenContext) -> Result { use clang_sys::*; + debug!("Item::from_ty_with_id: {:?}\n\ + \tty = {:?},\n\ + \tlocation = {:?}", + id, + ty, + location); + + if ty.kind() == clang_sys::CXType_Unexposed || + location.cur_type().kind() == clang_sys::CXType_Unexposed { + + if ty.is_associated_type() || + location.cur_type().is_associated_type() { + return Ok(Item::new_opaque_type(id, ty, ctx)); + } + + if let Some(id) = Item::named_type(Some(id), location, ctx) { + return Ok(id); + } + } + let decl = { let decl = ty.declaration(); decl.definition().unwrap_or(decl) }; let comment = decl.raw_comment() - .or_else(|| location.as_ref().and_then(|l| l.raw_comment())); + .or_else(|| location.raw_comment()); let annotations = Annotations::new(&decl) - .or_else(|| location.as_ref().and_then(|l| Annotations::new(l))); + .or_else(|| Annotations::new(&location)); if let Some(ref annotations) = annotations { if let Some(ref replaced) = annotations.use_instead_of() { @@ -1212,7 +1140,7 @@ impl ClangItemParser for Item { } if let Some(ty) = - ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { + ctx.builtin_or_resolved_ty(id, parent_id, ty, Some(location)) { return Ok(ty); } @@ -1220,11 +1148,10 @@ impl ClangItemParser for Item { let mut valid_decl = decl.kind() != CXCursor_NoDeclFound; let declaration_to_look_for = if valid_decl { decl.canonical() - } else if location.is_some() && - location.unwrap().kind() == + } else if location.kind() == CXCursor_ClassTemplate { valid_decl = true; - location.unwrap() + location } else { decl }; @@ -1255,51 +1182,47 @@ impl ClangItemParser for Item { relevant_parent_id, ItemKind::Type(item)), declaration, - location); + Some(location)); Ok(id) } Err(ParseError::Continue) => Err(ParseError::Continue), Err(ParseError::Recurse) => { debug!("Item::from_ty recursing in the ast"); let mut result = Err(ParseError::Recurse); - if let Some(ref location) = location { - // Need to pop here, otherwise we'll get stuck. - // - // TODO: Find a nicer interface, really. Also, the - // declaration_to_look_for suspiciously shares a lot of - // logic with ir::context, so we should refactor that. - if valid_decl { - let finished = ctx.finish_parsing(); - assert_eq!(*finished.decl(), declaration_to_look_for); - } - location.visit(|cur| { - visit_child(cur, id, ty, parent_id, ctx, &mut result) - }); + // Need to pop here, otherwise we'll get stuck. + // + // TODO: Find a nicer interface, really. Also, the + // declaration_to_look_for suspiciously shares a lot of + // logic with ir::context, so we should refactor that. + if valid_decl { + let finished = ctx.finish_parsing(); + assert_eq!(*finished.decl(), declaration_to_look_for); + } - if valid_decl { - let partial_ty = - PartialType::new(declaration_to_look_for, id); - ctx.begin_parsing(partial_ty); - } + location.visit(|cur| { + visit_child(cur, id, ty, parent_id, ctx, &mut result) + }); + + if valid_decl { + let partial_ty = PartialType::new(declaration_to_look_for, + id); + ctx.begin_parsing(partial_ty); } + // If we have recursed into the AST all we know, and we still - // haven't found what we've got, let's just make a named type. + // haven't found what we've got, let's just try and make a named + // type. // // This is what happens with some template members, for example. - // - // FIXME: Maybe we should restrict this to things with parent? - // It's harmless, but if we restrict that, then - // tests/headers/nsStyleAutoArray.hpp crashes. if let Err(ParseError::Recurse) = result { warn!("Unknown type, assuming named template type: \ id = {:?}; spelling = {}", id, ty.spelling()); - Ok(Self::named_type_with_id(id, - ty.spelling(), - relevant_parent_id, - ctx)) + Item::named_type(Some(id), location, ctx) + .map(Ok) + .unwrap_or(Err(ParseError::Recurse)) } else { result } @@ -1317,40 +1240,150 @@ impl ClangItemParser for Item { /// A named type is a template parameter, e.g., the "T" in Foo. They're /// always local so it's the only exception when there's no declaration for /// a type. - /// - /// It must have an id, and must not be the current module id. Ideally we - /// could assert the parent id is a Comp(..) type, but that info isn't - /// available yet. - fn named_type_with_id(id: ItemId, - name: S, - parent_id: ItemId, - ctx: &mut BindgenContext) - -> ItemId - where S: Into, - { - // see tests/headers/const_tparam.hpp - // and tests/headers/variadic_tname.hpp - let name = name.into().replace("const ", "").replace(".", ""); + fn named_type(with_id: Option, + location: clang::Cursor, + ctx: &mut BindgenContext) + -> Option { + let ty = location.cur_type(); + + debug!("Item::named_type:\n\ + \twith_id = {:?},\n\ + \tty = {} {:?},\n\ + \tlocation: {:?}", + with_id, + ty.spelling(), + ty, + location); + + if ty.kind() != clang_sys::CXType_Unexposed { + // If the given cursor's type's kind is not Unexposed, then we + // aren't looking at a template parameter. This check may need to be + // updated in the future if they start properly exposing template + // type parameters. + return None; + } - ctx.add_item(Item::new(id, - None, - None, - parent_id, - ItemKind::Type(Type::named(name))), - None, - None); + let ty_spelling = ty.spelling(); - id - } + // Clang does not expose any information about template type parameters + // via their clang::Type, nor does it give us their canonical cursors + // the straightforward way. However, there are three situations from + // which we can find the definition of the template type parameter, if + // the cursor is indeed looking at some kind of a template type + // parameter or use of one: + // + // 1. The cursor is pointing at the template type parameter's + // definition. This is the trivial case. + // + // (kind = TemplateTypeParameter, ...) + // + // 2. The cursor is pointing at a TypeRef whose referenced() cursor is + // situation (1). + // + // (kind = TypeRef, + // referenced = (kind = TemplateTypeParameter, ...), + // ...) + // + // 3. The cursor is pointing at some use of a template type parameter + // (for example, in a FieldDecl), and this cursor has a child cursor + // whose spelling is the same as the parent's type's spelling, and whose + // kind is a TypeRef of the situation (2) variety. + // + // (kind = FieldDecl, + // type = (kind = Unexposed, + // spelling = "T", + // ...), + // children = + // (kind = TypeRef, + // spelling = "T", + // referenced = (kind = TemplateTypeParameter, + // spelling = "T", + // ...), + // ...) + // ...) + // + // TODO: The alternative to this hacky pattern matching would be to + // maintain proper scopes of template parameters while parsing and use + // de Brujin indices to access template parameters, which clang exposes + // in the cursor's type's canonical type's spelling: + // "type-parameter-x-y". That is probably a better approach long-term, + // but maintaining these scopes properly would require more changes to + // the whole libclang -> IR parsing code. + + fn is_template_with_spelling(refd: &clang::Cursor, + spelling: &str) + -> bool { + refd.kind() == clang_sys::CXCursor_TemplateTypeParameter && + refd.spelling() == spelling + } - fn named_type(name: S, - parent_id: ItemId, - ctx: &mut BindgenContext) - -> ItemId - where S: Into, - { - let id = ctx.next_item_id(); - Self::named_type_with_id(id, name, parent_id, ctx) + let definition = if is_template_with_spelling(&location, + &ty_spelling) { + // Situation (1) + location + } else if location.kind() == + clang_sys::CXCursor_TypeRef { + // Situation (2) + match location.referenced() { + Some(refd) if is_template_with_spelling(&refd, + &ty_spelling) => refd, + _ => return None, + } + } else { + // Situation (3) + let mut definition = None; + + location.visit(|child| { + let child_ty = child.cur_type(); + if child_ty.kind() == clang_sys::CXCursor_TypeRef && + child_ty.spelling() == ty_spelling { + match child.referenced() { + Some(refd) if is_template_with_spelling(&refd, &ty_spelling) => { + definition = Some(refd); + return clang_sys::CXChildVisit_Break; + } + _ => {} + } + } + + clang_sys::CXChildVisit_Continue + }); + + if let Some(def) = definition { + def + } else { + return None; + } + }; + assert!(is_template_with_spelling(&definition, &ty_spelling)); + + // Named types are always parented to the root module. They are never + // referenced with namespace prefixes, and they can't inherit anything + // from their parent either, so it is simplest to just hang them off + // something we know will always exist. + let parent = ctx.root_module(); + + if let Some(id) = ctx.get_named_type(&definition) { + if let Some(with_id) = with_id { + return Some(ctx.build_ty_wrapper(with_id, id, Some(parent), &ty)); + } else { + return Some(id); + } + } + + // See tests/headers/const_tparam.hpp and + // tests/headers/variadic_tname.hpp. + let name = ty_spelling.replace("const ", "") + .replace(".", ""); + + let id = with_id.unwrap_or_else(|| ctx.next_item_id()); + let item = Item::new(id, + None, + None, + parent, + ItemKind::Type(Type::named(name))); + ctx.add_named_type(item, definition); + Some(id) } } diff --git a/src/ir/item_kind.rs b/src/ir/item_kind.rs index 6dfd6764ce..419f9d4421 100644 --- a/src/ir/item_kind.rs +++ b/src/ir/item_kind.rs @@ -1,12 +1,12 @@ //! Different variants of an `Item` in our intermediate representation. -use std::io; use super::context::BindgenContext; use super::dot::DotAttributes; use super::function::Function; use super::module::Module; use super::ty::Type; use super::var::Var; +use std::io; /// A item we parse and translate. #[derive(Debug)] @@ -41,7 +41,7 @@ impl ItemKind { ItemKind::Module(..) => "Module", ItemKind::Type(..) => "Type", ItemKind::Function(..) => "Function", - ItemKind::Var(..) => "Var" + ItemKind::Var(..) => "Var", } } @@ -127,10 +127,15 @@ impl ItemKind { } impl DotAttributes for ItemKind { - fn dot_attributes(&self, ctx: &BindgenContext, out: &mut W) -> io::Result<()> - where W: io::Write + fn dot_attributes(&self, + ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, { - try!(writeln!(out, "kind{}", self.kind_name())); + try!(writeln!(out, + "kind{}", + self.kind_name())); match *self { ItemKind::Module(ref module) => module.dot_attributes(ctx, out), diff --git a/src/ir/layout.rs b/src/ir/layout.rs index f21a501caf..21382b2d99 100644 --- a/src/ir/layout.rs +++ b/src/ir/layout.rs @@ -2,7 +2,8 @@ use super::context::BindgenContext; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; -use super::ty::RUST_DERIVE_IN_ARRAY_LIMIT; +use super::ty::{RUST_DERIVE_IN_ARRAY_LIMIT, Type, TypeKind}; +use clang; use std::{cmp, mem}; /// A type that represents the struct layout of a type. @@ -20,7 +21,8 @@ pub struct Layout { fn test_layout_for_size() { let ptr_size = mem::size_of::<*mut ()>(); assert_eq!(Layout::for_size(ptr_size), Layout::new(ptr_size, ptr_size)); - assert_eq!(Layout::for_size(3 * ptr_size), Layout::new(3 * ptr_size, ptr_size)); + assert_eq!(Layout::for_size(3 * ptr_size), + Layout::new(3 * ptr_size, ptr_size)); } impl Layout { @@ -38,7 +40,8 @@ impl Layout { /// alignment possible. pub fn for_size(size: usize) -> Self { let mut next_align = 2; - while size % next_align == 0 && next_align <= mem::size_of::<*mut ()>() { + while size % next_align == 0 && + next_align <= mem::size_of::<*mut ()>() { next_align *= 2; } Layout { @@ -65,9 +68,17 @@ impl Layout { } /// When we are treating a type as opaque, it is just a blob with a `Layout`. +#[derive(Clone, Debug, PartialEq)] pub struct Opaque(pub Layout); impl Opaque { + /// Construct a new opaque type from the given clang type. + pub fn from_clang_ty(ty: &clang::Type) -> Type { + let layout = Layout::new(ty.size(), ty.align()); + let ty_kind = TypeKind::Opaque; + Type::new(None, Some(layout), ty_kind, false) + } + /// Return the known rust type we should use to create a correctly-aligned /// field with this layout. pub fn known_rust_type_for_array(&self) -> Option<&'static str> { diff --git a/src/ir/mod.rs b/src/ir/mod.rs index ba549c5115..d703e53dbb 100644 --- a/src/ir/mod.rs +++ b/src/ir/mod.rs @@ -16,6 +16,7 @@ pub mod item_kind; pub mod layout; pub mod module; pub mod named; +pub mod template; pub mod traversal; pub mod ty; pub mod var; diff --git a/src/ir/module.rs b/src/ir/module.rs index 6787e3f902..ee3912c5f1 100644 --- a/src/ir/module.rs +++ b/src/ir/module.rs @@ -1,11 +1,11 @@ //! Intermediate representation for modules (AKA C++ namespaces). -use std::io; use super::context::{BindgenContext, ItemId}; use super::dot::DotAttributes; use clang; use parse::{ClangSubItemParser, ParseError, ParseResult}; use parse_one; +use std::io; /// Whether this module is inline or not. #[derive(Debug, Copy, Clone, PartialEq, Eq)] @@ -59,12 +59,13 @@ impl Module { } impl DotAttributes for Module { - fn dot_attributes(&self, _ctx: &BindgenContext, out: &mut W) -> io::Result<()> - where W: io::Write + fn dot_attributes(&self, + _ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, { - writeln!(out, - "ModuleKind{:?}", - self.kind) + writeln!(out, "ModuleKind{:?}", self.kind) } } diff --git a/src/ir/named.rs b/src/ir/named.rs index 3c6766629e..7cae195bf0 100644 --- a/src/ir/named.rs +++ b/src/ir/named.rs @@ -126,12 +126,13 @@ //! //! [spa]: https://cs.au.dk/~amoeller/spa/spa.pdf -use std::collections::HashMap; -use std::fmt; use super::context::{BindgenContext, ItemId}; use super::item::ItemSet; +use super::template::AsNamed; use super::traversal::{EdgeKind, Trace}; use super::ty::{TemplateDeclaration, TypeKind}; +use std::collections::HashMap; +use std::fmt; /// An analysis in the monotone framework. /// @@ -163,7 +164,7 @@ pub trait MonotoneFramework: Sized + fmt::Debug { /// The final output of this analysis. Once we have reached a fix-point, we /// convert `self` into this type, and return it as the final result of the /// analysis. - type Output: From; + type Output: From + fmt::Debug; /// Construct a new instance of this analysis. fn new(extra: Self::Extra) -> Self; @@ -191,12 +192,8 @@ pub trait MonotoneFramework: Sized + fmt::Debug { } /// Run an analysis in the monotone framework. -// TODO: This allow(...) is just temporary until we replace -// `Item::signature_contains_named_type` with -// `analyze::`. -#[allow(dead_code)] pub fn analyze(extra: Analysis::Extra) -> Analysis::Output - where Analysis: MonotoneFramework + where Analysis: MonotoneFramework, { let mut analysis = Analysis::new(extra); let mut worklist = analysis.initial_worklist(); @@ -256,13 +253,19 @@ pub fn analyze(extra: Analysis::Extra) -> Analysis::Output /// self_template_param_usage(_) = { } /// ``` #[derive(Debug, Clone)] -pub struct UsedTemplateParameters<'a> { - ctx: &'a BindgenContext<'a>, - used: HashMap, +pub struct UsedTemplateParameters<'ctx, 'gen> + where 'gen: 'ctx, +{ + ctx: &'ctx BindgenContext<'gen>, + + // The Option is only there for temporary moves out of the hash map. See the + // comments in `UsedTemplateParameters::constrain` below. + used: HashMap>, + dependencies: HashMap>, } -impl<'a> UsedTemplateParameters<'a> { +impl<'ctx, 'gen> UsedTemplateParameters<'ctx, 'gen> { fn consider_edge(kind: EdgeKind) -> bool { match kind { // For each of these kinds of edges, if the referent uses a template @@ -271,19 +274,24 @@ impl<'a> UsedTemplateParameters<'a> { EdgeKind::TemplateArgument | EdgeKind::BaseMember | EdgeKind::Field | - EdgeKind::InnerType | - EdgeKind::InnerVar | EdgeKind::Constructor | EdgeKind::VarType | + EdgeKind::FunctionReturn | + EdgeKind::FunctionParameter | EdgeKind::TypeReference => true, - // We can't emit machine code for new instantiations of function - // templates and class templates' methods (and don't detect explicit - // instantiations) so we must ignore template parameters that are - // only used by functions. - EdgeKind::Method | - EdgeKind::FunctionReturn | - EdgeKind::FunctionParameter => false, + // An inner var or type using a template parameter is orthogonal + // from whether we use it. See template-param-usage-{6,11}.hpp. + EdgeKind::InnerVar | EdgeKind::InnerType => false, + + // We can't emit machine code for new monomorphizations of class + // templates' methods (and don't detect explicit instantiations) so + // we must ignore template parameters that are only used by + // methods. This doesn't apply to a function type's return or + // parameter types, however, because of type aliases of function + // pointers that use template parameters, eg + // tests/headers/struct_with_typedef_template_arg.hpp + EdgeKind::Method => false, // If we considered these edges, we would end up mistakenly claiming // that every template parameter always used. @@ -299,25 +307,30 @@ impl<'a> UsedTemplateParameters<'a> { } } -impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { +impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { type Node = ItemId; - type Extra = &'a BindgenContext<'a>; + type Extra = &'ctx BindgenContext<'gen>; type Output = HashMap; - fn new(ctx: &'a BindgenContext<'a>) -> UsedTemplateParameters<'a> { + fn new(ctx: &'ctx BindgenContext<'gen>) + -> UsedTemplateParameters<'ctx, 'gen> { let mut used = HashMap::new(); let mut dependencies = HashMap::new(); for item in ctx.whitelisted_items() { dependencies.entry(item).or_insert(vec![]); - used.insert(item, ItemSet::new()); + used.insert(item, Some(ItemSet::new())); { // We reverse our natural IR graph edges to find dependencies // between nodes. - item.trace(ctx, &mut |sub_item, _| { - dependencies.entry(sub_item).or_insert(vec![]).push(item); - }, &()); + item.trace(ctx, + &mut |sub_item, _| { + dependencies.entry(sub_item) + .or_insert(vec![]) + .push(item); + }, + &()); } // Additionally, whether a template instantiation's template @@ -326,14 +339,18 @@ impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { ctx.resolve_item(item) .as_type() .map(|ty| match ty.kind() { - &TypeKind::TemplateInstantiation(decl, ref args) => { - let decl = ctx.resolve_type(decl); + &TypeKind::TemplateInstantiation(ref inst) => { + let decl = ctx.resolve_type(inst.template_definition()); + let args = inst.template_arguments(); + // Although template definitions should always have + // template parameters, there is a single exception: + // opaque templates. Hence the unwrap_or. let params = decl.self_template_params(ctx) - .expect("a template instantiation's referenced \ - template declaration should have template \ - parameters"); + .unwrap_or(vec![]); for (arg, param) in args.iter().zip(params.iter()) { - dependencies.entry(*arg).or_insert(vec![]).push(*param); + dependencies.entry(*arg) + .or_insert(vec![]) + .push(*param); } } _ => {} @@ -352,59 +369,81 @@ impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { } fn constrain(&mut self, id: ItemId) -> bool { - let original_len = self.used[&id].len(); + // Invariant: all hash map entries' values are `Some` upon entering and + // exiting this method. + debug_assert!(self.used.values().all(|v| v.is_some())); + + // Take the set for this id out of the hash map while we mutate it based + // on other hash map entries. We *must* put it back into the hash map at + // the end of this method. This allows us to side-step HashMap's lack of + // an analog to slice::split_at_mut. + let mut used_by_this_id = + self.used.get_mut(&id).unwrap().take().unwrap(); + + let original_len = used_by_this_id.len(); - // First, add this item's self template parameter usage. let item = self.ctx.resolve_item(id); let ty_kind = item.as_type().map(|ty| ty.kind()); match ty_kind { + // Named template type parameters trivially use themselves. Some(&TypeKind::Named) => { - // This is a trivial use of the template type parameter. - self.used.get_mut(&id).unwrap().insert(id); + used_by_this_id.insert(id); } - Some(&TypeKind::TemplateInstantiation(decl, ref args)) => { - // A template instantiation's concrete template argument is - // only used if the template declaration uses the - // corresponding template parameter. + + // A template instantiation's concrete template argument is + // only used if the template declaration uses the + // corresponding template parameter. + Some(&TypeKind::TemplateInstantiation(ref inst)) => { + let decl = self.ctx.resolve_type(inst.template_definition()); + let args = inst.template_arguments(); + let params = decl.self_template_params(self.ctx) - .expect("a template instantiation's referenced \ - template declaration should have template \ - parameters"); + .unwrap_or(vec![]); for (arg, param) in args.iter().zip(params.iter()) { - if self.used[&decl].contains(param) { - if self.ctx.resolve_item(*arg).is_named() { - self.used.get_mut(&id).unwrap().insert(*arg); + let used_by_definition = self.used + [&inst.template_definition()] + .as_ref() + .unwrap(); + if used_by_definition.contains(param) { + if let Some(named) = arg.as_named(self.ctx, &()) { + used_by_this_id.insert(named); } } } } - _ => {} - } - // Second, add the union of each of its referent item's template - // parameter usage. - item.trace(self.ctx, &mut |sub_id, edge_kind| { - if sub_id == id || !Self::consider_edge(edge_kind) { - return; + // Otherwise, add the union of each of its referent item's template + // parameter usage. + _ => { + item.trace(self.ctx, + &mut |sub_id, edge_kind| { + if sub_id == id || !Self::consider_edge(edge_kind) { + return; + } + + let used_by_sub_id = self.used[&sub_id] + .as_ref() + .unwrap() + .iter() + .cloned(); + used_by_this_id.extend(used_by_sub_id); + }, + &()); } + } - // This clone is unfortunate because we are potentially thrashing - // malloc. We could investigate replacing the ItemSet values with - // Rc> to make the borrow checker happy, but it - // isn't clear that the added indirection wouldn't outweigh the cost - // of malloc'ing a new ItemSet here. Ideally, `HashMap` would have a - // `split_entries` method analogous to `slice::split_at_mut`... - let to_add = self.used[&sub_id].clone(); - self.used.get_mut(&id).unwrap().extend(to_add); - }, &()); - - let new_len = self.used[&id].len(); + let new_len = used_by_this_id.len(); assert!(new_len >= original_len); + + // Put the set back in the hash map and restore our invariant. + self.used.insert(id, Some(used_by_this_id)); + debug_assert!(self.used.values().all(|v| v.is_some())); + new_len != original_len } fn each_depending_on(&self, item: ItemId, mut f: F) - where F: FnMut(Self::Node) + where F: FnMut(ItemId), { if let Some(edges) = self.dependencies.get(&item) { for item in edges { @@ -414,16 +453,20 @@ impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { } } -impl<'a> From> for HashMap { - fn from(used_templ_params: UsedTemplateParameters) -> Self { +impl<'ctx, 'gen> From> + for HashMap { + fn from(used_templ_params: UsedTemplateParameters<'ctx, 'gen>) -> Self { used_templ_params.used + .into_iter() + .map(|(k, v)| (k, v.unwrap())) + .collect() } } #[cfg(test)] mod tests { - use std::collections::{HashMap, HashSet}; use super::*; + use std::collections::{HashMap, HashSet}; // Here we find the set of nodes that are reachable from any given // node. This is a lattice mapping nodes to subsets of all nodes. Our join @@ -489,7 +532,7 @@ mod tests { g.0.insert(Node(8), vec![]); g } - + fn reverse(&self) -> Graph { let mut reversed = Graph::default(); for (node, edges) in self.0.iter() { @@ -537,8 +580,9 @@ mod tests { // Yes, what follows is a **terribly** inefficient set union // implementation. Don't copy this code outside of this test! - let original_size = self.reachable.entry(node).or_insert(HashSet::new()).len(); - + let original_size = + self.reachable.entry(node).or_insert(HashSet::new()).len(); + for sub_node in self.graph.0[&node].iter() { self.reachable.get_mut(&node).unwrap().insert(*sub_node); @@ -557,7 +601,7 @@ mod tests { } fn each_depending_on(&self, node: Node, mut f: F) - where F: FnMut(Node) + where F: FnMut(Node), { for dep in self.reversed.0[&node].iter() { f(*dep); @@ -578,19 +622,19 @@ mod tests { println!("reachable = {:#?}", reachable); fn nodes
    (nodes: A) -> HashSet - where A: AsRef<[usize]> + where A: AsRef<[usize]>, { nodes.as_ref().iter().cloned().map(Node).collect() } let mut expected = HashMap::new(); - expected.insert(Node(1), nodes([3,4,5,6,7,8])); + expected.insert(Node(1), nodes([3, 4, 5, 6, 7, 8])); expected.insert(Node(2), nodes([2])); - expected.insert(Node(3), nodes([3,4,5,6,7,8])); - expected.insert(Node(4), nodes([3,4,5,6,7,8])); - expected.insert(Node(5), nodes([3,4,5,6,7,8])); + expected.insert(Node(3), nodes([3, 4, 5, 6, 7, 8])); + expected.insert(Node(4), nodes([3, 4, 5, 6, 7, 8])); + expected.insert(Node(5), nodes([3, 4, 5, 6, 7, 8])); expected.insert(Node(6), nodes([8])); - expected.insert(Node(7), nodes([3,4,5,6,7,8])); + expected.insert(Node(7), nodes([3, 4, 5, 6, 7, 8])); expected.insert(Node(8), nodes([])); println!("expected = {:#?}", expected); diff --git a/src/ir/template.rs b/src/ir/template.rs new file mode 100644 index 0000000000..627ac225f8 --- /dev/null +++ b/src/ir/template.rs @@ -0,0 +1,193 @@ +//! Template declaration and instantiation related things. +//! +//! The nomenclature surrounding templates is often confusing, so here are a few +//! brief definitions: +//! +//! * "Template definition": a class/struct/alias/function definition that takes +//! generic template parameters. For example: +//! +//! ```c++ +//! template +//! class List { +//! // ... +//! }; +//! ``` +//! +//! * "Template instantiation": an instantiation is a use of a template with +//! concrete template arguments. For example, `List`. +//! +//! * "Template specialization": an alternative template definition providing a +//! custom definition for instantiations with the matching template +//! arguments. This C++ feature is unsupported by bindgen. For example: +//! +//! ```c++ +//! template<> +//! class List { +//! // Special layout for int lists... +//! }; +//! ``` + +use super::context::{BindgenContext, ItemId}; +use super::derive::{CanDeriveCopy, CanDeriveDebug}; +use super::item::Item; +use super::layout::Layout; +use super::traversal::{EdgeKind, Trace, Tracer}; +use clang; +use parse::ClangItemParser; + +/// A trait for things which may or may not be a named template type parameter. +pub trait AsNamed { + /// Any extra information the implementor might need to make this decision. + type Extra; + + /// Convert this thing to the item id of a named template type parameter. + fn as_named(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> Option; + + /// Is this a named template type parameter? + fn is_named(&self, ctx: &BindgenContext, extra: &Self::Extra) -> bool { + self.as_named(ctx, extra).is_some() + } +} + +/// A concrete instantiation of a generic template. +#[derive(Clone, Debug)] +pub struct TemplateInstantiation { + /// The template definition which this is instantiating. + definition: ItemId, + /// The concrete template arguments, which will be substituted in the + /// definition for the generic template parameters. + args: Vec, +} + +impl TemplateInstantiation { + /// Construct a new template instantiation from the given parts. + pub fn new(template_definition: ItemId, + template_args: I) + -> TemplateInstantiation + where I: IntoIterator, + { + TemplateInstantiation { + definition: template_definition, + args: template_args.into_iter().collect(), + } + } + + /// Get the template definition for this instantiation. + pub fn template_definition(&self) -> ItemId { + self.definition + } + + /// Get the concrete template arguments used in this instantiation. + pub fn template_arguments(&self) -> &[ItemId] { + &self.args[..] + } + + /// Parse a `TemplateInstantiation` from a clang `Type`. + pub fn from_ty(ty: &clang::Type, + ctx: &mut BindgenContext) + -> TemplateInstantiation { + use clang_sys::*; + + let template_args = ty.template_args() + .map_or(vec![], |args| { + args.filter(|t| t.kind() != CXType_Invalid) + .map(|t| { + Item::from_ty_or_ref(t, t.declaration(), None, ctx) + }) + .collect() + }); + + let definition = ty.declaration() + .specialized() + .or_else(|| { + let mut template_ref = None; + ty.declaration().visit(|child| { + if child.kind() == CXCursor_TemplateRef { + template_ref = Some(child); + return CXVisit_Break; + } + + // Instantiations of template aliases might have the + // TemplateRef to the template alias definition arbitrarily + // deep, so we need to recurse here and not only visit + // direct children. + CXChildVisit_Recurse + }); + + template_ref.and_then(|cur| cur.referenced()) + }) + .expect("Should have found the template definition one way or another"); + + let template_definition = + Item::from_ty_or_ref(definition.cur_type(), definition, None, ctx); + + TemplateInstantiation::new(template_definition, template_args) + } + + /// Does this instantiation have a vtable? + pub fn has_vtable(&self, ctx: &BindgenContext) -> bool { + ctx.resolve_type(self.definition).has_vtable(ctx) || + self.args.iter().any(|arg| ctx.resolve_type(*arg).has_vtable(ctx)) + } + + /// Does this instantiation have a destructor? + pub fn has_destructor(&self, ctx: &BindgenContext) -> bool { + ctx.resolve_type(self.definition).has_destructor(ctx) || + self.args.iter().any(|arg| ctx.resolve_type(*arg).has_destructor(ctx)) + } +} + +impl<'a> CanDeriveCopy<'a> for TemplateInstantiation { + type Extra = (); + + fn can_derive_copy(&self, ctx: &BindgenContext, _: ()) -> bool { + self.definition.can_derive_copy(ctx, ()) && + self.args.iter().all(|arg| arg.can_derive_copy(ctx, ())) + } + + fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { + self.definition.can_derive_copy_in_array(ctx, ()) && + self.args.iter().all(|arg| arg.can_derive_copy_in_array(ctx, ())) + } +} + +impl CanDeriveDebug for TemplateInstantiation { + type Extra = Option; + + fn can_derive_debug(&self, + ctx: &BindgenContext, + layout: Option) + -> bool { + self.args.iter().all(|arg| arg.can_derive_debug(ctx, ())) && + ctx.resolve_type(self.definition) + .as_comp() + .and_then(|c| { + // For non-type template parameters, we generate an opaque + // blob, and in this case the instantiation has a better + // idea of the layout than the definition does. + if c.has_non_type_template_params() { + let opaque = layout.unwrap_or(Layout::zero()).opaque(); + Some(opaque.can_derive_debug(ctx, ())) + } else { + None + } + }) + .unwrap_or_else(|| self.definition.can_derive_debug(ctx, ())) + } +} + +impl Trace for TemplateInstantiation { + type Extra = (); + + fn trace(&self, _ctx: &BindgenContext, tracer: &mut T, _: &()) + where T: Tracer, + { + tracer.visit_kind(self.definition, EdgeKind::TemplateDeclaration); + for &item in self.template_arguments() { + tracer.visit_kind(item, EdgeKind::TemplateArgument); + } + } +} diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs index 30772aadba..95d2a45675 100644 --- a/src/ir/traversal.rs +++ b/src/ir/traversal.rs @@ -318,7 +318,7 @@ pub trait Tracer { } impl Tracer for F - where F: FnMut(ItemId, EdgeKind) + where F: FnMut(ItemId, EdgeKind), { fn visit_kind(&mut self, item: ItemId, kind: EdgeKind) { (*self)(item, kind) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 51652000e1..6c8e736355 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -8,22 +8,31 @@ use super::enum_ty::Enum; use super::function::FunctionSig; use super::int::IntKind; use super::item::{Item, ItemAncestors}; -use super::layout::Layout; +use super::layout::{Layout, Opaque}; use super::objc::ObjCInterface; +use super::template::{AsNamed, TemplateInstantiation}; use super::traversal::{EdgeKind, Trace, Tracer}; use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; +use std::cell::Cell; use std::io; use std::mem; /// Template declaration (and such declaration's template parameters) related /// methods. /// +/// This trait's methods distinguish between `None` and `Some([])` for +/// declarations that are not templates and template declarations with zero +/// parameters, in general. +/// /// Consider this example: /// /// ```c++ /// template /// class Foo { +/// T use_of_t; +/// U use_of_u; +/// /// template /// using Bar = V*; /// @@ -32,6 +41,18 @@ use std::mem; /// U y; /// Bar z; /// }; +/// +/// template +/// class Lol { +/// // No use of W, but here's a use of T. +/// T t; +/// }; +/// +/// template +/// class Wtf { +/// // X is not used because W is not used. +/// Lol lololol; +/// }; /// }; /// /// class Qux { @@ -40,16 +61,29 @@ use std::mem; /// ``` /// /// The following table depicts the results of each trait method when invoked on -/// `Foo`, `Bar`, and `Qux`. +/// each of the declarations above: /// -/// +------+----------------------+--------------------------+------------------------+ -/// |Decl. | self_template_params | num_self_template_params | all_template_parameters| -/// +------+----------------------+--------------------------+------------------------+ -/// |Foo | Some([T, U]) | Some(2) | Some([T, U]) | -/// |Bar | Some([V]) | Some(1) | Some([T, U, V]) | -/// |Inner | None | None | Some([T, U]) | -/// |Qux | None | None | None | -/// +------+----------------------+--------------------------+------------------------+ +/// +------+----------------------+--------------------------+------------------------+---- +/// |Decl. | self_template_params | num_self_template_params | all_template_parameters| ... +/// +------+----------------------+--------------------------+------------------------+---- +/// |Foo | Some([T, U]) | Some(2) | Some([T, U]) | ... +/// |Bar | Some([V]) | Some(1) | Some([T, U, V]) | ... +/// |Inner | None | None | Some([T, U]) | ... +/// |Lol | Some([W]) | Some(1) | Some([T, U, W]) | ... +/// |Wtf | Some([X]) | Some(1) | Some([T, U, X]) | ... +/// |Qux | None | None | None | ... +/// +------+----------------------+--------------------------+------------------------+---- +/// +/// ----+------+-----+----------------------+ +/// ... |Decl. | ... | used_template_params | +/// ----+------+-----+----------------------+ +/// ... |Foo | ... | Some([T, U]) | +/// ... |Bar | ... | Some([V]) | +/// ... |Inner | ... | None | +/// ... |Lol | ... | Some([T]) | +/// ... |Wtf | ... | Some([T]) | +/// ... |Qux | ... | None | +/// ----+------+-----+----------------------+ pub trait TemplateDeclaration { /// Get the set of `ItemId`s that make up this template declaration's free /// template parameters. @@ -59,7 +93,9 @@ pub trait TemplateDeclaration { /// parameters. Of course, Rust does not allow generic parameters to be /// anything but types, so we must treat them as opaque, and avoid /// instantiating them. - fn self_template_params(&self, ctx: &BindgenContext) -> Option>; + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option>; /// Get the number of free template parameters this template declaration /// has. @@ -87,7 +123,7 @@ pub trait TemplateDeclaration { /// `Foo::Inner`. `Foo` *must* be instantiated with template /// arguments before we can gain access to the `Inner` member type. fn all_template_params(&self, ctx: &BindgenContext) -> Option> - where Self: ItemAncestors + where Self: ItemAncestors, { let each_self_params: Vec> = self.ancestors(ctx) .filter_map(|id| id.self_template_params(ctx)) @@ -96,11 +132,30 @@ pub trait TemplateDeclaration { None } else { Some(each_self_params.into_iter() - .rev() - .flat_map(|params| params) - .collect()) + .rev() + .flat_map(|params| params) + .collect()) } } + + /// Get only the set of template parameters that this item uses. This is a + /// subset of `all_template_params` and does not necessarily contain any of + /// `self_template_params`. + fn used_template_params(&self, ctx: &BindgenContext) -> Option> + where Self: AsRef, + { + assert!(ctx.in_codegen_phase(), + "template parameter usage is not computed until codegen"); + + let id = *self.as_ref(); + ctx.resolve_item(id) + .all_template_params(ctx) + .map(|all_params| { + all_params.into_iter() + .filter(|p| ctx.uses_template_parameter(id, *p)) + .collect() + }) + } } /// The base representation of a type in bindgen. @@ -118,6 +173,9 @@ pub struct Type { kind: TypeKind, /// Whether this type is const-qualified. is_const: bool, + /// Don't go into an infinite loop when detecting if we have a vtable or + /// not. + detect_has_vtable_cycle: Cell, } /// The maximum number of items in an array for which Rust implements common @@ -148,6 +206,7 @@ impl Type { layout: layout, kind: kind, is_const: is_const, + detect_has_vtable_cycle: Cell::new(false), } } @@ -174,7 +233,15 @@ impl Type { } } - /// Is this a named type? + /// Is this type of kind `TypeKind::Opaque`? + pub fn is_opaque(&self) -> bool { + match self.kind { + TypeKind::Opaque => true, + _ => false, + } + } + + /// Is this type of kind `TypeKind::Named`? pub fn is_named(&self) -> bool { match self.kind { TypeKind::Named => true, @@ -304,67 +371,39 @@ impl Type { /// Whether this type has a vtable. pub fn has_vtable(&self, ctx: &BindgenContext) -> bool { + if self.detect_has_vtable_cycle.get() { + return false; + } + + self.detect_has_vtable_cycle.set(true); + // FIXME: Can we do something about template parameters? Huh... - match self.kind { - TypeKind::TemplateInstantiation(t, _) | + let result = match self.kind { TypeKind::TemplateAlias(t, _) | TypeKind::Alias(t) | TypeKind::ResolvedTypeRef(t) => ctx.resolve_type(t).has_vtable(ctx), TypeKind::Comp(ref info) => info.has_vtable(ctx), + TypeKind::TemplateInstantiation(ref inst) => inst.has_vtable(ctx), _ => false, - } + }; + self.detect_has_vtable_cycle.set(false); + + result } /// Returns whether this type has a destructor. pub fn has_destructor(&self, ctx: &BindgenContext) -> bool { match self.kind { - TypeKind::TemplateInstantiation(t, _) | TypeKind::TemplateAlias(t, _) | TypeKind::Alias(t) | TypeKind::ResolvedTypeRef(t) => { ctx.resolve_type(t).has_destructor(ctx) } - TypeKind::Comp(ref info) => info.has_destructor(ctx), - _ => false, - } - } - - /// See the comment in `Item::signature_contains_named_type`. - pub fn signature_contains_named_type(&self, - ctx: &BindgenContext, - ty: &Type) - -> bool { - let name = match *ty.kind() { - TypeKind::Named => ty.name(), - ref other @ _ => unreachable!("Not a named type: {:?}", other), - }; - - match self.kind { - TypeKind::Named => self.name() == name, - TypeKind::ResolvedTypeRef(t) | - TypeKind::Array(t, _) | - TypeKind::Pointer(t) | - TypeKind::Alias(t) => { - ctx.resolve_type(t) - .signature_contains_named_type(ctx, ty) - } - TypeKind::Function(ref sig) => { - sig.argument_types().iter().any(|&(_, arg)| { - ctx.resolve_type(arg) - .signature_contains_named_type(ctx, ty) - }) || - ctx.resolve_type(sig.return_type()) - .signature_contains_named_type(ctx, ty) - } - TypeKind::TemplateAlias(_, ref template_args) | - TypeKind::TemplateInstantiation(_, ref template_args) => { - template_args.iter().any(|arg| { - ctx.resolve_type(*arg) - .signature_contains_named_type(ctx, ty) - }) + TypeKind::TemplateInstantiation(ref inst) => { + inst.has_destructor(ctx) } - TypeKind::Comp(ref ci) => ci.signature_contains_named_type(ctx, ty), + TypeKind::Comp(ref info) => info.has_destructor(ctx), _ => false, } } @@ -387,7 +426,9 @@ impl Type { /// i.e. is alphanumeric (including '_') and does not start with a digit. pub fn is_valid_identifier(name: &str) -> bool { let mut chars = name.chars(); - let first_valid = chars.next().map(|c| c.is_alphabetic() || c == '_').unwrap_or(false); + let first_valid = chars.next() + .map(|c| c.is_alphabetic() || c == '_') + .unwrap_or(false); first_valid && chars.all(|c| c.is_alphanumeric() || c == '_') } @@ -403,7 +444,7 @@ impl Type { /// Returns the canonical type of this type, that is, the "inner type". /// /// For example, for a `typedef`, the canonical type would be the - /// `typedef`ed type, for a template specialization, would be the template + /// `typedef`ed type, for a template instantiation, would be the template /// its specializing, and so on. Return None if the type is unresolved. pub fn safe_canonical_type<'tr>(&'tr self, ctx: &'tr BindgenContext) @@ -412,6 +453,7 @@ impl Type { TypeKind::Named | TypeKind::Array(..) | TypeKind::Comp(..) | + TypeKind::Opaque | TypeKind::Int(..) | TypeKind::Float(..) | TypeKind::Complex(..) | @@ -428,10 +470,13 @@ impl Type { TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(inner) | - TypeKind::TemplateAlias(inner, _) | - TypeKind::TemplateInstantiation(inner, _) => { + TypeKind::TemplateAlias(inner, _) => { ctx.resolve_type(inner).safe_canonical_type(ctx) } + TypeKind::TemplateInstantiation(ref inst) => { + ctx.resolve_type(inst.template_definition()) + .safe_canonical_type(ctx) + } TypeKind::UnresolvedTypeRef(..) => None, } @@ -452,9 +497,32 @@ impl Type { } } +impl AsNamed for Type { + type Extra = Item; + + fn as_named(&self, ctx: &BindgenContext, item: &Item) -> Option { + self.kind.as_named(ctx, item) + } +} + +impl AsNamed for TypeKind { + type Extra = Item; + + fn as_named(&self, ctx: &BindgenContext, item: &Item) -> Option { + match *self { + TypeKind::Named => Some(item.id()), + TypeKind::ResolvedTypeRef(id) => id.as_named(ctx, &()), + _ => None, + } + } +} + impl DotAttributes for Type { - fn dot_attributes(&self, ctx: &BindgenContext, out: &mut W) -> io::Result<()> - where W: io::Write + fn dot_attributes(&self, + ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, { if let Some(ref layout) = self.layout { try!(writeln!(out, @@ -476,8 +544,11 @@ impl DotAttributes for Type { } impl DotAttributes for TypeKind { - fn dot_attributes(&self, _ctx: &BindgenContext, out: &mut W) -> io::Result<()> - where W: io::Write + fn dot_attributes(&self, + _ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, { write!(out, "TypeKind{}", @@ -485,6 +556,7 @@ impl DotAttributes for TypeKind { TypeKind::Void => "Void", TypeKind::NullPtr => "NullPtr", TypeKind::Comp(..) => "Comp", + TypeKind::Opaque => "Opaque", TypeKind::Int(..) => "Int", TypeKind::Float(..) => "Float", TypeKind::Complex(..) => "Complex", @@ -502,9 +574,7 @@ impl DotAttributes for TypeKind { TypeKind::ObjCId => "ObjCId", TypeKind::ObjCSel => "ObjCSel", TypeKind::ObjCInterface(..) => "ObjCInterface", - TypeKind::UnresolvedTypeRef(..) => { - unreachable!("there shouldn't be any more of these anymore") - } + TypeKind::UnresolvedTypeRef(..) => unreachable!("there shouldn't be any more of these anymore"), }) } } @@ -555,13 +625,17 @@ fn is_invalid_named_type_empty_name() { impl TemplateDeclaration for Type { - fn self_template_params(&self, ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option> { self.kind.self_template_params(ctx) } } impl TemplateDeclaration for TypeKind { - fn self_template_params(&self, ctx: &BindgenContext) -> Option> { + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option> { match *self { TypeKind::ResolvedTypeRef(id) => { ctx.resolve_type(id).self_template_params(ctx) @@ -569,6 +643,7 @@ impl TemplateDeclaration for TypeKind { TypeKind::Comp(ref comp) => comp.self_template_params(ctx), TypeKind::TemplateAlias(_, ref args) => Some(args.clone()), + TypeKind::Opaque | TypeKind::TemplateInstantiation(..) | TypeKind::Void | TypeKind::NullPtr | @@ -607,11 +682,15 @@ impl CanDeriveDebug for Type { } TypeKind::Pointer(inner) => { let inner = ctx.resolve_type(inner); - if let TypeKind::Function(ref sig) = *inner.canonical_type(ctx).kind() { + if let TypeKind::Function(ref sig) = + *inner.canonical_type(ctx).kind() { return sig.can_derive_debug(ctx, ()); } return true; } + TypeKind::TemplateInstantiation(ref inst) => { + inst.can_derive_debug(ctx, self.layout(ctx)) + } _ => true, } } @@ -632,6 +711,10 @@ impl CanDeriveDefault for Type { TypeKind::Comp(ref info) => { info.can_derive_default(ctx, self.layout(ctx)) } + TypeKind::Opaque => { + self.layout + .map_or(true, |l| l.opaque().can_derive_default(ctx, ())) + } TypeKind::Void | TypeKind::Named | TypeKind::TemplateInstantiation(..) | @@ -664,11 +747,17 @@ impl<'a> CanDeriveCopy<'a> for Type { } TypeKind::ResolvedTypeRef(t) | TypeKind::TemplateAlias(t, _) | - TypeKind::TemplateInstantiation(t, _) | TypeKind::Alias(t) => t.can_derive_copy(ctx, ()), + TypeKind::TemplateInstantiation(ref inst) => { + inst.can_derive_copy(ctx, ()) + } TypeKind::Comp(ref info) => { info.can_derive_copy(ctx, (item, self.layout(ctx))) } + TypeKind::Opaque => { + self.layout + .map_or(true, |l| l.opaque().can_derive_copy(ctx, ())) + } _ => true, } } @@ -724,6 +813,11 @@ pub enum TypeKind { /// A compound type, that is, a class, struct, or union. Comp(CompInfo), + /// An opaque type that we just don't understand. All usage of this shoulf + /// result in an opaque blob of bytes generated from the containing type's + /// layout. + Opaque, + /// An integer type, of a given kind. `bool` and `char` are also considered /// integers. Int(IntKind), @@ -760,9 +854,9 @@ pub enum TypeKind { /// A reference to a type, as in: int& foo(). Reference(ItemId), - /// An instantiation of an abstract template declaration (first tuple - /// member) with a set of concrete template arguments (second tuple member). - TemplateInstantiation(ItemId, Vec), + /// An instantiation of an abstract template definition with a set of + /// concrete template arguments. + TemplateInstantiation(TemplateInstantiation), /// A reference to a yet-to-resolve type. This stores the clang cursor /// itself, and postpones its resolution. @@ -772,7 +866,7 @@ pub enum TypeKind { /// /// see tests/headers/typeref.hpp to see somewhere where this is a problem. UnresolvedTypeRef(clang::Type, - Option, + clang::Cursor, /* parent_id */ Option), @@ -806,15 +900,18 @@ impl Type { match self.kind { TypeKind::Void => true, TypeKind::Comp(ref ci) => ci.is_unsized(ctx), + TypeKind::Opaque => self.layout.map_or(true, |l| l.size == 0), TypeKind::Array(inner, size) => { size == 0 || ctx.resolve_type(inner).is_unsized(ctx) } TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(inner) | - TypeKind::TemplateAlias(inner, _) | - TypeKind::TemplateInstantiation(inner, _) => { + TypeKind::TemplateAlias(inner, _) => { ctx.resolve_type(inner).is_unsized(ctx) } + TypeKind::TemplateInstantiation(ref inst) => { + ctx.resolve_type(inst.template_definition()).is_unsized(ctx) + } TypeKind::Named | TypeKind::Int(..) | TypeKind::Float(..) | @@ -843,17 +940,16 @@ impl Type { /// comments in every special case justify why they're there. pub fn from_clang_ty(potential_id: ItemId, ty: &clang::Type, - location: Option, + location: Cursor, parent_id: Option, ctx: &mut BindgenContext) -> Result, ParseError> { use clang_sys::*; { - let already_resolved = - ctx.builtin_or_resolved_ty(potential_id, - parent_id, - ty, - location); + let already_resolved = ctx.builtin_or_resolved_ty(potential_id, + parent_id, + ty, + Some(location)); if let Some(ty) = already_resolved { debug!("{:?} already resolved: {:?}", ty, location); return Ok(ParseResult::AlreadyResolved(ty)); @@ -874,409 +970,409 @@ impl Type { // Parse objc protocols as if they were interfaces let mut ty_kind = ty.kind(); - if let Some(loc) = location { - match loc.kind() { - CXCursor_ObjCProtocolDecl | - CXCursor_ObjCCategoryDecl => ty_kind = CXType_ObjCInterface, - _ => {} - } + match location.kind() { + CXCursor_ObjCProtocolDecl | + CXCursor_ObjCCategoryDecl => ty_kind = CXType_ObjCInterface, + _ => {} } - let kind = match ty_kind { - CXType_Unexposed if *ty != canonical_ty && - canonical_ty.kind() != CXType_Invalid && - ty.ret_type().is_none() && - // Sometime clang desugars some types more than - // what we need, specially with function - // pointers. - // - // We should also try the solution of inverting - // those checks instead of doing this, that is, - // something like: - // - // CXType_Unexposed if ty.ret_type().is_some() - // => { ... } - // - // etc. - !canonical_ty.spelling().contains("type-parameter") => { - debug!("Looking for canonical type: {:?}", canonical_ty); - return Self::from_clang_ty(potential_id, - &canonical_ty, - location, - parent_id, - ctx); - } - CXType_Unexposed | CXType_Invalid => { - // For some reason Clang doesn't give us any hint in some - // situations where we should generate a function pointer (see - // tests/headers/func_ptr_in_struct.h), so we do a guess here - // trying to see if it has a valid return type. - if ty.ret_type().is_some() { - let signature = try!(FunctionSig::from_ty(ty, - &location.unwrap_or(cursor), - ctx)); - TypeKind::Function(signature) - // Same here, with template specialisations we can safely - // assume this is a Comp(..) - } else if ty.is_fully_specialized_template() { - debug!("Template specialization: {:?}, {:?} {:?}", - ty, - location, - canonical_ty); - let complex = - CompInfo::from_ty(potential_id, ty, location, ctx) + if location.kind() == CXCursor_ClassTemplatePartialSpecialization { + // Sorry! (Not sorry) + warn!("Found a partial template specialization; bindgen does not \ + support partial template specialization! Constructing \ + opaque type instead."); + return Ok(ParseResult::New(Opaque::from_clang_ty(&canonical_ty), + None)); + } + + let kind = if location.kind() == CXCursor_TemplateRef || + (ty.template_args().is_some() && + ty_kind != CXType_Typedef) { + // This is a template instantiation. + let inst = TemplateInstantiation::from_ty(&ty, ctx); + TypeKind::TemplateInstantiation(inst) + } else { + match ty_kind { + CXType_Unexposed if *ty != canonical_ty && + canonical_ty.kind() != CXType_Invalid && + ty.ret_type().is_none() && + // Sometime clang desugars some types more than + // what we need, specially with function + // pointers. + // + // We should also try the solution of inverting + // those checks instead of doing this, that is, + // something like: + // + // CXType_Unexposed if ty.ret_type().is_some() + // => { ... } + // + // etc. + !canonical_ty.spelling().contains("type-parameter") => { + debug!("Looking for canonical type: {:?}", canonical_ty); + return Self::from_clang_ty(potential_id, + &canonical_ty, + location, + parent_id, + ctx); + } + CXType_Unexposed | CXType_Invalid => { + // For some reason Clang doesn't give us any hint in some + // situations where we should generate a function pointer (see + // tests/headers/func_ptr_in_struct.h), so we do a guess here + // trying to see if it has a valid return type. + if ty.ret_type().is_some() { + let signature = + try!(FunctionSig::from_ty(ty, &location, ctx)); + TypeKind::Function(signature) + // Same here, with template specialisations we can safely + // assume this is a Comp(..) + } else if ty.is_fully_instantiated_template() { + debug!("Template specialization: {:?}, {:?} {:?}", + ty, + location, + canonical_ty); + let complex = CompInfo::from_ty(potential_id, + ty, + Some(location), + ctx) .expect("C'mon"); - TypeKind::Comp(complex) - } else if let Some(location) = location { - match location.kind() { - CXCursor_ClassTemplatePartialSpecialization | - CXCursor_CXXBaseSpecifier | - CXCursor_ClassTemplate => { - if location.kind() == CXCursor_CXXBaseSpecifier { - // In the case we're parsing a base specifier - // inside an unexposed or invalid type, it means - // that we're parsing one of two things: - // - // * A template parameter. - // * A complex class that isn't exposed. - // - // This means, unfortunately, that there's no - // good way to differentiate between them. - // - // Probably we could try to look at the - // declaration and complicate more this logic, - // but we'll keep it simple... if it's a valid - // C++ identifier, we'll consider it as a - // template parameter. - // - // This is because: - // - // * We expect every other base that is a - // proper identifier (that is, a simple - // struct/union declaration), to be exposed, - // so this path can't be reached in that - // case. - // - // * Quite conveniently, complex base - // specifiers preserve their full names (that - // is: Foo instead of Foo). We can take - // advantage of this. - // - // If we find some edge case where this doesn't - // work (which I guess is unlikely, see the - // different test cases[1][2][3][4]), we'd need - // to find more creative ways of differentiating - // these two cases. - // - // [1]: inherit_named.hpp - // [2]: forward-inherit-struct-with-fields.hpp - // [3]: forward-inherit-struct.hpp - // [4]: inherit-namespaced.hpp - if location.spelling() - .chars() - .all(|c| c.is_alphanumeric() || c == '_') { - return Err(ParseError::Recurse); + TypeKind::Comp(complex) + } else { + match location.kind() { + CXCursor_CXXBaseSpecifier | + CXCursor_ClassTemplate => { + if location.kind() == + CXCursor_CXXBaseSpecifier { + // In the case we're parsing a base specifier + // inside an unexposed or invalid type, it means + // that we're parsing one of two things: + // + // * A template parameter. + // * A complex class that isn't exposed. + // + // This means, unfortunately, that there's no + // good way to differentiate between them. + // + // Probably we could try to look at the + // declaration and complicate more this logic, + // but we'll keep it simple... if it's a valid + // C++ identifier, we'll consider it as a + // template parameter. + // + // This is because: + // + // * We expect every other base that is a + // proper identifier (that is, a simple + // struct/union declaration), to be exposed, + // so this path can't be reached in that + // case. + // + // * Quite conveniently, complex base + // specifiers preserve their full names (that + // is: Foo instead of Foo). We can take + // advantage of this. + // + // If we find some edge case where this doesn't + // work (which I guess is unlikely, see the + // different test cases[1][2][3][4]), we'd need + // to find more creative ways of differentiating + // these two cases. + // + // [1]: inherit_named.hpp + // [2]: forward-inherit-struct-with-fields.hpp + // [3]: forward-inherit-struct.hpp + // [4]: inherit-namespaced.hpp + if location.spelling() + .chars() + .all(|c| { + c.is_alphanumeric() || c == '_' + }) { + return Err(ParseError::Recurse); + } + } else { + name = location.spelling(); } - } else { - name = location.spelling(); + + let complex = CompInfo::from_ty(potential_id, + ty, + Some(location), + ctx) + .expect("C'mon"); + TypeKind::Comp(complex) } - let complex = CompInfo::from_ty(potential_id, - ty, - Some(location), - ctx) - .expect("C'mon"); - TypeKind::Comp(complex) - } - CXCursor_TypeAliasTemplateDecl => { - debug!("TypeAliasTemplateDecl"); - - // We need to manually unwind this one. - let mut inner = Err(ParseError::Continue); - let mut args = vec![]; - - location.visit(|cur| { - match cur.kind() { - CXCursor_TypeAliasDecl => { - let current = cur.cur_type(); - - debug_assert!(current.kind() == - CXType_Typedef); - - name = current.spelling(); - - let inner_ty = cur.typedef_type() - .expect("Not valid Type?"); - inner = - Item::from_ty(&inner_ty, - Some(cur), - Some(potential_id), - ctx); - } - CXCursor_TemplateTypeParameter => { - // See the comment in src/ir/comp.rs - // about the same situation. - if cur.spelling().is_empty() { - return CXChildVisit_Continue; + CXCursor_TypeAliasTemplateDecl => { + debug!("TypeAliasTemplateDecl"); + + // We need to manually unwind this one. + let mut inner = Err(ParseError::Continue); + let mut args = vec![]; + + location.visit(|cur| { + match cur.kind() { + CXCursor_TypeAliasDecl => { + let current = cur.cur_type(); + + debug_assert!(current.kind() == + CXType_Typedef); + + name = current.spelling(); + + let inner_ty = cur.typedef_type() + .expect("Not valid Type?"); + inner = + Item::from_ty(&inner_ty, + cur, + Some(potential_id), + ctx); } - - let param = - Item::named_type(cur.spelling(), - potential_id, - ctx); - args.push(param); + CXCursor_TemplateTypeParameter => { + // See the comment in src/ir/comp.rs + // about the same situation. + if cur.spelling().is_empty() { + return CXChildVisit_Continue; + } + + let param = + Item::named_type(None, + cur, + ctx) + .expect("Item::named_type shouldn't \ + ever fail if we are looking \ + at a TemplateTypeParameter"); + args.push(param); + } + _ => {} } - _ => {} - } - CXChildVisit_Continue - }); - - let inner_type = match inner { - Ok(inner) => inner, - Err(..) => { - error!("Failed to parse template alias \ - {:?}", - location); - return Err(ParseError::Continue); - } - }; + CXChildVisit_Continue + }); + + let inner_type = match inner { + Ok(inner) => inner, + Err(..) => { + error!("Failed to parse template alias \ + {:?}", + location); + return Err(ParseError::Continue); + } + }; - TypeKind::TemplateAlias(inner_type, args) - } - CXCursor_TemplateRef => { - let referenced = location.referenced().unwrap(); - let referenced_ty = referenced.cur_type(); - - debug!("TemplateRef: location = {:?}; referenced = \ - {:?}; referenced_ty = {:?}", - location, - referenced, - referenced_ty); - - return Self::from_clang_ty(potential_id, - &referenced_ty, - Some(referenced), - parent_id, - ctx); - } - CXCursor_TypeRef => { - let referenced = location.referenced().unwrap(); - let referenced_ty = referenced.cur_type(); - let declaration = referenced_ty.declaration(); - - debug!("TypeRef: location = {:?}; referenced = \ - {:?}; referenced_ty = {:?}", - location, - referenced, - referenced_ty); - - let item = - Item::from_ty_or_ref_with_id(potential_id, - referenced_ty, - Some(declaration), - parent_id, - ctx); - return Ok(ParseResult::AlreadyResolved(item)); - } - CXCursor_NamespaceRef => { - return Err(ParseError::Continue); - } - _ => { - if ty.kind() == CXType_Unexposed { - warn!("Unexposed type {:?}, recursing inside, \ - loc: {:?}", - ty, - location); - return Err(ParseError::Recurse); + TypeKind::TemplateAlias(inner_type, args) + } + CXCursor_TemplateRef => { + let referenced = location.referenced().unwrap(); + let referenced_ty = referenced.cur_type(); + + debug!("TemplateRef: location = {:?}; referenced = \ + {:?}; referenced_ty = {:?}", + location, + referenced, + referenced_ty); + + return Self::from_clang_ty(potential_id, + &referenced_ty, + referenced, + parent_id, + ctx); } + CXCursor_TypeRef => { + let referenced = location.referenced().unwrap(); + let referenced_ty = referenced.cur_type(); + let declaration = referenced_ty.declaration(); + + debug!("TypeRef: location = {:?}; referenced = \ + {:?}; referenced_ty = {:?}", + location, + referenced, + referenced_ty); + + let item = + Item::from_ty_or_ref_with_id(potential_id, + referenced_ty, + declaration, + parent_id, + ctx); + return Ok(ParseResult::AlreadyResolved(item)); + } + CXCursor_NamespaceRef => { + return Err(ParseError::Continue); + } + _ => { + if ty.kind() == CXType_Unexposed { + warn!("Unexposed type {:?}, recursing inside, \ + loc: {:?}", + ty, + location); + return Err(ParseError::Recurse); + } - // If the type name is empty we're probably - // over-recursing to find a template parameter name - // or something like that, so just don't be too - // noisy with it since it causes confusion, see for - // example the discussion in: - // - // https://github.com/jamesmunns/teensy3-rs/issues/9 - if !ty.spelling().is_empty() { - warn!("invalid type {:?}", ty); - } else { warn!("invalid type {:?}", ty); + return Err(ParseError::Continue); } - return Err(ParseError::Continue); } } - } else { - // TODO: Don't duplicate this! - if ty.kind() == CXType_Unexposed { - warn!("Unexposed type {:?}, recursing inside", ty); - return Err(ParseError::Recurse); + } + CXType_Auto => { + if canonical_ty == *ty { + debug!("Couldn't find deduced type: {:?}", ty); + return Err(ParseError::Continue); } - if !ty.spelling().is_empty() { - warn!("invalid type {:?}", ty); - } else { - warn!("invalid type {:?}", ty); + return Self::from_clang_ty(potential_id, + &canonical_ty, + location, + parent_id, + ctx); + } + // NOTE: We don't resolve pointers eagerly because the pointee type + // might not have been parsed, and if it contains templates or + // something else we might get confused, see the comment inside + // TypeRef. + // + // We might need to, though, if the context is already in the + // process of resolving them. + CXType_ObjCObjectPointer | + CXType_MemberPointer | + CXType_Pointer => { + // Fun fact: the canonical type of a pointer type may sometimes + // contain information we need but isn't present in the concrete + // type (yeah, I'm equally wat'd). + // + // Yet we still have trouble if we unconditionally trust the + // canonical type, like too-much desugaring (sigh). + // + // See tests/headers/call-conv-field.h for an example. + // + // Since for now the only identifier cause of breakage is the + // ABI for function pointers, and different ABI mixed with + // problematic stuff like that one is _extremely_ unlikely and + // can be bypassed via blacklisting, we do the check explicitly + // (as hacky as it is). + // + // Yet we should probably (somehow) get the best of both worlds, + // presumably special-casing function pointers as a whole, yet + // someone is going to need to care about typedef'd function + // pointers, etc, which isn't trivial given function pointers + // are mostly unexposed. I don't have the time for it right now. + let mut pointee = ty.pointee_type().unwrap(); + let canonical_pointee = canonical_ty.pointee_type() + .unwrap(); + if pointee.call_conv() != canonical_pointee.call_conv() { + pointee = canonical_pointee; } - return Err(ParseError::Continue); + let inner = + Item::from_ty_or_ref(pointee, location, None, ctx); + TypeKind::Pointer(inner) } - } - CXType_Auto => { - if canonical_ty == *ty { - debug!("Couldn't find deduced type: {:?}", ty); - return Err(ParseError::Continue); + CXType_BlockPointer => TypeKind::BlockPointer, + // XXX: RValueReference is most likely wrong, but I don't think we + // can even add bindings for that, so huh. + CXType_RValueReference | + CXType_LValueReference => { + let inner = Item::from_ty_or_ref(ty.pointee_type() + .unwrap(), + location, + None, + ctx); + TypeKind::Reference(inner) } - - return Self::from_clang_ty(potential_id, - &canonical_ty, - location, - parent_id, - ctx); - } - // NOTE: We don't resolve pointers eagerly because the pointee type - // might not have been parsed, and if it contains templates or - // something else we might get confused, see the comment inside - // TypeRef. - // - // We might need to, though, if the context is already in the - // process of resolving them. - CXType_ObjCObjectPointer | - CXType_MemberPointer | - CXType_Pointer => { - // Fun fact: the canonical type of a pointer type may sometimes - // contain information we need but isn't present in the concrete - // type (yeah, I'm equally wat'd). - // - // Yet we still have trouble if we unconditionally trust the - // canonical type, like too-much desugaring (sigh). - // - // See tests/headers/call-conv-field.h for an example. - // - // Since for now the only identifier cause of breakage is the - // ABI for function pointers, and different ABI mixed with - // problematic stuff like that one is _extremely_ unlikely and - // can be bypassed via blacklisting, we do the check explicitly - // (as hacky as it is). - // - // Yet we should probably (somehow) get the best of both worlds, - // presumably special-casing function pointers as a whole, yet - // someone is going to need to care about typedef'd function - // pointers, etc, which isn't trivial given function pointers - // are mostly unexposed. I don't have the time for it right now. - let mut pointee = ty.pointee_type().unwrap(); - let canonical_pointee = canonical_ty.pointee_type().unwrap(); - if pointee.call_conv() != canonical_pointee.call_conv() { - pointee = canonical_pointee; + // XXX DependentSizedArray is wrong + CXType_VariableArray | + CXType_DependentSizedArray => { + let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), + location, + None, + ctx) + .expect("Not able to resolve array element?"); + TypeKind::Pointer(inner) } - let inner = Item::from_ty_or_ref(pointee, - location, - None, - ctx); - TypeKind::Pointer(inner) - } - CXType_BlockPointer => TypeKind::BlockPointer, - // XXX: RValueReference is most likely wrong, but I don't think we - // can even add bindings for that, so huh. - CXType_RValueReference | - CXType_LValueReference => { - let inner = Item::from_ty_or_ref(ty.pointee_type().unwrap(), - location, - None, - ctx); - TypeKind::Reference(inner) - } - // XXX DependentSizedArray is wrong - CXType_VariableArray | - CXType_DependentSizedArray => { - let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), - location, - None, - ctx) - .expect("Not able to resolve array element?"); - TypeKind::Pointer(inner) - } - CXType_IncompleteArray => { - let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), - location, - None, - ctx) - .expect("Not able to resolve array element?"); - TypeKind::Array(inner, 0) - } - CXType_FunctionNoProto | - CXType_FunctionProto => { - let signature = try!(FunctionSig::from_ty(ty, - &location.unwrap_or(cursor), - ctx)); - TypeKind::Function(signature) - } - CXType_Typedef => { - let inner = cursor.typedef_type().expect("Not valid Type?"); - let inner = Item::from_ty_or_ref(inner, location, None, ctx); - TypeKind::Alias(inner) - } - CXType_Enum => { - let enum_ = Enum::from_ty(ty, ctx).expect("Not an enum?"); + CXType_IncompleteArray => { + let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), + location, + None, + ctx) + .expect("Not able to resolve array element?"); + TypeKind::Array(inner, 0) + } + CXType_FunctionNoProto | + CXType_FunctionProto => { + let signature = + try!(FunctionSig::from_ty(ty, &location, ctx)); + TypeKind::Function(signature) + } + CXType_Typedef => { + let inner = cursor.typedef_type().expect("Not valid Type?"); + let inner = + Item::from_ty_or_ref(inner, location, None, ctx); + TypeKind::Alias(inner) + } + CXType_Enum => { + let enum_ = Enum::from_ty(ty, ctx).expect("Not an enum?"); - if name.is_empty() { - let pretty_name = ty.spelling(); - if Self::is_valid_identifier(&pretty_name) { - name = pretty_name; + if name.is_empty() { + let pretty_name = ty.spelling(); + if Self::is_valid_identifier(&pretty_name) { + name = pretty_name; + } } - } - TypeKind::Enum(enum_) - } - CXType_Record => { - let complex = - CompInfo::from_ty(potential_id, ty, location, ctx) + TypeKind::Enum(enum_) + } + CXType_Record => { + let complex = CompInfo::from_ty(potential_id, + ty, + Some(location), + ctx) .expect("Not a complex type?"); - if name.is_empty() { - // The pretty-printed name may contain typedefed name, - // but may also be "struct (anonymous at .h:1)" - let pretty_name = ty.spelling(); - if Self::is_valid_identifier(&pretty_name) { - name = pretty_name; + if name.is_empty() { + // The pretty-printed name may contain typedefed name, + // but may also be "struct (anonymous at .h:1)" + let pretty_name = ty.spelling(); + if Self::is_valid_identifier(&pretty_name) { + name = pretty_name; + } } - } - TypeKind::Comp(complex) - } - // FIXME: We stub vectors as arrays since in 99% of the cases the - // layout is going to be correct, and there's no way we can generate - // vector types properly in Rust for now. - // - // That being said, that should be fixed eventually. - CXType_Vector | - CXType_ConstantArray => { - let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), - location, - None, - ctx) - .expect("Not able to resolve array element?"); - TypeKind::Array(inner, ty.num_elements().unwrap()) - } - CXType_Elaborated => { - return Self::from_clang_ty(potential_id, - &ty.named(), - location, - parent_id, - ctx); - } - CXType_ObjCId => TypeKind::ObjCId, - CXType_ObjCSel => TypeKind::ObjCSel, - CXType_ObjCClass | - CXType_ObjCInterface => { - let interface = ObjCInterface::from_ty(&location.unwrap(), ctx) - .expect("Not a valid objc interface?"); - name = interface.rust_name(); - TypeKind::ObjCInterface(interface) - } - _ => { - error!("unsupported type: kind = {:?}; ty = {:?}; at {:?}", - ty.kind(), - ty, - location); - return Err(ParseError::Continue); + TypeKind::Comp(complex) + } + // FIXME: We stub vectors as arrays since in 99% of the cases the + // layout is going to be correct, and there's no way we can generate + // vector types properly in Rust for now. + // + // That being said, that should be fixed eventually. + CXType_Vector | + CXType_ConstantArray => { + let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), + location, + None, + ctx) + .expect("Not able to resolve array element?"); + TypeKind::Array(inner, ty.num_elements().unwrap()) + } + CXType_Elaborated => { + return Self::from_clang_ty(potential_id, + &ty.named(), + location, + parent_id, + ctx); + } + CXType_ObjCId => TypeKind::ObjCId, + CXType_ObjCSel => TypeKind::ObjCSel, + CXType_ObjCClass | + CXType_ObjCInterface => { + let interface = ObjCInterface::from_ty(&location, ctx) + .expect("Not a valid objc interface?"); + name = interface.rust_name(); + TypeKind::ObjCInterface(interface) + } + _ => { + error!("unsupported type: kind = {:?}; ty = {:?}; at {:?}", + ty.kind(), + ty, + location); + return Err(ParseError::Continue); + } } }; @@ -1306,14 +1402,12 @@ impl Trace for Type { TypeKind::TemplateAlias(inner, ref template_params) => { tracer.visit_kind(inner, EdgeKind::TypeReference); for &item in template_params { - tracer.visit_kind(item, EdgeKind::TemplateParameterDefinition); + tracer.visit_kind(item, + EdgeKind::TemplateParameterDefinition); } } - TypeKind::TemplateInstantiation(inner, ref template_args) => { - tracer.visit_kind(inner, EdgeKind::TemplateDeclaration); - for &item in template_args { - tracer.visit_kind(item, EdgeKind::TemplateArgument); - } + TypeKind::TemplateInstantiation(ref inst) => { + inst.trace(context, tracer, &()); } TypeKind::Comp(ref ci) => ci.trace(context, tracer, item), TypeKind::Function(ref sig) => sig.trace(context, tracer, &()), @@ -1331,6 +1425,7 @@ impl Trace for Type { } // None of these variants have edges to other items and types. + TypeKind::Opaque | TypeKind::UnresolvedTypeRef(_, _, None) | TypeKind::Named | TypeKind::Void | diff --git a/src/ir/var.rs b/src/ir/var.rs index 7b610da480..350bfe4ae7 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -87,15 +87,20 @@ impl Var { } impl DotAttributes for Var { - fn dot_attributes(&self, _ctx: &BindgenContext, out: &mut W) -> io::Result<()> - where W: io::Write + fn dot_attributes(&self, + _ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, { if self.is_const { try!(writeln!(out, "consttrue")); } if let Some(ref mangled) = self.mangled_name { - try!(writeln!(out, "mangled name{}", mangled)); + try!(writeln!(out, + "mangled name{}", + mangled)); } Ok(()) @@ -202,7 +207,7 @@ impl ClangSubItemParser for Var { // XXX this is redundant, remove! let is_const = ty.is_const(); - let ty = match Item::from_ty(&ty, Some(cursor), None, ctx) { + let ty = match Item::from_ty(&ty, cursor, None, ctx) { Ok(ty) => ty, Err(e) => { assert_eq!(ty.kind(), diff --git a/src/parse.rs b/src/parse.rs index 0e4164f0b3..73bb7b25d8 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -49,7 +49,7 @@ pub trait ClangItemParser: Sized { /// Parse this item from the given Clang type. fn from_ty(ty: &clang::Type, - location: Option, + location: clang::Cursor, parent: Option, ctx: &mut BindgenContext) -> Result; @@ -58,7 +58,7 @@ pub trait ClangItemParser: Sized { /// newly parsed item. fn from_ty_with_id(id: ItemId, ty: &clang::Type, - location: Option, + location: clang::Cursor, parent: Option, ctx: &mut BindgenContext) -> Result; @@ -66,7 +66,7 @@ pub trait ClangItemParser: Sized { /// Parse this item from the given Clang type, or if we haven't resolved all /// the other items this one depends on, an unresolved reference. fn from_ty_or_ref(ty: clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, context: &mut BindgenContext) -> ItemId; @@ -75,26 +75,16 @@ pub trait ClangItemParser: Sized { /// `ItemId` for the newly parsed item. fn from_ty_or_ref_with_id(potential_id: ItemId, ty: clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, context: &mut BindgenContext) -> ItemId; /// Create a named template type. - fn named_type(name: S, - parent: ItemId, - context: &mut BindgenContext) - -> ItemId - where S: Into; - - /// Identical to `named_type`, but use `id` as the resulting item's - /// `ItemId`. - fn named_type_with_id(id: ItemId, - name: S, - parent: ItemId, - context: &mut BindgenContext) - -> ItemId - where S: Into; + fn named_type(with_id: Option, + location: clang::Cursor, + ctx: &mut BindgenContext) + -> Option; /// Create a builtin type. fn builtin_type(kind: TypeKind, diff --git a/src/uses.rs b/src/uses.rs index 47f72da6fb..0799011b36 100644 --- a/src/uses.rs +++ b/src/uses.rs @@ -37,6 +37,7 @@ use ir::context::BindgenContext; use ir::item::{Item, ItemAncestors, ItemCanonicalName}; +use ir::ty::TemplateDeclaration; use std::io; // Like `canonical_path`, except we always take namespaces into account, ignore @@ -83,9 +84,9 @@ pub fn generate_dummy_uses(ctx: &mut BindgenContext, // these. !ty.is_builtin_or_named() && // And finally, we won't be creating any dummy - // specializations, so ignore template declarations and - // partial specializations. - item.applicable_template_args(ctx).is_empty() + // instantiations, so ignore template declarations and + // instantiations. + item.all_template_params(ctx).is_none() } else { false } diff --git a/tests/expectations/lib.rs b/tests/expectations/lib.rs old mode 100644 new mode 100755 index e69de29bb2..562dc5548d --- a/tests/expectations/lib.rs +++ b/tests/expectations/lib.rs @@ -0,0 +1,3 @@ +#![allow(dead_code)] +#![allow(non_camel_case_types)] +#![allow(non_upper_case_globals)] diff --git a/tests/expectations/tests/381-decltype-alias.rs b/tests/expectations/tests/381-decltype-alias.rs index 45b0cfdd55..632cdd312b 100644 --- a/tests/expectations/tests/381-decltype-alias.rs +++ b/tests/expectations/tests/381-decltype-alias.rs @@ -5,11 +5,8 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct std_allocator_traits<_Alloc> { +#[derive(Debug, Default, Copy, Clone)] +pub struct std_allocator_traits { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData<_Alloc>, -} -impl <_Alloc> Default for std_allocator_traits<_Alloc> { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } +pub type std_allocator_traits___size_type<_Alloc> = _Alloc; diff --git a/tests/expectations/tests/anon_enum_trait.rs b/tests/expectations/tests/anon_enum_trait.rs index 31eaca8399..92c697a884 100644 --- a/tests/expectations/tests/anon_enum_trait.rs +++ b/tests/expectations/tests/anon_enum_trait.rs @@ -5,10 +5,9 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct DataType<_Tp> { +#[derive(Debug, Default, Copy, Clone)] +pub struct DataType { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData<_Tp>, } pub type DataType_value_type<_Tp> = _Tp; pub type DataType_work_type<_Tp> = DataType_value_type<_Tp>; @@ -27,9 +26,6 @@ pub const DataType_type_: DataType__bindgen_ty_1 = #[repr(i32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum DataType__bindgen_ty_1 { generic_type = 0, } -impl <_Tp> Default for DataType<_Tp> { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} #[repr(C)] #[derive(Debug, Default, Copy)] pub struct Foo { diff --git a/tests/expectations/tests/anon_union.rs b/tests/expectations/tests/anon_union.rs index 4418bc7780..eb600cc737 100644 --- a/tests/expectations/tests/anon_union.rs +++ b/tests/expectations/tests/anon_union.rs @@ -30,12 +30,11 @@ impl ::std::fmt::Debug for __BindgenUnionField { } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct TErrorResult { +pub struct TErrorResult { pub mResult: ::std::os::raw::c_int, - pub __bindgen_anon_1: TErrorResult__bindgen_ty_1, + pub __bindgen_anon_1: TErrorResult__bindgen_ty_1, pub mMightHaveUnreported: bool, pub mUnionState: TErrorResult_UnionState, - pub _phantom_0: ::std::marker::PhantomData, } pub const TErrorResult_UnionState_HasException: TErrorResult_UnionState = TErrorResult_UnionState::HasMessage; @@ -44,31 +43,28 @@ pub const TErrorResult_UnionState_HasException: TErrorResult_UnionState = pub enum TErrorResult_UnionState { HasMessage = 0, } #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct TErrorResult_Message { +pub struct TErrorResult_Message { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct TErrorResult_DOMExceptionInfo { +pub struct TErrorResult_DOMExceptionInfo { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct TErrorResult__bindgen_ty_1 { - pub mMessage: __BindgenUnionField<*mut TErrorResult_Message>, - pub mDOMExceptionInfo: __BindgenUnionField<*mut TErrorResult_DOMExceptionInfo>, +pub struct TErrorResult__bindgen_ty_1 { + pub mMessage: __BindgenUnionField<*mut TErrorResult_Message>, + pub mDOMExceptionInfo: __BindgenUnionField<*mut TErrorResult_DOMExceptionInfo>, pub bindgen_union_field: u64, - pub _phantom_0: ::std::marker::PhantomData, } -impl Default for TErrorResult { +impl Default for TErrorResult { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Copy)] pub struct ErrorResult { - pub _base: TErrorResult<::std::os::raw::c_int>, + pub _base: TErrorResult, } #[test] fn bindgen_test_layout_ErrorResult() { @@ -84,13 +80,11 @@ impl Default for ErrorResult { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[test] -fn __bindgen_test_layout_template_1() { - assert_eq!(::std::mem::size_of::>() , - 24usize , concat ! ( +fn __bindgen_test_layout_TErrorResult_instantiation_21() { + assert_eq!(::std::mem::size_of::() , 24usize , concat ! ( "Size of template specialization: " , stringify ! ( - TErrorResult<::std::os::raw::c_int> ) )); - assert_eq!(::std::mem::align_of::>() , - 8usize , concat ! ( + TErrorResult ) )); + assert_eq!(::std::mem::align_of::() , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( - TErrorResult<::std::os::raw::c_int> ) )); + TErrorResult ) )); } diff --git a/tests/expectations/tests/auto.rs b/tests/expectations/tests/auto.rs index 4551f70314..7f9bbf44ad 100644 --- a/tests/expectations/tests/auto.rs +++ b/tests/expectations/tests/auto.rs @@ -21,13 +21,9 @@ impl Clone for Foo { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Bar { +#[derive(Debug, Default, Copy, Clone)] +pub struct Bar { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for Bar { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } extern "C" { #[link_name = "_Z5Test2v"] diff --git a/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs b/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs index b0c91e8ca9..4074dd02eb 100644 --- a/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs +++ b/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs @@ -5,13 +5,9 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct std_char_traits<_CharT> { +#[derive(Debug, Default, Copy, Clone)] +pub struct std_char_traits { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData<_CharT>, -} -impl <_CharT> Default for std_char_traits<_CharT> { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Default, Copy)] diff --git a/tests/expectations/tests/class_nested.rs b/tests/expectations/tests/class_nested.rs index 6ddcf91b23..b92976f6a0 100644 --- a/tests/expectations/tests/class_nested.rs +++ b/tests/expectations/tests/class_nested.rs @@ -77,7 +77,7 @@ extern "C" { pub static mut var: A_B; } #[test] -fn __bindgen_test_layout_template_1() { +fn __bindgen_test_layout_A_D_instantiation_16() { assert_eq!(::std::mem::size_of::>() , 4usize , concat ! ( "Size of template specialization: " , stringify ! ( diff --git a/tests/expectations/tests/class_with_dtor.rs b/tests/expectations/tests/class_with_dtor.rs index 4c1d271878..495889f256 100644 --- a/tests/expectations/tests/class_with_dtor.rs +++ b/tests/expectations/tests/class_with_dtor.rs @@ -34,7 +34,7 @@ impl Default for WithoutDtor { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[test] -fn __bindgen_test_layout_template_1() { +fn __bindgen_test_layout_HandleWithDtor_instantiation_10() { assert_eq!(::std::mem::size_of::>() , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( diff --git a/tests/expectations/tests/constant-non-specialized-tp.rs b/tests/expectations/tests/constant-non-specialized-tp.rs index f2aa5a7584..a17e261ba7 100644 --- a/tests/expectations/tests/constant-non-specialized-tp.rs +++ b/tests/expectations/tests/constant-non-specialized-tp.rs @@ -5,26 +5,17 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Test { +#[derive(Debug, Default, Copy, Clone)] +pub struct Test { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for Test { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Outer { +#[derive(Debug, Default, Copy, Clone)] +pub struct Outer { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct Outer_Inner { +pub struct Outer_Inner { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for Outer { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/constructor-tp.rs b/tests/expectations/tests/constructor-tp.rs index ee04d3c5d9..6ba52f22d1 100644 --- a/tests/expectations/tests/constructor-tp.rs +++ b/tests/expectations/tests/constructor-tp.rs @@ -5,13 +5,9 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Foo { +#[derive(Debug, Default, Copy, Clone)] +pub struct Foo { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for Foo { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Default, Copy)] diff --git a/tests/expectations/tests/crtp.rs b/tests/expectations/tests/crtp.rs index 7143f50e6d..8a83e19850 100644 --- a/tests/expectations/tests/crtp.rs +++ b/tests/expectations/tests/crtp.rs @@ -5,13 +5,9 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Base { +#[derive(Debug, Default, Copy, Clone)] +pub struct Base { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for Base { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Copy)] @@ -32,13 +28,9 @@ impl Default for Derived { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] -#[derive(Debug)] -pub struct BaseWithDestructor { +#[derive(Debug, Default)] +pub struct BaseWithDestructor { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for BaseWithDestructor { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug)] @@ -59,22 +51,21 @@ impl Default for DerivedFromBaseWithDestructor { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[test] -fn __bindgen_test_layout_template_1() { - assert_eq!(::std::mem::size_of::>() , 1usize , concat ! ( - "Size of template specialization: " , stringify ! ( - Base ) )); - assert_eq!(::std::mem::align_of::>() , 1usize , concat ! ( - "Alignment of template specialization: " , stringify ! ( - Base ) )); +fn __bindgen_test_layout_Base_instantiation_9() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of template specialization: " , stringify ! ( Base ) )); + assert_eq!(::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( Base ) + )); } #[test] -fn __bindgen_test_layout_template_2() { - assert_eq!(::std::mem::size_of::>() - , 1usize , concat ! ( +fn __bindgen_test_layout_BaseWithDestructor_instantiation_12() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! + ( "Size of template specialization: " , stringify ! ( - BaseWithDestructor ) )); - assert_eq!(::std::mem::align_of::>() - , 1usize , concat ! ( + BaseWithDestructor ) )); + assert_eq!(::std::mem::align_of::() , 1usize , concat + ! ( "Alignment of template specialization: " , stringify ! ( - BaseWithDestructor ) )); + BaseWithDestructor ) )); } diff --git a/tests/expectations/tests/dash_language.rs b/tests/expectations/tests/dash_language.rs index 24df101487..385c39c6a3 100644 --- a/tests/expectations/tests/dash_language.rs +++ b/tests/expectations/tests/dash_language.rs @@ -5,11 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Foo { +#[derive(Debug, Default, Copy, Clone)] +pub struct Foo { pub bar: ::std::os::raw::c_int, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for Foo { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/empty_template_param_name.rs b/tests/expectations/tests/empty_template_param_name.rs index 6ee8fce396..2bd5a570c9 100644 --- a/tests/expectations/tests/empty_template_param_name.rs +++ b/tests/expectations/tests/empty_template_param_name.rs @@ -6,11 +6,7 @@ pub type __void_t = ::std::os::raw::c_void; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __iterator_traits<_Iterator> { +#[derive(Debug, Default, Copy, Clone)] +pub struct __iterator_traits { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData<_Iterator>, -} -impl <_Iterator> Default for __iterator_traits<_Iterator> { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/enum_in_template_with_typedef.rs b/tests/expectations/tests/enum_in_template_with_typedef.rs index e4725b8386..2b95696399 100644 --- a/tests/expectations/tests/enum_in_template_with_typedef.rs +++ b/tests/expectations/tests/enum_in_template_with_typedef.rs @@ -5,10 +5,9 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct std_fbstring_core { +#[derive(Debug, Default, Copy, Clone)] +pub struct std_fbstring_core { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } pub type std_fbstring_core_category_type = u8; pub const std_fbstring_core_Category_Bar: std_fbstring_core_Category = @@ -16,6 +15,3 @@ pub const std_fbstring_core_Category_Bar: std_fbstring_core_Category = #[repr(u8)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum std_fbstring_core_Category { Foo = 0, } -impl Default for std_fbstring_core { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} diff --git a/tests/expectations/tests/eval-variadic-template-parameter.rs b/tests/expectations/tests/eval-variadic-template-parameter.rs index acc6f34c61..701aab9fec 100644 --- a/tests/expectations/tests/eval-variadic-template-parameter.rs +++ b/tests/expectations/tests/eval-variadic-template-parameter.rs @@ -5,11 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct B { +#[derive(Debug, Default, Copy, Clone)] +pub struct B { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for B { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/forward-inherit-struct.rs b/tests/expectations/tests/forward-inherit-struct.rs index 1057e70c06..322854dd85 100644 --- a/tests/expectations/tests/forward-inherit-struct.rs +++ b/tests/expectations/tests/forward-inherit-struct.rs @@ -6,19 +6,14 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct Rooted { +pub struct Rooted { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } -impl Default for Rooted { +impl Default for Rooted { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct js_RootedBase { +#[derive(Debug, Default, Copy, Clone)] +pub struct js_RootedBase { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for js_RootedBase { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/in_class_typedef.rs b/tests/expectations/tests/in_class_typedef.rs index 3634a6313c..613c8cab72 100644 --- a/tests/expectations/tests/in_class_typedef.rs +++ b/tests/expectations/tests/in_class_typedef.rs @@ -5,20 +5,15 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Foo { +#[derive(Debug, Default, Copy, Clone)] +pub struct Foo { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } pub type Foo_elem_type = T; pub type Foo_ptr_type = *mut T; #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct Foo_Bar { +pub struct Foo_Bar { pub x: ::std::os::raw::c_int, pub y: ::std::os::raw::c_int, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for Foo { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/inherit-namespaced.rs b/tests/expectations/tests/inherit-namespaced.rs index e5d5f875ee..fcd8de9731 100644 --- a/tests/expectations/tests/inherit-namespaced.rs +++ b/tests/expectations/tests/inherit-namespaced.rs @@ -5,20 +5,15 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct js_RootedBase { +#[derive(Debug, Default, Copy, Clone)] +pub struct js_RootedBase { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for js_RootedBase { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct Rooted { +pub struct Rooted { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } -impl Default for Rooted { +impl Default for Rooted { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/inherit_named.rs b/tests/expectations/tests/inherit_named.rs index 31c4bee911..703df9ea54 100644 --- a/tests/expectations/tests/inherit_named.rs +++ b/tests/expectations/tests/inherit_named.rs @@ -5,13 +5,9 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Wohoo { +#[derive(Debug, Default, Copy, Clone)] +pub struct Wohoo { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for Wohoo { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Copy, Clone)] diff --git a/tests/expectations/tests/inner_template_self.rs b/tests/expectations/tests/inner_template_self.rs index 3510fa7c77..d75c280d05 100644 --- a/tests/expectations/tests/inner_template_self.rs +++ b/tests/expectations/tests/inner_template_self.rs @@ -6,17 +6,17 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct LinkedList { - pub next: *mut LinkedList, - pub prev: *mut LinkedList, +pub struct LinkedList { + pub next: *mut LinkedList, + pub prev: *mut LinkedList, } -impl Default for LinkedList { +impl Default for LinkedList { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Copy)] pub struct InstantiateIt { - pub m_list: LinkedList<::std::os::raw::c_int>, + pub m_list: LinkedList, } #[test] fn bindgen_test_layout_InstantiateIt() { diff --git a/tests/expectations/tests/issue-358.rs b/tests/expectations/tests/issue-358.rs index d3be3c4374..e574bd017e 100644 --- a/tests/expectations/tests/issue-358.rs +++ b/tests/expectations/tests/issue-358.rs @@ -6,11 +6,10 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct JS_PersistentRooted { +pub struct JS_PersistentRooted { pub _base: a, - pub _phantom_0: ::std::marker::PhantomData, } -impl Default for JS_PersistentRooted { +impl Default for JS_PersistentRooted { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] diff --git a/tests/expectations/tests/issue-446.rs b/tests/expectations/tests/issue-446.rs index fa736bccf6..13204c1ac2 100644 --- a/tests/expectations/tests/issue-446.rs +++ b/tests/expectations/tests/issue-446.rs @@ -6,17 +6,17 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct List { - pub next: *mut List, +pub struct List { + pub next: *mut List, } -impl Default for List { +impl Default for List { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct PersistentRooted { - pub root_list: List>, +pub struct PersistentRooted { + pub root_list: List, } -impl Default for PersistentRooted { +impl Default for PersistentRooted { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/issue-493.rs b/tests/expectations/tests/issue-493.rs index a2246ca6a3..155834a304 100644 --- a/tests/expectations/tests/issue-493.rs +++ b/tests/expectations/tests/issue-493.rs @@ -29,28 +29,21 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct basic_string<_CharT, _Traits, _Allocator> { +#[derive(Debug, Default, Copy, Clone)] +pub struct basic_string { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData<_CharT>, - pub _phantom_1: ::std::marker::PhantomData<_Traits>, - pub _phantom_2: ::std::marker::PhantomData<_Allocator>, } pub type basic_string_size_type = ::std::os::raw::c_ulonglong; pub type basic_string_value_type = ::std::os::raw::c_schar; pub type basic_string_pointer = *mut basic_string_value_type; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct basic_string___long<_CharT, _Traits, _Allocator> { +pub struct basic_string___long { pub __cap_: basic_string_size_type, pub __size_: basic_string_size_type, pub __data_: basic_string_pointer, - pub _phantom_0: ::std::marker::PhantomData<_CharT>, - pub _phantom_1: ::std::marker::PhantomData<_Traits>, - pub _phantom_2: ::std::marker::PhantomData<_Allocator>, } -impl <_CharT, _Traits, _Allocator> Default for - basic_string___long<_CharT, _Traits, _Allocator> { +impl Default for basic_string___long { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } pub const basic_string___min_cap: basic_string__bindgen_ty_1 = @@ -60,42 +53,28 @@ pub const basic_string___min_cap: basic_string__bindgen_ty_1 = pub enum basic_string__bindgen_ty_1 { __min_cap = 0, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct basic_string___short<_CharT, _Traits, _Allocator> { - pub __bindgen_anon_1: basic_string___short__bindgen_ty_1<_CharT, _Traits, - _Allocator>, +pub struct basic_string___short { + pub __bindgen_anon_1: basic_string___short__bindgen_ty_1, pub __data_: *mut basic_string_value_type, - pub _phantom_0: ::std::marker::PhantomData<_CharT>, - pub _phantom_1: ::std::marker::PhantomData<_Traits>, - pub _phantom_2: ::std::marker::PhantomData<_Allocator>, } #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct basic_string___short__bindgen_ty_1<_CharT, _Traits, _Allocator> { +pub struct basic_string___short__bindgen_ty_1 { pub __size_: __BindgenUnionField<::std::os::raw::c_uchar>, pub __lx: __BindgenUnionField, pub bindgen_union_field: u8, - pub _phantom_0: ::std::marker::PhantomData<_CharT>, - pub _phantom_1: ::std::marker::PhantomData<_Traits>, - pub _phantom_2: ::std::marker::PhantomData<_Allocator>, } -impl <_CharT, _Traits, _Allocator> Default for - basic_string___short<_CharT, _Traits, _Allocator> { +impl Default for basic_string___short { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Copy, Clone)] -pub struct basic_string___ulx<_CharT, _Traits, _Allocator> { - pub __lx: __BindgenUnionField>, - pub __lxx: __BindgenUnionField>, +pub struct basic_string___ulx { + pub __lx: __BindgenUnionField, + pub __lxx: __BindgenUnionField, pub bindgen_union_field: [u8; 0usize], - pub _phantom_0: ::std::marker::PhantomData<_CharT>, - pub _phantom_1: ::std::marker::PhantomData<_Traits>, - pub _phantom_2: ::std::marker::PhantomData<_Allocator>, } -impl <_CharT, _Traits, _Allocator> Default for - basic_string___ulx<_CharT, _Traits, _Allocator> { +impl Default for basic_string___ulx { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } pub const basic_string___n_words: basic_string__bindgen_ty_2 = @@ -105,48 +84,28 @@ pub const basic_string___n_words: basic_string__bindgen_ty_2 = pub enum basic_string__bindgen_ty_2 { __n_words = 0, } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct basic_string___raw<_CharT, _Traits, _Allocator> { +pub struct basic_string___raw { pub __words: *mut basic_string_size_type, - pub _phantom_0: ::std::marker::PhantomData<_CharT>, - pub _phantom_1: ::std::marker::PhantomData<_Traits>, - pub _phantom_2: ::std::marker::PhantomData<_Allocator>, } -impl <_CharT, _Traits, _Allocator> Default for - basic_string___raw<_CharT, _Traits, _Allocator> { +impl Default for basic_string___raw { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Copy, Clone)] -pub struct basic_string___rep<_CharT, _Traits, _Allocator> { - pub __bindgen_anon_1: basic_string___rep__bindgen_ty_1<_CharT, _Traits, - _Allocator>, - pub _phantom_0: ::std::marker::PhantomData<_CharT>, - pub _phantom_1: ::std::marker::PhantomData<_Traits>, - pub _phantom_2: ::std::marker::PhantomData<_Allocator>, +pub struct basic_string___rep { + pub __bindgen_anon_1: basic_string___rep__bindgen_ty_1, } #[repr(C)] #[derive(Copy, Clone)] -pub struct basic_string___rep__bindgen_ty_1<_CharT, _Traits, _Allocator> { - pub __l: __BindgenUnionField>, - pub __s: __BindgenUnionField>, - pub __r: __BindgenUnionField>, +pub struct basic_string___rep__bindgen_ty_1 { + pub __l: __BindgenUnionField, + pub __s: __BindgenUnionField, + pub __r: __BindgenUnionField, pub bindgen_union_field: [u8; 0usize], - pub _phantom_0: ::std::marker::PhantomData<_CharT>, - pub _phantom_1: ::std::marker::PhantomData<_Traits>, - pub _phantom_2: ::std::marker::PhantomData<_Allocator>, -} -impl <_CharT, _Traits, _Allocator> Default for - basic_string___rep__bindgen_ty_1<_CharT, _Traits, _Allocator> { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -impl <_CharT, _Traits, _Allocator> Default for - basic_string___rep<_CharT, _Traits, _Allocator> { +impl Default for basic_string___rep__bindgen_ty_1 { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -impl <_CharT, _Traits, _Allocator> Default for - basic_string<_CharT, _Traits, _Allocator> { +impl Default for basic_string___rep { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/issue-544-stylo-creduce-2.rs b/tests/expectations/tests/issue-544-stylo-creduce-2.rs new file mode 100644 index 0000000000..c0fae8452e --- /dev/null +++ b/tests/expectations/tests/issue-544-stylo-creduce-2.rs @@ -0,0 +1,15 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +pub struct Foo { + pub member: Foo_SecondAlias, +} +pub type Foo_FirstAlias = [u8; 0usize]; +pub type Foo_SecondAlias = [u8; 0usize]; +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/issue-544-stylo-creduce.rs b/tests/expectations/tests/issue-544-stylo-creduce.rs new file mode 100644 index 0000000000..88cc0d87d0 --- /dev/null +++ b/tests/expectations/tests/issue-544-stylo-creduce.rs @@ -0,0 +1,14 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct a { + pub _address: u8, +} +impl Clone for a { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/maddness-is-avoidable.rs b/tests/expectations/tests/maddness-is-avoidable.rs index 2fb5e540e3..09c1c921db 100644 --- a/tests/expectations/tests/maddness-is-avoidable.rs +++ b/tests/expectations/tests/maddness-is-avoidable.rs @@ -5,22 +5,12 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct RefPtr { +#[derive(Debug, Default, Copy, Clone)] +pub struct RefPtr { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct RefPtr_Proxy { +#[derive(Debug, Default, Copy, Clone)] +pub struct RefPtr_Proxy { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, - pub _phantom_1: ::std::marker::PhantomData, - pub _phantom_2: ::std::marker::PhantomData, -} -impl Default for RefPtr_Proxy { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} -impl Default for RefPtr { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/no_copy.rs b/tests/expectations/tests/no_copy.rs index 3590241fce..a75f891ce5 100644 --- a/tests/expectations/tests/no_copy.rs +++ b/tests/expectations/tests/no_copy.rs @@ -6,11 +6,7 @@ /**

    */ #[repr(C)] -#[derive(Debug)] -pub struct CopiableButWait { +#[derive(Debug, Default)] +pub struct CopiableButWait { pub whatever: ::std::os::raw::c_int, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for CopiableButWait { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/opaque_pointer.rs b/tests/expectations/tests/opaque_pointer.rs index 15b01db448..2e1890a8b4 100644 --- a/tests/expectations/tests/opaque_pointer.rs +++ b/tests/expectations/tests/opaque_pointer.rs @@ -27,16 +27,15 @@ impl Clone for OtherOpaque { */ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct Opaque { - pub _phantom_0: ::std::marker::PhantomData, +pub struct Opaque { } -impl Default for Opaque { +impl Default for Opaque { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Copy)] pub struct WithOpaquePtr { - pub whatever: *mut Opaque<::std::os::raw::c_int>, + pub whatever: *mut (), pub other: u32, pub t: OtherOpaque, } diff --git a/tests/expectations/tests/opaque_typedef.rs b/tests/expectations/tests/opaque_typedef.rs index d6d5ac5de6..51951faf14 100644 --- a/tests/expectations/tests/opaque_typedef.rs +++ b/tests/expectations/tests/opaque_typedef.rs @@ -5,14 +5,10 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct RandomTemplate { +#[derive(Debug, Default, Copy, Clone)] +pub struct RandomTemplate { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for RandomTemplate { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } /**
    */ pub type ShouldBeOpaque = [u8; 0usize]; -pub type ShouldNotBeOpaque = RandomTemplate; +pub type ShouldNotBeOpaque = RandomTemplate; diff --git a/tests/expectations/tests/partial-specialization-and-inheritance.rs b/tests/expectations/tests/partial-specialization-and-inheritance.rs new file mode 100644 index 0000000000..2422593465 --- /dev/null +++ b/tests/expectations/tests/partial-specialization-and-inheritance.rs @@ -0,0 +1,44 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct Base { + pub _address: u8, +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct Derived { + pub b: bool, +} +#[test] +fn __bindgen_test_layout__bindgen_ty_id_20_instantiation_14() { + assert_eq!(::std::mem::size_of::<[u32; 2usize]>() , 8usize , concat ! ( + "Size of template specialization: " , stringify ! ( + [u32; 2usize] ) )); + assert_eq!(::std::mem::align_of::<[u32; 2usize]>() , 4usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + [u32; 2usize] ) )); +} +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct Usage { + pub _address: u8, +} +extern "C" { + #[link_name = "_ZN5Usage13static_memberE"] + pub static mut Usage_static_member: [u32; 2usize]; +} +#[test] +fn bindgen_test_layout_Usage() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Usage ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Usage ) )); +} +impl Clone for Usage { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/replace_use.rs b/tests/expectations/tests/replace_use.rs index d93121d3dd..6cdc326383 100644 --- a/tests/expectations/tests/replace_use.rs +++ b/tests/expectations/tests/replace_use.rs @@ -8,18 +8,14 @@ *
    */ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nsTArray { +#[derive(Debug, Default, Copy, Clone)] +pub struct nsTArray { pub y: ::std::os::raw::c_uint, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for nsTArray { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Copy)] pub struct Test { - pub a: nsTArray<::std::os::raw::c_long>, + pub a: nsTArray, } #[test] fn bindgen_test_layout_Test() { diff --git a/tests/expectations/tests/size_t_template.rs b/tests/expectations/tests/size_t_template.rs index 4d81651e9d..b2680869a9 100644 --- a/tests/expectations/tests/size_t_template.rs +++ b/tests/expectations/tests/size_t_template.rs @@ -5,7 +5,6 @@ #[repr(C)] -#[derive(Debug, Copy)] pub struct C { pub arr: [u32; 3usize], } @@ -21,9 +20,6 @@ fn bindgen_test_layout_C() { "Alignment of field: " , stringify ! ( C ) , "::" , stringify ! ( arr ) )); } -impl Clone for C { - fn clone(&self) -> Self { *self } -} impl Default for C { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/struct_with_typedef_template_arg.rs b/tests/expectations/tests/struct_with_typedef_template_arg.rs index f882c65d54..93620e5948 100644 --- a/tests/expectations/tests/struct_with_typedef_template_arg.rs +++ b/tests/expectations/tests/struct_with_typedef_template_arg.rs @@ -5,14 +5,9 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Proxy { +#[derive(Debug, Default, Copy, Clone)] +pub struct Proxy { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, - pub _phantom_1: ::std::marker::PhantomData, } pub type Proxy_foo = ::std::option::Option; -impl Default for Proxy { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} diff --git a/tests/expectations/tests/template-fun-ty.rs b/tests/expectations/tests/template-fun-ty.rs index b894920ff0..05351d7d7b 100644 --- a/tests/expectations/tests/template-fun-ty.rs +++ b/tests/expectations/tests/template-fun-ty.rs @@ -5,36 +5,22 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Foo { +#[derive(Debug, Default, Copy, Clone)] +pub struct Foo { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } pub type Foo_FunctionPtr = ::std::option::Option T>; -impl Default for Foo { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct RefPtr { +#[derive(Debug, Default, Copy, Clone)] +pub struct RefPtr { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct RefPtr_Proxy { +#[derive(Debug, Default, Copy, Clone)] +pub struct RefPtr_Proxy { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, - pub _phantom_1: ::std::marker::PhantomData, - pub _phantom_2: ::std::marker::PhantomData, } pub type RefPtr_Proxy_member_function = ::std::option::Option R>; -impl Default for RefPtr_Proxy { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} -impl Default for RefPtr { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} pub type Returner = ::std::option::Option T>; diff --git a/tests/expectations/tests/template-param-usage-0.rs b/tests/expectations/tests/template-param-usage-0.rs new file mode 100644 index 0000000000..494001f771 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-0.rs @@ -0,0 +1,14 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct UsesTemplateParameter { + pub t: T, +} +impl Default for UsesTemplateParameter { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-1.rs b/tests/expectations/tests/template-param-usage-1.rs new file mode 100644 index 0000000000..0fd8719bf2 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-1.rs @@ -0,0 +1,11 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct DoesNotUseTemplateParameter { + pub x: ::std::os::raw::c_int, +} diff --git a/tests/expectations/tests/template-param-usage-10.rs b/tests/expectations/tests/template-param-usage-10.rs new file mode 100644 index 0000000000..95d200b576 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-10.rs @@ -0,0 +1,25 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct DoublyIndirectUsage { + pub doubly_indirect: DoublyIndirectUsage_IndirectUsage, +} +pub type DoublyIndirectUsage_Aliased = T; +pub type DoublyIndirectUsage_Typedefed = U; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct DoublyIndirectUsage_IndirectUsage { + pub member: DoublyIndirectUsage_Aliased, + pub another: DoublyIndirectUsage_Typedefed, +} +impl Default for DoublyIndirectUsage_IndirectUsage { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl Default for DoublyIndirectUsage { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-11.rs b/tests/expectations/tests/template-param-usage-11.rs new file mode 100644 index 0000000000..a8959b9951 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-11.rs @@ -0,0 +1,11 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct DoesNotUseT { + pub _address: u8, +} diff --git a/tests/expectations/tests/template-param-usage-12.rs b/tests/expectations/tests/template-param-usage-12.rs new file mode 100644 index 0000000000..0c31111e78 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-12.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct BaseUsesT { + pub t: *mut T, +} +impl Default for BaseUsesT { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct CrtpUsesU { + pub _base: BaseUsesT>, + pub usage: U, +} +impl Default for CrtpUsesU { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-13.rs b/tests/expectations/tests/template-param-usage-13.rs new file mode 100644 index 0000000000..c77da0973e --- /dev/null +++ b/tests/expectations/tests/template-param-usage-13.rs @@ -0,0 +1,20 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct BaseIgnoresT { + pub x: ::std::os::raw::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct CrtpUsesU { + pub _base: BaseIgnoresT, + pub usage: U, +} +impl Default for CrtpUsesU { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-14.rs b/tests/expectations/tests/template-param-usage-14.rs new file mode 100644 index 0000000000..fae4afdca8 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-14.rs @@ -0,0 +1,20 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct BaseIgnoresT { + pub x: ::std::os::raw::c_int, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct CrtpIgnoresU { + pub _base: BaseIgnoresT, + pub y: ::std::os::raw::c_int, +} +impl Default for CrtpIgnoresU { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-15.rs b/tests/expectations/tests/template-param-usage-15.rs new file mode 100644 index 0000000000..a653e08904 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-15.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct BaseUsesT { + pub usage: *mut T, +} +impl Default for BaseUsesT { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct CrtpIgnoresU { + pub _base: BaseUsesT, + pub y: ::std::os::raw::c_int, +} +impl Default for CrtpIgnoresU { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-2.rs b/tests/expectations/tests/template-param-usage-2.rs new file mode 100644 index 0000000000..6dc21b6865 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-2.rs @@ -0,0 +1,22 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct UsesTemplateParameter { + pub t: T, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct UsesTemplateParameter_AlsoUsesTemplateParameter { + pub also: T, +} +impl Default for UsesTemplateParameter_AlsoUsesTemplateParameter { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl Default for UsesTemplateParameter { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-3.rs b/tests/expectations/tests/template-param-usage-3.rs new file mode 100644 index 0000000000..a7ff22f900 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-3.rs @@ -0,0 +1,24 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct UsesTemplateParameter { + pub t: T, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct UsesTemplateParameter_AlsoUsesTemplateParameterAndMore { + pub also: T, + pub more: U, +} +impl Default for + UsesTemplateParameter_AlsoUsesTemplateParameterAndMore { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl Default for UsesTemplateParameter { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-4.rs b/tests/expectations/tests/template-param-usage-4.rs new file mode 100644 index 0000000000..31f8872dbb --- /dev/null +++ b/tests/expectations/tests/template-param-usage-4.rs @@ -0,0 +1,19 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct UsesTemplateParameter { + pub t: T, +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct UsesTemplateParameter_DoesNotUseTemplateParameters { + pub x: ::std::os::raw::c_int, +} +impl Default for UsesTemplateParameter { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-5.rs b/tests/expectations/tests/template-param-usage-5.rs new file mode 100644 index 0000000000..5a9caf32d0 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-5.rs @@ -0,0 +1,15 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct IndirectlyUsesTemplateParameter { + pub aliased: IndirectlyUsesTemplateParameter_Aliased, +} +pub type IndirectlyUsesTemplateParameter_Aliased = T; +impl Default for IndirectlyUsesTemplateParameter { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-6.rs b/tests/expectations/tests/template-param-usage-6.rs new file mode 100644 index 0000000000..37b7fe6413 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-6.rs @@ -0,0 +1,12 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct DoesNotUseTemplateParameter { + pub x: ::std::os::raw::c_int, +} +pub type DoesNotUseTemplateParameter_ButAliasDoesUseIt = T; diff --git a/tests/expectations/tests/template-param-usage-7.rs b/tests/expectations/tests/template-param-usage-7.rs new file mode 100644 index 0000000000..b0584479a7 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-7.rs @@ -0,0 +1,16 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct DoesNotUseU { + pub t: T, + pub v: V, +} +impl Default for DoesNotUseU { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +pub type Alias = DoesNotUseU<::std::os::raw::c_int, ::std::os::raw::c_schar>; diff --git a/tests/expectations/tests/template-param-usage-8.rs b/tests/expectations/tests/template-param-usage-8.rs new file mode 100644 index 0000000000..b181cc0911 --- /dev/null +++ b/tests/expectations/tests/template-param-usage-8.rs @@ -0,0 +1,17 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct IndirectUsage { + pub member1: IndirectUsage_Typedefed, + pub member2: IndirectUsage_Aliased, +} +pub type IndirectUsage_Typedefed = T; +pub type IndirectUsage_Aliased = U; +impl Default for IndirectUsage { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template-param-usage-9.rs b/tests/expectations/tests/template-param-usage-9.rs new file mode 100644 index 0000000000..d0a3f29f6a --- /dev/null +++ b/tests/expectations/tests/template-param-usage-9.rs @@ -0,0 +1,22 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct DoesNotUse { + pub _address: u8, +} +pub type DoesNotUse_Aliased = T; +pub type DoesNotUse_Typedefed = U; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct DoesNotUse_IndirectUsage { + pub member: DoesNotUse_Aliased, + pub another: DoesNotUse_Typedefed, +} +impl Default for DoesNotUse_IndirectUsage { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/template.rs b/tests/expectations/tests/template.rs index 3c829f070e..911b0e6ae1 100644 --- a/tests/expectations/tests/template.rs +++ b/tests/expectations/tests/template.rs @@ -6,37 +6,34 @@ #[repr(C)] #[derive(Debug)] -pub struct Foo { +pub struct Foo { pub m_member: T, pub m_member_ptr: *mut T, pub m_member_arr: [T; 1usize], - pub _phantom_1: ::std::marker::PhantomData, } -impl Default for Foo { +impl Default for Foo { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } extern "C" { #[link_name = "_Z3bar3FooIiiE"] - pub fn bar(foo: Foo<::std::os::raw::c_int, ::std::os::raw::c_int>); + pub fn bar(foo: Foo<::std::os::raw::c_int>); } #[repr(C)] #[derive(Debug)] -pub struct D { +pub struct D { pub m_foo: D_MyFoo, - pub _phantom_0: ::std::marker::PhantomData, } -pub type D_MyFoo = Foo<::std::os::raw::c_int, ::std::os::raw::c_int>; +pub type D_MyFoo = Foo<::std::os::raw::c_int>; #[repr(C)] #[derive(Debug)] -pub struct D_U { +pub struct D_U { pub m_nested_foo: D_MyFoo, pub m_baz: Z, - pub _phantom_0: ::std::marker::PhantomData, } -impl Default for D_U { +impl Default for D_U { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -impl Default for D { +impl Default for D { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] @@ -104,10 +101,9 @@ impl Default for PODButContainsDtor { /**
    */ #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct Opaque { - pub _phantom_0: ::std::marker::PhantomData, +pub struct Opaque { } -impl Default for Opaque { +impl Default for Opaque { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] @@ -143,11 +139,10 @@ impl Default for NestedReplaced { } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct NestedBase { +pub struct NestedBase { pub buff: *mut T, - pub _phantom_1: ::std::marker::PhantomData, } -impl Default for NestedBase { +impl Default for NestedBase { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] @@ -184,13 +179,9 @@ impl Clone for Untemplated { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Templated { +#[derive(Debug, Default, Copy, Clone)] +pub struct Templated { pub m_untemplated: Untemplated, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for Templated { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } /** * If the replacement doesn't happen at the parse level the container would be @@ -237,27 +228,23 @@ impl Default for ReplacedWithoutDestructorFwd { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct TemplateWithVar { +#[derive(Debug, Default, Copy, Clone)] +pub struct TemplateWithVar { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for TemplateWithVar { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[test] -fn __bindgen_test_layout_template_1() { - assert_eq!(::std::mem::size_of::>() - , 24usize , concat ! ( +fn __bindgen_test_layout_Foo_instantiation_95() { + assert_eq!(::std::mem::size_of::>() , 24usize , + concat ! ( "Size of template specialization: " , stringify ! ( - Foo<::std::os::raw::c_int, ::std::os::raw::c_int> ) )); - assert_eq!(::std::mem::align_of::>() - , 8usize , concat ! ( + Foo<::std::os::raw::c_int> ) )); + assert_eq!(::std::mem::align_of::>() , 8usize , + concat ! ( "Alignment of template specialization: " , stringify ! ( - Foo<::std::os::raw::c_int, ::std::os::raw::c_int> ) )); + Foo<::std::os::raw::c_int> ) )); } #[test] -fn __bindgen_test_layout_template_2() { +fn __bindgen_test_layout_Rooted_instantiation_106() { assert_eq!(::std::mem::size_of::>() , 24usize , concat ! ( "Size of template specialization: " , stringify ! ( @@ -268,7 +255,7 @@ fn __bindgen_test_layout_template_2() { Rooted<*mut ::std::os::raw::c_void> ) )); } #[test] -fn __bindgen_test_layout_template_3() { +fn __bindgen_test_layout_WithDtor_instantiation_114() { assert_eq!(::std::mem::size_of::>() , 4usize , concat ! ( "Size of template specialization: " , stringify ! ( diff --git a/tests/expectations/tests/template_typedef_transitive_param.rs b/tests/expectations/tests/template_typedef_transitive_param.rs index cc801f3574..265ab5ce1f 100644 --- a/tests/expectations/tests/template_typedef_transitive_param.rs +++ b/tests/expectations/tests/template_typedef_transitive_param.rs @@ -5,10 +5,9 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Wrapper { +#[derive(Debug, Default, Copy, Clone)] +pub struct Wrapper { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -19,6 +18,3 @@ impl Default for Wrapper_Wrapped { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } pub type Wrapper_Type = Wrapper_Wrapped; -impl Default for Wrapper { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} diff --git a/tests/expectations/tests/template_typedefs.rs b/tests/expectations/tests/template_typedefs.rs index 9213c0d234..c987bf8e05 100644 --- a/tests/expectations/tests/template_typedefs.rs +++ b/tests/expectations/tests/template_typedefs.rs @@ -7,11 +7,9 @@ pub type foo = ::std::option::Option; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct Foo { +#[derive(Debug, Default, Copy, Clone)] +pub struct Foo { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, - pub _phantom_1: ::std::marker::PhantomData, } pub type Foo_Char = T; pub type Foo_FooPtrTypedef = *mut Foo_Char; @@ -20,6 +18,3 @@ pub type Foo_nsCOMArrayEnumFunc = aData: *mut ::std::os::raw::c_void) -> bool>; -impl Default for Foo { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} diff --git a/tests/expectations/tests/templateref_opaque.rs b/tests/expectations/tests/templateref_opaque.rs index dfe941af83..89808f3010 100644 --- a/tests/expectations/tests/templateref_opaque.rs +++ b/tests/expectations/tests/templateref_opaque.rs @@ -5,22 +5,14 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct detail_PointerType { +#[derive(Debug, Default, Copy, Clone)] +pub struct detail_PointerType { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, } pub type detail_PointerType_Type = *mut T; -impl Default for detail_PointerType { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } -} #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct UniquePtr { +#[derive(Debug, Default, Copy, Clone)] +pub struct UniquePtr { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -pub type UniquePtr_Pointer = detail_PointerType; -impl Default for UniquePtr { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } +pub type UniquePtr_Pointer = detail_PointerType; diff --git a/tests/expectations/tests/typeref.rs b/tests/expectations/tests/typeref.rs index 47b7a66a55..c9982b6706 100644 --- a/tests/expectations/tests/typeref.rs +++ b/tests/expectations/tests/typeref.rs @@ -31,7 +31,7 @@ impl ::std::fmt::Debug for __BindgenUnionField { #[repr(C)] #[derive(Debug, Copy)] pub struct nsFoo { - pub mBar: mozilla_StyleShapeSource<::std::os::raw::c_int>, + pub mBar: mozilla_StyleShapeSource, } #[test] fn bindgen_test_layout_nsFoo() { @@ -89,21 +89,16 @@ impl Clone for mozilla_Position { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mozilla_StyleShapeSource { - pub __bindgen_anon_1: mozilla_StyleShapeSource__bindgen_ty_1, - pub _phantom_0: ::std::marker::PhantomData, +#[derive(Debug, Default, Copy, Clone)] +pub struct mozilla_StyleShapeSource { + pub __bindgen_anon_1: mozilla_StyleShapeSource__bindgen_ty_1, } #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct mozilla_StyleShapeSource__bindgen_ty_1 { +pub struct mozilla_StyleShapeSource__bindgen_ty_1 { pub mPosition: __BindgenUnionField<*mut mozilla_Position>, pub mFragmentOrURL: __BindgenUnionField<*mut mozilla_FragmentOrURL>, pub bindgen_union_field: u64, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for mozilla_StyleShapeSource { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Copy)] diff --git a/tests/expectations/tests/union_template.rs b/tests/expectations/tests/union_template.rs index 2eba0f0a4f..e02f196440 100644 --- a/tests/expectations/tests/union_template.rs +++ b/tests/expectations/tests/union_template.rs @@ -29,37 +29,30 @@ impl ::std::fmt::Debug for __BindgenUnionField { } } #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct NastyStruct { +#[derive(Debug, Default, Copy, Clone)] +pub struct NastyStruct { pub mIsSome: bool, - pub mStorage: NastyStruct__bindgen_ty_1, - pub __bindgen_anon_1: NastyStruct__bindgen_ty_2, - pub _phantom_0: ::std::marker::PhantomData, + pub mStorage: NastyStruct__bindgen_ty_1, + pub __bindgen_anon_1: NastyStruct__bindgen_ty_2, } #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct NastyStruct__bindgen_ty_1 { +pub struct NastyStruct__bindgen_ty_1 { pub mFoo: __BindgenUnionField<*mut ::std::os::raw::c_void>, pub mDummy: __BindgenUnionField<::std::os::raw::c_ulong>, pub bindgen_union_field: u64, - pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct NastyStruct__bindgen_ty_2 { +pub struct NastyStruct__bindgen_ty_2 { pub wat: __BindgenUnionField<::std::os::raw::c_short>, pub wut: __BindgenUnionField<*mut ::std::os::raw::c_int>, pub bindgen_union_field: u64, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for NastyStruct { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] #[derive(Debug, Default, Copy, Clone)] -pub struct Whatever { +pub struct Whatever { pub mTPtr: __BindgenUnionField<*mut ::std::os::raw::c_void>, pub mInt: __BindgenUnionField<::std::os::raw::c_int>, pub bindgen_union_field: u64, - pub _phantom_0: ::std::marker::PhantomData, } diff --git a/tests/expectations/tests/variadic_template_function.rs b/tests/expectations/tests/variadic_template_function.rs index 32be9f682b..66fd73ed52 100644 --- a/tests/expectations/tests/variadic_template_function.rs +++ b/tests/expectations/tests/variadic_template_function.rs @@ -5,11 +5,7 @@ #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct VariadicFunctionObject { +#[derive(Debug, Default, Copy, Clone)] +pub struct VariadicFunctionObject { pub _address: u8, - pub _phantom_0: ::std::marker::PhantomData, -} -impl Default for VariadicFunctionObject { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/what_is_going_on.rs b/tests/expectations/tests/what_is_going_on.rs index 46af013991..e5194c02c6 100644 --- a/tests/expectations/tests/what_is_going_on.rs +++ b/tests/expectations/tests/what_is_going_on.rs @@ -22,12 +22,11 @@ impl Clone for UnknownUnits { pub type Float = f32; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct PointTyped { +pub struct PointTyped { pub x: F, pub y: F, - pub _phantom_0: ::std::marker::PhantomData, } -impl Default for PointTyped { +impl Default for PointTyped { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -pub type IntPoint = PointTyped; +pub type IntPoint = PointTyped; diff --git a/tests/expectations/tests/whitelist_basic.rs b/tests/expectations/tests/whitelist_basic.rs index d67fb7a36a..8af4aba352 100644 --- a/tests/expectations/tests/whitelist_basic.rs +++ b/tests/expectations/tests/whitelist_basic.rs @@ -9,7 +9,6 @@ pub struct WhitelistMe { pub foo: ::std::os::raw::c_int, pub bar: WhitelistMe_Inner, - pub _phantom_0: ::std::marker::PhantomData, } #[repr(C)] #[derive(Debug, Copy, Clone)] diff --git a/tests/headers/issue-544-stylo-creduce-2.hpp b/tests/headers/issue-544-stylo-creduce-2.hpp new file mode 100644 index 0000000000..f3467f4528 --- /dev/null +++ b/tests/headers/issue-544-stylo-creduce-2.hpp @@ -0,0 +1,8 @@ +// bindgen-flags: -- -std=c++14 + +template +struct Foo { + template using FirstAlias = typename T::Associated; + template using SecondAlias = Foo>; + SecondAlias member; +}; diff --git a/tests/headers/issue-544-stylo-creduce.hpp b/tests/headers/issue-544-stylo-creduce.hpp new file mode 100644 index 0000000000..ba9f82575c --- /dev/null +++ b/tests/headers/issue-544-stylo-creduce.hpp @@ -0,0 +1,5 @@ +// bindgen-flags: -- -std=c++14 + +template class a; +template class a { a(const a &); }; +template a::a(const a &) {} diff --git a/tests/headers/partial-specialization-and-inheritance.hpp b/tests/headers/partial-specialization-and-inheritance.hpp new file mode 100644 index 0000000000..4eb8f54583 --- /dev/null +++ b/tests/headers/partial-specialization-and-inheritance.hpp @@ -0,0 +1,40 @@ +// bindgen-unstable + +// This was originally a test case generated by creducing errors in SpiderMonkey +// bindings generation. I've tried to make it understandable by giving more +// meaningful names to everything, and a couple comments. +// +// We don't support partial template specialization, but we *should* +// successfully parse this header, and generate bindings for it, but the usage +// of the partial template specialization should result in opaque blobs. + +// A base class providing a method. +template +class Base { +public: + void some_method(T, T); +}; + +// A template with a default representation. +template +class Derived { + bool b; +}; + +// A partial specialization for pointers. Note that this should have a different +// and larger layout than the template it is specializing. +template +class Derived : public Base { + int x; + int y; +}; + +// A struct that uses the partial specialization and method from the partial +// specialization's base class. +struct Usage { + Usage() { + static_member.some_method(this, this); + } + + static Derived static_member; +}; diff --git a/tests/headers/template-param-usage-0.hpp b/tests/headers/template-param-usage-0.hpp new file mode 100644 index 0000000000..57c11a105e --- /dev/null +++ b/tests/headers/template-param-usage-0.hpp @@ -0,0 +1,6 @@ +// bindgen-flags: -- -std=c++14 + +template +class UsesTemplateParameter { + T t; +}; diff --git a/tests/headers/template-param-usage-1.hpp b/tests/headers/template-param-usage-1.hpp new file mode 100644 index 0000000000..dba41489d8 --- /dev/null +++ b/tests/headers/template-param-usage-1.hpp @@ -0,0 +1,6 @@ +// bindgen-flags: -- -std=c++14 + +template +class DoesNotUseTemplateParameter { + int x; +}; diff --git a/tests/headers/template-param-usage-10.hpp b/tests/headers/template-param-usage-10.hpp new file mode 100644 index 0000000000..a6f3ccd871 --- /dev/null +++ b/tests/headers/template-param-usage-10.hpp @@ -0,0 +1,14 @@ +// bindgen-flags: -- -std=c++14 + +template +class DoublyIndirectUsage { + using Aliased = T; + typedef U Typedefed; + + class IndirectUsage { + Aliased member; + Typedefed another; + }; + + IndirectUsage doubly_indirect; +}; diff --git a/tests/headers/template-param-usage-11.hpp b/tests/headers/template-param-usage-11.hpp new file mode 100644 index 0000000000..8780f5d357 --- /dev/null +++ b/tests/headers/template-param-usage-11.hpp @@ -0,0 +1,6 @@ +// bindgen-flags: -- -std=c++14 + +template +class DoesNotUseT { + static T but_static_member_does; +}; diff --git a/tests/headers/template-param-usage-12.hpp b/tests/headers/template-param-usage-12.hpp new file mode 100644 index 0000000000..9b4cea1988 --- /dev/null +++ b/tests/headers/template-param-usage-12.hpp @@ -0,0 +1,11 @@ +// bindgen-flags: -- -std=c++14 + +template +class BaseUsesT { + T* t; +}; + +template +class CrtpUsesU : public BaseUsesT> { + U usage; +}; diff --git a/tests/headers/template-param-usage-13.hpp b/tests/headers/template-param-usage-13.hpp new file mode 100644 index 0000000000..87db1a10e1 --- /dev/null +++ b/tests/headers/template-param-usage-13.hpp @@ -0,0 +1,11 @@ +// bindgen-flags: -- -std=c++14 + +template +class BaseIgnoresT { + int x; +}; + +template +class CrtpUsesU : public BaseIgnoresT> { + U usage; +}; diff --git a/tests/headers/template-param-usage-14.hpp b/tests/headers/template-param-usage-14.hpp new file mode 100644 index 0000000000..1901629656 --- /dev/null +++ b/tests/headers/template-param-usage-14.hpp @@ -0,0 +1,11 @@ +// bindgen-flags: -- -std=c++14 + +template +class BaseIgnoresT { + int x; +}; + +template +class CrtpIgnoresU : public BaseIgnoresT> { + int y; +}; diff --git a/tests/headers/template-param-usage-15.hpp b/tests/headers/template-param-usage-15.hpp new file mode 100644 index 0000000000..bac7ada77b --- /dev/null +++ b/tests/headers/template-param-usage-15.hpp @@ -0,0 +1,11 @@ +// bindgen-flags: -- -std=c++14 + +template +class BaseUsesT { + T* usage; +}; + +template +class CrtpIgnoresU : public BaseUsesT> { + int y; +}; diff --git a/tests/headers/template-param-usage-2.hpp b/tests/headers/template-param-usage-2.hpp new file mode 100644 index 0000000000..302140ab95 --- /dev/null +++ b/tests/headers/template-param-usage-2.hpp @@ -0,0 +1,10 @@ +// bindgen-flags: -- -std=c++14 + +template +class UsesTemplateParameter { + T t; + + class AlsoUsesTemplateParameter { + T also; + }; +}; diff --git a/tests/headers/template-param-usage-3.hpp b/tests/headers/template-param-usage-3.hpp new file mode 100644 index 0000000000..57396a8a7f --- /dev/null +++ b/tests/headers/template-param-usage-3.hpp @@ -0,0 +1,12 @@ +// bindgen-flags: -- -std=c++14 + +template +class UsesTemplateParameter { + T t; + + template + class AlsoUsesTemplateParameterAndMore { + T also; + U more; + }; +}; diff --git a/tests/headers/template-param-usage-4.hpp b/tests/headers/template-param-usage-4.hpp new file mode 100644 index 0000000000..0415d69210 --- /dev/null +++ b/tests/headers/template-param-usage-4.hpp @@ -0,0 +1,11 @@ +// bindgen-flags: -- -std=c++14 + +template +class UsesTemplateParameter { + T t; + + template + class DoesNotUseTemplateParameters { + int x; + }; +}; diff --git a/tests/headers/template-param-usage-5.hpp b/tests/headers/template-param-usage-5.hpp new file mode 100644 index 0000000000..04b9bf80b7 --- /dev/null +++ b/tests/headers/template-param-usage-5.hpp @@ -0,0 +1,8 @@ +// bindgen-flags: -- -std=c++14 + +template +class IndirectlyUsesTemplateParameter { + using Aliased = T; + + Aliased aliased; +}; diff --git a/tests/headers/template-param-usage-6.hpp b/tests/headers/template-param-usage-6.hpp new file mode 100644 index 0000000000..ee0519c515 --- /dev/null +++ b/tests/headers/template-param-usage-6.hpp @@ -0,0 +1,8 @@ +// bindgen-flags: -- -std=c++14 + +template +class DoesNotUseTemplateParameter { + using ButAliasDoesUseIt = T; + + int x; +}; diff --git a/tests/headers/template-param-usage-7.hpp b/tests/headers/template-param-usage-7.hpp new file mode 100644 index 0000000000..99d4cc71b4 --- /dev/null +++ b/tests/headers/template-param-usage-7.hpp @@ -0,0 +1,10 @@ +// bindgen-flags: -- -std=c++14 + +template +class DoesNotUseU { + T t; + V v; +}; + +// The bool should go away becuase U is not used. +using Alias = DoesNotUseU; diff --git a/tests/headers/template-param-usage-8.hpp b/tests/headers/template-param-usage-8.hpp new file mode 100644 index 0000000000..96eabc0649 --- /dev/null +++ b/tests/headers/template-param-usage-8.hpp @@ -0,0 +1,10 @@ +// bindgen-flags: -- -std=c++14 + +template +class IndirectUsage { + typedef T Typedefed; + using Aliased = U; + + Typedefed member1; + Aliased member2; +}; diff --git a/tests/headers/template-param-usage-9.hpp b/tests/headers/template-param-usage-9.hpp new file mode 100644 index 0000000000..b9bd202ca8 --- /dev/null +++ b/tests/headers/template-param-usage-9.hpp @@ -0,0 +1,12 @@ +// bindgen-flags: -- -std=c++14 + +template +class DoesNotUse { + using Aliased = T; + typedef U Typedefed; + + class IndirectUsage { + Aliased member; + Typedefed another; + }; +}; From cc6ab475138ce8a27a1aceae53667f226122cac9 Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Sun, 5 Mar 2017 00:41:58 +0200 Subject: [PATCH 0391/2291] objc: Implement class methods --- src/codegen/mod.rs | 150 +++++++++++------- src/ir/function.rs | 10 +- src/ir/objc.rs | 56 +++++-- tests/expectations/tests/objc_class_method.rs | 54 +++++++ tests/expectations/tests/objc_whitelist.rs | 10 ++ tests/headers/objc_class_method.h | 11 ++ tests/headers/objc_whitelist.h | 2 + 7 files changed, 221 insertions(+), 72 deletions(-) create mode 100644 tests/expectations/tests/objc_class_method.rs create mode 100644 tests/headers/objc_class_method.h diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 7b7c31a8bd..15163a36f1 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -19,7 +19,7 @@ use ir::item::{Item, ItemAncestors, ItemCanonicalName, ItemCanonicalPath, use ir::item_kind::ItemKind; use ir::layout::Layout; use ir::module::Module; -use ir::objc::ObjCInterface; +use ir::objc::{ObjCInterface, ObjCMethod}; use ir::template::{AsNamed, TemplateInstantiation}; use ir::ty::{TemplateDeclaration, Type, TypeKind}; use ir::var::Var; @@ -2434,8 +2434,92 @@ impl CodeGenerator for Function { } } + +fn objc_method_codegen(ctx: &BindgenContext, + method: &ObjCMethod, + class_name: Option<&str>) + -> (ast::ImplItem, ast::TraitItem) { + let signature = method.signature(); + let fn_args = utils::fnsig_arguments(ctx, signature); + let fn_ret = utils::fnsig_return_ty(ctx, signature); + + let sig = if method.is_class_method() { + aster::AstBuilder::new() + .method_sig() + .unsafe_() + .fn_decl() + .with_args(fn_args.clone()) + .build(fn_ret) + } else { + aster::AstBuilder::new() + .method_sig() + .unsafe_() + .fn_decl() + .self_() + .build(ast::SelfKind::Value(ast::Mutability::Immutable)) + .with_args(fn_args.clone()) + .build(fn_ret) + }; + + // Collect the actual used argument names + let arg_names: Vec<_> = fn_args.iter() + .map(|ref arg| match arg.pat.node { + ast::PatKind::Ident(_, ref spanning, _) => { + spanning.node.name.as_str().to_string() + } + _ => { + panic!("odd argument!"); + } + }) + .collect(); + + let methods_and_args = + ctx.rust_ident(&method.format_method_call(&arg_names)); + + let body = if method.is_class_method() { + let class_name = + class_name.expect("Generating a class method without class name?") + .to_owned(); + let expect_msg = format!("Couldn't find {}", class_name); + quote_stmt!(ctx.ext_cx(), + msg_send![objc::runtime::Class::get($class_name).expect($expect_msg), $methods_and_args]) + .unwrap() + } else { + quote_stmt!(ctx.ext_cx(), msg_send![self, $methods_and_args]).unwrap() + }; + let block = ast::Block { + stmts: vec![body], + id: ast::DUMMY_NODE_ID, + rules: ast::BlockCheckMode::Default, + span: ctx.span(), + }; + + let attrs = vec![]; + + let impl_item = ast::ImplItem { + id: ast::DUMMY_NODE_ID, + ident: ctx.rust_ident(method.rust_name()), + vis: ast::Visibility::Inherited, // Public, + attrs: attrs.clone(), + node: ast::ImplItemKind::Method(sig.clone(), P(block)), + defaultness: ast::Defaultness::Final, + span: ctx.span(), + }; + + let trait_item = ast::TraitItem { + id: ast::DUMMY_NODE_ID, + ident: ctx.rust_ident(method.rust_name()), + attrs: attrs, + node: ast::TraitItemKind::Method(sig, None), + span: ctx.span(), + }; + + (impl_item, trait_item) +} + impl CodeGenerator for ObjCInterface { type Extra = Item; + fn codegen<'a>(&self, ctx: &BindgenContext, result: &mut CodegenResult<'a>, @@ -2445,66 +2529,18 @@ impl CodeGenerator for ObjCInterface { let mut trait_items = vec![]; for method in self.methods() { - let signature = method.signature(); - let fn_args = utils::fnsig_arguments(ctx, signature); - let fn_ret = utils::fnsig_return_ty(ctx, signature); - let sig = aster::AstBuilder::new() - .method_sig() - .unsafe_() - .fn_decl() - .self_() - .build(ast::SelfKind::Value(ast::Mutability::Immutable)) - .with_args(fn_args.clone()) - .build(fn_ret); - - // Collect the actual used argument names - let arg_names: Vec<_> = fn_args.iter() - .map(|ref arg| match arg.pat.node { - ast::PatKind::Ident(_, ref spanning, _) => { - spanning.node.name.as_str().to_string() - } - _ => { - panic!("odd argument!"); - } - }) - .collect(); - - let methods_and_args = - ctx.rust_ident(&method.format_method_call(&arg_names)); - let body = quote_stmt!(ctx.ext_cx(), - msg_send![self, $methods_and_args]) - .unwrap(); - let block = ast::Block { - stmts: vec![body], - id: ast::DUMMY_NODE_ID, - rules: ast::BlockCheckMode::Default, - span: ctx.span(), - }; - - let attrs = vec![]; - - let impl_item = ast::ImplItem { - id: ast::DUMMY_NODE_ID, - ident: ctx.rust_ident(method.rust_name()), - vis: ast::Visibility::Inherited, // Public, - attrs: attrs.clone(), - node: ast::ImplItemKind::Method(sig.clone(), P(block)), - defaultness: ast::Defaultness::Final, - span: ctx.span(), - }; - - let trait_item = ast::TraitItem { - id: ast::DUMMY_NODE_ID, - ident: ctx.rust_ident(method.rust_name()), - attrs: attrs, - node: ast::TraitItemKind::Method(sig, None), - span: ctx.span(), - }; - + let (impl_item, trait_item) = + objc_method_codegen(ctx, method, None); impl_items.push(impl_item); trait_items.push(trait_item) } + for class_method in self.class_methods() { + let (impl_item, trait_item) = + objc_method_codegen(ctx, class_method, Some(self.name())); + impl_items.push(impl_item); + trait_items.push(trait_item) + } let trait_name = self.rust_name(); diff --git a/src/ir/function.rs b/src/ir/function.rs index e82ba83cf2..941694ffb4 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -182,7 +182,8 @@ impl FunctionSig { CXCursor_FunctionDecl | CXCursor_Constructor | CXCursor_CXXMethod | - CXCursor_ObjCInstanceMethodDecl => { + CXCursor_ObjCInstanceMethodDecl | + CXCursor_ObjCClassMethodDecl => { // For CXCursor_FunctionDecl, cursor.args() is the reliable way // to get parameter names and types. cursor.args() @@ -243,7 +244,8 @@ impl FunctionSig { } } - let ty_ret_type = if cursor.kind() == CXCursor_ObjCInstanceMethodDecl { + let ty_ret_type = if cursor.kind() == CXCursor_ObjCInstanceMethodDecl || + cursor.kind() == CXCursor_ObjCClassMethodDecl { try!(cursor.ret_type().ok_or(ParseError::Continue)) } else { try!(ty.ret_type().ok_or(ParseError::Continue)) @@ -252,8 +254,8 @@ impl FunctionSig { let abi = get_abi(ty.call_conv()); if abi.is_none() { - assert_eq!(cursor.kind(), - CXCursor_ObjCInstanceMethodDecl, + assert!(cursor.kind() == CXCursor_ObjCInstanceMethodDecl || + cursor.kind() == CXCursor_ObjCClassMethodDecl, "Invalid ABI for function signature") } diff --git a/src/ir/objc.rs b/src/ir/objc.rs index 485bda8a56..3a88eef8ab 100644 --- a/src/ir/objc.rs +++ b/src/ir/objc.rs @@ -7,6 +7,7 @@ use super::ty::TypeKind; use clang; use clang_sys::CXChildVisit_Continue; use clang_sys::CXCursor_ObjCCategoryDecl; +use clang_sys::CXCursor_ObjCClassMethodDecl; use clang_sys::CXCursor_ObjCClassRef; use clang_sys::CXCursor_ObjCInstanceMethodDecl; use clang_sys::CXCursor_ObjCProtocolDecl; @@ -28,12 +29,14 @@ pub struct ObjCInterface { conforms_to: Vec, /// List of the methods defined in this interfae - methods: Vec, + methods: Vec, + + class_methods: Vec, } /// The objective c methods #[derive(Debug)] -pub struct ObjCInstanceMethod { +pub struct ObjCMethod { /// The original method selector name /// like, dataWithBytes:length: name: String, @@ -43,6 +46,9 @@ pub struct ObjCInstanceMethod { rust_name: String, signature: FunctionSig, + + /// Is class method? + is_class_method: bool, } impl ObjCInterface { @@ -53,6 +59,7 @@ impl ObjCInterface { is_protocol: false, conforms_to: Vec::new(), methods: Vec::new(), + class_methods: Vec::new(), } } @@ -77,11 +84,16 @@ impl ObjCInterface { } } - /// List of the methods defined in this interfae - pub fn methods(&self) -> &Vec { + /// List of the methods defined in this interface + pub fn methods(&self) -> &Vec { &self.methods } + /// List of the class methods defined in this interface + pub fn class_methods(&self) -> &Vec { + &self.class_methods + } + /// Parses the Objective C interface from the cursor pub fn from_ty(cursor: &clang::Cursor, ctx: &mut BindgenContext) @@ -131,14 +143,15 @@ impl ObjCInterface { } } - CXCursor_ObjCInstanceMethodDecl => { + CXCursor_ObjCInstanceMethodDecl | + CXCursor_ObjCClassMethodDecl => { let name = c.spelling(); let signature = FunctionSig::from_ty(&c.cur_type(), &c, ctx) .expect("Invalid function sig"); - let method = ObjCInstanceMethod::new(&name, signature); - - interface.methods.push(method); + let is_class_method = c.kind() == CXCursor_ObjCClassMethodDecl; + let method = ObjCMethod::new(&name, signature, is_class_method); + interface.add_method(method); } _ => {} } @@ -146,18 +159,30 @@ impl ObjCInterface { }); Some(interface) } + + fn add_method(&mut self, method: ObjCMethod) { + if method.is_class_method { + self.class_methods.push(method); + } else { + self.methods.push(method); + } + } } -impl ObjCInstanceMethod { - fn new(name: &str, signature: FunctionSig) -> ObjCInstanceMethod { +impl ObjCMethod { + fn new(name: &str, + signature: FunctionSig, + is_class_method: bool) + -> ObjCMethod { let split_name: Vec<&str> = name.split(':').collect(); let rust_name = split_name.join("_"); - ObjCInstanceMethod { + ObjCMethod { name: name.to_owned(), rust_name: rust_name.to_owned(), signature: signature, + is_class_method: is_class_method, } } @@ -178,6 +203,11 @@ impl ObjCInstanceMethod { &self.signature } + /// Is this a class method? + pub fn is_class_method(&self) -> bool { + self.is_class_method + } + /// Formats the method call pub fn format_method_call(&self, args: &[String]) -> String { let split_name: Vec<&str> = @@ -213,6 +243,10 @@ impl Trace for ObjCInterface { method.signature.trace(context, tracer, &()); } + for class_method in &self.class_methods { + class_method.signature.trace(context, tracer, &()); + } + for protocol in &self.conforms_to { tracer.visit(*protocol); } diff --git a/tests/expectations/tests/objc_class_method.rs b/tests/expectations/tests/objc_class_method.rs new file mode 100644 index 0000000000..768abe1070 --- /dev/null +++ b/tests/expectations/tests/objc_class_method.rs @@ -0,0 +1,54 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +#![cfg(target_os="macos")] + +#[macro_use] +extern crate objc; +#[allow(non_camel_case_types)] +pub type id = *mut objc::runtime::Object; +pub trait Foo { + unsafe fn method(); + unsafe fn methodWithInt_(foo: ::std::os::raw::c_int); + unsafe fn methodWithFoo_(foo: id); + unsafe fn methodReturningInt() + -> ::std::os::raw::c_int; + unsafe fn methodReturningFoo() + -> *mut id; + unsafe fn methodWithArg1_andArg2_andArg3_(intvalue: ::std::os::raw::c_int, + ptr: + *mut ::std::os::raw::c_schar, + floatvalue: f32); +} +impl Foo for id { + unsafe fn method() { + msg_send!(objc :: runtime :: Class :: get ( "Foo" ) . expect ( + "Couldn\'t find Foo" ) , method) + } + unsafe fn methodWithInt_(foo: ::std::os::raw::c_int) { + msg_send!(objc :: runtime :: Class :: get ( "Foo" ) . expect ( + "Couldn\'t find Foo" ) , methodWithInt:foo ) + } + unsafe fn methodWithFoo_(foo: id) { + msg_send!(objc :: runtime :: Class :: get ( "Foo" ) . expect ( + "Couldn\'t find Foo" ) , methodWithFoo:foo ) + } + unsafe fn methodReturningInt() -> ::std::os::raw::c_int { + msg_send!(objc :: runtime :: Class :: get ( "Foo" ) . expect ( + "Couldn\'t find Foo" ) , methodReturningInt) + } + unsafe fn methodReturningFoo() -> *mut id { + msg_send!(objc :: runtime :: Class :: get ( "Foo" ) . expect ( + "Couldn\'t find Foo" ) , methodReturningFoo) + } + unsafe fn methodWithArg1_andArg2_andArg3_(intvalue: ::std::os::raw::c_int, + ptr: + *mut ::std::os::raw::c_schar, + floatvalue: f32) { + msg_send!(objc :: runtime :: Class :: get ( "Foo" ) . expect ( + "Couldn\'t find Foo" ) , + methodWithArg1:intvalue andArg2:ptr andArg3:floatvalue ) + } +} diff --git a/tests/expectations/tests/objc_whitelist.rs b/tests/expectations/tests/objc_whitelist.rs index 332453f1e0..b0418f38d1 100644 --- a/tests/expectations/tests/objc_whitelist.rs +++ b/tests/expectations/tests/objc_whitelist.rs @@ -11,15 +11,25 @@ extern crate objc; pub type id = *mut objc::runtime::Object; pub trait protocol_SomeProtocol { unsafe fn protocolMethod(self); + unsafe fn protocolClassMethod(); } impl protocol_SomeProtocol for id { unsafe fn protocolMethod(self) { msg_send!(self , protocolMethod) } + unsafe fn protocolClassMethod() { + msg_send!(objc :: runtime :: Class :: get ( "SomeProtocol" ) . expect + ( "Couldn\'t find SomeProtocol" ) , protocolClassMethod) + } } pub trait WhitelistMe { unsafe fn method(self); + unsafe fn classMethod(); } impl WhitelistMe for id { unsafe fn method(self) { msg_send!(self , method) } + unsafe fn classMethod() { + msg_send!(objc :: runtime :: Class :: get ( "WhitelistMe" ) . expect ( + "Couldn\'t find WhitelistMe" ) , classMethod) + } } pub trait WhitelistMe_InterestingCategory { } impl WhitelistMe_InterestingCategory for id { } diff --git a/tests/headers/objc_class_method.h b/tests/headers/objc_class_method.h new file mode 100644 index 0000000000..ddda742e8a --- /dev/null +++ b/tests/headers/objc_class_method.h @@ -0,0 +1,11 @@ +// bindgen-flags: --objc-extern-crate -- -x objective-c +// bindgen-osx-only + +@interface Foo ++ (void)method; ++ (void)methodWithInt:(int)foo; ++ (void)methodWithFoo:(Foo*)foo; ++ (int)methodReturningInt; ++ (Foo*)methodReturningFoo; ++ (void)methodWithArg1:(int)intvalue andArg2:(char*)ptr andArg3:(float)floatvalue; +@end diff --git a/tests/headers/objc_whitelist.h b/tests/headers/objc_whitelist.h index 7cbe43d696..8a3bb86917 100644 --- a/tests/headers/objc_whitelist.h +++ b/tests/headers/objc_whitelist.h @@ -5,11 +5,13 @@ // Protocol should be included, since it is used by the WhitelistMe @protocol SomeProtocol -(void)protocolMethod; ++(void)protocolClassMethod; @end // The whitelisted item @interface WhitelistMe -(void)method; ++(void)classMethod; @end // This was also explicitly whitelisted From e0ca63263c144ef41975c5440812c9c6cde2be91 Mon Sep 17 00:00:00 2001 From: Huxley Date: Tue, 7 Mar 2017 20:00:33 +0800 Subject: [PATCH 0392/2291] automatically allow non rust naming conventions --- src/codegen/helpers.rs | 4 ++++ src/codegen/mod.rs | 14 +++++++++++--- .../tests/duplicated-namespaces-definitions.rs | 1 + tests/expectations/tests/duplicated-namespaces.rs | 1 + .../tests/duplicated_constants_in_ns.rs | 1 + tests/expectations/tests/inline_namespace.rs | 1 + .../tests/inline_namespace_conservative.rs | 1 + .../tests/inline_namespace_whitelist.rs | 1 + tests/expectations/tests/issue-372.rs | 1 + tests/expectations/tests/issue-410.rs | 1 + tests/expectations/tests/issue-447.rs | 1 + tests/expectations/tests/issue_311.rs | 1 + tests/expectations/tests/module-whitelisted.rs | 1 + tests/expectations/tests/namespace.rs | 1 + .../expectations/tests/nested_within_namespace.rs | 1 + tests/expectations/tests/reparented_replacement.rs | 1 + tests/expectations/tests/struct_typedef_ns.rs | 1 + .../expectations/tests/template_alias_namespace.rs | 1 + tests/expectations/tests/union-in-ns.rs | 1 + .../tests/whitelist-namespaces-basic.rs | 1 + tests/expectations/tests/whitelist-namespaces.rs | 1 + 21 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/codegen/helpers.rs b/src/codegen/helpers.rs index 06dadab0c9..811d87c5ad 100644 --- a/src/codegen/helpers.rs +++ b/src/codegen/helpers.rs @@ -10,6 +10,10 @@ pub mod attributes { use aster; use syntax::ast; + pub fn allow(which_ones: &[&str]) -> ast::Attribute { + aster::AstBuilder::new().attr().list("allow").words(which_ones).build() + } + pub fn repr(which: &str) -> ast::Attribute { aster::AstBuilder::new().attr().list("repr").words(&[which]).build() } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 99324bc6ac..80319ac68d 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -403,10 +403,18 @@ impl CodeGenerator for Module { }); let name = item.canonical_name(ctx); - let item = aster::AstBuilder::new() + let item_builder = aster::AstBuilder::new() .item() - .pub_() - .build_item_kind(name, module); + .pub_(); + let item = if name == "root" { + let attrs = &["non_snake_case", + "non_camel_case_types", + "non_upper_case_globals"]; + item_builder.with_attr(attributes::allow(attrs)) + .build_item_kind(name, module) + } else { + item_builder.build_item_kind(name, module) + }; result.push(item); } diff --git a/tests/expectations/tests/duplicated-namespaces-definitions.rs b/tests/expectations/tests/duplicated-namespaces-definitions.rs index 196cfc46d1..faba454d2a 100644 --- a/tests/expectations/tests/duplicated-namespaces-definitions.rs +++ b/tests/expectations/tests/duplicated-namespaces-definitions.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/duplicated-namespaces.rs b/tests/expectations/tests/duplicated-namespaces.rs index 42976657ad..7416dad9d6 100644 --- a/tests/expectations/tests/duplicated-namespaces.rs +++ b/tests/expectations/tests/duplicated-namespaces.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/duplicated_constants_in_ns.rs b/tests/expectations/tests/duplicated_constants_in_ns.rs index 3721740c46..226765b645 100644 --- a/tests/expectations/tests/duplicated_constants_in_ns.rs +++ b/tests/expectations/tests/duplicated_constants_in_ns.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/inline_namespace.rs b/tests/expectations/tests/inline_namespace.rs index 8f2243ba2c..d62fb862f1 100644 --- a/tests/expectations/tests/inline_namespace.rs +++ b/tests/expectations/tests/inline_namespace.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/inline_namespace_conservative.rs b/tests/expectations/tests/inline_namespace_conservative.rs index 7cf7c26421..267f28cfa3 100644 --- a/tests/expectations/tests/inline_namespace_conservative.rs +++ b/tests/expectations/tests/inline_namespace_conservative.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/inline_namespace_whitelist.rs b/tests/expectations/tests/inline_namespace_whitelist.rs index d3a9d95855..d4a5aaff51 100644 --- a/tests/expectations/tests/inline_namespace_whitelist.rs +++ b/tests/expectations/tests/inline_namespace_whitelist.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/issue-372.rs b/tests/expectations/tests/issue-372.rs index 1693f46a2d..3f4592f368 100644 --- a/tests/expectations/tests/issue-372.rs +++ b/tests/expectations/tests/issue-372.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/issue-410.rs b/tests/expectations/tests/issue-410.rs index 3c6cd2809d..1f624fec7b 100644 --- a/tests/expectations/tests/issue-410.rs +++ b/tests/expectations/tests/issue-410.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/issue-447.rs b/tests/expectations/tests/issue-447.rs index 7ac9d714ab..619a17b812 100644 --- a/tests/expectations/tests/issue-447.rs +++ b/tests/expectations/tests/issue-447.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/issue_311.rs b/tests/expectations/tests/issue_311.rs index 6576b8b5fb..0510f1c1f9 100644 --- a/tests/expectations/tests/issue_311.rs +++ b/tests/expectations/tests/issue_311.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/module-whitelisted.rs b/tests/expectations/tests/module-whitelisted.rs index cb6dd6a6c1..0f4d54b321 100644 --- a/tests/expectations/tests/module-whitelisted.rs +++ b/tests/expectations/tests/module-whitelisted.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/namespace.rs b/tests/expectations/tests/namespace.rs index dda4cd2690..21b5a58b7a 100644 --- a/tests/expectations/tests/namespace.rs +++ b/tests/expectations/tests/namespace.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/nested_within_namespace.rs b/tests/expectations/tests/nested_within_namespace.rs index cb6eead35c..c51446573e 100644 --- a/tests/expectations/tests/nested_within_namespace.rs +++ b/tests/expectations/tests/nested_within_namespace.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/reparented_replacement.rs b/tests/expectations/tests/reparented_replacement.rs index 6965f767d7..93cd3012c5 100644 --- a/tests/expectations/tests/reparented_replacement.rs +++ b/tests/expectations/tests/reparented_replacement.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/struct_typedef_ns.rs b/tests/expectations/tests/struct_typedef_ns.rs index d7ada7fd1e..0f078e6ffb 100644 --- a/tests/expectations/tests/struct_typedef_ns.rs +++ b/tests/expectations/tests/struct_typedef_ns.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/template_alias_namespace.rs b/tests/expectations/tests/template_alias_namespace.rs index dd4add4083..90740a2d6f 100644 --- a/tests/expectations/tests/template_alias_namespace.rs +++ b/tests/expectations/tests/template_alias_namespace.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/union-in-ns.rs b/tests/expectations/tests/union-in-ns.rs index 208b62832a..e5aeb3688b 100644 --- a/tests/expectations/tests/union-in-ns.rs +++ b/tests/expectations/tests/union-in-ns.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[repr(C)] pub struct __BindgenUnionField(::std::marker::PhantomData); diff --git a/tests/expectations/tests/whitelist-namespaces-basic.rs b/tests/expectations/tests/whitelist-namespaces-basic.rs index ba96895b62..6a1e90291f 100644 --- a/tests/expectations/tests/whitelist-namespaces-basic.rs +++ b/tests/expectations/tests/whitelist-namespaces-basic.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; diff --git a/tests/expectations/tests/whitelist-namespaces.rs b/tests/expectations/tests/whitelist-namespaces.rs index 5e47c9d6bb..0c6cc4b694 100644 --- a/tests/expectations/tests/whitelist-namespaces.rs +++ b/tests/expectations/tests/whitelist-namespaces.rs @@ -4,6 +4,7 @@ #![allow(non_snake_case)] +#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)] pub mod root { #[allow(unused_imports)] use self::super::root; From 96c4eb4bf728e09db849be77e8c6b2dc78bf0b87 Mon Sep 17 00:00:00 2001 From: Tai Sassen-Liang Date: Tue, 7 Mar 2017 20:05:48 +0100 Subject: [PATCH 0393/2291] Do not print builtin macro definitions in ast_dump Resolves issue #476. Moves out logic for checking whether a cursor has a filename (previously used exclusively in private function lib::filter_builtins) into the actual cursor. This code is then used to check whether a cursor is a builtin when dumping the AST. --- src/clang.rs | 9 +++++++++ src/lib.rs | 7 +------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index b8086d9943..6af5d2c9bb 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -77,6 +77,12 @@ impl Cursor { } } + /// Returns whether the cursor refers to a built-in definition. + pub fn is_builtin(&self) -> bool { + let (file, _, _, _) = self.location().location(); + !file.name().is_some() + } + /// Get the `Cursor` for this cursor's referent's lexical parent. /// /// The lexical parent is the parent of the definition. The semantic parent @@ -1445,6 +1451,9 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { } fn print_cursor>(depth: isize, prefix: S, c: &Cursor) { + if c.is_builtin() { + return; + } let prefix = prefix.as_ref(); print_indent(depth, format!(" {}kind = {}", prefix, kind_to_str(c.kind()))); diff --git a/src/lib.rs b/src/lib.rs index 5e14d81eed..5d4df26a3c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -826,12 +826,7 @@ impl<'ctx> Bindings<'ctx> { /// Determines whether the given cursor is in any of the files matched by the /// options. fn filter_builtins(ctx: &BindgenContext, cursor: &clang::Cursor) -> bool { - let (file, _, _, _) = cursor.location().location(); - - match file.name() { - None => ctx.options().builtins, - Some(..) => true, - } + !cursor.is_builtin() || ctx.options().builtins } /// Parse one `Item` from the Clang cursor. From b826a80d2016c4b32fc23019deb3c4071af91728 Mon Sep 17 00:00:00 2001 From: Tai Sassen-Liang Date: Thu, 9 Mar 2017 01:10:49 +0100 Subject: [PATCH 0394/2291] Reorder conditional; use is_none() --- src/clang.rs | 2 +- src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 6af5d2c9bb..fc7950dcfc 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -80,7 +80,7 @@ impl Cursor { /// Returns whether the cursor refers to a built-in definition. pub fn is_builtin(&self) -> bool { let (file, _, _, _) = self.location().location(); - !file.name().is_some() + file.name().is_none() } /// Get the `Cursor` for this cursor's referent's lexical parent. diff --git a/src/lib.rs b/src/lib.rs index 5d4df26a3c..30d9987b99 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -826,7 +826,7 @@ impl<'ctx> Bindings<'ctx> { /// Determines whether the given cursor is in any of the files matched by the /// options. fn filter_builtins(ctx: &BindgenContext, cursor: &clang::Cursor) -> bool { - !cursor.is_builtin() || ctx.options().builtins + ctx.options().builtins || !cursor.is_builtin() } /// Parse one `Item` from the Clang cursor. From 50ee7372b4bb67097cc40fc9578b880efebb2680 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 8 Mar 2017 14:42:05 -0800 Subject: [PATCH 0395/2291] Reintroduce bitfield accessors This commit reintroduces accessor methods for bitfields in the generated bindings. Fixes #519 --- bindgen-integration/cpp/Test.cc | 28 ++ bindgen-integration/cpp/Test.h | 42 ++ bindgen-integration/src/lib.rs | 54 +++ src/codegen/mod.rs | 152 +++++-- tests/expectations/tests/bitfield_align.rs | 406 ++++++++++++++++++ .../tests/bitfield_method_mangling.rs | 38 ++ .../expectations/tests/jsval_layout_opaque.rs | 38 ++ tests/expectations/tests/layout_align.rs | 56 +++ tests/expectations/tests/layout_eth_conf.rs | 220 ++++++++++ tests/expectations/tests/layout_mbuf.rs | 238 ++++++++++ tests/expectations/tests/only_bitfields.rs | 38 ++ .../tests/struct_with_bitfields.rs | 110 +++++ .../tests/union_with_anon_struct_bitfield.rs | 38 ++ tests/expectations/tests/weird_bitfields.rs | 128 ++++++ 14 files changed, 1550 insertions(+), 36 deletions(-) mode change 100644 => 100755 bindgen-integration/src/lib.rs diff --git a/bindgen-integration/cpp/Test.cc b/bindgen-integration/cpp/Test.cc index fa0ff827e3..1d9624069c 100644 --- a/bindgen-integration/cpp/Test.cc +++ b/bindgen-integration/cpp/Test.cc @@ -20,3 +20,31 @@ Test::Test(double foo) : m_int(0) , m_double(foo) {} + +namespace bitfields { + +bool +First::assert(unsigned char first, + unsigned char second, + unsigned char third) +{ + return three_bits_byte_one == first && + six_bits_byte_two == second && + two_bits_byte_two == third; +} + +bool +Second::assert(int first, bool second) +{ + return thirty_one_bits == first && one_bit == second; +} + +bool +Third::assert(int first, bool second, ItemKind third) +{ + return flags == first && + is_whatever == second && + kind == third; +} + +} diff --git a/bindgen-integration/cpp/Test.h b/bindgen-integration/cpp/Test.h index db90f4d7b9..c060984da6 100644 --- a/bindgen-integration/cpp/Test.h +++ b/bindgen-integration/cpp/Test.h @@ -20,3 +20,45 @@ typedef Test TypeAlias; } // namespace testing typedef testing::TypeAlias TypeAlias; + +namespace bitfields { + +struct First { + unsigned char three_bits_byte_one : 3; + // This starts a new byte, leaving 5 bits unused. + unsigned char :0; + + unsigned char six_bits_byte_two : 6; + unsigned char two_bits_byte_two : 2; + + /// Returns true if the bitfields match the arguments, false otherwise. + bool assert(unsigned char first, + unsigned char second, + unsigned char third); +}; + +struct Second { + int thirty_one_bits : 31; + bool one_bit : 1; + + /// Returns true if the bitfields match the arguments, false otherwise. + bool assert(int first, + bool second); +}; + +enum ItemKind { + ITEM_KIND_UNO, + ITEM_KIND_DOS, + ITEM_KIND_TRES, +}; + +struct Third { + int flags : 28; + bool is_whatever : 1; + ItemKind kind : 3; + + /// Returns true if the bitfields match the arguments, false otherwise. + bool assert(int first, bool second, ItemKind third); +}; + +} // namespace bitfields diff --git a/bindgen-integration/src/lib.rs b/bindgen-integration/src/lib.rs old mode 100644 new mode 100755 index c64589a8bc..8d7eb75379 --- a/bindgen-integration/src/lib.rs +++ b/bindgen-integration/src/lib.rs @@ -1,9 +1,12 @@ +#![allow(warnings)] + mod bindings { include!(concat!(env!("OUT_DIR"), "/test.rs")); } use std::ffi::CStr; use std::os::raw::c_int; +use std::mem; #[test] fn test_static_array() { @@ -47,3 +50,54 @@ fn test_overload() { assert_eq!(test.m_int, 0); assert_eq!(test.m_double, 5.0); } + +#[test] +fn test_bitfields_first() { + let mut first: bindings::bitfields::First = unsafe { + mem::zeroed() + }; + assert!(unsafe { + first.assert(0, 0, 0) + }); + first.set_three_bits_byte_one(2); + first.set_six_bits_byte_two(42); + first.set_two_bits_byte_two(1); + assert!(unsafe { + first.assert(2, 42, 1) + }); +} + +#[test] +fn test_bitfields_second() { + let mut second: bindings::bitfields::Second = unsafe { + mem::zeroed() + }; + assert!(unsafe { + second.assert(0, false) + }); + second.set_thirty_one_bits(1337); + second.set_one_bit(true); + assert!(unsafe { + second.assert(1337, true) + }); +} + +#[test] +fn test_bitfields_third() { + let mut third: bindings::bitfields::Third = unsafe { + mem::zeroed() + }; + assert!(unsafe { + third.assert(0, + false, + bindings::bitfields::ItemKind::ITEM_KIND_UNO) + }); + third.set_flags(12345); + third.set_is_whatever(true); + third.set_kind(bindings::bitfields::ItemKind::ITEM_KIND_TRES); + assert!(unsafe { + third.assert(12345, + true, + bindings::bitfields::ItemKind::ITEM_KIND_TRES) + }); +} diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 15163a36f1..4693007e7d 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -736,10 +736,8 @@ impl<'a> Bitfield<'a> { fn codegen_fields(self, ctx: &BindgenContext, fields: &mut Vec, - _methods: &mut Vec) + methods: &mut Vec) -> Layout { - use aster::struct_field::StructFieldBuilder; - // NOTE: What follows is reverse-engineered from LLVM's // lib/AST/RecordLayoutBuilder.cpp // @@ -757,29 +755,28 @@ impl<'a> Bitfield<'a> { let mut last_field_name = format!("_bitfield_{}", self.index); let mut last_field_align = 0; + // (name, mask, width, bitfield's type, bitfield's layout) + let mut bitfields: Vec<(&str, usize, usize, ast::Ty, Layout)> = vec![]; + for field in self.fields { - let width = field.bitfield().unwrap(); + let width = field.bitfield().unwrap() as usize; let field_item = ctx.resolve_item(field.ty()); let field_ty_layout = field_item.kind() .expect_type() .layout(ctx) .expect("Bitfield without layout? Gah!"); - let field_align = field_ty_layout.align; if field_size_in_bits != 0 && - (width == 0 || width as usize > unfilled_bits_in_last_unit) { + (width == 0 || width > unfilled_bits_in_last_unit) { + // We've finished a physical field, so flush it and its bitfields. field_size_in_bits = align_to(field_size_in_bits, field_align); - // Push the new field. - let ty = - BlobTyBuilder::new(Layout::new(bytes_from_bits_pow2(field_size_in_bits), - bytes_from_bits_pow2(last_field_align))) - .build(); - - let field = StructFieldBuilder::named(&last_field_name) - .pub_() - .build_ty(ty); - fields.push(field); + fields.push(flush_bitfields(ctx, + field_size_in_bits, + last_field_align, + &last_field_name, + bitfields.drain(..), + methods)); // TODO(emilio): dedup this. *self.index += 1; @@ -791,44 +788,127 @@ impl<'a> Bitfield<'a> { last_field_align = 0; } - // TODO(emilio): Create the accessors. Problem here is that we still - // don't know which one is going to be the final alignment of the - // bitfield, and whether we have to index in it. Thus, we don't know - // which integer type do we need. - // - // We could push them to a Vec or something, but given how buggy - // they where maybe it's not a great idea? - field_size_in_bits += width as usize; - total_size_in_bits += width as usize; + if let Some(name) = field.name() { + bitfields.push((name, + field_size_in_bits, + width, + field_item.to_rust_ty(ctx).unwrap(), + field_ty_layout)); + } + field_size_in_bits += width; + total_size_in_bits += width; let data_size = align_to(field_size_in_bits, field_align * 8); max_align = cmp::max(max_align, field_align); // NB: The width here is completely, absolutely intentional. - last_field_align = cmp::max(last_field_align, width as usize); + last_field_align = cmp::max(last_field_align, width); unfilled_bits_in_last_unit = data_size - field_size_in_bits; } if field_size_in_bits != 0 { - // Push the last field. - let ty = - BlobTyBuilder::new(Layout::new(bytes_from_bits_pow2(field_size_in_bits), - bytes_from_bits_pow2(last_field_align))) - .build(); - - let field = StructFieldBuilder::named(&last_field_name) - .pub_() - .build_ty(ty); - fields.push(field); + // Flush the last physical field and its bitfields. + fields.push(flush_bitfields(ctx, + field_size_in_bits, + last_field_align, + &last_field_name, + bitfields.drain(..), + methods)); } Layout::new(bytes_from_bits(total_size_in_bits), max_align) } } +/// A physical field (which is a word or byte or ...) has many logical bitfields +/// contained within it, but not all bitfields are in the same physical field of +/// a struct. This function creates a single physical field and flushes all the +/// accessors for the logical `bitfields` within that physical field to the +/// outgoing `methods`. +fn flush_bitfields<'a, I>(ctx: &BindgenContext, + field_size_in_bits: usize, + field_align: usize, + field_name: &str, + bitfields: I, + methods: &mut Vec) -> ast::StructField + where I: IntoIterator +{ + use aster::struct_field::StructFieldBuilder; + + let field_layout = Layout::new(bytes_from_bits_pow2(field_size_in_bits), + bytes_from_bits_pow2(field_align)); + let field_ty = BlobTyBuilder::new(field_layout).build(); + + let field = StructFieldBuilder::named(field_name) + .pub_() + .build_ty(field_ty.clone()); + + for (name, offset, width, bitfield_ty, bitfield_layout) in bitfields { + let prefix = ctx.trait_prefix(); + let getter_name = ctx.rust_ident(name); + let setter_name = ctx.ext_cx() + .ident_of(&format!("set_{}", &name)); + let field_ident = ctx.ext_cx().ident_of(field_name); + + let field_int_ty = match field_layout.size { + 8 => quote_ty!(ctx.ext_cx(), u64), + 4 => quote_ty!(ctx.ext_cx(), u32), + 2 => quote_ty!(ctx.ext_cx(), u16), + 1 => quote_ty!(ctx.ext_cx(), u8), + _ => panic!("physical field containing bitfields should be sized \ + 8, 4, 2, or 1 bytes") + }; + let bitfield_int_ty = BlobTyBuilder::new(bitfield_layout).build(); + + let mask: usize = ((1usize << width) - 1usize) << offset; + + let impl_item = quote_item!( + ctx.ext_cx(), + impl XxxIgnored { + #[inline] + pub fn $getter_name(&self) -> $bitfield_ty { + let mask = $mask as $field_int_ty; + let field_val: $field_int_ty = unsafe { + ::$prefix::mem::transmute(self.$field_ident) + }; + let val = (field_val & mask) >> $offset; + unsafe { + ::$prefix::mem::transmute(val as $bitfield_int_ty) + } + } + + #[inline] + pub fn $setter_name(&mut self, val: $bitfield_ty) { + let mask = $mask as $field_int_ty; + let val = val as $bitfield_int_ty as $field_int_ty; + + let mut field_val: $field_int_ty = unsafe { + ::$prefix::mem::transmute(self.$field_ident) + }; + field_val &= !mask; + field_val |= (val << $offset) & mask; + + self.$field_ident = unsafe { + ::$prefix::mem::transmute(field_val) + }; + } + } + ).unwrap(); + + match impl_item.unwrap().node { + ast::ItemKind::Impl(_, _, _, _, _, items) => { + methods.extend(items.into_iter()); + }, + _ => unreachable!(), + }; + } + + field +} + impl CodeGenerator for TemplateInstantiation { type Extra = Item; diff --git a/tests/expectations/tests/bitfield_align.rs b/tests/expectations/tests/bitfield_align.rs index ffc170b1bd..5151bc4d56 100644 --- a/tests/expectations/tests/bitfield_align.rs +++ b/tests/expectations/tests/bitfield_align.rs @@ -30,6 +30,188 @@ fn bindgen_test_layout_A() { impl Clone for A { fn clone(&self) -> Self { *self } } +impl A { + #[inline] + pub fn b1(&self) -> ::std::os::raw::c_uint { + let mask = 1usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b1(&mut self, val: ::std::os::raw::c_uint) { + let mask = 1usize as u16; + let val = val as u32 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b2(&self) -> ::std::os::raw::c_uint { + let mask = 2usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 1usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b2(&mut self, val: ::std::os::raw::c_uint) { + let mask = 2usize as u16; + let val = val as u32 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 1usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b3(&self) -> ::std::os::raw::c_uint { + let mask = 4usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 2usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b3(&mut self, val: ::std::os::raw::c_uint) { + let mask = 4usize as u16; + let val = val as u32 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 2usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b4(&self) -> ::std::os::raw::c_uint { + let mask = 8usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 3usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b4(&mut self, val: ::std::os::raw::c_uint) { + let mask = 8usize as u16; + let val = val as u32 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 3usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b5(&self) -> ::std::os::raw::c_uint { + let mask = 16usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 4usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b5(&mut self, val: ::std::os::raw::c_uint) { + let mask = 16usize as u16; + let val = val as u32 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 4usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b6(&self) -> ::std::os::raw::c_uint { + let mask = 32usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 5usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b6(&mut self, val: ::std::os::raw::c_uint) { + let mask = 32usize as u16; + let val = val as u32 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 5usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b7(&self) -> ::std::os::raw::c_uint { + let mask = 64usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 6usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b7(&mut self, val: ::std::os::raw::c_uint) { + let mask = 64usize as u16; + let val = val as u32 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 6usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b8(&self) -> ::std::os::raw::c_uint { + let mask = 128usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 7usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b8(&mut self, val: ::std::os::raw::c_uint) { + let mask = 128usize as u16; + let val = val as u32 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 7usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b9(&self) -> ::std::os::raw::c_uint { + let mask = 256usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 8usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b9(&mut self, val: ::std::os::raw::c_uint) { + let mask = 256usize as u16; + let val = val as u32 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 8usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b10(&self) -> ::std::os::raw::c_uint { + let mask = 512usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 9usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b10(&mut self, val: ::std::os::raw::c_uint) { + let mask = 512usize as u16; + let val = val as u32 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 9usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} #[repr(C)] #[derive(Debug, Default, Copy)] pub struct B { @@ -46,6 +228,44 @@ fn bindgen_test_layout_B() { impl Clone for B { fn clone(&self) -> Self { *self } } +impl B { + #[inline] + pub fn foo(&self) -> ::std::os::raw::c_uint { + let mask = 2147483647usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_foo(&mut self, val: ::std::os::raw::c_uint) { + let mask = 2147483647usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn bar(&self) -> ::std::os::raw::c_uchar { + let mask = 2147483648usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 31usize; + unsafe { ::std::mem::transmute(val as u8) } + } + #[inline] + pub fn set_bar(&mut self, val: ::std::os::raw::c_uchar) { + let mask = 2147483648usize as u32; + let val = val as u8 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 31usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} #[repr(C)] #[derive(Debug, Default, Copy)] pub struct C { @@ -72,6 +292,44 @@ fn bindgen_test_layout_C() { impl Clone for C { fn clone(&self) -> Self { *self } } +impl C { + #[inline] + pub fn b1(&self) -> ::std::os::raw::c_uint { + let mask = 1usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b1(&mut self, val: ::std::os::raw::c_uint) { + let mask = 1usize as u8; + let val = val as u32 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b2(&self) -> ::std::os::raw::c_uint { + let mask = 2usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 1usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b2(&mut self, val: ::std::os::raw::c_uint) { + let mask = 2usize as u8; + let val = val as u32 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 1usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} #[repr(C)] #[derive(Debug, Default, Copy)] pub struct Date1 { @@ -89,6 +347,80 @@ fn bindgen_test_layout_Date1() { impl Clone for Date1 { fn clone(&self) -> Self { *self } } +impl Date1 { + #[inline] + pub fn nWeekDay(&self) -> ::std::os::raw::c_ushort { + let mask = 7usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_nWeekDay(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 7usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn nMonthDay(&self) -> ::std::os::raw::c_ushort { + let mask = 504usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 3usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_nMonthDay(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 504usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 3usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn nMonth(&self) -> ::std::os::raw::c_ushort { + let mask = 15872usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 9usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_nMonth(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 15872usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 9usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn nYear(&self) -> ::std::os::raw::c_ushort { + let mask = 255usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_nYear(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 255usize as u8; + let val = val as u16 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_2 = unsafe { ::std::mem::transmute(field_val) }; + } +} #[repr(C)] #[derive(Debug, Default, Copy)] pub struct Date2 { @@ -112,3 +444,77 @@ fn bindgen_test_layout_Date2() { impl Clone for Date2 { fn clone(&self) -> Self { *self } } +impl Date2 { + #[inline] + pub fn nWeekDay(&self) -> ::std::os::raw::c_ushort { + let mask = 7usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_nWeekDay(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 7usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn nMonthDay(&self) -> ::std::os::raw::c_ushort { + let mask = 504usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 3usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_nMonthDay(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 504usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 3usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn nMonth(&self) -> ::std::os::raw::c_ushort { + let mask = 15872usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 9usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_nMonth(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 15872usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 9usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn nYear(&self) -> ::std::os::raw::c_ushort { + let mask = 255usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_nYear(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 255usize as u8; + let val = val as u16 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_2 = unsafe { ::std::mem::transmute(field_val) }; + } +} diff --git a/tests/expectations/tests/bitfield_method_mangling.rs b/tests/expectations/tests/bitfield_method_mangling.rs index f21b208939..16076f0c31 100644 --- a/tests/expectations/tests/bitfield_method_mangling.rs +++ b/tests/expectations/tests/bitfield_method_mangling.rs @@ -23,3 +23,41 @@ fn bindgen_test_layout_mach_msg_type_descriptor_t() { impl Clone for mach_msg_type_descriptor_t { fn clone(&self) -> Self { *self } } +impl mach_msg_type_descriptor_t { + #[inline] + pub fn pad3(&self) -> ::std::os::raw::c_uint { + let mask = 16777215usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_pad3(&mut self, val: ::std::os::raw::c_uint) { + let mask = 16777215usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn type_(&self) -> ::std::os::raw::c_uint { + let mask = 4278190080usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 24usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_type(&mut self, val: ::std::os::raw::c_uint) { + let mask = 4278190080usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 24usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} diff --git a/tests/expectations/tests/jsval_layout_opaque.rs b/tests/expectations/tests/jsval_layout_opaque.rs index eb5306d27b..b34b02652d 100644 --- a/tests/expectations/tests/jsval_layout_opaque.rs +++ b/tests/expectations/tests/jsval_layout_opaque.rs @@ -129,6 +129,44 @@ impl Clone for jsval_layout__bindgen_ty_1 { impl Default for jsval_layout__bindgen_ty_1 { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } +impl jsval_layout__bindgen_ty_1 { + #[inline] + pub fn payload47(&self) -> u64 { + let mask = 140737488355327usize as u64; + let field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u64) } + } + #[inline] + pub fn set_payload47(&mut self, val: u64) { + let mask = 140737488355327usize as u64; + let val = val as u64 as u64; + let mut field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn tag(&self) -> JSValueTag { + let mask = 18446603336221196288usize as u64; + let field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 47usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_tag(&mut self, val: JSValueTag) { + let mask = 18446603336221196288usize as u64; + let val = val as u32 as u64; + let mut field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 47usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} #[repr(C)] #[derive(Debug, Default, Copy)] pub struct jsval_layout__bindgen_ty_2 { diff --git a/tests/expectations/tests/layout_align.rs b/tests/expectations/tests/layout_align.rs index 9085480caa..ea1103a06e 100644 --- a/tests/expectations/tests/layout_align.rs +++ b/tests/expectations/tests/layout_align.rs @@ -89,3 +89,59 @@ fn bindgen_test_layout_rte_eth_link() { impl Clone for rte_eth_link { fn clone(&self) -> Self { *self } } +impl rte_eth_link { + #[inline] + pub fn link_duplex(&self) -> u16 { + let mask = 1usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_link_duplex(&mut self, val: u16) { + let mask = 1usize as u8; + let val = val as u16 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn link_autoneg(&self) -> u16 { + let mask = 2usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 1usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_link_autoneg(&mut self, val: u16) { + let mask = 2usize as u8; + let val = val as u16 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 1usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn link_status(&self) -> u16 { + let mask = 4usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 2usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_link_status(&mut self, val: u16) { + let mask = 4usize as u8; + let val = val as u16 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 2usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} diff --git a/tests/expectations/tests/layout_eth_conf.rs b/tests/expectations/tests/layout_eth_conf.rs index ae46f5c6be..4503fb823c 100644 --- a/tests/expectations/tests/layout_eth_conf.rs +++ b/tests/expectations/tests/layout_eth_conf.rs @@ -118,6 +118,170 @@ impl Clone for rte_eth_rxmode { impl Default for rte_eth_rxmode { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } +impl rte_eth_rxmode { + #[inline] + pub fn header_split(&self) -> u16 { + let mask = 1usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_header_split(&mut self, val: u16) { + let mask = 1usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn hw_ip_checksum(&self) -> u16 { + let mask = 2usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 1usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_hw_ip_checksum(&mut self, val: u16) { + let mask = 2usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 1usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn hw_vlan_filter(&self) -> u16 { + let mask = 4usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 2usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_hw_vlan_filter(&mut self, val: u16) { + let mask = 4usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 2usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn hw_vlan_strip(&self) -> u16 { + let mask = 8usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 3usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_hw_vlan_strip(&mut self, val: u16) { + let mask = 8usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 3usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn hw_vlan_extend(&self) -> u16 { + let mask = 16usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 4usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_hw_vlan_extend(&mut self, val: u16) { + let mask = 16usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 4usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn jumbo_frame(&self) -> u16 { + let mask = 32usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 5usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_jumbo_frame(&mut self, val: u16) { + let mask = 32usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 5usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn hw_strip_crc(&self) -> u16 { + let mask = 64usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 6usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_hw_strip_crc(&mut self, val: u16) { + let mask = 64usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 6usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn enable_scatter(&self) -> u16 { + let mask = 128usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 7usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_enable_scatter(&mut self, val: u16) { + let mask = 128usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 7usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn enable_lro(&self) -> u16 { + let mask = 256usize as u16; + let field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 8usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_enable_lro(&mut self, val: u16) { + let mask = 256usize as u16; + let val = val as u16 as u16; + let mut field_val: u16 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 8usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} #[repr(u32)] /** * A set of values to identify what method is to be used to transmit @@ -165,6 +329,62 @@ impl Clone for rte_eth_txmode { impl Default for rte_eth_txmode { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } +impl rte_eth_txmode { + #[inline] + pub fn hw_vlan_reject_tagged(&self) -> u8 { + let mask = 1usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u8) } + } + #[inline] + pub fn set_hw_vlan_reject_tagged(&mut self, val: u8) { + let mask = 1usize as u8; + let val = val as u8 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn hw_vlan_reject_untagged(&self) -> u8 { + let mask = 2usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 1usize; + unsafe { ::std::mem::transmute(val as u8) } + } + #[inline] + pub fn set_hw_vlan_reject_untagged(&mut self, val: u8) { + let mask = 2usize as u8; + let val = val as u8 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 1usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn hw_vlan_insert_pvid(&self) -> u8 { + let mask = 4usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 2usize; + unsafe { ::std::mem::transmute(val as u8) } + } + #[inline] + pub fn set_hw_vlan_insert_pvid(&mut self, val: u8) { + let mask = 4usize as u8; + let val = val as u8 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 2usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} /** * A structure used to configure the Receive Side Scaling (RSS) feature * of an Ethernet port. diff --git a/tests/expectations/tests/layout_mbuf.rs b/tests/expectations/tests/layout_mbuf.rs index 8ad13f11a4..6c8b758618 100644 --- a/tests/expectations/tests/layout_mbuf.rs +++ b/tests/expectations/tests/layout_mbuf.rs @@ -175,6 +175,134 @@ fn bindgen_test_layout_rte_mbuf__bindgen_ty_2__bindgen_ty_1() { impl Clone for rte_mbuf__bindgen_ty_2__bindgen_ty_1 { fn clone(&self) -> Self { *self } } +impl rte_mbuf__bindgen_ty_2__bindgen_ty_1 { + #[inline] + pub fn l2_type(&self) -> u32 { + let mask = 15usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_l2_type(&mut self, val: u32) { + let mask = 15usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn l3_type(&self) -> u32 { + let mask = 240usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 4usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_l3_type(&mut self, val: u32) { + let mask = 240usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 4usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn l4_type(&self) -> u32 { + let mask = 3840usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 8usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_l4_type(&mut self, val: u32) { + let mask = 3840usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 8usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn tun_type(&self) -> u32 { + let mask = 61440usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 12usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_tun_type(&mut self, val: u32) { + let mask = 61440usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 12usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn inner_l2_type(&self) -> u32 { + let mask = 983040usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 16usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_inner_l2_type(&mut self, val: u32) { + let mask = 983040usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 16usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn inner_l3_type(&self) -> u32 { + let mask = 15728640usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 20usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_inner_l3_type(&mut self, val: u32) { + let mask = 15728640usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 20usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn inner_l4_type(&self) -> u32 { + let mask = 251658240usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 24usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_inner_l4_type(&mut self, val: u32) { + let mask = 251658240usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 24usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_2() { assert_eq!(::std::mem::size_of::() , 4usize , @@ -425,6 +553,116 @@ fn bindgen_test_layout_rte_mbuf__bindgen_ty_5__bindgen_ty_1() { impl Clone for rte_mbuf__bindgen_ty_5__bindgen_ty_1 { fn clone(&self) -> Self { *self } } +impl rte_mbuf__bindgen_ty_5__bindgen_ty_1 { + #[inline] + pub fn l2_len(&self) -> u64 { + let mask = 127usize as u64; + let field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u64) } + } + #[inline] + pub fn set_l2_len(&mut self, val: u64) { + let mask = 127usize as u64; + let val = val as u64 as u64; + let mut field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn l3_len(&self) -> u64 { + let mask = 65408usize as u64; + let field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 7usize; + unsafe { ::std::mem::transmute(val as u64) } + } + #[inline] + pub fn set_l3_len(&mut self, val: u64) { + let mask = 65408usize as u64; + let val = val as u64 as u64; + let mut field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 7usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn l4_len(&self) -> u64 { + let mask = 16711680usize as u64; + let field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 16usize; + unsafe { ::std::mem::transmute(val as u64) } + } + #[inline] + pub fn set_l4_len(&mut self, val: u64) { + let mask = 16711680usize as u64; + let val = val as u64 as u64; + let mut field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 16usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn tso_segsz(&self) -> u64 { + let mask = 1099494850560usize as u64; + let field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 24usize; + unsafe { ::std::mem::transmute(val as u64) } + } + #[inline] + pub fn set_tso_segsz(&mut self, val: u64) { + let mask = 1099494850560usize as u64; + let val = val as u64 as u64; + let mut field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 24usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn outer_l3_len(&self) -> u64 { + let mask = 561850441793536usize as u64; + let field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 40usize; + unsafe { ::std::mem::transmute(val as u64) } + } + #[inline] + pub fn set_outer_l3_len(&mut self, val: u64) { + let mask = 561850441793536usize as u64; + let val = val as u64 as u64; + let mut field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 40usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn outer_l2_len(&self) -> u64 { + let mask = 71494644084506624usize as u64; + let field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 49usize; + unsafe { ::std::mem::transmute(val as u64) } + } + #[inline] + pub fn set_outer_l2_len(&mut self, val: u64) { + let mask = 71494644084506624usize as u64; + let val = val as u64 as u64; + let mut field_val: u64 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 49usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} #[test] fn bindgen_test_layout_rte_mbuf__bindgen_ty_5() { assert_eq!(::std::mem::size_of::() , 8usize , diff --git a/tests/expectations/tests/only_bitfields.rs b/tests/expectations/tests/only_bitfields.rs index 643725d9f9..0decd2bf0b 100644 --- a/tests/expectations/tests/only_bitfields.rs +++ b/tests/expectations/tests/only_bitfields.rs @@ -20,3 +20,41 @@ fn bindgen_test_layout_C() { impl Clone for C { fn clone(&self) -> Self { *self } } +impl C { + #[inline] + pub fn a(&self) -> bool { + let mask = 1usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u8) } + } + #[inline] + pub fn set_a(&mut self, val: bool) { + let mask = 1usize as u8; + let val = val as u8 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b(&self) -> bool { + let mask = 254usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 1usize; + unsafe { ::std::mem::transmute(val as u8) } + } + #[inline] + pub fn set_b(&mut self, val: bool) { + let mask = 254usize as u8; + let val = val as u8 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 1usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} diff --git a/tests/expectations/tests/struct_with_bitfields.rs b/tests/expectations/tests/struct_with_bitfields.rs index 2f9ba42d38..92f1ec474a 100644 --- a/tests/expectations/tests/struct_with_bitfields.rs +++ b/tests/expectations/tests/struct_with_bitfields.rs @@ -27,3 +27,113 @@ fn bindgen_test_layout_bitfield() { impl Clone for bitfield { fn clone(&self) -> Self { *self } } +impl bitfield { + #[inline] + pub fn a(&self) -> ::std::os::raw::c_ushort { + let mask = 1usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_a(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 1usize as u8; + let val = val as u16 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn b(&self) -> ::std::os::raw::c_ushort { + let mask = 2usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 1usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_b(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 2usize as u8; + let val = val as u16 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 1usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn c(&self) -> ::std::os::raw::c_ushort { + let mask = 4usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 2usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_c(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 4usize as u8; + let val = val as u16 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 2usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn d(&self) -> ::std::os::raw::c_ushort { + let mask = 192usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 6usize; + unsafe { ::std::mem::transmute(val as u16) } + } + #[inline] + pub fn set_d(&mut self, val: ::std::os::raw::c_ushort) { + let mask = 192usize as u8; + let val = val as u16 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 6usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn f(&self) -> ::std::os::raw::c_uint { + let mask = 3usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_f(&mut self, val: ::std::os::raw::c_uint) { + let mask = 3usize as u8; + let val = val as u32 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_2 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn g(&self) -> ::std::os::raw::c_uint { + let mask = 4294967295usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_3) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_g(&mut self, val: ::std::os::raw::c_uint) { + let mask = 4294967295usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_3) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_3 = unsafe { ::std::mem::transmute(field_val) }; + } +} diff --git a/tests/expectations/tests/union_with_anon_struct_bitfield.rs b/tests/expectations/tests/union_with_anon_struct_bitfield.rs index f102117f10..de19dc9102 100644 --- a/tests/expectations/tests/union_with_anon_struct_bitfield.rs +++ b/tests/expectations/tests/union_with_anon_struct_bitfield.rs @@ -51,6 +51,44 @@ fn bindgen_test_layout_foo__bindgen_ty_1() { impl Clone for foo__bindgen_ty_1 { fn clone(&self) -> Self { *self } } +impl foo__bindgen_ty_1 { + #[inline] + pub fn b(&self) -> ::std::os::raw::c_int { + let mask = 127usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_b(&mut self, val: ::std::os::raw::c_int) { + let mask = 127usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn c(&self) -> ::std::os::raw::c_int { + let mask = 4294967168usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 7usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_c(&mut self, val: ::std::os::raw::c_int) { + let mask = 4294967168usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 7usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } +} #[test] fn bindgen_test_layout_foo() { assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( diff --git a/tests/expectations/tests/weird_bitfields.rs b/tests/expectations/tests/weird_bitfields.rs index 466904e851..52638b01c6 100644 --- a/tests/expectations/tests/weird_bitfields.rs +++ b/tests/expectations/tests/weird_bitfields.rs @@ -103,3 +103,131 @@ impl Clone for Weird { impl Default for Weird { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } +impl Weird { + #[inline] + pub fn bitTest(&self) -> ::std::os::raw::c_uint { + let mask = 65535usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_bitTest(&mut self, val: ::std::os::raw::c_uint) { + let mask = 65535usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn bitTest2(&self) -> ::std::os::raw::c_uint { + let mask = 2147418112usize as u32; + let field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 16usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_bitTest2(&mut self, val: ::std::os::raw::c_uint) { + let mask = 2147418112usize as u32; + let val = val as u32 as u32; + let mut field_val: u32 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 16usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn mFillOpacitySource(&self) -> nsStyleSVGOpacitySource { + let mask = 7usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_mFillOpacitySource(&mut self, val: nsStyleSVGOpacitySource) { + let mask = 7usize as u8; + let val = val as u32 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_2 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn mStrokeOpacitySource(&self) -> nsStyleSVGOpacitySource { + let mask = 56usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + let val = (field_val & mask) >> 3usize; + unsafe { ::std::mem::transmute(val as u32) } + } + #[inline] + pub fn set_mStrokeOpacitySource(&mut self, val: nsStyleSVGOpacitySource) { + let mask = 56usize as u8; + let val = val as u32 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + field_val &= !mask; + field_val |= (val << 3usize) & mask; + self._bitfield_2 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn mStrokeDasharrayFromObject(&self) -> bool { + let mask = 64usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + let val = (field_val & mask) >> 6usize; + unsafe { ::std::mem::transmute(val as u8) } + } + #[inline] + pub fn set_mStrokeDasharrayFromObject(&mut self, val: bool) { + let mask = 64usize as u8; + let val = val as u8 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + field_val &= !mask; + field_val |= (val << 6usize) & mask; + self._bitfield_2 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn mStrokeDashoffsetFromObject(&self) -> bool { + let mask = 128usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + let val = (field_val & mask) >> 7usize; + unsafe { ::std::mem::transmute(val as u8) } + } + #[inline] + pub fn set_mStrokeDashoffsetFromObject(&mut self, val: bool) { + let mask = 128usize as u8; + let val = val as u8 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_2) }; + field_val &= !mask; + field_val |= (val << 7usize) & mask; + self._bitfield_2 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub fn mStrokeWidthFromObject(&self) -> bool { + let mask = 1usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_3) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u8) } + } + #[inline] + pub fn set_mStrokeWidthFromObject(&mut self, val: bool) { + let mask = 1usize as u8; + let val = val as u8 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_3) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_3 = unsafe { ::std::mem::transmute(field_val) }; + } +} From b914a099942c0c788c24684928cfb96c75912902 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 9 Mar 2017 11:05:45 -0800 Subject: [PATCH 0396/2291] Implement ToRustTy for TemplateInstantiation This pulls existing code out of Type's ToRustTy implementation and into an implementation of ToRustTy for TemplateInstantiation. Purely code motion. --- src/codegen/mod.rs | 130 ++++++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 61 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 4693007e7d..9209be446b 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2265,67 +2265,7 @@ impl ToRustTy for Type { aster::AstBuilder::new().ty().path().ids(path).build() } TypeKind::TemplateInstantiation(ref inst) => { - let decl = inst.template_definition(); - let mut ty = decl.to_rust_ty(ctx).unwrap(); - - // If we gave up when making a type for the template definition, - // check if maybe we can make a better opaque blob for the - // instantiation. - if ty == aster::AstBuilder::new().ty().unit().unwrap() { - if let Some(layout) = self.layout(ctx) { - ty = BlobTyBuilder::new(layout).build().unwrap() - } - } - - let decl_params = if let Some(params) = - decl.self_template_params(ctx) { - params - } else { - // This can happen if we generated an opaque type for a - // partial template specialization, in which case we just - // use the opaque type's layout. If we don't have a layout, - // we cross our fingers and hope for the best :-/ - debug_assert!(ctx.resolve_type_through_type_refs(decl) - .is_opaque()); - let layout = self.layout(ctx).unwrap_or(Layout::zero()); - ty = BlobTyBuilder::new(layout).build().unwrap(); - - vec![] - }; - - // TODO: If the decl type is a template class/struct - // declaration's member template declaration, it could rely on - // generic template parameters from its outer template - // class/struct. When we emit bindings for it, it could require - // *more* type arguments than we have here, and we will need to - // reconstruct them somehow. We don't have any means of doing - // that reconstruction at this time. - - if let ast::TyKind::Path(_, ref mut path) = ty.node { - let template_args = inst.template_arguments() - .iter() - .zip(decl_params.iter()) - // Only pass type arguments for the type parameters that - // the decl uses. - .filter(|&(_, param)| ctx.uses_template_parameter(decl, *param)) - .map(|(arg, _)| arg.to_rust_ty(ctx)) - .collect::>(); - - path.segments.last_mut().unwrap().parameters = if - template_args.is_empty() { - None - } else { - Some(P(ast::PathParameters::AngleBracketed( - ast::AngleBracketedParameterData { - lifetimes: vec![], - types: P::from_vec(template_args), - bindings: P::from_vec(vec![]), - } - ))) - } - } - - P(ty) + inst.to_rust_ty(ctx, self) } TypeKind::ResolvedTypeRef(inner) => inner.to_rust_ty(ctx), TypeKind::TemplateAlias(inner, _) | @@ -2409,6 +2349,74 @@ impl ToRustTy for Type { } } +impl ToRustTy for TemplateInstantiation { + type Extra = Type; + + fn to_rust_ty(&self, ctx: &BindgenContext, self_ty: &Type) -> P { + let decl = self.template_definition(); + let mut ty = decl.to_rust_ty(ctx).unwrap(); + + // If we gave up when making a type for the template definition, + // check if maybe we can make a better opaque blob for the + // instantiation. + if ty == aster::AstBuilder::new().ty().unit().unwrap() { + if let Some(layout) = self_ty.layout(ctx) { + ty = BlobTyBuilder::new(layout).build().unwrap() + } + } + + let decl_params = if let Some(params) = + decl.self_template_params(ctx) { + params + } else { + // This can happen if we generated an opaque type for a + // partial template specialization, in which case we just + // use the opaque type's layout. If we don't have a layout, + // we cross our fingers and hope for the best :-/ + debug_assert!(ctx.resolve_type_through_type_refs(decl) + .is_opaque()); + let layout = self_ty.layout(ctx).unwrap_or(Layout::zero()); + ty = BlobTyBuilder::new(layout).build().unwrap(); + + vec![] + }; + + // TODO: If the decl type is a template class/struct + // declaration's member template declaration, it could rely on + // generic template parameters from its outer template + // class/struct. When we emit bindings for it, it could require + // *more* type arguments than we have here, and we will need to + // reconstruct them somehow. We don't have any means of doing + // that reconstruction at this time. + + if let ast::TyKind::Path(_, ref mut path) = ty.node { + let template_args = self.template_arguments() + .iter() + .zip(decl_params.iter()) + // Only pass type arguments for the type parameters that + // the decl uses. + .filter(|&(_, param)| ctx.uses_template_parameter(decl, *param)) + .map(|(arg, _)| arg.to_rust_ty(ctx)) + .collect::>(); + + path.segments.last_mut().unwrap().parameters = if + template_args.is_empty() { + None + } else { + Some(P(ast::PathParameters::AngleBracketed( + ast::AngleBracketedParameterData { + lifetimes: vec![], + types: P::from_vec(template_args), + bindings: P::from_vec(vec![]), + } + ))) + } + } + + P(ty) + } +} + impl ToRustTy for FunctionSig { type Extra = Item; From 72ab471539fcf2809f82e2dd980c59352a67eba4 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 9 Mar 2017 11:12:19 -0800 Subject: [PATCH 0397/2291] Simplify control flow in TemplateInstantiation's ToRustTy If we hit a case where we generate an opaque blob instead of an instantiation of a generic, then we won't ever be attaching generic parameters, and can bail out of the function early. --- src/codegen/mod.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 9209be446b..49b320ae8a 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2361,7 +2361,7 @@ impl ToRustTy for TemplateInstantiation { // instantiation. if ty == aster::AstBuilder::new().ty().unit().unwrap() { if let Some(layout) = self_ty.layout(ctx) { - ty = BlobTyBuilder::new(layout).build().unwrap() + return BlobTyBuilder::new(layout).build(); } } @@ -2376,9 +2376,7 @@ impl ToRustTy for TemplateInstantiation { debug_assert!(ctx.resolve_type_through_type_refs(decl) .is_opaque()); let layout = self_ty.layout(ctx).unwrap_or(Layout::zero()); - ty = BlobTyBuilder::new(layout).build().unwrap(); - - vec![] + return BlobTyBuilder::new(layout).build(); }; // TODO: If the decl type is a template class/struct From b662443c1bf0c6c0103b91aec30e6b95ea5c4ff4 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 9 Mar 2017 13:53:20 -0800 Subject: [PATCH 0398/2291] Generate better opaque blobs in the face of non-type parameters When instantiating templates whose definitions have non-type generic parameters, prefer the layout of the instantiation type to the garbage we get from the definition's layout. In general, an instantiation's layout will always be a better choice than the definition's layout, regardless of non-type parameters. Fixes #569 --- src/codegen/mod.rs | 16 +++++-- ...ate-params-causing-layout-test-failures.rs | 42 ++++++++++++++++ tests/expectations/tests/non-type-params.rs | 48 +++++++++++++++++++ tests/expectations/tests/opaque_pointer.rs | 2 +- tests/expectations/tests/type_alias_empty.rs | 2 +- ...te-params-causing-layout-test-failures.hpp | 27 +++++++++++ tests/headers/non-type-params.hpp | 17 +++++++ 7 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 tests/expectations/tests/issue-569-non-type-template-params-causing-layout-test-failures.rs create mode 100644 tests/expectations/tests/non-type-params.rs create mode 100644 tests/headers/issue-569-non-type-template-params-causing-layout-test-failures.hpp create mode 100644 tests/headers/non-type-params.hpp diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 49b320ae8a..fe93783f32 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -561,7 +561,13 @@ impl CodeGenerator for Type { let layout = self.layout(ctx).unwrap_or_else(Layout::zero); BlobTyBuilder::new(layout).build() } else { - inner_item.to_rust_ty(ctx) + let inner_rust_ty = inner_item.to_rust_ty(ctx); + if inner_rust_ty == aster::AstBuilder::new().ty().unit() { + let layout = self.layout(ctx).unwrap_or_else(|| Layout::for_size(1)); + BlobTyBuilder::new(layout).build() + } else { + inner_rust_ty + } }; { @@ -2356,12 +2362,14 @@ impl ToRustTy for TemplateInstantiation { let decl = self.template_definition(); let mut ty = decl.to_rust_ty(ctx).unwrap(); - // If we gave up when making a type for the template definition, - // check if maybe we can make a better opaque blob for the - // instantiation. if ty == aster::AstBuilder::new().ty().unit().unwrap() { + // If we gave up when making a type for the template definition, + // check if maybe we can make a better opaque blob for the + // instantiation. If not, at least don't use a zero-sized type. if let Some(layout) = self_ty.layout(ctx) { return BlobTyBuilder::new(layout).build(); + } else { + return quote_ty!(ctx.ext_cx(), u8); } } diff --git a/tests/expectations/tests/issue-569-non-type-template-params-causing-layout-test-failures.rs b/tests/expectations/tests/issue-569-non-type-template-params-causing-layout-test-failures.rs new file mode 100644 index 0000000000..6cf2ba16c6 --- /dev/null +++ b/tests/expectations/tests/issue-569-non-type-template-params-causing-layout-test-failures.rs @@ -0,0 +1,42 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const ENUM_VARIANT_1: _bindgen_ty_1 = _bindgen_ty_1::ENUM_VARIANT_1; +pub const ENUM_VARIANT_2: _bindgen_ty_1 = _bindgen_ty_1::ENUM_VARIANT_2; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum _bindgen_ty_1 { ENUM_VARIANT_1 = 0, ENUM_VARIANT_2 = 1, } +pub type JS_Alias = u8; +#[repr(C)] +pub struct JS_Base { + pub f: JS_Alias, +} +impl Default for JS_Base { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +pub struct JS_AutoIdVector { + pub _base: JS_Base, +} +#[test] +fn bindgen_test_layout_JS_AutoIdVector() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( JS_AutoIdVector ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! + ( "Alignment of " , stringify ! ( JS_AutoIdVector ) )); +} +impl Default for JS_AutoIdVector { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[test] +fn __bindgen_test_layout_JS_Base_instantiation_16() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of template specialization: " , stringify ! ( JS_Base ) + )); + assert_eq!(::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + JS_Base ) )); +} diff --git a/tests/expectations/tests/non-type-params.rs b/tests/expectations/tests/non-type-params.rs new file mode 100644 index 0000000000..039aa711da --- /dev/null +++ b/tests/expectations/tests/non-type-params.rs @@ -0,0 +1,48 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub type Array16 = u8; +pub type ArrayInt4 = [u32; 4usize]; +#[repr(C)] +pub struct UsesArray { + pub array_char_16: [u8; 16usize], + pub array_bool_8: [u8; 8usize], + pub array_int_4: ArrayInt4, +} +#[test] +fn bindgen_test_layout_UsesArray() { + assert_eq!(::std::mem::size_of::() , 40usize , concat ! ( + "Size of: " , stringify ! ( UsesArray ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( UsesArray ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const UsesArray ) ) . array_char_16 as * const + _ as usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( UsesArray ) , "::" , + stringify ! ( array_char_16 ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const UsesArray ) ) . array_bool_8 as * const _ + as usize } , 16usize , concat ! ( + "Alignment of field: " , stringify ! ( UsesArray ) , "::" , + stringify ! ( array_bool_8 ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const UsesArray ) ) . array_int_4 as * const _ + as usize } , 24usize , concat ! ( + "Alignment of field: " , stringify ! ( UsesArray ) , "::" , + stringify ! ( array_int_4 ) )); +} +impl Default for UsesArray { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[test] +fn __bindgen_test_layout_Array_instantiation_18() { + assert_eq!(::std::mem::size_of::<[u32; 4usize]>() , 16usize , concat ! ( + "Size of template specialization: " , stringify ! ( + [u32; 4usize] ) )); + assert_eq!(::std::mem::align_of::<[u32; 4usize]>() , 4usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + [u32; 4usize] ) )); +} diff --git a/tests/expectations/tests/opaque_pointer.rs b/tests/expectations/tests/opaque_pointer.rs index 2e1890a8b4..1a2da431dc 100644 --- a/tests/expectations/tests/opaque_pointer.rs +++ b/tests/expectations/tests/opaque_pointer.rs @@ -35,7 +35,7 @@ impl Default for Opaque { #[repr(C)] #[derive(Debug, Copy)] pub struct WithOpaquePtr { - pub whatever: *mut (), + pub whatever: *mut u8, pub other: u32, pub t: OtherOpaque, } diff --git a/tests/expectations/tests/type_alias_empty.rs b/tests/expectations/tests/type_alias_empty.rs index 47e36006e4..c455b8aeaa 100644 --- a/tests/expectations/tests/type_alias_empty.rs +++ b/tests/expectations/tests/type_alias_empty.rs @@ -4,4 +4,4 @@ #![allow(non_snake_case)] -pub type bool_constant = (); +pub type bool_constant = u8; diff --git a/tests/headers/issue-569-non-type-template-params-causing-layout-test-failures.hpp b/tests/headers/issue-569-non-type-template-params-causing-layout-test-failures.hpp new file mode 100644 index 0000000000..7f8c2d8aa8 --- /dev/null +++ b/tests/headers/issue-569-non-type-template-params-causing-layout-test-failures.hpp @@ -0,0 +1,27 @@ +// bindgen-flags: -- -std=c++14 + +// Generated by C-Reduce, cleaned up and given names for readability. + +template +struct HasNonTypeTemplateParam { + // But doesn't use the non-type template param nor its type param... +}; + +enum { + ENUM_VARIANT_1, + ENUM_VARIANT_2 +}; + +namespace JS { + +template +using Alias = HasNonTypeTemplateParam; + +template +class Base { + Alias f; +}; + +class AutoIdVector : Base {}; + +} diff --git a/tests/headers/non-type-params.hpp b/tests/headers/non-type-params.hpp new file mode 100644 index 0000000000..3e2ccf8e57 --- /dev/null +++ b/tests/headers/non-type-params.hpp @@ -0,0 +1,17 @@ +// bindgen-flags: -- -std=c++14 + +template +struct Array { + T elements[Capacity]; +}; + +template +using Array16 = Array; + +using ArrayInt4 = Array; + +struct UsesArray { + Array16 array_char_16; + Array array_bool_8; + ArrayInt4 array_int_4; +}; From 5bda3aa54f7016d408e5b0c418c5cf9fa1f70125 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 9 Mar 2017 14:41:30 -0800 Subject: [PATCH 0399/2291] Add a comment documenting the hacky test of `()` from ToRustTy --- src/codegen/mod.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index fe93783f32..3024a819af 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -562,6 +562,12 @@ impl CodeGenerator for Type { BlobTyBuilder::new(layout).build() } else { let inner_rust_ty = inner_item.to_rust_ty(ctx); + + // We get a unit if the inner type is a template definition + // that is opaque or has non-type template parameters and + // doesn't know its layout. Its possible that we have better + // information about the layout, and in the worst case, just + // make sure we don't return a zero-sized type. if inner_rust_ty == aster::AstBuilder::new().ty().unit() { let layout = self.layout(ctx).unwrap_or_else(|| Layout::for_size(1)); BlobTyBuilder::new(layout).build() From 8b17b65d8cb107e481b5b922c06f5a7c7edee369 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 9 Mar 2017 14:42:16 -0800 Subject: [PATCH 0400/2291] Replace if let / else return with match It reads a little bit better this way, but is exactly equivalent. --- src/codegen/mod.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 3024a819af..28bab1c704 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2379,18 +2379,18 @@ impl ToRustTy for TemplateInstantiation { } } - let decl_params = if let Some(params) = - decl.self_template_params(ctx) { - params - } else { - // This can happen if we generated an opaque type for a - // partial template specialization, in which case we just - // use the opaque type's layout. If we don't have a layout, - // we cross our fingers and hope for the best :-/ - debug_assert!(ctx.resolve_type_through_type_refs(decl) - .is_opaque()); - let layout = self_ty.layout(ctx).unwrap_or(Layout::zero()); - return BlobTyBuilder::new(layout).build(); + let decl_params = match decl.self_template_params(ctx) { + Some(params) => params, + None => { + // This can happen if we generated an opaque type for a + // partial template specialization, in which case we just + // use the opaque type's layout. If we don't have a layout, + // we cross our fingers and hope for the best :-/ + debug_assert!(ctx.resolve_type_through_type_refs(decl) + .is_opaque()); + let layout = self_ty.layout(ctx).unwrap_or(Layout::zero()); + return BlobTyBuilder::new(layout).build(); + } }; // TODO: If the decl type is a template class/struct From 414442638a913bf5d924f9b16b2ae417cde5840b Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 10 Mar 2017 10:46:50 -0800 Subject: [PATCH 0401/2291] Allow anonymous template types We have various assertions that the only way that some template parameter related methods will return `None` is if the template definition is marked opaque. These assertions fail in the presence of test cases with unnamed template types, because we never save an IR item for the template type, and subsequently think that the template definition has no template parameters. The assertions are in fact sound and correct, so it doesn't make sense to remove them. Instead it is more correct to save IR items for the anonymous template types and simply let the template usage analysis prevent them from getting codegen'd. Fixes #574 --- src/ir/comp.rs | 8 ---- src/ir/item.rs | 16 +++++++- src/ir/ty.rs | 14 +++---- .../tests/anonymous-template-types.rs | 33 ++++++++++++++++ .../bad-namespace-parenthood-inheritance.rs | 10 ++--- tests/expectations/tests/issue-358.rs | 5 +-- .../tests/issue-544-stylo-creduce.rs | 5 +-- ...ate-params-causing-layout-test-failures.rs | 2 +- .../issue-574-assertion-failure-in-codegen.rs | 38 +++++++++++++++++++ tests/headers/anonymous-template-types.hpp | 24 ++++++++++++ ...issue-574-assertion-failure-in-codegen.hpp | 6 +++ 11 files changed, 129 insertions(+), 32 deletions(-) create mode 100644 tests/expectations/tests/anonymous-template-types.rs create mode 100644 tests/expectations/tests/issue-574-assertion-failure-in-codegen.rs create mode 100644 tests/headers/anonymous-template-types.hpp create mode 100644 tests/headers/issue-574-assertion-failure-in-codegen.hpp diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 814204c268..9a6548a7ef 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -597,14 +597,6 @@ impl CompInfo { ci.packed = true; } CXCursor_TemplateTypeParameter => { - // Yes! You can arrive here with an empty template parameter - // name! Awesome, isn't it? - // - // see tests/headers/empty_template_param_name.hpp - if cur.spelling().is_empty() { - return CXChildVisit_Continue; - } - let param = Item::named_type(None, cur, ctx) .expect("Item::named_type should't fail when pointing \ at a TemplateTypeParameter"); diff --git a/src/ir/item.rs b/src/ir/item.rs index 93df9c7730..89422e874d 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -19,6 +19,7 @@ use std::collections::BTreeSet; use std::fmt::Write; use std::io; use std::iter; +use regex; /// A trait to get the canonical name from an item. /// @@ -1313,8 +1314,19 @@ impl ClangItemParser for Item { fn is_template_with_spelling(refd: &clang::Cursor, spelling: &str) -> bool { - refd.kind() == clang_sys::CXCursor_TemplateTypeParameter && - refd.spelling() == spelling + lazy_static! { + static ref ANON_TYPE_PARAM_RE: regex::Regex = + regex::Regex::new(r"^type\-parameter\-\d+\-\d+$").unwrap(); + } + + if refd.kind() != clang_sys::CXCursor_TemplateTypeParameter { + return false; + } + + let refd_spelling = refd.spelling(); + refd_spelling == spelling || + // Allow for anonymous template parameters. + (refd_spelling.is_empty() && ANON_TYPE_PARAM_RE.is_match(spelling.as_ref())) } let definition = if is_template_with_spelling(&location, diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 6c8e736355..5492569680 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -292,8 +292,12 @@ impl Type { /// Creates a new named type, with name `name`. pub fn named(name: String) -> Self { - assert!(!name.is_empty()); - Self::new(Some(name), None, TypeKind::Named, false) + let name = if name.is_empty() { + None + } else { + Some(name) + }; + Self::new(name, None, TypeKind::Named, false) } /// Is this a floating point type? @@ -1127,12 +1131,6 @@ impl Type { ctx); } CXCursor_TemplateTypeParameter => { - // See the comment in src/ir/comp.rs - // about the same situation. - if cur.spelling().is_empty() { - return CXChildVisit_Continue; - } - let param = Item::named_type(None, cur, diff --git a/tests/expectations/tests/anonymous-template-types.rs b/tests/expectations/tests/anonymous-template-types.rs new file mode 100644 index 0000000000..bb4be1055a --- /dev/null +++ b/tests/expectations/tests/anonymous-template-types.rs @@ -0,0 +1,33 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Foo { + pub t_member: T, +} +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct Bar { + pub member: ::std::os::raw::c_schar, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Quux { + pub v_member: V, +} +impl Default for Quux { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct Lobo { + pub also_member: ::std::os::raw::c_schar, +} +pub type AliasWithAnonType = ::std::os::raw::c_schar; diff --git a/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs b/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs index 4074dd02eb..9ff4af1f06 100644 --- a/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs +++ b/tests/expectations/tests/bad-namespace-parenthood-inheritance.rs @@ -5,15 +5,15 @@ #[repr(C)] -#[derive(Debug, Default, Copy, Clone)] +#[derive(Debug, Copy, Clone)] pub struct std_char_traits { pub _address: u8, } +impl Default for std_char_traits { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} #[repr(C)] -#[derive(Debug, Default, Copy)] +#[derive(Debug, Default, Copy, Clone)] pub struct __gnu_cxx_char_traits { pub _address: u8, } -impl Clone for __gnu_cxx_char_traits { - fn clone(&self) -> Self { *self } -} diff --git a/tests/expectations/tests/issue-358.rs b/tests/expectations/tests/issue-358.rs index e574bd017e..d01ae8007a 100644 --- a/tests/expectations/tests/issue-358.rs +++ b/tests/expectations/tests/issue-358.rs @@ -13,13 +13,10 @@ impl Default for JS_PersistentRooted { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] -#[derive(Debug, Copy)] +#[derive(Debug, Copy, Clone)] pub struct a { pub b: *mut a, } -impl Clone for a { - fn clone(&self) -> Self { *self } -} impl Default for a { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } diff --git a/tests/expectations/tests/issue-544-stylo-creduce.rs b/tests/expectations/tests/issue-544-stylo-creduce.rs index 88cc0d87d0..fb543cba63 100644 --- a/tests/expectations/tests/issue-544-stylo-creduce.rs +++ b/tests/expectations/tests/issue-544-stylo-creduce.rs @@ -5,10 +5,7 @@ #[repr(C)] -#[derive(Debug, Default, Copy)] +#[derive(Debug, Default, Copy, Clone)] pub struct a { pub _address: u8, } -impl Clone for a { - fn clone(&self) -> Self { *self } -} diff --git a/tests/expectations/tests/issue-569-non-type-template-params-causing-layout-test-failures.rs b/tests/expectations/tests/issue-569-non-type-template-params-causing-layout-test-failures.rs index 6cf2ba16c6..c4ce513902 100644 --- a/tests/expectations/tests/issue-569-non-type-template-params-causing-layout-test-failures.rs +++ b/tests/expectations/tests/issue-569-non-type-template-params-causing-layout-test-failures.rs @@ -32,7 +32,7 @@ impl Default for JS_AutoIdVector { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[test] -fn __bindgen_test_layout_JS_Base_instantiation_16() { +fn __bindgen_test_layout_JS_Base_instantiation_20() { assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( JS_Base ) )); diff --git a/tests/expectations/tests/issue-574-assertion-failure-in-codegen.rs b/tests/expectations/tests/issue-574-assertion-failure-in-codegen.rs new file mode 100644 index 0000000000..084cdb62c9 --- /dev/null +++ b/tests/expectations/tests/issue-574-assertion-failure-in-codegen.rs @@ -0,0 +1,38 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct a { + pub _address: u8, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct _bindgen_ty_1 { + pub ar: a, +} +#[test] +fn bindgen_test_layout__bindgen_ty_1() { + assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 1usize , concat ! ( + "Size of: " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 1usize , concat ! ( + "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const _bindgen_ty_1 ) ) . ar as * const _ as + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::" + , stringify ! ( ar ) )); +} +impl Clone for _bindgen_ty_1 { + fn clone(&self) -> Self { *self } +} +impl Default for _bindgen_ty_1 { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +extern "C" { + #[link_name = "AutoIdVector"] + pub static mut AutoIdVector: _bindgen_ty_1; +} diff --git a/tests/headers/anonymous-template-types.hpp b/tests/headers/anonymous-template-types.hpp new file mode 100644 index 0000000000..9ada71a908 --- /dev/null +++ b/tests/headers/anonymous-template-types.hpp @@ -0,0 +1,24 @@ +// bindgen-flags: -- -std=c++14 + +template +struct Foo { + T t_member; +}; + +template +struct Bar { + char member; +}; + +template +struct Quux { + V v_member; +}; + +template +struct Lobo { + char also_member; +}; + +template +using AliasWithAnonType = char; diff --git a/tests/headers/issue-574-assertion-failure-in-codegen.hpp b/tests/headers/issue-574-assertion-failure-in-codegen.hpp new file mode 100644 index 0000000000..b563b4efca --- /dev/null +++ b/tests/headers/issue-574-assertion-failure-in-codegen.hpp @@ -0,0 +1,6 @@ +// bindgen-flags: -- -std=c++14 + +template class a {}; +class { + a ar; +} AutoIdVector; From b7f7850568c9d8f70af8d382d29c00252648e9cc Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 10 Mar 2017 13:53:26 -0800 Subject: [PATCH 0402/2291] Properly align function arguments Not sure why rustfmt hasn't caught this before... --- src/ir/context.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ir/context.rs b/src/ir/context.rs index 6795a864e7..1dc4f4a4c1 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -1032,10 +1032,10 @@ impl<'ctx> BindgenContext<'ctx> { } return self.instantiate_template(with_id, - id, - parent_id, - ty, - location) + id, + parent_id, + ty, + location) .or_else(|| Some(id)); } From e0936c44dfd1f14a9ab9eb3ef94345773be31443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 12 Mar 2017 20:56:41 +0100 Subject: [PATCH 0403/2291] options: Honor distrust-clang-mangling. --- src/options.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/options.rs b/src/options.rs index 78a0e30bc4..15146b398a 100644 --- a/src/options.rs +++ b/src/options.rs @@ -349,6 +349,10 @@ pub fn builder_from_flags builder = builder.use_core(); } + if matches.is_present("distrust-clang-mangling") { + builder = builder.trust_clang_mangling(false); + } + if matches.is_present("conservative-inline-namespaces") { builder = builder.conservative_inline_namespaces(); } From 22d5a8f058610ec6e331f38106e34732c422b678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 15 Mar 2017 15:55:43 +0100 Subject: [PATCH 0404/2291] ir: Generate non-finite floating point constants properly. --- src/codegen/helpers.rs | 35 +++++++++++++++++----- src/codegen/mod.rs | 10 +++++-- src/ir/var.rs | 6 ++-- tests/expectations/tests/infinite-macro.rs | 8 +++++ tests/expectations/tests/macro_const.rs | 4 +-- tests/headers/infinite-macro.h | 2 ++ 6 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 tests/expectations/tests/infinite-macro.rs create mode 100644 tests/headers/infinite-macro.h diff --git a/src/codegen/helpers.rs b/src/codegen/helpers.rs index 811d87c5ad..608f3f9e0e 100644 --- a/src/codegen/helpers.rs +++ b/src/codegen/helpers.rs @@ -158,17 +158,38 @@ pub mod ast_ty { .build_lit(aster::AstBuilder::new().lit().byte_str(string)) } - pub fn float_expr(f: f64) -> P { + pub fn float_expr(ctx: &BindgenContext, + f: f64) + -> Result, ()> { use aster::symbol::ToSymbol; - let mut string = f.to_string(); - // So it gets properly recognised as a floating point constant. - if !string.contains('.') { - string.push('.'); + if f.is_finite() { + let mut string = f.to_string(); + + // So it gets properly recognised as a floating point constant. + if !string.contains('.') { + string.push('.'); + } + + let kind = ast::LitKind::FloatUnsuffixed(string.as_str().to_symbol()); + return Ok(aster::AstBuilder::new().expr().lit().build_lit(kind)) + } + + let prefix = ctx.trait_prefix(); + if f.is_nan() { + return Ok(quote_expr!(ctx.ext_cx(), ::$prefix::f64::NAN)); + } + + if f.is_infinite() { + return Ok(if f.is_sign_positive() { + quote_expr!(ctx.ext_cx(), ::$prefix::f64::INFINITY) + } else { + quote_expr!(ctx.ext_cx(), ::$prefix::f64::NEG_INFINITY) + }); } - let kind = ast::LitKind::FloatUnsuffixed(string.as_str().to_symbol()); - aster::AstBuilder::new().expr().lit().build_lit(kind) + warn!("Unknown non-finite float number: {:?}", f); + return Err(()); } pub fn arguments_from_signature(signature: &FunctionSig, diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 2e404a5c73..1776914430 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -470,8 +470,12 @@ impl CodeGenerator for Var { } } VarType::Float(f) => { - const_item.build(helpers::ast_ty::float_expr(f)) - .build(ty) + match helpers::ast_ty::float_expr(ctx, f) { + Ok(expr) => { + const_item.build(expr).build(ty) + } + Err(..) => return, + } } VarType::Char(c) => { const_item @@ -2419,7 +2423,7 @@ impl ToRustTy for TemplateInstantiation { .map(|(arg, _)| arg.to_rust_ty(ctx)) .collect::>(); - path.segments.last_mut().unwrap().parameters = if + path.segments.last_mut().unwrap().parameters = if template_args.is_empty() { None } else { diff --git a/src/ir/var.rs b/src/ir/var.rs index 350bfe4ae7..2e56e9f53c 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -146,7 +146,7 @@ impl ClangSubItemParser for Var { let (type_kind, val) = match value { EvalResult::Invalid => return Err(ParseError::Continue), EvalResult::Float(f) => { - (TypeKind::Float(FloatKind::Float), VarType::Float(f)) + (TypeKind::Float(FloatKind::Double), VarType::Float(f)) } EvalResult::Char(c) => { let c = match c { @@ -178,9 +178,7 @@ impl ClangSubItemParser for Var { } else { IntKind::Int } - } else if value > - u32::max_value() as - i64 { + } else if value > u32::max_value() as i64 { IntKind::ULongLong } else { IntKind::UInt diff --git a/tests/expectations/tests/infinite-macro.rs b/tests/expectations/tests/infinite-macro.rs new file mode 100644 index 0000000000..4f74bf903c --- /dev/null +++ b/tests/expectations/tests/infinite-macro.rs @@ -0,0 +1,8 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub const INFINITY: f64 = ::std::f64::INFINITY; +pub const NAN: f64 = ::std::f64::NAN; diff --git a/tests/expectations/tests/macro_const.rs b/tests/expectations/tests/macro_const.rs index 9e7eb420ed..383cedc788 100644 --- a/tests/expectations/tests/macro_const.rs +++ b/tests/expectations/tests/macro_const.rs @@ -7,6 +7,6 @@ pub const foo: &'static [u8; 4usize] = b"bar\x00"; pub const CHAR: u8 = b'b'; pub const CHARR: u8 = b'\x00'; -pub const FLOAT: f32 = 5.09; -pub const FLOAT_EXPR: f32 = 0.005; +pub const FLOAT: f64 = 5.09; +pub const FLOAT_EXPR: f64 = 0.005; pub const INVALID_UTF8: [u8; 5usize] = [240, 40, 140, 40, 0]; diff --git a/tests/headers/infinite-macro.h b/tests/headers/infinite-macro.h new file mode 100644 index 0000000000..ab352c5785 --- /dev/null +++ b/tests/headers/infinite-macro.h @@ -0,0 +1,2 @@ +#define INFINITY (1.0f/0.0f) +#define NAN (0.0f/0.0f) From 92c1a254e84f5ebe233c5731258f14d2dd32fa6b Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 10 Mar 2017 13:59:10 -0800 Subject: [PATCH 0405/2291] Refactor fallibility of conversions from IR to Rust types The old ToRustTy and ItemToRustTy conversion traits were problematic in that they assumed infallibity. That assumption is problematic because we are often dealing with C++ constructs for which Rust has no equivalent *and* we don't have a usable layout from which to generate an opaque blob in its stead. But, a usable layout is often "up the stack" if only we had a way to get up there. For example, Rust does not currently have an equivalent of const value template parameters, and libclang will not give us a layout for template definitions with const value template parameters. However, libclang will give us the layout for an instantiation of such a template definition. First, this commit separates the concepts of generating an equivalent Rust type from generating an opaque blob of the same size and alignment as an IR thing. This consolidates and DRYs up a *ton* of code involved in falling back to an opaque blob (and doing our best to get a Layout for the blob) when we can't generate an equivalent Rust type for some IR thing. Second, it separates fallible and infallible conversions, and provides a nice little framework for when to choose which. This gives us one single place where we do this whole dance: if could not generate equivalent Rust type: if we have a layout: return opaque blob based on layout else: return opaque blob based on a wish and a prayer The ToRustTy trait is replaced by the TryToOpaque, ToOpaque, TryToRustTyOrOpaque, and ToRustTyOrOpaque traits. The ItemToRustTy helper was just a way to avoid ToRustTy's Self::Extra parameter when it was not needed, and is simply removed without a replacement. We suck it up and pass `&()` at call sites now. We *could* introduce ItemTryToOpaque, ItemToOpaque, etc... traits, but the cost of the added boiler plate would outweigh the benefits of not passing `&()` at call sites, IMHO. In addition to being a nice code cleanup, this also fixes #573. --- build.rs | 1 + src/codegen/error.rs | 41 ++ src/codegen/mod.rs | 482 ++++++++++++------ .../tests/issue-573-layout-test-failures.rs | 30 ++ tests/expectations/tests/opaque_typedef.rs | 2 +- .../issue-573-layout-test-failures.hpp | 12 + 6 files changed, 418 insertions(+), 150 deletions(-) create mode 100644 src/codegen/error.rs create mode 100644 tests/expectations/tests/issue-573-layout-test-failures.rs create mode 100644 tests/headers/issue-573-layout-test-failures.hpp diff --git a/build.rs b/build.rs index 4e99c77949..5b8489121b 100644 --- a/build.rs +++ b/build.rs @@ -10,6 +10,7 @@ mod codegen { quasi_codegen::expand(&src, &dst).unwrap(); println!("cargo:rerun-if-changed=src/codegen/mod.rs"); + println!("cargo:rerun-if-changed=src/codegen/error.rs"); println!("cargo:rerun-if-changed=src/codegen/helpers.rs"); println!("cargo:rerun-if-changed=src/codegen/struct_layout.rs"); } diff --git a/src/codegen/error.rs b/src/codegen/error.rs new file mode 100644 index 0000000000..ccb76c5bd7 --- /dev/null +++ b/src/codegen/error.rs @@ -0,0 +1,41 @@ +use std::error; +use std::fmt; + +/// Errors that can occur during code generation. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum Error { + /// Tried to generate an opaque blob for a type that did not have a layout. + NoLayoutForOpaqueBlob, + + /// Tried to instantiate an opaque template definition, or a template + /// definition that is too difficult for us to understand (like a partial + /// template specialization). + InstantiationOfOpaqueType, +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", error::Error::description(self)) + } +} + +impl error::Error for Error { + fn cause(&self) -> Option<&error::Error> { + None + } + + fn description(&self) -> &'static str { + match *self { + Error::NoLayoutForOpaqueBlob => { + "Tried to generate an opaque blob, but had no layout" + } + Error::InstantiationOfOpaqueType => { + "Instantiation of opaque template type or partial template \ + specialization" + } + } + } +} + +/// A `Result` of `T` or an error of `bindgen::codegen::error::Error`. +pub type Result = ::std::result::Result; diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 1776914430..c69116f9c7 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1,3 +1,4 @@ +mod error; mod helpers; mod struct_layout; @@ -433,7 +434,7 @@ impl CodeGenerator for Var { } result.saw_var(&canonical_name); - let ty = self.ty().to_rust_ty(ctx); + let ty = self.ty().to_rust_ty_or_opaque(ctx, &()); if let Some(val) = self.val() { let const_item = aster::AstBuilder::new() @@ -443,8 +444,7 @@ impl CodeGenerator for Var { .expr(); let item = match *val { VarType::Bool(val) => { - const_item.build(helpers::ast_ty::bool_expr(val)) - .build(ty) + const_item.build(helpers::ast_ty::bool_expr(val)).build(ty) } VarType::Int(val) => { const_item.build(helpers::ast_ty::int_expr(val)).build(ty) @@ -569,23 +569,13 @@ impl CodeGenerator for Type { let mut used_template_params = item.used_template_params(ctx); let inner_rust_type = if item.is_opaque(ctx) { used_template_params = None; - // Pray if there's no layout. - let layout = self.layout(ctx).unwrap_or_else(Layout::zero); - BlobTyBuilder::new(layout).build() + self.to_opaque(ctx, item) } else { - let inner_rust_ty = inner_item.to_rust_ty(ctx); - - // We get a unit if the inner type is a template definition - // that is opaque or has non-type template parameters and - // doesn't know its layout. Its possible that we have better - // information about the layout, and in the worst case, just - // make sure we don't return a zero-sized type. - if inner_rust_ty == aster::AstBuilder::new().ty().unit() { - let layout = self.layout(ctx).unwrap_or_else(|| Layout::for_size(1)); - BlobTyBuilder::new(layout).build() - } else { - inner_rust_ty - } + // Its possible that we have better layout information than + // the inner type does, so fall back to an opaque blob based + // on our layout if converting the inner item fails. + inner_item.try_to_rust_ty_or_opaque(ctx, &()) + .unwrap_or_else(|_| self.to_opaque(ctx, item)) }; { @@ -738,9 +728,13 @@ impl<'a> ItemCanonicalName for Vtable<'a> { } } -impl<'a> ItemToRustTy for Vtable<'a> { - fn to_rust_ty(&self, ctx: &BindgenContext) -> P { - aster::ty::TyBuilder::new().id(self.canonical_name(ctx)) +impl<'a> TryToRustTy for Vtable<'a> { + type Extra = (); + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + _: &()) -> error::Result> { + Ok(aster::ty::TyBuilder::new().id(self.canonical_name(ctx))) } } @@ -813,10 +807,11 @@ impl<'a> Bitfield<'a> { } if let Some(name) = field.name() { + let field_item_ty = field_item.to_rust_ty_or_opaque(ctx, &()); bitfields.push((name, field_size_in_bits, width, - field_item.to_rust_ty(ctx).unwrap(), + field_item_ty.unwrap(), field_ty_layout)); } @@ -958,7 +953,7 @@ impl CodeGenerator for TemplateInstantiation { let fn_name = ctx.rust_ident_raw(&fn_name); let prefix = ctx.trait_prefix(); - let ident = item.to_rust_ty(ctx); + let ident = item.to_rust_ty_or_opaque(ctx, &()); let size_of_expr = quote_expr!(ctx.ext_cx(), ::$prefix::mem::size_of::<$ident>()); let align_of_expr = quote_expr!(ctx.ext_cx(), @@ -1095,7 +1090,9 @@ impl CodeGenerator for CompInfo { Vtable::new(item.id(), self.methods(), self.base_members()); vtable.codegen(ctx, result, whitelisted_items, item); - let vtable_type = vtable.to_rust_ty(ctx).to_ptr(true, ctx.span()); + let vtable_type = vtable.try_to_rust_ty(ctx, &()) + .expect("vtable to Rust type conversion is infallible") + .to_ptr(true, ctx.span()); let vtable_field = StructFieldBuilder::named("vtable_") .pub_() @@ -1123,7 +1120,7 @@ impl CodeGenerator for CompInfo { continue; } - let inner = base.ty.to_rust_ty(ctx); + let inner = base.ty.to_rust_ty_or_opaque(ctx, &()); let field_name = if i == 0 { "_base".into() } else { @@ -1204,7 +1201,7 @@ impl CodeGenerator for CompInfo { continue; } - let ty = field.ty().to_rust_ty(ctx); + let ty = field.ty().to_rust_ty_or_opaque(ctx, &()); // NB: In unstable rust we use proper `union` types. let ty = if is_union && !ctx.options().unstable_rust { @@ -1217,7 +1214,7 @@ impl CodeGenerator for CompInfo { field_ty.is_incomplete_array(ctx) { result.saw_incomplete_array(); - let inner = item.to_rust_ty(ctx); + let inner = item.to_rust_ty_or_opaque(ctx, &()); if ctx.options().enable_cxx_namespaces { quote_ty!(ctx.ext_cx(), root::__IncompleteArrayField<$inner>) @@ -2069,7 +2066,7 @@ impl CodeGenerator for Enum { } let repr = self.repr() - .map(|repr| repr.to_rust_ty(ctx)) + .and_then(|repr| repr.try_to_rust_ty_or_opaque(ctx, &()).ok()) .unwrap_or_else(|| helpers::ast_ty::raw_type(ctx, repr_name)); let mut builder = EnumBuilder::new(builder, @@ -2080,7 +2077,7 @@ impl CodeGenerator for Enum { // A map where we keep a value -> variant relation. let mut seen_values = HashMap::<_, String>::new(); - let enum_rust_ty = item.to_rust_ty(ctx); + let enum_rust_ty = item.to_rust_ty_or_opaque(ctx, &()); let is_toplevel = item.is_toplevel(ctx); // Used to mangle the constants we generate in the unnamed-enum case. @@ -2191,107 +2188,294 @@ impl CodeGenerator for Enum { } } -trait ToRustTy { +/// Fallible conversion to an opaque blob. +/// +/// Implementors of this trait should provide the `try_get_layout` method to +/// fallibly get this thing's layout, which the provided `try_to_opaque` trait +/// method will use to convert the `Layout` into an opaque blob Rust type. +trait TryToOpaque { type Extra; - fn to_rust_ty(&self, + /// Get the layout for this thing, if one is available. + fn try_get_layout(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> error::Result; + + /// Do not override this provided trait method. + fn try_to_opaque(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> error::Result> { + self.try_get_layout(ctx, extra) + .map(|layout| BlobTyBuilder::new(layout).build()) + } +} + +/// Infallible conversion of an IR thing to an opaque blob. +/// +/// The resulting layout is best effort, and is unfortunately not guaranteed to +/// be correct. When all else fails, we fall back to a single byte layout as a +/// last resort, because C++ does not permit zero-sized types. See the note in +/// the `ToRustTyOrOpaque` doc comment about fallible versus infallible traits +/// and when each is appropriate. +/// +/// Don't implement this directly. Instead implement `TryToOpaque`, and then +/// leverage the blanket impl for this trait. +trait ToOpaque: TryToOpaque { + fn get_layout(&self, ctx: &BindgenContext, extra: &Self::Extra) - -> P; + -> Layout { + self.try_get_layout(ctx, extra) + .unwrap_or_else(|_| Layout::for_size(1)) + } + + fn to_opaque(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> P { + let layout = self.get_layout(ctx, extra); + BlobTyBuilder::new(layout).build() + } +} + +impl ToOpaque for T + where T: TryToOpaque +{} + +/// Fallible conversion from an IR thing to an *equivalent* Rust type. +/// +/// If the C/C++ construct represented by the IR thing cannot (currently) be +/// represented in Rust (for example, instantiations of templates with +/// const-value generic parameters) then the impl should return an `Err`. It +/// should *not* attempt to return an opaque blob with the correct size and +/// alignment. That is the responsibility of the `TryToOpaque` trait. +trait TryToRustTy { + type Extra; + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> error::Result>; +} + +/// Fallible conversion to a Rust type or an opaque blob with the correct size +/// and alignment. +/// +/// Don't implement this directly. Instead implement `TryToRustTy` and +/// `TryToOpaque`, and then leverage the blanket impl for this trait below. +trait TryToRustTyOrOpaque: TryToRustTy + TryToOpaque { + type Extra; + + fn try_to_rust_ty_or_opaque(&self, + ctx: &BindgenContext, + extra: &::Extra) + -> error::Result>; +} + +impl TryToRustTyOrOpaque for T + where T: TryToRustTy + TryToOpaque +{ + type Extra = E; + + fn try_to_rust_ty_or_opaque(&self, + ctx: &BindgenContext, + extra: &E) + -> error::Result> { + self.try_to_rust_ty(ctx, extra) + .or_else(|_| { + if let Ok(layout) = self.try_get_layout(ctx, extra) { + Ok(BlobTyBuilder::new(layout).build()) + } else { + Err(error::Error::NoLayoutForOpaqueBlob) + } + }) + } +} + +/// Infallible conversion to a Rust type, or an opaque blob with a best effort +/// of correct size and alignment. +/// +/// Don't implement this directly. Instead implement `TryToRustTy` and +/// `TryToOpaque`, and then leverage the blanket impl for this trait below. +/// +/// ### Fallible vs. Infallible Conversions to Rust Types +/// +/// When should one use this infallible `ToRustTyOrOpaque` trait versus the +/// fallible `TryTo{RustTy, Opaque, RustTyOrOpaque}` triats? All fallible trait +/// implementations that need to convert another thing into a Rust type or +/// opaque blob in a nested manner should also use fallible trait methods and +/// propagate failure up the stack. Only infallible functions and methods like +/// CodeGenerator implementations should use the infallible +/// `ToRustTyOrOpaque`. The further out we push error recovery, the more likely +/// we are to get a usable `Layout` even if we can't generate an equivalent Rust +/// type for a C++ construct. +trait ToRustTyOrOpaque: TryToRustTy + ToOpaque { + type Extra; + + fn to_rust_ty_or_opaque(&self, + ctx: &BindgenContext, + extra: &::Extra) + -> P; +} + +impl ToRustTyOrOpaque for T + where T: TryToRustTy + ToOpaque +{ + type Extra = E; + + fn to_rust_ty_or_opaque(&self, + ctx: &BindgenContext, + extra: &E) + -> P { + self.try_to_rust_ty(ctx, extra) + .unwrap_or_else(|_| self.to_opaque(ctx, extra)) + } } -trait ItemToRustTy { - fn to_rust_ty(&self, ctx: &BindgenContext) -> P; +impl TryToOpaque for ItemId { + type Extra = (); + + fn try_get_layout(&self, + ctx: &BindgenContext, + _: &()) + -> error::Result { + ctx.resolve_item(*self).try_get_layout(ctx, &()) + } } -// Convenience implementation. -impl ItemToRustTy for ItemId { - fn to_rust_ty(&self, ctx: &BindgenContext) -> P { - ctx.resolve_item(*self).to_rust_ty(ctx) +impl TryToRustTy for ItemId { + type Extra = (); + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + _: &()) + -> error::Result> { + ctx.resolve_item(*self).try_to_rust_ty(ctx, &()) } } -impl ItemToRustTy for Item { - fn to_rust_ty(&self, ctx: &BindgenContext) -> P { - self.kind().expect_type().to_rust_ty(ctx, self) +impl TryToOpaque for Item { + type Extra = (); + + fn try_get_layout(&self, + ctx: &BindgenContext, + _: &()) + -> error::Result { + self.kind().expect_type().try_get_layout(ctx, self) } } -impl ToRustTy for Type { +impl TryToRustTy for Item { + type Extra = (); + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + _: &()) + -> error::Result> { + self.kind().expect_type().try_to_rust_ty(ctx, self) + } +} + +impl TryToOpaque for Type { + type Extra = Item; + + fn try_get_layout(&self, + ctx: &BindgenContext, + _: &Item) + -> error::Result { + self.layout(ctx).ok_or(error::Error::NoLayoutForOpaqueBlob) + } +} + +impl TryToRustTy for Type { type Extra = Item; - fn to_rust_ty(&self, ctx: &BindgenContext, item: &Item) -> P { + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + item: &Item) + -> error::Result> { use self::helpers::ast_ty::*; match *self.kind() { - TypeKind::Void => raw_type(ctx, "c_void"), + TypeKind::Void => Ok(raw_type(ctx, "c_void")), // TODO: we should do something smart with nullptr, or maybe *const // c_void is enough? TypeKind::NullPtr => { - raw_type(ctx, "c_void").to_ptr(true, ctx.span()) + Ok(raw_type(ctx, "c_void").to_ptr(true, ctx.span())) } TypeKind::Int(ik) => { match ik { - IntKind::Bool => aster::ty::TyBuilder::new().bool(), - IntKind::Char => raw_type(ctx, "c_schar"), - IntKind::UChar => raw_type(ctx, "c_uchar"), - IntKind::Short => raw_type(ctx, "c_short"), - IntKind::UShort => raw_type(ctx, "c_ushort"), - IntKind::Int => raw_type(ctx, "c_int"), - IntKind::UInt => raw_type(ctx, "c_uint"), - IntKind::Long => raw_type(ctx, "c_long"), - IntKind::ULong => raw_type(ctx, "c_ulong"), - IntKind::LongLong => raw_type(ctx, "c_longlong"), - IntKind::ULongLong => raw_type(ctx, "c_ulonglong"), - - IntKind::I8 => aster::ty::TyBuilder::new().i8(), - IntKind::U8 => aster::ty::TyBuilder::new().u8(), - IntKind::I16 => aster::ty::TyBuilder::new().i16(), - IntKind::U16 => aster::ty::TyBuilder::new().u16(), - IntKind::I32 => aster::ty::TyBuilder::new().i32(), - IntKind::U32 => aster::ty::TyBuilder::new().u32(), - IntKind::I64 => aster::ty::TyBuilder::new().i64(), - IntKind::U64 => aster::ty::TyBuilder::new().u64(), + IntKind::Bool => Ok(aster::ty::TyBuilder::new().bool()), + IntKind::Char => Ok(raw_type(ctx, "c_schar")), + IntKind::UChar => Ok(raw_type(ctx, "c_uchar")), + IntKind::Short => Ok(raw_type(ctx, "c_short")), + IntKind::UShort => Ok(raw_type(ctx, "c_ushort")), + IntKind::Int => Ok(raw_type(ctx, "c_int")), + IntKind::UInt => Ok(raw_type(ctx, "c_uint")), + IntKind::Long => Ok(raw_type(ctx, "c_long")), + IntKind::ULong => Ok(raw_type(ctx, "c_ulong")), + IntKind::LongLong => Ok(raw_type(ctx, "c_longlong")), + IntKind::ULongLong => Ok(raw_type(ctx, "c_ulonglong")), + + IntKind::I8 => Ok(aster::ty::TyBuilder::new().i8()), + IntKind::U8 => Ok(aster::ty::TyBuilder::new().u8()), + IntKind::I16 => Ok(aster::ty::TyBuilder::new().i16()), + IntKind::U16 => Ok(aster::ty::TyBuilder::new().u16()), + IntKind::I32 => Ok(aster::ty::TyBuilder::new().i32()), + IntKind::U32 => Ok(aster::ty::TyBuilder::new().u32()), + IntKind::I64 => Ok(aster::ty::TyBuilder::new().i64()), + IntKind::U64 => Ok(aster::ty::TyBuilder::new().u64()), IntKind::Custom { name, .. } => { let ident = ctx.rust_ident_raw(name); - quote_ty!(ctx.ext_cx(), $ident) + Ok(quote_ty!(ctx.ext_cx(), $ident)) } // FIXME: This doesn't generate the proper alignment, but we // can't do better right now. We should be able to use // i128/u128 when they're available. IntKind::U128 | IntKind::I128 => { - aster::ty::TyBuilder::new().array(2).u64() + Ok(aster::ty::TyBuilder::new().array(2).u64()) } } } - TypeKind::Float(fk) => float_kind_rust_type(ctx, fk), + TypeKind::Float(fk) => Ok(float_kind_rust_type(ctx, fk)), TypeKind::Complex(fk) => { let float_path = float_kind_rust_type(ctx, fk); ctx.generated_bindegen_complex(); - if ctx.options().enable_cxx_namespaces { + Ok(if ctx.options().enable_cxx_namespaces { quote_ty!(ctx.ext_cx(), root::__BindgenComplex<$float_path>) } else { quote_ty!(ctx.ext_cx(), __BindgenComplex<$float_path>) - } + }) } TypeKind::Function(ref fs) => { - let ty = fs.to_rust_ty(ctx, item); + // We can't rely on the sizeof(Option>) == + // sizeof(NonZero<_>) optimization with opaque blobs (because + // they aren't NonZero), so don't *ever* use an or_opaque + // variant here. + let ty = fs.try_to_rust_ty(ctx, &())?; + let prefix = ctx.trait_prefix(); - quote_ty!(ctx.ext_cx(), ::$prefix::option::Option<$ty>) + Ok(quote_ty!(ctx.ext_cx(), ::$prefix::option::Option<$ty>)) } TypeKind::Array(item, len) => { - let ty = item.to_rust_ty(ctx); - aster::ty::TyBuilder::new().array(len).build(ty) + let ty = item.try_to_rust_ty(ctx, &())?; + Ok(aster::ty::TyBuilder::new().array(len).build(ty)) } TypeKind::Enum(..) => { let path = item.namespace_aware_canonical_path(ctx); - aster::AstBuilder::new().ty().path().ids(path).build() + Ok(aster::AstBuilder::new() + .ty() + .path() + .ids(path) + .build()) } TypeKind::TemplateInstantiation(ref inst) => { - inst.to_rust_ty(ctx, self) + inst.try_to_rust_ty(ctx, self) } - TypeKind::ResolvedTypeRef(inner) => inner.to_rust_ty(ctx), + TypeKind::ResolvedTypeRef(inner) => inner.try_to_rust_ty(ctx, &()), TypeKind::TemplateAlias(inner, _) | TypeKind::Alias(inner) => { let template_params = item.used_template_params(ctx) @@ -2302,13 +2486,11 @@ impl ToRustTy for Type { let spelling = self.name().expect("Unnamed alias?"); if item.is_opaque(ctx) && !template_params.is_empty() { - // Pray if there's no available layout. - let layout = self.layout(ctx).unwrap_or_else(Layout::zero); - BlobTyBuilder::new(layout).build() + self.try_to_opaque(ctx, item) } else if let Some(ty) = utils::type_from_named(ctx, spelling, inner) { - ty + Ok(ty) } else { utils::build_templated_path(item, ctx, template_params) } @@ -2317,55 +2499,51 @@ impl ToRustTy for Type { let template_params = item.used_template_params(ctx); if info.has_non_type_template_params() || (item.is_opaque(ctx) && template_params.is_some()) { - return match self.layout(ctx) { - Some(layout) => BlobTyBuilder::new(layout).build(), - None => { - warn!("Couldn't compute layout for a type with non \ - type template params or opaque, expect \ - dragons!"); - aster::AstBuilder::new().ty().unit() - } - }; + return self.try_to_opaque(ctx, item); } + let template_params = template_params.unwrap_or(vec![]); utils::build_templated_path(item, ctx, - template_params.unwrap_or(vec![])) + template_params) } TypeKind::Opaque => { - BlobTyBuilder::new(self.layout(ctx).unwrap_or(Layout::zero())) - .build() + self.try_to_opaque(ctx, item) } TypeKind::BlockPointer => { let void = raw_type(ctx, "c_void"); - void.to_ptr(/* is_const = */ - false, - ctx.span()) + Ok(void.to_ptr(/* is_const = */ + false, + ctx.span())) } TypeKind::Pointer(inner) | TypeKind::Reference(inner) => { let inner = ctx.resolve_item(inner); let inner_ty = inner.expect_type(); - let ty = inner.to_rust_ty(ctx); + + // Regardless if we can properly represent the inner type, we + // should always generate a proper pointer here, so use + // infallible conversion of the inner type. + let ty = inner.to_rust_ty_or_opaque(ctx, &()); // Avoid the first function pointer level, since it's already // represented in Rust. if inner_ty.canonical_type(ctx).is_function() { - ty + Ok(ty) } else { let is_const = self.is_const() || inner.expect_type().is_const(); - ty.to_ptr(is_const, ctx.span()) + Ok(ty.to_ptr(is_const, ctx.span())) } } TypeKind::Named => { let name = item.canonical_name(ctx); let ident = ctx.rust_ident(&name); - quote_ty!(ctx.ext_cx(), $ident) + Ok(quote_ty!(ctx.ext_cx(), $ident)) } - TypeKind::ObjCSel => quote_ty!(ctx.ext_cx(), objc::runtime::Sel), + TypeKind::ObjCSel => Ok(quote_ty!(ctx.ext_cx(), objc::runtime::Sel)), TypeKind::ObjCId | - TypeKind::ObjCInterface(..) => quote_ty!(ctx.ext_cx(), id), + TypeKind::ObjCInterface(..) => Ok(quote_ty!(ctx.ext_cx(), id)), ref u @ TypeKind::UnresolvedTypeRef(..) => { unreachable!("Should have been resolved after parsing {:?}!", u) } @@ -2373,35 +2551,36 @@ impl ToRustTy for Type { } } -impl ToRustTy for TemplateInstantiation { +impl TryToOpaque for TemplateInstantiation { + type Extra = Type; + + fn try_get_layout(&self, + ctx: &BindgenContext, + self_ty: &Type) + -> error::Result { + self_ty.layout(ctx).ok_or(error::Error::NoLayoutForOpaqueBlob) + } +} + +impl TryToRustTy for TemplateInstantiation { type Extra = Type; - fn to_rust_ty(&self, ctx: &BindgenContext, self_ty: &Type) -> P { + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + _: &Type) + -> error::Result> { let decl = self.template_definition(); - let mut ty = decl.to_rust_ty(ctx).unwrap(); - - if ty == aster::AstBuilder::new().ty().unit().unwrap() { - // If we gave up when making a type for the template definition, - // check if maybe we can make a better opaque blob for the - // instantiation. If not, at least don't use a zero-sized type. - if let Some(layout) = self_ty.layout(ctx) { - return BlobTyBuilder::new(layout).build(); - } else { - return quote_ty!(ctx.ext_cx(), u8); - } - } + let mut ty = decl.try_to_rust_ty(ctx, &())?.unwrap(); let decl_params = match decl.self_template_params(ctx) { Some(params) => params, None => { - // This can happen if we generated an opaque type for a - // partial template specialization, in which case we just - // use the opaque type's layout. If we don't have a layout, - // we cross our fingers and hope for the best :-/ + // This can happen if we generated an opaque type for a partial + // template specialization, and we've hit an instantiation of + // that partial specialization. debug_assert!(ctx.resolve_type_through_type_refs(decl) - .is_opaque()); - let layout = self_ty.layout(ctx).unwrap_or(Layout::zero()); - return BlobTyBuilder::new(layout).build(); + .is_opaque()); + return Err(error::Error::InstantiationOfOpaqueType); } }; @@ -2420,8 +2599,8 @@ impl ToRustTy for TemplateInstantiation { // Only pass type arguments for the type parameters that // the decl uses. .filter(|&(_, param)| ctx.uses_template_parameter(decl, *param)) - .map(|(arg, _)| arg.to_rust_ty(ctx)) - .collect::>(); + .map(|(arg, _)| arg.try_to_rust_ty(ctx, &())) + .collect::>>()?; path.segments.last_mut().unwrap().parameters = if template_args.is_empty() { @@ -2437,14 +2616,17 @@ impl ToRustTy for TemplateInstantiation { } } - P(ty) + Ok(P(ty)) } } -impl ToRustTy for FunctionSig { - type Extra = Item; +impl TryToRustTy for FunctionSig { + type Extra = (); - fn to_rust_ty(&self, ctx: &BindgenContext, _item: &Item) -> P { + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + _: &()) + -> error::Result> { // TODO: we might want to consider ignoring the reference return value. let ret = utils::fnsig_return_ty(ctx, &self); let arguments = utils::fnsig_arguments(ctx, &self); @@ -2462,11 +2644,11 @@ impl ToRustTy for FunctionSig { decl: decl, })); - P(ast::Ty { + Ok(P(ast::Ty { id: ast::DUMMY_NODE_ID, node: fnty, span: ctx.span(), - }) + })) } } @@ -2712,7 +2894,7 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { } mod utils { - use super::ItemToRustTy; + use super::{error, TryToRustTy, ToRustTyOrOpaque}; use aster; use ir::context::{BindgenContext, ItemId}; use ir::function::FunctionSig; @@ -2925,20 +3107,20 @@ mod utils { pub fn build_templated_path(item: &Item, ctx: &BindgenContext, template_params: Vec) - -> P { + -> error::Result> { let path = item.namespace_aware_canonical_path(ctx); let builder = aster::AstBuilder::new().ty().path(); let template_params = template_params.iter() - .map(|param| param.to_rust_ty(ctx)) - .collect::>(); + .map(|param| param.try_to_rust_ty(ctx, &())) + .collect::>>()?; // XXX: I suck at aster. if path.len() == 1 { - return builder.segment(&path[0]) - .with_tys(template_params) - .build() - .build(); + return Ok(builder.segment(&path[0]) + .with_tys(template_params) + .build() + .build()); } let mut builder = builder.id(&path[0]); @@ -2954,7 +3136,7 @@ mod utils { } } - builder.build() + Ok(builder.build()) } fn primitive_ty(ctx: &BindgenContext, name: &str) -> P { @@ -2980,7 +3162,9 @@ mod utils { "uintptr_t" | "size_t" => primitive_ty(ctx, "usize"), - "intptr_t" | "ptrdiff_t" | "ssize_t" => primitive_ty(ctx, "isize"), + "intptr_t" | "ptrdiff_t" | "ssize_t" => { + primitive_ty(ctx, "isize") + } _ => return None, }) } @@ -2988,15 +3172,14 @@ mod utils { pub fn rust_fndecl_from_signature(ctx: &BindgenContext, sig: &Item) -> P { - use codegen::ToRustTy; - let signature = sig.kind().expect_type().canonical_type(ctx); let signature = match *signature.kind() { TypeKind::Function(ref sig) => sig, _ => panic!("How?"), }; - let decl_ty = signature.to_rust_ty(ctx, sig); + let decl_ty = signature.try_to_rust_ty(ctx, &()) + .expect("function signature to Rust type conversion is infallible"); match decl_ty.unwrap().node { ast::TyKind::BareFn(bare_fn) => bare_fn.unwrap().decl, _ => panic!("How did this happen exactly?"), @@ -3010,7 +3193,7 @@ mod utils { if let TypeKind::Void = *return_item.kind().expect_type().kind() { ast::FunctionRetTy::Default(ctx.span()) } else { - ast::FunctionRetTy::Ty(return_item.to_rust_ty(ctx)) + ast::FunctionRetTy::Ty(return_item.to_rust_ty_or_opaque(ctx, &())) } } @@ -3033,7 +3216,8 @@ mod utils { // [1]: http://c0x.coding-guidelines.com/6.7.5.3.html let arg_ty = match *arg_ty.canonical_type(ctx).kind() { TypeKind::Array(t, _) => { - t.to_rust_ty(ctx).to_ptr(ctx.resolve_type(t).is_const(), ctx.span()) + t.to_rust_ty_or_opaque(ctx, &()) + .to_ptr(ctx.resolve_type(t).is_const(), ctx.span()) }, TypeKind::Pointer(inner) => { let inner = ctx.resolve_item(inner); @@ -3041,11 +3225,11 @@ mod utils { if let TypeKind::ObjCInterface(_) = *inner_ty.canonical_type(ctx).kind() { quote_ty!(ctx.ext_cx(), id) } else { - arg_item.to_rust_ty(ctx) + arg_item.to_rust_ty_or_opaque(ctx, &()) } }, _ => { - arg_item.to_rust_ty(ctx) + arg_item.to_rust_ty_or_opaque(ctx, &()) } }; diff --git a/tests/expectations/tests/issue-573-layout-test-failures.rs b/tests/expectations/tests/issue-573-layout-test-failures.rs new file mode 100644 index 0000000000..dc582c1b67 --- /dev/null +++ b/tests/expectations/tests/issue-573-layout-test-failures.rs @@ -0,0 +1,30 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Default)] +pub struct Outer { + pub i: u8, +} +#[repr(C)] +pub struct AutoIdVector { + pub ar: Outer, +} +#[test] +fn bindgen_test_layout_AutoIdVector() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( AutoIdVector ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( AutoIdVector ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const AutoIdVector ) ) . ar as * const _ as + usize } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( AutoIdVector ) , "::" , + stringify ! ( ar ) )); +} +impl Default for AutoIdVector { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} diff --git a/tests/expectations/tests/opaque_typedef.rs b/tests/expectations/tests/opaque_typedef.rs index 51951faf14..34b40ff6a7 100644 --- a/tests/expectations/tests/opaque_typedef.rs +++ b/tests/expectations/tests/opaque_typedef.rs @@ -10,5 +10,5 @@ pub struct RandomTemplate { pub _address: u8, } /**
    */ -pub type ShouldBeOpaque = [u8; 0usize]; +pub type ShouldBeOpaque = u8; pub type ShouldNotBeOpaque = RandomTemplate; diff --git a/tests/headers/issue-573-layout-test-failures.hpp b/tests/headers/issue-573-layout-test-failures.hpp new file mode 100644 index 0000000000..ac8cbd4834 --- /dev/null +++ b/tests/headers/issue-573-layout-test-failures.hpp @@ -0,0 +1,12 @@ +template +struct UnusedIntTemplateParam {}; + +template +class Outer { + static const long SIZE = 1; + UnusedIntTemplateParam i; +}; + +class AutoIdVector { + Outer ar; +}; From e446f3b10f886362cfa31f5ba17b91cc638aa60a Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 15 Mar 2017 15:11:48 -0700 Subject: [PATCH 0406/2291] Add a script to test bindings generation and layout for one header at a time --- CONTRIBUTING.md | 11 +++++++++++ tests/test-one.sh | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100755 tests/test-one.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df32998b15..0aad4f2cee 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -94,6 +94,17 @@ Run `cargo test` to compare generated Rust bindings to the expectations. $ cargo test [--all-features] ``` +### Running a Single Test + +To generate bindings for a single test header, compile the bindings, and run the +layout assertion tests for those bindings, use the `tests/test-one.sh` +script. It supports fuzzy searching for test headers. For example, to test +`tests/headers/what_is_going_on.hpp`, execute this command: + +``` +$ ./tests/test-one.sh going +``` + ### Authoring New Tests To add a new test header to the suite, simply put it in the `tests/headers` diff --git a/tests/test-one.sh b/tests/test-one.sh new file mode 100755 index 0000000000..6475df7f8b --- /dev/null +++ b/tests/test-one.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +# Usage: +# +# ./tests/test-one.sh +# +# Generate bindings for the first match of `./tests/headers/**`, use +# `rustc` to compile the bindings with unit tests enabled, and run the generated +# layout tests. + +set -eux + +cd $(dirname $0) +cd .. + +export RUST_BACKTRACE=1 + +# Grab the first match +TEST=$(find ./tests/headers -type f -iname "*$1*" | head -n 1) + +BINDINGS=$(mktemp -t bindings_XXXXXX.rs) +TEST_BINDINGS_BINARY=$(mktemp -t bindings.XXXXX) + +./target/debug/bindgen \ + "$TEST" \ + --emit-ir \ + --emit-ir-graphviz ir.dot \ + --emit-clang-ast \ + -o "$BINDINGS" \ + -- -std=c++14 + +dot -Tpng ir.dot -o ir.png + +rustc --test -o "$TEST_BINDINGS_BINARY" "$BINDINGS" + +"$TEST_BINDINGS_BINARY" From 7a46377dbfedbd688ed8d4f27efab544d50b9a76 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 15 Mar 2017 15:29:22 -0700 Subject: [PATCH 0407/2291] Add edge labels to our graphviz output This adds the `EdgeKind` as a label to edges in the graphviz IR dump output. This is useful for understanding why something is referenced by another thing. --- src/ir/dot.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ir/dot.rs b/src/ir/dot.rs index e7e1f47bd8..7472dd8e0f 100644 --- a/src/ir/dot.rs +++ b/src/ir/dot.rs @@ -36,15 +36,16 @@ pub fn write_dot_file
    ::alignment > mozilla::AlignmentFinder::alignment) ? + mozilla::AlignmentFinder
    ::alignment : mozilla::AlignmentFinder::alignment> mAlign; + }; +}; +# 2454 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +template +class AutoTArray : public nsTArray +{ +}; + +template +struct nsTArray_CopyChooser> +{ + typedef nsTArray_CopyWithConstructors> Type; +}; + + +namespace mozilla { + +template +Span +MakeSpan(nsTArray_Impl& aTArray) +{ + return aTArray; +} + +template +Span +MakeSpan(const nsTArray_Impl& aTArray) +{ + return aTArray; +} + +} +# 2497 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +static_assert(sizeof(AutoTArray) == + sizeof(void*) + sizeof(nsTArrayHeader) + sizeof(uint32_t) * 2, + "AutoTArray shouldn't contain any extra padding, " + "see the comment"); + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h" +template +nsTArray_base::nsTArray_base() + : mHdr(EmptyHdr()) +{ + ; +} + +template +nsTArray_base::~nsTArray_base() +{ + if (mHdr != EmptyHdr() && !UsesAutoArrayBuffer()) { + Alloc::Free(mHdr); + } + ; +} + +template +const nsTArrayHeader* +nsTArray_base::GetAutoArrayBufferUnsafe(size_t aElemAlign) const +{ + + + + const void* autoBuf = + &reinterpret_cast, 1>*>(this)->mAutoBuf; + + + + + static_assert(sizeof(void*) != 4 || + (mozilla::AlignmentFinder >::alignment == 8 && + sizeof(AutoTArray, 1>) == + sizeof(void*) + sizeof(nsTArrayHeader) + + 4 + sizeof(mozilla::AlignedElem<8>)), + "auto array padding wasn't what we expected"); + + + do { } while (0); + + if (sizeof(void*) == 4 && aElemAlign == 8) { + autoBuf = reinterpret_cast(autoBuf) + 4; + } + + return reinterpret_cast(autoBuf); +} + +template +bool +nsTArray_base::UsesAutoArrayBuffer() const +{ + if (!mHdr->mIsAutoArray) { + return false; + } +# 94 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h" + static_assert(sizeof(nsTArrayHeader) > 4, + "see comment above"); +# 104 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h" + return mHdr == GetAutoArrayBuffer(4) || mHdr == GetAutoArrayBuffer(8); +} + + +bool IsTwiceTheRequiredBytesRepresentableAsUint32(size_t aCapacity, + size_t aElemSize); + +template +template +typename ActualAlloc::ResultTypeProxy +nsTArray_base::EnsureCapacity(size_type aCapacity, + size_type aElemSize) +{ + + if (aCapacity <= mHdr->mCapacity) { + return ActualAlloc::SuccessResult(); + } + + + + + + + if (!IsTwiceTheRequiredBytesRepresentableAsUint32(aCapacity, aElemSize)) { + ActualAlloc::SizeTooBig((size_t)aCapacity * aElemSize); + return ActualAlloc::FailureResult(); + } + + size_t reqSize = sizeof(Header) + aCapacity * aElemSize; + + if (mHdr == EmptyHdr()) { + + Header* header = static_cast(ActualAlloc::Malloc(reqSize)); + if (!header) { + return ActualAlloc::FailureResult(); + } + header->mLength = 0; + header->mCapacity = aCapacity; + header->mIsAutoArray = 0; + mHdr = header; + + return ActualAlloc::SuccessResult(); + } + + + + + + const size_t slowGrowthThreshold = 8 * 1024 * 1024; + + size_t bytesToAlloc; + if (reqSize >= slowGrowthThreshold) { + size_t currSize = sizeof(Header) + Capacity() * aElemSize; + size_t minNewSize = currSize + (currSize >> 3); + bytesToAlloc = reqSize > minNewSize ? reqSize : minNewSize; + + + const size_t MiB = 1 << 20; + bytesToAlloc = MiB * ((bytesToAlloc + MiB - 1) / MiB); + } else { + + bytesToAlloc = mozilla::RoundUpPow2(reqSize); + } + + Header* header; + if (UsesAutoArrayBuffer() || !Copy::allowRealloc) { + + header = static_cast(ActualAlloc::Malloc(bytesToAlloc)); + if (!header) { + return ActualAlloc::FailureResult(); + } + + Copy::MoveNonOverlappingRegionWithHeader(header, mHdr, Length(), aElemSize); + + if (!UsesAutoArrayBuffer()) { + ActualAlloc::Free(mHdr); + } + } else { + + header = static_cast(ActualAlloc::Realloc(mHdr, bytesToAlloc)); + if (!header) { + return ActualAlloc::FailureResult(); + } + } + + + size_t newCapacity = (bytesToAlloc - sizeof(Header)) / aElemSize; + do { } while (0); + header->mCapacity = newCapacity; + + mHdr = header; + + return ActualAlloc::SuccessResult(); +} + + + +template +void +nsTArray_base::ShrinkCapacity(size_type aElemSize, + size_t aElemAlign) +{ + if (mHdr == EmptyHdr() || UsesAutoArrayBuffer()) { + return; + } + + if (mHdr->mLength >= mHdr->mCapacity) { + return; + } + + size_type length = Length(); + + if (IsAutoArray() && GetAutoArrayBuffer(aElemAlign)->mCapacity >= length) { + Header* header = GetAutoArrayBuffer(aElemAlign); + + + header->mLength = length; + Copy::MoveNonOverlappingRegion(header + 1, mHdr + 1, length, aElemSize); + + nsTArrayFallibleAllocator::Free(mHdr); + mHdr = header; + return; + } + + if (length == 0) { + do { } while (0); + nsTArrayFallibleAllocator::Free(mHdr); + mHdr = EmptyHdr(); + return; + } + + size_type size = sizeof(Header) + length * aElemSize; + void* ptr = nsTArrayFallibleAllocator::Realloc(mHdr, size); + if (!ptr) { + return; + } + mHdr = static_cast(ptr); + mHdr->mCapacity = length; +} + +template +template +void +nsTArray_base::ShiftData(index_type aStart, + size_type aOldLen, size_type aNewLen, + size_type aElemSize, size_t aElemAlign) +{ + if (aOldLen == aNewLen) { + return; + } + + + size_type num = mHdr->mLength - (aStart + aOldLen); + + + mHdr->mLength += aNewLen - aOldLen; + if (mHdr->mLength == 0) { + ShrinkCapacity(aElemSize, aElemAlign); + } else { + + if (num == 0) { + return; + } + + aStart *= aElemSize; + aNewLen *= aElemSize; + aOldLen *= aElemSize; + char* baseAddr = reinterpret_cast(mHdr + 1) + aStart; + Copy::MoveOverlappingRegion(baseAddr + aNewLen, baseAddr + aOldLen, num, aElemSize); + } +} + +template +template +bool +nsTArray_base::InsertSlotsAt(index_type aIndex, size_type aCount, + size_type aElemSize, + size_t aElemAlign) +{ + if ((__builtin_expect(!!(aIndex > Length()), 0))) { + InvalidArrayIndex_CRASH(aIndex, Length()); + } + + size_type newLen = Length() + aCount; + + EnsureCapacity(newLen, aElemSize); + + + if (Capacity() < newLen) { + return false; + } + + + + ShiftData(aIndex, 0, aCount, aElemSize, aElemAlign); + + return true; +} +# 311 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h" +template +nsTArray_base::IsAutoArrayRestorer::IsAutoArrayRestorer( + nsTArray_base& aArray, + size_t aElemAlign) + : mArray(aArray) + , mElemAlign(aElemAlign) + , mIsAuto(aArray.IsAutoArray()) +{ +} + +template +nsTArray_base::IsAutoArrayRestorer::~IsAutoArrayRestorer() +{ + + if (mIsAuto && mArray.mHdr == mArray.EmptyHdr()) { + + + mArray.mHdr = mArray.GetAutoArrayBufferUnsafe(mElemAlign); + mArray.mHdr->mLength = 0; + } else if (mArray.mHdr != mArray.EmptyHdr()) { + mArray.mHdr->mIsAutoArray = mIsAuto; + } +} + +template +template +typename ActualAlloc::ResultTypeProxy +nsTArray_base::SwapArrayElements(nsTArray_base& aOther, + size_type aElemSize, + size_t aElemAlign) +{ + + + + + + + IsAutoArrayRestorer ourAutoRestorer(*this, aElemAlign); + typename nsTArray_base::IsAutoArrayRestorer + otherAutoRestorer(aOther, aElemAlign); + + + + + if ((!UsesAutoArrayBuffer() || Capacity() < aOther.Length()) && + (!aOther.UsesAutoArrayBuffer() || aOther.Capacity() < Length())) { + + if (!EnsureNotUsingAutoArrayBuffer(aElemSize) || + !aOther.template EnsureNotUsingAutoArrayBuffer(aElemSize)) { + return ActualAlloc::FailureResult(); + } + + Header* temp = mHdr; + mHdr = aOther.mHdr; + aOther.mHdr = temp; + + return ActualAlloc::SuccessResult(); + } +# 382 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h" + if (!ActualAlloc::Successful(EnsureCapacity(aOther.Length(), aElemSize)) || + !Allocator::Successful(aOther.template EnsureCapacity(Length(), aElemSize))) { + return ActualAlloc::FailureResult(); + } + + + + do { } while (0); + + + size_type smallerLength = XPCOM_MIN(Length(), aOther.Length()); + size_type largerLength = XPCOM_MAX(Length(), aOther.Length()); + void* smallerElements; + void* largerElements; + if (Length() <= aOther.Length()) { + smallerElements = Hdr() + 1; + largerElements = aOther.Hdr() + 1; + } else { + smallerElements = aOther.Hdr() + 1; + largerElements = Hdr() + 1; + } + + + + + + + AutoTArray, 64> temp; + if (!ActualAlloc::Successful(temp.template EnsureCapacity(smallerLength, + aElemSize))) { + return ActualAlloc::FailureResult(); + } + + Copy::MoveNonOverlappingRegion(temp.Elements(), smallerElements, smallerLength, aElemSize); + Copy::MoveNonOverlappingRegion(smallerElements, largerElements, largerLength, aElemSize); + Copy::MoveNonOverlappingRegion(largerElements, temp.Elements(), smallerLength, aElemSize); + + + do { } while (0); + + + size_type tempLength = Length(); + + + + if (mHdr != EmptyHdr()) { + mHdr->mLength = aOther.Length(); + } + if (aOther.mHdr != EmptyHdr()) { + aOther.mHdr->mLength = tempLength; + } + + return ActualAlloc::SuccessResult(); +} + +template +template +bool +nsTArray_base::EnsureNotUsingAutoArrayBuffer(size_type aElemSize) +{ + if (UsesAutoArrayBuffer()) { + + + + + + if (Length() == 0) { + mHdr = EmptyHdr(); + return true; + } + + size_type size = sizeof(Header) + Length() * aElemSize; + + Header* header = static_cast(ActualAlloc::Malloc(size)); + if (!header) { + return false; + } + + Copy::MoveNonOverlappingRegionWithHeader(header, mHdr, Length(), aElemSize); + header->mCapacity = Length(); + mHdr = header; + } + + return true; +} +# 2504 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleAutoArray.h" 2 + + + + + + +template +class nsStyleAutoArray +{ +public: + + enum WithSingleInitialElement { WITH_SINGLE_INITIAL_ELEMENT }; + explicit nsStyleAutoArray(WithSingleInitialElement) {} + nsStyleAutoArray(const nsStyleAutoArray& aOther) { *this = aOther; } + nsStyleAutoArray& operator=(const nsStyleAutoArray& aOther) { + mFirstElement = aOther.mFirstElement; + mOtherElements = aOther.mOtherElements; + return *this; + } + + bool operator==(const nsStyleAutoArray& aOther) const { + return Length() == aOther.Length() && + mFirstElement == aOther.mFirstElement && + mOtherElements == aOther.mOtherElements; + } + bool operator!=(const nsStyleAutoArray& aOther) const { + return !(*this == aOther); + } + + nsStyleAutoArray& operator=(nsStyleAutoArray&& aOther) { + mFirstElement = aOther.mFirstElement; + mOtherElements.SwapElements(aOther.mOtherElements); + + return *this; + } + + size_t Length() const { + return mOtherElements.Length() + 1; + } + const T& operator[](size_t aIndex) const { + return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1]; + } + T& operator[](size_t aIndex) { + return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1]; + } + + void EnsureLengthAtLeast(size_t aMinLen) { + if (aMinLen > 0) { + mOtherElements.EnsureLengthAtLeast(aMinLen - 1); + } + } + + void SetLengthNonZero(size_t aNewLen) { + do { } while (0); + mOtherElements.SetLength(aNewLen - 1); + } + + void TruncateLengthNonZero(size_t aNewLen) { + do { } while (0); + do { } while (0); + mOtherElements.TruncateLength(aNewLen - 1); + } + +private: + T mFirstElement; + nsTArray mOtherElements; +}; +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 2 + + +struct RawServoStyleSet; + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoArcTypeList.h" 1 + + + + + + + + +struct ServoCssRules; +struct RawServoStyleSheet; +struct ServoComputedValues; +struct RawServoDeclarationBlock; +struct RawServoStyleRule; +struct RawServoImportRule; +struct RawServoAnimationValue; +struct RawServoAnimationValueMap; +struct RawServoMediaList; +struct RawServoMediaRule; +struct RawServoNamespaceRule; +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 2 + + +namespace mozilla { + class ServoElementSnapshot; + struct StyleAnimation; +namespace css { +struct URLExtraData; +} +namespace dom { +class Element; +class StyleChildrenIterator; +} +struct AnimationPropertySegment; +struct ComputedTiming; +struct Keyframe; +struct PropertyStyleAnimationValuePair; +using ComputedKeyframeValues = nsTArray; +} + +class nsCSSValue; +struct nsFontFaceRuleContainer; +class nsIDocument; +class nsINode; +class nsPresContext; +struct nsTimingFunction; + +using mozilla::dom::StyleChildrenIterator; +using mozilla::ServoElementSnapshot; + +typedef nsINode RawGeckoNode; +typedef mozilla::dom::Element RawGeckoElement; +typedef nsIDocument RawGeckoDocument; +typedef nsPresContext RawGeckoPresContext; +typedef mozilla::css::URLExtraData RawGeckoURLExtraData; +typedef nsTArray RawGeckoKeyframeList; +typedef nsTArray RawGeckoComputedKeyframeValuesList; +typedef nsTArray RawGeckoAnimationValueList; +typedef nsStyleAutoArray RawGeckoStyleAnimationList; +typedef nsTArray RawGeckoFontFaceRuleList; +typedef mozilla::AnimationPropertySegment RawGeckoAnimationPropertySegment; +typedef mozilla::ComputedTiming RawGeckoComputedTiming; +# 91 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoArcTypeList.h" 1 + + + + + + + + +typedef ServoCssRules const* ServoCssRulesBorrowedOrNull; typedef ServoCssRules const* ServoCssRulesBorrowed; typedef ServoCssRules* ServoCssRulesBorrowedMut; struct ServoCssRulesStrong { ServoCssRules* mPtr; already_AddRefed Consume(); }; +typedef RawServoStyleSheet const* RawServoStyleSheetBorrowedOrNull; typedef RawServoStyleSheet const* RawServoStyleSheetBorrowed; typedef RawServoStyleSheet* RawServoStyleSheetBorrowedMut; struct RawServoStyleSheetStrong { RawServoStyleSheet* mPtr; already_AddRefed Consume(); }; +typedef ServoComputedValues const* ServoComputedValuesBorrowedOrNull; typedef ServoComputedValues const* ServoComputedValuesBorrowed; typedef ServoComputedValues* ServoComputedValuesBorrowedMut; struct ServoComputedValuesStrong { ServoComputedValues* mPtr; already_AddRefed Consume(); }; +typedef RawServoDeclarationBlock const* RawServoDeclarationBlockBorrowedOrNull; typedef RawServoDeclarationBlock const* RawServoDeclarationBlockBorrowed; typedef RawServoDeclarationBlock* RawServoDeclarationBlockBorrowedMut; struct RawServoDeclarationBlockStrong { RawServoDeclarationBlock* mPtr; already_AddRefed Consume(); }; +typedef RawServoStyleRule const* RawServoStyleRuleBorrowedOrNull; typedef RawServoStyleRule const* RawServoStyleRuleBorrowed; typedef RawServoStyleRule* RawServoStyleRuleBorrowedMut; struct RawServoStyleRuleStrong { RawServoStyleRule* mPtr; already_AddRefed Consume(); }; +typedef RawServoImportRule const* RawServoImportRuleBorrowedOrNull; typedef RawServoImportRule const* RawServoImportRuleBorrowed; typedef RawServoImportRule* RawServoImportRuleBorrowedMut; struct RawServoImportRuleStrong { RawServoImportRule* mPtr; already_AddRefed Consume(); }; +typedef RawServoAnimationValue const* RawServoAnimationValueBorrowedOrNull; typedef RawServoAnimationValue const* RawServoAnimationValueBorrowed; typedef RawServoAnimationValue* RawServoAnimationValueBorrowedMut; struct RawServoAnimationValueStrong { RawServoAnimationValue* mPtr; already_AddRefed Consume(); }; +typedef RawServoAnimationValueMap const* RawServoAnimationValueMapBorrowedOrNull; typedef RawServoAnimationValueMap const* RawServoAnimationValueMapBorrowed; typedef RawServoAnimationValueMap* RawServoAnimationValueMapBorrowedMut; struct RawServoAnimationValueMapStrong { RawServoAnimationValueMap* mPtr; already_AddRefed Consume(); }; +typedef RawServoMediaList const* RawServoMediaListBorrowedOrNull; typedef RawServoMediaList const* RawServoMediaListBorrowed; typedef RawServoMediaList* RawServoMediaListBorrowedMut; struct RawServoMediaListStrong { RawServoMediaList* mPtr; already_AddRefed Consume(); }; +typedef RawServoMediaRule const* RawServoMediaRuleBorrowedOrNull; typedef RawServoMediaRule const* RawServoMediaRuleBorrowed; typedef RawServoMediaRule* RawServoMediaRuleBorrowedMut; struct RawServoMediaRuleStrong { RawServoMediaRule* mPtr; already_AddRefed Consume(); }; +typedef RawServoNamespaceRule const* RawServoNamespaceRuleBorrowedOrNull; typedef RawServoNamespaceRule const* RawServoNamespaceRuleBorrowed; typedef RawServoNamespaceRule* RawServoNamespaceRuleBorrowedMut; struct RawServoNamespaceRuleStrong { RawServoNamespaceRule* mPtr; already_AddRefed Consume(); }; +# 92 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 2 +# 106 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" +typedef RawServoDeclarationBlockStrong const* RawServoDeclarationBlockStrongBorrowedOrNull; + +typedef RawServoStyleSet* RawServoStyleSetOwned; typedef RawServoStyleSet const* RawServoStyleSetBorrowed; typedef RawServoStyleSet* RawServoStyleSetBorrowedMut; +typedef StyleChildrenIterator* StyleChildrenIteratorOwnedOrNull; typedef StyleChildrenIterator const* StyleChildrenIteratorBorrowedOrNull; typedef StyleChildrenIterator* StyleChildrenIteratorBorrowedMutOrNull; +typedef StyleChildrenIterator* StyleChildrenIteratorOwned; typedef StyleChildrenIterator const* StyleChildrenIteratorBorrowed; typedef StyleChildrenIterator* StyleChildrenIteratorBorrowedMut; +typedef ServoElementSnapshot* ServoElementSnapshotOwned; typedef ServoElementSnapshot const* ServoElementSnapshotBorrowed; typedef ServoElementSnapshot* ServoElementSnapshotBorrowedMut; + + + + + + +typedef RawGeckoNode const* RawGeckoNodeBorrowed; +typedef RawGeckoNode const* RawGeckoNodeBorrowedOrNull; +typedef RawGeckoElement const* RawGeckoElementBorrowed; +typedef RawGeckoElement const* RawGeckoElementBorrowedOrNull; +typedef RawGeckoDocument const* RawGeckoDocumentBorrowed; +typedef RawGeckoDocument const* RawGeckoDocumentBorrowedOrNull; +typedef StyleChildrenIterator* StyleChildrenIteratorBorrowedMut; +typedef ServoElementSnapshot* ServoElementSnapshotBorrowedMut; +typedef nsCSSValue const* nsCSSValueBorrowed; +typedef nsCSSValue* nsCSSValueBorrowedMut; +typedef RawGeckoPresContext* RawGeckoPresContextOwned; typedef RawGeckoPresContext const* RawGeckoPresContextBorrowed; typedef RawGeckoPresContext* RawGeckoPresContextBorrowedMut; +typedef RawGeckoPresContext const* RawGeckoPresContextBorrowed; +typedef RawGeckoAnimationValueList* RawGeckoAnimationValueListBorrowedMut; +typedef RawGeckoKeyframeList* RawGeckoKeyframeListBorrowedMut; +typedef RawGeckoKeyframeList const* RawGeckoKeyframeListBorrowed; +typedef RawGeckoComputedKeyframeValuesList* RawGeckoComputedKeyframeValuesListBorrowedMut; +typedef RawGeckoStyleAnimationList const* RawGeckoStyleAnimationListBorrowed; +typedef nsTimingFunction* nsTimingFunctionBorrowedMut; +typedef nsTimingFunction const* nsTimingFunctionBorrowed; +typedef RawGeckoFontFaceRuleList* RawGeckoFontFaceRuleListBorrowedMut; +typedef RawGeckoAnimationPropertySegment const* RawGeckoAnimationPropertySegmentBorrowed; +typedef RawGeckoComputedTiming const* RawGeckoComputedTimingBorrowed; +# 164 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoArcTypeList.h" 1 + + + + + + + + +extern "C" { void Servo_CssRules_AddRef( ServoCssRulesBorrowed ptr); void Servo_CssRules_Release( ServoCssRulesBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(ServoCssRules* aPtr) { Servo_CssRules_AddRef(aPtr); } static void Release(ServoCssRules* aPtr) { Servo_CssRules_Release(aPtr); } }; } +extern "C" { void Servo_StyleSheet_AddRef( RawServoStyleSheetBorrowed ptr); void Servo_StyleSheet_Release( RawServoStyleSheetBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(RawServoStyleSheet* aPtr) { Servo_StyleSheet_AddRef(aPtr); } static void Release(RawServoStyleSheet* aPtr) { Servo_StyleSheet_Release(aPtr); } }; } +extern "C" { void Servo_ComputedValues_AddRef( ServoComputedValuesBorrowed ptr); void Servo_ComputedValues_Release( ServoComputedValuesBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(ServoComputedValues* aPtr) { Servo_ComputedValues_AddRef(aPtr); } static void Release(ServoComputedValues* aPtr) { Servo_ComputedValues_Release(aPtr); } }; } +extern "C" { void Servo_DeclarationBlock_AddRef( RawServoDeclarationBlockBorrowed ptr); void Servo_DeclarationBlock_Release( RawServoDeclarationBlockBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(RawServoDeclarationBlock* aPtr) { Servo_DeclarationBlock_AddRef(aPtr); } static void Release(RawServoDeclarationBlock* aPtr) { Servo_DeclarationBlock_Release(aPtr); } }; } +extern "C" { void Servo_StyleRule_AddRef( RawServoStyleRuleBorrowed ptr); void Servo_StyleRule_Release( RawServoStyleRuleBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(RawServoStyleRule* aPtr) { Servo_StyleRule_AddRef(aPtr); } static void Release(RawServoStyleRule* aPtr) { Servo_StyleRule_Release(aPtr); } }; } +extern "C" { void Servo_ImportRule_AddRef( RawServoImportRuleBorrowed ptr); void Servo_ImportRule_Release( RawServoImportRuleBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(RawServoImportRule* aPtr) { Servo_ImportRule_AddRef(aPtr); } static void Release(RawServoImportRule* aPtr) { Servo_ImportRule_Release(aPtr); } }; } +extern "C" { void Servo_AnimationValue_AddRef( RawServoAnimationValueBorrowed ptr); void Servo_AnimationValue_Release( RawServoAnimationValueBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(RawServoAnimationValue* aPtr) { Servo_AnimationValue_AddRef(aPtr); } static void Release(RawServoAnimationValue* aPtr) { Servo_AnimationValue_Release(aPtr); } }; } +extern "C" { void Servo_AnimationValueMap_AddRef( RawServoAnimationValueMapBorrowed ptr); void Servo_AnimationValueMap_Release( RawServoAnimationValueMapBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(RawServoAnimationValueMap* aPtr) { Servo_AnimationValueMap_AddRef(aPtr); } static void Release(RawServoAnimationValueMap* aPtr) { Servo_AnimationValueMap_Release(aPtr); } }; } +extern "C" { void Servo_MediaList_AddRef( RawServoMediaListBorrowed ptr); void Servo_MediaList_Release( RawServoMediaListBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(RawServoMediaList* aPtr) { Servo_MediaList_AddRef(aPtr); } static void Release(RawServoMediaList* aPtr) { Servo_MediaList_Release(aPtr); } }; } +extern "C" { void Servo_MediaRule_AddRef( RawServoMediaRuleBorrowed ptr); void Servo_MediaRule_Release( RawServoMediaRuleBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(RawServoMediaRule* aPtr) { Servo_MediaRule_AddRef(aPtr); } static void Release(RawServoMediaRule* aPtr) { Servo_MediaRule_Release(aPtr); } }; } +extern "C" { void Servo_NamespaceRule_AddRef( RawServoNamespaceRuleBorrowed ptr); void Servo_NamespaceRule_Release( RawServoNamespaceRuleBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits { static void AddRef(RawServoNamespaceRule* aPtr) { Servo_NamespaceRule_AddRef(aPtr); } static void Release(RawServoNamespaceRule* aPtr) { Servo_NamespaceRule_Release(aPtr); } }; } +# 165 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 2 +# 181 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" +extern "C" void Servo_StyleSet_Drop( RawServoStyleSetOwned ptr); namespace mozilla { template<> class DefaultDelete { public: void operator()(RawServoStyleSet* aPtr) const { Servo_StyleSet_Drop(aPtr); } }; }; +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoElementSnapshot.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoElementSnapshot.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h" +namespace mozilla { +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h" +class EventStates +{ +public: + typedef uint64_t InternalType; + typedef uint64_t ServoType; + + constexpr EventStates() + : mStates(0) + { + } + + + + + + + explicit constexpr EventStates(InternalType aStates) + : mStates(aStates) + { + } + + EventStates constexpr operator|(const EventStates& aEventStates) const + { + return EventStates(mStates | aEventStates.mStates); + } + + EventStates& operator|=(const EventStates& aEventStates) + { + mStates |= aEventStates.mStates; + return *this; + } + + + + + EventStates constexpr operator&(const EventStates& aEventStates) const + { + return EventStates(mStates & aEventStates.mStates); + } + + EventStates& operator&=(const EventStates& aEventStates) + { + mStates &= aEventStates.mStates; + return *this; + } + + bool operator==(const EventStates& aEventStates) const + { + return mStates == aEventStates.mStates; + } + + bool operator!=(const EventStates& aEventStates) const + { + return mStates != aEventStates.mStates; + } + + EventStates operator~() const + { + return EventStates(~mStates); + } + + EventStates operator^(const EventStates& aEventStates) const + { + return EventStates(mStates ^ aEventStates.mStates); + } + + EventStates& operator^=(const EventStates& aEventStates) + { + mStates ^= aEventStates.mStates; + return *this; + } + + + + + + + + bool IsEmpty() const + { + return mStates == 0; + } +# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h" + bool HasState(EventStates aEventStates) const + { +# 124 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h" + return mStates & aEventStates.mStates; + } +# 135 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h" + bool HasAtLeastOneOfStates(EventStates aEventStates) const + { + return mStates & aEventStates.mStates; + } +# 148 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h" + bool HasAllStates(EventStates aEventStates) const + { + return (mStates & aEventStates.mStates) == aEventStates.mStates; + } + + + + InternalType GetInternalValue() const { + return mStates; + } + + + + + ServoType ServoValue() const + { + return mStates; + } + +private: + InternalType mStates; +}; + +} +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoElementSnapshot.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BorrowedAttrInfo.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BorrowedAttrInfo.h" +class nsAttrName; +class nsAttrValue; + +namespace mozilla { +namespace dom { +# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BorrowedAttrInfo.h" +struct BorrowedAttrInfo +{ + BorrowedAttrInfo() + : mName(nullptr) + , mValue(nullptr) + { + } + + BorrowedAttrInfo(const nsAttrName* aName, const nsAttrValue* aValue); + + BorrowedAttrInfo(const BorrowedAttrInfo& aOther); + + const nsAttrName* mName; + const nsAttrValue* mValue; + + explicit operator bool() const { return mName != nullptr; } +}; + +} +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoElementSnapshot.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrName.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrName.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" 1 +# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 1 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAnnotations.h" 1 +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" 1 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" +namespace mozilla { +# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" +struct FloatTypeTraits +{ + typedef uint32_t Bits; + + static const unsigned kExponentBias = 127; + static const unsigned kExponentShift = 23; + + static const Bits kSignBit = 0x80000000UL; + static const Bits kExponentBits = 0x7F800000UL; + static const Bits kSignificandBits = 0x007FFFFFUL; +}; + +struct DoubleTypeTraits +{ + typedef uint64_t Bits; + + static const unsigned kExponentBias = 1023; + static const unsigned kExponentShift = 52; + + static const Bits kSignBit = 0x8000000000000000ULL; + static const Bits kExponentBits = 0x7ff0000000000000ULL; + static const Bits kSignificandBits = 0x000fffffffffffffULL; +}; + +template struct SelectTrait; +template<> struct SelectTrait : public FloatTypeTraits {}; +template<> struct SelectTrait : public DoubleTypeTraits {}; +# 91 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" +template +struct FloatingPoint : public SelectTrait +{ + typedef SelectTrait Base; + typedef typename Base::Bits Bits; + + static_assert((Base::kSignBit & Base::kExponentBits) == 0, + "sign bit shouldn't overlap exponent bits"); + static_assert((Base::kSignBit & Base::kSignificandBits) == 0, + "sign bit shouldn't overlap significand bits"); + static_assert((Base::kExponentBits & Base::kSignificandBits) == 0, + "exponent bits shouldn't overlap significand bits"); + + static_assert((Base::kSignBit | Base::kExponentBits | Base::kSignificandBits) == + ~Bits(0), + "all bits accounted for"); +# 115 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" + static_assert(sizeof(T) == sizeof(Bits), "Bits must be same size as T"); +}; + + +template +static __attribute__((always_inline)) inline bool +IsNaN(T aValue) +{ + + + + + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + return (BitwiseCast(aValue) & Traits::kExponentBits) == Traits::kExponentBits && + (BitwiseCast(aValue) & Traits::kSignificandBits) != 0; +} + + +template +static __attribute__((always_inline)) inline bool +IsInfinite(T aValue) +{ + + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return (bits & ~Traits::kSignBit) == Traits::kExponentBits; +} + + +template +static __attribute__((always_inline)) inline bool +IsFinite(T aValue) +{ + + + + + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return (bits & Traits::kExponentBits) != Traits::kExponentBits; +} + + + + + +template +static __attribute__((always_inline)) inline bool +IsNegative(T aValue) +{ + do { } while (0); + + + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return (bits & Traits::kSignBit) != 0; +} + + +template +static __attribute__((always_inline)) inline bool +IsNegativeZero(T aValue) +{ + + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return bits == Traits::kSignBit; +} + + +template +static __attribute__((always_inline)) inline bool +IsPositiveZero(T aValue) +{ + + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return bits == 0; +} + + + + + +template +static __attribute__((always_inline)) inline T +ToZeroIfNonfinite(T aValue) +{ + return IsFinite(aValue) ? aValue : 0; +} + + + + + + + +template +static __attribute__((always_inline)) inline int_fast16_t +ExponentComponent(T aValue) +{ + + + + + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return int_fast16_t((bits & Traits::kExponentBits) >> Traits::kExponentShift) - + int_fast16_t(Traits::kExponentBias); +} + + +template +static __attribute__((always_inline)) inline T +PositiveInfinity() +{ + + + + + typedef FloatingPoint Traits; + return BitwiseCast(Traits::kExponentBits); +} + + +template +static __attribute__((always_inline)) inline T +NegativeInfinity() +{ + + + + + typedef FloatingPoint Traits; + return BitwiseCast(Traits::kSignBit | Traits::kExponentBits); +} + + + + + +template::Bits Significand> +struct SpecificNaNBits +{ + using Traits = FloatingPoint; + + static_assert(SignBit == 0 || SignBit == 1, "bad sign bit"); + static_assert((Significand & ~Traits::kSignificandBits) == 0, + "significand must only have significand bits set"); + static_assert(Significand & Traits::kSignificandBits, + "significand must be nonzero"); + + static constexpr typename Traits::Bits value = + (SignBit * Traits::kSignBit) | Traits::kExponentBits | Significand; +}; +# 296 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" +template +static __attribute__((always_inline)) inline void +SpecificNaN(int signbit, typename FloatingPoint::Bits significand, T* result) +{ + typedef FloatingPoint Traits; + do { } while (0); + do { } while (0); + do { } while (0); + + BitwiseCast((signbit ? Traits::kSignBit : 0) | + Traits::kExponentBits | + significand, + result); + do { } while (0); +} + +template +static __attribute__((always_inline)) inline T +SpecificNaN(int signbit, typename FloatingPoint::Bits significand) +{ + T t; + SpecificNaN(signbit, significand, &t); + return t; +} + + +template +static __attribute__((always_inline)) inline T +MinNumberValue() +{ + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + return BitwiseCast(Bits(1)); +} +# 338 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" +template +static __attribute__((always_inline)) inline bool +NumberEqualsInt32(T aValue, int32_t* aInt32) +{ + + + + + + + return aValue == (*aInt32 = int32_t(aValue)); +} +# 358 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" +template +static __attribute__((always_inline)) inline bool +NumberIsInt32(T aValue, int32_t* aInt32) +{ + return !IsNegativeZero(aValue) && NumberEqualsInt32(aValue, aInt32); +} + + + + + +template +static __attribute__((always_inline)) inline T +UnspecifiedNaN() +{ + + + + + + + typedef FloatingPoint Traits; + return SpecificNaN(1, Traits::kSignificandBits); +} + + + + + + +template +static inline bool +NumbersAreIdentical(T aValue1, T aValue2) +{ + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + if (IsNaN(aValue1)) { + return IsNaN(aValue2); + } + return BitwiseCast(aValue1) == BitwiseCast(aValue2); +} + +namespace detail { + +template +struct FuzzyEqualsEpsilon; + +template<> +struct FuzzyEqualsEpsilon +{ + + static float value() { return 1.0f / (1 << 17); } +}; + +template<> +struct FuzzyEqualsEpsilon +{ + + static double value() { return 1.0 / (1LL << 40); } +}; + +} +# 433 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" +template +static __attribute__((always_inline)) inline bool +FuzzyEqualsAdditive(T aValue1, T aValue2, + T aEpsilon = detail::FuzzyEqualsEpsilon::value()) +{ + static_assert(IsFloatingPoint::value, "floating point type required"); + return Abs(aValue1 - aValue2) <= aEpsilon; +} +# 454 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" +template +static __attribute__((always_inline)) inline bool +FuzzyEqualsMultiplicative(T aValue1, T aValue2, + T aEpsilon = detail::FuzzyEqualsEpsilon::value()) +{ + static_assert(IsFloatingPoint::value, "floating point type required"); + + T smaller = Abs(aValue1) < Abs(aValue2) ? Abs(aValue1) : Abs(aValue2); + return Abs(aValue1 - aValue2) <= aEpsilon * smaller; +} +# 473 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" +__attribute__ ((warn_unused_result)) +extern __attribute__((weak)) __attribute__((visibility("default"))) bool +IsFloat32Representable(double aFloat32); + +} +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" 2 + + + +namespace IPC { +template struct ParamTraits; +} + + + + + + + +namespace mozilla { + + +typedef uint64_t TimeStampValue; + + +class TimeStamp; + + + + +class BaseTimeDurationPlatformUtils +{ +public: + static __attribute__((weak)) __attribute__((visibility("default"))) double ToSeconds(int64_t aTicks); + static __attribute__((weak)) __attribute__((visibility("default"))) double ToSecondsSigDigits(int64_t aTicks); + static __attribute__((weak)) __attribute__((visibility("default"))) int64_t TicksFromMilliseconds(double aMilliseconds); + static __attribute__((weak)) __attribute__((visibility("default"))) int64_t ResolutionInTicks(); +}; +# 62 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" +template +class BaseTimeDuration +{ +public: + + constexpr BaseTimeDuration() : mValue(0) {} + + + struct _SomethingVeryRandomHere; + BaseTimeDuration(_SomethingVeryRandomHere* aZero) : mValue(0) + { + do { } while (0); + } + + + + template + explicit BaseTimeDuration(const BaseTimeDuration& aOther) + : mValue(aOther.mValue) + { } + + template + BaseTimeDuration& operator=(const BaseTimeDuration& aOther) + { + mValue = aOther.mValue; + return *this; + } + + double ToSeconds() const + { + if (mValue == (9223372036854775807L)) { + return PositiveInfinity(); + } + if (mValue == (-9223372036854775807L -1)) { + return NegativeInfinity(); + } + return BaseTimeDurationPlatformUtils::ToSeconds(mValue); + } + + + + double ToSecondsSigDigits() const + { + if (mValue == (9223372036854775807L)) { + return PositiveInfinity(); + } + if (mValue == (-9223372036854775807L -1)) { + return NegativeInfinity(); + } + return BaseTimeDurationPlatformUtils::ToSecondsSigDigits(mValue); + } + double ToMilliseconds() const { return ToSeconds() * 1000.0; } + double ToMicroseconds() const { return ToMilliseconds() * 1000.0; } + + + + + + + static inline BaseTimeDuration FromSeconds(double aSeconds) + { + return FromMilliseconds(aSeconds * 1000.0); + } + static BaseTimeDuration FromMilliseconds(double aMilliseconds) + { + if (aMilliseconds == PositiveInfinity()) { + return Forever(); + } + if (aMilliseconds == NegativeInfinity()) { + return FromTicks((-9223372036854775807L -1)); + } + return FromTicks( + BaseTimeDurationPlatformUtils::TicksFromMilliseconds(aMilliseconds)); + } + static inline BaseTimeDuration FromMicroseconds(double aMicroseconds) + { + return FromMilliseconds(aMicroseconds / 1000.0); + } + + static BaseTimeDuration Forever() + { + return FromTicks((9223372036854775807L)); + } + + BaseTimeDuration operator+(const BaseTimeDuration& aOther) const + { + return FromTicks(ValueCalculator::Add(mValue, aOther.mValue)); + } + BaseTimeDuration operator-(const BaseTimeDuration& aOther) const + { + return FromTicks(ValueCalculator::Subtract(mValue, aOther.mValue)); + } + BaseTimeDuration& operator+=(const BaseTimeDuration& aOther) + { + mValue = ValueCalculator::Add(mValue, aOther.mValue); + return *this; + } + BaseTimeDuration& operator-=(const BaseTimeDuration& aOther) + { + mValue = ValueCalculator::Subtract(mValue, aOther.mValue); + return *this; + } + BaseTimeDuration operator-() const + { + + + int64_t ticks; + if (mValue == (9223372036854775807L)) { + ticks = (-9223372036854775807L -1); + } else if (mValue == (-9223372036854775807L -1)) { + ticks = (9223372036854775807L); + } else { + ticks = -mValue; + } + + return FromTicks(ticks); + } + + static BaseTimeDuration Max(const BaseTimeDuration& aA, + const BaseTimeDuration& aB) + { + return FromTicks(std::max(aA.mValue, aB.mValue)); + } + static BaseTimeDuration Min(const BaseTimeDuration& aA, + const BaseTimeDuration& aB) + { + return FromTicks(std::min(aA.mValue, aB.mValue)); + } + +private: + + + BaseTimeDuration operator*(const double aMultiplier) const = delete; + + + + + BaseTimeDuration operator/(const double aDivisor) const = delete; + +public: + BaseTimeDuration MultDouble(double aMultiplier) const + { + return FromTicks(ValueCalculator::Multiply(mValue, aMultiplier)); + } + BaseTimeDuration operator*(const int32_t aMultiplier) const + { + return FromTicks(ValueCalculator::Multiply(mValue, aMultiplier)); + } + BaseTimeDuration operator*(const uint32_t aMultiplier) const + { + return FromTicks(ValueCalculator::Multiply(mValue, aMultiplier)); + } + BaseTimeDuration operator*(const int64_t aMultiplier) const + { + return FromTicks(ValueCalculator::Multiply(mValue, aMultiplier)); + } + BaseTimeDuration operator*(const uint64_t aMultiplier) const + { + if (aMultiplier > (9223372036854775807L)) { + return Forever(); + } + return FromTicks(ValueCalculator::Multiply(mValue, aMultiplier)); + } + BaseTimeDuration operator/(const int64_t aDivisor) const + { + do { } while (0); + return FromTicks(ValueCalculator::Divide(mValue, aDivisor)); + } + double operator/(const BaseTimeDuration& aOther) const + { + + + do { } while (0); + + return ValueCalculator::DivideDouble(mValue, aOther.mValue); + } + BaseTimeDuration operator%(const BaseTimeDuration& aOther) const + { + do { } while (0); + return FromTicks(ValueCalculator::Modulo(mValue, aOther.mValue)); + } + + template + bool operator<(const BaseTimeDuration& aOther) const + { + return mValue < aOther.mValue; + } + template + bool operator<=(const BaseTimeDuration& aOther) const + { + return mValue <= aOther.mValue; + } + template + bool operator>=(const BaseTimeDuration& aOther) const + { + return mValue >= aOther.mValue; + } + template + bool operator>(const BaseTimeDuration& aOther) const + { + return mValue > aOther.mValue; + } + template + bool operator==(const BaseTimeDuration& aOther) const + { + return mValue == aOther.mValue; + } + template + bool operator!=(const BaseTimeDuration& aOther) const + { + return mValue != aOther.mValue; + } + bool IsZero() const + { + return mValue == 0; + } + explicit operator bool() const + { + return mValue != 0; + } + + friend std::ostream& operator<<(std::ostream& aStream, + const BaseTimeDuration& aDuration) { + return aStream << aDuration.ToMilliseconds() << " ms"; + } + + + + + + static BaseTimeDuration Resolution() { + return FromTicks(BaseTimeDurationPlatformUtils::ResolutionInTicks()); + } +# 303 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" +private: + friend class TimeStamp; + friend struct IPC::ParamTraits>; + template + friend class BaseTimeDuration; + + static BaseTimeDuration FromTicks(int64_t aTicks) + { + BaseTimeDuration t; + t.mValue = aTicks; + return t; + } + + static BaseTimeDuration FromTicks(double aTicks) + { + + + if (aTicks >= double((9223372036854775807L))) { + return FromTicks((9223372036854775807L)); + } + + + if (aTicks <= double((-9223372036854775807L -1))) { + return FromTicks((-9223372036854775807L -1)); + } + + return FromTicks(int64_t(aTicks)); + } + + + int64_t mValue; +}; + + + + + +class TimeDurationValueCalculator +{ +public: + static int64_t Add(int64_t aA, int64_t aB) { return aA + aB; } + static int64_t Subtract(int64_t aA, int64_t aB) { return aA - aB; } + + template + static int64_t Multiply(int64_t aA, T aB) + { + static_assert(IsIntegral::value, + "Using integer multiplication routine with non-integer type." + " Further specialization required"); + return aA * static_cast(aB); + } + + static int64_t Divide(int64_t aA, int64_t aB) { return aA / aB; } + static double DivideDouble(int64_t aA, int64_t aB) + { + return static_cast(aA) / aB; + } + static int64_t Modulo(int64_t aA, int64_t aB) { return aA % aB; } +}; + +template <> +inline int64_t +TimeDurationValueCalculator::Multiply(int64_t aA, double aB) +{ + return static_cast(aA * aB); +} +# 378 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" +typedef BaseTimeDuration TimeDuration; +# 410 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" +class TimeStamp +{ +public: + + + + constexpr TimeStamp() : mValue(0) {} +# 443 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" + bool IsNull() const { return mValue == 0; } + + + + + + explicit operator bool() const + { + return mValue != 0; + } +# 467 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" + static TimeStamp Now() { return Now(true); } + static TimeStamp NowLoRes() { return Now(false); } +# 482 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" + static __attribute__((weak)) __attribute__((visibility("default"))) TimeStamp ProcessCreation(bool& aIsInconsistent); + + + + + + + static __attribute__((weak)) __attribute__((visibility("default"))) void RecordProcessRestart(); + + + + + TimeDuration operator-(const TimeStamp& aOther) const + { + do { } while (0); + do { } while (0); + static_assert(-(9223372036854775807L) > (-9223372036854775807L -1), "int64_t sanity check"); + int64_t ticks = int64_t(mValue - aOther.mValue); + + if (mValue > aOther.mValue) { + if (ticks < 0) { + ticks = (9223372036854775807L); + } + } else { + if (ticks > 0) { + ticks = (-9223372036854775807L -1); + } + } + return TimeDuration::FromTicks(ticks); + } + + TimeStamp operator+(const TimeDuration& aOther) const + { + TimeStamp result = *this; + result += aOther; + return result; + } + TimeStamp operator-(const TimeDuration& aOther) const + { + TimeStamp result = *this; + result -= aOther; + return result; + } + TimeStamp& operator+=(const TimeDuration& aOther) + { + do { } while (0); + TimeStampValue value = mValue + aOther.mValue; + + + + if (aOther.mValue < 0 && value > mValue) { + value = 0; + } + mValue = value; + return *this; + } + TimeStamp& operator-=(const TimeDuration& aOther) + { + do { } while (0); + TimeStampValue value = mValue - aOther.mValue; + + + + if (aOther.mValue > 0 && value > mValue) { + value = 0; + } + mValue = value; + return *this; + } + + bool operator<(const TimeStamp& aOther) const + { + do { } while (0); + do { } while (0); + return mValue < aOther.mValue; + } + bool operator<=(const TimeStamp& aOther) const + { + do { } while (0); + do { } while (0); + return mValue <= aOther.mValue; + } + bool operator>=(const TimeStamp& aOther) const + { + do { } while (0); + do { } while (0); + return mValue >= aOther.mValue; + } + bool operator>(const TimeStamp& aOther) const + { + do { } while (0); + do { } while (0); + return mValue > aOther.mValue; + } + bool operator==(const TimeStamp& aOther) const + { + return IsNull() + ? aOther.IsNull() + : !aOther.IsNull() && mValue == aOther.mValue; + } + bool operator!=(const TimeStamp& aOther) const + { + return !(*this == aOther); + } + + + + + + static __attribute__((weak)) __attribute__((visibility("default"))) void Startup(); + static __attribute__((weak)) __attribute__((visibility("default"))) void Shutdown(); + +private: + friend struct IPC::ParamTraits; + friend void StartupTimelineRecordExternal(int, uint64_t); + + TimeStamp(TimeStampValue aValue) : mValue(aValue) {} + + static __attribute__((weak)) __attribute__((visibility("default"))) TimeStamp Now(bool aHighResolution); +# 610 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" + static __attribute__((weak)) __attribute__((visibility("default"))) uint64_t ComputeProcessUptime(); +# 625 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" + TimeStampValue mValue; +}; + +} +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AllocPolicy.h" 1 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AllocPolicy.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AllocPolicy.h" 2 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AllocPolicy.h" 2 + +namespace mozilla { +# 71 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AllocPolicy.h" +class MallocAllocPolicy +{ +public: + template + T* maybe_pod_malloc(size_t aNumElems) + { + if (aNumElems & mozilla::tl::MulOverflowMask::value) { + return nullptr; + } + return static_cast(malloc(aNumElems * sizeof(T))); + } + + template + T* maybe_pod_calloc(size_t aNumElems) + { + return static_cast(calloc(aNumElems, sizeof(T))); + } + + template + T* maybe_pod_realloc(T* aPtr, size_t aOldSize, size_t aNewSize) + { + if (aNewSize & mozilla::tl::MulOverflowMask::value) { + return nullptr; + } + return static_cast(realloc(aPtr, aNewSize * sizeof(T))); + } + + template + T* pod_malloc(size_t aNumElems) + { + return maybe_pod_malloc(aNumElems); + } + + template + T* pod_calloc(size_t aNumElems) + { + return maybe_pod_calloc(aNumElems); + } + + template + T* pod_realloc(T* aPtr, size_t aOldSize, size_t aNewSize) + { + return maybe_pod_realloc(aPtr, aOldSize, aNewSize); + } + + void free_(void* aPtr) + { + free(aPtr); + } + + void reportAllocOverflow() const + { + } + + __attribute__ ((warn_unused_result)) bool checkSimulatedOOM() const + { + return true; + } +}; + +} +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" 2 + + + + + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ReentrancyGuard.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ReentrancyGuard.h" +namespace mozilla { + + +class ReentrancyGuard +{ + + + + + +public: + template + + + + + + explicit ReentrancyGuard(T& + ) + + { + do { } while (0); + + + + + } + ~ReentrancyGuard() + { + + + + } + +private: + ReentrancyGuard(const ReentrancyGuard&) = delete; + void operator=(const ReentrancyGuard&) = delete; +}; + +} +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" 2 +# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" +namespace mozilla { + +template +class Vector; + +namespace detail { + + + + + + +template +static bool CapacityHasExcessSpace(size_t aCapacity) +{ + size_t size = aCapacity * sizeof(T); + return RoundUpPow2(size) - size >= sizeof(T); +} + + + + + +template +struct VectorImpl +{ + + + + template + __attribute__ ((nonnull(1))) + static inline void new_(T* aDst, Args&&... aArgs) + { + new(KnownNotNull, aDst) T(Forward(aArgs)...); + } + + + static inline void destroy(T* aBegin, T* aEnd) + { + do { } while (0); + for (T* p = aBegin; p < aEnd; ++p) { + p->~T(); + } + } + + + static inline void initialize(T* aBegin, T* aEnd) + { + do { } while (0); + for (T* p = aBegin; p < aEnd; ++p) { + new_(p); + } + } + + + + + + template + static inline void copyConstruct(T* aDst, + const U* aSrcStart, const U* aSrcEnd) + { + do { } while (0); + for (const U* p = aSrcStart; p < aSrcEnd; ++p, ++aDst) { + new_(aDst, *p); + } + } + + + + + + template + static inline void moveConstruct(T* aDst, U* aSrcStart, U* aSrcEnd) + { + do { } while (0); + for (U* p = aSrcStart; p < aSrcEnd; ++p, ++aDst) { + new_(aDst, Move(*p)); + } + } + + + + + + template + static inline void copyConstructN(T* aDst, size_t aN, const U& aU) + { + for (T* end = aDst + aN; aDst < end; ++aDst) { + new_(aDst, aU); + } + } + + + + + + + + static inline __attribute__ ((warn_unused_result)) bool + growTo(Vector& aV, size_t aNewCap) + { + do { } while (0); + do { } while (0); + T* newbuf = aV.template pod_malloc(aNewCap); + if ((__builtin_expect(!!(!newbuf), 0))) { + return false; + } + T* dst = newbuf; + T* src = aV.beginNoCheck(); + for (; src < aV.endNoCheck(); ++dst, ++src) { + new_(dst, Move(*src)); + } + VectorImpl::destroy(aV.beginNoCheck(), aV.endNoCheck()); + aV.free_(aV.mBegin); + aV.mBegin = newbuf; + + aV.mTail.mCapacity = aNewCap; + return true; + } +}; + + + + + + +template +struct VectorImpl +{ + template + __attribute__ ((nonnull(1))) + static inline void new_(T* aDst, Args&&... aArgs) + { + + + + + T temp(Forward(aArgs)...); + *aDst = temp; + } + + static inline void destroy(T*, T*) {} + + static inline void initialize(T* aBegin, T* aEnd) + { +# 187 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + do { } while (0); + for (T* p = aBegin; p < aEnd; ++p) { + new_(p); + } + } + + template + static inline void copyConstruct(T* aDst, + const U* aSrcStart, const U* aSrcEnd) + { + + + + + + + + do { } while (0); + for (const U* p = aSrcStart; p < aSrcEnd; ++p, ++aDst) { + new_(aDst, *p); + } + } + + template + static inline void moveConstruct(T* aDst, + const U* aSrcStart, const U* aSrcEnd) + { + copyConstruct(aDst, aSrcStart, aSrcEnd); + } + + static inline void copyConstructN(T* aDst, size_t aN, const T& aT) + { + for (T* end = aDst + aN; aDst < end; ++aDst) { + new_(aDst, aT); + } + } + + static inline __attribute__ ((warn_unused_result)) bool + growTo(Vector& aV, size_t aNewCap) + { + do { } while (0); + do { } while (0); + T* newbuf = + aV.template pod_realloc(aV.mBegin, aV.mTail.mCapacity, aNewCap); + if ((__builtin_expect(!!(!newbuf), 0))) { + return false; + } + aV.mBegin = newbuf; + + aV.mTail.mCapacity = aNewCap; + return true; + } + + static inline void + podResizeToFit(Vector& aV) + { + if (aV.usingInlineStorage() || aV.mLength == aV.mTail.mCapacity) { + return; + } + T* newbuf = + aV.template pod_realloc(aV.mBegin, aV.mTail.mCapacity, aV.mLength); + if ((__builtin_expect(!!(!newbuf), 0))) { + return; + } + aV.mBegin = newbuf; + aV.mTail.mCapacity = aV.mLength; + } +}; + + + +struct VectorTesting; + +} +# 280 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" +template +class Vector final : private AllocPolicy +{ + + + static const bool kElemIsPod = IsPod::value; + typedef detail::VectorImpl Impl; + friend struct detail::VectorImpl; + + friend struct detail::VectorTesting; + + __attribute__ ((warn_unused_result)) bool growStorageBy(size_t aIncr); + __attribute__ ((warn_unused_result)) bool convertToHeapStorage(size_t aNewCap); + __attribute__ ((warn_unused_result)) bool maybeCheckSimulatedOOM(size_t aRequestedSize); +# 305 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + static constexpr size_t kMaxInlineBytes = + 1024 - (sizeof(AllocPolicy) + sizeof(T*) + sizeof(size_t) + sizeof(size_t)); +# 317 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + template + struct ComputeCapacity + { + static constexpr size_t value = + tl::Min::value; + }; + + template + struct ComputeCapacity<0, Dummy> + { + static constexpr size_t value = 0; + }; + + + static constexpr size_t kInlineCapacity = + ComputeCapacity::value; +# 343 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + T* mBegin; + + + size_t mLength; +# 367 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + struct CapacityAndReserved + { + explicit CapacityAndReserved(size_t aCapacity, size_t aReserved) + : mCapacity(aCapacity) + + + + {} + CapacityAndReserved() = default; + + + size_t mCapacity; + + + + + + }; +# 393 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + template + struct CRAndStorage : CapacityAndReserved + { + explicit CRAndStorage(size_t aCapacity, size_t aReserved) + : CapacityAndReserved(aCapacity, aReserved) + {} + CRAndStorage() = default; + + alignas(T) unsigned char mBytes[Capacity * sizeof(T)]; + + + + void* data() { return mBytes; } + + T* storage() { return static_cast(data()); } + }; + + template + struct CRAndStorage<0, Dummy> : CapacityAndReserved + { + explicit CRAndStorage(size_t aCapacity, size_t aReserved) + : CapacityAndReserved(aCapacity, aReserved) + {} + CRAndStorage() = default; + + T* storage() { return nullptr; } + }; + + CRAndStorage mTail; +# 434 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + bool usingInlineStorage() const + { + return mBegin == const_cast(this)->inlineStorage(); + } + + T* inlineStorage() + { + return mTail.storage(); + } + + T* beginNoCheck() const + { + return mBegin; + } + + T* endNoCheck() + { + return mBegin + mLength; + } + + const T* endNoCheck() const + { + return mBegin + mLength; + } +# 476 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + template void internalAppend(U&& aU); + template + void internalAppendAll(const Vector& aU); + void internalAppendN(const T& aT, size_t aN); + template void internalAppend(const U* aBegin, size_t aLength); + +public: + static const size_t sMaxInlineStorage = MinInlineCapacity; + + typedef T ElementType; + + explicit Vector(AllocPolicy = AllocPolicy()); + Vector(Vector&&); + Vector& operator=(Vector&&); + ~Vector(); + + + + const AllocPolicy& allocPolicy() const { return *this; } + + AllocPolicy& allocPolicy() { return *this; } + + enum { InlineLength = MinInlineCapacity }; + + size_t length() const { return mLength; } + + bool empty() const { return mLength == 0; } + + size_t capacity() const { return mTail.mCapacity; } + + T* begin() + { + do { } while (0); + return mBegin; + } + + const T* begin() const + { + do { } while (0); + return mBegin; + } + + T* end() + { + do { } while (0); + return mBegin + mLength; + } + + const T* end() const + { + do { } while (0); + return mBegin + mLength; + } + + T& operator[](size_t aIndex) + { + do { } while (0); + do { } while (0); + return begin()[aIndex]; + } + + const T& operator[](size_t aIndex) const + { + do { } while (0); + do { } while (0); + return begin()[aIndex]; + } + + T& back() + { + do { } while (0); + do { } while (0); + return *(end() - 1); + } + + const T& back() const + { + do { } while (0); + do { } while (0); + return *(end() - 1); + } + + class Range + { + friend class Vector; + T* mCur; + T* mEnd; + Range(T* aCur, T* aEnd) + : mCur(aCur) + , mEnd(aEnd) + { + do { } while (0); + } + + public: + bool empty() const { return mCur == mEnd; } + size_t remain() const { return PointerRangeSize(mCur, mEnd); } + T& front() const { do { } while (0); return *mCur; } + void popFront() { do { } while (0); ++mCur; } + T popCopyFront() { do { } while (0); return *mCur++; } + }; + + class ConstRange + { + friend class Vector; + const T* mCur; + const T* mEnd; + ConstRange(const T* aCur, const T* aEnd) + : mCur(aCur) + , mEnd(aEnd) + { + do { } while (0); + } + + public: + bool empty() const { return mCur == mEnd; } + size_t remain() const { return PointerRangeSize(mCur, mEnd); } + const T& front() const { do { } while (0); return *mCur; } + void popFront() { do { } while (0); ++mCur; } + T popCopyFront() { do { } while (0); return *mCur++; } + }; + + Range all() { return Range(begin(), end()); } + ConstRange all() const { return ConstRange(begin(), end()); } + + + + + + + void reverse(); + + + + + + __attribute__ ((warn_unused_result)) bool initCapacity(size_t aRequest); +# 621 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + __attribute__ ((warn_unused_result)) bool initLengthUninitialized(size_t aRequest); +# 631 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + __attribute__ ((warn_unused_result)) bool reserve(size_t aRequest); + + + + + + void shrinkBy(size_t aIncr); + + + + + + void shrinkTo(size_t aNewLength); + + + __attribute__ ((warn_unused_result)) bool growBy(size_t aIncr); + + + __attribute__ ((warn_unused_result)) bool resize(size_t aNewLength); + + + + + + __attribute__ ((warn_unused_result)) bool growByUninitialized(size_t aIncr); + void infallibleGrowByUninitialized(size_t aIncr); + __attribute__ ((warn_unused_result)) bool resizeUninitialized(size_t aNewLength); + + + void clear(); + + + void clearAndFree(); + + + + + + + void podResizeToFit(); + + + + + + + + bool canAppendWithoutRealloc(size_t aNeeded) const; +# 687 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + template __attribute__ ((warn_unused_result)) bool append(U&& aU); + + + + + template + __attribute__ ((warn_unused_result)) bool emplaceBack(Args&&... aArgs) + { + if (!growByUninitialized(1)) + return false; + Impl::new_(&back(), Forward(aArgs)...); + return true; + } + + template + __attribute__ ((warn_unused_result)) bool appendAll(const Vector& aU); + __attribute__ ((warn_unused_result)) bool appendN(const T& aT, size_t aN); + template __attribute__ ((warn_unused_result)) bool append(const U* aBegin, const U* aEnd); + template __attribute__ ((warn_unused_result)) bool append(const U* aBegin, size_t aLength); + + + + + + + template void infallibleAppend(U&& aU) + { + internalAppend(Forward(aU)); + } + void infallibleAppendN(const T& aT, size_t aN) + { + internalAppendN(aT, aN); + } + template void infallibleAppend(const U* aBegin, const U* aEnd) + { + internalAppend(aBegin, PointerRangeSize(aBegin, aEnd)); + } + template void infallibleAppend(const U* aBegin, size_t aLength) + { + internalAppend(aBegin, aLength); + } + template + void infallibleEmplaceBack(Args&&... aArgs) + { + infallibleGrowByUninitialized(1); + Impl::new_(&back(), Forward(aArgs)...); + } + + void popBack(); + + T popCopy(); +# 749 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + __attribute__ ((warn_unused_result)) T* extractRawBuffer(); +# 767 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + __attribute__ ((warn_unused_result)) T* extractOrCopyRawBuffer(); +# 777 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + void replaceRawBuffer(T* aP, size_t aLength); +# 794 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + template + __attribute__ ((warn_unused_result)) T* insert(T* aP, U&& aVal); + + + + + + void erase(T* aT); + + + + + + + void erase(T* aBegin, T* aEnd); + + + + + size_t sizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const; + + + + + + size_t sizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const; + + void swap(Vector& aOther); + +private: + Vector(const Vector&) = delete; + void operator=(const Vector&) = delete; +}; +# 838 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" +template +__attribute__((always_inline)) inline +Vector::Vector(AP aAP) + : AP(aAP) + , mLength(0) + , mTail(kInlineCapacity, 0) + + + +{ + mBegin = inlineStorage(); +} + + +template +__attribute__((always_inline)) inline +Vector::Vector(Vector&& aRhs) + : AllocPolicy(Move(aRhs)) + + + +{ + mLength = aRhs.mLength; + mTail.mCapacity = aRhs.mTail.mCapacity; + + + + + if (aRhs.usingInlineStorage()) { + + mBegin = inlineStorage(); + Impl::moveConstruct(mBegin, aRhs.beginNoCheck(), aRhs.endNoCheck()); + + + + + } else { + + + + + mBegin = aRhs.mBegin; + aRhs.mBegin = aRhs.inlineStorage(); + aRhs.mTail.mCapacity = kInlineCapacity; + aRhs.mLength = 0; + + + + } +} + + +template +__attribute__((always_inline)) inline Vector& +Vector::operator=(Vector&& aRhs) +{ + do { } while (0); + this->~Vector(); + new(KnownNotNull, this) Vector(Move(aRhs)); + return *this; +} + +template +__attribute__((always_inline)) inline +Vector::~Vector() +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + Impl::destroy(beginNoCheck(), endNoCheck()); + if (!usingInlineStorage()) { + this->free_(beginNoCheck()); + } +} + +template +__attribute__((always_inline)) inline void +Vector::reverse() { + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + T* elems = mBegin; + size_t len = mLength; + size_t mid = len / 2; + for (size_t i = 0; i < mid; i++) { + Swap(elems[i], elems[len - i - 1]); + } +} + + + + + + +template +inline bool +Vector::convertToHeapStorage(size_t aNewCap) +{ + do { } while (0); + + + do { } while (0); + T* newBuf = this->template pod_malloc(aNewCap); + if ((__builtin_expect(!!(!newBuf), 0))) { + return false; + } + + + Impl::moveConstruct(newBuf, beginNoCheck(), endNoCheck()); + Impl::destroy(beginNoCheck(), endNoCheck()); + + + mBegin = newBuf; + + mTail.mCapacity = aNewCap; + return true; +} + +template +__attribute__((noinline)) bool +Vector::growStorageBy(size_t aIncr) +{ + do { } while (0); +# 966 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + size_t newCap; + + if (aIncr == 1) { + if (usingInlineStorage()) { + + size_t newSize = + tl::RoundUpPow2<(kInlineCapacity + 1) * sizeof(T)>::value; + newCap = newSize / sizeof(T); + goto convert; + } + + if (mLength == 0) { + + newCap = 1; + goto grow; + } +# 994 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" + if ((__builtin_expect(!!(mLength & tl::MulOverflowMask<4 * sizeof(T)>::value), 0))) { + this->reportAllocOverflow(); + return false; + } + + + + + + + newCap = mLength * 2; + if (detail::CapacityHasExcessSpace(newCap)) { + newCap += 1; + } + } else { + + size_t newMinCap = mLength + aIncr; + + + if ((__builtin_expect(!!(newMinCap < mLength || newMinCap & tl::MulOverflowMask<2 * sizeof(T)>::value), 0))) + + { + this->reportAllocOverflow(); + return false; + } + + size_t newMinSize = newMinCap * sizeof(T); + size_t newSize = RoundUpPow2(newMinSize); + newCap = newSize / sizeof(T); + } + + if (usingInlineStorage()) { +convert: + return convertToHeapStorage(newCap); + } + +grow: + return Impl::growTo(*this, newCap); +} + +template +inline bool +Vector::initCapacity(size_t aRequest) +{ + do { } while (0); + do { } while (0); + if (aRequest == 0) { + return true; + } + T* newbuf = this->template pod_malloc(aRequest); + if ((__builtin_expect(!!(!newbuf), 0))) { + return false; + } + mBegin = newbuf; + mTail.mCapacity = aRequest; + + + + return true; +} + +template +inline bool +Vector::initLengthUninitialized(size_t aRequest) +{ + if (!initCapacity(aRequest)) { + return false; + } + infallibleGrowByUninitialized(aRequest); + return true; +} + +template +inline bool +Vector::maybeCheckSimulatedOOM(size_t aRequestedSize) +{ + if (aRequestedSize <= N) { + return true; + } + + + + + + + + return allocPolicy().checkSimulatedOOM(); +} + +template +inline bool +Vector::reserve(size_t aRequest) +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + if (aRequest > mTail.mCapacity) { + if ((__builtin_expect(!!(!growStorageBy(aRequest - mLength)), 0))) { + return false; + } + } else if (!maybeCheckSimulatedOOM(aRequest)) { + return false; + } + + + + + + + + return true; +} + +template +inline void +Vector::shrinkBy(size_t aIncr) +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + do { } while (0); + Impl::destroy(endNoCheck() - aIncr, endNoCheck()); + mLength -= aIncr; +} + +template +__attribute__((always_inline)) inline void +Vector::shrinkTo(size_t aNewLength) +{ + do { } while (0); + shrinkBy(mLength - aNewLength); +} + +template +__attribute__((always_inline)) inline bool +Vector::growBy(size_t aIncr) +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + if (aIncr > mTail.mCapacity - mLength) { + if ((__builtin_expect(!!(!growStorageBy(aIncr)), 0))) { + return false; + } + } else if (!maybeCheckSimulatedOOM(mLength + aIncr)) { + return false; + } + do { } while (0); + T* newend = endNoCheck() + aIncr; + Impl::initialize(endNoCheck(), newend); + mLength += aIncr; + + + + + + return true; +} + +template +__attribute__((always_inline)) inline bool +Vector::growByUninitialized(size_t aIncr) +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + if (aIncr > mTail.mCapacity - mLength) { + if ((__builtin_expect(!!(!growStorageBy(aIncr)), 0))) { + return false; + } + } else if (!maybeCheckSimulatedOOM(mLength + aIncr)) { + return false; + } + + + + + + infallibleGrowByUninitialized(aIncr); + return true; +} + +template +__attribute__((always_inline)) inline void +Vector::infallibleGrowByUninitialized(size_t aIncr) +{ + do { } while (0); + mLength += aIncr; +} + +template +inline bool +Vector::resize(size_t aNewLength) +{ + size_t curLength = mLength; + if (aNewLength > curLength) { + return growBy(aNewLength - curLength); + } + shrinkBy(curLength - aNewLength); + return true; +} + +template +__attribute__((always_inline)) inline bool +Vector::resizeUninitialized(size_t aNewLength) +{ + size_t curLength = mLength; + if (aNewLength > curLength) { + return growByUninitialized(aNewLength - curLength); + } + shrinkBy(curLength - aNewLength); + return true; +} + +template +inline void +Vector::clear() +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + Impl::destroy(beginNoCheck(), endNoCheck()); + mLength = 0; +} + +template +inline void +Vector::clearAndFree() +{ + clear(); + + if (usingInlineStorage()) { + return; + } + this->free_(beginNoCheck()); + mBegin = inlineStorage(); + mTail.mCapacity = kInlineCapacity; + + + +} + +template +inline void +Vector::podResizeToFit() +{ + + + Impl::podResizeToFit(*this); +} + +template +inline bool +Vector::canAppendWithoutRealloc(size_t aNeeded) const +{ + return mLength + aNeeded <= mTail.mCapacity; +} + +template +template +__attribute__((always_inline)) inline void +Vector::internalAppendAll(const Vector& aOther) +{ + internalAppend(aOther.begin(), aOther.length()); +} + +template +template +__attribute__((always_inline)) inline void +Vector::internalAppend(U&& aU) +{ + do { } while (0); + do { } while (0); + Impl::new_(endNoCheck(), Forward(aU)); + ++mLength; +} + +template +__attribute__((always_inline)) inline bool +Vector::appendN(const T& aT, size_t aNeeded) +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + if (mLength + aNeeded > mTail.mCapacity) { + if ((__builtin_expect(!!(!growStorageBy(aNeeded)), 0))) { + return false; + } + } else if (!maybeCheckSimulatedOOM(mLength + aNeeded)) { + return false; + } + + + + + + internalAppendN(aT, aNeeded); + return true; +} + +template +__attribute__((always_inline)) inline void +Vector::internalAppendN(const T& aT, size_t aNeeded) +{ + do { } while (0); + do { } while (0); + Impl::copyConstructN(endNoCheck(), aNeeded, aT); + mLength += aNeeded; +} + +template +template +inline T* +Vector::insert(T* aP, U&& aVal) +{ + do { } while (0); + do { } while (0); + size_t pos = aP - begin(); + do { } while (0); + size_t oldLength = mLength; + if (pos == oldLength) { + if (!append(Forward(aVal))) { + return nullptr; + } + } else { + T oldBack = Move(back()); + if (!append(Move(oldBack))) { + return nullptr; + } + for (size_t i = oldLength - 1; i > pos; --i) { + (*this)[i] = Move((*this)[i - 1]); + } + (*this)[pos] = Forward(aVal); + } + return begin() + pos; +} + +template +inline void +Vector::erase(T* aIt) +{ + do { } while (0); + do { } while (0); + while (aIt + 1 < end()) { + *aIt = Move(*(aIt + 1)); + ++aIt; + } + popBack(); +} + +template +inline void +Vector::erase(T* aBegin, T* aEnd) +{ + do { } while (0); + do { } while (0); + do { } while (0); + while (aEnd < end()) { + *aBegin++ = Move(*aEnd++); + } + shrinkBy(aEnd - aBegin); +} + +template +template +__attribute__((always_inline)) inline bool +Vector::append(const U* aInsBegin, const U* aInsEnd) +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + size_t aNeeded = PointerRangeSize(aInsBegin, aInsEnd); + if (mLength + aNeeded > mTail.mCapacity) { + if ((__builtin_expect(!!(!growStorageBy(aNeeded)), 0))) { + return false; + } + } else if (!maybeCheckSimulatedOOM(mLength + aNeeded)) { + return false; + } + + + + + + internalAppend(aInsBegin, aNeeded); + return true; +} + +template +template +__attribute__((always_inline)) inline void +Vector::internalAppend(const U* aInsBegin, size_t aInsLength) +{ + do { } while (0); + do { } while (0); + Impl::copyConstruct(endNoCheck(), aInsBegin, aInsBegin + aInsLength); + mLength += aInsLength; +} + +template +template +__attribute__((always_inline)) inline bool +Vector::append(U&& aU) +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + if (mLength == mTail.mCapacity) { + if ((__builtin_expect(!!(!growStorageBy(1)), 0))) { + return false; + } + } else if (!maybeCheckSimulatedOOM(mLength + 1)) { + return false; + } + + + + + + internalAppend(Forward(aU)); + return true; +} + +template +template +__attribute__((always_inline)) inline bool +Vector::appendAll(const Vector& aOther) +{ + return append(aOther.begin(), aOther.length()); +} + +template +template +__attribute__((always_inline)) inline bool +Vector::append(const U* aInsBegin, size_t aInsLength) +{ + return append(aInsBegin, aInsBegin + aInsLength); +} + +template +__attribute__((always_inline)) inline void +Vector::popBack() +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + do { } while (0); + --mLength; + endNoCheck()->~T(); +} + +template +__attribute__((always_inline)) inline T +Vector::popCopy() +{ + T ret = back(); + popBack(); + return ret; +} + +template +inline T* +Vector::extractRawBuffer() +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + + if (usingInlineStorage()) { + return nullptr; + } + + T* ret = mBegin; + mBegin = inlineStorage(); + mLength = 0; + mTail.mCapacity = kInlineCapacity; + + + + return ret; +} + +template +inline T* +Vector::extractOrCopyRawBuffer() +{ + if (T* ret = extractRawBuffer()) { + return ret; + } + + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + + T* copy = this->template pod_malloc(mLength); + if (!copy) { + return nullptr; + } + + Impl::moveConstruct(copy, beginNoCheck(), endNoCheck()); + Impl::destroy(beginNoCheck(), endNoCheck()); + mBegin = inlineStorage(); + mLength = 0; + mTail.mCapacity = kInlineCapacity; + + + + return copy; +} + +template +inline void +Vector::replaceRawBuffer(T* aP, size_t aLength) +{ + ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0); + + + Impl::destroy(beginNoCheck(), endNoCheck()); + if (!usingInlineStorage()) { + this->free_(beginNoCheck()); + } + + + if (aLength <= kInlineCapacity) { + + + + + + mBegin = inlineStorage(); + mLength = aLength; + mTail.mCapacity = kInlineCapacity; + Impl::moveConstruct(mBegin, aP, aP + aLength); + Impl::destroy(aP, aP + aLength); + this->free_(aP); + } else { + mBegin = aP; + mLength = aLength; + mTail.mCapacity = aLength; + } + + + +} + +template +inline size_t +Vector::sizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const +{ + return usingInlineStorage() ? 0 : aMallocSizeOf(beginNoCheck()); +} + +template +inline size_t +Vector::sizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const +{ + return aMallocSizeOf(this) + sizeOfExcludingThis(aMallocSizeOf); +} + +template +inline void +Vector::swap(Vector& aOther) +{ + static_assert(N == 0, + "still need to implement this for N != 0"); + + + if (!usingInlineStorage() && aOther.usingInlineStorage()) { + aOther.mBegin = mBegin; + mBegin = inlineStorage(); + } else if (usingInlineStorage() && !aOther.usingInlineStorage()) { + mBegin = aOther.mBegin; + aOther.mBegin = aOther.inlineStorage(); + } else if (!usingInlineStorage() && !aOther.usingInlineStorage()) { + Swap(mBegin, aOther.mBegin); + } else { + + } + + Swap(mLength, aOther.mLength); + Swap(mTail.mCapacity, aOther.mTail.mCapacity); + + + +} + +} +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" 2 + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/UniquePtr.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/UniquePtr.h" +namespace js { + + +template > +using UniquePtr = mozilla::UniquePtr; + +namespace detail { + +template +struct UniqueSelector +{ + typedef UniquePtr SingleObject; +}; + +template +struct UniqueSelector +{ + typedef UniquePtr UnknownBound; +}; + +template +struct UniqueSelector +{ + typedef UniquePtr KnownBound; +}; + +} + + + +template +typename detail::UniqueSelector::SingleObject +MakeUnique(Args&&... aArgs) +{ + return UniquePtr(js_new(mozilla::Forward(aArgs)...)); +} + +template +typename detail::UniqueSelector::UnknownBound +MakeUnique(decltype(sizeof(int)) aN) = delete; + +template +typename detail::UniqueSelector::KnownBound +MakeUnique(Args&&... aArgs) = delete; + +} +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" 2 + +namespace js { +namespace gc { +class GCRuntime; +} +namespace gcstats { +struct Statistics; +} +} + +typedef enum JSGCMode { + + JSGC_MODE_GLOBAL = 0, + + + JSGC_MODE_ZONE = 1, + + + + + + JSGC_MODE_INCREMENTAL = 2 +} JSGCMode; + + + + +typedef enum JSGCInvocationKind { + + GC_NORMAL = 0, + + + GC_SHRINK = 1 +} JSGCInvocationKind; + +namespace JS { +# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +namespace gcreason { + + +enum Reason { + + API, EAGER_ALLOC_TRIGGER, DESTROY_RUNTIME, UNUSED0, LAST_DITCH, TOO_MUCH_MALLOC, ALLOC_TRIGGER, DEBUG_GC, COMPARTMENT_REVIVED, RESET, OUT_OF_NURSERY, EVICT_NURSERY, FULL_STORE_BUFFER, SHARED_MEMORY_LIMIT, UNUSED1, INCREMENTAL_TOO_SLOW, ABORT_GC, RESERVED0, RESERVED1, RESERVED2, RESERVED3, RESERVED4, RESERVED5, RESERVED6, RESERVED7, RESERVED8, RESERVED9, RESERVED10, RESERVED11, RESERVED12, RESERVED13, RESERVED14, RESERVED15, DOM_WINDOW_UTILS, COMPONENT_UTILS, MEM_PRESSURE, CC_WAITING, CC_FORCED, LOAD_END, POST_COMPARTMENT, PAGE_HIDE, NSJSCONTEXT_DESTROY, SET_NEW_DOCUMENT, SET_DOC_SHELL, DOM_UTILS, DOM_IPC, DOM_WORKER, INTER_SLICE_GC, REFRESH_FRAME, FULL_GC_TIMER, SHUTDOWN_CC, FINISH_LARGE_EVALUATE, USER_INACTIVE, XPCONNECT_SHUTDOWN, + + NO_REASON, + NUM_REASONS, + + + + + + + + NUM_TELEMETRY_REASONS = 100 +}; + + + + +extern const char* +ExplainReason(JS::gcreason::Reason reason); + +} +# 158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +extern void +PrepareZoneForGC(Zone* zone); + + + + +extern void +PrepareForFullGC(JSContext* cx); + + + + + + +extern void +PrepareForIncrementalGC(JSContext* cx); + + + + + +extern bool +IsGCScheduled(JSContext* cx); + + + + + +extern void +SkipZoneForGC(Zone* zone); +# 204 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +extern void +GCForReason(JSContext* cx, JSGCInvocationKind gckind, gcreason::Reason reason); +# 236 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +extern void +StartIncrementalGC(JSContext* cx, JSGCInvocationKind gckind, gcreason::Reason reason, + int64_t millis = 0); +# 248 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +extern void +IncrementalGCSlice(JSContext* cx, gcreason::Reason reason, int64_t millis = 0); + + + + + + + +extern void +FinishIncrementalGC(JSContext* cx, gcreason::Reason reason); + + + + + + + +extern void +AbortIncrementalGC(JSContext* cx); + +namespace dbg { + + + + +class GarbageCollectionEvent +{ + + uint64_t majorGCNumber_; + + + + const char* reason; + + + + + const char* nonincrementalReason; + + + + struct Collection { + mozilla::TimeStamp startTimestamp; + mozilla::TimeStamp endTimestamp; + }; + + + mozilla::Vector collections; + + GarbageCollectionEvent(const GarbageCollectionEvent& rhs) = delete; + GarbageCollectionEvent& operator=(const GarbageCollectionEvent& rhs) = delete; + + public: + explicit GarbageCollectionEvent(uint64_t majorGCNum) + : majorGCNumber_(majorGCNum) + , reason(nullptr) + , nonincrementalReason(nullptr) + , collections() + { } + + using Ptr = js::UniquePtr; + static Ptr Create(JSRuntime* rt, ::js::gcstats::Statistics& stats, uint64_t majorGCNumber); + + JSObject* toJSObject(JSContext* cx) const; + + uint64_t majorGCNumber() const { return majorGCNumber_; } +}; + +} + +enum GCProgress { +# 330 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" + GC_CYCLE_BEGIN, + GC_SLICE_BEGIN, + GC_SLICE_END, + GC_CYCLE_END +}; + +struct GCDescription { + bool isZone_; + JSGCInvocationKind invocationKind_; + gcreason::Reason reason_; + + GCDescription(bool isZone, JSGCInvocationKind kind, gcreason::Reason reason) + : isZone_(isZone), invocationKind_(kind), reason_(reason) {} + + char16_t* formatSliceMessage(JSContext* cx) const; + char16_t* formatSummaryMessage(JSContext* cx) const; + char16_t* formatJSON(JSContext* cx, uint64_t timestamp) const; + + JS::dbg::GarbageCollectionEvent::Ptr toGCEvent(JSContext* cx) const; +}; + +typedef void +(* GCSliceCallback)(JSContext* cx, GCProgress progress, const GCDescription& desc); + + + + + + +extern GCSliceCallback +SetGCSliceCallback(JSContext* cx, GCSliceCallback callback); + + + + +enum class GCNurseryProgress { + + + + GC_NURSERY_COLLECTION_START, + + + + GC_NURSERY_COLLECTION_END +}; + + + + + +using GCNurseryCollectionCallback = void(*)(JSContext* cx, GCNurseryProgress progress, + gcreason::Reason reason); + + + + + +extern GCNurseryCollectionCallback +SetGCNurseryCollectionCallback(JSContext* cx, GCNurseryCollectionCallback callback); + +typedef void +(* DoCycleCollectionCallback)(JSContext* cx); + + + + + +extern DoCycleCollectionCallback +SetDoCycleCollectionCallback(JSContext* cx, DoCycleCollectionCallback callback); + + + + + + + +extern void +DisableIncrementalGC(JSContext* cx); +# 417 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +extern bool +IsIncrementalGCEnabled(JSContext* cx); + + + + + +extern bool +IsIncrementalGCInProgress(JSContext* cx); + + + + + + + +extern bool +IsIncrementalBarrierNeeded(JSContext* cx); + + + + + +extern void +IncrementalPreWriteBarrier(JSObject* obj); + + + + + +extern void +IncrementalReadBarrier(GCCellPtr thing); + + + + +extern bool +WasIncrementalGC(JSContext* cx); +# 465 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +class AutoDisableGenerationalGC +{ + JSContext* cx; + + public: + explicit AutoDisableGenerationalGC(JSContext* cx); + ~AutoDisableGenerationalGC(); +}; + + + + + +extern bool +IsGenerationalGCEnabled(JSRuntime* rt); + + + + + + +extern size_t +GetGCNumber(); + + + + + + +class AutoRequireNoGC +{ + protected: + AutoRequireNoGC() {} + ~AutoRequireNoGC() {} +}; +# 509 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +class AutoAssertNoGC : public AutoRequireNoGC +{ + JSContext* cx_; + + public: + explicit AutoAssertNoGC(JSContext* cx = nullptr); + ~AutoAssertNoGC(); +}; + + + + + +class AutoAssertNoAlloc +{ + + js::gc::GCRuntime* gc; + + public: + AutoAssertNoAlloc() : gc(nullptr) {} + explicit AutoAssertNoAlloc(JSContext* cx); + void disallowAlloc(JSRuntime* rt); + ~AutoAssertNoAlloc(); + + + + + + +}; + + + + + +class AutoAssertOnBarrier +{ + JSContext* context; + bool prev; + + public: + explicit AutoAssertOnBarrier(JSContext* cx); + ~AutoAssertOnBarrier(); +}; +# 568 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +class AutoSuppressGCAnalysis : public AutoAssertNoAlloc +{ + public: + AutoSuppressGCAnalysis() : AutoAssertNoAlloc() {} + explicit AutoSuppressGCAnalysis(JSContext* cx) : AutoAssertNoAlloc(cx) {} +} ; +# 583 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +class AutoAssertGCCallback : public AutoSuppressGCAnalysis +{ + public: + explicit AutoAssertGCCallback(JSObject* obj); +}; +# 608 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" +class AutoCheckCannotGC : public AutoRequireNoGC +{ + public: + explicit AutoCheckCannotGC(JSContext* cx = nullptr) {} +} ; + + + + + + + +extern bool +UnmarkGrayGCThingRecursively(GCCellPtr thing); + +} + +namespace js { +namespace gc { + +extern bool +BarriersAreAllowedOnCurrentThread(); + +static __attribute__((always_inline)) inline void +ExposeGCThingToActiveJS(JS::GCCellPtr thing) +{ + + + + if (IsInsideNursery(thing.asCell())) + return; + + + + if (thing.mayBeOwnedByOtherRuntime()) + return; + + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(BarriersAreAllowedOnCurrentThread()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "BarriersAreAllowedOnCurrentThread()" ")"); do { *((volatile int*) __null) = 645; ::abort(); } while (0); } } while (0); + + if (IsIncrementalBarrierNeededOnTenuredGCThing(thing)) + JS::IncrementalReadBarrier(thing); + else if (js::gc::detail::CellIsMarkedGray(thing.asCell())) + JS::UnmarkGrayGCThingRecursively(thing); + + do { } while (0); +} + +static __attribute__((always_inline)) inline void +GCThingReadBarrier(JS::GCCellPtr thing) +{ + + + if (IsInsideNursery(thing.asCell())) + return; + + + + if (thing.mayBeOwnedByOtherRuntime()) + return; + + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(BarriersAreAllowedOnCurrentThread()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "BarriersAreAllowedOnCurrentThread()" ")"); do { *((volatile int*) __null) = 668; ::abort(); } while (0); } } while (0); + + if (IsIncrementalBarrierNeededOnTenuredGCThing(thing)) + JS::IncrementalReadBarrier(thing); +} + +} +} + +namespace JS { + + + + + + + +static __attribute__((always_inline)) inline void +ExposeObjectToActiveJS(JSObject* obj) +{ + do { } while (0); + js::gc::ExposeGCThingToActiveJS(GCCellPtr(obj)); +} + +static __attribute__((always_inline)) inline void +ExposeScriptToActiveJS(JSScript* script) +{ + js::gc::ExposeGCThingToActiveJS(GCCellPtr(script)); +} + + + + +static __attribute__((always_inline)) inline void +StringReadBarrier(JSString* string) +{ + do { } while (0); + js::gc::GCThingReadBarrier(GCCellPtr(string)); +} + + + + + + +extern void +PokeGC(JSContext* cx); + + + + +extern void +NotifyDidPaint(JSContext* cx); + +} +# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCPolicyAPI.h" 1 +# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCPolicyAPI.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsalloc.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsalloc.h" +namespace js { + +enum class AllocFunction { + Malloc, + Calloc, + Realloc +}; + + +class SystemAllocPolicy +{ + public: + template T* maybe_pod_malloc(size_t numElems) { return js_pod_malloc(numElems); } + template T* maybe_pod_calloc(size_t numElems) { return js_pod_calloc(numElems); } + template T* maybe_pod_realloc(T* p, size_t oldSize, size_t newSize) { + return js_pod_realloc(p, oldSize, newSize); + } + template T* pod_malloc(size_t numElems) { return maybe_pod_malloc(numElems); } + template T* pod_calloc(size_t numElems) { return maybe_pod_calloc(numElems); } + template T* pod_realloc(T* p, size_t oldSize, size_t newSize) { + return maybe_pod_realloc(p, oldSize, newSize); + } + void free_(void* p) { js_free(p); } + void reportAllocOverflow() const {} + bool checkSimulatedOOM() const { + return !js::oom::ShouldFailWithOOM(); + } +}; + +void ReportOutOfMemory(JSContext* cx); +# 60 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsalloc.h" +class TempAllocPolicy +{ + JSContext* const cx_; + + + + + + void* onOutOfMemory(AllocFunction allocFunc, size_t nbytes, + void* reallocPtr = nullptr); + + template + T* onOutOfMemoryTyped(AllocFunction allocFunc, size_t numElems, void* reallocPtr = nullptr) { + size_t bytes; + if ((__builtin_expect(!!(!CalculateAllocSize(numElems, &bytes)), 0))) + return nullptr; + return static_cast(onOutOfMemory(allocFunc, bytes, reallocPtr)); + } + + public: + TempAllocPolicy(JSContext* cx) : cx_(cx) {} + + template + T* maybe_pod_malloc(size_t numElems) { + return js_pod_malloc(numElems); + } + + template + T* maybe_pod_calloc(size_t numElems) { + return js_pod_calloc(numElems); + } + + template + T* maybe_pod_realloc(T* prior, size_t oldSize, size_t newSize) { + return js_pod_realloc(prior, oldSize, newSize); + } + + template + T* pod_malloc(size_t numElems) { + T* p = maybe_pod_malloc(numElems); + if ((__builtin_expect(!!(!p), 0))) + p = onOutOfMemoryTyped(AllocFunction::Malloc, numElems); + return p; + } + + template + T* pod_calloc(size_t numElems) { + T* p = maybe_pod_calloc(numElems); + if ((__builtin_expect(!!(!p), 0))) + p = onOutOfMemoryTyped(AllocFunction::Calloc, numElems); + return p; + } + + template + T* pod_realloc(T* prior, size_t oldSize, size_t newSize) { + T* p2 = maybe_pod_realloc(prior, oldSize, newSize); + if ((__builtin_expect(!!(!p2), 0))) + p2 = onOutOfMemoryTyped(AllocFunction::Realloc, newSize, prior); + return p2; + } + + void free_(void* p) { + js_free(p); + } + + void reportAllocOverflow() const; + + bool checkSimulatedOOM() const { + if (js::oom::ShouldFailWithOOM()) { + ReportOutOfMemory(cx_); + return false; + } + + return true; + } +}; + +} +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h" 1 +# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h" +namespace mozilla { + + + + +static const uint32_t kGoldenRatioU32 = 0x9E3779B9U; + +inline uint32_t +RotateBitsLeft32(uint32_t aValue, uint8_t aBits) +{ + do { } while (0); + return (aValue << aBits) | (aValue >> (32 - aBits)); +} + +namespace detail { + +inline uint32_t +AddU32ToHash(uint32_t aHash, uint32_t aValue) +{ +# 117 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h" + return kGoldenRatioU32 * (RotateBitsLeft32(aHash, 5) ^ aValue); +} + + + + +template +inline uint32_t +AddUintptrToHash(uint32_t aHash, uintptr_t aValue); + +template<> +inline uint32_t +AddUintptrToHash<4>(uint32_t aHash, uintptr_t aValue) +{ + return AddU32ToHash(aHash, static_cast(aValue)); +} + +template<> +inline uint32_t +AddUintptrToHash<8>(uint32_t aHash, uintptr_t aValue) +{ + + + + + + + + uint32_t v1 = static_cast(aValue); + uint32_t v2 = static_cast(static_cast(aValue) >> 32); + return AddU32ToHash(AddU32ToHash(aHash, v1), v2); +} + +} +# 159 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h" +template +__attribute__ ((warn_unused_result)) inline uint32_t +AddToHash(uint32_t aHash, A aA) +{ + + + + + return detail::AddU32ToHash(aHash, aA); +} + +template +__attribute__ ((warn_unused_result)) inline uint32_t +AddToHash(uint32_t aHash, A* aA) +{ + + + + + + static_assert(sizeof(aA) == sizeof(uintptr_t), "Strange pointer!"); + + return detail::AddUintptrToHash(aHash, uintptr_t(aA)); +} + +template<> +__attribute__ ((warn_unused_result)) inline uint32_t +AddToHash(uint32_t aHash, uintptr_t aA) +{ + return detail::AddUintptrToHash(aHash, aA); +} + +template +__attribute__ ((warn_unused_result)) uint32_t +AddToHash(uint32_t aHash, A aArg, Args... aArgs) +{ + return AddToHash(AddToHash(aHash, aArg), aArgs...); +} +# 205 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h" +template +__attribute__ ((warn_unused_result)) inline uint32_t +HashGeneric(Args... aArgs) +{ + return AddToHash(0, aArgs...); +} + +namespace detail { + +template +uint32_t +HashUntilZero(const T* aStr) +{ + uint32_t hash = 0; + for (T c; (c = *aStr); aStr++) { + hash = AddToHash(hash, c); + } + return hash; +} + +template +uint32_t +HashKnownLength(const T* aStr, size_t aLength) +{ + uint32_t hash = 0; + for (size_t i = 0; i < aLength; i++) { + hash = AddToHash(hash, aStr[i]); + } + return hash; +} + +} + + + + + + + +__attribute__ ((warn_unused_result)) inline uint32_t +HashString(const char* aStr) +{ + return detail::HashUntilZero(reinterpret_cast(aStr)); +} + +__attribute__ ((warn_unused_result)) inline uint32_t +HashString(const char* aStr, size_t aLength) +{ + return detail::HashKnownLength(reinterpret_cast(aStr), aLength); +} + +__attribute__ ((warn_unused_result)) +inline uint32_t +HashString(const unsigned char* aStr, size_t aLength) +{ + return detail::HashKnownLength(aStr, aLength); +} + +__attribute__ ((warn_unused_result)) inline uint32_t +HashString(const char16_t* aStr) +{ + return detail::HashUntilZero(aStr); +} + +__attribute__ ((warn_unused_result)) inline uint32_t +HashString(const char16_t* aStr, size_t aLength) +{ + return detail::HashKnownLength(aStr, aLength); +} +# 299 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h" +__attribute__ ((warn_unused_result)) extern __attribute__((weak)) __attribute__((visibility("default"))) uint32_t +HashBytes(const void* bytes, size_t aLength); +# 318 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h" +class HashCodeScrambler +{ + struct SipHasher; + + uint64_t mK0, mK1; + +public: + + constexpr HashCodeScrambler(uint64_t aK0, uint64_t aK1) : mK0(aK0), mK1(aK1) {} + + + + + + uint32_t scramble(uint32_t aHashCode) const + { + SipHasher hasher(mK0, mK1); + return uint32_t(hasher.sipHash(aHashCode)); + } + +private: + struct SipHasher + { + SipHasher(uint64_t aK0, uint64_t aK1) + { + + mV0 = aK0 ^ 0x736f6d6570736575UL; + mV1 = aK1 ^ 0x646f72616e646f6dUL; + mV2 = aK0 ^ 0x6c7967656e657261UL; + mV3 = aK1 ^ 0x7465646279746573UL; + } + + uint64_t sipHash(uint64_t aM) + { + + mV3 ^= aM; + sipRound(); + mV0 ^= aM; + + + mV2 ^= 0xff; + for (int i = 0; i < 3; i++) + sipRound(); + return mV0 ^ mV1 ^ mV2 ^ mV3; + } + + void sipRound() + { + mV0 += mV1; + mV1 = RotateLeft(mV1, 13); + mV1 ^= mV0; + mV0 = RotateLeft(mV0, 32); + mV2 += mV3; + mV3 = RotateLeft(mV3, 16); + mV3 ^= mV2; + mV0 += mV3; + mV3 = RotateLeft(mV3, 21); + mV3 ^= mV0; + mV2 += mV1; + mV1 = RotateLeft(mV1, 17); + mV1 ^= mV2; + mV2 = RotateLeft(mV2, 32); + } + + uint64_t mV0, mV1, mV2, mV3; + }; +}; + +} +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Opaque.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Opaque.h" +namespace mozilla { + + + + + + +template +class Opaque final +{ + static_assert(mozilla::IsIntegral::value, + "mozilla::Opaque only supports integral types"); + + T mValue; + +public: + Opaque() {} + explicit Opaque(T aValue) : mValue(aValue) {} + + bool operator==(const Opaque& aOther) const { + return mValue == aOther.mValue; + } + + bool operator!=(const Opaque& aOther) const { + return !(*this == aOther); + } +}; + +} +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" 2 + + + + + + + + +namespace js { + +class TempAllocPolicy; +template struct DefaultHasher; +template class HashMapEntry; +namespace detail { + template class HashTableEntry; + template class HashTable; +} +# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" +using Generation = mozilla::Opaque; +# 65 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" +template , + class AllocPolicy = TempAllocPolicy> +class HashMap +{ + typedef HashMapEntry TableEntry; + + struct MapHashPolicy : HashPolicy + { + using Base = HashPolicy; + typedef Key KeyType; + static const Key& getKey(TableEntry& e) { return e.key(); } + static void setKey(TableEntry& e, Key& k) { HashPolicy::rekey(e.mutableKey(), k); } + }; + + typedef detail::HashTable Impl; + Impl impl; + + public: + typedef typename HashPolicy::Lookup Lookup; + typedef TableEntry Entry; + + + + explicit HashMap(AllocPolicy a = AllocPolicy()) : impl(a) {} + __attribute__ ((warn_unused_result)) bool init(uint32_t len = 16) { return impl.init(len); } + bool initialized() const { return impl.initialized(); } +# 105 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" + typedef typename Impl::Ptr Ptr; + __attribute__((always_inline)) inline Ptr lookup(const Lookup& l) const { return impl.lookup(l); } + + + + __attribute__((always_inline)) inline Ptr readonlyThreadsafeLookup(const Lookup& l) const { + return impl.readonlyThreadsafeLookup(l); + } + + + void remove(Ptr p) { impl.remove(p); } +# 150 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" + typedef typename Impl::AddPtr AddPtr; + __attribute__((always_inline)) inline AddPtr lookupForAdd(const Lookup& l) const { + return impl.lookupForAdd(l); + } + + template + __attribute__ ((warn_unused_result)) bool add(AddPtr& p, KeyInput&& k, ValueInput&& v) { + return impl.add(p, + mozilla::Forward(k), + mozilla::Forward(v)); + } + + template + __attribute__ ((warn_unused_result)) bool add(AddPtr& p, KeyInput&& k) { + return impl.add(p, mozilla::Forward(k), Value()); + } + + template + __attribute__ ((warn_unused_result)) bool relookupOrAdd(AddPtr& p, KeyInput&& k, ValueInput&& v) { + return impl.relookupOrAdd(p, k, + mozilla::Forward(k), + mozilla::Forward(v)); + } +# 182 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" + typedef typename Impl::Range Range; + Range all() const { return impl.all(); } +# 196 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" + typedef typename Impl::Enum Enum; + + + + void clear() { impl.clear(); } + + + + void clearAndShrink() { impl.clearAndShrink(); } + + + + void finish() { impl.finish(); } + + + bool empty() const { return impl.empty(); } + + + uint32_t count() const { return impl.count(); } + + + + size_t capacity() const { return impl.capacity(); } + + + + size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return impl.sizeOfExcludingThis(mallocSizeOf); + } + size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return mallocSizeOf(this) + impl.sizeOfExcludingThis(mallocSizeOf); + } + + Generation generation() const { + return impl.generation(); + } + + + + bool has(const Lookup& l) const { + return impl.lookup(l).found(); + } + + + template + __attribute__ ((warn_unused_result)) bool put(KeyInput&& k, ValueInput&& v) { + AddPtr p = lookupForAdd(k); + if (p) { + p->value() = mozilla::Forward(v); + return true; + } + return add(p, mozilla::Forward(k), mozilla::Forward(v)); + } + + + template + __attribute__ ((warn_unused_result)) bool putNew(KeyInput&& k, ValueInput&& v) { + return impl.putNew(k, mozilla::Forward(k), mozilla::Forward(v)); + } + + + template + void putNewInfallible(KeyInput&& k, ValueInput&& v) { + impl.putNewInfallible(k, mozilla::Forward(k), mozilla::Forward(v)); + } + + + Ptr lookupWithDefault(const Key& k, const Value& defaultValue) { + AddPtr p = lookupForAdd(k); + if (p) + return p; + bool ok = add(p, k, defaultValue); + do { } while (0); + (void)ok; + return p; + } + + + void remove(const Lookup& l) { + if (Ptr p = lookup(l)) + remove(p); + } + + + + void rekeyIfMoved(const Key& old_key, const Key& new_key) { + if (old_key != new_key) + rekeyAs(old_key, new_key, new_key); + } + + + bool rekeyAs(const Lookup& old_lookup, const Lookup& new_lookup, const Key& new_key) { + if (Ptr p = lookup(old_lookup)) { + impl.rekeyAndMaybeRehash(p, new_lookup, new_key); + return true; + } + return false; + } + + + HashMap(HashMap&& rhs) : impl(mozilla::Move(rhs.impl)) {} + void operator=(HashMap&& rhs) { + do { } while (0); + impl = mozilla::Move(rhs.impl); + } + + private: + + HashMap(const HashMap& hm) = delete; + HashMap& operator=(const HashMap& hm) = delete; + + friend class Impl::Enum; +}; +# 327 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" +template , + class AllocPolicy = TempAllocPolicy> +class HashSet +{ + struct SetOps : HashPolicy + { + using Base = HashPolicy; + typedef T KeyType; + static const KeyType& getKey(const T& t) { return t; } + static void setKey(T& t, KeyType& k) { HashPolicy::rekey(t, k); } + }; + + typedef detail::HashTable Impl; + Impl impl; + + public: + typedef typename HashPolicy::Lookup Lookup; + typedef T Entry; + + + + explicit HashSet(AllocPolicy a = AllocPolicy()) : impl(a) {} + __attribute__ ((warn_unused_result)) bool init(uint32_t len = 16) { return impl.init(len); } + bool initialized() const { return impl.initialized(); } +# 362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" + typedef typename Impl::Ptr Ptr; + __attribute__((always_inline)) inline Ptr lookup(const Lookup& l) const { return impl.lookup(l); } + + + + __attribute__((always_inline)) inline Ptr readonlyThreadsafeLookup(const Lookup& l) const { + return impl.readonlyThreadsafeLookup(l); + } + + + void remove(Ptr p) { impl.remove(p); } +# 406 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" + typedef typename Impl::AddPtr AddPtr; + __attribute__((always_inline)) inline AddPtr lookupForAdd(const Lookup& l) const { + return impl.lookupForAdd(l); + } + + template + __attribute__ ((warn_unused_result)) bool add(AddPtr& p, U&& u) { + return impl.add(p, mozilla::Forward(u)); + } + + template + __attribute__ ((warn_unused_result)) bool relookupOrAdd(AddPtr& p, const Lookup& l, U&& u) { + return impl.relookupOrAdd(p, l, mozilla::Forward(u)); + } +# 429 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" + typedef typename Impl::Range Range; + Range all() const { return impl.all(); } +# 443 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" + typedef typename Impl::Enum Enum; + + + + void clear() { impl.clear(); } + + + + void clearAndShrink() { impl.clearAndShrink(); } + + + + void finish() { impl.finish(); } + + + bool empty() const { return impl.empty(); } + + + uint32_t count() const { return impl.count(); } + + + + size_t capacity() const { return impl.capacity(); } + + + + size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return impl.sizeOfExcludingThis(mallocSizeOf); + } + size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return mallocSizeOf(this) + impl.sizeOfExcludingThis(mallocSizeOf); + } + + Generation generation() const { + return impl.generation(); + } + + + + bool has(const Lookup& l) const { + return impl.lookup(l).found(); + } + + + template + __attribute__ ((warn_unused_result)) bool put(U&& u) { + AddPtr p = lookupForAdd(u); + return p ? true : add(p, mozilla::Forward(u)); + } + + + template + __attribute__ ((warn_unused_result)) bool putNew(U&& u) { + return impl.putNew(u, mozilla::Forward(u)); + } + + template + __attribute__ ((warn_unused_result)) bool putNew(const Lookup& l, U&& u) { + return impl.putNew(l, mozilla::Forward(u)); + } + + + template + void putNewInfallible(const Lookup& l, U&& u) { + impl.putNewInfallible(l, mozilla::Forward(u)); + } + + void remove(const Lookup& l) { + if (Ptr p = lookup(l)) + remove(p); + } + + + + void rekeyIfMoved(const Lookup& old_value, const T& new_value) { + if (old_value != new_value) + rekeyAs(old_value, new_value, new_value); + } + + + bool rekeyAs(const Lookup& old_lookup, const Lookup& new_lookup, const T& new_value) { + if (Ptr p = lookup(old_lookup)) { + impl.rekeyAndMaybeRehash(p, new_lookup, new_value); + return true; + } + return false; + } + + + + + + void replaceKey(Ptr p, const T& new_value) { + do { } while (0); + do { } while (0); + do { } while (0); + do { } while (0); + const_cast(*p) = new_value; + } + + + HashSet(HashSet&& rhs) : impl(mozilla::Move(rhs.impl)) {} + void operator=(HashSet&& rhs) { + do { } while (0); + impl = mozilla::Move(rhs.impl); + } + + private: + + HashSet(const HashSet& hs) = delete; + HashSet& operator=(const HashSet& hs) = delete; + + friend class Impl::Enum; +}; +# 587 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" +template +struct PointerHasher +{ + typedef Key Lookup; + static HashNumber hash(const Lookup& l) { + size_t word = reinterpret_cast(l) >> zeroBits; + static_assert(sizeof(HashNumber) == 4, + "subsequent code assumes a four-byte hash"); + + + + static_assert(sizeof(word) == 8, + "unexpected word size, new hashing strategy required to " + "properly incorporate all bits"); + return HashNumber((word >> 32) ^ word); + + } + static bool match(const Key& k, const Lookup& l) { + return k == l; + } + static void rekey(Key& k, const Key& newKey) { + k = newKey; + } +}; + + + + + +template +struct DefaultHasher +{ + typedef Key Lookup; + static HashNumber hash(const Lookup& l) { + + return l; + } + static bool match(const Key& k, const Lookup& l) { + + return k == l; + } + static void rekey(Key& k, const Key& newKey) { + k = newKey; + } +}; + + + +template +struct DefaultHasher : PointerHasher::value> +{}; + + + +template +struct DefaultHasher> +{ + using Lookup = mozilla::UniquePtr; + using PtrHasher = PointerHasher::value>; + + static HashNumber hash(const Lookup& l) { + return PtrHasher::hash(l.get()); + } + static bool match(const mozilla::UniquePtr& k, const Lookup& l) { + return PtrHasher::match(k.get(), l.get()); + } + static void rekey(mozilla::UniquePtr& k, mozilla::UniquePtr&& newKey) { + k = mozilla::Move(newKey); + } +}; + + +template <> +struct DefaultHasher +{ + typedef double Lookup; + static HashNumber hash(double d) { + static_assert(sizeof(HashNumber) == 4, + "subsequent code assumes a four-byte hash"); + uint64_t u = mozilla::BitwiseCast(d); + return HashNumber(u ^ (u >> 32)); + } + static bool match(double lhs, double rhs) { + return mozilla::BitwiseCast(lhs) == mozilla::BitwiseCast(rhs); + } +}; + +template <> +struct DefaultHasher +{ + typedef float Lookup; + static HashNumber hash(float f) { + static_assert(sizeof(HashNumber) == 4, + "subsequent code assumes a four-byte hash"); + return HashNumber(mozilla::BitwiseCast(f)); + } + static bool match(float lhs, float rhs) { + return mozilla::BitwiseCast(lhs) == mozilla::BitwiseCast(rhs); + } +}; + + +struct CStringHasher +{ + typedef const char* Lookup; + static js::HashNumber hash(Lookup l) { + return mozilla::HashString(l); + } + static bool match(const char* key, Lookup lookup) { + return strcmp(key, lookup) == 0; + } +}; +# 708 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" +template +struct FallibleHashMethods +{ + + + template static bool hasHash(Lookup&& l) { return true; } + + + + template static bool ensureHash(Lookup&& l) { return true; } +}; + +template +static bool +HasHash(Lookup&& l) { + return FallibleHashMethods::hasHash(mozilla::Forward(l)); +} + +template +static bool +EnsureHash(Lookup&& l) { + return FallibleHashMethods::ensureHash(mozilla::Forward(l)); +} +# 739 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" +template +class HashMapEntry +{ + Key key_; + Value value_; + + template friend class detail::HashTable; + template friend class detail::HashTableEntry; + template friend class HashMap; + + public: + template + HashMapEntry(KeyInput&& k, ValueInput&& v) + : key_(mozilla::Forward(k)), + value_(mozilla::Forward(v)) + {} + + HashMapEntry(HashMapEntry&& rhs) + : key_(mozilla::Move(rhs.key_)), + value_(mozilla::Move(rhs.value_)) + {} + + void operator=(HashMapEntry&& rhs) { + key_ = mozilla::Move(rhs.key_); + value_ = mozilla::Move(rhs.value_); + } + + typedef Key KeyType; + typedef Value ValueType; + + const Key& key() const { return key_; } + Key& mutableKey() { return key_; } + const Value& value() const { return value_; } + Value& value() { return value_; } + + private: + HashMapEntry(const HashMapEntry&) = delete; + void operator=(const HashMapEntry&) = delete; +}; + +} + +namespace mozilla { + +template +struct IsPod > : IsPod {}; + +template +struct IsPod > + : IntegralConstant::value && IsPod::value> +{}; + +} + +namespace js { + +namespace detail { + +template +class HashTable; + +template +class HashTableEntry +{ + template friend class HashTable; + typedef typename mozilla::RemoveConst::Type NonConstT; + + HashNumber keyHash; + mozilla::AlignedStorage2 mem; + + static const HashNumber sFreeKey = 0; + static const HashNumber sRemovedKey = 1; + static const HashNumber sCollisionBit = 1; + + static bool isLiveHash(HashNumber hash) + { + return hash > sRemovedKey; + } + + HashTableEntry(const HashTableEntry&) = delete; + void operator=(const HashTableEntry&) = delete; + ~HashTableEntry() = delete; + + public: + + + void destroyIfLive() { + if (isLive()) + mem.addr()->~T(); + } + + void destroy() { + do { } while (0); + mem.addr()->~T(); + } + + void swap(HashTableEntry* other) { + if (this == other) + return; + do { } while (0); + if (other->isLive()) { + mozilla::Swap(*mem.addr(), *other->mem.addr()); + } else { + *other->mem.addr() = mozilla::Move(*mem.addr()); + destroy(); + } + mozilla::Swap(keyHash, other->keyHash); + } + + T& get() { do { } while (0); return *mem.addr(); } + NonConstT& getMutable() { do { } while (0); return *mem.addr(); } + + bool isFree() const { return keyHash == sFreeKey; } + void clearLive() { do { } while (0); keyHash = sFreeKey; mem.addr()->~T(); } + void clear() { if (isLive()) mem.addr()->~T(); keyHash = sFreeKey; } + bool isRemoved() const { return keyHash == sRemovedKey; } + void removeLive() { do { } while (0); keyHash = sRemovedKey; mem.addr()->~T(); } + bool isLive() const { return isLiveHash(keyHash); } + void setCollision() { do { } while (0); keyHash |= sCollisionBit; } + void unsetCollision() { keyHash &= ~sCollisionBit; } + bool hasCollision() const { return keyHash & sCollisionBit; } + bool matchHash(HashNumber hn) { return (keyHash & ~sCollisionBit) == hn; } + HashNumber getKeyHash() const { return keyHash & ~sCollisionBit; } + + template + void setLive(HashNumber hn, Args&&... args) + { + do { } while (0); + keyHash = hn; + new(mem.addr()) T(mozilla::Forward(args)...); + do { } while (0); + } +}; + +template +class HashTable : private AllocPolicy +{ + friend class mozilla::ReentrancyGuard; + + typedef typename mozilla::RemoveConst::Type NonConstT; + typedef typename HashPolicy::KeyType Key; + typedef typename HashPolicy::Lookup Lookup; + + public: + typedef HashTableEntry Entry; + + + + + + class Ptr + { + friend class HashTable; + + Entry* entry_; + + const HashTable* table_; + Generation generation; + + + protected: + Ptr(Entry& entry, const HashTable& tableArg) + : entry_(&entry) + + , table_(&tableArg) + , generation(tableArg.generation()) + + {} + + public: + Ptr() + : entry_(nullptr) + + , table_(nullptr) + , generation(0) + + {} + + bool isValid() const { + return !entry_; + } + + bool found() const { + if (isValid()) + return false; + + do { } while (0); + + return entry_->isLive(); + } + + explicit operator bool() const { + return found(); + } + + bool operator==(const Ptr& rhs) const { + do { } while (0); + return entry_ == rhs.entry_; + } + + bool operator!=(const Ptr& rhs) const { + + do { } while (0); + + return !(*this == rhs); + } + + T& operator*() const { + + do { } while (0); + do { } while (0); + + return entry_->get(); + } + + T* operator->() const { + + do { } while (0); + do { } while (0); + + return &entry_->get(); + } + }; + + + class AddPtr : public Ptr + { + friend class HashTable; + HashNumber keyHash; + + uint64_t mutationCount; + + + AddPtr(Entry& entry, const HashTable& tableArg, HashNumber hn) + : Ptr(entry, tableArg) + , keyHash(hn) + + , mutationCount(tableArg.mutationCount) + + {} + + public: + AddPtr() : keyHash(0) {} + }; + + + + + + class Range + { + protected: + friend class HashTable; + + Range(const HashTable& tableArg, Entry* c, Entry* e) + : cur(c) + , end(e) + + , table_(&tableArg) + , mutationCount(tableArg.mutationCount) + , generation(tableArg.generation()) + , validEntry(true) + + { + while (cur < end && !cur->isLive()) + ++cur; + } + + Entry* cur; + Entry* end; + + const HashTable* table_; + uint64_t mutationCount; + Generation generation; + bool validEntry; + + + public: + Range() + : cur(nullptr) + , end(nullptr) + + , table_(nullptr) + , mutationCount(0) + , generation(0) + , validEntry(false) + + {} + + bool empty() const { + + do { } while (0); + do { } while (0); + + return cur == end; + } + + T& front() const { + do { } while (0); + + do { } while (0); + do { } while (0); + do { } while (0); + + return cur->get(); + } + + void popFront() { + do { } while (0); + + do { } while (0); + do { } while (0); + + while (++cur < end && !cur->isLive()) + continue; + + validEntry = true; + + } + }; + + + + + + + class Enum : public Range + { + friend class HashTable; + + HashTable& table_; + bool rekeyed; + bool removed; + + + Enum(const Enum&) = delete; + void operator=(const Enum&) = delete; + + public: + template explicit + Enum(Map& map) : Range(map.all()), table_(map.impl), rekeyed(false), removed(false) {} +# 1088 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" + void removeFront() { + table_.remove(*this->cur); + removed = true; + + this->validEntry = false; + this->mutationCount = table_.mutationCount; + + } + + NonConstT& mutableFront() { + do { } while (0); + + do { } while (0); + do { } while (0); + do { } while (0); + + return this->cur->getMutable(); + } + + + + + void rekeyFront(const Lookup& l, const Key& k) { + do { } while (0); + Ptr p(*this->cur, table_); + table_.rekeyWithoutRehash(p, l, k); + rekeyed = true; + + this->validEntry = false; + this->mutationCount = table_.mutationCount; + + } + + void rekeyFront(const Key& k) { + rekeyFront(k, k); + } + + + ~Enum() { + if (rekeyed) { + table_.gen++; + table_.checkOverRemoved(); + } + + if (removed) + table_.compactIfUnderloaded(); + } + }; + + + HashTable(HashTable&& rhs) + : AllocPolicy(rhs) + { + mozilla::PodAssign(this, &rhs); + rhs.table = nullptr; + } + void operator=(HashTable&& rhs) { + do { } while (0); + if (table) + destroyTable(*this, table, capacity()); + mozilla::PodAssign(this, &rhs); + rhs.table = nullptr; + } + + private: + + HashTable(const HashTable&) = delete; + void operator=(const HashTable&) = delete; + + private: + static const size_t CAP_BITS = 30; + + public: + uint64_t gen:56; + uint64_t hashShift:8; + Entry* table; + uint32_t entryCount; + uint32_t removedCount; + + + uint64_t mutationCount; + mutable bool mEntered; + + + mutable struct Stats + { + uint32_t searches; + uint32_t steps; + uint32_t hits; + uint32_t misses; + uint32_t addOverRemoved; + uint32_t removes; + uint32_t removeFrees; + uint32_t grows; + uint32_t shrinks; + uint32_t compresses; + uint32_t rehashes; + } stats; + + + + + + + + static const unsigned sMinCapacityLog2 = 2; + static const unsigned sMinCapacity = 1 << sMinCapacityLog2; + static const unsigned sMaxInit = ((uint32_t)1 << (CAP_BITS - 1)); + static const unsigned sMaxCapacity = ((uint32_t)1 << (CAP_BITS)); + static const unsigned sHashBits = mozilla::tl::BitSize::value; + + + + static const uint8_t sAlphaDenominator = 4; + static const uint8_t sMinAlphaNumerator = 1; + static const uint8_t sMaxAlphaNumerator = 3; + + static const HashNumber sFreeKey = Entry::sFreeKey; + static const HashNumber sRemovedKey = Entry::sRemovedKey; + static const HashNumber sCollisionBit = Entry::sCollisionBit; + + void setTableSizeLog2(unsigned sizeLog2) + { + hashShift = sHashBits - sizeLog2; + } + + static bool isLiveHash(HashNumber hash) + { + return Entry::isLiveHash(hash); + } + + static HashNumber prepareHash(const Lookup& l) + { + HashNumber keyHash = ScrambleHashCode(HashPolicy::hash(l)); + + + if (!isLiveHash(keyHash)) + keyHash -= (sRemovedKey + 1); + return keyHash & ~sCollisionBit; + } + + enum FailureBehavior { DontReportFailure = false, ReportFailure = true }; + + static Entry* createTable(AllocPolicy& alloc, uint32_t capacity, + FailureBehavior reportFailure = ReportFailure) + { + static_assert(sFreeKey == 0, + "newly-calloc'd tables have to be considered empty"); + if (reportFailure) + return alloc.template pod_calloc(capacity); + + return alloc.template maybe_pod_calloc(capacity); + } + + static Entry* maybeCreateTable(AllocPolicy& alloc, uint32_t capacity) + { + static_assert(sFreeKey == 0, + "newly-calloc'd tables have to be considered empty"); + return alloc.template maybe_pod_calloc(capacity); + } + + static void destroyTable(AllocPolicy& alloc, Entry* oldTable, uint32_t capacity) + { + Entry* end = oldTable + capacity; + for (Entry* e = oldTable; e < end; ++e) + e->destroyIfLive(); + alloc.free_(oldTable); + } + + public: + explicit HashTable(AllocPolicy ap) + : AllocPolicy(ap) + , gen(0) + , hashShift(sHashBits) + , table(nullptr) + , entryCount(0) + , removedCount(0) + + , mutationCount(0) + , mEntered(false) + + {} + + __attribute__ ((warn_unused_result)) bool init(uint32_t length) + { + do { } while (0); + + + + + if ((__builtin_expect(!!(length > sMaxInit), 0))) { + this->reportAllocOverflow(); + return false; + } + + static_assert((sMaxInit * sAlphaDenominator) / sAlphaDenominator == sMaxInit, + "multiplication in numerator below could overflow"); + static_assert(sMaxInit * sAlphaDenominator <= (4294967295U) - sMaxAlphaNumerator, + "numerator calculation below could potentially overflow"); + + + + + uint32_t newCapacity = + (length * sAlphaDenominator + sMaxAlphaNumerator - 1) / sMaxAlphaNumerator; + if (newCapacity < sMinCapacity) + newCapacity = sMinCapacity; + + + uint32_t roundUp = sMinCapacity, roundUpLog2 = sMinCapacityLog2; + while (roundUp < newCapacity) { + roundUp <<= 1; + ++roundUpLog2; + } + + newCapacity = roundUp; + do { } while (0); + do { } while (0); + + table = createTable(*this, newCapacity); + if (!table) + return false; + + setTableSizeLog2(roundUpLog2); + memset(&stats, 0, sizeof(stats)); + return true; + } + + bool initialized() const + { + return !!table; + } + + ~HashTable() + { + if (table) + destroyTable(*this, table, capacity()); + } + + private: + HashNumber hash1(HashNumber hash0) const + { + return hash0 >> hashShift; + } + + struct DoubleHash + { + HashNumber h2; + HashNumber sizeMask; + }; + + DoubleHash hash2(HashNumber curKeyHash) const + { + unsigned sizeLog2 = sHashBits - hashShift; + DoubleHash dh = { + ((curKeyHash << sizeLog2) >> hashShift) | 1, + (HashNumber(1) << sizeLog2) - 1 + }; + return dh; + } + + static HashNumber applyDoubleHash(HashNumber h1, const DoubleHash& dh) + { + return (h1 - dh.h2) & dh.sizeMask; + } + + bool overloaded() + { + static_assert(sMaxCapacity <= (4294967295U) / sMaxAlphaNumerator, + "multiplication below could overflow"); + return entryCount + removedCount >= + capacity() * sMaxAlphaNumerator / sAlphaDenominator; + } + + + static bool wouldBeUnderloaded(uint32_t capacity, uint32_t entryCount) + { + static_assert(sMaxCapacity <= (4294967295U) / sMinAlphaNumerator, + "multiplication below could overflow"); + return capacity > sMinCapacity && + entryCount <= capacity * sMinAlphaNumerator / sAlphaDenominator; + } + + bool underloaded() + { + return wouldBeUnderloaded(capacity(), entryCount); + } + + static __attribute__((always_inline)) inline bool match(Entry& e, const Lookup& l) + { + return HashPolicy::match(HashPolicy::getKey(e.get()), l); + } + + + + + + + __attribute__((always_inline)) inline Entry& + lookup(const Lookup& l, HashNumber keyHash, unsigned collisionBit) const + { + do { } while (0); + do { } while (0); + do { } while (0); + do { } while (0); + stats.searches++; + + + HashNumber h1 = hash1(keyHash); + Entry* entry = &table[h1]; + + + if (entry->isFree()) { + stats.misses++; + return *entry; + } + + + if (entry->matchHash(keyHash) && match(*entry, l)) { + stats.hits++; + return *entry; + } + + + DoubleHash dh = hash2(keyHash); + + + Entry* firstRemoved = nullptr; + + while (true) { + if ((__builtin_expect(!!(entry->isRemoved()), 0))) { + if (!firstRemoved) + firstRemoved = entry; + } else { + if (collisionBit == sCollisionBit) + entry->setCollision(); + } + + stats.steps++; + h1 = applyDoubleHash(h1, dh); + + entry = &table[h1]; + if (entry->isFree()) { + stats.misses++; + return firstRemoved ? *firstRemoved : *entry; + } + + if (entry->matchHash(keyHash) && match(*entry, l)) { + stats.hits++; + return *entry; + } + } + } + + + + + + + + Entry& findFreeEntry(HashNumber keyHash) + { + do { } while (0); + do { } while (0); + stats.searches++; + + + + + HashNumber h1 = hash1(keyHash); + Entry* entry = &table[h1]; + + + if (!entry->isLive()) { + stats.misses++; + return *entry; + } + + + DoubleHash dh = hash2(keyHash); + + while (true) { + do { } while (0); + entry->setCollision(); + + stats.steps++; + h1 = applyDoubleHash(h1, dh); + + entry = &table[h1]; + if (!entry->isLive()) { + stats.misses++; + return *entry; + } + } + } + + enum RebuildStatus { NotOverloaded, Rehashed, RehashFailed }; + + RebuildStatus changeTableSize(int deltaLog2, FailureBehavior reportFailure = ReportFailure) + { + + Entry* oldTable = table; + uint32_t oldCap = capacity(); + uint32_t newLog2 = sHashBits - hashShift + deltaLog2; + uint32_t newCapacity = ((uint32_t)1 << (newLog2)); + if ((__builtin_expect(!!(newCapacity > sMaxCapacity), 0))) { + if (reportFailure) + this->reportAllocOverflow(); + return RehashFailed; + } + + Entry* newTable = createTable(*this, newCapacity, reportFailure); + if (!newTable) + return RehashFailed; + + + setTableSizeLog2(newLog2); + removedCount = 0; + gen++; + table = newTable; + + + Entry* end = oldTable + oldCap; + for (Entry* src = oldTable; src < end; ++src) { + if (src->isLive()) { + HashNumber hn = src->getKeyHash(); + findFreeEntry(hn).setLive( + hn, mozilla::Move(const_cast(src->get()))); + src->destroy(); + } + } + + + this->free_(oldTable); + return Rehashed; + } + + bool shouldCompressTable() + { + + return removedCount >= (capacity() >> 2); + } + + RebuildStatus checkOverloaded(FailureBehavior reportFailure = ReportFailure) + { + if (!overloaded()) + return NotOverloaded; + + int deltaLog2; + if (shouldCompressTable()) { + stats.compresses++; + deltaLog2 = 0; + } else { + stats.grows++; + deltaLog2 = 1; + } + + return changeTableSize(deltaLog2, reportFailure); + } + + + void checkOverRemoved() + { + if (overloaded()) { + if (checkOverloaded(DontReportFailure) == RehashFailed) + rehashTableInPlace(); + } + } + + void remove(Entry& e) + { + do { } while (0); + stats.removes++; + + if (e.hasCollision()) { + e.removeLive(); + removedCount++; + } else { + stats.removeFrees++; + e.clearLive(); + } + entryCount--; + + mutationCount++; + + } + + void checkUnderloaded() + { + if (underloaded()) { + stats.shrinks++; + (void) changeTableSize(-1, DontReportFailure); + } + } + + + + + void compactIfUnderloaded() + { + int32_t resizeLog2 = 0; + uint32_t newCapacity = capacity(); + while (wouldBeUnderloaded(newCapacity, entryCount)) { + newCapacity = newCapacity >> 1; + resizeLog2--; + } + + if (resizeLog2 != 0) + (void) changeTableSize(resizeLog2, DontReportFailure); + } + + + + + + + void rehashTableInPlace() + { + stats.rehashes++; + removedCount = 0; + for (size_t i = 0; i < capacity(); ++i) + table[i].unsetCollision(); + + for (size_t i = 0; i < capacity();) { + Entry* src = &table[i]; + + if (!src->isLive() || src->hasCollision()) { + ++i; + continue; + } + + HashNumber keyHash = src->getKeyHash(); + HashNumber h1 = hash1(keyHash); + DoubleHash dh = hash2(keyHash); + Entry* tgt = &table[h1]; + while (true) { + if (!tgt->hasCollision()) { + src->swap(tgt); + tgt->setCollision(); + break; + } + + h1 = applyDoubleHash(h1, dh); + tgt = &table[h1]; + } + } + + + + + + + } + + + + + + + template + void putNewInfallibleInternal(const Lookup& l, Args&&... args) + { + do { } while (0); + + HashNumber keyHash = prepareHash(l); + Entry* entry = &findFreeEntry(keyHash); + do { } while (0); + + if (entry->isRemoved()) { + stats.addOverRemoved++; + removedCount--; + keyHash |= sCollisionBit; + } + + entry->setLive(keyHash, mozilla::Forward(args)...); + entryCount++; + + mutationCount++; + + } + + public: + void clear() + { + if (mozilla::IsPod::value) { + memset(table, 0, sizeof(*table) * capacity()); + } else { + uint32_t tableCapacity = capacity(); + Entry* end = table + tableCapacity; + for (Entry* e = table; e < end; ++e) + e->clear(); + } + removedCount = 0; + entryCount = 0; + + mutationCount++; + + } + + void clearAndShrink() + { + clear(); + compactIfUnderloaded(); + } + + void finish() + { + + do { } while (0); + + if (!table) + return; + + destroyTable(*this, table, capacity()); + table = nullptr; + gen++; + entryCount = 0; + removedCount = 0; + + mutationCount++; + + } + + Range all() const + { + do { } while (0); + return Range(*this, table, table + capacity()); + } + + bool empty() const + { + do { } while (0); + return !entryCount; + } + + uint32_t count() const + { + do { } while (0); + return entryCount; + } + + uint32_t capacity() const + { + do { } while (0); + return ((uint32_t)1 << (sHashBits - hashShift)); + } + + Generation generation() const + { + do { } while (0); + return Generation(gen); + } + + size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const + { + return mallocSizeOf(table); + } + + size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const + { + return mallocSizeOf(this) + sizeOfExcludingThis(mallocSizeOf); + } + + __attribute__((always_inline)) inline Ptr lookup(const Lookup& l) const + { + mozilla::ReentrancyGuard g(*this); + if (!HasHash(l)) + return Ptr(); + HashNumber keyHash = prepareHash(l); + return Ptr(lookup(l, keyHash, 0), *this); + } + + __attribute__((always_inline)) inline Ptr readonlyThreadsafeLookup(const Lookup& l) const + { + if (!HasHash(l)) + return Ptr(); + HashNumber keyHash = prepareHash(l); + return Ptr(lookup(l, keyHash, 0), *this); + } + + __attribute__((always_inline)) inline AddPtr lookupForAdd(const Lookup& l) const + { + mozilla::ReentrancyGuard g(*this); + if (!EnsureHash(l)) + return AddPtr(); + HashNumber keyHash = prepareHash(l); + Entry& entry = lookup(l, keyHash, sCollisionBit); + AddPtr p(entry, *this, keyHash); + return p; + } + + template + __attribute__ ((warn_unused_result)) bool add(AddPtr& p, Args&&... args) + { + mozilla::ReentrancyGuard g(*this); + do { } while (0); + do { } while (0); + do { } while (0); + + + if (p.isValid()) + return false; + + + + if (p.entry_->isRemoved()) { + if (!this->checkSimulatedOOM()) + return false; + stats.addOverRemoved++; + removedCount--; + p.keyHash |= sCollisionBit; + } else { + + RebuildStatus status = checkOverloaded(); + if (status == RehashFailed) + return false; + if (status == NotOverloaded && !this->checkSimulatedOOM()) + return false; + if (status == Rehashed) + p.entry_ = &findFreeEntry(p.keyHash); + } + + p.entry_->setLive(p.keyHash, mozilla::Forward(args)...); + entryCount++; + + mutationCount++; + p.generation = generation(); + p.mutationCount = mutationCount; + + return true; + } + + + + template + void putNewInfallible(const Lookup& l, Args&&... args) + { + do { } while (0); + mozilla::ReentrancyGuard g(*this); + putNewInfallibleInternal(l, mozilla::Forward(args)...); + } + + + + template + __attribute__ ((warn_unused_result)) bool putNew(const Lookup& l, Args&&... args) + { + if (!this->checkSimulatedOOM()) + return false; + + if (!EnsureHash(l)) + return false; + + if (checkOverloaded() == RehashFailed) + return false; + + putNewInfallible(l, mozilla::Forward(args)...); + return true; + } + + + + template + __attribute__ ((warn_unused_result)) bool relookupOrAdd(AddPtr& p, const Lookup& l, Args&&... args) + { + + if (p.isValid()) + return false; + + + p.generation = generation(); + p.mutationCount = mutationCount; + + { + mozilla::ReentrancyGuard g(*this); + do { } while (0); + p.entry_ = &lookup(l, p.keyHash, sCollisionBit); + } + return p.found() || add(p, mozilla::Forward(args)...); + } + + void remove(Ptr p) + { + do { } while (0); + mozilla::ReentrancyGuard g(*this); + do { } while (0); + remove(*p.entry_); + checkUnderloaded(); + } + + void rekeyWithoutRehash(Ptr p, const Lookup& l, const Key& k) + { + do { } while (0); + mozilla::ReentrancyGuard g(*this); + do { } while (0); + typename HashTableEntry::NonConstT t(mozilla::Move(*p)); + HashPolicy::setKey(t, const_cast(k)); + remove(*p.entry_); + putNewInfallibleInternal(l, mozilla::Move(t)); + } + + void rekeyAndMaybeRehash(Ptr p, const Lookup& l, const Key& k) + { + rekeyWithoutRehash(p, l, k); + checkOverRemoved(); + } + + +}; + +} +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" 2 + + + +class JSTracer; + +namespace JS { +class CallbackTracer; +template class Heap; +template class TenuredHeap; + + +const char* +GCTraceKindToAscii(JS::TraceKind kind); + +} + +enum WeakMapTraceKind { + + + + + DoNotTraceWeakMaps, + + + + + + ExpandWeakMaps, + + + + + + TraceWeakMapValues, + + + + + + TraceWeakMapKeysValues +}; + +class JSTracer +{ + public: + + JSRuntime* runtime() const { return runtime_; } + + + WeakMapTraceKind weakMapAction() const { return weakMapAction_; } + + enum class TracerKindTag { + + + + Marking, + + + + + + WeakMarking, + + + + Tenuring, + + + + Callback + }; + bool isMarkingTracer() const { return tag_ == TracerKindTag::Marking || tag_ == TracerKindTag::WeakMarking; } + bool isWeakMarkingTracer() const { return tag_ == TracerKindTag::WeakMarking; } + bool isTenuringTracer() const { return tag_ == TracerKindTag::Tenuring; } + bool isCallbackTracer() const { return tag_ == TracerKindTag::Callback; } + inline JS::CallbackTracer* asCallbackTracer(); + bool traceWeakEdges() const { return traceWeakEdges_; } + + + + + protected: + JSTracer(JSRuntime* rt, TracerKindTag tag, + WeakMapTraceKind weakTraceKind = TraceWeakMapValues) + : runtime_(rt) + , weakMapAction_(weakTraceKind) + + + + , tag_(tag) + , traceWeakEdges_(true) + {} +# 113 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" + private: + JSRuntime* runtime_; + WeakMapTraceKind weakMapAction_; + + + + + protected: + TracerKindTag tag_; + bool traceWeakEdges_; +}; + +namespace JS { + +class AutoTracingName; +class AutoTracingIndex; +class AutoTracingCallback; + +class CallbackTracer : public JSTracer +{ + public: + CallbackTracer(JSRuntime* rt, WeakMapTraceKind weakTraceKind = TraceWeakMapValues) + : JSTracer(rt, JSTracer::TracerKindTag::Callback, weakTraceKind), + contextName_(nullptr), contextIndex_(InvalidIndex), contextFunctor_(nullptr) + {} + CallbackTracer(JSContext* cx, WeakMapTraceKind weakTraceKind = TraceWeakMapValues); + + + + + + + virtual void onObjectEdge(JSObject** objp) { onChild(JS::GCCellPtr(*objp)); } + virtual void onStringEdge(JSString** strp) { onChild(JS::GCCellPtr(*strp)); } + virtual void onSymbolEdge(JS::Symbol** symp) { onChild(JS::GCCellPtr(*symp)); } + virtual void onScriptEdge(JSScript** scriptp) { onChild(JS::GCCellPtr(*scriptp)); } + virtual void onShapeEdge(js::Shape** shapep) { + onChild(JS::GCCellPtr(*shapep, JS::TraceKind::Shape)); + } + virtual void onObjectGroupEdge(js::ObjectGroup** groupp) { + onChild(JS::GCCellPtr(*groupp, JS::TraceKind::ObjectGroup)); + } + virtual void onBaseShapeEdge(js::BaseShape** basep) { + onChild(JS::GCCellPtr(*basep, JS::TraceKind::BaseShape)); + } + virtual void onJitCodeEdge(js::jit::JitCode** codep) { + onChild(JS::GCCellPtr(*codep, JS::TraceKind::JitCode)); + } + virtual void onLazyScriptEdge(js::LazyScript** lazyp) { + onChild(JS::GCCellPtr(*lazyp, JS::TraceKind::LazyScript)); + } + virtual void onScopeEdge(js::Scope** scopep) { + onChild(JS::GCCellPtr(*scopep, JS::TraceKind::Scope)); + } + virtual void onRegExpSharedEdge(js::RegExpShared** sharedp) { + onChild(JS::GCCellPtr(*sharedp, JS::TraceKind::RegExpShared)); + } + + + + virtual void onChild(const JS::GCCellPtr& thing) = 0; +# 195 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" + const char* contextName() const { do { } while (0); return contextName_; } + + + + + const static size_t InvalidIndex = size_t(-1); + size_t contextIndex() const { return contextIndex_; } + + + + + + + void getTracingEdgeName(char* buffer, size_t bufferSize); + + + + + + + class ContextFunctor { + public: + virtual void operator()(CallbackTracer* trc, char* buf, size_t bufsize) = 0; + }; +# 230 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" + void dispatchToOnEdge(JSObject** objp) { onObjectEdge(objp); } + void dispatchToOnEdge(JSString** strp) { onStringEdge(strp); } + void dispatchToOnEdge(JS::Symbol** symp) { onSymbolEdge(symp); } + void dispatchToOnEdge(JSScript** scriptp) { onScriptEdge(scriptp); } + void dispatchToOnEdge(js::Shape** shapep) { onShapeEdge(shapep); } + void dispatchToOnEdge(js::ObjectGroup** groupp) { onObjectGroupEdge(groupp); } + void dispatchToOnEdge(js::BaseShape** basep) { onBaseShapeEdge(basep); } + void dispatchToOnEdge(js::jit::JitCode** codep) { onJitCodeEdge(codep); } + void dispatchToOnEdge(js::LazyScript** lazyp) { onLazyScriptEdge(lazyp); } + void dispatchToOnEdge(js::Scope** scopep) { onScopeEdge(scopep); } + void dispatchToOnEdge(js::RegExpShared** sharedp) { onRegExpSharedEdge(sharedp); } + + protected: + void setTraceWeakEdges(bool value) { + traceWeakEdges_ = value; + } + + private: + friend class AutoTracingName; + const char* contextName_; + + friend class AutoTracingIndex; + size_t contextIndex_; + + friend class AutoTracingDetails; + ContextFunctor* contextFunctor_; +}; + + +class AutoTracingName +{ + CallbackTracer* trc_; + const char* prior_; + + public: + AutoTracingName(CallbackTracer* trc, const char* name) : trc_(trc), prior_(trc->contextName_) { + do { } while (0); + trc->contextName_ = name; + } + ~AutoTracingName() { + do { } while (0); + trc_->contextName_ = prior_; + } +}; + + +class AutoTracingIndex +{ + CallbackTracer* trc_; + + public: + explicit AutoTracingIndex(JSTracer* trc, size_t initial = 0) : trc_(nullptr) { + if (trc->isCallbackTracer()) { + trc_ = trc->asCallbackTracer(); + do { } while (0); + trc_->contextIndex_ = initial; + } + } + ~AutoTracingIndex() { + if (trc_) { + do { } while (0); + trc_->contextIndex_ = CallbackTracer::InvalidIndex; + } + } + + void operator++() { + if (trc_) { + do { } while (0); + ++trc_->contextIndex_; + } + } +}; + + + +class AutoTracingDetails +{ + CallbackTracer* trc_; + + public: + AutoTracingDetails(JSTracer* trc, CallbackTracer::ContextFunctor& func) : trc_(nullptr) { + if (trc->isCallbackTracer()) { + trc_ = trc->asCallbackTracer(); + do { } while (0); + trc_->contextFunctor_ = &func; + } + } + ~AutoTracingDetails() { + if (trc_) { + do { } while (0); + trc_->contextFunctor_ = nullptr; + } + } +}; + +} + +JS::CallbackTracer* +JSTracer::asCallbackTracer() +{ + do { } while (0); + return static_cast(this); +} + +namespace JS { +# 350 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" +template +extern void +TraceEdge(JSTracer* trc, JS::Heap* edgep, const char* name); + +extern void +TraceEdge(JSTracer* trc, JS::TenuredHeap* edgep, const char* name); + + + + + + + +template +extern void +UnsafeTraceRoot(JSTracer* trc, T* edgep, const char* name); + +extern void +TraceChildren(JSTracer* trc, GCCellPtr thing); + +using ZoneSet = js::HashSet, js::SystemAllocPolicy>; +using CompartmentSet = js::HashSet, + js::SystemAllocPolicy>; + + + + + + +extern void +TraceIncomingCCWs(JSTracer* trc, const JS::CompartmentSet& compartments); + +} + +extern void +JS_GetTraceThingInfo(char* buf, size_t bufsize, JSTracer* trc, + void* thing, JS::TraceKind kind, bool includeDetails); + +namespace js { + + + + + + +template +extern void +UnsafeTraceManuallyBarrieredEdge(JSTracer* trc, T* edgep, const char* name); + +namespace gc { + + +template +extern bool +EdgeNeedsSweep(JS::Heap* edgep); + + + +template +bool +IsAboutToBeFinalizedUnbarriered(T* thingp); + +} +} +# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCPolicyAPI.h" 2 +# 65 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCPolicyAPI.h" +class JSAtom; +class JSFunction; +class JSObject; +class JSScript; +class JSString; +namespace JS { +class Symbol; +} + +namespace JS { + + + +template +struct StructGCPolicy +{ + static T initial() { + return T(); + } + + static void trace(JSTracer* trc, T* tp, const char* name) { + tp->trace(trc); + } + + static void sweep(T* tp) { + return tp->sweep(); + } + + static bool needsSweep(T* tp) { + return tp->needsSweep(); + } +}; + + + + + +template struct GCPolicy : public StructGCPolicy {}; + + +template +struct IgnoreGCPolicy { + static T initial() { return T(); } + static void trace(JSTracer* trc, T* t, const char* name) {} + static bool needsSweep(T* v) { return false; } +}; +template <> struct GCPolicy : public IgnoreGCPolicy {}; +template <> struct GCPolicy : public IgnoreGCPolicy {}; + +template +struct GCPointerPolicy +{ + static T initial() { return nullptr; } + static void trace(JSTracer* trc, T* vp, const char* name) { + if (*vp) + js::UnsafeTraceManuallyBarrieredEdge(trc, vp, name); + } + static bool needsSweep(T* vp) { + if (*vp) + return js::gc::IsAboutToBeFinalizedUnbarriered(vp); + return false; + } +}; +template <> struct GCPolicy : public GCPointerPolicy {}; +template <> struct GCPolicy : public GCPointerPolicy {}; +template <> struct GCPolicy : public GCPointerPolicy {}; +template <> struct GCPolicy : public GCPointerPolicy {}; +template <> struct GCPolicy : public GCPointerPolicy {}; +template <> struct GCPolicy : public GCPointerPolicy {}; + +template +struct GCPolicy> +{ + static void trace(JSTracer* trc, JS::Heap* thingp, const char* name) { + TraceEdge(trc, thingp, name); + } + static bool needsSweep(JS::Heap* thingp) { + return js::gc::EdgeNeedsSweep(thingp); + } +}; + + +template +struct GCPolicy> +{ + static mozilla::UniquePtr initial() { return mozilla::UniquePtr(); } + static void trace(JSTracer* trc, mozilla::UniquePtr* tp, const char* name) { + if (tp->get()) + GCPolicy::trace(trc, tp->get(), name); + } + static bool needsSweep(mozilla::UniquePtr* tp) { + if (tp->get()) + return GCPolicy::needsSweep(tp->get()); + return false; + } +}; + +} +# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 2 +# 110 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +namespace js { + +template +struct BarrierMethods { +}; + +template +class WrappedPtrOperations {}; + +template +class MutableWrappedPtrOperations : public WrappedPtrOperations {}; + +template +class RootedBase : public MutableWrappedPtrOperations {}; + +template +class HandleBase : public WrappedPtrOperations {}; + +template +class MutableHandleBase : public MutableWrappedPtrOperations {}; + +template +class HeapBase : public MutableWrappedPtrOperations {}; + + +template struct IsHeapConstructibleType { static constexpr bool value = false; }; + + +template <> struct IsHeapConstructibleType { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType { static constexpr bool value = true; }; +template <> struct IsHeapConstructibleType { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType { static constexpr bool value = true; }; + + +template +class PersistentRootedBase : public MutableWrappedPtrOperations {}; + +namespace gc { +struct Cell; +template +struct PersistentRootedMarker; +} +# 182 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +} + +namespace JS { + +template class Rooted; +template class PersistentRooted; + + +bool isGCEnabled(); + +void HeapObjectPostBarrier(JSObject** objp, JSObject* prev, JSObject* next); + + + + + + +extern void +AssertGCThingMustBeTenured(JSObject* obj); +extern void +AssertGCThingIsNotAnObjectSubclass(js::gc::Cell* cell); +# 229 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +class Heap : public js::HeapBase> +{ + + static_assert(js::IsHeapConstructibleType::value, + "Type T must be a public GC pointer type"); + public: + using ElementType = T; + + Heap() { + static_assert(sizeof(T) == sizeof(Heap), + "Heap must be binary compatible with T."); + init(GCPolicy::initial()); + } + explicit Heap(const T& p) { init(p); } + + + + + + + + explicit Heap(const Heap& p) { init(p.ptr); } + + ~Heap() { + post(ptr, GCPolicy::initial()); + } + + operator const T&() const { return get(); } const T& operator->() const { return get(); }; + Heap& operator=(const T& p) { set(p); return *this; } Heap& operator=(const Heap& other) { set(other.get()); return *this; }; + + const T* address() const { return &ptr; } + + void exposeToActiveJS() const { + js::BarrierMethods::exposeToJS(ptr); + } + const T& get() const { + exposeToActiveJS(); + return ptr; + } + const T& unbarrieredGet() const { + return ptr; + } + + T* unsafeGet() { return &ptr; } + + explicit operator bool() const { + return bool(js::BarrierMethods::asGCThingOrNull(ptr)); + } + explicit operator bool() { + return bool(js::BarrierMethods::asGCThingOrNull(ptr)); + } + + private: + void init(const T& newPtr) { + ptr = newPtr; + post(GCPolicy::initial(), ptr); + } + + void set(const T& newPtr) { + T tmp = ptr; + ptr = newPtr; + post(tmp, ptr); + } + + void post(const T& prev, const T& next) { + js::BarrierMethods::postBarrier(&ptr, prev, next); + } + + T ptr; +}; + +static __attribute__((always_inline)) inline bool +ObjectIsTenured(JSObject* obj) +{ + return !js::gc::IsInsideNursery(reinterpret_cast(obj)); +} + +static __attribute__((always_inline)) inline bool +ObjectIsTenured(const Heap& obj) +{ + return ObjectIsTenured(obj.unbarrieredGet()); +} + +static __attribute__((always_inline)) inline bool +ObjectIsMarkedGray(JSObject* obj) +{ + auto cell = reinterpret_cast(obj); + return js::gc::detail::CellIsMarkedGrayIfKnown(cell); +} + +static __attribute__((always_inline)) inline bool +ObjectIsMarkedGray(const JS::Heap& obj) +{ + return ObjectIsMarkedGray(obj.unbarrieredGet()); +} +# 380 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +class TenuredHeap : public js::HeapBase> +{ + public: + using ElementType = T; + + TenuredHeap() : bits(0) { + static_assert(sizeof(T) == sizeof(TenuredHeap), + "TenuredHeap must be binary compatible with T."); + } + explicit TenuredHeap(T p) : bits(0) { setPtr(p); } + explicit TenuredHeap(const TenuredHeap& p) : bits(0) { setPtr(p.getPtr()); } + + void setPtr(T newPtr) { + do { } while (0); + if (newPtr) + AssertGCThingMustBeTenured(newPtr); + bits = (bits & flagsMask) | reinterpret_cast(newPtr); + } + + void setFlags(uintptr_t flagsToSet) { + do { } while (0); + bits |= flagsToSet; + } + + void unsetFlags(uintptr_t flagsToUnset) { + do { } while (0); + bits &= ~flagsToUnset; + } + + bool hasFlag(uintptr_t flag) const { + do { } while (0); + return (bits & flag) != 0; + } + + T unbarrieredGetPtr() const { return reinterpret_cast(bits & ~flagsMask); } + uintptr_t getFlags() const { return bits & flagsMask; } + + void exposeToActiveJS() const { + js::BarrierMethods::exposeToJS(unbarrieredGetPtr()); + } + T getPtr() const { + exposeToActiveJS(); + return unbarrieredGetPtr(); + } + + operator T() const { return getPtr(); } + T operator->() const { return getPtr(); } + + explicit operator bool() const { + return bool(js::BarrierMethods::asGCThingOrNull(unbarrieredGetPtr())); + } + explicit operator bool() { + return bool(js::BarrierMethods::asGCThingOrNull(unbarrieredGetPtr())); + } + + TenuredHeap& operator=(T p) { + setPtr(p); + return *this; + } + + TenuredHeap& operator=(const TenuredHeap& other) { + bits = other.bits; + return *this; + } + + private: + enum { + maskBits = 3, + flagsMask = (1 << maskBits) - 1, + }; + + uintptr_t bits; +}; +# 463 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +class Handle : public js::HandleBase> +{ + friend class JS::MutableHandle; + + public: + using ElementType = T; + + + template + Handle(Handle handle, + typename mozilla::EnableIf::value, int>::Type dummy = 0) + { + static_assert(sizeof(Handle) == sizeof(T*), + "Handle must be binary compatible with T*."); + ptr = reinterpret_cast(handle.address()); + } + + Handle(decltype(nullptr)) { + static_assert(mozilla::IsPointer::value, + "nullptr_t overload not valid for non-pointer types"); + static void* const ConstNullValue = nullptr; + ptr = reinterpret_cast(&ConstNullValue); + } + + Handle(MutableHandle handle) { + ptr = handle.address(); + } +# 507 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" + static constexpr Handle fromMarkedLocation(const T* p) { + return Handle(p, DeliberatelyChoosingThisOverload, + ImUsingThisOnlyInFromFromMarkedLocation); + } + + + + + + template + inline + Handle(const Rooted& root, + typename mozilla::EnableIf::value, int>::Type dummy = 0); + + template + inline + Handle(const PersistentRooted& root, + typename mozilla::EnableIf::value, int>::Type dummy = 0); + + + template + inline + Handle(MutableHandle& root, + typename mozilla::EnableIf::value, int>::Type dummy = 0); + + operator const T&() const { return get(); } const T& operator->() const { return get(); }; + const T* address() const { return &(*ptr); } const T& get() const { return (*ptr); }; + + private: + Handle() {} + template Handle& operator=(S) = delete; Handle& operator=(const Handle&) = delete;; + + enum Disambiguator { DeliberatelyChoosingThisOverload = 42 }; + enum CallerIdentity { ImUsingThisOnlyInFromFromMarkedLocation = 17 }; + constexpr Handle(const T* p, Disambiguator, CallerIdentity) : ptr(p) {} + + const T* ptr; +}; +# 554 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +class MutableHandle : public js::MutableHandleBase> +{ + public: + using ElementType = T; + + inline MutableHandle(Rooted* root); + inline MutableHandle(PersistentRooted* root); + + private: + + MutableHandle(decltype(nullptr)) = delete; + + public: + void set(const T& v) { + *ptr = v; + } +# 579 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" + static MutableHandle fromMarkedLocation(T* p) { + MutableHandle h; + h.ptr = p; + return h; + } + + operator const T&() const { return get(); } const T& operator->() const { return get(); }; + const T* address() const { return &(*ptr); } const T& get() const { return (*ptr); }; + T* address() { return &(*ptr); } T& get() { return (*ptr); }; + + private: + MutableHandle() {} + template MutableHandle& operator=(S) = delete; MutableHandle& operator=(const MutableHandle&) = delete;; + + T* ptr; +}; + +} + +namespace js { + +template +struct BarrierMethods +{ + static T* initial() { return nullptr; } + static gc::Cell* asGCThingOrNull(T* v) { + if (!v) + return nullptr; + do { } while (0); + return reinterpret_cast(v); + } + static void postBarrier(T** vp, T* prev, T* next) { + if (next) + JS::AssertGCThingIsNotAnObjectSubclass(reinterpret_cast(next)); + } + static void exposeToJS(T* t) { + if (t) + js::gc::ExposeGCThingToActiveJS(JS::GCCellPtr(t)); + } +}; + +template <> +struct BarrierMethods +{ + static JSObject* initial() { return nullptr; } + static gc::Cell* asGCThingOrNull(JSObject* v) { + if (!v) + return nullptr; + do { } while (0); + return reinterpret_cast(v); + } + static void postBarrier(JSObject** vp, JSObject* prev, JSObject* next) { + JS::HeapObjectPostBarrier(vp, prev, next); + } + static void exposeToJS(JSObject* obj) { + if (obj) + JS::ExposeObjectToActiveJS(obj); + } +}; + +template <> +struct BarrierMethods +{ + static JSFunction* initial() { return nullptr; } + static gc::Cell* asGCThingOrNull(JSFunction* v) { + if (!v) + return nullptr; + do { } while (0); + return reinterpret_cast(v); + } + static void postBarrier(JSFunction** vp, JSFunction* prev, JSFunction* next) { + JS::HeapObjectPostBarrier(reinterpret_cast(vp), + reinterpret_cast(prev), + reinterpret_cast(next)); + } + static void exposeToJS(JSFunction* fun) { + if (fun) + JS::ExposeObjectToActiveJS(reinterpret_cast(fun)); + } +}; +# 671 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +struct MovableCellHasher +{ + using Key = T; + using Lookup = T; + + static bool hasHash(const Lookup& l); + static bool ensureHash(const Lookup& l); + static HashNumber hash(const Lookup& l); + static bool match(const Key& k, const Lookup& l); + static void rekey(Key& k, const Key& newKey) { k = newKey; } +}; + +template +struct MovableCellHasher> +{ + using Key = JS::Heap; + using Lookup = T; + + static bool hasHash(const Lookup& l) { return MovableCellHasher::hasHash(l); } + static bool ensureHash(const Lookup& l) { return MovableCellHasher::ensureHash(l); } + static HashNumber hash(const Lookup& l) { return MovableCellHasher::hash(l); } + static bool match(const Key& k, const Lookup& l) { + return MovableCellHasher::match(k.unbarrieredGet(), l); + } + static void rekey(Key& k, const Key& newKey) { k.unsafeSet(newKey); } +}; + +template +struct FallibleHashMethods> +{ + template static bool hasHash(Lookup&& l) { + return MovableCellHasher::hasHash(mozilla::Forward(l)); + } + template static bool ensureHash(Lookup&& l) { + return MovableCellHasher::ensureHash(mozilla::Forward(l)); + } +}; + +} + +namespace js { +# 722 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +class alignas(8) DispatchWrapper +{ + static_assert(JS::MapTypeToRootKind::kind == JS::RootKind::Traceable, + "DispatchWrapper is intended only for usage with a Traceable"); + + using TraceFn = void (*)(JSTracer*, T*, const char*); + TraceFn tracer; + alignas(gc::CellSize) T storage; + + public: + template + DispatchWrapper(U&& initial) + : tracer(&JS::GCPolicy::trace), + storage(mozilla::Forward(initial)) + { } + + + T* operator &() { return &storage; } + const T* operator &() const { return &storage; } + operator T&() { return storage; } + operator const T&() const { return storage; } + + + + static void TraceWrapped(JSTracer* trc, T* thingp, const char* name) { + auto wrapper = reinterpret_cast( + uintptr_t(thingp) - __builtin_offsetof(DispatchWrapper, storage)); + wrapper->tracer(trc, &wrapper->storage, name); + } +}; + +} + +namespace JS { +# 766 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +class Rooted : public js::RootedBase> +{ + inline void registerWithRootLists(RootedListHeads& roots) { + this->stack = &roots[JS::MapTypeToRootKind::kind]; + this->prev = *stack; + *stack = reinterpret_cast*>(this); + } + + inline RootedListHeads& rootLists(RootingContext* cx) { + return cx->stackRoots_; + } + inline RootedListHeads& rootLists(JSContext* cx) { + return rootLists(RootingContext::get(cx)); + } + + public: + using ElementType = T; + + template + explicit Rooted(const RootingContext& cx) + : ptr(GCPolicy::initial()) + { + registerWithRootLists(rootLists(cx)); + } + + template + Rooted(const RootingContext& cx, S&& initial) + : ptr(mozilla::Forward(initial)) + { + registerWithRootLists(rootLists(cx)); + } + + ~Rooted() { + do { } while (0); + *stack = prev; + } + + Rooted* previous() { return reinterpret_cast*>(prev); } + + + + + + void set(const T& value) { + ptr = value; + } + + operator const T&() const { return get(); } const T& operator->() const { return get(); }; + Rooted& operator=(const T& p) { set(p); return *this; } Rooted& operator=(const Rooted& other) { set(other.get()); return *this; }; + const T* address() const { return &(ptr); } const T& get() const { return (ptr); }; + T* address() { return &(ptr); } T& get() { return (ptr); }; + + private: + + + + + + Rooted** stack; + Rooted* prev; +# 836 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" + using MaybeWrapped = typename mozilla::Conditional< + MapTypeToRootKind::kind == JS::RootKind::Traceable, + js::DispatchWrapper, + T>::Type; + MaybeWrapped ptr; + + Rooted(const Rooted&) = delete; +} ; + +} + +namespace js { +# 859 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +class RootedBase : public MutableWrappedPtrOperations +{ + public: + template + JS::Handle as() const; +}; +# 877 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +class HandleBase : public WrappedPtrOperations +{ + public: + template + JS::Handle as() const; +}; + + +template +class FakeRooted : public RootedBase> +{ + public: + using ElementType = T; + + template + explicit FakeRooted(CX* cx) : ptr(JS::GCPolicy::initial()) {} + + template + FakeRooted(CX* cx, T initial) : ptr(initial) {} + + operator const T&() const { return get(); } const T& operator->() const { return get(); }; + FakeRooted& operator=(const T& p) { set(p); return *this; } FakeRooted& operator=(const FakeRooted& other) { set(other.get()); return *this; }; + const T* address() const { return &(ptr); } const T& get() const { return (ptr); }; + T* address() { return &(ptr); } T& get() { return (ptr); }; + + private: + T ptr; + + void set(const T& value) { + ptr = value; + } + + FakeRooted(const FakeRooted&) = delete; +}; + + +template +class FakeMutableHandle : public js::MutableHandleBase> +{ + public: + using ElementType = T; + + FakeMutableHandle(T* t) { + ptr = t; + } + + FakeMutableHandle(FakeRooted* root) { + ptr = root->address(); + } + + void set(const T& v) { + *ptr = v; + } + + operator const T&() const { return get(); } const T& operator->() const { return get(); }; + const T* address() const { return &(*ptr); } const T& get() const { return (*ptr); }; + T* address() { return &(*ptr); } T& get() { return (*ptr); }; + + private: + FakeMutableHandle() {} + template FakeMutableHandle& operator=(S) = delete; FakeMutableHandle& operator=(const FakeMutableHandle&) = delete;; + + T* ptr; +}; +# 952 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +enum AllowGC { + NoGC = 0, + CanGC = 1 +}; +template +class MaybeRooted +{ +}; + +template class MaybeRooted +{ + public: + typedef JS::Handle HandleType; + typedef JS::Rooted RootType; + typedef JS::MutableHandle MutableHandleType; + + static inline JS::Handle toHandle(HandleType v) { + return v; + } + + static inline JS::MutableHandle toMutableHandle(MutableHandleType v) { + return v; + } + + template + static inline JS::Handle downcastHandle(HandleType v) { + return v.template as(); + } +}; + +template class MaybeRooted +{ + public: + typedef const T& HandleType; + typedef FakeRooted RootType; + typedef FakeMutableHandle MutableHandleType; + + static JS::Handle toHandle(HandleType v) { + do { AnnotateMozCrashReason("MOZ_CRASH(" "Bad conversion" ")"); do { *((volatile int*) __null) = 990; ::abort(); } while (0); } while (0); + } + + static JS::MutableHandle toMutableHandle(MutableHandleType v) { + do { AnnotateMozCrashReason("MOZ_CRASH(" "Bad conversion" ")"); do { *((volatile int*) __null) = 994; ::abort(); } while (0); } while (0); + } + + template + static inline T2* downcastHandle(HandleType v) { + return &v->template as(); + } +}; + +} + +namespace JS { + +template template +inline +Handle::Handle(const Rooted& root, + typename mozilla::EnableIf::value, int>::Type dummy) +{ + ptr = reinterpret_cast(root.address()); +} + +template template +inline +Handle::Handle(const PersistentRooted& root, + typename mozilla::EnableIf::value, int>::Type dummy) +{ + ptr = reinterpret_cast(root.address()); +} + +template template +inline +Handle::Handle(MutableHandle& root, + typename mozilla::EnableIf::value, int>::Type dummy) +{ + ptr = reinterpret_cast(root.address()); +} + +template +inline +MutableHandle::MutableHandle(Rooted* root) +{ + static_assert(sizeof(MutableHandle) == sizeof(T*), + "MutableHandle must be binary compatible with T*."); + ptr = root->address(); +} + +template +inline +MutableHandle::MutableHandle(PersistentRooted* root) +{ + static_assert(sizeof(MutableHandle) == sizeof(T*), + "MutableHandle must be binary compatible with T*."); + ptr = root->address(); +} + +void +AddPersistentRoot(RootingContext* cx, RootKind kind, PersistentRooted* root); +# 1086 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +class PersistentRooted : public js::RootedBase>, + private mozilla::LinkedListElement> +{ + using ListBase = mozilla::LinkedListElement>; + + friend class mozilla::LinkedList; + friend class mozilla::LinkedListElement; + + void registerWithRootLists(RootingContext* cx) { + do { } while (0); + JS::RootKind kind = JS::MapTypeToRootKind::kind; + AddPersistentRoot(cx, kind, reinterpret_cast*>(this)); + } + + public: + using ElementType = T; + + PersistentRooted() : ptr(GCPolicy::initial()) {} + + explicit PersistentRooted(RootingContext* cx) + : ptr(GCPolicy::initial()) + { + registerWithRootLists(cx); + } + + explicit PersistentRooted(JSContext* cx) + : ptr(GCPolicy::initial()) + { + registerWithRootLists(RootingContext::get(cx)); + } + + template + PersistentRooted(RootingContext* cx, U&& initial) + : ptr(mozilla::Forward(initial)) + { + registerWithRootLists(cx); + } + + template + PersistentRooted(JSContext* cx, U&& initial) + : ptr(mozilla::Forward(initial)) + { + registerWithRootLists(RootingContext::get(cx)); + } + + PersistentRooted(const PersistentRooted& rhs) + : mozilla::LinkedListElement>(), + ptr(rhs.ptr) + { +# 1144 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" + const_cast(rhs).setNext(this); + } + + bool initialized() { + return ListBase::isInList(); + } + + void init(JSContext* cx) { + init(cx, GCPolicy::initial()); + } + + template + void init(JSContext* cx, U&& initial) { + ptr = mozilla::Forward(initial); + registerWithRootLists(RootingContext::get(cx)); + } + + void reset() { + if (initialized()) { + set(GCPolicy::initial()); + ListBase::remove(); + } + } + + operator const T&() const { return get(); } const T& operator->() const { return get(); }; + PersistentRooted& operator=(const T& p) { set(p); return *this; } PersistentRooted& operator=(const PersistentRooted& other) { set(other.get()); return *this; }; + const T* address() const { return &(ptr); } const T& get() const { return (ptr); }; + + + + + T* address() { + do { } while (0); + return &ptr; + } + T& get() { + do { } while (0); + return ptr; + } + + private: + template + void set(U&& value) { + do { } while (0); + ptr = mozilla::Forward(value); + } + + + using MaybeWrapped = typename mozilla::Conditional< + MapTypeToRootKind::kind == JS::RootKind::Traceable, + js::DispatchWrapper, + T>::Type; + MaybeWrapped ptr; +} ; + +class ObjectPtr +{ + Heap value; + + public: + using ElementType = JSObject*; + + ObjectPtr() : value(nullptr) {} + + explicit ObjectPtr(JSObject* obj) : value(obj) {} + + + ~ObjectPtr() { do { } while (0); } + + void finalize(JSRuntime* rt); + void finalize(JSContext* cx); + + void init(JSObject* obj) { value = obj; } + + JSObject* get() const { return value; } + JSObject* unbarrieredGet() const { return value.unbarrieredGet(); } + + void writeBarrierPre(JSContext* cx) { + IncrementalPreWriteBarrier(value); + } + + void updateWeakPointerAfterGC(); + + ObjectPtr& operator=(JSObject* obj) { + IncrementalPreWriteBarrier(value); + value = obj; + return *this; + } + + void trace(JSTracer* trc, const char* name); + + JSObject& operator*() const { return *value; } + JSObject* operator->() const { return value; } + operator JSObject*() const { return value; } + + explicit operator bool() const { return value.unbarrieredGet(); } + explicit operator bool() { return value.unbarrieredGet(); } +}; + +} + +namespace js { + +template +class WrappedPtrOperations, Container> +{ + const UniquePtr& uniquePtr() const { return static_cast(this)->get(); } + + public: + explicit operator bool() const { return !!uniquePtr(); } +}; + +template +class MutableWrappedPtrOperations, Container> + : public WrappedPtrOperations, Container> +{ + UniquePtr& uniquePtr() { return static_cast(this)->get(); } + + public: + __attribute__ ((warn_unused_result)) typename UniquePtr::Pointer release() { return uniquePtr().release(); } +}; + +namespace gc { + +template +void +CallTraceCallbackOnNonHeap(T* v, const TraceCallbacks& aCallbacks, const char* aName, void* aClosure) +{ + static_assert(sizeof(T) == sizeof(JS::Heap), "T and Heap must be compatible."); + do { } while (0); + mozilla::DebugOnly cell = BarrierMethods::asGCThingOrNull(*v); + do { } while (0); + do { } while (0); + JS::Heap* asHeapT = reinterpret_cast*>(v); + aCallbacks.Trace(asHeapT, aName, aClosure); +} + +} +} + + + +namespace mozilla { + +template +inline void +Swap(JS::Heap& aX, JS::Heap& aY) +{ + T tmp = aX; + aX = aY; + aY = tmp; +} + +template +inline void +Swap(JS::TenuredHeap& aX, JS::TenuredHeap& aY) +{ + T tmp = aX; + aX = aY; + aY = tmp; +} + +} + +namespace js { +namespace detail { +# 1320 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +struct DefineComparisonOps : mozilla::FalseType {}; + +template +struct DefineComparisonOps> : mozilla::TrueType { + static const T& get(const JS::Heap& v) { return v.unbarrieredGet(); } +}; + +template +struct DefineComparisonOps> : mozilla::TrueType { + static const T get(const JS::TenuredHeap& v) { return v.unbarrieredGetPtr(); } +}; + +template <> +struct DefineComparisonOps : mozilla::TrueType { + static const JSObject* get(const JS::ObjectPtr& v) { return v.unbarrieredGet(); } +}; + +template +struct DefineComparisonOps> : mozilla::TrueType { + static const T& get(const JS::Rooted& v) { return v.get(); } +}; + +template +struct DefineComparisonOps> : mozilla::TrueType { + static const T& get(const JS::Handle& v) { return v.get(); } +}; + +template +struct DefineComparisonOps> : mozilla::TrueType { + static const T& get(const JS::MutableHandle& v) { return v.get(); } +}; + +template +struct DefineComparisonOps> : mozilla::TrueType { + static const T& get(const JS::PersistentRooted& v) { return v.get(); } +}; + +template +struct DefineComparisonOps> : mozilla::TrueType { + static const T& get(const js::FakeRooted& v) { return v.get(); } +}; + +template +struct DefineComparisonOps> : mozilla::TrueType { + static const T& get(const js::FakeMutableHandle& v) { return v.get(); } +}; + +} +} +# 1378 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" +template +typename mozilla::EnableIf::value && + js::detail::DefineComparisonOps::value, bool>::Type +operator==(const T& a, const U& b) { + return js::detail::DefineComparisonOps::get(a) == js::detail::DefineComparisonOps::get(b); +} + +template +typename mozilla::EnableIf::value && + js::detail::DefineComparisonOps::value, bool>::Type +operator!=(const T& a, const U& b) { + return !(a == b); +} + + + +template +typename mozilla::EnableIf::value, bool>::Type +operator==(const T& a, const typename T::ElementType& b) { + return js::detail::DefineComparisonOps::get(a) == b; +} + +template +typename mozilla::EnableIf::value, bool>::Type +operator!=(const T& a, const typename T::ElementType& b) { + return !(a == b); +} + +template +typename mozilla::EnableIf::value, bool>::Type +operator==(const typename T::ElementType& a, const T& b) { + return a == js::detail::DefineComparisonOps::get(b); +} + +template +typename mozilla::EnableIf::value, bool>::Type +operator!=(const typename T::ElementType& a, const T& b) { + return !(a == b); +} + + + + +template +typename mozilla::EnableIf::value && + mozilla::IsPointer::value, bool>::Type +operator==(const typename mozilla::RemovePointer::Type* a, const T& b) { + return a == js::detail::DefineComparisonOps::get(b); +} + +template +typename mozilla::EnableIf::value && + mozilla::IsPointer::value, bool>::Type +operator!=(const typename mozilla::RemovePointer::Type* a, const T& b) { + return !(a == b); +} + +template +typename mozilla::EnableIf::value && + mozilla::IsPointer::value, bool>::Type +operator==(const T& a, const typename mozilla::RemovePointer::Type* b) { + return js::detail::DefineComparisonOps::get(a) == b; +} + +template +typename mozilla::EnableIf::value && + mozilla::IsPointer::value, bool>::Type +operator!=(const T& a, const typename mozilla::RemovePointer::Type* b) { + return !(a == b); +} + + + +template +typename mozilla::EnableIf::value && + mozilla::IsPointer::value, bool>::Type +operator==(std::nullptr_t a, const T& b) { + return a == js::detail::DefineComparisonOps::get(b); +} + +template +typename mozilla::EnableIf::value && + mozilla::IsPointer::value, bool>::Type +operator!=(std::nullptr_t a, const T& b) { + return !(a == b); +} + +template +typename mozilla::EnableIf::value && + mozilla::IsPointer::value, bool>::Type +operator==(const T& a, std::nullptr_t b) { + return js::detail::DefineComparisonOps::get(a) == b; +} + +template +typename mozilla::EnableIf::value && + mozilla::IsPointer::value, bool>::Type +operator!=(const T& a, std::nullptr_t b) { + return !(a == b); +} +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h" 2 +# 41 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h" +class nsCycleCollectionISupports +{ +public: + template struct COMTypeInfo; +}; + +template struct nsCycleCollectionISupports::COMTypeInfo { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template const nsIID nsCycleCollectionISupports::COMTypeInfo::kIID __attribute__ ((visibility ("hidden"))) = { 0xc61eac14, 0x5f7a, 0x4481, { 0x96, 0x5e, 0x7e, 0xaa, 0x6e, 0xff, 0xa8, 0x5f } }; + + +namespace JS { +template class Heap; +} + + + + + + +struct TraceCallbacks +{ + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const = 0; + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const = 0; + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const = 0; + virtual void Trace(JSObject** aPtr, const char* aName, + void* aClosure) const = 0; + virtual void Trace(JS::TenuredHeap* aPtr, const char* aName, + void* aClosure) const = 0; + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const = 0; + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const = 0; + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const = 0; +}; + + + + + +struct TraceCallbackFunc : public TraceCallbacks +{ + typedef void (*Func)(JS::GCCellPtr aPtr, const char* aName, void* aClosure); + + explicit TraceCallbackFunc(Func aCb) : mCallback(aCb) {} + + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const override; + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const override; + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const override; + virtual void Trace(JSObject** aPtr, const char* aName, + void* aClosure) const override; + virtual void Trace(JS::TenuredHeap* aPtr, const char* aName, + void* aClosure) const override; + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const override; + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const override; + virtual void Trace(JS::Heap* aPtr, const char* aName, + void* aClosure) const override; + +private: + Func mCallback; +}; + + + + +class nsCycleCollectionParticipant +{ +public: + constexpr explicit nsCycleCollectionParticipant(bool aSkip, + bool aTraverseShouldTrace = false) + : mMightSkip(aSkip) + , mTraverseShouldTrace(aTraverseShouldTrace) + { + } + + virtual nsresult TraverseNative(void* aPtr, nsCycleCollectionTraversalCallback& aCb) = 0; + + nsresult TraverseNativeAndJS(void* aPtr, + nsCycleCollectionTraversalCallback& aCb) + { + nsresult rv = TraverseNative(aPtr, aCb); + if (mTraverseShouldTrace) { + + + TraceCallbackFunc noteJsChild(&nsCycleCollectionParticipant::NoteJSChild); + Trace(aPtr, noteJsChild, &aCb); + } + return rv; + } + + + static void NoteJSChild(JS::GCCellPtr aGCThing, const char* aName, + void* aClosure); + + virtual void Root(void* aPtr) = 0; + virtual void Unlink(void* aPtr) = 0; + virtual void Unroot(void* aPtr) = 0; + virtual const char* ClassName() = 0; + + virtual void Trace(void* aPtr, const TraceCallbacks& aCb, + void* aClosure) {} +# 163 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h" + bool CanSkip(void* aPtr, bool aRemovingAllowed) + { + return mMightSkip ? CanSkipReal(aPtr, aRemovingAllowed) : false; + } +# 193 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h" + bool CanSkipInCC(void* aPtr) + { + return mMightSkip ? CanSkipInCCReal(aPtr) : false; + } +# 213 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h" + bool CanSkipThis(void* aPtr) + { + return mMightSkip ? CanSkipThisReal(aPtr) : false; + } + + virtual void DeleteCycleCollectable(void* aPtr) = 0; + +protected: + virtual bool CanSkipReal(void* aPtr, bool aRemovingAllowed) + { + do { } while(0); + return false; + } + virtual bool CanSkipInCCReal(void* aPtr) + { + do { } while(0); + return false; + } + virtual bool CanSkipThisReal(void* aPtr) + { + do { } while(0); + return false; + } + +private: + const bool mMightSkip; + const bool mTraverseShouldTrace; +}; + +class nsScriptObjectTracer : public nsCycleCollectionParticipant +{ +public: + constexpr explicit nsScriptObjectTracer(bool aSkip) + : nsCycleCollectionParticipant(aSkip, true) + { + } + + virtual void Trace(void* aPtr, const TraceCallbacks& aCb, + void* aClosure) override = 0; + +}; + +class nsXPCOMCycleCollectionParticipant : public nsScriptObjectTracer +{ +public: + constexpr explicit nsXPCOMCycleCollectionParticipant(bool aSkip) + : nsScriptObjectTracer(aSkip) + { + } + + template struct COMTypeInfo; + + virtual void Root(void* aPtr) override; + virtual void Unroot(void* aPtr) override; + + virtual void Trace(void* aPtr, const TraceCallbacks& aCb, + void* aClosure) override; + + static bool CheckForRightISupports(nsISupports* aSupports); +}; + +template struct nsXPCOMCycleCollectionParticipant::COMTypeInfo { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template const nsIID nsXPCOMCycleCollectionParticipant::COMTypeInfo::kIID __attribute__ ((visibility ("hidden"))) = { 0x9674489b, 0x1f6f, 0x4550, { 0xa7, 0x30, 0xcc, 0xae, 0xdd, 0x10, 0x4c, 0xf9 } }; +# 341 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h" +template::value> +struct DowncastCCParticipantImpl +{ +}; + + +template +struct DowncastCCParticipantImpl +{ + static T* Run(void* aPtr) + { + nsISupports* s = static_cast(aPtr); + do { } while (0); + + T* rval = T::cycleCollection::Downcast(s); + ; + return rval; + } +}; + + +template +struct DowncastCCParticipantImpl +{ + static T* Run(void* aPtr) { return static_cast(aPtr); } +}; + +template +T* +DowncastCCParticipant(void* aPtr) +{ + return DowncastCCParticipantImpl::Run(aPtr); +} +# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NameSpaceConstants.h" 1 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NameSpaceConstants.h" +static const int32_t kNameSpaceID_None = 0; +# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringGlue.h" 1 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringGlue.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstring.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstring.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringFwd.h" 1 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringFwd.h" +namespace mozilla { +namespace detail { + +class nsStringRepr; +class nsCStringRepr; + +} +} + + + + + +class nsAString; +class nsSubstringTuple; +class nsString; +class nsAutoString; +class nsDependentString; +class nsDependentSubstring; +class nsPromiseFlatString; +class nsStringComparator; +class nsDefaultStringComparator; +class nsXPIDLString; + + + + + + +class nsACString; +class nsCSubstringTuple; +class nsCString; +class nsAutoCString; +class nsDependentCString; +class nsDependentCSubstring; +class nsPromiseFlatCString; +class nsCStringComparator; +class nsDefaultCStringComparator; +class nsXPIDLCString; + + + + + + +typedef nsAString nsSubstring; +typedef nsACString nsCSubstring; + +typedef nsString nsAFlatString; +typedef nsSubstring nsASingleFragmentString; + +typedef nsCString nsAFlatCString; +typedef nsCSubstring nsASingleFragmentCString; +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringIterator.h" 1 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringIterator.h" +template +class nsReadingIterator +{ +public: + typedef nsReadingIterator self_type; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef CharT value_type; + typedef const CharT* pointer; + typedef const CharT& reference; + +private: + friend class mozilla::detail::nsStringRepr; + friend class mozilla::detail::nsCStringRepr; + + + + + + + const CharT* mStart; + const CharT* mEnd; + const CharT* mPosition; + +public: + nsReadingIterator() + { + } + + + + pointer get() const + { + return mPosition; + } + + CharT operator*() const + { + return *get(); + } + + self_type& operator++() + { + ++mPosition; + return *this; + } + + self_type operator++(int) + { + self_type result(*this); + ++mPosition; + return result; + } + + self_type& operator--() + { + --mPosition; + return *this; + } + + self_type operator--(int) + { + self_type result(*this); + --mPosition; + return result; + } + + self_type& advance(difference_type aN) + { + if (aN > 0) { + difference_type step = XPCOM_MIN(aN, mEnd - mPosition); + + do { } while(0); + + + mPosition += step; + } else if (aN < 0) { + difference_type step = XPCOM_MAX(aN, -(mPosition - mStart)); + + do { } while(0); + + + mPosition += step; + } + return *this; + } + + + + + + + size_type operator-(const self_type& aOther) const + { + do { } while (0); + return mPosition - aOther.mPosition; + } +}; + + + + + +template +class nsWritingIterator +{ +public: + typedef nsWritingIterator self_type; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef CharT value_type; + typedef CharT* pointer; + typedef CharT& reference; + +private: + friend class nsAString; + friend class nsACString; + + + + + + + CharT* mStart; + CharT* mEnd; + CharT* mPosition; + +public: + nsWritingIterator() + { + } + + + + pointer get() const + { + return mPosition; + } + + reference operator*() const + { + return *get(); + } + + self_type& operator++() + { + ++mPosition; + return *this; + } + + self_type operator++(int) + { + self_type result(*this); + ++mPosition; + return result; + } + + self_type& operator--() + { + --mPosition; + return *this; + } + + self_type operator--(int) + { + self_type result(*this); + --mPosition; + return result; + } + + self_type& advance(difference_type aN) + { + if (aN > 0) { + difference_type step = XPCOM_MIN(aN, mEnd - mPosition); + + do { } while(0); + + + mPosition += step; + } else if (aN < 0) { + difference_type step = XPCOM_MAX(aN, -(mPosition - mStart)); + + do { } while(0); + + + mPosition += step; + } + return *this; + } + + + + + + + size_type operator-(const self_type& aOther) const + { + do { } while (0); + return mPosition - aOther.mPosition; + } +}; + +template +struct nsCharSinkTraits> +{ + static void + write(nsWritingIterator& aIter, const CharT* aStr, uint32_t aN) + { + nsCharTraits::move(aIter.get(), aStr, aN); + aIter.advance(aN); + } +}; + +template +inline bool +operator==(const nsReadingIterator& aLhs, + const nsReadingIterator& aRhs) +{ + return aLhs.get() == aRhs.get(); +} + +template +inline bool +operator!=(const nsReadingIterator& aLhs, + const nsReadingIterator& aRhs) +{ + return aLhs.get() != aRhs.get(); +} + + + + + + +template +inline bool +operator==(const nsWritingIterator& aLhs, + const nsWritingIterator& aRhs) +{ + return aLhs.get() == aRhs.get(); +} + +template +inline bool +operator!=(const nsWritingIterator& aLhs, + const nsWritingIterator& aRhs) +{ + return aLhs.get() != aRhs.get(); +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2 + + + + + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" 1 + + + + + + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerPrintfMacros.h" 1 +# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerPrintfMacros.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/inttypes.h" 1 3 +# 30 "/usr/local/bin/../lib/clang/3.9.1/include/inttypes.h" 3 +# 1 "/usr/include/inttypes.h" 1 3 4 +# 266 "/usr/include/inttypes.h" 3 4 +extern "C" { + + + + +typedef struct + { + long int quot; + long int rem; + } imaxdiv_t; +# 290 "/usr/include/inttypes.h" 3 4 +extern intmax_t imaxabs (intmax_t __n) throw () __attribute__ ((__const__)); + + +extern imaxdiv_t imaxdiv (intmax_t __numer, intmax_t __denom) + throw () __attribute__ ((__const__)); + + +extern intmax_t strtoimax (const char *__restrict __nptr, + char **__restrict __endptr, int __base) throw (); + + +extern uintmax_t strtoumax (const char *__restrict __nptr, + char ** __restrict __endptr, int __base) throw (); + + +extern intmax_t wcstoimax (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, int __base) + throw (); + + +extern uintmax_t wcstoumax (const wchar_t *__restrict __nptr, + wchar_t ** __restrict __endptr, int __base) + throw (); +# 432 "/usr/include/inttypes.h" 3 4 +} +# 31 "/usr/local/bin/../lib/clang/3.9.1/include/inttypes.h" 2 3 +# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerPrintfMacros.h" 2 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" 2 +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" +class nsStringComparator +{ +public: + typedef char16_t char_type; + + nsStringComparator() + { + } + + virtual int operator()(const char_type*, const char_type*, + uint32_t, uint32_t) const = 0; +}; + + + + + +class nsDefaultStringComparator + : public nsStringComparator +{ +public: + typedef char16_t char_type; + + nsDefaultStringComparator() + { + } + + virtual int operator()(const char_type*, const char_type*, + uint32_t, uint32_t) const override; +}; + +class nsSubstringSplitter; + +namespace mozilla { +namespace detail { +# 75 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" +class nsStringRepr +{ +public: + typedef mozilla::fallible_t fallible_t; + + typedef char16_t char_type; + + typedef nsCharTraits char_traits; + typedef char_traits::incompatible_char_type incompatible_char_type; + + typedef nsStringRepr self_type; + typedef self_type base_string_type; + + typedef nsAString substring_type; + typedef nsSubstringTuple substring_tuple_type; + typedef nsString string_type; + + typedef nsReadingIterator const_iterator; + typedef nsWritingIterator iterator; + + typedef nsStringComparator comparator_type; + + typedef char_type* char_iterator; + typedef const char_type* const_char_iterator; + + typedef uint32_t index_type; + typedef uint32_t size_type; + + + + + + const_char_iterator BeginReading() const + { + return mData; + } + const_char_iterator EndReading() const + { + return mData + mLength; + } + + + + + + const_iterator& BeginReading(const_iterator& aIter) const + { + aIter.mStart = mData; + aIter.mEnd = mData + mLength; + aIter.mPosition = aIter.mStart; + return aIter; + } + + const_iterator& EndReading(const_iterator& aIter) const + { + aIter.mStart = mData; + aIter.mEnd = mData + mLength; + aIter.mPosition = aIter.mEnd; + return aIter; + } + + const_char_iterator& BeginReading(const_char_iterator& aIter) const + { + return aIter = mData; + } + + const_char_iterator& EndReading(const_char_iterator& aIter) const + { + return aIter = mData + mLength; + } +# 154 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + const char_type* Data() const + + { + return mData; + } + + size_type Length() const + { + return mLength; + } + + uint32_t Flags() const + { + return mFlags; + } + + bool IsEmpty() const + { + return mLength == 0; + } + + bool IsLiteral() const + { + return (mFlags & F_LITERAL) != 0; + } + + bool IsVoid() const + { + return (mFlags & F_VOIDED) != 0; + } + + bool IsTerminated() const + { + return (mFlags & F_TERMINATED) != 0; + } + + char_type CharAt(index_type aIndex) const + { + do { } while(0); + return mData[aIndex]; + } + + char_type operator[](index_type aIndex) const + { + return CharAt(aIndex); + } + + char_type First() const; + + char_type Last() const; + + size_type CountChar(char_type) const; + int32_t FindChar(char_type, index_type aOffset = 0) const; + + inline bool Contains(char_type aChar) const + { + return FindChar(aChar) != -1; + } + + + + + + bool Equals(const self_type&) const; + bool Equals(const self_type&, const comparator_type&) const; + + bool Equals(const substring_tuple_type& aTuple) const; + bool Equals(const substring_tuple_type& aTuple, + const comparator_type& aComp) const; + + bool Equals(const char_type* aData) const; + bool Equals(const char_type* aData, + const comparator_type& aComp) const; +# 244 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + bool EqualsASCII(const char* aData, size_type aLen) const; + + + + + + bool EqualsASCII(const char* aData) const; + + + + + + + + template + inline bool EqualsLiteral(const char (&aStr)[N]) const + { + return EqualsASCII(aStr, N - 1); + } + + + + + + + + bool LowerCaseEqualsASCII(const char* aData, + size_type aLen) const; + bool LowerCaseEqualsASCII(const char* aData) const; + + + + + + + template + inline bool LowerCaseEqualsLiteral(const char (&aStr)[N]) const + { + return LowerCaseEqualsASCII(aStr, N - 1); + } + + + + + bool IsDependentOn(const char_type* aStart, const char_type* aEnd) const + { +# 298 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + return (aStart < (mData + mLength) && aEnd > mData); + } + +protected: + nsStringRepr() = delete; + + constexpr + nsStringRepr(char_type* aData, size_type aLength, uint32_t aFlags) + : mData(aData) + , mLength(aLength) + , mFlags(aFlags) + { + } + + char_type* mData; + size_type mLength; + uint32_t mFlags; + +public: + + + + + + + enum + { + F_NONE = 0, + + + F_TERMINATED = 1 << 0, + F_VOIDED = 1 << 1, + F_SHARED = 1 << 2, + F_OWNED = 1 << 3, + F_FIXED = 1 << 4, + F_LITERAL = 1 << 5, + + + F_CLASS_FIXED = 1 << 16 + }; +# 372 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" +}; + +} +} +# 389 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" +class nsAString : public mozilla::detail::nsStringRepr +{ +public: + typedef nsAString self_type; + + + ~nsAString() + { + Finalize(); + } + + + + + + char_iterator BeginWriting() + { + if (!EnsureMutable()) { + AllocFailed(mLength); + } + + return mData; + } + + char_iterator BeginWriting(const fallible_t&) + { + return EnsureMutable() ? mData : char_iterator(0); + } + + char_iterator EndWriting() + { + if (!EnsureMutable()) { + AllocFailed(mLength); + } + + return mData + mLength; + } + + char_iterator EndWriting(const fallible_t&) + { + return EnsureMutable() ? (mData + mLength) : char_iterator(0); + } + + char_iterator& BeginWriting(char_iterator& aIter) + { + return aIter = BeginWriting(); + } + + char_iterator& BeginWriting(char_iterator& aIter, const fallible_t& aFallible) + { + return aIter = BeginWriting(aFallible); + } + + char_iterator& EndWriting(char_iterator& aIter) + { + return aIter = EndWriting(); + } + + char_iterator& EndWriting(char_iterator& aIter, const fallible_t& aFallible) + { + return aIter = EndWriting(aFallible); + } + + + + + + iterator& BeginWriting(iterator& aIter) + { + char_type* data = BeginWriting(); + aIter.mStart = data; + aIter.mEnd = data + mLength; + aIter.mPosition = aIter.mStart; + return aIter; + } + + iterator& EndWriting(iterator& aIter) + { + char_type* data = BeginWriting(); + aIter.mStart = data; + aIter.mEnd = data + mLength; + aIter.mPosition = aIter.mEnd; + return aIter; + } + + + + + + void Assign(char_type aChar); + __attribute__ ((warn_unused_result)) bool Assign(char_type aChar, const fallible_t&); + + void Assign(const char_type* aData); + __attribute__ ((warn_unused_result)) bool Assign(const char_type* aData, + const fallible_t&); + + void Assign(const char_type* aData, size_type aLength); + __attribute__ ((warn_unused_result)) bool Assign(const char_type* aData, + size_type aLength, const fallible_t&); + + void Assign(const self_type&); + __attribute__ ((warn_unused_result)) bool Assign(const self_type&, const fallible_t&); + + void Assign(const substring_tuple_type&); + __attribute__ ((warn_unused_result)) bool Assign(const substring_tuple_type&, + const fallible_t&); +# 515 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void AssignASCII(const char* aData, size_type aLength); + __attribute__ ((warn_unused_result)) bool AssignASCII(const char* aData, + size_type aLength, + const fallible_t&); + + void AssignASCII(const char* aData) + { + AssignASCII(aData, mozilla::AssertedCast(strlen(aData))); + } + __attribute__ ((warn_unused_result)) bool AssignASCII(const char* aData, + const fallible_t& aFallible) + { + return AssignASCII(aData, + mozilla::AssertedCast(strlen(aData)), + aFallible); + } + + + + + + + + template + void AssignLiteral(const char_type (&aStr)[N]) + { + AssignLiteral(aStr, N - 1); + } + + template + void AssignLiteral(const char (&aStr)[N]) + { + AssignASCII(aStr, N - 1); + } + + + self_type& operator=(char_type aChar) + { + Assign(aChar); + return *this; + } + self_type& operator=(const char_type* aData) + { + Assign(aData); + return *this; + } + + + + + + + + self_type& operator=(const self_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } + + void Adopt(char_type* aData, size_type aLength = size_type(-1)); + + + + + + + void Replace(index_type aCutStart, size_type aCutLength, + char_type aChar); + __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart, + size_type aCutLength, + char_type aChar, + const fallible_t&); + void Replace(index_type aCutStart, size_type aCutLength, + const char_type* aData, + size_type aLength = size_type(-1)); + __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart, + size_type aCutLength, + const char_type* aData, + size_type aLength, + const fallible_t&); + void Replace(index_type aCutStart, size_type aCutLength, + const self_type& aStr) + { + Replace(aCutStart, aCutLength, aStr.Data(), aStr.Length()); + } + __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart, + size_type aCutLength, + const self_type& aStr, + const fallible_t& aFallible) + { + return Replace(aCutStart, aCutLength, aStr.Data(), aStr.Length(), + aFallible); + } + void Replace(index_type aCutStart, size_type aCutLength, + const substring_tuple_type& aTuple); + + void ReplaceASCII(index_type aCutStart, size_type aCutLength, + const char* aData, + size_type aLength = size_type(-1)); + + __attribute__ ((warn_unused_result)) bool ReplaceASCII(index_type aCutStart, size_type aCutLength, + const char* aData, + size_type aLength, + const fallible_t&); + + + + + template + void ReplaceLiteral(index_type aCutStart, size_type aCutLength, + const char_type (&aStr)[N]) + { + ReplaceLiteral(aCutStart, aCutLength, aStr, N - 1); + } + + void Append(char_type aChar) + { + Replace(mLength, 0, aChar); + } + __attribute__ ((warn_unused_result)) bool Append(char_type aChar, const fallible_t& aFallible) + { + return Replace(mLength, 0, aChar, aFallible); + } + void Append(const char_type* aData, size_type aLength = size_type(-1)) + { + Replace(mLength, 0, aData, aLength); + } + __attribute__ ((warn_unused_result)) bool Append(const char_type* aData, size_type aLength, + const fallible_t& aFallible) + { + return Replace(mLength, 0, aData, aLength, aFallible); + } +# 660 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void Append(const self_type& aStr) + { + Replace(mLength, 0, aStr); + } + __attribute__ ((warn_unused_result)) bool Append(const self_type& aStr, const fallible_t& aFallible) + { + return Replace(mLength, 0, aStr, aFallible); + } + void Append(const substring_tuple_type& aTuple) + { + Replace(mLength, 0, aTuple); + } + + void AppendASCII(const char* aData, size_type aLength = size_type(-1)) + { + ReplaceASCII(mLength, 0, aData, aLength); + } + + __attribute__ ((warn_unused_result)) bool AppendASCII(const char* aData, const fallible_t& aFallible) + { + return ReplaceASCII(mLength, 0, aData, size_type(-1), aFallible); + } + + __attribute__ ((warn_unused_result)) bool AppendASCII(const char* aData, size_type aLength, const fallible_t& aFallible) + { + return ReplaceASCII(mLength, 0, aData, aLength, aFallible); + } + + + + + + + + void AppendPrintf(const char* aFormat, ...) __attribute__ ((format (printf, 2, 3))); + void AppendPrintf(const char* aFormat, va_list aAp); + void AppendInt(int32_t aInteger) + { + AppendPrintf("%" "d", aInteger); + } + void AppendInt(int32_t aInteger, int aRadix) + { + if (aRadix == 10) { + AppendPrintf("%" "d", aInteger); + } else { + AppendPrintf(aRadix == 8 ? "%" "o" : "%" "x", + static_cast(aInteger)); + } + } + void AppendInt(uint32_t aInteger) + { + AppendPrintf("%" "u", aInteger); + } + void AppendInt(uint32_t aInteger, int aRadix) + { + AppendPrintf(aRadix == 10 ? "%" "u" : aRadix == 8 ? "%" "o" : "%" "x", + aInteger); + } + void AppendInt(int64_t aInteger) + { + AppendPrintf("%" "l" "d", aInteger); + } + void AppendInt(int64_t aInteger, int aRadix) + { + if (aRadix == 10) { + AppendPrintf("%" "l" "d", aInteger); + } else { + AppendPrintf(aRadix == 8 ? "%" "l" "o" : "%" "l" "x", + static_cast(aInteger)); + } + } + void AppendInt(uint64_t aInteger) + { + AppendPrintf("%" "l" "u", aInteger); + } + void AppendInt(uint64_t aInteger, int aRadix) + { + AppendPrintf(aRadix == 10 ? "%" "l" "u" : aRadix == 8 ? "%" "l" "o" : "%" "l" "x", + aInteger); + } + + + + + void AppendFloat(float aFloat); + void AppendFloat(double aFloat); +public: + + + + + template + void AppendLiteral(const char_type (&aStr)[N]) + { + ReplaceLiteral(mLength, 0, aStr, N - 1); + } + + template + void AppendLiteral(const char (&aStr)[N]) + { + AppendASCII(aStr, N - 1); + } + + template + __attribute__ ((warn_unused_result)) bool AppendLiteral(const char (&aStr)[N], const fallible_t& aFallible) + { + return AppendASCII(aStr, N - 1, aFallible); + } + + + self_type& operator+=(char_type aChar) + { + Append(aChar); + return *this; + } + self_type& operator+=(const char_type* aData) + { + Append(aData); + return *this; + } + + + + + + + + self_type& operator+=(const self_type& aStr) + { + Append(aStr); + return *this; + } + self_type& operator+=(const substring_tuple_type& aTuple) + { + Append(aTuple); + return *this; + } + + void Insert(char_type aChar, index_type aPos) + { + Replace(aPos, 0, aChar); + } + void Insert(const char_type* aData, index_type aPos, + size_type aLength = size_type(-1)) + { + Replace(aPos, 0, aData, aLength); + } + + + + + + + + void Insert(const self_type& aStr, index_type aPos) + { + Replace(aPos, 0, aStr); + } + void Insert(const substring_tuple_type& aTuple, index_type aPos) + { + Replace(aPos, 0, aTuple); + } + + + + + template + void InsertLiteral(const char_type (&aStr)[N], index_type aPos) + { + ReplaceLiteral(aPos, 0, aStr, N - 1); + } + + void Cut(index_type aCutStart, size_type aCutLength) + { + Replace(aCutStart, aCutLength, char_traits::sEmptyBuffer, 0); + } + + nsSubstringSplitter Split(const char_type aChar) const; +# 850 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void SetCapacity(size_type aNewCapacity); + __attribute__ ((warn_unused_result)) bool SetCapacity(size_type aNewCapacity, + const fallible_t&); + + void SetLength(size_type aNewLength); + __attribute__ ((warn_unused_result)) bool SetLength(size_type aNewLength, + const fallible_t&); + + void Truncate(size_type aNewLength = 0) + { + do { } while(0); + SetLength(aNewLength); + } +# 876 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + inline size_type GetData(const char_type** aData) const + { + *aData = mData; + return mLength; + } +# 892 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + size_type GetMutableData(char_type** aData, size_type aNewLen = size_type(-1)) + { + if (!EnsureMutable(aNewLen)) { + AllocFailed(aNewLen == size_type(-1) ? mLength : aNewLen); + } + + *aData = mData; + return mLength; + } + + size_type GetMutableData(char_type** aData, size_type aNewLen, const fallible_t&) + { + if (!EnsureMutable(aNewLen)) { + *aData = nullptr; + return 0; + } + + *aData = mData; + return mLength; + } +# 931 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + operator mozilla::Span() + { + return mozilla::MakeSpan(BeginWriting(), Length()); + } + + operator mozilla::Span() const + { + return mozilla::MakeSpan(BeginReading(), Length()); + } + + void Append(mozilla::Span aSpan) + { + auto len = aSpan.Length(); + do { static_assert(mozilla::detail::AssertionConditionType::value)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(len <= mozilla::MaxValue::value))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "len <= mozilla::MaxValue::value" ")"); do { *((volatile int*) __null) = 944; ::abort(); } while (0); } } while (0); + Append(aSpan.Elements(), len); + } + + __attribute__ ((warn_unused_result)) bool Append(mozilla::Span aSpan, + const fallible_t& aFallible) + { + auto len = aSpan.Length(); + if (len > mozilla::MaxValue::value) { + return false; + } + return Append(aSpan.Elements(), len, aFallible); + } +# 995 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void SetIsVoid(bool); +# 1005 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void StripChar(char_type aChar, int32_t aOffset = 0); +# 1015 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void StripChars(const char_type* aChars, uint32_t aOffset = 0); + + + + + + void ForgetSharedBuffer() + { + if (mFlags & nsSubstring::F_SHARED) { + mData = char_traits::sEmptyBuffer; + mLength = 0; + mFlags = F_TERMINATED; + } + } + +public: + + + + + + nsAString(const substring_tuple_type& aTuple) + : nsStringRepr(nullptr, 0, F_NONE) + { + Assign(aTuple); + } + + size_t SizeOfExcludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf) + const; + size_t SizeOfIncludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf) + const; + + + + + + + + size_t SizeOfExcludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf) + const; + size_t SizeOfIncludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf) + const; + + template + void NS_ABORT_OOM(T) + { + struct never {}; + static_assert(mozilla::IsSame::value, + "In string classes, use AllocFailed to account for sizeof(char_type). " + "Use the global ::NS_ABORT_OOM if you really have a count of bytes."); + } + + __attribute__((always_inline)) inline void AllocFailed(size_t aLength) + { + ::NS_ABORT_OOM(aLength * sizeof(char_type)); + } + +protected: + + + nsAString() + : nsStringRepr(char_traits::sEmptyBuffer, 0, F_TERMINATED) + { + } + + + + nsAString(const self_type& aStr) + : nsStringRepr(aStr.mData, aStr.mLength, + aStr.mFlags & (F_TERMINATED | F_VOIDED)) + { + } +# 1097 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + nsAString(char_type* aData, size_type aLength, uint32_t aFlags) + : nsStringRepr(aData, aLength, aFlags) + { + } + + + + + + + + void Finalize(); +# 1128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + bool MutatePrep(size_type aCapacity, + char_type** aOldData, uint32_t* aOldFlags); +# 1151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + __attribute__ ((warn_unused_result)) bool ReplacePrep(index_type aCutStart, + size_type aCutLength, + size_type aNewLength); + + __attribute__ ((warn_unused_result)) bool ReplacePrepInternal( + index_type aCutStart, + size_type aCutLength, + size_type aNewFragLength, + size_type aNewTotalLength); +# 1168 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + size_type Capacity() const; + + + + + + __attribute__ ((warn_unused_result)) bool EnsureMutable( + size_type aNewLen = size_type(-1)); + + + + + static __attribute__ ((warn_unused_result)) bool CheckCapacity(size_type aCapacity) { + if (aCapacity > kMaxCapacity) { + + + do { } while(0); + return false; + } + + return true; + } + + + + + void SetDataFlags(uint32_t aDataFlags) + { + do { } while(0); + mFlags = aDataFlags | (mFlags & 0xFFFF0000); + } + + void ReplaceLiteral(index_type aCutStart, size_type aCutLength, + const char_type* aData, size_type aLength); + + static const size_type kMaxCapacity; +public: + + + + void AssignLiteral(const char_type* aData, size_type aLength); +}; + +static_assert(sizeof(nsAString) == + sizeof(mozilla::detail::nsStringRepr), + "Don't add new data fields to nsTSubstring_CharT. " + "Add to nsTStringRepr_CharT instead."); + +int +Compare(const nsAString::base_string_type& aLhs, + const nsAString::base_string_type& aRhs, + const nsStringComparator& = nsDefaultStringComparator()); + + +inline bool +operator!=(const nsAString::base_string_type& aLhs, + const nsAString::base_string_type& aRhs) +{ + return !aLhs.Equals(aRhs); +} + +inline bool +operator!=(const nsAString::base_string_type& aLhs, + const nsAString::char_type* aRhs) +{ + return !aLhs.Equals(aRhs); +} + +inline bool +operator<(const nsAString::base_string_type& aLhs, + const nsAString::base_string_type& aRhs) +{ + return Compare(aLhs, aRhs) < 0; +} + +inline bool +operator<=(const nsAString::base_string_type& aLhs, + const nsAString::base_string_type& aRhs) +{ + return Compare(aLhs, aRhs) <= 0; +} + +inline bool +operator==(const nsAString::base_string_type& aLhs, + const nsAString::base_string_type& aRhs) +{ + return aLhs.Equals(aRhs); +} + +inline bool +operator==(const nsAString::base_string_type& aLhs, + const nsAString::char_type* aRhs) +{ + return aLhs.Equals(aRhs); +} + + +inline bool +operator>=(const nsAString::base_string_type& aLhs, + const nsAString::base_string_type& aRhs) +{ + return Compare(aLhs, aRhs) >= 0; +} + +inline bool +operator>(const nsAString::base_string_type& aLhs, + const nsAString::base_string_type& aRhs) +{ + return Compare(aLhs, aRhs) > 0; +} + + + +class nsSubstringSplitter +{ + typedef nsAString::size_type size_type; + typedef nsAString::char_type char_type; + + class nsTSubstringSplit_Iter + { + public: + nsTSubstringSplit_Iter(const nsSubstringSplitter& aObj, + size_type aPos) + : mObj(aObj) + , mPos(aPos) + { + } + + bool operator!=(const nsTSubstringSplit_Iter& other) const + { + return mPos != other.mPos; + } + + const nsDependentSubstring& operator*() const; + + const nsTSubstringSplit_Iter& operator++() + { + ++mPos; + return *this; + } + + private: + const nsSubstringSplitter& mObj; + size_type mPos; + }; + +private: + const nsAString* const mStr; + mozilla::UniquePtr mArray; + size_type mArraySize; + const char_type mDelim; + +public: + nsSubstringSplitter(const nsAString* aStr, char_type aDelim); + + nsTSubstringSplit_Iter begin() const + { + return nsTSubstringSplit_Iter(*this, 0); + } + + nsTSubstringSplit_Iter end() const + { + return nsTSubstringSplit_Iter(*this, mArraySize); + } + + const nsDependentSubstring& Get(const size_type index) const + { + do { } while (0); + return mArray[index]; + } +}; + + + + +namespace mozilla { + +inline Span +MakeSpan(nsAString& aString) +{ + return aString; +} + +inline Span +MakeSpan(const nsAString& aString) +{ + return aString; +} + +} +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1 +# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" 1 +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" +class nsCStringComparator +{ +public: + typedef char char_type; + + nsCStringComparator() + { + } + + virtual int operator()(const char_type*, const char_type*, + uint32_t, uint32_t) const = 0; +}; + + + + + +class nsDefaultCStringComparator + : public nsCStringComparator +{ +public: + typedef char char_type; + + nsDefaultCStringComparator() + { + } + + virtual int operator()(const char_type*, const char_type*, + uint32_t, uint32_t) const override; +}; + +class nsCSubstringSplitter; + +namespace mozilla { +namespace detail { +# 75 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" +class nsCStringRepr +{ +public: + typedef mozilla::fallible_t fallible_t; + + typedef char char_type; + + typedef nsCharTraits char_traits; + typedef char_traits::incompatible_char_type incompatible_char_type; + + typedef nsCStringRepr self_type; + typedef self_type base_string_type; + + typedef nsACString substring_type; + typedef nsCSubstringTuple substring_tuple_type; + typedef nsCString string_type; + + typedef nsReadingIterator const_iterator; + typedef nsWritingIterator iterator; + + typedef nsCStringComparator comparator_type; + + typedef char_type* char_iterator; + typedef const char_type* const_char_iterator; + + typedef uint32_t index_type; + typedef uint32_t size_type; + + + + + + const_char_iterator BeginReading() const + { + return mData; + } + const_char_iterator EndReading() const + { + return mData + mLength; + } + + + + + + const_iterator& BeginReading(const_iterator& aIter) const + { + aIter.mStart = mData; + aIter.mEnd = mData + mLength; + aIter.mPosition = aIter.mStart; + return aIter; + } + + const_iterator& EndReading(const_iterator& aIter) const + { + aIter.mStart = mData; + aIter.mEnd = mData + mLength; + aIter.mPosition = aIter.mEnd; + return aIter; + } + + const_char_iterator& BeginReading(const_char_iterator& aIter) const + { + return aIter = mData; + } + + const_char_iterator& EndReading(const_char_iterator& aIter) const + { + return aIter = mData + mLength; + } +# 154 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + const char_type* Data() const + + { + return mData; + } + + size_type Length() const + { + return mLength; + } + + uint32_t Flags() const + { + return mFlags; + } + + bool IsEmpty() const + { + return mLength == 0; + } + + bool IsLiteral() const + { + return (mFlags & F_LITERAL) != 0; + } + + bool IsVoid() const + { + return (mFlags & F_VOIDED) != 0; + } + + bool IsTerminated() const + { + return (mFlags & F_TERMINATED) != 0; + } + + char_type CharAt(index_type aIndex) const + { + do { } while(0); + return mData[aIndex]; + } + + char_type operator[](index_type aIndex) const + { + return CharAt(aIndex); + } + + char_type First() const; + + char_type Last() const; + + size_type CountChar(char_type) const; + int32_t FindChar(char_type, index_type aOffset = 0) const; + + inline bool Contains(char_type aChar) const + { + return FindChar(aChar) != -1; + } + + + + + + bool Equals(const self_type&) const; + bool Equals(const self_type&, const comparator_type&) const; + + bool Equals(const substring_tuple_type& aTuple) const; + bool Equals(const substring_tuple_type& aTuple, + const comparator_type& aComp) const; + + bool Equals(const char_type* aData) const; + bool Equals(const char_type* aData, + const comparator_type& aComp) const; +# 244 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + bool EqualsASCII(const char* aData, size_type aLen) const; + + + + + + bool EqualsASCII(const char* aData) const; + + + + + + + + template + inline bool EqualsLiteral(const char (&aStr)[N]) const + { + return EqualsASCII(aStr, N - 1); + } + + + + + + + + bool LowerCaseEqualsASCII(const char* aData, + size_type aLen) const; + bool LowerCaseEqualsASCII(const char* aData) const; + + + + + + + template + inline bool LowerCaseEqualsLiteral(const char (&aStr)[N]) const + { + return LowerCaseEqualsASCII(aStr, N - 1); + } + + + + + bool IsDependentOn(const char_type* aStart, const char_type* aEnd) const + { +# 298 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + return (aStart < (mData + mLength) && aEnd > mData); + } + +protected: + nsCStringRepr() = delete; + + constexpr + nsCStringRepr(char_type* aData, size_type aLength, uint32_t aFlags) + : mData(aData) + , mLength(aLength) + , mFlags(aFlags) + { + } + + char_type* mData; + size_type mLength; + uint32_t mFlags; + +public: + + + + + + + enum + { + F_NONE = 0, + + + F_TERMINATED = 1 << 0, + F_VOIDED = 1 << 1, + F_SHARED = 1 << 2, + F_OWNED = 1 << 3, + F_FIXED = 1 << 4, + F_LITERAL = 1 << 5, + + + F_CLASS_FIXED = 1 << 16 + }; +# 372 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" +}; + +} +} +# 389 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" +class nsACString : public mozilla::detail::nsCStringRepr +{ +public: + typedef nsACString self_type; + + + ~nsACString() + { + Finalize(); + } + + + + + + char_iterator BeginWriting() + { + if (!EnsureMutable()) { + AllocFailed(mLength); + } + + return mData; + } + + char_iterator BeginWriting(const fallible_t&) + { + return EnsureMutable() ? mData : char_iterator(0); + } + + char_iterator EndWriting() + { + if (!EnsureMutable()) { + AllocFailed(mLength); + } + + return mData + mLength; + } + + char_iterator EndWriting(const fallible_t&) + { + return EnsureMutable() ? (mData + mLength) : char_iterator(0); + } + + char_iterator& BeginWriting(char_iterator& aIter) + { + return aIter = BeginWriting(); + } + + char_iterator& BeginWriting(char_iterator& aIter, const fallible_t& aFallible) + { + return aIter = BeginWriting(aFallible); + } + + char_iterator& EndWriting(char_iterator& aIter) + { + return aIter = EndWriting(); + } + + char_iterator& EndWriting(char_iterator& aIter, const fallible_t& aFallible) + { + return aIter = EndWriting(aFallible); + } + + + + + + iterator& BeginWriting(iterator& aIter) + { + char_type* data = BeginWriting(); + aIter.mStart = data; + aIter.mEnd = data + mLength; + aIter.mPosition = aIter.mStart; + return aIter; + } + + iterator& EndWriting(iterator& aIter) + { + char_type* data = BeginWriting(); + aIter.mStart = data; + aIter.mEnd = data + mLength; + aIter.mPosition = aIter.mEnd; + return aIter; + } + + + + + + void Assign(char_type aChar); + __attribute__ ((warn_unused_result)) bool Assign(char_type aChar, const fallible_t&); + + void Assign(const char_type* aData); + __attribute__ ((warn_unused_result)) bool Assign(const char_type* aData, + const fallible_t&); + + void Assign(const char_type* aData, size_type aLength); + __attribute__ ((warn_unused_result)) bool Assign(const char_type* aData, + size_type aLength, const fallible_t&); + + void Assign(const self_type&); + __attribute__ ((warn_unused_result)) bool Assign(const self_type&, const fallible_t&); + + void Assign(const substring_tuple_type&); + __attribute__ ((warn_unused_result)) bool Assign(const substring_tuple_type&, + const fallible_t&); +# 515 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void AssignASCII(const char* aData, size_type aLength); + __attribute__ ((warn_unused_result)) bool AssignASCII(const char* aData, + size_type aLength, + const fallible_t&); + + void AssignASCII(const char* aData) + { + AssignASCII(aData, mozilla::AssertedCast(strlen(aData))); + } + __attribute__ ((warn_unused_result)) bool AssignASCII(const char* aData, + const fallible_t& aFallible) + { + return AssignASCII(aData, + mozilla::AssertedCast(strlen(aData)), + aFallible); + } + + + + + + + + template + void AssignLiteral(const char_type (&aStr)[N]) + { + AssignLiteral(aStr, N - 1); + } +# 551 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + self_type& operator=(char_type aChar) + { + Assign(aChar); + return *this; + } + self_type& operator=(const char_type* aData) + { + Assign(aData); + return *this; + } + + + + + + + + self_type& operator=(const self_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } + + void Adopt(char_type* aData, size_type aLength = size_type(-1)); + + + + + + + void Replace(index_type aCutStart, size_type aCutLength, + char_type aChar); + __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart, + size_type aCutLength, + char_type aChar, + const fallible_t&); + void Replace(index_type aCutStart, size_type aCutLength, + const char_type* aData, + size_type aLength = size_type(-1)); + __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart, + size_type aCutLength, + const char_type* aData, + size_type aLength, + const fallible_t&); + void Replace(index_type aCutStart, size_type aCutLength, + const self_type& aStr) + { + Replace(aCutStart, aCutLength, aStr.Data(), aStr.Length()); + } + __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart, + size_type aCutLength, + const self_type& aStr, + const fallible_t& aFallible) + { + return Replace(aCutStart, aCutLength, aStr.Data(), aStr.Length(), + aFallible); + } + void Replace(index_type aCutStart, size_type aCutLength, + const substring_tuple_type& aTuple); + + void ReplaceASCII(index_type aCutStart, size_type aCutLength, + const char* aData, + size_type aLength = size_type(-1)); + + __attribute__ ((warn_unused_result)) bool ReplaceASCII(index_type aCutStart, size_type aCutLength, + const char* aData, + size_type aLength, + const fallible_t&); + + + + + template + void ReplaceLiteral(index_type aCutStart, size_type aCutLength, + const char_type (&aStr)[N]) + { + ReplaceLiteral(aCutStart, aCutLength, aStr, N - 1); + } + + void Append(char_type aChar) + { + Replace(mLength, 0, aChar); + } + __attribute__ ((warn_unused_result)) bool Append(char_type aChar, const fallible_t& aFallible) + { + return Replace(mLength, 0, aChar, aFallible); + } + void Append(const char_type* aData, size_type aLength = size_type(-1)) + { + Replace(mLength, 0, aData, aLength); + } + __attribute__ ((warn_unused_result)) bool Append(const char_type* aData, size_type aLength, + const fallible_t& aFallible) + { + return Replace(mLength, 0, aData, aLength, aFallible); + } +# 660 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void Append(const self_type& aStr) + { + Replace(mLength, 0, aStr); + } + __attribute__ ((warn_unused_result)) bool Append(const self_type& aStr, const fallible_t& aFallible) + { + return Replace(mLength, 0, aStr, aFallible); + } + void Append(const substring_tuple_type& aTuple) + { + Replace(mLength, 0, aTuple); + } + + void AppendASCII(const char* aData, size_type aLength = size_type(-1)) + { + ReplaceASCII(mLength, 0, aData, aLength); + } + + __attribute__ ((warn_unused_result)) bool AppendASCII(const char* aData, const fallible_t& aFallible) + { + return ReplaceASCII(mLength, 0, aData, size_type(-1), aFallible); + } + + __attribute__ ((warn_unused_result)) bool AppendASCII(const char* aData, size_type aLength, const fallible_t& aFallible) + { + return ReplaceASCII(mLength, 0, aData, aLength, aFallible); + } + + + + + + + + void AppendPrintf(const char* aFormat, ...) __attribute__ ((format (printf, 2, 3))); + void AppendPrintf(const char* aFormat, va_list aAp); + void AppendInt(int32_t aInteger) + { + AppendPrintf("%" "d", aInteger); + } + void AppendInt(int32_t aInteger, int aRadix) + { + if (aRadix == 10) { + AppendPrintf("%" "d", aInteger); + } else { + AppendPrintf(aRadix == 8 ? "%" "o" : "%" "x", + static_cast(aInteger)); + } + } + void AppendInt(uint32_t aInteger) + { + AppendPrintf("%" "u", aInteger); + } + void AppendInt(uint32_t aInteger, int aRadix) + { + AppendPrintf(aRadix == 10 ? "%" "u" : aRadix == 8 ? "%" "o" : "%" "x", + aInteger); + } + void AppendInt(int64_t aInteger) + { + AppendPrintf("%" "l" "d", aInteger); + } + void AppendInt(int64_t aInteger, int aRadix) + { + if (aRadix == 10) { + AppendPrintf("%" "l" "d", aInteger); + } else { + AppendPrintf(aRadix == 8 ? "%" "l" "o" : "%" "l" "x", + static_cast(aInteger)); + } + } + void AppendInt(uint64_t aInteger) + { + AppendPrintf("%" "l" "u", aInteger); + } + void AppendInt(uint64_t aInteger, int aRadix) + { + AppendPrintf(aRadix == 10 ? "%" "l" "u" : aRadix == 8 ? "%" "l" "o" : "%" "l" "x", + aInteger); + } + + + + + void AppendFloat(float aFloat); + void AppendFloat(double aFloat); +public: + + + + + template + void AppendLiteral(const char_type (&aStr)[N]) + { + ReplaceLiteral(mLength, 0, aStr, N - 1); + } +# 770 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + self_type& operator+=(char_type aChar) + { + Append(aChar); + return *this; + } + self_type& operator+=(const char_type* aData) + { + Append(aData); + return *this; + } + + + + + + + + self_type& operator+=(const self_type& aStr) + { + Append(aStr); + return *this; + } + self_type& operator+=(const substring_tuple_type& aTuple) + { + Append(aTuple); + return *this; + } + + void Insert(char_type aChar, index_type aPos) + { + Replace(aPos, 0, aChar); + } + void Insert(const char_type* aData, index_type aPos, + size_type aLength = size_type(-1)) + { + Replace(aPos, 0, aData, aLength); + } + + + + + + + + void Insert(const self_type& aStr, index_type aPos) + { + Replace(aPos, 0, aStr); + } + void Insert(const substring_tuple_type& aTuple, index_type aPos) + { + Replace(aPos, 0, aTuple); + } + + + + + template + void InsertLiteral(const char_type (&aStr)[N], index_type aPos) + { + ReplaceLiteral(aPos, 0, aStr, N - 1); + } + + void Cut(index_type aCutStart, size_type aCutLength) + { + Replace(aCutStart, aCutLength, char_traits::sEmptyBuffer, 0); + } + + nsCSubstringSplitter Split(const char_type aChar) const; +# 850 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void SetCapacity(size_type aNewCapacity); + __attribute__ ((warn_unused_result)) bool SetCapacity(size_type aNewCapacity, + const fallible_t&); + + void SetLength(size_type aNewLength); + __attribute__ ((warn_unused_result)) bool SetLength(size_type aNewLength, + const fallible_t&); + + void Truncate(size_type aNewLength = 0) + { + do { } while(0); + SetLength(aNewLength); + } +# 876 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + inline size_type GetData(const char_type** aData) const + { + *aData = mData; + return mLength; + } +# 892 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + size_type GetMutableData(char_type** aData, size_type aNewLen = size_type(-1)) + { + if (!EnsureMutable(aNewLen)) { + AllocFailed(aNewLen == size_type(-1) ? mLength : aNewLen); + } + + *aData = mData; + return mLength; + } + + size_type GetMutableData(char_type** aData, size_type aNewLen, const fallible_t&) + { + if (!EnsureMutable(aNewLen)) { + *aData = nullptr; + return 0; + } + + *aData = mData; + return mLength; + } +# 931 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + operator mozilla::Span() + { + return mozilla::MakeSpan(BeginWriting(), Length()); + } + + operator mozilla::Span() const + { + return mozilla::MakeSpan(BeginReading(), Length()); + } + + void Append(mozilla::Span aSpan) + { + auto len = aSpan.Length(); + do { static_assert(mozilla::detail::AssertionConditionType::value)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(len <= mozilla::MaxValue::value))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "len <= mozilla::MaxValue::value" ")"); do { *((volatile int*) __null) = 944; ::abort(); } while (0); } } while (0); + Append(aSpan.Elements(), len); + } + + __attribute__ ((warn_unused_result)) bool Append(mozilla::Span aSpan, + const fallible_t& aFallible) + { + auto len = aSpan.Length(); + if (len > mozilla::MaxValue::value) { + return false; + } + return Append(aSpan.Elements(), len, aFallible); + } + + + operator mozilla::Span() + { + return mozilla::MakeSpan(reinterpret_cast(BeginWriting()), + Length()); + } + + operator mozilla::Span() const + { + return mozilla::MakeSpan(reinterpret_cast(BeginReading()), + Length()); + } + + void Append(mozilla::Span aSpan) + { + auto len = aSpan.Length(); + do { static_assert(mozilla::detail::AssertionConditionType::value)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(len <= mozilla::MaxValue::value))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "len <= mozilla::MaxValue::value" ")"); do { *((volatile int*) __null) = 974; ::abort(); } while (0); } } while (0); + Append(reinterpret_cast(aSpan.Elements()), len); + } + + __attribute__ ((warn_unused_result)) bool Append(mozilla::Span aSpan, + const fallible_t& aFallible) + { + auto len = aSpan.Length(); + if (len > mozilla::MaxValue::value) { + return false; + } + return Append( + reinterpret_cast(aSpan.Elements()), len, aFallible); + } + + + + + + + + void SetIsVoid(bool); +# 1005 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void StripChar(char_type aChar, int32_t aOffset = 0); +# 1015 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + void StripChars(const char_type* aChars, uint32_t aOffset = 0); + + + + + + void ForgetSharedBuffer() + { + if (mFlags & nsSubstring::F_SHARED) { + mData = char_traits::sEmptyBuffer; + mLength = 0; + mFlags = F_TERMINATED; + } + } + +public: + + + + + + nsACString(const substring_tuple_type& aTuple) + : nsCStringRepr(nullptr, 0, F_NONE) + { + Assign(aTuple); + } + + size_t SizeOfExcludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf) + const; + size_t SizeOfIncludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf) + const; + + + + + + + + size_t SizeOfExcludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf) + const; + size_t SizeOfIncludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf) + const; + + template + void NS_ABORT_OOM(T) + { + struct never {}; + static_assert(mozilla::IsSame::value, + "In string classes, use AllocFailed to account for sizeof(char_type). " + "Use the global ::NS_ABORT_OOM if you really have a count of bytes."); + } + + __attribute__((always_inline)) inline void AllocFailed(size_t aLength) + { + ::NS_ABORT_OOM(aLength * sizeof(char_type)); + } + +protected: + + + nsACString() + : nsCStringRepr(char_traits::sEmptyBuffer, 0, F_TERMINATED) + { + } + + + + nsACString(const self_type& aStr) + : nsCStringRepr(aStr.mData, aStr.mLength, + aStr.mFlags & (F_TERMINATED | F_VOIDED)) + { + } +# 1097 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + nsACString(char_type* aData, size_type aLength, uint32_t aFlags) + : nsCStringRepr(aData, aLength, aFlags) + { + } + + + + + + + + void Finalize(); +# 1128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + bool MutatePrep(size_type aCapacity, + char_type** aOldData, uint32_t* aOldFlags); +# 1151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + __attribute__ ((warn_unused_result)) bool ReplacePrep(index_type aCutStart, + size_type aCutLength, + size_type aNewLength); + + __attribute__ ((warn_unused_result)) bool ReplacePrepInternal( + index_type aCutStart, + size_type aCutLength, + size_type aNewFragLength, + size_type aNewTotalLength); +# 1168 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" + size_type Capacity() const; + + + + + + __attribute__ ((warn_unused_result)) bool EnsureMutable( + size_type aNewLen = size_type(-1)); + + + + + static __attribute__ ((warn_unused_result)) bool CheckCapacity(size_type aCapacity) { + if (aCapacity > kMaxCapacity) { + + + do { } while(0); + return false; + } + + return true; + } + + + + + void SetDataFlags(uint32_t aDataFlags) + { + do { } while(0); + mFlags = aDataFlags | (mFlags & 0xFFFF0000); + } + + void ReplaceLiteral(index_type aCutStart, size_type aCutLength, + const char_type* aData, size_type aLength); + + static const size_type kMaxCapacity; +public: + + + + void AssignLiteral(const char_type* aData, size_type aLength); +}; + +static_assert(sizeof(nsACString) == + sizeof(mozilla::detail::nsCStringRepr), + "Don't add new data fields to nsTSubstring_CharT. " + "Add to nsTStringRepr_CharT instead."); + +int +Compare(const nsACString::base_string_type& aLhs, + const nsACString::base_string_type& aRhs, + const nsCStringComparator& = nsDefaultCStringComparator()); + + +inline bool +operator!=(const nsACString::base_string_type& aLhs, + const nsACString::base_string_type& aRhs) +{ + return !aLhs.Equals(aRhs); +} + +inline bool +operator!=(const nsACString::base_string_type& aLhs, + const nsACString::char_type* aRhs) +{ + return !aLhs.Equals(aRhs); +} + +inline bool +operator<(const nsACString::base_string_type& aLhs, + const nsACString::base_string_type& aRhs) +{ + return Compare(aLhs, aRhs) < 0; +} + +inline bool +operator<=(const nsACString::base_string_type& aLhs, + const nsACString::base_string_type& aRhs) +{ + return Compare(aLhs, aRhs) <= 0; +} + +inline bool +operator==(const nsACString::base_string_type& aLhs, + const nsACString::base_string_type& aRhs) +{ + return aLhs.Equals(aRhs); +} + +inline bool +operator==(const nsACString::base_string_type& aLhs, + const nsACString::char_type* aRhs) +{ + return aLhs.Equals(aRhs); +} + + +inline bool +operator>=(const nsACString::base_string_type& aLhs, + const nsACString::base_string_type& aRhs) +{ + return Compare(aLhs, aRhs) >= 0; +} + +inline bool +operator>(const nsACString::base_string_type& aLhs, + const nsACString::base_string_type& aRhs) +{ + return Compare(aLhs, aRhs) > 0; +} + + + +class nsCSubstringSplitter +{ + typedef nsACString::size_type size_type; + typedef nsACString::char_type char_type; + + class nsTSubstringSplit_Iter + { + public: + nsTSubstringSplit_Iter(const nsCSubstringSplitter& aObj, + size_type aPos) + : mObj(aObj) + , mPos(aPos) + { + } + + bool operator!=(const nsTSubstringSplit_Iter& other) const + { + return mPos != other.mPos; + } + + const nsDependentCSubstring& operator*() const; + + const nsTSubstringSplit_Iter& operator++() + { + ++mPos; + return *this; + } + + private: + const nsCSubstringSplitter& mObj; + size_type mPos; + }; + +private: + const nsACString* const mStr; + mozilla::UniquePtr mArray; + size_type mArraySize; + const char_type mDelim; + +public: + nsCSubstringSplitter(const nsACString* aStr, char_type aDelim); + + nsTSubstringSplit_Iter begin() const + { + return nsTSubstringSplit_Iter(*this, 0); + } + + nsTSubstringSplit_Iter end() const + { + return nsTSubstringSplit_Iter(*this, mArraySize); + } + + const nsDependentCSubstring& Get(const size_type index) const + { + do { } while (0); + return mArray[index]; + } +}; + + + + +namespace mozilla { + +inline Span +MakeSpan(nsACString& aString) +{ + return aString; +} + +inline Span +MakeSpan(const nsACString& aString) +{ + return aString; +} + +} +# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2 + + + + + + +class nsCaseInsensitiveCStringComparator + : public nsCStringComparator +{ +public: + nsCaseInsensitiveCStringComparator() + { + } + typedef char char_type; + + virtual int operator()(const char_type*, const char_type*, + uint32_t, uint32_t) const override; +}; + +class nsCaseInsensitiveCStringArrayComparator +{ +public: + template + bool Equals(const A& aStrA, const B& aStrB) const + { + return aStrA.Equals(aStrB, nsCaseInsensitiveCStringComparator()); + } +}; + + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstring.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstringTuple.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstringTuple.h" +class nsSubstringTuple +{ +public: + + typedef char16_t char_type; + typedef nsCharTraits char_traits; + + typedef nsSubstringTuple self_type; + typedef mozilla::detail::nsStringRepr base_string_type; + typedef uint32_t size_type; + +public: + + nsSubstringTuple(const base_string_type* aStrA, + const base_string_type* aStrB) + : mHead(nullptr) + , mFragA(aStrA) + , mFragB(aStrB) + { + } + + nsSubstringTuple(const self_type& aHead, + const base_string_type* aStrB) + : mHead(&aHead) + , mFragA(nullptr) + , mFragB(aStrB) + { + } + + + + + size_type Length() const; + + + + + + + void WriteTo(char_type* aBuf, uint32_t aBufLen) const; + + + + + + bool IsDependentOn(const char_type* aStart, const char_type* aEnd) const; + +private: + + const self_type* const mHead; + const base_string_type* const mFragA; + const base_string_type* const mFragB; +}; + +inline const nsSubstringTuple +operator+(const nsSubstringTuple::base_string_type& aStrA, + const nsSubstringTuple::base_string_type& aStrB) +{ + return nsSubstringTuple(&aStrA, &aStrB); +} + +inline const nsSubstringTuple +operator+(const nsSubstringTuple& aHead, + const nsSubstringTuple::base_string_type& aStrB) +{ + return nsSubstringTuple(aHead, &aStrB); +} +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstringTuple.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstringTuple.h" +class nsCSubstringTuple +{ +public: + + typedef char char_type; + typedef nsCharTraits char_traits; + + typedef nsCSubstringTuple self_type; + typedef mozilla::detail::nsCStringRepr base_string_type; + typedef uint32_t size_type; + +public: + + nsCSubstringTuple(const base_string_type* aStrA, + const base_string_type* aStrB) + : mHead(nullptr) + , mFragA(aStrA) + , mFragB(aStrB) + { + } + + nsCSubstringTuple(const self_type& aHead, + const base_string_type* aStrB) + : mHead(&aHead) + , mFragA(nullptr) + , mFragB(aStrB) + { + } + + + + + size_type Length() const; + + + + + + + void WriteTo(char_type* aBuf, uint32_t aBufLen) const; + + + + + + bool IsDependentOn(const char_type* aStart, const char_type* aEnd) const; + +private: + + const self_type* const mHead; + const base_string_type* const mFragA; + const base_string_type* const mFragB; +}; + +inline const nsCSubstringTuple +operator+(const nsCSubstringTuple::base_string_type& aStrA, + const nsCSubstringTuple::base_string_type& aStrB) +{ + return nsCSubstringTuple(&aStrA, &aStrB); +} + +inline const nsCSubstringTuple +operator+(const nsCSubstringTuple& aHead, + const nsCSubstringTuple::base_string_type& aStrB) +{ + return nsCSubstringTuple(aHead, &aStrB); +} +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2 +# 60 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstring.h" 2 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h" 1 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h" +class nsDependentSubstring : public nsAString +{ +public: + + typedef nsDependentSubstring self_type; + +public: + + void Rebind(const substring_type&, uint32_t aStartPos, + uint32_t aLength = size_type(-1)); + + void Rebind(const char_type* aData, size_type aLength); + + void Rebind(const char_type* aStart, const char_type* aEnd); + + nsDependentSubstring(const substring_type& aStr, uint32_t aStartPos, + uint32_t aLength = size_type(-1)) + : substring_type() + { + Rebind(aStr, aStartPos, aLength); + } + + nsDependentSubstring(const char_type* aData, size_type aLength) + : substring_type(const_cast(aData), aLength, F_NONE) + { + } + + nsDependentSubstring(const char_type* aStart, const char_type* aEnd); +# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h" + nsDependentSubstring(const const_iterator& aStart, + const const_iterator& aEnd); + + + nsDependentSubstring() + : substring_type() + { + } + + + +private: + + void operator=(const self_type&); +}; + +inline const nsDependentSubstring +Substring(const nsAString& aStr, uint32_t aStartPos, + uint32_t aLength = uint32_t(-1)) +{ + return nsDependentSubstring(aStr, aStartPos, aLength); +} + +inline const nsDependentSubstring +Substring(const nsReadingIterator& aStart, + const nsReadingIterator& aEnd) +{ + return nsDependentSubstring(aStart.get(), aEnd.get()); +} + +inline const nsDependentSubstring +Substring(const char16_t* aData, uint32_t aLength) +{ + return nsDependentSubstring(aData, aLength); +} + +const nsDependentSubstring +Substring(const char16_t* aStart, const char16_t* aEnd); + +inline const nsDependentSubstring +StringHead(const nsAString& aStr, uint32_t aCount) +{ + return nsDependentSubstring(aStr, 0, aCount); +} + +inline const nsDependentSubstring +StringTail(const nsAString& aStr, uint32_t aCount) +{ + return nsDependentSubstring(aStr, aStr.Length() - aCount, aCount); +} +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h" 1 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h" +class nsDependentCSubstring : public nsACString +{ +public: + + typedef nsDependentCSubstring self_type; + +public: + + void Rebind(const substring_type&, uint32_t aStartPos, + uint32_t aLength = size_type(-1)); + + void Rebind(const char_type* aData, size_type aLength); + + void Rebind(const char_type* aStart, const char_type* aEnd); + + nsDependentCSubstring(const substring_type& aStr, uint32_t aStartPos, + uint32_t aLength = size_type(-1)) + : substring_type() + { + Rebind(aStr, aStartPos, aLength); + } + + nsDependentCSubstring(const char_type* aData, size_type aLength) + : substring_type(const_cast(aData), aLength, F_NONE) + { + } + + nsDependentCSubstring(const char_type* aStart, const char_type* aEnd); +# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h" + nsDependentCSubstring(const const_iterator& aStart, + const const_iterator& aEnd); + + + nsDependentCSubstring() + : substring_type() + { + } + + + +private: + + void operator=(const self_type&); +}; + +inline const nsDependentCSubstring +Substring(const nsACString& aStr, uint32_t aStartPos, + uint32_t aLength = uint32_t(-1)) +{ + return nsDependentCSubstring(aStr, aStartPos, aLength); +} + +inline const nsDependentCSubstring +Substring(const nsReadingIterator& aStart, + const nsReadingIterator& aEnd) +{ + return nsDependentCSubstring(aStart.get(), aEnd.get()); +} + +inline const nsDependentCSubstring +Substring(const char* aData, uint32_t aLength) +{ + return nsDependentCSubstring(aData, aLength); +} + +const nsDependentCSubstring +Substring(const char* aStart, const char* aEnd); + +inline const nsDependentCSubstring +StringHead(const nsACString& aStr, uint32_t aCount) +{ + return nsDependentCSubstring(aStr, 0, aCount); +} + +inline const nsDependentCSubstring +StringTail(const nsACString& aStr, uint32_t aCount) +{ + return nsDependentCSubstring(aStr, aStr.Length() - aCount, aCount); +} +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" 1 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +inline size_t +Distance(const nsReadingIterator& aStart, + const nsReadingIterator& aEnd) +{ + do { } while (0); + return static_cast(aEnd.get() - aStart.get()); +} +inline size_t +Distance(const nsReadingIterator& aStart, + const nsReadingIterator& aEnd) +{ + do { } while (0); + return static_cast(aEnd.get() - aStart.get()); +} + +void LossyCopyUTF16toASCII(const nsAString& aSource, nsACString& aDest); +void CopyASCIItoUTF16(const nsACString& aSource, nsAString& aDest); + +void LossyCopyUTF16toASCII(const char16ptr_t aSource, nsACString& aDest); +void CopyASCIItoUTF16(const char* aSource, nsAString& aDest); + +void CopyUTF16toUTF8(const nsAString& aSource, nsACString& aDest); +__attribute__ ((warn_unused_result)) bool CopyUTF16toUTF8(const nsAString& aSource, nsACString& aDest, + const mozilla::fallible_t&); +void CopyUTF8toUTF16(const nsACString& aSource, nsAString& aDest); + +void CopyUTF16toUTF8(const char16ptr_t aSource, nsACString& aDest); +void CopyUTF8toUTF16(const char* aSource, nsAString& aDest); + +void LossyAppendUTF16toASCII(const nsAString& aSource, nsACString& aDest); +void AppendASCIItoUTF16(const nsACString& aSource, nsAString& aDest); +__attribute__ ((warn_unused_result)) bool AppendASCIItoUTF16(const nsACString& aSource, + nsAString& aDest, + const mozilla::fallible_t&); + +void LossyAppendUTF16toASCII(const char16ptr_t aSource, nsACString& aDest); +__attribute__ ((warn_unused_result)) bool AppendASCIItoUTF16(const char* aSource, + nsAString& aDest, + const mozilla::fallible_t&); +void AppendASCIItoUTF16(const char* aSource, nsAString& aDest); + +void AppendUTF16toUTF8(const nsAString& aSource, nsACString& aDest); +__attribute__ ((warn_unused_result)) bool AppendUTF16toUTF8(const nsAString& aSource, + nsACString& aDest, + const mozilla::fallible_t&); +void AppendUTF8toUTF16(const nsACString& aSource, nsAString& aDest); +__attribute__ ((warn_unused_result)) bool AppendUTF8toUTF16(const nsACString& aSource, + nsAString& aDest, + const mozilla::fallible_t&); + +void AppendUTF16toUTF8(const char16ptr_t aSource, nsACString& aDest); +void AppendUTF8toUTF16(const char* aSource, nsAString& aDest); +# 85 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +char* ToNewCString(const nsAString& aSource); +# 97 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +char* ToNewCString(const nsACString& aSource); +# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +char* ToNewUTF8String(const nsAString& aSource, uint32_t* aUTF8Count = nullptr); +# 129 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +char16_t* ToNewUnicode(const nsAString& aSource); +# 143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +char16_t* ToNewUnicode(const nsACString& aSource); +# 153 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +uint32_t CalcUTF8ToUnicodeLength(const nsACString& aSource); +# 173 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +char16_t* UTF8ToUnicodeBuffer(const nsACString& aSource, + char16_t* aBuffer, + uint32_t* aUTF16Count = nullptr); +# 192 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +char16_t* UTF8ToNewUnicode(const nsACString& aSource, + uint32_t* aUTF16Count = nullptr); +# 207 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +char16_t* CopyUnicodeTo(const nsAString& aSource, + uint32_t aSrcOffset, + char16_t* aDest, + uint32_t aLength); +# 224 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +void CopyUnicodeTo(const nsAString::const_iterator& aSrcStart, + const nsAString::const_iterator& aSrcEnd, + nsAString& aDest); +# 238 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +void AppendUnicodeTo(const nsAString::const_iterator& aSrcStart, + const nsAString::const_iterator& aSrcEnd, + nsAString& aDest); + + + + + + +bool IsASCII(const nsAString& aString); + + + + + + +bool IsASCII(const nsACString& aString); +# 287 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +bool IsUTF8(const nsACString& aString, bool aRejectNonChar = true); + +bool ParseString(const nsACString& aAstring, char aDelimiter, + nsTArray& aArray); + + + + +void ToUpperCase(nsACString&); + +void ToLowerCase(nsACString&); + +void ToUpperCase(nsCSubstring&); + +void ToLowerCase(nsCSubstring&); + + + + +void ToUpperCase(const nsACString& aSource, nsACString& aDest); + +void ToLowerCase(const nsACString& aSource, nsACString& aDest); +# 320 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +bool FindInReadable(const nsAString& aPattern, nsAString::const_iterator&, + nsAString::const_iterator&, + const nsStringComparator& = nsDefaultStringComparator()); +bool FindInReadable(const nsACString& aPattern, nsACString::const_iterator&, + nsACString::const_iterator&, + const nsCStringComparator& = nsDefaultCStringComparator()); + + + +inline bool +FindInReadable(const nsAString& aPattern, const nsAString& aSource, + const nsStringComparator& aCompare = nsDefaultStringComparator()) +{ + nsAString::const_iterator start, end; + aSource.BeginReading(start); + aSource.EndReading(end); + return FindInReadable(aPattern, start, end, aCompare); +} + +inline bool +FindInReadable(const nsACString& aPattern, const nsACString& aSource, + const nsCStringComparator& aCompare = nsDefaultCStringComparator()) +{ + nsACString::const_iterator start, end; + aSource.BeginReading(start); + aSource.EndReading(end); + return FindInReadable(aPattern, start, end, aCompare); +} + + +bool CaseInsensitiveFindInReadable(const nsACString& aPattern, + nsACString::const_iterator&, + nsACString::const_iterator&); + + + + + + + +bool RFindInReadable(const nsAString& aPattern, nsAString::const_iterator&, + nsAString::const_iterator&, + const nsStringComparator& = nsDefaultStringComparator()); +bool RFindInReadable(const nsACString& aPattern, nsACString::const_iterator&, + nsACString::const_iterator&, + const nsCStringComparator& = nsDefaultCStringComparator()); +# 375 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +bool FindCharInReadable(char16_t aChar, nsAString::const_iterator& aSearchStart, + const nsAString::const_iterator& aSearchEnd); +bool FindCharInReadable(char aChar, nsACString::const_iterator& aSearchStart, + const nsACString::const_iterator& aSearchEnd); + + + + +uint32_t CountCharInReadable(const nsAString& aStr, + char16_t aChar); +uint32_t CountCharInReadable(const nsACString& aStr, + char aChar); + +bool StringBeginsWith(const nsAString& aSource, const nsAString& aSubstring); +bool StringBeginsWith(const nsAString& aSource, const nsAString& aSubstring, + const nsStringComparator& aComparator); +bool StringBeginsWith(const nsACString& aSource, const nsACString& aSubstring); +bool StringBeginsWith(const nsACString& aSource, const nsACString& aSubstring, + const nsCStringComparator& aComparator); +bool StringEndsWith(const nsAString& aSource, const nsAString& aSubstring); +bool StringEndsWith(const nsAString& aSource, const nsAString& aSubstring, + const nsStringComparator& aComparator); +bool StringEndsWith(const nsACString& aSource, const nsACString& aSubstring); +bool StringEndsWith(const nsACString& aSource, const nsACString& aSubstring, + const nsCStringComparator& aComparator); + +const nsAFlatString& EmptyString(); +const nsAFlatCString& EmptyCString(); + +const nsAFlatString& NullString(); +const nsAFlatCString& NullCString(); +# 415 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" +int32_t CompareUTF8toUTF16(const nsASingleFragmentCString& aUTF8String, + const nsASingleFragmentString& aUTF16String); + +void AppendUCS4ToUTF16(const uint32_t aSource, nsAString& aDest); + +template +inline bool +EnsureStringLength(T& aStr, uint32_t aLen) +{ + aStr.SetLength(aLen); + return (aStr.Length() == aLen); +} +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 +# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1 +# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" +class nsString : public nsAString +{ +public: + + typedef nsString self_type; + +public: + + + + + + nsString() + : substring_type() + { + } + + explicit + nsString(const char_type* aData, size_type aLength = size_type(-1)) + : substring_type() + { + Assign(aData, aLength); + } +# 53 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + nsString(const self_type& aStr) + : substring_type() + { + Assign(aStr); + } + + nsString(const substring_tuple_type& aTuple) + : substring_type() + { + Assign(aTuple); + } + + explicit + nsString(const substring_type& aReadable) + : substring_type() + { + Assign(aReadable); + } + + + + self_type& operator=(char_type aChar) + { + Assign(aChar); + return *this; + } + self_type& operator=(const char_type* aData) + { + Assign(aData); + return *this; + } + self_type& operator=(const self_type& aStr) + { + Assign(aStr); + return *this; + } + + + + + + + + self_type& operator=(const substring_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } +# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + const char_type* get() const + + { + return mData; + } +# 128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + char_type CharAt(index_type aIndex) const + { + do { } while(0); + return mData[aIndex]; + } + + char_type operator[](index_type aIndex) const + { + return CharAt(aIndex); + } +# 154 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t Find(const nsCString& aString, bool aIgnoreCase = false, + int32_t aOffset = 0, int32_t aCount = -1) const; + int32_t Find(const char* aString, bool aIgnoreCase = false, + int32_t aOffset = 0, int32_t aCount = -1) const; + + + int32_t Find(const nsAFlatString& aString, int32_t aOffset = 0, + int32_t aCount = -1) const; + int32_t Find(const char16_t* aString, int32_t aOffset = 0, + int32_t aCount = -1) const; +# 186 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t RFind(const nsCString& aString, bool aIgnoreCase = false, + int32_t aOffset = -1, int32_t aCount = -1) const; + int32_t RFind(const char* aCString, bool aIgnoreCase = false, + int32_t aOffset = -1, int32_t aCount = -1) const; + + + int32_t RFind(const nsAFlatString& aString, int32_t aOffset = -1, + int32_t aCount = -1) const; + int32_t RFind(const char16_t* aString, int32_t aOffset = -1, + int32_t aCount = -1) const; +# 210 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t RFindChar(char16_t aChar, int32_t aOffset = -1, + int32_t aCount = -1) const; +# 224 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t FindCharInSet(const char* aString, int32_t aOffset = 0) const; + int32_t FindCharInSet(const self_type& aString, int32_t aOffset = 0) const + { + return FindCharInSet(aString.get(), aOffset); + } + + + int32_t FindCharInSet(const char16_t* aString, int32_t aOffset = 0) const; +# 245 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t RFindCharInSet(const char_type* aString, int32_t aOffset = -1) const; + int32_t RFindCharInSet(const self_type& aString, int32_t aOffset = -1) const + { + return RFindCharInSet(aString.get(), aOffset); + } +# 281 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + bool EqualsIgnoreCase(const char* aString, int32_t aCount = -1) const; +# 292 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + double ToDouble(nsresult* aErrorCode) const; + + + + + + + + float ToFloat(nsresult* aErrorCode) const + { + return (float)ToDouble(aErrorCode); + } +# 312 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t ToInteger(nsresult* aErrorCode, uint32_t aRadix = (10)) const; + + + + + + + + int64_t ToInteger64(nsresult* aErrorCode, uint32_t aRadix = (10)) const; +# 340 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + size_type Mid(self_type& aResult, uint32_t aStartPos, uint32_t aCount) const; + + size_type Left(self_type& aResult, size_type aCount) const + { + return Mid(aResult, 0, aCount); + } + + size_type Right(self_type& aResult, size_type aCount) const + { + aCount = XPCOM_MIN(mLength, aCount); + return Mid(aResult, mLength - aCount, aCount); + } +# 362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + bool SetCharAt(char16_t aChar, uint32_t aIndex); +# 372 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + using nsAString::StripChars; + + void StripChars(const char* aSet); + bool StripChars(const char* aSet, const fallible_t&); + + + + + + void StripWhitespace(); + bool StripWhitespace(const fallible_t&); + + + + + + + void ReplaceChar(char_type aOldChar, char_type aNewChar); + void ReplaceChar(const char* aSet, char_type aNewChar); + + void ReplaceChar(const char16_t* aSet, char16_t aNewChar); + + + + + + + void ReplaceSubstring(const self_type& aTarget, const self_type& aNewValue); + void ReplaceSubstring(const char_type* aTarget, const char_type* aNewValue); + __attribute__ ((warn_unused_result)) bool ReplaceSubstring(const self_type& aTarget, + const self_type& aNewValue, + const fallible_t&); + __attribute__ ((warn_unused_result)) bool ReplaceSubstring(const char_type* aTarget, + const char_type* aNewValue, + const fallible_t&); +# 419 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + void Trim(const char* aSet, bool aEliminateLeading = true, + bool aEliminateTrailing = true, bool aIgnoreQuotes = false); +# 430 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + void CompressWhitespace(bool aEliminateLeading = true, + bool aEliminateTrailing = true); + + + + + + + void AssignWithConversion(const nsACString& aString); + void AssignWithConversion(const incompatible_char_type* aData, + int32_t aLength = -1); +# 449 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + void Rebind(const char_type* aData, size_type aLength); + + + + + void AssertValidDependentString() + { + do { } while(0); + do { } while(0); + do { } while(0); + + + } + + +protected: + + + nsString(char_type* aData, size_type aLength, uint32_t aFlags) + : substring_type(aData, aLength, aFlags) + { + } + + struct Segment { + uint32_t mBegin, mLength; + Segment(uint32_t aBegin, uint32_t aLength) + : mBegin(aBegin) + , mLength(aLength) + {} + }; +}; + + +class nsFixedString : public nsString +{ +public: + + typedef nsFixedString self_type; + typedef nsFixedString fixed_string_type; + +public: +# 501 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + nsFixedString(char_type* aData, size_type aStorageSize) + : string_type(aData, uint32_t(char_traits::length(aData)), + F_TERMINATED | F_FIXED | F_CLASS_FIXED) + , mFixedCapacity(aStorageSize - 1) + , mFixedBuf(aData) + { + } + + nsFixedString(char_type* aData, size_type aStorageSize, + size_type aLength) + : string_type(aData, aLength, F_TERMINATED | F_FIXED | F_CLASS_FIXED) + , mFixedCapacity(aStorageSize - 1) + , mFixedBuf(aData) + { + + mFixedBuf[aLength] = char_type(0); + } + + + self_type& operator=(char_type aChar) + { + Assign(aChar); + return *this; + } + self_type& operator=(const char_type* aData) + { + Assign(aData); + return *this; + } + self_type& operator=(const substring_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } + +protected: + + friend class nsAString; + + size_type mFixedCapacity; + char_type* mFixedBuf; +}; +# 562 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" +class nsAutoString : public nsFixedString +{ +public: + + typedef nsAutoString self_type; + +public: + + + + + + nsAutoString() + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + } + + explicit + nsAutoString(char_type aChar) + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + Assign(aChar); + } + + explicit + nsAutoString(const char_type* aData, size_type aLength = size_type(-1)) + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + Assign(aData, aLength); + } +# 601 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + nsAutoString(const self_type& aStr) + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + Assign(aStr); + } + + explicit + nsAutoString(const substring_type& aStr) + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + Assign(aStr); + } + + nsAutoString(const substring_tuple_type& aTuple) + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + Assign(aTuple); + } + + + self_type& operator=(char_type aChar) + { + Assign(aChar); + return *this; + } + self_type& operator=(const char_type* aData) + { + Assign(aData); + return *this; + } + + + + + + + + self_type& operator=(const self_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } + + enum + { + kDefaultStorageSize = 64 + }; + +private: + + char_type mStorage[kDefaultStorageSize]; +}; + + + + + + + +template class nsTArrayElementTraits; +template<> +class nsTArrayElementTraits +{ +public: + template struct Dont_Instantiate_nsTArray_of; + template struct Instead_Use_nsTArray_of; + + static Dont_Instantiate_nsTArray_of* + Construct(Instead_Use_nsTArray_of* aE) + { + return 0; + } + template + static Dont_Instantiate_nsTArray_of* + Construct(Instead_Use_nsTArray_of* aE, const A& aArg) + { + return 0; + } + static Dont_Instantiate_nsTArray_of* + Destruct(Instead_Use_nsTArray_of* aE) + { + return 0; + } +}; +# 708 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" +class nsXPIDLString : public nsString +{ +public: + + typedef nsXPIDLString self_type; + +public: + + nsXPIDLString() + : string_type(char_traits::sEmptyBuffer, 0, F_TERMINATED | F_VOIDED) + { + } + + + nsXPIDLString(const self_type& aStr) + : string_type(char_traits::sEmptyBuffer, 0, F_TERMINATED | F_VOIDED) + { + Assign(aStr); + } + + + + + + const char_type* get() const + + { + return (mFlags & F_VOIDED) ? nullptr : mData; + } + + + + operator const char_type*() const + { + return get(); + } + + + char_type operator[](int32_t aIndex) const + { + return CharAt(index_type(aIndex)); + } + + + self_type& operator=(char_type aChar) + { + Assign(aChar); + return *this; + } + self_type& operator=(const char_type* aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const self_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } +}; +# 792 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" +class nsGetterCopies +{ +public: + typedef char16_t char_type; + + explicit nsGetterCopies(nsAString& aStr) + : mString(aStr) + , mData(nullptr) + { + } + + ~nsGetterCopies() + { + mString.Adopt(mData); + } + + operator char_type**() + { + return &mData; + } + +private: + nsAString& mString; + char_type* mData; +}; + +inline nsGetterCopies +getter_Copies(nsAString& aString) +{ + return nsGetterCopies(aString); +} +# 833 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" +class nsAdoptingString : public nsXPIDLString +{ +public: + + typedef nsAdoptingString self_type; + +public: + + explicit nsAdoptingString() + { + } + explicit nsAdoptingString(char_type* aStr, + size_type aLength = size_type(-1)) + { + Adopt(aStr, aLength); + } + + + + + + nsAdoptingString(const self_type& aStr) + : nsXPIDLString() + { + *this = aStr; + } + + + self_type& operator=(const substring_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } + + + + + self_type& operator=(const self_type& aStr); + +private: + self_type& operator=(const char_type* aData) = delete; + self_type& operator=(char_type* aData) = delete; +}; +# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1 +# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" +class nsCString : public nsACString +{ +public: + + typedef nsCString self_type; + +public: + + + + + + nsCString() + : substring_type() + { + } + + explicit + nsCString(const char_type* aData, size_type aLength = size_type(-1)) + : substring_type() + { + Assign(aData, aLength); + } +# 53 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + nsCString(const self_type& aStr) + : substring_type() + { + Assign(aStr); + } + + nsCString(const substring_tuple_type& aTuple) + : substring_type() + { + Assign(aTuple); + } + + explicit + nsCString(const substring_type& aReadable) + : substring_type() + { + Assign(aReadable); + } + + + + self_type& operator=(char_type aChar) + { + Assign(aChar); + return *this; + } + self_type& operator=(const char_type* aData) + { + Assign(aData); + return *this; + } + self_type& operator=(const self_type& aStr) + { + Assign(aStr); + return *this; + } + + + + + + + + self_type& operator=(const substring_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } +# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + const char_type* get() const + + { + return mData; + } +# 128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + char_type CharAt(index_type aIndex) const + { + do { } while(0); + return mData[aIndex]; + } + + char_type operator[](index_type aIndex) const + { + return CharAt(aIndex); + } +# 154 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t Find(const nsCString& aString, bool aIgnoreCase = false, + int32_t aOffset = 0, int32_t aCount = -1) const; + int32_t Find(const char* aString, bool aIgnoreCase = false, + int32_t aOffset = 0, int32_t aCount = -1) const; +# 186 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t RFind(const nsCString& aString, bool aIgnoreCase = false, + int32_t aOffset = -1, int32_t aCount = -1) const; + int32_t RFind(const char* aCString, bool aIgnoreCase = false, + int32_t aOffset = -1, int32_t aCount = -1) const; +# 210 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t RFindChar(char16_t aChar, int32_t aOffset = -1, + int32_t aCount = -1) const; +# 224 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t FindCharInSet(const char* aString, int32_t aOffset = 0) const; + int32_t FindCharInSet(const self_type& aString, int32_t aOffset = 0) const + { + return FindCharInSet(aString.get(), aOffset); + } +# 245 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t RFindCharInSet(const char_type* aString, int32_t aOffset = -1) const; + int32_t RFindCharInSet(const self_type& aString, int32_t aOffset = -1) const + { + return RFindCharInSet(aString.get(), aOffset); + } +# 262 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t Compare(const char* aString, bool aIgnoreCase = false, + int32_t aCount = -1) const; +# 276 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + bool EqualsIgnoreCase(const char* aString, int32_t aCount = -1) const + { + return Compare(aString, true, aCount) == 0; + } +# 292 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + double ToDouble(nsresult* aErrorCode) const; + + + + + + + + float ToFloat(nsresult* aErrorCode) const + { + return (float)ToDouble(aErrorCode); + } +# 312 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + int32_t ToInteger(nsresult* aErrorCode, uint32_t aRadix = (10)) const; + + + + + + + + int64_t ToInteger64(nsresult* aErrorCode, uint32_t aRadix = (10)) const; +# 340 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + size_type Mid(self_type& aResult, uint32_t aStartPos, uint32_t aCount) const; + + size_type Left(self_type& aResult, size_type aCount) const + { + return Mid(aResult, 0, aCount); + } + + size_type Right(self_type& aResult, size_type aCount) const + { + aCount = XPCOM_MIN(mLength, aCount); + return Mid(aResult, mLength - aCount, aCount); + } +# 362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + bool SetCharAt(char16_t aChar, uint32_t aIndex); +# 374 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + void StripChars(const char* aSet); + bool StripChars(const char* aSet, const fallible_t&); + + + + + + void StripWhitespace(); + bool StripWhitespace(const fallible_t&); + + + + + + + void ReplaceChar(char_type aOldChar, char_type aNewChar); + void ReplaceChar(const char* aSet, char_type aNewChar); +# 399 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + void ReplaceSubstring(const self_type& aTarget, const self_type& aNewValue); + void ReplaceSubstring(const char_type* aTarget, const char_type* aNewValue); + __attribute__ ((warn_unused_result)) bool ReplaceSubstring(const self_type& aTarget, + const self_type& aNewValue, + const fallible_t&); + __attribute__ ((warn_unused_result)) bool ReplaceSubstring(const char_type* aTarget, + const char_type* aNewValue, + const fallible_t&); +# 419 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + void Trim(const char* aSet, bool aEliminateLeading = true, + bool aEliminateTrailing = true, bool aIgnoreQuotes = false); +# 430 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + void CompressWhitespace(bool aEliminateLeading = true, + bool aEliminateTrailing = true); + + + + + + + void AssignWithConversion(const nsAString& aString); + void AssignWithConversion(const incompatible_char_type* aData, + int32_t aLength = -1); +# 449 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + void Rebind(const char_type* aData, size_type aLength); + + + + + void AssertValidDependentString() + { + do { } while(0); + do { } while(0); + do { } while(0); + + + } + + +protected: + + + nsCString(char_type* aData, size_type aLength, uint32_t aFlags) + : substring_type(aData, aLength, aFlags) + { + } + + struct Segment { + uint32_t mBegin, mLength; + Segment(uint32_t aBegin, uint32_t aLength) + : mBegin(aBegin) + , mLength(aLength) + {} + }; +}; + + +class nsFixedCString : public nsCString +{ +public: + + typedef nsFixedCString self_type; + typedef nsFixedCString fixed_string_type; + +public: +# 501 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + nsFixedCString(char_type* aData, size_type aStorageSize) + : string_type(aData, uint32_t(char_traits::length(aData)), + F_TERMINATED | F_FIXED | F_CLASS_FIXED) + , mFixedCapacity(aStorageSize - 1) + , mFixedBuf(aData) + { + } + + nsFixedCString(char_type* aData, size_type aStorageSize, + size_type aLength) + : string_type(aData, aLength, F_TERMINATED | F_FIXED | F_CLASS_FIXED) + , mFixedCapacity(aStorageSize - 1) + , mFixedBuf(aData) + { + + mFixedBuf[aLength] = char_type(0); + } + + + self_type& operator=(char_type aChar) + { + Assign(aChar); + return *this; + } + self_type& operator=(const char_type* aData) + { + Assign(aData); + return *this; + } + self_type& operator=(const substring_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } + +protected: + + friend class nsACString; + + size_type mFixedCapacity; + char_type* mFixedBuf; +}; +# 562 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" +class nsAutoCString : public nsFixedCString +{ +public: + + typedef nsAutoCString self_type; + +public: + + + + + + nsAutoCString() + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + } + + explicit + nsAutoCString(char_type aChar) + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + Assign(aChar); + } + + explicit + nsAutoCString(const char_type* aData, size_type aLength = size_type(-1)) + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + Assign(aData, aLength); + } +# 601 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" + nsAutoCString(const self_type& aStr) + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + Assign(aStr); + } + + explicit + nsAutoCString(const substring_type& aStr) + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + Assign(aStr); + } + + nsAutoCString(const substring_tuple_type& aTuple) + : fixed_string_type(mStorage, kDefaultStorageSize, 0) + { + Assign(aTuple); + } + + + self_type& operator=(char_type aChar) + { + Assign(aChar); + return *this; + } + self_type& operator=(const char_type* aData) + { + Assign(aData); + return *this; + } + + + + + + + + self_type& operator=(const self_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } + + enum + { + kDefaultStorageSize = 64 + }; + +private: + + char_type mStorage[kDefaultStorageSize]; +}; + + + + + + + +template class nsTArrayElementTraits; +template<> +class nsTArrayElementTraits +{ +public: + template struct Dont_Instantiate_nsTArray_of; + template struct Instead_Use_nsTArray_of; + + static Dont_Instantiate_nsTArray_of* + Construct(Instead_Use_nsTArray_of* aE) + { + return 0; + } + template + static Dont_Instantiate_nsTArray_of* + Construct(Instead_Use_nsTArray_of* aE, const A& aArg) + { + return 0; + } + static Dont_Instantiate_nsTArray_of* + Destruct(Instead_Use_nsTArray_of* aE) + { + return 0; + } +}; +# 708 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" +class nsXPIDLCString : public nsCString +{ +public: + + typedef nsXPIDLCString self_type; + +public: + + nsXPIDLCString() + : string_type(char_traits::sEmptyBuffer, 0, F_TERMINATED | F_VOIDED) + { + } + + + nsXPIDLCString(const self_type& aStr) + : string_type(char_traits::sEmptyBuffer, 0, F_TERMINATED | F_VOIDED) + { + Assign(aStr); + } + + + + + + const char_type* get() const + + { + return (mFlags & F_VOIDED) ? nullptr : mData; + } + + + + operator const char_type*() const + { + return get(); + } + + + char_type operator[](int32_t aIndex) const + { + return CharAt(index_type(aIndex)); + } + + + self_type& operator=(char_type aChar) + { + Assign(aChar); + return *this; + } + self_type& operator=(const char_type* aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const self_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } +}; +# 792 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" +class nsCGetterCopies +{ +public: + typedef char char_type; + + explicit nsCGetterCopies(nsACString& aStr) + : mString(aStr) + , mData(nullptr) + { + } + + ~nsCGetterCopies() + { + mString.Adopt(mData); + } + + operator char_type**() + { + return &mData; + } + +private: + nsACString& mString; + char_type* mData; +}; + +inline nsCGetterCopies +getter_Copies(nsACString& aString) +{ + return nsCGetterCopies(aString); +} +# 833 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" +class nsAdoptingCString : public nsXPIDLCString +{ +public: + + typedef nsAdoptingCString self_type; + +public: + + explicit nsAdoptingCString() + { + } + explicit nsAdoptingCString(char_type* aStr, + size_type aLength = size_type(-1)) + { + Adopt(aStr, aLength); + } + + + + + + nsAdoptingCString(const self_type& aStr) + : nsXPIDLCString() + { + *this = aStr; + } + + + self_type& operator=(const substring_type& aStr) + { + Assign(aStr); + return *this; + } + self_type& operator=(const substring_tuple_type& aTuple) + { + Assign(aTuple); + return *this; + } + + + + + self_type& operator=(const self_type& aStr); + +private: + self_type& operator=(const char_type* aData) = delete; + self_type& operator=(char_type* aData) = delete; +}; +# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 40 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 + +static_assert(sizeof(char16_t) == 2, "size of char16_t must be 2"); +static_assert(sizeof(nsString::char_type) == 2, + "size of nsString::char_type must be 2"); +static_assert(nsString::char_type(-1) > nsString::char_type(0), + "nsString::char_type must be unsigned"); +static_assert(sizeof(nsCString::char_type) == 1, + "size of nsCString::char_type must be 1"); + + + + + +class NS_LossyConvertUTF16toASCII : public nsAutoCString +{ +public: + explicit NS_LossyConvertUTF16toASCII(const char16ptr_t aString) + { + LossyAppendUTF16toASCII(aString, *this); + } + + NS_LossyConvertUTF16toASCII(const char16ptr_t aString, uint32_t aLength) + { + LossyAppendUTF16toASCII(Substring(aString, aLength), *this); + } + + explicit NS_LossyConvertUTF16toASCII(const nsAString& aString) + { + LossyAppendUTF16toASCII(aString, *this); + } + +private: + + NS_LossyConvertUTF16toASCII(char) = delete; +}; + + +class NS_ConvertASCIItoUTF16 : public nsAutoString +{ +public: + explicit NS_ConvertASCIItoUTF16(const char* aCString) + { + AppendASCIItoUTF16(aCString, *this); + } + + NS_ConvertASCIItoUTF16(const char* aCString, uint32_t aLength) + { + AppendASCIItoUTF16(Substring(aCString, aLength), *this); + } + + explicit NS_ConvertASCIItoUTF16(const nsACString& aCString) + { + AppendASCIItoUTF16(aCString, *this); + } + +private: + + NS_ConvertASCIItoUTF16(char16_t) = delete; +}; + + + + + +class NS_ConvertUTF16toUTF8 : public nsAutoCString +{ +public: + explicit NS_ConvertUTF16toUTF8(const char16ptr_t aString) + { + AppendUTF16toUTF8(aString, *this); + } + + NS_ConvertUTF16toUTF8(const char16ptr_t aString, uint32_t aLength) + { + AppendUTF16toUTF8(Substring(aString, aLength), *this); + } + + explicit NS_ConvertUTF16toUTF8(const nsAString& aString) + { + AppendUTF16toUTF8(aString, *this); + } + +private: + + NS_ConvertUTF16toUTF8(char) = delete; +}; + + +class NS_ConvertUTF8toUTF16 : public nsAutoString +{ +public: + explicit NS_ConvertUTF8toUTF16(const char* aCString) + { + AppendUTF8toUTF16(aCString, *this); + } + + NS_ConvertUTF8toUTF16(const char* aCString, uint32_t aLength) + { + AppendUTF8toUTF16(Substring(aCString, aLength), *this); + } + + explicit NS_ConvertUTF8toUTF16(const nsACString& aCString) + { + AppendUTF8toUTF16(aCString, *this); + } + +private: + + NS_ConvertUTF8toUTF16(char16_t) = delete; +}; +# 180 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" +inline char16_t* +wwc(char16_t* aStr) +{ + return aStr; +} + +inline const char16_t* +wwc(const char16_t* aStr) +{ + return aStr; +} + + + + +typedef nsAutoString nsVoidableString; + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2 + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" 1 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" +class nsDependentString : public nsString +{ +public: + + typedef nsDependentString self_type; + +public: + + + + + + nsDependentString(const char_type* aStart, const char_type* aEnd); + + nsDependentString(const char_type* aData, uint32_t aLength) + : string_type(const_cast(aData), aLength, F_TERMINATED) + { + AssertValidDependentString(); + } +# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" + explicit + nsDependentString(const char_type* aData) + : string_type(const_cast(aData), + uint32_t(char_traits::length(aData)), F_TERMINATED) + { + AssertValidDependentString(); + } +# 62 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" + nsDependentString(const string_type& aStr, uint32_t aStartPos) + : string_type() + { + Rebind(aStr, aStartPos); + } + + + nsDependentString() + : string_type() + { + } +# 84 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" + using nsString::Rebind; + void Rebind(const char_type* aData) + { + Rebind(aData, uint32_t(char_traits::length(aData))); + } + + void Rebind(const char_type* aStart, const char_type* aEnd); + void Rebind(const string_type&, uint32_t aStartPos); + +private: + + + nsDependentString(const substring_tuple_type&) = delete; +}; +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" 1 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" +class nsDependentCString : public nsCString +{ +public: + + typedef nsDependentCString self_type; + +public: + + + + + + nsDependentCString(const char_type* aStart, const char_type* aEnd); + + nsDependentCString(const char_type* aData, uint32_t aLength) + : string_type(const_cast(aData), aLength, F_TERMINATED) + { + AssertValidDependentString(); + } +# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" + explicit + nsDependentCString(const char_type* aData) + : string_type(const_cast(aData), + uint32_t(char_traits::length(aData)), F_TERMINATED) + { + AssertValidDependentString(); + } +# 62 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" + nsDependentCString(const string_type& aStr, uint32_t aStartPos) + : string_type() + { + Rebind(aStr, aStartPos); + } + + + nsDependentCString() + : string_type() + { + } +# 84 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" + using nsCString::Rebind; + void Rebind(const char_type* aData) + { + Rebind(aData, uint32_t(char_traits::length(aData))); + } + + void Rebind(const char_type* aStart, const char_type* aEnd); + void Rebind(const string_type&, uint32_t aStartPos); + +private: + + + nsDependentCString(const substring_tuple_type&) = delete; +}; +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2 +# 198 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h" 1 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h" +class nsLiteralString : public mozilla::detail::nsStringRepr +{ +public: + + typedef nsLiteralString self_type; + +public: + + + + + + template + explicit nsLiteralString(const char_type (&aStr)[N]) + : base_string_type(const_cast(aStr), N - 1, F_TERMINATED | F_LITERAL) + { + } + + + + + + + const nsString& AsString() const + { + return *reinterpret_cast(this); + } + + operator const nsString&() const + { + return AsString(); + } +# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h" + const char_type* get() const && = delete; + const char_type* get() const & + + { + return mData; + } + +private: + + + template + nsLiteralString(char_type (&aStr)[N]) = delete; + + self_type& operator=(const self_type&) = delete; +}; + +static_assert(sizeof(nsLiteralString) == sizeof(nsString), + "nsTLiteralString_CharT can masquerade as nsTString_CharT, " + "so they must have identical layout"); +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h" 1 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h" +class nsLiteralCString : public mozilla::detail::nsCStringRepr +{ +public: + + typedef nsLiteralCString self_type; + +public: + + + + + + template + explicit nsLiteralCString(const char_type (&aStr)[N]) + : base_string_type(const_cast(aStr), N - 1, F_TERMINATED | F_LITERAL) + { + } + + + + + + + const nsCString& AsString() const + { + return *reinterpret_cast(this); + } + + operator const nsCString&() const + { + return AsString(); + } +# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h" + const char_type* get() const && = delete; + const char_type* get() const & + + { + return mData; + } + +private: + + + template + nsLiteralCString(char_type (&aStr)[N]) = delete; + + self_type& operator=(const self_type&) = delete; +}; + +static_assert(sizeof(nsLiteralCString) == sizeof(nsCString), + "nsTLiteralString_CharT can masquerade as nsTString_CharT, " + "so they must have identical layout"); +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2 +# 199 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTPromiseFlatString.h" 1 +# 67 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTPromiseFlatString.h" +class nsPromiseFlatString : public nsString +{ +public: + + typedef nsPromiseFlatString self_type; + +private: + + void Init(const substring_type&); + + + void operator=(const self_type&) = delete; + + + nsPromiseFlatString() = delete; + + + nsPromiseFlatString(const string_type& aStr) = delete; + +public: + + explicit + nsPromiseFlatString(const substring_type& aStr) + : string_type() + { + Init(aStr); + } + + explicit + nsPromiseFlatString(const substring_tuple_type& aTuple) + : string_type() + { + + + Assign(aTuple); + } +}; + + + +template +const nsPromiseFlatString +PromiseFlatString(const T& aString) +{ + return nsPromiseFlatString(aString); +} +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTPromiseFlatString.h" 1 +# 67 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTPromiseFlatString.h" +class nsPromiseFlatCString : public nsCString +{ +public: + + typedef nsPromiseFlatCString self_type; + +private: + + void Init(const substring_type&); + + + void operator=(const self_type&) = delete; + + + nsPromiseFlatCString() = delete; + + + nsPromiseFlatCString(const string_type& aStr) = delete; + +public: + + explicit + nsPromiseFlatCString(const substring_type& aStr) + : string_type() + { + Init(aStr); + } + + explicit + nsPromiseFlatCString(const substring_tuple_type& aTuple) + : string_type() + { + + + Assign(aTuple); + } +}; + + + +template +const nsPromiseFlatCString +PromiseFlatCString(const T& aString) +{ + return nsPromiseFlatCString(aString); +} +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2 +# 200 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMemory.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMemory.h" +class nsIMemory; +# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMemory.h" +class nsMemory +{ +public: + static nsresult HeapMinimize(bool aImmediate); + static void* Clone(const void* aPtr, size_t aSize); + static nsIMemory* GetGlobalMemoryService(); +}; +# 113 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMemory.h" +namespace mozilla { +template +struct AlignmentTestStruct +{ + char c; + T t; +}; +} + + + + + + + +enum nsAssignmentType +{ + NS_ASSIGNMENT_COPY, + NS_ASSIGNMENT_DEPEND, + NS_ASSIGNMENT_ADOPT +}; +# 203 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plhash.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plhash.h" +extern "C" { + +typedef struct PLHashEntry PLHashEntry; +typedef struct PLHashTable PLHashTable; +typedef PRUint32 PLHashNumber; + +typedef PLHashNumber ( *PLHashFunction)(const void *key); +typedef PRIntn ( *PLHashComparator)(const void *v1, const void *v2); + +typedef PRIntn ( *PLHashEnumerator)(PLHashEntry *he, PRIntn i, void *arg); + + + + + + + +typedef struct PLHashAllocOps { + void * ( *allocTable)(void *pool, PRSize size); + void ( *freeTable)(void *pool, void *item); + PLHashEntry * ( *allocEntry)(void *pool, const void *key); + void ( *freeEntry)(void *pool, PLHashEntry *he, PRUintn flag); +} PLHashAllocOps; + + + + +struct PLHashEntry { + PLHashEntry *next; + PLHashNumber keyHash; + const void *key; + void *value; +}; + +struct PLHashTable { + PLHashEntry **buckets; + PRUint32 nentries; + PRUint32 shift; + PLHashFunction keyHash; + PLHashComparator keyCompare; + PLHashComparator valueCompare; + const PLHashAllocOps *allocOps; + void *allocPriv; + + + + + + +}; + + + + + +extern __attribute__((visibility("default"))) PLHashTable * +PL_NewHashTable(PRUint32 numBuckets, PLHashFunction keyHash, + PLHashComparator keyCompare, PLHashComparator valueCompare, + const PLHashAllocOps *allocOps, void *allocPriv); + +extern __attribute__((visibility("default"))) void +PL_HashTableDestroy(PLHashTable *ht); + + +extern __attribute__((visibility("default"))) PLHashEntry * +PL_HashTableAdd(PLHashTable *ht, const void *key, void *value); + +extern __attribute__((visibility("default"))) PRBool +PL_HashTableRemove(PLHashTable *ht, const void *key); + +extern __attribute__((visibility("default"))) void * +PL_HashTableLookup(PLHashTable *ht, const void *key); + +extern __attribute__((visibility("default"))) void * +PL_HashTableLookupConst(PLHashTable *ht, const void *key); + +extern __attribute__((visibility("default"))) PRIntn +PL_HashTableEnumerateEntries(PLHashTable *ht, PLHashEnumerator f, void *arg); + + +extern __attribute__((visibility("default"))) PLHashNumber +PL_HashString(const void *key); + + +extern __attribute__((visibility("default"))) PRIntn +PL_CompareStrings(const void *v1, const void *v2); + + +extern __attribute__((visibility("default"))) PRIntn +PL_CompareValues(const void *v1, const void *v2); + + +extern __attribute__((visibility("default"))) PLHashEntry ** +PL_HashTableRawLookup(PLHashTable *ht, PLHashNumber keyHash, const void *key); + +extern __attribute__((visibility("default"))) PLHashEntry ** +PL_HashTableRawLookupConst(PLHashTable *ht, PLHashNumber keyHash, + const void *key); + +extern __attribute__((visibility("default"))) PLHashEntry * +PL_HashTableRawAdd(PLHashTable *ht, PLHashEntry **hep, PLHashNumber keyHash, + const void *key, void *value); + +extern __attribute__((visibility("default"))) void +PL_HashTableRawRemove(PLHashTable *ht, PLHashEntry **hep, PLHashEntry *he); + + +extern __attribute__((visibility("default"))) PRIntn +PL_HashTableDump(PLHashTable *ht, PLHashEnumerator dump, FILE *fp); + +} +# 206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2 +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringGlue.h" 2 +# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAtom.h" 1 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAtom.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" 1 +# 111 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" +namespace mozilla { +template class OwningNonNull; +} + +template +inline already_AddRefed +dont_AddRef(T* aRawPtr) +{ + return already_AddRefed(aRawPtr); +} + +template +inline already_AddRefed&& +dont_AddRef(already_AddRefed&& aAlreadyAddRefedPtr) +{ + return mozilla::Move(aAlreadyAddRefedPtr); +} +# 146 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" +class nsCOMPtr_helper +{ +public: + virtual nsresult operator()(const nsIID&, void**) const = 0; +}; + + + + + + + +class nsQueryInterface final +{ +public: + explicit + nsQueryInterface(nsISupports* aRawPtr) : mRawPtr(aRawPtr) {} + + nsresult operator()(const nsIID& aIID, void**) const; + +private: + nsISupports* mRawPtr; +}; + +class nsQueryInterfaceWithError final +{ +public: + nsQueryInterfaceWithError(nsISupports* aRawPtr, nsresult* aError) + : mRawPtr(aRawPtr) + , mErrorPtr(aError) + { + } + + nsresult operator()(const nsIID& aIID, void**) const; + +private: + nsISupports* mRawPtr; + nsresult* mErrorPtr; +}; + +inline nsQueryInterface +do_QueryInterface(nsISupports* aRawPtr) +{ + return nsQueryInterface(aRawPtr); +} + +inline nsQueryInterfaceWithError +do_QueryInterface(nsISupports* aRawPtr, nsresult* aError) +{ + return nsQueryInterfaceWithError(aRawPtr, aError); +} + +template +inline void +do_QueryInterface(already_AddRefed&) +{ + + + +} + +template +inline void +do_QueryInterface(already_AddRefed&, nsresult*) +{ + + + +} + + + + +class nsGetServiceByCID final +{ +public: + explicit nsGetServiceByCID(const nsCID& aCID) : mCID(aCID) {} + + nsresult operator()(const nsIID&, void**) const; + +private: + const nsCID& mCID; +}; + +class nsGetServiceByCIDWithError final +{ +public: + nsGetServiceByCIDWithError(const nsCID& aCID, nsresult* aErrorPtr) + : mCID(aCID) + , mErrorPtr(aErrorPtr) + { + } + + nsresult operator()(const nsIID&, void**) const; + +private: + const nsCID& mCID; + nsresult* mErrorPtr; +}; + +class nsGetServiceByContractID final +{ +public: + explicit nsGetServiceByContractID(const char* aContractID) + : mContractID(aContractID) + { + } + + nsresult operator()(const nsIID&, void**) const; + +private: + const char* mContractID; +}; + +class nsGetServiceByContractIDWithError final +{ +public: + nsGetServiceByContractIDWithError(const char* aContractID, nsresult* aErrorPtr) + : mContractID(aContractID) + , mErrorPtr(aErrorPtr) + { + } + + nsresult operator()(const nsIID&, void**) const; + +private: + const char* mContractID; + nsresult* mErrorPtr; +}; +# 285 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" +class nsCOMPtr_base +{ +public: + explicit nsCOMPtr_base(nsISupports* aRawPtr = nullptr) : mRawPtr(aRawPtr) {} + + ~nsCOMPtr_base() + { + ; + if (mRawPtr) { + (mRawPtr)->Release(); + } + } + + void + assign_with_AddRef(nsISupports*); + void + assign_from_qi(const nsQueryInterface, const nsIID&); + void + assign_from_qi_with_error(const nsQueryInterfaceWithError&, const nsIID&); + void + assign_from_gs_cid(const nsGetServiceByCID, const nsIID&); + void + assign_from_gs_cid_with_error(const nsGetServiceByCIDWithError&, const nsIID&); + void + assign_from_gs_contractid(const nsGetServiceByContractID, const nsIID&); + void + assign_from_gs_contractid_with_error(const nsGetServiceByContractIDWithError&, + const nsIID&); + void + assign_from_helper(const nsCOMPtr_helper&, const nsIID&); + void** + begin_assignment(); + +protected: + nsISupports* __attribute__((__may_alias__)) mRawPtr; + + void assign_assuming_AddRef(nsISupports* aNewPtr) + { + + + + + + + nsISupports* oldPtr = mRawPtr; + mRawPtr = aNewPtr; + ; + ; + if (oldPtr) { + (oldPtr)->Release(); + } + } +}; + + + + +template +char (&TestForIID(decltype(&(T::template COMTypeInfo::kIID))))[2]; +template +char TestForIID(...); + +template +class nsCOMPtr final + + : private nsCOMPtr_base + +{ +# 387 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" + void assert_validity() + { + static_assert(1 < sizeof(TestForIID(nullptr)), "nsCOMPtr only works " + "for types with IIDs. Either use RefPtr; add an IID to " + "your type with NS_DECLARE_STATIC_IID_ACCESSOR/" + "NS_DEFINE_STATIC_IID_ACCESSOR; or make the nsCOMPtr point " + "to a base class with an IID."); + } + +public: + typedef T element_type; +# 426 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" + nsCOMPtr() + : nsCOMPtr_base(nullptr) + { + assert_validity(); + ; + } + + nsCOMPtr(decltype(nullptr)) + : nsCOMPtr_base(nullptr) + { + assert_validity(); + ; + } + + nsCOMPtr(const nsCOMPtr& aSmartPtr) + : nsCOMPtr_base(aSmartPtr.mRawPtr) + { + assert_validity(); + if (mRawPtr) { + (mRawPtr)->AddRef(); + } + ; + } + + nsCOMPtr(nsCOMPtr&& aSmartPtr) + : nsCOMPtr_base(aSmartPtr.mRawPtr) + { + assert_validity(); + aSmartPtr.mRawPtr = nullptr; + ; + ; + } + + nsCOMPtr(T* aRawPtr) + : nsCOMPtr_base(aRawPtr) + { + assert_validity(); + if (mRawPtr) { + (mRawPtr)->AddRef(); + } + ; + ; + } + + nsCOMPtr(already_AddRefed& aSmartPtr) + : nsCOMPtr_base(aSmartPtr.take()) + { + assert_validity(); + ; + ; + } + + + nsCOMPtr(already_AddRefed&& aSmartPtr) + : nsCOMPtr_base(aSmartPtr.take()) + { + assert_validity(); + ; + ; + } + + + template + nsCOMPtr(already_AddRefed& aSmartPtr) + : nsCOMPtr_base(static_cast(aSmartPtr.take())) + { + assert_validity(); + + static_assert(mozilla::IsBaseOf::value, + "U is not a subclass of T"); + ; + ; + } + + + template + nsCOMPtr(already_AddRefed&& aSmartPtr) + : nsCOMPtr_base(static_cast(aSmartPtr.take())) + { + assert_validity(); + + static_assert(mozilla::IsBaseOf::value, + "U is not a subclass of T"); + ; + ; + } + + + nsCOMPtr(const nsQueryInterface aQI) + : nsCOMPtr_base(nullptr) + { + assert_validity(); + ; + assign_from_qi(aQI, (T::template COMTypeInfo::kIID)); + } + + + nsCOMPtr(const nsQueryInterfaceWithError& aQI) + : nsCOMPtr_base(nullptr) + { + assert_validity(); + ; + assign_from_qi_with_error(aQI, (T::template COMTypeInfo::kIID)); + } + + + nsCOMPtr(const nsGetServiceByCID aGS) + : nsCOMPtr_base(nullptr) + { + assert_validity(); + ; + assign_from_gs_cid(aGS, (T::template COMTypeInfo::kIID)); + } + + + nsCOMPtr(const nsGetServiceByCIDWithError& aGS) + : nsCOMPtr_base(nullptr) + { + assert_validity(); + ; + assign_from_gs_cid_with_error(aGS, (T::template COMTypeInfo::kIID)); + } + + + nsCOMPtr(const nsGetServiceByContractID aGS) + : nsCOMPtr_base(nullptr) + { + assert_validity(); + ; + assign_from_gs_contractid(aGS, (T::template COMTypeInfo::kIID)); + } + + + nsCOMPtr(const nsGetServiceByContractIDWithError& aGS) + : nsCOMPtr_base(nullptr) + { + assert_validity(); + ; + assign_from_gs_contractid_with_error(aGS, (T::template COMTypeInfo::kIID)); + } + + + + nsCOMPtr(const nsCOMPtr_helper& aHelper) + : nsCOMPtr_base(nullptr) + { + assert_validity(); + ; + assign_from_helper(aHelper, (T::template COMTypeInfo::kIID)); + ; + } + + + template + nsCOMPtr(const mozilla::OwningNonNull& aOther); + + + + + nsCOMPtr& operator=(const nsCOMPtr& aRhs) + { + assign_with_AddRef(aRhs.mRawPtr); + return *this; + } + + nsCOMPtr& operator=(T* aRhs) + { + assign_with_AddRef(aRhs); + ; + return *this; + } + + nsCOMPtr& operator=(decltype(nullptr)) + { + assign_assuming_AddRef(nullptr); + return *this; + } + + + template + nsCOMPtr& operator=(already_AddRefed& aRhs) + { + + static_assert(mozilla::IsBaseOf::value, + "U is not a subclass of T"); + assign_assuming_AddRef(static_cast(aRhs.take())); + ; + return *this; + } + + + template + nsCOMPtr& operator=(already_AddRefed&& aRhs) + { + + static_assert(mozilla::IsBaseOf::value, + "U is not a subclass of T"); + assign_assuming_AddRef(static_cast(aRhs.take())); + ; + return *this; + } + + + nsCOMPtr& operator=(const nsQueryInterface aRhs) + { + assign_from_qi(aRhs, (T::template COMTypeInfo::kIID)); + return *this; + } + + + nsCOMPtr& operator=(const nsQueryInterfaceWithError& aRhs) + { + assign_from_qi_with_error(aRhs, (T::template COMTypeInfo::kIID)); + return *this; + } + + + nsCOMPtr& operator=(const nsGetServiceByCID aRhs) + { + assign_from_gs_cid(aRhs, (T::template COMTypeInfo::kIID)); + return *this; + } + + + nsCOMPtr& operator=(const nsGetServiceByCIDWithError& aRhs) + { + assign_from_gs_cid_with_error(aRhs, (T::template COMTypeInfo::kIID)); + return *this; + } + + + nsCOMPtr& operator=(const nsGetServiceByContractID aRhs) + { + assign_from_gs_contractid(aRhs, (T::template COMTypeInfo::kIID)); + return *this; + } + + + nsCOMPtr& operator=(const nsGetServiceByContractIDWithError& aRhs) + { + assign_from_gs_contractid_with_error(aRhs, (T::template COMTypeInfo::kIID)); + return *this; + } + + + + nsCOMPtr& operator=(const nsCOMPtr_helper& aRhs) + { + assign_from_helper(aRhs, (T::template COMTypeInfo::kIID)); + ; + return *this; + } + + + template + nsCOMPtr& operator=(const mozilla::OwningNonNull& aOther); + + + void swap(nsCOMPtr& aRhs) + { + + nsISupports* temp = aRhs.mRawPtr; + + + + ; + ; + ; + ; + aRhs.mRawPtr = mRawPtr; + mRawPtr = temp; + + } + + + void swap(T*& aRhs) + { + + nsISupports* temp = aRhs; + + + + ; + ; + aRhs = reinterpret_cast(mRawPtr); + mRawPtr = temp; + ; + } + + + + + + + already_AddRefed forget() + { + T* temp = nullptr; + swap(temp); + return already_AddRefed(temp); + } + + + + + template + void forget(I** aRhs) + { + do { } while(0); + ; + *aRhs = get(); + mRawPtr = nullptr; + } + + + + + T* get() const { return reinterpret_cast(mRawPtr); } + + + + + + + + operator T*() const & { return get(); } + + + + + operator T*() const && = delete; + + + explicit operator bool() const { return !!mRawPtr; } + + T* operator->() const + { + do { } while (0); + + return get(); + } + + + nsCOMPtr* get_address() { return this; } + const nsCOMPtr* get_address() const { return this; } + +public: + T& operator*() const + { + do { } while (0); + + return *get(); + } + + T** StartAssignment() + { + + return reinterpret_cast(begin_assignment()); + + + + + } +}; +# 800 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" +template<> +class nsCOMPtr + : private nsCOMPtr_base +{ +public: + typedef nsISupports element_type; + + + + nsCOMPtr() + : nsCOMPtr_base(nullptr) + { + ; + } + + nsCOMPtr(decltype(nullptr)) + : nsCOMPtr_base(nullptr) + { + ; + } + + nsCOMPtr(const nsCOMPtr& aSmartPtr) + : nsCOMPtr_base(aSmartPtr.mRawPtr) + { + if (mRawPtr) { + (mRawPtr)->AddRef(); + } + ; + } + + nsCOMPtr(nsISupports* aRawPtr) + : nsCOMPtr_base(aRawPtr) + { + if (mRawPtr) { + (mRawPtr)->AddRef(); + } + ; + } + + + nsCOMPtr(already_AddRefed& aSmartPtr) + : nsCOMPtr_base(aSmartPtr.take()) + { + ; + } + + + nsCOMPtr(already_AddRefed&& aSmartPtr) + : nsCOMPtr_base(aSmartPtr.take()) + { + ; + } + + + nsCOMPtr(const nsQueryInterface aQI) + : nsCOMPtr_base(nullptr) + { + ; + assign_from_qi(aQI, (nsISupports::COMTypeInfo::kIID)); + } + + + nsCOMPtr(const nsQueryInterfaceWithError& aQI) + : nsCOMPtr_base(nullptr) + { + ; + assign_from_qi_with_error(aQI, (nsISupports::COMTypeInfo::kIID)); + } + + + nsCOMPtr(const nsGetServiceByCID aGS) + : nsCOMPtr_base(nullptr) + { + ; + assign_from_gs_cid(aGS, (nsISupports::COMTypeInfo::kIID)); + } + + + nsCOMPtr(const nsGetServiceByCIDWithError& aGS) + : nsCOMPtr_base(nullptr) + { + ; + assign_from_gs_cid_with_error(aGS, (nsISupports::COMTypeInfo::kIID)); + } + + + nsCOMPtr(const nsGetServiceByContractID aGS) + : nsCOMPtr_base(nullptr) + { + ; + assign_from_gs_contractid(aGS, (nsISupports::COMTypeInfo::kIID)); + } + + + nsCOMPtr(const nsGetServiceByContractIDWithError& aGS) + : nsCOMPtr_base(nullptr) + { + ; + assign_from_gs_contractid_with_error(aGS, (nsISupports::COMTypeInfo::kIID)); + } + + + + nsCOMPtr(const nsCOMPtr_helper& aHelper) + : nsCOMPtr_base(nullptr) + { + ; + assign_from_helper(aHelper, (nsISupports::COMTypeInfo::kIID)); + } + + + + + nsCOMPtr& operator=(const nsCOMPtr& aRhs) + { + assign_with_AddRef(aRhs.mRawPtr); + return *this; + } + + nsCOMPtr& operator=(nsISupports* aRhs) + { + assign_with_AddRef(aRhs); + return *this; + } + + nsCOMPtr& operator=(decltype(nullptr)) + { + assign_assuming_AddRef(nullptr); + return *this; + } + + + nsCOMPtr& operator=(already_AddRefed& aRhs) + { + assign_assuming_AddRef(aRhs.take()); + return *this; + } + + + nsCOMPtr& operator=(already_AddRefed&& aRhs) + { + assign_assuming_AddRef(aRhs.take()); + return *this; + } + + + nsCOMPtr& operator=(const nsQueryInterface aRhs) + { + assign_from_qi(aRhs, (nsISupports::COMTypeInfo::kIID)); + return *this; + } + + + nsCOMPtr& operator=(const nsQueryInterfaceWithError& aRhs) + { + assign_from_qi_with_error(aRhs, (nsISupports::COMTypeInfo::kIID)); + return *this; + } + + + nsCOMPtr& operator=(const nsGetServiceByCID aRhs) + { + assign_from_gs_cid(aRhs, (nsISupports::COMTypeInfo::kIID)); + return *this; + } + + + nsCOMPtr& operator=(const nsGetServiceByCIDWithError& aRhs) + { + assign_from_gs_cid_with_error(aRhs, (nsISupports::COMTypeInfo::kIID)); + return *this; + } + + + nsCOMPtr& operator=(const nsGetServiceByContractID aRhs) + { + assign_from_gs_contractid(aRhs, (nsISupports::COMTypeInfo::kIID)); + return *this; + } + + + nsCOMPtr& operator=(const nsGetServiceByContractIDWithError& aRhs) + { + assign_from_gs_contractid_with_error(aRhs, (nsISupports::COMTypeInfo::kIID)); + return *this; + } + + + + nsCOMPtr& operator=(const nsCOMPtr_helper& aRhs) + { + assign_from_helper(aRhs, (nsISupports::COMTypeInfo::kIID)); + return *this; + } + + + void swap(nsCOMPtr& aRhs) + { + nsISupports* temp = aRhs.mRawPtr; + ; + ; + ; + ; + aRhs.mRawPtr = mRawPtr; + mRawPtr = temp; + } + + + void swap(nsISupports*& aRhs) + { + nsISupports* temp = aRhs; + ; + ; + aRhs = mRawPtr; + mRawPtr = temp; + } + + + + already_AddRefed forget() + { + nsISupports* temp = nullptr; + swap(temp); + return already_AddRefed(temp); + } + + + + + void forget(nsISupports** aRhs) + { + do { } while(0); + *aRhs = nullptr; + swap(*aRhs); + } + + + + + + + nsISupports* get() const { return reinterpret_cast(mRawPtr); } + + + + + + + + operator nsISupports* () const { return get(); } + + nsISupports* operator->() const + { + do { } while (0); + + return get(); + } + + + nsCOMPtr* get_address() { return this; } + const nsCOMPtr* get_address() const { return this; } + +public: + + nsISupports& operator*() const + { + do { } while (0); + + return *get(); + } + + nsISupports** StartAssignment() + { + + return reinterpret_cast(begin_assignment()); + + + + + } +}; + +template +inline void +ImplCycleCollectionUnlink(nsCOMPtr& aField) +{ + aField = nullptr; +} + +template +inline void +ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, + nsCOMPtr& aField, + const char* aName, + uint32_t aFlags = 0) +{ + CycleCollectionNoteChild(aCallback, aField.get(), aName, aFlags); +} +# 1206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" +template +inline nsCOMPtr* +address_of(nsCOMPtr& aPtr) +{ + return aPtr.get_address(); +} + +template +inline const nsCOMPtr* +address_of(const nsCOMPtr& aPtr) +{ + return aPtr.get_address(); +} +# 1235 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" +template +class nsGetterAddRefs +{ +public: + explicit nsGetterAddRefs(nsCOMPtr& aSmartPtr) + : mTargetSmartPtr(aSmartPtr) + { + } +# 1258 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" + operator void**() + { + return reinterpret_cast(mTargetSmartPtr.StartAssignment()); + } + + operator T**() { return mTargetSmartPtr.StartAssignment(); } + T*& operator*() { return *(mTargetSmartPtr.StartAssignment()); } + +private: + nsCOMPtr& mTargetSmartPtr; +}; + + +template<> +class nsGetterAddRefs +{ +public: + explicit nsGetterAddRefs(nsCOMPtr& aSmartPtr) + : mTargetSmartPtr(aSmartPtr) + { + } +# 1288 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" + operator void**() + { + return reinterpret_cast(mTargetSmartPtr.StartAssignment()); + } + + operator nsISupports**() { return mTargetSmartPtr.StartAssignment(); } + nsISupports*& operator*() { return *(mTargetSmartPtr.StartAssignment()); } + +private: + nsCOMPtr& mTargetSmartPtr; +}; + +template +inline nsGetterAddRefs +getter_AddRefs(nsCOMPtr& aSmartPtr) +{ + return nsGetterAddRefs(aSmartPtr); +} + +template +inline nsresult +CallQueryInterface(T* aSource, nsGetterAddRefs aDestination) +{ + return CallQueryInterface(aSource, + static_cast(aDestination)); +} + + + + +template +inline bool +operator==(const nsCOMPtr& aLhs, const nsCOMPtr& aRhs) +{ + return static_cast(aLhs.get()) == static_cast(aRhs.get()); +} + + +template +inline bool +operator!=(const nsCOMPtr& aLhs, const nsCOMPtr& aRhs) +{ + return static_cast(aLhs.get()) != static_cast(aRhs.get()); +} + + + + +template +inline bool +operator==(const nsCOMPtr& aLhs, const U* aRhs) +{ + return static_cast(aLhs.get()) == aRhs; +} + +template +inline bool +operator==(const U* aLhs, const nsCOMPtr& aRhs) +{ + return aLhs == static_cast(aRhs.get()); +} + +template +inline bool +operator!=(const nsCOMPtr& aLhs, const U* aRhs) +{ + return static_cast(aLhs.get()) != aRhs; +} + +template +inline bool +operator!=(const U* aLhs, const nsCOMPtr& aRhs) +{ + return aLhs != static_cast(aRhs.get()); +} + +template +inline bool +operator==(const nsCOMPtr& aLhs, U* aRhs) +{ + return static_cast(aLhs.get()) == const_cast(aRhs); +} + +template +inline bool +operator==(U* aLhs, const nsCOMPtr& aRhs) +{ + return const_cast(aLhs) == static_cast(aRhs.get()); +} + +template +inline bool +operator!=(const nsCOMPtr& aLhs, U* aRhs) +{ + return static_cast(aLhs.get()) != const_cast(aRhs); +} + +template +inline bool +operator!=(U* aLhs, const nsCOMPtr& aRhs) +{ + return const_cast(aLhs) != static_cast(aRhs.get()); +} + + + + + +template +inline bool +operator==(const nsCOMPtr& aLhs, decltype(nullptr)) +{ + return aLhs.get() == nullptr; +} + +template +inline bool +operator==(decltype(nullptr), const nsCOMPtr& aRhs) +{ + return nullptr == aRhs.get(); +} + +template +inline bool +operator!=(const nsCOMPtr& aLhs, decltype(nullptr)) +{ + return aLhs.get() != nullptr; +} + +template +inline bool +operator!=(decltype(nullptr), const nsCOMPtr& aRhs) +{ + return nullptr != aRhs.get(); +} + + + + +inline bool +SameCOMIdentity(nsISupports* aLhs, nsISupports* aRhs) +{ + return nsCOMPtr(do_QueryInterface(aLhs)) == + nsCOMPtr(do_QueryInterface(aRhs)); +} + + + +template +inline nsresult +CallQueryInterface(nsCOMPtr& aSourcePtr, DestinationType** aDestPtr) +{ + return CallQueryInterface(aSourcePtr.get(), aDestPtr); +} + +template +RefPtr::RefPtr(const nsCOMPtr_helper& aHelper) +{ + void* newRawPtr; + if (((bool)(__builtin_expect(!!(NS_FAILED_impl(aHelper((T::template COMTypeInfo::kIID), &newRawPtr))), 0)))) { + newRawPtr = nullptr; + } + mRawPtr = static_cast(newRawPtr); +} + +template +RefPtr& +RefPtr::operator=(const nsCOMPtr_helper& aHelper) +{ + void* newRawPtr; + if (((bool)(__builtin_expect(!!(NS_FAILED_impl(aHelper((T::template COMTypeInfo::kIID), &newRawPtr))), 0)))) { + newRawPtr = nullptr; + } + assign_assuming_AddRef(static_cast(newRawPtr)); + return *this; +} +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAtom.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" +template struct already_AddRefed; +# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" +class nsStringBuffer +{ +private: + friend class CheckStaticAtomSizes; + + std::atomic mRefCount; + uint32_t mStorageSize; + +public: +# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" + static already_AddRefed Alloc(size_t aStorageSize); +# 61 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" + static nsStringBuffer* Realloc(nsStringBuffer* aBuf, size_t aStorageSize); + + + + + void AddRef(); + + + + + + void Release(); + + + + + + + static nsStringBuffer* FromData(void* aData) + { + return reinterpret_cast(aData) - 1; + } + + + + + void* Data() const + { + return const_cast(reinterpret_cast(this + 1)); + } + + + + + + + uint32_t StorageSize() const + { + return mStorageSize; + } +# 110 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" + bool IsReadonly() const + { +# 132 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" + return mRefCount.load(std::memory_order_relaxed) > 1; + } +# 143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" + static nsStringBuffer* FromString(const nsAString& aStr); + static nsStringBuffer* FromString(const nsACString& aStr); +# 160 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" + void ToString(uint32_t aLen, nsAString& aStr, bool aMoveOwnership = false); + void ToString(uint32_t aLen, nsACString& aStr, bool aMoveOwnership = false); + + + + + size_t SizeOfIncludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf) const; +# 177 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" + size_t SizeOfIncludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf) const; +}; +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAtom.h" 2 + + + + + + + + +class nsIAtom : public nsISupports { + public: + + template struct COMTypeInfo; + + + virtual nsresult ScriptableToString(nsAString & _retval) = 0; + + + virtual nsresult ToUTF8String(nsACString & _retval) = 0; + + + virtual nsresult ScriptableEquals(const nsAString & aString, bool *_retval) = 0; + + + virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) = 0; + + + inline bool Equals(char16ptr_t aString, uint32_t aLength) const + { + return mLength == aLength && + memcmp(mString, aString, mLength * sizeof(char16_t)) == 0; + } + inline bool Equals(const nsAString& aString) const { + return Equals(aString.BeginReading(), aString.Length()); + } + inline bool IsStaticAtom() const { + return mIsStatic; + } + inline char16ptr_t GetUTF16String() const { + return mString; + } + inline uint32_t GetLength() const { + return mLength; + } + inline void ToString(nsAString& aBuf) const { + + nsStringBuffer::FromData(mString)->ToString(mLength, aBuf); + } + inline nsStringBuffer* GetStringBuffer() const { + + return nsStringBuffer::FromData(mString); + } + + + + + + inline uint32_t hash() const { + return mHash; + } +protected: + uint32_t mLength:31; + uint32_t mIsStatic:1; + uint32_t mHash; + + + + + + char16_t* mString; +}; + + template struct nsIAtom::COMTypeInfo { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template const nsIID nsIAtom::COMTypeInfo::kIID __attribute__ ((visibility ("hidden"))) = {0x8b8c11d4, 0x3ed5, 0x4079, { 0x89, 0x74, 0x73, 0xc7, 0x57, 0x6c, 0xdb, 0x34 }}; +# 192 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAtom.h" +extern already_AddRefed NS_Atomize(const char* aUTF8String); + + + +extern already_AddRefed NS_Atomize(const nsACString& aUTF8String); + + + + +extern already_AddRefed NS_Atomize(const char16_t* aUTF16String); + + + +extern already_AddRefed NS_Atomize(const nsAString& aUTF16String); + + + +extern already_AddRefed NS_AtomizeMainThread(const nsAString& aUTF16String); + + + + +extern nsrefcnt NS_GetNumberOfAtoms(void); + + + + +extern nsIAtom* NS_GetStaticAtom(const nsAString& aUTF16String); + + + +extern void NS_SealStaticAtomTable(); +class nsAtomString : public nsString +{ +public: + explicit nsAtomString(const nsIAtom* aAtom) + { + aAtom->ToString(*this); + } +}; +class nsAtomCString : public nsCString +{ +public: + explicit nsAtomCString(nsIAtom* aAtom) + { + aAtom->ToUTF8String(*this); + } +}; +class nsDependentAtomString : public nsDependentString +{ +public: + explicit nsDependentAtomString(const nsIAtom* aAtom) + : nsDependentString(aAtom->GetUTF16String(), aAtom->GetLength()) + { + } +}; +# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" 2 + +class nsIDocument; +class nsNodeInfoManager; + +namespace mozilla { +namespace dom { + +class NodeInfo final +{ +public: + public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible::value, "Reference-counted class " "NodeInfo" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); nsrefcnt count = mRefCnt.incr(static_cast(this), NodeInfo::cycleCollection::GetParticipant()); ; return count; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); nsrefcnt count = mRefCnt.decr(static_cast(this), NodeInfo::cycleCollection::GetParticipant()); ; return count; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public: + class cycleCollection : public nsCycleCollectionParticipant { public: constexpr cycleCollection () : nsCycleCollectionParticipant(true) {} private: public: virtual void Root(void *n) override; virtual void Unlink(void *n) override; virtual void Unroot(void *n) override; virtual nsresult TraverseNative(void *n, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "NodeInfo"; }; virtual void DeleteCycleCollectable(void *n) override { DowncastCCParticipant(n)->DeleteCycleCollectable(); } static NodeInfo* Downcast(void* s) { return DowncastCCParticipant(s); } static void* Upcast(NodeInfo *p) { return static_cast(p); } virtual bool CanSkipReal(void *p, bool aRemovingAllowed) override; virtual bool CanSkipInCCReal(void *p) override; virtual bool CanSkipThisReal(void *p) override; static nsCycleCollectionParticipant* GetParticipant() { return &NodeInfo::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal; + + + + + + + + void GetName(nsAString& aName) const; +# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" + nsIAtom* NameAtom() const + { + return mInner.mName; + } +# 69 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" + const nsString& QualifiedName() const { + return mQualifiedName; + } + + + + + const nsString& NodeName() const { + return mNodeName; + } + + + + + const nsString& LocalName() const { + return mLocalName; + } + + + + + + + + void GetPrefix(nsAString& aPrefix) const; + + + + + + + + nsIAtom* GetPrefixAtom() const + { + return mInner.mPrefix; + } + + + + + void GetNamespaceURI(nsAString& aNameSpaceURI) const; + + + + + + int32_t NamespaceID() const + { + return mInner.mNamespaceID; + } + + + + + + uint16_t NodeType() const + { + return mInner.mNodeType; + } + + + + + nsIAtom* GetExtraName() const + { + return mInner.mExtraName; + } + + + + + + nsNodeInfoManager* NodeInfoManager() const + { + return mOwnerManager; + } + + + + + + + inline bool Equals(NodeInfo* aNodeInfo) const; + + bool NameAndNamespaceEquals(NodeInfo* aNodeInfo) const; + + bool Equals(nsIAtom* aNameAtom) const + { + return mInner.mName == aNameAtom; + } + + bool Equals(nsIAtom* aNameAtom, nsIAtom* aPrefixAtom) const + { + return (mInner.mName == aNameAtom) && (mInner.mPrefix == aPrefixAtom); + } + + bool Equals(nsIAtom* aNameAtom, int32_t aNamespaceID) const + { + return ((mInner.mName == aNameAtom) && + (mInner.mNamespaceID == aNamespaceID)); + } + + bool Equals(nsIAtom* aNameAtom, nsIAtom* aPrefixAtom, int32_t aNamespaceID) const + { + return ((mInner.mName == aNameAtom) && + (mInner.mPrefix == aPrefixAtom) && + (mInner.mNamespaceID == aNamespaceID)); + } + + bool NamespaceEquals(int32_t aNamespaceID) const + { + return mInner.mNamespaceID == aNamespaceID; + } + + inline bool Equals(const nsAString& aName) const; + + inline bool Equals(const nsAString& aName, const nsAString& aPrefix) const; + + inline bool Equals(const nsAString& aName, int32_t aNamespaceID) const; + + inline bool Equals(const nsAString& aName, const nsAString& aPrefix, int32_t aNamespaceID) const; + + bool NamespaceEquals(const nsAString& aNamespaceURI) const; + + inline bool QualifiedNameEquals(nsIAtom* aNameAtom) const; + + bool QualifiedNameEquals(const nsAString& aQualifiedName) const + { + return mQualifiedName == aQualifiedName; + } + + + + + nsIDocument* GetDocument() const + { + return mDocument; + } + +private: + NodeInfo() = delete; + NodeInfo(const NodeInfo& aOther) = delete; + + + + NodeInfo(nsIAtom* aName, nsIAtom* aPrefix, int32_t aNamespaceID, + uint16_t aNodeType, nsIAtom* aExtraName, + nsNodeInfoManager* aOwnerManager); + + ~NodeInfo(); + +public: + bool CanSkip(); + + + + + + void DeleteCycleCollectable(); + +protected: +# 244 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" + class NodeInfoInner + { + public: + NodeInfoInner() + : mName(nullptr), mPrefix(nullptr), mNamespaceID(-1), + mNodeType(0), mNameString(nullptr), mExtraName(nullptr) + { + } + NodeInfoInner(nsIAtom *aName, nsIAtom *aPrefix, int32_t aNamespaceID, + uint16_t aNodeType, nsIAtom* aExtraName) + : mName(aName), mPrefix(aPrefix), mNamespaceID(aNamespaceID), + mNodeType(aNodeType), mNameString(nullptr), mExtraName(aExtraName) + { + } + NodeInfoInner(const nsAString& aTmpName, nsIAtom *aPrefix, + int32_t aNamespaceID, uint16_t aNodeType) + : mName(nullptr), mPrefix(aPrefix), mNamespaceID(aNamespaceID), + mNodeType(aNodeType), mNameString(&aTmpName), mExtraName(nullptr) + { + } + + nsCOMPtr mName; + nsCOMPtr mPrefix; + int32_t mNamespaceID; + uint16_t mNodeType; + const nsAString* mNameString; + nsCOMPtr mExtraName; + }; + + + friend class ::nsNodeInfoManager; + + + + nsIDocument* mDocument; + + NodeInfoInner mInner; + + RefPtr mOwnerManager; + + + + + + + + nsString mQualifiedName; + + + nsString mNodeName; + + + + nsString mLocalName; +}; + +} +} +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrName.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDOMString.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDOMString.h" +inline bool DOMStringIsNull(const nsAString& aString) +{ + return aString.IsVoid(); +} + +inline void SetDOMStringToNull(nsAString& aString) +{ + aString.SetIsVoid(true); +} +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrName.h" 2 + + +class nsAttrName +{ +public: + nsAttrName(const nsAttrName& aOther) + : mBits(aOther.mBits) + { + AddRefInternalName(); + } + + explicit nsAttrName(nsIAtom* aAtom) + : mBits(reinterpret_cast(aAtom)) + { + do { } while(0); + (aAtom)->AddRef(); + } + + explicit nsAttrName(mozilla::dom::NodeInfo* aNodeInfo) + { + do { } while(0); + if (aNodeInfo->NamespaceEquals(kNameSpaceID_None)) { + mBits = reinterpret_cast(aNodeInfo->NameAtom()); + (aNodeInfo->NameAtom())->AddRef(); + } + else { + mBits = reinterpret_cast(aNodeInfo) | + 1; + (aNodeInfo)->AddRef(); + } + } + + ~nsAttrName() + { + ReleaseInternalName(); + } + + void SetTo(mozilla::dom::NodeInfo* aNodeInfo) + { + do { } while(0); + + ReleaseInternalName(); + if (aNodeInfo->NamespaceEquals(kNameSpaceID_None)) { + mBits = reinterpret_cast(aNodeInfo->NameAtom()); + (aNodeInfo->NameAtom())->AddRef(); + } + else { + mBits = reinterpret_cast(aNodeInfo) | + 1; + (aNodeInfo)->AddRef(); + } + } + + void SetTo(nsIAtom* aAtom) + { + do { } while(0); + + ReleaseInternalName(); + mBits = reinterpret_cast(aAtom); + (aAtom)->AddRef(); + } + + bool IsAtom() const + { + return !(mBits & 1); + } + + mozilla::dom::NodeInfo* NodeInfo() const + { + do { } while(0); + return reinterpret_cast(mBits & ~1); + } + + nsIAtom* Atom() const + { + do { } while(0); + return reinterpret_cast(mBits); + } + + bool Equals(const nsAttrName& aOther) const + { + return mBits == aOther.mBits; + } + + + bool Equals(nsIAtom* aAtom) const + { + return reinterpret_cast(aAtom) == mBits; + } + + + bool Equals(const nsAString& aLocalName) const + { + return IsAtom() && Atom()->Equals(aLocalName); + } + + bool Equals(nsIAtom* aLocalName, int32_t aNamespaceID) const + { + if (aNamespaceID == kNameSpaceID_None) { + return Equals(aLocalName); + } + return !IsAtom() && NodeInfo()->Equals(aLocalName, aNamespaceID); + } + + bool Equals(mozilla::dom::NodeInfo* aNodeInfo) const + { + return Equals(aNodeInfo->NameAtom(), aNodeInfo->NamespaceID()); + } + + int32_t NamespaceID() const + { + return IsAtom() ? kNameSpaceID_None : NodeInfo()->NamespaceID(); + } + + int32_t NamespaceEquals(int32_t aNamespaceID) const + { + return aNamespaceID == kNameSpaceID_None ? + IsAtom() : + (!IsAtom() && NodeInfo()->NamespaceEquals(aNamespaceID)); + } + + nsIAtom* LocalName() const + { + return IsAtom() ? Atom() : NodeInfo()->NameAtom(); + } + + nsIAtom* GetPrefix() const + { + return IsAtom() ? nullptr : NodeInfo()->GetPrefixAtom(); + } + + bool QualifiedNameEquals(const nsAString& aName) const + { + return IsAtom() ? Atom()->Equals(aName) : + NodeInfo()->QualifiedNameEquals(aName); + } + + void GetQualifiedName(nsAString& aStr) const + { + if (IsAtom()) { + Atom()->ToString(aStr); + } + else { + aStr = NodeInfo()->QualifiedName(); + } + } + + + void GetPrefix(nsAString& aStr) const + { + if (IsAtom()) { + SetDOMStringToNull(aStr); + } + else { + NodeInfo()->GetPrefix(aStr); + } + } + + + uint32_t HashValue() const + { + + + + return mBits - 0; + } + + bool IsSmaller(nsIAtom* aOther) const + { + return mBits < reinterpret_cast(aOther); + } + +private: + + void AddRefInternalName() + { + if (IsAtom()) { + (Atom())->AddRef(); + } else { + (NodeInfo())->AddRef(); + } + } + + void ReleaseInternalName() + { + if (IsAtom()) { + Atom()->Release(); + } else { + NodeInfo()->Release(); + } + } + + uintptr_t mBits; +}; +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoElementSnapshot.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsColor.h" 1 + + + + + + + + +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsColor.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h" +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h" 2 +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/float.h" 1 3 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h" 2 + + + + + + + + +inline double +NS_round(double aNum) +{ + return aNum >= 0.0 ? floor(aNum + 0.5) : ceil(aNum - 0.5); +} +inline float +NS_roundf(float aNum) +{ + return aNum >= 0.0f ? floorf(aNum + 0.5f) : ceilf(aNum - 0.5f); +} +inline int32_t +NS_lround(double aNum) +{ + return aNum >= 0.0 ? int32_t(aNum + 0.5) : int32_t(aNum - 0.5); +} +# 73 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h" +inline int32_t +NS_lroundf(float aNum) +{ + return aNum >= 0.0f ? int32_t(aNum + 0.5f) : int32_t(aNum - 0.5f); +} + + + + + + +inline double +NS_hypot(double aNum1, double aNum2) +{ + + return __builtin_hypot(aNum1, aNum2); + + + + + +} + + + + + +inline bool +NS_finite(double aNum) +{ +# 111 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h" + return finite(aNum); + +} + + + + + + + +inline double +NS_floorModulo(double aNum1, double aNum2) +{ + return (aNum1 - aNum2 * floor(aNum1 / aNum2)); +} +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" 2 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 1 3 +# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 2 3 + +using std::abs; +using std::acos; +using std::asin; +using std::atan; +using std::atan2; +using std::cos; +using std::sin; +using std::tan; +using std::cosh; +using std::sinh; +using std::tanh; +using std::exp; +using std::frexp; +using std::ldexp; +using std::log; +using std::log10; +using std::modf; +using std::pow; +using std::sqrt; +using std::ceil; +using std::fabs; +using std::floor; +using std::fmod; + + +using std::fpclassify; +using std::isfinite; +using std::isinf; +using std::isnan; +using std::isnormal; +using std::signbit; +using std::isgreater; +using std::isgreaterequal; +using std::isless; +using std::islessequal; +using std::islessgreater; +using std::isunordered; + + + +using std::acosh; +using std::asinh; +using std::atanh; +using std::cbrt; +using std::copysign; +using std::erf; +using std::erfc; +using std::exp2; +using std::expm1; +using std::fdim; +using std::fma; +using std::fmax; +using std::fmin; +using std::hypot; +using std::ilogb; +using std::lgamma; +using std::llrint; +using std::llround; +using std::log1p; +using std::log2; +using std::logb; +using std::lrint; +using std::lround; +using std::nearbyint; +using std::nextafter; +using std::nexttoward; +using std::remainder; +using std::remquo; +using std::rint; +using std::round; +using std::scalbln; +using std::scalbn; +using std::tgamma; +using std::trunc; +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" 2 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" 2 +# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" +inline float NS_IEEEPositiveInfinity() { + union { uint32_t mPRUint32; float mFloat; } pun; + pun.mPRUint32 = 0x7F800000; + return pun.mFloat; +} +inline bool NS_IEEEIsNan(float aF) { + union { uint32_t mBits; float mFloat; } pun; + pun.mFloat = aF; + return (pun.mBits & 0x7F800000) == 0x7F800000 && + (pun.mBits & 0x007FFFFF) != 0; +} + + + + + +typedef int32_t nscoord; + + + + + +inline void VERIFY_COORD(nscoord aCoord) { + + + + +} + + + + + +inline nscoord NSCoordDivRem(nscoord aSpace, size_t aN, nscoord* aQuotient) +{ + + + + + div_t result = div(aSpace, aN); + *aQuotient = nscoord(result.quot); + return nscoord(result.rem); + +} + +inline nscoord NSCoordMulDiv(nscoord aMult1, nscoord aMult2, nscoord aDiv) { + + + + return (int64_t(aMult1) * int64_t(aMult2) / int64_t(aDiv)); + +} + +inline nscoord NSToCoordRound(float aValue) +{ + + + + return nscoord(floorf(aValue + 0.5f)); + +} + +inline nscoord NSToCoordRound(double aValue) +{ + + + + return nscoord(floor(aValue + 0.5f)); + +} + +inline nscoord NSToCoordRoundWithClamp(float aValue) +{ + + + if (aValue >= nscoord(1 << 30)) { + return nscoord(1 << 30); + } + if (aValue <= (-nscoord(1 << 30))) { + return (-nscoord(1 << 30)); + } + + return NSToCoordRound(aValue); +} + + + + + + + +inline nscoord _nscoordSaturatingMultiply(nscoord aCoord, float aScale, + bool requireNotNegative) { + VERIFY_COORD(aCoord); + if (requireNotNegative) { + do { } while (0); + + } + + + + float product = aCoord * aScale; + if (requireNotNegative ? aCoord > 0 : (aCoord > 0) == (aScale > 0)) + return NSToCoordRoundWithClamp(std::min(nscoord(1 << 30), product)); + return NSToCoordRoundWithClamp(std::max((-nscoord(1 << 30)), product)); + +} + + + + + + + +inline nscoord NSCoordSaturatingNonnegativeMultiply(nscoord aCoord, float aScale) { + return _nscoordSaturatingMultiply(aCoord, aScale, true); +} + + + + + +inline nscoord NSCoordSaturatingMultiply(nscoord aCoord, float aScale) { + return _nscoordSaturatingMultiply(aCoord, aScale, false); +} +# 167 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" +inline nscoord +NSCoordSaturatingAdd(nscoord a, nscoord b) +{ + VERIFY_COORD(a); + VERIFY_COORD(b); + + + + + + if (a == nscoord(1 << 30) || b == nscoord(1 << 30)) { + + return nscoord(1 << 30); + } else { + + + return std::min(nscoord(1 << 30), a + b); + } + +} +# 204 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" +inline nscoord +NSCoordSaturatingSubtract(nscoord a, nscoord b, + nscoord infMinusInfResult) +{ + VERIFY_COORD(a); + VERIFY_COORD(b); + + if (b == nscoord(1 << 30)) { + if (a == nscoord(1 << 30)) { + + return infMinusInfResult; + } else { + + do { } while(0); + return 0; + } + } else { + + + + + if (a == nscoord(1 << 30)) { + + return nscoord(1 << 30); + } else { + + + return std::min(nscoord(1 << 30), a - b); + } + + } +} + +inline float NSCoordToFloat(nscoord aCoord) { + VERIFY_COORD(aCoord); + + + + return (float)aCoord; +} + + + + +inline nscoord NSToCoordFloor(float aValue) +{ + return nscoord(floorf(aValue)); +} + +inline nscoord NSToCoordFloor(double aValue) +{ + return nscoord(floor(aValue)); +} + +inline nscoord NSToCoordFloorClamped(float aValue) +{ + + + if (aValue >= nscoord(1 << 30)) { + return nscoord(1 << 30); + } + if (aValue <= (-nscoord(1 << 30))) { + return (-nscoord(1 << 30)); + } + + return NSToCoordFloor(aValue); +} + +inline nscoord NSToCoordCeil(float aValue) +{ + return nscoord(ceilf(aValue)); +} + +inline nscoord NSToCoordCeil(double aValue) +{ + return nscoord(ceil(aValue)); +} + +inline nscoord NSToCoordCeilClamped(double aValue) +{ + + + if (aValue >= nscoord(1 << 30)) { + return nscoord(1 << 30); + } + if (aValue <= (-nscoord(1 << 30))) { + return (-nscoord(1 << 30)); + } + + return NSToCoordCeil(aValue); +} + + + + + +inline nscoord NSToCoordTrunc(float aValue) +{ + + + return nscoord(aValue); +} + +inline nscoord NSToCoordTrunc(double aValue) +{ + + + return nscoord(aValue); +} + +inline nscoord NSToCoordTruncClamped(float aValue) +{ + + + if (aValue >= nscoord(1 << 30)) { + return nscoord(1 << 30); + } + if (aValue <= (-nscoord(1 << 30))) { + return (-nscoord(1 << 30)); + } + + return NSToCoordTrunc(aValue); +} + +inline nscoord NSToCoordTruncClamped(double aValue) +{ + + + if (aValue >= nscoord(1 << 30)) { + return nscoord(1 << 30); + } + if (aValue <= (-nscoord(1 << 30))) { + return (-nscoord(1 << 30)); + } + + return NSToCoordTrunc(aValue); +} + + + + +inline int32_t NSToIntFloor(float aValue) +{ + return int32_t(floorf(aValue)); +} + +inline int32_t NSToIntCeil(float aValue) +{ + return int32_t(ceilf(aValue)); +} + +inline int32_t NSToIntRound(float aValue) +{ + return NS_lroundf(aValue); +} + +inline int32_t NSToIntRound(double aValue) +{ + return NS_lround(aValue); +} + +inline int32_t NSToIntRoundUp(double aValue) +{ + return int32_t(floor(aValue + 0.5)); +} + + + + +inline nscoord NSFloatPixelsToAppUnits(float aPixels, float aAppUnitsPerPixel) +{ + return NSToCoordRoundWithClamp(aPixels * aAppUnitsPerPixel); +} + +inline nscoord NSIntPixelsToAppUnits(int32_t aPixels, int32_t aAppUnitsPerPixel) +{ + + + nscoord r = aPixels * (nscoord)aAppUnitsPerPixel; + VERIFY_COORD(r); + return r; +} + +inline float NSAppUnitsToFloatPixels(nscoord aAppUnits, float aAppUnitsPerPixel) +{ + return (float(aAppUnits) / aAppUnitsPerPixel); +} + +inline double NSAppUnitsToDoublePixels(nscoord aAppUnits, double aAppUnitsPerPixel) +{ + return (double(aAppUnits) / aAppUnitsPerPixel); +} + +inline int32_t NSAppUnitsToIntPixels(nscoord aAppUnits, float aAppUnitsPerPixel) +{ + return NSToIntRound(float(aAppUnits) / aAppUnitsPerPixel); +} + +inline float NSCoordScale(nscoord aCoord, int32_t aFromAPP, int32_t aToAPP) +{ + return (NSCoordToFloat(aCoord) * aToAPP) / aFromAPP; +} +# 418 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" +inline float NSUnitsToTwips(float aValue, float aPointsPerUnit) +{ + return aValue * aPointsPerUnit * 20.0f; +} + +inline float NSTwipsToUnits(float aTwips, float aUnitsPerPoint) +{ + return (aTwips * (aUnitsPerPoint / 20.0f)); +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsColor.h" 2 + +class nsAString; +class nsString; + + + +typedef uint32_t nscolor; +# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsColor.h" +namespace mozilla { + +template +inline uint8_t ClampColor(T aColor) +{ + if (aColor >= 255) { + return 255; + } + if (aColor <= 0) { + return 0; + } + return NSToIntRound(aColor); +} + +} +# 65 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsColor.h" +enum class nsHexColorType : uint8_t { + NoAlpha, + AllowAlpha, +}; + + + + +bool +NS_HexToRGBA(const nsAString& aBuf, nsHexColorType aType, nscolor* aResult); + + + +nscolor NS_ComposeColors(nscolor aBG, nscolor aFG); + +namespace mozilla { + +inline uint32_t RoundingDivideBy255(uint32_t n) +{ + + + + return (n + 127) / 255; +} + + + +nscolor LinearBlendColors(nscolor aBg, nscolor aFg, uint_fast8_t aFgRatio); + +} + + + + +bool NS_LooseHexToRGB(const nsString& aBuf, nscolor* aResult); + + + + + + +bool NS_ColorNameToRGB(const nsAString& aBuf, nscolor* aResult); + + + +const char * const * NS_AllColorNames(size_t *aSizeArray); + + + +nscolor NS_HSL2RGB(float h, float s, float l); + + + + + + +const char* NS_RGBToColorName(nscolor aColor); +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCaseTreatment.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCaseTreatment.h" +enum nsCaseTreatment { + eCaseMatters, + eIgnoreCase +}; +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMargin.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMargin.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPoint.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPoint.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseSize.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseSize.h" +namespace mozilla { +namespace gfx { + + + + + + +template +struct BaseSize { + union { + struct { + T width, height; + }; + T components[2]; + }; + + + constexpr BaseSize() : width(0), height(0) {} + constexpr BaseSize(T aWidth, T aHeight) : width(aWidth), height(aHeight) {} + + void SizeTo(T aWidth, T aHeight) { width = aWidth; height = aHeight; } + + bool IsEmpty() const { + return width <= 0 || height <= 0; + } + + bool IsSquare() const { + return width == height; + } + + + + + bool operator==(const Sub& aSize) const { + return width == aSize.width && height == aSize.height; + } + bool operator!=(const Sub& aSize) const { + return width != aSize.width || height != aSize.height; + } + bool operator<=(const Sub& aSize) const { + return width <= aSize.width && height <= aSize.height; + } + bool operator<(const Sub& aSize) const { + return *this <= aSize && *this != aSize; + } + + Sub operator+(const Sub& aSize) const { + return Sub(width + aSize.width, height + aSize.height); + } + Sub operator-(const Sub& aSize) const { + return Sub(width - aSize.width, height - aSize.height); + } + Sub& operator+=(const Sub& aSize) { + width += aSize.width; + height += aSize.height; + return *static_cast(this); + } + Sub& operator-=(const Sub& aSize) { + width -= aSize.width; + height -= aSize.height; + return *static_cast(this); + } + + Sub operator*(T aScale) const { + return Sub(width * aScale, height * aScale); + } + Sub operator/(T aScale) const { + return Sub(width / aScale, height / aScale); + } + friend Sub operator*(T aScale, const Sub& aSize) { + return Sub(aScale * aSize.width, aScale * aSize.height); + } + void Scale(T aXScale, T aYScale) { + width *= aXScale; + height *= aYScale; + } + + Sub operator*(const Sub& aSize) const { + return Sub(width * aSize.width, height * aSize.height); + } + Sub operator/(const Sub& aSize) const { + return Sub(width / aSize.width, height / aSize.height); + } + + friend Sub Min(const Sub& aA, const Sub& aB) { + return Sub(std::min(aA.width, aB.width), + std::min(aA.height, aB.height)); + } + + friend Sub Max(const Sub& aA, const Sub& aB) { + return Sub(std::max(aA.width, aB.width), + std::max(aA.height, aB.height)); + } + + friend std::ostream& operator<<(std::ostream& aStream, + const BaseSize& aSize) { + return aStream << aSize.width << " x " << aSize.height; + } +}; + +} +} +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPoint.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint.h" 1 + + + + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint.h" 2 + + + + + +namespace mozilla { +namespace gfx { + + + + + + +template +struct BasePoint { + union { + struct { + T x, y; + }; + T components[2]; + }; + + + constexpr BasePoint() : x(0), y(0) {} + constexpr BasePoint(Coord aX, Coord aY) : x(aX), y(aY) {} + + void MoveTo(T aX, T aY) { x = aX; y = aY; } + void MoveBy(T aDx, T aDy) { x += aDx; y += aDy; } + + + + + bool operator==(const Sub& aPoint) const { + return x == aPoint.x && y == aPoint.y; + } + bool operator!=(const Sub& aPoint) const { + return x != aPoint.x || y != aPoint.y; + } + + Sub operator+(const Sub& aPoint) const { + return Sub(x + aPoint.x, y + aPoint.y); + } + Sub operator-(const Sub& aPoint) const { + return Sub(x - aPoint.x, y - aPoint.y); + } + Sub& operator+=(const Sub& aPoint) { + x += aPoint.x; + y += aPoint.y; + return *static_cast(this); + } + Sub& operator-=(const Sub& aPoint) { + x -= aPoint.x; + y -= aPoint.y; + return *static_cast(this); + } + + Sub operator*(T aScale) const { + return Sub(x * aScale, y * aScale); + } + Sub operator/(T aScale) const { + return Sub(x / aScale, y / aScale); + } + + Sub operator-() const { + return Sub(-x, -y); + } + + T DotProduct(const Sub& aPoint) const { + return x * aPoint.x + y * aPoint.y; + } + + Coord Length() const { + return hypot(x, y); + } + + T LengthSquare() const { + return x * x + y * y; + } + + + + + Sub& Round() { + x = Coord(floor(T(x) + T(0.5))); + y = Coord(floor(T(y) + T(0.5))); + return *static_cast(this); + } + + + bool IsFinite() const + { + typedef typename mozilla::Conditional::value, float, double>::Type FloatType; + return (mozilla::IsFinite(FloatType(x)) && mozilla::IsFinite(FloatType(y))); + return true; + } + + void Clamp(T aMaxAbsValue) + { + x = std::max(std::min(x, aMaxAbsValue), -aMaxAbsValue); + y = std::max(std::min(y, aMaxAbsValue), -aMaxAbsValue); + } + + friend std::ostream& operator<<(std::ostream& stream, const BasePoint& aPoint) { + return stream << '(' << aPoint.x << ',' << aPoint.y << ')'; + } + +}; + +} +} +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPoint.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSize.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSize.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h" 2 + + +namespace mozilla { +namespace gfx { + +typedef float Float; + +enum class SurfaceType : int8_t { + DATA, + D2D1_BITMAP, + D2D1_DRAWTARGET, + CAIRO, + CAIRO_IMAGE, + COREGRAPHICS_IMAGE, + COREGRAPHICS_CGCONTEXT, + SKIA, + DUAL_DT, + D2D1_1_IMAGE, + RECORDING, + TILED, + DATA_SHARED, +}; + +enum class SurfaceFormat : int8_t { + + + + + B8G8R8A8, + B8G8R8X8, + R8G8B8A8, + R8G8B8X8, + A8R8G8B8, + X8R8G8B8, + + R8G8B8, + B8G8R8, + + + + + R5G6B5_UINT16, + + + A8, + + + YUV, + NV12, + YUV422, + HSV, + Lab, + Depth, + + + UNKNOWN, + + + + + + A8R8G8B8_UINT32 = B8G8R8A8, + X8R8G8B8_UINT32 = B8G8R8X8 + + + + + + +}; + +inline bool IsOpaque(SurfaceFormat aFormat) +{ + switch (aFormat) { + case SurfaceFormat::B8G8R8X8: + case SurfaceFormat::R8G8B8X8: + case SurfaceFormat::R5G6B5_UINT16: + case SurfaceFormat::YUV: + case SurfaceFormat::NV12: + case SurfaceFormat::YUV422: + return true; + default: + return false; + } +} + +enum class FilterType : int8_t { + BLEND = 0, + TRANSFORM, + MORPHOLOGY, + COLOR_MATRIX, + FLOOD, + TILE, + TABLE_TRANSFER, + DISCRETE_TRANSFER, + LINEAR_TRANSFER, + GAMMA_TRANSFER, + CONVOLVE_MATRIX, + DISPLACEMENT_MAP, + TURBULENCE, + ARITHMETIC_COMBINE, + COMPOSITE, + DIRECTIONAL_BLUR, + GAUSSIAN_BLUR, + POINT_DIFFUSE, + POINT_SPECULAR, + SPOT_DIFFUSE, + SPOT_SPECULAR, + DISTANT_DIFFUSE, + DISTANT_SPECULAR, + CROP, + PREMULTIPLY, + UNPREMULTIPLY +}; + +enum class DrawTargetType : int8_t { + SOFTWARE_RASTER = 0, + HARDWARE_RASTER, + VECTOR +}; + +enum class BackendType : int8_t { + NONE = 0, + DIRECT2D, + CAIRO, + SKIA, + RECORDING, + DIRECT2D1_1, + + + BACKEND_LAST +}; + +enum class FontType : int8_t { + DWRITE, + GDI, + MAC, + SKIA, + CAIRO, + COREGRAPHICS, + FONTCONFIG +}; + +enum class NativeSurfaceType : int8_t { + D3D10_TEXTURE, + CAIRO_CONTEXT, + CGCONTEXT, + CGCONTEXT_ACCELERATED, + OPENGL_TEXTURE +}; + +enum class NativeFontType : int8_t { + DWRITE_FONT_FACE, + GDI_FONT_FACE, + MAC_FONT_FACE, + SKIA_FONT_FACE, + CAIRO_FONT_FACE +}; + +enum class FontStyle : int8_t { + NORMAL, + ITALIC, + BOLD, + BOLD_ITALIC +}; + +enum class FontHinting : int8_t { + NONE, + LIGHT, + NORMAL, + FULL +}; + +enum class CompositionOp : int8_t { + OP_OVER, + OP_ADD, + OP_ATOP, + OP_OUT, + OP_IN, + OP_SOURCE, + OP_DEST_IN, + OP_DEST_OUT, + OP_DEST_OVER, + OP_DEST_ATOP, + OP_XOR, + OP_MULTIPLY, + OP_SCREEN, + OP_OVERLAY, + OP_DARKEN, + OP_LIGHTEN, + OP_COLOR_DODGE, + OP_COLOR_BURN, + OP_HARD_LIGHT, + OP_SOFT_LIGHT, + OP_DIFFERENCE, + OP_EXCLUSION, + OP_HUE, + OP_SATURATION, + OP_COLOR, + OP_LUMINOSITY, + OP_COUNT +}; + +enum class Axis : int8_t { + X_AXIS, + Y_AXIS, + BOTH +}; + +enum class ExtendMode : int8_t { + CLAMP, + REPEAT, + REPEAT_X, + REPEAT_Y, + REFLECT +}; + +enum class FillRule : int8_t { + FILL_WINDING, + FILL_EVEN_ODD +}; + +enum class AntialiasMode : int8_t { + NONE, + GRAY, + SUBPIXEL, + DEFAULT +}; + + +enum class SamplingFilter : int8_t { + GOOD, + LINEAR, + POINT, + SENTINEL +}; + +enum class PatternType : int8_t { + COLOR, + SURFACE, + LINEAR_GRADIENT, + RADIAL_GRADIENT +}; + +enum class JoinStyle : int8_t { + BEVEL, + ROUND, + MITER, + + + MITER_OR_BEVEL +}; + +enum class CapStyle : int8_t { + BUTT, + ROUND, + SQUARE +}; + +enum class SamplingBounds : int8_t { + UNBOUNDED, + BOUNDED +}; + + +struct Color +{ +public: + Color() + : r(0.0f), g(0.0f), b(0.0f), a(0.0f) + {} + Color(Float aR, Float aG, Float aB, Float aA) + : r(aR), g(aG), b(aB), a(aA) + {} + Color(Float aR, Float aG, Float aB) + : r(aR), g(aG), b(aB), a(1.0f) + {} + + static Color FromABGR(uint32_t aColor) + { + Color newColor(((aColor >> 0) & 0xff) * (1.0f / 255.0f), + ((aColor >> 8) & 0xff) * (1.0f / 255.0f), + ((aColor >> 16) & 0xff) * (1.0f / 255.0f), + ((aColor >> 24) & 0xff) * (1.0f / 255.0f)); + + return newColor; + } + + + + static Color UnusualFromARGB(uint32_t aColor) + { + Color newColor(((aColor >> 16) & 0xff) * (1.0f / 255.0f), + ((aColor >> 8) & 0xff) * (1.0f / 255.0f), + ((aColor >> 0) & 0xff) * (1.0f / 255.0f), + ((aColor >> 24) & 0xff) * (1.0f / 255.0f)); + + return newColor; + } + + uint32_t ToABGR() const + { + return uint32_t(r * 255.0f) | uint32_t(g * 255.0f) << 8 | + uint32_t(b * 255.0f) << 16 | uint32_t(a * 255.0f) << 24; + } + + + + uint32_t UnusualToARGB() const + { + return uint32_t(b * 255.0f) | uint32_t(g * 255.0f) << 8 | + uint32_t(r * 255.0f) << 16 | uint32_t(a * 255.0f) << 24; + } + + bool operator==(const Color& aColor) const { + return r == aColor.r && g == aColor.g && b == aColor.b && a == aColor.a; + } + + bool operator!=(const Color& aColor) const { + return !(*this == aColor); + } + + Float r, g, b, a; +}; + +struct GradientStop +{ + bool operator<(const GradientStop& aOther) const { + return offset < aOther.offset; + } + + Float offset; + Color color; +}; + +enum class JobStatus { + Complete, + Wait, + Yield, + Error +}; + +} +} + + +typedef mozilla::gfx::SurfaceFormat gfxImageFormat; +# 371 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h" +namespace mozilla { + + +enum Side { eSideTop, eSideRight, eSideBottom, eSideLeft }; + +enum SideBits { + eSideBitsNone = 0, + eSideBitsTop = 1 << eSideTop, + eSideBitsRight = 1 << eSideRight, + eSideBitsBottom = 1 << eSideBottom, + eSideBitsLeft = 1 << eSideLeft, + eSideBitsTopBottom = eSideBitsTop | eSideBitsBottom, + eSideBitsLeftRight = eSideBitsLeft | eSideBitsRight, + eSideBitsAll = eSideBitsTopBottom | eSideBitsLeftRight +}; +# 398 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h" +static inline Side& operator++(Side& side) { + do { } while (0); + + side = Side(side + 1); + return side; +} + +enum Corner { + + eCornerTopLeft = 0, + eCornerTopRight = 1, + eCornerBottomRight = 2, + eCornerBottomLeft = 3 +}; + + + + +constexpr int eCornerCount = 4; +# 427 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h" +static inline Corner operator++(Corner& aCorner) { + do { } while (0); + + aCorner = Corner(aCorner + 1); + return aCorner; +} + + +enum HalfCorner { + + eCornerTopLeftX = 0, + eCornerTopLeftY = 1, + eCornerTopRightX = 2, + eCornerTopRightY = 3, + eCornerBottomRightX = 4, + eCornerBottomRightY = 5, + eCornerBottomLeftX = 6, + eCornerBottomLeftY = 7 +}; +# 456 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h" +static inline HalfCorner operator++(HalfCorner& aHalfCorner) { + do { } while (0); + + aHalfCorner = HalfCorner(aHalfCorner + 1); + return aHalfCorner; +} + + + + +constexpr bool HalfCornerIsX(HalfCorner aHalfCorner) +{ + return !(aHalfCorner % 2); +} + +constexpr Corner HalfToFullCorner(HalfCorner aHalfCorner) +{ + return Corner(aHalfCorner / 2); +} + +constexpr HalfCorner FullToHalfCorner(Corner aCorner, bool aIsVertical) +{ + return HalfCorner(aCorner * 2 + aIsVertical); +} + +constexpr bool SideIsVertical(Side aSide) +{ + return aSide % 2; +} + + + + + +constexpr Corner SideToFullCorner(Side aSide, bool aIsSecond) +{ + return Corner((aSide + aIsSecond) % 4); +} +# 502 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h" +constexpr HalfCorner SideToHalfCorner(Side aSide, bool aIsSecond, + bool aIsParallel) +{ + return HalfCorner(((aSide + aIsSecond) * 2 + (aSide + !aIsParallel) % 2) % 8); +} + +} +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseCoord.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseCoord.h" +namespace mozilla { +namespace gfx { + + + + + + +template +struct BaseCoord { + T value; + + + constexpr BaseCoord() : value(0) {} + explicit constexpr BaseCoord(T aValue) : value(aValue) {} + + + + + operator T() const { return value; } + + friend bool operator==(Sub aA, Sub aB) { + return aA.value == aB.value; + } + friend bool operator!=(Sub aA, Sub aB) { + return aA.value != aB.value; + } + + friend Sub operator+(Sub aA, Sub aB) { + return Sub(aA.value + aB.value); + } + friend Sub operator-(Sub aA, Sub aB) { + return Sub(aA.value - aB.value); + } + friend Sub operator*(Sub aCoord, T aScale) { + return Sub(aCoord.value * aScale); + } + friend Sub operator*(T aScale, Sub aCoord) { + return Sub(aScale * aCoord.value); + } + friend Sub operator/(Sub aCoord, T aScale) { + return Sub(aCoord.value / aScale); + } + + + Sub& operator+=(Sub aCoord) { + value += aCoord.value; + return *static_cast(this); + } + Sub& operator-=(Sub aCoord) { + value -= aCoord.value; + return *static_cast(this); + } + Sub& operator*=(T aScale) { + value *= aScale; + return *static_cast(this); + } + Sub& operator/=(T aScale) { + value /= aScale; + return *static_cast(this); + } + + + + + + friend bool operator==(Sub aA, T aB) { + return aA.value == aB; + } + friend bool operator==(T aA, Sub aB) { + return aA == aB.value; + } + friend bool operator!=(Sub aA, T aB) { + return aA.value != aB; + } + friend bool operator!=(T aA, Sub aB) { + return aA != aB.value; + } + friend T operator+(Sub aA, T aB) { + return aA.value + aB; + } + friend T operator+(T aA, Sub aB) { + return aA + aB.value; + } + friend T operator-(Sub aA, T aB) { + return aA.value - aB; + } + friend T operator-(T aA, Sub aB) { + return aA - aB.value; + } + + Sub operator-() const { + return Sub(-value); + } +}; + +} +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h" 2 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h" 2 + +namespace mozilla { + +template struct IsPixel; + +namespace gfx { + +template struct IntCoordTyped; +template struct CoordTyped; +# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h" +template +struct CommonType; + +template +struct CommonType, primitive> { + typedef decltype(int32_t() + primitive()) type; +}; + +template +struct CommonType, primitive> { + typedef decltype(F() + primitive()) type; +}; +# 53 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h" +template +struct CoordOperatorsHelper { + + +}; + +template +struct CoordOperatorsHelper { + friend bool operator==(coord aA, primitive aB) { + return aA.value == aB; + } + friend bool operator==(primitive aA, coord aB) { + return aA == aB.value; + } + friend bool operator!=(coord aA, primitive aB) { + return aA.value != aB; + } + friend bool operator!=(primitive aA, coord aB) { + return aA != aB.value; + } + + typedef typename CommonType::type result_type; + + friend result_type operator+(coord aA, primitive aB) { + return aA.value + aB; + } + friend result_type operator+(primitive aA, coord aB) { + return aA + aB.value; + } + friend result_type operator-(coord aA, primitive aB) { + return aA.value - aB; + } + friend result_type operator-(primitive aA, coord aB) { + return aA - aB.value; + } + friend result_type operator*(coord aCoord, primitive aScale) { + return aCoord.value * aScale; + } + friend result_type operator*(primitive aScale, coord aCoord) { + return aScale * aCoord.value; + } + friend result_type operator/(coord aCoord, primitive aScale) { + return aCoord.value / aScale; + } + +}; + + + + +template +struct IntCoordTyped : + public BaseCoord< int32_t, IntCoordTyped >, + public CoordOperatorsHelper< true, IntCoordTyped, float >, + public CoordOperatorsHelper< true, IntCoordTyped, double > { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef BaseCoord< int32_t, IntCoordTyped > Super; + + constexpr IntCoordTyped() : Super() {} + constexpr IntCoordTyped(int32_t aValue) : Super(aValue) {} +}; + +template +struct CoordTyped : + public BaseCoord< F, CoordTyped >, + public CoordOperatorsHelper< !IsSame::value, CoordTyped, int32_t >, + public CoordOperatorsHelper< !IsSame::value, CoordTyped, uint32_t >, + public CoordOperatorsHelper< !IsSame::value, CoordTyped, double >, + public CoordOperatorsHelper< !IsSame::value, CoordTyped, float > { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef BaseCoord< F, CoordTyped > Super; + + constexpr CoordTyped() : Super() {} + constexpr CoordTyped(F aValue) : Super(aValue) {} + explicit constexpr CoordTyped(const IntCoordTyped& aCoord) : Super(F(aCoord.value)) {} + + void Round() { + this->value = floor(this->value + 0.5); + } + void Truncate() { + this->value = int32_t(this->value); + } + + IntCoordTyped Rounded() const { + return IntCoordTyped(int32_t(floor(this->value + 0.5))); + } + IntCoordTyped Truncated() const { + return IntCoordTyped(int32_t(this->value)); + } +}; + +} +} +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint3D.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint3D.h" +namespace mozilla { +namespace gfx { + + + + + + +template +struct BasePoint3D { + union { + struct { + T x, y, z; + }; + T components[3]; + }; + + + BasePoint3D() : x(0), y(0), z(0) {} + BasePoint3D(T aX, T aY, T aZ) : x(aX), y(aY), z(aZ) {} + + void MoveTo(T aX, T aY, T aZ) { x = aX; y = aY; z = aZ; } + void MoveBy(T aDx, T aDy, T aDz) { x += aDx; y += aDy; z += aDz; } + + + + + T& operator[](int aIndex) { + do { } while (0); + return *((&x)+aIndex); + } + + const T& operator[](int aIndex) const { + do { } while (0); + return *((&x)+aIndex); + } + + bool operator==(const Sub& aPoint) const { + return x == aPoint.x && y == aPoint.y && z == aPoint.z; + } + bool operator!=(const Sub& aPoint) const { + return x != aPoint.x || y != aPoint.y || z != aPoint.z; + } + + Sub operator+(const Sub& aPoint) const { + return Sub(x + aPoint.x, y + aPoint.y, z + aPoint.z); + } + Sub operator-(const Sub& aPoint) const { + return Sub(x - aPoint.x, y - aPoint.y, z - aPoint.z); + } + Sub& operator+=(const Sub& aPoint) { + x += aPoint.x; + y += aPoint.y; + z += aPoint.z; + return *static_cast(this); + } + Sub& operator-=(const Sub& aPoint) { + x -= aPoint.x; + y -= aPoint.y; + z -= aPoint.z; + return *static_cast(this); + } + + Sub operator*(T aScale) const { + return Sub(x * aScale, y * aScale, z * aScale); + } + Sub operator/(T aScale) const { + return Sub(x / aScale, y / aScale, z / aScale); + } + + Sub& operator*=(T aScale) { + x *= aScale; + y *= aScale; + z *= aScale; + return *static_cast(this); + } + + Sub& operator/=(T aScale) { + x /= aScale; + y /= aScale; + z /= aScale; + return *static_cast(this); + } + + Sub operator-() const { + return Sub(-x, -y, -z); + } + + Sub CrossProduct(const Sub& aPoint) const { + return Sub(y * aPoint.z - aPoint.y * z, + z * aPoint.x - aPoint.z * x, + x * aPoint.y - aPoint.x * y); + } + + T DotProduct(const Sub& aPoint) const { + return x * aPoint.x + y * aPoint.y + z * aPoint.z; + } + + T Length() const { + return sqrt(x*x + y*y + z*z); + } + + + void Normalize() { + *this /= Length(); + } +}; + +} +} +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint4D.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint4D.h" +namespace mozilla { +namespace gfx { + + + + + + +template +struct BasePoint4D { + union { + struct { + T x, y, z, w; + }; + T components[4]; + }; + + + BasePoint4D() : x(0), y(0), z(0), w(0) {} + BasePoint4D(T aX, T aY, T aZ, T aW) : x(aX), y(aY), z(aZ), w(aW) {} + + void MoveTo(T aX, T aY, T aZ, T aW) { x = aX; y = aY; z = aZ; w = aW; } + void MoveBy(T aDx, T aDy, T aDz, T aDw) { x += aDx; y += aDy; z += aDz; w += aDw; } + + + + + bool operator==(const Sub& aPoint) const { + return x == aPoint.x && y == aPoint.y && + z == aPoint.z && w == aPoint.w; + } + bool operator!=(const Sub& aPoint) const { + return x != aPoint.x || y != aPoint.y || + z != aPoint.z || w != aPoint.w; + } + + Sub operator+(const Sub& aPoint) const { + return Sub(x + aPoint.x, y + aPoint.y, z + aPoint.z, w + aPoint.w); + } + Sub operator-(const Sub& aPoint) const { + return Sub(x - aPoint.x, y - aPoint.y, z - aPoint.z, w - aPoint.w); + } + Sub& operator+=(const Sub& aPoint) { + x += aPoint.x; + y += aPoint.y; + z += aPoint.z; + w += aPoint.w; + return *static_cast(this); + } + Sub& operator-=(const Sub& aPoint) { + x -= aPoint.x; + y -= aPoint.y; + z -= aPoint.z; + w -= aPoint.w; + return *static_cast(this); + } + + Sub operator*(T aScale) const { + return Sub(x * aScale, y * aScale, z * aScale, w * aScale); + } + Sub operator/(T aScale) const { + return Sub(x / aScale, y / aScale, z / aScale, w / aScale); + } + + Sub& operator*=(T aScale) { + x *= aScale; + y *= aScale; + z *= aScale; + w *= aScale; + return *static_cast(this); + } + + Sub& operator/=(T aScale) { + x /= aScale; + y /= aScale; + z /= aScale; + w /= aScale; + return *static_cast(this); + } + + Sub operator-() const { + return Sub(-x, -y, -z, -w); + } + + T& operator[](int aIndex) { + do { } while (0); + return *((&x)+aIndex); + } + + const T& operator[](int aIndex) const { + do { } while (0); + return *((&x)+aIndex); + } + + T DotProduct(const Sub& aPoint) const { + return x * aPoint.x + y * aPoint.y + z * aPoint.z + w * aPoint.w; + } + + + Sub CrossProduct(const Sub& aPoint) const { + return Sub(y * aPoint.z - aPoint.y * z, + z * aPoint.x - aPoint.z * x, + x * aPoint.y - aPoint.x * y, + 0); + } + + T Length() const { + return sqrt(x*x + y*y + z*z + w*w); + } + + void Normalize() { + *this /= Length(); + } + + bool HasPositiveWCoord() { return w > 0; } +}; + +} +} +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 2 + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 2 + +namespace mozilla { + +template struct IsPixel; + +namespace gfx { + + +struct UnknownUnits {}; + +} + +template<> struct IsPixel : TrueType {}; + +namespace gfx { + + + + + + +template +struct IntParam { + constexpr IntParam(char val) : value(val) {} + constexpr IntParam(unsigned char val) : value(val) {} + constexpr IntParam(short val) : value(val) {} + constexpr IntParam(unsigned short val) : value(val) {} + constexpr IntParam(int val) : value(val) {} + constexpr IntParam(unsigned int val) : value(val) {} + constexpr IntParam(long val) : value(val) {} + constexpr IntParam(unsigned long val) : value(val) {} + constexpr IntParam(long long val) : value(val) {} + constexpr IntParam(unsigned long long val) : value(val) {} + template + constexpr IntParam(IntCoordTyped val) : value(val) {} + + + IntParam(float val) = delete; + IntParam(double val) = delete; + + T value; +}; + +template struct PointTyped; +template struct SizeTyped; + +template +struct IntPointTyped : + public BasePoint< int32_t, IntPointTyped, IntCoordTyped >, + public units { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef IntParam ToInt; + typedef IntCoordTyped Coord; + typedef BasePoint< int32_t, IntPointTyped, IntCoordTyped > Super; + + constexpr IntPointTyped() : Super() {} + constexpr IntPointTyped(ToInt aX, ToInt aY) : Super(Coord(aX.value), Coord(aY.value)) {} + + static IntPointTyped Round(float aX, float aY) { + return IntPointTyped(int32_t(floorf(aX + 0.5)), int32_t(floorf(aY + 0.5))); + } + + static IntPointTyped Ceil(float aX, float aY) { + return IntPointTyped(int32_t(ceil(aX)), int32_t(ceil(aY))); + } + + static IntPointTyped Floor(float aX, float aY) { + return IntPointTyped(int32_t(floorf(aX)), int32_t(floorf(aY))); + } + + static IntPointTyped Truncate(float aX, float aY) { + return IntPointTyped(int32_t(aX), int32_t(aY)); + } + + static IntPointTyped Round(const PointTyped& aPoint); + static IntPointTyped Ceil(const PointTyped& aPoint); + static IntPointTyped Floor(const PointTyped& aPoint); + static IntPointTyped Truncate(const PointTyped& aPoint); + + + + + static IntPointTyped FromUnknownPoint(const IntPointTyped& aPoint) { + return IntPointTyped(aPoint.x, aPoint.y); + } + + IntPointTyped ToUnknownPoint() const { + return IntPointTyped(this->x, this->y); + } +}; +typedef IntPointTyped IntPoint; + +template +struct PointTyped : + public BasePoint< F, PointTyped, CoordTyped >, + public units { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef CoordTyped Coord; + typedef BasePoint< F, PointTyped, CoordTyped > Super; + + constexpr PointTyped() : Super() {} + constexpr PointTyped(F aX, F aY) : Super(Coord(aX), Coord(aY)) {} + + + constexpr PointTyped(F aX, Coord aY) : Super(Coord(aX), aY) {} + constexpr PointTyped(Coord aX, F aY) : Super(aX, Coord(aY)) {} + constexpr PointTyped(Coord aX, Coord aY) : Super(aX.value, aY.value) {} + constexpr PointTyped(const IntPointTyped& point) : Super(F(point.x), F(point.y)) {} + + + + + static PointTyped FromUnknownPoint(const PointTyped& aPoint) { + return PointTyped(aPoint.x, aPoint.y); + } + + PointTyped ToUnknownPoint() const { + return PointTyped(this->x, this->y); + } +}; +typedef PointTyped Point; +typedef PointTyped PointDouble; + +template +IntPointTyped RoundedToInt(const PointTyped& aPoint) { + return IntPointTyped::Round(aPoint.x, aPoint.y); +} + +template +IntPointTyped TruncatedToInt(const PointTyped& aPoint) { + return IntPointTyped::Truncate(aPoint.x, aPoint.y); +} + +template +struct Point3DTyped : + public BasePoint3D< F, Point3DTyped > { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef BasePoint3D< F, Point3DTyped > Super; + + Point3DTyped() : Super() {} + Point3DTyped(F aX, F aY, F aZ) : Super(aX, aY, aZ) {} + + + + + static Point3DTyped FromUnknownPoint(const Point3DTyped& aPoint) { + return Point3DTyped(aPoint.x, aPoint.y, aPoint.z); + } + + Point3DTyped ToUnknownPoint() const { + return Point3DTyped(this->x, this->y, this->z); + } +}; +typedef Point3DTyped Point3D; +typedef Point3DTyped PointDouble3D; + +template +IntPointTyped +IntPointTyped::Round(const PointTyped& aPoint) +{ + return IntPointTyped::Round(aPoint.x, aPoint.y); +} + +template +IntPointTyped +IntPointTyped::Ceil(const PointTyped& aPoint) +{ + return IntPointTyped::Ceil(aPoint.x, aPoint.y); +} + +template +IntPointTyped +IntPointTyped::Floor(const PointTyped& aPoint) +{ + return IntPointTyped::Floor(aPoint.x, aPoint.y); +} + +template +IntPointTyped +IntPointTyped::Truncate(const PointTyped& aPoint) +{ + return IntPointTyped::Truncate(aPoint.x, aPoint.y); +} + +template +struct Point4DTyped : + public BasePoint4D< F, Point4DTyped > { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef BasePoint4D< F, Point4DTyped > Super; + + Point4DTyped() : Super() {} + Point4DTyped(F aX, F aY, F aZ, F aW) : Super(aX, aY, aZ, aW) {} + + explicit Point4DTyped(const Point3DTyped& aPoint) + : Super(aPoint.x, aPoint.y, aPoint.z, 1) {} + + + + + static Point4DTyped FromUnknownPoint(const Point4DTyped& aPoint) { + return Point4DTyped(aPoint.x, aPoint.y, aPoint.z, aPoint.w); + } + + Point4DTyped ToUnknownPoint() const { + return Point4DTyped(this->x, this->y, this->z, this->w); + } + + PointTyped As2DPoint() const { + return PointTyped(this->x / this->w, + this->y / this->w); + } + + Point3DTyped As3DPoint() const { + return Point3DTyped(this->x / this->w, + this->y / this->w, + this->z / this->w); + } +}; +typedef Point4DTyped Point4D; +typedef Point4DTyped PointDouble4D; + +template +struct IntSizeTyped : + public BaseSize< int32_t, IntSizeTyped >, + public units { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef IntParam ToInt; + typedef BaseSize< int32_t, IntSizeTyped > Super; + + constexpr IntSizeTyped() : Super() {} + constexpr IntSizeTyped(ToInt aWidth, ToInt aHeight) : Super(aWidth.value, aHeight.value) {} + + static IntSizeTyped Round(float aWidth, float aHeight) { + return IntSizeTyped(int32_t(floorf(aWidth + 0.5)), int32_t(floorf(aHeight + 0.5))); + } + + static IntSizeTyped Truncate(float aWidth, float aHeight) { + return IntSizeTyped(int32_t(aWidth), int32_t(aHeight)); + } + + static IntSizeTyped Ceil(float aWidth, float aHeight) { + return IntSizeTyped(int32_t(ceil(aWidth)), int32_t(ceil(aHeight))); + } + + static IntSizeTyped Floor(float aWidth, float aHeight) { + return IntSizeTyped(int32_t(floorf(aWidth)), int32_t(floorf(aHeight))); + } + + static IntSizeTyped Round(const SizeTyped& aSize); + static IntSizeTyped Ceil(const SizeTyped& aSize); + static IntSizeTyped Floor(const SizeTyped& aSize); + static IntSizeTyped Truncate(const SizeTyped& aSize); + + + + + static IntSizeTyped FromUnknownSize(const IntSizeTyped& aSize) { + return IntSizeTyped(aSize.width, aSize.height); + } + + IntSizeTyped ToUnknownSize() const { + return IntSizeTyped(this->width, this->height); + } +}; +typedef IntSizeTyped IntSize; + +template +struct SizeTyped : + public BaseSize< F, SizeTyped >, + public units { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef BaseSize< F, SizeTyped > Super; + + constexpr SizeTyped() : Super() {} + constexpr SizeTyped(F aWidth, F aHeight) : Super(aWidth, aHeight) {} + explicit SizeTyped(const IntSizeTyped& size) : + Super(F(size.width), F(size.height)) {} + + + + + static SizeTyped FromUnknownSize(const SizeTyped& aSize) { + return SizeTyped(aSize.width, aSize.height); + } + + SizeTyped ToUnknownSize() const { + return SizeTyped(this->width, this->height); + } +}; +typedef SizeTyped Size; +typedef SizeTyped SizeDouble; + +template +IntSizeTyped RoundedToInt(const SizeTyped& aSize) { + return IntSizeTyped(int32_t(floorf(aSize.width + 0.5f)), + int32_t(floorf(aSize.height + 0.5f))); +} + +template IntSizeTyped +IntSizeTyped::Round(const SizeTyped& aSize) { + return IntSizeTyped::Round(aSize.width, aSize.height); +} + +template IntSizeTyped +IntSizeTyped::Ceil(const SizeTyped& aSize) { + return IntSizeTyped::Ceil(aSize.width, aSize.height); +} + +template IntSizeTyped +IntSizeTyped::Floor(const SizeTyped& aSize) { + return IntSizeTyped::Floor(aSize.width, aSize.height); +} + +template IntSizeTyped +IntSizeTyped::Truncate(const SizeTyped& aSize) { + return IntSizeTyped::Truncate(aSize.width, aSize.height); +} + +} +} +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSize.h" 2 + + + + +typedef mozilla::gfx::IntSize nsIntSize; + +struct nsSize : public mozilla::gfx::BaseSize { + typedef mozilla::gfx::BaseSize Super; + + nsSize() : Super() {} + nsSize(nscoord aWidth, nscoord aHeight) : Super(aWidth, aHeight) {} + + inline mozilla::gfx::IntSize ScaleToNearestPixels(float aXScale, float aYScale, + nscoord aAppUnitsPerPixel) const; + inline mozilla::gfx::IntSize ToNearestPixels(nscoord aAppUnitsPerPixel) const; + + + + + + + __attribute__ ((warn_unused_result)) inline nsSize + ScaleToOtherAppUnits(int32_t aFromAPP, int32_t aToAPP) const; +}; + +inline mozilla::gfx::IntSize +nsSize::ScaleToNearestPixels(float aXScale, float aYScale, + nscoord aAppUnitsPerPixel) const +{ + return mozilla::gfx::IntSize( + NSToIntRoundUp(NSAppUnitsToDoublePixels(width, aAppUnitsPerPixel) * aXScale), + NSToIntRoundUp(NSAppUnitsToDoublePixels(height, aAppUnitsPerPixel) * aYScale)); +} + +inline mozilla::gfx::IntSize +nsSize::ToNearestPixels(nscoord aAppUnitsPerPixel) const +{ + return ScaleToNearestPixels(1.0f, 1.0f, aAppUnitsPerPixel); +} + +inline nsSize +nsSize::ScaleToOtherAppUnits(int32_t aFromAPP, int32_t aToAPP) const { + if (aFromAPP != aToAPP) { + nsSize size; + size.width = NSToCoordRound(NSCoordScale(width, aFromAPP, aToAPP)); + size.height = NSToCoordRound(NSCoordScale(height, aFromAPP, aToAPP)); + return size; + } + return *this; +} + +inline nsSize +IntSizeToAppUnits(mozilla::gfx::IntSize aSize, nscoord aAppUnitsPerPixel) +{ + return nsSize(NSIntPixelsToAppUnits(aSize.width, aAppUnitsPerPixel), + NSIntPixelsToAppUnits(aSize.height, aAppUnitsPerPixel)); +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPoint.h" 2 + + + + + +typedef mozilla::gfx::IntPoint nsIntPoint; + + + +struct nsPoint : public mozilla::gfx::BasePoint { + typedef mozilla::gfx::BasePoint Super; + + nsPoint() : Super() {} + nsPoint(const nsPoint& aPoint) : Super(aPoint) {} + nsPoint(nscoord aX, nscoord aY) : Super(aX, aY) {} + + inline nsIntPoint ScaleToNearestPixels(float aXScale, float aYScale, + nscoord aAppUnitsPerPixel) const; + inline nsIntPoint ToNearestPixels(nscoord aAppUnitsPerPixel) const; + + + + + + + __attribute__ ((warn_unused_result)) inline nsPoint + ScaleToOtherAppUnits(int32_t aFromAPP, int32_t aToAPP) const; + + __attribute__ ((warn_unused_result)) inline nsPoint + RemoveResolution(const float resolution) const; + __attribute__ ((warn_unused_result)) inline nsPoint + ApplyResolution(const float resolution) const; +}; + +inline nsPoint ToAppUnits(const nsIntPoint& aPoint, nscoord aAppUnitsPerPixel); + +inline nsIntPoint +nsPoint::ScaleToNearestPixels(float aXScale, float aYScale, + nscoord aAppUnitsPerPixel) const +{ + return nsIntPoint( + NSToIntRoundUp(NSAppUnitsToDoublePixels(x, aAppUnitsPerPixel) * aXScale), + NSToIntRoundUp(NSAppUnitsToDoublePixels(y, aAppUnitsPerPixel) * aYScale)); +} + +inline nsIntPoint +nsPoint::ToNearestPixels(nscoord aAppUnitsPerPixel) const +{ + return ScaleToNearestPixels(1.0f, 1.0f, aAppUnitsPerPixel); +} + +inline nsPoint +nsPoint::ScaleToOtherAppUnits(int32_t aFromAPP, int32_t aToAPP) const +{ + if (aFromAPP != aToAPP) { + nsPoint point; + point.x = NSToCoordRound(NSCoordScale(x, aFromAPP, aToAPP)); + point.y = NSToCoordRound(NSCoordScale(y, aFromAPP, aToAPP)); + return point; + } + return *this; +} + +inline nsPoint +nsPoint::RemoveResolution(const float resolution) const { + if (resolution != 1.0f) { + nsPoint point; + point.x = NSToCoordRound(NSCoordToFloat(x) / resolution); + point.y = NSToCoordRound(NSCoordToFloat(y) / resolution); + return point; + } + return *this; +} + +inline nsPoint +nsPoint::ApplyResolution(const float resolution) const { + if (resolution != 1.0f) { + nsPoint point; + point.x = NSToCoordRound(NSCoordToFloat(x) * resolution); + point.y = NSToCoordRound(NSCoordToFloat(y) * resolution); + return point; + } + return *this; +} + + +inline nsPoint +ToAppUnits(const nsIntPoint& aPoint, nscoord aAppUnitsPerPixel) +{ + return nsPoint(NSIntPixelsToAppUnits(aPoint.x, aAppUnitsPerPixel), + NSIntPixelsToAppUnits(aPoint.y, aAppUnitsPerPixel)); +} +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMargin.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseMargin.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseMargin.h" +namespace mozilla { + + + + +struct Sides final { + Sides() : mBits(0) {} + explicit Sides(SideBits aSideBits) + { + do { } while (0); + mBits = aSideBits; + } + bool IsEmpty() const { return mBits == 0; } + bool Top() const { return (mBits & eSideBitsTop) != 0; } + bool Right() const { return (mBits & eSideBitsRight) != 0; } + bool Bottom() const { return (mBits & eSideBitsBottom) != 0; } + bool Left() const { return (mBits & eSideBitsLeft) != 0; } + bool Contains(SideBits aSideBits) const + { + do { } while (0); + return (mBits & aSideBits) == aSideBits; + } + Sides operator|(Sides aOther) const + { + return Sides(SideBits(mBits | aOther.mBits)); + } + Sides operator|(SideBits aSideBits) const + { + return *this | Sides(aSideBits); + } + Sides& operator|=(Sides aOther) + { + mBits |= aOther.mBits; + return *this; + } + Sides& operator|=(SideBits aSideBits) + { + return *this |= Sides(aSideBits); + } + bool operator==(Sides aOther) const + { + return mBits == aOther.mBits; + } + bool operator!=(Sides aOther) const + { + return !(*this == aOther); + } + +private: + uint8_t mBits; +}; + +namespace gfx { + + + + + +template +struct BaseMargin { + typedef mozilla::Side SideT; + + + + T top, right, bottom, left; + + + BaseMargin() : top(0), right(0), bottom(0), left(0) {} + BaseMargin(T aTop, T aRight, T aBottom, T aLeft) : + top(aTop), right(aRight), bottom(aBottom), left(aLeft) {} + + void SizeTo(T aTop, T aRight, T aBottom, T aLeft) + { + top = aTop; right = aRight; bottom = aBottom; left = aLeft; + } + + T LeftRight() const { return left + right; } + T TopBottom() const { return top + bottom; } + + T& Side(SideT aSide) { + + return *(&top + int(aSide)); + } + T Side(SideT aSide) const { + + return *(&top + int(aSide)); + } + + void ApplySkipSides(Sides aSkipSides) + { + if (aSkipSides.Top()) { + top = 0; + } + if (aSkipSides.Right()) { + right = 0; + } + if (aSkipSides.Bottom()) { + bottom = 0; + } + if (aSkipSides.Left()) { + left = 0; + } + } + + + + bool operator==(const Sub& aMargin) const { + return top == aMargin.top && right == aMargin.right && + bottom == aMargin.bottom && left == aMargin.left; + } + bool operator!=(const Sub& aMargin) const { + return !(*this == aMargin); + } + Sub operator+(const Sub& aMargin) const { + return Sub(top + aMargin.top, right + aMargin.right, + bottom + aMargin.bottom, left + aMargin.left); + } + Sub operator-(const Sub& aMargin) const { + return Sub(top - aMargin.top, right - aMargin.right, + bottom - aMargin.bottom, left - aMargin.left); + } + Sub& operator+=(const Sub& aMargin) { + top += aMargin.top; + right += aMargin.right; + bottom += aMargin.bottom; + left += aMargin.left; + return *static_cast(this); + } + + friend std::ostream& operator<<(std::ostream& aStream, + const BaseMargin& aMargin) { + return aStream << '(' << aMargin.top << ',' << aMargin.right << ',' + << aMargin.bottom << ',' << aMargin.left << ')'; + } +}; + +} +} +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMargin.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 1 + + + + + + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseRect.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseRect.h" +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseRect.h" 2 + + + + + + + +namespace mozilla { +namespace gfx { +# 44 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseRect.h" +template +struct BaseRect { + T x, y, width, height; + + + BaseRect() : x(0), y(0), width(0), height(0) {} + BaseRect(const Point& aOrigin, const SizeT &aSize) : + x(aOrigin.x), y(aOrigin.y), width(aSize.width), height(aSize.height) + { + } + BaseRect(T aX, T aY, T aWidth, T aHeight) : + x(aX), y(aY), width(aWidth), height(aHeight) + { + } + + + + bool IsEmpty() const { return height <= 0 || width <= 0; } + void SetEmpty() { width = height = 0; } + + + bool IsFinite() const + { + typedef typename mozilla::Conditional::value, float, double>::Type FloatType; + return (mozilla::IsFinite(FloatType(x)) && + mozilla::IsFinite(FloatType(y)) && + mozilla::IsFinite(FloatType(width)) && + mozilla::IsFinite(FloatType(height))); + } + + + + + bool Contains(const Sub& aRect) const + { + return aRect.IsEmpty() || + (x <= aRect.x && aRect.XMost() <= XMost() && + y <= aRect.y && aRect.YMost() <= YMost()); + } + + + + bool Contains(T aX, T aY) const + { + return x <= aX && aX < XMost() && + y <= aY && aY < YMost(); + } + + + + bool Contains(const Point& aPoint) const { return Contains(aPoint.x, aPoint.y); } + + + + + bool Intersects(const Sub& aRect) const + { + return !IsEmpty() && !aRect.IsEmpty() && + x < aRect.XMost() && aRect.x < XMost() && + y < aRect.YMost() && aRect.y < YMost(); + } + + + + + __attribute__ ((warn_unused_result)) Sub Intersect(const Sub& aRect) const + { + Sub result; + result.x = std::max(x, aRect.x); + result.y = std::max(y, aRect.y); + result.width = std::min(x - result.x + width, aRect.x - result.x + aRect.width); + result.height = std::min(y - result.y + height, aRect.y - result.y + aRect.height); + if (result.width < 0 || result.height < 0) { + result.SizeTo(0, 0); + } + return result; + } + + + + + + + bool IntersectRect(const Sub& aRect1, const Sub& aRect2) + { + *static_cast(this) = aRect1.Intersect(aRect2); + return !IsEmpty(); + } + + + + + + + + __attribute__ ((warn_unused_result)) Sub Union(const Sub& aRect) const + { + if (IsEmpty()) { + return aRect; + } else if (aRect.IsEmpty()) { + return *static_cast(this); + } else { + return UnionEdges(aRect); + } + } + + + + + + __attribute__ ((warn_unused_result)) Sub UnionEdges(const Sub& aRect) const + { + Sub result; + result.x = std::min(x, aRect.x); + result.y = std::min(y, aRect.y); + result.width = std::max(XMost(), aRect.XMost()) - result.x; + result.height = std::max(YMost(), aRect.YMost()) - result.y; + return result; + } + + + + + + + void UnionRect(const Sub& aRect1, const Sub& aRect2) + { + *static_cast(this) = aRect1.Union(aRect2); + } + + + + + + + void UnionRectEdges(const Sub& aRect1, const Sub& aRect2) + { + *static_cast(this) = aRect1.UnionEdges(aRect2); + } + + + void ExpandToEnclose(const Point& aPoint) + { + if (aPoint.x < x) { + width = XMost() - aPoint.x; + x = aPoint.x; + } else if (aPoint.x > XMost()) { + width = aPoint.x - x; + } + if (aPoint.y < y) { + height = YMost() - aPoint.y; + y = aPoint.y; + } else if (aPoint.y > YMost()) { + height = aPoint.y - y; + } + } + + void SetRect(T aX, T aY, T aWidth, T aHeight) + { + x = aX; y = aY; width = aWidth; height = aHeight; + } + void SetRect(const Point& aPt, const SizeT& aSize) + { + SetRect(aPt.x, aPt.y, aSize.width, aSize.height); + } + void MoveTo(T aX, T aY) { x = aX; y = aY; } + void MoveTo(const Point& aPoint) { x = aPoint.x; y = aPoint.y; } + void MoveBy(T aDx, T aDy) { x += aDx; y += aDy; } + void MoveBy(const Point& aPoint) { x += aPoint.x; y += aPoint.y; } + void SizeTo(T aWidth, T aHeight) { width = aWidth; height = aHeight; } + void SizeTo(const SizeT& aSize) { width = aSize.width; height = aSize.height; } + + void Inflate(T aD) { Inflate(aD, aD); } + void Inflate(T aDx, T aDy) + { + x -= aDx; + y -= aDy; + width += 2 * aDx; + height += 2 * aDy; + } + void Inflate(const MarginT& aMargin) + { + x -= aMargin.left; + y -= aMargin.top; + width += aMargin.LeftRight(); + height += aMargin.TopBottom(); + } + void Inflate(const SizeT& aSize) { Inflate(aSize.width, aSize.height); } + + void Deflate(T aD) { Deflate(aD, aD); } + void Deflate(T aDx, T aDy) + { + x += aDx; + y += aDy; + width = std::max(T(0), width - 2 * aDx); + height = std::max(T(0), height - 2 * aDy); + } + void Deflate(const MarginT& aMargin) + { + x += aMargin.left; + y += aMargin.top; + width = std::max(T(0), width - aMargin.LeftRight()); + height = std::max(T(0), height - aMargin.TopBottom()); + } + void Deflate(const SizeT& aSize) { Deflate(aSize.width, aSize.height); } + + + + + + bool IsEqualEdges(const Sub& aRect) const + { + return x == aRect.x && y == aRect.y && + width == aRect.width && height == aRect.height; + } + + + bool IsEqualInterior(const Sub& aRect) const + { + return IsEqualEdges(aRect) || (IsEmpty() && aRect.IsEmpty()); + } + + friend Sub operator+(Sub aSub, const Point& aPoint) + { + aSub += aPoint; + return aSub; + } + friend Sub operator-(Sub aSub, const Point& aPoint) + { + aSub -= aPoint; + return aSub; + } + friend Sub operator+(Sub aSub, const SizeT& aSize) + { + aSub += aSize; + return aSub; + } + friend Sub operator-(Sub aSub, const SizeT& aSize) + { + aSub -= aSize; + return aSub; + } + Sub& operator+=(const Point& aPoint) + { + MoveBy(aPoint); + return *static_cast(this); + } + Sub& operator-=(const Point& aPoint) + { + MoveBy(-aPoint); + return *static_cast(this); + } + Sub& operator+=(const SizeT& aSize) + { + width += aSize.width; + height += aSize.height; + return *static_cast(this); + } + Sub& operator-=(const SizeT& aSize) + { + width -= aSize.width; + height -= aSize.height; + return *static_cast(this); + } + + MarginT operator-(const Sub& aRect) const + { + return MarginT(aRect.y - y, + XMost() - aRect.XMost(), + YMost() - aRect.YMost(), + aRect.x - x); + } + + + Point TopLeft() const { return Point(x, y); } + Point TopRight() const { return Point(XMost(), y); } + Point BottomLeft() const { return Point(x, YMost()); } + Point BottomRight() const { return Point(XMost(), YMost()); } + Point AtCorner(Corner aCorner) const { + switch (aCorner) { + case eCornerTopLeft: return TopLeft(); + case eCornerTopRight: return TopRight(); + case eCornerBottomRight: return BottomRight(); + case eCornerBottomLeft: return BottomLeft(); + } + do { AnnotateMozCrashReason("MOZ_CRASH(" "GFX: Incomplete switch" ")"); do { *((volatile int*) __null) = 329; ::abort(); } while (0); } while (0); + } + Point CCWCorner(mozilla::Side side) const { + switch (side) { + case eSideTop: return TopLeft(); + case eSideRight: return TopRight(); + case eSideBottom: return BottomRight(); + case eSideLeft: return BottomLeft(); + } + do { AnnotateMozCrashReason("MOZ_CRASH(" "GFX: Incomplete switch" ")"); do { *((volatile int*) __null) = 338; ::abort(); } while (0); } while (0); + } + Point CWCorner(mozilla::Side side) const { + switch (side) { + case eSideTop: return TopRight(); + case eSideRight: return BottomRight(); + case eSideBottom: return BottomLeft(); + case eSideLeft: return TopLeft(); + } + do { AnnotateMozCrashReason("MOZ_CRASH(" "GFX: Incomplete switch" ")"); do { *((volatile int*) __null) = 347; ::abort(); } while (0); } while (0); + } + Point Center() const { return Point(x, y) + Point(width, height)/2; } + SizeT Size() const { return SizeT(width, height); } + + T Area() const { return width * height; } + + + T X() const { return x; } + T Y() const { return y; } + T Width() const { return width; } + T Height() const { return height; } + T XMost() const { return x + width; } + T YMost() const { return y + height; } + + + T Edge(mozilla::Side aSide) const + { + switch (aSide) { + case eSideTop: return Y(); + case eSideRight: return XMost(); + case eSideBottom: return YMost(); + case eSideLeft: return X(); + } + do { AnnotateMozCrashReason("MOZ_CRASH(" "GFX: Incomplete switch" ")"); do { *((volatile int*) __null) = 371; ::abort(); } while (0); } while (0); + } + + + void SetLeftEdge(T aX) { + do { } while (0); + width = XMost() - aX; + x = aX; + } + void SetRightEdge(T aXMost) { + do { } while (0); + width = aXMost - x; + } + void SetTopEdge(T aY) { + do { } while (0); + height = YMost() - aY; + y = aY; + } + void SetBottomEdge(T aYMost) { + do { } while (0); + height = aYMost - y; + } +# 405 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseRect.h" + void Round() + { + T x0 = static_cast(floor(T(X()) + 0.5)); + T y0 = static_cast(floor(T(Y()) + 0.5)); + T x1 = static_cast(floor(T(XMost()) + 0.5)); + T y1 = static_cast(floor(T(YMost()) + 0.5)); + + x = x0; + y = y0; + + width = x1 - x0; + height = y1 - y0; + } + + + + void RoundIn() + { + T x0 = static_cast(ceil(T(X()))); + T y0 = static_cast(ceil(T(Y()))); + T x1 = static_cast(floor(T(XMost()))); + T y1 = static_cast(floor(T(YMost()))); + + x = x0; + y = y0; + + width = x1 - x0; + height = y1 - y0; + } + + + + void RoundOut() + { + T x0 = static_cast(floor(T(X()))); + T y0 = static_cast(floor(T(Y()))); + T x1 = static_cast(ceil(T(XMost()))); + T y1 = static_cast(ceil(T(YMost()))); + + x = x0; + y = y0; + + width = x1 - x0; + height = y1 - y0; + } + + + void Scale(T aScale) { Scale(aScale, aScale); } + + void Scale(T aXScale, T aYScale) + { + T right = XMost() * aXScale; + T bottom = YMost() * aYScale; + x = x * aXScale; + y = y * aYScale; + width = right - x; + height = bottom - y; + } + + + + void ScaleRoundOut(double aScale) { ScaleRoundOut(aScale, aScale); } + + + + + void ScaleRoundOut(double aXScale, double aYScale) + { + T right = static_cast(ceil(double(XMost()) * aXScale)); + T bottom = static_cast(ceil(double(YMost()) * aYScale)); + x = static_cast(floor(double(x) * aXScale)); + y = static_cast(floor(double(y) * aYScale)); + width = right - x; + height = bottom - y; + } + + + void ScaleRoundIn(double aScale) { ScaleRoundIn(aScale, aScale); } + + + + void ScaleRoundIn(double aXScale, double aYScale) + { + T right = static_cast(floor(double(XMost()) * aXScale)); + T bottom = static_cast(floor(double(YMost()) * aYScale)); + x = static_cast(ceil(double(x) * aXScale)); + y = static_cast(ceil(double(y) * aYScale)); + width = std::max(0, right - x); + height = std::max(0, bottom - y); + } + + + + void ScaleInverseRoundOut(double aScale) { ScaleInverseRoundOut(aScale, aScale); } + + + + + void ScaleInverseRoundOut(double aXScale, double aYScale) + { + T right = static_cast(ceil(double(XMost()) / aXScale)); + T bottom = static_cast(ceil(double(YMost()) / aYScale)); + x = static_cast(floor(double(x) / aXScale)); + y = static_cast(floor(double(y) / aYScale)); + width = right - x; + height = bottom - y; + } + + + void ScaleInverseRoundIn(double aScale) { ScaleInverseRoundIn(aScale, aScale); } + + + + void ScaleInverseRoundIn(double aXScale, double aYScale) + { + T right = static_cast(floor(double(XMost()) / aXScale)); + T bottom = static_cast(floor(double(YMost()) / aYScale)); + x = static_cast(ceil(double(x) / aXScale)); + y = static_cast(ceil(double(y) / aYScale)); + width = std::max(0, right - x); + height = std::max(0, bottom - y); + } + + + + + + __attribute__ ((warn_unused_result)) Point ClampPoint(const Point& aPoint) const + { + return Point(std::max(x, std::min(XMost(), aPoint.x)), + std::max(y, std::min(YMost(), aPoint.y))); + } + + + + + + + __attribute__ ((warn_unused_result)) Sub MoveInsideAndClamp(const Sub& aRect) const + { + Sub rect(std::max(aRect.x, x), + std::max(aRect.y, y), + std::min(aRect.width, width), + std::min(aRect.height, height)); + rect.x = std::min(rect.XMost(), aRect.XMost()) - rect.width; + rect.y = std::min(rect.YMost(), aRect.YMost()) - rect.height; + return rect; + } + + + + + + + + static Sub MaxIntRect() + { + return Sub( + static_cast(-std::numeric_limits::max() * 0.5), + static_cast(-std::numeric_limits::max() * 0.5), + static_cast(std::numeric_limits::max()), + static_cast(std::numeric_limits::max()) + ); + }; + + friend std::ostream& operator<<(std::ostream& stream, + const BaseRect& aRect) { + return stream << '(' << aRect.x << ',' << aRect.y << ',' + << aRect.width << ',' << aRect.height << ')'; + } + +private: + + + bool operator==(const Sub& aRect) const { return false; } + bool operator!=(const Sub& aRect) const { return false; } +}; + +} +} +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/NumericTools.h" 1 + + + + + + + + +namespace mozilla { + + + + + + +inline int32_t +RoundDownToMultiple(int32_t x, int32_t aMultiplier) +{ + + + int mod = x % aMultiplier; + if (x > 0) { + return x - mod; + } + return mod ? x - aMultiplier - mod : x; +} + + + + +inline int32_t +RoundUpToMultiple(int32_t x, int32_t aMultiplier) +{ + int mod = x % aMultiplier; + if (x > 0) { + return mod ? x + aMultiplier - mod : x; + } + return x - mod; +} + +} +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Tools.h" 1 + + + + + + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" +namespace mozilla { + +template class CheckedInt; + +namespace detail { +# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" +struct UnsupportedType {}; + +template +struct IsSupportedPass2 +{ + static const bool value = false; +}; + +template +struct IsSupported +{ + static const bool value = IsSupportedPass2::value; +}; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + + + + + + + +template +struct TwiceBiggerType +{ + typedef typename detail::StdintTypeForSizeAndSignedness< + sizeof(IntegerType) * 2, + IsSigned::value + >::Type Type; +}; + +template +struct TwiceBiggerType +{ + typedef UnsupportedType Type; +}; + +template +inline bool +HasSignBit(T aX) +{ + + + + + return bool(typename MakeUnsigned::Type(aX) >> + PositionOfSignBit::value); +} + + + +template +inline T +BinaryComplement(T aX) +{ + return ~aX; +} + +template::value, + bool IsUSigned = IsSigned::value> +struct DoesRangeContainRange +{ +}; + +template +struct DoesRangeContainRange +{ + static const bool value = sizeof(T) >= sizeof(U); +}; + +template +struct DoesRangeContainRange +{ + static const bool value = sizeof(T) > sizeof(U); +}; + +template +struct DoesRangeContainRange +{ + static const bool value = false; +}; + +template::value, + bool IsUSigned = IsSigned::value, + bool DoesTRangeContainURange = DoesRangeContainRange::value> +struct IsInRangeImpl {}; + +template +struct IsInRangeImpl +{ + static bool constexpr run(U) + { + return true; + } +}; + +template +struct IsInRangeImpl +{ + static bool constexpr run(U aX) + { + return aX <= MaxValue::value && aX >= MinValue::value; + } +}; + +template +struct IsInRangeImpl +{ + static bool constexpr run(U aX) + { + return aX <= MaxValue::value; + } +}; + +template +struct IsInRangeImpl +{ + static bool constexpr run(U aX) + { + return sizeof(T) > sizeof(U) || aX <= U(MaxValue::value); + } +}; + +template +struct IsInRangeImpl +{ + static bool constexpr run(U aX) + { + return sizeof(T) >= sizeof(U) + ? aX >= 0 + : aX >= 0 && aX <= U(MaxValue::value); + } +}; + +template +inline constexpr bool +IsInRange(U aX) +{ + return IsInRangeImpl::run(aX); +} + +template +inline bool +IsAddValid(T aX, T aY) +{ + + + + + + + typename MakeUnsigned::Type ux = aX; + typename MakeUnsigned::Type uy = aY; + typename MakeUnsigned::Type result = ux + uy; + return IsSigned::value + ? HasSignBit(BinaryComplement(T((result ^ aX) & (result ^ aY)))) + : BinaryComplement(aX) >= aY; +} + +template +inline bool +IsSubValid(T aX, T aY) +{ + + + + typename MakeUnsigned::Type ux = aX; + typename MakeUnsigned::Type uy = aY; + typename MakeUnsigned::Type result = ux - uy; + + return IsSigned::value + ? HasSignBit(BinaryComplement(T((result ^ aX) & (aX ^ aY)))) + : aX >= aY; +} + +template::value, + bool TwiceBiggerTypeIsSupported = + IsSupported::Type>::value> +struct IsMulValidImpl {}; + +template +struct IsMulValidImpl +{ + static bool run(T aX, T aY) + { + typedef typename TwiceBiggerType::Type TwiceBiggerType; + TwiceBiggerType product = TwiceBiggerType(aX) * TwiceBiggerType(aY); + return IsInRange(product); + } +}; + +template +struct IsMulValidImpl +{ + static bool run(T aX, T aY) + { + const T max = MaxValue::value; + const T min = MinValue::value; + + if (aX == 0 || aY == 0) { + return true; + } + if (aX > 0) { + return aY > 0 + ? aX <= max / aY + : aY >= min / aX; + } + + + return aY > 0 + ? aX >= min / aY + : aY >= max / aX; + } +}; + +template +struct IsMulValidImpl +{ + static bool run(T aX, T aY) + { + return aY == 0 || aX <= MaxValue::value / aY; + } +}; + +template +inline bool +IsMulValid(T aX, T aY) +{ + return IsMulValidImpl::run(aX, aY); +} + +template +inline bool +IsDivValid(T aX, T aY) +{ + + + return aY != 0 && + !(IsSigned::value && aX == MinValue::value && aY == T(-1)); +} + +template::value> +struct IsModValidImpl; + +template +inline bool +IsModValid(T aX, T aY) +{ + return IsModValidImpl::run(aX, aY); +} +# 376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" +template +struct IsModValidImpl +{ + static inline bool run(T aX, T aY) + { + return aY >= 1; + } +}; + +template +struct IsModValidImpl +{ + static inline bool run(T aX, T aY) + { + if (aX < 0) { + return false; + } + return aY >= 1; + } +}; + +template::value> +struct NegateImpl; + +template +struct NegateImpl +{ + static CheckedInt negate(const CheckedInt& aVal) + { + + + return CheckedInt(0, aVal.isValid() && aVal.mValue == 0); + } +}; + +template +struct NegateImpl +{ + static CheckedInt negate(const CheckedInt& aVal) + { + + + if (!aVal.isValid() || aVal.mValue == MinValue::value) { + return CheckedInt(aVal.mValue, false); + } + return CheckedInt(-aVal.mValue, true); + } +}; + +} +# 499 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" +template +class CheckedInt +{ +protected: + T mValue; + bool mIsValid; + + template + CheckedInt(U aValue, bool aIsValid) : mValue(aValue), mIsValid(aIsValid) + { + static_assert(detail::IsSupported::value && + detail::IsSupported::value, + "This type is not supported by CheckedInt"); + } + + friend struct detail::NegateImpl; + +public: +# 528 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" + template + constexpr CheckedInt(U aValue) + : mValue(T(aValue)), + mIsValid(detail::IsInRange(aValue)) + { + static_assert(detail::IsSupported::value && + detail::IsSupported::value, + "This type is not supported by CheckedInt"); + } + + template + friend class CheckedInt; + + template + CheckedInt toChecked() const + { + CheckedInt ret(mValue); + ret.mIsValid = ret.mIsValid && mIsValid; + return ret; + } + + + constexpr CheckedInt() : mValue(0), mIsValid(true) + { + static_assert(detail::IsSupported::value, + "This type is not supported by CheckedInt"); + } + + + T value() const + { + do { } while (0); + return mValue; + } + + + + + + + bool isValid() const + { + return mIsValid; + } + + template + friend CheckedInt operator +(const CheckedInt& aLhs, + const CheckedInt& aRhs); + template + CheckedInt& operator +=(U aRhs); + CheckedInt& operator +=(const CheckedInt& aRhs); + + template + friend CheckedInt operator -(const CheckedInt& aLhs, + const CheckedInt& aRhs); + template + CheckedInt& operator -=(U aRhs); + CheckedInt& operator -=(const CheckedInt& aRhs); + + template + friend CheckedInt operator *(const CheckedInt& aLhs, + const CheckedInt& aRhs); + template + CheckedInt& operator *=(U aRhs); + CheckedInt& operator *=(const CheckedInt& aRhs); + + template + friend CheckedInt operator /(const CheckedInt& aLhs, + const CheckedInt& aRhs); + template + CheckedInt& operator /=(U aRhs); + CheckedInt& operator /=(const CheckedInt& aRhs); + + template + friend CheckedInt operator %(const CheckedInt& aLhs, + const CheckedInt& aRhs); + template + CheckedInt& operator %=(U aRhs); + CheckedInt& operator %=(const CheckedInt& aRhs); + + CheckedInt operator -() const + { + return detail::NegateImpl::negate(*this); + } +# 631 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" + bool operator ==(const CheckedInt& aOther) const + { + return mIsValid && aOther.mIsValid && mValue == aOther.mValue; + } + + + CheckedInt& operator++() + { + *this += 1; + return *this; + } + + + CheckedInt operator++(int) + { + CheckedInt tmp = *this; + *this += 1; + return tmp; + } + + + CheckedInt& operator--() + { + *this -= 1; + return *this; + } + + + CheckedInt operator--(int) + { + CheckedInt tmp = *this; + *this -= 1; + return tmp; + } + +private: + + + + + template bool operator !=(U aOther) const = delete; + template bool operator < (U aOther) const = delete; + template bool operator <=(U aOther) const = delete; + template bool operator > (U aOther) const = delete; + template bool operator >=(U aOther) const = delete; +}; +# 690 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" +template inline CheckedInt operator +(const CheckedInt& aLhs, const CheckedInt& aRhs) { if (!detail::IsAddValid(aLhs.mValue, aRhs.mValue)) { return CheckedInt(0, false); } return CheckedInt(aLhs.mValue + aRhs.mValue, aLhs.mIsValid && aRhs.mIsValid); } +template inline CheckedInt operator -(const CheckedInt& aLhs, const CheckedInt& aRhs) { if (!detail::IsSubValid(aLhs.mValue, aRhs.mValue)) { return CheckedInt(0, false); } return CheckedInt(aLhs.mValue - aRhs.mValue, aLhs.mIsValid && aRhs.mIsValid); } +template inline CheckedInt operator *(const CheckedInt& aLhs, const CheckedInt& aRhs) { if (!detail::IsMulValid(aLhs.mValue, aRhs.mValue)) { return CheckedInt(0, false); } return CheckedInt(aLhs.mValue * aRhs.mValue, aLhs.mIsValid && aRhs.mIsValid); } +template inline CheckedInt operator /(const CheckedInt& aLhs, const CheckedInt& aRhs) { if (!detail::IsDivValid(aLhs.mValue, aRhs.mValue)) { return CheckedInt(0, false); } return CheckedInt(aLhs.mValue / aRhs.mValue, aLhs.mIsValid && aRhs.mIsValid); } +template inline CheckedInt operator %(const CheckedInt& aLhs, const CheckedInt& aRhs) { if (!detail::IsModValid(aLhs.mValue, aRhs.mValue)) { return CheckedInt(0, false); } return CheckedInt(aLhs.mValue % aRhs.mValue, aLhs.mIsValid && aRhs.mIsValid); } +# 704 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" +namespace detail { + +template +struct CastToCheckedIntImpl +{ + typedef CheckedInt ReturnType; + static CheckedInt run(U aU) { return aU; } +}; + +template +struct CastToCheckedIntImpl > +{ + typedef const CheckedInt& ReturnType; + static const CheckedInt& run(const CheckedInt& aU) { return aU; } +}; + +} + +template +inline typename detail::CastToCheckedIntImpl::ReturnType +castToCheckedInt(U aU) +{ + static_assert(detail::IsSupported::value && + detail::IsSupported::value, + "This type is not supported by CheckedInt"); + return detail::CastToCheckedIntImpl::run(aU); +} +# 757 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" +template template CheckedInt& CheckedInt::operator +=(U aRhs) { *this = *this + castToCheckedInt(aRhs); return *this; } template CheckedInt& CheckedInt::operator +=(const CheckedInt& aRhs) { *this = *this + aRhs; return *this; } template inline CheckedInt operator +(const CheckedInt& aLhs, U aRhs) { return aLhs + castToCheckedInt(aRhs); } template inline CheckedInt operator +(U aLhs, const CheckedInt& aRhs) { return castToCheckedInt(aLhs) + aRhs; } +template template CheckedInt& CheckedInt::operator *=(U aRhs) { *this = *this * castToCheckedInt(aRhs); return *this; } template CheckedInt& CheckedInt::operator *=(const CheckedInt& aRhs) { *this = *this * aRhs; return *this; } template inline CheckedInt operator *(const CheckedInt& aLhs, U aRhs) { return aLhs * castToCheckedInt(aRhs); } template inline CheckedInt operator *(U aLhs, const CheckedInt& aRhs) { return castToCheckedInt(aLhs) * aRhs; } +template template CheckedInt& CheckedInt::operator -=(U aRhs) { *this = *this - castToCheckedInt(aRhs); return *this; } template CheckedInt& CheckedInt::operator -=(const CheckedInt& aRhs) { *this = *this - aRhs; return *this; } template inline CheckedInt operator -(const CheckedInt& aLhs, U aRhs) { return aLhs - castToCheckedInt(aRhs); } template inline CheckedInt operator -(U aLhs, const CheckedInt& aRhs) { return castToCheckedInt(aLhs) - aRhs; } +template template CheckedInt& CheckedInt::operator /=(U aRhs) { *this = *this / castToCheckedInt(aRhs); return *this; } template CheckedInt& CheckedInt::operator /=(const CheckedInt& aRhs) { *this = *this / aRhs; return *this; } template inline CheckedInt operator /(const CheckedInt& aLhs, U aRhs) { return aLhs / castToCheckedInt(aRhs); } template inline CheckedInt operator /(U aLhs, const CheckedInt& aRhs) { return castToCheckedInt(aLhs) / aRhs; } +template template CheckedInt& CheckedInt::operator %=(U aRhs) { *this = *this % castToCheckedInt(aRhs); return *this; } template CheckedInt& CheckedInt::operator %=(const CheckedInt& aRhs) { *this = *this % aRhs; return *this; } template inline CheckedInt operator %(const CheckedInt& aLhs, U aRhs) { return aLhs % castToCheckedInt(aRhs); } template inline CheckedInt operator %(U aLhs, const CheckedInt& aRhs) { return castToCheckedInt(aLhs) % aRhs; } + + + +template +inline bool +operator ==(const CheckedInt& aLhs, U aRhs) +{ + return aLhs == castToCheckedInt(aRhs); +} + +template +inline bool +operator ==(U aLhs, const CheckedInt& aRhs) +{ + return castToCheckedInt(aLhs) == aRhs; +} + + +typedef CheckedInt CheckedInt8; +typedef CheckedInt CheckedUint8; +typedef CheckedInt CheckedInt16; +typedef CheckedInt CheckedUint16; +typedef CheckedInt CheckedInt32; +typedef CheckedInt CheckedUint32; +typedef CheckedInt CheckedInt64; +typedef CheckedInt CheckedUint64; + +} +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Tools.h" 2 + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 1 3 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Tools.h" 2 + +namespace mozilla { +namespace gfx { + +static inline bool +IsOperatorBoundByMask(CompositionOp aOp) { + switch (aOp) { + case CompositionOp::OP_IN: + case CompositionOp::OP_OUT: + case CompositionOp::OP_DEST_IN: + case CompositionOp::OP_DEST_ATOP: + case CompositionOp::OP_SOURCE: + return false; + default: + return true; + } +} + +template +struct ClassStorage +{ + char bytes[sizeof(T)]; + + const T *addr() const { return (const T *)bytes; } + T *addr() { return (T *)(void *)bytes; } +}; + +static inline bool +FuzzyEqual(Float aA, Float aB, Float aErr) +{ + if ((aA + aErr >= aB) && (aA - aErr <= aB)) { + return true; + } + return false; +} + +static inline void +NudgeToInteger(float *aVal) +{ + float r = floorf(*aVal + 0.5f); + + + + + + if (FuzzyEqual(r, *aVal, r == 0.0f ? 1e-6f : fabs(r*1e-6f))) { + *aVal = r; + } +} + +static inline void +NudgeToInteger(float *aVal, float aErr) +{ + float r = floorf(*aVal + 0.5f); + if (FuzzyEqual(r, *aVal, aErr)) { + *aVal = r; + } +} + +static inline Float +Distance(Point aA, Point aB) +{ + return hypotf(aB.x - aA.x, aB.y - aA.y); +} + +static inline int +BytesPerPixel(SurfaceFormat aFormat) +{ + switch (aFormat) { + case SurfaceFormat::A8: + return 1; + case SurfaceFormat::R5G6B5_UINT16: + return 2; + case SurfaceFormat::R8G8B8: + case SurfaceFormat::B8G8R8: + return 3; + case SurfaceFormat::HSV: + case SurfaceFormat::Lab: + return 3 * sizeof(float); + case SurfaceFormat::Depth: + return sizeof(uint16_t); + default: + return 4; + } +} + +static inline bool +IsOpaqueFormat(SurfaceFormat aFormat) { + switch (aFormat) { + case SurfaceFormat::B8G8R8X8: + case SurfaceFormat::R8G8B8X8: + case SurfaceFormat::X8R8G8B8: + case SurfaceFormat::YUV: + case SurfaceFormat::NV12: + case SurfaceFormat::YUV422: + case SurfaceFormat::R5G6B5_UINT16: + return true; + default: + return false; + } +} + +template +struct AlignedArray +{ + typedef T value_type; + + AlignedArray() + : mPtr(nullptr) + , mStorage(nullptr) + { + } + + explicit __attribute__((always_inline)) inline AlignedArray(size_t aCount, bool aZero = false) + : mStorage(nullptr) + , mCount(0) + { + Realloc(aCount, aZero); + } + + __attribute__((always_inline)) inline ~AlignedArray() + { + Dealloc(); + } + + void Dealloc() + { + + + + + static_assert(mozilla::IsPod::value, + "Destructors must be invoked for this type"); +# 158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Tools.h" + free(mStorage); + mStorage = nullptr; + mPtr = nullptr; + } + + __attribute__((always_inline)) inline void Realloc(size_t aCount, bool aZero = false) + { + free(mStorage); + CheckedInt32 storageByteCount = + CheckedInt32(sizeof(T)) * aCount + (alignment - 1); + if (!storageByteCount.isValid()) { + mStorage = nullptr; + mPtr = nullptr; + mCount = 0; + return; + } + + + if (aZero) { + + + mStorage = static_cast(calloc(1, storageByteCount.value())); + } else { + mStorage = static_cast(malloc(storageByteCount.value())); + } + if (!mStorage) { + mStorage = nullptr; + mPtr = nullptr; + mCount = 0; + return; + } + if (uintptr_t(mStorage) % alignment) { + + mPtr = (T*)(uintptr_t(mStorage) + alignment - (uintptr_t(mStorage) % alignment)); + } else { + mPtr = (T*)(mStorage); + } + + + + + mPtr = new (mPtr) T[aCount]; + mCount = aCount; + } + + void Swap(AlignedArray& aOther) + { + mozilla::Swap(mPtr, aOther.mPtr); + mozilla::Swap(mStorage, aOther.mStorage); + mozilla::Swap(mCount, aOther.mCount); + } + + __attribute__((always_inline)) inline operator T*() + { + return mPtr; + } + + T *mPtr; + +private: + uint8_t *mStorage; + size_t mCount; +}; +# 230 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Tools.h" +template +int32_t GetAlignedStride(int32_t aWidth, int32_t aBytesPerPixel) +{ + static_assert(alignment > 0 && (alignment & (alignment-1)) == 0, + "This implementation currently require power-of-two alignment"); + const int32_t mask = alignment - 1; + CheckedInt32 stride = CheckedInt32(aWidth) * CheckedInt32(aBytesPerPixel) + CheckedInt32(mask); + if (stride.isValid()) { + return stride.value() & ~mask; + } + return 0; +} + +} +} +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h" 1 +# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h" +namespace mozilla { + +struct Nothing { }; +# 85 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h" +template +class Maybe +{ + alignas(T) unsigned char mStorage[sizeof(T)]; + char mIsSome; + + + + void* data() { return mStorage; } + const void* data() const { return mStorage; } + +public: + using ValueType = T; + + Maybe() : mIsSome(false) { } + ~Maybe() { reset(); } + + Maybe(Nothing) : mIsSome(false) { } + + Maybe(const Maybe& aOther) + : mIsSome(false) + { + if (aOther.mIsSome) { + emplace(*aOther); + } + } + + + + + template::value>::type> + + Maybe(const Maybe& aOther) + : mIsSome(false) + { + if (aOther.isSome()) { + emplace(*aOther); + } + } + + Maybe(Maybe&& aOther) + : mIsSome(false) + { + if (aOther.mIsSome) { + emplace(Move(*aOther)); + aOther.reset(); + } + } + + + + + template::value>::type> + + Maybe(Maybe&& aOther) + : mIsSome(false) + { + if (aOther.isSome()) { + emplace(Move(*aOther)); + aOther.reset(); + } + } + + Maybe& operator=(const Maybe& aOther) + { + if (&aOther != this) { + if (aOther.mIsSome) { + if (mIsSome) { + ref() = aOther.ref(); + } else { + emplace(*aOther); + } + } else { + reset(); + } + } + return *this; + } + + template::value>::type> + Maybe& operator=(const Maybe& aOther) + { + if (aOther.isSome()) { + if (mIsSome) { + ref() = aOther.ref(); + } else { + emplace(*aOther); + } + } else { + reset(); + } + return *this; + } + + Maybe& operator=(Maybe&& aOther) + { + do { } while (0); + + if (aOther.mIsSome) { + if (mIsSome) { + ref() = Move(aOther.ref()); + } else { + emplace(Move(*aOther)); + } + aOther.reset(); + } else { + reset(); + } + + return *this; + } + + template::value>::type> + Maybe& operator=(Maybe&& aOther) + { + if (aOther.isSome()) { + if (mIsSome) { + ref() = Move(aOther.ref()); + } else { + emplace(Move(*aOther)); + } + aOther.reset(); + } else { + reset(); + } + + return *this; + } + + + explicit operator bool() const { return isSome(); } + bool isSome() const { return mIsSome; } + bool isNothing() const { return !mIsSome; } + + + T value() const + { + do { } while (0); + return ref(); + } + + + + + + template + T valueOr(V&& aDefault) const + { + if (isSome()) { + return ref(); + } + return Forward(aDefault); + } + + + + + + template + T valueOrFrom(F&& aFunc) const + { + if (isSome()) { + return ref(); + } + return aFunc(); + } + + + T* ptr() + { + do { } while (0); + return &ref(); + } + + const T* ptr() const + { + do { } while (0); + return &ref(); + } + + + + + + T* ptrOr(T* aDefault) + { + if (isSome()) { + return ptr(); + } + return aDefault; + } + + const T* ptrOr(const T* aDefault) const + { + if (isSome()) { + return ptr(); + } + return aDefault; + } + + + + + + template + T* ptrOrFrom(F&& aFunc) + { + if (isSome()) { + return ptr(); + } + return aFunc(); + } + + template + const T* ptrOrFrom(F&& aFunc) const + { + if (isSome()) { + return ptr(); + } + return aFunc(); + } + + T* operator->() + { + do { } while (0); + return ptr(); + } + + const T* operator->() const + { + do { } while (0); + return ptr(); + } + + + T& ref() + { + do { } while (0); + return *static_cast(data()); + } + + const T& ref() const + { + do { } while (0); + return *static_cast(data()); + } + + + + + + T& refOr(T& aDefault) + { + if (isSome()) { + return ref(); + } + return aDefault; + } + + const T& refOr(const T& aDefault) const + { + if (isSome()) { + return ref(); + } + return aDefault; + } + + + + + + template + T& refOrFrom(F&& aFunc) + { + if (isSome()) { + return ref(); + } + return aFunc(); + } + + template + const T& refOrFrom(F&& aFunc) const + { + if (isSome()) { + return ref(); + } + return aFunc(); + } + + T& operator*() + { + do { } while (0); + return ref(); + } + + const T& operator*() const + { + do { } while (0); + return ref(); + } + + + + template + Maybe& apply(Func aFunc) + { + if (isSome()) { + aFunc(ref()); + } + return *this; + } + + template + const Maybe& apply(Func aFunc) const + { + if (isSome()) { + aFunc(ref()); + } + return *this; + } + + + + + + template + auto map(Func aFunc) -> Maybe>().ref()))> + { + using ReturnType = decltype(aFunc(ref())); + if (isSome()) { + Maybe val; + val.emplace(aFunc(ref())); + return val; + } + return Maybe(); + } + + template + auto map(Func aFunc) const -> Maybe>().ref()))> + { + using ReturnType = decltype(aFunc(ref())); + if (isSome()) { + Maybe val; + val.emplace(aFunc(ref())); + return val; + } + return Maybe(); + } + + + void reset() + { + if (isSome()) { + ref().T::~T(); + mIsSome = false; + } + } + + + + + + template + void emplace(Args&&... aArgs) + { + do { } while (0); + ::new (KnownNotNull, data()) T(Forward(aArgs)...); + mIsSome = true; + } + + friend std::ostream& + operator<<(std::ostream& aStream, const Maybe& aMaybe) + { + if (aMaybe) { + aStream << aMaybe.ref(); + } else { + aStream << ""; + } + return aStream; + } +}; +# 485 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h" +template::type>::type> +Maybe +Some(T&& aValue) +{ + Maybe value; + value.emplace(Forward(aValue)); + return value; +} + +template +Maybe::Type>::Type> +ToMaybe(T* aPtr) +{ + if (aPtr) { + return Some(*aPtr); + } + return Nothing(); +} + + + + + + +template bool +operator==(const Maybe& aLHS, const Maybe& aRHS) +{ + if (aLHS.isNothing() != aRHS.isNothing()) { + return false; + } + return aLHS.isNothing() || *aLHS == *aRHS; +} + +template bool +operator!=(const Maybe& aLHS, const Maybe& aRHS) +{ + return !(aLHS == aRHS); +} + + + + + +template bool +operator==(const Maybe& aLHS, const Nothing& aRHS) +{ + return aLHS.isNothing(); +} + +template bool +operator!=(const Maybe& aLHS, const Nothing& aRHS) +{ + return !(aLHS == aRHS); +} + +template bool +operator==(const Nothing& aLHS, const Maybe& aRHS) +{ + return aRHS.isNothing(); +} + +template bool +operator!=(const Nothing& aLHS, const Maybe& aRHS) +{ + return !(aLHS == aRHS); +} + + + + + +template bool +operator<(const Maybe& aLHS, const Maybe& aRHS) +{ + if (aLHS.isNothing()) { + return aRHS.isSome(); + } + if (aRHS.isNothing()) { + return false; + } + return *aLHS < *aRHS; +} + +template bool +operator>(const Maybe& aLHS, const Maybe& aRHS) +{ + return !(aLHS < aRHS || aLHS == aRHS); +} + +template bool +operator<=(const Maybe& aLHS, const Maybe& aRHS) +{ + return aLHS < aRHS || aLHS == aRHS; +} + +template bool +operator>=(const Maybe& aLHS, const Maybe& aRHS) +{ + return !(aLHS < aRHS); +} + +} +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 2 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 2 + +namespace mozilla { + +template struct IsPixel; + +namespace gfx { + +template struct RectTyped; + +template +struct IntMarginTyped: + public BaseMargin >, + public units { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef BaseMargin > Super; + + IntMarginTyped() : Super() {} + IntMarginTyped(int32_t aTop, int32_t aRight, int32_t aBottom, int32_t aLeft) : + Super(aTop, aRight, aBottom, aLeft) {} + + + + + static IntMarginTyped FromUnknownMargin(const IntMarginTyped& aMargin) { + return IntMarginTyped(aMargin.top, aMargin.right, + aMargin.bottom, aMargin.left); + } + + IntMarginTyped ToUnknownMargin() const { + return IntMarginTyped(this->top, this->right, + this->bottom, this->left); + } +}; +typedef IntMarginTyped IntMargin; + +template +struct MarginTyped: + public BaseMargin >, + public units { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef BaseMargin > Super; + + MarginTyped() : Super() {} + MarginTyped(F aTop, F aRight, F aBottom, F aLeft) : + Super(aTop, aRight, aBottom, aLeft) {} + explicit MarginTyped(const IntMarginTyped& aMargin) : + Super(F(aMargin.top), F(aMargin.right), + F(aMargin.bottom), F(aMargin.left)) {} +}; +typedef MarginTyped Margin; +typedef MarginTyped MarginDouble; + +template +IntMarginTyped RoundedToInt(const MarginTyped& aMargin) +{ + return IntMarginTyped(int32_t(floorf(aMargin.top + 0.5f)), + int32_t(floorf(aMargin.right + 0.5f)), + int32_t(floorf(aMargin.bottom + 0.5f)), + int32_t(floorf(aMargin.left + 0.5f))); +} + +template +struct IntRectTyped : + public BaseRect, IntPointTyped, IntSizeTyped, IntMarginTyped >, + public units { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef BaseRect, IntPointTyped, IntSizeTyped, IntMarginTyped > Super; + typedef IntRectTyped Self; + typedef IntParam ToInt; + + IntRectTyped() : Super() {} + IntRectTyped(const IntPointTyped& aPos, const IntSizeTyped& aSize) : + Super(aPos, aSize) {} + + IntRectTyped(ToInt aX, ToInt aY, ToInt aWidth, ToInt aHeight) : + Super(aX.value, aY.value, aWidth.value, aHeight.value) {} + + static IntRectTyped RoundIn(float aX, float aY, float aW, float aH) { + return IntRectTyped::RoundIn(RectTyped(aX, aY, aW, aH)); + } + + static IntRectTyped RoundOut(float aX, float aY, float aW, float aH) { + return IntRectTyped::RoundOut(RectTyped(aX, aY, aW, aH)); + } + + static IntRectTyped Round(float aX, float aY, float aW, float aH) { + return IntRectTyped::Round(RectTyped(aX, aY, aW, aH)); + } + + static IntRectTyped Truncate(float aX, float aY, float aW, float aH) { + return IntRectTyped(IntPointTyped::Truncate(aX, aY), + IntSizeTyped::Truncate(aW, aH)); + } + + static IntRectTyped RoundIn(const RectTyped& aRect) { + auto tmp(aRect); + tmp.RoundIn(); + return IntRectTyped(int32_t(tmp.x), int32_t(tmp.y), + int32_t(tmp.width), int32_t(tmp.height)); + } + + static IntRectTyped RoundOut(const RectTyped& aRect) { + auto tmp(aRect); + tmp.RoundOut(); + return IntRectTyped(int32_t(tmp.x), int32_t(tmp.y), + int32_t(tmp.width), int32_t(tmp.height)); + } + + static IntRectTyped Round(const RectTyped& aRect) { + auto tmp(aRect); + tmp.Round(); + return IntRectTyped(int32_t(tmp.x), int32_t(tmp.y), + int32_t(tmp.width), int32_t(tmp.height)); + } + + static IntRectTyped Truncate(const RectTyped& aRect) { + return IntRectTyped::Truncate(aRect.x, aRect.y, aRect.width, aRect.height); + } + + + void Round() {} + void RoundIn() {} + void RoundOut() {} + + + + + static IntRectTyped FromUnknownRect(const IntRectTyped& rect) { + return IntRectTyped(rect.x, rect.y, rect.width, rect.height); + } + + IntRectTyped ToUnknownRect() const { + return IntRectTyped(this->x, this->y, this->width, this->height); + } + + bool Overflows() const { + CheckedInt xMost = this->x; + xMost += this->width; + CheckedInt yMost = this->y; + yMost += this->height; + return !xMost.isValid() || !yMost.isValid(); + } + + + + + __attribute__ ((warn_unused_result)) Maybe SafeUnion(const Self& aRect) const + { + if (this->IsEmpty()) { + return aRect.Overflows() ? Nothing() : Some(aRect); + } else if (aRect.IsEmpty()) { + return Some(*static_cast(this)); + } else { + return this->SafeUnionEdges(aRect); + } + } + + + + __attribute__ ((warn_unused_result)) Maybe SafeUnionEdges(const Self& aRect) const + { + if (this->Overflows() || aRect.Overflows()) { + return Nothing(); + } + + + CheckedInt newX = std::min(this->x, aRect.x); + CheckedInt newY = std::min(this->y, aRect.y); + CheckedInt newXMost = std::max(this->XMost(), aRect.XMost()); + CheckedInt newYMost = std::max(this->YMost(), aRect.YMost()); + CheckedInt newW = newXMost - newX; + CheckedInt newH = newYMost - newY; + if (!newW.isValid() || !newH.isValid()) { + return Nothing(); + } + return Some(Self(newX.value(), newY.value(), newW.value(), newH.value())); + } + + + bool operator==(const IntRectTyped& aRect) const + { + return IntRectTyped::IsEqualEdges(aRect); + } + + void InflateToMultiple(const IntSizeTyped& aTileSize) + { + if (this->IsEmpty()) { + return; + } + + int32_t yMost = this->YMost(); + int32_t xMost = this->XMost(); + + this->x = mozilla::RoundDownToMultiple(this->x, aTileSize.width); + this->y = mozilla::RoundDownToMultiple(this->y, aTileSize.height); + xMost = mozilla::RoundUpToMultiple(xMost, aTileSize.width); + yMost = mozilla::RoundUpToMultiple(yMost, aTileSize.height); + + this->width = xMost - this->x; + this->height = yMost - this->y; + } + +}; +typedef IntRectTyped IntRect; + +template +struct RectTyped : + public BaseRect, PointTyped, SizeTyped, MarginTyped >, + public units { + static_assert(IsPixel::value, + "'units' must be a coordinate system tag"); + + typedef BaseRect, PointTyped, SizeTyped, MarginTyped > Super; + + RectTyped() : Super() {} + RectTyped(const PointTyped& aPos, const SizeTyped& aSize) : + Super(aPos, aSize) {} + RectTyped(F _x, F _y, F _width, F _height) : + Super(_x, _y, _width, _height) {} + explicit RectTyped(const IntRectTyped& rect) : + Super(F(rect.x), F(rect.y), + F(rect.width), F(rect.height)) {} + + void NudgeToIntegers() + { + NudgeToInteger(&(this->x)); + NudgeToInteger(&(this->y)); + NudgeToInteger(&(this->width)); + NudgeToInteger(&(this->height)); + } + + bool ToIntRect(IntRectTyped *aOut) const + { + *aOut = IntRectTyped(int32_t(this->X()), int32_t(this->Y()), + int32_t(this->Width()), int32_t(this->Height())); + return RectTyped(F(aOut->x), F(aOut->y), + F(aOut->width), F(aOut->height)) + .IsEqualEdges(*this); + } + + + + + static RectTyped FromUnknownRect(const RectTyped& rect) { + return RectTyped(rect.x, rect.y, rect.width, rect.height); + } + + RectTyped ToUnknownRect() const { + return RectTyped(this->x, this->y, this->width, this->height); + } + + + bool operator==(const RectTyped& aRect) const + { + return RectTyped::IsEqualEdges(aRect); + } +}; +typedef RectTyped Rect; +typedef RectTyped RectDouble; + +template +IntRectTyped RoundedToInt(const RectTyped& aRect) +{ + RectTyped copy(aRect); + copy.Round(); + return IntRectTyped(int32_t(copy.x), + int32_t(copy.y), + int32_t(copy.width), + int32_t(copy.height)); +} + +template +IntRectTyped RoundedIn(const RectTyped& aRect) +{ + return IntRectTyped::RoundIn(aRect); +} + +template +IntRectTyped RoundedOut(const RectTyped& aRect) +{ + return IntRectTyped::RoundOut(aRect); +} + +template +IntRectTyped TruncatedToInt(const RectTyped& aRect) { + return IntRectTyped::Truncate(aRect); +} + +template +RectTyped IntRectToRect(const IntRectTyped& aRect) +{ + return RectTyped(aRect.x, aRect.y, aRect.width, aRect.height); +} + + +template +Maybe +IntersectMaybeRects(const Maybe& a, const Maybe& b) +{ + if (!a) { + return b; + } else if (!b) { + return a; + } else { + return Some(a->Intersect(*b)); + } +} + +} +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMargin.h" 2 + +struct nsMargin : public mozilla::gfx::BaseMargin { + typedef mozilla::gfx::BaseMargin Super; + + + nsMargin() : Super() {} + nsMargin(const nsMargin& aMargin) : Super(aMargin) {} + nsMargin(nscoord aTop, nscoord aRight, nscoord aBottom, nscoord aLeft) + : Super(aTop, aRight, aBottom, aLeft) {} +}; + +typedef mozilla::gfx::IntMargin nsIntMargin; +# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/SVGAttrValueWrapper.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/SVGAttrValueWrapper.h" +class nsSVGAngle; +class nsSVGIntegerPair; +class nsSVGLength2; +class nsSVGNumberPair; +class nsSVGViewBox; + +namespace mozilla { +class SVGLengthList; +class SVGNumberList; +class SVGPathData; +class SVGPointList; +class SVGAnimatedPreserveAspectRatio; +class SVGStringList; +class SVGTransformList; +} + +namespace mozilla { + +class SVGAttrValueWrapper +{ +public: + static void ToString(const nsSVGAngle* aAngle, nsAString& aResult); + static void ToString(const nsSVGIntegerPair* aIntegerPair, + nsAString& aResult); + static void ToString(const nsSVGLength2* aLength, nsAString& aResult); + static void ToString(const mozilla::SVGLengthList* aLengthList, + nsAString& aResult); + static void ToString(const mozilla::SVGNumberList* aNumberList, + nsAString& aResult); + static void ToString(const nsSVGNumberPair* aNumberPair, nsAString& aResult); + static void ToString(const mozilla::SVGPathData* aPathData, + nsAString& aResult); + static void ToString(const mozilla::SVGPointList* aPointList, + nsAString& aResult); + static void ToString( + const mozilla::SVGAnimatedPreserveAspectRatio* aPreserveAspectRatio, + nsAString& aResult); + static void ToString(const mozilla::SVGStringList* aStringList, + nsAString& aResult); + static void ToString(const mozilla::SVGTransformList* aTransformList, + nsAString& aResult); + static void ToString(const nsSVGViewBox* aViewBox, nsAString& aResult); +}; + +} +# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h" 2 + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" 1 +# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" +namespace JS { class Value; } +# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" +enum JSValueType +{ + JSVAL_TYPE_DOUBLE = 0x00, + JSVAL_TYPE_INT32 = 0x01, + JSVAL_TYPE_UNDEFINED = 0x02, + JSVAL_TYPE_NULL = 0x03, + JSVAL_TYPE_BOOLEAN = 0x04, + JSVAL_TYPE_MAGIC = 0x05, + JSVAL_TYPE_STRING = 0x06, + JSVAL_TYPE_SYMBOL = 0x07, + JSVAL_TYPE_PRIVATE_GCTHING = 0x08, + JSVAL_TYPE_OBJECT = 0x0c, + + + JSVAL_TYPE_UNKNOWN = 0x20, + JSVAL_TYPE_MISSING = 0x21 +} __attribute__((packed)); + +static_assert(sizeof(JSValueType) == 1, + "compiler typed enum support is apparently buggy"); +# 90 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" +enum JSValueTag +{ + JSVAL_TAG_MAX_DOUBLE = 0x1FFF0, + JSVAL_TAG_INT32 = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_INT32, + JSVAL_TAG_UNDEFINED = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_UNDEFINED, + JSVAL_TAG_NULL = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_NULL, + JSVAL_TAG_BOOLEAN = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_BOOLEAN, + JSVAL_TAG_MAGIC = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_MAGIC, + JSVAL_TAG_STRING = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_STRING, + JSVAL_TAG_SYMBOL = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_SYMBOL, + JSVAL_TAG_PRIVATE_GCTHING = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_PRIVATE_GCTHING, + JSVAL_TAG_OBJECT = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_OBJECT +} __attribute__((packed)); + +static_assert(sizeof(JSValueTag) == sizeof(uint32_t), + "compiler typed enum support is apparently buggy"); + +enum JSValueShiftedTag +{ + JSVAL_SHIFTED_TAG_MAX_DOUBLE = ((((uint64_t)JSVAL_TAG_MAX_DOUBLE) << 47) | 0xFFFFFFFF), + JSVAL_SHIFTED_TAG_INT32 = (((uint64_t)JSVAL_TAG_INT32) << 47), + JSVAL_SHIFTED_TAG_UNDEFINED = (((uint64_t)JSVAL_TAG_UNDEFINED) << 47), + JSVAL_SHIFTED_TAG_NULL = (((uint64_t)JSVAL_TAG_NULL) << 47), + JSVAL_SHIFTED_TAG_BOOLEAN = (((uint64_t)JSVAL_TAG_BOOLEAN) << 47), + JSVAL_SHIFTED_TAG_MAGIC = (((uint64_t)JSVAL_TAG_MAGIC) << 47), + JSVAL_SHIFTED_TAG_STRING = (((uint64_t)JSVAL_TAG_STRING) << 47), + JSVAL_SHIFTED_TAG_SYMBOL = (((uint64_t)JSVAL_TAG_SYMBOL) << 47), + JSVAL_SHIFTED_TAG_PRIVATE_GCTHING = (((uint64_t)JSVAL_TAG_PRIVATE_GCTHING) << 47), + JSVAL_SHIFTED_TAG_OBJECT = (((uint64_t)JSVAL_TAG_OBJECT) << 47) +} __attribute__((packed)); + +static_assert(sizeof(JSValueShiftedTag) == sizeof(uint64_t), + "compiler typed enum support is apparently buggy"); +# 161 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" +typedef enum JSWhyMagic +{ + + JS_ELEMENTS_HOLE, + + + JS_NO_ITER_VALUE, + + + JS_GENERATOR_CLOSING, + + + JS_NO_CONSTANT, + + + JS_THIS_POISON, + + + JS_ARG_POISON, + + + JS_SERIALIZE_NO_NODE, + + + JS_LAZY_ARGUMENTS, + + + JS_OPTIMIZED_ARGUMENTS, + + + JS_IS_CONSTRUCTING, + + + JS_BLOCK_NEEDS_CLONE, + + + JS_HASH_KEY_EMPTY, + + + JS_ION_ERROR, + + + JS_ION_BAILOUT, + + + JS_OPTIMIZED_OUT, + + + JS_UNINITIALIZED_LEXICAL, + + + JS_GENERIC_MAGIC, + + JS_WHY_MAGIC_COUNT +} JSWhyMagic; + +namespace JS { + +static inline constexpr JS::Value UndefinedValue(); +static inline JS::Value PoisonedObjectValue(JSObject* obj); + +namespace detail { + +constexpr int CanonicalizedNaNSignBit = 0; +constexpr uint64_t CanonicalizedNaNSignificand = 0x8000000000000ULL; + +constexpr uint64_t CanonicalizedNaNBits = + mozilla::SpecificNaNBits::value; + +} + + + + + + + +static __attribute__((always_inline)) inline double +GenericNaN() +{ + return mozilla::SpecificNaN(detail::CanonicalizedNaNSignBit, + detail::CanonicalizedNaNSignificand); +} + + + + + +static inline double +CanonicalizeNaN(double d) +{ + if ((__builtin_expect(!!(mozilla::IsNaN(d)), 0))) + return GenericNaN(); + return d; +} +# 293 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" +class alignas(8) Value +{ + public: + + + + using PayloadType = uint64_t; + + + + + + + Value() = default; + Value(const Value& v) = default; + + + + + + template + static bool isNumberRepresentable(const T t) { + return T(double(t)) == t; + } + + + + void setNull() { + data.asBits = bitsFromTagAndPayload(JSVAL_TAG_NULL, 0); + } + + void setUndefined() { + data.asBits = bitsFromTagAndPayload(JSVAL_TAG_UNDEFINED, 0); + } + + void setInt32(int32_t i) { + data.asBits = bitsFromTagAndPayload(JSVAL_TAG_INT32, uint32_t(i)); + } + + int32_t& getInt32Ref() { + do { } while (0); + return data.s.payload.i32; + } + + void setDouble(double d) { + + + data = layout(d); + do { } while (0); + } + + void setNaN() { + setDouble(GenericNaN()); + } + + double& getDoubleRef() { + do { } while (0); + return data.asDouble; + } + + void setString(JSString* str) { + do { } while (0); + data.asBits = bitsFromTagAndPayload(JSVAL_TAG_STRING, PayloadType(str)); + } + + void setSymbol(JS::Symbol* sym) { + do { } while (0); + data.asBits = bitsFromTagAndPayload(JSVAL_TAG_SYMBOL, PayloadType(sym)); + } + + void setObject(JSObject& obj) { + do { } while (0); + + + + + + do { } while (0); + + setObjectNoCheck(&obj); + } + + private: + void setObjectNoCheck(JSObject* obj) { + data.asBits = bitsFromTagAndPayload(JSVAL_TAG_OBJECT, PayloadType(obj)); + } + + friend inline Value PoisonedObjectValue(JSObject* obj); + + public: + void setBoolean(bool b) { + data.asBits = bitsFromTagAndPayload(JSVAL_TAG_BOOLEAN, uint32_t(b)); + } + + void setMagic(JSWhyMagic why) { + data.asBits = bitsFromTagAndPayload(JSVAL_TAG_MAGIC, uint32_t(why)); + } + + void setMagicUint32(uint32_t payload) { + data.asBits = bitsFromTagAndPayload(JSVAL_TAG_MAGIC, payload); + } + + bool setNumber(uint32_t ui) { + if (ui > ((int32_t)0x7fffffff)) { + setDouble((double)ui); + return false; + } else { + setInt32((int32_t)ui); + return true; + } + } + + bool setNumber(double d) { + int32_t i; + if (mozilla::NumberIsInt32(d, &i)) { + setInt32(i); + return true; + } + + setDouble(d); + return false; + } + + void setObjectOrNull(JSObject* arg) { + if (arg) + setObject(*arg); + else + setNull(); + } + + void swap(Value& rhs) { + uint64_t tmp = rhs.data.asBits; + rhs.data.asBits = data.asBits; + data.asBits = tmp; + } + + private: + JSValueTag toTag() const { + + + + return JSValueTag(data.asBits >> 47); + + } + + public: +# 449 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" + const void* bitsAsPunboxPointer() const { + return reinterpret_cast(data.asBits); + } +# 463 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" + bool isUndefined() const { + + + + return data.asBits == JSVAL_SHIFTED_TAG_UNDEFINED; + + } + + bool isNull() const { + + + + return data.asBits == JSVAL_SHIFTED_TAG_NULL; + + } + + bool isNullOrUndefined() const { + return isNull() || isUndefined(); + } + + bool isInt32() const { + return toTag() == JSVAL_TAG_INT32; + } + + bool isInt32(int32_t i32) const { + return data.asBits == bitsFromTagAndPayload(JSVAL_TAG_INT32, uint32_t(i32)); + } + + bool isDouble() const { + + + + return (data.asBits | mozilla::DoubleTypeTraits::kSignBit) <= JSVAL_SHIFTED_TAG_MAX_DOUBLE; + + } + + bool isNumber() const { + + + + + return data.asBits < JSVAL_SHIFTED_TAG_UNDEFINED; + + } + + bool isString() const { + return toTag() == JSVAL_TAG_STRING; + } + + bool isSymbol() const { + return toTag() == JSVAL_TAG_SYMBOL; + } + + bool isObject() const { + + + + do { } while (0); + return data.asBits >= JSVAL_SHIFTED_TAG_OBJECT; + + } + + bool isPrimitive() const { + + + + return data.asBits < JSVAL_SHIFTED_TAG_OBJECT; + + } + + bool isObjectOrNull() const { + return isObject() || isNull(); + } + + bool isGCThing() const { + + + + + return data.asBits >= JSVAL_SHIFTED_TAG_STRING; + + } + + bool isBoolean() const { + return toTag() == JSVAL_TAG_BOOLEAN; + } + + bool isTrue() const { + return data.asBits == bitsFromTagAndPayload(JSVAL_TAG_BOOLEAN, uint32_t(true)); + } + + bool isFalse() const { + return data.asBits == bitsFromTagAndPayload(JSVAL_TAG_BOOLEAN, uint32_t(false)); + } + + bool isMagic() const { + return toTag() == JSVAL_TAG_MAGIC; + } + + bool isMagic(JSWhyMagic why) const { + do { } while (0); + return isMagic(); + } + + JS::TraceKind traceKind() const { + do { } while (0); + static_assert((JSVAL_TAG_STRING & 0x03) == size_t(JS::TraceKind::String), + "Value type tags must correspond with JS::TraceKinds."); + static_assert((JSVAL_TAG_SYMBOL & 0x03) == size_t(JS::TraceKind::Symbol), + "Value type tags must correspond with JS::TraceKinds."); + static_assert((JSVAL_TAG_OBJECT & 0x03) == size_t(JS::TraceKind::Object), + "Value type tags must correspond with JS::TraceKinds."); + if ((__builtin_expect(!!(isPrivateGCThing()), 0))) + return JS::GCThingTraceKind(toGCThing()); + return JS::TraceKind(toTag() & 0x03); + } + + JSWhyMagic whyMagic() const { + do { } while (0); + return data.s.payload.why; + } + + uint32_t magicUint32() const { + do { } while (0); + return data.s.payload.u32; + } + + + + bool operator==(const Value& rhs) const { + return data.asBits == rhs.data.asBits; + } + + bool operator!=(const Value& rhs) const { + return data.asBits != rhs.data.asBits; + } + + friend inline bool SameType(const Value& lhs, const Value& rhs); + + + + int32_t toInt32() const { + do { } while (0); + + + + return int32_t(data.asBits); + + } + + double toDouble() const { + do { } while (0); + return data.asDouble; + } + + double toNumber() const { + do { } while (0); + return isDouble() ? toDouble() : double(toInt32()); + } + + JSString* toString() const { + do { } while (0); + + + + return reinterpret_cast(data.asBits & 0x00007FFFFFFFFFFFLL); + + } + + JS::Symbol* toSymbol() const { + do { } while (0); + + + + return reinterpret_cast(data.asBits & 0x00007FFFFFFFFFFFLL); + + } + + JSObject& toObject() const { + do { } while (0); + + + + return *toObjectOrNull(); + + } + + JSObject* toObjectOrNull() const { + do { } while (0); + + + + uint64_t ptrBits = data.asBits & 0x00007FFFFFFFFFFFLL; + do { } while (0); + return reinterpret_cast(ptrBits); + + } + + js::gc::Cell* toGCThing() const { + do { } while (0); + + + + uint64_t ptrBits = data.asBits & 0x00007FFFFFFFFFFFLL; + do { } while (0); + return reinterpret_cast(ptrBits); + + } + + GCCellPtr toGCCellPtr() const { + return GCCellPtr(toGCThing(), traceKind()); + } + + bool toBoolean() const { + do { } while (0); + + + + return bool(data.asBits & 0x00007FFFFFFFFFFFLL); + + } + + uint32_t payloadAsRawUint32() const { + do { } while (0); + return data.s.payload.u32; + } + + uint64_t asRawBits() const { + return data.asBits; + } + + JSValueType extractNonDoubleType() const { + uint32_t type = toTag() & 0xF; + do { } while (0); + return JSValueType(type); + } +# 709 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" + void setPrivate(void* ptr) { + do { } while (0); + + + + + data.asBits = uintptr_t(ptr) >> 1; + + do { } while (0); + } + + void* toPrivate() const { + do { } while (0); + + + + do { } while (0); + return reinterpret_cast(data.asBits << 1); + + } + + void setPrivateUint32(uint32_t ui) { + do { } while (0); + setInt32(int32_t(ui)); + } + + uint32_t toPrivateUint32() const { + return uint32_t(toInt32()); + } +# 748 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" + void setPrivateGCThing(js::gc::Cell* cell) { + do { } while (0); + + do { } while (0); + + do { } while (0); + + + do { } while (0); + + + + + + do { } while (0); + + data.asBits = bitsFromTagAndPayload(JSVAL_TAG_PRIVATE_GCTHING, PayloadType(cell)); + } + + bool isPrivateGCThing() const { + return toTag() == JSVAL_TAG_PRIVATE_GCTHING; + } + + const size_t* payloadWord() const { + + + + return &data.asWord; + + } + + const uintptr_t* payloadUIntPtr() const { + + + + return &data.asUIntPtr; + + } + + + + + + private: +# 822 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" + union layout { + uint64_t asBits; + + + struct { + uint64_t payload47 : 47; + JSValueTag tag : 17; + } debugView; + + struct { + union { + int32_t i32; + uint32_t u32; + JSWhyMagic why; + } payload; + } s; + double asDouble; + void* asPtr; + size_t asWord; + uintptr_t asUIntPtr; + + layout() = default; + explicit constexpr layout(uint64_t bits) : asBits(bits) {} + explicit constexpr layout(double d) : asDouble(d) {} + } data; +# 902 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" + private: + explicit constexpr Value(uint64_t asBits) : data(asBits) {} + explicit constexpr Value(double d) : data(d) {} + + void staticAssertions() { + static_assert(sizeof(JSValueType) == 1, "JS_STATIC_ASSERT"); + static_assert(sizeof(JSValueTag) == 4, "JS_STATIC_ASSERT"); + static_assert(sizeof(JSWhyMagic) <= 4, "JS_STATIC_ASSERT"); + static_assert(sizeof(Value) == 8, "JS_STATIC_ASSERT"); + } + + friend constexpr Value JS::UndefinedValue(); + + public: + static constexpr uint64_t + bitsFromTagAndPayload(JSValueTag tag, PayloadType payload) + { + + + + return (uint64_t(uint32_t(tag)) << 47) | payload; + + } + + static constexpr Value + fromTagAndPayload(JSValueTag tag, PayloadType payload) + { + return fromRawBits(bitsFromTagAndPayload(tag, payload)); + } + + static constexpr Value + fromRawBits(uint64_t asBits) { + return Value(asBits); + } + + static constexpr Value + fromInt32(int32_t i) { + return fromTagAndPayload(JSVAL_TAG_INT32, uint32_t(i)); + } + + static constexpr Value + fromDouble(double d) { + return Value(d); + } +} ; + +static_assert(sizeof(Value) == 8, "Value size must leave three tag bits, be a binary power, and is ubiquitously depended upon everywhere"); + +inline bool +IsOptimizedPlaceholderMagicValue(const Value& v) +{ + if (v.isMagic()) { + do { } while (0); + return true; + } + return false; +} + +static __attribute__((always_inline)) inline void +ExposeValueToActiveJS(const Value& v) +{ + if (v.isGCThing()) + js::gc::ExposeGCThingToActiveJS(GCCellPtr(v)); +} + + + +static inline Value +NullValue() +{ + Value v; + v.setNull(); + return v; +} + +static inline constexpr Value +UndefinedValue() +{ + return Value::fromTagAndPayload(JSVAL_TAG_UNDEFINED, 0); +} + +static inline constexpr Value +Int32Value(int32_t i32) +{ + return Value::fromInt32(i32); +} + +static inline Value +DoubleValue(double dbl) +{ + Value v; + v.setDouble(dbl); + return v; +} + +static inline Value +CanonicalizedDoubleValue(double d) +{ + return (__builtin_expect(!!(mozilla::IsNaN(d)), 0)) + ? Value::fromRawBits(detail::CanonicalizedNaNBits) + : Value::fromDouble(d); +} + +static inline bool +IsCanonicalized(double d) +{ + if (mozilla::IsInfinite(d) || mozilla::IsFinite(d)) + return true; + + uint64_t bits; + mozilla::BitwiseCast(d, &bits); + return (bits & ~mozilla::DoubleTypeTraits::kSignBit) == detail::CanonicalizedNaNBits; +} + +static inline Value +DoubleNaNValue() +{ + Value v; + v.setNaN(); + return v; +} + +static inline Value +Float32Value(float f) +{ + Value v; + v.setDouble(f); + return v; +} + +static inline Value +StringValue(JSString* str) +{ + Value v; + v.setString(str); + return v; +} + +static inline Value +SymbolValue(JS::Symbol* sym) +{ + Value v; + v.setSymbol(sym); + return v; +} + +static inline Value +BooleanValue(bool boo) +{ + Value v; + v.setBoolean(boo); + return v; +} + +static inline Value +TrueValue() +{ + Value v; + v.setBoolean(true); + return v; +} + +static inline Value +FalseValue() +{ + Value v; + v.setBoolean(false); + return v; +} + +static inline Value +ObjectValue(JSObject& obj) +{ + Value v; + v.setObject(obj); + return v; +} + +static inline Value +ObjectValueCrashOnTouch() +{ + Value v; + v.setObject(*reinterpret_cast(0x48)); + return v; +} + +static inline Value +MagicValue(JSWhyMagic why) +{ + Value v; + v.setMagic(why); + return v; +} + +static inline Value +MagicValueUint32(uint32_t payload) +{ + Value v; + v.setMagicUint32(payload); + return v; +} + +static inline Value +NumberValue(float f) +{ + Value v; + v.setNumber(f); + return v; +} + +static inline Value +NumberValue(double dbl) +{ + Value v; + v.setNumber(dbl); + return v; +} + +static inline Value +NumberValue(int8_t i) +{ + return Int32Value(i); +} + +static inline Value +NumberValue(uint8_t i) +{ + return Int32Value(i); +} + +static inline Value +NumberValue(int16_t i) +{ + return Int32Value(i); +} + +static inline Value +NumberValue(uint16_t i) +{ + return Int32Value(i); +} + +static inline Value +NumberValue(int32_t i) +{ + return Int32Value(i); +} + +static inline constexpr Value +NumberValue(uint32_t i) +{ + return i <= ((int32_t)0x7fffffff) + ? Int32Value(int32_t(i)) + : Value::fromDouble(double(i)); +} + +namespace detail { + +template +class MakeNumberValue +{ + public: + template + static inline Value create(const T t) + { + Value v; + if (((int32_t)0x80000000) <= t && t <= ((int32_t)0x7fffffff)) + v.setInt32(int32_t(t)); + else + v.setDouble(double(t)); + return v; + } +}; + +template <> +class MakeNumberValue +{ + public: + template + static inline Value create(const T t) + { + Value v; + if (t <= ((int32_t)0x7fffffff)) + v.setInt32(int32_t(t)); + else + v.setDouble(double(t)); + return v; + } +}; + +} + +template +static inline Value +NumberValue(const T t) +{ + do { } while (0); + return detail::MakeNumberValue::is_signed>::create(t); +} + +static inline Value +ObjectOrNullValue(JSObject* obj) +{ + Value v; + v.setObjectOrNull(obj); + return v; +} + +static inline Value +PrivateValue(void* ptr) +{ + Value v; + v.setPrivate(ptr); + return v; +} + +static inline Value +PrivateUint32Value(uint32_t ui) +{ + Value v; + v.setPrivateUint32(ui); + return v; +} + +static inline Value +PrivateGCThingValue(js::gc::Cell* cell) +{ + Value v; + v.setPrivateGCThing(cell); + return v; +} + +static inline Value +PoisonedObjectValue(JSObject* obj) +{ + Value v; + v.setObjectNoCheck(obj); + return v; +} + +inline bool +SameType(const Value& lhs, const Value& rhs) +{ + + + + + return (lhs.isDouble() && rhs.isDouble()) || + (((lhs.data.asBits ^ rhs.data.asBits) & 0xFFFF800000000000ULL) == 0); + +} + +} + + + +namespace JS { +void HeapValuePostBarrier(Value* valuep, const Value& prev, const Value& next); + +template <> +struct GCPolicy +{ + static Value initial() { return UndefinedValue(); } + static void trace(JSTracer* trc, Value* v, const char* name) { + js::UnsafeTraceManuallyBarrieredEdge(trc, v, name); + } + static bool isTenured(const Value& thing) { + return !thing.isGCThing() || !IsInsideNursery(thing.toGCThing()); + } +}; + +} + +namespace js { + +template <> +struct BarrierMethods +{ + static gc::Cell* asGCThingOrNull(const JS::Value& v) { + return v.isGCThing() ? v.toGCThing() : nullptr; + } + static void postBarrier(JS::Value* v, const JS::Value& prev, const JS::Value& next) { + JS::HeapValuePostBarrier(v, prev, next); + } + static void exposeToJS(const JS::Value& v) { + JS::ExposeValueToActiveJS(v); + } +}; + +template class MutableValueOperations; + + + + + + + +template +class WrappedPtrOperations +{ + const JS::Value& value() const { return static_cast(this)->get(); } + + public: + bool isUndefined() const { return value().isUndefined(); } + bool isNull() const { return value().isNull(); } + bool isBoolean() const { return value().isBoolean(); } + bool isTrue() const { return value().isTrue(); } + bool isFalse() const { return value().isFalse(); } + bool isNumber() const { return value().isNumber(); } + bool isInt32() const { return value().isInt32(); } + bool isInt32(int32_t i32) const { return value().isInt32(i32); } + bool isDouble() const { return value().isDouble(); } + bool isString() const { return value().isString(); } + bool isSymbol() const { return value().isSymbol(); } + bool isObject() const { return value().isObject(); } + bool isMagic() const { return value().isMagic(); } + bool isMagic(JSWhyMagic why) const { return value().isMagic(why); } + bool isGCThing() const { return value().isGCThing(); } + bool isPrimitive() const { return value().isPrimitive(); } + + bool isNullOrUndefined() const { return value().isNullOrUndefined(); } + bool isObjectOrNull() const { return value().isObjectOrNull(); } + + bool toBoolean() const { return value().toBoolean(); } + double toNumber() const { return value().toNumber(); } + int32_t toInt32() const { return value().toInt32(); } + double toDouble() const { return value().toDouble(); } + JSString* toString() const { return value().toString(); } + JS::Symbol* toSymbol() const { return value().toSymbol(); } + JSObject& toObject() const { return value().toObject(); } + JSObject* toObjectOrNull() const { return value().toObjectOrNull(); } + gc::Cell* toGCThing() const { return value().toGCThing(); } + JS::TraceKind traceKind() const { return value().traceKind(); } + void* toPrivate() const { return value().toPrivate(); } + uint32_t toPrivateUint32() const { return value().toPrivateUint32(); } + + uint64_t asRawBits() const { return value().asRawBits(); } + JSValueType extractNonDoubleType() const { return value().extractNonDoubleType(); } + + JSWhyMagic whyMagic() const { return value().whyMagic(); } + uint32_t magicUint32() const { return value().magicUint32(); } +}; + + + + + + + +template +class MutableWrappedPtrOperations : public WrappedPtrOperations +{ + JS::Value& value() { return static_cast(this)->get(); } + + public: + void setNull() { value().setNull(); } + void setUndefined() { value().setUndefined(); } + void setInt32(int32_t i) { value().setInt32(i); } + void setDouble(double d) { value().setDouble(d); } + void setNaN() { setDouble(JS::GenericNaN()); } + void setBoolean(bool b) { value().setBoolean(b); } + void setMagic(JSWhyMagic why) { value().setMagic(why); } + bool setNumber(uint32_t ui) { return value().setNumber(ui); } + bool setNumber(double d) { return value().setNumber(d); } + void setString(JSString* str) { this->value().setString(str); } + void setSymbol(JS::Symbol* sym) { this->value().setSymbol(sym); } + void setObject(JSObject& obj) { this->value().setObject(obj); } + void setObjectOrNull(JSObject* arg) { this->value().setObjectOrNull(arg); } + void setPrivate(void* ptr) { this->value().setPrivate(ptr); } + void setPrivateUint32(uint32_t ui) { this->value().setPrivateUint32(ui); } + void setPrivateGCThing(js::gc::Cell* cell) { this->value().setPrivateGCThing(cell); } +}; + + + + + +template +class HeapBase : public WrappedPtrOperations +{ + void setBarriered(const JS::Value& v) { + *static_cast*>(this) = v; + } + + public: + void setNull() { setBarriered(JS::NullValue()); } + void setUndefined() { setBarriered(JS::UndefinedValue()); } + void setInt32(int32_t i) { setBarriered(JS::Int32Value(i)); } + void setDouble(double d) { setBarriered(JS::DoubleValue(d)); } + void setNaN() { setDouble(JS::GenericNaN()); } + void setBoolean(bool b) { setBarriered(JS::BooleanValue(b)); } + void setMagic(JSWhyMagic why) { setBarriered(JS::MagicValue(why)); } + void setString(JSString* str) { setBarriered(JS::StringValue(str)); } + void setSymbol(JS::Symbol* sym) { setBarriered(JS::SymbolValue(sym)); } + void setObject(JSObject& obj) { setBarriered(JS::ObjectValue(obj)); } + void setPrivateGCThing(js::gc::Cell* cell) { setBarriered(JS::PrivateGCThingValue(cell)); } + + bool setNumber(uint32_t ui) { + if (ui > ((int32_t)0x7fffffff)) { + setDouble((double)ui); + return false; + } else { + setInt32((int32_t)ui); + return true; + } + } + + bool setNumber(double d) { + int32_t i; + if (mozilla::NumberIsInt32(d, &i)) { + setInt32(i); + return true; + } + + setDouble(d); + return false; + } + + void setObjectOrNull(JSObject* arg) { + if (arg) + setObject(*arg); + else + setNull(); + } +}; + + + + + +template +auto +DispatchTyped(F f, const JS::Value& val, Args&&... args) + -> decltype(f(static_cast(nullptr), mozilla::Forward(args)...)) +{ + if (val.isString()) + return f(val.toString(), mozilla::Forward(args)...); + if (val.isObject()) + return f(&val.toObject(), mozilla::Forward(args)...); + if (val.isSymbol()) + return f(val.toSymbol(), mozilla::Forward(args)...); + if ((__builtin_expect(!!(val.isPrivateGCThing()), 0))) + return DispatchTyped(f, val.toGCCellPtr(), mozilla::Forward(args)...); + do { } while (0); + return F::defaultValue(val); +} + +template struct VoidDefaultAdaptor { static void defaultValue(const S&) {} }; +template struct IdentityDefaultAdaptor { static S defaultValue(const S& v) {return v;} }; +template struct BoolDefaultAdaptor { static bool defaultValue(const S&) { return v; } }; + +} +# 1478 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" +namespace JS { + +extern const HandleValue NullHandleValue; +extern const HandleValue UndefinedHandleValue; +extern const HandleValue TrueHandleValue; +extern const HandleValue FalseHandleValue; + +} +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedOwningNonNull.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedOwningNonNull.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OwningNonNull.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OwningNonNull.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAutoPtr.h" 1 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAutoPtr.h" +template +class nsAutoPtr +{ +private: + static_assert(!mozilla::IsScalar::value, "If you are using " + "nsAutoPtr to hold an array, use UniquePtr instead"); + + void** + begin_assignment() + { + assign(0); + return reinterpret_cast(&mRawPtr); + } + + void + assign(T* aNewPtr) + { + T* oldPtr = mRawPtr; + + if (aNewPtr && aNewPtr == oldPtr) { + do { AnnotateMozCrashReason("MOZ_CRASH(" "Logic flaw in the caller" ")"); do { *((volatile int*) __null) = 41; ::abort(); } while (0); } while (0); + } + + mRawPtr = aNewPtr; + delete oldPtr; + } + + + + + + + class Ptr + { + public: + Ptr(T* aPtr) + : mPtr(aPtr) + { + } + + operator T*() const + { + return mPtr; + } + + private: + T* mPtr; + }; + +private: + T* mRawPtr; + +public: + typedef T element_type; + + ~nsAutoPtr() + { + delete mRawPtr; + } + + + + nsAutoPtr() + : mRawPtr(0) + + { + } + + nsAutoPtr(Ptr aRawPtr) + : mRawPtr(aRawPtr) + + { + } + + + + nsAutoPtr(nsAutoPtr& aSmartPtr) + : mRawPtr(aSmartPtr.forget()) + + { + } + + template + nsAutoPtr(nsAutoPtr& aSmartPtr) + : mRawPtr(aSmartPtr.forget()) + + { + } + + nsAutoPtr(nsAutoPtr&& aSmartPtr) + : mRawPtr(aSmartPtr.forget()) + + { + } + + template + nsAutoPtr(nsAutoPtr&& aSmartPtr) + : mRawPtr(aSmartPtr.forget()) + + { + } + + + + nsAutoPtr& + operator=(T* aRhs) + + { + assign(aRhs); + return *this; + } + + nsAutoPtr& operator=(nsAutoPtr& aRhs) + + { + assign(aRhs.forget()); + return *this; + } + + template + nsAutoPtr& operator=(nsAutoPtr& aRhs) + + { + assign(aRhs.forget()); + return *this; + } + + nsAutoPtr& operator=(nsAutoPtr&& aRhs) + { + assign(aRhs.forget()); + return *this; + } + + template + nsAutoPtr& operator=(nsAutoPtr&& aRhs) + { + assign(aRhs.forget()); + return *this; + } + + + + T* + get() const + + + + + + { + return mRawPtr; + } + + operator T*() const +# 184 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAutoPtr.h" + { + return get(); + } + + T* + forget() + { + T* temp = mRawPtr; + mRawPtr = 0; + return temp; + } + + T* + operator->() const + { + do { } while(0); + + return get(); + } + + template + class Proxy + { + typedef R (T::*member_function)(Args...); + T* mRawPtr; + member_function mFunction; + public: + Proxy(T* aRawPtr, member_function aFunction) + : mRawPtr(aRawPtr), + mFunction(aFunction) + { + } + template + R operator()(ActualArgs&&... aArgs) + { + return ((*mRawPtr).*mFunction)(mozilla::Forward(aArgs)...); + } + }; + + template + Proxy operator->*(R (C::*aFptr)(Args...)) const + { + do { } while(0); + + return Proxy(get(), aFptr); + } + + nsAutoPtr* + get_address() + + + { + return this; + } + + const nsAutoPtr* + get_address() const + + + { + return this; + } + +public: + T& + operator*() const + { + do { } while(0); + + return *get(); + } + + T** + StartAssignment() + { + + return reinterpret_cast(begin_assignment()); + + + + + } +}; + +template +inline nsAutoPtr* +address_of(nsAutoPtr& aPtr) +{ + return aPtr.get_address(); +} + +template +inline const nsAutoPtr* +address_of(const nsAutoPtr& aPtr) +{ + return aPtr.get_address(); +} + +template +class nsAutoPtrGetterTransfers +# 301 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAutoPtr.h" +{ +public: + explicit + nsAutoPtrGetterTransfers(nsAutoPtr& aSmartPtr) + : mTargetSmartPtr(aSmartPtr) + { + + } + + operator void**() + { + return reinterpret_cast(mTargetSmartPtr.StartAssignment()); + } + + operator T**() + { + return mTargetSmartPtr.StartAssignment(); + } + + T*& + operator*() + { + return *(mTargetSmartPtr.StartAssignment()); + } + +private: + nsAutoPtr& mTargetSmartPtr; +}; + +template +inline nsAutoPtrGetterTransfers +getter_Transfers(nsAutoPtr& aSmartPtr) + + + + +{ + return nsAutoPtrGetterTransfers(aSmartPtr); +} + + + + + +template +inline bool +operator==(const nsAutoPtr& aLhs, const nsAutoPtr& aRhs) +{ + return static_cast(aLhs.get()) == static_cast(aRhs.get()); +} + + +template +inline bool +operator!=(const nsAutoPtr& aLhs, const nsAutoPtr& aRhs) +{ + return static_cast(aLhs.get()) != static_cast(aRhs.get()); +} + + + + +template +inline bool +operator==(const nsAutoPtr& aLhs, const U* aRhs) +{ + return static_cast(aLhs.get()) == static_cast(aRhs); +} + +template +inline bool +operator==(const U* aLhs, const nsAutoPtr& aRhs) +{ + return static_cast(aLhs) == static_cast(aRhs.get()); +} + +template +inline bool +operator!=(const nsAutoPtr& aLhs, const U* aRhs) +{ + return static_cast(aLhs.get()) != static_cast(aRhs); +} + +template +inline bool +operator!=(const U* aLhs, const nsAutoPtr& aRhs) +{ + return static_cast(aLhs) != static_cast(aRhs.get()); +} + +template +inline bool +operator==(const nsAutoPtr& aLhs, U* aRhs) +{ + return static_cast(aLhs.get()) == const_cast(aRhs); +} + +template +inline bool +operator==(U* aLhs, const nsAutoPtr& aRhs) +{ + return const_cast(aLhs) == static_cast(aRhs.get()); +} + +template +inline bool +operator!=(const nsAutoPtr& aLhs, U* aRhs) +{ + return static_cast(aLhs.get()) != const_cast(aRhs); +} + +template +inline bool +operator!=(U* aLhs, const nsAutoPtr& aRhs) +{ + return const_cast(aLhs) != static_cast(aRhs.get()); +} + + + + + +template +inline bool +operator==(const nsAutoPtr& aLhs, decltype(nullptr)) +{ + return aLhs.get() == nullptr; +} + +template +inline bool +operator==(decltype(nullptr), const nsAutoPtr& aRhs) +{ + return nullptr == aRhs.get(); +} + +template +inline bool +operator!=(const nsAutoPtr& aLhs, decltype(nullptr)) +{ + return aLhs.get() != nullptr; +} + +template +inline bool +operator!=(decltype(nullptr), const nsAutoPtr& aRhs) +{ + return nullptr != aRhs.get(); +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OwningNonNull.h" 2 + + +namespace mozilla { + +template +class OwningNonNull +{ +public: + OwningNonNull() {} + + OwningNonNull(T& aValue) + { + init(&aValue); + } + + template + OwningNonNull(already_AddRefed&& aValue) + { + init(aValue); + } + + template + OwningNonNull(const OwningNonNull& aValue) + { + init(aValue); + } + + + operator T&() const + { + do { } while (0); + do { } while (0); + return *mPtr; + } + + operator T*() const + { + do { } while (0); + do { } while (0); + return mPtr; + } + + + explicit operator bool() const = delete; + + T* + operator->() const + { + do { } while (0); + do { } while (0); + return mPtr; + } + + OwningNonNull& + operator=(T* aValue) + { + init(aValue); + return *this; + } + + OwningNonNull& + operator=(T& aValue) + { + init(&aValue); + return *this; + } + + template + OwningNonNull& + operator=(already_AddRefed&& aValue) + { + init(aValue); + return *this; + } + + template + OwningNonNull& + operator=(const OwningNonNull& aValue) + { + init(aValue); + return *this; + } + + + void operator=(decltype(nullptr)) = delete; + + already_AddRefed forget() + { + + + + return mPtr.forget(); + } + + template + void + forget(U** aOther) + { + + + + mPtr.forget(aOther); + } + + + T* get() const + { + do { } while (0); + do { } while (0); + return mPtr; + } + + template + void swap(U& aOther) + { + mPtr.swap(aOther); + + + + } + + + + + bool isInitialized() const + { + do { } while (0); + return mPtr; + } + +protected: + template + void init(U&& aValue) + { + mPtr = aValue; + do { } while (0); + + + + } + + RefPtr mPtr; + + + +}; + +template +inline void +ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, + OwningNonNull& aField, + const char* aName, + uint32_t aFlags = 0) +{ + CycleCollectionNoteChild(aCallback, aField.get(), aName, aFlags); +} + +} + + +template template +nsCOMPtr::nsCOMPtr(const mozilla::OwningNonNull& aOther) + : nsCOMPtr(aOther.get()) +{} + +template template +nsCOMPtr& +nsCOMPtr::operator=(const mozilla::OwningNonNull& aOther) +{ + return operator=(aOther.get()); +} + + +template template +RefPtr::RefPtr(const mozilla::OwningNonNull& aOther) + : RefPtr(aOther.get()) +{} + +template template +RefPtr& +RefPtr::operator=(const mozilla::OwningNonNull& aOther) +{ + return operator=(aOther.get()); +} +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedOwningNonNull.h" 2 + + + +namespace JS { +template +struct GCPolicy> +{ + typedef mozilla::OwningNonNull SmartPtrType; + + static SmartPtrType initial() + { + return SmartPtrType(); + } + + static void trace(JSTracer* trc, SmartPtrType* tp, + const char* name) + { +# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedOwningNonNull.h" + if ((*tp).isInitialized()) { + (*tp)->Trace(trc); + } + } +}; +} + +namespace js { +template +struct WrappedPtrOperations, Wrapper> +{ + operator T& () const + { + return static_cast(this)->get(); + } +}; +} +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedRefPtr.h" 1 +# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedRefPtr.h" +namespace JS { +template +struct GCPolicy> +{ + static RefPtr initial() { + return RefPtr(); + } + + static void trace(JSTracer* trc, RefPtr* tp, const char* name) + { + if (*tp) { + (*tp)->Trace(trc); + } + } +}; +} + +namespace js { +template +struct WrappedPtrOperations, Wrapper> +{ + operator T*() const + { + return static_cast(this)->get(); + } +}; +} +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMString.h" 1 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMString.h" +namespace mozilla { +namespace dom { +# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMString.h" +class DOMString { +public: + DOMString() + : mStringBuffer(nullptr) + , mLength(0) + , mIsNull(false) + , mStringBufferOwned(false) + {} + ~DOMString() + { + do { } while (0); + + if (mStringBufferOwned) { + do { } while (0); + mStringBuffer->Release(); + } + } + + operator nsString&() + { + return AsAString(); + } + + + + operator const nsString&() = delete; + operator const nsAString&() = delete; + + nsString& AsAString() + { + do { } while (0); + do { } while (0); + if (!mString) { + mString.emplace(); + } + return *mString; + } + + bool HasStringBuffer() const + { + do { } while (0); + + do { } while (0); + return !mString; + } + + + + + + + nsStringBuffer* StringBuffer() const + { + do { } while (0); + do { } while (0); + + do { } while (0); + do { } while (0); + + return mStringBuffer; + } + + + + uint32_t StringBufferLength() const + { + do { } while (0); + return mLength; + } + + + + void RelinquishBufferOwnership() + { + do { } while (0); + if (mStringBufferOwned) { + + mStringBufferOwned = false; + } else { + + mStringBuffer->AddRef(); + } + } + + + + + void SetStringBuffer(nsStringBuffer* aStringBuffer, uint32_t aLength) + { + do { } while (0); + do { } while (0); + do { } while (0); + do { } while (0); + mStringBuffer = aStringBuffer; + mLength = aLength; + } + + + void SetEphemeralStringBuffer(nsStringBuffer* aStringBuffer, uint32_t aLength) + { + + SetStringBuffer(aStringBuffer, aLength); + aStringBuffer->AddRef(); + mStringBufferOwned = true; + } + + void SetOwnedString(const nsAString& aString) + { + do { } while (0); + do { } while (0); + do { } while (0); + nsStringBuffer* buf = nsStringBuffer::FromString(aString); + if (buf) { + SetStringBuffer(buf, aString.Length()); + } else if (aString.IsVoid()) { + SetNull(); + } else if (!aString.IsEmpty()) { + AsAString() = aString; + } + } + + enum NullHandling + { + eTreatNullAsNull, + eTreatNullAsEmpty, + eNullNotExpected + }; + + void SetOwnedAtom(nsIAtom* aAtom, NullHandling aNullHandling) + { + do { } while (0); + do { } while (0); + do { } while (0); + do { } while (0); + if (aNullHandling == eNullNotExpected || aAtom) { + SetStringBuffer(aAtom->GetStringBuffer(), aAtom->GetLength()); + } else if (aNullHandling == eTreatNullAsNull) { + SetNull(); + } + } + + void SetNull() + { + do { } while (0); + do { } while (0); + mIsNull = true; + } + + bool IsNull() const + { + do { } while (0); + + return mIsNull || (mString && mString->IsVoid()); + } + + void ToString(nsAString& aString) + { + if (IsNull()) { + SetDOMStringToNull(aString); + } else if (HasStringBuffer()) { + if (StringBufferLength() == 0) { + aString.Truncate(); + } else { + + + nsStringBuffer* buf = StringBuffer(); + uint32_t len = StringBufferLength(); + auto chars = static_cast(buf->Data()); + if (chars[len] == '\0') { + + buf->ToString(len, aString); + } else { + + aString.Assign(chars, len); + } + } + } else { + aString = AsAString(); + } + } + +private: + + Maybe mString; + + + + nsStringBuffer* mStringBuffer; + + + uint32_t mLength; + bool mIsNull; + bool mStringBufferOwned; +}; + +} +} +# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h" 2 + + + + + +class nsIPrincipal; +class nsWrapperCache; + +namespace mozilla { +namespace dom { + + + +struct DictionaryBase +{ +protected: + bool ParseJSON(JSContext* aCx, const nsAString& aJSON, + JS::MutableHandle aVal); + + bool StringifyToJSON(JSContext* aCx, + JS::Handle aObj, + nsAString& aJSON) const; + + + + + + struct FastDictionaryInitializer { + }; + + bool mIsAnyMemberPresent = false; + +private: + + + static bool AppendJSONToString(const char16_t* aJSONData, + uint32_t aDataLength, void* aString); + +public: + bool IsAnyMemberPresent() const + { + return mIsAnyMemberPresent; + } +}; + + + + +struct AllTypedArraysBase { +}; + + + + +struct AllOwningUnionBase { +}; + + +struct EnumEntry { + const char* value; + size_t length; +}; + +enum class CallerType : uint32_t; + +class GlobalObject +{ +public: + GlobalObject(JSContext* aCx, JSObject* aObject); + + JSObject* Get() const + { + return mGlobalJSObject; + } + + nsISupports* GetAsSupports() const; + + + + + JSContext* Context() const + { + return mCx; + } + + bool Failed() const + { + return !Get(); + } + + + + nsIPrincipal* GetSubjectPrincipal() const; + + + + dom::CallerType CallerType() const; + +protected: + JS::Rooted mGlobalJSObject; + JSContext* mCx; + mutable nsISupports* mGlobalObject; + + + +}; + + +template +class Optional_base +{ +public: + Optional_base() + {} + + explicit Optional_base(const T& aValue) + { + mImpl.emplace(aValue); + } + + bool operator==(const Optional_base& aOther) const + { + return mImpl == aOther.mImpl; + } + + template + explicit Optional_base(const T1& aValue1, const T2& aValue2) + { + mImpl.emplace(aValue1, aValue2); + } + + bool WasPassed() const + { + return mImpl.isSome(); + } + + + template + InternalType& Construct(Args&&... aArgs) + { + mImpl.emplace(Forward(aArgs)...); + return *mImpl; + } + + void Reset() + { + mImpl.reset(); + } + + const T& Value() const + { + return *mImpl; + } + + + InternalType& Value() + { + return *mImpl; + } + + + const InternalType& InternalValue() const + { + return *mImpl; + } + + + + + +private: + + Optional_base(const Optional_base& other) = delete; + const Optional_base &operator=(const Optional_base &other) = delete; + +protected: + Maybe mImpl; +}; + +template +class Optional : public Optional_base +{ +public: + Optional() : + Optional_base() + {} + + explicit Optional(const T& aValue) : + Optional_base(aValue) + {} +}; + +template +class Optional > : + public Optional_base, JS::Rooted > +{ +public: + Optional() : + Optional_base, JS::Rooted >() + {} + + explicit Optional(JSContext* cx) : + Optional_base, JS::Rooted >() + { + this->Construct(cx); + } + + Optional(JSContext* cx, const T& aValue) : + Optional_base, JS::Rooted >(cx, aValue) + {} + + + + JS::Handle Value() const + { + return *this->mImpl; + } + + + + JS::Rooted& Value() + { + return *this->mImpl; + } +}; + + + + +template<> +class Optional : public Optional_base +{ +public: + Optional() : + Optional_base() + {} + + explicit Optional(JSObject* aValue) : + Optional_base(aValue) + {} + + + JSObject*& Construct() + { + + + return Optional_base::Construct( + static_cast(nullptr)); + } + + template + JSObject*& Construct(const T1& t1) + { + return Optional_base::Construct(t1); + } +}; + + +template<> +class Optional +{ +private: + Optional() = delete; + + explicit Optional(const JS::Value& aValue) = delete; +}; + + +template class NonNull; +template +class Optional > : public Optional_base > +{ +public: + + + + T& Value() const + { + return *this->mImpl->get(); + } + + + + NonNull& Value() + { + return *this->mImpl; + } +}; + + + +template +class Optional > : public Optional_base > +{ +public: + + + + T& Value() const + { + return *this->mImpl->get(); + } + + + + OwningNonNull& Value() + { + return *this->mImpl; + } +}; + + + + + + +namespace binding_detail { +struct FakeString; +} + +template<> +class Optional +{ +public: + Optional() : mPassed(false) {} + + bool WasPassed() const + { + return mPassed; + } + + void operator=(const nsAString* str) + { + do { } while (0); + mStr = str; + mPassed = true; + } + + + + void operator=(const binding_detail::FakeString* str) + { + do { } while (0); + mStr = reinterpret_cast(str); + mPassed = true; + } + + const nsAString& Value() const + { + do { } while (0); + return *mStr; + } + +private: + + Optional(const Optional& other) = delete; + const Optional &operator=(const Optional &other) = delete; + + bool mPassed; + const nsAString* mStr; +}; + +template +class NonNull +{ +public: + NonNull() + + + + {} + + + operator T&() const { + do { } while (0); + do { } while (0); + return *ptr; + } + + operator T*() const { + do { } while (0); + do { } while (0); + return ptr; + } + + void operator=(T* t) { + ptr = t; + do { } while (0); + + + + } + + template + void operator=(U* t) { + ptr = t->ToAStringPtr(); + do { } while (0); + + + + } + + T** Slot() { + + + + return &ptr; + } + + T* Ptr() { + do { } while (0); + do { } while (0); + return ptr; + } + + + T* get() const { + do { } while (0); + do { } while (0); + return ptr; + } + +protected: + T* ptr; + + + +}; + + + + + +template +class Sequence : public FallibleTArray +{ +public: + Sequence() : FallibleTArray() + {} +}; + +inline nsWrapperCache* +GetWrapperCache(nsWrapperCache* cache) +{ + return cache; +} + +inline nsWrapperCache* +GetWrapperCache(void* p) +{ + return nullptr; +} + + + +template

    (ctx: &BindgenContext, path: P) -> io::Result<()> try!(writeln!(&mut dot_file, r#" >];"#)); item.trace(ctx, - &mut |sub_id: ItemId, _edge_kind| { + &mut |sub_id: ItemId, edge_kind| { if err.is_some() { return; } match writeln!(&mut dot_file, - "{} -> {};", + "{} -> {} [label={:?}];", id.as_usize(), - sub_id.as_usize()) { + sub_id.as_usize(), + edge_kind) { Ok(_) => {} Err(e) => err = Some(Err(e)), } From b58c3e0fa108f99a53a3670e8fb920f70ce4a565 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 15 Mar 2017 15:49:57 -0700 Subject: [PATCH 0408/2291] Run tests with more versions of libclang First, update our existing 3.8.X and 3.9.X libclang testing versions to their latest point releases. Second, add testing on the latest 3.7.X release and the latest 4.0.X release. --- .travis.yml | 15 +++++++++++++-- ci/before_install.sh | 12 ++---------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0d256172f8..7805b57875 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,8 +14,19 @@ rust: - stable env: - - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.8 BINDGEN_FEATURES=testing_only_llvm_stable - - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.9 BINDGEN_FEATURES= + global: + - CARGO_TARGET_DIR=/tmp/bindgen + matrix: + - LLVM_VERSION=3.7.1 BINDGEN_FEATURES=testing_only_llvm_stable + - LLVM_VERSION=3.8.1 BINDGEN_FEATURES=testing_only_llvm_stable + - LLVM_VERSION=3.9.0 BINDGEN_FEATURES= + - LLVM_VERSION=4.0.0 BINDGEN_FEATURES= + +matrix: + fast_finish: true + allow_failures: + - env: LLVM_VERSION=4.0.0 BINDGEN_FEATURES= + - env: LLVM_VERSION=3.7.1 BINDGEN_FEATURES=testing_only_llvm_stable cache: directories: diff --git a/ci/before_install.sh b/ci/before_install.sh index ebe4f4fb94..719c4efe50 100644 --- a/ci/before_install.sh +++ b/ci/before_install.sh @@ -1,4 +1,4 @@ -set -e +set -ex pushd ~ # Workaround for Travis CI macOS bug (https://github.com/travis-ci/travis-ci/issues/6307) @@ -6,16 +6,8 @@ if [ "${TRAVIS_OS_NAME}" == "osx" ]; then rvm get head || true fi -function llvm_version_triple() { - if [ "$1" == "3.8" ]; then - echo "3.8.0" - elif [ "$1" == "3.9" ]; then - echo "3.9.0" - fi -} - function llvm_download() { - export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}` + export LLVM_VERSION_TRIPLE="${LLVM_VERSION}" export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-x86_64-$1 wget http://llvm.org/releases/${LLVM_VERSION_TRIPLE}/${LLVM}.tar.xz From 0890603983253a33f6d877f02f4740450fd3e4d5 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 16 Mar 2017 12:45:44 -0700 Subject: [PATCH 0409/2291] Resolve namespace clashes between methods and generated bitfield accessors This commit makes bitfields' accessor codegen detect conflicting method names and generate alternative, non-conflicting names instead. --- src/codegen/mod.rs | 59 ++++++++++++++-- .../tests/bitfield-method-same-name.rs | 67 +++++++++++++++++++ tests/headers/bitfield-method-same-name.hpp | 6 ++ 3 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 tests/expectations/tests/bitfield-method-same-name.rs create mode 100644 tests/headers/bitfield-method-same-name.hpp diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index c69116f9c7..7db083e728 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -753,6 +753,7 @@ impl<'a> Bitfield<'a> { fn codegen_fields(self, ctx: &BindgenContext, + parent: &CompInfo, fields: &mut Vec, methods: &mut Vec) -> Layout { @@ -790,6 +791,7 @@ impl<'a> Bitfield<'a> { // We've finished a physical field, so flush it and its bitfields. field_size_in_bits = align_to(field_size_in_bits, field_align); fields.push(flush_bitfields(ctx, + parent, field_size_in_bits, last_field_align, &last_field_name, @@ -831,6 +833,7 @@ impl<'a> Bitfield<'a> { if field_size_in_bits != 0 { // Flush the last physical field and its bitfields. fields.push(flush_bitfields(ctx, + parent, field_size_in_bits, last_field_align, &last_field_name, @@ -842,12 +845,59 @@ impl<'a> Bitfield<'a> { } } +fn parent_has_method(ctx: &BindgenContext, + parent: &CompInfo, + name: &str) + -> bool { + parent.methods().iter().any(|method| { + let method_name = match *ctx.resolve_item(method.signature()).kind() { + ItemKind::Function(ref func) => func.name(), + ref otherwise => panic!("a method's signature should always be a \ + item of kind ItemKind::Function, found: \ + {:?}", + otherwise), + }; + + method_name == name || ctx.rust_mangle(&method_name) == name + }) +} + +fn bitfield_getter_name(ctx: &BindgenContext, + parent: &CompInfo, + bitfield_name: &str) + -> ast::Ident { + let name = ctx.rust_mangle(bitfield_name); + + if parent_has_method(ctx, parent, &name) { + let mut name = name.to_string(); + name.push_str("_bindgen_bitfield"); + return ctx.ext_cx().ident_of(&name); + } + + ctx.ext_cx().ident_of(&name) +} + +fn bitfield_setter_name(ctx: &BindgenContext, + parent: &CompInfo, + bitfield_name: &str) + -> ast::Ident { + let setter = format!("set_{}", bitfield_name); + let mut setter = ctx.rust_mangle(&setter).to_string(); + + if parent_has_method(ctx, parent, &setter) { + setter.push_str("_bindgen_bitfield"); + } + + ctx.ext_cx().ident_of(&setter) +} + /// A physical field (which is a word or byte or ...) has many logical bitfields /// contained within it, but not all bitfields are in the same physical field of /// a struct. This function creates a single physical field and flushes all the /// accessors for the logical `bitfields` within that physical field to the /// outgoing `methods`. fn flush_bitfields<'a, I>(ctx: &BindgenContext, + parent: &CompInfo, field_size_in_bits: usize, field_align: usize, field_name: &str, @@ -867,9 +917,8 @@ fn flush_bitfields<'a, I>(ctx: &BindgenContext, for (name, offset, width, bitfield_ty, bitfield_layout) in bitfields { let prefix = ctx.trait_prefix(); - let getter_name = ctx.rust_ident(name); - let setter_name = ctx.ext_cx() - .ident_of(&format!("set_{}", &name)); + let getter_name = bitfield_getter_name(ctx, parent, name); + let setter_name = bitfield_setter_name(ctx, parent, name); let field_ident = ctx.ext_cx().ident_of(field_name); let field_int_ty = match field_layout.size { @@ -1184,7 +1233,7 @@ impl CodeGenerator for CompInfo { mem::replace(&mut current_bitfield_fields, vec![]); let bitfield_layout = Bitfield::new(&mut bitfield_count, bitfield_fields) - .codegen_fields(ctx, &mut fields, &mut methods); + .codegen_fields(ctx, self, &mut fields, &mut methods); struct_layout.saw_bitfield_batch(bitfield_layout); current_bitfield_width = None; @@ -1339,7 +1388,7 @@ impl CodeGenerator for CompInfo { vec![]); let bitfield_layout = Bitfield::new(&mut bitfield_count, bitfield_fields) - .codegen_fields(ctx, &mut fields, &mut methods); + .codegen_fields(ctx, self, &mut fields, &mut methods); struct_layout.saw_bitfield_batch(bitfield_layout); } debug_assert!(current_bitfield_fields.is_empty()); diff --git a/tests/expectations/tests/bitfield-method-same-name.rs b/tests/expectations/tests/bitfield-method-same-name.rs new file mode 100644 index 0000000000..9222f74d11 --- /dev/null +++ b/tests/expectations/tests/bitfield-method-same-name.rs @@ -0,0 +1,67 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct Foo { + pub _bitfield_1: u8, + pub __bindgen_align: [u8; 0usize], +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); +} +extern "C" { + #[link_name = "_ZN3Foo4typeEv"] + pub fn Foo_type(this: *mut Foo) -> ::std::os::raw::c_schar; +} +extern "C" { + #[link_name = "_ZN3Foo9set_type_Ec"] + pub fn Foo_set_type_(this: *mut Foo, c: ::std::os::raw::c_schar); +} +extern "C" { + #[link_name = "_ZN3Foo8set_typeEc"] + pub fn Foo_set_type(this: *mut Foo, c: ::std::os::raw::c_schar); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} +impl Foo { + #[inline] + pub fn type__bindgen_bitfield(&self) -> ::std::os::raw::c_schar { + let mask = 7usize as u8; + let field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + let val = (field_val & mask) >> 0usize; + unsafe { ::std::mem::transmute(val as u8) } + } + #[inline] + pub fn set_type__bindgen_bitfield(&mut self, + val: ::std::os::raw::c_schar) { + let mask = 7usize as u8; + let val = val as u8 as u8; + let mut field_val: u8 = + unsafe { ::std::mem::transmute(self._bitfield_1) }; + field_val &= !mask; + field_val |= (val << 0usize) & mask; + self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; + } + #[inline] + pub unsafe fn type_(&mut self) -> ::std::os::raw::c_schar { + Foo_type(&mut *self) + } + #[inline] + pub unsafe fn set_type_(&mut self, c: ::std::os::raw::c_schar) { + Foo_set_type_(&mut *self, c) + } + #[inline] + pub unsafe fn set_type(&mut self, c: ::std::os::raw::c_schar) { + Foo_set_type(&mut *self, c) + } +} diff --git a/tests/headers/bitfield-method-same-name.hpp b/tests/headers/bitfield-method-same-name.hpp new file mode 100644 index 0000000000..d66f16c0ec --- /dev/null +++ b/tests/headers/bitfield-method-same-name.hpp @@ -0,0 +1,6 @@ +struct Foo { + char type_ : 3; + char type(); + void set_type_(char c); + void set_type(char c); +}; From 790856149ee439ccf53606e8c33d3f04c5aa13ff Mon Sep 17 00:00:00 2001 From: Adam Baxter Date: Fri, 17 Mar 2017 12:16:26 -0400 Subject: [PATCH 0410/2291] Renamed chooser to visitor and added function for parsed macro analysis. Added tests and fixed missed function rename. Fixed nits Renamed visitor to callbacks. Renamed visitor to callbacks. Renamed visitor to callbacks. Fixed text. --- bindgen-integration/build.rs | 18 ++++++++++++++++++ bindgen-integration/cpp/Test.h | 2 ++ src/{chooser.rs => callbacks.rs} | 6 +++++- src/ir/context.rs | 8 ++++---- src/ir/enum_ty.rs | 2 +- src/ir/var.rs | 7 ++++++- src/lib.rs | 14 +++++++------- 7 files changed, 43 insertions(+), 14 deletions(-) rename src/{chooser.rs => callbacks.rs} (85%) diff --git a/bindgen-integration/build.rs b/bindgen-integration/build.rs index 9b157c5aab..fe7ffb1fb7 100644 --- a/bindgen-integration/build.rs +++ b/bindgen-integration/build.rs @@ -1,9 +1,23 @@ extern crate bindgen; extern crate gcc; +use std::collections::HashSet; use std::env; use std::path::PathBuf; +use std::sync::{Arc, RwLock}; use bindgen::Builder; +use bindgen::callbacks::ParseCallbacks; + +#[derive(Debug)] +struct MacroCallback { + macros: Arc>>, +} + +impl ParseCallbacks for MacroCallback { + fn parsed_macro(&self, _name: &str) { + self.macros.write().unwrap().insert(String::from(_name)); + } +} fn main() { gcc::Config::new() @@ -11,6 +25,8 @@ fn main() { .file("cpp/Test.cc") .compile("libtest.a"); + let macros = Arc::new(RwLock::new(HashSet::new())); + let bindings = Builder::default() .no_unstable_rust() .enable_cxx_namespaces() @@ -19,9 +35,11 @@ fn main() { .clang_arg("-x") .clang_arg("c++") .clang_arg("-std=c++11") + .parse_callbacks(Box::new(MacroCallback {macros: macros.clone()})) .generate() .expect("Unable to generate bindings"); + assert!(macros.read().unwrap().contains("TESTMACRO")); let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); bindings diff --git a/bindgen-integration/cpp/Test.h b/bindgen-integration/cpp/Test.h index c060984da6..310478bbf4 100644 --- a/bindgen-integration/cpp/Test.h +++ b/bindgen-integration/cpp/Test.h @@ -1,5 +1,7 @@ #pragma once +#define TESTMACRO + class Test { int m_int; double m_double; diff --git a/src/chooser.rs b/src/callbacks.rs similarity index 85% rename from src/chooser.rs rename to src/callbacks.rs index 29090a4220..ef85fdd7ab 100644 --- a/src/chooser.rs +++ b/src/callbacks.rs @@ -7,7 +7,11 @@ use std::panic::UnwindSafe; /// A trait to allow configuring different kinds of types in different /// situations. -pub trait TypeChooser: fmt::Debug + UnwindSafe { +pub trait ParseCallbacks: fmt::Debug + UnwindSafe { + + /// This function will be run on every macro that is identified + fn parsed_macro(&self, _name: &str) {} + /// The integer kind an integer macro should have, given a name and the /// value of that macro, or `None` if you want the default to be chosen. fn int_macro(&self, _name: &str, _value: i64) -> Option { diff --git a/src/ir/context.rs b/src/ir/context.rs index 1dc4f4a4c1..4a6785b16c 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -11,7 +11,7 @@ use super::traversal::{self, Edge, ItemTraversal}; use super::ty::{FloatKind, TemplateDeclaration, Type, TypeKind}; use BindgenOptions; use cexpr; -use chooser::TypeChooser; +use callbacks::ParseCallbacks; use clang::{self, Cursor}; use clang_sys; use parse::ClangItemParser; @@ -233,9 +233,9 @@ impl<'ctx> BindgenContext<'ctx> { .expect("should have been parsing a type, if we finished parsing a type") } - /// Get the user-provided type chooser by reference, if any. - pub fn type_chooser(&self) -> Option<&TypeChooser> { - self.options().type_chooser.as_ref().map(|t| &**t) + /// Get the user-provided callbacks by reference, if any. + pub fn parse_callbacks(&self) -> Option<&ParseCallbacks> { + self.options().parse_callbacks.as_ref().map(|t| &**t) } /// Define a new item. diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index d2385a29e8..175af69125 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -91,7 +91,7 @@ impl Enum { }; if let Some(val) = value { let name = cursor.spelling(); - let custom_behavior = ctx.type_chooser() + let custom_behavior = ctx.parse_callbacks() .and_then(|t| { t.enum_variant_behavior(type_name, &name, val) }) diff --git a/src/ir/var.rs b/src/ir/var.rs index 2e56e9f53c..656a1a6dfd 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -116,6 +116,11 @@ impl ClangSubItemParser for Var { use cexpr::literal::CChar; match cursor.kind() { CXCursor_MacroDefinition => { + + if let Some(visitor) = ctx.parse_callbacks() { + visitor.parsed_macro(&cursor.spelling()); + } + let value = parse_macro(ctx, &cursor, ctx.translation_unit()); let (id, value) = match value { @@ -170,7 +175,7 @@ impl ClangSubItemParser for Var { (TypeKind::Pointer(char_ty), VarType::String(val)) } EvalResult::Int(Wrapping(value)) => { - let kind = ctx.type_chooser() + let kind = ctx.parse_callbacks() .and_then(|c| c.int_macro(&name, value)) .unwrap_or_else(|| if value < 0 { if value < i32::min_value() as i64 { diff --git a/src/lib.rs b/src/lib.rs index 30d9987b99..e92be92b5f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -63,7 +63,7 @@ mod parse; mod regex_set; mod uses; -pub mod chooser; +pub mod callbacks; #[cfg(rustfmt)] mod codegen; @@ -445,10 +445,10 @@ impl Builder { self } - /// Allows configuring types in different situations, see the `TypeChooser` + /// Allows configuring types in different situations, see the `ParseCallbacks` /// documentation. - pub fn type_chooser(mut self, cb: Box) -> Self { - self.options.type_chooser = Some(cb); + pub fn parse_callbacks(mut self, cb: Box) -> Self { + self.options.parse_callbacks = Some(cb); self } @@ -567,9 +567,9 @@ pub struct BindgenOptions { /// of all types defined therein. See the `uses` module for more. pub dummy_uses: Option, - /// A user-provided type chooser to allow customizing different kinds of + /// A user-provided visitor to allow customizing different kinds of /// situations. - pub type_chooser: Option>, + pub parse_callbacks: Option>, /// Which kind of items should we generate? By default, we'll generate all /// of them. @@ -650,7 +650,7 @@ impl Default for BindgenOptions { clang_args: vec![], input_header: None, dummy_uses: None, - type_chooser: None, + parse_callbacks: None, codegen_config: CodegenConfig::all(), conservative_inline_namespaces: false, generate_comments: true, From b4f103bc91fa73f355fc183d79100f23bfd96c6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 20 Mar 2017 14:37:41 +0100 Subject: [PATCH 0411/2291] options: Allow force-generating inline functions. --- src/ir/function.rs | 3 +- src/lib.rs | 14 +++++++++ src/options.rs | 7 +++++ tests/expectations/tests/generate-inline.rs | 33 +++++++++++++++++++++ tests/headers/generate-inline.hpp | 12 ++++++++ 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/tests/generate-inline.rs create mode 100644 tests/headers/generate-inline.hpp diff --git a/src/ir/function.rs b/src/ir/function.rs index 941694ffb4..fd88b657d1 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -310,7 +310,8 @@ impl ClangSubItemParser for Function { return Err(ParseError::Continue); } - if cursor.is_inlined_function() { + if !context.options().generate_inline_functions && + cursor.is_inlined_function() { return Err(ParseError::Continue); } diff --git a/src/lib.rs b/src/lib.rs index e92be92b5f..433198b07a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -415,6 +415,16 @@ impl Builder { self } + /// Whether inline functions should be generated or not. + /// + /// Note that they will usually not work. However you can use + /// `-fkeep-inline-functions` or `-fno-inline-functions` if you are + /// responsible of compiling the library to make them callable. + pub fn generate_inline_functions(mut self, doit: bool) -> Self { + self.options.generate_inline_functions = doit; + self + } + /// Ignore functions. pub fn ignore_functions(mut self) -> Builder { self.options.codegen_config.functions = false; @@ -584,6 +594,9 @@ pub struct BindgenOptions { /// documentation for more details. pub generate_comments: bool, + /// Whether to generate inline functions. Defaults to false. + pub generate_inline_functions: bool, + /// Wether to whitelist types recursively. Defaults to true. pub whitelist_recursively: bool, @@ -654,6 +667,7 @@ impl Default for BindgenOptions { codegen_config: CodegenConfig::all(), conservative_inline_namespaces: false, generate_comments: true, + generate_inline_functions: false, whitelist_recursively: true, objc_extern_crate: false, enable_mangling: true, diff --git a/src/options.rs b/src/options.rs index 15146b398a..f1c8479acf 100644 --- a/src/options.rs +++ b/src/options.rs @@ -177,6 +177,9 @@ pub fn builder_from_flags .takes_value(true) .multiple(true) .number_of_values(1), + Arg::with_name("generate-inline-functions") + .long("generate-inline-functions") + .help("Whether inline functions should be generated."), Arg::with_name("whitelist-type") .long("whitelist-type") .help("Whitelist the type. Other non-whitelisted types will \ @@ -357,6 +360,10 @@ pub fn builder_from_flags builder = builder.conservative_inline_namespaces(); } + if matches.is_present("generate-inline-functions") { + builder = builder.generate_inline_functions(true); + } + if let Some(whitelist) = matches.values_of("whitelist-function") { for regex in whitelist { builder = builder.whitelisted_function(regex); diff --git a/tests/expectations/tests/generate-inline.rs b/tests/expectations/tests/generate-inline.rs new file mode 100644 index 0000000000..7205741496 --- /dev/null +++ b/tests/expectations/tests/generate-inline.rs @@ -0,0 +1,33 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct Foo { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); +} +extern "C" { + #[link_name = "_ZN3Foo3barEv"] + pub fn Foo_bar() -> ::std::os::raw::c_int; +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} +impl Foo { + #[inline] + pub unsafe fn bar() -> ::std::os::raw::c_int { Foo_bar() } +} +extern "C" { + #[link_name = "_Z3foov"] + pub fn foo() -> ::std::os::raw::c_int; +} diff --git a/tests/headers/generate-inline.hpp b/tests/headers/generate-inline.hpp new file mode 100644 index 0000000000..922ee1ca7c --- /dev/null +++ b/tests/headers/generate-inline.hpp @@ -0,0 +1,12 @@ +// bindgen-flags: --generate-inline-functions + +class Foo { + public: + static inline int bar() { + return 42; + } +}; + +inline int foo() { + return 42; +} From 1abd864972012b2c027fc3378f1db88333f5d6ea Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 21 Mar 2017 14:04:22 +0100 Subject: [PATCH 0412/2291] Do not derive Default on vtable types https://github.com/servo/rust-bindgen/pull/597#issuecomment-288006557 --- src/codegen/mod.rs | 6 +----- tests/expectations/tests/enum_and_vtable_mangling.rs | 1 - tests/expectations/tests/nested_vtable.rs | 1 - tests/expectations/tests/ref_argument_array.rs | 1 - tests/expectations/tests/virtual_dtor.rs | 1 - tests/expectations/tests/virtual_inheritance.rs | 2 -- tests/expectations/tests/virtual_overloaded.rs | 1 - tests/expectations/tests/vtable_recursive_sig.rs | 1 - 8 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 7db083e728..577b8aabfc 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -706,11 +706,7 @@ impl<'a> CodeGenerator for Vtable<'a> { assert_eq!(item.id(), self.item_id); // For now, generate an empty struct, later we should generate function // pointers and whatnot. - let mut attributes = vec![attributes::repr("C")]; - - if ctx.options().derive_default { - attributes.push(attributes::derives(&["Default"])) - } + let attributes = vec![attributes::repr("C")]; let vtable = aster::AstBuilder::new() .item() diff --git a/tests/expectations/tests/enum_and_vtable_mangling.rs b/tests/expectations/tests/enum_and_vtable_mangling.rs index 300edd3931..f1a580931f 100644 --- a/tests/expectations/tests/enum_and_vtable_mangling.rs +++ b/tests/expectations/tests/enum_and_vtable_mangling.rs @@ -10,7 +10,6 @@ pub const whatever_else: _bindgen_ty_1 = _bindgen_ty_1::whatever_else; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum _bindgen_ty_1 { match_ = 0, whatever_else = 1, } #[repr(C)] -#[derive(Default)] pub struct C__bindgen_vtable { } #[repr(C)] diff --git a/tests/expectations/tests/nested_vtable.rs b/tests/expectations/tests/nested_vtable.rs index e16a23d71d..62466ee013 100644 --- a/tests/expectations/tests/nested_vtable.rs +++ b/tests/expectations/tests/nested_vtable.rs @@ -5,7 +5,6 @@ #[repr(C)] -#[derive(Default)] pub struct nsISupports__bindgen_vtable { } #[repr(C)] diff --git a/tests/expectations/tests/ref_argument_array.rs b/tests/expectations/tests/ref_argument_array.rs index 714467f6f3..ac761796f1 100644 --- a/tests/expectations/tests/ref_argument_array.rs +++ b/tests/expectations/tests/ref_argument_array.rs @@ -6,7 +6,6 @@ pub const NSID_LENGTH: ::std::os::raw::c_uint = 10; #[repr(C)] -#[derive(Default)] pub struct nsID__bindgen_vtable { } #[repr(C)] diff --git a/tests/expectations/tests/virtual_dtor.rs b/tests/expectations/tests/virtual_dtor.rs index 0c4109776d..9df3c31c90 100644 --- a/tests/expectations/tests/virtual_dtor.rs +++ b/tests/expectations/tests/virtual_dtor.rs @@ -5,7 +5,6 @@ #[repr(C)] -#[derive(Default)] pub struct nsSlots__bindgen_vtable { } #[repr(C)] diff --git a/tests/expectations/tests/virtual_inheritance.rs b/tests/expectations/tests/virtual_inheritance.rs index 6896eb31c9..a09ad5672f 100644 --- a/tests/expectations/tests/virtual_inheritance.rs +++ b/tests/expectations/tests/virtual_inheritance.rs @@ -25,7 +25,6 @@ impl Clone for A { fn clone(&self) -> Self { *self } } #[repr(C)] -#[derive(Default)] pub struct B__bindgen_vtable { } #[repr(C)] @@ -53,7 +52,6 @@ impl Default for B { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] -#[derive(Default)] pub struct C__bindgen_vtable { } #[repr(C)] diff --git a/tests/expectations/tests/virtual_overloaded.rs b/tests/expectations/tests/virtual_overloaded.rs index e7ae9f4a73..b10d2adc9f 100644 --- a/tests/expectations/tests/virtual_overloaded.rs +++ b/tests/expectations/tests/virtual_overloaded.rs @@ -5,7 +5,6 @@ #[repr(C)] -#[derive(Default)] pub struct C__bindgen_vtable { } #[repr(C)] diff --git a/tests/expectations/tests/vtable_recursive_sig.rs b/tests/expectations/tests/vtable_recursive_sig.rs index 716ce39f5c..18e4f07ea1 100644 --- a/tests/expectations/tests/vtable_recursive_sig.rs +++ b/tests/expectations/tests/vtable_recursive_sig.rs @@ -23,7 +23,6 @@ impl Default for Derived { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] -#[derive(Default)] pub struct Base__bindgen_vtable { } #[repr(C)] From f67967a2930082ef54cde03d26dc3c0fe8f388cd Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Mon, 20 Mar 2017 18:35:13 +0100 Subject: [PATCH 0413/2291] Make vtables non-zero-size to fix a rustc warning. ``` warning: found non-foreign-function-safe member in struct marked #[repr(C)]: found zero-size struct in foreign module, consider adding a member to this struct ``` --- src/codegen/mod.rs | 4 +++- tests/expectations/tests/enum_and_vtable_mangling.rs | 3 +-- tests/expectations/tests/nested_vtable.rs | 3 +-- tests/expectations/tests/ref_argument_array.rs | 3 +-- tests/expectations/tests/virtual_dtor.rs | 3 +-- tests/expectations/tests/virtual_inheritance.rs | 6 ++---- tests/expectations/tests/virtual_overloaded.rs | 3 +-- tests/expectations/tests/vtable_recursive_sig.rs | 3 +-- 8 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 577b8aabfc..fb6c839d84 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -712,7 +712,9 @@ impl<'a> CodeGenerator for Vtable<'a> { .item() .pub_() .with_attrs(attributes) - .struct_(self.canonical_name(ctx)) + .tuple_struct(self.canonical_name(ctx)) + .field() + .build_ty(helpers::ast_ty::raw_type(ctx, "c_void")) .build(); result.push(vtable); } diff --git a/tests/expectations/tests/enum_and_vtable_mangling.rs b/tests/expectations/tests/enum_and_vtable_mangling.rs index f1a580931f..b34e217f4a 100644 --- a/tests/expectations/tests/enum_and_vtable_mangling.rs +++ b/tests/expectations/tests/enum_and_vtable_mangling.rs @@ -10,8 +10,7 @@ pub const whatever_else: _bindgen_ty_1 = _bindgen_ty_1::whatever_else; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum _bindgen_ty_1 { match_ = 0, whatever_else = 1, } #[repr(C)] -pub struct C__bindgen_vtable { -} +pub struct C__bindgen_vtable(::std::os::raw::c_void); #[repr(C)] #[derive(Debug, Copy)] pub struct C { diff --git a/tests/expectations/tests/nested_vtable.rs b/tests/expectations/tests/nested_vtable.rs index 62466ee013..4c9dc8f6c2 100644 --- a/tests/expectations/tests/nested_vtable.rs +++ b/tests/expectations/tests/nested_vtable.rs @@ -5,8 +5,7 @@ #[repr(C)] -pub struct nsISupports__bindgen_vtable { -} +pub struct nsISupports__bindgen_vtable(::std::os::raw::c_void); #[repr(C)] #[derive(Debug, Copy)] pub struct nsISupports { diff --git a/tests/expectations/tests/ref_argument_array.rs b/tests/expectations/tests/ref_argument_array.rs index ac761796f1..51531824cb 100644 --- a/tests/expectations/tests/ref_argument_array.rs +++ b/tests/expectations/tests/ref_argument_array.rs @@ -6,8 +6,7 @@ pub const NSID_LENGTH: ::std::os::raw::c_uint = 10; #[repr(C)] -pub struct nsID__bindgen_vtable { -} +pub struct nsID__bindgen_vtable(::std::os::raw::c_void); #[repr(C)] #[derive(Debug, Copy)] pub struct nsID { diff --git a/tests/expectations/tests/virtual_dtor.rs b/tests/expectations/tests/virtual_dtor.rs index 9df3c31c90..e5d3ace2fc 100644 --- a/tests/expectations/tests/virtual_dtor.rs +++ b/tests/expectations/tests/virtual_dtor.rs @@ -5,8 +5,7 @@ #[repr(C)] -pub struct nsSlots__bindgen_vtable { -} +pub struct nsSlots__bindgen_vtable(::std::os::raw::c_void); #[repr(C)] #[derive(Debug)] pub struct nsSlots { diff --git a/tests/expectations/tests/virtual_inheritance.rs b/tests/expectations/tests/virtual_inheritance.rs index a09ad5672f..b3119ca7ad 100644 --- a/tests/expectations/tests/virtual_inheritance.rs +++ b/tests/expectations/tests/virtual_inheritance.rs @@ -25,8 +25,7 @@ impl Clone for A { fn clone(&self) -> Self { *self } } #[repr(C)] -pub struct B__bindgen_vtable { -} +pub struct B__bindgen_vtable(::std::os::raw::c_void); #[repr(C)] #[derive(Debug, Copy)] pub struct B { @@ -52,8 +51,7 @@ impl Default for B { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] -pub struct C__bindgen_vtable { -} +pub struct C__bindgen_vtable(::std::os::raw::c_void); #[repr(C)] #[derive(Debug, Copy)] pub struct C { diff --git a/tests/expectations/tests/virtual_overloaded.rs b/tests/expectations/tests/virtual_overloaded.rs index b10d2adc9f..625abe3bde 100644 --- a/tests/expectations/tests/virtual_overloaded.rs +++ b/tests/expectations/tests/virtual_overloaded.rs @@ -5,8 +5,7 @@ #[repr(C)] -pub struct C__bindgen_vtable { -} +pub struct C__bindgen_vtable(::std::os::raw::c_void); #[repr(C)] #[derive(Debug, Copy)] pub struct C { diff --git a/tests/expectations/tests/vtable_recursive_sig.rs b/tests/expectations/tests/vtable_recursive_sig.rs index 18e4f07ea1..0faf37ac33 100644 --- a/tests/expectations/tests/vtable_recursive_sig.rs +++ b/tests/expectations/tests/vtable_recursive_sig.rs @@ -23,8 +23,7 @@ impl Default for Derived { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } #[repr(C)] -pub struct Base__bindgen_vtable { -} +pub struct Base__bindgen_vtable(::std::os::raw::c_void); #[repr(C)] #[derive(Debug, Copy)] pub struct Base { From 217cf285d452d3004f584fbe841da725f9063af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 23 Mar 2017 11:18:37 +0100 Subject: [PATCH 0414/2291] ir: Prefer the enum definition instead of the declaration when looking for variants. --- src/ir/enum_ty.rs | 7 +++++-- tests/expectations/tests/forward-enum-decl.rs | 9 +++++++++ tests/headers/forward-enum-decl.hpp | 8 ++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 tests/expectations/tests/forward-enum-decl.rs create mode 100644 tests/headers/forward-enum-decl.hpp diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index 175af69125..e64354fb9d 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -54,6 +54,8 @@ impl Enum { ctx: &mut BindgenContext) -> Result { use clang_sys::*; + debug!("Enum::from_ty {:?}", ty); + if ty.kind() != CXType_Enum { return Err(ParseError::Continue); } @@ -82,7 +84,8 @@ impl Enum { }; let type_name = type_name.as_ref().map(String::as_str); - declaration.visit(|cursor| { + let definition = declaration.definition().unwrap_or(declaration); + definition.visit(|cursor| { if cursor.kind() == CXCursor_EnumConstantDecl { let value = if is_signed { cursor.enum_val_signed().map(EnumVariantValue::Signed) @@ -99,7 +102,7 @@ impl Enum { Annotations::new(&cursor) .and_then(|anno| if anno.hide() { Some(EnumVariantCustomBehavior::Hide) - } else if + } else if anno.constify_enum_variant() { Some(EnumVariantCustomBehavior::Constify) } else { diff --git a/tests/expectations/tests/forward-enum-decl.rs b/tests/expectations/tests/forward-enum-decl.rs new file mode 100644 index 0000000000..7f2d937a98 --- /dev/null +++ b/tests/expectations/tests/forward-enum-decl.rs @@ -0,0 +1,9 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(i32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum CSSPseudoClassType { empty = 0, link = 1, } diff --git a/tests/headers/forward-enum-decl.hpp b/tests/headers/forward-enum-decl.hpp new file mode 100644 index 0000000000..2c4316c61d --- /dev/null +++ b/tests/headers/forward-enum-decl.hpp @@ -0,0 +1,8 @@ +// bindgen-flags: -- -std=c++11 + +enum class CSSPseudoClassType : int; + +enum class CSSPseudoClassType : int { + empty, + link, +}; From 178177644ee54dd7eadace557e1a498aaa9d8a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 27 Mar 2017 19:13:53 +0200 Subject: [PATCH 0415/2291] tests: Disable rustfmt tests, for now. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7805b57875..2def8e3af8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,7 @@ cache: before_install: . ./ci/before_install.sh script: - - ./ci/assert-rustfmt.sh + # - ./ci/assert-rustfmt.sh - BINDGEN_FEATURES="$BINDGEN_FEATURES" ./ci/assert-docs.sh - BINDGEN_FEATURES="$BINDGEN_FEATURES" ./ci/test.sh From 63de9486e8e1a2d2987c93a7fedd766bf8c52b78 Mon Sep 17 00:00:00 2001 From: Ted Mielczarek Date: Mon, 27 Mar 2017 13:02:33 -0400 Subject: [PATCH 0416/2291] Add a `Builder::header_contents` method to allow passing source code as a string to a Builder Currently the Builder API requires input as header files on disk. This allows passing C source directly to clang using the existing UnsavedFile struct. --- src/clang.rs | 13 ++++++++++++- src/ir/context.rs | 2 +- src/lib.rs | 16 ++++++++++++++++ tests/tests.rs | 18 +++++++++++++++++- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index fc7950dcfc..ee42274551 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -1409,7 +1409,9 @@ impl Drop for Diagnostic { /// A file which has not been saved to disk. pub struct UnsavedFile { x: CXUnsavedFile, - name: CString, + /// The name of the unsaved file. Kept here to avoid leaving dangling pointers in + /// `CXUnsavedFile`. + pub name: CString, contents: CString, } @@ -1431,6 +1433,15 @@ impl UnsavedFile { } } +impl fmt::Debug for UnsavedFile { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + write!(fmt, + "UnsavedFile(name: {:?}, contents: {:?})", + self.name, + self.contents) + } +} + /// Convert a cursor kind into a static string. pub fn kind_to_str(x: CXCursorKind) -> String { unsafe { cxstring_into_string(clang_getCursorKindSpelling(x)) } diff --git a/src/ir/context.rs b/src/ir/context.rs index 4a6785b16c..c95d517918 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -182,7 +182,7 @@ impl<'ctx> BindgenContext<'ctx> { clang::TranslationUnit::parse(&index, "", &options.clang_args, - &[], + &options.input_unsaved_files, parse_options) .expect("TranslationUnit::parse failed"); diff --git a/src/lib.rs b/src/lib.rs index 433198b07a..8f838c15ea 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -175,6 +175,14 @@ impl Builder { self } + /// Add `contents` as an input C/C++ header named `name`. + /// + /// The file `name` will be added to the clang arguments. + pub fn header_contents(mut self, name: &str, contents: &str) -> Builder { + self.options.input_unsaved_files.push(clang::UnsavedFile::new(name, contents)); + self + } + /// Set the output graphviz file. pub fn emit_ir_graphviz>(mut self, path: T) -> Builder { let path = path.into(); @@ -573,6 +581,9 @@ pub struct BindgenOptions { /// The input header file. pub input_header: Option, + /// Unsaved files for input. + pub input_unsaved_files: Vec, + /// Generate a dummy C/C++ file that includes the header and has dummy uses /// of all types defined therein. See the `uses` module for more. pub dummy_uses: Option, @@ -662,6 +673,7 @@ impl Default for BindgenOptions { raw_lines: vec![], clang_args: vec![], input_header: None, + input_unsaved_files: vec![], dummy_uses: None, parse_callbacks: None, codegen_config: CodegenConfig::all(), @@ -754,6 +766,10 @@ impl<'ctx> Bindings<'ctx> { options.clang_args.push(h.clone()) } + for f in options.input_unsaved_files.iter() { + options.clang_args.push(f.name.to_str().unwrap().to_owned()) + } + let mut context = BindgenContext::new(options); try!(parse(&mut context)); diff --git a/tests/tests.rs b/tests/tests.rs index 6b69e0d42c..84b5e076f7 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -3,7 +3,7 @@ extern crate diff; extern crate bindgen; extern crate shlex; -use bindgen::Builder; +use bindgen::{Builder, builder}; use std::fs; use std::io::{BufRead, BufReader, Error, ErrorKind, Read, Write}; use std::path::PathBuf; @@ -144,3 +144,19 @@ macro_rules! test_header { // This file is generated by build.rs include!(concat!(env!("OUT_DIR"), "/tests.rs")); + +#[test] +fn test_header_contents() { + let bindings = builder() + .header_contents("test.h", "int foo(const char* a);") + .no_unstable_rust() + .generate() + .unwrap() + .to_string(); + assert_eq!(bindings, "/* automatically generated by rust-bindgen */ + +extern \"C\" { + pub fn foo(a: *const ::std::os::raw::c_schar) -> ::std::os::raw::c_int; +} +"); +} From 90218545c38c79b91e211b5f0a6a9377a96ef146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 30 Mar 2017 23:04:47 +0200 Subject: [PATCH 0417/2291] clang: Fix most of the clang 5.0 regressions in our tests. --- src/clang.rs | 22 ++++++++++++++- src/ir/ty.rs | 7 +---- tests/expectations/tests/struct_typedef_ns.rs | 27 ++++++++----------- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index fc7950dcfc..669db2079a 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -600,6 +600,17 @@ impl Cursor { } } +/// Checks whether the name looks like an identifier, i.e. is alphanumeric +/// (including '_') and does not start with a digit. +pub fn is_valid_identifier(name: &str) -> bool { + let mut chars = name.chars(); + let first_valid = chars.next() + .map(|c| c.is_alphabetic() || c == '_') + .unwrap_or(false); + + first_valid && chars.all(|c| c.is_alphanumeric() || c == '_') +} + extern "C" fn visit_children(cur: CXCursor, _parent: CXCursor, data: CXClientData) @@ -729,7 +740,16 @@ impl Type { /// Get a raw display name for this type. pub fn spelling(&self) -> String { - unsafe { cxstring_into_string(clang_getTypeSpelling(self.x)) } + let s = unsafe { cxstring_into_string(clang_getTypeSpelling(self.x)) }; + // Clang 5.0 introduced changes in the spelling API so it returned the + // full qualified name. Let's undo that here. + if s.split("::").all(|s| is_valid_identifier(s)) { + if let Some(s) = s.split("::").last() { + return s.to_owned(); + } + } + + s } /// Is this type const qualified? diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 5492569680..60d750edbf 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -429,12 +429,7 @@ impl Type { /// Checks whether the name looks like an identifier, /// i.e. is alphanumeric (including '_') and does not start with a digit. pub fn is_valid_identifier(name: &str) -> bool { - let mut chars = name.chars(); - let first_valid = chars.next() - .map(|c| c.is_alphabetic() || c == '_') - .unwrap_or(false); - - first_valid && chars.all(|c| c.is_alphanumeric() || c == '_') + clang::is_valid_identifier(name) } /// See safe_canonical_type. diff --git a/tests/expectations/tests/struct_typedef_ns.rs b/tests/expectations/tests/struct_typedef_ns.rs index 0f078e6ffb..9f2c3b3446 100644 --- a/tests/expectations/tests/struct_typedef_ns.rs +++ b/tests/expectations/tests/struct_typedef_ns.rs @@ -13,34 +13,29 @@ pub mod root { use self::super::super::root; #[repr(C)] #[derive(Debug, Default, Copy)] - pub struct _bindgen_ty_1 { + pub struct typedef_struct { pub foo: ::std::os::raw::c_int, } #[test] - fn bindgen_test_layout__bindgen_ty_1() { - assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 4usize , - concat ! ( "Size of: " , stringify ! ( _bindgen_ty_1 ) + fn bindgen_test_layout_typedef_struct() { + assert_eq!(::std::mem::size_of::() , 4usize , + concat ! ( "Size of: " , stringify ! ( typedef_struct ) )); - assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 4usize , + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( - "Alignment of " , stringify ! ( _bindgen_ty_1 ) )); + "Alignment of " , stringify ! ( typedef_struct ) )); assert_eq! (unsafe { - & ( * ( 0 as * const _bindgen_ty_1 ) ) . foo as * + & ( * ( 0 as * const typedef_struct ) ) . foo as * const _ as usize } , 0usize , concat ! ( - "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) - , "::" , stringify ! ( foo ) )); + "Alignment of field: " , stringify ! ( typedef_struct + ) , "::" , stringify ! ( foo ) )); } - impl Clone for _bindgen_ty_1 { + impl Clone for typedef_struct { fn clone(&self) -> Self { *self } } - pub type typedef_struct = root::whatever::_bindgen_ty_1; - pub const whatever_BAR: root::whatever::_bindgen_ty_2 = - _bindgen_ty_2::BAR; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] - pub enum _bindgen_ty_2 { BAR = 1, } - pub use self::super::super::root::whatever::_bindgen_ty_2 as - typedef_enum; + pub enum typedef_enum { BAR = 1, } } pub mod _bindgen_mod_id_12 { #[allow(unused_imports)] From cd232734766d165981671c42d9b21b0dd4ae20cc Mon Sep 17 00:00:00 2001 From: Tai Sassen-Liang Date: Thu, 30 Mar 2017 12:26:02 +0200 Subject: [PATCH 0418/2291] #571: Allow ast_dump to print builtins; filter builtins locally --- src/clang.rs | 3 --- src/lib.rs | 11 ++++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/clang.rs b/src/clang.rs index 2dbe5e514b..b4acf2046f 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -1482,9 +1482,6 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { } fn print_cursor>(depth: isize, prefix: S, c: &Cursor) { - if c.is_builtin() { - return; - } let prefix = prefix.as_ref(); print_indent(depth, format!(" {}kind = {}", prefix, kind_to_str(c.kind()))); diff --git a/src/lib.rs b/src/lib.rs index 8f838c15ea..eccf80e347 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -896,8 +896,17 @@ fn parse(context: &mut BindgenContext) -> Result<(), ()> { } let cursor = context.translation_unit().cursor(); + if context.options().emit_ast { - cursor.visit(|cur| clang::ast_dump(&cur, 0)); + + fn dump_if_not_builtin(cur: &clang::Cursor) -> CXChildVisitResult { + if !cur.is_builtin() { + clang::ast_dump(&cur, 0) + } else { + CXChildVisit_Continue + } + } + cursor.visit(|cur| dump_if_not_builtin(&cur)); } let root = context.root_module(); From f31340159e8a30882a7a41dd7838b87a7d6fe753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 3 Apr 2017 12:45:39 +0200 Subject: [PATCH 0419/2291] options: Allow configuring the generation of constructors. --- src/options.rs | 5 +-- tests/expectations/tests/gen-constructors.rs | 33 ++++++++++++++++++++ tests/headers/gen-constructors.hpp | 6 ++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tests/expectations/tests/gen-constructors.rs create mode 100644 tests/headers/gen-constructors.hpp diff --git a/src/options.rs b/src/options.rs index f1c8479acf..9f229f6676 100644 --- a/src/options.rs +++ b/src/options.rs @@ -111,8 +111,8 @@ pub fn builder_from_flags Arg::with_name("generate") .long("generate") .help("Generate a given kind of items, split by commas. \ - Valid values are \"functions\",\"types\", \"vars\" and \ - \"methods\".") + Valid values are \"functions\",\"types\", \"vars\", \ + \"methods\" and \"constructors\".") .takes_value(true), Arg::with_name("ignore-methods") .long("ignore-methods") @@ -271,6 +271,7 @@ pub fn builder_from_flags "types" => config.types = true, "vars" => config.vars = true, "methods" => config.methods = true, + "constructors" => config.constructors = true, _ => { return Err(Error::new(ErrorKind::Other, "Unknown generate item")); diff --git a/tests/expectations/tests/gen-constructors.rs b/tests/expectations/tests/gen-constructors.rs new file mode 100644 index 0000000000..72c2fc5300 --- /dev/null +++ b/tests/expectations/tests/gen-constructors.rs @@ -0,0 +1,33 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct Foo { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); +} +extern "C" { + #[link_name = "_ZN3FooC1Ei"] + pub fn Foo_Foo(this: *mut Foo, a: ::std::os::raw::c_int); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} +impl Foo { + #[inline] + pub unsafe fn new(a: ::std::os::raw::c_int) -> Self { + let mut __bindgen_tmp = ::std::mem::uninitialized(); + Foo_Foo(&mut __bindgen_tmp, a); + __bindgen_tmp + } +} diff --git a/tests/headers/gen-constructors.hpp b/tests/headers/gen-constructors.hpp new file mode 100644 index 0000000000..809d6ef998 --- /dev/null +++ b/tests/headers/gen-constructors.hpp @@ -0,0 +1,6 @@ +// bindgen-flags: --generate types,constructors,functions + +class Foo { + public: + Foo(int a); +}; From 8f1e5f5ad4fff230b06cdfca868266a28ada3881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 3 Apr 2017 14:36:59 +0200 Subject: [PATCH 0420/2291] ir: Force the D1 destructor symbol even in older libclang versions. --- src/ir/function.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/ir/function.rs b/src/ir/function.rs index fd88b657d1..2c588fdd54 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -114,6 +114,7 @@ fn get_abi(cc: CXCallingConv) -> Option { pub fn cursor_mangling(ctx: &BindgenContext, cursor: &clang::Cursor) -> Option { + use clang_sys; if !ctx.options().enable_mangling { return None; } @@ -131,10 +132,37 @@ pub fn cursor_mangling(ctx: &BindgenContext, } // Try to undo backend linkage munging (prepended _, generally) + // + // TODO(emilio): This is wrong when the target system is not the host + // system. See https://github.com/servo/rust-bindgen/issues/593 if cfg!(target_os = "macos") { mangling.remove(0); } + if cursor.kind() == clang_sys::CXCursor_Destructor { + // With old (3.8-) libclang versions, and the Itanium ABI, clang returns + // the "destructor group 0" symbol, which means that it'll try to free + // memory, which definitely isn't what we want. + // + // Explicitly force the destructor group 1 symbol. + // + // See http://refspecs.linuxbase.org/cxxabi-1.83.html#mangling-special + // for the reference, and http://stackoverflow.com/a/6614369/1091587 for + // a more friendly explanation. + // + // We don't need to do this for constructors since clang seems to always + // have returned the C1 constructor. + // + // FIXME(emilio): Can a legit symbol in other ABIs end with this string? + // I don't think so, but if it can this would become a linker error + // anyway, not an invalid free at runtime. + if mangling.ends_with("D0Ev") { + let new_len = mangling.len() - 4; + mangling.truncate(new_len); + mangling.push_str("D1Ev"); + } + } + Some(mangling) } From 1714f947e062a7b90ebda71d190daccba87ab32d Mon Sep 17 00:00:00 2001 From: Nikhil Shagrithaya Date: Mon, 27 Feb 2017 16:01:15 +0530 Subject: [PATCH 0421/2291] Add codegen for destructors. --- src/codegen/mod.rs | 15 +++++++++++++++ src/ir/comp.rs | 21 +++++++++++++++++++-- src/ir/function.rs | 18 ++++++++++++++---- src/lib.rs | 4 ++++ tests/expectations/tests/public-dtor.rs | 10 ++++++++++ tests/expectations/tests/union_dtor.rs | 10 ++++++++++ tests/expectations/tests/virtual_dtor.rs | 10 ++++++++++ 7 files changed, 82 insertions(+), 6 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index fb6c839d84..d15232734f 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1597,6 +1597,20 @@ impl CodeGenerator for CompInfo { self); } } + + if ctx.options().codegen_config.destructor { + if let Some(destructor) = *self.destructor() { + Method::new(MethodKind::Destructor, + destructor, + false) + .codegen_method(ctx, + &mut methods, + &mut method_names, + result, + whitelisted_items, + self); + } + } } // NB: We can't use to_rust_ty here since for opaque types this tries to @@ -1701,6 +1715,7 @@ impl MethodCodegen for Method { let signature_item = ctx.resolve_item(function.signature()); let mut name = match self.kind() { MethodKind::Constructor => "new".into(), + MethodKind::Destructor => "__bindgen_destructor__".into(), _ => function.name().to_owned(), }; diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 9a6548a7ef..44e7005872 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -26,6 +26,8 @@ pub enum MethodKind { /// A constructor. We represent it as method for convenience, to avoid code /// duplication. Constructor, + /// A destructor method + Destructor, /// A static method. Static, /// A normal method. @@ -61,6 +63,11 @@ impl Method { self.kind } + /// Is this a destructor method? + pub fn is_destructor(&self) -> bool { + self.kind == MethodKind::Destructor + } + /// Is this a constructor? pub fn is_constructor(&self) -> bool { self.kind == MethodKind::Constructor @@ -250,6 +257,9 @@ pub struct CompInfo { /// The different constructors this struct or class contains. constructors: Vec, + /// The destructor of this type + destructor: Option, + /// Vector of classes this one inherits from. base_members: Vec, @@ -321,6 +331,7 @@ impl CompInfo { template_params: vec![], methods: vec![], constructors: vec![], + destructor: None, base_members: vec![], inner_types: vec![], inner_vars: vec![], @@ -434,6 +445,11 @@ impl CompInfo { &self.constructors } + /// Get this type's destructor. + pub fn destructor(&self) -> &Option { + &self.destructor + } + /// What kind of compound type is this? pub fn kind(&self) -> CompKind { self.kind @@ -657,8 +673,9 @@ impl CompInfo { CXCursor_Constructor => { ci.constructors.push(signature); } - // TODO(emilio): Bind the destructor? - CXCursor_Destructor => {} + CXCursor_Destructor => { + ci.destructor = Some(signature); + } CXCursor_CXXMethod => { let is_const = cur.method_is_const(); let method_kind = if is_static { diff --git a/src/ir/function.rs b/src/ir/function.rs index 2c588fdd54..163226e305 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -248,13 +248,14 @@ impl FunctionSig { let is_method = cursor.kind() == CXCursor_CXXMethod; let is_constructor = cursor.kind() == CXCursor_Constructor; - if (is_constructor || is_method) && + let is_destructor = cursor.kind() == CXCursor_Destructor; + if (is_constructor || is_destructor || is_method) && cursor.lexical_parent() != cursor.semantic_parent() { // Only parse constructors once. return Err(ParseError::Continue); } - if is_method || is_constructor { + if is_method || is_constructor || is_destructor { let is_const = is_method && cursor.method_is_const(); let is_virtual = is_method && cursor.method_is_virtual(); let is_static = is_method && cursor.method_is_static(); @@ -320,9 +321,9 @@ impl ClangSubItemParser for Function { -> Result, ParseError> { use clang_sys::*; match cursor.kind() { - // FIXME(emilio): Generate destructors properly. CXCursor_FunctionDecl | CXCursor_Constructor | + CXCursor_Destructor | CXCursor_CXXMethod => {} _ => return Err(ParseError::Continue), }; @@ -353,7 +354,16 @@ impl ClangSubItemParser for Function { let sig = try!(Item::from_ty(&cursor.cur_type(), cursor, None, context)); - let name = cursor.spelling(); + let name = match cursor.kind() { + CXCursor_Destructor => { + let mut name_ = cursor.spelling(); + // remove the `~` + name_.remove(0); + name_ + "_destructor" + }, + _ => cursor.spelling(), + }; + assert!(!name.is_empty(), "Empty function name?"); let mut mangled_name = cursor_mangling(context, &cursor); diff --git a/src/lib.rs b/src/lib.rs index eccf80e347..8ee1653432 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -109,6 +109,8 @@ pub struct CodegenConfig { pub methods: bool, /// Whether to generate constructors. pub constructors: bool, + /// Whether to generate a destructor. + pub destructor: bool, } impl CodegenConfig { @@ -120,6 +122,7 @@ impl CodegenConfig { vars: true, methods: true, constructors: true, + destructor: true, } } @@ -131,6 +134,7 @@ impl CodegenConfig { vars: false, methods: false, constructors: false, + destructor: false, } } } diff --git a/tests/expectations/tests/public-dtor.rs b/tests/expectations/tests/public-dtor.rs index 1accf49cb5..0412b9f4b7 100644 --- a/tests/expectations/tests/public-dtor.rs +++ b/tests/expectations/tests/public-dtor.rs @@ -16,3 +16,13 @@ fn bindgen_test_layout_cv_String() { assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( "Alignment of " , stringify ! ( cv_String ) )); } +extern "C" { + #[link_name = "_ZN2cv6StringD1Ev"] + pub fn cv_String_String_destructor(this: *mut cv_String); +} +impl cv_String { + #[inline] + pub unsafe fn __bindgen_destructor__(&mut self) { + cv_String_String_destructor(&mut *self) + } +} diff --git a/tests/expectations/tests/union_dtor.rs b/tests/expectations/tests/union_dtor.rs index bfd573e021..1bcb45b672 100644 --- a/tests/expectations/tests/union_dtor.rs +++ b/tests/expectations/tests/union_dtor.rs @@ -52,3 +52,13 @@ fn bindgen_test_layout_UnionWithDtor() { "Alignment of field: " , stringify ! ( UnionWithDtor ) , "::" , stringify ! ( mBar ) )); } +extern "C" { + #[link_name = "_ZN13UnionWithDtorD1Ev"] + pub fn UnionWithDtor_UnionWithDtor_destructor(this: *mut UnionWithDtor); +} +impl UnionWithDtor { + #[inline] + pub unsafe fn __bindgen_destructor__(&mut self) { + UnionWithDtor_UnionWithDtor_destructor(&mut *self) + } +} diff --git a/tests/expectations/tests/virtual_dtor.rs b/tests/expectations/tests/virtual_dtor.rs index e5d3ace2fc..a84da69382 100644 --- a/tests/expectations/tests/virtual_dtor.rs +++ b/tests/expectations/tests/virtual_dtor.rs @@ -18,6 +18,16 @@ fn bindgen_test_layout_nsSlots() { assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( "Alignment of " , stringify ! ( nsSlots ) )); } +extern "C" { + #[link_name = "_ZN7nsSlotsD1Ev"] + pub fn nsSlots_nsSlots_destructor(this: *mut nsSlots); +} impl Default for nsSlots { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } +impl nsSlots { + #[inline] + pub unsafe fn __bindgen_destructor__(&mut self) { + nsSlots_nsSlots_destructor(&mut *self) + } +} From 5cf424ca484bdc3c7ab0c7e396fef25485bf4c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 3 Apr 2017 13:11:35 +0200 Subject: [PATCH 0422/2291] Refactor a bit and do not generate virtual destructors. --- src/codegen/mod.rs | 13 ++++++++---- src/ir/comp.rs | 21 ++++++++++++-------- src/ir/function.rs | 25 ++++++++++++++---------- tests/expectations/tests/virtual_dtor.rs | 10 ---------- 4 files changed, 37 insertions(+), 32 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index d15232734f..78b2e02ad9 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1599,10 +1599,14 @@ impl CodeGenerator for CompInfo { } if ctx.options().codegen_config.destructor { - if let Some(destructor) = *self.destructor() { - Method::new(MethodKind::Destructor, - destructor, - false) + if let Some((is_virtual, destructor)) = self.destructor() { + let kind = if is_virtual { + MethodKind::VirtualDestructor + } else { + MethodKind::Destructor + }; + + Method::new(kind, destructor, false) .codegen_method(ctx, &mut methods, &mut method_names, @@ -1707,6 +1711,7 @@ impl MethodCodegen for Method { if self.is_virtual() { return; // FIXME } + // First of all, output the actual function. let function_item = ctx.resolve_item(self.signature()); function_item.codegen(ctx, result, whitelisted_items, &()); diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 44e7005872..2c7b6de239 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -26,8 +26,10 @@ pub enum MethodKind { /// A constructor. We represent it as method for convenience, to avoid code /// duplication. Constructor, - /// A destructor method + /// A destructor. Destructor, + /// A virtual destructor. + VirtualDestructor, /// A static method. Static, /// A normal method. @@ -65,7 +67,8 @@ impl Method { /// Is this a destructor method? pub fn is_destructor(&self) -> bool { - self.kind == MethodKind::Destructor + self.kind == MethodKind::Destructor || + self.kind == MethodKind::VirtualDestructor } /// Is this a constructor? @@ -75,7 +78,8 @@ impl Method { /// Is this a virtual method? pub fn is_virtual(&self) -> bool { - self.kind == MethodKind::Virtual + self.kind == MethodKind::Virtual || + self.kind == MethodKind::VirtualDestructor } /// Is this a static method? @@ -257,8 +261,9 @@ pub struct CompInfo { /// The different constructors this struct or class contains. constructors: Vec, - /// The destructor of this type - destructor: Option, + /// The destructor of this type. The bool represents whether this destructor + /// is virtual. + destructor: Option<(bool, ItemId)>, /// Vector of classes this one inherits from. base_members: Vec, @@ -446,8 +451,8 @@ impl CompInfo { } /// Get this type's destructor. - pub fn destructor(&self) -> &Option { - &self.destructor + pub fn destructor(&self) -> Option<(bool, ItemId)> { + self.destructor } /// What kind of compound type is this? @@ -674,7 +679,7 @@ impl CompInfo { ci.constructors.push(signature); } CXCursor_Destructor => { - ci.destructor = Some(signature); + ci.destructor = Some((is_virtual, signature)); } CXCursor_CXXMethod => { let is_const = cur.method_is_const(); diff --git a/src/ir/function.rs b/src/ir/function.rs index 163226e305..f80a573615 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -354,18 +354,23 @@ impl ClangSubItemParser for Function { let sig = try!(Item::from_ty(&cursor.cur_type(), cursor, None, context)); - let name = match cursor.kind() { - CXCursor_Destructor => { - let mut name_ = cursor.spelling(); - // remove the `~` - name_.remove(0); - name_ + "_destructor" - }, - _ => cursor.spelling(), - }; - + let mut name = cursor.spelling(); assert!(!name.is_empty(), "Empty function name?"); + if cursor.kind() == CXCursor_Destructor { + // Remove the leading `~`. The alternative to this is special-casing + // code-generation for destructor functions, which seems less than + // ideal. + if name.starts_with('~') { + name.remove(0); + } + + // Add a suffix to avoid colliding with constructors. This would be + // technically fine (since we handle duplicated functions/methods), + // but seems easy enough to handle it here. + name.push_str("_destructor"); + } + let mut mangled_name = cursor_mangling(context, &cursor); if mangled_name.as_ref() == Some(&name) { mangled_name = None; diff --git a/tests/expectations/tests/virtual_dtor.rs b/tests/expectations/tests/virtual_dtor.rs index a84da69382..e5d3ace2fc 100644 --- a/tests/expectations/tests/virtual_dtor.rs +++ b/tests/expectations/tests/virtual_dtor.rs @@ -18,16 +18,6 @@ fn bindgen_test_layout_nsSlots() { assert_eq! (::std::mem::align_of::() , 8usize , concat ! ( "Alignment of " , stringify ! ( nsSlots ) )); } -extern "C" { - #[link_name = "_ZN7nsSlotsD1Ev"] - pub fn nsSlots_nsSlots_destructor(this: *mut nsSlots); -} impl Default for nsSlots { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -impl nsSlots { - #[inline] - pub unsafe fn __bindgen_destructor__(&mut self) { - nsSlots_nsSlots_destructor(&mut *self) - } -} From fcbd61ce793c7505b1a956555dd816aa87ac0141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 3 Apr 2017 13:15:24 +0200 Subject: [PATCH 0423/2291] options: Allow configuring destructors via CLI. --- src/codegen/mod.rs | 2 +- src/lib.rs | 8 ++--- src/options.rs | 3 +- tests/expectations/tests/gen-destructors.rs | 33 +++++++++++++++++++++ tests/headers/gen-destructors.hpp | 7 +++++ 5 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 tests/expectations/tests/gen-destructors.rs create mode 100644 tests/headers/gen-destructors.hpp diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 78b2e02ad9..6d9af09b2b 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1598,7 +1598,7 @@ impl CodeGenerator for CompInfo { } } - if ctx.options().codegen_config.destructor { + if ctx.options().codegen_config.destructors { if let Some((is_virtual, destructor)) = self.destructor() { let kind = if is_virtual { MethodKind::VirtualDestructor diff --git a/src/lib.rs b/src/lib.rs index 8ee1653432..e6a66dfc42 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -109,8 +109,8 @@ pub struct CodegenConfig { pub methods: bool, /// Whether to generate constructors. pub constructors: bool, - /// Whether to generate a destructor. - pub destructor: bool, + /// Whether to generate destructors. + pub destructors: bool, } impl CodegenConfig { @@ -122,7 +122,7 @@ impl CodegenConfig { vars: true, methods: true, constructors: true, - destructor: true, + destructors: true, } } @@ -134,7 +134,7 @@ impl CodegenConfig { vars: false, methods: false, constructors: false, - destructor: false, + destructors: false, } } } diff --git a/src/options.rs b/src/options.rs index 9f229f6676..6d06ad3b2f 100644 --- a/src/options.rs +++ b/src/options.rs @@ -112,7 +112,7 @@ pub fn builder_from_flags .long("generate") .help("Generate a given kind of items, split by commas. \ Valid values are \"functions\",\"types\", \"vars\", \ - \"methods\" and \"constructors\".") + \"methods\", \"constructors\" and \"destructors\".") .takes_value(true), Arg::with_name("ignore-methods") .long("ignore-methods") @@ -272,6 +272,7 @@ pub fn builder_from_flags "vars" => config.vars = true, "methods" => config.methods = true, "constructors" => config.constructors = true, + "destructors" => config.destructors = true, _ => { return Err(Error::new(ErrorKind::Other, "Unknown generate item")); diff --git a/tests/expectations/tests/gen-destructors.rs b/tests/expectations/tests/gen-destructors.rs new file mode 100644 index 0000000000..14a51d1401 --- /dev/null +++ b/tests/expectations/tests/gen-destructors.rs @@ -0,0 +1,33 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default)] +pub struct Foo { + pub bar: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Foo ) ) . bar as * const _ as usize } , + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Foo ) , "::" , + stringify ! ( bar ) )); +} +extern "C" { + #[link_name = "_ZN3FooD1Ev"] + pub fn Foo_Foo_destructor(this: *mut Foo); +} +impl Foo { + #[inline] + pub unsafe fn __bindgen_destructor__(&mut self) { + Foo_Foo_destructor(&mut *self) + } +} diff --git a/tests/headers/gen-destructors.hpp b/tests/headers/gen-destructors.hpp new file mode 100644 index 0000000000..719eb248a9 --- /dev/null +++ b/tests/headers/gen-destructors.hpp @@ -0,0 +1,7 @@ +// bindgen-flags: --generate types,destructors,functions + +class Foo { + int bar; + public: + ~Foo(); +}; From ebcd36954fbdc090a5007196b6658c20b8a048ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 3 Apr 2017 13:22:01 +0200 Subject: [PATCH 0424/2291] codegen: Rename the destructor methods to "destruct". --- src/codegen/mod.rs | 2 +- tests/expectations/tests/gen-destructors.rs | 4 +--- tests/expectations/tests/public-dtor.rs | 2 +- tests/expectations/tests/union_dtor.rs | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 6d9af09b2b..72c03c3746 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1720,7 +1720,7 @@ impl MethodCodegen for Method { let signature_item = ctx.resolve_item(function.signature()); let mut name = match self.kind() { MethodKind::Constructor => "new".into(), - MethodKind::Destructor => "__bindgen_destructor__".into(), + MethodKind::Destructor => "destruct".into(), _ => function.name().to_owned(), }; diff --git a/tests/expectations/tests/gen-destructors.rs b/tests/expectations/tests/gen-destructors.rs index 14a51d1401..4bbc839391 100644 --- a/tests/expectations/tests/gen-destructors.rs +++ b/tests/expectations/tests/gen-destructors.rs @@ -27,7 +27,5 @@ extern "C" { } impl Foo { #[inline] - pub unsafe fn __bindgen_destructor__(&mut self) { - Foo_Foo_destructor(&mut *self) - } + pub unsafe fn destruct(&mut self) { Foo_Foo_destructor(&mut *self) } } diff --git a/tests/expectations/tests/public-dtor.rs b/tests/expectations/tests/public-dtor.rs index 0412b9f4b7..519cdf6734 100644 --- a/tests/expectations/tests/public-dtor.rs +++ b/tests/expectations/tests/public-dtor.rs @@ -22,7 +22,7 @@ extern "C" { } impl cv_String { #[inline] - pub unsafe fn __bindgen_destructor__(&mut self) { + pub unsafe fn destruct(&mut self) { cv_String_String_destructor(&mut *self) } } diff --git a/tests/expectations/tests/union_dtor.rs b/tests/expectations/tests/union_dtor.rs index 1bcb45b672..af9a8c041b 100644 --- a/tests/expectations/tests/union_dtor.rs +++ b/tests/expectations/tests/union_dtor.rs @@ -58,7 +58,7 @@ extern "C" { } impl UnionWithDtor { #[inline] - pub unsafe fn __bindgen_destructor__(&mut self) { + pub unsafe fn destruct(&mut self) { UnionWithDtor_UnionWithDtor_destructor(&mut *self) } } From 7aed4bab534c39c3c218d2fe54d6f86be07aac52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 3 Apr 2017 13:33:21 +0200 Subject: [PATCH 0425/2291] codegen: Add integration tests for destructors. --- bindgen-integration/cpp/Test.cc | 11 ++++++++++- bindgen-integration/cpp/Test.h | 8 ++++++++ bindgen-integration/src/lib.rs | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/bindgen-integration/cpp/Test.cc b/bindgen-integration/cpp/Test.cc index 1d9624069c..7b0ec4addd 100644 --- a/bindgen-integration/cpp/Test.cc +++ b/bindgen-integration/cpp/Test.cc @@ -21,6 +21,15 @@ Test::Test(double foo) , m_double(foo) {} +AutoRestoreBool::AutoRestoreBool(bool* ptr) + : m_ptr(ptr) + , m_value(*ptr) +{} + +AutoRestoreBool::~AutoRestoreBool() { + *m_ptr = m_value; +} + namespace bitfields { bool @@ -47,4 +56,4 @@ Third::assert(int first, bool second, ItemKind third) kind == third; } -} +} // namespace bitfields diff --git a/bindgen-integration/cpp/Test.h b/bindgen-integration/cpp/Test.h index 310478bbf4..01c7aea1c7 100644 --- a/bindgen-integration/cpp/Test.h +++ b/bindgen-integration/cpp/Test.h @@ -64,3 +64,11 @@ struct Third { }; } // namespace bitfields + +struct AutoRestoreBool { + bool* m_ptr; + bool m_value; + + AutoRestoreBool(bool*); + ~AutoRestoreBool(); +}; diff --git a/bindgen-integration/src/lib.rs b/bindgen-integration/src/lib.rs index 8d7eb75379..be3c84518b 100755 --- a/bindgen-integration/src/lib.rs +++ b/bindgen-integration/src/lib.rs @@ -101,3 +101,21 @@ fn test_bitfields_third() { bindings::bitfields::ItemKind::ITEM_KIND_TRES) }); } + +impl Drop for bindings::AutoRestoreBool { + fn drop(&mut self) { + unsafe { bindings::AutoRestoreBool::destruct(self) } + } +} + +#[test] +fn test_destructors() { + let mut v = true; + + { + let auto_restore = unsafe { bindings::AutoRestoreBool::new(&mut v) }; + v = false; + } + + assert!(v, "Should've been restored when going out of scope"); +} From a4e606bff0d3a04d24b6109ac94aae5b7d93e102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 3 Apr 2017 13:43:57 +0200 Subject: [PATCH 0426/2291] codegen: Simplify method implementations. --- src/codegen/mod.rs | 6 +----- tests/expectations/tests/bitfield-method-same-name.rs | 6 +++--- tests/expectations/tests/class.rs | 6 +++--- tests/expectations/tests/class_with_typedef.rs | 8 ++++---- tests/expectations/tests/gen-destructors.rs | 2 +- tests/expectations/tests/issue-410.rs | 2 +- tests/expectations/tests/method-mangling.rs | 4 +--- tests/expectations/tests/namespace.rs | 2 +- tests/expectations/tests/public-dtor.rs | 4 +--- tests/expectations/tests/union_dtor.rs | 2 +- 10 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 72c03c3746..5586c146d3 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1821,11 +1821,7 @@ impl MethodCodegen for Method { exprs[0] = quote_expr!(ctx.ext_cx(), &mut __bindgen_tmp); } else if !self.is_static() { assert!(!exprs.is_empty()); - exprs[0] = if self.is_const() { - quote_expr!(ctx.ext_cx(), &*self) - } else { - quote_expr!(ctx.ext_cx(), &mut *self) - }; + exprs[0] = quote_expr!(ctx.ext_cx(), self); }; let call = aster::expr::ExprBuilder::new() diff --git a/tests/expectations/tests/bitfield-method-same-name.rs b/tests/expectations/tests/bitfield-method-same-name.rs index 9222f74d11..e180153b79 100644 --- a/tests/expectations/tests/bitfield-method-same-name.rs +++ b/tests/expectations/tests/bitfield-method-same-name.rs @@ -54,14 +54,14 @@ impl Foo { } #[inline] pub unsafe fn type_(&mut self) -> ::std::os::raw::c_schar { - Foo_type(&mut *self) + Foo_type(self) } #[inline] pub unsafe fn set_type_(&mut self, c: ::std::os::raw::c_schar) { - Foo_set_type_(&mut *self, c) + Foo_set_type_(self, c) } #[inline] pub unsafe fn set_type(&mut self, c: ::std::os::raw::c_schar) { - Foo_set_type(&mut *self, c) + Foo_set_type(self, c) } } diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index 3ed5edd243..edb2697b52 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -283,14 +283,14 @@ impl Clone for RealAbstractionWithTonsOfMethods { } impl RealAbstractionWithTonsOfMethods { #[inline] - pub unsafe fn bar(&self) { RealAbstractionWithTonsOfMethods_bar(&*self) } + pub unsafe fn bar(&self) { RealAbstractionWithTonsOfMethods_bar(self) } #[inline] pub unsafe fn bar1(&mut self) { - RealAbstractionWithTonsOfMethods_bar1(&mut *self) + RealAbstractionWithTonsOfMethods_bar1(self) } #[inline] pub unsafe fn bar2(&mut self, foo: ::std::os::raw::c_int) { - RealAbstractionWithTonsOfMethods_bar2(&mut *self, foo) + RealAbstractionWithTonsOfMethods_bar2(self, foo) } #[inline] pub unsafe fn sta() { RealAbstractionWithTonsOfMethods_sta() } diff --git a/tests/expectations/tests/class_with_typedef.rs b/tests/expectations/tests/class_with_typedef.rs index 03822233ff..e962992dc9 100644 --- a/tests/expectations/tests/class_with_typedef.rs +++ b/tests/expectations/tests/class_with_typedef.rs @@ -70,18 +70,18 @@ impl Default for C { } impl C { #[inline] - pub unsafe fn method(&mut self, c: C_MyInt) { C_method(&mut *self, c) } + pub unsafe fn method(&mut self, c: C_MyInt) { C_method(self, c) } #[inline] pub unsafe fn methodRef(&mut self, c: *mut C_MyInt) { - C_methodRef(&mut *self, c) + C_methodRef(self, c) } #[inline] pub unsafe fn complexMethodRef(&mut self, c: *mut C_Lookup) { - C_complexMethodRef(&mut *self, c) + C_complexMethodRef(self, c) } #[inline] pub unsafe fn anotherMethod(&mut self, c: AnotherInt) { - C_anotherMethod(&mut *self, c) + C_anotherMethod(self, c) } } #[repr(C)] diff --git a/tests/expectations/tests/gen-destructors.rs b/tests/expectations/tests/gen-destructors.rs index 4bbc839391..7ec13b03d6 100644 --- a/tests/expectations/tests/gen-destructors.rs +++ b/tests/expectations/tests/gen-destructors.rs @@ -27,5 +27,5 @@ extern "C" { } impl Foo { #[inline] - pub unsafe fn destruct(&mut self) { Foo_Foo_destructor(&mut *self) } + pub unsafe fn destruct(&mut self) { Foo_Foo_destructor(self) } } diff --git a/tests/expectations/tests/issue-410.rs b/tests/expectations/tests/issue-410.rs index 1f624fec7b..8833ef4e51 100644 --- a/tests/expectations/tests/issue-410.rs +++ b/tests/expectations/tests/issue-410.rs @@ -34,7 +34,7 @@ pub mod root { impl Value { #[inline] pub unsafe fn a(&mut self, arg1: root::JSWhyMagic) { - Value_a(&mut *self, arg1) + Value_a(self, arg1) } } } diff --git a/tests/expectations/tests/method-mangling.rs b/tests/expectations/tests/method-mangling.rs index 23f1228018..360f0ea7de 100644 --- a/tests/expectations/tests/method-mangling.rs +++ b/tests/expectations/tests/method-mangling.rs @@ -25,7 +25,5 @@ impl Clone for Foo { } impl Foo { #[inline] - pub unsafe fn type_(&mut self) -> ::std::os::raw::c_int { - Foo_type(&mut *self) - } + pub unsafe fn type_(&mut self) -> ::std::os::raw::c_int { Foo_type(self) } } diff --git a/tests/expectations/tests/namespace.rs b/tests/expectations/tests/namespace.rs index 21b5a58b7a..8e64fa2237 100644 --- a/tests/expectations/tests/namespace.rs +++ b/tests/expectations/tests/namespace.rs @@ -58,7 +58,7 @@ pub mod root { #[inline] pub unsafe fn lets_hope_this_works(&mut self) -> ::std::os::raw::c_int { - A_lets_hope_this_works(&mut *self) + A_lets_hope_this_works(self) } } } diff --git a/tests/expectations/tests/public-dtor.rs b/tests/expectations/tests/public-dtor.rs index 519cdf6734..d24e863e4a 100644 --- a/tests/expectations/tests/public-dtor.rs +++ b/tests/expectations/tests/public-dtor.rs @@ -22,7 +22,5 @@ extern "C" { } impl cv_String { #[inline] - pub unsafe fn destruct(&mut self) { - cv_String_String_destructor(&mut *self) - } + pub unsafe fn destruct(&mut self) { cv_String_String_destructor(self) } } diff --git a/tests/expectations/tests/union_dtor.rs b/tests/expectations/tests/union_dtor.rs index af9a8c041b..61fb0380f7 100644 --- a/tests/expectations/tests/union_dtor.rs +++ b/tests/expectations/tests/union_dtor.rs @@ -59,6 +59,6 @@ extern "C" { impl UnionWithDtor { #[inline] pub unsafe fn destruct(&mut self) { - UnionWithDtor_UnionWithDtor_destructor(&mut *self) + UnionWithDtor_UnionWithDtor_destructor(self) } } From 0dc7bcdbbad5d4e99310c213d261aed2c53c4863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 4 Apr 2017 01:04:46 +0200 Subject: [PATCH 0427/2291] tests: Add negative tests for constructor/destructor generation behavior. --- .../tests/gen-constructors-neg.rs | 21 +++++++++++++++++ .../expectations/tests/gen-destructors-neg.rs | 23 +++++++++++++++++++ tests/headers/gen-constructors-neg.hpp | 6 +++++ tests/headers/gen-destructors-neg.hpp | 9 ++++++++ 4 files changed, 59 insertions(+) create mode 100644 tests/expectations/tests/gen-constructors-neg.rs create mode 100644 tests/expectations/tests/gen-destructors-neg.rs create mode 100644 tests/headers/gen-constructors-neg.hpp create mode 100644 tests/headers/gen-destructors-neg.hpp diff --git a/tests/expectations/tests/gen-constructors-neg.rs b/tests/expectations/tests/gen-constructors-neg.rs new file mode 100644 index 0000000000..fbeb3d5e52 --- /dev/null +++ b/tests/expectations/tests/gen-constructors-neg.rs @@ -0,0 +1,21 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct Foo { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); +} +impl Clone for Foo { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/gen-destructors-neg.rs b/tests/expectations/tests/gen-destructors-neg.rs new file mode 100644 index 0000000000..4aaec83a39 --- /dev/null +++ b/tests/expectations/tests/gen-destructors-neg.rs @@ -0,0 +1,23 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default)] +pub struct Foo { + pub bar: ::std::os::raw::c_int, +} +#[test] +fn bindgen_test_layout_Foo() { + assert_eq!(::std::mem::size_of::() , 4usize , concat ! ( + "Size of: " , stringify ! ( Foo ) )); + assert_eq! (::std::mem::align_of::() , 4usize , concat ! ( + "Alignment of " , stringify ! ( Foo ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Foo ) ) . bar as * const _ as usize } , + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Foo ) , "::" , + stringify ! ( bar ) )); +} diff --git a/tests/headers/gen-constructors-neg.hpp b/tests/headers/gen-constructors-neg.hpp new file mode 100644 index 0000000000..2dd491c4fd --- /dev/null +++ b/tests/headers/gen-constructors-neg.hpp @@ -0,0 +1,6 @@ +// bindgen-flags: --generate types,functions + +class Foo { + public: + Foo(int a); +}; diff --git a/tests/headers/gen-destructors-neg.hpp b/tests/headers/gen-destructors-neg.hpp new file mode 100644 index 0000000000..5ede3ba357 --- /dev/null +++ b/tests/headers/gen-destructors-neg.hpp @@ -0,0 +1,9 @@ +// bindgen-flags: --generate types,functions +// +// NB: This is intended to _not_ generate destructors. + +class Foo { + int bar; + public: + ~Foo(); +}; From 1f53966ee6b872b7443b335a84d9cf1b57394f13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 4 Apr 2017 01:10:45 +0200 Subject: [PATCH 0428/2291] ir: Add a note about cpp_demangle. --- src/ir/function.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ir/function.rs b/src/ir/function.rs index f80a573615..0809b3c28e 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -156,6 +156,9 @@ pub fn cursor_mangling(ctx: &BindgenContext, // FIXME(emilio): Can a legit symbol in other ABIs end with this string? // I don't think so, but if it can this would become a linker error // anyway, not an invalid free at runtime. + // + // TODO(emilio, #611): Use cpp_demangle if this becomes nastier with + // time. if mangling.ends_with("D0Ev") { let new_len = mangling.len() - 4; mangling.truncate(new_len); From 87b3f382f7b9c8d5e788a7e3b45b58706183a614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 4 Apr 2017 00:52:49 +0200 Subject: [PATCH 0429/2291] ir: Handle char in a more cross-platform way when possible. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Emilio Cobos Álvarez --- src/codegen/mod.rs | 3 +- src/ir/context.rs | 34 ++++++- src/ir/int.rs | 16 +++- .../tests/anonymous-template-types.rs | 6 +- tests/expectations/tests/arg_keyword.rs | 2 +- .../tests/bitfield-method-same-name.rs | 16 ++-- tests/expectations/tests/char.rs | 95 +++++++++++++++++++ tests/expectations/tests/class.rs | 16 ++-- .../expectations/tests/class_with_typedef.rs | 2 +- tests/expectations/tests/constant-evaluate.rs | 4 +- .../tests/inline_namespace_whitelist.rs | 2 +- tests/expectations/tests/issue-493.rs | 2 +- tests/expectations/tests/layout.rs | 2 +- tests/expectations/tests/layout_array.rs | 2 +- .../tests/layout_cmdline_token.rs | 6 +- tests/expectations/tests/layout_kni_mbuf.rs | 10 +- tests/expectations/tests/objc_class_method.rs | 4 +- tests/expectations/tests/objc_method.rs | 4 +- tests/expectations/tests/overloading.rs | 2 +- .../expectations/tests/struct_with_packing.rs | 2 +- .../tests/template-param-usage-7.rs | 2 +- .../tests/union_with_big_member.rs | 2 +- tests/expectations/tests/variadic-method.rs | 4 +- tests/headers/char.h | 19 ++++ tests/tests.rs | 2 +- 25 files changed, 206 insertions(+), 53 deletions(-) create mode 100644 tests/expectations/tests/char.rs create mode 100644 tests/headers/char.h diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 5586c146d3..ee4a9d4e78 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2471,7 +2471,8 @@ impl TryToRustTy for Type { TypeKind::Int(ik) => { match ik { IntKind::Bool => Ok(aster::ty::TyBuilder::new().bool()), - IntKind::Char => Ok(raw_type(ctx, "c_schar")), + IntKind::Char { .. } => Ok(raw_type(ctx, "c_char")), + IntKind::SChar => Ok(raw_type(ctx, "c_schar")), IntKind::UChar => Ok(raw_type(ctx, "c_uchar")), IntKind::Short => Ok(raw_type(ctx, "c_short")), IntKind::UShort => Ok(raw_type(ctx, "c_ushort")), diff --git a/src/ir/context.rs b/src/ir/context.rs index c95d517918..66e7e28482 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -1090,8 +1090,38 @@ impl<'ctx> BindgenContext<'ctx> { CXType_Bool => TypeKind::Int(IntKind::Bool), CXType_Int => TypeKind::Int(IntKind::Int), CXType_UInt => TypeKind::Int(IntKind::UInt), - CXType_SChar | CXType_Char_S => TypeKind::Int(IntKind::Char), - CXType_UChar | CXType_Char_U => TypeKind::Int(IntKind::UChar), + CXType_SChar | CXType_Char_S | + CXType_UChar | CXType_Char_U => { + let spelling = ty.spelling(); + + debug_assert!(spelling.contains("char"), + "This is the canonical type, so no aliases or \ + typedefs!"); + + let signed = match ty.kind() { + CXType_SChar | CXType_Char_S => true, + _ => false, + }; + + // Clang only gives us the signedness of the target platform. + // + // Match the spelling for common cases we can handle + // cross-platform. + match &*spelling { + "char" | "const char" => { + TypeKind::Int(IntKind::Char { + is_signed: signed, + }) + }, + _ => { + if signed { + TypeKind::Int(IntKind::SChar) + } else { + TypeKind::Int(IntKind::UChar) + } + }, + } + } CXType_Short => TypeKind::Int(IntKind::Short), CXType_UShort => TypeKind::Int(IntKind::UShort), CXType_WChar | CXType_Char16 => TypeKind::Int(IntKind::U16), diff --git a/src/ir/int.rs b/src/ir/int.rs index 89068e0fab..a4cb8bc77d 100644 --- a/src/ir/int.rs +++ b/src/ir/int.rs @@ -6,12 +6,18 @@ pub enum IntKind { /// A `bool`. Bool, - /// A `char`. - Char, + /// A `signed char`. + SChar, /// An `unsigned char`. UChar, + /// A platform-dependent `char` type, with the signedness support. + Char { + /// Whether the char is signed for the target platform. + is_signed: bool, + }, + /// A `short`. Short, @@ -84,9 +90,11 @@ impl IntKind { Bool | UChar | UShort | UInt | ULong | ULongLong | U8 | U16 | U32 | U64 | U128 => false, - Char | Short | Int | Long | LongLong | I8 | I16 | I32 | I64 | + SChar | Short | Int | Long | LongLong | I8 | I16 | I32 | I64 | I128 => true, + Char { is_signed } => is_signed, + Custom { is_signed, .. } => is_signed, } } @@ -97,7 +105,7 @@ impl IntKind { pub fn known_size(&self) -> Option { use self::IntKind::*; Some(match *self { - Bool | UChar | Char | U8 | I8 => 1, + Bool | UChar | SChar | U8 | I8 | Char { .. } => 1, U16 | I16 => 2, U32 | I32 => 4, U64 | I64 => 8, diff --git a/tests/expectations/tests/anonymous-template-types.rs b/tests/expectations/tests/anonymous-template-types.rs index bb4be1055a..c225b69d27 100644 --- a/tests/expectations/tests/anonymous-template-types.rs +++ b/tests/expectations/tests/anonymous-template-types.rs @@ -15,7 +15,7 @@ impl Default for Foo { #[repr(C)] #[derive(Debug, Default, Copy, Clone)] pub struct Bar { - pub member: ::std::os::raw::c_schar, + pub member: ::std::os::raw::c_char, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -28,6 +28,6 @@ impl Default for Quux { #[repr(C)] #[derive(Debug, Default, Copy, Clone)] pub struct Lobo { - pub also_member: ::std::os::raw::c_schar, + pub also_member: ::std::os::raw::c_char, } -pub type AliasWithAnonType = ::std::os::raw::c_schar; +pub type AliasWithAnonType = ::std::os::raw::c_char; diff --git a/tests/expectations/tests/arg_keyword.rs b/tests/expectations/tests/arg_keyword.rs index 23818328c4..cb1cc4327a 100644 --- a/tests/expectations/tests/arg_keyword.rs +++ b/tests/expectations/tests/arg_keyword.rs @@ -6,5 +6,5 @@ extern "C" { #[link_name = "_Z3fooPKc"] - pub fn foo(type_: *const ::std::os::raw::c_schar); + pub fn foo(type_: *const ::std::os::raw::c_char); } diff --git a/tests/expectations/tests/bitfield-method-same-name.rs b/tests/expectations/tests/bitfield-method-same-name.rs index e180153b79..ab74b1e5cc 100644 --- a/tests/expectations/tests/bitfield-method-same-name.rs +++ b/tests/expectations/tests/bitfield-method-same-name.rs @@ -19,22 +19,22 @@ fn bindgen_test_layout_Foo() { } extern "C" { #[link_name = "_ZN3Foo4typeEv"] - pub fn Foo_type(this: *mut Foo) -> ::std::os::raw::c_schar; + pub fn Foo_type(this: *mut Foo) -> ::std::os::raw::c_char; } extern "C" { #[link_name = "_ZN3Foo9set_type_Ec"] - pub fn Foo_set_type_(this: *mut Foo, c: ::std::os::raw::c_schar); + pub fn Foo_set_type_(this: *mut Foo, c: ::std::os::raw::c_char); } extern "C" { #[link_name = "_ZN3Foo8set_typeEc"] - pub fn Foo_set_type(this: *mut Foo, c: ::std::os::raw::c_schar); + pub fn Foo_set_type(this: *mut Foo, c: ::std::os::raw::c_char); } impl Clone for Foo { fn clone(&self) -> Self { *self } } impl Foo { #[inline] - pub fn type__bindgen_bitfield(&self) -> ::std::os::raw::c_schar { + pub fn type__bindgen_bitfield(&self) -> ::std::os::raw::c_char { let mask = 7usize as u8; let field_val: u8 = unsafe { ::std::mem::transmute(self._bitfield_1) }; @@ -43,7 +43,7 @@ impl Foo { } #[inline] pub fn set_type__bindgen_bitfield(&mut self, - val: ::std::os::raw::c_schar) { + val: ::std::os::raw::c_char) { let mask = 7usize as u8; let val = val as u8 as u8; let mut field_val: u8 = @@ -53,15 +53,15 @@ impl Foo { self._bitfield_1 = unsafe { ::std::mem::transmute(field_val) }; } #[inline] - pub unsafe fn type_(&mut self) -> ::std::os::raw::c_schar { + pub unsafe fn type_(&mut self) -> ::std::os::raw::c_char { Foo_type(self) } #[inline] - pub unsafe fn set_type_(&mut self, c: ::std::os::raw::c_schar) { + pub unsafe fn set_type_(&mut self, c: ::std::os::raw::c_char) { Foo_set_type_(self, c) } #[inline] - pub unsafe fn set_type(&mut self, c: ::std::os::raw::c_schar) { + pub unsafe fn set_type(&mut self, c: ::std::os::raw::c_char) { Foo_set_type(self, c) } } diff --git a/tests/expectations/tests/char.rs b/tests/expectations/tests/char.rs new file mode 100644 index 0000000000..5541d492c4 --- /dev/null +++ b/tests/expectations/tests/char.rs @@ -0,0 +1,95 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub type Char = ::std::os::raw::c_char; +pub type SChar = ::std::os::raw::c_schar; +pub type UChar = ::std::os::raw::c_uchar; +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct Test { + pub ch: ::std::os::raw::c_char, + pub u: ::std::os::raw::c_uchar, + pub d: ::std::os::raw::c_schar, + pub cch: ::std::os::raw::c_char, + pub cu: ::std::os::raw::c_uchar, + pub cd: ::std::os::raw::c_schar, + pub Cch: Char, + pub Cu: UChar, + pub Cd: SChar, + pub Ccch: Char, + pub Ccu: UChar, + pub Ccd: SChar, +} +#[test] +fn bindgen_test_layout_Test() { + assert_eq!(::std::mem::size_of::() , 12usize , concat ! ( + "Size of: " , stringify ! ( Test ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( Test ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . ch as * const _ as usize } , + 0usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( ch ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . u as * const _ as usize } , + 1usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( u ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . d as * const _ as usize } , + 2usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( d ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . cch as * const _ as usize } , + 3usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( cch ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . cu as * const _ as usize } , + 4usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( cu ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . cd as * const _ as usize } , + 5usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( cd ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . Cch as * const _ as usize } , + 6usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( Cch ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . Cu as * const _ as usize } , + 7usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( Cu ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . Cd as * const _ as usize } , + 8usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( Cd ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . Ccch as * const _ as usize } , + 9usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( Ccch ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . Ccu as * const _ as usize } , + 10usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( Ccu ) )); + assert_eq! (unsafe { + & ( * ( 0 as * const Test ) ) . Ccd as * const _ as usize } , + 11usize , concat ! ( + "Alignment of field: " , stringify ! ( Test ) , "::" , + stringify ! ( Ccd ) )); +} +impl Clone for Test { + fn clone(&self) -> Self { *self } +} diff --git a/tests/expectations/tests/class.rs b/tests/expectations/tests/class.rs index edb2697b52..56353a5e3a 100644 --- a/tests/expectations/tests/class.rs +++ b/tests/expectations/tests/class.rs @@ -64,7 +64,7 @@ impl ::std::fmt::Debug for __BindgenUnionField { #[repr(C)] pub struct C { pub a: ::std::os::raw::c_int, - pub big_array: [::std::os::raw::c_schar; 33usize], + pub big_array: [::std::os::raw::c_char; 33usize], } #[test] fn bindgen_test_layout_C() { @@ -88,8 +88,8 @@ impl Default for C { #[repr(C)] pub struct C_with_zero_length_array { pub a: ::std::os::raw::c_int, - pub big_array: [::std::os::raw::c_schar; 33usize], - pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_schar>, + pub big_array: [::std::os::raw::c_char; 33usize], + pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>, } #[test] fn bindgen_test_layout_C_with_zero_length_array() { @@ -124,8 +124,8 @@ impl Default for C_with_zero_length_array { #[repr(C)] pub struct C_with_incomplete_array { pub a: ::std::os::raw::c_int, - pub big_array: [::std::os::raw::c_schar; 33usize], - pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_schar>, + pub big_array: [::std::os::raw::c_char; 33usize], + pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>, } #[test] fn bindgen_test_layout_C_with_incomplete_array() { @@ -142,9 +142,9 @@ impl Default for C_with_incomplete_array { #[repr(C)] pub struct C_with_zero_length_array_and_incomplete_array { pub a: ::std::os::raw::c_int, - pub big_array: [::std::os::raw::c_schar; 33usize], - pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_schar>, - pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_schar>, + pub big_array: [::std::os::raw::c_char; 33usize], + pub zero_length_array: __IncompleteArrayField<::std::os::raw::c_char>, + pub incomplete_array: __IncompleteArrayField<::std::os::raw::c_char>, } #[test] fn bindgen_test_layout_C_with_zero_length_array_and_incomplete_array() { diff --git a/tests/expectations/tests/class_with_typedef.rs b/tests/expectations/tests/class_with_typedef.rs index e962992dc9..642a72875f 100644 --- a/tests/expectations/tests/class_with_typedef.rs +++ b/tests/expectations/tests/class_with_typedef.rs @@ -15,7 +15,7 @@ pub struct C { pub other_ptr: *mut AnotherInt, } pub type C_MyInt = ::std::os::raw::c_int; -pub type C_Lookup = *const ::std::os::raw::c_schar; +pub type C_Lookup = *const ::std::os::raw::c_char; #[test] fn bindgen_test_layout_C() { assert_eq!(::std::mem::size_of::() , 72usize , concat ! ( diff --git a/tests/expectations/tests/constant-evaluate.rs b/tests/expectations/tests/constant-evaluate.rs index ae0570ea7f..cdf097a2d8 100644 --- a/tests/expectations/tests/constant-evaluate.rs +++ b/tests/expectations/tests/constant-evaluate.rs @@ -14,7 +14,7 @@ pub const k: EasyToOverflow = 2147483648; pub const k_expr: EasyToOverflow = 0; pub const BAZ: ::std::os::raw::c_longlong = 24; pub const fuzz: f64 = 51.; -pub const BAZZ: ::std::os::raw::c_schar = 53; -pub const WAT: ::std::os::raw::c_schar = 0; +pub const BAZZ: ::std::os::raw::c_char = 53; +pub const WAT: ::std::os::raw::c_char = 0; pub const bytestring: &'static [u8; 4usize] = b"Foo\x00"; pub const NOT_UTF8: [u8; 5usize] = [240, 40, 140, 40, 0]; diff --git a/tests/expectations/tests/inline_namespace_whitelist.rs b/tests/expectations/tests/inline_namespace_whitelist.rs index d4a5aaff51..9601268471 100644 --- a/tests/expectations/tests/inline_namespace_whitelist.rs +++ b/tests/expectations/tests/inline_namespace_whitelist.rs @@ -11,6 +11,6 @@ pub mod root { pub mod std { #[allow(unused_imports)] use self::super::super::root; - pub type string = *const ::std::os::raw::c_schar; + pub type string = *const ::std::os::raw::c_char; } } diff --git a/tests/expectations/tests/issue-493.rs b/tests/expectations/tests/issue-493.rs index 155834a304..04fa1d8cc5 100644 --- a/tests/expectations/tests/issue-493.rs +++ b/tests/expectations/tests/issue-493.rs @@ -34,7 +34,7 @@ pub struct basic_string { pub _address: u8, } pub type basic_string_size_type = ::std::os::raw::c_ulonglong; -pub type basic_string_value_type = ::std::os::raw::c_schar; +pub type basic_string_value_type = ::std::os::raw::c_char; pub type basic_string_pointer = *mut basic_string_value_type; #[repr(C)] #[derive(Debug, Copy, Clone)] diff --git a/tests/expectations/tests/layout.rs b/tests/expectations/tests/layout.rs index d074867284..115a108a2e 100644 --- a/tests/expectations/tests/layout.rs +++ b/tests/expectations/tests/layout.rs @@ -40,7 +40,7 @@ impl ::std::marker::Copy for __IncompleteArrayField { } #[repr(C, packed)] #[derive(Debug, Default, Copy)] pub struct header { - pub proto: ::std::os::raw::c_schar, + pub proto: ::std::os::raw::c_char, pub size: ::std::os::raw::c_uint, pub data: __IncompleteArrayField<::std::os::raw::c_uchar>, pub __bindgen_padding_0: [u8; 11usize], diff --git a/tests/expectations/tests/layout_array.rs b/tests/expectations/tests/layout_array.rs index eedc32b274..2cc8578519 100644 --- a/tests/expectations/tests/layout_array.rs +++ b/tests/expectations/tests/layout_array.rs @@ -58,7 +58,7 @@ pub type rte_mempool_get_count = #[derive(Debug, Copy)] pub struct rte_mempool_ops { /**< Name of mempool ops struct. */ - pub name: [::std::os::raw::c_schar; 32usize], + pub name: [::std::os::raw::c_char; 32usize], /**< Allocate private data. */ pub alloc: rte_mempool_alloc_t, /**< Free the external pool. */ diff --git a/tests/expectations/tests/layout_cmdline_token.rs b/tests/expectations/tests/layout_cmdline_token.rs index c2b10455c3..791ea9b3e2 100644 --- a/tests/expectations/tests/layout_cmdline_token.rs +++ b/tests/expectations/tests/layout_cmdline_token.rs @@ -64,7 +64,7 @@ pub struct cmdline_token_ops { pub parse: ::std::option::Option ::std::os::raw::c_int>, @@ -88,7 +88,7 @@ pub struct cmdline_token_ops { pub get_help: ::std::option::Option ::std::os::raw::c_int>, diff --git a/tests/expectations/tests/layout_kni_mbuf.rs b/tests/expectations/tests/layout_kni_mbuf.rs index 209be0f129..d704267dee 100644 --- a/tests/expectations/tests/layout_kni_mbuf.rs +++ b/tests/expectations/tests/layout_kni_mbuf.rs @@ -11,22 +11,22 @@ pub const RTE_CACHE_LINE_SIZE: ::std::os::raw::c_uint = 64; pub struct rte_kni_mbuf { pub buf_addr: *mut ::std::os::raw::c_void, pub buf_physaddr: u64, - pub pad0: [::std::os::raw::c_schar; 2usize], + pub pad0: [::std::os::raw::c_char; 2usize], /**< Start address of data in segment buffer. */ pub data_off: u16, - pub pad1: [::std::os::raw::c_schar; 2usize], + pub pad1: [::std::os::raw::c_char; 2usize], /**< Number of segments. */ pub nb_segs: u8, - pub pad4: [::std::os::raw::c_schar; 1usize], + pub pad4: [::std::os::raw::c_char; 1usize], /**< Offload features. */ pub ol_flags: u64, - pub pad2: [::std::os::raw::c_schar; 4usize], + pub pad2: [::std::os::raw::c_char; 4usize], /**< Total pkt len: sum of all segment data_len. */ pub pkt_len: u32, /**< Amount of data in segment buffer. */ pub data_len: u16, pub __bindgen_padding_0: [u8; 22usize], - pub pad3: [::std::os::raw::c_schar; 8usize], + pub pad3: [::std::os::raw::c_char; 8usize], pub pool: *mut ::std::os::raw::c_void, pub next: *mut ::std::os::raw::c_void, pub __bindgen_padding_1: [u64; 5usize], diff --git a/tests/expectations/tests/objc_class_method.rs b/tests/expectations/tests/objc_class_method.rs index 768abe1070..699f5619a5 100644 --- a/tests/expectations/tests/objc_class_method.rs +++ b/tests/expectations/tests/objc_class_method.rs @@ -19,7 +19,7 @@ pub trait Foo { -> *mut id; unsafe fn methodWithArg1_andArg2_andArg3_(intvalue: ::std::os::raw::c_int, ptr: - *mut ::std::os::raw::c_schar, + *mut ::std::os::raw::c_char, floatvalue: f32); } impl Foo for id { @@ -45,7 +45,7 @@ impl Foo for id { } unsafe fn methodWithArg1_andArg2_andArg3_(intvalue: ::std::os::raw::c_int, ptr: - *mut ::std::os::raw::c_schar, + *mut ::std::os::raw::c_char, floatvalue: f32) { msg_send!(objc :: runtime :: Class :: get ( "Foo" ) . expect ( "Couldn\'t find Foo" ) , diff --git a/tests/expectations/tests/objc_method.rs b/tests/expectations/tests/objc_method.rs index c9b9504f39..d0342a2129 100644 --- a/tests/expectations/tests/objc_method.rs +++ b/tests/expectations/tests/objc_method.rs @@ -20,7 +20,7 @@ pub trait Foo { unsafe fn methodWithArg1_andArg2_andArg3_(self, intvalue: ::std::os::raw::c_int, ptr: - *mut ::std::os::raw::c_schar, + *mut ::std::os::raw::c_char, floatvalue: f32); } impl Foo for id { @@ -40,7 +40,7 @@ impl Foo for id { unsafe fn methodWithArg1_andArg2_andArg3_(self, intvalue: ::std::os::raw::c_int, ptr: - *mut ::std::os::raw::c_schar, + *mut ::std::os::raw::c_char, floatvalue: f32) { msg_send!(self , methodWithArg1:intvalue andArg2:ptr andArg3:floatvalue ) diff --git a/tests/expectations/tests/overloading.rs b/tests/expectations/tests/overloading.rs index 99efe496d5..71002e23bc 100644 --- a/tests/expectations/tests/overloading.rs +++ b/tests/expectations/tests/overloading.rs @@ -6,7 +6,7 @@ extern "C" { #[link_name = "_Z8Evaluatec"] - pub fn Evaluate(r: ::std::os::raw::c_schar) -> bool; + pub fn Evaluate(r: ::std::os::raw::c_char) -> bool; } extern "C" { #[link_name = "_Z8Evaluateii"] diff --git a/tests/expectations/tests/struct_with_packing.rs b/tests/expectations/tests/struct_with_packing.rs index 293cc5342f..cba3d4759e 100644 --- a/tests/expectations/tests/struct_with_packing.rs +++ b/tests/expectations/tests/struct_with_packing.rs @@ -7,7 +7,7 @@ #[repr(C, packed)] #[derive(Debug, Default, Copy)] pub struct a { - pub b: ::std::os::raw::c_schar, + pub b: ::std::os::raw::c_char, pub c: ::std::os::raw::c_short, } #[test] diff --git a/tests/expectations/tests/template-param-usage-7.rs b/tests/expectations/tests/template-param-usage-7.rs index b0584479a7..2544ffd047 100644 --- a/tests/expectations/tests/template-param-usage-7.rs +++ b/tests/expectations/tests/template-param-usage-7.rs @@ -13,4 +13,4 @@ pub struct DoesNotUseU { impl Default for DoesNotUseU { fn default() -> Self { unsafe { ::std::mem::zeroed() } } } -pub type Alias = DoesNotUseU<::std::os::raw::c_int, ::std::os::raw::c_schar>; +pub type Alias = DoesNotUseU<::std::os::raw::c_int, ::std::os::raw::c_char>; diff --git a/tests/expectations/tests/union_with_big_member.rs b/tests/expectations/tests/union_with_big_member.rs index 0a11b8bc1e..2b7a8eefd3 100644 --- a/tests/expectations/tests/union_with_big_member.rs +++ b/tests/expectations/tests/union_with_big_member.rs @@ -62,7 +62,7 @@ impl Default for WithBigArray { #[derive(Debug, Default, Copy)] pub struct WithBigArray2 { pub a: __BindgenUnionField<::std::os::raw::c_int>, - pub b: __BindgenUnionField<[::std::os::raw::c_schar; 33usize]>, + pub b: __BindgenUnionField<[::std::os::raw::c_char; 33usize]>, pub bindgen_union_field: [u32; 9usize], } #[test] diff --git a/tests/expectations/tests/variadic-method.rs b/tests/expectations/tests/variadic-method.rs index 6241c2cb80..542e1e75b4 100644 --- a/tests/expectations/tests/variadic-method.rs +++ b/tests/expectations/tests/variadic-method.rs @@ -6,7 +6,7 @@ extern "C" { #[link_name = "_Z3fooPKcz"] - pub fn foo(fmt: *const ::std::os::raw::c_schar, ...); + pub fn foo(fmt: *const ::std::os::raw::c_char, ...); } #[repr(C)] #[derive(Debug, Default, Copy)] @@ -22,7 +22,7 @@ fn bindgen_test_layout_Bar() { } extern "C" { #[link_name = "_ZN3Bar3fooEPKcz"] - pub fn Bar_foo(this: *mut Bar, fmt: *const ::std::os::raw::c_schar, ...); + pub fn Bar_foo(this: *mut Bar, fmt: *const ::std::os::raw::c_char, ...); } impl Clone for Bar { fn clone(&self) -> Self { *self } diff --git a/tests/headers/char.h b/tests/headers/char.h new file mode 100644 index 0000000000..ae38653ed1 --- /dev/null +++ b/tests/headers/char.h @@ -0,0 +1,19 @@ +typedef char Char; +typedef signed char SChar; +typedef unsigned char UChar; + +struct Test { + char ch; + unsigned char u; + signed char d; + const char cch; + const unsigned char cu; + const signed char cd; + + Char Cch; + UChar Cu; + SChar Cd; + const Char Ccch; + const UChar Ccu; + const SChar Ccd; +}; diff --git a/tests/tests.rs b/tests/tests.rs index 84b5e076f7..bb965bd7ba 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -156,7 +156,7 @@ fn test_header_contents() { assert_eq!(bindings, "/* automatically generated by rust-bindgen */ extern \"C\" { - pub fn foo(a: *const ::std::os::raw::c_schar) -> ::std::os::raw::c_int; + pub fn foo(a: *const ::std::os::raw::c_char) -> ::std::os::raw::c_int; } "); } From 582aa969c70a69f19d2aedb4c418c32e1c99b3c0 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 3 Apr 2017 17:00:15 -0700 Subject: [PATCH 0430/2291] Fall back to opaque types rather than panicking on parse failure --- src/ir/context.rs | 4 +++- src/ir/item.rs | 9 +++++---- src/ir/ty.rs | 14 ++++++++------ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/ir/context.rs b/src/ir/context.rs index c95d517918..fa001ba6a8 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -424,7 +424,9 @@ impl<'ctx> BindgenContext<'ctx> { for (id, ty, loc, parent_id) in typerefs { let _resolved = { let resolved = Item::from_ty(&ty, loc, parent_id, self) - .expect("What happened?"); + .unwrap_or_else(|_| { + Item::new_opaque_type(self.next_item_id(), &ty, self) + }); let mut item = self.items.get_mut(&id).unwrap(); *item.kind_mut().as_type_mut().unwrap().kind_mut() = diff --git a/src/ir/item.rs b/src/ir/item.rs index 89422e874d..5477dee9dd 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -433,10 +433,11 @@ impl Item { } } - fn new_opaque_type(with_id: ItemId, - ty: &clang::Type, - ctx: &mut BindgenContext) - -> ItemId { + /// Construct a new opaque item type. + pub fn new_opaque_type(with_id: ItemId, + ty: &clang::Type, + ctx: &mut BindgenContext) + -> ItemId { let ty = Opaque::from_clang_ty(ty); let kind = ItemKind::Type(ty); let parent = ctx.root_module(); diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 60d750edbf..a28727c979 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1093,12 +1093,14 @@ impl Type { name = location.spelling(); } - let complex = CompInfo::from_ty(potential_id, - ty, - Some(location), - ctx) - .expect("C'mon"); - TypeKind::Comp(complex) + if let Ok(complex) = CompInfo::from_ty(potential_id, + ty, + Some(location), + ctx) { + TypeKind::Comp(complex) + } else { + return Ok(ParseResult::New(Opaque::from_clang_ty(ty), None)); + } } CXCursor_TypeAliasTemplateDecl => { debug!("TypeAliasTemplateDecl"); From aa04308986cf18d47c5257ee96282d2c8f924562 Mon Sep 17 00:00:00 2001 From: David Hotham Date: Tue, 4 Apr 2017 08:40:06 +0100 Subject: [PATCH 0431/2291] Tidy up handling of char --- src/ir/context.rs | 36 ++++-------------------------------- 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/src/ir/context.rs b/src/ir/context.rs index 66e7e28482..fe079ef0b8 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -1090,38 +1090,10 @@ impl<'ctx> BindgenContext<'ctx> { CXType_Bool => TypeKind::Int(IntKind::Bool), CXType_Int => TypeKind::Int(IntKind::Int), CXType_UInt => TypeKind::Int(IntKind::UInt), - CXType_SChar | CXType_Char_S | - CXType_UChar | CXType_Char_U => { - let spelling = ty.spelling(); - - debug_assert!(spelling.contains("char"), - "This is the canonical type, so no aliases or \ - typedefs!"); - - let signed = match ty.kind() { - CXType_SChar | CXType_Char_S => true, - _ => false, - }; - - // Clang only gives us the signedness of the target platform. - // - // Match the spelling for common cases we can handle - // cross-platform. - match &*spelling { - "char" | "const char" => { - TypeKind::Int(IntKind::Char { - is_signed: signed, - }) - }, - _ => { - if signed { - TypeKind::Int(IntKind::SChar) - } else { - TypeKind::Int(IntKind::UChar) - } - }, - } - } + CXType_Char_S => TypeKind::Int(IntKind::Char { is_signed: true }), + CXType_Char_U => TypeKind::Int(IntKind::Char { is_signed: false }), + CXType_SChar => TypeKind::Int(IntKind::SChar), + CXType_UChar => TypeKind::Int(IntKind::UChar), CXType_Short => TypeKind::Int(IntKind::Short), CXType_UShort => TypeKind::Int(IntKind::UShort), CXType_WChar | CXType_Char16 => TypeKind::Int(IntKind::U16), From f2ef3d1e7e4c4f78ea752538290f96670c68a8db Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 4 Apr 2017 10:13:55 -0700 Subject: [PATCH 0432/2291] Add warning when we fall back to opaque blobs --- src/ir/context.rs | 2 ++ src/ir/ty.rs | 20 +++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/ir/context.rs b/src/ir/context.rs index fa001ba6a8..6c11f7f986 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -425,6 +425,8 @@ impl<'ctx> BindgenContext<'ctx> { let _resolved = { let resolved = Item::from_ty(&ty, loc, parent_id, self) .unwrap_or_else(|_| { + warn!("Could not resolve type reference, falling back \ + to opaque blob"); Item::new_opaque_type(self.next_item_id(), &ty, self) }); let mut item = self.items.get_mut(&id).unwrap(); diff --git a/src/ir/ty.rs b/src/ir/ty.rs index a28727c979..594e4c03e4 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1093,13 +1093,19 @@ impl Type { name = location.spelling(); } - if let Ok(complex) = CompInfo::from_ty(potential_id, - ty, - Some(location), - ctx) { - TypeKind::Comp(complex) - } else { - return Ok(ParseResult::New(Opaque::from_clang_ty(ty), None)); + let complex = CompInfo::from_ty(potential_id, + ty, + Some(location), + ctx); + match complex { + Ok(complex) => TypeKind::Comp(complex), + Err(_) => { + warn!("Could not create complex type \ + from class template or base \ + specifier, using opaque blob"); + let opaque = Opaque::from_clang_ty(ty); + return Ok(ParseResult::New(opaque, None)); + } } } CXCursor_TypeAliasTemplateDecl => { From 9d8c338dcfcab0402d0b10fc0c929ef909ee8164 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Mon, 20 Mar 2017 17:18:34 +1100 Subject: [PATCH 0433/2291] Ignore builtin template when parsing. This should fix #584. --- src/ir/template.rs | 8 ++++++-- src/ir/ty.rs | 5 ++++- tests/expectations/tests/builtin-template.rs | 7 +++++++ tests/headers/builtin-template.hpp | 6 ++++++ 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 tests/expectations/tests/builtin-template.rs create mode 100644 tests/headers/builtin-template.hpp diff --git a/src/ir/template.rs b/src/ir/template.rs index 627ac225f8..4022b36644 100644 --- a/src/ir/template.rs +++ b/src/ir/template.rs @@ -88,7 +88,7 @@ impl TemplateInstantiation { /// Parse a `TemplateInstantiation` from a clang `Type`. pub fn from_ty(ty: &clang::Type, ctx: &mut BindgenContext) - -> TemplateInstantiation { + -> Option { use clang_sys::*; let template_args = ty.template_args() @@ -100,6 +100,10 @@ impl TemplateInstantiation { .collect() }); + if ty.declaration().is_builtin() { + return None; + } + let definition = ty.declaration() .specialized() .or_else(|| { @@ -124,7 +128,7 @@ impl TemplateInstantiation { let template_definition = Item::from_ty_or_ref(definition.cur_type(), definition, None, ctx); - TemplateInstantiation::new(template_definition, template_args) + Some(TemplateInstantiation::new(template_definition, template_args)) } /// Does this instantiation have a vtable? diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 60d750edbf..f1485638a6 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -988,7 +988,10 @@ impl Type { (ty.template_args().is_some() && ty_kind != CXType_Typedef) { // This is a template instantiation. - let inst = TemplateInstantiation::from_ty(&ty, ctx); + let inst = match TemplateInstantiation::from_ty(&ty, ctx) { + Some(inst) => inst, + None => return Err(ParseError::Continue), + }; TypeKind::TemplateInstantiation(inst) } else { match ty_kind { diff --git a/tests/expectations/tests/builtin-template.rs b/tests/expectations/tests/builtin-template.rs new file mode 100644 index 0000000000..1215f9dab7 --- /dev/null +++ b/tests/expectations/tests/builtin-template.rs @@ -0,0 +1,7 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +pub type std_make_integer_sequence = T; diff --git a/tests/headers/builtin-template.hpp b/tests/headers/builtin-template.hpp new file mode 100644 index 0000000000..4e64ebc779 --- /dev/null +++ b/tests/headers/builtin-template.hpp @@ -0,0 +1,6 @@ +namespace std { +template +class integer_sequence; +template +using make_integer_sequence = __make_integer_seq; +} From eaf638b539a0df64a6468b633850a3acb09e3f95 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 4 Apr 2017 13:24:39 -0700 Subject: [PATCH 0434/2291] Use opaque types rather than continuing when template instantiation fails --- src/ir/ty.rs | 9 ++++----- tests/expectations/tests/builtin-template.rs | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ir/ty.rs b/src/ir/ty.rs index f1485638a6..84a1561453 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -988,11 +988,10 @@ impl Type { (ty.template_args().is_some() && ty_kind != CXType_Typedef) { // This is a template instantiation. - let inst = match TemplateInstantiation::from_ty(&ty, ctx) { - Some(inst) => inst, - None => return Err(ParseError::Continue), - }; - TypeKind::TemplateInstantiation(inst) + match TemplateInstantiation::from_ty(&ty, ctx) { + Some(inst) => TypeKind::TemplateInstantiation(inst), + None => TypeKind::Opaque, + } } else { match ty_kind { CXType_Unexposed if *ty != canonical_ty && diff --git a/tests/expectations/tests/builtin-template.rs b/tests/expectations/tests/builtin-template.rs index 1215f9dab7..44cda83cf4 100644 --- a/tests/expectations/tests/builtin-template.rs +++ b/tests/expectations/tests/builtin-template.rs @@ -4,4 +4,4 @@ #![allow(non_snake_case)] -pub type std_make_integer_sequence = T; +pub type std_make_integer_sequence = u8; From 5e38020b84d300b68befa65f73f0335bcd2fdca0 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 4 Apr 2017 13:48:34 -0700 Subject: [PATCH 0435/2291] Generalize fallibility template instantiation fallibility Return `None` whenever we can't find a template definition, not only when the template is a builtin. --- src/ir/template.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ir/template.rs b/src/ir/template.rs index 4022b36644..18a3f805d5 100644 --- a/src/ir/template.rs +++ b/src/ir/template.rs @@ -100,10 +100,6 @@ impl TemplateInstantiation { .collect() }); - if ty.declaration().is_builtin() { - return None; - } - let definition = ty.declaration() .specialized() .or_else(|| { @@ -122,8 +118,12 @@ impl TemplateInstantiation { }); template_ref.and_then(|cur| cur.referenced()) - }) - .expect("Should have found the template definition one way or another"); + }); + + let definition = match definition { + None => return None, + Some(def) => def, + }; let template_definition = Item::from_ty_or_ref(definition.cur_type(), definition, None, ctx); From 7b6245082128645c33f96fea49509c687c0785c7 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 4 Apr 2017 14:31:43 -0700 Subject: [PATCH 0436/2291] Warn when we can't find a template definition But only if the type is not a builtin type. If it is a builtin type, then it's expected that we won't have a definition. --- src/ir/template.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ir/template.rs b/src/ir/template.rs index 18a3f805d5..3484a9c6e7 100644 --- a/src/ir/template.rs +++ b/src/ir/template.rs @@ -121,8 +121,14 @@ impl TemplateInstantiation { }); let definition = match definition { - None => return None, Some(def) => def, + None => { + if !ty.declaration().is_builtin() { + warn!("Could not find template definition for template \ + instantiation"); + } + return None + } }; let template_definition = From 9a52ca27f2283854e5295d0e94e2fcf97c941211 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 5 Apr 2017 16:56:49 -0700 Subject: [PATCH 0437/2291] Add a test explicitly for default type parameters This is exercised in other tests, but in a round about fashion. It is nice to have a test that explicitly exercises default type parameters, without any cruft. --- .../tests/default-template-parameter.rs | 30 +++++++++++++++++++ tests/headers/default-template-parameter.hpp | 7 +++++ 2 files changed, 37 insertions(+) create mode 100644 tests/expectations/tests/default-template-parameter.rs create mode 100644 tests/headers/default-template-parameter.hpp diff --git a/tests/expectations/tests/default-template-parameter.rs b/tests/expectations/tests/default-template-parameter.rs new file mode 100644 index 0000000000..af4616ff9b --- /dev/null +++ b/tests/expectations/tests/default-template-parameter.rs @@ -0,0 +1,30 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Foo { + pub t: T, + pub u: U, +} +impl Default for Foo { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[test] +fn __bindgen_test_layout_Foo_instantiation_6() { + assert_eq!(::std::mem::size_of::>() , + 8usize , concat ! ( + "Size of template specialization: " , stringify ! ( + Foo ) )); + assert_eq!(::std::mem::align_of::>() , + 4usize , concat ! ( + "Alignment of template specialization: " , stringify ! ( + Foo ) )); +} +extern "C" { + #[link_name = "_ZL3bar"] + pub static mut bar: Foo; +} diff --git a/tests/headers/default-template-parameter.hpp b/tests/headers/default-template-parameter.hpp new file mode 100644 index 0000000000..4deed834fa --- /dev/null +++ b/tests/headers/default-template-parameter.hpp @@ -0,0 +1,7 @@ +template +struct Foo { + T t; + U u; +}; + +static Foo bar; From 2472a8a970ac459a793136c71072368f6302ab25 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 6 Apr 2017 13:29:58 -0700 Subject: [PATCH 0438/2291] Don't build documentation for the binary, just the lib This enables one to locally do $ cargo doc and get library level documentation. Without the changes, cargo doesn't know whether to build docs for the binary or library, and so instead it gives an error and stops. --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index d0e5011a6f..868c147c52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ path = "src/lib.rs" [[bin]] name = "bindgen" path = "src/main.rs" +doc = false [dev-dependencies] diff = "0.1" From 88b7cd66a25ce69961940e6e2c12f616c67e08d3 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 6 Apr 2017 14:38:05 -0700 Subject: [PATCH 0439/2291] Clean up testing-only cargo features This commit ensures that all of the cargo features we have that only exist for CI/testing purposes, and aren't for external consumption, have a "testing_only_" prefix. --- CONTRIBUTING.md | 8 ++++---- Cargo.toml | 10 ++++++---- ci/assert-docs.sh | 2 +- ci/test.sh | 4 ++-- src/ir/context.rs | 7 +++++-- src/lib.rs | 8 ++++---- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0aad4f2cee..1d78497e6a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,12 +65,12 @@ $ export LD_LIBRARY_PATH=path/to/clang-3.9/lib # for Linux $ export DYLD_LIBRARY_PATH=path/to/clang-3.9/lib # for macOS ``` -Additionally, you may want to build and test with the `docs_` feature to ensure -that you aren't forgetting to document types and functions. CI will catch it if -you forget, but the turn around will be a lot slower ;) +Additionally, you may want to build and test with the `testing_only_docs` +feature to ensure that you aren't forgetting to document types and functions. CI +will catch it if you forget, but the turn around will be a lot slower ;) ``` -$ cargo build --features docs_ +$ cargo build --features testing_only_docs ``` ## Testing diff --git a/Cargo.toml b/Cargo.toml index d0e5011a6f..7649508243 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,10 +64,12 @@ features = ["with-syntex"] version = "0.29" [features] -assert_no_dangling_items = [] default = ["logging"] -testing_only_llvm_stable = [] logging = ["env_logger", "log"] static = [] -# This feature only exists for CI -- don't use it! -docs_ = [] + +# These features only exist for CI testing -- don't use them if you're not hacking +# on bindgen! +testing_only_assert_no_dangling_items = [] +testing_only_docs = [] +testing_only_llvm_stable = [] diff --git a/ci/assert-docs.sh b/ci/assert-docs.sh index aa4b90ac04..d5757403ec 100755 --- a/ci/assert-docs.sh +++ b/ci/assert-docs.sh @@ -3,4 +3,4 @@ set -xeu cd "$(dirname "$0")/.." -cargo build --features "$BINDGEN_FEATURES docs_" +cargo build --features "$BINDGEN_FEATURES testing_only_docs" diff --git a/ci/test.sh b/ci/test.sh index 9bfccfd8f1..ed31db6c8a 100755 --- a/ci/test.sh +++ b/ci/test.sh @@ -6,10 +6,10 @@ cd "$(dirname "$0")/.." # Regenerate the test headers' bindings in debug and release modes, and assert # that we always get the expected generated bindings. -cargo test --features "$BINDGEN_FEATURES assert_no_dangling_items" +cargo test --features "$BINDGEN_FEATURES testing_only_assert_no_dangling_items" ./ci/assert-no-diff.sh -cargo test --release --features "$BINDGEN_FEATURES assert_no_dangling_items" +cargo test --release --features "$BINDGEN_FEATURES testing_only_assert_no_dangling_items" ./ci/assert-no-diff.sh # Now test the expectations' size and alignment tests. diff --git a/src/ir/context.rs b/src/ir/context.rs index 32ee5bd04a..9ff5a3305e 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -584,9 +584,12 @@ impl<'ctx> BindgenContext<'ctx> { ret } - /// This function trying to find any dangling references inside of `items` + /// When the `testing_only_assert_no_dangling_items` feature is enabled, + /// this function walks the IR graph and asserts that we do not have any + /// edges referencing an ItemId for which we do not have an associated IR + /// item. fn assert_no_dangling_references(&self) { - if cfg!(feature = "assert_no_dangling_items") { + if cfg!(feature = "testing_only_assert_no_dangling_items") { for _ in self.assert_no_dangling_item_traversal() { // The iterator's next method does the asserting for us. } diff --git a/src/lib.rs b/src/lib.rs index e6a66dfc42..6637304ba7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -38,15 +38,15 @@ extern crate log; mod log_stubs; // A macro to declare an internal module for which we *must* provide -// documentation for. If we are building with the "docs_" feature, then the -// module is declared public, and our `#![deny(missing_docs)]` pragma applies to -// it. This feature is used in CI, so we won't let anything slip by +// documentation for. If we are building with the "testing_only_docs" feature, +// then the module is declared public, and our `#![deny(missing_docs)]` pragma +// applies to it. This feature is used in CI, so we won't let anything slip by // undocumented. Normal builds, however, will leave the module private, so that // we don't expose internals to library consumers. macro_rules! doc_mod { ($m:ident, $doc_mod_name:ident) => { cfg_if! { - if #[cfg(feature = "docs_")] { + if #[cfg(feature = "testing_only_docs")] { pub mod $doc_mod_name { //! Autogenerated documentation module. pub use super::$m::*; From 5004ed43b27d2ec7764829d937ea515f7bc796ba Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 6 Apr 2017 15:21:33 -0700 Subject: [PATCH 0440/2291] Define extra assertion macros This commit defines a new set of assertion macros that are only checked in testing/CI when the `testing_only_extra_assertions` feature is enabled. This makes it so that *users* of bindgen that happen to be making a debug build don't enable all these extra and expensive assertions. Additionally, this removes the `testing_only_assert_no_dangling_items` feature, and runs the assertions that were previously gated on that feature when the new `testing_only_extra_assertions` feature is enabled. --- Cargo.toml | 2 +- ci/test.sh | 7 +++++-- src/codegen/mod.rs | 2 +- src/extra_assertions.rs | 30 ++++++++++++++++++++++++++++++ src/ir/context.rs | 9 ++++----- src/ir/item.rs | 6 +++--- src/ir/named.rs | 4 ++-- src/lib.rs | 3 +++ 8 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 src/extra_assertions.rs diff --git a/Cargo.toml b/Cargo.toml index 7649508243..27413299a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,6 +70,6 @@ static = [] # These features only exist for CI testing -- don't use them if you're not hacking # on bindgen! -testing_only_assert_no_dangling_items = [] testing_only_docs = [] +testing_only_extra_assertions = [] testing_only_llvm_stable = [] diff --git a/ci/test.sh b/ci/test.sh index ed31db6c8a..f14b7b9687 100755 --- a/ci/test.sh +++ b/ci/test.sh @@ -6,10 +6,13 @@ cd "$(dirname "$0")/.." # Regenerate the test headers' bindings in debug and release modes, and assert # that we always get the expected generated bindings. -cargo test --features "$BINDGEN_FEATURES testing_only_assert_no_dangling_items" +cargo test --features "$BINDGEN_FEATURES" +./ci/assert-no-diff.sh + +cargo test --features "$BINDGEN_FEATURES testing_only_extra_assertions" ./ci/assert-no-diff.sh -cargo test --release --features "$BINDGEN_FEATURES testing_only_assert_no_dangling_items" +cargo test --release --features "$BINDGEN_FEATURES testing_only_extra_assertions" ./ci/assert-no-diff.sh # Now test the expectations' size and alignment tests. diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index ee4a9d4e78..5a89e5c864 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2642,7 +2642,7 @@ impl TryToRustTy for TemplateInstantiation { // This can happen if we generated an opaque type for a partial // template specialization, and we've hit an instantiation of // that partial specialization. - debug_assert!(ctx.resolve_type_through_type_refs(decl) + extra_assert!(ctx.resolve_type_through_type_refs(decl) .is_opaque()); return Err(error::Error::InstantiationOfOpaqueType); } diff --git a/src/extra_assertions.rs b/src/extra_assertions.rs new file mode 100644 index 0000000000..b89c718a48 --- /dev/null +++ b/src/extra_assertions.rs @@ -0,0 +1,30 @@ +//! Macros for defining extra assertions that should only be checked in testing +//! and/or CI when the `testing_only_extra_assertions` feature is enabled. + +#[macro_export] +macro_rules! extra_assert { + ( $cond:expr ) => { + if cfg!(feature = "testing_only_extra_assertions") { + assert!($cond); + } + }; + ( $cond:expr , $( $arg:tt )+ ) => { + if cfg!(feature = "testing_only_extra_assertions") { + assert!($cond, $( $arg )* ) + } + }; +} + +#[macro_export] +macro_rules! extra_assert_eq { + ( $lhs:expr , $rhs:expr ) => { + if cfg!(feature = "testing_only_extra_assertions") { + assert_eq!($lhs, $rhs); + } + }; + ( $lhs:expr , $rhs:expr , $( $arg:tt )+ ) => { + if cfg!(feature = "testing_only_extra_assertions") { + assert!($lhs, $rhs, $( $arg )* ); + } + }; +} diff --git a/src/ir/context.rs b/src/ir/context.rs index 9ff5a3305e..9b9ad8bd29 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -584,12 +584,11 @@ impl<'ctx> BindgenContext<'ctx> { ret } - /// When the `testing_only_assert_no_dangling_items` feature is enabled, - /// this function walks the IR graph and asserts that we do not have any - /// edges referencing an ItemId for which we do not have an associated IR - /// item. + /// When the `testing_only_extra_assertions` feature is enabled, this + /// function walks the IR graph and asserts that we do not have any edges + /// referencing an ItemId for which we do not have an associated IR item. fn assert_no_dangling_references(&self) { - if cfg!(feature = "testing_only_assert_no_dangling_items") { + if cfg!(feature = "testing_only_extra_assertions") { for _ in self.assert_no_dangling_item_traversal() { // The iterator's next method does the asserting for us. } diff --git a/src/ir/item.rs b/src/ir/item.rs index 5477dee9dd..5e806de97c 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -70,7 +70,7 @@ pub trait ItemAncestors { } cfg_if! { - if #[cfg(debug_assertions)] { + if #[cfg(testing_only_extra_assertions)] { type DebugOnlyItemSet = ItemSet; } else { struct DebugOnlyItemSet; @@ -123,7 +123,7 @@ impl<'a, 'b> Iterator for ItemAncestorsIter<'a, 'b> } else { self.item = item.parent_id(); - debug_assert!(!self.seen.contains(&item.id())); + extra_assert!(!self.seen.contains(&item.id())); self.seen.insert(item.id()); Some(item.id()) @@ -614,7 +614,7 @@ impl Item { let mut item = self; loop { - debug_assert!(!targets_seen.contains(&item.id())); + extra_assert!(!targets_seen.contains(&item.id())); targets_seen.insert(item.id()); if self.annotations().use_instead_of().is_some() { diff --git a/src/ir/named.rs b/src/ir/named.rs index 7cae195bf0..6699d9b174 100644 --- a/src/ir/named.rs +++ b/src/ir/named.rs @@ -371,7 +371,7 @@ impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { fn constrain(&mut self, id: ItemId) -> bool { // Invariant: all hash map entries' values are `Some` upon entering and // exiting this method. - debug_assert!(self.used.values().all(|v| v.is_some())); + extra_assert!(self.used.values().all(|v| v.is_some())); // Take the set for this id out of the hash map while we mutate it based // on other hash map entries. We *must* put it back into the hash map at @@ -437,7 +437,7 @@ impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { // Put the set back in the hash map and restore our invariant. self.used.insert(id, Some(used_by_this_id)); - debug_assert!(self.used.values().all(|v| v.is_some())); + extra_assert!(self.used.values().all(|v| v.is_some())); new_len != original_len } diff --git a/src/lib.rs b/src/lib.rs index 6637304ba7..44cf91938a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,6 +37,9 @@ extern crate log; #[macro_use] mod log_stubs; +#[macro_use] +mod extra_assertions; + // A macro to declare an internal module for which we *must* provide // documentation for. If we are building with the "testing_only_docs" feature, // then the module is declared public, and our `#![deny(missing_docs)]` pragma From 1e2a78f7bcd96c708fe3d004eb344465571ca603 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 6 Apr 2017 17:27:13 -0700 Subject: [PATCH 0441/2291] Provide better diagnostics for assertions in the template analysis This replaces various `unwrap` calls with `expect` calls that have better diagnostic messages if/when they fail. --- src/ir/named.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/ir/named.rs b/src/ir/named.rs index 7cae195bf0..598041ea0d 100644 --- a/src/ir/named.rs +++ b/src/ir/named.rs @@ -377,8 +377,13 @@ impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { // on other hash map entries. We *must* put it back into the hash map at // the end of this method. This allows us to side-step HashMap's lack of // an analog to slice::split_at_mut. - let mut used_by_this_id = - self.used.get_mut(&id).unwrap().take().unwrap(); + let mut used_by_this_id = self.used + .get_mut(&id) + .expect("Should have a set of used template params for every item \ + id") + .take() + .expect("Should maintain the invariant that all used template param \ + sets are `Some` upon entry of `constrain`"); let original_len = used_by_this_id.len(); @@ -415,27 +420,31 @@ impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { // Otherwise, add the union of each of its referent item's template // parameter usage. _ => { - item.trace(self.ctx, - &mut |sub_id, edge_kind| { + item.trace(self.ctx, &mut |sub_id, edge_kind| { if sub_id == id || !Self::consider_edge(edge_kind) { return; } let used_by_sub_id = self.used[&sub_id] .as_ref() - .unwrap() + .expect("Because sub_id != id, and all used template \ + param sets other than id's are `Some`, \ + sub_id's used template param set should be \ + `Some`") .iter() .cloned(); used_by_this_id.extend(used_by_sub_id); - }, - &()); + }, &()); } } let new_len = used_by_this_id.len(); - assert!(new_len >= original_len); + assert!(new_len >= original_len, + "This is the property that ensures this function is monotone -- \ + if it doesn't hold, the analysis might never terminate!"); // Put the set back in the hash map and restore our invariant. + debug_assert!(self.used[&id].is_none()); self.used.insert(id, Some(used_by_this_id)); debug_assert!(self.used.values().all(|v| v.is_some())); From aac2f84ea76b6fe321440596a2a5fd93251a3021 Mon Sep 17 00:00:00 2001 From: Dominik Boehi Date: Sat, 8 Apr 2017 00:14:38 +0200 Subject: [PATCH 0442/2291] Omit accessor functions for large bitfields --- src/codegen/mod.rs | 3 +- tests/expectations/tests/bitfield-large.rs | 32 ++++++++++++++++++++++ tests/headers/bitfield-large.hpp | 9 ++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tests/expectations/tests/bitfield-large.rs create mode 100644 tests/headers/bitfield-large.hpp diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index ee4a9d4e78..8151a67637 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -924,8 +924,7 @@ fn flush_bitfields<'a, I>(ctx: &BindgenContext, 4 => quote_ty!(ctx.ext_cx(), u32), 2 => quote_ty!(ctx.ext_cx(), u16), 1 => quote_ty!(ctx.ext_cx(), u8), - _ => panic!("physical field containing bitfields should be sized \ - 8, 4, 2, or 1 bytes") + _ => return field }; let bitfield_int_ty = BlobTyBuilder::new(bitfield_layout).build(); diff --git a/tests/expectations/tests/bitfield-large.rs b/tests/expectations/tests/bitfield-large.rs new file mode 100644 index 0000000000..d4fe96948a --- /dev/null +++ b/tests/expectations/tests/bitfield-large.rs @@ -0,0 +1,32 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + + +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct HasBigBitfield { + pub _bitfield_1: [u8; 16usize], +} +#[test] +fn bindgen_test_layout_HasBigBitfield() { + assert_eq!(::std::mem::size_of::() , 16usize , concat ! ( + "Size of: " , stringify ! ( HasBigBitfield ) )); +} +impl Clone for HasBigBitfield { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct HasTwoBigBitfields { + pub _bitfield_1: [u8; 16usize], +} +#[test] +fn bindgen_test_layout_HasTwoBigBitfields() { + assert_eq!(::std::mem::size_of::() , 16usize , concat + ! ( "Size of: " , stringify ! ( HasTwoBigBitfields ) )); +} +impl Clone for HasTwoBigBitfields { + fn clone(&self) -> Self { *self } +} diff --git a/tests/headers/bitfield-large.hpp b/tests/headers/bitfield-large.hpp new file mode 100644 index 0000000000..2e34927929 --- /dev/null +++ b/tests/headers/bitfield-large.hpp @@ -0,0 +1,9 @@ +struct HasBigBitfield { + __int128 x : 128; +}; + + +struct HasTwoBigBitfields { + __int128 x : 80; + __int128 y : 48; +}; From 89ef8c242666f28b124955431cbe6bb04013f8c3 Mon Sep 17 00:00:00 2001 From: Dominik Boehi Date: Sat, 8 Apr 2017 00:25:11 +0200 Subject: [PATCH 0443/2291] Move check for field size outside loop --- src/codegen/mod.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 8151a67637..c203795a62 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -913,19 +913,20 @@ fn flush_bitfields<'a, I>(ctx: &BindgenContext, .pub_() .build_ty(field_ty.clone()); + let field_int_ty = match field_layout.size { + 8 => quote_ty!(ctx.ext_cx(), u64), + 4 => quote_ty!(ctx.ext_cx(), u32), + 2 => quote_ty!(ctx.ext_cx(), u16), + 1 => quote_ty!(ctx.ext_cx(), u8), + _ => return field + }; + for (name, offset, width, bitfield_ty, bitfield_layout) in bitfields { let prefix = ctx.trait_prefix(); let getter_name = bitfield_getter_name(ctx, parent, name); let setter_name = bitfield_setter_name(ctx, parent, name); let field_ident = ctx.ext_cx().ident_of(field_name); - let field_int_ty = match field_layout.size { - 8 => quote_ty!(ctx.ext_cx(), u64), - 4 => quote_ty!(ctx.ext_cx(), u32), - 2 => quote_ty!(ctx.ext_cx(), u16), - 1 => quote_ty!(ctx.ext_cx(), u8), - _ => return field - }; let bitfield_int_ty = BlobTyBuilder::new(bitfield_layout).build(); let mask: usize = ((1usize << width) - 1usize) << offset; From e4a8093ca48acff70d75c8940b222b71fa1e0890 Mon Sep 17 00:00:00 2001 From: David Hotham Date: Sat, 8 Apr 2017 21:00:02 +0100 Subject: [PATCH 0444/2291] update dependencies --- Cargo.lock | 211 +++++++++++++++++++++-------------------- Cargo.toml | 10 +- src/codegen/helpers.rs | 2 +- src/codegen/mod.rs | 4 +- 4 files changed, 117 insertions(+), 110 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 70c29b75e1..f8a7928ba2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,26 +2,26 @@ name = "bindgen" version = "0.22.1" dependencies = [ - "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "clang-sys 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.20.4 (registry+https://github.com/rust-lang/crates.io-index)", - "diff 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "quasi 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quasi_codegen 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)", + "clang-sys 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.23.1 (registry+https://github.com/rust-lang/crates.io-index)", + "diff 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "quasi 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quasi_codegen 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "aho-corasick" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -34,15 +34,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "aster" -version = "0.38.0" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "atty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bitflags" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -60,34 +70,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "clang-sys" -version = "0.14.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", - "libloading 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "libloading 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "clap" -version = "2.20.4" +version = "2.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "term_size 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "term_size 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "vec_map 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "vec_map 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "diff" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -97,10 +106,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "env_logger" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -125,28 +134,28 @@ dependencies = [ [[package]] name = "lazy_static" -version = "0.2.2" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libloading" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "target_build_utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -154,7 +163,7 @@ name = "memchr" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -164,7 +173,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "num-traits" -version = "0.1.36" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -198,27 +207,27 @@ name = "phf_shared" version = "0.7.21" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "siphasher 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quasi" -version = "0.29.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quasi_codegen" -version = "0.29.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -226,7 +235,7 @@ name = "rand" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -234,10 +243,10 @@ name = "regex" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -248,23 +257,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rustc-serialize" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "0.9.7" +version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_json" -version = "0.9.6" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.9.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -274,7 +283,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "siphasher" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -284,46 +293,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syntex" -version = "0.54.0" +version = "0.58.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "syntex_errors" -version = "0.54.0" +version = "0.58.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_pos 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "syntex_pos" -version = "0.54.0" +version = "0.58.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "syntex_syntax" -version = "0.54.0" +version = "0.58.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)", - "term 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syntex_pos 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -334,7 +340,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 0.9.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -348,11 +354,11 @@ dependencies = [ [[package]] name = "term_size" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -362,12 +368,12 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "thread_local" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -404,7 +410,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "vec_map" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -423,57 +429,58 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum aho-corasick 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0638fd549427caa90c499814196d1b9e3725eb4d15d7339d6de073a680ed0ca2" +"checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699" "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" -"checksum aster 0.38.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2c9b49e42a449c0b79d8acb91db37621de0978064dca7d3288ddcf030123e5b3" -"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" +"checksum aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfdf7355d9db158df68f976ed030ab0f6578af811f5a7bb6dcf221ec24e0e0" +"checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159" +"checksum bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4" "checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d" "checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c" -"checksum clang-sys 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f98f0715ff67f27ca6a2f8f0ffc2a56f8edbc7acd57489c29eadc3a15c4eafe" -"checksum clap 2.20.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a60af5cb867dd4ee2378398acde80c73b466b58a963f598061ce7e394800998d" -"checksum diff 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e48977eec6d3b7707462c2dc2e1363ad91b5dd822cf942537ccdc2085dc87587" +"checksum clang-sys 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "905d957c19424e25e4bd359e0009cbdecfd765f2632fd8d2ba1b576fadd22dc2" +"checksum clap 2.23.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d480c39a2e5f9b3a3798c661613e1b0e7a7ae71e005102d4aa910fc3289df484" +"checksum diff 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0a515461b6c8c08419850ced27bc29e86166dcdcde8fbe76f8b1f0589bb49472" "checksum dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90" -"checksum env_logger 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "99971fb1b635fe7a0ee3c4d065845bb93cca80a23b5613b5613391ece5de4144" +"checksum env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e3856f1697098606fc6cb97a93de88ca3f3bc35bb878c725920e6e82ecf05e83" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6abe0ee2e758cd6bc8a2cd56726359007748fbf4128da998b65d0b70f881e19b" -"checksum libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)" = "684f330624d8c3784fb9558ca46c4ce488073a8d22450415c5eb4f4cfb0d11b5" -"checksum libloading 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fd1835a714c1f67ba073a493493c23686a480e2614e208c921834808b1f19d8f" -"checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054" +"checksum lazy_static 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2f61b8421c7a4648c391611625d56fdd5c7567da05af1be655fd8cacc643abb3" +"checksum libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)" = "88ee81885f9f04bff991e306fea7c1c60a5f0f9e409e99f6b40e3311a3363135" +"checksum libloading 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0a020ac941774eb37e9d13d418c37b522e76899bfc4e7b1a600d529a53f83a66" +"checksum log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "5141eca02775a762cc6cd564d8d2c50f67c0ea3a372cbf1c51592b3e029e10ad" "checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4" "checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce" -"checksum num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "a16a42856a256b39c6d3484f097f6713e14feacd9bfb02290917904fae46c81c" +"checksum num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "e1cbfa3781f3fe73dc05321bed52a06d2d491eaa764c52335cf4399f046ece99" "checksum phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "cb325642290f28ee14d8c6201159949a872f220c62af6e110a56ea914fbe42fc" "checksum phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d62594c0bb54c464f633175d502038177e90309daf2e0158be42ed5f023ce88f" "checksum phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "6b07ffcc532ccc85e3afc45865469bf5d9e4ef5bfcf9622e3cfe80c2d275ec03" "checksum phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "07e24b0ca9643bdecd0632f2b3da6b1b89bbb0030e0b992afc1113b23a7bc2f2" -"checksum quasi 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dcbf815446dc6a0afbc72d88f9a8aa71b608d10b168e09437c80c0fd6fd410c9" -"checksum quasi_codegen 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b06172e92ab0099427609854ffb1512c377be5fc4beaf572ae5d5a01b8359596" +"checksum quasi 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18c45c4854d6d1cf5d531db97c75880feb91c958b0720f4ec1057135fec358b3" +"checksum quasi_codegen 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9e25fa23c044c1803f43ca59c98dac608976dd04ce799411edd58ece776d4" "checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d" "checksum regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4278c17d0f6d62dfef0ab00028feb45bd7d2102843f80763474eeb1be8a10c01" "checksum regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9191b1f57603095f105d317e375d19b1c9c5c3185ea9633a99a6dcbed04457" -"checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b" -"checksum serde 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1e0ed773960f90a78567fcfbe935284adf50c5d7cf119aa2cf43bb0b4afa69bb" -"checksum serde_json 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e095e4e94e7382b76f48e93bd845ffddda62df8dfd4c163b1bfa93d40e22e13a" +"checksum rustc-serialize 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "684ce48436d6465300c9ea783b6b14c4361d6b8dcbb1375b486a69cc19e2dfb0" +"checksum serde 0.9.13 (registry+https://github.com/rust-lang/crates.io-index)" = "231dfd55909400769e437326cfb4af8bec97c3dd56ab3d02df8ef5c7e00f179b" +"checksum serde_json 0.9.9 (registry+https://github.com/rust-lang/crates.io-index)" = "dbc45439552eb8fb86907a2c41c1fd0ef97458efb87ff7f878db466eb581824e" "checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" -"checksum siphasher 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2ffc669b726f2bc9a3bcff66e5e23b56ba6bf70e22a34c3d7b6d0b3450b65b84" +"checksum siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0df90a788073e8d0235a67e50441d47db7c8ad9debd91cbf43736a2a92d36537" "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" -"checksum syntex 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb3f52553a966675982404dc34028291b347e0c9a9c0b0b34f2da6be8a0443f8" -"checksum syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dee2f6e49c075f71332bb775219d5982bee6732d26227fa1ae1b53cdb12f5cc5" -"checksum syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df3921c7945dfb9ffc53aa35adb2cf4313b5ab5f079c3619b3d4eb82a0efc2b" -"checksum syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc960085bae44591e22d01f6c0e82a8aec832f8659aca556cdf8ecbdac2bb47b" +"checksum syntex 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a8f5e3aaa79319573d19938ea38d068056b826db9883a5d47f86c1cecc688f0e" +"checksum syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "867cc5c2d7140ae7eaad2ae9e8bf39cb18a67ca651b7834f88d46ca98faadb9c" +"checksum syntex_pos 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13ad4762fe52abc9f4008e85c4fb1b1fe3aa91ccb99ff4826a439c7c598e1047" +"checksum syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6e0e4dbae163dd98989464c23dd503161b338790640e11537686f2ef0f25c791" "checksum target_build_utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f42dc058080c19c6a58bdd1bf962904ee4f5ef1fe2a81b529f31dacc750c679f" "checksum term 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d168af3930b369cfe245132550579d47dfd873d69470755a19c2c6568dbbd989" -"checksum term_size 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "71662702fe5cd2cf95edd4ad655eea42f24a87a0e44059cbaa4e55260b7bc331" +"checksum term_size 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "07b6c1ac5b3fffd75073276bca1ceed01f67a28537097a2a9539e116e50fb21a" "checksum thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4437c97558c70d129e40629a5b385b3fb1ffac301e63941335e4d354081ec14a" -"checksum thread_local 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7793b722f0f77ce716e7f1acf416359ca32ff24d04ffbac4269f44a4a83be05d" +"checksum thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c85048c6260d17cf486ceae3282d9fb6b90be220bf5b28c400f5485ffc29f0c7" "checksum unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18127285758f0e2c6cf325bb3f3d138a12fee27de4f23e146cd6a179f26c2cf3" "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" "checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" -"checksum vec_map 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cac5efe5cb0fa14ec2f84f83c701c562ee63f6dcc680861b21d65c682adfb05f" +"checksum vec_map 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8cdc8b93bd0198ed872357fb2e667f7125646b1762f16d60b2c96350d361897" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/Cargo.toml b/Cargo.toml index 62a95d5e1e..cee1110cf9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,22 +35,22 @@ clap = "2" shlex = "0.1" [build-dependencies] -quasi_codegen = "0.29" +quasi_codegen = "0.32" [dependencies] cexpr = "0.2" cfg-if = "0.1.0" -clang-sys = { version = "0.14", features = ["runtime", "clang_3_9"] } +clang-sys = { version = "0.15", features = ["runtime", "clang_3_9"] } lazy_static = "0.2.1" rustc-serialize = "0.3.19" -syntex_syntax = "0.54" +syntex_syntax = "0.58" regex = "0.2" # This kinda sucks: https://github.com/rust-lang/cargo/issues/1982 clap = "2" [dependencies.aster] features = ["with-syntex"] -version = "0.38" +version = "0.41" [dependencies.env_logger] optional = true @@ -62,7 +62,7 @@ version = "0.3" [dependencies.quasi] features = ["with-syntex"] -version = "0.29" +version = "0.32" [features] default = ["logging"] diff --git a/src/codegen/helpers.rs b/src/codegen/helpers.rs index 608f3f9e0e..eb843a6539 100644 --- a/src/codegen/helpers.rs +++ b/src/codegen/helpers.rs @@ -146,7 +146,7 @@ pub mod ast_ty { } vec.push(int_expr(0)); - let kind = ast::ExprKind::Vec(vec); + let kind = ast::ExprKind::Array(vec); aster::AstBuilder::new().expr().build_expr_kind(kind) } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 579e9de12e..52dfdbe56f 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2673,8 +2673,8 @@ impl TryToRustTy for TemplateInstantiation { Some(P(ast::PathParameters::AngleBracketed( ast::AngleBracketedParameterData { lifetimes: vec![], - types: P::from_vec(template_args), - bindings: P::from_vec(vec![]), + types: template_args, + bindings: vec![], } ))) } From c8a206adad0fc333b5f9aba410b7f4cccae77a22 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 7 Apr 2017 15:59:02 -0700 Subject: [PATCH 0445/2291] Correctly handle blacklisted items in the template analysis The template analysis operates on whitelisted items, and uses our tracing infrastructure to move between them. Usually, that means we can only reach other whitelisted items by tracing, because the set of whitelisted items is the transitive closure of all the items explicitly whitelisted. The exception is when some type is explicitly blacklisted. It could still be reachable via tracing from a whitelisted item, but is not considered whitelisted due to the blacklisting. The easy fix is to run the template analysis on the whole IR graph rather than just the whitelisted set. This is an approximately one line change in the analysis, however is not desirable due to performance concerns. The whole point of whitelisting is that there may be *many* types in a header, but only a *few* the user cares about, or there might be types that aren't explicitly needed and that are too complicated for bindgen to handle generally (often in ``). In these situations, we don't want to waste cycles or even confuse ourselves by considering such types! Instead, we keep the whitelisted item set around and check by hand whether any given item is in it during the template type parameter analysis. Additionally, we make the decision that blacklisted template definitions use all of their type parameters. This seems like a reasonable choice because the type will likely be ported to Rust manually by the bindgen user, and they will be looking at the C++ definition with all of its type parameters. They can always insert `PhantomData`s manually, so it also gives the most flexibility. Fixes #584 --- src/ir/context.rs | 10 ++- src/ir/named.rs | 56 ++++++++++--- ...issue-584-stylo-template-analysis-panic.rs | 80 +++++++++++++++++++ ...ssue-584-stylo-template-analysis-panic.hpp | 13 +++ 4 files changed, 145 insertions(+), 14 deletions(-) create mode 100644 tests/expectations/tests/issue-584-stylo-template-analysis-panic.rs create mode 100644 tests/headers/issue-584-stylo-template-analysis-panic.hpp diff --git a/src/ir/context.rs b/src/ir/context.rs index 9b9ad8bd29..d00e489938 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -631,6 +631,14 @@ impl<'ctx> BindgenContext<'ctx> { /// This method may only be called during the codegen phase, because the /// template usage information is only computed as we enter the codegen /// phase. + /// + /// If the item is blacklisted, then we say that it always uses the template + /// parameter. This is a little subtle. The template parameter usage + /// analysis only considers whitelisted items, and if any blacklisted item + /// shows up in the generated bindings, it is the user's responsibility to + /// manually provide a definition for them. To give them the most + /// flexibility when doing that, we assume that they use every template + /// parameter and always pass template arguments through in instantiations. pub fn uses_template_parameter(&self, item: ItemId, template_param: ItemId) @@ -643,7 +651,7 @@ impl<'ctx> BindgenContext<'ctx> { .expect("should have found template parameter usage if we're in codegen") .get(&item) .map(|items_used_params| items_used_params.contains(&template_param)) - .unwrap_or(false) + .unwrap_or_else(|| self.resolve_item(item).is_hidden(self)) } // This deserves a comment. Builtin types don't get a valid declaration, so diff --git a/src/ir/named.rs b/src/ir/named.rs index 67b369155a..1af98a26ba 100644 --- a/src/ir/named.rs +++ b/src/ir/named.rs @@ -131,7 +131,7 @@ use super::item::ItemSet; use super::template::AsNamed; use super::traversal::{EdgeKind, Trace}; use super::ty::{TemplateDeclaration, TypeKind}; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::fmt; /// An analysis in the monotone framework. @@ -263,6 +263,8 @@ pub struct UsedTemplateParameters<'ctx, 'gen> used: HashMap>, dependencies: HashMap>, + + whitelisted_items: HashSet, } impl<'ctx, 'gen> UsedTemplateParameters<'ctx, 'gen> { @@ -316,21 +318,30 @@ impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { -> UsedTemplateParameters<'ctx, 'gen> { let mut used = HashMap::new(); let mut dependencies = HashMap::new(); + let whitelisted_items: HashSet<_> = ctx.whitelisted_items().collect(); - for item in ctx.whitelisted_items() { + for item in whitelisted_items.iter().cloned() { dependencies.entry(item).or_insert(vec![]); used.insert(item, Some(ItemSet::new())); { // We reverse our natural IR graph edges to find dependencies // between nodes. - item.trace(ctx, - &mut |sub_item, _| { - dependencies.entry(sub_item) - .or_insert(vec![]) - .push(item); - }, - &()); + item.trace(ctx, &mut |sub_item, _| { + // We won't be generating code for items that aren't + // whitelisted, so don't bother keeping track of their + // template parameters. But isn't whitelisting the + // transitive closure of reachable items from the explicitly + // whitelisted items? Usually! The exception is explicitly + // blacklisted items. + if !whitelisted_items.contains(&sub_item) { + return; + } + + dependencies.entry(sub_item) + .or_insert(vec![]) + .push(item); + }, &()); } // Additionally, whether a template instantiation's template @@ -361,6 +372,7 @@ impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { ctx: ctx, used: used, dependencies: dependencies, + whitelisted_items: whitelisted_items, } } @@ -395,6 +407,19 @@ impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { used_by_this_id.insert(id); } + // We say that blacklisted items use all of their template + // parameters. The blacklisted type is most likely implemented + // explicitly by the user, since it won't be in the generated + // bindings, and we don't know exactly what they'll to with template + // parameters, but we can push the issue down the line to them. + Some(&TypeKind::TemplateInstantiation(ref inst)) + if !self.whitelisted_items.contains(&inst.template_definition()) => { + let args = inst.template_arguments() + .iter() + .filter_map(|a| a.as_named(self.ctx, &())); + used_by_this_id.extend(args); + } + // A template instantiation's concrete template argument is // only used if the template declaration uses the // corresponding template parameter. @@ -404,12 +429,12 @@ impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { let params = decl.self_template_params(self.ctx) .unwrap_or(vec![]); + for (arg, param) in args.iter().zip(params.iter()) { - let used_by_definition = self.used - [&inst.template_definition()] + let used_by_def = self.used[&inst.template_definition()] .as_ref() .unwrap(); - if used_by_definition.contains(param) { + if used_by_def.contains(param) { if let Some(named) = arg.as_named(self.ctx, &()) { used_by_this_id.insert(named); } @@ -421,7 +446,12 @@ impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { // parameter usage. _ => { item.trace(self.ctx, &mut |sub_id, edge_kind| { - if sub_id == id || !Self::consider_edge(edge_kind) { + // Ignore ourselves, since union with ourself is a + // no-op. Ignore edges that aren't relevant to the + // analysis. Ignore edges to blacklisted items. + if sub_id == id || + !Self::consider_edge(edge_kind) || + !self.whitelisted_items.contains(&sub_id) { return; } diff --git a/tests/expectations/tests/issue-584-stylo-template-analysis-panic.rs b/tests/expectations/tests/issue-584-stylo-template-analysis-panic.rs new file mode 100644 index 0000000000..91b8e49a16 --- /dev/null +++ b/tests/expectations/tests/issue-584-stylo-template-analysis-panic.rs @@ -0,0 +1,80 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(non_snake_case)] + +pub type RefPtr = T; + +#[repr(C)] +#[derive(Debug, Copy)] +pub struct b { + pub _base: g, +} +#[test] +fn bindgen_test_layout_b() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( b ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( b ) )); +} +impl Clone for b { + fn clone(&self) -> Self { *self } +} +impl Default for b { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Debug, Default, Copy)] +pub struct A { + pub _address: u8, +} +pub type A_a = b; +#[test] +fn bindgen_test_layout_A() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( A ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( A ) )); +} +impl Clone for A { + fn clone(&self) -> Self { *self } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct e { + pub d: RefPtr, +} +impl Default for e { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct f { + pub _address: u8, +} +#[repr(C)] +#[derive(Debug, Copy)] +pub struct g { + pub h: f, +} +#[test] +fn bindgen_test_layout_g() { + assert_eq!(::std::mem::size_of::() , 1usize , concat ! ( + "Size of: " , stringify ! ( g ) )); + assert_eq! (::std::mem::align_of::() , 1usize , concat ! ( + "Alignment of " , stringify ! ( g ) )); + assert_eq! (unsafe { & ( * ( 0 as * const g ) ) . h as * const _ as usize + } , 0usize , concat ! ( + "Alignment of field: " , stringify ! ( g ) , "::" , stringify + ! ( h ) )); +} +impl Clone for g { + fn clone(&self) -> Self { *self } +} +impl Default for g { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +extern "C" { + #[link_name = "_Z25Servo_Element_GetSnapshotv"] + pub fn Servo_Element_GetSnapshot() -> A; +} diff --git a/tests/headers/issue-584-stylo-template-analysis-panic.hpp b/tests/headers/issue-584-stylo-template-analysis-panic.hpp new file mode 100644 index 0000000000..3bf00e5da9 --- /dev/null +++ b/tests/headers/issue-584-stylo-template-analysis-panic.hpp @@ -0,0 +1,13 @@ +// bindgen-flags: --blacklist-type RefPtr --whitelist-function 'Servo_.*' --raw-line 'pub type RefPtr = T;' -- -std=c++14 +template class RefPtr; +class b; +class A { + typedef b a; +}; +template class e { RefPtr d; }; +template class f {}; +class g { + f> h; +}; +class b : g {}; +A Servo_Element_GetSnapshot(); From 5a822f32b31696d27a75a047ddee529437261589 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 10 Apr 2017 13:42:10 -0700 Subject: [PATCH 0446/2291] Bump to version 0.23.0 --- Cargo.lock | 20 ++++++++++---------- Cargo.toml | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f8a7928ba2..9006946ed4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,12 +1,12 @@ [root] name = "bindgen" -version = "0.22.1" +version = "0.23.0" dependencies = [ "aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "clang-sys 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.23.1 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.23.2 (registry+https://github.com/rust-lang/crates.io-index)", "diff 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -81,14 +81,14 @@ dependencies = [ [[package]] name = "clap" -version = "2.23.1" +version = "2.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "term_size 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "vec_map 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -267,7 +267,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_json" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -340,7 +340,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -354,7 +354,7 @@ dependencies = [ [[package]] name = "term_size" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -437,7 +437,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d" "checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c" "checksum clang-sys 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "905d957c19424e25e4bd359e0009cbdecfd765f2632fd8d2ba1b576fadd22dc2" -"checksum clap 2.23.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d480c39a2e5f9b3a3798c661613e1b0e7a7ae71e005102d4aa910fc3289df484" +"checksum clap 2.23.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf1114886d7cde2d6448517161d7db8d681a9a1c09f7d210f0b0864e48195f6" "checksum diff 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0a515461b6c8c08419850ced27bc29e86166dcdcde8fbe76f8b1f0589bb49472" "checksum dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90" "checksum env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e3856f1697098606fc6cb97a93de88ca3f3bc35bb878c725920e6e82ecf05e83" @@ -462,7 +462,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum regex-syntax 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9191b1f57603095f105d317e375d19b1c9c5c3185ea9633a99a6dcbed04457" "checksum rustc-serialize 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "684ce48436d6465300c9ea783b6b14c4361d6b8dcbb1375b486a69cc19e2dfb0" "checksum serde 0.9.13 (registry+https://github.com/rust-lang/crates.io-index)" = "231dfd55909400769e437326cfb4af8bec97c3dd56ab3d02df8ef5c7e00f179b" -"checksum serde_json 0.9.9 (registry+https://github.com/rust-lang/crates.io-index)" = "dbc45439552eb8fb86907a2c41c1fd0ef97458efb87ff7f878db466eb581824e" +"checksum serde_json 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ad8bcf487be7d2e15d3d543f04312de991d631cfe1b43ea0ade69e6a8a5b16a1" "checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" "checksum siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0df90a788073e8d0235a67e50441d47db7c8ad9debd91cbf43736a2a92d36537" "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" @@ -472,7 +472,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6e0e4dbae163dd98989464c23dd503161b338790640e11537686f2ef0f25c791" "checksum target_build_utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f42dc058080c19c6a58bdd1bf962904ee4f5ef1fe2a81b529f31dacc750c679f" "checksum term 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d168af3930b369cfe245132550579d47dfd873d69470755a19c2c6568dbbd989" -"checksum term_size 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "07b6c1ac5b3fffd75073276bca1ceed01f67a28537097a2a9539e116e50fb21a" +"checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209" "checksum thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4437c97558c70d129e40629a5b385b3fb1ffac301e63941335e4d354081ec14a" "checksum thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c85048c6260d17cf486ceae3282d9fb6b90be220bf5b28c400f5485ffc29f0c7" "checksum unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18127285758f0e2c6cf325bb3f3d138a12fee27de4f23e146cd6a179f26c2cf3" diff --git a/Cargo.toml b/Cargo.toml index cee1110cf9..c01d1afb98 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.22.1" +version = "0.23.0" build = "build.rs" exclude = ["tests/headers", "tests/expectations", "bindgen-integration", "ci"] From aaaa08ad1e6be8805b4ac2b482595b8b15fc034b Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 10 Apr 2017 13:29:49 -0700 Subject: [PATCH 0447/2291] Add a Stylo bindings sanity test This commit adds a sanity test that we can generate bindings for Stylo without any errors. I tried to make this a `#[bench]` but each iteration takes 36 seconds on my machine, which made the `#[bench]` take *way* too long. Instead, there is a commented out `panic!` that can be uncommented to get a log of how long it took. --- .gitattributes | 1 + Cargo.toml | 6 +- tests/stylo.hpp | 177914 +++++++++++++++++++++++++++++++++++++++ tests/stylo_sanity.rs | 547 + 4 files changed, 178467 insertions(+), 1 deletion(-) create mode 100644 .gitattributes create mode 100644 tests/stylo.hpp create mode 100755 tests/stylo_sanity.rs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..84af5d5b7f --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +tests/stylo.hpp -diff diff --git a/Cargo.toml b/Cargo.toml index cee1110cf9..e40bbc1781 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,11 @@ documentation = "https://docs.rs/bindgen" version = "0.22.1" build = "build.rs" -exclude = ["tests/headers", "tests/expectations", "bindgen-integration", "ci"] +exclude = [ + "bindgen-integration", + "ci", + "tests/**", +] [badges] travis-ci = { repository = "servo/rust-bindgen" } diff --git a/tests/stylo.hpp b/tests/stylo.hpp new file mode 100644 index 0000000000..d6eabc3542 --- /dev/null +++ b/tests/stylo.hpp @@ -0,0 +1,177914 @@ +# 1 "stylo.cpp" +# 1 "" 1 +# 1 "" 3 +# 352 "" 3 +# 1 "" 1 +# 1 "" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla-config.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla-config.h" +#pragma clang diagnostic push + +#pragma clang diagnostic ignored "-Wreserved-id-macro" +# 213 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla-config.h" +#pragma clang diagnostic pop +# 223 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla-config.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Char16.h" 1 +# 184 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Char16.h" +typedef const char16_t* char16ptr_t; + + + +static_assert(sizeof(char16_t) == 2, "Is char16_t type 16 bits?"); +static_assert(char16_t(-1) > char16_t(0), "Is char16_t type unsigned?"); +static_assert(sizeof(u'A') == 2, "Is unicode char literal 16 bits?"); +static_assert(sizeof(u""[0]) == 2, "Is unicode string char 16 bits?"); +# 224 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla-config.h" 2 +# 2 "" 2 +# 1 "stylo.cpp" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stdint.h" 1 3 +# 63 "/usr/local/bin/../lib/clang/3.9.1/include/stdint.h" 3 +# 1 "/usr/include/stdint.h" 1 3 4 +# 25 "/usr/include/stdint.h" 3 4 +# 1 "/usr/include/features.h" 1 3 4 +# 346 "/usr/include/features.h" 3 4 +# 1 "/usr/include/stdc-predef.h" 1 3 4 +# 347 "/usr/include/features.h" 2 3 4 +# 368 "/usr/include/features.h" 3 4 +# 1 "/usr/include/sys/cdefs.h" 1 3 4 +# 415 "/usr/include/sys/cdefs.h" 3 4 +# 1 "/usr/include/bits/wordsize.h" 1 3 4 +# 416 "/usr/include/sys/cdefs.h" 2 3 4 +# 369 "/usr/include/features.h" 2 3 4 +# 392 "/usr/include/features.h" 3 4 +# 1 "/usr/include/gnu/stubs.h" 1 3 4 +# 10 "/usr/include/gnu/stubs.h" 3 4 +# 1 "/usr/include/gnu/stubs-64.h" 1 3 4 +# 11 "/usr/include/gnu/stubs.h" 2 3 4 +# 393 "/usr/include/features.h" 2 3 4 +# 26 "/usr/include/stdint.h" 2 3 4 +# 1 "/usr/include/bits/wchar.h" 1 3 4 +# 27 "/usr/include/stdint.h" 2 3 4 +# 1 "/usr/include/bits/wordsize.h" 1 3 4 +# 28 "/usr/include/stdint.h" 2 3 4 + + + + + + + + +typedef signed char int8_t; +typedef short int int16_t; +typedef int int32_t; + +typedef long int int64_t; + + + + + + + +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; + +typedef unsigned int uint32_t; + + + +typedef unsigned long int uint64_t; +# 65 "/usr/include/stdint.h" 3 4 +typedef signed char int_least8_t; +typedef short int int_least16_t; +typedef int int_least32_t; + +typedef long int int_least64_t; + + + + + + +typedef unsigned char uint_least8_t; +typedef unsigned short int uint_least16_t; +typedef unsigned int uint_least32_t; + +typedef unsigned long int uint_least64_t; +# 90 "/usr/include/stdint.h" 3 4 +typedef signed char int_fast8_t; + +typedef long int int_fast16_t; +typedef long int int_fast32_t; +typedef long int int_fast64_t; +# 103 "/usr/include/stdint.h" 3 4 +typedef unsigned char uint_fast8_t; + +typedef unsigned long int uint_fast16_t; +typedef unsigned long int uint_fast32_t; +typedef unsigned long int uint_fast64_t; +# 119 "/usr/include/stdint.h" 3 4 +typedef long int intptr_t; + + +typedef unsigned long int uintptr_t; +# 134 "/usr/include/stdint.h" 3 4 +typedef long int intmax_t; +typedef unsigned long int uintmax_t; +# 64 "/usr/local/bin/../lib/clang/3.9.1/include/stdint.h" 2 3 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoTypes.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoTypes.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Attributes.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Attributes.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Compiler.h" 1 +# 49 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Compiler.h" +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstddef" 1 3 +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstddef" 3 + + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 1 3 + + +# 1 "/usr/include/bits/wordsize.h" 1 3 4 +# 4 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 2 3 +# 2106 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 3 +namespace std +{ + typedef long unsigned int size_t; + typedef long int ptrdiff_t; + + + typedef decltype(nullptr) nullptr_t; + +} +# 2128 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 3 +namespace std +{ + inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } +} +namespace __gnu_cxx +{ + inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } +} +# 2414 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/os_defines.h" 1 3 +# 2415 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 2 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/cpu_defines.h" 1 3 +# 2418 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 2 3 +# 50 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstddef" 2 3 +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 51 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 3 +typedef long int ptrdiff_t; +# 62 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 3 +typedef long unsigned int size_t; +# 118 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 3 +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/__stddef_max_align_t.h" 1 3 +# 35 "/usr/local/bin/../lib/clang/3.9.1/include/__stddef_max_align_t.h" 3 +typedef struct { + long long __clang_max_align_nonce1 + __attribute__((__aligned__(__alignof__(long long)))); + long double __clang_max_align_nonce2 + __attribute__((__aligned__(__alignof__(long double)))); +} max_align_t; +# 119 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 2 3 +# 51 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstddef" 2 3 + + +namespace std +{ + + using ::max_align_t; +} +# 50 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Compiler.h" 2 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Attributes.h" 2 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerTypeTraits.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerTypeTraits.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Types.h" 1 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Types.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Types.h" 2 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" 2 + + + + + + + +# 1 "/usr/include/wchar.h" 1 3 4 +# 36 "/usr/include/wchar.h" 3 4 +# 1 "/usr/include/stdio.h" 1 3 4 +# 44 "/usr/include/stdio.h" 3 4 +struct _IO_FILE; + + + +typedef struct _IO_FILE FILE; +# 64 "/usr/include/stdio.h" 3 4 +typedef struct _IO_FILE __FILE; +# 37 "/usr/include/wchar.h" 2 3 4 + + +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stdarg.h" 1 3 4 +# 30 "/usr/local/bin/../lib/clang/3.9.1/include/stdarg.h" 3 4 +typedef __builtin_va_list va_list; +# 50 "/usr/local/bin/../lib/clang/3.9.1/include/stdarg.h" 3 4 +typedef __builtin_va_list __gnuc_va_list; +# 40 "/usr/include/wchar.h" 2 3 4 +# 51 "/usr/include/wchar.h" 3 4 +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 132 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 3 4 +typedef unsigned int wint_t; +# 52 "/usr/include/wchar.h" 2 3 4 +# 82 "/usr/include/wchar.h" 3 4 +typedef struct +{ + int __count; + union + { + + unsigned int __wch; + + + + char __wchb[4]; + } __value; +} __mbstate_t; +# 106 "/usr/include/wchar.h" 3 4 +typedef __mbstate_t mbstate_t; +# 132 "/usr/include/wchar.h" 3 4 +extern "C" { + + + + +struct tm; +# 147 "/usr/include/wchar.h" 3 4 +extern wchar_t *wcscpy (wchar_t *__restrict __dest, + const wchar_t *__restrict __src) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern wchar_t *wcsncpy (wchar_t *__restrict __dest, + const wchar_t *__restrict __src, size_t __n) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern wchar_t *wcscat (wchar_t *__restrict __dest, + const wchar_t *__restrict __src) + throw () __attribute__ ((__nonnull__ (1, 2))); + +extern wchar_t *wcsncat (wchar_t *__restrict __dest, + const wchar_t *__restrict __src, size_t __n) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int wcscmp (const wchar_t *__s1, const wchar_t *__s2) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + +extern int wcsncmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + + + + +extern int wcscasecmp (const wchar_t *__s1, const wchar_t *__s2) throw (); + + +extern int wcsncasecmp (const wchar_t *__s1, const wchar_t *__s2, + size_t __n) throw (); + + + + +# 1 "/usr/include/xlocale.h" 1 3 4 +# 27 "/usr/include/xlocale.h" 3 4 +typedef struct __locale_struct +{ + + struct __locale_data *__locales[13]; + + + const unsigned short int *__ctype_b; + const int *__ctype_tolower; + const int *__ctype_toupper; + + + const char *__names[13]; +} *__locale_t; + + +typedef __locale_t locale_t; +# 184 "/usr/include/wchar.h" 2 3 4 + +extern int wcscasecmp_l (const wchar_t *__s1, const wchar_t *__s2, + __locale_t __loc) throw (); + +extern int wcsncasecmp_l (const wchar_t *__s1, const wchar_t *__s2, + size_t __n, __locale_t __loc) throw (); + + + + + +extern int wcscoll (const wchar_t *__s1, const wchar_t *__s2) throw (); + + + +extern size_t wcsxfrm (wchar_t *__restrict __s1, + const wchar_t *__restrict __s2, size_t __n) throw (); +# 209 "/usr/include/wchar.h" 3 4 +extern int wcscoll_l (const wchar_t *__s1, const wchar_t *__s2, + __locale_t __loc) throw (); + + + + +extern size_t wcsxfrm_l (wchar_t *__s1, const wchar_t *__s2, + size_t __n, __locale_t __loc) throw (); + + +extern wchar_t *wcsdup (const wchar_t *__s) throw () __attribute__ ((__malloc__)); +# 230 "/usr/include/wchar.h" 3 4 +extern wchar_t *wcschr (const wchar_t *__wcs, wchar_t __wc) + throw () __attribute__ ((__pure__)); +# 240 "/usr/include/wchar.h" 3 4 +extern wchar_t *wcsrchr (const wchar_t *__wcs, wchar_t __wc) + throw () __attribute__ ((__pure__)); + + + + + + +extern wchar_t *wcschrnul (const wchar_t *__s, wchar_t __wc) + throw () __attribute__ ((__pure__)); + + + + + +extern size_t wcscspn (const wchar_t *__wcs, const wchar_t *__reject) + throw () __attribute__ ((__pure__)); + + +extern size_t wcsspn (const wchar_t *__wcs, const wchar_t *__accept) + throw () __attribute__ ((__pure__)); +# 269 "/usr/include/wchar.h" 3 4 +extern wchar_t *wcspbrk (const wchar_t *__wcs, const wchar_t *__accept) + throw () __attribute__ ((__pure__)); +# 280 "/usr/include/wchar.h" 3 4 +extern wchar_t *wcsstr (const wchar_t *__haystack, const wchar_t *__needle) + throw () __attribute__ ((__pure__)); + + + +extern wchar_t *wcstok (wchar_t *__restrict __s, + const wchar_t *__restrict __delim, + wchar_t **__restrict __ptr) throw (); + + +extern size_t wcslen (const wchar_t *__s) throw () __attribute__ ((__pure__)); +# 302 "/usr/include/wchar.h" 3 4 +extern wchar_t *wcswcs (const wchar_t *__haystack, const wchar_t *__needle) + throw () __attribute__ ((__pure__)); + + + + + +extern size_t wcsnlen (const wchar_t *__s, size_t __maxlen) + throw () __attribute__ ((__pure__)); +# 323 "/usr/include/wchar.h" 3 4 +extern wchar_t *wmemchr (const wchar_t *__s, wchar_t __c, size_t __n) + throw () __attribute__ ((__pure__)); + + + +extern int wmemcmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n) + throw () __attribute__ ((__pure__)); + + +extern wchar_t *wmemcpy (wchar_t *__restrict __s1, + const wchar_t *__restrict __s2, size_t __n) throw (); + + + +extern wchar_t *wmemmove (wchar_t *__s1, const wchar_t *__s2, size_t __n) + throw (); + + +extern wchar_t *wmemset (wchar_t *__s, wchar_t __c, size_t __n) throw (); + + + + + +extern wchar_t *wmempcpy (wchar_t *__restrict __s1, + const wchar_t *__restrict __s2, size_t __n) + throw (); + + + + + + +extern wint_t btowc (int __c) throw (); + + + +extern int wctob (wint_t __c) throw (); + + + +extern int mbsinit (const mbstate_t *__ps) throw () __attribute__ ((__pure__)); + + + +extern size_t mbrtowc (wchar_t *__restrict __pwc, + const char *__restrict __s, size_t __n, + mbstate_t *__restrict __p) throw (); + + +extern size_t wcrtomb (char *__restrict __s, wchar_t __wc, + mbstate_t *__restrict __ps) throw (); + + +extern size_t __mbrlen (const char *__restrict __s, size_t __n, + mbstate_t *__restrict __ps) throw (); +extern size_t mbrlen (const char *__restrict __s, size_t __n, + mbstate_t *__restrict __ps) throw (); +# 411 "/usr/include/wchar.h" 3 4 +extern size_t mbsrtowcs (wchar_t *__restrict __dst, + const char **__restrict __src, size_t __len, + mbstate_t *__restrict __ps) throw (); + + + +extern size_t wcsrtombs (char *__restrict __dst, + const wchar_t **__restrict __src, size_t __len, + mbstate_t *__restrict __ps) throw (); + + + + + + +extern size_t mbsnrtowcs (wchar_t *__restrict __dst, + const char **__restrict __src, size_t __nmc, + size_t __len, mbstate_t *__restrict __ps) throw (); + + + +extern size_t wcsnrtombs (char *__restrict __dst, + const wchar_t **__restrict __src, + size_t __nwc, size_t __len, + mbstate_t *__restrict __ps) throw (); + + + + + + +extern int wcwidth (wchar_t __c) throw (); + + + +extern int wcswidth (const wchar_t *__s, size_t __n) throw (); + + + + + + +extern double wcstod (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr) throw (); + + + + + +extern float wcstof (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr) throw (); +extern long double wcstold (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr) throw (); + + + + + + + +extern long int wcstol (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, int __base) throw (); + + + +extern unsigned long int wcstoul (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, int __base) + throw (); + + + + + + +__extension__ +extern long long int wcstoll (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, int __base) + throw (); + + + +__extension__ +extern unsigned long long int wcstoull (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, + int __base) throw (); + + + + + + +__extension__ +extern long long int wcstoq (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, int __base) + throw (); + + + +__extension__ +extern unsigned long long int wcstouq (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, + int __base) throw (); +# 533 "/usr/include/wchar.h" 3 4 +extern long int wcstol_l (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, int __base, + __locale_t __loc) throw (); + +extern unsigned long int wcstoul_l (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, + int __base, __locale_t __loc) throw (); + +__extension__ +extern long long int wcstoll_l (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, + int __base, __locale_t __loc) throw (); + +__extension__ +extern unsigned long long int wcstoull_l (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, + int __base, __locale_t __loc) + throw (); + +extern double wcstod_l (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, __locale_t __loc) + throw (); + +extern float wcstof_l (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, __locale_t __loc) + throw (); + +extern long double wcstold_l (const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, + __locale_t __loc) throw (); + + + + + + +extern wchar_t *wcpcpy (wchar_t *__restrict __dest, + const wchar_t *__restrict __src) throw (); + + + +extern wchar_t *wcpncpy (wchar_t *__restrict __dest, + const wchar_t *__restrict __src, size_t __n) + throw (); + + + + + + +extern __FILE *open_wmemstream (wchar_t **__bufloc, size_t *__sizeloc) throw (); + + + + + + +extern int fwide (__FILE *__fp, int __mode) throw (); + + + + + + +extern int fwprintf (__FILE *__restrict __stream, + const wchar_t *__restrict __format, ...) + ; + + + + +extern int wprintf (const wchar_t *__restrict __format, ...) + ; + +extern int swprintf (wchar_t *__restrict __s, size_t __n, + const wchar_t *__restrict __format, ...) + throw () ; + + + + + +extern int vfwprintf (__FILE *__restrict __s, + const wchar_t *__restrict __format, + __gnuc_va_list __arg) + ; + + + + +extern int vwprintf (const wchar_t *__restrict __format, + __gnuc_va_list __arg) + ; + + +extern int vswprintf (wchar_t *__restrict __s, size_t __n, + const wchar_t *__restrict __format, + __gnuc_va_list __arg) + throw () ; + + + + + + +extern int fwscanf (__FILE *__restrict __stream, + const wchar_t *__restrict __format, ...) + ; + + + + +extern int wscanf (const wchar_t *__restrict __format, ...) + ; + +extern int swscanf (const wchar_t *__restrict __s, + const wchar_t *__restrict __format, ...) + throw () ; +# 692 "/usr/include/wchar.h" 3 4 +extern int vfwscanf (__FILE *__restrict __s, + const wchar_t *__restrict __format, + __gnuc_va_list __arg) + ; + + + + +extern int vwscanf (const wchar_t *__restrict __format, + __gnuc_va_list __arg) + ; + +extern int vswscanf (const wchar_t *__restrict __s, + const wchar_t *__restrict __format, + __gnuc_va_list __arg) + throw () ; +# 748 "/usr/include/wchar.h" 3 4 +extern wint_t fgetwc (__FILE *__stream); +extern wint_t getwc (__FILE *__stream); + + + + + +extern wint_t getwchar (void); + + + + + + +extern wint_t fputwc (wchar_t __wc, __FILE *__stream); +extern wint_t putwc (wchar_t __wc, __FILE *__stream); + + + + + +extern wint_t putwchar (wchar_t __wc); + + + + + + + +extern wchar_t *fgetws (wchar_t *__restrict __ws, int __n, + __FILE *__restrict __stream); + + + + + +extern int fputws (const wchar_t *__restrict __ws, + __FILE *__restrict __stream); + + + + + + +extern wint_t ungetwc (wint_t __wc, __FILE *__stream); +# 804 "/usr/include/wchar.h" 3 4 +extern wint_t getwc_unlocked (__FILE *__stream); +extern wint_t getwchar_unlocked (void); + + + + + + + +extern wint_t fgetwc_unlocked (__FILE *__stream); + + + + + + + +extern wint_t fputwc_unlocked (wchar_t __wc, __FILE *__stream); +# 830 "/usr/include/wchar.h" 3 4 +extern wint_t putwc_unlocked (wchar_t __wc, __FILE *__stream); +extern wint_t putwchar_unlocked (wchar_t __wc); +# 840 "/usr/include/wchar.h" 3 4 +extern wchar_t *fgetws_unlocked (wchar_t *__restrict __ws, int __n, + __FILE *__restrict __stream); + + + + + + + +extern int fputws_unlocked (const wchar_t *__restrict __ws, + __FILE *__restrict __stream); + + + + + + + +extern size_t wcsftime (wchar_t *__restrict __s, size_t __maxsize, + const wchar_t *__restrict __format, + const struct tm *__restrict __tp) throw (); + + + + + + + +extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize, + const wchar_t *__restrict __format, + const struct tm *__restrict __tp, + __locale_t __loc) throw (); +# 894 "/usr/include/wchar.h" 3 4 +} +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" 2 + +namespace mozilla { + + + +template struct RemoveCV; +template struct AddRvalueReference; +# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +typename AddRvalueReference::Type DeclVal(); + + + + + + + +template +struct IntegralConstant +{ + static constexpr T value = Value; + typedef T ValueType; + typedef IntegralConstant Type; +}; + + +typedef IntegralConstant TrueType; +typedef IntegralConstant FalseType; + + + + + +namespace detail { + +template +struct IsVoidHelper : FalseType {}; + +template<> +struct IsVoidHelper : TrueType {}; + +} +# 80 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsVoid : detail::IsVoidHelper::Type> {}; + +namespace detail { + +template +struct IsIntegralHelper : FalseType {}; + +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; + +} +# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsIntegral : detail::IsIntegralHelper::Type> +{}; + +template +struct IsSame; + +namespace detail { + +template +struct IsFloatingPointHelper + : IntegralConstant::value || + IsSame::value || + IsSame::value> +{}; + +} +# 142 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsFloatingPoint + : detail::IsFloatingPointHelper::Type> +{}; + +namespace detail { + +template +struct IsArrayHelper : FalseType {}; + +template +struct IsArrayHelper : TrueType {}; + +template +struct IsArrayHelper : TrueType {}; + +} +# 168 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsArray : detail::IsArrayHelper::Type> +{}; + +namespace detail { + +template +struct IsFunPtr; + +template +struct IsFunPtr + : public FalseType +{}; + +template +struct IsFunPtr + : public TrueType +{}; + +}; +# 201 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsFunction + : public detail::IsFunPtr::Type *> +{}; + +namespace detail { + +template +struct IsPointerHelper : FalseType {}; + +template +struct IsPointerHelper : TrueType {}; + +} +# 231 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsPointer : detail::IsPointerHelper::Type> +{}; +# 246 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsLvalueReference : FalseType {}; + +template +struct IsLvalueReference : TrueType {}; +# 263 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsRvalueReference : FalseType {}; + +template +struct IsRvalueReference : TrueType {}; + +namespace detail { + + +template +struct IsEnumHelper + : IntegralConstant +{}; + +} +# 286 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsEnum + : detail::IsEnumHelper::Type> +{}; + +namespace detail { + + + + + +template +struct IsClassHelper + : IntegralConstant +{}; + +} +# 313 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsClass + : detail::IsClassHelper::Type> +{}; +# 334 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsReference + : IntegralConstant::value || IsRvalueReference::value> +{}; +# 348 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsArithmetic + : IntegralConstant::value || IsFloatingPoint::value> +{}; + +namespace detail { + +template +struct IsMemberPointerHelper : FalseType {}; + +template +struct IsMemberPointerHelper : TrueType {}; + +} +# 370 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsMemberPointer + : detail::IsMemberPointerHelper::Type> +{}; +# 382 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsScalar + : IntegralConstant::value || IsEnum::value || + IsPointer::value || IsMemberPointer::value> +{}; +# 397 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsConst : FalseType {}; + +template +struct IsConst : TrueType {}; +# 410 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsVolatile : FalseType {}; + +template +struct IsVolatile : TrueType {}; +# 424 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsPod : public FalseType {}; + +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template struct IsPod : TrueType {}; + +namespace detail { + + + + + +template +struct IsEmptyHelper + : IntegralConstant::value && __is_empty(T)> +{}; + +} +# 498 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsEmpty : detail::IsEmptyHelper::Type> +{}; + + +namespace detail { + +template::value, + bool = IsIntegral::value, + typename NoCV = typename RemoveCV::Type> +struct IsSignedHelper; + + +template +struct IsSignedHelper : TrueType {}; + + +template +struct IsSignedHelper + : IntegralConstant +{}; + + +template +struct IsSignedHelper : FalseType {}; + +} +# 536 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsSigned : detail::IsSignedHelper {}; + +namespace detail { + +template::value, + bool = IsIntegral::value, + typename NoCV = typename RemoveCV::Type> +struct IsUnsignedHelper; + + +template +struct IsUnsignedHelper : FalseType {}; + + +template +struct IsUnsignedHelper + : IntegralConstant::value || bool(NoCV(1) < NoCV(-1)))> +{}; + + +template +struct IsUnsignedHelper : FalseType {}; + +} +# 572 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsUnsigned : detail::IsUnsignedHelper {}; + +namespace detail { + +struct DoIsDefaultConstructibleImpl +{ + template + static TrueType test(int); + template + static FalseType test(...); +}; + +template +struct IsDefaultConstructibleImpl : public DoIsDefaultConstructibleImpl +{ + typedef decltype(test(0)) Type; +}; + +} +# 611 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsDefaultConstructible + : public detail::IsDefaultConstructibleImpl::Type +{}; + +namespace detail { + +struct DoIsDestructibleImpl +{ + template().~T())> + static TrueType test(int); + template + static FalseType test(...); +}; + +template +struct IsDestructibleImpl : public DoIsDestructibleImpl +{ + typedef decltype(test(0)) Type; +}; + +} +# 645 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsDestructible : public detail::IsDestructibleImpl::Type {}; +# 662 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsSame : FalseType {}; + +template +struct IsSame : TrueType {}; + +namespace detail { + + + +template +struct BaseOfTester : IntegralConstant {}; +# 727 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +} +# 741 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsBaseOf + : IntegralConstant::value> +{}; + +namespace detail { + +template +struct ConvertibleTester +{ +private: + template + static char test_helper(To1); + + template + static decltype(test_helper(DeclVal())) test(int); + + template + static int test(...); + +public: + static const bool value = + sizeof(test(0)) == sizeof(char); +}; + +} +# 793 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct IsConvertible + : IntegralConstant::value> +{}; + +template +struct IsConvertible + : IntegralConstant::value> +{}; + +template +struct IsConvertible + : IntegralConstant::value> +{}; + +template<> +struct IsConvertible + : TrueType +{}; +# 825 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct RemoveConst +{ + typedef T Type; +}; + +template +struct RemoveConst +{ + typedef T Type; +}; +# 845 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct RemoveVolatile +{ + typedef T Type; +}; + +template +struct RemoveVolatile +{ + typedef T Type; +}; +# 865 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct RemoveCV +{ + typedef typename RemoveConst::Type>::Type Type; +}; +# 881 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct RemoveReference +{ + typedef T Type; +}; + +template +struct RemoveReference +{ + typedef T Type; +}; + +template +struct RemoveReference +{ + typedef T Type; +}; + +template +struct Conditional; + +namespace detail { + +enum Voidness { TIsVoid, TIsNotVoid }; + +template::value ? TIsVoid : TIsNotVoid> +struct AddLvalueReferenceHelper; + +template +struct AddLvalueReferenceHelper +{ + typedef void Type; +}; + +template +struct AddLvalueReferenceHelper +{ + typedef T& Type; +}; + +} +# 937 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct AddLvalueReference + : detail::AddLvalueReferenceHelper +{}; + +namespace detail { + +template::value ? TIsVoid : TIsNotVoid> +struct AddRvalueReferenceHelper; + +template +struct AddRvalueReferenceHelper +{ + typedef void Type; +}; + +template +struct AddRvalueReferenceHelper +{ + typedef T&& Type; +}; + +} +# 976 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct AddRvalueReference + : detail::AddRvalueReferenceHelper +{}; + + + +template +struct EnableIf; + +namespace detail { + +template +struct WithC : Conditional +{}; + +template +struct WithV : Conditional +{}; + + +template +struct WithCV : WithC::Type> +{}; + +template +struct CorrespondingSigned; + +template<> +struct CorrespondingSigned { typedef signed char Type; }; +template<> +struct CorrespondingSigned { typedef signed char Type; }; +template<> +struct CorrespondingSigned { typedef short Type; }; +template<> +struct CorrespondingSigned { typedef int Type; }; +template<> +struct CorrespondingSigned { typedef long Type; }; +template<> +struct CorrespondingSigned { typedef long long Type; }; + +template::Type, + bool IsSignedIntegerType = IsSigned::value && + !IsSame::value> +struct MakeSigned; + +template +struct MakeSigned +{ + typedef T Type; +}; + +template +struct MakeSigned + : WithCV::value, IsVolatile::value, + typename CorrespondingSigned::Type> +{}; + +} +# 1059 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct MakeSigned + : EnableIf::value && + !IsSame::Type>::value, + typename detail::MakeSigned + >::Type +{}; + +namespace detail { + +template +struct CorrespondingUnsigned; + +template<> +struct CorrespondingUnsigned { typedef unsigned char Type; }; +template<> +struct CorrespondingUnsigned { typedef unsigned char Type; }; +template<> +struct CorrespondingUnsigned { typedef unsigned short Type; }; +template<> +struct CorrespondingUnsigned { typedef unsigned int Type; }; +template<> +struct CorrespondingUnsigned { typedef unsigned long Type; }; +template<> +struct CorrespondingUnsigned { typedef unsigned long long Type; }; + + +template::Type, + bool IsUnsignedIntegerType = IsUnsigned::value && + !IsSame::value> +struct MakeUnsigned; + +template +struct MakeUnsigned +{ + typedef T Type; +}; + +template +struct MakeUnsigned + : WithCV::value, IsVolatile::value, + typename CorrespondingUnsigned::Type> +{}; + +} +# 1128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct MakeUnsigned + : EnableIf::value && + !IsSame::Type>::value, + typename detail::MakeUnsigned + >::Type +{}; +# 1147 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct RemoveExtent +{ + typedef T Type; +}; + +template +struct RemoveExtent +{ + typedef T Type; +}; + +template +struct RemoveExtent +{ + typedef T Type; +}; + + + +namespace detail { + +template +struct RemovePointerHelper +{ + typedef T Type; +}; + +template +struct RemovePointerHelper +{ + typedef Pointee Type; +}; + +} +# 1198 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct RemovePointer + : detail::RemovePointerHelper::Type> +{}; +# 1213 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct AddPointer +{ + typedef typename RemoveReference::Type* Type; +}; +# 1239 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +struct EnableIf +{}; + +template +struct EnableIf +{ + typedef T Type; +}; + + + + + + + +template +struct Conditional +{ + typedef A Type; +}; + +template +struct Conditional +{ + typedef B Type; +}; + +namespace detail { + +template::value, + bool IsFunction = IsFunction::value> +struct DecaySelector; + +template +struct DecaySelector +{ + typedef typename RemoveCV::Type Type; +}; + +template +struct DecaySelector +{ + typedef typename RemoveExtent::Type* Type; +}; + +template +struct DecaySelector +{ + typedef typename AddPointer::Type Type; +}; + +}; +# 1306 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" +template +class Decay + : public detail::DecaySelector::Type> +{ +}; + +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerTypeTraits.h" 2 + + +namespace mozilla { + +namespace detail { + + + + + + +template +struct StdintTypeForSizeAndSignedness; + +template<> +struct StdintTypeForSizeAndSignedness<1, true> +{ + typedef int8_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<1, false> +{ + typedef uint8_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<2, true> +{ + typedef int16_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<2, false> +{ + typedef uint16_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<4, true> +{ + typedef int32_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<4, false> +{ + typedef uint32_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<8, true> +{ + typedef int64_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<8, false> +{ + typedef uint64_t Type; +}; + +} + +template +struct UnsignedStdintTypeForSize + : detail::StdintTypeForSizeAndSignedness +{}; + +template +struct SignedStdintTypeForSize + : detail::StdintTypeForSizeAndSignedness +{}; + +template +struct PositionOfSignBit +{ + static_assert(IsIntegral::value, + "PositionOfSignBit is only for integral types"); + + static const size_t value = 8 * sizeof(IntegerType) - 1; +}; + + + + + + +template +struct MinValue +{ +private: + static_assert(IsIntegral::value, + "MinValue is only for integral types"); + + typedef typename MakeUnsigned::Type UnsignedIntegerType; + static const size_t PosOfSignBit = PositionOfSignBit::value; + +public: + + + + + + + static const IntegerType value = + IsSigned::value + ? IntegerType(UnsignedIntegerType(1) << PosOfSignBit) + : IntegerType(0); +}; + + + + + + +template +struct MaxValue +{ + static_assert(IsIntegral::value, + "MaxValue is only for integral types"); + + + + + static const IntegerType value = ~MinValue::value; +}; + +} +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h" 2 + +namespace mozilla { +# 43 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h" +template +class CastableTypedEnumResult +{ +private: + const E mValue; + +public: + explicit constexpr CastableTypedEnumResult(E aValue) + : mValue(aValue) + {} + + constexpr operator E() const { return mValue; } + + template + explicit constexpr + operator DestinationType() const { return DestinationType(mValue); } + + constexpr bool operator !() const { return !bool(mValue); } +}; +# 84 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h" +template constexpr CastableTypedEnumResult operator |(const E& aE, const CastableTypedEnumResult& aR) { return CastableTypedEnumResult(aE | E(aR)); } template constexpr CastableTypedEnumResult operator |(const CastableTypedEnumResult& aR, const E& aE) { return CastableTypedEnumResult(E(aR) | aE); } template constexpr CastableTypedEnumResult operator |(const CastableTypedEnumResult& aR1, const CastableTypedEnumResult& aR2) { return CastableTypedEnumResult(E(aR1) | E(aR2)); } +template constexpr CastableTypedEnumResult operator &(const E& aE, const CastableTypedEnumResult& aR) { return CastableTypedEnumResult(aE & E(aR)); } template constexpr CastableTypedEnumResult operator &(const CastableTypedEnumResult& aR, const E& aE) { return CastableTypedEnumResult(E(aR) & aE); } template constexpr CastableTypedEnumResult operator &(const CastableTypedEnumResult& aR1, const CastableTypedEnumResult& aR2) { return CastableTypedEnumResult(E(aR1) & E(aR2)); } +template constexpr CastableTypedEnumResult operator ^(const E& aE, const CastableTypedEnumResult& aR) { return CastableTypedEnumResult(aE ^ E(aR)); } template constexpr CastableTypedEnumResult operator ^(const CastableTypedEnumResult& aR, const E& aE) { return CastableTypedEnumResult(E(aR) ^ aE); } template constexpr CastableTypedEnumResult operator ^(const CastableTypedEnumResult& aR1, const CastableTypedEnumResult& aR2) { return CastableTypedEnumResult(E(aR1) ^ E(aR2)); } +template constexpr bool operator ==(const E& aE, const CastableTypedEnumResult& aR) { return bool(aE == E(aR)); } template constexpr bool operator ==(const CastableTypedEnumResult& aR, const E& aE) { return bool(E(aR) == aE); } template constexpr bool operator ==(const CastableTypedEnumResult& aR1, const CastableTypedEnumResult& aR2) { return bool(E(aR1) == E(aR2)); } +template constexpr bool operator !=(const E& aE, const CastableTypedEnumResult& aR) { return bool(aE != E(aR)); } template constexpr bool operator !=(const CastableTypedEnumResult& aR, const E& aE) { return bool(E(aR) != aE); } template constexpr bool operator !=(const CastableTypedEnumResult& aR1, const CastableTypedEnumResult& aR2) { return bool(E(aR1) != E(aR2)); } + +template +constexpr CastableTypedEnumResult +operator ~(const CastableTypedEnumResult& aR) +{ + return CastableTypedEnumResult(~(E(aR))); +} +# 106 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h" +template E& operator &=(E& aR1, const CastableTypedEnumResult& aR2) { return aR1 &= E(aR2); } +template E& operator |=(E& aR1, const CastableTypedEnumResult& aR2) { return aR1 |= E(aR2); } +template E& operator ^=(E& aR1, const CastableTypedEnumResult& aR2) { return aR1 ^= E(aR2); } + + + + + +namespace detail { +template +struct UnsignedIntegerTypeForEnum + : UnsignedStdintTypeForSize +{}; +} + +} +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoTypes.h" 2 + + + + + + +struct ServoNodeData; +namespace mozilla { + + + + + +template +struct ServoUnsafeCell { + T value; + + + ServoUnsafeCell() : value() {}; +}; + +template +struct ServoCell { + ServoUnsafeCell value; + T Get() const { return value.value; } + void Set(T arg) { value.value = arg; } + ServoCell() : value() {}; +}; + + + + +enum class LazyComputeBehavior { + Allow, + Assert, +}; + + + + +enum class TraversalRootBehavior { + Normal, + UnstyledChildrenOnly, +}; + + +enum class UpdateAnimationsTasks : uint8_t { + CSSAnimations = 1 << 0, + CSSTransitions = 1 << 1, + EffectProperties = 1 << 2, + CascadeResults = 1 << 3, +}; + +inline constexpr mozilla::CastableTypedEnumResult operator |(UpdateAnimationsTasks a, UpdateAnimationsTasks b) { typedef mozilla::CastableTypedEnumResult Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum::Type U; return Result(UpdateAnimationsTasks(U(a) | U(b))); } inline UpdateAnimationsTasks& operator |=(UpdateAnimationsTasks& a, UpdateAnimationsTasks b) { return a = a | b; } inline constexpr mozilla::CastableTypedEnumResult operator &(UpdateAnimationsTasks a, UpdateAnimationsTasks b) { typedef mozilla::CastableTypedEnumResult Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum::Type U; return Result(UpdateAnimationsTasks(U(a) & U(b))); } inline UpdateAnimationsTasks& operator &=(UpdateAnimationsTasks& a, UpdateAnimationsTasks b) { return a = a & b; } inline constexpr mozilla::CastableTypedEnumResult operator ^(UpdateAnimationsTasks a, UpdateAnimationsTasks b) { typedef mozilla::CastableTypedEnumResult Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum::Type U; return Result(UpdateAnimationsTasks(U(a) ^ U(b))); } inline UpdateAnimationsTasks& operator ^=(UpdateAnimationsTasks& a, UpdateAnimationsTasks b) { return a = a ^ b; } inline constexpr mozilla::CastableTypedEnumResult operator~(UpdateAnimationsTasks a) { typedef mozilla::CastableTypedEnumResult Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum::Type U; return Result(UpdateAnimationsTasks(~(U(a)))); } + +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 1 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Likely.h" 1 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MacroArgs.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticAnalysisFunctions.h" 1 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTraceRefcnt.h" 1 + + + + + + + + +# 1 "/usr/include/stdio.h" 1 3 4 +# 29 "/usr/include/stdio.h" 3 4 +extern "C" { + + + + +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 34 "/usr/include/stdio.h" 2 3 4 + +# 1 "/usr/include/bits/types.h" 1 3 4 +# 27 "/usr/include/bits/types.h" 3 4 +# 1 "/usr/include/bits/wordsize.h" 1 3 4 +# 28 "/usr/include/bits/types.h" 2 3 4 + + +typedef unsigned char __u_char; +typedef unsigned short int __u_short; +typedef unsigned int __u_int; +typedef unsigned long int __u_long; + + +typedef signed char __int8_t; +typedef unsigned char __uint8_t; +typedef signed short int __int16_t; +typedef unsigned short int __uint16_t; +typedef signed int __int32_t; +typedef unsigned int __uint32_t; + +typedef signed long int __int64_t; +typedef unsigned long int __uint64_t; + + + + + + + +typedef long int __quad_t; +typedef unsigned long int __u_quad_t; +# 121 "/usr/include/bits/types.h" 3 4 +# 1 "/usr/include/bits/typesizes.h" 1 3 4 +# 122 "/usr/include/bits/types.h" 2 3 4 + + +typedef unsigned long int __dev_t; +typedef unsigned int __uid_t; +typedef unsigned int __gid_t; +typedef unsigned long int __ino_t; +typedef unsigned long int __ino64_t; +typedef unsigned int __mode_t; +typedef unsigned long int __nlink_t; +typedef long int __off_t; +typedef long int __off64_t; +typedef int __pid_t; +typedef struct { int __val[2]; } __fsid_t; +typedef long int __clock_t; +typedef unsigned long int __rlim_t; +typedef unsigned long int __rlim64_t; +typedef unsigned int __id_t; +typedef long int __time_t; +typedef unsigned int __useconds_t; +typedef long int __suseconds_t; + +typedef int __daddr_t; +typedef int __key_t; + + +typedef int __clockid_t; + + +typedef void * __timer_t; + + +typedef long int __blksize_t; + + + + +typedef long int __blkcnt_t; +typedef long int __blkcnt64_t; + + +typedef unsigned long int __fsblkcnt_t; +typedef unsigned long int __fsblkcnt64_t; + + +typedef unsigned long int __fsfilcnt_t; +typedef unsigned long int __fsfilcnt64_t; + + +typedef long int __fsword_t; + +typedef long int __ssize_t; + + +typedef long int __syscall_slong_t; + +typedef unsigned long int __syscall_ulong_t; + + + +typedef __off64_t __loff_t; +typedef __quad_t *__qaddr_t; +typedef char *__caddr_t; + + +typedef long int __intptr_t; + + +typedef unsigned int __socklen_t; +# 36 "/usr/include/stdio.h" 2 3 4 +# 74 "/usr/include/stdio.h" 3 4 +# 1 "/usr/include/libio.h" 1 3 4 +# 31 "/usr/include/libio.h" 3 4 +# 1 "/usr/include/_G_config.h" 1 3 4 +# 15 "/usr/include/_G_config.h" 3 4 +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 16 "/usr/include/_G_config.h" 2 3 4 + + + + +# 1 "/usr/include/wchar.h" 1 3 4 +# 21 "/usr/include/_G_config.h" 2 3 4 +typedef struct +{ + __off_t __pos; + __mbstate_t __state; +} _G_fpos_t; +typedef struct +{ + __off64_t __pos; + __mbstate_t __state; +} _G_fpos64_t; +# 32 "/usr/include/libio.h" 2 3 4 +# 144 "/usr/include/libio.h" 3 4 +struct _IO_jump_t; struct _IO_FILE; + + + + + +typedef void _IO_lock_t; + + + + + +struct _IO_marker { + struct _IO_marker *_next; + struct _IO_FILE *_sbuf; + + + + int _pos; +# 173 "/usr/include/libio.h" 3 4 +}; + + +enum __codecvt_result +{ + __codecvt_ok, + __codecvt_partial, + __codecvt_error, + __codecvt_noconv +}; +# 241 "/usr/include/libio.h" 3 4 +struct _IO_FILE { + int _flags; + + + + + char* _IO_read_ptr; + char* _IO_read_end; + char* _IO_read_base; + char* _IO_write_base; + char* _IO_write_ptr; + char* _IO_write_end; + char* _IO_buf_base; + char* _IO_buf_end; + + char *_IO_save_base; + char *_IO_backup_base; + char *_IO_save_end; + + struct _IO_marker *_markers; + + struct _IO_FILE *_chain; + + int _fileno; + + + + int _flags2; + + __off_t _old_offset; + + + + unsigned short _cur_column; + signed char _vtable_offset; + char _shortbuf[1]; + + + + _IO_lock_t *_lock; +# 289 "/usr/include/libio.h" 3 4 + __off64_t _offset; + + + + + + + + void *__pad1; + void *__pad2; + void *__pad3; + void *__pad4; + + size_t __pad5; + int _mode; + + char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; + +}; + + + + + +struct _IO_FILE_plus; + +extern struct _IO_FILE_plus _IO_2_1_stdin_; +extern struct _IO_FILE_plus _IO_2_1_stdout_; +extern struct _IO_FILE_plus _IO_2_1_stderr_; +# 333 "/usr/include/libio.h" 3 4 +typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); + + + + + + + +typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf, + size_t __n); + + + + + + + +typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w); + + +typedef int __io_close_fn (void *__cookie); + + + + +typedef __io_read_fn cookie_read_function_t; +typedef __io_write_fn cookie_write_function_t; +typedef __io_seek_fn cookie_seek_function_t; +typedef __io_close_fn cookie_close_function_t; + + +typedef struct +{ + __io_read_fn *read; + __io_write_fn *write; + __io_seek_fn *seek; + __io_close_fn *close; +} _IO_cookie_io_functions_t; +typedef _IO_cookie_io_functions_t cookie_io_functions_t; + +struct _IO_cookie_file; + + +extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write, + void *__cookie, _IO_cookie_io_functions_t __fns); + + + + +extern "C" { + + +extern int __underflow (_IO_FILE *); +extern int __uflow (_IO_FILE *); +extern int __overflow (_IO_FILE *, int); +# 429 "/usr/include/libio.h" 3 4 +extern int _IO_getc (_IO_FILE *__fp); +extern int _IO_putc (int __c, _IO_FILE *__fp); +extern int _IO_feof (_IO_FILE *__fp) throw (); +extern int _IO_ferror (_IO_FILE *__fp) throw (); + +extern int _IO_peekc_locked (_IO_FILE *__fp); + + + + + +extern void _IO_flockfile (_IO_FILE *) throw (); +extern void _IO_funlockfile (_IO_FILE *) throw (); +extern int _IO_ftrylockfile (_IO_FILE *) throw (); +# 459 "/usr/include/libio.h" 3 4 +extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, + __gnuc_va_list, int *__restrict); +extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, + __gnuc_va_list); +extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t); +extern size_t _IO_sgetn (_IO_FILE *, void *, size_t); + +extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int); +extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int); + +extern void _IO_free_backup_area (_IO_FILE *) throw (); +# 521 "/usr/include/libio.h" 3 4 +} +# 75 "/usr/include/stdio.h" 2 3 4 + + + + +typedef __gnuc_va_list va_list; +# 90 "/usr/include/stdio.h" 3 4 +typedef __off_t off_t; + + + + + + +typedef __off64_t off64_t; + + + + + + +typedef __ssize_t ssize_t; + + + + + + + +typedef _G_fpos_t fpos_t; + + + + + +typedef _G_fpos64_t fpos64_t; +# 166 "/usr/include/stdio.h" 3 4 +# 1 "/usr/include/bits/stdio_lim.h" 1 3 4 +# 167 "/usr/include/stdio.h" 2 3 4 + + + +extern struct _IO_FILE *stdin; +extern struct _IO_FILE *stdout; +extern struct _IO_FILE *stderr; + + + + + + + +extern int remove (const char *__filename) throw (); + +extern int rename (const char *__old, const char *__new) throw (); + + + + +extern int renameat (int __oldfd, const char *__old, int __newfd, + const char *__new) throw (); +# 197 "/usr/include/stdio.h" 3 4 +extern FILE *tmpfile (void) ; +# 207 "/usr/include/stdio.h" 3 4 +extern FILE *tmpfile64 (void) ; + + + +extern char *tmpnam (char *__s) throw () ; + + + + + +extern char *tmpnam_r (char *__s) throw () ; +# 229 "/usr/include/stdio.h" 3 4 +extern char *tempnam (const char *__dir, const char *__pfx) + throw () __attribute__ ((__malloc__)) ; +# 239 "/usr/include/stdio.h" 3 4 +extern int fclose (FILE *__stream); + + + + +extern int fflush (FILE *__stream); +# 254 "/usr/include/stdio.h" 3 4 +extern int fflush_unlocked (FILE *__stream); +# 264 "/usr/include/stdio.h" 3 4 +extern int fcloseall (void); +# 274 "/usr/include/stdio.h" 3 4 +extern FILE *fopen (const char *__restrict __filename, + const char *__restrict __modes) ; + + + + +extern FILE *freopen (const char *__restrict __filename, + const char *__restrict __modes, + FILE *__restrict __stream) ; +# 299 "/usr/include/stdio.h" 3 4 +extern FILE *fopen64 (const char *__restrict __filename, + const char *__restrict __modes) ; +extern FILE *freopen64 (const char *__restrict __filename, + const char *__restrict __modes, + FILE *__restrict __stream) ; + + + + +extern FILE *fdopen (int __fd, const char *__modes) throw () ; + + + + + +extern FILE *fopencookie (void *__restrict __magic_cookie, + const char *__restrict __modes, + _IO_cookie_io_functions_t __io_funcs) throw () ; + + + + +extern FILE *fmemopen (void *__s, size_t __len, const char *__modes) + throw () ; + + + + +extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) throw () ; + + + + + + +extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) throw (); + + + +extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, + int __modes, size_t __n) throw (); + + + + + +extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, + size_t __size) throw (); + + +extern void setlinebuf (FILE *__stream) throw (); +# 358 "/usr/include/stdio.h" 3 4 +extern int fprintf (FILE *__restrict __stream, + const char *__restrict __format, ...); + + + + +extern int printf (const char *__restrict __format, ...); + +extern int sprintf (char *__restrict __s, + const char *__restrict __format, ...) throw (); + + + + + +extern int vfprintf (FILE *__restrict __s, const char *__restrict __format, + __gnuc_va_list __arg); + + + + +extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg); + +extern int vsprintf (char *__restrict __s, const char *__restrict __format, + __gnuc_va_list __arg) throw (); + + + + + +extern int snprintf (char *__restrict __s, size_t __maxlen, + const char *__restrict __format, ...) + throw () __attribute__ ((__format__ (__printf__, 3, 4))); + +extern int vsnprintf (char *__restrict __s, size_t __maxlen, + const char *__restrict __format, __gnuc_va_list __arg) + throw () __attribute__ ((__format__ (__printf__, 3, 0))); + + + + + + +extern int vasprintf (char **__restrict __ptr, const char *__restrict __f, + __gnuc_va_list __arg) + throw () __attribute__ ((__format__ (__printf__, 2, 0))) ; +extern int __asprintf (char **__restrict __ptr, + const char *__restrict __fmt, ...) + throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; +extern int asprintf (char **__restrict __ptr, + const char *__restrict __fmt, ...) + throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; + + + + +extern int vdprintf (int __fd, const char *__restrict __fmt, + __gnuc_va_list __arg) + __attribute__ ((__format__ (__printf__, 2, 0))); +extern int dprintf (int __fd, const char *__restrict __fmt, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); +# 427 "/usr/include/stdio.h" 3 4 +extern int fscanf (FILE *__restrict __stream, + const char *__restrict __format, ...) ; + + + + +extern int scanf (const char *__restrict __format, ...) ; + +extern int sscanf (const char *__restrict __s, + const char *__restrict __format, ...) throw (); +# 473 "/usr/include/stdio.h" 3 4 +extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, + __gnuc_va_list __arg) + __attribute__ ((__format__ (__scanf__, 2, 0))) ; + + + + + +extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) + __attribute__ ((__format__ (__scanf__, 1, 0))) ; + + +extern int vsscanf (const char *__restrict __s, + const char *__restrict __format, __gnuc_va_list __arg) + throw () __attribute__ ((__format__ (__scanf__, 2, 0))); +# 533 "/usr/include/stdio.h" 3 4 +extern int fgetc (FILE *__stream); +extern int getc (FILE *__stream); + + + + + +extern int getchar (void); +# 552 "/usr/include/stdio.h" 3 4 +extern int getc_unlocked (FILE *__stream); +extern int getchar_unlocked (void); +# 563 "/usr/include/stdio.h" 3 4 +extern int fgetc_unlocked (FILE *__stream); +# 575 "/usr/include/stdio.h" 3 4 +extern int fputc (int __c, FILE *__stream); +extern int putc (int __c, FILE *__stream); + + + + + +extern int putchar (int __c); +# 596 "/usr/include/stdio.h" 3 4 +extern int fputc_unlocked (int __c, FILE *__stream); + + + + + + + +extern int putc_unlocked (int __c, FILE *__stream); +extern int putchar_unlocked (int __c); + + + + + + +extern int getw (FILE *__stream); + + +extern int putw (int __w, FILE *__stream); +# 624 "/usr/include/stdio.h" 3 4 +extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) + ; +# 651 "/usr/include/stdio.h" 3 4 +extern char *fgets_unlocked (char *__restrict __s, int __n, + FILE *__restrict __stream) ; +# 667 "/usr/include/stdio.h" 3 4 +extern __ssize_t __getdelim (char **__restrict __lineptr, + size_t *__restrict __n, int __delimiter, + FILE *__restrict __stream) ; +extern __ssize_t getdelim (char **__restrict __lineptr, + size_t *__restrict __n, int __delimiter, + FILE *__restrict __stream) ; + + + + + + + +extern __ssize_t getline (char **__restrict __lineptr, + size_t *__restrict __n, + FILE *__restrict __stream) ; +# 691 "/usr/include/stdio.h" 3 4 +extern int fputs (const char *__restrict __s, FILE *__restrict __stream); + + + + + +extern int puts (const char *__s); + + + + + + +extern int ungetc (int __c, FILE *__stream); + + + + + + +extern size_t fread (void *__restrict __ptr, size_t __size, + size_t __n, FILE *__restrict __stream) ; + + + + +extern size_t fwrite (const void *__restrict __ptr, size_t __size, + size_t __n, FILE *__restrict __s); +# 728 "/usr/include/stdio.h" 3 4 +extern int fputs_unlocked (const char *__restrict __s, + FILE *__restrict __stream); +# 739 "/usr/include/stdio.h" 3 4 +extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, + size_t __n, FILE *__restrict __stream) ; +extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size, + size_t __n, FILE *__restrict __stream); +# 751 "/usr/include/stdio.h" 3 4 +extern int fseek (FILE *__stream, long int __off, int __whence); + + + + +extern long int ftell (FILE *__stream) ; + + + + +extern void rewind (FILE *__stream); +# 775 "/usr/include/stdio.h" 3 4 +extern int fseeko (FILE *__stream, __off_t __off, int __whence); + + + + +extern __off_t ftello (FILE *__stream) ; +# 800 "/usr/include/stdio.h" 3 4 +extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos); + + + + +extern int fsetpos (FILE *__stream, const fpos_t *__pos); +# 820 "/usr/include/stdio.h" 3 4 +extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence); +extern __off64_t ftello64 (FILE *__stream) ; +extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos); +extern int fsetpos64 (FILE *__stream, const fpos64_t *__pos); + + + + +extern void clearerr (FILE *__stream) throw (); + +extern int feof (FILE *__stream) throw () ; + +extern int ferror (FILE *__stream) throw () ; + + + + +extern void clearerr_unlocked (FILE *__stream) throw (); +extern int feof_unlocked (FILE *__stream) throw () ; +extern int ferror_unlocked (FILE *__stream) throw () ; +# 848 "/usr/include/stdio.h" 3 4 +extern void perror (const char *__s); + + + + + + + +# 1 "/usr/include/bits/sys_errlist.h" 1 3 4 +# 26 "/usr/include/bits/sys_errlist.h" 3 4 +extern int sys_nerr; +extern const char *const sys_errlist[]; + + +extern int _sys_nerr; +extern const char *const _sys_errlist[]; +# 856 "/usr/include/stdio.h" 2 3 4 + + + + +extern int fileno (FILE *__stream) throw () ; + + + + +extern int fileno_unlocked (FILE *__stream) throw () ; +# 874 "/usr/include/stdio.h" 3 4 +extern FILE *popen (const char *__command, const char *__modes) ; + + + + + +extern int pclose (FILE *__stream); + + + + + +extern char *ctermid (char *__s) throw (); + + + + + +extern char *cuserid (char *__s); + + + + +struct obstack; + + +extern int obstack_printf (struct obstack *__restrict __obstack, + const char *__restrict __format, ...) + throw () __attribute__ ((__format__ (__printf__, 2, 3))); +extern int obstack_vprintf (struct obstack *__restrict __obstack, + const char *__restrict __format, + __gnuc_va_list __args) + throw () __attribute__ ((__format__ (__printf__, 2, 0))); + + + + + + + +extern void flockfile (FILE *__stream) throw (); + + + +extern int ftrylockfile (FILE *__stream) throw () ; + + +extern void funlockfile (FILE *__stream) throw (); +# 944 "/usr/include/stdio.h" 3 4 +} +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTraceRefcnt.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 1 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcom-config.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 2 + + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 3 + +#pragma GCC visibility push(default) + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_lockfree_defines.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_lockfree_defines.h" 3 +# 39 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 2 3 + +extern "C++" { + +namespace std +{ +# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 3 + class exception + { + public: + exception() noexcept { } + virtual ~exception() noexcept; + + + + virtual const char* + what() const noexcept; + }; + + + + class bad_exception : public exception + { + public: + bad_exception() noexcept { } + + + + virtual ~bad_exception() noexcept; + + + virtual const char* + what() const noexcept; + }; + + + typedef void (*terminate_handler) (); + + + typedef void (*unexpected_handler) (); + + + terminate_handler set_terminate(terminate_handler) noexcept; + + + + terminate_handler get_terminate() noexcept; + + + + + void terminate() noexcept __attribute__ ((__noreturn__)); + + + unexpected_handler set_unexpected(unexpected_handler) noexcept; + + + + unexpected_handler get_unexpected() noexcept; + + + + + void unexpected() __attribute__ ((__noreturn__)); +# 129 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 3 + bool uncaught_exception() noexcept __attribute__ ((__pure__)); +# 138 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 3 +} + +namespace __gnu_cxx +{ +# 160 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 3 + void __verbose_terminate_handler(); + + +} + +} + +#pragma GCC visibility pop + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_ptr.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_ptr.h" 3 +#pragma GCC visibility push(default) + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_defines.h" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_ptr.h" 2 3 + + + + + +extern "C++" { + +namespace std +{ + class type_info; + + + + + + namespace __exception_ptr + { + class exception_ptr; + } + + using __exception_ptr::exception_ptr; + + + + + + exception_ptr current_exception() noexcept; + + + void rethrow_exception(exception_ptr) __attribute__ ((__noreturn__)); + + namespace __exception_ptr + { + using std::rethrow_exception; + + + + + + class exception_ptr + { + void* _M_exception_object; + + explicit exception_ptr(void* __e) noexcept; + + void _M_addref() noexcept; + void _M_release() noexcept; + + void *_M_get() const noexcept __attribute__ ((__pure__)); + + friend exception_ptr std::current_exception() noexcept; + friend void std::rethrow_exception(exception_ptr); + + public: + exception_ptr() noexcept; + + exception_ptr(const exception_ptr&) noexcept; + + + exception_ptr(nullptr_t) noexcept + : _M_exception_object(0) + { } + + exception_ptr(exception_ptr&& __o) noexcept + : _M_exception_object(__o._M_exception_object) + { __o._M_exception_object = 0; } +# 113 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_ptr.h" 3 + exception_ptr& + operator=(const exception_ptr&) noexcept; + + + exception_ptr& + operator=(exception_ptr&& __o) noexcept + { + exception_ptr(static_cast(__o)).swap(*this); + return *this; + } + + + ~exception_ptr() noexcept; + + void + swap(exception_ptr&) noexcept; +# 140 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_ptr.h" 3 + explicit operator bool() const + { return _M_exception_object; } + + + friend bool + operator==(const exception_ptr&, const exception_ptr&) + noexcept __attribute__ ((__pure__)); + + const class std::type_info* + __cxa_exception_type() const noexcept + __attribute__ ((__pure__)); + }; + + bool + operator==(const exception_ptr&, const exception_ptr&) + noexcept __attribute__ ((__pure__)); + + bool + operator!=(const exception_ptr&, const exception_ptr&) + noexcept __attribute__ ((__pure__)); + + inline void + swap(exception_ptr& __lhs, exception_ptr& __rhs) + { __lhs.swap(__rhs); } + + } + + + + template + exception_ptr + make_exception_ptr(_Ex __ex) noexcept + { + + try + { + throw __ex; + } + catch(...) + { + return current_exception(); + } + + + + } + + + + + + template + exception_ptr + copy_exception(_Ex __ex) noexcept __attribute__ ((__deprecated__)); + + template + exception_ptr + copy_exception(_Ex __ex) noexcept + { return std::make_exception_ptr<_Ex>(__ex); } + + +} + +} + +#pragma GCC visibility pop +# 171 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/nested_exception.h" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/nested_exception.h" 3 +#pragma GCC visibility push(default) + + + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/concept_check.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/concept_check.h" 3 +# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + + + template + inline _Tp* + __addressof(_Tp& __r) noexcept + { + return reinterpret_cast<_Tp*> + (&const_cast(reinterpret_cast(__r))); + } + + +} + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 +namespace std +{ + typedef unsigned short uint_least16_t; + typedef unsigned int uint_least32_t; +} + + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 68 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template + struct integral_constant + { + static constexpr _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant<_Tp, __v> type; + constexpr operator value_type() const { return value; } + + + + + constexpr value_type operator()() const { return value; } + + }; + + template + constexpr _Tp integral_constant<_Tp, __v>::value; + + + typedef integral_constant true_type; + + + typedef integral_constant false_type; + + template + using __bool_constant = integral_constant; +# 103 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template + struct conditional; + + template + struct __or_; + + template<> + struct __or_<> + : public false_type + { }; + + template + struct __or_<_B1> + : public _B1 + { }; + + template + struct __or_<_B1, _B2> + : public conditional<_B1::value, _B1, _B2>::type + { }; + + template + struct __or_<_B1, _B2, _B3, _Bn...> + : public conditional<_B1::value, _B1, __or_<_B2, _B3, _Bn...>>::type + { }; + + template + struct __and_; + + template<> + struct __and_<> + : public true_type + { }; + + template + struct __and_<_B1> + : public _B1 + { }; + + template + struct __and_<_B1, _B2> + : public conditional<_B1::value, _B2, _B1>::type + { }; + + template + struct __and_<_B1, _B2, _B3, _Bn...> + : public conditional<_B1::value, __and_<_B2, _B3, _Bn...>, _B1>::type + { }; + + template + struct __not_ + : public integral_constant + { }; + + struct __nonesuch { + __nonesuch() = delete; + ~__nonesuch() = delete; + __nonesuch(__nonesuch const&) = delete; + void operator=(__nonesuch const&) = delete; + }; +# 189 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template + struct __success_type + { typedef _Tp type; }; + + struct __failure_type + { }; + + + + template + struct remove_cv; + + template + struct __is_void_helper + : public false_type { }; + + template<> + struct __is_void_helper + : public true_type { }; + + + template + struct is_void + : public __is_void_helper::type>::type + { }; + + template + struct __is_integral_helper + : public false_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + + template<> + struct __is_integral_helper + : public true_type { }; + + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; + + template<> + struct __is_integral_helper + : public true_type { }; +# 321 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template + struct is_integral + : public __is_integral_helper::type>::type + { }; + + template + struct __is_floating_point_helper + : public false_type { }; + + template<> + struct __is_floating_point_helper + : public true_type { }; + + template<> + struct __is_floating_point_helper + : public true_type { }; + + template<> + struct __is_floating_point_helper + : public true_type { }; +# 349 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template + struct is_floating_point + : public __is_floating_point_helper::type>::type + { }; + + + template + struct is_array + : public false_type { }; + + template + struct is_array<_Tp[_Size]> + : public true_type { }; + + template + struct is_array<_Tp[]> + : public true_type { }; + + template + struct __is_pointer_helper + : public false_type { }; + + template + struct __is_pointer_helper<_Tp*> + : public true_type { }; + + + template + struct is_pointer + : public __is_pointer_helper::type>::type + { }; + + + template + struct is_lvalue_reference + : public false_type { }; + + template + struct is_lvalue_reference<_Tp&> + : public true_type { }; + + + template + struct is_rvalue_reference + : public false_type { }; + + template + struct is_rvalue_reference<_Tp&&> + : public true_type { }; + + template + struct is_function; + + template + struct __is_member_object_pointer_helper + : public false_type { }; + + template + struct __is_member_object_pointer_helper<_Tp _Cp::*> + : public integral_constant::value> { }; + + + template + struct is_member_object_pointer + : public __is_member_object_pointer_helper< + typename remove_cv<_Tp>::type>::type + { }; + + template + struct __is_member_function_pointer_helper + : public false_type { }; + + template + struct __is_member_function_pointer_helper<_Tp _Cp::*> + : public integral_constant::value> { }; + + + template + struct is_member_function_pointer + : public __is_member_function_pointer_helper< + typename remove_cv<_Tp>::type>::type + { }; + + + template + struct is_enum + : public integral_constant + { }; + + + template + struct is_union + : public integral_constant + { }; + + + template + struct is_class + : public integral_constant + { }; + + + template + struct is_function + : public false_type { }; + + template + struct is_function<_Res(_ArgTypes...)> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) &> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) &&> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......)> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) &> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) &&> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) const> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) const &> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) const &&> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) const> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) const &> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) const &&> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) volatile> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) volatile &> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) volatile &&> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) volatile> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) volatile &> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) volatile &&> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) const volatile> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) const volatile &> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes...) const volatile &&> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) const volatile> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) const volatile &> + : public true_type { }; + + template + struct is_function<_Res(_ArgTypes......) const volatile &&> + : public true_type { }; + + + + template + struct __is_null_pointer_helper + : public false_type { }; + + template<> + struct __is_null_pointer_helper + : public true_type { }; + + + template + struct is_null_pointer + : public __is_null_pointer_helper::type>::type + { }; + + + template + struct __is_nullptr_t + : public is_null_pointer<_Tp> + { }; + + + + + template + struct is_reference + : public __or_, + is_rvalue_reference<_Tp>>::type + { }; + + + template + struct is_arithmetic + : public __or_, is_floating_point<_Tp>>::type + { }; + + + template + struct is_fundamental + : public __or_, is_void<_Tp>, + is_null_pointer<_Tp>>::type + { }; + + + template + struct is_object + : public __not_<__or_, is_reference<_Tp>, + is_void<_Tp>>>::type + { }; + + template + struct is_member_pointer; + + + template + struct is_scalar + : public __or_, is_enum<_Tp>, is_pointer<_Tp>, + is_member_pointer<_Tp>, is_null_pointer<_Tp>>::type + { }; + + + template + struct is_compound + : public integral_constant::value> { }; + + template + struct __is_member_pointer_helper + : public false_type { }; + + template + struct __is_member_pointer_helper<_Tp _Cp::*> + : public true_type { }; + + + template + struct is_member_pointer + : public __is_member_pointer_helper::type>::type + { }; + + + + template + struct __is_referenceable + : public __or_, is_reference<_Tp>>::type + { }; + + template + struct __is_referenceable<_Res(_Args...)> + : public true_type + { }; + + template + struct __is_referenceable<_Res(_Args......)> + : public true_type + { }; + + + + + template + struct is_const + : public false_type { }; + + template + struct is_const<_Tp const> + : public true_type { }; + + + template + struct is_volatile + : public false_type { }; + + template + struct is_volatile<_Tp volatile> + : public true_type { }; + + + template + struct is_trivial + : public integral_constant + { }; + + + template + struct is_trivially_copyable + : public integral_constant + { }; + + + template + struct is_standard_layout + : public integral_constant + { }; + + + + template + struct is_pod + : public integral_constant + { }; + + + template + struct is_literal_type + : public integral_constant + { }; + + + template + struct is_empty + : public integral_constant + { }; + + + template + struct is_polymorphic + : public integral_constant + { }; + + + + + template + struct is_final + : public integral_constant + { }; + + + + template + struct is_abstract + : public integral_constant + { }; + + template::value> + struct __is_signed_helper + : public false_type { }; + + template + struct __is_signed_helper<_Tp, true> + : public integral_constant + { }; + + + template + struct is_signed + : public __is_signed_helper<_Tp>::type + { }; + + + template + struct is_unsigned + : public __and_, __not_>> + { }; + + + + + template + struct add_rvalue_reference; + + + + + + template + typename add_rvalue_reference<_Tp>::type declval() noexcept; + + template + struct extent; + + template + struct remove_all_extents; + + template + struct __is_array_known_bounds + : public integral_constant::value > 0)> + { }; + + template + struct __is_array_unknown_bounds + : public __and_, __not_>> + { }; + + + + + + + struct __do_is_destructible_impl + { + template().~_Tp())> + static true_type __test(int); + + template + static false_type __test(...); + }; + + template + struct __is_destructible_impl + : public __do_is_destructible_impl + { + typedef decltype(__test<_Tp>(0)) type; + }; + + template, + __is_array_unknown_bounds<_Tp>, + is_function<_Tp>>::value, + bool = __or_, is_scalar<_Tp>>::value> + struct __is_destructible_safe; + + template + struct __is_destructible_safe<_Tp, false, false> + : public __is_destructible_impl::type>::type + { }; + + template + struct __is_destructible_safe<_Tp, true, false> + : public false_type { }; + + template + struct __is_destructible_safe<_Tp, false, true> + : public true_type { }; + + + template + struct is_destructible + : public __is_destructible_safe<_Tp>::type + { }; + + + + + + struct __do_is_nt_destructible_impl + { + template + static integral_constant().~_Tp())> + __test(int); + + template + static false_type __test(...); + }; + + template + struct __is_nt_destructible_impl + : public __do_is_nt_destructible_impl + { + typedef decltype(__test<_Tp>(0)) type; + }; + + template, + __is_array_unknown_bounds<_Tp>, + is_function<_Tp>>::value, + bool = __or_, is_scalar<_Tp>>::value> + struct __is_nt_destructible_safe; + + template + struct __is_nt_destructible_safe<_Tp, false, false> + : public __is_nt_destructible_impl::type>::type + { }; + + template + struct __is_nt_destructible_safe<_Tp, true, false> + : public false_type { }; + + template + struct __is_nt_destructible_safe<_Tp, false, true> + : public true_type { }; + + + template + struct is_nothrow_destructible + : public __is_nt_destructible_safe<_Tp>::type + { }; + + struct __do_is_default_constructible_impl + { + template + static true_type __test(int); + + template + static false_type __test(...); + }; + + template + struct __is_default_constructible_impl + : public __do_is_default_constructible_impl + { + typedef decltype(__test<_Tp>(0)) type; + }; + + template + struct __is_default_constructible_atom + : public __and_<__not_>, + __is_default_constructible_impl<_Tp>> + { }; + + template::value> + struct __is_default_constructible_safe; + + + + + + + template + struct __is_default_constructible_safe<_Tp, true> + : public __and_<__is_array_known_bounds<_Tp>, + __is_default_constructible_atom::type>> + { }; + + template + struct __is_default_constructible_safe<_Tp, false> + : public __is_default_constructible_atom<_Tp>::type + { }; + + + template + struct is_default_constructible + : public __is_default_constructible_safe<_Tp>::type + { }; +# 933 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + struct __do_is_static_castable_impl + { + template(declval<_From>()))> + static true_type __test(int); + + template + static false_type __test(...); + }; + + template + struct __is_static_castable_impl + : public __do_is_static_castable_impl + { + typedef decltype(__test<_From, _To>(0)) type; + }; + + template + struct __is_static_castable_safe + : public __is_static_castable_impl<_From, _To>::type + { }; + + + template + struct __is_static_castable + : public integral_constant::value)> + { }; + + + + + + + struct __do_is_direct_constructible_impl + { + template()))> + static true_type __test(int); + + template + static false_type __test(...); + }; + + template + struct __is_direct_constructible_impl + : public __do_is_direct_constructible_impl + { + typedef decltype(__test<_Tp, _Arg>(0)) type; + }; + + template + struct __is_direct_constructible_new_safe + : public __and_, + __is_direct_constructible_impl<_Tp, _Arg>> + { }; + + template + struct is_same; + + template + struct is_base_of; + + template + struct remove_reference; + + template, + is_function<_From>>>::value> + struct __is_base_to_derived_ref; + + template + struct is_constructible; + + + + template + struct __is_base_to_derived_ref<_From, _To, true> + { + typedef typename remove_cv::type>::type __src_t; + typedef typename remove_cv::type>::type __dst_t; + typedef __and_<__not_>, + is_base_of<__src_t, __dst_t>, + __not_>> type; + static constexpr bool value = type::value; + }; + + template + struct __is_base_to_derived_ref<_From, _To, false> + : public false_type + { }; + + template, + is_rvalue_reference<_To>>::value> + struct __is_lvalue_to_rvalue_ref; + + + + template + struct __is_lvalue_to_rvalue_ref<_From, _To, true> + { + typedef typename remove_cv::type>::type __src_t; + typedef typename remove_cv::type>::type __dst_t; + typedef __and_<__not_>, + __or_, + is_base_of<__dst_t, __src_t>>> type; + static constexpr bool value = type::value; + }; + + template + struct __is_lvalue_to_rvalue_ref<_From, _To, false> + : public false_type + { }; + + + + + + + + template + struct __is_direct_constructible_ref_cast + : public __and_<__is_static_castable<_Arg, _Tp>, + __not_<__or_<__is_base_to_derived_ref<_Arg, _Tp>, + __is_lvalue_to_rvalue_ref<_Arg, _Tp> + >>> + { }; + + template + struct __is_direct_constructible_new + : public conditional::value, + __is_direct_constructible_ref_cast<_Tp, _Arg>, + __is_direct_constructible_new_safe<_Tp, _Arg> + >::type + { }; + + template + struct __is_direct_constructible + : public __is_direct_constructible_new<_Tp, _Arg>::type + { }; + + + + + + + struct __do_is_nary_constructible_impl + { + template()...))> + static true_type __test(int); + + template + static false_type __test(...); + }; + + template + struct __is_nary_constructible_impl + : public __do_is_nary_constructible_impl + { + typedef decltype(__test<_Tp, _Args...>(0)) type; + }; + + template + struct __is_nary_constructible + : public __is_nary_constructible_impl<_Tp, _Args...>::type + { + static_assert(sizeof...(_Args) > 1, + "Only useful for > 1 arguments"); + }; + + template + struct __is_constructible_impl + : public __is_nary_constructible<_Tp, _Args...> + { }; + + template + struct __is_constructible_impl<_Tp, _Arg> + : public __is_direct_constructible<_Tp, _Arg> + { }; + + template + struct __is_constructible_impl<_Tp> + : public is_default_constructible<_Tp> + { }; + + + template + struct is_constructible + : public __is_constructible_impl<_Tp, _Args...>::type + { }; + + template::value> + struct __is_copy_constructible_impl; + + template + struct __is_copy_constructible_impl<_Tp, false> + : public false_type { }; + + template + struct __is_copy_constructible_impl<_Tp, true> + : public is_constructible<_Tp, const _Tp&> + { }; + + + template + struct is_copy_constructible + : public __is_copy_constructible_impl<_Tp> + { }; + + template::value> + struct __is_move_constructible_impl; + + template + struct __is_move_constructible_impl<_Tp, false> + : public false_type { }; + + template + struct __is_move_constructible_impl<_Tp, true> + : public is_constructible<_Tp, _Tp&&> + { }; + + + template + struct is_move_constructible + : public __is_move_constructible_impl<_Tp> + { }; + + template + struct __is_nt_default_constructible_atom + : public integral_constant + { }; + + template::value> + struct __is_nt_default_constructible_impl; + + template + struct __is_nt_default_constructible_impl<_Tp, true> + : public __and_<__is_array_known_bounds<_Tp>, + __is_nt_default_constructible_atom::type>> + { }; + + template + struct __is_nt_default_constructible_impl<_Tp, false> + : public __is_nt_default_constructible_atom<_Tp> + { }; + + + template + struct is_nothrow_default_constructible + : public __and_, + __is_nt_default_constructible_impl<_Tp>> + { }; + + template + struct __is_nt_constructible_impl + : public integral_constant()...))> + { }; + + template + struct __is_nt_constructible_impl<_Tp, _Arg> + : public integral_constant(declval<_Arg>()))> + { }; + + template + struct __is_nt_constructible_impl<_Tp> + : public is_nothrow_default_constructible<_Tp> + { }; + + + template + struct is_nothrow_constructible + : public __and_, + __is_nt_constructible_impl<_Tp, _Args...>> + { }; + + template::value> + struct __is_nothrow_copy_constructible_impl; + + template + struct __is_nothrow_copy_constructible_impl<_Tp, false> + : public false_type { }; + + template + struct __is_nothrow_copy_constructible_impl<_Tp, true> + : public is_nothrow_constructible<_Tp, const _Tp&> + { }; + + + template + struct is_nothrow_copy_constructible + : public __is_nothrow_copy_constructible_impl<_Tp> + { }; + + template::value> + struct __is_nothrow_move_constructible_impl; + + template + struct __is_nothrow_move_constructible_impl<_Tp, false> + : public false_type { }; + + template + struct __is_nothrow_move_constructible_impl<_Tp, true> + : public is_nothrow_constructible<_Tp, _Tp&&> + { }; + + + template + struct is_nothrow_move_constructible + : public __is_nothrow_move_constructible_impl<_Tp> + { }; + + template + class __is_assignable_helper + { + template() = declval<_Up1>())> + static true_type + __test(int); + + template + static false_type + __test(...); + + public: + typedef decltype(__test<_Tp, _Up>(0)) type; + }; + + + template + struct is_assignable + : public __is_assignable_helper<_Tp, _Up>::type + { }; + + template::value> + struct __is_copy_assignable_impl; + + template + struct __is_copy_assignable_impl<_Tp, false> + : public false_type { }; + + template + struct __is_copy_assignable_impl<_Tp, true> + : public is_assignable<_Tp&, const _Tp&> + { }; + + + template + struct is_copy_assignable + : public __is_copy_assignable_impl<_Tp> + { }; + + template::value> + struct __is_move_assignable_impl; + + template + struct __is_move_assignable_impl<_Tp, false> + : public false_type { }; + + template + struct __is_move_assignable_impl<_Tp, true> + : public is_assignable<_Tp&, _Tp&&> + { }; + + + template + struct is_move_assignable + : public __is_move_assignable_impl<_Tp> + { }; + + template + struct __is_nt_assignable_impl + : public integral_constant() = declval<_Up>())> + { }; + + + template + struct is_nothrow_assignable + : public __and_, + __is_nt_assignable_impl<_Tp, _Up>> + { }; + + template::value> + struct __is_nt_copy_assignable_impl; + + template + struct __is_nt_copy_assignable_impl<_Tp, false> + : public false_type { }; + + template + struct __is_nt_copy_assignable_impl<_Tp, true> + : public is_nothrow_assignable<_Tp&, const _Tp&> + { }; + + + template + struct is_nothrow_copy_assignable + : public __is_nt_copy_assignable_impl<_Tp> + { }; + + template::value> + struct __is_nt_move_assignable_impl; + + template + struct __is_nt_move_assignable_impl<_Tp, false> + : public false_type { }; + + template + struct __is_nt_move_assignable_impl<_Tp, true> + : public is_nothrow_assignable<_Tp&, _Tp&&> + { }; + + + template + struct is_nothrow_move_assignable + : public __is_nt_move_assignable_impl<_Tp> + { }; + + + template + struct is_trivially_constructible + : public __and_, integral_constant> + { }; + + + template + struct is_trivially_default_constructible + : public is_trivially_constructible<_Tp>::type + { }; + + struct __do_is_implicitly_default_constructible_impl + { + template + static void __helper(const _Tp&); + + template + static true_type __test(const _Tp&, + decltype(__helper({}))* = 0); + + static false_type __test(...); + }; + + template + struct __is_implicitly_default_constructible_impl + : public __do_is_implicitly_default_constructible_impl + { + typedef decltype(__test(declval<_Tp>())) type; + }; + + template + struct __is_implicitly_default_constructible_safe + : public __is_implicitly_default_constructible_impl<_Tp>::type + { }; + + template + struct __is_implicitly_default_constructible + : public __and_, + __is_implicitly_default_constructible_safe<_Tp>> + { }; + + + template + struct is_trivially_copy_constructible + : public __and_, + integral_constant> + { }; + + + template + struct is_trivially_move_constructible + : public __and_, + integral_constant> + { }; + + + template + struct is_trivially_assignable + : public __and_, + integral_constant> + { }; + + + template + struct is_trivially_copy_assignable + : public __and_, + integral_constant> + { }; + + + template + struct is_trivially_move_assignable + : public __and_, + integral_constant> + { }; + + + template + struct is_trivially_destructible + : public __and_, integral_constant> + { }; + + + template + struct has_trivial_default_constructor + : public integral_constant + { } __attribute__ ((__deprecated__)); + + + template + struct has_trivial_copy_constructor + : public integral_constant + { } __attribute__ ((__deprecated__)); + + + template + struct has_trivial_copy_assign + : public integral_constant + { } __attribute__ ((__deprecated__)); + + + template + struct has_virtual_destructor + : public integral_constant + { }; + + + + + + template + struct alignment_of + : public integral_constant { }; + + + template + struct rank + : public integral_constant { }; + + template + struct rank<_Tp[_Size]> + : public integral_constant::value> { }; + + template + struct rank<_Tp[]> + : public integral_constant::value> { }; + + + template + struct extent + : public integral_constant { }; + + template + struct extent<_Tp[_Size], _Uint> + : public integral_constant::value> + { }; + + template + struct extent<_Tp[], _Uint> + : public integral_constant::value> + { }; + + + + + + template + struct is_same + : public false_type { }; + + template + struct is_same<_Tp, _Tp> + : public true_type { }; + + + template + struct is_base_of + : public integral_constant + { }; + + template, is_function<_To>, + is_array<_To>>::value> + struct __is_convertible_helper + { typedef typename is_void<_To>::type type; }; + + template + class __is_convertible_helper<_From, _To, false> + { + template + static void __test_aux(_To1); + + template(std::declval<_From1>()))> + static true_type + __test(int); + + template + static false_type + __test(...); + + public: + typedef decltype(__test<_From, _To>(0)) type; + }; + + + + template + struct is_convertible + : public __is_convertible_helper<_From, _To>::type + { }; + + + + + + template + struct remove_const + { typedef _Tp type; }; + + template + struct remove_const<_Tp const> + { typedef _Tp type; }; + + + template + struct remove_volatile + { typedef _Tp type; }; + + template + struct remove_volatile<_Tp volatile> + { typedef _Tp type; }; + + + template + struct remove_cv + { + typedef typename + remove_const::type>::type type; + }; + + + template + struct add_const + { typedef _Tp const type; }; + + + template + struct add_volatile + { typedef _Tp volatile type; }; + + + template + struct add_cv + { + typedef typename + add_const::type>::type type; + }; + + + + + + + template + using remove_const_t = typename remove_const<_Tp>::type; + + + template + using remove_volatile_t = typename remove_volatile<_Tp>::type; + + + template + using remove_cv_t = typename remove_cv<_Tp>::type; + + + template + using add_const_t = typename add_const<_Tp>::type; + + + template + using add_volatile_t = typename add_volatile<_Tp>::type; + + + template + using add_cv_t = typename add_cv<_Tp>::type; + + + + + + template + struct remove_reference + { typedef _Tp type; }; + + template + struct remove_reference<_Tp&> + { typedef _Tp type; }; + + template + struct remove_reference<_Tp&&> + { typedef _Tp type; }; + + template::value> + struct __add_lvalue_reference_helper + { typedef _Tp type; }; + + template + struct __add_lvalue_reference_helper<_Tp, true> + { typedef _Tp& type; }; + + + template + struct add_lvalue_reference + : public __add_lvalue_reference_helper<_Tp> + { }; + + template::value> + struct __add_rvalue_reference_helper + { typedef _Tp type; }; + + template + struct __add_rvalue_reference_helper<_Tp, true> + { typedef _Tp&& type; }; + + + template + struct add_rvalue_reference + : public __add_rvalue_reference_helper<_Tp> + { }; + + + + template + using remove_reference_t = typename remove_reference<_Tp>::type; + + + template + using add_lvalue_reference_t = typename add_lvalue_reference<_Tp>::type; + + + template + using add_rvalue_reference_t = typename add_rvalue_reference<_Tp>::type; + + + + + + template + struct __cv_selector; + + template + struct __cv_selector<_Unqualified, false, false> + { typedef _Unqualified __type; }; + + template + struct __cv_selector<_Unqualified, false, true> + { typedef volatile _Unqualified __type; }; + + template + struct __cv_selector<_Unqualified, true, false> + { typedef const _Unqualified __type; }; + + template + struct __cv_selector<_Unqualified, true, true> + { typedef const volatile _Unqualified __type; }; + + template::value, + bool _IsVol = is_volatile<_Qualified>::value> + class __match_cv_qualifiers + { + typedef __cv_selector<_Unqualified, _IsConst, _IsVol> __match; + + public: + typedef typename __match::__type __type; + }; + + + template + struct __make_unsigned + { typedef _Tp __type; }; + + template<> + struct __make_unsigned + { typedef unsigned char __type; }; + + template<> + struct __make_unsigned + { typedef unsigned char __type; }; + + template<> + struct __make_unsigned + { typedef unsigned short __type; }; + + template<> + struct __make_unsigned + { typedef unsigned int __type; }; + + template<> + struct __make_unsigned + { typedef unsigned long __type; }; + + template<> + struct __make_unsigned + { typedef unsigned long long __type; }; + + + template<> + struct __make_unsigned : __make_unsigned + { }; +# 1785 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template::value, + bool _IsEnum = is_enum<_Tp>::value> + class __make_unsigned_selector; + + template + class __make_unsigned_selector<_Tp, true, false> + { + typedef __make_unsigned::type> __unsignedt; + typedef typename __unsignedt::__type __unsigned_type; + typedef __match_cv_qualifiers<_Tp, __unsigned_type> __cv_unsigned; + + public: + typedef typename __cv_unsigned::__type __type; + }; + + template + class __make_unsigned_selector<_Tp, false, true> + { + + typedef unsigned char __smallest; + static const bool __b0 = sizeof(_Tp) <= sizeof(__smallest); + static const bool __b1 = sizeof(_Tp) <= sizeof(unsigned short); + static const bool __b2 = sizeof(_Tp) <= sizeof(unsigned int); + static const bool __b3 = sizeof(_Tp) <= sizeof(unsigned long); + typedef conditional<__b3, unsigned long, unsigned long long> __cond3; + typedef typename __cond3::type __cond3_type; + typedef conditional<__b2, unsigned int, __cond3_type> __cond2; + typedef typename __cond2::type __cond2_type; + typedef conditional<__b1, unsigned short, __cond2_type> __cond1; + typedef typename __cond1::type __cond1_type; + + typedef typename conditional<__b0, __smallest, __cond1_type>::type + __unsigned_type; + typedef __match_cv_qualifiers<_Tp, __unsigned_type> __cv_unsigned; + + public: + typedef typename __cv_unsigned::__type __type; + }; + + + + + + template + struct make_unsigned + { typedef typename __make_unsigned_selector<_Tp>::__type type; }; + + + template<> + struct make_unsigned; + + + + template + struct __make_signed + { typedef _Tp __type; }; + + template<> + struct __make_signed + { typedef signed char __type; }; + + template<> + struct __make_signed + { typedef signed char __type; }; + + template<> + struct __make_signed + { typedef signed short __type; }; + + template<> + struct __make_signed + { typedef signed int __type; }; + + template<> + struct __make_signed + { typedef signed long __type; }; + + template<> + struct __make_signed + { typedef signed long long __type; }; +# 1874 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template<> + struct __make_signed : __make_signed + { }; + template<> + struct __make_signed : __make_signed + { }; +# 1904 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template::value, + bool _IsEnum = is_enum<_Tp>::value> + class __make_signed_selector; + + template + class __make_signed_selector<_Tp, true, false> + { + typedef __make_signed::type> __signedt; + typedef typename __signedt::__type __signed_type; + typedef __match_cv_qualifiers<_Tp, __signed_type> __cv_signed; + + public: + typedef typename __cv_signed::__type __type; + }; + + template + class __make_signed_selector<_Tp, false, true> + { + typedef typename __make_unsigned_selector<_Tp>::__type __unsigned_type; + + public: + typedef typename __make_signed_selector<__unsigned_type>::__type __type; + }; + + + + + + template + struct make_signed + { typedef typename __make_signed_selector<_Tp>::__type type; }; + + + template<> + struct make_signed; + + + + template + using make_signed_t = typename make_signed<_Tp>::type; + + + template + using make_unsigned_t = typename make_unsigned<_Tp>::type; + + + + + + template + struct remove_extent + { typedef _Tp type; }; + + template + struct remove_extent<_Tp[_Size]> + { typedef _Tp type; }; + + template + struct remove_extent<_Tp[]> + { typedef _Tp type; }; + + + template + struct remove_all_extents + { typedef _Tp type; }; + + template + struct remove_all_extents<_Tp[_Size]> + { typedef typename remove_all_extents<_Tp>::type type; }; + + template + struct remove_all_extents<_Tp[]> + { typedef typename remove_all_extents<_Tp>::type type; }; + + + + template + using remove_extent_t = typename remove_extent<_Tp>::type; + + + template + using remove_all_extents_t = typename remove_all_extents<_Tp>::type; + + + + + template + struct __remove_pointer_helper + { typedef _Tp type; }; + + template + struct __remove_pointer_helper<_Tp, _Up*> + { typedef _Up type; }; + + + template + struct remove_pointer + : public __remove_pointer_helper<_Tp, typename remove_cv<_Tp>::type> + { }; + + + template, + is_void<_Tp>>::value> + struct __add_pointer_helper + { typedef _Tp type; }; + + template + struct __add_pointer_helper<_Tp, true> + { typedef typename remove_reference<_Tp>::type* type; }; + + template + struct add_pointer + : public __add_pointer_helper<_Tp> + { }; + + + + template + using remove_pointer_t = typename remove_pointer<_Tp>::type; + + + template + using add_pointer_t = typename add_pointer<_Tp>::type; + + + template + struct __aligned_storage_msa + { + union __type + { + unsigned char __data[_Len]; + struct __attribute__((__aligned__)) { } __align; + }; + }; +# 2050 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template::__type)> + struct aligned_storage + { + union type + { + unsigned char __data[_Len]; + struct __attribute__((__aligned__((_Align)))) { } __align; + }; + }; + + template + struct __strictest_alignment + { + static const size_t _S_alignment = 0; + static const size_t _S_size = 0; + }; + + template + struct __strictest_alignment<_Tp, _Types...> + { + static const size_t _S_alignment = + alignof(_Tp) > __strictest_alignment<_Types...>::_S_alignment + ? alignof(_Tp) : __strictest_alignment<_Types...>::_S_alignment; + static const size_t _S_size = + sizeof(_Tp) > __strictest_alignment<_Types...>::_S_size + ? sizeof(_Tp) : __strictest_alignment<_Types...>::_S_size; + }; +# 2089 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template + struct aligned_union + { + private: + static_assert(sizeof...(_Types) != 0, "At least one type is required"); + + using __strictest = __strictest_alignment<_Types...>; + static const size_t _S_len = _Len > __strictest::_S_size + ? _Len : __strictest::_S_size; + public: + + static const size_t alignment_value = __strictest::_S_alignment; + + typedef typename aligned_storage<_S_len, alignment_value>::type type; + }; + + template + const size_t aligned_union<_Len, _Types...>::alignment_value; + + + + template::value, + bool _IsFunction = is_function<_Up>::value> + struct __decay_selector; + + + template + struct __decay_selector<_Up, false, false> + { typedef typename remove_cv<_Up>::type __type; }; + + template + struct __decay_selector<_Up, true, false> + { typedef typename remove_extent<_Up>::type* __type; }; + + template + struct __decay_selector<_Up, false, true> + { typedef typename add_pointer<_Up>::type __type; }; + + + template + class decay + { + typedef typename remove_reference<_Tp>::type __remove_type; + + public: + typedef typename __decay_selector<__remove_type>::__type type; + }; + + template + class reference_wrapper; + + + template + struct __strip_reference_wrapper + { + typedef _Tp __type; + }; + + template + struct __strip_reference_wrapper > + { + typedef _Tp& __type; + }; + + template + struct __decay_and_strip + { + typedef typename __strip_reference_wrapper< + typename decay<_Tp>::type>::__type __type; + }; + + + + + template + struct enable_if + { }; + + + template + struct enable_if + { typedef _Tp type; }; + + template + using _Require = typename enable_if<__and_<_Cond...>::value>::type; + + + + template + struct conditional + { typedef _Iftrue type; }; + + + template + struct conditional + { typedef _Iffalse type; }; + + + template + struct common_type; + + + + struct __do_common_type_impl + { + template + static __success_type() + : std::declval<_Up>())>::type> _S_test(int); + + template + static __failure_type _S_test(...); + }; + + template + struct __common_type_impl + : private __do_common_type_impl + { + typedef decltype(_S_test<_Tp, _Up>(0)) type; + }; + + struct __do_member_type_wrapper + { + template + static __success_type _S_test(int); + + template + static __failure_type _S_test(...); + }; + + template + struct __member_type_wrapper + : private __do_member_type_wrapper + { + typedef decltype(_S_test<_Tp>(0)) type; + }; + + template + struct __expanded_common_type_wrapper + { + typedef common_type type; + }; + + template + struct __expanded_common_type_wrapper<__failure_type, _Args...> + { typedef __failure_type type; }; + + template + struct common_type<_Tp> + { typedef typename decay<_Tp>::type type; }; + + template + struct common_type<_Tp, _Up> + : public __common_type_impl<_Tp, _Up>::type + { }; + + template + struct common_type<_Tp, _Up, _Vp...> + : public __expanded_common_type_wrapper>::type, _Vp...>::type + { }; + + + template + struct underlying_type + { + typedef __underlying_type(_Tp) type; + }; + + template + struct __declval_protector + { + static const bool __stop = false; + static typename add_rvalue_reference<_Tp>::type __delegate(); + }; + + template + inline typename add_rvalue_reference<_Tp>::type + declval() noexcept + { + static_assert(__declval_protector<_Tp>::__stop, + "declval() must not be used!"); + return __declval_protector<_Tp>::__delegate(); + } + + + template + class result_of; + + + + + + struct __invoke_memfun_ref { }; + struct __invoke_memfun_deref { }; + struct __invoke_memobj_ref { }; + struct __invoke_memobj_deref { }; + struct __invoke_other { }; + + + template + struct __result_of_success : __success_type<_Tp> + { using __invoke_type = _Tag; }; + + + struct __result_of_memfun_ref_impl + { + template + static __result_of_success().*std::declval<_Fp>())(std::declval<_Args>()...) + ), __invoke_memfun_ref> _S_test(int); + + template + static __failure_type _S_test(...); + }; + + template + struct __result_of_memfun_ref + : private __result_of_memfun_ref_impl + { + typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type; + }; + + + struct __result_of_memfun_deref_impl + { + template + static __result_of_success()).*std::declval<_Fp>())(std::declval<_Args>()...) + ), __invoke_memfun_deref> _S_test(int); + + template + static __failure_type _S_test(...); + }; + + template + struct __result_of_memfun_deref + : private __result_of_memfun_deref_impl + { + typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type; + }; + + + struct __result_of_memobj_ref_impl + { + template + static __result_of_success().*std::declval<_Fp>() + ), __invoke_memobj_ref> _S_test(int); + + template + static __failure_type _S_test(...); + }; + + template + struct __result_of_memobj_ref + : private __result_of_memobj_ref_impl + { + typedef decltype(_S_test<_MemPtr, _Arg>(0)) type; + }; + + + struct __result_of_memobj_deref_impl + { + template + static __result_of_success()).*std::declval<_Fp>() + ), __invoke_memobj_deref> _S_test(int); + + template + static __failure_type _S_test(...); + }; + + template + struct __result_of_memobj_deref + : private __result_of_memobj_deref_impl + { + typedef decltype(_S_test<_MemPtr, _Arg>(0)) type; + }; + + template + struct __result_of_memobj; + + template + struct __result_of_memobj<_Res _Class::*, _Arg> + { + typedef typename remove_cv::type>::type _Argval; + typedef _Res _Class::* _MemPtr; + typedef typename conditional<__or_, + is_base_of<_Class, _Argval>>::value, + __result_of_memobj_ref<_MemPtr, _Arg>, + __result_of_memobj_deref<_MemPtr, _Arg> + >::type::type type; + }; + + template + struct __result_of_memfun; + + template + struct __result_of_memfun<_Res _Class::*, _Arg, _Args...> + { + typedef typename remove_cv::type>::type _Argval; + typedef _Res _Class::* _MemPtr; + typedef typename conditional<__or_, + is_base_of<_Class, _Argval>>::value, + __result_of_memfun_ref<_MemPtr, _Arg, _Args...>, + __result_of_memfun_deref<_MemPtr, _Arg, _Args...> + >::type::type type; + }; + + + + + + template + struct __result_of_memobj<_Res _Class::*, reference_wrapper<_Arg>> + : __result_of_memobj_ref<_Res _Class::*, _Arg&> + { }; + + template + struct __result_of_memobj<_Res _Class::*, reference_wrapper<_Arg>&> + : __result_of_memobj_ref<_Res _Class::*, _Arg&> + { }; + + template + struct __result_of_memobj<_Res _Class::*, const reference_wrapper<_Arg>&> + : __result_of_memobj_ref<_Res _Class::*, _Arg&> + { }; + + template + struct __result_of_memobj<_Res _Class::*, reference_wrapper<_Arg>&&> + : __result_of_memobj_ref<_Res _Class::*, _Arg&> + { }; + + template + struct __result_of_memobj<_Res _Class::*, const reference_wrapper<_Arg>&&> + : __result_of_memobj_ref<_Res _Class::*, _Arg&> + { }; + + template + struct __result_of_memfun<_Res _Class::*, reference_wrapper<_Arg>, _Args...> + : __result_of_memfun_ref<_Res _Class::*, _Arg&, _Args...> + { }; + + template + struct __result_of_memfun<_Res _Class::*, reference_wrapper<_Arg>&, + _Args...> + : __result_of_memfun_ref<_Res _Class::*, _Arg&, _Args...> + { }; + + template + struct __result_of_memfun<_Res _Class::*, const reference_wrapper<_Arg>&, + _Args...> + : __result_of_memfun_ref<_Res _Class::*, _Arg&, _Args...> + { }; + + template + struct __result_of_memfun<_Res _Class::*, reference_wrapper<_Arg>&&, + _Args...> + : __result_of_memfun_ref<_Res _Class::*, _Arg&, _Args...> + { }; + + template + struct __result_of_memfun<_Res _Class::*, const reference_wrapper<_Arg>&&, + _Args...> + : __result_of_memfun_ref<_Res _Class::*, _Arg&, _Args...> + { }; + + template + struct __result_of_impl + { + typedef __failure_type type; + }; + + template + struct __result_of_impl + : public __result_of_memobj::type, _Arg> + { }; + + template + struct __result_of_impl + : public __result_of_memfun::type, _Arg, _Args...> + { }; + + + struct __result_of_other_impl + { + template + static __result_of_success()(std::declval<_Args>()...) + ), __invoke_other> _S_test(int); + + template + static __failure_type _S_test(...); + }; + + template + struct __result_of_impl + : private __result_of_other_impl + { + typedef decltype(_S_test<_Functor, _ArgTypes...>(0)) type; + }; + + template + struct result_of<_Functor(_ArgTypes...)> + : public __result_of_impl< + is_member_object_pointer< + typename remove_reference<_Functor>::type + >::value, + is_member_function_pointer< + typename remove_reference<_Functor>::type + >::value, + _Functor, _ArgTypes... + >::type + { }; + + + + template::__type)> + using aligned_storage_t = typename aligned_storage<_Len, _Align>::type; + + template + using aligned_union_t = typename aligned_union<_Len, _Types...>::type; + + + template + using decay_t = typename decay<_Tp>::type; + + + template + using enable_if_t = typename enable_if<_Cond, _Tp>::type; + + + template + using conditional_t = typename conditional<_Cond, _Iftrue, _Iffalse>::type; + + + template + using common_type_t = typename common_type<_Tp...>::type; + + + template + using underlying_type_t = typename underlying_type<_Tp>::type; + + + template + using result_of_t = typename result_of<_Tp>::type; + + + template using __void_t = void; +# 2551 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template class _Op, typename... _Args> + struct __detector + { + using value_t = false_type; + using type = _Default; + }; + + + template class _Op, + typename... _Args> + struct __detector<_Default, __void_t<_Op<_Args...>>, _Op, _Args...> + { + using value_t = true_type; + using type = _Op<_Args...>; + }; + + + template class _Op, + typename... _Args> + using __detected_or = __detector<_Default, void, _Op, _Args...>; + + + template class _Op, + typename... _Args> + using __detected_or_t + = typename __detected_or<_Default, _Op, _Args...>::type; + + + template class _Default, + template class _Op, typename... _Args> + using __detected_or_t_ = + __detected_or_t<_Default<_Args...>, _Op, _Args...>; +# 2601 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3 + template + struct __is_swappable; + + template + struct __is_nothrow_swappable; + + template + inline + typename enable_if<__and_, + is_move_assignable<_Tp>>::value>::type + swap(_Tp&, _Tp&) + noexcept(__and_, + is_nothrow_move_assignable<_Tp>>::value); + + template + inline + typename enable_if<__is_swappable<_Tp>::value>::type + swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm]) + noexcept(__is_nothrow_swappable<_Tp>::value); + + namespace __swappable_details { + using std::swap; + + struct __do_is_swappable_impl + { + template(), std::declval<_Tp&>()))> + static true_type __test(int); + + template + static false_type __test(...); + }; + + struct __do_is_nothrow_swappable_impl + { + template + static __bool_constant< + noexcept(swap(std::declval<_Tp&>(), std::declval<_Tp&>())) + > __test(int); + + template + static false_type __test(...); + }; + + } + + template + struct __is_swappable_impl + : public __swappable_details::__do_is_swappable_impl + { + typedef decltype(__test<_Tp>(0)) type; + }; + + template + struct __is_nothrow_swappable_impl + : public __swappable_details::__do_is_nothrow_swappable_impl + { + typedef decltype(__test<_Tp>(0)) type; + }; + + template + struct __is_swappable + : public __is_swappable_impl<_Tp>::type + { }; + + template + struct __is_nothrow_swappable + : public __is_nothrow_swappable_impl<_Tp>::type + { }; + + +} +# 58 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 74 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3 + template + constexpr _Tp&& + forward(typename std::remove_reference<_Tp>::type& __t) noexcept + { return static_cast<_Tp&&>(__t); } + + + + + + + + template + constexpr _Tp&& + forward(typename std::remove_reference<_Tp>::type&& __t) noexcept + { + static_assert(!std::is_lvalue_reference<_Tp>::value, "template argument" + " substituting _Tp is an lvalue reference type"); + return static_cast<_Tp&&>(__t); + } + + + + + + + template + constexpr typename std::remove_reference<_Tp>::type&& + move(_Tp&& __t) noexcept + { return static_cast::type&&>(__t); } + + + template + struct __move_if_noexcept_cond + : public __and_<__not_>, + is_copy_constructible<_Tp>>::type { }; +# 118 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3 + template + constexpr typename + conditional<__move_if_noexcept_cond<_Tp>::value, const _Tp&, _Tp&&>::type + move_if_noexcept(_Tp& __x) noexcept + { return std::move(__x); } +# 133 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3 + template + inline _Tp* + addressof(_Tp& __r) noexcept + { return std::__addressof(__r); } + + + template + inline _Tp + __exchange(_Tp& __obj, _Up&& __new_val) + { + _Tp __old_val = std::move(__obj); + __obj = std::forward<_Up>(__new_val); + return __old_val; + } + + + +} +# 159 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 174 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3 + template + inline + + typename enable_if<__and_, + is_move_assignable<_Tp>>::value>::type + swap(_Tp& __a, _Tp& __b) + noexcept(__and_, + is_nothrow_move_assignable<_Tp>>::value) + + + + + { + + + + _Tp __tmp = std::move(__a); + __a = std::move(__b); + __b = std::move(__tmp); + } + + + + + template + inline + + typename enable_if<__is_swappable<_Tp>::value>::type + swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm]) + noexcept(__is_nothrow_swappable<_Tp>::value) + + + + + { + for (size_t __n = 0; __n < _Nm; ++__n) + swap(__a[__n], __b[__n]); + } + + + +} +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/nested_exception.h" 2 3 + + + + + +extern "C++" { + +namespace std +{ + + + + + + + class nested_exception + { + exception_ptr _M_ptr; + + public: + nested_exception() noexcept : _M_ptr(current_exception()) { } + + nested_exception(const nested_exception&) noexcept = default; + + nested_exception& operator=(const nested_exception&) noexcept = default; + + virtual ~nested_exception() noexcept; + + [[noreturn]] + void + rethrow_nested() const + { + if (_M_ptr) + rethrow_exception(_M_ptr); + std::terminate(); + } + + exception_ptr + nested_ptr() const noexcept + { return _M_ptr; } + }; + + template + struct _Nested_exception : public _Except, public nested_exception + { + explicit _Nested_exception(const _Except& __ex) + : _Except(__ex) + { } + + explicit _Nested_exception(_Except&& __ex) + : _Except(static_cast<_Except&&>(__ex)) + { } + }; + + + + + template + inline void + __throw_with_nested_impl(_Tp&& __t, true_type) + { + using _Up = typename remove_reference<_Tp>::type; + throw _Nested_exception<_Up>{std::forward<_Tp>(__t)}; + } + + template + inline void + __throw_with_nested_impl(_Tp&& __t, false_type) + { throw std::forward<_Tp>(__t); } + + + + template + [[noreturn]] + inline void + throw_with_nested(_Tp&& __t) + { + using _Up = typename remove_reference<_Tp>::type; + using _CopyConstructible + = __and_, is_move_constructible<_Up>>; + static_assert(_CopyConstructible::value, + "throw_with_nested argument must be CopyConstructible"); + using __nest = __and_, __bool_constant, + __not_>>; + std::__throw_with_nested_impl(std::forward<_Tp>(__t), __nest{}); + } + + + template + using __rethrow_if_nested_cond = typename enable_if< + __and_, + __or_<__not_>, + is_convertible<_Tp*, nested_exception*>>>::value + >::type; + + + template + inline __rethrow_if_nested_cond<_Ex> + __rethrow_if_nested_impl(const _Ex* __ptr) + { + if (auto __ne_ptr = dynamic_cast(__ptr)) + __ne_ptr->rethrow_nested(); + } + + + inline void + __rethrow_if_nested_impl(const void*) + { } + + + template + inline void + rethrow_if_nested(const _Ex& __ex) + { std::__rethrow_if_nested_impl(std::__addressof(__ex)); } + + +} + +} + + + +#pragma GCC visibility pop +# 172 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 2 3 +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 2 3 + +#pragma GCC visibility push(default) + +extern "C++" { + +namespace std +{ + + + + + + + class bad_alloc : public exception + { + public: + bad_alloc() throw() { } + + + + virtual ~bad_alloc() throw(); + + + virtual const char* what() const throw(); + }; + + + class bad_array_new_length : public bad_alloc + { + public: + bad_array_new_length() throw() { }; + + + + virtual ~bad_array_new_length() throw(); + + + virtual const char* what() const throw(); + }; + + + struct nothrow_t + { + + explicit nothrow_t() = default; + + }; + + extern const nothrow_t nothrow; + + + + typedef void (*new_handler)(); + + + + new_handler set_new_handler(new_handler) throw(); + + + + new_handler get_new_handler() noexcept; + +} +# 116 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 3 +void* operator new(std::size_t) + __attribute__((__externally_visible__)); +void* operator new[](std::size_t) + __attribute__((__externally_visible__)); +void operator delete(void*) noexcept + __attribute__((__externally_visible__)); +void operator delete[](void*) noexcept + __attribute__((__externally_visible__)); + + + + + + +void* operator new(std::size_t, const std::nothrow_t&) noexcept + __attribute__((__externally_visible__)); +void* operator new[](std::size_t, const std::nothrow_t&) noexcept + __attribute__((__externally_visible__)); +void operator delete(void*, const std::nothrow_t&) noexcept + __attribute__((__externally_visible__)); +void operator delete[](void*, const std::nothrow_t&) noexcept + __attribute__((__externally_visible__)); +# 146 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 3 +inline void* operator new(std::size_t, void* __p) noexcept +{ return __p; } +inline void* operator new[](std::size_t, void* __p) noexcept +{ return __p; } + + +inline void operator delete (void*, void*) noexcept { } +inline void operator delete[](void*, void*) noexcept { } + +} + +#pragma GCC visibility pop +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2 + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3 +# 75 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3 +# 1 "/usr/include/stdlib.h" 1 3 4 +# 32 "/usr/include/stdlib.h" 3 4 +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 33 "/usr/include/stdlib.h" 2 3 4 + +extern "C" { + + + + + + + +# 1 "/usr/include/bits/waitflags.h" 1 3 4 +# 42 "/usr/include/stdlib.h" 2 3 4 +# 1 "/usr/include/bits/waitstatus.h" 1 3 4 +# 43 "/usr/include/stdlib.h" 2 3 4 +# 58 "/usr/include/stdlib.h" 3 4 +typedef struct + { + int quot; + int rem; + } div_t; + + + +typedef struct + { + long int quot; + long int rem; + } ldiv_t; + + + + + + + +__extension__ typedef struct + { + long long int quot; + long long int rem; + } lldiv_t; +# 100 "/usr/include/stdlib.h" 3 4 +extern size_t __ctype_get_mb_cur_max (void) throw () ; + + + + +extern double atof (const char *__nptr) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ; + +extern int atoi (const char *__nptr) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ; + +extern long int atol (const char *__nptr) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ; + + + + + +__extension__ extern long long int atoll (const char *__nptr) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ; + + + + + +extern double strtod (const char *__restrict __nptr, + char **__restrict __endptr) + throw () __attribute__ ((__nonnull__ (1))); + + + + + +extern float strtof (const char *__restrict __nptr, + char **__restrict __endptr) throw () __attribute__ ((__nonnull__ (1))); + +extern long double strtold (const char *__restrict __nptr, + char **__restrict __endptr) + throw () __attribute__ ((__nonnull__ (1))); + + + + + +extern long int strtol (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + throw () __attribute__ ((__nonnull__ (1))); + +extern unsigned long int strtoul (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + throw () __attribute__ ((__nonnull__ (1))); + + + + +__extension__ +extern long long int strtoq (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + throw () __attribute__ ((__nonnull__ (1))); + +__extension__ +extern unsigned long long int strtouq (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + throw () __attribute__ ((__nonnull__ (1))); + + + + + +__extension__ +extern long long int strtoll (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + throw () __attribute__ ((__nonnull__ (1))); + +__extension__ +extern unsigned long long int strtoull (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + throw () __attribute__ ((__nonnull__ (1))); +# 200 "/usr/include/stdlib.h" 3 4 +extern long int strtol_l (const char *__restrict __nptr, + char **__restrict __endptr, int __base, + __locale_t __loc) throw () __attribute__ ((__nonnull__ (1, 4))); + +extern unsigned long int strtoul_l (const char *__restrict __nptr, + char **__restrict __endptr, + int __base, __locale_t __loc) + throw () __attribute__ ((__nonnull__ (1, 4))); + +__extension__ +extern long long int strtoll_l (const char *__restrict __nptr, + char **__restrict __endptr, int __base, + __locale_t __loc) + throw () __attribute__ ((__nonnull__ (1, 4))); + +__extension__ +extern unsigned long long int strtoull_l (const char *__restrict __nptr, + char **__restrict __endptr, + int __base, __locale_t __loc) + throw () __attribute__ ((__nonnull__ (1, 4))); + +extern double strtod_l (const char *__restrict __nptr, + char **__restrict __endptr, __locale_t __loc) + throw () __attribute__ ((__nonnull__ (1, 3))); + +extern float strtof_l (const char *__restrict __nptr, + char **__restrict __endptr, __locale_t __loc) + throw () __attribute__ ((__nonnull__ (1, 3))); + +extern long double strtold_l (const char *__restrict __nptr, + char **__restrict __endptr, + __locale_t __loc) + throw () __attribute__ ((__nonnull__ (1, 3))); +# 266 "/usr/include/stdlib.h" 3 4 +extern char *l64a (long int __n) throw () ; + + +extern long int a64l (const char *__s) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ; + + + + + +# 1 "/usr/include/sys/types.h" 1 3 4 +# 27 "/usr/include/sys/types.h" 3 4 +extern "C" { + + + + + +typedef __u_char u_char; +typedef __u_short u_short; +typedef __u_int u_int; +typedef __u_long u_long; +typedef __quad_t quad_t; +typedef __u_quad_t u_quad_t; +typedef __fsid_t fsid_t; + + + + +typedef __loff_t loff_t; + + + +typedef __ino_t ino_t; + + + + + + +typedef __ino64_t ino64_t; + + + + +typedef __dev_t dev_t; + + + + +typedef __gid_t gid_t; + + + + +typedef __mode_t mode_t; + + + + +typedef __nlink_t nlink_t; + + + + +typedef __uid_t uid_t; +# 98 "/usr/include/sys/types.h" 3 4 +typedef __pid_t pid_t; + + + + + +typedef __id_t id_t; +# 115 "/usr/include/sys/types.h" 3 4 +typedef __daddr_t daddr_t; +typedef __caddr_t caddr_t; + + + + + +typedef __key_t key_t; +# 132 "/usr/include/sys/types.h" 3 4 +# 1 "/usr/include/time.h" 1 3 4 +# 59 "/usr/include/time.h" 3 4 +typedef __clock_t clock_t; +# 75 "/usr/include/time.h" 3 4 +typedef __time_t time_t; +# 91 "/usr/include/time.h" 3 4 +typedef __clockid_t clockid_t; +# 103 "/usr/include/time.h" 3 4 +typedef __timer_t timer_t; +# 133 "/usr/include/sys/types.h" 2 3 4 + + + +typedef __useconds_t useconds_t; + + + +typedef __suseconds_t suseconds_t; + + + + + + +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 147 "/usr/include/sys/types.h" 2 3 4 + + + +typedef unsigned long int ulong; +typedef unsigned short int ushort; +typedef unsigned int uint; +# 200 "/usr/include/sys/types.h" 3 4 +typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__))); +typedef unsigned int u_int16_t __attribute__ ((__mode__ (__HI__))); +typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__))); +typedef unsigned int u_int64_t __attribute__ ((__mode__ (__DI__))); + +typedef int register_t __attribute__ ((__mode__ (__word__))); +# 216 "/usr/include/sys/types.h" 3 4 +# 1 "/usr/include/endian.h" 1 3 4 +# 36 "/usr/include/endian.h" 3 4 +# 1 "/usr/include/bits/endian.h" 1 3 4 +# 37 "/usr/include/endian.h" 2 3 4 +# 60 "/usr/include/endian.h" 3 4 +# 1 "/usr/include/bits/byteswap.h" 1 3 4 +# 28 "/usr/include/bits/byteswap.h" 3 4 +# 1 "/usr/include/bits/wordsize.h" 1 3 4 +# 29 "/usr/include/bits/byteswap.h" 2 3 4 + + + + + + +# 1 "/usr/include/bits/byteswap-16.h" 1 3 4 +# 36 "/usr/include/bits/byteswap.h" 2 3 4 +# 61 "/usr/include/endian.h" 2 3 4 +# 217 "/usr/include/sys/types.h" 2 3 4 + + +# 1 "/usr/include/sys/select.h" 1 3 4 +# 30 "/usr/include/sys/select.h" 3 4 +# 1 "/usr/include/bits/select.h" 1 3 4 +# 22 "/usr/include/bits/select.h" 3 4 +# 1 "/usr/include/bits/wordsize.h" 1 3 4 +# 23 "/usr/include/bits/select.h" 2 3 4 +# 31 "/usr/include/sys/select.h" 2 3 4 + + +# 1 "/usr/include/bits/sigset.h" 1 3 4 +# 22 "/usr/include/bits/sigset.h" 3 4 +typedef int __sig_atomic_t; + + + + +typedef struct + { + unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))]; + } __sigset_t; +# 34 "/usr/include/sys/select.h" 2 3 4 + + + +typedef __sigset_t sigset_t; + + + + + + + + +# 1 "/usr/include/time.h" 1 3 4 +# 120 "/usr/include/time.h" 3 4 +struct timespec + { + __time_t tv_sec; + __syscall_slong_t tv_nsec; + }; +# 46 "/usr/include/sys/select.h" 2 3 4 + +# 1 "/usr/include/bits/time.h" 1 3 4 +# 30 "/usr/include/bits/time.h" 3 4 +struct timeval + { + __time_t tv_sec; + __suseconds_t tv_usec; + }; +# 48 "/usr/include/sys/select.h" 2 3 4 + + + + + + + + +typedef long int __fd_mask; +# 66 "/usr/include/sys/select.h" 3 4 +typedef struct + { + + + + __fd_mask fds_bits[1024 / (8 * (int) sizeof (__fd_mask))]; + + + + + + } fd_set; + + + + + + +typedef __fd_mask fd_mask; +# 98 "/usr/include/sys/select.h" 3 4 +extern "C" { +# 108 "/usr/include/sys/select.h" 3 4 +extern int select (int __nfds, fd_set *__restrict __readfds, + fd_set *__restrict __writefds, + fd_set *__restrict __exceptfds, + struct timeval *__restrict __timeout); +# 120 "/usr/include/sys/select.h" 3 4 +extern int pselect (int __nfds, fd_set *__restrict __readfds, + fd_set *__restrict __writefds, + fd_set *__restrict __exceptfds, + const struct timespec *__restrict __timeout, + const __sigset_t *__restrict __sigmask); +# 133 "/usr/include/sys/select.h" 3 4 +} +# 220 "/usr/include/sys/types.h" 2 3 4 + + +# 1 "/usr/include/sys/sysmacros.h" 1 3 4 +# 24 "/usr/include/sys/sysmacros.h" 3 4 +extern "C" { + +__extension__ +extern unsigned int gnu_dev_major (unsigned long long int __dev) + throw () __attribute__ ((__const__)); +__extension__ +extern unsigned int gnu_dev_minor (unsigned long long int __dev) + throw () __attribute__ ((__const__)); +__extension__ +extern unsigned long long int gnu_dev_makedev (unsigned int __major, + unsigned int __minor) + throw () __attribute__ ((__const__)); +# 58 "/usr/include/sys/sysmacros.h" 3 4 +} +# 223 "/usr/include/sys/types.h" 2 3 4 + + + + + +typedef __blksize_t blksize_t; + + + + + + +typedef __blkcnt_t blkcnt_t; + + + +typedef __fsblkcnt_t fsblkcnt_t; + + + +typedef __fsfilcnt_t fsfilcnt_t; +# 262 "/usr/include/sys/types.h" 3 4 +typedef __blkcnt64_t blkcnt64_t; +typedef __fsblkcnt64_t fsblkcnt64_t; +typedef __fsfilcnt64_t fsfilcnt64_t; + + + + + + +# 1 "/usr/include/bits/pthreadtypes.h" 1 3 4 +# 21 "/usr/include/bits/pthreadtypes.h" 3 4 +# 1 "/usr/include/bits/wordsize.h" 1 3 4 +# 22 "/usr/include/bits/pthreadtypes.h" 2 3 4 +# 60 "/usr/include/bits/pthreadtypes.h" 3 4 +typedef unsigned long int pthread_t; + + +union pthread_attr_t +{ + char __size[56]; + long int __align; +}; + +typedef union pthread_attr_t pthread_attr_t; + + + + + +typedef struct __pthread_internal_list +{ + struct __pthread_internal_list *__prev; + struct __pthread_internal_list *__next; +} __pthread_list_t; +# 90 "/usr/include/bits/pthreadtypes.h" 3 4 +typedef union +{ + struct __pthread_mutex_s + { + int __lock; + unsigned int __count; + int __owner; + + unsigned int __nusers; + + + + int __kind; + + short __spins; + short __elision; + __pthread_list_t __list; +# 125 "/usr/include/bits/pthreadtypes.h" 3 4 + } __data; + char __size[40]; + long int __align; +} pthread_mutex_t; + +typedef union +{ + char __size[4]; + int __align; +} pthread_mutexattr_t; + + + + +typedef union +{ + struct + { + int __lock; + unsigned int __futex; + __extension__ unsigned long long int __total_seq; + __extension__ unsigned long long int __wakeup_seq; + __extension__ unsigned long long int __woken_seq; + void *__mutex; + unsigned int __nwaiters; + unsigned int __broadcast_seq; + } __data; + char __size[48]; + __extension__ long long int __align; +} pthread_cond_t; + +typedef union +{ + char __size[4]; + int __align; +} pthread_condattr_t; + + + +typedef unsigned int pthread_key_t; + + + +typedef int pthread_once_t; + + + + + +typedef union +{ + + struct + { + int __lock; + unsigned int __nr_readers; + unsigned int __readers_wakeup; + unsigned int __writer_wakeup; + unsigned int __nr_readers_queued; + unsigned int __nr_writers_queued; + int __writer; + int __shared; + signed char __rwelision; + + + + + unsigned char __pad1[7]; + + + unsigned long int __pad2; + + + unsigned int __flags; + + } __data; +# 220 "/usr/include/bits/pthreadtypes.h" 3 4 + char __size[56]; + long int __align; +} pthread_rwlock_t; + +typedef union +{ + char __size[8]; + long int __align; +} pthread_rwlockattr_t; + + + + + +typedef volatile int pthread_spinlock_t; + + + + +typedef union +{ + char __size[32]; + long int __align; +} pthread_barrier_t; + +typedef union +{ + char __size[4]; + int __align; +} pthread_barrierattr_t; +# 271 "/usr/include/sys/types.h" 2 3 4 + + +} +# 276 "/usr/include/stdlib.h" 2 3 4 + + + + + + +extern long int random (void) throw (); + + +extern void srandom (unsigned int __seed) throw (); + + + + + +extern char *initstate (unsigned int __seed, char *__statebuf, + size_t __statelen) throw () __attribute__ ((__nonnull__ (2))); + + + +extern char *setstate (char *__statebuf) throw () __attribute__ ((__nonnull__ (1))); + + + + + + + +struct random_data + { + int32_t *fptr; + int32_t *rptr; + int32_t *state; + int rand_type; + int rand_deg; + int rand_sep; + int32_t *end_ptr; + }; + +extern int random_r (struct random_data *__restrict __buf, + int32_t *__restrict __result) throw () __attribute__ ((__nonnull__ (1, 2))); + +extern int srandom_r (unsigned int __seed, struct random_data *__buf) + throw () __attribute__ ((__nonnull__ (2))); + +extern int initstate_r (unsigned int __seed, char *__restrict __statebuf, + size_t __statelen, + struct random_data *__restrict __buf) + throw () __attribute__ ((__nonnull__ (2, 4))); + +extern int setstate_r (char *__restrict __statebuf, + struct random_data *__restrict __buf) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + + + + +extern int rand (void) throw (); + +extern void srand (unsigned int __seed) throw (); + + + + +extern int rand_r (unsigned int *__seed) throw (); + + + + + + + +extern double drand48 (void) throw (); +extern double erand48 (unsigned short int __xsubi[3]) throw () __attribute__ ((__nonnull__ (1))); + + +extern long int lrand48 (void) throw (); +extern long int nrand48 (unsigned short int __xsubi[3]) + throw () __attribute__ ((__nonnull__ (1))); + + +extern long int mrand48 (void) throw (); +extern long int jrand48 (unsigned short int __xsubi[3]) + throw () __attribute__ ((__nonnull__ (1))); + + +extern void srand48 (long int __seedval) throw (); +extern unsigned short int *seed48 (unsigned short int __seed16v[3]) + throw () __attribute__ ((__nonnull__ (1))); +extern void lcong48 (unsigned short int __param[7]) throw () __attribute__ ((__nonnull__ (1))); + + + + + +struct drand48_data + { + unsigned short int __x[3]; + unsigned short int __old_x[3]; + unsigned short int __c; + unsigned short int __init; + __extension__ unsigned long long int __a; + + }; + + +extern int drand48_r (struct drand48_data *__restrict __buffer, + double *__restrict __result) throw () __attribute__ ((__nonnull__ (1, 2))); +extern int erand48_r (unsigned short int __xsubi[3], + struct drand48_data *__restrict __buffer, + double *__restrict __result) throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int lrand48_r (struct drand48_data *__restrict __buffer, + long int *__restrict __result) + throw () __attribute__ ((__nonnull__ (1, 2))); +extern int nrand48_r (unsigned short int __xsubi[3], + struct drand48_data *__restrict __buffer, + long int *__restrict __result) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int mrand48_r (struct drand48_data *__restrict __buffer, + long int *__restrict __result) + throw () __attribute__ ((__nonnull__ (1, 2))); +extern int jrand48_r (unsigned short int __xsubi[3], + struct drand48_data *__restrict __buffer, + long int *__restrict __result) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int srand48_r (long int __seedval, struct drand48_data *__buffer) + throw () __attribute__ ((__nonnull__ (2))); + +extern int seed48_r (unsigned short int __seed16v[3], + struct drand48_data *__buffer) throw () __attribute__ ((__nonnull__ (1, 2))); + +extern int lcong48_r (unsigned short int __param[7], + struct drand48_data *__buffer) + throw () __attribute__ ((__nonnull__ (1, 2))); +# 427 "/usr/include/stdlib.h" 3 4 +extern void *malloc (size_t __size) throw () __attribute__ ((__malloc__)) ; + +extern void *calloc (size_t __nmemb, size_t __size) + throw () __attribute__ ((__malloc__)) ; +# 441 "/usr/include/stdlib.h" 3 4 +extern void *realloc (void *__ptr, size_t __size) + throw () __attribute__ ((__warn_unused_result__)); + +extern void free (void *__ptr) throw (); + + + + +extern void cfree (void *__ptr) throw (); + + + + +# 1 "/usr/include/alloca.h" 1 3 4 +# 24 "/usr/include/alloca.h" 3 4 +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 25 "/usr/include/alloca.h" 2 3 4 + +extern "C" { + + + + + +extern void *alloca (size_t __size) throw (); + + + + + +} +# 454 "/usr/include/stdlib.h" 2 3 4 + + + + + +extern void *valloc (size_t __size) throw () __attribute__ ((__malloc__)) ; + + + + +extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size) + throw () __attribute__ ((__nonnull__ (1))) ; + + + + +extern void *aligned_alloc (size_t __alignment, size_t __size) + throw () __attribute__ ((__malloc__)) ; + + + + +extern void abort (void) throw () __attribute__ ((__noreturn__)); + + + +extern int atexit (void (*__func) (void)) throw () __attribute__ ((__nonnull__ (1))); + + + + +extern "C++" int at_quick_exit (void (*__func) (void)) + throw () __asm ("at_quick_exit") __attribute__ ((__nonnull__ (1))); +# 496 "/usr/include/stdlib.h" 3 4 +extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg) + throw () __attribute__ ((__nonnull__ (1))); + + + + + + +extern void exit (int __status) throw () __attribute__ ((__noreturn__)); + + + + + +extern void quick_exit (int __status) throw () __attribute__ ((__noreturn__)); + + + + + + + +extern void _Exit (int __status) throw () __attribute__ ((__noreturn__)); + + + + + + +extern char *getenv (const char *__name) throw () __attribute__ ((__nonnull__ (1))) ; + + + + + +extern char *secure_getenv (const char *__name) + throw () __attribute__ ((__nonnull__ (1))) ; + + + + + + +extern int putenv (char *__string) throw () __attribute__ ((__nonnull__ (1))); + + + + + +extern int setenv (const char *__name, const char *__value, int __replace) + throw () __attribute__ ((__nonnull__ (2))); + + +extern int unsetenv (const char *__name) throw () __attribute__ ((__nonnull__ (1))); + + + + + + +extern int clearenv (void) throw (); +# 567 "/usr/include/stdlib.h" 3 4 +extern char *mktemp (char *__template) throw () __attribute__ ((__nonnull__ (1))); +# 580 "/usr/include/stdlib.h" 3 4 +extern int mkstemp (char *__template) __attribute__ ((__nonnull__ (1))) ; +# 590 "/usr/include/stdlib.h" 3 4 +extern int mkstemp64 (char *__template) __attribute__ ((__nonnull__ (1))) ; +# 602 "/usr/include/stdlib.h" 3 4 +extern int mkstemps (char *__template, int __suffixlen) __attribute__ ((__nonnull__ (1))) ; +# 612 "/usr/include/stdlib.h" 3 4 +extern int mkstemps64 (char *__template, int __suffixlen) + __attribute__ ((__nonnull__ (1))) ; +# 623 "/usr/include/stdlib.h" 3 4 +extern char *mkdtemp (char *__template) throw () __attribute__ ((__nonnull__ (1))) ; +# 634 "/usr/include/stdlib.h" 3 4 +extern int mkostemp (char *__template, int __flags) __attribute__ ((__nonnull__ (1))) ; +# 644 "/usr/include/stdlib.h" 3 4 +extern int mkostemp64 (char *__template, int __flags) __attribute__ ((__nonnull__ (1))) ; +# 654 "/usr/include/stdlib.h" 3 4 +extern int mkostemps (char *__template, int __suffixlen, int __flags) + __attribute__ ((__nonnull__ (1))) ; +# 666 "/usr/include/stdlib.h" 3 4 +extern int mkostemps64 (char *__template, int __suffixlen, int __flags) + __attribute__ ((__nonnull__ (1))) ; +# 677 "/usr/include/stdlib.h" 3 4 +extern int system (const char *__command) ; + + + + + + +extern char *canonicalize_file_name (const char *__name) + throw () __attribute__ ((__nonnull__ (1))) ; +# 694 "/usr/include/stdlib.h" 3 4 +extern char *realpath (const char *__restrict __name, + char *__restrict __resolved) throw () ; + + + + + + +typedef int (*__compar_fn_t) (const void *, const void *); + + +typedef __compar_fn_t comparison_fn_t; + + + +typedef int (*__compar_d_fn_t) (const void *, const void *, void *); + + + + + +extern void *bsearch (const void *__key, const void *__base, + size_t __nmemb, size_t __size, __compar_fn_t __compar) + __attribute__ ((__nonnull__ (1, 2, 5))) ; + + + + + + + +extern void qsort (void *__base, size_t __nmemb, size_t __size, + __compar_fn_t __compar) __attribute__ ((__nonnull__ (1, 4))); + +extern void qsort_r (void *__base, size_t __nmemb, size_t __size, + __compar_d_fn_t __compar, void *__arg) + __attribute__ ((__nonnull__ (1, 4))); + + + + +extern int abs (int __x) throw () __attribute__ ((__const__)) ; +extern long int labs (long int __x) throw () __attribute__ ((__const__)) ; + + + +__extension__ extern long long int llabs (long long int __x) + throw () __attribute__ ((__const__)) ; + + + + + + + +extern div_t div (int __numer, int __denom) + throw () __attribute__ ((__const__)) ; +extern ldiv_t ldiv (long int __numer, long int __denom) + throw () __attribute__ ((__const__)) ; + + + + +__extension__ extern lldiv_t lldiv (long long int __numer, + long long int __denom) + throw () __attribute__ ((__const__)) ; +# 772 "/usr/include/stdlib.h" 3 4 +extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt, + int *__restrict __sign) throw () __attribute__ ((__nonnull__ (3, 4))) ; + + + + +extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt, + int *__restrict __sign) throw () __attribute__ ((__nonnull__ (3, 4))) ; + + + + +extern char *gcvt (double __value, int __ndigit, char *__buf) + throw () __attribute__ ((__nonnull__ (3))) ; + + + + +extern char *qecvt (long double __value, int __ndigit, + int *__restrict __decpt, int *__restrict __sign) + throw () __attribute__ ((__nonnull__ (3, 4))) ; +extern char *qfcvt (long double __value, int __ndigit, + int *__restrict __decpt, int *__restrict __sign) + throw () __attribute__ ((__nonnull__ (3, 4))) ; +extern char *qgcvt (long double __value, int __ndigit, char *__buf) + throw () __attribute__ ((__nonnull__ (3))) ; + + + + +extern int ecvt_r (double __value, int __ndigit, int *__restrict __decpt, + int *__restrict __sign, char *__restrict __buf, + size_t __len) throw () __attribute__ ((__nonnull__ (3, 4, 5))); +extern int fcvt_r (double __value, int __ndigit, int *__restrict __decpt, + int *__restrict __sign, char *__restrict __buf, + size_t __len) throw () __attribute__ ((__nonnull__ (3, 4, 5))); + +extern int qecvt_r (long double __value, int __ndigit, + int *__restrict __decpt, int *__restrict __sign, + char *__restrict __buf, size_t __len) + throw () __attribute__ ((__nonnull__ (3, 4, 5))); +extern int qfcvt_r (long double __value, int __ndigit, + int *__restrict __decpt, int *__restrict __sign, + char *__restrict __buf, size_t __len) + throw () __attribute__ ((__nonnull__ (3, 4, 5))); + + + + + + +extern int mblen (const char *__s, size_t __n) throw (); + + +extern int mbtowc (wchar_t *__restrict __pwc, + const char *__restrict __s, size_t __n) throw (); + + +extern int wctomb (char *__s, wchar_t __wchar) throw (); + + + +extern size_t mbstowcs (wchar_t *__restrict __pwcs, + const char *__restrict __s, size_t __n) throw (); + +extern size_t wcstombs (char *__restrict __s, + const wchar_t *__restrict __pwcs, size_t __n) + throw (); +# 848 "/usr/include/stdlib.h" 3 4 +extern int rpmatch (const char *__response) throw () __attribute__ ((__nonnull__ (1))) ; +# 859 "/usr/include/stdlib.h" 3 4 +extern int getsubopt (char **__restrict __optionp, + char *const *__restrict __tokens, + char **__restrict __valuep) + throw () __attribute__ ((__nonnull__ (1, 2, 3))) ; + + + + + +extern void setkey (const char *__key) throw () __attribute__ ((__nonnull__ (1))); + + + + + + + +extern int posix_openpt (int __oflag) ; + + + + + + + +extern int grantpt (int __fd) throw (); + + + +extern int unlockpt (int __fd) throw (); + + + + +extern char *ptsname (int __fd) throw () ; + + + + + + +extern int ptsname_r (int __fd, char *__buf, size_t __buflen) + throw () __attribute__ ((__nonnull__ (2))); + + +extern int getpt (void); + + + + + + +extern int getloadavg (double __loadavg[], int __nelem) + throw () __attribute__ ((__nonnull__ (1))); +# 921 "/usr/include/stdlib.h" 3 4 +# 1 "/usr/include/bits/stdlib-float.h" 1 3 4 +# 922 "/usr/include/stdlib.h" 2 3 4 +# 934 "/usr/include/stdlib.h" 3 4 +} +# 76 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 2 3 +# 118 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3 +extern "C++" +{ +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + using ::div_t; + using ::ldiv_t; + + using ::abort; + using ::abs; + using ::atexit; + + + using ::at_quick_exit; + + + using ::atof; + using ::atoi; + using ::atol; + using ::bsearch; + using ::calloc; + using ::div; + using ::exit; + using ::free; + using ::getenv; + using ::labs; + using ::ldiv; + using ::malloc; + + using ::mblen; + using ::mbstowcs; + using ::mbtowc; + + using ::qsort; + + + using ::quick_exit; + + + using ::rand; + using ::realloc; + using ::srand; + using ::strtod; + using ::strtol; + using ::strtoul; + using ::system; + + using ::wcstombs; + using ::wctomb; + + + + inline long + abs(long __i) { return __builtin_labs(__i); } + + inline ldiv_t + div(long __i, long __j) { return ldiv(__i, __j); } + + + + inline long long + abs(long long __x) { return __builtin_llabs (__x); } +# 202 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3 +} +# 215 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3 +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + + + + using ::lldiv_t; + + + + + + using ::_Exit; + + + + using ::llabs; + + inline lldiv_t + div(long long __n, long long __d) + { lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; } + + using ::lldiv; +# 247 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3 + using ::atoll; + using ::strtoll; + using ::strtoull; + + using ::strtof; + using ::strtold; + + +} + +namespace std +{ + + using ::__gnu_cxx::lldiv_t; + + using ::__gnu_cxx::_Exit; + + using ::__gnu_cxx::llabs; + using ::__gnu_cxx::div; + using ::__gnu_cxx::lldiv; + + using ::__gnu_cxx::atoll; + using ::__gnu_cxx::strtof; + using ::__gnu_cxx::strtoll; + using ::__gnu_cxx::strtoull; + using ::__gnu_cxx::strtold; +} + + + +} +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 3 + + +# 1 "/usr/include/string.h" 1 3 4 +# 27 "/usr/include/string.h" 3 4 +extern "C" { + + + + + +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 33 "/usr/include/string.h" 2 3 4 +# 42 "/usr/include/string.h" 3 4 +extern void *memcpy (void *__restrict __dest, const void *__restrict __src, + size_t __n) throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern void *memmove (void *__dest, const void *__src, size_t __n) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + + + + +extern void *memccpy (void *__restrict __dest, const void *__restrict __src, + int __c, size_t __n) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + + + +extern void *memset (void *__s, int __c, size_t __n) throw () __attribute__ ((__nonnull__ (1))); + + +extern int memcmp (const void *__s1, const void *__s2, size_t __n) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); +# 92 "/usr/include/string.h" 3 4 +extern void *memchr (const void *__s, int __c, size_t __n) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); +# 106 "/usr/include/string.h" 3 4 +extern void *rawmemchr (const void *__s, int __c) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); +# 117 "/usr/include/string.h" 3 4 +extern void *memrchr (const void *__s, int __c, size_t __n) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); + + + + + + +extern char *strcpy (char *__restrict __dest, const char *__restrict __src) + throw () __attribute__ ((__nonnull__ (1, 2))); + +extern char *strncpy (char *__restrict __dest, + const char *__restrict __src, size_t __n) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern char *strcat (char *__restrict __dest, const char *__restrict __src) + throw () __attribute__ ((__nonnull__ (1, 2))); + +extern char *strncat (char *__restrict __dest, const char *__restrict __src, + size_t __n) throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int strcmp (const char *__s1, const char *__s2) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + +extern int strncmp (const char *__s1, const char *__s2, size_t __n) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + + +extern int strcoll (const char *__s1, const char *__s2) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + +extern size_t strxfrm (char *__restrict __dest, + const char *__restrict __src, size_t __n) + throw () __attribute__ ((__nonnull__ (2))); +# 162 "/usr/include/string.h" 3 4 +extern int strcoll_l (const char *__s1, const char *__s2, __locale_t __l) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 3))); + +extern size_t strxfrm_l (char *__dest, const char *__src, size_t __n, + __locale_t __l) throw () __attribute__ ((__nonnull__ (2, 4))); + + + + +extern char *strdup (const char *__s) + throw () __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1))); + + + + + + +extern char *strndup (const char *__string, size_t __n) + throw () __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1))); +# 231 "/usr/include/string.h" 3 4 +extern char *strchr (const char *__s, int __c) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); +# 258 "/usr/include/string.h" 3 4 +extern char *strrchr (const char *__s, int __c) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); +# 272 "/usr/include/string.h" 3 4 +extern char *strchrnul (const char *__s, int __c) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); + + + + + + +extern size_t strcspn (const char *__s, const char *__reject) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + + +extern size_t strspn (const char *__s, const char *__accept) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); +# 310 "/usr/include/string.h" 3 4 +extern char *strpbrk (const char *__s, const char *__accept) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); +# 337 "/usr/include/string.h" 3 4 +extern char *strstr (const char *__haystack, const char *__needle) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + + + + +extern char *strtok (char *__restrict __s, const char *__restrict __delim) + throw () __attribute__ ((__nonnull__ (2))); + + + + +extern char *__strtok_r (char *__restrict __s, + const char *__restrict __delim, + char **__restrict __save_ptr) + throw () __attribute__ ((__nonnull__ (2, 3))); + +extern char *strtok_r (char *__restrict __s, const char *__restrict __delim, + char **__restrict __save_ptr) + throw () __attribute__ ((__nonnull__ (2, 3))); +# 368 "/usr/include/string.h" 3 4 +extern char *strcasestr (const char *__haystack, const char *__needle) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + + + + + + + +extern void *memmem (const void *__haystack, size_t __haystacklen, + const void *__needle, size_t __needlelen) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 3))); + + + +extern void *__mempcpy (void *__restrict __dest, + const void *__restrict __src, size_t __n) + throw () __attribute__ ((__nonnull__ (1, 2))); +extern void *mempcpy (void *__restrict __dest, + const void *__restrict __src, size_t __n) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + + + +extern size_t strlen (const char *__s) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); + + + + + +extern size_t strnlen (const char *__string, size_t __maxlen) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); + + + + + +extern char *strerror (int __errnum) throw (); +# 433 "/usr/include/string.h" 3 4 +extern char *strerror_r (int __errnum, char *__buf, size_t __buflen) + throw () __attribute__ ((__nonnull__ (2))) ; + + + + + +extern char *strerror_l (int __errnum, __locale_t __l) throw (); + + + + + +extern void __bzero (void *__s, size_t __n) throw () __attribute__ ((__nonnull__ (1))); + + + +extern void bcopy (const void *__src, void *__dest, size_t __n) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern void bzero (void *__s, size_t __n) throw () __attribute__ ((__nonnull__ (1))); + + +extern int bcmp (const void *__s1, const void *__s2, size_t __n) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); +# 484 "/usr/include/string.h" 3 4 +extern char *index (const char *__s, int __c) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); +# 512 "/usr/include/string.h" 3 4 +extern char *rindex (const char *__s, int __c) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); + + + + +extern int ffs (int __i) throw () __attribute__ ((__const__)); + + + + +extern int ffsl (long int __l) throw () __attribute__ ((__const__)); +__extension__ extern int ffsll (long long int __ll) + throw () __attribute__ ((__const__)); + + + +extern int strcasecmp (const char *__s1, const char *__s2) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + + +extern int strncasecmp (const char *__s1, const char *__s2, size_t __n) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + + + + + +extern int strcasecmp_l (const char *__s1, const char *__s2, + __locale_t __loc) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 3))); + +extern int strncasecmp_l (const char *__s1, const char *__s2, + size_t __n, __locale_t __loc) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 4))); + + + + + +extern char *strsep (char **__restrict __stringp, + const char *__restrict __delim) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + + +extern char *strsignal (int __sig) throw (); + + +extern char *__stpcpy (char *__restrict __dest, const char *__restrict __src) + throw () __attribute__ ((__nonnull__ (1, 2))); +extern char *stpcpy (char *__restrict __dest, const char *__restrict __src) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + +extern char *__stpncpy (char *__restrict __dest, + const char *__restrict __src, size_t __n) + throw () __attribute__ ((__nonnull__ (1, 2))); +extern char *stpncpy (char *__restrict __dest, + const char *__restrict __src, size_t __n) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + + +extern int strverscmp (const char *__s1, const char *__s2) + throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); + + +extern char *strfry (char *__string) throw () __attribute__ ((__nonnull__ (1))); + + +extern void *memfrob (void *__s, size_t __n) throw () __attribute__ ((__nonnull__ (1))); +# 599 "/usr/include/string.h" 3 4 +extern char *basename (const char *__filename) throw () __attribute__ ((__nonnull__ (1))); +# 656 "/usr/include/string.h" 3 4 +} +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 2 3 +# 71 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + using ::memchr; + using ::memcmp; + using ::memcpy; + using ::memmove; + using ::memset; + using ::strcat; + using ::strcmp; + using ::strcoll; + using ::strcpy; + using ::strcspn; + using ::strerror; + using ::strlen; + using ::strncat; + using ::strncmp; + using ::strncpy; + using ::strspn; + using ::strtok; + using ::strxfrm; + using ::strchr; + using ::strpbrk; + using ::strrchr; + using ::strstr; + + + inline void* + memchr(void* __s, int __c, size_t __n) + { return __builtin_memchr(__s, __c, __n); } + + inline char* + strchr(char* __s, int __n) + { return __builtin_strchr(__s, __n); } + + inline char* + strpbrk(char* __s1, const char* __s2) + { return __builtin_strpbrk(__s1, __s2); } + + inline char* + strrchr(char* __s, int __n) + { return __builtin_strrchr(__s, __n); } + + inline char* + strstr(char* __s1, const char* __s2) + { return __builtin_strstr(__s1, __s2); } + + + +} +# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2 + + + + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/fallible.h" 1 +# 51 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/fallible.h" +namespace mozilla { + +struct fallible_t { }; +# 62 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/fallible.h" +extern const fallible_t fallible; + +} +# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc_abort.h" 1 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc_abort.h" +__attribute__((weak)) __attribute__((visibility("default"))) + + __attribute__((noreturn)) + + void mozalloc_abort(const char* const msg); +# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/limits.h" 1 3 +# 37 "/usr/local/bin/../lib/clang/3.9.1/include/limits.h" 3 +# 1 "/usr/include/limits.h" 1 3 4 +# 143 "/usr/include/limits.h" 3 4 +# 1 "/usr/include/bits/posix1_lim.h" 1 3 4 +# 160 "/usr/include/bits/posix1_lim.h" 3 4 +# 1 "/usr/include/bits/local_lim.h" 1 3 4 +# 38 "/usr/include/bits/local_lim.h" 3 4 +# 1 "/usr/include/linux/limits.h" 1 3 4 +# 39 "/usr/include/bits/local_lim.h" 2 3 4 +# 161 "/usr/include/bits/posix1_lim.h" 2 3 4 +# 144 "/usr/include/limits.h" 2 3 4 + + + +# 1 "/usr/include/bits/posix2_lim.h" 1 3 4 +# 148 "/usr/include/limits.h" 2 3 4 + + + +# 1 "/usr/include/bits/xopen_lim.h" 1 3 4 +# 33 "/usr/include/bits/xopen_lim.h" 3 4 +# 1 "/usr/include/bits/stdio_lim.h" 1 3 4 +# 34 "/usr/include/bits/xopen_lim.h" 2 3 4 +# 152 "/usr/include/limits.h" 2 3 4 +# 38 "/usr/local/bin/../lib/clang/3.9.1/include/limits.h" 2 3 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h" 2 +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h" 2 + + + +namespace mozilla { + +namespace tl { + + +template +struct Min +{ + static constexpr size_t value = + Size < Min::value + ? Size + : Min::value; +}; + +template +struct Min +{ + static constexpr size_t value = Size; +}; + +template +struct Max +{ + static constexpr size_t value = + Size > Max::value + ? Size + : Max::value; +}; + +template +struct Max +{ + static constexpr size_t value = Size; +}; + + +template +struct FloorLog2 +{ + static const size_t value = 1 + FloorLog2::value; +}; +template<> struct FloorLog2<0> { }; +template<> struct FloorLog2<1> { static const size_t value = 0; }; + + +template +struct CeilingLog2 +{ + static const size_t value = FloorLog2<2 * I - 1>::value; +}; + + +template +struct RoundUpPow2 +{ + static const size_t value = size_t(1) << CeilingLog2::value; +}; +template<> +struct RoundUpPow2<0> +{ + static const size_t value = 1; +}; + + +template +struct BitSize +{ + static const size_t value = sizeof(T) * 8; +}; + + + + + +template +struct NBitMask +{ + + + + + static const size_t checkPrecondition = + 0 / size_t(N < BitSize::value); + static const size_t value = (size_t(1) << N) - 1 + checkPrecondition; +}; +template<> +struct NBitMask::value> +{ + static const size_t value = size_t(-1); +}; + + + + + +template +struct MulOverflowMask +{ + static const size_t value = + ~NBitMask::value - CeilingLog2::value>::value; +}; +template<> struct MulOverflowMask<0> { }; +template<> struct MulOverflowMask<1> { static const size_t value = 0; }; +# 138 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h" +template +struct And; + +template<> +struct And<> : public TrueType { }; + +template +struct And + : public Conditional, FalseType>::Type { }; + +} + +} +# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2 +# 55 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" +extern "C" { +# 85 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" +__attribute__((weak)) __attribute__((visibility("default"))) void* moz_xmalloc(size_t size) + __attribute__ ((malloc, warn_unused_result)); + +__attribute__((weak)) __attribute__((visibility("default"))) void* moz_xcalloc(size_t nmemb, size_t size) + __attribute__ ((malloc, warn_unused_result)); + +__attribute__((weak)) __attribute__((visibility("default"))) void* moz_xrealloc(void* ptr, size_t size) + __attribute__ ((malloc, warn_unused_result)); + +__attribute__((weak)) __attribute__((visibility("default"))) char* moz_xstrdup(const char* str) + __attribute__ ((malloc, warn_unused_result)); + +__attribute__((weak)) __attribute__((visibility("default"))) size_t moz_malloc_usable_size(void *ptr); + +__attribute__((weak)) __attribute__((visibility("default"))) size_t moz_malloc_size_of(const void *ptr); + + +__attribute__((weak)) __attribute__((visibility("default"))) char* moz_xstrndup(const char* str, size_t strsize) + __attribute__ ((malloc, warn_unused_result)); + + + + +__attribute__((weak)) __attribute__((visibility("default"))) __attribute__ ((warn_unused_result)) +int moz_xposix_memalign(void **ptr, size_t alignment, size_t size); + +__attribute__((weak)) __attribute__((visibility("default"))) __attribute__ ((warn_unused_result)) +int moz_posix_memalign(void **ptr, size_t alignment, size_t size); + + + + +__attribute__((weak)) __attribute__((visibility("default"))) void* moz_xmemalign(size_t boundary, size_t size) + __attribute__ ((malloc, warn_unused_result)); + + + + +__attribute__((weak)) __attribute__((visibility("default"))) void* moz_xvalloc(size_t size) + __attribute__ ((malloc, warn_unused_result)); + + + + +} +# 190 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" +__attribute__((always_inline)) inline + +void* operator new(size_t size) throw(std::bad_alloc) +{ + return moz_xmalloc(size); +} + + __attribute__((always_inline)) inline +void* operator new(size_t size, const std::nothrow_t&) throw() +{ + return malloc(size); +} + + __attribute__((always_inline)) inline +void* operator new[](size_t size) throw(std::bad_alloc) +{ + return moz_xmalloc(size); +} + + __attribute__((always_inline)) inline +void* operator new[](size_t size, const std::nothrow_t&) throw() +{ + return malloc(size); +} + + __attribute__((always_inline)) inline +void operator delete(void* ptr) throw() +{ + return free(ptr); +} + + __attribute__((always_inline)) inline +void operator delete(void* ptr, const std::nothrow_t&) throw() +{ + return free(ptr); +} + + __attribute__((always_inline)) inline +void operator delete[](void* ptr) throw() +{ + return free(ptr); +} + + __attribute__((always_inline)) inline +void operator delete[](void* ptr, const std::nothrow_t&) throw() +{ + return free(ptr); +} +# 259 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" +__attribute__((always_inline)) inline +void* operator new(size_t size, const mozilla::fallible_t&) throw() +{ + return malloc(size); +} + +__attribute__((always_inline)) inline +void* operator new[](size_t size, const mozilla::fallible_t&) throw() +{ + return malloc(size); +} + +__attribute__((always_inline)) inline +void operator delete(void* ptr, const mozilla::fallible_t&) throw() +{ + free(ptr); +} + +__attribute__((always_inline)) inline +void operator delete[](void* ptr, const mozilla::fallible_t&) throw() +{ + free(ptr); +} + + + + + + + +class InfallibleAllocPolicy +{ +public: + template + T* maybe_pod_malloc(size_t aNumElems) + { + return pod_malloc(aNumElems); + } + + template + T* maybe_pod_calloc(size_t aNumElems) + { + return pod_calloc(aNumElems); + } + + template + T* maybe_pod_realloc(T* aPtr, size_t aOldSize, size_t aNewSize) + { + return pod_realloc(aPtr, aOldSize, aNewSize); + } + + template + T* pod_malloc(size_t aNumElems) + { + if (aNumElems & mozilla::tl::MulOverflowMask::value) { + reportAllocOverflow(); + } + return static_cast(moz_xmalloc(aNumElems * sizeof(T))); + } + + template + T* pod_calloc(size_t aNumElems) + { + return static_cast(moz_xcalloc(aNumElems, sizeof(T))); + } + + template + T* pod_realloc(T* aPtr, size_t aOldSize, size_t aNewSize) + { + if (aNewSize & mozilla::tl::MulOverflowMask::value) { + reportAllocOverflow(); + } + return static_cast(moz_xrealloc(aPtr, aNewSize * sizeof(T))); + } + + void free_(void* aPtr) + { + free(aPtr); + } + + void reportAllocOverflow() const + { + mozalloc_abort("alloc overflow"); + } + + bool checkSimulatedOOM() const + { + return true; + } +}; +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 2 + + + + + +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCountType.h" 1 +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCountType.h" +typedef uintptr_t MozRefCountType; +# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCountType.h" +typedef uint32_t MozExternalRefCountType; +# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 2 +# 231 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h" 1 +# 127 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h" +enum class nsresult : uint32_t +{ + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" 1 + + + + NS_OK = 0, + + + + + NS_ERROR_BASE = 0xC1F30000, + + NS_ERROR_NOT_INITIALIZED = NS_ERROR_BASE + 1, + + NS_ERROR_ALREADY_INITIALIZED = NS_ERROR_BASE + 2, + + NS_ERROR_NOT_IMPLEMENTED = 0x80004001, + + NS_NOINTERFACE = 0x80004002, + NS_ERROR_NO_INTERFACE = NS_NOINTERFACE, + + NS_ERROR_ABORT = 0x80004004, + + NS_ERROR_FAILURE = 0x80004005, + + NS_ERROR_UNEXPECTED = 0x8000ffff, + + NS_ERROR_OUT_OF_MEMORY = 0x8007000e, + + NS_ERROR_ILLEGAL_VALUE = 0x80070057, + NS_ERROR_INVALID_ARG = NS_ERROR_ILLEGAL_VALUE, + NS_ERROR_INVALID_POINTER = NS_ERROR_INVALID_ARG, + NS_ERROR_NULL_POINTER = NS_ERROR_INVALID_ARG, + + NS_ERROR_NO_AGGREGATION = 0x80040110, + + NS_ERROR_NOT_AVAILABLE = 0x80040111, + + NS_ERROR_FACTORY_NOT_REGISTERED = 0x80040154, + + NS_ERROR_FACTORY_REGISTER_AGAIN = 0x80040155, + + NS_ERROR_FACTORY_NOT_LOADED = 0x800401f8, + + NS_ERROR_FACTORY_NO_SIGNATURE_SUPPORT = NS_ERROR_BASE + 0x101, + + NS_ERROR_FACTORY_EXISTS = NS_ERROR_BASE + 0x100, + + + + + + + + NS_ERROR_CANNOT_CONVERT_DATA = ((uint32_t)(1) << 31) | ((uint32_t)(1 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_OBJECT_IS_IMMUTABLE = ((uint32_t)(1) << 31) | ((uint32_t)(1 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_LOSS_OF_SIGNIFICANT_DATA = ((uint32_t)(1) << 31) | ((uint32_t)(1 + 0x45) << 16) | (uint32_t)(3), + + NS_ERROR_NOT_SAME_THREAD = ((uint32_t)(1) << 31) | ((uint32_t)(1 + 0x45) << 16) | (uint32_t)(4), + + + NS_ERROR_ILLEGAL_DURING_SHUTDOWN = ((uint32_t)(1) << 31) | ((uint32_t)(1 + 0x45) << 16) | (uint32_t)(30), + NS_ERROR_SERVICE_NOT_AVAILABLE = ((uint32_t)(1) << 31) | ((uint32_t)(1 + 0x45) << 16) | (uint32_t)(22), + + NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA = ((uint32_t)(0) << 31) | ((uint32_t)(1 + 0x45) << 16) | (uint32_t)(1), + + NS_SUCCESS_INTERRUPTED_TRAVERSE = ((uint32_t)(0) << 31) | ((uint32_t)(1 + 0x45) << 16) | (uint32_t)(2), + + NS_ERROR_SERVICE_NOT_FOUND = ((uint32_t)(0) << 31) | ((uint32_t)(1 + 0x45) << 16) | (uint32_t)(22), + + NS_ERROR_SERVICE_IN_USE = ((uint32_t)(0) << 31) | ((uint32_t)(1 + 0x45) << 16) | (uint32_t)(23), +# 80 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_BASE_STREAM_CLOSED = ((uint32_t)(1) << 31) | ((uint32_t)(2 + 0x45) << 16) | (uint32_t)(2), + + NS_BASE_STREAM_OSERROR = ((uint32_t)(1) << 31) | ((uint32_t)(2 + 0x45) << 16) | (uint32_t)(3), + + NS_BASE_STREAM_ILLEGAL_ARGS = ((uint32_t)(1) << 31) | ((uint32_t)(2 + 0x45) << 16) | (uint32_t)(4), + + NS_BASE_STREAM_NO_CONVERTER = ((uint32_t)(1) << 31) | ((uint32_t)(2 + 0x45) << 16) | (uint32_t)(5), + + NS_BASE_STREAM_BAD_CONVERSION = ((uint32_t)(1) << 31) | ((uint32_t)(2 + 0x45) << 16) | (uint32_t)(6), + NS_BASE_STREAM_WOULD_BLOCK = ((uint32_t)(1) << 31) | ((uint32_t)(2 + 0x45) << 16) | (uint32_t)(7), +# 98 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_GFX_PRINTER_NO_PRINTER_AVAILABLE = ((uint32_t)(1) << 31) | ((uint32_t)(3 + 0x45) << 16) | (uint32_t)(1), + + NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND = ((uint32_t)(1) << 31) | ((uint32_t)(3 + 0x45) << 16) | (uint32_t)(2), + + NS_ERROR_GFX_PRINTER_COULD_NOT_OPEN_FILE = ((uint32_t)(1) << 31) | ((uint32_t)(3 + 0x45) << 16) | (uint32_t)(3), + + NS_ERROR_GFX_PRINTER_STARTDOC = ((uint32_t)(1) << 31) | ((uint32_t)(3 + 0x45) << 16) | (uint32_t)(4), + + NS_ERROR_GFX_PRINTER_ENDDOC = ((uint32_t)(1) << 31) | ((uint32_t)(3 + 0x45) << 16) | (uint32_t)(5), + + NS_ERROR_GFX_PRINTER_STARTPAGE = ((uint32_t)(1) << 31) | ((uint32_t)(3 + 0x45) << 16) | (uint32_t)(6), + + NS_ERROR_GFX_PRINTER_DOC_IS_BUSY = ((uint32_t)(1) << 31) | ((uint32_t)(3 + 0x45) << 16) | (uint32_t)(7), + + + NS_ERROR_GFX_CMAP_MALFORMED = ((uint32_t)(1) << 31) | ((uint32_t)(3 + 0x45) << 16) | (uint32_t)(51), +# 126 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_SUCCESS_EVENT_CONSUMED = ((uint32_t)(0) << 31) | ((uint32_t)(4 + 0x45) << 16) | (uint32_t)(1), + + + + + NS_SUCCESS_EVENT_HANDLED_ASYNCHRONOUSLY = ((uint32_t)(0) << 31) | ((uint32_t)(4 + 0x45) << 16) | (uint32_t)(2), +# 148 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_BINDING_SUCCEEDED = NS_OK, + + + NS_BINDING_FAILED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(1), + + NS_BINDING_ABORTED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(2), + + + + + + NS_BINDING_REDIRECTED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(3), + + + + + + NS_BINDING_RETARGETED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(4), + + + + + + NS_ERROR_MALFORMED_URI = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(10), + + + + NS_ERROR_IN_PROGRESS = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(15), + + + + + NS_ERROR_NO_CONTENT = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(17), + + NS_ERROR_UNKNOWN_PROTOCOL = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(18), + + + NS_ERROR_INVALID_CONTENT_ENCODING = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(27), + + + + NS_ERROR_CORRUPTED_CONTENT = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(29), + + + + NS_ERROR_INVALID_SIGNATURE = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(58), + + + + NS_ERROR_FIRST_HEADER_FIELD_COMPONENT_EMPTY = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(34), + + + NS_ERROR_ALREADY_OPENED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(73), + + + + + NS_ERROR_ALREADY_CONNECTED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(11), + + NS_ERROR_NOT_CONNECTED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(12), + + + NS_ERROR_CONNECTION_REFUSED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(13), + + NS_ERROR_NET_TIMEOUT = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(14), + + + NS_ERROR_OFFLINE = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(16), + + + + NS_ERROR_PORT_ACCESS_NOT_ALLOWED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(19), + + NS_ERROR_NET_RESET = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(20), + + NS_ERROR_NET_INTERRUPT = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(71), + + NS_ERROR_PROXY_CONNECTION_REFUSED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(72), + + NS_ERROR_NET_PARTIAL_TRANSFER = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(76), + + NS_ERROR_NET_INADEQUATE_SECURITY = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(82), + + + + + + NS_ERROR_NOT_RESUMABLE = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(25), + + NS_ERROR_REDIRECT_LOOP = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(31), + + + NS_ERROR_ENTITY_CHANGED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(32), + + + + NS_ERROR_UNSAFE_CONTENT_TYPE = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(74), + + + NS_ERROR_REMOTE_XUL = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(75), + + NS_ERROR_LOAD_SHOWED_ERRORPAGE = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(77), + + + NS_ERROR_DOCSHELL_DYING = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(78), + + + + + NS_ERROR_FTP_LOGIN = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(21), + NS_ERROR_FTP_CWD = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(22), + NS_ERROR_FTP_PASV = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(23), + NS_ERROR_FTP_PWD = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(24), + NS_ERROR_FTP_LIST = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(28), + + + + + + NS_ERROR_UNKNOWN_HOST = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(30), + + + NS_ERROR_DNS_LOOKUP_QUEUE_FULL = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(33), + + + + NS_ERROR_UNKNOWN_PROXY_HOST = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(42), + + + + + + NS_ERROR_UNKNOWN_SOCKET_TYPE = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(51), + + NS_ERROR_SOCKET_CREATE_FAILED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(52), + + NS_ERROR_SOCKET_ADDRESS_NOT_SUPPORTED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(53), + + NS_ERROR_SOCKET_ADDRESS_IN_USE = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(54), + + + NS_ERROR_CACHE_KEY_NOT_FOUND = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(61), + NS_ERROR_CACHE_DATA_IS_STREAM = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(62), + NS_ERROR_CACHE_DATA_IS_NOT_STREAM = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(63), + NS_ERROR_CACHE_WAIT_FOR_VALIDATION = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(64), + NS_ERROR_CACHE_ENTRY_DOOMED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(65), + NS_ERROR_CACHE_READ_ACCESS_DENIED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(66), + NS_ERROR_CACHE_WRITE_ACCESS_DENIED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(67), + NS_ERROR_CACHE_IN_USE = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(68), + + + NS_ERROR_DOCUMENT_NOT_CACHED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(70), + + + + + + NS_ERROR_INSUFFICIENT_DOMAIN_LEVELS = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(80), + + NS_ERROR_HOST_IS_IP_ADDRESS = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(81), + + + + + + + + NS_SUCCESS_ADOPTED_DATA = ((uint32_t)(0) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(90), + + + NS_NET_STATUS_BEGIN_FTP_TRANSACTION = ((uint32_t)(0) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(27), + NS_NET_STATUS_END_FTP_TRANSACTION = ((uint32_t)(0) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(28), + + + + + NS_SUCCESS_AUTH_FINISHED = ((uint32_t)(0) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(40), + + + + + NS_NET_STATUS_READING = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(8), + NS_NET_STATUS_WRITING = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(9), + + + NS_NET_STATUS_RESOLVING_HOST = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(3), + NS_NET_STATUS_RESOLVED_HOST = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(11), + NS_NET_STATUS_CONNECTING_TO = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(7), + NS_NET_STATUS_CONNECTED_TO = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(4), + NS_NET_STATUS_TLS_HANDSHAKE_STARTING = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(12), + NS_NET_STATUS_TLS_HANDSHAKE_ENDED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(13), + NS_NET_STATUS_SENDING_TO = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(5), + NS_NET_STATUS_WAITING_FOR = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(10), + NS_NET_STATUS_RECEIVING_FROM = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(6), + + + + NS_ERROR_INTERCEPTION_FAILED = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(100), + + + + NS_ERROR_HSTS_PRIMING_TIMEOUT = ((uint32_t)(1) << 31) | ((uint32_t)(6 + 0x45) << 16) | (uint32_t)(110), + + + + + + + + NS_ERROR_PLUGINS_PLUGINSNOTCHANGED = ((uint32_t)(1) << 31) | ((uint32_t)(7 + 0x45) << 16) | (uint32_t)(1000), + NS_ERROR_PLUGIN_DISABLED = ((uint32_t)(1) << 31) | ((uint32_t)(7 + 0x45) << 16) | (uint32_t)(1001), + NS_ERROR_PLUGIN_BLOCKLISTED = ((uint32_t)(1) << 31) | ((uint32_t)(7 + 0x45) << 16) | (uint32_t)(1002), + NS_ERROR_PLUGIN_TIME_RANGE_NOT_SUPPORTED = ((uint32_t)(1) << 31) | ((uint32_t)(7 + 0x45) << 16) | (uint32_t)(1003), + NS_ERROR_PLUGIN_CLICKTOPLAY = ((uint32_t)(1) << 31) | ((uint32_t)(7 + 0x45) << 16) | (uint32_t)(1004), + NS_PLUGIN_INIT_PENDING = ((uint32_t)(0) << 31) | ((uint32_t)(7 + 0x45) << 16) | (uint32_t)(1005), +# 371 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_TABLELAYOUT_CELL_NOT_FOUND = ((uint32_t)(0) << 31) | ((uint32_t)(8 + 0x45) << 16) | (uint32_t)(0), + + NS_POSITION_BEFORE_TABLE = ((uint32_t)(0) << 31) | ((uint32_t)(8 + 0x45) << 16) | (uint32_t)(3), + + + NS_STATE_PROPERTY_EXISTS = NS_OK, + + NS_STATE_PROPERTY_NOT_THERE = ((uint32_t)(0) << 31) | ((uint32_t)(8 + 0x45) << 16) | (uint32_t)(5), + + + + + + + + NS_ERROR_HTMLPARSER_CONTINUE = NS_OK, + + NS_ERROR_HTMLPARSER_EOF = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1000), + NS_ERROR_HTMLPARSER_UNKNOWN = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1001), + NS_ERROR_HTMLPARSER_CANTPROPAGATE = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1002), + NS_ERROR_HTMLPARSER_CONTEXTMISMATCH = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1003), + NS_ERROR_HTMLPARSER_BADFILENAME = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1004), + NS_ERROR_HTMLPARSER_BADURL = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1005), + NS_ERROR_HTMLPARSER_INVALIDPARSERCONTEXT = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1006), + NS_ERROR_HTMLPARSER_INTERRUPTED = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1007), + NS_ERROR_HTMLPARSER_BLOCK = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1008), + NS_ERROR_HTMLPARSER_BADTOKENIZER = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1009), + NS_ERROR_HTMLPARSER_BADATTRIBUTE = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1010), + NS_ERROR_HTMLPARSER_UNRESOLVEDDTD = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1011), + NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1012), + NS_ERROR_HTMLPARSER_BADDTD = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1013), + NS_ERROR_HTMLPARSER_BADCONTEXT = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1014), + NS_ERROR_HTMLPARSER_STOPPARSING = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1015), + NS_ERROR_HTMLPARSER_UNTERMINATEDSTRINGLITERAL = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1016), + NS_ERROR_HTMLPARSER_HIERARCHYTOODEEP = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1017), + NS_ERROR_HTMLPARSER_FAKE_ENDTAG = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1018), + NS_ERROR_HTMLPARSER_INVALID_COMMENT = ((uint32_t)(1) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(1019), + + NS_HTMLTOKENS_NOT_AN_ENTITY = ((uint32_t)(0) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(2000), + NS_HTMLPARSER_VALID_META_CHARSET = ((uint32_t)(0) << 31) | ((uint32_t)(9 + 0x45) << 16) | (uint32_t)(3000), +# 420 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_RDF_ASSERTION_ACCEPTED = NS_OK, + + + NS_RDF_CURSOR_EMPTY = ((uint32_t)(0) << 31) | ((uint32_t)(10 + 0x45) << 16) | (uint32_t)(1), + + + NS_RDF_NO_VALUE = ((uint32_t)(0) << 31) | ((uint32_t)(10 + 0x45) << 16) | (uint32_t)(2), + + + + NS_RDF_ASSERTION_REJECTED = ((uint32_t)(0) << 31) | ((uint32_t)(10 + 0x45) << 16) | (uint32_t)(3), + + NS_RDF_STOP_VISIT = ((uint32_t)(0) << 31) | ((uint32_t)(10 + 0x45) << 16) | (uint32_t)(4), + + + + + + + + NS_ERROR_UCONV_NOCONV = ((uint32_t)(1) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_UDEC_ILLEGALINPUT = ((uint32_t)(1) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(14), + + NS_SUCCESS_USING_FALLBACK_LOCALE = ((uint32_t)(0) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(2), + NS_OK_UDEC_EXACTLENGTH = ((uint32_t)(0) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(11), + NS_OK_UDEC_MOREINPUT = ((uint32_t)(0) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(12), + NS_OK_UDEC_MOREOUTPUT = ((uint32_t)(0) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(13), + NS_OK_UDEC_NOBOMFOUND = ((uint32_t)(0) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(14), + NS_OK_UENC_EXACTLENGTH = ((uint32_t)(0) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(33), + NS_OK_UENC_MOREOUTPUT = ((uint32_t)(0) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(34), + NS_ERROR_UENC_NOMAPPING = ((uint32_t)(0) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(35), + NS_OK_UENC_MOREINPUT = ((uint32_t)(0) << 31) | ((uint32_t)(11 + 0x45) << 16) | (uint32_t)(36), + + + NS_EXACT_LENGTH = NS_OK_UDEC_EXACTLENGTH, + NS_PARTIAL_MORE_INPUT = NS_OK_UDEC_MOREINPUT, + NS_PARTIAL_MORE_OUTPUT = NS_OK_UDEC_MOREOUTPUT, + NS_ERROR_ILLEGAL_INPUT = NS_ERROR_UDEC_ILLEGALINPUT, +# 466 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_FILE_UNRECOGNIZED_PATH = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_FILE_UNRESOLVABLE_SYMLINK = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_FILE_EXECUTION_FAILED = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(3), + NS_ERROR_FILE_UNKNOWN_TYPE = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_FILE_DESTINATION_NOT_DIR = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_FILE_TARGET_DOES_NOT_EXIST = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(6), + NS_ERROR_FILE_COPY_OR_MOVE_FAILED = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(7), + NS_ERROR_FILE_ALREADY_EXISTS = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(8), + NS_ERROR_FILE_INVALID_PATH = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(9), + NS_ERROR_FILE_DISK_FULL = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(10), + NS_ERROR_FILE_CORRUPTED = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(11), + NS_ERROR_FILE_NOT_DIRECTORY = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(12), + NS_ERROR_FILE_IS_DIRECTORY = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(13), + NS_ERROR_FILE_IS_LOCKED = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(14), + NS_ERROR_FILE_TOO_BIG = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(15), + NS_ERROR_FILE_NO_DEVICE_SPACE = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(16), + NS_ERROR_FILE_NAME_TOO_LONG = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(17), + NS_ERROR_FILE_NOT_FOUND = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(18), + NS_ERROR_FILE_READ_ONLY = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(19), + NS_ERROR_FILE_DIR_NOT_EMPTY = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(20), + NS_ERROR_FILE_ACCESS_DENIED = ((uint32_t)(1) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(21), + + NS_SUCCESS_FILE_DIRECTORY_EMPTY = ((uint32_t)(0) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(1), + + NS_SUCCESS_AGGREGATE_RESULT = ((uint32_t)(0) << 31) | ((uint32_t)(13 + 0x45) << 16) | (uint32_t)(2), +# 502 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_DOM_INDEX_SIZE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_DOM_HIERARCHY_REQUEST_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(3), + NS_ERROR_DOM_WRONG_DOCUMENT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_DOM_INVALID_CHARACTER_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(7), + NS_ERROR_DOM_NOT_FOUND_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(8), + NS_ERROR_DOM_NOT_SUPPORTED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(9), + NS_ERROR_DOM_INUSE_ATTRIBUTE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(10), + NS_ERROR_DOM_INVALID_STATE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(11), + NS_ERROR_DOM_SYNTAX_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(12), + NS_ERROR_DOM_INVALID_MODIFICATION_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(13), + NS_ERROR_DOM_NAMESPACE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(14), + NS_ERROR_DOM_INVALID_ACCESS_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(15), + NS_ERROR_DOM_TYPE_MISMATCH_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(17), + NS_ERROR_DOM_SECURITY_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(18), + NS_ERROR_DOM_NETWORK_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(19), + NS_ERROR_DOM_ABORT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(20), + NS_ERROR_DOM_URL_MISMATCH_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(21), + NS_ERROR_DOM_QUOTA_EXCEEDED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(22), + NS_ERROR_DOM_TIMEOUT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(23), + NS_ERROR_DOM_INVALID_NODE_TYPE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(24), + NS_ERROR_DOM_DATA_CLONE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(25), + + NS_ERROR_TYPE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(26), + NS_ERROR_RANGE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(27), + + NS_ERROR_DOM_ENCODING_NOT_SUPPORTED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(28), + NS_ERROR_DOM_INVALID_POINTER_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(29), + + NS_ERROR_DOM_UNKNOWN_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(30), + NS_ERROR_DOM_DATA_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(31), + NS_ERROR_DOM_OPERATION_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(32), + + NS_ERROR_DOM_NOT_ALLOWED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(33), + + NS_ERROR_DOM_SECMAN_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1001), + NS_ERROR_DOM_WRONG_TYPE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1002), + NS_ERROR_DOM_NOT_OBJECT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1003), + NS_ERROR_DOM_NOT_XPC_OBJECT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1004), + NS_ERROR_DOM_NOT_NUMBER_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1005), + NS_ERROR_DOM_NOT_BOOLEAN_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1006), + NS_ERROR_DOM_NOT_FUNCTION_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1007), + NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1008), + NS_ERROR_DOM_BAD_DOCUMENT_DOMAIN = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1009), + NS_ERROR_DOM_PROP_ACCESS_DENIED = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1010), + NS_ERROR_DOM_XPCONNECT_ACCESS_DENIED = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1011), + NS_ERROR_DOM_BAD_URI = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1012), + NS_ERROR_DOM_RETVAL_UNDEFINED = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1013), + NS_ERROR_DOM_QUOTA_REACHED = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1014), + + + NS_ERROR_UNCATCHABLE_EXCEPTION = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1015), + + NS_ERROR_DOM_MALFORMED_URI = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1016), + NS_ERROR_DOM_INVALID_HEADER_NAME = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1017), + + NS_ERROR_DOM_INVALID_STATE_XHR_HAS_INVALID_CONTEXT = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1018), + NS_ERROR_DOM_INVALID_STATE_XHR_MUST_BE_OPENED = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1019), + NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_SENDING = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1020), + NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_LOADING_OR_DONE = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1021), + NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSEXML = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1022), + NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSETEXT = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1023), + NS_ERROR_DOM_INVALID_STATE_XHR_CHUNKED_RESPONSETYPES_UNSUPPORTED_FOR_SYNC = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1024), + NS_ERROR_DOM_INVALID_ACCESS_XHR_TIMEOUT_AND_RESPONSETYPE_UNSUPPORTED_FOR_SYNC = ((uint32_t)(1) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1025), + + + + + + NS_SUCCESS_DOM_NO_OPERATION = ((uint32_t)(0) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(1), + + + + + + + NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW = ((uint32_t)(0) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(2), + + + + + + + NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW_UNCATCHABLE = ((uint32_t)(0) << 31) | ((uint32_t)(14 + 0x45) << 16) | (uint32_t)(3), + + + + + + + + NS_IMAGELIB_SUCCESS_LOAD_FINISHED = ((uint32_t)(0) << 31) | ((uint32_t)(15 + 0x45) << 16) | (uint32_t)(0), + NS_IMAGELIB_CHANGING_OWNER = ((uint32_t)(0) << 31) | ((uint32_t)(15 + 0x45) << 16) | (uint32_t)(1), + + NS_IMAGELIB_ERROR_FAILURE = ((uint32_t)(1) << 31) | ((uint32_t)(15 + 0x45) << 16) | (uint32_t)(5), + NS_IMAGELIB_ERROR_NO_DECODER = ((uint32_t)(1) << 31) | ((uint32_t)(15 + 0x45) << 16) | (uint32_t)(6), + NS_IMAGELIB_ERROR_NOT_FINISHED = ((uint32_t)(1) << 31) | ((uint32_t)(15 + 0x45) << 16) | (uint32_t)(7), + NS_IMAGELIB_ERROR_NO_ENCODER = ((uint32_t)(1) << 31) | ((uint32_t)(15 + 0x45) << 16) | (uint32_t)(9), + + + + + + + + NS_SUCCESS_EDITOR_ELEMENT_NOT_FOUND = ((uint32_t)(0) << 31) | ((uint32_t)(17 + 0x45) << 16) | (uint32_t)(1), + NS_SUCCESS_EDITOR_FOUND_TARGET = ((uint32_t)(0) << 31) | ((uint32_t)(17 + 0x45) << 16) | (uint32_t)(2), + + + + + + + + NS_ERROR_XPC_NOT_ENOUGH_ARGS = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_XPC_NEED_OUT_OBJECT = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_XPC_CANT_SET_OUT_VAL = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(3), + NS_ERROR_XPC_NATIVE_RETURNED_FAILURE = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_XPC_CANT_GET_INTERFACE_INFO = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFO = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(6), + NS_ERROR_XPC_CANT_GET_METHOD_INFO = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(7), + NS_ERROR_XPC_UNEXPECTED = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(8), + NS_ERROR_XPC_BAD_CONVERT_JS = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(9), + NS_ERROR_XPC_BAD_CONVERT_NATIVE = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(10), + NS_ERROR_XPC_BAD_CONVERT_JS_NULL_REF = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(11), + NS_ERROR_XPC_BAD_OP_ON_WN_PROTO = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(12), + NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(13), + NS_ERROR_XPC_CANT_DEFINE_PROP_ON_WN = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(14), + NS_ERROR_XPC_CANT_WATCH_WN_STATIC = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(15), + NS_ERROR_XPC_CANT_EXPORT_WN_STATIC = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(16), + NS_ERROR_XPC_SCRIPTABLE_CALL_FAILED = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(17), + NS_ERROR_XPC_SCRIPTABLE_CTOR_FAILED = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(18), + NS_ERROR_XPC_CANT_CALL_WO_SCRIPTABLE = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(19), + NS_ERROR_XPC_CANT_CTOR_WO_SCRIPTABLE = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(20), + NS_ERROR_XPC_CI_RETURNED_FAILURE = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(21), + NS_ERROR_XPC_GS_RETURNED_FAILURE = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(22), + NS_ERROR_XPC_BAD_CID = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(23), + NS_ERROR_XPC_BAD_IID = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(24), + NS_ERROR_XPC_CANT_CREATE_WN = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(25), + NS_ERROR_XPC_JS_THREW_EXCEPTION = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(26), + NS_ERROR_XPC_JS_THREW_NATIVE_OBJECT = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(27), + NS_ERROR_XPC_JS_THREW_JS_OBJECT = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(28), + NS_ERROR_XPC_JS_THREW_NULL = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(29), + NS_ERROR_XPC_JS_THREW_STRING = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(30), + NS_ERROR_XPC_JS_THREW_NUMBER = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(31), + NS_ERROR_XPC_JAVASCRIPT_ERROR = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(32), + NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(33), + NS_ERROR_XPC_CANT_CONVERT_PRIMITIVE_TO_ARRAY = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(34), + NS_ERROR_XPC_CANT_CONVERT_OBJECT_TO_ARRAY = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(35), + NS_ERROR_XPC_NOT_ENOUGH_ELEMENTS_IN_ARRAY = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(36), + NS_ERROR_XPC_CANT_GET_ARRAY_INFO = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(37), + NS_ERROR_XPC_NOT_ENOUGH_CHARS_IN_STRING = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(38), + NS_ERROR_XPC_SECURITY_MANAGER_VETO = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(39), + NS_ERROR_XPC_INTERFACE_NOT_SCRIPTABLE = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(40), + NS_ERROR_XPC_INTERFACE_NOT_FROM_NSISUPPORTS = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(41), + NS_ERROR_XPC_CANT_GET_JSOBJECT_OF_DOM_OBJECT = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(42), + NS_ERROR_XPC_CANT_SET_READ_ONLY_CONSTANT = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(43), + NS_ERROR_XPC_CANT_SET_READ_ONLY_ATTRIBUTE = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(44), + NS_ERROR_XPC_CANT_SET_READ_ONLY_METHOD = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(45), + NS_ERROR_XPC_CANT_ADD_PROP_TO_WRAPPED_NATIVE = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(46), + NS_ERROR_XPC_CALL_TO_SCRIPTABLE_FAILED = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(47), + NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(48), + NS_ERROR_XPC_BAD_ID_STRING = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(49), + NS_ERROR_XPC_BAD_INITIALIZER_NAME = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(50), + NS_ERROR_XPC_HAS_BEEN_SHUTDOWN = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(51), + NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(52), + NS_ERROR_XPC_BAD_CONVERT_JS_ZERO_ISNOT_NULL = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(53), + NS_ERROR_XPC_CANT_PASS_CPOW_TO_NATIVE = ((uint32_t)(1) << 31) | ((uint32_t)(18 + 0x45) << 16) | (uint32_t)(54), +# 678 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_LAUNCHED_CHILD_PROCESS = ((uint32_t)(1) << 31) | ((uint32_t)(19 + 0x45) << 16) | (uint32_t)(200), +# 687 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_CSP_FORM_ACTION_VIOLATION = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(98), + NS_ERROR_CSP_FRAME_ANCESTOR_VIOLATION = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(99), + + + NS_ERROR_SRI_CORRUPT = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(200), + NS_ERROR_SRI_DISABLED = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(201), + NS_ERROR_SRI_NOT_ELIGIBLE = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(202), + NS_ERROR_SRI_UNEXPECTED_HASH_TYPE = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(203), + NS_ERROR_SRI_IMPORT = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(204), + + + + NS_ERROR_CMS_VERIFY_NOT_SIGNED = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1024), + NS_ERROR_CMS_VERIFY_NO_CONTENT_INFO = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1025), + NS_ERROR_CMS_VERIFY_BAD_DIGEST = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1026), + NS_ERROR_CMS_VERIFY_NOCERT = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1028), + NS_ERROR_CMS_VERIFY_UNTRUSTED = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1029), + NS_ERROR_CMS_VERIFY_ERROR_UNVERIFIED = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1031), + NS_ERROR_CMS_VERIFY_ERROR_PROCESSING = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1032), + NS_ERROR_CMS_VERIFY_BAD_SIGNATURE = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1033), + NS_ERROR_CMS_VERIFY_DIGEST_MISMATCH = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1034), + NS_ERROR_CMS_VERIFY_UNKNOWN_ALGO = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1035), + NS_ERROR_CMS_VERIFY_UNSUPPORTED_ALGO = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1036), + NS_ERROR_CMS_VERIFY_MALFORMED_SIGNATURE = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1037), + NS_ERROR_CMS_VERIFY_HEADER_MISMATCH = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1038), + NS_ERROR_CMS_VERIFY_NOT_YET_ATTEMPTED = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1039), + NS_ERROR_CMS_VERIFY_CERT_WITHOUT_ADDRESS = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1040), + NS_ERROR_CMS_ENCRYPT_NO_BULK_ALG = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1056), + NS_ERROR_CMS_ENCRYPT_INCOMPLETE = ((uint32_t)(1) << 31) | ((uint32_t)(21 + 0x45) << 16) | (uint32_t)(1057), +# 724 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_DOM_INVALID_EXPRESSION_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(22 + 0x45) << 16) | (uint32_t)(51), + NS_ERROR_DOM_TYPE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(22 + 0x45) << 16) | (uint32_t)(52), + + + + + + + + NS_ERROR_WONT_HANDLE_CONTENT = ((uint32_t)(1) << 31) | ((uint32_t)(24 + 0x45) << 16) | (uint32_t)(1), + + + NS_ERROR_MALWARE_URI = ((uint32_t)(1) << 31) | ((uint32_t)(24 + 0x45) << 16) | (uint32_t)(30), + NS_ERROR_PHISHING_URI = ((uint32_t)(1) << 31) | ((uint32_t)(24 + 0x45) << 16) | (uint32_t)(31), + NS_ERROR_TRACKING_URI = ((uint32_t)(1) << 31) | ((uint32_t)(24 + 0x45) << 16) | (uint32_t)(34), + NS_ERROR_UNWANTED_URI = ((uint32_t)(1) << 31) | ((uint32_t)(24 + 0x45) << 16) | (uint32_t)(35), + NS_ERROR_BLOCKED_URI = ((uint32_t)(1) << 31) | ((uint32_t)(24 + 0x45) << 16) | (uint32_t)(37), + + + NS_ERROR_SAVE_LINK_AS_TIMEOUT = ((uint32_t)(1) << 31) | ((uint32_t)(24 + 0x45) << 16) | (uint32_t)(32), + + + NS_ERROR_PARSED_DATA_CACHED = ((uint32_t)(1) << 31) | ((uint32_t)(24 + 0x45) << 16) | (uint32_t)(33), + + + + NS_REFRESHURI_HEADER_FOUND = ((uint32_t)(0) << 31) | ((uint32_t)(24 + 0x45) << 16) | (uint32_t)(2), +# 759 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_IMAGE_SRC_CHANGED = ((uint32_t)(1) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_IMAGE_BLOCKED = ((uint32_t)(1) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(5), + + NS_ERROR_CONTENT_BLOCKED = ((uint32_t)(1) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(6), + NS_ERROR_CONTENT_BLOCKED_SHOW_ALT = ((uint32_t)(1) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(7), + + NS_PROPTABLE_PROP_NOT_THERE = ((uint32_t)(1) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(10), + + NS_ERROR_XBL_BLOCKED = ((uint32_t)(1) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(15), + + NS_ERROR_CONTENT_CRASHED = ((uint32_t)(1) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(16), + + + NS_HTML_STYLE_PROPERTY_NOT_THERE = ((uint32_t)(0) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(2), + NS_CONTENT_BLOCKED = ((uint32_t)(0) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(8), + NS_CONTENT_BLOCKED_SHOW_ALT = ((uint32_t)(0) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(9), + NS_PROPTABLE_PROP_OVERWRITTEN = ((uint32_t)(0) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(11), + + NS_FINDBROADCASTER_NOT_FOUND = ((uint32_t)(0) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(12), + NS_FINDBROADCASTER_FOUND = ((uint32_t)(0) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(13), + NS_FINDBROADCASTER_AWAIT_OVERLAYS = ((uint32_t)(0) << 31) | ((uint32_t)(25 + 0x45) << 16) | (uint32_t)(14), + + + + + + + + NS_ERROR_XPATH_INVALID_ARG = NS_ERROR_INVALID_ARG, + + NS_ERROR_XSLT_PARSE_FAILURE = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_XPATH_PARSE_FAILURE = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_XSLT_ALREADY_SET = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(3), + NS_ERROR_XSLT_EXECUTION_FAILURE = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_XPATH_UNKNOWN_FUNCTION = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_XSLT_BAD_RECURSION = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(6), + NS_ERROR_XSLT_BAD_VALUE = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(7), + NS_ERROR_XSLT_NODESET_EXPECTED = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(8), + NS_ERROR_XSLT_ABORTED = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(9), + NS_ERROR_XSLT_NETWORK_ERROR = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(10), + NS_ERROR_XSLT_WRONG_MIME_TYPE = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(11), + NS_ERROR_XSLT_LOAD_RECURSION = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(12), + NS_ERROR_XPATH_BAD_ARGUMENT_COUNT = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(13), + NS_ERROR_XPATH_BAD_EXTENSION_FUNCTION = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(14), + NS_ERROR_XPATH_PAREN_EXPECTED = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(15), + NS_ERROR_XPATH_INVALID_AXIS = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(16), + NS_ERROR_XPATH_NO_NODE_TYPE_TEST = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(17), + NS_ERROR_XPATH_BRACKET_EXPECTED = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(18), + NS_ERROR_XPATH_INVALID_VAR_NAME = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(19), + NS_ERROR_XPATH_UNEXPECTED_END = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(20), + NS_ERROR_XPATH_OPERATOR_EXPECTED = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(21), + NS_ERROR_XPATH_UNCLOSED_LITERAL = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(22), + NS_ERROR_XPATH_BAD_COLON = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(23), + NS_ERROR_XPATH_BAD_BANG = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(24), + NS_ERROR_XPATH_ILLEGAL_CHAR = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(25), + NS_ERROR_XPATH_BINARY_EXPECTED = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(26), + NS_ERROR_XSLT_LOAD_BLOCKED_ERROR = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(27), + NS_ERROR_XPATH_INVALID_EXPRESSION_EVALUATED = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(28), + NS_ERROR_XPATH_UNBALANCED_CURLY_BRACE = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(29), + NS_ERROR_XSLT_BAD_NODE_NAME = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(30), + NS_ERROR_XSLT_VAR_ALREADY_SET = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(31), + NS_ERROR_XSLT_CALL_TO_KEY_NOT_ALLOWED = ((uint32_t)(1) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(32), + + NS_XSLT_GET_NEW_HANDLER = ((uint32_t)(0) << 31) | ((uint32_t)(27 + 0x45) << 16) | (uint32_t)(1), +# 831 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_TRANSPORT_INIT = ((uint32_t)(1) << 31) | ((uint32_t)(28 + 0x45) << 16) | (uint32_t)(1), + + NS_ERROR_DUPLICATE_HANDLE = ((uint32_t)(1) << 31) | ((uint32_t)(28 + 0x45) << 16) | (uint32_t)(2), + + NS_ERROR_BRIDGE_OPEN_PARENT = ((uint32_t)(1) << 31) | ((uint32_t)(28 + 0x45) << 16) | (uint32_t)(3), + + NS_ERROR_BRIDGE_OPEN_CHILD = ((uint32_t)(1) << 31) | ((uint32_t)(28 + 0x45) << 16) | (uint32_t)(4), + + + + + + + + NS_ERROR_DOM_SVG_WRONG_TYPE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(29 + 0x45) << 16) | (uint32_t)(0), + + NS_ERROR_DOM_SVG_MATRIX_NOT_INVERTABLE = ((uint32_t)(1) << 31) | ((uint32_t)(29 + 0x45) << 16) | (uint32_t)(2), +# 863 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_STORAGE_BUSY = ((uint32_t)(1) << 31) | ((uint32_t)(30 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_STORAGE_IOERR = ((uint32_t)(1) << 31) | ((uint32_t)(30 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_STORAGE_CONSTRAINT = ((uint32_t)(1) << 31) | ((uint32_t)(30 + 0x45) << 16) | (uint32_t)(3), + + + + + + + + NS_ERROR_DOM_FILE_NOT_FOUND_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(32 + 0x45) << 16) | (uint32_t)(0), + NS_ERROR_DOM_FILE_NOT_READABLE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(32 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_DOM_FILE_ABORT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(32 + 0x45) << 16) | (uint32_t)(2), +# 884 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_DOM_INDEXEDDB_NOT_FOUND_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(3), + NS_ERROR_DOM_INDEXEDDB_CONSTRAINT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_DOM_INDEXEDDB_DATA_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_DOM_INDEXEDDB_NOT_ALLOWED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(6), + NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(7), + NS_ERROR_DOM_INDEXEDDB_ABORT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(8), + NS_ERROR_DOM_INDEXEDDB_READ_ONLY_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(9), + NS_ERROR_DOM_INDEXEDDB_TIMEOUT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(10), + NS_ERROR_DOM_INDEXEDDB_QUOTA_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(11), + NS_ERROR_DOM_INDEXEDDB_VERSION_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(12), + NS_ERROR_DOM_INDEXEDDB_RECOVERABLE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(33 + 0x45) << 16) | (uint32_t)(1001), + + + + + + + + NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(34 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(34 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_DOM_FILEHANDLE_INACTIVE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(34 + 0x45) << 16) | (uint32_t)(3), + NS_ERROR_DOM_FILEHANDLE_ABORT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(34 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(34 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_DOM_FILEHANDLE_QUOTA_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(34 + 0x45) << 16) | (uint32_t)(6), + + + + + + + NS_ERROR_SIGNED_JAR_NOT_SIGNED = ((uint32_t)(1) << 31) | ((uint32_t)(35 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_SIGNED_JAR_MODIFIED_ENTRY = ((uint32_t)(1) << 31) | ((uint32_t)(35 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_SIGNED_JAR_UNSIGNED_ENTRY = ((uint32_t)(1) << 31) | ((uint32_t)(35 + 0x45) << 16) | (uint32_t)(3), + NS_ERROR_SIGNED_JAR_ENTRY_MISSING = ((uint32_t)(1) << 31) | ((uint32_t)(35 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_SIGNED_JAR_WRONG_SIGNATURE = ((uint32_t)(1) << 31) | ((uint32_t)(35 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_SIGNED_JAR_ENTRY_TOO_LARGE = ((uint32_t)(1) << 31) | ((uint32_t)(35 + 0x45) << 16) | (uint32_t)(6), + NS_ERROR_SIGNED_JAR_ENTRY_INVALID = ((uint32_t)(1) << 31) | ((uint32_t)(35 + 0x45) << 16) | (uint32_t)(7), + NS_ERROR_SIGNED_JAR_MANIFEST_INVALID = ((uint32_t)(1) << 31) | ((uint32_t)(35 + 0x45) << 16) | (uint32_t)(8), + + + + + + + NS_ERROR_DOM_FILESYSTEM_INVALID_PATH_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(36 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_DOM_FILESYSTEM_INVALID_MODIFICATION_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(36 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_DOM_FILESYSTEM_NO_MODIFICATION_ALLOWED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(36 + 0x45) << 16) | (uint32_t)(3), + NS_ERROR_DOM_FILESYSTEM_PATH_EXISTS_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(36 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_DOM_FILESYSTEM_TYPE_MISMATCH_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(36 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_DOM_FILESYSTEM_UNKNOWN_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(36 + 0x45) << 16) | (uint32_t)(6), + + + + + + + NS_ERROR_SIGNED_APP_MANIFEST_INVALID = ((uint32_t)(1) << 31) | ((uint32_t)(38 + 0x45) << 16) | (uint32_t)(1), + + + + + + + NS_ERROR_DOM_ANIM_MISSING_PROPS_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(39 + 0x45) << 16) | (uint32_t)(1), + + + + + + + NS_ERROR_DOM_PUSH_INVALID_REGISTRATION_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(40 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_DOM_PUSH_DENIED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(40 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_DOM_PUSH_ABORT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(40 + 0x45) << 16) | (uint32_t)(3), + NS_ERROR_DOM_PUSH_SERVICE_UNREACHABLE = ((uint32_t)(1) << 31) | ((uint32_t)(40 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_DOM_PUSH_INVALID_KEY_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(40 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_DOM_PUSH_MISMATCHED_KEY_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(40 + 0x45) << 16) | (uint32_t)(6), + + + + + + + + NS_ERROR_DOM_MEDIA_ABORT_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_DOM_MEDIA_NOT_ALLOWED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(3), + + + NS_ERROR_DOM_MEDIA_DECODE_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_DOM_MEDIA_FATAL_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_DOM_MEDIA_METADATA_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(6), + NS_ERROR_DOM_MEDIA_OVERFLOW_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(7), + NS_ERROR_DOM_MEDIA_END_OF_STREAM = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(8), + NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(9), + NS_ERROR_DOM_MEDIA_CANCELED = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(10), + NS_ERROR_DOM_MEDIA_MEDIASINK_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(11), + NS_ERROR_DOM_MEDIA_DEMUXER_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(12), + NS_ERROR_DOM_MEDIA_CDM_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(13), + NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(14), + NS_ERROR_DOM_MEDIA_INITIALIZING_DECODER = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(15), + + + NS_ERROR_DOM_MEDIA_CUBEB_INITIALIZATION_ERR = ((uint32_t)(1) << 31) | ((uint32_t)(41 + 0x45) << 16) | (uint32_t)(101), + + + + + + + NS_ERROR_UC_UPDATE_UNKNOWN = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(1), + NS_ERROR_UC_UPDATE_DUPLICATE_PREFIX = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_UC_UPDATE_INFINITE_LOOP = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(3), + NS_ERROR_UC_UPDATE_WRONG_REMOVAL_INDICES = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(4), + NS_ERROR_UC_UPDATE_CHECKSUM_MISMATCH = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(5), + NS_ERROR_UC_UPDATE_MISSING_CHECKSUM = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(6), + NS_ERROR_UC_UPDATE_SHUTDOWNING = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(7), + NS_ERROR_UC_UPDATE_TABLE_NOT_FOUND = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(8), + NS_ERROR_UC_UPDATE_BUILD_PREFIX_FAILURE = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(9), + NS_ERROR_UC_UPDATE_FAIL_TO_WRITE_DISK = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(10), + NS_ERROR_UC_UPDATE_PROTOCOL_PARSER_ERROR = ((uint32_t)(1) << 31) | ((uint32_t)(42 + 0x45) << 16) | (uint32_t)(11), + + + + + + + + NS_ERROR_INTERNAL_ERRORRESULT_JS_EXCEPTION = ((uint32_t)(1) << 31) | ((uint32_t)(43 + 0x45) << 16) | (uint32_t)(1), + + NS_ERROR_INTERNAL_ERRORRESULT_DOMEXCEPTION = ((uint32_t)(1) << 31) | ((uint32_t)(43 + 0x45) << 16) | (uint32_t)(2), + + NS_ERROR_INTERNAL_ERRORRESULT_EXCEPTION_ON_JSCONTEXT = ((uint32_t)(1) << 31) | ((uint32_t)(43 + 0x45) << 16) | (uint32_t)(3), + + NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR = ((uint32_t)(1) << 31) | ((uint32_t)(43 + 0x45) << 16) | (uint32_t)(4), + + NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR = ((uint32_t)(1) << 31) | ((uint32_t)(43 + 0x45) << 16) | (uint32_t)(5), +# 1029 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_DOWNLOAD_COMPLETE = ((uint32_t)(1) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(1), + + + + NS_ERROR_DOWNLOAD_NOT_PARTIAL = ((uint32_t)(1) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(2), + NS_ERROR_UNORM_MOREOUTPUT = ((uint32_t)(1) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(33), + + NS_ERROR_DOCSHELL_REQUEST_REJECTED = ((uint32_t)(1) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(1001), + + + + + NS_ERROR_DOCUMENT_IS_PRINTMODE = ((uint32_t)(1) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(2001), + + NS_SUCCESS_DONT_FIXUP = ((uint32_t)(0) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(1), + + + + NS_SUCCESS_RESTART_APP = ((uint32_t)(0) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(1), + NS_SUCCESS_RESTART_APP_NOT_SAME_PROFILE = ((uint32_t)(0) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(3), + NS_SUCCESS_UNORM_NOTFOUND = ((uint32_t)(0) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(17), + + + + + NS_ERROR_NOT_IN_TREE = ((uint32_t)(1) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(38), + + + NS_OK_NO_NAME_CLAUSE_HANDLED = ((uint32_t)(0) << 31) | ((uint32_t)(51 + 0x45) << 16) | (uint32_t)(34) +# 132 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h" 2 + +}; + + + + + +const nsresult + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" 1 + + + + NS_OK = nsresult::NS_OK, + + + + + NS_ERROR_BASE = nsresult::NS_ERROR_BASE, + + NS_ERROR_NOT_INITIALIZED = nsresult::NS_ERROR_NOT_INITIALIZED, + + NS_ERROR_ALREADY_INITIALIZED = nsresult::NS_ERROR_ALREADY_INITIALIZED, + + NS_ERROR_NOT_IMPLEMENTED = nsresult::NS_ERROR_NOT_IMPLEMENTED, + + NS_NOINTERFACE = nsresult::NS_NOINTERFACE, + NS_ERROR_NO_INTERFACE = nsresult::NS_ERROR_NO_INTERFACE, + + NS_ERROR_ABORT = nsresult::NS_ERROR_ABORT, + + NS_ERROR_FAILURE = nsresult::NS_ERROR_FAILURE, + + NS_ERROR_UNEXPECTED = nsresult::NS_ERROR_UNEXPECTED, + + NS_ERROR_OUT_OF_MEMORY = nsresult::NS_ERROR_OUT_OF_MEMORY, + + NS_ERROR_ILLEGAL_VALUE = nsresult::NS_ERROR_ILLEGAL_VALUE, + NS_ERROR_INVALID_ARG = nsresult::NS_ERROR_INVALID_ARG, + NS_ERROR_INVALID_POINTER = nsresult::NS_ERROR_INVALID_POINTER, + NS_ERROR_NULL_POINTER = nsresult::NS_ERROR_NULL_POINTER, + + NS_ERROR_NO_AGGREGATION = nsresult::NS_ERROR_NO_AGGREGATION, + + NS_ERROR_NOT_AVAILABLE = nsresult::NS_ERROR_NOT_AVAILABLE, + + NS_ERROR_FACTORY_NOT_REGISTERED = nsresult::NS_ERROR_FACTORY_NOT_REGISTERED, + + NS_ERROR_FACTORY_REGISTER_AGAIN = nsresult::NS_ERROR_FACTORY_REGISTER_AGAIN, + + NS_ERROR_FACTORY_NOT_LOADED = nsresult::NS_ERROR_FACTORY_NOT_LOADED, + + NS_ERROR_FACTORY_NO_SIGNATURE_SUPPORT = nsresult::NS_ERROR_FACTORY_NO_SIGNATURE_SUPPORT, + + NS_ERROR_FACTORY_EXISTS = nsresult::NS_ERROR_FACTORY_EXISTS, + + + + + + + + NS_ERROR_CANNOT_CONVERT_DATA = nsresult::NS_ERROR_CANNOT_CONVERT_DATA, + NS_ERROR_OBJECT_IS_IMMUTABLE = nsresult::NS_ERROR_OBJECT_IS_IMMUTABLE, + NS_ERROR_LOSS_OF_SIGNIFICANT_DATA = nsresult::NS_ERROR_LOSS_OF_SIGNIFICANT_DATA, + + NS_ERROR_NOT_SAME_THREAD = nsresult::NS_ERROR_NOT_SAME_THREAD, + + + NS_ERROR_ILLEGAL_DURING_SHUTDOWN = nsresult::NS_ERROR_ILLEGAL_DURING_SHUTDOWN, + NS_ERROR_SERVICE_NOT_AVAILABLE = nsresult::NS_ERROR_SERVICE_NOT_AVAILABLE, + + NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA = nsresult::NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA, + + NS_SUCCESS_INTERRUPTED_TRAVERSE = nsresult::NS_SUCCESS_INTERRUPTED_TRAVERSE, + + NS_ERROR_SERVICE_NOT_FOUND = nsresult::NS_ERROR_SERVICE_NOT_FOUND, + + NS_ERROR_SERVICE_IN_USE = nsresult::NS_ERROR_SERVICE_IN_USE, +# 80 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_BASE_STREAM_CLOSED = nsresult::NS_BASE_STREAM_CLOSED, + + NS_BASE_STREAM_OSERROR = nsresult::NS_BASE_STREAM_OSERROR, + + NS_BASE_STREAM_ILLEGAL_ARGS = nsresult::NS_BASE_STREAM_ILLEGAL_ARGS, + + NS_BASE_STREAM_NO_CONVERTER = nsresult::NS_BASE_STREAM_NO_CONVERTER, + + NS_BASE_STREAM_BAD_CONVERSION = nsresult::NS_BASE_STREAM_BAD_CONVERSION, + NS_BASE_STREAM_WOULD_BLOCK = nsresult::NS_BASE_STREAM_WOULD_BLOCK, +# 98 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_GFX_PRINTER_NO_PRINTER_AVAILABLE = nsresult::NS_ERROR_GFX_PRINTER_NO_PRINTER_AVAILABLE, + + NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND = nsresult::NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND, + + NS_ERROR_GFX_PRINTER_COULD_NOT_OPEN_FILE = nsresult::NS_ERROR_GFX_PRINTER_COULD_NOT_OPEN_FILE, + + NS_ERROR_GFX_PRINTER_STARTDOC = nsresult::NS_ERROR_GFX_PRINTER_STARTDOC, + + NS_ERROR_GFX_PRINTER_ENDDOC = nsresult::NS_ERROR_GFX_PRINTER_ENDDOC, + + NS_ERROR_GFX_PRINTER_STARTPAGE = nsresult::NS_ERROR_GFX_PRINTER_STARTPAGE, + + NS_ERROR_GFX_PRINTER_DOC_IS_BUSY = nsresult::NS_ERROR_GFX_PRINTER_DOC_IS_BUSY, + + + NS_ERROR_GFX_CMAP_MALFORMED = nsresult::NS_ERROR_GFX_CMAP_MALFORMED, +# 126 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_SUCCESS_EVENT_CONSUMED = nsresult::NS_SUCCESS_EVENT_CONSUMED, + + + + + NS_SUCCESS_EVENT_HANDLED_ASYNCHRONOUSLY = nsresult::NS_SUCCESS_EVENT_HANDLED_ASYNCHRONOUSLY, +# 148 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_BINDING_SUCCEEDED = nsresult::NS_BINDING_SUCCEEDED, + + + NS_BINDING_FAILED = nsresult::NS_BINDING_FAILED, + + NS_BINDING_ABORTED = nsresult::NS_BINDING_ABORTED, + + + + + + NS_BINDING_REDIRECTED = nsresult::NS_BINDING_REDIRECTED, + + + + + + NS_BINDING_RETARGETED = nsresult::NS_BINDING_RETARGETED, + + + + + + NS_ERROR_MALFORMED_URI = nsresult::NS_ERROR_MALFORMED_URI, + + + + NS_ERROR_IN_PROGRESS = nsresult::NS_ERROR_IN_PROGRESS, + + + + + NS_ERROR_NO_CONTENT = nsresult::NS_ERROR_NO_CONTENT, + + NS_ERROR_UNKNOWN_PROTOCOL = nsresult::NS_ERROR_UNKNOWN_PROTOCOL, + + + NS_ERROR_INVALID_CONTENT_ENCODING = nsresult::NS_ERROR_INVALID_CONTENT_ENCODING, + + + + NS_ERROR_CORRUPTED_CONTENT = nsresult::NS_ERROR_CORRUPTED_CONTENT, + + + + NS_ERROR_INVALID_SIGNATURE = nsresult::NS_ERROR_INVALID_SIGNATURE, + + + + NS_ERROR_FIRST_HEADER_FIELD_COMPONENT_EMPTY = nsresult::NS_ERROR_FIRST_HEADER_FIELD_COMPONENT_EMPTY, + + + NS_ERROR_ALREADY_OPENED = nsresult::NS_ERROR_ALREADY_OPENED, + + + + + NS_ERROR_ALREADY_CONNECTED = nsresult::NS_ERROR_ALREADY_CONNECTED, + + NS_ERROR_NOT_CONNECTED = nsresult::NS_ERROR_NOT_CONNECTED, + + + NS_ERROR_CONNECTION_REFUSED = nsresult::NS_ERROR_CONNECTION_REFUSED, + + NS_ERROR_NET_TIMEOUT = nsresult::NS_ERROR_NET_TIMEOUT, + + + NS_ERROR_OFFLINE = nsresult::NS_ERROR_OFFLINE, + + + + NS_ERROR_PORT_ACCESS_NOT_ALLOWED = nsresult::NS_ERROR_PORT_ACCESS_NOT_ALLOWED, + + NS_ERROR_NET_RESET = nsresult::NS_ERROR_NET_RESET, + + NS_ERROR_NET_INTERRUPT = nsresult::NS_ERROR_NET_INTERRUPT, + + NS_ERROR_PROXY_CONNECTION_REFUSED = nsresult::NS_ERROR_PROXY_CONNECTION_REFUSED, + + NS_ERROR_NET_PARTIAL_TRANSFER = nsresult::NS_ERROR_NET_PARTIAL_TRANSFER, + + NS_ERROR_NET_INADEQUATE_SECURITY = nsresult::NS_ERROR_NET_INADEQUATE_SECURITY, + + + + + + NS_ERROR_NOT_RESUMABLE = nsresult::NS_ERROR_NOT_RESUMABLE, + + NS_ERROR_REDIRECT_LOOP = nsresult::NS_ERROR_REDIRECT_LOOP, + + + NS_ERROR_ENTITY_CHANGED = nsresult::NS_ERROR_ENTITY_CHANGED, + + + + NS_ERROR_UNSAFE_CONTENT_TYPE = nsresult::NS_ERROR_UNSAFE_CONTENT_TYPE, + + + NS_ERROR_REMOTE_XUL = nsresult::NS_ERROR_REMOTE_XUL, + + NS_ERROR_LOAD_SHOWED_ERRORPAGE = nsresult::NS_ERROR_LOAD_SHOWED_ERRORPAGE, + + + NS_ERROR_DOCSHELL_DYING = nsresult::NS_ERROR_DOCSHELL_DYING, + + + + + NS_ERROR_FTP_LOGIN = nsresult::NS_ERROR_FTP_LOGIN, + NS_ERROR_FTP_CWD = nsresult::NS_ERROR_FTP_CWD, + NS_ERROR_FTP_PASV = nsresult::NS_ERROR_FTP_PASV, + NS_ERROR_FTP_PWD = nsresult::NS_ERROR_FTP_PWD, + NS_ERROR_FTP_LIST = nsresult::NS_ERROR_FTP_LIST, + + + + + + NS_ERROR_UNKNOWN_HOST = nsresult::NS_ERROR_UNKNOWN_HOST, + + + NS_ERROR_DNS_LOOKUP_QUEUE_FULL = nsresult::NS_ERROR_DNS_LOOKUP_QUEUE_FULL, + + + + NS_ERROR_UNKNOWN_PROXY_HOST = nsresult::NS_ERROR_UNKNOWN_PROXY_HOST, + + + + + + NS_ERROR_UNKNOWN_SOCKET_TYPE = nsresult::NS_ERROR_UNKNOWN_SOCKET_TYPE, + + NS_ERROR_SOCKET_CREATE_FAILED = nsresult::NS_ERROR_SOCKET_CREATE_FAILED, + + NS_ERROR_SOCKET_ADDRESS_NOT_SUPPORTED = nsresult::NS_ERROR_SOCKET_ADDRESS_NOT_SUPPORTED, + + NS_ERROR_SOCKET_ADDRESS_IN_USE = nsresult::NS_ERROR_SOCKET_ADDRESS_IN_USE, + + + NS_ERROR_CACHE_KEY_NOT_FOUND = nsresult::NS_ERROR_CACHE_KEY_NOT_FOUND, + NS_ERROR_CACHE_DATA_IS_STREAM = nsresult::NS_ERROR_CACHE_DATA_IS_STREAM, + NS_ERROR_CACHE_DATA_IS_NOT_STREAM = nsresult::NS_ERROR_CACHE_DATA_IS_NOT_STREAM, + NS_ERROR_CACHE_WAIT_FOR_VALIDATION = nsresult::NS_ERROR_CACHE_WAIT_FOR_VALIDATION, + NS_ERROR_CACHE_ENTRY_DOOMED = nsresult::NS_ERROR_CACHE_ENTRY_DOOMED, + NS_ERROR_CACHE_READ_ACCESS_DENIED = nsresult::NS_ERROR_CACHE_READ_ACCESS_DENIED, + NS_ERROR_CACHE_WRITE_ACCESS_DENIED = nsresult::NS_ERROR_CACHE_WRITE_ACCESS_DENIED, + NS_ERROR_CACHE_IN_USE = nsresult::NS_ERROR_CACHE_IN_USE, + + + NS_ERROR_DOCUMENT_NOT_CACHED = nsresult::NS_ERROR_DOCUMENT_NOT_CACHED, + + + + + + NS_ERROR_INSUFFICIENT_DOMAIN_LEVELS = nsresult::NS_ERROR_INSUFFICIENT_DOMAIN_LEVELS, + + NS_ERROR_HOST_IS_IP_ADDRESS = nsresult::NS_ERROR_HOST_IS_IP_ADDRESS, + + + + + + + + NS_SUCCESS_ADOPTED_DATA = nsresult::NS_SUCCESS_ADOPTED_DATA, + + + NS_NET_STATUS_BEGIN_FTP_TRANSACTION = nsresult::NS_NET_STATUS_BEGIN_FTP_TRANSACTION, + NS_NET_STATUS_END_FTP_TRANSACTION = nsresult::NS_NET_STATUS_END_FTP_TRANSACTION, + + + + + NS_SUCCESS_AUTH_FINISHED = nsresult::NS_SUCCESS_AUTH_FINISHED, + + + + + NS_NET_STATUS_READING = nsresult::NS_NET_STATUS_READING, + NS_NET_STATUS_WRITING = nsresult::NS_NET_STATUS_WRITING, + + + NS_NET_STATUS_RESOLVING_HOST = nsresult::NS_NET_STATUS_RESOLVING_HOST, + NS_NET_STATUS_RESOLVED_HOST = nsresult::NS_NET_STATUS_RESOLVED_HOST, + NS_NET_STATUS_CONNECTING_TO = nsresult::NS_NET_STATUS_CONNECTING_TO, + NS_NET_STATUS_CONNECTED_TO = nsresult::NS_NET_STATUS_CONNECTED_TO, + NS_NET_STATUS_TLS_HANDSHAKE_STARTING = nsresult::NS_NET_STATUS_TLS_HANDSHAKE_STARTING, + NS_NET_STATUS_TLS_HANDSHAKE_ENDED = nsresult::NS_NET_STATUS_TLS_HANDSHAKE_ENDED, + NS_NET_STATUS_SENDING_TO = nsresult::NS_NET_STATUS_SENDING_TO, + NS_NET_STATUS_WAITING_FOR = nsresult::NS_NET_STATUS_WAITING_FOR, + NS_NET_STATUS_RECEIVING_FROM = nsresult::NS_NET_STATUS_RECEIVING_FROM, + + + + NS_ERROR_INTERCEPTION_FAILED = nsresult::NS_ERROR_INTERCEPTION_FAILED, + + + + NS_ERROR_HSTS_PRIMING_TIMEOUT = nsresult::NS_ERROR_HSTS_PRIMING_TIMEOUT, + + + + + + + + NS_ERROR_PLUGINS_PLUGINSNOTCHANGED = nsresult::NS_ERROR_PLUGINS_PLUGINSNOTCHANGED, + NS_ERROR_PLUGIN_DISABLED = nsresult::NS_ERROR_PLUGIN_DISABLED, + NS_ERROR_PLUGIN_BLOCKLISTED = nsresult::NS_ERROR_PLUGIN_BLOCKLISTED, + NS_ERROR_PLUGIN_TIME_RANGE_NOT_SUPPORTED = nsresult::NS_ERROR_PLUGIN_TIME_RANGE_NOT_SUPPORTED, + NS_ERROR_PLUGIN_CLICKTOPLAY = nsresult::NS_ERROR_PLUGIN_CLICKTOPLAY, + NS_PLUGIN_INIT_PENDING = nsresult::NS_PLUGIN_INIT_PENDING, +# 371 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_TABLELAYOUT_CELL_NOT_FOUND = nsresult::NS_TABLELAYOUT_CELL_NOT_FOUND, + + NS_POSITION_BEFORE_TABLE = nsresult::NS_POSITION_BEFORE_TABLE, + + + NS_STATE_PROPERTY_EXISTS = nsresult::NS_STATE_PROPERTY_EXISTS, + + NS_STATE_PROPERTY_NOT_THERE = nsresult::NS_STATE_PROPERTY_NOT_THERE, + + + + + + + + NS_ERROR_HTMLPARSER_CONTINUE = nsresult::NS_ERROR_HTMLPARSER_CONTINUE, + + NS_ERROR_HTMLPARSER_EOF = nsresult::NS_ERROR_HTMLPARSER_EOF, + NS_ERROR_HTMLPARSER_UNKNOWN = nsresult::NS_ERROR_HTMLPARSER_UNKNOWN, + NS_ERROR_HTMLPARSER_CANTPROPAGATE = nsresult::NS_ERROR_HTMLPARSER_CANTPROPAGATE, + NS_ERROR_HTMLPARSER_CONTEXTMISMATCH = nsresult::NS_ERROR_HTMLPARSER_CONTEXTMISMATCH, + NS_ERROR_HTMLPARSER_BADFILENAME = nsresult::NS_ERROR_HTMLPARSER_BADFILENAME, + NS_ERROR_HTMLPARSER_BADURL = nsresult::NS_ERROR_HTMLPARSER_BADURL, + NS_ERROR_HTMLPARSER_INVALIDPARSERCONTEXT = nsresult::NS_ERROR_HTMLPARSER_INVALIDPARSERCONTEXT, + NS_ERROR_HTMLPARSER_INTERRUPTED = nsresult::NS_ERROR_HTMLPARSER_INTERRUPTED, + NS_ERROR_HTMLPARSER_BLOCK = nsresult::NS_ERROR_HTMLPARSER_BLOCK, + NS_ERROR_HTMLPARSER_BADTOKENIZER = nsresult::NS_ERROR_HTMLPARSER_BADTOKENIZER, + NS_ERROR_HTMLPARSER_BADATTRIBUTE = nsresult::NS_ERROR_HTMLPARSER_BADATTRIBUTE, + NS_ERROR_HTMLPARSER_UNRESOLVEDDTD = nsresult::NS_ERROR_HTMLPARSER_UNRESOLVEDDTD, + NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT = nsresult::NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT, + NS_ERROR_HTMLPARSER_BADDTD = nsresult::NS_ERROR_HTMLPARSER_BADDTD, + NS_ERROR_HTMLPARSER_BADCONTEXT = nsresult::NS_ERROR_HTMLPARSER_BADCONTEXT, + NS_ERROR_HTMLPARSER_STOPPARSING = nsresult::NS_ERROR_HTMLPARSER_STOPPARSING, + NS_ERROR_HTMLPARSER_UNTERMINATEDSTRINGLITERAL = nsresult::NS_ERROR_HTMLPARSER_UNTERMINATEDSTRINGLITERAL, + NS_ERROR_HTMLPARSER_HIERARCHYTOODEEP = nsresult::NS_ERROR_HTMLPARSER_HIERARCHYTOODEEP, + NS_ERROR_HTMLPARSER_FAKE_ENDTAG = nsresult::NS_ERROR_HTMLPARSER_FAKE_ENDTAG, + NS_ERROR_HTMLPARSER_INVALID_COMMENT = nsresult::NS_ERROR_HTMLPARSER_INVALID_COMMENT, + + NS_HTMLTOKENS_NOT_AN_ENTITY = nsresult::NS_HTMLTOKENS_NOT_AN_ENTITY, + NS_HTMLPARSER_VALID_META_CHARSET = nsresult::NS_HTMLPARSER_VALID_META_CHARSET, +# 420 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_RDF_ASSERTION_ACCEPTED = nsresult::NS_RDF_ASSERTION_ACCEPTED, + + + NS_RDF_CURSOR_EMPTY = nsresult::NS_RDF_CURSOR_EMPTY, + + + NS_RDF_NO_VALUE = nsresult::NS_RDF_NO_VALUE, + + + + NS_RDF_ASSERTION_REJECTED = nsresult::NS_RDF_ASSERTION_REJECTED, + + NS_RDF_STOP_VISIT = nsresult::NS_RDF_STOP_VISIT, + + + + + + + + NS_ERROR_UCONV_NOCONV = nsresult::NS_ERROR_UCONV_NOCONV, + NS_ERROR_UDEC_ILLEGALINPUT = nsresult::NS_ERROR_UDEC_ILLEGALINPUT, + + NS_SUCCESS_USING_FALLBACK_LOCALE = nsresult::NS_SUCCESS_USING_FALLBACK_LOCALE, + NS_OK_UDEC_EXACTLENGTH = nsresult::NS_OK_UDEC_EXACTLENGTH, + NS_OK_UDEC_MOREINPUT = nsresult::NS_OK_UDEC_MOREINPUT, + NS_OK_UDEC_MOREOUTPUT = nsresult::NS_OK_UDEC_MOREOUTPUT, + NS_OK_UDEC_NOBOMFOUND = nsresult::NS_OK_UDEC_NOBOMFOUND, + NS_OK_UENC_EXACTLENGTH = nsresult::NS_OK_UENC_EXACTLENGTH, + NS_OK_UENC_MOREOUTPUT = nsresult::NS_OK_UENC_MOREOUTPUT, + NS_ERROR_UENC_NOMAPPING = nsresult::NS_ERROR_UENC_NOMAPPING, + NS_OK_UENC_MOREINPUT = nsresult::NS_OK_UENC_MOREINPUT, + + + NS_EXACT_LENGTH = nsresult::NS_EXACT_LENGTH, + NS_PARTIAL_MORE_INPUT = nsresult::NS_PARTIAL_MORE_INPUT, + NS_PARTIAL_MORE_OUTPUT = nsresult::NS_PARTIAL_MORE_OUTPUT, + NS_ERROR_ILLEGAL_INPUT = nsresult::NS_ERROR_ILLEGAL_INPUT, +# 466 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_FILE_UNRECOGNIZED_PATH = nsresult::NS_ERROR_FILE_UNRECOGNIZED_PATH, + NS_ERROR_FILE_UNRESOLVABLE_SYMLINK = nsresult::NS_ERROR_FILE_UNRESOLVABLE_SYMLINK, + NS_ERROR_FILE_EXECUTION_FAILED = nsresult::NS_ERROR_FILE_EXECUTION_FAILED, + NS_ERROR_FILE_UNKNOWN_TYPE = nsresult::NS_ERROR_FILE_UNKNOWN_TYPE, + NS_ERROR_FILE_DESTINATION_NOT_DIR = nsresult::NS_ERROR_FILE_DESTINATION_NOT_DIR, + NS_ERROR_FILE_TARGET_DOES_NOT_EXIST = nsresult::NS_ERROR_FILE_TARGET_DOES_NOT_EXIST, + NS_ERROR_FILE_COPY_OR_MOVE_FAILED = nsresult::NS_ERROR_FILE_COPY_OR_MOVE_FAILED, + NS_ERROR_FILE_ALREADY_EXISTS = nsresult::NS_ERROR_FILE_ALREADY_EXISTS, + NS_ERROR_FILE_INVALID_PATH = nsresult::NS_ERROR_FILE_INVALID_PATH, + NS_ERROR_FILE_DISK_FULL = nsresult::NS_ERROR_FILE_DISK_FULL, + NS_ERROR_FILE_CORRUPTED = nsresult::NS_ERROR_FILE_CORRUPTED, + NS_ERROR_FILE_NOT_DIRECTORY = nsresult::NS_ERROR_FILE_NOT_DIRECTORY, + NS_ERROR_FILE_IS_DIRECTORY = nsresult::NS_ERROR_FILE_IS_DIRECTORY, + NS_ERROR_FILE_IS_LOCKED = nsresult::NS_ERROR_FILE_IS_LOCKED, + NS_ERROR_FILE_TOO_BIG = nsresult::NS_ERROR_FILE_TOO_BIG, + NS_ERROR_FILE_NO_DEVICE_SPACE = nsresult::NS_ERROR_FILE_NO_DEVICE_SPACE, + NS_ERROR_FILE_NAME_TOO_LONG = nsresult::NS_ERROR_FILE_NAME_TOO_LONG, + NS_ERROR_FILE_NOT_FOUND = nsresult::NS_ERROR_FILE_NOT_FOUND, + NS_ERROR_FILE_READ_ONLY = nsresult::NS_ERROR_FILE_READ_ONLY, + NS_ERROR_FILE_DIR_NOT_EMPTY = nsresult::NS_ERROR_FILE_DIR_NOT_EMPTY, + NS_ERROR_FILE_ACCESS_DENIED = nsresult::NS_ERROR_FILE_ACCESS_DENIED, + + NS_SUCCESS_FILE_DIRECTORY_EMPTY = nsresult::NS_SUCCESS_FILE_DIRECTORY_EMPTY, + + NS_SUCCESS_AGGREGATE_RESULT = nsresult::NS_SUCCESS_AGGREGATE_RESULT, +# 502 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_DOM_INDEX_SIZE_ERR = nsresult::NS_ERROR_DOM_INDEX_SIZE_ERR, + NS_ERROR_DOM_HIERARCHY_REQUEST_ERR = nsresult::NS_ERROR_DOM_HIERARCHY_REQUEST_ERR, + NS_ERROR_DOM_WRONG_DOCUMENT_ERR = nsresult::NS_ERROR_DOM_WRONG_DOCUMENT_ERR, + NS_ERROR_DOM_INVALID_CHARACTER_ERR = nsresult::NS_ERROR_DOM_INVALID_CHARACTER_ERR, + NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR = nsresult::NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR, + NS_ERROR_DOM_NOT_FOUND_ERR = nsresult::NS_ERROR_DOM_NOT_FOUND_ERR, + NS_ERROR_DOM_NOT_SUPPORTED_ERR = nsresult::NS_ERROR_DOM_NOT_SUPPORTED_ERR, + NS_ERROR_DOM_INUSE_ATTRIBUTE_ERR = nsresult::NS_ERROR_DOM_INUSE_ATTRIBUTE_ERR, + NS_ERROR_DOM_INVALID_STATE_ERR = nsresult::NS_ERROR_DOM_INVALID_STATE_ERR, + NS_ERROR_DOM_SYNTAX_ERR = nsresult::NS_ERROR_DOM_SYNTAX_ERR, + NS_ERROR_DOM_INVALID_MODIFICATION_ERR = nsresult::NS_ERROR_DOM_INVALID_MODIFICATION_ERR, + NS_ERROR_DOM_NAMESPACE_ERR = nsresult::NS_ERROR_DOM_NAMESPACE_ERR, + NS_ERROR_DOM_INVALID_ACCESS_ERR = nsresult::NS_ERROR_DOM_INVALID_ACCESS_ERR, + NS_ERROR_DOM_TYPE_MISMATCH_ERR = nsresult::NS_ERROR_DOM_TYPE_MISMATCH_ERR, + NS_ERROR_DOM_SECURITY_ERR = nsresult::NS_ERROR_DOM_SECURITY_ERR, + NS_ERROR_DOM_NETWORK_ERR = nsresult::NS_ERROR_DOM_NETWORK_ERR, + NS_ERROR_DOM_ABORT_ERR = nsresult::NS_ERROR_DOM_ABORT_ERR, + NS_ERROR_DOM_URL_MISMATCH_ERR = nsresult::NS_ERROR_DOM_URL_MISMATCH_ERR, + NS_ERROR_DOM_QUOTA_EXCEEDED_ERR = nsresult::NS_ERROR_DOM_QUOTA_EXCEEDED_ERR, + NS_ERROR_DOM_TIMEOUT_ERR = nsresult::NS_ERROR_DOM_TIMEOUT_ERR, + NS_ERROR_DOM_INVALID_NODE_TYPE_ERR = nsresult::NS_ERROR_DOM_INVALID_NODE_TYPE_ERR, + NS_ERROR_DOM_DATA_CLONE_ERR = nsresult::NS_ERROR_DOM_DATA_CLONE_ERR, + + NS_ERROR_TYPE_ERR = nsresult::NS_ERROR_TYPE_ERR, + NS_ERROR_RANGE_ERR = nsresult::NS_ERROR_RANGE_ERR, + + NS_ERROR_DOM_ENCODING_NOT_SUPPORTED_ERR = nsresult::NS_ERROR_DOM_ENCODING_NOT_SUPPORTED_ERR, + NS_ERROR_DOM_INVALID_POINTER_ERR = nsresult::NS_ERROR_DOM_INVALID_POINTER_ERR, + + NS_ERROR_DOM_UNKNOWN_ERR = nsresult::NS_ERROR_DOM_UNKNOWN_ERR, + NS_ERROR_DOM_DATA_ERR = nsresult::NS_ERROR_DOM_DATA_ERR, + NS_ERROR_DOM_OPERATION_ERR = nsresult::NS_ERROR_DOM_OPERATION_ERR, + + NS_ERROR_DOM_NOT_ALLOWED_ERR = nsresult::NS_ERROR_DOM_NOT_ALLOWED_ERR, + + NS_ERROR_DOM_SECMAN_ERR = nsresult::NS_ERROR_DOM_SECMAN_ERR, + NS_ERROR_DOM_WRONG_TYPE_ERR = nsresult::NS_ERROR_DOM_WRONG_TYPE_ERR, + NS_ERROR_DOM_NOT_OBJECT_ERR = nsresult::NS_ERROR_DOM_NOT_OBJECT_ERR, + NS_ERROR_DOM_NOT_XPC_OBJECT_ERR = nsresult::NS_ERROR_DOM_NOT_XPC_OBJECT_ERR, + NS_ERROR_DOM_NOT_NUMBER_ERR = nsresult::NS_ERROR_DOM_NOT_NUMBER_ERR, + NS_ERROR_DOM_NOT_BOOLEAN_ERR = nsresult::NS_ERROR_DOM_NOT_BOOLEAN_ERR, + NS_ERROR_DOM_NOT_FUNCTION_ERR = nsresult::NS_ERROR_DOM_NOT_FUNCTION_ERR, + NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR = nsresult::NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR, + NS_ERROR_DOM_BAD_DOCUMENT_DOMAIN = nsresult::NS_ERROR_DOM_BAD_DOCUMENT_DOMAIN, + NS_ERROR_DOM_PROP_ACCESS_DENIED = nsresult::NS_ERROR_DOM_PROP_ACCESS_DENIED, + NS_ERROR_DOM_XPCONNECT_ACCESS_DENIED = nsresult::NS_ERROR_DOM_XPCONNECT_ACCESS_DENIED, + NS_ERROR_DOM_BAD_URI = nsresult::NS_ERROR_DOM_BAD_URI, + NS_ERROR_DOM_RETVAL_UNDEFINED = nsresult::NS_ERROR_DOM_RETVAL_UNDEFINED, + NS_ERROR_DOM_QUOTA_REACHED = nsresult::NS_ERROR_DOM_QUOTA_REACHED, + + + NS_ERROR_UNCATCHABLE_EXCEPTION = nsresult::NS_ERROR_UNCATCHABLE_EXCEPTION, + + NS_ERROR_DOM_MALFORMED_URI = nsresult::NS_ERROR_DOM_MALFORMED_URI, + NS_ERROR_DOM_INVALID_HEADER_NAME = nsresult::NS_ERROR_DOM_INVALID_HEADER_NAME, + + NS_ERROR_DOM_INVALID_STATE_XHR_HAS_INVALID_CONTEXT = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_HAS_INVALID_CONTEXT, + NS_ERROR_DOM_INVALID_STATE_XHR_MUST_BE_OPENED = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_MUST_BE_OPENED, + NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_SENDING = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_SENDING, + NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_LOADING_OR_DONE = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_LOADING_OR_DONE, + NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSEXML = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSEXML, + NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSETEXT = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSETEXT, + NS_ERROR_DOM_INVALID_STATE_XHR_CHUNKED_RESPONSETYPES_UNSUPPORTED_FOR_SYNC = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_CHUNKED_RESPONSETYPES_UNSUPPORTED_FOR_SYNC, + NS_ERROR_DOM_INVALID_ACCESS_XHR_TIMEOUT_AND_RESPONSETYPE_UNSUPPORTED_FOR_SYNC = nsresult::NS_ERROR_DOM_INVALID_ACCESS_XHR_TIMEOUT_AND_RESPONSETYPE_UNSUPPORTED_FOR_SYNC, + + + + + + NS_SUCCESS_DOM_NO_OPERATION = nsresult::NS_SUCCESS_DOM_NO_OPERATION, + + + + + + + NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW = nsresult::NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW, + + + + + + + NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW_UNCATCHABLE = nsresult::NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW_UNCATCHABLE, + + + + + + + + NS_IMAGELIB_SUCCESS_LOAD_FINISHED = nsresult::NS_IMAGELIB_SUCCESS_LOAD_FINISHED, + NS_IMAGELIB_CHANGING_OWNER = nsresult::NS_IMAGELIB_CHANGING_OWNER, + + NS_IMAGELIB_ERROR_FAILURE = nsresult::NS_IMAGELIB_ERROR_FAILURE, + NS_IMAGELIB_ERROR_NO_DECODER = nsresult::NS_IMAGELIB_ERROR_NO_DECODER, + NS_IMAGELIB_ERROR_NOT_FINISHED = nsresult::NS_IMAGELIB_ERROR_NOT_FINISHED, + NS_IMAGELIB_ERROR_NO_ENCODER = nsresult::NS_IMAGELIB_ERROR_NO_ENCODER, + + + + + + + + NS_SUCCESS_EDITOR_ELEMENT_NOT_FOUND = nsresult::NS_SUCCESS_EDITOR_ELEMENT_NOT_FOUND, + NS_SUCCESS_EDITOR_FOUND_TARGET = nsresult::NS_SUCCESS_EDITOR_FOUND_TARGET, + + + + + + + + NS_ERROR_XPC_NOT_ENOUGH_ARGS = nsresult::NS_ERROR_XPC_NOT_ENOUGH_ARGS, + NS_ERROR_XPC_NEED_OUT_OBJECT = nsresult::NS_ERROR_XPC_NEED_OUT_OBJECT, + NS_ERROR_XPC_CANT_SET_OUT_VAL = nsresult::NS_ERROR_XPC_CANT_SET_OUT_VAL, + NS_ERROR_XPC_NATIVE_RETURNED_FAILURE = nsresult::NS_ERROR_XPC_NATIVE_RETURNED_FAILURE, + NS_ERROR_XPC_CANT_GET_INTERFACE_INFO = nsresult::NS_ERROR_XPC_CANT_GET_INTERFACE_INFO, + NS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFO = nsresult::NS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFO, + NS_ERROR_XPC_CANT_GET_METHOD_INFO = nsresult::NS_ERROR_XPC_CANT_GET_METHOD_INFO, + NS_ERROR_XPC_UNEXPECTED = nsresult::NS_ERROR_XPC_UNEXPECTED, + NS_ERROR_XPC_BAD_CONVERT_JS = nsresult::NS_ERROR_XPC_BAD_CONVERT_JS, + NS_ERROR_XPC_BAD_CONVERT_NATIVE = nsresult::NS_ERROR_XPC_BAD_CONVERT_NATIVE, + NS_ERROR_XPC_BAD_CONVERT_JS_NULL_REF = nsresult::NS_ERROR_XPC_BAD_CONVERT_JS_NULL_REF, + NS_ERROR_XPC_BAD_OP_ON_WN_PROTO = nsresult::NS_ERROR_XPC_BAD_OP_ON_WN_PROTO, + NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN = nsresult::NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN, + NS_ERROR_XPC_CANT_DEFINE_PROP_ON_WN = nsresult::NS_ERROR_XPC_CANT_DEFINE_PROP_ON_WN, + NS_ERROR_XPC_CANT_WATCH_WN_STATIC = nsresult::NS_ERROR_XPC_CANT_WATCH_WN_STATIC, + NS_ERROR_XPC_CANT_EXPORT_WN_STATIC = nsresult::NS_ERROR_XPC_CANT_EXPORT_WN_STATIC, + NS_ERROR_XPC_SCRIPTABLE_CALL_FAILED = nsresult::NS_ERROR_XPC_SCRIPTABLE_CALL_FAILED, + NS_ERROR_XPC_SCRIPTABLE_CTOR_FAILED = nsresult::NS_ERROR_XPC_SCRIPTABLE_CTOR_FAILED, + NS_ERROR_XPC_CANT_CALL_WO_SCRIPTABLE = nsresult::NS_ERROR_XPC_CANT_CALL_WO_SCRIPTABLE, + NS_ERROR_XPC_CANT_CTOR_WO_SCRIPTABLE = nsresult::NS_ERROR_XPC_CANT_CTOR_WO_SCRIPTABLE, + NS_ERROR_XPC_CI_RETURNED_FAILURE = nsresult::NS_ERROR_XPC_CI_RETURNED_FAILURE, + NS_ERROR_XPC_GS_RETURNED_FAILURE = nsresult::NS_ERROR_XPC_GS_RETURNED_FAILURE, + NS_ERROR_XPC_BAD_CID = nsresult::NS_ERROR_XPC_BAD_CID, + NS_ERROR_XPC_BAD_IID = nsresult::NS_ERROR_XPC_BAD_IID, + NS_ERROR_XPC_CANT_CREATE_WN = nsresult::NS_ERROR_XPC_CANT_CREATE_WN, + NS_ERROR_XPC_JS_THREW_EXCEPTION = nsresult::NS_ERROR_XPC_JS_THREW_EXCEPTION, + NS_ERROR_XPC_JS_THREW_NATIVE_OBJECT = nsresult::NS_ERROR_XPC_JS_THREW_NATIVE_OBJECT, + NS_ERROR_XPC_JS_THREW_JS_OBJECT = nsresult::NS_ERROR_XPC_JS_THREW_JS_OBJECT, + NS_ERROR_XPC_JS_THREW_NULL = nsresult::NS_ERROR_XPC_JS_THREW_NULL, + NS_ERROR_XPC_JS_THREW_STRING = nsresult::NS_ERROR_XPC_JS_THREW_STRING, + NS_ERROR_XPC_JS_THREW_NUMBER = nsresult::NS_ERROR_XPC_JS_THREW_NUMBER, + NS_ERROR_XPC_JAVASCRIPT_ERROR = nsresult::NS_ERROR_XPC_JAVASCRIPT_ERROR, + NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS = nsresult::NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS, + NS_ERROR_XPC_CANT_CONVERT_PRIMITIVE_TO_ARRAY = nsresult::NS_ERROR_XPC_CANT_CONVERT_PRIMITIVE_TO_ARRAY, + NS_ERROR_XPC_CANT_CONVERT_OBJECT_TO_ARRAY = nsresult::NS_ERROR_XPC_CANT_CONVERT_OBJECT_TO_ARRAY, + NS_ERROR_XPC_NOT_ENOUGH_ELEMENTS_IN_ARRAY = nsresult::NS_ERROR_XPC_NOT_ENOUGH_ELEMENTS_IN_ARRAY, + NS_ERROR_XPC_CANT_GET_ARRAY_INFO = nsresult::NS_ERROR_XPC_CANT_GET_ARRAY_INFO, + NS_ERROR_XPC_NOT_ENOUGH_CHARS_IN_STRING = nsresult::NS_ERROR_XPC_NOT_ENOUGH_CHARS_IN_STRING, + NS_ERROR_XPC_SECURITY_MANAGER_VETO = nsresult::NS_ERROR_XPC_SECURITY_MANAGER_VETO, + NS_ERROR_XPC_INTERFACE_NOT_SCRIPTABLE = nsresult::NS_ERROR_XPC_INTERFACE_NOT_SCRIPTABLE, + NS_ERROR_XPC_INTERFACE_NOT_FROM_NSISUPPORTS = nsresult::NS_ERROR_XPC_INTERFACE_NOT_FROM_NSISUPPORTS, + NS_ERROR_XPC_CANT_GET_JSOBJECT_OF_DOM_OBJECT = nsresult::NS_ERROR_XPC_CANT_GET_JSOBJECT_OF_DOM_OBJECT, + NS_ERROR_XPC_CANT_SET_READ_ONLY_CONSTANT = nsresult::NS_ERROR_XPC_CANT_SET_READ_ONLY_CONSTANT, + NS_ERROR_XPC_CANT_SET_READ_ONLY_ATTRIBUTE = nsresult::NS_ERROR_XPC_CANT_SET_READ_ONLY_ATTRIBUTE, + NS_ERROR_XPC_CANT_SET_READ_ONLY_METHOD = nsresult::NS_ERROR_XPC_CANT_SET_READ_ONLY_METHOD, + NS_ERROR_XPC_CANT_ADD_PROP_TO_WRAPPED_NATIVE = nsresult::NS_ERROR_XPC_CANT_ADD_PROP_TO_WRAPPED_NATIVE, + NS_ERROR_XPC_CALL_TO_SCRIPTABLE_FAILED = nsresult::NS_ERROR_XPC_CALL_TO_SCRIPTABLE_FAILED, + NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED = nsresult::NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED, + NS_ERROR_XPC_BAD_ID_STRING = nsresult::NS_ERROR_XPC_BAD_ID_STRING, + NS_ERROR_XPC_BAD_INITIALIZER_NAME = nsresult::NS_ERROR_XPC_BAD_INITIALIZER_NAME, + NS_ERROR_XPC_HAS_BEEN_SHUTDOWN = nsresult::NS_ERROR_XPC_HAS_BEEN_SHUTDOWN, + NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN = nsresult::NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN, + NS_ERROR_XPC_BAD_CONVERT_JS_ZERO_ISNOT_NULL = nsresult::NS_ERROR_XPC_BAD_CONVERT_JS_ZERO_ISNOT_NULL, + NS_ERROR_XPC_CANT_PASS_CPOW_TO_NATIVE = nsresult::NS_ERROR_XPC_CANT_PASS_CPOW_TO_NATIVE, +# 678 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_LAUNCHED_CHILD_PROCESS = nsresult::NS_ERROR_LAUNCHED_CHILD_PROCESS, +# 687 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_CSP_FORM_ACTION_VIOLATION = nsresult::NS_ERROR_CSP_FORM_ACTION_VIOLATION, + NS_ERROR_CSP_FRAME_ANCESTOR_VIOLATION = nsresult::NS_ERROR_CSP_FRAME_ANCESTOR_VIOLATION, + + + NS_ERROR_SRI_CORRUPT = nsresult::NS_ERROR_SRI_CORRUPT, + NS_ERROR_SRI_DISABLED = nsresult::NS_ERROR_SRI_DISABLED, + NS_ERROR_SRI_NOT_ELIGIBLE = nsresult::NS_ERROR_SRI_NOT_ELIGIBLE, + NS_ERROR_SRI_UNEXPECTED_HASH_TYPE = nsresult::NS_ERROR_SRI_UNEXPECTED_HASH_TYPE, + NS_ERROR_SRI_IMPORT = nsresult::NS_ERROR_SRI_IMPORT, + + + + NS_ERROR_CMS_VERIFY_NOT_SIGNED = nsresult::NS_ERROR_CMS_VERIFY_NOT_SIGNED, + NS_ERROR_CMS_VERIFY_NO_CONTENT_INFO = nsresult::NS_ERROR_CMS_VERIFY_NO_CONTENT_INFO, + NS_ERROR_CMS_VERIFY_BAD_DIGEST = nsresult::NS_ERROR_CMS_VERIFY_BAD_DIGEST, + NS_ERROR_CMS_VERIFY_NOCERT = nsresult::NS_ERROR_CMS_VERIFY_NOCERT, + NS_ERROR_CMS_VERIFY_UNTRUSTED = nsresult::NS_ERROR_CMS_VERIFY_UNTRUSTED, + NS_ERROR_CMS_VERIFY_ERROR_UNVERIFIED = nsresult::NS_ERROR_CMS_VERIFY_ERROR_UNVERIFIED, + NS_ERROR_CMS_VERIFY_ERROR_PROCESSING = nsresult::NS_ERROR_CMS_VERIFY_ERROR_PROCESSING, + NS_ERROR_CMS_VERIFY_BAD_SIGNATURE = nsresult::NS_ERROR_CMS_VERIFY_BAD_SIGNATURE, + NS_ERROR_CMS_VERIFY_DIGEST_MISMATCH = nsresult::NS_ERROR_CMS_VERIFY_DIGEST_MISMATCH, + NS_ERROR_CMS_VERIFY_UNKNOWN_ALGO = nsresult::NS_ERROR_CMS_VERIFY_UNKNOWN_ALGO, + NS_ERROR_CMS_VERIFY_UNSUPPORTED_ALGO = nsresult::NS_ERROR_CMS_VERIFY_UNSUPPORTED_ALGO, + NS_ERROR_CMS_VERIFY_MALFORMED_SIGNATURE = nsresult::NS_ERROR_CMS_VERIFY_MALFORMED_SIGNATURE, + NS_ERROR_CMS_VERIFY_HEADER_MISMATCH = nsresult::NS_ERROR_CMS_VERIFY_HEADER_MISMATCH, + NS_ERROR_CMS_VERIFY_NOT_YET_ATTEMPTED = nsresult::NS_ERROR_CMS_VERIFY_NOT_YET_ATTEMPTED, + NS_ERROR_CMS_VERIFY_CERT_WITHOUT_ADDRESS = nsresult::NS_ERROR_CMS_VERIFY_CERT_WITHOUT_ADDRESS, + NS_ERROR_CMS_ENCRYPT_NO_BULK_ALG = nsresult::NS_ERROR_CMS_ENCRYPT_NO_BULK_ALG, + NS_ERROR_CMS_ENCRYPT_INCOMPLETE = nsresult::NS_ERROR_CMS_ENCRYPT_INCOMPLETE, +# 724 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_DOM_INVALID_EXPRESSION_ERR = nsresult::NS_ERROR_DOM_INVALID_EXPRESSION_ERR, + NS_ERROR_DOM_TYPE_ERR = nsresult::NS_ERROR_DOM_TYPE_ERR, + + + + + + + + NS_ERROR_WONT_HANDLE_CONTENT = nsresult::NS_ERROR_WONT_HANDLE_CONTENT, + + + NS_ERROR_MALWARE_URI = nsresult::NS_ERROR_MALWARE_URI, + NS_ERROR_PHISHING_URI = nsresult::NS_ERROR_PHISHING_URI, + NS_ERROR_TRACKING_URI = nsresult::NS_ERROR_TRACKING_URI, + NS_ERROR_UNWANTED_URI = nsresult::NS_ERROR_UNWANTED_URI, + NS_ERROR_BLOCKED_URI = nsresult::NS_ERROR_BLOCKED_URI, + + + NS_ERROR_SAVE_LINK_AS_TIMEOUT = nsresult::NS_ERROR_SAVE_LINK_AS_TIMEOUT, + + + NS_ERROR_PARSED_DATA_CACHED = nsresult::NS_ERROR_PARSED_DATA_CACHED, + + + + NS_REFRESHURI_HEADER_FOUND = nsresult::NS_REFRESHURI_HEADER_FOUND, +# 759 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_IMAGE_SRC_CHANGED = nsresult::NS_ERROR_IMAGE_SRC_CHANGED, + NS_ERROR_IMAGE_BLOCKED = nsresult::NS_ERROR_IMAGE_BLOCKED, + + NS_ERROR_CONTENT_BLOCKED = nsresult::NS_ERROR_CONTENT_BLOCKED, + NS_ERROR_CONTENT_BLOCKED_SHOW_ALT = nsresult::NS_ERROR_CONTENT_BLOCKED_SHOW_ALT, + + NS_PROPTABLE_PROP_NOT_THERE = nsresult::NS_PROPTABLE_PROP_NOT_THERE, + + NS_ERROR_XBL_BLOCKED = nsresult::NS_ERROR_XBL_BLOCKED, + + NS_ERROR_CONTENT_CRASHED = nsresult::NS_ERROR_CONTENT_CRASHED, + + + NS_HTML_STYLE_PROPERTY_NOT_THERE = nsresult::NS_HTML_STYLE_PROPERTY_NOT_THERE, + NS_CONTENT_BLOCKED = nsresult::NS_CONTENT_BLOCKED, + NS_CONTENT_BLOCKED_SHOW_ALT = nsresult::NS_CONTENT_BLOCKED_SHOW_ALT, + NS_PROPTABLE_PROP_OVERWRITTEN = nsresult::NS_PROPTABLE_PROP_OVERWRITTEN, + + NS_FINDBROADCASTER_NOT_FOUND = nsresult::NS_FINDBROADCASTER_NOT_FOUND, + NS_FINDBROADCASTER_FOUND = nsresult::NS_FINDBROADCASTER_FOUND, + NS_FINDBROADCASTER_AWAIT_OVERLAYS = nsresult::NS_FINDBROADCASTER_AWAIT_OVERLAYS, + + + + + + + + NS_ERROR_XPATH_INVALID_ARG = nsresult::NS_ERROR_XPATH_INVALID_ARG, + + NS_ERROR_XSLT_PARSE_FAILURE = nsresult::NS_ERROR_XSLT_PARSE_FAILURE, + NS_ERROR_XPATH_PARSE_FAILURE = nsresult::NS_ERROR_XPATH_PARSE_FAILURE, + NS_ERROR_XSLT_ALREADY_SET = nsresult::NS_ERROR_XSLT_ALREADY_SET, + NS_ERROR_XSLT_EXECUTION_FAILURE = nsresult::NS_ERROR_XSLT_EXECUTION_FAILURE, + NS_ERROR_XPATH_UNKNOWN_FUNCTION = nsresult::NS_ERROR_XPATH_UNKNOWN_FUNCTION, + NS_ERROR_XSLT_BAD_RECURSION = nsresult::NS_ERROR_XSLT_BAD_RECURSION, + NS_ERROR_XSLT_BAD_VALUE = nsresult::NS_ERROR_XSLT_BAD_VALUE, + NS_ERROR_XSLT_NODESET_EXPECTED = nsresult::NS_ERROR_XSLT_NODESET_EXPECTED, + NS_ERROR_XSLT_ABORTED = nsresult::NS_ERROR_XSLT_ABORTED, + NS_ERROR_XSLT_NETWORK_ERROR = nsresult::NS_ERROR_XSLT_NETWORK_ERROR, + NS_ERROR_XSLT_WRONG_MIME_TYPE = nsresult::NS_ERROR_XSLT_WRONG_MIME_TYPE, + NS_ERROR_XSLT_LOAD_RECURSION = nsresult::NS_ERROR_XSLT_LOAD_RECURSION, + NS_ERROR_XPATH_BAD_ARGUMENT_COUNT = nsresult::NS_ERROR_XPATH_BAD_ARGUMENT_COUNT, + NS_ERROR_XPATH_BAD_EXTENSION_FUNCTION = nsresult::NS_ERROR_XPATH_BAD_EXTENSION_FUNCTION, + NS_ERROR_XPATH_PAREN_EXPECTED = nsresult::NS_ERROR_XPATH_PAREN_EXPECTED, + NS_ERROR_XPATH_INVALID_AXIS = nsresult::NS_ERROR_XPATH_INVALID_AXIS, + NS_ERROR_XPATH_NO_NODE_TYPE_TEST = nsresult::NS_ERROR_XPATH_NO_NODE_TYPE_TEST, + NS_ERROR_XPATH_BRACKET_EXPECTED = nsresult::NS_ERROR_XPATH_BRACKET_EXPECTED, + NS_ERROR_XPATH_INVALID_VAR_NAME = nsresult::NS_ERROR_XPATH_INVALID_VAR_NAME, + NS_ERROR_XPATH_UNEXPECTED_END = nsresult::NS_ERROR_XPATH_UNEXPECTED_END, + NS_ERROR_XPATH_OPERATOR_EXPECTED = nsresult::NS_ERROR_XPATH_OPERATOR_EXPECTED, + NS_ERROR_XPATH_UNCLOSED_LITERAL = nsresult::NS_ERROR_XPATH_UNCLOSED_LITERAL, + NS_ERROR_XPATH_BAD_COLON = nsresult::NS_ERROR_XPATH_BAD_COLON, + NS_ERROR_XPATH_BAD_BANG = nsresult::NS_ERROR_XPATH_BAD_BANG, + NS_ERROR_XPATH_ILLEGAL_CHAR = nsresult::NS_ERROR_XPATH_ILLEGAL_CHAR, + NS_ERROR_XPATH_BINARY_EXPECTED = nsresult::NS_ERROR_XPATH_BINARY_EXPECTED, + NS_ERROR_XSLT_LOAD_BLOCKED_ERROR = nsresult::NS_ERROR_XSLT_LOAD_BLOCKED_ERROR, + NS_ERROR_XPATH_INVALID_EXPRESSION_EVALUATED = nsresult::NS_ERROR_XPATH_INVALID_EXPRESSION_EVALUATED, + NS_ERROR_XPATH_UNBALANCED_CURLY_BRACE = nsresult::NS_ERROR_XPATH_UNBALANCED_CURLY_BRACE, + NS_ERROR_XSLT_BAD_NODE_NAME = nsresult::NS_ERROR_XSLT_BAD_NODE_NAME, + NS_ERROR_XSLT_VAR_ALREADY_SET = nsresult::NS_ERROR_XSLT_VAR_ALREADY_SET, + NS_ERROR_XSLT_CALL_TO_KEY_NOT_ALLOWED = nsresult::NS_ERROR_XSLT_CALL_TO_KEY_NOT_ALLOWED, + + NS_XSLT_GET_NEW_HANDLER = nsresult::NS_XSLT_GET_NEW_HANDLER, +# 831 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_TRANSPORT_INIT = nsresult::NS_ERROR_TRANSPORT_INIT, + + NS_ERROR_DUPLICATE_HANDLE = nsresult::NS_ERROR_DUPLICATE_HANDLE, + + NS_ERROR_BRIDGE_OPEN_PARENT = nsresult::NS_ERROR_BRIDGE_OPEN_PARENT, + + NS_ERROR_BRIDGE_OPEN_CHILD = nsresult::NS_ERROR_BRIDGE_OPEN_CHILD, + + + + + + + + NS_ERROR_DOM_SVG_WRONG_TYPE_ERR = nsresult::NS_ERROR_DOM_SVG_WRONG_TYPE_ERR, + + NS_ERROR_DOM_SVG_MATRIX_NOT_INVERTABLE = nsresult::NS_ERROR_DOM_SVG_MATRIX_NOT_INVERTABLE, +# 863 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_STORAGE_BUSY = nsresult::NS_ERROR_STORAGE_BUSY, + NS_ERROR_STORAGE_IOERR = nsresult::NS_ERROR_STORAGE_IOERR, + NS_ERROR_STORAGE_CONSTRAINT = nsresult::NS_ERROR_STORAGE_CONSTRAINT, + + + + + + + + NS_ERROR_DOM_FILE_NOT_FOUND_ERR = nsresult::NS_ERROR_DOM_FILE_NOT_FOUND_ERR, + NS_ERROR_DOM_FILE_NOT_READABLE_ERR = nsresult::NS_ERROR_DOM_FILE_NOT_READABLE_ERR, + NS_ERROR_DOM_FILE_ABORT_ERR = nsresult::NS_ERROR_DOM_FILE_ABORT_ERR, +# 884 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR, + NS_ERROR_DOM_INDEXEDDB_NOT_FOUND_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_NOT_FOUND_ERR, + NS_ERROR_DOM_INDEXEDDB_CONSTRAINT_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_CONSTRAINT_ERR, + NS_ERROR_DOM_INDEXEDDB_DATA_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_DATA_ERR, + NS_ERROR_DOM_INDEXEDDB_NOT_ALLOWED_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_NOT_ALLOWED_ERR, + NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR, + NS_ERROR_DOM_INDEXEDDB_ABORT_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_ABORT_ERR, + NS_ERROR_DOM_INDEXEDDB_READ_ONLY_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_READ_ONLY_ERR, + NS_ERROR_DOM_INDEXEDDB_TIMEOUT_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_TIMEOUT_ERR, + NS_ERROR_DOM_INDEXEDDB_QUOTA_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_QUOTA_ERR, + NS_ERROR_DOM_INDEXEDDB_VERSION_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_VERSION_ERR, + NS_ERROR_DOM_INDEXEDDB_RECOVERABLE_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_RECOVERABLE_ERR, + + + + + + + + NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR, + NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR, + NS_ERROR_DOM_FILEHANDLE_INACTIVE_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_INACTIVE_ERR, + NS_ERROR_DOM_FILEHANDLE_ABORT_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_ABORT_ERR, + NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR, + NS_ERROR_DOM_FILEHANDLE_QUOTA_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_QUOTA_ERR, + + + + + + + NS_ERROR_SIGNED_JAR_NOT_SIGNED = nsresult::NS_ERROR_SIGNED_JAR_NOT_SIGNED, + NS_ERROR_SIGNED_JAR_MODIFIED_ENTRY = nsresult::NS_ERROR_SIGNED_JAR_MODIFIED_ENTRY, + NS_ERROR_SIGNED_JAR_UNSIGNED_ENTRY = nsresult::NS_ERROR_SIGNED_JAR_UNSIGNED_ENTRY, + NS_ERROR_SIGNED_JAR_ENTRY_MISSING = nsresult::NS_ERROR_SIGNED_JAR_ENTRY_MISSING, + NS_ERROR_SIGNED_JAR_WRONG_SIGNATURE = nsresult::NS_ERROR_SIGNED_JAR_WRONG_SIGNATURE, + NS_ERROR_SIGNED_JAR_ENTRY_TOO_LARGE = nsresult::NS_ERROR_SIGNED_JAR_ENTRY_TOO_LARGE, + NS_ERROR_SIGNED_JAR_ENTRY_INVALID = nsresult::NS_ERROR_SIGNED_JAR_ENTRY_INVALID, + NS_ERROR_SIGNED_JAR_MANIFEST_INVALID = nsresult::NS_ERROR_SIGNED_JAR_MANIFEST_INVALID, + + + + + + + NS_ERROR_DOM_FILESYSTEM_INVALID_PATH_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_INVALID_PATH_ERR, + NS_ERROR_DOM_FILESYSTEM_INVALID_MODIFICATION_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_INVALID_MODIFICATION_ERR, + NS_ERROR_DOM_FILESYSTEM_NO_MODIFICATION_ALLOWED_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_NO_MODIFICATION_ALLOWED_ERR, + NS_ERROR_DOM_FILESYSTEM_PATH_EXISTS_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_PATH_EXISTS_ERR, + NS_ERROR_DOM_FILESYSTEM_TYPE_MISMATCH_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_TYPE_MISMATCH_ERR, + NS_ERROR_DOM_FILESYSTEM_UNKNOWN_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_UNKNOWN_ERR, + + + + + + + NS_ERROR_SIGNED_APP_MANIFEST_INVALID = nsresult::NS_ERROR_SIGNED_APP_MANIFEST_INVALID, + + + + + + + NS_ERROR_DOM_ANIM_MISSING_PROPS_ERR = nsresult::NS_ERROR_DOM_ANIM_MISSING_PROPS_ERR, + + + + + + + NS_ERROR_DOM_PUSH_INVALID_REGISTRATION_ERR = nsresult::NS_ERROR_DOM_PUSH_INVALID_REGISTRATION_ERR, + NS_ERROR_DOM_PUSH_DENIED_ERR = nsresult::NS_ERROR_DOM_PUSH_DENIED_ERR, + NS_ERROR_DOM_PUSH_ABORT_ERR = nsresult::NS_ERROR_DOM_PUSH_ABORT_ERR, + NS_ERROR_DOM_PUSH_SERVICE_UNREACHABLE = nsresult::NS_ERROR_DOM_PUSH_SERVICE_UNREACHABLE, + NS_ERROR_DOM_PUSH_INVALID_KEY_ERR = nsresult::NS_ERROR_DOM_PUSH_INVALID_KEY_ERR, + NS_ERROR_DOM_PUSH_MISMATCHED_KEY_ERR = nsresult::NS_ERROR_DOM_PUSH_MISMATCHED_KEY_ERR, + + + + + + + + NS_ERROR_DOM_MEDIA_ABORT_ERR = nsresult::NS_ERROR_DOM_MEDIA_ABORT_ERR, + NS_ERROR_DOM_MEDIA_NOT_ALLOWED_ERR = nsresult::NS_ERROR_DOM_MEDIA_NOT_ALLOWED_ERR, + NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR = nsresult::NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR, + + + NS_ERROR_DOM_MEDIA_DECODE_ERR = nsresult::NS_ERROR_DOM_MEDIA_DECODE_ERR, + NS_ERROR_DOM_MEDIA_FATAL_ERR = nsresult::NS_ERROR_DOM_MEDIA_FATAL_ERR, + NS_ERROR_DOM_MEDIA_METADATA_ERR = nsresult::NS_ERROR_DOM_MEDIA_METADATA_ERR, + NS_ERROR_DOM_MEDIA_OVERFLOW_ERR = nsresult::NS_ERROR_DOM_MEDIA_OVERFLOW_ERR, + NS_ERROR_DOM_MEDIA_END_OF_STREAM = nsresult::NS_ERROR_DOM_MEDIA_END_OF_STREAM, + NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA = nsresult::NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, + NS_ERROR_DOM_MEDIA_CANCELED = nsresult::NS_ERROR_DOM_MEDIA_CANCELED, + NS_ERROR_DOM_MEDIA_MEDIASINK_ERR = nsresult::NS_ERROR_DOM_MEDIA_MEDIASINK_ERR, + NS_ERROR_DOM_MEDIA_DEMUXER_ERR = nsresult::NS_ERROR_DOM_MEDIA_DEMUXER_ERR, + NS_ERROR_DOM_MEDIA_CDM_ERR = nsresult::NS_ERROR_DOM_MEDIA_CDM_ERR, + NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER = nsresult::NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER, + NS_ERROR_DOM_MEDIA_INITIALIZING_DECODER = nsresult::NS_ERROR_DOM_MEDIA_INITIALIZING_DECODER, + + + NS_ERROR_DOM_MEDIA_CUBEB_INITIALIZATION_ERR = nsresult::NS_ERROR_DOM_MEDIA_CUBEB_INITIALIZATION_ERR, + + + + + + + NS_ERROR_UC_UPDATE_UNKNOWN = nsresult::NS_ERROR_UC_UPDATE_UNKNOWN, + NS_ERROR_UC_UPDATE_DUPLICATE_PREFIX = nsresult::NS_ERROR_UC_UPDATE_DUPLICATE_PREFIX, + NS_ERROR_UC_UPDATE_INFINITE_LOOP = nsresult::NS_ERROR_UC_UPDATE_INFINITE_LOOP, + NS_ERROR_UC_UPDATE_WRONG_REMOVAL_INDICES = nsresult::NS_ERROR_UC_UPDATE_WRONG_REMOVAL_INDICES, + NS_ERROR_UC_UPDATE_CHECKSUM_MISMATCH = nsresult::NS_ERROR_UC_UPDATE_CHECKSUM_MISMATCH, + NS_ERROR_UC_UPDATE_MISSING_CHECKSUM = nsresult::NS_ERROR_UC_UPDATE_MISSING_CHECKSUM, + NS_ERROR_UC_UPDATE_SHUTDOWNING = nsresult::NS_ERROR_UC_UPDATE_SHUTDOWNING, + NS_ERROR_UC_UPDATE_TABLE_NOT_FOUND = nsresult::NS_ERROR_UC_UPDATE_TABLE_NOT_FOUND, + NS_ERROR_UC_UPDATE_BUILD_PREFIX_FAILURE = nsresult::NS_ERROR_UC_UPDATE_BUILD_PREFIX_FAILURE, + NS_ERROR_UC_UPDATE_FAIL_TO_WRITE_DISK = nsresult::NS_ERROR_UC_UPDATE_FAIL_TO_WRITE_DISK, + NS_ERROR_UC_UPDATE_PROTOCOL_PARSER_ERROR = nsresult::NS_ERROR_UC_UPDATE_PROTOCOL_PARSER_ERROR, + + + + + + + + NS_ERROR_INTERNAL_ERRORRESULT_JS_EXCEPTION = nsresult::NS_ERROR_INTERNAL_ERRORRESULT_JS_EXCEPTION, + + NS_ERROR_INTERNAL_ERRORRESULT_DOMEXCEPTION = nsresult::NS_ERROR_INTERNAL_ERRORRESULT_DOMEXCEPTION, + + NS_ERROR_INTERNAL_ERRORRESULT_EXCEPTION_ON_JSCONTEXT = nsresult::NS_ERROR_INTERNAL_ERRORRESULT_EXCEPTION_ON_JSCONTEXT, + + NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR = nsresult::NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR, + + NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR = nsresult::NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR, +# 1029 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" + NS_ERROR_DOWNLOAD_COMPLETE = nsresult::NS_ERROR_DOWNLOAD_COMPLETE, + + + + NS_ERROR_DOWNLOAD_NOT_PARTIAL = nsresult::NS_ERROR_DOWNLOAD_NOT_PARTIAL, + NS_ERROR_UNORM_MOREOUTPUT = nsresult::NS_ERROR_UNORM_MOREOUTPUT, + + NS_ERROR_DOCSHELL_REQUEST_REJECTED = nsresult::NS_ERROR_DOCSHELL_REQUEST_REJECTED, + + + + + NS_ERROR_DOCUMENT_IS_PRINTMODE = nsresult::NS_ERROR_DOCUMENT_IS_PRINTMODE, + + NS_SUCCESS_DONT_FIXUP = nsresult::NS_SUCCESS_DONT_FIXUP, + + + + NS_SUCCESS_RESTART_APP = nsresult::NS_SUCCESS_RESTART_APP, + NS_SUCCESS_RESTART_APP_NOT_SAME_PROFILE = nsresult::NS_SUCCESS_RESTART_APP_NOT_SAME_PROFILE, + NS_SUCCESS_UNORM_NOTFOUND = nsresult::NS_SUCCESS_UNORM_NOTFOUND, + + + + + NS_ERROR_NOT_IN_TREE = nsresult::NS_ERROR_NOT_IN_TREE, + + + NS_OK_NO_NAME_CLAUSE_HANDLED = nsresult::NS_OK_NO_NAME_CLAUSE_HANDLED +# 142 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h" 2 + +; +# 154 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h" +inline uint32_t +NS_FAILED_impl(nsresult aErr) +{ + return static_cast(aErr) & 0x80000000; +} + + + + +static_assert(((nsresult)0) < ((nsresult)-1), + "nsresult must be an unsigned type"); +static_assert(sizeof(nsresult) == sizeof(uint32_t), + "nsresult must be 32 bits"); +# 193 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h" +extern nsresult +NS_ErrorAccordingToNSPR(); + + + + + + +inline constexpr uint16_t +NS_ERROR_GET_CODE(nsresult aErr) +{ + return uint32_t(aErr) & 0xffff; +} +inline constexpr uint16_t +NS_ERROR_GET_MODULE(nsresult aErr) +{ + return ((uint32_t(aErr) >> 16) - 0x45) & 0x1fff; +} +inline bool +NS_ERROR_GET_SEVERITY(nsresult aErr) +{ + return uint32_t(aErr) >> 31; +} +# 232 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 2 + +typedef MozRefCountType nsrefcnt; +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTraceRefcnt.h" 2 + +class nsTraceRefcnt +{ +public: + static void Shutdown(); + + static nsresult DumpStatistics(); + + static void ResetStatistics(); + + static void WalkTheStack(FILE* aStream); + + + + + + + static void SetActivityIsLegal(bool aLegal); +}; + + + + +extern "C" void +NS_MeanAndStdDev(double aNumberOfValues, + double aSumOfValues, double aSumOfSquaredValues, + double* aMeanResult, double* aStdDevResult); +# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2 + + + + + + + + +extern "C" { +extern __attribute__((weak)) __attribute__((visibility("default"))) const char* gMozCrashReason; +} + + +static inline void +AnnotateMozCrashReason(const char* reason) +{ + gMozCrashReason = reason; +} + + + + + + +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3 +# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 2 3 + +using std::abort; +using std::atexit; +using std::exit; + + + using std::at_quick_exit; + + + using std::quick_exit; + + + + +using std::div_t; +using std::ldiv_t; + +using std::abs; +using std::atof; +using std::atoi; +using std::atol; +using std::bsearch; +using std::calloc; +using std::div; +using std::free; +using std::getenv; +using std::labs; +using std::ldiv; +using std::malloc; + +using std::mblen; +using std::mbstowcs; +using std::mbtowc; + +using std::qsort; +using std::rand; +using std::realloc; +using std::srand; +using std::strtod; +using std::strtol; +using std::strtoul; +using std::system; + +using std::wcstombs; +using std::wctomb; +# 50 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2 +# 63 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" +# 1 "/usr/include/signal.h" 1 3 4 +# 30 "/usr/include/signal.h" 3 4 +extern "C" { + + +# 1 "/usr/include/bits/sigset.h" 1 3 4 +# 102 "/usr/include/bits/sigset.h" 3 4 +extern int __sigismember (const __sigset_t *, int); +extern int __sigaddset (__sigset_t *, int); +extern int __sigdelset (__sigset_t *, int); +# 33 "/usr/include/signal.h" 2 3 4 + + + + + + + +typedef __sig_atomic_t sig_atomic_t; +# 57 "/usr/include/signal.h" 3 4 +# 1 "/usr/include/bits/signum.h" 1 3 4 +# 58 "/usr/include/signal.h" 2 3 4 +# 75 "/usr/include/signal.h" 3 4 +# 1 "/usr/include/time.h" 1 3 4 +# 76 "/usr/include/signal.h" 2 3 4 + + + + +# 1 "/usr/include/bits/siginfo.h" 1 3 4 +# 24 "/usr/include/bits/siginfo.h" 3 4 +# 1 "/usr/include/bits/wordsize.h" 1 3 4 +# 25 "/usr/include/bits/siginfo.h" 2 3 4 + + + + + + + +typedef union sigval + { + int sival_int; + void *sival_ptr; + } sigval_t; +# 58 "/usr/include/bits/siginfo.h" 3 4 +typedef __clock_t __sigchld_clock_t; + + + +typedef struct + { + int si_signo; + int si_errno; + + int si_code; + + union + { + int _pad[((128 / sizeof (int)) - 4)]; + + + struct + { + __pid_t si_pid; + __uid_t si_uid; + } _kill; + + + struct + { + int si_tid; + int si_overrun; + sigval_t si_sigval; + } _timer; + + + struct + { + __pid_t si_pid; + __uid_t si_uid; + sigval_t si_sigval; + } _rt; + + + struct + { + __pid_t si_pid; + __uid_t si_uid; + int si_status; + __sigchld_clock_t si_utime; + __sigchld_clock_t si_stime; + } _sigchld; + + + struct + { + void *si_addr; + short int si_addr_lsb; + struct + { + void *_lower; + void *_upper; + } si_addr_bnd; + } _sigfault; + + + struct + { + long int si_band; + int si_fd; + } _sigpoll; + + + struct + { + void *_call_addr; + int _syscall; + unsigned int _arch; + } _sigsys; + } _sifields; + } siginfo_t ; +# 160 "/usr/include/bits/siginfo.h" 3 4 +enum +{ + SI_ASYNCNL = -60, + + SI_TKILL = -6, + + SI_SIGIO, + + SI_ASYNCIO, + + SI_MESGQ, + + SI_TIMER, + + SI_QUEUE, + + SI_USER, + + SI_KERNEL = 0x80 + +}; + + + + +enum +{ + ILL_ILLOPC = 1, + + ILL_ILLOPN, + + ILL_ILLADR, + + ILL_ILLTRP, + + ILL_PRVOPC, + + ILL_PRVREG, + + ILL_COPROC, + + ILL_BADSTK + +}; + + +enum +{ + FPE_INTDIV = 1, + + FPE_INTOVF, + + FPE_FLTDIV, + + FPE_FLTOVF, + + FPE_FLTUND, + + FPE_FLTRES, + + FPE_FLTINV, + + FPE_FLTSUB + +}; + + +enum +{ + SEGV_MAPERR = 1, + + SEGV_ACCERR + +}; + + +enum +{ + BUS_ADRALN = 1, + + BUS_ADRERR, + + BUS_OBJERR, + + BUS_MCEERR_AR, + + BUS_MCEERR_AO + +}; + + + + +enum +{ + TRAP_BRKPT = 1, + + TRAP_TRACE + +}; + + + + +enum +{ + CLD_EXITED = 1, + + CLD_KILLED, + + CLD_DUMPED, + + CLD_TRAPPED, + + CLD_STOPPED, + + CLD_CONTINUED + +}; + + +enum +{ + POLL_IN = 1, + + POLL_OUT, + + POLL_MSG, + + POLL_ERR, + + POLL_PRI, + + POLL_HUP + +}; +# 320 "/usr/include/bits/siginfo.h" 3 4 +typedef struct sigevent + { + sigval_t sigev_value; + int sigev_signo; + int sigev_notify; + + union + { + int _pad[((64 / sizeof (int)) - 4)]; + + + + __pid_t _tid; + + struct + { + void (*_function) (sigval_t); + pthread_attr_t *_attribute; + } _sigev_thread; + } _sigev_un; + } sigevent_t; + + + + + + +enum +{ + SIGEV_SIGNAL = 0, + + SIGEV_NONE, + + SIGEV_THREAD, + + + SIGEV_THREAD_ID = 4 + +}; +# 81 "/usr/include/signal.h" 2 3 4 + + + + +typedef void (*__sighandler_t) (int); + + + + +extern __sighandler_t __sysv_signal (int __sig, __sighandler_t __handler) + throw (); + +extern __sighandler_t sysv_signal (int __sig, __sighandler_t __handler) + throw (); + + + + + + + +extern __sighandler_t signal (int __sig, __sighandler_t __handler) + throw (); +# 119 "/usr/include/signal.h" 3 4 +extern __sighandler_t bsd_signal (int __sig, __sighandler_t __handler) + throw (); + + + + + + +extern int kill (__pid_t __pid, int __sig) throw (); + + + + + + +extern int killpg (__pid_t __pgrp, int __sig) throw (); + + + + +extern int raise (int __sig) throw (); + + + + +extern __sighandler_t ssignal (int __sig, __sighandler_t __handler) + throw (); +extern int gsignal (int __sig) throw (); + + + + +extern void psignal (int __sig, const char *__s); + + +extern void psiginfo (const siginfo_t *__pinfo, const char *__s); +# 168 "/usr/include/signal.h" 3 4 +extern int sigpause (int __sig) __asm__ ("__xpg_sigpause"); +# 187 "/usr/include/signal.h" 3 4 +extern int sigblock (int __mask) throw () __attribute__ ((__deprecated__)); + + +extern int sigsetmask (int __mask) throw () __attribute__ ((__deprecated__)); + + +extern int siggetmask (void) throw () __attribute__ ((__deprecated__)); +# 202 "/usr/include/signal.h" 3 4 +typedef __sighandler_t sighandler_t; + + + + +typedef __sighandler_t sig_t; + + + + + +extern int sigemptyset (sigset_t *__set) throw () __attribute__ ((__nonnull__ (1))); + + +extern int sigfillset (sigset_t *__set) throw () __attribute__ ((__nonnull__ (1))); + + +extern int sigaddset (sigset_t *__set, int __signo) throw () __attribute__ ((__nonnull__ (1))); + + +extern int sigdelset (sigset_t *__set, int __signo) throw () __attribute__ ((__nonnull__ (1))); + + +extern int sigismember (const sigset_t *__set, int __signo) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int sigisemptyset (const sigset_t *__set) throw () __attribute__ ((__nonnull__ (1))); + + +extern int sigandset (sigset_t *__set, const sigset_t *__left, + const sigset_t *__right) throw () __attribute__ ((__nonnull__ (1, 2, 3))); + + +extern int sigorset (sigset_t *__set, const sigset_t *__left, + const sigset_t *__right) throw () __attribute__ ((__nonnull__ (1, 2, 3))); + + + + + +# 1 "/usr/include/bits/sigaction.h" 1 3 4 +# 24 "/usr/include/bits/sigaction.h" 3 4 +struct sigaction + { + + + union + { + + __sighandler_t sa_handler; + + void (*sa_sigaction) (int, siginfo_t *, void *); + } + __sigaction_handler; + + + + + + + + __sigset_t sa_mask; + + + int sa_flags; + + + void (*sa_restorer) (void); + }; +# 244 "/usr/include/signal.h" 2 3 4 + + +extern int sigprocmask (int __how, const sigset_t *__restrict __set, + sigset_t *__restrict __oset) throw (); + + + + + + +extern int sigsuspend (const sigset_t *__set) __attribute__ ((__nonnull__ (1))); + + +extern int sigaction (int __sig, const struct sigaction *__restrict __act, + struct sigaction *__restrict __oact) throw (); + + +extern int sigpending (sigset_t *__set) throw () __attribute__ ((__nonnull__ (1))); + + + + + + +extern int sigwait (const sigset_t *__restrict __set, int *__restrict __sig) + __attribute__ ((__nonnull__ (1, 2))); + + + + + + +extern int sigwaitinfo (const sigset_t *__restrict __set, + siginfo_t *__restrict __info) __attribute__ ((__nonnull__ (1))); + + + + + + +extern int sigtimedwait (const sigset_t *__restrict __set, + siginfo_t *__restrict __info, + const struct timespec *__restrict __timeout) + __attribute__ ((__nonnull__ (1))); + + + +extern int sigqueue (__pid_t __pid, int __sig, const union sigval __val) + throw (); +# 301 "/usr/include/signal.h" 3 4 +extern const char *const _sys_siglist[65]; +extern const char *const sys_siglist[65]; + + + + +# 1 "/usr/include/bits/sigcontext.h" 1 3 4 +# 29 "/usr/include/bits/sigcontext.h" 3 4 +struct _fpx_sw_bytes +{ + __uint32_t magic1; + __uint32_t extended_size; + __uint64_t xstate_bv; + __uint32_t xstate_size; + __uint32_t padding[7]; +}; + +struct _fpreg +{ + unsigned short significand[4]; + unsigned short exponent; +}; + +struct _fpxreg +{ + unsigned short significand[4]; + unsigned short exponent; + unsigned short padding[3]; +}; + +struct _xmmreg +{ + __uint32_t element[4]; +}; +# 121 "/usr/include/bits/sigcontext.h" 3 4 +struct _fpstate +{ + + __uint16_t cwd; + __uint16_t swd; + __uint16_t ftw; + __uint16_t fop; + __uint64_t rip; + __uint64_t rdp; + __uint32_t mxcsr; + __uint32_t mxcr_mask; + struct _fpxreg _st[8]; + struct _xmmreg _xmm[16]; + __uint32_t padding[24]; +}; + +struct sigcontext +{ + __uint64_t r8; + __uint64_t r9; + __uint64_t r10; + __uint64_t r11; + __uint64_t r12; + __uint64_t r13; + __uint64_t r14; + __uint64_t r15; + __uint64_t rdi; + __uint64_t rsi; + __uint64_t rbp; + __uint64_t rbx; + __uint64_t rdx; + __uint64_t rax; + __uint64_t rcx; + __uint64_t rsp; + __uint64_t rip; + __uint64_t eflags; + unsigned short cs; + unsigned short gs; + unsigned short fs; + unsigned short __pad0; + __uint64_t err; + __uint64_t trapno; + __uint64_t oldmask; + __uint64_t cr2; + __extension__ union + { + struct _fpstate * fpstate; + __uint64_t __fpstate_word; + }; + __uint64_t __reserved1 [8]; +}; + + + +struct _xsave_hdr +{ + __uint64_t xstate_bv; + __uint64_t reserved1[2]; + __uint64_t reserved2[5]; +}; + +struct _ymmh_state +{ + __uint32_t ymmh_space[64]; +}; + +struct _xstate +{ + struct _fpstate fpstate; + struct _xsave_hdr xstate_hdr; + struct _ymmh_state ymmh; +}; +# 307 "/usr/include/signal.h" 2 3 4 + + +extern int sigreturn (struct sigcontext *__scp) throw (); + + + + + + + +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 317 "/usr/include/signal.h" 2 3 4 + + + + +extern int siginterrupt (int __sig, int __interrupt) throw (); + + +# 1 "/usr/include/bits/sigstack.h" 1 3 4 +# 25 "/usr/include/bits/sigstack.h" 3 4 +struct sigstack + { + void *ss_sp; + int ss_onstack; + }; + + + +enum +{ + SS_ONSTACK = 1, + + SS_DISABLE + +}; +# 49 "/usr/include/bits/sigstack.h" 3 4 +typedef struct sigaltstack + { + void *ss_sp; + int ss_flags; + size_t ss_size; + } stack_t; +# 324 "/usr/include/signal.h" 2 3 4 + + +# 1 "/usr/include/sys/ucontext.h" 1 3 4 +# 22 "/usr/include/sys/ucontext.h" 3 4 +# 1 "/usr/include/signal.h" 1 3 4 +# 23 "/usr/include/sys/ucontext.h" 2 3 4 + + + + + + + + +__extension__ typedef long long int greg_t; + + + + + +typedef greg_t gregset_t[23]; + + + +enum +{ + REG_R8 = 0, + + REG_R9, + + REG_R10, + + REG_R11, + + REG_R12, + + REG_R13, + + REG_R14, + + REG_R15, + + REG_RDI, + + REG_RSI, + + REG_RBP, + + REG_RBX, + + REG_RDX, + + REG_RAX, + + REG_RCX, + + REG_RSP, + + REG_RIP, + + REG_EFL, + + REG_CSGSFS, + + REG_ERR, + + REG_TRAPNO, + + REG_OLDMASK, + + REG_CR2 + +}; + + +struct _libc_fpxreg +{ + unsigned short int significand[4]; + unsigned short int exponent; + unsigned short int padding[3]; +}; + +struct _libc_xmmreg +{ + __uint32_t element[4]; +}; + +struct _libc_fpstate +{ + + __uint16_t cwd; + __uint16_t swd; + __uint16_t ftw; + __uint16_t fop; + __uint64_t rip; + __uint64_t rdp; + __uint32_t mxcsr; + __uint32_t mxcr_mask; + struct _libc_fpxreg _st[8]; + struct _libc_xmmreg _xmm[16]; + __uint32_t padding[24]; +}; + + +typedef struct _libc_fpstate *fpregset_t; + + +typedef struct + { + gregset_t gregs; + + fpregset_t fpregs; + __extension__ unsigned long long __reserved1 [8]; +} mcontext_t; + + +typedef struct ucontext + { + unsigned long int uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + __sigset_t uc_sigmask; + struct _libc_fpstate __fpregs_mem; + } ucontext_t; +# 327 "/usr/include/signal.h" 2 3 4 + + + + + +extern int sigstack (struct sigstack *__ss, struct sigstack *__oss) + throw () __attribute__ ((__deprecated__)); + + + +extern int sigaltstack (const struct sigaltstack *__restrict __ss, + struct sigaltstack *__restrict __oss) throw (); + + + + + + + +extern int sighold (int __sig) throw (); + + +extern int sigrelse (int __sig) throw (); + + +extern int sigignore (int __sig) throw (); + + +extern __sighandler_t sigset (int __sig, __sighandler_t __disp) throw (); + + + + + + + +# 1 "/usr/include/bits/sigthread.h" 1 3 4 +# 30 "/usr/include/bits/sigthread.h" 3 4 +extern int pthread_sigmask (int __how, + const __sigset_t *__restrict __newmask, + __sigset_t *__restrict __oldmask)throw (); + + +extern int pthread_kill (pthread_t __threadid, int __signo) throw (); + + + +extern int pthread_sigqueue (pthread_t __threadid, int __signo, + const union sigval __value) throw (); +# 363 "/usr/include/signal.h" 2 3 4 + + + + + + +extern int __libc_current_sigrtmin (void) throw (); + +extern int __libc_current_sigrtmax (void) throw (); + + + +} +# 64 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2 +# 141 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" +extern "C" { +# 151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" +__attribute__ ((__unused__)) static __attribute__ ((cold)) __attribute__((noinline)) void +MOZ_ReportAssertionFailure(const char* aStr, const char* aFilename, int aLine) + +{ + + + + + + fprintf(stderr, "Assertion failure: %s, at %s:%d\n", aStr, aFilename, aLine); + + nsTraceRefcnt::WalkTheStack(stderr); + + fflush(stderr); + +} + +__attribute__ ((__unused__)) static __attribute__ ((cold)) __attribute__((noinline)) void +MOZ_ReportCrash(const char* aStr, const char* aFilename, int aLine) + +{ + + + + + fprintf(stderr, "Hit MOZ_CRASH(%s) at %s:%d\n", aStr, aFilename, aLine); + + nsTraceRefcnt::WalkTheStack(stderr); + + fflush(stderr); + +} +# 283 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" +__attribute__((weak)) __attribute__((visibility("default"))) __attribute__ ((cold)) __attribute__((noreturn)) __attribute__((noinline)) void +MOZ_CrashOOL(int aLine, const char* aReason); + + + + + + + +static const size_t sPrintfMaxArgs = 4; +static const size_t sPrintfCrashReasonSize = 1024; + + +__attribute__((weak)) __attribute__((visibility("default"))) __attribute__ ((cold)) __attribute__((noreturn)) __attribute__((noinline)) __attribute__ ((format (printf, 2, 3))) void +MOZ_CrashPrintf(int aLine, const char* aFormat, ...); +# 326 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" +} +# 376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" +namespace mozilla { +namespace detail { + +template +struct AssertionConditionType +{ + typedef typename RemoveReference::Type ValueT; + static_assert(!IsArray::value, + "Expected boolean assertion condition, got an array or a " + "string!"); + static_assert(!IsFunction::value, + "Expected boolean assertion condition, got a function! Did " + "you intend to call that function?"); + static_assert(!IsFloatingPoint::value, + "It's often a bad idea to assert that a floating-point number " + "is nonzero, because such assertions tend to intermittently " + "fail. Shouldn't your code gracefully handle this case instead " + "of asserting? Anyway, if you really want to do that, write an " + "explicit boolean condition, like !!x or x!=0."); + + static const bool isValid = true; +}; + +} +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Move.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Move.h" +namespace mozilla { +# 199 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Move.h" +template +inline typename RemoveReference::Type&& +Move(T&& aX) +{ + return static_cast::Type&&>(aX); +} + + + + + +template +inline T&& +Forward(typename RemoveReference::Type& aX) +{ + return static_cast(aX); +} + +template +inline T&& +Forward(typename RemoveReference::Type&& aX) +{ + static_assert(!IsLvalueReference::value, + "misuse of Forward detected! try the other overload"); + return static_cast(aX); +} + + +template +inline void +Swap(T& aX, T& aY) +{ + T tmp(Move(aX)); + aX = Move(aY); + aY = Move(tmp); +} + +} +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h" 2 + +namespace mozilla { + +struct unused_t; + +} +# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h" +template +struct already_AddRefed +{ +# 68 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h" + already_AddRefed() : mRawPtr(nullptr) {} + + + + typedef void (already_AddRefed::* MatchNullptr)(double, float); + already_AddRefed(MatchNullptr aRawPtr) : mRawPtr(nullptr) {} + + explicit already_AddRefed(T* aRawPtr) : mRawPtr(aRawPtr) {} + + + already_AddRefed(const already_AddRefed& aOther) = delete; + already_AddRefed& operator=(const already_AddRefed& aOther) = delete; + + already_AddRefed(already_AddRefed&& aOther) : mRawPtr(aOther.take()) {} + + already_AddRefed& operator=(already_AddRefed&& aOther) + { + mRawPtr = aOther.take(); + return *this; + } +# 106 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h" + template + already_AddRefed(already_AddRefed&& aOther) : mRawPtr(aOther.take()) {} + + ~already_AddRefed() { do { } while (0); } + + + + + + friend void operator<<(const mozilla::unused_t& aUnused, + const already_AddRefed& aRhs) + { + auto mutableAlreadyAddRefed = const_cast*>(&aRhs); + aUnused << mutableAlreadyAddRefed->take(); + } + + __attribute__ ((warn_unused_result)) T* take() + { + T* rawPtr = mRawPtr; + mRawPtr = nullptr; + return rawPtr; + } +# 143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h" + template + already_AddRefed downcast() + { + U* tmp = static_cast(mRawPtr); + mRawPtr = nullptr; + return already_AddRefed(tmp); + } + +private: + T* mRawPtr; +}; +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h" 2 + + + + + + + +class nsCOMPtr_helper; + +namespace mozilla { +template class OwningNonNull; +template class StaticRefPtr; +# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h" +template +struct RefPtrTraits +{ + static void AddRef(U* aPtr) { + aPtr->AddRef(); + } + static void Release(U* aPtr) { + aPtr->Release(); + } +}; + +} + +template +class RefPtr +{ +private: + void + assign_with_AddRef(T* aRawPtr) + { + if (aRawPtr) { + ConstRemovingRefPtrTraits::AddRef(aRawPtr); + } + assign_assuming_AddRef(aRawPtr); + } + + void + assign_assuming_AddRef(T* aNewPtr) + { + T* oldPtr = mRawPtr; + mRawPtr = aNewPtr; + if (oldPtr) { + ConstRemovingRefPtrTraits::Release(oldPtr); + } + } + +private: + T* mRawPtr; + +public: + typedef T element_type; + + ~RefPtr() + { + if (mRawPtr) { + ConstRemovingRefPtrTraits::Release(mRawPtr); + } + } + + + + RefPtr() + : mRawPtr(nullptr) + + { + } + + RefPtr(const RefPtr& aSmartPtr) + : mRawPtr(aSmartPtr.mRawPtr) + + { + if (mRawPtr) { + ConstRemovingRefPtrTraits::AddRef(mRawPtr); + } + } + + RefPtr(RefPtr&& aRefPtr) + : mRawPtr(aRefPtr.mRawPtr) + { + aRefPtr.mRawPtr = nullptr; + } + + + + RefPtr(T* aRawPtr) + : mRawPtr(aRawPtr) + { + if (mRawPtr) { + ConstRemovingRefPtrTraits::AddRef(mRawPtr); + } + } + + RefPtr(decltype(nullptr)) + : mRawPtr(nullptr) + { + } + + template + RefPtr(already_AddRefed& aSmartPtr) + : mRawPtr(aSmartPtr.take()) + + { + } + + template + RefPtr(already_AddRefed&& aSmartPtr) + : mRawPtr(aSmartPtr.take()) + + { + } + + template + RefPtr(const RefPtr& aSmartPtr) + : mRawPtr(aSmartPtr.get()) + + { + if (mRawPtr) { + ConstRemovingRefPtrTraits::AddRef(mRawPtr); + } + } + + template + RefPtr(RefPtr&& aSmartPtr) + : mRawPtr(aSmartPtr.forget().take()) + + { + } + + RefPtr(const nsCOMPtr_helper& aHelper); + + + template + RefPtr(const mozilla::OwningNonNull& aOther); + + + template + RefPtr(const mozilla::StaticRefPtr& aOther); + + + + RefPtr& + operator=(decltype(nullptr)) + { + assign_assuming_AddRef(nullptr); + return *this; + } + + RefPtr& + operator=(const RefPtr& aRhs) + + { + assign_with_AddRef(aRhs.mRawPtr); + return *this; + } + + template + RefPtr& + operator=(const RefPtr& aRhs) + + { + assign_with_AddRef(aRhs.get()); + return *this; + } + + RefPtr& + operator=(T* aRhs) + + { + assign_with_AddRef(aRhs); + return *this; + } + + template + RefPtr& + operator=(already_AddRefed& aRhs) + + { + assign_assuming_AddRef(aRhs.take()); + return *this; + } + + template + RefPtr& + operator=(already_AddRefed && aRhs) + + { + assign_assuming_AddRef(aRhs.take()); + return *this; + } + + RefPtr& operator=(const nsCOMPtr_helper& aHelper); + + RefPtr& + operator=(RefPtr && aRefPtr) + { + assign_assuming_AddRef(aRefPtr.mRawPtr); + aRefPtr.mRawPtr = nullptr; + return *this; + } + + + template + RefPtr& + operator=(const mozilla::OwningNonNull& aOther); + + + template + RefPtr& + operator=(const mozilla::StaticRefPtr& aOther); + + + + void + swap(RefPtr& aRhs) + + { + T* temp = aRhs.mRawPtr; + aRhs.mRawPtr = mRawPtr; + mRawPtr = temp; + } + + void + swap(T*& aRhs) + + { + T* temp = aRhs; + aRhs = mRawPtr; + mRawPtr = temp; + } + + already_AddRefed + + forget() + + + { + T* temp = nullptr; + swap(temp); + return already_AddRefed(temp); + } + + template + void + forget(I** aRhs) + + + + + { + do { } while (0); + *aRhs = mRawPtr; + mRawPtr = nullptr; + } + + T* + get() const + + + + + { + return const_cast(mRawPtr); + } + + operator T*() const & +# 296 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h" + { + return get(); + } + + + + + operator T*() const && = delete; + + + + + explicit operator bool() const { return !!mRawPtr; } + bool operator!() const { return !mRawPtr; } + + T* + operator->() const + { + do { } while (0); + + return get(); + } + + template + class Proxy + { + typedef R (T::*member_function)(Args...); + T* mRawPtr; + member_function mFunction; + public: + Proxy(T* aRawPtr, member_function aFunction) + : mRawPtr(aRawPtr), + mFunction(aFunction) + { + } + template + R operator()(ActualArgs&&... aArgs) + { + return ((*mRawPtr).*mFunction)(mozilla::Forward(aArgs)...); + } + }; + + template + Proxy operator->*(R (T::*aFptr)(Args...)) const + { + do { } while (0); + + return Proxy(get(), aFptr); + } + + RefPtr* + get_address() + + + { + return this; + } + + const RefPtr* + get_address() const + + + { + return this; + } + +public: + T& + operator*() const + { + do { } while (0); + + return *get(); + } + + T** + StartAssignment() + { + assign_assuming_AddRef(nullptr); + return reinterpret_cast(&mRawPtr); + } +private: +# 388 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h" + template + struct ConstRemovingRefPtrTraits + { + static void AddRef(U* aPtr) { + mozilla::RefPtrTraits::AddRef(aPtr); + } + static void Release(U* aPtr) { + mozilla::RefPtrTraits::Release(aPtr); + } + }; + template + struct ConstRemovingRefPtrTraits + { + static void AddRef(const U* aPtr) { + mozilla::RefPtrTraits::AddRef(const_cast(aPtr)); + } + static void Release(const U* aPtr) { + mozilla::RefPtrTraits::Release(const_cast(aPtr)); + } + }; +}; + +class nsCycleCollectionTraversalCallback; +template +void +CycleCollectionNoteChild(nsCycleCollectionTraversalCallback& aCallback, + T* aChild, const char* aName, uint32_t aFlags); + +template +inline void +ImplCycleCollectionUnlink(RefPtr& aField) +{ + aField = nullptr; +} + +template +inline void +ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, + RefPtr& aField, + const char* aName, + uint32_t aFlags = 0) +{ + CycleCollectionNoteChild(aCallback, aField.get(), aName, aFlags); +} + +template +inline RefPtr* +address_of(RefPtr& aPtr) +{ + return aPtr.get_address(); +} + +template +inline const RefPtr* +address_of(const RefPtr& aPtr) +{ + return aPtr.get_address(); +} + +template +class RefPtrGetterAddRefs +# 466 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h" +{ +public: + explicit + RefPtrGetterAddRefs(RefPtr& aSmartPtr) + : mTargetSmartPtr(aSmartPtr) + { + + } + + operator void**() + { + return reinterpret_cast(mTargetSmartPtr.StartAssignment()); + } + + operator T**() + { + return mTargetSmartPtr.StartAssignment(); + } + + T*& + operator*() + { + return *(mTargetSmartPtr.StartAssignment()); + } + +private: + RefPtr& mTargetSmartPtr; +}; + +template +inline RefPtrGetterAddRefs +getter_AddRefs(RefPtr& aSmartPtr) + + + + +{ + return RefPtrGetterAddRefs(aSmartPtr); +} + + + + +template +inline bool +operator==(const RefPtr& aLhs, const RefPtr& aRhs) +{ + return static_cast(aLhs.get()) == static_cast(aRhs.get()); +} + + +template +inline bool +operator!=(const RefPtr& aLhs, const RefPtr& aRhs) +{ + return static_cast(aLhs.get()) != static_cast(aRhs.get()); +} + + + + +template +inline bool +operator==(const RefPtr& aLhs, const U* aRhs) +{ + return static_cast(aLhs.get()) == static_cast(aRhs); +} + +template +inline bool +operator==(const U* aLhs, const RefPtr& aRhs) +{ + return static_cast(aLhs) == static_cast(aRhs.get()); +} + +template +inline bool +operator!=(const RefPtr& aLhs, const U* aRhs) +{ + return static_cast(aLhs.get()) != static_cast(aRhs); +} + +template +inline bool +operator!=(const U* aLhs, const RefPtr& aRhs) +{ + return static_cast(aLhs) != static_cast(aRhs.get()); +} + +template +inline bool +operator==(const RefPtr& aLhs, U* aRhs) +{ + return static_cast(aLhs.get()) == const_cast(aRhs); +} + +template +inline bool +operator==(U* aLhs, const RefPtr& aRhs) +{ + return const_cast(aLhs) == static_cast(aRhs.get()); +} + +template +inline bool +operator!=(const RefPtr& aLhs, U* aRhs) +{ + return static_cast(aLhs.get()) != const_cast(aRhs); +} + +template +inline bool +operator!=(U* aLhs, const RefPtr& aRhs) +{ + return const_cast(aLhs) != static_cast(aRhs.get()); +} + + + +template +inline bool +operator==(const RefPtr& aLhs, decltype(nullptr)) +{ + return aLhs.get() == nullptr; +} + +template +inline bool +operator==(decltype(nullptr), const RefPtr& aRhs) +{ + return nullptr == aRhs.get(); +} + +template +inline bool +operator!=(const RefPtr& aLhs, decltype(nullptr)) +{ + return aLhs.get() != nullptr; +} + +template +inline bool +operator!=(decltype(nullptr), const RefPtr& aRhs) +{ + return nullptr != aRhs.get(); +} + + + +template +inline already_AddRefed +do_AddRef(T* aObj) +{ + RefPtr ref(aObj); + return ref.forget(); +} + +template +inline already_AddRefed +do_AddRef(const RefPtr& aObj) +{ + RefPtr ref(aObj); + return ref.forget(); +} + +namespace mozilla { +# 642 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h" +template +already_AddRefed +MakeAndAddRef(Args&&... aArgs) +{ + RefPtr p(new T(Forward(aArgs)...)); + return p.forget(); +} + +} +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Pair.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Pair.h" +namespace mozilla { + +namespace detail { + +enum StorageType { AsBase, AsMember }; +# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Pair.h" +template::value ? detail::AsBase : detail::AsMember, + detail::StorageType = + IsEmpty::value && !IsBaseOf::value && !IsBaseOf::value + ? detail::AsBase + : detail::AsMember> +struct PairHelper; + +template +struct PairHelper +{ +protected: + template + PairHelper(AArg&& aA, BArg&& aB) + : mFirstA(Forward(aA)), + mSecondB(Forward(aB)) + {} + + A& first() { return mFirstA; } + const A& first() const { return mFirstA; } + B& second() { return mSecondB; } + const B& second() const { return mSecondB; } + + void swap(PairHelper& aOther) + { + Swap(mFirstA, aOther.mFirstA); + Swap(mSecondB, aOther.mSecondB); + } + +private: + A mFirstA; + B mSecondB; +}; + +template +struct PairHelper : private B +{ +protected: + template + PairHelper(AArg&& aA, BArg&& aB) + : B(Forward(aB)), + mFirstA(Forward(aA)) + {} + + A& first() { return mFirstA; } + const A& first() const { return mFirstA; } + B& second() { return *this; } + const B& second() const { return *this; } + + void swap(PairHelper& aOther) + { + Swap(mFirstA, aOther.mFirstA); + Swap(static_cast(*this), static_cast(aOther)); + } + +private: + A mFirstA; +}; + +template +struct PairHelper : private A +{ +protected: + template + PairHelper(AArg&& aA, BArg&& aB) + : A(Forward(aA)), + mSecondB(Forward(aB)) + {} + + A& first() { return *this; } + const A& first() const { return *this; } + B& second() { return mSecondB; } + const B& second() const { return mSecondB; } + + void swap(PairHelper& aOther) + { + Swap(static_cast(*this), static_cast(aOther)); + Swap(mSecondB, aOther.mSecondB); + } + +private: + B mSecondB; +}; + +template +struct PairHelper : private A, private B +{ +protected: + template + PairHelper(AArg&& aA, BArg&& aB) + : A(Forward(aA)), + B(Forward(aB)) + {} + + A& first() { return static_cast(*this); } + const A& first() const { return static_cast(*this); } + B& second() { return static_cast(*this); } + const B& second() const { return static_cast(*this); } + + void swap(PairHelper& aOther) + { + Swap(static_cast(*this), static_cast(aOther)); + Swap(static_cast(*this), static_cast(aOther)); + } +}; + +} +# 151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Pair.h" +template +struct Pair + : private detail::PairHelper +{ + typedef typename detail::PairHelper Base; + +public: + template + Pair(AArg&& aA, BArg&& aB) + : Base(Forward(aA), Forward(aB)) + {} + + Pair(Pair&& aOther) + : Base(Move(aOther.first()), Move(aOther.second())) + { } + + Pair(const Pair& aOther) = default; + + Pair& operator=(Pair&& aOther) + { + do { } while (0); + + first() = Move(aOther.first()); + second() = Move(aOther.second()); + + return *this; + } + + Pair& operator=(const Pair& aOther) = default; + + + using Base::first; + + using Base::second; + + + void swap(Pair& aOther) { Base::swap(aOther); } +}; + +template +void +Swap(Pair& aX, Pair& aY) +{ + aX.swap(aY); +} +# 205 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Pair.h" +template +Pair::Type>::Type, + typename RemoveCV::Type>::Type> +MakePair(A&& aA, B&& aB) +{ + return + Pair::Type>::Type, + typename RemoveCV::Type>::Type>( + Forward(aA), + Forward(aB)); +} + +} +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h" 2 + + +namespace mozilla { + +template class DefaultDelete; +template> class UniquePtr; + +} + +namespace mozilla { + +namespace detail { + +struct HasPointerTypeHelper +{ + template static double Test(...); + template static char Test(typename U::pointer* = 0); +}; + +template +class HasPointerType : public IntegralConstant(0)) == 1> +{ +}; + +template ::value> +struct PointerTypeImpl +{ + typedef typename D::pointer Type; +}; + +template +struct PointerTypeImpl +{ + typedef T* Type; +}; + +template +struct PointerType +{ + typedef typename PointerTypeImpl::Type>::Type Type; +}; + +} +# 187 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h" +template +class UniquePtr +{ +public: + typedef T ElementType; + typedef D DeleterType; + typedef typename detail::PointerType::Type Pointer; + +private: + Pair mTuple; + + Pointer& ptr() { return mTuple.first(); } + const Pointer& ptr() const { return mTuple.first(); } + + DeleterType& del() { return mTuple.second(); } + const DeleterType& del() const { return mTuple.second(); } + +public: + + + + constexpr UniquePtr() + : mTuple(static_cast(nullptr), DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + + + + explicit UniquePtr(Pointer aPtr) + : mTuple(aPtr, DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + UniquePtr(Pointer aPtr, + typename Conditional::value, + D, + const D&>::Type aD1) + : mTuple(aPtr, aD1) + {} +# 254 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h" + UniquePtr(Pointer aPtr, + typename RemoveReference::Type&& aD2) + : mTuple(aPtr, Move(aD2)) + { + static_assert(!IsReference::value, + "rvalue deleter can't be stored by reference"); + } + + UniquePtr(UniquePtr&& aOther) + : mTuple(aOther.release(), Forward(aOther.get_deleter())) + {} + + + UniquePtr(decltype(nullptr)) + : mTuple(nullptr, DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + template + + UniquePtr(UniquePtr&& aOther, + typename EnableIf::Pointer, + Pointer>::value && + !IsArray::value && + (IsReference::value + ? IsSame::value + : IsConvertible::value), + int>::Type aDummy = 0) + : mTuple(aOther.release(), Forward(aOther.get_deleter())) + { + } + + ~UniquePtr() { reset(nullptr); } + + UniquePtr& operator=(UniquePtr&& aOther) + { + reset(aOther.release()); + get_deleter() = Forward(aOther.get_deleter()); + return *this; + } + + template + UniquePtr& operator=(UniquePtr&& aOther) + { + static_assert(IsConvertible::Pointer, + Pointer>::value, + "incompatible UniquePtr pointees"); + static_assert(!IsArray::value, + "can't assign from UniquePtr holding an array"); + + reset(aOther.release()); + get_deleter() = Forward(aOther.get_deleter()); + return *this; + } + + UniquePtr& operator=(decltype(nullptr)) + { + reset(nullptr); + return *this; + } + + T& operator*() const { return *get(); } + Pointer operator->() const + { + do { } while (0); + return get(); + } + + explicit operator bool() const { return get() != nullptr; } + + Pointer get() const { return ptr(); } + + DeleterType& get_deleter() { return del(); } + const DeleterType& get_deleter() const { return del(); } + + __attribute__ ((warn_unused_result)) Pointer release() + { + Pointer p = ptr(); + ptr() = nullptr; + return p; + } + + void reset(Pointer aPtr = Pointer()) + { + Pointer old = ptr(); + ptr() = aPtr; + if (old != nullptr) { + get_deleter()(old); + } + } + + void swap(UniquePtr& aOther) + { + mTuple.swap(aOther.mTuple); + } + + UniquePtr(const UniquePtr& aOther) = delete; + void operator=(const UniquePtr& aOther) = delete; +}; + + + + + +template +class UniquePtr +{ +public: + typedef T* Pointer; + typedef T ElementType; + typedef D DeleterType; + +private: + Pair mTuple; + +public: + + + + constexpr UniquePtr() + : mTuple(static_cast(nullptr), DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + + + + explicit UniquePtr(Pointer aPtr) + : mTuple(aPtr, DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + + + + + + template + UniquePtr(U&& aU, + typename EnableIf::value && + IsConvertible::value, + int>::Type aDummy = 0) + = delete; + + UniquePtr(Pointer aPtr, + typename Conditional::value, + D, + const D&>::Type aD1) + : mTuple(aPtr, aD1) + {} + + + + + + UniquePtr(Pointer aPtr, + typename RemoveReference::Type&& aD2) + : mTuple(aPtr, Move(aD2)) + { + static_assert(!IsReference::value, + "rvalue deleter can't be stored by reference"); + } + + + template + UniquePtr(U&& aU, V&& aV, + typename EnableIf::value && + IsConvertible::value, + int>::Type aDummy = 0) + = delete; + + UniquePtr(UniquePtr&& aOther) + : mTuple(aOther.release(), Forward(aOther.get_deleter())) + {} + + + UniquePtr(decltype(nullptr)) + : mTuple(nullptr, DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + ~UniquePtr() { reset(nullptr); } + + UniquePtr& operator=(UniquePtr&& aOther) + { + reset(aOther.release()); + get_deleter() = Forward(aOther.get_deleter()); + return *this; + } + + UniquePtr& operator=(decltype(nullptr)) + { + reset(); + return *this; + } + + explicit operator bool() const { return get() != nullptr; } + + T& operator[](decltype(sizeof(int)) aIndex) const { return get()[aIndex]; } + Pointer get() const { return mTuple.first(); } + + DeleterType& get_deleter() { return mTuple.second(); } + const DeleterType& get_deleter() const { return mTuple.second(); } + + __attribute__ ((warn_unused_result)) Pointer release() + { + Pointer p = mTuple.first(); + mTuple.first() = nullptr; + return p; + } + + void reset(Pointer aPtr = Pointer()) + { + Pointer old = mTuple.first(); + mTuple.first() = aPtr; + if (old != nullptr) { + mTuple.second()(old); + } + } + + void reset(decltype(nullptr)) + { + Pointer old = mTuple.first(); + mTuple.first() = nullptr; + if (old != nullptr) { + mTuple.second()(old); + } + } + + template + void reset(U) = delete; + + void swap(UniquePtr& aOther) { mTuple.swap(aOther.mTuple); } + + UniquePtr(const UniquePtr& aOther) = delete; + void operator=(const UniquePtr& aOther) = delete; +}; +# 513 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h" +template +class DefaultDelete +{ +public: + constexpr DefaultDelete() {} + + template + DefaultDelete(const DefaultDelete& aOther, + typename EnableIf::value, + int>::Type aDummy = 0) + {} + + void operator()(T* aPtr) const + { + static_assert(sizeof(T) > 0, "T must be complete"); + delete aPtr; + } +}; + + +template +class DefaultDelete +{ +public: + constexpr DefaultDelete() {} + + void operator()(T* aPtr) const + { + static_assert(sizeof(T) > 0, "T must be complete"); + delete[] aPtr; + } + + template + void operator()(U* aPtr) const = delete; +}; + +template +void +Swap(UniquePtr& aX, UniquePtr& aY) +{ + aX.swap(aY); +} + +template +bool +operator==(const UniquePtr& aX, const UniquePtr& aY) +{ + return aX.get() == aY.get(); +} + +template +bool +operator!=(const UniquePtr& aX, const UniquePtr& aY) +{ + return aX.get() != aY.get(); +} + +template +bool +operator==(const UniquePtr& aX, decltype(nullptr)) +{ + return !aX; +} + +template +bool +operator==(decltype(nullptr), const UniquePtr& aX) +{ + return !aX; +} + +template +bool +operator!=(const UniquePtr& aX, decltype(nullptr)) +{ + return bool(aX); +} + +template +bool +operator!=(decltype(nullptr), const UniquePtr& aX) +{ + return bool(aX); +} + + + +namespace detail { + +template +struct UniqueSelector +{ + typedef UniquePtr SingleObject; +}; + +template +struct UniqueSelector +{ + typedef UniquePtr UnknownBound; +}; + +template +struct UniqueSelector +{ + typedef UniquePtr KnownBound; +}; + +} +# 676 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h" +template +typename detail::UniqueSelector::SingleObject +MakeUnique(Args&&... aArgs) +{ + return UniquePtr(new T(Forward(aArgs)...)); +} + +template +typename detail::UniqueSelector::UnknownBound +MakeUnique(decltype(sizeof(int)) aN) +{ + typedef typename RemoveExtent::Type ArrayType; + return UniquePtr(new ArrayType[aN]()); +} + +template +typename detail::UniqueSelector::KnownBound +MakeUnique(Args&&... aArgs) = delete; + +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleAutoArray.h" 1 + + + + + + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArrayForwardDeclare.h" 1 +# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArrayForwardDeclare.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArrayForwardDeclare.h" 2 + +template +class nsTArray; + +template +class FallibleTArray; + +template +class AutoTArray; + +template +using InfallibleTArray = nsTArray; +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Alignment.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Alignment.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Alignment.h" 2 + + +namespace mozilla { + + + + + +template +class AlignmentFinder +{ + struct Aligner + { + char mChar; + T mT; + }; + +public: + static const size_t alignment = sizeof(Aligner) - sizeof(T); +}; +# 64 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Alignment.h" +template +struct AlignedElem; + + + + + + +template<> +struct AlignedElem<1> +{ + uint8_t elem __attribute__((aligned(1))); +}; + +template<> +struct AlignedElem<2> +{ + uint8_t elem __attribute__((aligned(2))); +}; + +template<> +struct AlignedElem<4> +{ + uint8_t elem __attribute__((aligned(4))); +}; + +template<> +struct AlignedElem<8> +{ + uint8_t elem __attribute__((aligned(8))); +}; + +template<> +struct AlignedElem<16> +{ + uint8_t elem __attribute__((aligned(16))); +}; + +template +struct AlignedStorage2 +{ + union U + { + char mBytes[sizeof(T)]; + uint64_t mDummy; + } u; + + const T* addr() const { return reinterpret_cast(u.mBytes); } + T* addr() { return static_cast(static_cast(u.mBytes)); } + + AlignedStorage2() = default; + + + + AlignedStorage2(const AlignedStorage2&) = delete; + void operator=(const AlignedStorage2&) = delete; +}; + +} +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayIterator.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayIterator.h" +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 1 3 +# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 1 3 +# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3 + + + + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 89 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3 + struct input_iterator_tag { }; + + + struct output_iterator_tag { }; + + + struct forward_iterator_tag : public input_iterator_tag { }; + + + + struct bidirectional_iterator_tag : public forward_iterator_tag { }; + + + + struct random_access_iterator_tag : public bidirectional_iterator_tag { }; +# 116 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3 + template + struct iterator + { + + typedef _Category iterator_category; + + typedef _Tp value_type; + + typedef _Distance difference_type; + + typedef _Pointer pointer; + + typedef _Reference reference; + }; +# 143 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3 + template> + struct __iterator_traits { }; + + template + struct __iterator_traits<_Iterator, + __void_t> + { + typedef typename _Iterator::iterator_category iterator_category; + typedef typename _Iterator::value_type value_type; + typedef typename _Iterator::difference_type difference_type; + typedef typename _Iterator::pointer pointer; + typedef typename _Iterator::reference reference; + }; + + template + struct iterator_traits + : public __iterator_traits<_Iterator> { }; +# 177 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3 + template + struct iterator_traits<_Tp*> + { + typedef random_access_iterator_tag iterator_category; + typedef _Tp value_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef _Tp& reference; + }; + + + template + struct iterator_traits + { + typedef random_access_iterator_tag iterator_category; + typedef _Tp value_type; + typedef ptrdiff_t difference_type; + typedef const _Tp* pointer; + typedef const _Tp& reference; + }; + + + + + + template + inline typename iterator_traits<_Iter>::iterator_category + __iterator_category(const _Iter&) + { return typename iterator_traits<_Iter>::iterator_category(); } +# 230 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3 + template + using _RequireInputIter = typename + enable_if::iterator_category, + input_iterator_tag>::value>::type; + + + +} +# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_funcs.h" 1 3 +# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_funcs.h" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/debug/assertions.h" 1 3 +# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_funcs.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template struct _List_iterator; + template struct _List_const_iterator; + + + + + template + inline typename iterator_traits<_InputIterator>::difference_type + __distance(_InputIterator __first, _InputIterator __last, + input_iterator_tag) + { + + + + typename iterator_traits<_InputIterator>::difference_type __n = 0; + while (__first != __last) + { + ++__first; + ++__n; + } + return __n; + } + + template + inline typename iterator_traits<_RandomAccessIterator>::difference_type + __distance(_RandomAccessIterator __first, _RandomAccessIterator __last, + random_access_iterator_tag) + { + + + + return __last - __first; + } + + + + template + ptrdiff_t + __distance(std::_List_iterator<_Tp>, + std::_List_iterator<_Tp>, + input_iterator_tag); + + template + ptrdiff_t + __distance(std::_List_const_iterator<_Tp>, + std::_List_const_iterator<_Tp>, + input_iterator_tag); +# 133 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_funcs.h" 3 + template + inline typename iterator_traits<_InputIterator>::difference_type + distance(_InputIterator __first, _InputIterator __last) + { + + return std::__distance(__first, __last, + std::__iterator_category(__first)); + } + + template + inline void + __advance(_InputIterator& __i, _Distance __n, input_iterator_tag) + { + + + ; + while (__n--) + ++__i; + } + + template + inline void + __advance(_BidirectionalIterator& __i, _Distance __n, + bidirectional_iterator_tag) + { + + + + if (__n > 0) + while (__n--) + ++__i; + else + while (__n++) + --__i; + } + + template + inline void + __advance(_RandomAccessIterator& __i, _Distance __n, + random_access_iterator_tag) + { + + + + __i += __n; + } +# 192 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_funcs.h" 3 + template + inline void + advance(_InputIterator& __i, _Distance __n) + { + + typename iterator_traits<_InputIterator>::difference_type __d = __n; + std::__advance(__i, __d, std::__iterator_category(__i)); + } + + + + template + inline _ForwardIterator + next(_ForwardIterator __x, typename + iterator_traits<_ForwardIterator>::difference_type __n = 1) + { + + + + std::advance(__x, __n); + return __x; + } + + template + inline _BidirectionalIterator + prev(_BidirectionalIterator __x, typename + iterator_traits<_BidirectionalIterator>::difference_type __n = 1) + { + + + + std::advance(__x, -__n); + return __x; + } + + + + +} +# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 1 3 +# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cpp_type_traits.h" 1 3 +# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cpp_type_traits.h" 3 +# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cpp_type_traits.h" 3 +extern "C++" { + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + struct __true_type { }; + struct __false_type { }; + + template + struct __truth_type + { typedef __false_type __type; }; + + template<> + struct __truth_type + { typedef __true_type __type; }; + + + + template + struct __traitor + { + enum { __value = bool(_Sp::__value) || bool(_Tp::__value) }; + typedef typename __truth_type<__value>::__type __type; + }; + + + template + struct __are_same + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + template + struct __are_same<_Tp, _Tp> + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + + template + struct __is_void + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + template<> + struct __is_void + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + + + + template + struct __is_integer + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + + + + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; +# 278 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cpp_type_traits.h" 3 + template + struct __is_floating + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + + template<> + struct __is_floating + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_floating + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_floating + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + + + + template + struct __is_pointer + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + template + struct __is_pointer<_Tp*> + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + + + + template + struct __is_arithmetic + : public __traitor<__is_integer<_Tp>, __is_floating<_Tp> > + { }; + + + + + template + struct __is_scalar + : public __traitor<__is_arithmetic<_Tp>, __is_pointer<_Tp> > + { }; + + + + + template + struct __is_char + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + template<> + struct __is_char + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + + template<> + struct __is_char + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + + template + struct __is_byte + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + template<> + struct __is_byte + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_byte + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_byte + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + + + + template + struct __is_move_iterator + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + + + template + inline _Iterator + __miter_base(_Iterator __it) + { return __it; } + + +} +} +# 64 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/type_traits.h" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/type_traits.h" 3 + + + + +extern "C++" { + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + + + + template + struct __enable_if + { }; + + template + struct __enable_if + { typedef _Tp __type; }; + + + + template + struct __conditional_type + { typedef _Iftrue __type; }; + + template + struct __conditional_type + { typedef _Iffalse __type; }; + + + + template + struct __add_unsigned + { + private: + typedef __enable_if::__value, _Tp> __if_type; + + public: + typedef typename __if_type::__type __type; + }; + + template<> + struct __add_unsigned + { typedef unsigned char __type; }; + + template<> + struct __add_unsigned + { typedef unsigned char __type; }; + + template<> + struct __add_unsigned + { typedef unsigned short __type; }; + + template<> + struct __add_unsigned + { typedef unsigned int __type; }; + + template<> + struct __add_unsigned + { typedef unsigned long __type; }; + + template<> + struct __add_unsigned + { typedef unsigned long long __type; }; + + + template<> + struct __add_unsigned; + + template<> + struct __add_unsigned; + + + + template + struct __remove_unsigned + { + private: + typedef __enable_if::__value, _Tp> __if_type; + + public: + typedef typename __if_type::__type __type; + }; + + template<> + struct __remove_unsigned + { typedef signed char __type; }; + + template<> + struct __remove_unsigned + { typedef signed char __type; }; + + template<> + struct __remove_unsigned + { typedef short __type; }; + + template<> + struct __remove_unsigned + { typedef int __type; }; + + template<> + struct __remove_unsigned + { typedef long __type; }; + + template<> + struct __remove_unsigned + { typedef long long __type; }; + + + template<> + struct __remove_unsigned; + + template<> + struct __remove_unsigned; + + + + template + inline bool + __is_null_pointer(_Type* __ptr) + { return __ptr == 0; } + + template + inline bool + __is_null_pointer(_Type) + { return false; } + + + inline bool + __is_null_pointer(std::nullptr_t) + { return true; } + + + + template::__value> + struct __promote + { typedef double __type; }; + + + + + template + struct __promote<_Tp, false> + { }; + + template<> + struct __promote + { typedef long double __type; }; + + template<> + struct __promote + { typedef double __type; }; + + template<> + struct __promote + { typedef float __type; }; + + template::__type, + typename _Up2 = typename __promote<_Up>::__type> + struct __promote_2 + { + typedef __typeof__(_Tp2() + _Up2()) __type; + }; + + template::__type, + typename _Up2 = typename __promote<_Up>::__type, + typename _Vp2 = typename __promote<_Vp>::__type> + struct __promote_3 + { + typedef __typeof__(_Tp2() + _Up2() + _Vp2()) __type; + }; + + template::__type, + typename _Up2 = typename __promote<_Up>::__type, + typename _Vp2 = typename __promote<_Vp>::__type, + typename _Wp2 = typename __promote<_Wp>::__type> + struct __promote_4 + { + typedef __typeof__(_Tp2() + _Up2() + _Vp2() + _Wp2()) __type; + }; + + +} +} +# 65 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 2 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ptr_traits.h" 1 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ptr_traits.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + class __undefined; + + + template + struct __get_first_arg + { using type = __undefined; }; + + template class _Template, typename _Tp, + typename... _Types> + struct __get_first_arg<_Template<_Tp, _Types...>> + { using type = _Tp; }; + + template + using __get_first_arg_t = typename __get_first_arg<_Tp>::type; + + + template + struct __replace_first_arg + { using type = __undefined; }; + + template class _Template, typename _Up, + typename _Tp, typename... _Types> + struct __replace_first_arg<_Template<_Tp, _Types...>, _Up> + { using type = _Template<_Up, _Types...>; }; + + template + using __replace_first_arg_t = typename __replace_first_arg<_Tp, _Up>::type; + + template + using __make_not_void + = typename conditional::value, __undefined, _Tp>::type; + + + + + + template + struct pointer_traits + { + private: + template + using __element_type = typename _Tp::element_type; + + template + using __difference_type = typename _Tp::difference_type; + + template + using __rebind = typename _Tp::template rebind<_Up>; + + public: + + using pointer = _Ptr; + + + using element_type + = __detected_or_t_<__get_first_arg_t, __element_type, _Ptr>; + + + using difference_type + = __detected_or_t; + + + template + using rebind + = __detected_or_t_<__replace_first_arg_t, __rebind, _Ptr, _Up>; + + static _Ptr + pointer_to(__make_not_void& __e) + { return _Ptr::pointer_to(__e); } + + static_assert(!is_same::value, + "pointer type defines element_type or is like SomePointer"); + static_assert(!is_same, __undefined>::value, + "pointer type defines rebind or is like SomePointer"); + }; + + + + + + template + struct pointer_traits<_Tp*> + { + + typedef _Tp* pointer; + + typedef _Tp element_type; + + typedef ptrdiff_t difference_type; + + template + using rebind = _Up*; + + + + + + + static pointer + pointer_to(__make_not_void& __r) noexcept + { return std::addressof(__r); } + }; + + + template + using __ptr_rebind = typename pointer_traits<_Ptr>::template rebind<_Tp>; + + +} +# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 96 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + template + class reverse_iterator + : public iterator::iterator_category, + typename iterator_traits<_Iterator>::value_type, + typename iterator_traits<_Iterator>::difference_type, + typename iterator_traits<_Iterator>::pointer, + typename iterator_traits<_Iterator>::reference> + { + protected: + _Iterator current; + + typedef iterator_traits<_Iterator> __traits_type; + + public: + typedef _Iterator iterator_type; + typedef typename __traits_type::difference_type difference_type; + typedef typename __traits_type::pointer pointer; + typedef typename __traits_type::reference reference; + + + + + + + + reverse_iterator() : current() { } + + + + + explicit + reverse_iterator(iterator_type __x) : current(__x) { } + + + + + reverse_iterator(const reverse_iterator& __x) + : current(__x.current) { } + + + + + + template + reverse_iterator(const reverse_iterator<_Iter>& __x) + : current(__x.base()) { } + + + + + iterator_type + base() const + { return current; } +# 160 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + reference + operator*() const + { + _Iterator __tmp = current; + return *--__tmp; + } + + + + + + + pointer + operator->() const + { return &(operator*()); } + + + + + + + reverse_iterator& + operator++() + { + --current; + return *this; + } + + + + + + + reverse_iterator + operator++(int) + { + reverse_iterator __tmp = *this; + --current; + return __tmp; + } + + + + + + + reverse_iterator& + operator--() + { + ++current; + return *this; + } + + + + + + + reverse_iterator + operator--(int) + { + reverse_iterator __tmp = *this; + ++current; + return __tmp; + } + + + + + + + reverse_iterator + operator+(difference_type __n) const + { return reverse_iterator(current - __n); } + + + + + + + + reverse_iterator& + operator+=(difference_type __n) + { + current -= __n; + return *this; + } + + + + + + + reverse_iterator + operator-(difference_type __n) const + { return reverse_iterator(current + __n); } + + + + + + + + reverse_iterator& + operator-=(difference_type __n) + { + current += __n; + return *this; + } + + + + + + + reference + operator[](difference_type __n) const + { return *(*this + __n); } + }; +# 290 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + template + inline bool + operator==(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) + { return __x.base() == __y.base(); } + + template + inline bool + operator<(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) + { return __y.base() < __x.base(); } + + template + inline bool + operator!=(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) + { return !(__x == __y); } + + template + inline bool + operator>(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) + { return __y < __x; } + + template + inline bool + operator<=(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) + { return !(__y < __x); } + + template + inline bool + operator>=(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) + { return !(__x < __y); } + + template + + + + + + inline auto + operator-(const reverse_iterator<_Iterator>& __x, + const reverse_iterator<_Iterator>& __y) + -> decltype(__x.base() - __y.base()) + + { return __y.base() - __x.base(); } + + template + inline reverse_iterator<_Iterator> + operator+(typename reverse_iterator<_Iterator>::difference_type __n, + const reverse_iterator<_Iterator>& __x) + { return reverse_iterator<_Iterator>(__x.base() - __n); } + + + + template + inline bool + operator==(const reverse_iterator<_IteratorL>& __x, + const reverse_iterator<_IteratorR>& __y) + { return __x.base() == __y.base(); } + + template + inline bool + operator<(const reverse_iterator<_IteratorL>& __x, + const reverse_iterator<_IteratorR>& __y) + { return __y.base() < __x.base(); } + + template + inline bool + operator!=(const reverse_iterator<_IteratorL>& __x, + const reverse_iterator<_IteratorR>& __y) + { return !(__x == __y); } + + template + inline bool + operator>(const reverse_iterator<_IteratorL>& __x, + const reverse_iterator<_IteratorR>& __y) + { return __y < __x; } + + template + inline bool + operator<=(const reverse_iterator<_IteratorL>& __x, + const reverse_iterator<_IteratorR>& __y) + { return !(__y < __x); } + + template + inline bool + operator>=(const reverse_iterator<_IteratorL>& __x, + const reverse_iterator<_IteratorR>& __y) + { return !(__x < __y); } + + template + + + inline auto + operator-(const reverse_iterator<_IteratorL>& __x, + const reverse_iterator<_IteratorR>& __y) + -> decltype(__y.base() - __x.base()) + + + + + + { return __y.base() - __x.base(); } + + + + + template + inline reverse_iterator<_Iterator> + __make_reverse_iterator(_Iterator __i) + { return reverse_iterator<_Iterator>(__i); } + + + + + + + + template + inline reverse_iterator<_Iterator> + make_reverse_iterator(_Iterator __i) + { return reverse_iterator<_Iterator>(__i); } + + + + + template + auto + __niter_base(reverse_iterator<_Iterator> __it) + -> decltype(__make_reverse_iterator(__niter_base(__it.base()))) + { return __make_reverse_iterator(__niter_base(__it.base())); } + + template + struct __is_move_iterator > + : __is_move_iterator<_Iterator> + { }; + + template + auto + __miter_base(reverse_iterator<_Iterator> __it) + -> decltype(__make_reverse_iterator(__miter_base(__it.base()))) + { return __make_reverse_iterator(__miter_base(__it.base())); } +# 448 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + template + class back_insert_iterator + : public iterator + { + protected: + _Container* container; + + public: + + typedef _Container container_type; + + + explicit + back_insert_iterator(_Container& __x) + : container(std::__addressof(__x)) { } +# 483 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + back_insert_iterator& + operator=(const typename _Container::value_type& __value) + { + container->push_back(__value); + return *this; + } + + back_insert_iterator& + operator=(typename _Container::value_type&& __value) + { + container->push_back(std::move(__value)); + return *this; + } + + + + back_insert_iterator& + operator*() + { return *this; } + + + back_insert_iterator& + operator++() + { return *this; } + + + back_insert_iterator + operator++(int) + { return *this; } + }; +# 525 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + template + inline back_insert_iterator<_Container> + back_inserter(_Container& __x) + { return back_insert_iterator<_Container>(__x); } +# 540 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + template + class front_insert_iterator + : public iterator + { + protected: + _Container* container; + + public: + + typedef _Container container_type; + + + explicit front_insert_iterator(_Container& __x) + : container(std::__addressof(__x)) { } +# 574 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + front_insert_iterator& + operator=(const typename _Container::value_type& __value) + { + container->push_front(__value); + return *this; + } + + front_insert_iterator& + operator=(typename _Container::value_type&& __value) + { + container->push_front(std::move(__value)); + return *this; + } + + + + front_insert_iterator& + operator*() + { return *this; } + + + front_insert_iterator& + operator++() + { return *this; } + + + front_insert_iterator + operator++(int) + { return *this; } + }; +# 616 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + template + inline front_insert_iterator<_Container> + front_inserter(_Container& __x) + { return front_insert_iterator<_Container>(__x); } +# 635 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + template + class insert_iterator + : public iterator + { + protected: + _Container* container; + typename _Container::iterator iter; + + public: + + typedef _Container container_type; + + + + + + insert_iterator(_Container& __x, typename _Container::iterator __i) + : container(std::__addressof(__x)), iter(__i) {} +# 686 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + insert_iterator& + operator=(const typename _Container::value_type& __value) + { + iter = container->insert(iter, __value); + ++iter; + return *this; + } + + insert_iterator& + operator=(typename _Container::value_type&& __value) + { + iter = container->insert(iter, std::move(__value)); + ++iter; + return *this; + } + + + + insert_iterator& + operator*() + { return *this; } + + + insert_iterator& + operator++() + { return *this; } + + + insert_iterator& + operator++(int) + { return *this; } + }; +# 730 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + template + inline insert_iterator<_Container> + inserter(_Container& __x, _Iterator __i) + { + return insert_iterator<_Container>(__x, + typename _Container::iterator(__i)); + } + + + + +} + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ +# 754 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + using std::iterator_traits; + using std::iterator; + template + class __normal_iterator + { + protected: + _Iterator _M_current; + + typedef iterator_traits<_Iterator> __traits_type; + + public: + typedef _Iterator iterator_type; + typedef typename __traits_type::iterator_category iterator_category; + typedef typename __traits_type::value_type value_type; + typedef typename __traits_type::difference_type difference_type; + typedef typename __traits_type::reference reference; + typedef typename __traits_type::pointer pointer; + + constexpr __normal_iterator() noexcept + : _M_current(_Iterator()) { } + + explicit + __normal_iterator(const _Iterator& __i) noexcept + : _M_current(__i) { } + + + template + __normal_iterator(const __normal_iterator<_Iter, + typename __enable_if< + (std::__are_same<_Iter, typename _Container::pointer>::__value), + _Container>::__type>& __i) noexcept + : _M_current(__i.base()) { } + + + reference + operator*() const noexcept + { return *_M_current; } + + pointer + operator->() const noexcept + { return _M_current; } + + __normal_iterator& + operator++() noexcept + { + ++_M_current; + return *this; + } + + __normal_iterator + operator++(int) noexcept + { return __normal_iterator(_M_current++); } + + + __normal_iterator& + operator--() noexcept + { + --_M_current; + return *this; + } + + __normal_iterator + operator--(int) noexcept + { return __normal_iterator(_M_current--); } + + + reference + operator[](difference_type __n) const noexcept + { return _M_current[__n]; } + + __normal_iterator& + operator+=(difference_type __n) noexcept + { _M_current += __n; return *this; } + + __normal_iterator + operator+(difference_type __n) const noexcept + { return __normal_iterator(_M_current + __n); } + + __normal_iterator& + operator-=(difference_type __n) noexcept + { _M_current -= __n; return *this; } + + __normal_iterator + operator-(difference_type __n) const noexcept + { return __normal_iterator(_M_current - __n); } + + const _Iterator& + base() const noexcept + { return _M_current; } + }; +# 854 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + template + inline bool + operator==(const __normal_iterator<_IteratorL, _Container>& __lhs, + const __normal_iterator<_IteratorR, _Container>& __rhs) + noexcept + { return __lhs.base() == __rhs.base(); } + + template + inline bool + operator==(const __normal_iterator<_Iterator, _Container>& __lhs, + const __normal_iterator<_Iterator, _Container>& __rhs) + noexcept + { return __lhs.base() == __rhs.base(); } + + template + inline bool + operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs, + const __normal_iterator<_IteratorR, _Container>& __rhs) + noexcept + { return __lhs.base() != __rhs.base(); } + + template + inline bool + operator!=(const __normal_iterator<_Iterator, _Container>& __lhs, + const __normal_iterator<_Iterator, _Container>& __rhs) + noexcept + { return __lhs.base() != __rhs.base(); } + + + template + inline bool + operator<(const __normal_iterator<_IteratorL, _Container>& __lhs, + const __normal_iterator<_IteratorR, _Container>& __rhs) + noexcept + { return __lhs.base() < __rhs.base(); } + + template + inline bool + operator<(const __normal_iterator<_Iterator, _Container>& __lhs, + const __normal_iterator<_Iterator, _Container>& __rhs) + noexcept + { return __lhs.base() < __rhs.base(); } + + template + inline bool + operator>(const __normal_iterator<_IteratorL, _Container>& __lhs, + const __normal_iterator<_IteratorR, _Container>& __rhs) + noexcept + { return __lhs.base() > __rhs.base(); } + + template + inline bool + operator>(const __normal_iterator<_Iterator, _Container>& __lhs, + const __normal_iterator<_Iterator, _Container>& __rhs) + noexcept + { return __lhs.base() > __rhs.base(); } + + template + inline bool + operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs, + const __normal_iterator<_IteratorR, _Container>& __rhs) + noexcept + { return __lhs.base() <= __rhs.base(); } + + template + inline bool + operator<=(const __normal_iterator<_Iterator, _Container>& __lhs, + const __normal_iterator<_Iterator, _Container>& __rhs) + noexcept + { return __lhs.base() <= __rhs.base(); } + + template + inline bool + operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs, + const __normal_iterator<_IteratorR, _Container>& __rhs) + noexcept + { return __lhs.base() >= __rhs.base(); } + + template + inline bool + operator>=(const __normal_iterator<_Iterator, _Container>& __lhs, + const __normal_iterator<_Iterator, _Container>& __rhs) + noexcept + { return __lhs.base() >= __rhs.base(); } + + + + + + template + + + inline auto + operator-(const __normal_iterator<_IteratorL, _Container>& __lhs, + const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept + -> decltype(__lhs.base() - __rhs.base()) + + + + + + { return __lhs.base() - __rhs.base(); } + + template + inline typename __normal_iterator<_Iterator, _Container>::difference_type + operator-(const __normal_iterator<_Iterator, _Container>& __lhs, + const __normal_iterator<_Iterator, _Container>& __rhs) + noexcept + { return __lhs.base() - __rhs.base(); } + + template + inline __normal_iterator<_Iterator, _Container> + operator+(typename __normal_iterator<_Iterator, _Container>::difference_type + __n, const __normal_iterator<_Iterator, _Container>& __i) + noexcept + { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); } + + +} + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + _Iterator + __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it) + { return __it.base(); } + + +} + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 1006 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3 + template + class move_iterator + { + protected: + _Iterator _M_current; + + typedef iterator_traits<_Iterator> __traits_type; + typedef typename __traits_type::reference __base_ref; + + public: + typedef _Iterator iterator_type; + typedef typename __traits_type::iterator_category iterator_category; + typedef typename __traits_type::value_type value_type; + typedef typename __traits_type::difference_type difference_type; + + typedef _Iterator pointer; + + + typedef typename conditional::value, + typename remove_reference<__base_ref>::type&&, + __base_ref>::type reference; + + move_iterator() + : _M_current() { } + + explicit + move_iterator(iterator_type __i) + : _M_current(__i) { } + + template + move_iterator(const move_iterator<_Iter>& __i) + : _M_current(__i.base()) { } + + iterator_type + base() const + { return _M_current; } + + reference + operator*() const + { return static_cast(*_M_current); } + + pointer + operator->() const + { return _M_current; } + + move_iterator& + operator++() + { + ++_M_current; + return *this; + } + + move_iterator + operator++(int) + { + move_iterator __tmp = *this; + ++_M_current; + return __tmp; + } + + move_iterator& + operator--() + { + --_M_current; + return *this; + } + + move_iterator + operator--(int) + { + move_iterator __tmp = *this; + --_M_current; + return __tmp; + } + + move_iterator + operator+(difference_type __n) const + { return move_iterator(_M_current + __n); } + + move_iterator& + operator+=(difference_type __n) + { + _M_current += __n; + return *this; + } + + move_iterator + operator-(difference_type __n) const + { return move_iterator(_M_current - __n); } + + move_iterator& + operator-=(difference_type __n) + { + _M_current -= __n; + return *this; + } + + reference + operator[](difference_type __n) const + { return std::move(_M_current[__n]); } + }; + + + + + template + inline bool + operator==(const move_iterator<_IteratorL>& __x, + const move_iterator<_IteratorR>& __y) + { return __x.base() == __y.base(); } + + template + inline bool + operator==(const move_iterator<_Iterator>& __x, + const move_iterator<_Iterator>& __y) + { return __x.base() == __y.base(); } + + template + inline bool + operator!=(const move_iterator<_IteratorL>& __x, + const move_iterator<_IteratorR>& __y) + { return !(__x == __y); } + + template + inline bool + operator!=(const move_iterator<_Iterator>& __x, + const move_iterator<_Iterator>& __y) + { return !(__x == __y); } + + template + inline bool + operator<(const move_iterator<_IteratorL>& __x, + const move_iterator<_IteratorR>& __y) + { return __x.base() < __y.base(); } + + template + inline bool + operator<(const move_iterator<_Iterator>& __x, + const move_iterator<_Iterator>& __y) + { return __x.base() < __y.base(); } + + template + inline bool + operator<=(const move_iterator<_IteratorL>& __x, + const move_iterator<_IteratorR>& __y) + { return !(__y < __x); } + + template + inline bool + operator<=(const move_iterator<_Iterator>& __x, + const move_iterator<_Iterator>& __y) + { return !(__y < __x); } + + template + inline bool + operator>(const move_iterator<_IteratorL>& __x, + const move_iterator<_IteratorR>& __y) + { return __y < __x; } + + template + inline bool + operator>(const move_iterator<_Iterator>& __x, + const move_iterator<_Iterator>& __y) + { return __y < __x; } + + template + inline bool + operator>=(const move_iterator<_IteratorL>& __x, + const move_iterator<_IteratorR>& __y) + { return !(__x < __y); } + + template + inline bool + operator>=(const move_iterator<_Iterator>& __x, + const move_iterator<_Iterator>& __y) + { return !(__x < __y); } + + + template + inline auto + operator-(const move_iterator<_IteratorL>& __x, + const move_iterator<_IteratorR>& __y) + -> decltype(__x.base() - __y.base()) + { return __x.base() - __y.base(); } + + template + inline auto + operator-(const move_iterator<_Iterator>& __x, + const move_iterator<_Iterator>& __y) + -> decltype(__x.base() - __y.base()) + { return __x.base() - __y.base(); } + + template + inline move_iterator<_Iterator> + operator+(typename move_iterator<_Iterator>::difference_type __n, + const move_iterator<_Iterator>& __x) + { return __x + __n; } + + template + inline move_iterator<_Iterator> + make_move_iterator(_Iterator __i) + { return move_iterator<_Iterator>(__i); } + + template::value_type>::value, + _Iterator, move_iterator<_Iterator>>::type> + inline _ReturnType + __make_move_if_noexcept_iterator(_Iterator __i) + { return _ReturnType(__i); } + + + + template::value, + const _Tp*, move_iterator<_Tp*>>::type> + inline _ReturnType + __make_move_if_noexcept_iterator(_Tp* __i) + { return _ReturnType(__i); } + + + + template + auto + __niter_base(move_iterator<_Iterator> __it) + -> decltype(make_move_iterator(__niter_base(__it.base()))) + { return make_move_iterator(__niter_base(__it.base())); } + + template + struct __is_move_iterator > + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template + auto + __miter_base(move_iterator<_Iterator> __it) + -> decltype(__miter_base(__it.base())) + { return __miter_base(__it.base()); } + + +} +# 64 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 1 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 1 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iosfwd" 1 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iosfwd" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stringfwd.h" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stringfwd.h" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/memoryfwd.h" 1 3 +# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/memoryfwd.h" 3 + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/memoryfwd.h" 3 + template + class allocator; + + template<> + class allocator; + + + template + struct uses_allocator; + + + + +} +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stringfwd.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 52 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stringfwd.h" 3 + template + struct char_traits; + + template<> struct char_traits; + + + template<> struct char_traits; + + + + + template<> struct char_traits; + template<> struct char_traits; + + +namespace __cxx11 { + + template, + typename _Alloc = allocator<_CharT> > + class basic_string; + + + typedef basic_string string; + + + + typedef basic_string wstring; + + + + + + typedef basic_string u16string; + + + typedef basic_string u32string; + + +} + + + + +} +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iosfwd" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 1 3 +# 39 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3 + + + + +# 1 "/usr/include/wchar.h" 1 3 4 +# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 2 3 +# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3 +namespace std +{ + using ::mbstate_t; +} +# 135 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + using ::wint_t; + + using ::btowc; + using ::fgetwc; + using ::fgetws; + using ::fputwc; + using ::fputws; + using ::fwide; + using ::fwprintf; + using ::fwscanf; + using ::getwc; + using ::getwchar; + using ::mbrlen; + using ::mbrtowc; + using ::mbsinit; + using ::mbsrtowcs; + using ::putwc; + using ::putwchar; + + using ::swprintf; + + using ::swscanf; + using ::ungetwc; + using ::vfwprintf; + + using ::vfwscanf; + + + using ::vswprintf; + + + using ::vswscanf; + + using ::vwprintf; + + using ::vwscanf; + + using ::wcrtomb; + using ::wcscat; + using ::wcscmp; + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; + using ::wcsftime; + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; + using ::wcsncpy; + using ::wcsrtombs; + using ::wcsspn; + using ::wcstod; + + using ::wcstof; + + using ::wcstok; + using ::wcstol; + using ::wcstoul; + using ::wcsxfrm; + using ::wctob; + using ::wmemcmp; + using ::wmemcpy; + using ::wmemmove; + using ::wmemset; + using ::wprintf; + using ::wscanf; + using ::wcschr; + using ::wcspbrk; + using ::wcsrchr; + using ::wcsstr; + using ::wmemchr; + + + inline wchar_t* + wcschr(wchar_t* __p, wchar_t __c) + { return wcschr(const_cast(__p), __c); } + + inline wchar_t* + wcspbrk(wchar_t* __s1, const wchar_t* __s2) + { return wcspbrk(const_cast(__s1), __s2); } + + inline wchar_t* + wcsrchr(wchar_t* __p, wchar_t __c) + { return wcsrchr(const_cast(__p), __c); } + + inline wchar_t* + wcsstr(wchar_t* __s1, const wchar_t* __s2) + { return wcsstr(const_cast(__s1), __s2); } + + inline wchar_t* + wmemchr(wchar_t* __p, wchar_t __c, size_t __n) + { return wmemchr(const_cast(__p), __c, __n); } + + + +} + + + + + + + +namespace __gnu_cxx +{ + + + + + + using ::wcstold; +# 257 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3 + using ::wcstoll; + using ::wcstoull; + +} + +namespace std +{ + using ::__gnu_cxx::wcstold; + using ::__gnu_cxx::wcstoll; + using ::__gnu_cxx::wcstoull; +} +# 277 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3 +namespace std +{ + + using std::wcstof; + + + using std::vfwscanf; + + + using std::vswscanf; + + + using std::vwscanf; + + + + using std::wcstold; + using std::wcstoll; + using std::wcstoull; + +} +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 2 3 +# 68 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 88 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3 + typedef long streamoff; +# 98 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3 + typedef ptrdiff_t streamsize; +# 111 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3 + template + class fpos + { + private: + streamoff _M_off; + _StateT _M_state; + + public: + + + + + fpos() + : _M_off(0), _M_state() { } +# 133 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3 + fpos(streamoff __off) + : _M_off(__off), _M_state() { } + + + operator streamoff() const { return _M_off; } + + + void + state(_StateT __st) + { _M_state = __st; } + + + _StateT + state() const + { return _M_state; } + + + + + + fpos& + operator+=(streamoff __off) + { + _M_off += __off; + return *this; + } + + + + + + fpos& + operator-=(streamoff __off) + { + _M_off -= __off; + return *this; + } + + + + + + + + fpos + operator+(streamoff __off) const + { + fpos __pos(*this); + __pos += __off; + return __pos; + } + + + + + + + + fpos + operator-(streamoff __off) const + { + fpos __pos(*this); + __pos -= __off; + return __pos; + } + + + + + + + streamoff + operator-(const fpos& __other) const + { return _M_off - __other._M_off; } + }; + + + + + + + template + inline bool + operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs) + { return streamoff(__lhs) == streamoff(__rhs); } + + template + inline bool + operator!=(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs) + { return streamoff(__lhs) != streamoff(__rhs); } + + + + + + typedef fpos streampos; + + typedef fpos wstreampos; + + + + typedef fpos u16streampos; + + typedef fpos u32streampos; + + + +} +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iosfwd" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 74 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iosfwd" 3 + class ios_base; + + template > + class basic_ios; + + template > + class basic_streambuf; + + template > + class basic_istream; + + template > + class basic_ostream; + + template > + class basic_iostream; + + +namespace __cxx11 { + + template, + typename _Alloc = allocator<_CharT> > + class basic_stringbuf; + + template, + typename _Alloc = allocator<_CharT> > + class basic_istringstream; + + template, + typename _Alloc = allocator<_CharT> > + class basic_ostringstream; + + template, + typename _Alloc = allocator<_CharT> > + class basic_stringstream; + +} + + template > + class basic_filebuf; + + template > + class basic_ifstream; + + template > + class basic_ofstream; + + template > + class basic_fstream; + + template > + class istreambuf_iterator; + + template > + class ostreambuf_iterator; + + + + typedef basic_ios ios; + + + typedef basic_streambuf streambuf; + + + typedef basic_istream istream; + + + typedef basic_ostream ostream; + + + typedef basic_iostream iostream; + + + typedef basic_stringbuf stringbuf; + + + typedef basic_istringstream istringstream; + + + typedef basic_ostringstream ostringstream; + + + typedef basic_stringstream stringstream; + + + typedef basic_filebuf filebuf; + + + typedef basic_ifstream ifstream; + + + typedef basic_ofstream ofstream; + + + typedef basic_fstream fstream; + + + + typedef basic_ios wios; + + + typedef basic_streambuf wstreambuf; + + + typedef basic_istream wistream; + + + typedef basic_ostream wostream; + + + typedef basic_iostream wiostream; + + + typedef basic_stringbuf wstringbuf; + + + typedef basic_istringstream wistringstream; + + + typedef basic_ostringstream wostringstream; + + + typedef basic_stringstream wstringstream; + + + typedef basic_filebuf wfilebuf; + + + typedef basic_ifstream wifstream; + + + typedef basic_ofstream wofstream; + + + typedef basic_fstream wfstream; + + + + +} +# 39 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 1 3 +# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functexcept.h" 1 3 +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functexcept.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + void + __throw_bad_exception(void) __attribute__((__noreturn__)); + + + void + __throw_bad_alloc(void) __attribute__((__noreturn__)); + + + void + __throw_bad_cast(void) __attribute__((__noreturn__)); + + void + __throw_bad_typeid(void) __attribute__((__noreturn__)); + + + void + __throw_logic_error(const char*) __attribute__((__noreturn__)); + + void + __throw_domain_error(const char*) __attribute__((__noreturn__)); + + void + __throw_invalid_argument(const char*) __attribute__((__noreturn__)); + + void + __throw_length_error(const char*) __attribute__((__noreturn__)); + + void + __throw_out_of_range(const char*) __attribute__((__noreturn__)); + + void + __throw_out_of_range_fmt(const char*, ...) __attribute__((__noreturn__)) + __attribute__((__format__(__gnu_printf__, 1, 2))); + + void + __throw_runtime_error(const char*) __attribute__((__noreturn__)); + + void + __throw_range_error(const char*) __attribute__((__noreturn__)); + + void + __throw_overflow_error(const char*) __attribute__((__noreturn__)); + + void + __throw_underflow_error(const char*) __attribute__((__noreturn__)); + + + void + __throw_ios_failure(const char*) __attribute__((__noreturn__)); + + void + __throw_system_error(int) __attribute__((__noreturn__)); + + void + __throw_future_error(int) __attribute__((__noreturn__)); + + + void + __throw_bad_function_call() __attribute__((__noreturn__)); + + +} +# 61 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/numeric_traits.h" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/numeric_traits.h" 3 + + + + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ +# 54 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/numeric_traits.h" 3 + template + struct __numeric_traits_integer + { + + static const _Value __min = (((_Value)(-1) < 0) ? (_Value)1 << (sizeof(_Value) * 8 - ((_Value)(-1) < 0)) : (_Value)0); + static const _Value __max = (((_Value)(-1) < 0) ? (((((_Value)1 << ((sizeof(_Value) * 8 - ((_Value)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(_Value)0); + + + + static const bool __is_signed = ((_Value)(-1) < 0); + static const int __digits = (sizeof(_Value) * 8 - ((_Value)(-1) < 0)); + }; + + template + const _Value __numeric_traits_integer<_Value>::__min; + + template + const _Value __numeric_traits_integer<_Value>::__max; + + template + const bool __numeric_traits_integer<_Value>::__is_signed; + + template + const int __numeric_traits_integer<_Value>::__digits; +# 99 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/numeric_traits.h" 3 + template + struct __numeric_traits_floating + { + + static const int __max_digits10 = (2 + (std::__are_same<_Value, float>::__value ? 24 : std::__are_same<_Value, double>::__value ? 53 : 64) * 643L / 2136); + + + static const bool __is_signed = true; + static const int __digits10 = (std::__are_same<_Value, float>::__value ? 6 : std::__are_same<_Value, double>::__value ? 15 : 18); + static const int __max_exponent10 = (std::__are_same<_Value, float>::__value ? 38 : std::__are_same<_Value, double>::__value ? 308 : 4932); + }; + + template + const int __numeric_traits_floating<_Value>::__max_digits10; + + template + const bool __numeric_traits_floating<_Value>::__is_signed; + + template + const int __numeric_traits_floating<_Value>::__digits10; + + template + const int __numeric_traits_floating<_Value>::__max_exponent10; + + template + struct __numeric_traits + : public __conditional_type::__value, + __numeric_traits_integer<_Value>, + __numeric_traits_floating<_Value> >::__type + { }; + + +} +# 64 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 1 3 +# 65 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 76 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3 + struct piecewise_construct_t { explicit piecewise_construct_t() = default; }; + + + constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); + + + template + class tuple; + + template + struct _Index_tuple; + + + + + + + template + struct _PCC + { + template + static constexpr bool _ConstructiblePair() + { + return __and_, + is_constructible<_T2, const _U2&>>::value; + } + + template + static constexpr bool _ImplicitlyConvertiblePair() + { + return __and_, + is_convertible>::value; + } + + template + static constexpr bool _MoveConstructiblePair() + { + return __and_, + is_constructible<_T2, _U2&&>>::value; + } + + template + static constexpr bool _ImplicitlyMoveConvertiblePair() + { + return __and_, + is_convertible<_U2&&, _T2>>::value; + } + + template + static constexpr bool _CopyMovePair() + { + using __do_converts = __and_, + is_convertible<_U2&&, _T2>>; + using __converts = typename conditional<__implicit, + __do_converts, + __not_<__do_converts>>::type; + return __and_, + is_constructible<_T2, _U2&&>, + __converts + >::value; + } + + template + static constexpr bool _MoveCopyPair() + { + using __do_converts = __and_, + is_convertible>; + using __converts = typename conditional<__implicit, + __do_converts, + __not_<__do_converts>>::type; + return __and_, + is_constructible<_T2, const _U2&&>, + __converts + >::value; + } + }; + + template + struct _PCC + { + template + static constexpr bool _ConstructiblePair() + { + return false; + } + + template + static constexpr bool _ImplicitlyConvertiblePair() + { + return false; + } + + template + static constexpr bool _MoveConstructiblePair() + { + return false; + } + + template + static constexpr bool _ImplicitlyMoveConvertiblePair() + { + return false; + } + }; +# 189 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3 + template + struct pair + { + typedef _T1 first_type; + typedef _T2 second_type; + + _T1 first; + _T2 second; + + + + + + + template , + __is_implicitly_default_constructible<_U2>> + ::value, bool>::type = true> + + constexpr pair() + : first(), second() { } + + + template , + is_default_constructible<_U2>, + __not_< + __and_<__is_implicitly_default_constructible<_U1>, + __is_implicitly_default_constructible<_U2>>>> + ::value, bool>::type = false> + explicit constexpr pair() + : first(), second() { } +# 233 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3 + using _PCCP = _PCC; + + template() + && _PCCP::template + _ImplicitlyConvertiblePair<_U1, _U2>(), + bool>::type=true> + constexpr pair(const _T1& __a, const _T2& __b) + : first(__a), second(__b) { } + + template() + && !_PCCP::template + _ImplicitlyConvertiblePair<_U1, _U2>(), + bool>::type=false> + explicit constexpr pair(const _T1& __a, const _T2& __b) + : first(__a), second(__b) { } +# 261 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3 + template + using _PCCFP = _PCC::value + || !is_same<_T2, _U2>::value, + _T1, _T2>; + + template::template + _ConstructiblePair<_U1, _U2>() + && _PCCFP<_U1, _U2>::template + _ImplicitlyConvertiblePair<_U1, _U2>(), + bool>::type=true> + constexpr pair(const pair<_U1, _U2>& __p) + : first(__p.first), second(__p.second) { } + + template::template + _ConstructiblePair<_U1, _U2>() + && !_PCCFP<_U1, _U2>::template + _ImplicitlyConvertiblePair<_U1, _U2>(), + bool>::type=false> + explicit constexpr pair(const pair<_U1, _U2>& __p) + : first(__p.first), second(__p.second) { } + + constexpr pair(const pair&) = default; + constexpr pair(pair&&) = default; + + + template(), + bool>::type=true> + constexpr pair(_U1&& __x, const _T2& __y) + : first(std::forward<_U1>(__x)), second(__y) { } + + template(), + bool>::type=false> + explicit constexpr pair(_U1&& __x, const _T2& __y) + : first(std::forward<_U1>(__x)), second(__y) { } + + template(), + bool>::type=true> + constexpr pair(const _T1& __x, _U2&& __y) + : first(__x), second(std::forward<_U2>(__y)) { } + + template(), + bool>::type=false> + explicit pair(const _T1& __x, _U2&& __y) + : first(__x), second(std::forward<_U2>(__y)) { } + + template() + && _PCCP::template + _ImplicitlyMoveConvertiblePair<_U1, _U2>(), + bool>::type=true> + constexpr pair(_U1&& __x, _U2&& __y) + : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { } + + template() + && !_PCCP::template + _ImplicitlyMoveConvertiblePair<_U1, _U2>(), + bool>::type=false> + explicit constexpr pair(_U1&& __x, _U2&& __y) + : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { } + + + template::template + _MoveConstructiblePair<_U1, _U2>() + && _PCCFP<_U1, _U2>::template + _ImplicitlyMoveConvertiblePair<_U1, _U2>(), + bool>::type=true> + constexpr pair(pair<_U1, _U2>&& __p) + : first(std::forward<_U1>(__p.first)), + second(std::forward<_U2>(__p.second)) { } + + template::template + _MoveConstructiblePair<_U1, _U2>() + && !_PCCFP<_U1, _U2>::template + _ImplicitlyMoveConvertiblePair<_U1, _U2>(), + bool>::type=false> + explicit constexpr pair(pair<_U1, _U2>&& __p) + : first(std::forward<_U1>(__p.first)), + second(std::forward<_U2>(__p.second)) { } + + template + pair(piecewise_construct_t, tuple<_Args1...>, tuple<_Args2...>); + + pair& + operator=(typename conditional< + __and_, + is_copy_assignable<_T2>>::value, + const pair&, const __nonesuch&>::type __p) + { + first = __p.first; + second = __p.second; + return *this; + } + + pair& + operator=(typename conditional< + __not_<__and_, + is_copy_assignable<_T2>>>::value, + const pair&, const __nonesuch&>::type __p) = delete; + + pair& + operator=(typename conditional< + __and_, + is_move_assignable<_T2>>::value, + pair&&, __nonesuch&&>::type __p) + noexcept(__and_, + is_nothrow_move_assignable<_T2>>::value) + { + first = std::forward(__p.first); + second = std::forward(__p.second); + return *this; + } + + template + typename enable_if<__and_, + is_assignable<_T2&, const _U2&>>::value, + pair&>::type + operator=(const pair<_U1, _U2>& __p) + { + first = __p.first; + second = __p.second; + return *this; + } + + template + typename enable_if<__and_, + is_assignable<_T2&, _U2&&>>::value, + pair&>::type + operator=(pair<_U1, _U2>&& __p) + { + first = std::forward<_U1>(__p.first); + second = std::forward<_U2>(__p.second); + return *this; + } + + void + swap(pair& __p) + noexcept(__is_nothrow_swappable<_T1>::value + && __is_nothrow_swappable<_T2>::value) + { + using std::swap; + swap(first, __p.first); + swap(second, __p.second); + } + + private: + template + pair(tuple<_Args1...>&, tuple<_Args2...>&, + _Index_tuple<_Indexes1...>, _Index_tuple<_Indexes2...>); + + }; + + + template + inline constexpr bool + operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return __x.first == __y.first && __x.second == __y.second; } + + + template + inline constexpr bool + operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return __x.first < __y.first + || (!(__y.first < __x.first) && __x.second < __y.second); } + + + template + inline constexpr bool + operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return !(__x == __y); } + + + template + inline constexpr bool + operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return __y < __x; } + + + template + inline constexpr bool + operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return !(__y < __x); } + + + template + inline constexpr bool + operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return !(__x < __y); } + + + + + + template + inline void + swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) + noexcept(noexcept(__x.swap(__y))) + { __x.swap(__y); } +# 490 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3 + template + constexpr pair::__type, + typename __decay_and_strip<_T2>::__type> + make_pair(_T1&& __x, _T2&& __y) + { + typedef typename __decay_and_strip<_T1>::__type __ds_type1; + typedef typename __decay_and_strip<_T2>::__type __ds_type2; + typedef pair<__ds_type1, __ds_type2> __pair_type; + return __pair_type(std::forward<_T1>(__x), std::forward<_T2>(__y)); + } +# 510 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3 +} +# 65 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3 + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/debug/debug.h" 1 3 +# 48 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/debug/debug.h" 3 +namespace std +{ + namespace __debug { } +} + + + + +namespace __gnu_debug +{ + using namespace std::__debug; +} +# 70 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/predefined_ops.h" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/predefined_ops.h" 3 +namespace __gnu_cxx +{ +namespace __ops +{ + struct _Iter_less_iter + { + template + constexpr + bool + operator()(_Iterator1 __it1, _Iterator2 __it2) const + { return *__it1 < *__it2; } + }; + constexpr + inline _Iter_less_iter + __iter_less_iter() + { return _Iter_less_iter(); } + + struct _Iter_less_val + { + template + bool + operator()(_Iterator __it, _Value& __val) const + { return *__it < __val; } + }; + + inline _Iter_less_val + __iter_less_val() + { return _Iter_less_val(); } + + inline _Iter_less_val + __iter_comp_val(_Iter_less_iter) + { return _Iter_less_val(); } + + struct _Val_less_iter + { + template + bool + operator()(_Value& __val, _Iterator __it) const + { return __val < *__it; } + }; + + inline _Val_less_iter + __val_less_iter() + { return _Val_less_iter(); } + + inline _Val_less_iter + __val_comp_iter(_Iter_less_iter) + { return _Val_less_iter(); } + + struct _Iter_equal_to_iter + { + template + bool + operator()(_Iterator1 __it1, _Iterator2 __it2) const + { return *__it1 == *__it2; } + }; + + inline _Iter_equal_to_iter + __iter_equal_to_iter() + { return _Iter_equal_to_iter(); } + + struct _Iter_equal_to_val + { + template + bool + operator()(_Iterator __it, _Value& __val) const + { return *__it == __val; } + }; + + inline _Iter_equal_to_val + __iter_equal_to_val() + { return _Iter_equal_to_val(); } + + inline _Iter_equal_to_val + __iter_comp_val(_Iter_equal_to_iter) + { return _Iter_equal_to_val(); } + + template + struct _Iter_comp_iter + { + _Compare _M_comp; + constexpr + _Iter_comp_iter(_Compare __comp) + : _M_comp(__comp) + { } + + template + constexpr + bool + operator()(_Iterator1 __it1, _Iterator2 __it2) + { return bool(_M_comp(*__it1, *__it2)); } + }; + + template + constexpr + inline _Iter_comp_iter<_Compare> + __iter_comp_iter(_Compare __comp) + { return _Iter_comp_iter<_Compare>(__comp); } + + template + struct _Iter_comp_val + { + _Compare _M_comp; + + _Iter_comp_val(_Compare __comp) + : _M_comp(__comp) + { } + + template + bool + operator()(_Iterator __it, _Value& __val) + { return bool(_M_comp(*__it, __val)); } + }; + + template + inline _Iter_comp_val<_Compare> + __iter_comp_val(_Compare __comp) + { return _Iter_comp_val<_Compare>(__comp); } + + template + inline _Iter_comp_val<_Compare> + __iter_comp_val(_Iter_comp_iter<_Compare> __comp) + { return _Iter_comp_val<_Compare>(__comp._M_comp); } + + template + struct _Val_comp_iter + { + _Compare _M_comp; + + _Val_comp_iter(_Compare __comp) + : _M_comp(__comp) + { } + + template + bool + operator()(_Value& __val, _Iterator __it) + { return bool(_M_comp(__val, *__it)); } + }; + + template + inline _Val_comp_iter<_Compare> + __val_comp_iter(_Compare __comp) + { return _Val_comp_iter<_Compare>(__comp); } + + template + inline _Val_comp_iter<_Compare> + __val_comp_iter(_Iter_comp_iter<_Compare> __comp) + { return _Val_comp_iter<_Compare>(__comp._M_comp); } + + template + struct _Iter_equals_val + { + _Value& _M_value; + + _Iter_equals_val(_Value& __value) + : _M_value(__value) + { } + + template + bool + operator()(_Iterator __it) + { return *__it == _M_value; } + }; + + template + inline _Iter_equals_val<_Value> + __iter_equals_val(_Value& __val) + { return _Iter_equals_val<_Value>(__val); } + + template + struct _Iter_equals_iter + { + typename std::iterator_traits<_Iterator1>::reference _M_ref; + + _Iter_equals_iter(_Iterator1 __it1) + : _M_ref(*__it1) + { } + + template + bool + operator()(_Iterator2 __it2) + { return *__it2 == _M_ref; } + }; + + template + inline _Iter_equals_iter<_Iterator> + __iter_comp_iter(_Iter_equal_to_iter, _Iterator __it) + { return _Iter_equals_iter<_Iterator>(__it); } + + template + struct _Iter_pred + { + _Predicate _M_pred; + + _Iter_pred(_Predicate __pred) + : _M_pred(__pred) + { } + + template + bool + operator()(_Iterator __it) + { return bool(_M_pred(*__it)); } + }; + + template + inline _Iter_pred<_Predicate> + __pred_iter(_Predicate __pred) + { return _Iter_pred<_Predicate>(__pred); } + + template + struct _Iter_comp_to_val + { + _Compare _M_comp; + _Value& _M_value; + + _Iter_comp_to_val(_Compare __comp, _Value& __value) + : _M_comp(__comp), _M_value(__value) + { } + + template + bool + operator()(_Iterator __it) + { return bool(_M_comp(*__it, _M_value)); } + }; + + template + _Iter_comp_to_val<_Compare, _Value> + __iter_comp_val(_Compare __comp, _Value &__val) + { return _Iter_comp_to_val<_Compare, _Value>(__comp, __val); } + + template + struct _Iter_comp_to_iter + { + _Compare _M_comp; + typename std::iterator_traits<_Iterator1>::reference _M_ref; + + _Iter_comp_to_iter(_Compare __comp, _Iterator1 __it1) + : _M_comp(__comp), _M_ref(*__it1) + { } + + template + bool + operator()(_Iterator2 __it2) + { return bool(_M_comp(*__it2, _M_ref)); } + }; + + template + inline _Iter_comp_to_iter<_Compare, _Iterator> + __iter_comp_iter(_Iter_comp_iter<_Compare> __comp, _Iterator __it) + { return _Iter_comp_to_iter<_Compare, _Iterator>(__comp._M_comp, __it); } + + template + struct _Iter_negate + { + _Predicate _M_pred; + + _Iter_negate(_Predicate __pred) + : _M_pred(__pred) + { } + + template + bool + operator()(_Iterator __it) + { return !bool(_M_pred(*__it)); } + }; + + template + inline _Iter_negate<_Predicate> + __negate(_Iter_pred<_Predicate> __pred) + { return _Iter_negate<_Predicate>(__pred._M_pred); } + +} +} +# 72 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 118 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline void + iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) + { +# 148 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + swap(*__a, *__b); + + } +# 164 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + _ForwardIterator2 + swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2) + { + + + + + + ; + + for (; __first1 != __last1; ++__first1, (void)++__first2) + std::iter_swap(__first1, __first2); + return __first2; + } +# 192 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + constexpr + inline const _Tp& + min(const _Tp& __a, const _Tp& __b) + { + + + + if (__b < __a) + return __b; + return __a; + } +# 216 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + constexpr + inline const _Tp& + max(const _Tp& __a, const _Tp& __b) + { + + + + if (__a < __b) + return __b; + return __a; + } +# 240 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + constexpr + inline const _Tp& + min(const _Tp& __a, const _Tp& __b, _Compare __comp) + { + + if (__comp(__b, __a)) + return __b; + return __a; + } +# 262 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + constexpr + inline const _Tp& + max(const _Tp& __a, const _Tp& __b, _Compare __comp) + { + + if (__comp(__a, __b)) + return __b; + return __a; + } + + + + template + inline _Iterator + __niter_base(_Iterator __it) + { return __it; } + + + + + + + + template + struct __copy_move + { + template + static _OI + __copy_m(_II __first, _II __last, _OI __result) + { + for (; __first != __last; ++__result, (void)++__first) + *__result = *__first; + return __result; + } + }; + + + template + struct __copy_move + { + template + static _OI + __copy_m(_II __first, _II __last, _OI __result) + { + for (; __first != __last; ++__result, (void)++__first) + *__result = std::move(*__first); + return __result; + } + }; + + + template<> + struct __copy_move + { + template + static _OI + __copy_m(_II __first, _II __last, _OI __result) + { + typedef typename iterator_traits<_II>::difference_type _Distance; + for(_Distance __n = __last - __first; __n > 0; --__n) + { + *__result = *__first; + ++__first; + ++__result; + } + return __result; + } + }; + + + template<> + struct __copy_move + { + template + static _OI + __copy_m(_II __first, _II __last, _OI __result) + { + typedef typename iterator_traits<_II>::difference_type _Distance; + for(_Distance __n = __last - __first; __n > 0; --__n) + { + *__result = std::move(*__first); + ++__first; + ++__result; + } + return __result; + } + }; + + + template + struct __copy_move<_IsMove, true, random_access_iterator_tag> + { + template + static _Tp* + __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result) + { + + using __assignable = conditional<_IsMove, + is_move_assignable<_Tp>, + is_copy_assignable<_Tp>>; + + static_assert( __assignable::type::value, "type is not assignable" ); + + const ptrdiff_t _Num = __last - __first; + if (_Num) + __builtin_memmove(__result, __first, sizeof(_Tp) * _Num); + return __result + _Num; + } + }; + + template + inline _OI + __copy_move_a(_II __first, _II __last, _OI __result) + { + typedef typename iterator_traits<_II>::value_type _ValueTypeI; + typedef typename iterator_traits<_OI>::value_type _ValueTypeO; + typedef typename iterator_traits<_II>::iterator_category _Category; + const bool __simple = (__is_trivial(_ValueTypeI) + && __is_pointer<_II>::__value + && __is_pointer<_OI>::__value + && __are_same<_ValueTypeI, _ValueTypeO>::__value); + + return std::__copy_move<_IsMove, __simple, + _Category>::__copy_m(__first, __last, __result); + } + + + + template + struct char_traits; + + template + class istreambuf_iterator; + + template + class ostreambuf_iterator; + + template + typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, + ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type + __copy_move_a2(_CharT*, _CharT*, + ostreambuf_iterator<_CharT, char_traits<_CharT> >); + + template + typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, + ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type + __copy_move_a2(const _CharT*, const _CharT*, + ostreambuf_iterator<_CharT, char_traits<_CharT> >); + + template + typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, + _CharT*>::__type + __copy_move_a2(istreambuf_iterator<_CharT, char_traits<_CharT> >, + istreambuf_iterator<_CharT, char_traits<_CharT> >, _CharT*); + + template + inline _OI + __copy_move_a2(_II __first, _II __last, _OI __result) + { + return _OI(std::__copy_move_a<_IsMove>(std::__niter_base(__first), + std::__niter_base(__last), + std::__niter_base(__result))); + } +# 444 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline _OI + copy(_II __first, _II __last, _OI __result) + { + + + + + ; + + return (std::__copy_move_a2<__is_move_iterator<_II>::__value> + (std::__miter_base(__first), std::__miter_base(__last), + __result)); + } +# 477 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline _OI + move(_II __first, _II __last, _OI __result) + { + + + + + ; + + return std::__copy_move_a2(std::__miter_base(__first), + std::__miter_base(__last), __result); + } + + + + + + + template + struct __copy_move_backward + { + template + static _BI2 + __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result) + { + while (__first != __last) + *--__result = *--__last; + return __result; + } + }; + + + template + struct __copy_move_backward + { + template + static _BI2 + __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result) + { + while (__first != __last) + *--__result = std::move(*--__last); + return __result; + } + }; + + + template<> + struct __copy_move_backward + { + template + static _BI2 + __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result) + { + typename iterator_traits<_BI1>::difference_type __n; + for (__n = __last - __first; __n > 0; --__n) + *--__result = *--__last; + return __result; + } + }; + + + template<> + struct __copy_move_backward + { + template + static _BI2 + __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result) + { + typename iterator_traits<_BI1>::difference_type __n; + for (__n = __last - __first; __n > 0; --__n) + *--__result = std::move(*--__last); + return __result; + } + }; + + + template + struct __copy_move_backward<_IsMove, true, random_access_iterator_tag> + { + template + static _Tp* + __copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result) + { + + using __assignable = conditional<_IsMove, + is_move_assignable<_Tp>, + is_copy_assignable<_Tp>>; + + static_assert( __assignable::type::value, "type is not assignable" ); + + const ptrdiff_t _Num = __last - __first; + if (_Num) + __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num); + return __result - _Num; + } + }; + + template + inline _BI2 + __copy_move_backward_a(_BI1 __first, _BI1 __last, _BI2 __result) + { + typedef typename iterator_traits<_BI1>::value_type _ValueType1; + typedef typename iterator_traits<_BI2>::value_type _ValueType2; + typedef typename iterator_traits<_BI1>::iterator_category _Category; + const bool __simple = (__is_trivial(_ValueType1) + && __is_pointer<_BI1>::__value + && __is_pointer<_BI2>::__value + && __are_same<_ValueType1, _ValueType2>::__value); + + return std::__copy_move_backward<_IsMove, __simple, + _Category>::__copy_move_b(__first, + __last, + __result); + } + + template + inline _BI2 + __copy_move_backward_a2(_BI1 __first, _BI1 __last, _BI2 __result) + { + return _BI2(std::__copy_move_backward_a<_IsMove> + (std::__niter_base(__first), std::__niter_base(__last), + std::__niter_base(__result))); + } +# 620 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline _BI2 + copy_backward(_BI1 __first, _BI1 __last, _BI2 __result) + { + + + + + + + ; + + return (std::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value> + (std::__miter_base(__first), std::__miter_base(__last), + __result)); + } +# 656 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline _BI2 + move_backward(_BI1 __first, _BI1 __last, _BI2 __result) + { + + + + + + + ; + + return std::__copy_move_backward_a2(std::__miter_base(__first), + std::__miter_base(__last), + __result); + } + + + + + + + template + inline typename + __gnu_cxx::__enable_if::__value, void>::__type + __fill_a(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __value) + { + for (; __first != __last; ++__first) + *__first = __value; + } + + template + inline typename + __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, void>::__type + __fill_a(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __value) + { + const _Tp __tmp = __value; + for (; __first != __last; ++__first) + *__first = __tmp; + } + + + template + inline typename + __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type + __fill_a(_Tp* __first, _Tp* __last, const _Tp& __c) + { + const _Tp __tmp = __c; + if (const size_t __len = __last - __first) + __builtin_memset(__first, static_cast(__tmp), __len); + } +# 722 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline void + fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) + { + + + + ; + + std::__fill_a(std::__niter_base(__first), std::__niter_base(__last), + __value); + } + + template + inline typename + __gnu_cxx::__enable_if::__value, _OutputIterator>::__type + __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value) + { + for (__decltype(__n + 0) __niter = __n; + __niter > 0; --__niter, ++__first) + *__first = __value; + return __first; + } + + template + inline typename + __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type + __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value) + { + const _Tp __tmp = __value; + for (__decltype(__n + 0) __niter = __n; + __niter > 0; --__niter, ++__first) + *__first = __tmp; + return __first; + } + + template + inline typename + __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, _Tp*>::__type + __fill_n_a(_Tp* __first, _Size __n, const _Tp& __c) + { + std::__fill_a(__first, __first + __n, __c); + return __first + __n; + } +# 782 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline _OI + fill_n(_OI __first, _Size __n, const _Tp& __value) + { + + + + return _OI(std::__fill_n_a(std::__niter_base(__first), __n, __value)); + } + + template + struct __equal + { + template + static bool + equal(_II1 __first1, _II1 __last1, _II2 __first2) + { + for (; __first1 != __last1; ++__first1, (void)++__first2) + if (!(*__first1 == *__first2)) + return false; + return true; + } + }; + + template<> + struct __equal + { + template + static bool + equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2) + { + if (const size_t __len = (__last1 - __first1)) + return !__builtin_memcmp(__first1, __first2, sizeof(_Tp) * __len); + return true; + } + }; + + template + inline bool + __equal_aux(_II1 __first1, _II1 __last1, _II2 __first2) + { + typedef typename iterator_traits<_II1>::value_type _ValueType1; + typedef typename iterator_traits<_II2>::value_type _ValueType2; + const bool __simple = ((__is_integer<_ValueType1>::__value + || __is_pointer<_ValueType1>::__value) + && __is_pointer<_II1>::__value + && __is_pointer<_II2>::__value + && __are_same<_ValueType1, _ValueType2>::__value); + + return std::__equal<__simple>::equal(__first1, __last1, __first2); + } + + template + struct __lc_rai + { + template + static _II1 + __newlast1(_II1, _II1 __last1, _II2, _II2) + { return __last1; } + + template + static bool + __cnd2(_II __first, _II __last) + { return __first != __last; } + }; + + template<> + struct __lc_rai + { + template + static _RAI1 + __newlast1(_RAI1 __first1, _RAI1 __last1, + _RAI2 __first2, _RAI2 __last2) + { + const typename iterator_traits<_RAI1>::difference_type + __diff1 = __last1 - __first1; + const typename iterator_traits<_RAI2>::difference_type + __diff2 = __last2 - __first2; + return __diff2 < __diff1 ? __first1 + __diff2 : __last1; + } + + template + static bool + __cnd2(_RAI, _RAI) + { return true; } + }; + + template + bool + __lexicographical_compare_impl(_II1 __first1, _II1 __last1, + _II2 __first2, _II2 __last2, + _Compare __comp) + { + typedef typename iterator_traits<_II1>::iterator_category _Category1; + typedef typename iterator_traits<_II2>::iterator_category _Category2; + typedef std::__lc_rai<_Category1, _Category2> __rai_type; + + __last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2); + for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2); + ++__first1, (void)++__first2) + { + if (__comp(__first1, __first2)) + return true; + if (__comp(__first2, __first1)) + return false; + } + return __first1 == __last1 && __first2 != __last2; + } + + template + struct __lexicographical_compare + { + template + static bool __lc(_II1, _II1, _II2, _II2); + }; + + template + template + bool + __lexicographical_compare<_BoolType>:: + __lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2) + { + return std::__lexicographical_compare_impl(__first1, __last1, + __first2, __last2, + __gnu_cxx::__ops::__iter_less_iter()); + } + + template<> + struct __lexicographical_compare + { + template + static bool + __lc(const _Tp* __first1, const _Tp* __last1, + const _Up* __first2, const _Up* __last2) + { + const size_t __len1 = __last1 - __first1; + const size_t __len2 = __last2 - __first2; + if (const size_t __len = std::min(__len1, __len2)) + if (int __result = __builtin_memcmp(__first1, __first2, __len)) + return __result < 0; + return __len1 < __len2; + } + }; + + template + inline bool + __lexicographical_compare_aux(_II1 __first1, _II1 __last1, + _II2 __first2, _II2 __last2) + { + typedef typename iterator_traits<_II1>::value_type _ValueType1; + typedef typename iterator_traits<_II2>::value_type _ValueType2; + const bool __simple = + (__is_byte<_ValueType1>::__value && __is_byte<_ValueType2>::__value + && !__gnu_cxx::__numeric_traits<_ValueType1>::__is_signed + && !__gnu_cxx::__numeric_traits<_ValueType2>::__is_signed + && __is_pointer<_II1>::__value + && __is_pointer<_II2>::__value); + + return std::__lexicographical_compare<__simple>::__lc(__first1, __last1, + __first2, __last2); + } + + template + _ForwardIterator + __lower_bound(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val, _Compare __comp) + { + typedef typename iterator_traits<_ForwardIterator>::difference_type + _DistanceType; + + _DistanceType __len = std::distance(__first, __last); + + while (__len > 0) + { + _DistanceType __half = __len >> 1; + _ForwardIterator __middle = __first; + std::advance(__middle, __half); + if (__comp(__middle, __val)) + { + __first = __middle; + ++__first; + __len = __len - __half - 1; + } + else + __len = __half; + } + return __first; + } +# 982 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline _ForwardIterator + lower_bound(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val) + { + + + + + ; + + return std::__lower_bound(__first, __last, __val, + __gnu_cxx::__ops::__iter_less_val()); + } + + + + inline constexpr int + __lg(int __n) + { return sizeof(int) * 8 - 1 - __builtin_clz(__n); } + + inline constexpr unsigned + __lg(unsigned __n) + { return sizeof(int) * 8 - 1 - __builtin_clz(__n); } + + inline constexpr long + __lg(long __n) + { return sizeof(long) * 8 - 1 - __builtin_clzl(__n); } + + inline constexpr unsigned long + __lg(unsigned long __n) + { return sizeof(long) * 8 - 1 - __builtin_clzl(__n); } + + inline constexpr long long + __lg(long long __n) + { return sizeof(long long) * 8 - 1 - __builtin_clzll(__n); } + + inline constexpr unsigned long long + __lg(unsigned long long __n) + { return sizeof(long long) * 8 - 1 - __builtin_clzll(__n); } +# 1039 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline bool + equal(_II1 __first1, _II1 __last1, _II2 __first2) + { + + + + + + + ; + + return std::__equal_aux(std::__niter_base(__first1), + std::__niter_base(__last1), + std::__niter_base(__first2)); + } +# 1071 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline bool + equal(_IIter1 __first1, _IIter1 __last1, + _IIter2 __first2, _BinaryPredicate __binary_pred) + { + + + + ; + + for (; __first1 != __last1; ++__first1, (void)++__first2) + if (!bool(__binary_pred(*__first1, *__first2))) + return false; + return true; + } +# 1104 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline bool + equal(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2) + { + + + + + + + ; + ; + + using _RATag = random_access_iterator_tag; + using _Cat1 = typename iterator_traits<_II1>::iterator_category; + using _Cat2 = typename iterator_traits<_II2>::iterator_category; + using _RAIters = __and_, is_same<_Cat2, _RATag>>; + if (_RAIters()) + { + auto __d1 = std::distance(__first1, __last1); + auto __d2 = std::distance(__first2, __last2); + if (__d1 != __d2) + return false; + return std::equal(__first1, __last1, __first2); + } + + for (; __first1 != __last1 && __first2 != __last2; + ++__first1, (void)++__first2) + if (!(*__first1 == *__first2)) + return false; + return __first1 == __last1 && __first2 == __last2; + } +# 1153 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline bool + equal(_IIter1 __first1, _IIter1 __last1, + _IIter2 __first2, _IIter2 __last2, _BinaryPredicate __binary_pred) + { + + + + ; + ; + + using _RATag = random_access_iterator_tag; + using _Cat1 = typename iterator_traits<_IIter1>::iterator_category; + using _Cat2 = typename iterator_traits<_IIter2>::iterator_category; + using _RAIters = __and_, is_same<_Cat2, _RATag>>; + if (_RAIters()) + { + auto __d1 = std::distance(__first1, __last1); + auto __d2 = std::distance(__first2, __last2); + if (__d1 != __d2) + return false; + return std::equal(__first1, __last1, __first2, + __binary_pred); + } + + for (; __first1 != __last1 && __first2 != __last2; + ++__first1, (void)++__first2) + if (!bool(__binary_pred(*__first1, *__first2))) + return false; + return __first1 == __last1 && __first2 == __last2; + } +# 1201 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline bool + lexicographical_compare(_II1 __first1, _II1 __last1, + _II2 __first2, _II2 __last2) + { +# 1215 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + ; + ; + + return std::__lexicographical_compare_aux(std::__niter_base(__first1), + std::__niter_base(__last1), + std::__niter_base(__first2), + std::__niter_base(__last2)); + } +# 1237 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline bool + lexicographical_compare(_II1 __first1, _II1 __last1, + _II2 __first2, _II2 __last2, _Compare __comp) + { + + + + ; + ; + + return std::__lexicographical_compare_impl + (__first1, __last1, __first2, __last2, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + pair<_InputIterator1, _InputIterator2> + __mismatch(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _BinaryPredicate __binary_pred) + { + while (__first1 != __last1 && __binary_pred(__first1, __first2)) + { + ++__first1; + ++__first2; + } + return pair<_InputIterator1, _InputIterator2>(__first1, __first2); + } +# 1280 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline pair<_InputIterator1, _InputIterator2> + mismatch(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2) + { + + + + + + + ; + + return std::__mismatch(__first1, __last1, __first2, + __gnu_cxx::__ops::__iter_equal_to_iter()); + } +# 1313 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline pair<_InputIterator1, _InputIterator2> + mismatch(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _BinaryPredicate __binary_pred) + { + + + + ; + + return std::__mismatch(__first1, __last1, __first2, + __gnu_cxx::__ops::__iter_comp_iter(__binary_pred)); + } + + + + template + pair<_InputIterator1, _InputIterator2> + __mismatch(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _BinaryPredicate __binary_pred) + { + while (__first1 != __last1 && __first2 != __last2 + && __binary_pred(__first1, __first2)) + { + ++__first1; + ++__first2; + } + return pair<_InputIterator1, _InputIterator2>(__first1, __first2); + } +# 1360 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline pair<_InputIterator1, _InputIterator2> + mismatch(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2) + { + + + + + + + ; + ; + + return std::__mismatch(__first1, __last1, __first2, __last2, + __gnu_cxx::__ops::__iter_equal_to_iter()); + } +# 1395 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3 + template + inline pair<_InputIterator1, _InputIterator2> + mismatch(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _BinaryPredicate __binary_pred) + { + + + + ; + ; + + return std::__mismatch(__first1, __last1, __first2, __last2, + __gnu_cxx::__ops::__iter_comp_iter(__binary_pred)); + } + + + +} +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 2 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3 + + + + +# 1 "/usr/include/wchar.h" 1 3 4 +# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 2 3 +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 2 3 + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ +# 57 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 3 + template + struct _Char_types + { + typedef unsigned long int_type; + typedef std::streampos pos_type; + typedef std::streamoff off_type; + typedef std::mbstate_t state_type; + }; +# 82 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 3 + template + struct char_traits + { + typedef _CharT char_type; + typedef typename _Char_types<_CharT>::int_type int_type; + typedef typename _Char_types<_CharT>::pos_type pos_type; + typedef typename _Char_types<_CharT>::off_type off_type; + typedef typename _Char_types<_CharT>::state_type state_type; + + static void + assign(char_type& __c1, const char_type& __c2) + { __c1 = __c2; } + + static constexpr bool + eq(const char_type& __c1, const char_type& __c2) + { return __c1 == __c2; } + + static constexpr bool + lt(const char_type& __c1, const char_type& __c2) + { return __c1 < __c2; } + + static int + compare(const char_type* __s1, const char_type* __s2, std::size_t __n); + + static std::size_t + length(const char_type* __s); + + static const char_type* + find(const char_type* __s, std::size_t __n, const char_type& __a); + + static char_type* + move(char_type* __s1, const char_type* __s2, std::size_t __n); + + static char_type* + copy(char_type* __s1, const char_type* __s2, std::size_t __n); + + static char_type* + assign(char_type* __s, std::size_t __n, char_type __a); + + static constexpr char_type + to_char_type(const int_type& __c) + { return static_cast(__c); } + + static constexpr int_type + to_int_type(const char_type& __c) + { return static_cast(__c); } + + static constexpr bool + eq_int_type(const int_type& __c1, const int_type& __c2) + { return __c1 == __c2; } + + static constexpr int_type + eof() + { return static_cast(-1); } + + static constexpr int_type + not_eof(const int_type& __c) + { return !eq_int_type(__c, eof()) ? __c : to_int_type(char_type()); } + }; + + template + int + char_traits<_CharT>:: + compare(const char_type* __s1, const char_type* __s2, std::size_t __n) + { + for (std::size_t __i = 0; __i < __n; ++__i) + if (lt(__s1[__i], __s2[__i])) + return -1; + else if (lt(__s2[__i], __s1[__i])) + return 1; + return 0; + } + + template + std::size_t + char_traits<_CharT>:: + length(const char_type* __p) + { + std::size_t __i = 0; + while (!eq(__p[__i], char_type())) + ++__i; + return __i; + } + + template + const typename char_traits<_CharT>::char_type* + char_traits<_CharT>:: + find(const char_type* __s, std::size_t __n, const char_type& __a) + { + for (std::size_t __i = 0; __i < __n; ++__i) + if (eq(__s[__i], __a)) + return __s + __i; + return 0; + } + + template + typename char_traits<_CharT>::char_type* + char_traits<_CharT>:: + move(char_type* __s1, const char_type* __s2, std::size_t __n) + { + return static_cast<_CharT*>(__builtin_memmove(__s1, __s2, + __n * sizeof(char_type))); + } + + template + typename char_traits<_CharT>::char_type* + char_traits<_CharT>:: + copy(char_type* __s1, const char_type* __s2, std::size_t __n) + { + + std::copy(__s2, __s2 + __n, __s1); + return __s1; + } + + template + typename char_traits<_CharT>::char_type* + char_traits<_CharT>:: + assign(char_type* __s, std::size_t __n, char_type __a) + { + + std::fill_n(__s, __n, __a); + return __s; + } + + +} + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 226 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 3 + template + struct char_traits : public __gnu_cxx::char_traits<_CharT> + { }; + + + + template<> + struct char_traits + { + typedef char char_type; + typedef int int_type; + typedef streampos pos_type; + typedef streamoff off_type; + typedef mbstate_t state_type; + + static void + assign(char_type& __c1, const char_type& __c2) noexcept + { __c1 = __c2; } + + static constexpr bool + eq(const char_type& __c1, const char_type& __c2) noexcept + { return __c1 == __c2; } + + static constexpr bool + lt(const char_type& __c1, const char_type& __c2) noexcept + { + + return (static_cast(__c1) + < static_cast(__c2)); + } + + static int + compare(const char_type* __s1, const char_type* __s2, size_t __n) + { + if (__n == 0) + return 0; + return __builtin_memcmp(__s1, __s2, __n); + } + + static size_t + length(const char_type* __s) + { return __builtin_strlen(__s); } + + static const char_type* + find(const char_type* __s, size_t __n, const char_type& __a) + { + if (__n == 0) + return 0; + return static_cast(__builtin_memchr(__s, __a, __n)); + } + + static char_type* + move(char_type* __s1, const char_type* __s2, size_t __n) + { + if (__n == 0) + return __s1; + return static_cast(__builtin_memmove(__s1, __s2, __n)); + } + + static char_type* + copy(char_type* __s1, const char_type* __s2, size_t __n) + { + if (__n == 0) + return __s1; + return static_cast(__builtin_memcpy(__s1, __s2, __n)); + } + + static char_type* + assign(char_type* __s, size_t __n, char_type __a) + { + if (__n == 0) + return __s; + return static_cast(__builtin_memset(__s, __a, __n)); + } + + static constexpr char_type + to_char_type(const int_type& __c) noexcept + { return static_cast(__c); } + + + + static constexpr int_type + to_int_type(const char_type& __c) noexcept + { return static_cast(static_cast(__c)); } + + static constexpr bool + eq_int_type(const int_type& __c1, const int_type& __c2) noexcept + { return __c1 == __c2; } + + static constexpr int_type + eof() noexcept + { return static_cast(-1); } + + static constexpr int_type + not_eof(const int_type& __c) noexcept + { return (__c == eof()) ? 0 : __c; } + }; + + + + + template<> + struct char_traits + { + typedef wchar_t char_type; + typedef wint_t int_type; + typedef streamoff off_type; + typedef wstreampos pos_type; + typedef mbstate_t state_type; + + static void + assign(char_type& __c1, const char_type& __c2) noexcept + { __c1 = __c2; } + + static constexpr bool + eq(const char_type& __c1, const char_type& __c2) noexcept + { return __c1 == __c2; } + + static constexpr bool + lt(const char_type& __c1, const char_type& __c2) noexcept + { return __c1 < __c2; } + + static int + compare(const char_type* __s1, const char_type* __s2, size_t __n) + { + if (__n == 0) + return 0; + return wmemcmp(__s1, __s2, __n); + } + + static size_t + length(const char_type* __s) + { return wcslen(__s); } + + static const char_type* + find(const char_type* __s, size_t __n, const char_type& __a) + { + if (__n == 0) + return 0; + return wmemchr(__s, __a, __n); + } + + static char_type* + move(char_type* __s1, const char_type* __s2, size_t __n) + { + if (__n == 0) + return __s1; + return wmemmove(__s1, __s2, __n); + } + + static char_type* + copy(char_type* __s1, const char_type* __s2, size_t __n) + { + if (__n == 0) + return __s1; + return wmemcpy(__s1, __s2, __n); + } + + static char_type* + assign(char_type* __s, size_t __n, char_type __a) + { + if (__n == 0) + return __s; + return wmemset(__s, __a, __n); + } + + static constexpr char_type + to_char_type(const int_type& __c) noexcept + { return char_type(__c); } + + static constexpr int_type + to_int_type(const char_type& __c) noexcept + { return int_type(__c); } + + static constexpr bool + eq_int_type(const int_type& __c1, const int_type& __c2) noexcept + { return __c1 == __c2; } + + static constexpr int_type + eof() noexcept + { return static_cast((0xffffffffu)); } + + static constexpr int_type + not_eof(const int_type& __c) noexcept + { return eq_int_type(__c, eof()) ? 0 : __c; } + }; + + + +} + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdint" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdint" 3 +# 46 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdint" 3 +namespace std +{ + using ::int8_t; + using ::int16_t; + using ::int32_t; + using ::int64_t; + + using ::int_fast8_t; + using ::int_fast16_t; + using ::int_fast32_t; + using ::int_fast64_t; + + using ::int_least8_t; + using ::int_least16_t; + using ::int_least32_t; + using ::int_least64_t; + + using ::intmax_t; + using ::intptr_t; + + using ::uint8_t; + using ::uint16_t; + using ::uint32_t; + using ::uint64_t; + + using ::uint_fast8_t; + using ::uint_fast16_t; + using ::uint_fast32_t; + using ::uint_fast64_t; + + using ::uint_least8_t; + using ::uint_least16_t; + using ::uint_least32_t; + using ::uint_least64_t; + + using ::uintmax_t; + using ::uintptr_t; +} +# 421 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template<> + struct char_traits + { + typedef char16_t char_type; + typedef uint_least16_t int_type; + typedef streamoff off_type; + typedef u16streampos pos_type; + typedef mbstate_t state_type; + + static void + assign(char_type& __c1, const char_type& __c2) noexcept + { __c1 = __c2; } + + static constexpr bool + eq(const char_type& __c1, const char_type& __c2) noexcept + { return __c1 == __c2; } + + static constexpr bool + lt(const char_type& __c1, const char_type& __c2) noexcept + { return __c1 < __c2; } + + static int + compare(const char_type* __s1, const char_type* __s2, size_t __n) + { + for (size_t __i = 0; __i < __n; ++__i) + if (lt(__s1[__i], __s2[__i])) + return -1; + else if (lt(__s2[__i], __s1[__i])) + return 1; + return 0; + } + + static size_t + length(const char_type* __s) + { + size_t __i = 0; + while (!eq(__s[__i], char_type())) + ++__i; + return __i; + } + + static const char_type* + find(const char_type* __s, size_t __n, const char_type& __a) + { + for (size_t __i = 0; __i < __n; ++__i) + if (eq(__s[__i], __a)) + return __s + __i; + return 0; + } + + static char_type* + move(char_type* __s1, const char_type* __s2, size_t __n) + { + if (__n == 0) + return __s1; + return (static_cast + (__builtin_memmove(__s1, __s2, __n * sizeof(char_type)))); + } + + static char_type* + copy(char_type* __s1, const char_type* __s2, size_t __n) + { + if (__n == 0) + return __s1; + return (static_cast + (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); + } + + static char_type* + assign(char_type* __s, size_t __n, char_type __a) + { + for (size_t __i = 0; __i < __n; ++__i) + assign(__s[__i], __a); + return __s; + } + + static constexpr char_type + to_char_type(const int_type& __c) noexcept + { return char_type(__c); } + + static constexpr int_type + to_int_type(const char_type& __c) noexcept + { return int_type(__c); } + + static constexpr bool + eq_int_type(const int_type& __c1, const int_type& __c2) noexcept + { return __c1 == __c2; } + + static constexpr int_type + eof() noexcept + { return static_cast(-1); } + + static constexpr int_type + not_eof(const int_type& __c) noexcept + { return eq_int_type(__c, eof()) ? 0 : __c; } + }; + + template<> + struct char_traits + { + typedef char32_t char_type; + typedef uint_least32_t int_type; + typedef streamoff off_type; + typedef u32streampos pos_type; + typedef mbstate_t state_type; + + static void + assign(char_type& __c1, const char_type& __c2) noexcept + { __c1 = __c2; } + + static constexpr bool + eq(const char_type& __c1, const char_type& __c2) noexcept + { return __c1 == __c2; } + + static constexpr bool + lt(const char_type& __c1, const char_type& __c2) noexcept + { return __c1 < __c2; } + + static int + compare(const char_type* __s1, const char_type* __s2, size_t __n) + { + for (size_t __i = 0; __i < __n; ++__i) + if (lt(__s1[__i], __s2[__i])) + return -1; + else if (lt(__s2[__i], __s1[__i])) + return 1; + return 0; + } + + static size_t + length(const char_type* __s) + { + size_t __i = 0; + while (!eq(__s[__i], char_type())) + ++__i; + return __i; + } + + static const char_type* + find(const char_type* __s, size_t __n, const char_type& __a) + { + for (size_t __i = 0; __i < __n; ++__i) + if (eq(__s[__i], __a)) + return __s + __i; + return 0; + } + + static char_type* + move(char_type* __s1, const char_type* __s2, size_t __n) + { + if (__n == 0) + return __s1; + return (static_cast + (__builtin_memmove(__s1, __s2, __n * sizeof(char_type)))); + } + + static char_type* + copy(char_type* __s1, const char_type* __s2, size_t __n) + { + if (__n == 0) + return __s1; + return (static_cast + (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); + } + + static char_type* + assign(char_type* __s, size_t __n, char_type __a) + { + for (size_t __i = 0; __i < __n; ++__i) + assign(__s[__i], __a); + return __s; + } + + static constexpr char_type + to_char_type(const int_type& __c) noexcept + { return char_type(__c); } + + static constexpr int_type + to_int_type(const char_type& __c) noexcept + { return int_type(__c); } + + static constexpr bool + eq_int_type(const int_type& __c1, const int_type& __c2) noexcept + { return __c1 == __c2; } + + static constexpr int_type + eof() noexcept + { return static_cast(-1); } + + static constexpr int_type + not_eof(const int_type& __c) noexcept + { return eq_int_type(__c, eof()) ? 0 : __c; } + }; + + +} +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/localefwd.h" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/localefwd.h" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++locale.h" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++locale.h" 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/clocale" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/clocale" 3 + + +# 1 "/usr/include/locale.h" 1 3 4 +# 28 "/usr/include/locale.h" 3 4 +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 29 "/usr/include/locale.h" 2 3 4 +# 1 "/usr/include/bits/locale.h" 1 3 4 +# 30 "/usr/include/locale.h" 2 3 4 + +extern "C" { +# 53 "/usr/include/locale.h" 3 4 +struct lconv +{ + + + char *decimal_point; + char *thousands_sep; + + + + + + char *grouping; + + + + + + char *int_curr_symbol; + char *currency_symbol; + char *mon_decimal_point; + char *mon_thousands_sep; + char *mon_grouping; + char *positive_sign; + char *negative_sign; + char int_frac_digits; + char frac_digits; + + char p_cs_precedes; + + char p_sep_by_space; + + char n_cs_precedes; + + char n_sep_by_space; + + + + + + + char p_sign_posn; + char n_sign_posn; + + + char int_p_cs_precedes; + + char int_p_sep_by_space; + + char int_n_cs_precedes; + + char int_n_sep_by_space; + + + + + + + char int_p_sign_posn; + char int_n_sign_posn; +# 120 "/usr/include/locale.h" 3 4 +}; + + + +extern char *setlocale (int __category, const char *__locale) throw (); + + +extern struct lconv *localeconv (void) throw (); +# 151 "/usr/include/locale.h" 3 4 +extern __locale_t newlocale (int __category_mask, const char *__locale, + __locale_t __base) throw (); +# 186 "/usr/include/locale.h" 3 4 +extern __locale_t duplocale (__locale_t __dataset) throw (); + + + +extern void freelocale (__locale_t __dataset) throw (); + + + + + + +extern __locale_t uselocale (__locale_t __dataset) throw (); + + + + + + + +} +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/clocale" 2 3 + + + + + + + + +namespace std +{ + using ::lconv; + using ::setlocale; + using ::localeconv; +} +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++locale.h" 2 3 + + + + + + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + + + extern "C" __typeof(uselocale) __uselocale; + + +} + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + typedef __locale_t __c_locale; + + + + + + inline int + __convert_from_v(const __c_locale& __cloc __attribute__ ((__unused__)), + char* __out, + const int __size __attribute__ ((__unused__)), + const char* __fmt, ...) + { + + __c_locale __old = __gnu_cxx::__uselocale(__cloc); +# 88 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++locale.h" 3 + __builtin_va_list __args; + __builtin_va_start(__args, __fmt); + + + const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); + + + + + __builtin_va_end(__args); + + + __gnu_cxx::__uselocale(__old); + + + + + + + + return __ret; + } + + +} +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/localefwd.h" 2 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 3 + + +# 1 "/usr/include/ctype.h" 1 3 4 +# 28 "/usr/include/ctype.h" 3 4 +extern "C" { +# 46 "/usr/include/ctype.h" 3 4 +enum +{ + _ISupper = ((0) < 8 ? ((1 << (0)) << 8) : ((1 << (0)) >> 8)), + _ISlower = ((1) < 8 ? ((1 << (1)) << 8) : ((1 << (1)) >> 8)), + _ISalpha = ((2) < 8 ? ((1 << (2)) << 8) : ((1 << (2)) >> 8)), + _ISdigit = ((3) < 8 ? ((1 << (3)) << 8) : ((1 << (3)) >> 8)), + _ISxdigit = ((4) < 8 ? ((1 << (4)) << 8) : ((1 << (4)) >> 8)), + _ISspace = ((5) < 8 ? ((1 << (5)) << 8) : ((1 << (5)) >> 8)), + _ISprint = ((6) < 8 ? ((1 << (6)) << 8) : ((1 << (6)) >> 8)), + _ISgraph = ((7) < 8 ? ((1 << (7)) << 8) : ((1 << (7)) >> 8)), + _ISblank = ((8) < 8 ? ((1 << (8)) << 8) : ((1 << (8)) >> 8)), + _IScntrl = ((9) < 8 ? ((1 << (9)) << 8) : ((1 << (9)) >> 8)), + _ISpunct = ((10) < 8 ? ((1 << (10)) << 8) : ((1 << (10)) >> 8)), + _ISalnum = ((11) < 8 ? ((1 << (11)) << 8) : ((1 << (11)) >> 8)) +}; +# 79 "/usr/include/ctype.h" 3 4 +extern const unsigned short int **__ctype_b_loc (void) + throw () __attribute__ ((__const__)); +extern const __int32_t **__ctype_tolower_loc (void) + throw () __attribute__ ((__const__)); +extern const __int32_t **__ctype_toupper_loc (void) + throw () __attribute__ ((__const__)); +# 110 "/usr/include/ctype.h" 3 4 +extern int isalnum (int) throw (); +extern int isalpha (int) throw (); +extern int iscntrl (int) throw (); +extern int isdigit (int) throw (); +extern int islower (int) throw (); +extern int isgraph (int) throw (); +extern int isprint (int) throw (); +extern int ispunct (int) throw (); +extern int isspace (int) throw (); +extern int isupper (int) throw (); +extern int isxdigit (int) throw (); + + + +extern int tolower (int __c) throw (); + + +extern int toupper (int __c) throw (); +# 136 "/usr/include/ctype.h" 3 4 +extern int isblank (int) throw (); + + + + + + +extern int isctype (int __c, int __mask) throw (); + + + + + + +extern int isascii (int __c) throw (); + + + +extern int toascii (int __c) throw (); + + + +extern int _toupper (int) throw (); +extern int _tolower (int) throw (); +# 271 "/usr/include/ctype.h" 3 4 +extern int isalnum_l (int, __locale_t) throw (); +extern int isalpha_l (int, __locale_t) throw (); +extern int iscntrl_l (int, __locale_t) throw (); +extern int isdigit_l (int, __locale_t) throw (); +extern int islower_l (int, __locale_t) throw (); +extern int isgraph_l (int, __locale_t) throw (); +extern int isprint_l (int, __locale_t) throw (); +extern int ispunct_l (int, __locale_t) throw (); +extern int isspace_l (int, __locale_t) throw (); +extern int isupper_l (int, __locale_t) throw (); +extern int isxdigit_l (int, __locale_t) throw (); + +extern int isblank_l (int, __locale_t) throw (); + + + +extern int __tolower_l (int __c, __locale_t __l) throw (); +extern int tolower_l (int __c, __locale_t __l) throw (); + + +extern int __toupper_l (int __c, __locale_t __l) throw (); +extern int toupper_l (int __c, __locale_t __l) throw (); +# 347 "/usr/include/ctype.h" 3 4 +} +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 2 3 +# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 3 +namespace std +{ + using ::isalnum; + using ::isalpha; + using ::iscntrl; + using ::isdigit; + using ::isgraph; + using ::islower; + using ::isprint; + using ::ispunct; + using ::isspace; + using ::isupper; + using ::isxdigit; + using ::tolower; + using ::toupper; +} + + + + + + + +namespace std +{ + using ::isblank; +} +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/localefwd.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 55 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/localefwd.h" 3 + class locale; + + template + bool + has_facet(const locale&) throw(); + + template + const _Facet& + use_facet(const locale&); + + + template + bool + isspace(_CharT, const locale&); + + template + bool + isprint(_CharT, const locale&); + + template + bool + iscntrl(_CharT, const locale&); + + template + bool + isupper(_CharT, const locale&); + + template + bool + islower(_CharT, const locale&); + + template + bool + isalpha(_CharT, const locale&); + + template + bool + isdigit(_CharT, const locale&); + + template + bool + ispunct(_CharT, const locale&); + + template + bool + isxdigit(_CharT, const locale&); + + template + bool + isalnum(_CharT, const locale&); + + template + bool + isgraph(_CharT, const locale&); + + + template + bool + isblank(_CharT, const locale&); + + + template + _CharT + toupper(_CharT, const locale&); + + template + _CharT + tolower(_CharT, const locale&); + + + class ctype_base; + template + class ctype; + template<> class ctype; + + template<> class ctype; + + template + class ctype_byname; + + + class codecvt_base; + template + class codecvt; + template<> class codecvt; + + template<> class codecvt; + + template + class codecvt_byname; + + + + template > + class num_get; + template > + class num_put; + +namespace __cxx11 { + template class numpunct; + template class numpunct_byname; +} + +namespace __cxx11 { + + template + class collate; + template + class collate_byname; +} + + + class time_base; +namespace __cxx11 { + template > + class time_get; + template > + class time_get_byname; +} + template > + class time_put; + template > + class time_put_byname; + + + class money_base; +namespace __cxx11 { + template > + class money_get; + template > + class money_put; +} +namespace __cxx11 { + template + class moneypunct; + template + class moneypunct_byname; +} + + + class messages_base; +namespace __cxx11 { + template + class messages; + template + class messages_byname; +} + + +} +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/atomicity.h" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/atomicity.h" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr.h" 1 3 +# 30 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr.h" 3 +#pragma GCC visibility push(default) +# 148 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 1 3 +# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3 +# 1 "/usr/include/pthread.h" 1 3 4 +# 23 "/usr/include/pthread.h" 3 4 +# 1 "/usr/include/sched.h" 1 3 4 +# 28 "/usr/include/sched.h" 3 4 +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 29 "/usr/include/sched.h" 2 3 4 + + + + + +# 1 "/usr/include/time.h" 1 3 4 +# 35 "/usr/include/sched.h" 2 3 4 + + + + + + + + +# 1 "/usr/include/bits/sched.h" 1 3 4 +# 73 "/usr/include/bits/sched.h" 3 4 +struct sched_param + { + int __sched_priority; + }; + +extern "C" { + + + +extern int clone (int (*__fn) (void *__arg), void *__child_stack, + int __flags, void *__arg, ...) throw (); + + +extern int unshare (int __flags) throw (); + + +extern int sched_getcpu (void) throw (); + + +extern int setns (int __fd, int __nstype) throw (); + + + +} + + + + + + + +struct __sched_param + { + int __sched_priority; + }; +# 119 "/usr/include/bits/sched.h" 3 4 +typedef unsigned long int __cpu_mask; + + + + + + +typedef struct +{ + __cpu_mask __bits[1024 / (8 * sizeof (__cpu_mask))]; +} cpu_set_t; +# 202 "/usr/include/bits/sched.h" 3 4 +extern "C" { + +extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp) + throw (); +extern cpu_set_t *__sched_cpualloc (size_t __count) throw () ; +extern void __sched_cpufree (cpu_set_t *__set) throw (); + +} +# 44 "/usr/include/sched.h" 2 3 4 + + + + +extern "C" { + + +extern int sched_setparam (__pid_t __pid, const struct sched_param *__param) + throw (); + + +extern int sched_getparam (__pid_t __pid, struct sched_param *__param) throw (); + + +extern int sched_setscheduler (__pid_t __pid, int __policy, + const struct sched_param *__param) throw (); + + +extern int sched_getscheduler (__pid_t __pid) throw (); + + +extern int sched_yield (void) throw (); + + +extern int sched_get_priority_max (int __algorithm) throw (); + + +extern int sched_get_priority_min (int __algorithm) throw (); + + +extern int sched_rr_get_interval (__pid_t __pid, struct timespec *__t) throw (); +# 118 "/usr/include/sched.h" 3 4 +extern int sched_setaffinity (__pid_t __pid, size_t __cpusetsize, + const cpu_set_t *__cpuset) throw (); + + +extern int sched_getaffinity (__pid_t __pid, size_t __cpusetsize, + cpu_set_t *__cpuset) throw (); + + +} +# 24 "/usr/include/pthread.h" 2 3 4 +# 1 "/usr/include/time.h" 1 3 4 +# 29 "/usr/include/time.h" 3 4 +extern "C" { + + + + + + + + +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4 +# 38 "/usr/include/time.h" 2 3 4 + + + +# 1 "/usr/include/bits/time.h" 1 3 4 +# 88 "/usr/include/bits/time.h" 3 4 +# 1 "/usr/include/bits/timex.h" 1 3 4 +# 25 "/usr/include/bits/timex.h" 3 4 +struct timex +{ + unsigned int modes; + __syscall_slong_t offset; + __syscall_slong_t freq; + __syscall_slong_t maxerror; + __syscall_slong_t esterror; + int status; + __syscall_slong_t constant; + __syscall_slong_t precision; + __syscall_slong_t tolerance; + struct timeval time; + __syscall_slong_t tick; + __syscall_slong_t ppsfreq; + __syscall_slong_t jitter; + int shift; + __syscall_slong_t stabil; + __syscall_slong_t jitcnt; + __syscall_slong_t calcnt; + __syscall_slong_t errcnt; + __syscall_slong_t stbcnt; + + int tai; + + + int :32; int :32; int :32; int :32; + int :32; int :32; int :32; int :32; + int :32; int :32; int :32; +}; +# 89 "/usr/include/bits/time.h" 2 3 4 + +extern "C" { + + +extern int clock_adjtime (__clockid_t __clock_id, struct timex *__utx) throw (); + +} +# 42 "/usr/include/time.h" 2 3 4 +# 133 "/usr/include/time.h" 3 4 +struct tm +{ + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + + + long int tm_gmtoff; + const char *tm_zone; + + + + +}; +# 161 "/usr/include/time.h" 3 4 +struct itimerspec + { + struct timespec it_interval; + struct timespec it_value; + }; + + +struct sigevent; +# 189 "/usr/include/time.h" 3 4 +extern clock_t clock (void) throw (); + + +extern time_t time (time_t *__timer) throw (); + + +extern double difftime (time_t __time1, time_t __time0) + throw () __attribute__ ((__const__)); + + +extern time_t mktime (struct tm *__tp) throw (); + + + + + +extern size_t strftime (char *__restrict __s, size_t __maxsize, + const char *__restrict __format, + const struct tm *__restrict __tp) throw (); + + + + + +extern char *strptime (const char *__restrict __s, + const char *__restrict __fmt, struct tm *__tp) + throw (); + + + + + + + +extern size_t strftime_l (char *__restrict __s, size_t __maxsize, + const char *__restrict __format, + const struct tm *__restrict __tp, + __locale_t __loc) throw (); + + + +extern char *strptime_l (const char *__restrict __s, + const char *__restrict __fmt, struct tm *__tp, + __locale_t __loc) throw (); + + + + + + +extern struct tm *gmtime (const time_t *__timer) throw (); + + + +extern struct tm *localtime (const time_t *__timer) throw (); + + + + + +extern struct tm *gmtime_r (const time_t *__restrict __timer, + struct tm *__restrict __tp) throw (); + + + +extern struct tm *localtime_r (const time_t *__restrict __timer, + struct tm *__restrict __tp) throw (); + + + + + +extern char *asctime (const struct tm *__tp) throw (); + + +extern char *ctime (const time_t *__timer) throw (); + + + + + + + +extern char *asctime_r (const struct tm *__restrict __tp, + char *__restrict __buf) throw (); + + +extern char *ctime_r (const time_t *__restrict __timer, + char *__restrict __buf) throw (); + + + + +extern char *__tzname[2]; +extern int __daylight; +extern long int __timezone; + + + + +extern char *tzname[2]; + + + +extern void tzset (void) throw (); + + + +extern int daylight; +extern long int timezone; + + + + + +extern int stime (const time_t *__when) throw (); +# 319 "/usr/include/time.h" 3 4 +extern time_t timegm (struct tm *__tp) throw (); + + +extern time_t timelocal (struct tm *__tp) throw (); + + +extern int dysize (int __year) throw () __attribute__ ((__const__)); +# 334 "/usr/include/time.h" 3 4 +extern int nanosleep (const struct timespec *__requested_time, + struct timespec *__remaining); + + + +extern int clock_getres (clockid_t __clock_id, struct timespec *__res) throw (); + + +extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp) throw (); + + +extern int clock_settime (clockid_t __clock_id, const struct timespec *__tp) + throw (); + + + + + + +extern int clock_nanosleep (clockid_t __clock_id, int __flags, + const struct timespec *__req, + struct timespec *__rem); + + +extern int clock_getcpuclockid (pid_t __pid, clockid_t *__clock_id) throw (); + + + + +extern int timer_create (clockid_t __clock_id, + struct sigevent *__restrict __evp, + timer_t *__restrict __timerid) throw (); + + +extern int timer_delete (timer_t __timerid) throw (); + + +extern int timer_settime (timer_t __timerid, int __flags, + const struct itimerspec *__restrict __value, + struct itimerspec *__restrict __ovalue) throw (); + + +extern int timer_gettime (timer_t __timerid, struct itimerspec *__value) + throw (); + + +extern int timer_getoverrun (timer_t __timerid) throw (); + + + + + +extern int timespec_get (struct timespec *__ts, int __base) + throw () __attribute__ ((__nonnull__ (1))); +# 403 "/usr/include/time.h" 3 4 +extern int getdate_err; +# 412 "/usr/include/time.h" 3 4 +extern struct tm *getdate (const char *__string); +# 426 "/usr/include/time.h" 3 4 +extern int getdate_r (const char *__restrict __string, + struct tm *__restrict __resbufp); + + +} +# 25 "/usr/include/pthread.h" 2 3 4 + + +# 1 "/usr/include/bits/setjmp.h" 1 3 4 +# 26 "/usr/include/bits/setjmp.h" 3 4 +# 1 "/usr/include/bits/wordsize.h" 1 3 4 +# 27 "/usr/include/bits/setjmp.h" 2 3 4 + + + + +typedef long int __jmp_buf[8]; +# 28 "/usr/include/pthread.h" 2 3 4 +# 1 "/usr/include/bits/wordsize.h" 1 3 4 +# 29 "/usr/include/pthread.h" 2 3 4 + + + +enum +{ + PTHREAD_CREATE_JOINABLE, + + PTHREAD_CREATE_DETACHED + +}; + + + +enum +{ + PTHREAD_MUTEX_TIMED_NP, + PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_ADAPTIVE_NP + + , + PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP, + PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL + + + + , PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_TIMED_NP + +}; + + + + +enum +{ + PTHREAD_MUTEX_STALLED, + PTHREAD_MUTEX_STALLED_NP = PTHREAD_MUTEX_STALLED, + PTHREAD_MUTEX_ROBUST, + PTHREAD_MUTEX_ROBUST_NP = PTHREAD_MUTEX_ROBUST +}; + + + + + +enum +{ + PTHREAD_PRIO_NONE, + PTHREAD_PRIO_INHERIT, + PTHREAD_PRIO_PROTECT +}; +# 114 "/usr/include/pthread.h" 3 4 +enum +{ + PTHREAD_RWLOCK_PREFER_READER_NP, + PTHREAD_RWLOCK_PREFER_WRITER_NP, + PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, + PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_READER_NP +}; +# 155 "/usr/include/pthread.h" 3 4 +enum +{ + PTHREAD_INHERIT_SCHED, + + PTHREAD_EXPLICIT_SCHED + +}; + + + +enum +{ + PTHREAD_SCOPE_SYSTEM, + + PTHREAD_SCOPE_PROCESS + +}; + + + +enum +{ + PTHREAD_PROCESS_PRIVATE, + + PTHREAD_PROCESS_SHARED + +}; +# 190 "/usr/include/pthread.h" 3 4 +struct _pthread_cleanup_buffer +{ + void (*__routine) (void *); + void *__arg; + int __canceltype; + struct _pthread_cleanup_buffer *__prev; +}; + + +enum +{ + PTHREAD_CANCEL_ENABLE, + + PTHREAD_CANCEL_DISABLE + +}; +enum +{ + PTHREAD_CANCEL_DEFERRED, + + PTHREAD_CANCEL_ASYNCHRONOUS + +}; +# 228 "/usr/include/pthread.h" 3 4 +extern "C" { + + + + +extern int pthread_create (pthread_t *__restrict __newthread, + const pthread_attr_t *__restrict __attr, + void *(*__start_routine) (void *), + void *__restrict __arg) throw () __attribute__ ((__nonnull__ (1, 3))); + + + + + +extern void pthread_exit (void *__retval) __attribute__ ((__noreturn__)); + + + + + + + +extern int pthread_join (pthread_t __th, void **__thread_return); + + + + +extern int pthread_tryjoin_np (pthread_t __th, void **__thread_return) throw (); + + + + + + + +extern int pthread_timedjoin_np (pthread_t __th, void **__thread_return, + const struct timespec *__abstime); + + + + + + +extern int pthread_detach (pthread_t __th) throw (); + + + +extern pthread_t pthread_self (void) throw () __attribute__ ((__const__)); + + +extern int pthread_equal (pthread_t __thread1, pthread_t __thread2) + throw () __attribute__ ((__const__)); + + + + + + + +extern int pthread_attr_init (pthread_attr_t *__attr) throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_attr_destroy (pthread_attr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_attr_getdetachstate (const pthread_attr_t *__attr, + int *__detachstate) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_attr_setdetachstate (pthread_attr_t *__attr, + int __detachstate) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_attr_getguardsize (const pthread_attr_t *__attr, + size_t *__guardsize) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_attr_setguardsize (pthread_attr_t *__attr, + size_t __guardsize) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_attr_getschedparam (const pthread_attr_t *__restrict __attr, + struct sched_param *__restrict __param) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_attr_setschedparam (pthread_attr_t *__restrict __attr, + const struct sched_param *__restrict + __param) throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_attr_getschedpolicy (const pthread_attr_t *__restrict + __attr, int *__restrict __policy) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_attr_getinheritsched (const pthread_attr_t *__restrict + __attr, int *__restrict __inherit) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_attr_setinheritsched (pthread_attr_t *__attr, + int __inherit) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_attr_getscope (const pthread_attr_t *__restrict __attr, + int *__restrict __scope) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_attr_setscope (pthread_attr_t *__attr, int __scope) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_attr_getstackaddr (const pthread_attr_t *__restrict + __attr, void **__restrict __stackaddr) + throw () __attribute__ ((__nonnull__ (1, 2))) __attribute__ ((__deprecated__)); + + + + + +extern int pthread_attr_setstackaddr (pthread_attr_t *__attr, + void *__stackaddr) + throw () __attribute__ ((__nonnull__ (1))) __attribute__ ((__deprecated__)); + + +extern int pthread_attr_getstacksize (const pthread_attr_t *__restrict + __attr, size_t *__restrict __stacksize) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + + +extern int pthread_attr_setstacksize (pthread_attr_t *__attr, + size_t __stacksize) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_attr_getstack (const pthread_attr_t *__restrict __attr, + void **__restrict __stackaddr, + size_t *__restrict __stacksize) + throw () __attribute__ ((__nonnull__ (1, 2, 3))); + + + + +extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr, + size_t __stacksize) throw () __attribute__ ((__nonnull__ (1))); + + + + + +extern int pthread_attr_setaffinity_np (pthread_attr_t *__attr, + size_t __cpusetsize, + const cpu_set_t *__cpuset) + throw () __attribute__ ((__nonnull__ (1, 3))); + + + +extern int pthread_attr_getaffinity_np (const pthread_attr_t *__attr, + size_t __cpusetsize, + cpu_set_t *__cpuset) + throw () __attribute__ ((__nonnull__ (1, 3))); + + +extern int pthread_getattr_default_np (pthread_attr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_setattr_default_np (const pthread_attr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + + + +extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr) + throw () __attribute__ ((__nonnull__ (2))); + + + + + + + +extern int pthread_setschedparam (pthread_t __target_thread, int __policy, + const struct sched_param *__param) + throw () __attribute__ ((__nonnull__ (3))); + + +extern int pthread_getschedparam (pthread_t __target_thread, + int *__restrict __policy, + struct sched_param *__restrict __param) + throw () __attribute__ ((__nonnull__ (2, 3))); + + +extern int pthread_setschedprio (pthread_t __target_thread, int __prio) + throw (); + + + + +extern int pthread_getname_np (pthread_t __target_thread, char *__buf, + size_t __buflen) + throw () __attribute__ ((__nonnull__ (2))); + + +extern int pthread_setname_np (pthread_t __target_thread, const char *__name) + throw () __attribute__ ((__nonnull__ (2))); + + + + + +extern int pthread_getconcurrency (void) throw (); + + +extern int pthread_setconcurrency (int __level) throw (); + + + + + + + +extern int pthread_yield (void) throw (); + + + + +extern int pthread_setaffinity_np (pthread_t __th, size_t __cpusetsize, + const cpu_set_t *__cpuset) + throw () __attribute__ ((__nonnull__ (3))); + + +extern int pthread_getaffinity_np (pthread_t __th, size_t __cpusetsize, + cpu_set_t *__cpuset) + throw () __attribute__ ((__nonnull__ (3))); +# 494 "/usr/include/pthread.h" 3 4 +extern int pthread_once (pthread_once_t *__once_control, + void (*__init_routine) (void)) __attribute__ ((__nonnull__ (1, 2))); +# 506 "/usr/include/pthread.h" 3 4 +extern int pthread_setcancelstate (int __state, int *__oldstate); + + + +extern int pthread_setcanceltype (int __type, int *__oldtype); + + +extern int pthread_cancel (pthread_t __th); + + + + +extern void pthread_testcancel (void); + + + + +typedef struct +{ + struct + { + __jmp_buf __cancel_jmp_buf; + int __mask_was_saved; + } __cancel_jmp_buf[1]; + void *__pad[4]; +} __pthread_unwind_buf_t __attribute__ ((__aligned__)); +# 540 "/usr/include/pthread.h" 3 4 +struct __pthread_cleanup_frame +{ + void (*__cancel_routine) (void *); + void *__cancel_arg; + int __do_it; + int __cancel_type; +}; + + + + +class __pthread_cleanup_class +{ + void (*__cancel_routine) (void *); + void *__cancel_arg; + int __do_it; + int __cancel_type; + + public: + __pthread_cleanup_class (void (*__fct) (void *), void *__arg) + : __cancel_routine (__fct), __cancel_arg (__arg), __do_it (1) { } + ~__pthread_cleanup_class () { if (__do_it) __cancel_routine (__cancel_arg); } + void __setdoit (int __newval) { __do_it = __newval; } + void __defer () { pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, + &__cancel_type); } + void __restore () const { pthread_setcanceltype (__cancel_type, 0); } +}; +# 742 "/usr/include/pthread.h" 3 4 +struct __jmp_buf_tag; +extern int __sigsetjmp (struct __jmp_buf_tag *__env, int __savemask) throw (); + + + + + +extern int pthread_mutex_init (pthread_mutex_t *__mutex, + const pthread_mutexattr_t *__mutexattr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_mutex_destroy (pthread_mutex_t *__mutex) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_mutex_trylock (pthread_mutex_t *__mutex) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_mutex_lock (pthread_mutex_t *__mutex) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_mutex_timedlock (pthread_mutex_t *__restrict __mutex, + const struct timespec *__restrict + __abstime) throw () __attribute__ ((__nonnull__ (1, 2))); + + + +extern int pthread_mutex_unlock (pthread_mutex_t *__mutex) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_mutex_getprioceiling (const pthread_mutex_t * + __restrict __mutex, + int *__restrict __prioceiling) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + +extern int pthread_mutex_setprioceiling (pthread_mutex_t *__restrict __mutex, + int __prioceiling, + int *__restrict __old_ceiling) + throw () __attribute__ ((__nonnull__ (1, 3))); + + + + +extern int pthread_mutex_consistent (pthread_mutex_t *__mutex) + throw () __attribute__ ((__nonnull__ (1))); + +extern int pthread_mutex_consistent_np (pthread_mutex_t *__mutex) + throw () __attribute__ ((__nonnull__ (1))); +# 806 "/usr/include/pthread.h" 3 4 +extern int pthread_mutexattr_init (pthread_mutexattr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_mutexattr_destroy (pthread_mutexattr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_mutexattr_getpshared (const pthread_mutexattr_t * + __restrict __attr, + int *__restrict __pshared) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_mutexattr_setpshared (pthread_mutexattr_t *__attr, + int __pshared) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_mutexattr_gettype (const pthread_mutexattr_t *__restrict + __attr, int *__restrict __kind) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + + +extern int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_mutexattr_getprotocol (const pthread_mutexattr_t * + __restrict __attr, + int *__restrict __protocol) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + +extern int pthread_mutexattr_setprotocol (pthread_mutexattr_t *__attr, + int __protocol) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t * + __restrict __attr, + int *__restrict __prioceiling) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *__attr, + int __prioceiling) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_mutexattr_getrobust (const pthread_mutexattr_t *__attr, + int *__robustness) + throw () __attribute__ ((__nonnull__ (1, 2))); + +extern int pthread_mutexattr_getrobust_np (const pthread_mutexattr_t *__attr, + int *__robustness) + throw () __attribute__ ((__nonnull__ (1, 2))); + + + +extern int pthread_mutexattr_setrobust (pthread_mutexattr_t *__attr, + int __robustness) + throw () __attribute__ ((__nonnull__ (1))); + +extern int pthread_mutexattr_setrobust_np (pthread_mutexattr_t *__attr, + int __robustness) + throw () __attribute__ ((__nonnull__ (1))); +# 888 "/usr/include/pthread.h" 3 4 +extern int pthread_rwlock_init (pthread_rwlock_t *__restrict __rwlock, + const pthread_rwlockattr_t *__restrict + __attr) throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_rwlock_timedrdlock (pthread_rwlock_t *__restrict __rwlock, + const struct timespec *__restrict + __abstime) throw () __attribute__ ((__nonnull__ (1, 2))); + + + +extern int pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_rwlock_timedwrlock (pthread_rwlock_t *__restrict __rwlock, + const struct timespec *__restrict + __abstime) throw () __attribute__ ((__nonnull__ (1, 2))); + + + +extern int pthread_rwlock_unlock (pthread_rwlock_t *__rwlock) + throw () __attribute__ ((__nonnull__ (1))); + + + + + +extern int pthread_rwlockattr_init (pthread_rwlockattr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_rwlockattr_destroy (pthread_rwlockattr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * + __restrict __attr, + int *__restrict __pshared) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *__attr, + int __pshared) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_rwlockattr_getkind_np (const pthread_rwlockattr_t * + __restrict __attr, + int *__restrict __pref) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *__attr, + int __pref) throw () __attribute__ ((__nonnull__ (1))); + + + + + + + +extern int pthread_cond_init (pthread_cond_t *__restrict __cond, + const pthread_condattr_t *__restrict __cond_attr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_cond_destroy (pthread_cond_t *__cond) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_cond_signal (pthread_cond_t *__cond) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_cond_broadcast (pthread_cond_t *__cond) + throw () __attribute__ ((__nonnull__ (1))); + + + + + + +extern int pthread_cond_wait (pthread_cond_t *__restrict __cond, + pthread_mutex_t *__restrict __mutex) + __attribute__ ((__nonnull__ (1, 2))); +# 1000 "/usr/include/pthread.h" 3 4 +extern int pthread_cond_timedwait (pthread_cond_t *__restrict __cond, + pthread_mutex_t *__restrict __mutex, + const struct timespec *__restrict __abstime) + __attribute__ ((__nonnull__ (1, 2, 3))); + + + + +extern int pthread_condattr_init (pthread_condattr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_condattr_destroy (pthread_condattr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_condattr_getpshared (const pthread_condattr_t * + __restrict __attr, + int *__restrict __pshared) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_condattr_setpshared (pthread_condattr_t *__attr, + int __pshared) throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_condattr_getclock (const pthread_condattr_t * + __restrict __attr, + __clockid_t *__restrict __clock_id) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_condattr_setclock (pthread_condattr_t *__attr, + __clockid_t __clock_id) + throw () __attribute__ ((__nonnull__ (1))); +# 1044 "/usr/include/pthread.h" 3 4 +extern int pthread_spin_init (pthread_spinlock_t *__lock, int __pshared) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_spin_destroy (pthread_spinlock_t *__lock) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_spin_lock (pthread_spinlock_t *__lock) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_spin_trylock (pthread_spinlock_t *__lock) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_spin_unlock (pthread_spinlock_t *__lock) + throw () __attribute__ ((__nonnull__ (1))); + + + + + + +extern int pthread_barrier_init (pthread_barrier_t *__restrict __barrier, + const pthread_barrierattr_t *__restrict + __attr, unsigned int __count) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_barrier_destroy (pthread_barrier_t *__barrier) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_barrier_wait (pthread_barrier_t *__barrier) + throw () __attribute__ ((__nonnull__ (1))); + + + +extern int pthread_barrierattr_init (pthread_barrierattr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_barrierattr_destroy (pthread_barrierattr_t *__attr) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_barrierattr_getpshared (const pthread_barrierattr_t * + __restrict __attr, + int *__restrict __pshared) + throw () __attribute__ ((__nonnull__ (1, 2))); + + +extern int pthread_barrierattr_setpshared (pthread_barrierattr_t *__attr, + int __pshared) + throw () __attribute__ ((__nonnull__ (1))); +# 1111 "/usr/include/pthread.h" 3 4 +extern int pthread_key_create (pthread_key_t *__key, + void (*__destr_function) (void *)) + throw () __attribute__ ((__nonnull__ (1))); + + +extern int pthread_key_delete (pthread_key_t __key) throw (); + + +extern void *pthread_getspecific (pthread_key_t __key) throw (); + + +extern int pthread_setspecific (pthread_key_t __key, + const void *__pointer) throw () ; + + + + +extern int pthread_getcpuclockid (pthread_t __thread_id, + __clockid_t *__clock_id) + throw () __attribute__ ((__nonnull__ (2))); +# 1145 "/usr/include/pthread.h" 3 4 +extern int pthread_atfork (void (*__prepare) (void), + void (*__parent) (void), + void (*__child) (void)) throw (); +# 1159 "/usr/include/pthread.h" 3 4 +} +# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 2 3 +# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3 +typedef pthread_t __gthread_t; +typedef pthread_key_t __gthread_key_t; +typedef pthread_once_t __gthread_once_t; +typedef pthread_mutex_t __gthread_mutex_t; +typedef pthread_mutex_t __gthread_recursive_mutex_t; +typedef pthread_cond_t __gthread_cond_t; +typedef struct timespec __gthread_time_t; +# 101 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3 +static __typeof(pthread_once) __gthrw_pthread_once __attribute__ ((__weakref__("pthread_once"))); +static __typeof(pthread_getspecific) __gthrw_pthread_getspecific __attribute__ ((__weakref__("pthread_getspecific"))); +static __typeof(pthread_setspecific) __gthrw_pthread_setspecific __attribute__ ((__weakref__("pthread_setspecific"))); + +static __typeof(pthread_create) __gthrw_pthread_create __attribute__ ((__weakref__("pthread_create"))); +static __typeof(pthread_join) __gthrw_pthread_join __attribute__ ((__weakref__("pthread_join"))); +static __typeof(pthread_equal) __gthrw_pthread_equal __attribute__ ((__weakref__("pthread_equal"))); +static __typeof(pthread_self) __gthrw_pthread_self __attribute__ ((__weakref__("pthread_self"))); +static __typeof(pthread_detach) __gthrw_pthread_detach __attribute__ ((__weakref__("pthread_detach"))); + +static __typeof(pthread_cancel) __gthrw_pthread_cancel __attribute__ ((__weakref__("pthread_cancel"))); + +static __typeof(sched_yield) __gthrw_sched_yield __attribute__ ((__weakref__("sched_yield"))); + +static __typeof(pthread_mutex_lock) __gthrw_pthread_mutex_lock __attribute__ ((__weakref__("pthread_mutex_lock"))); +static __typeof(pthread_mutex_trylock) __gthrw_pthread_mutex_trylock __attribute__ ((__weakref__("pthread_mutex_trylock"))); + +static __typeof(pthread_mutex_timedlock) __gthrw_pthread_mutex_timedlock __attribute__ ((__weakref__("pthread_mutex_timedlock"))); + +static __typeof(pthread_mutex_unlock) __gthrw_pthread_mutex_unlock __attribute__ ((__weakref__("pthread_mutex_unlock"))); +static __typeof(pthread_mutex_init) __gthrw_pthread_mutex_init __attribute__ ((__weakref__("pthread_mutex_init"))); +static __typeof(pthread_mutex_destroy) __gthrw_pthread_mutex_destroy __attribute__ ((__weakref__("pthread_mutex_destroy"))); + +static __typeof(pthread_cond_init) __gthrw_pthread_cond_init __attribute__ ((__weakref__("pthread_cond_init"))); +static __typeof(pthread_cond_broadcast) __gthrw_pthread_cond_broadcast __attribute__ ((__weakref__("pthread_cond_broadcast"))); +static __typeof(pthread_cond_signal) __gthrw_pthread_cond_signal __attribute__ ((__weakref__("pthread_cond_signal"))); +static __typeof(pthread_cond_wait) __gthrw_pthread_cond_wait __attribute__ ((__weakref__("pthread_cond_wait"))); +static __typeof(pthread_cond_timedwait) __gthrw_pthread_cond_timedwait __attribute__ ((__weakref__("pthread_cond_timedwait"))); +static __typeof(pthread_cond_destroy) __gthrw_pthread_cond_destroy __attribute__ ((__weakref__("pthread_cond_destroy"))); + +static __typeof(pthread_key_create) __gthrw_pthread_key_create __attribute__ ((__weakref__("pthread_key_create"))); +static __typeof(pthread_key_delete) __gthrw_pthread_key_delete __attribute__ ((__weakref__("pthread_key_delete"))); +static __typeof(pthread_mutexattr_init) __gthrw_pthread_mutexattr_init __attribute__ ((__weakref__("pthread_mutexattr_init"))); +static __typeof(pthread_mutexattr_settype) __gthrw_pthread_mutexattr_settype __attribute__ ((__weakref__("pthread_mutexattr_settype"))); +static __typeof(pthread_mutexattr_destroy) __gthrw_pthread_mutexattr_destroy __attribute__ ((__weakref__("pthread_mutexattr_destroy"))); +# 236 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3 +static __typeof(pthread_key_create) __gthrw___pthread_key_create __attribute__ ((__weakref__("__pthread_key_create"))); +# 246 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3 +static inline int +__gthread_active_p (void) +{ + static void *const __gthread_active_ptr + = __extension__ (void *) &__gthrw___pthread_key_create; + return __gthread_active_ptr != 0; +} +# 658 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3 +static inline int +__gthread_create (__gthread_t *__threadid, void *(*__func) (void*), + void *__args) +{ + return __gthrw_pthread_create (__threadid, __null, __func, __args); +} + +static inline int +__gthread_join (__gthread_t __threadid, void **__value_ptr) +{ + return __gthrw_pthread_join (__threadid, __value_ptr); +} + +static inline int +__gthread_detach (__gthread_t __threadid) +{ + return __gthrw_pthread_detach (__threadid); +} + +static inline int +__gthread_equal (__gthread_t __t1, __gthread_t __t2) +{ + return __gthrw_pthread_equal (__t1, __t2); +} + +static inline __gthread_t +__gthread_self (void) +{ + return __gthrw_pthread_self (); +} + +static inline int +__gthread_yield (void) +{ + return __gthrw_sched_yield (); +} + +static inline int +__gthread_once (__gthread_once_t *__once, void (*__func) (void)) +{ + if (__gthread_active_p ()) + return __gthrw_pthread_once (__once, __func); + else + return -1; +} + +static inline int +__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) +{ + return __gthrw_pthread_key_create (__key, __dtor); +} + +static inline int +__gthread_key_delete (__gthread_key_t __key) +{ + return __gthrw_pthread_key_delete (__key); +} + +static inline void * +__gthread_getspecific (__gthread_key_t __key) +{ + return __gthrw_pthread_getspecific (__key); +} + +static inline int +__gthread_setspecific (__gthread_key_t __key, const void *__ptr) +{ + return __gthrw_pthread_setspecific (__key, __ptr); +} + +static inline void +__gthread_mutex_init_function (__gthread_mutex_t *__mutex) +{ + if (__gthread_active_p ()) + __gthrw_pthread_mutex_init (__mutex, __null); +} + +static inline int +__gthread_mutex_destroy (__gthread_mutex_t *__mutex) +{ + if (__gthread_active_p ()) + return __gthrw_pthread_mutex_destroy (__mutex); + else + return 0; +} + +static inline int +__gthread_mutex_lock (__gthread_mutex_t *__mutex) +{ + if (__gthread_active_p ()) + return __gthrw_pthread_mutex_lock (__mutex); + else + return 0; +} + +static inline int +__gthread_mutex_trylock (__gthread_mutex_t *__mutex) +{ + if (__gthread_active_p ()) + return __gthrw_pthread_mutex_trylock (__mutex); + else + return 0; +} + + +static inline int +__gthread_mutex_timedlock (__gthread_mutex_t *__mutex, + const __gthread_time_t *__abs_timeout) +{ + if (__gthread_active_p ()) + return __gthrw_pthread_mutex_timedlock (__mutex, __abs_timeout); + else + return 0; +} + + +static inline int +__gthread_mutex_unlock (__gthread_mutex_t *__mutex) +{ + if (__gthread_active_p ()) + return __gthrw_pthread_mutex_unlock (__mutex); + else + return 0; +} +# 807 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3 +static inline int +__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) +{ + return __gthread_mutex_lock (__mutex); +} + +static inline int +__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) +{ + return __gthread_mutex_trylock (__mutex); +} + + +static inline int +__gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex, + const __gthread_time_t *__abs_timeout) +{ + return __gthread_mutex_timedlock (__mutex, __abs_timeout); +} + + +static inline int +__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) +{ + return __gthread_mutex_unlock (__mutex); +} + +static inline int +__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) +{ + return __gthread_mutex_destroy (__mutex); +} +# 849 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3 +static inline int +__gthread_cond_broadcast (__gthread_cond_t *__cond) +{ + return __gthrw_pthread_cond_broadcast (__cond); +} + +static inline int +__gthread_cond_signal (__gthread_cond_t *__cond) +{ + return __gthrw_pthread_cond_signal (__cond); +} + +static inline int +__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex) +{ + return __gthrw_pthread_cond_wait (__cond, __mutex); +} + +static inline int +__gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex, + const __gthread_time_t *__abs_timeout) +{ + return __gthrw_pthread_cond_timedwait (__cond, __mutex, __abs_timeout); +} + +static inline int +__gthread_cond_wait_recursive (__gthread_cond_t *__cond, + __gthread_recursive_mutex_t *__mutex) +{ + return __gthread_cond_wait (__cond, __mutex); +} + +static inline int +__gthread_cond_destroy (__gthread_cond_t* __cond) +{ + return __gthrw_pthread_cond_destroy (__cond); +} +# 149 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr.h" 2 3 + + +#pragma GCC visibility pop +# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/atomicity.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/atomic_word.h" 1 3 +# 32 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/atomic_word.h" 3 +typedef int _Atomic_word; +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/atomicity.h" 2 3 + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + + + + + + + + static inline _Atomic_word + __exchange_and_add(volatile _Atomic_word* __mem, int __val) + { return __atomic_fetch_add(__mem, __val, 4); } + + static inline void + __atomic_add(volatile _Atomic_word* __mem, int __val) + { __atomic_fetch_add(__mem, __val, 4); } +# 64 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/atomicity.h" 3 + static inline _Atomic_word + __exchange_and_add_single(_Atomic_word* __mem, int __val) + { + _Atomic_word __result = *__mem; + *__mem += __val; + return __result; + } + + static inline void + __atomic_add_single(_Atomic_word* __mem, int __val) + { *__mem += __val; } + + static inline _Atomic_word + __attribute__ ((__unused__)) + __exchange_and_add_dispatch(_Atomic_word* __mem, int __val) + { + + if (__gthread_active_p()) + return __exchange_and_add(__mem, __val); + else + return __exchange_and_add_single(__mem, __val); + + + + } + + static inline void + __attribute__ ((__unused__)) + __atomic_add_dispatch(_Atomic_word* __mem, int __val) + { + + if (__gthread_active_p()) + __atomic_add(__mem, __val); + else + __atomic_add_single(__mem, __val); + + + + } + + +} +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 2 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 1 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 3 + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 1 3 +# 46 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++allocator.h" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++allocator.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/new_allocator.h" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/new_allocator.h" 3 +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + + + using std::size_t; + using std::ptrdiff_t; +# 57 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/new_allocator.h" 3 + template + class new_allocator + { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + template + struct rebind + { typedef new_allocator<_Tp1> other; }; + + + + + typedef std::true_type propagate_on_container_move_assignment; + + + new_allocator() noexcept { } + + new_allocator(const new_allocator&) noexcept { } + + template + new_allocator(const new_allocator<_Tp1>&) noexcept { } + + ~new_allocator() noexcept { } + + pointer + address(reference __x) const noexcept + { return std::__addressof(__x); } + + const_pointer + address(const_reference __x) const noexcept + { return std::__addressof(__x); } + + + + pointer + allocate(size_type __n, const void* = 0) + { + if (__n > this->max_size()) + std::__throw_bad_alloc(); + + return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); + } + + + void + deallocate(pointer __p, size_type) + { ::operator delete(__p); } + + size_type + max_size() const noexcept + { return size_t(-1) / sizeof(_Tp); } + + + template + void + construct(_Up* __p, _Args&&... __args) + { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } + + template + void + destroy(_Up* __p) { __p->~_Up(); } +# 135 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/new_allocator.h" 3 + }; + + template + inline bool + operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&) + { return true; } + + template + inline bool + operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&) + { return false; } + + +} +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++allocator.h" 2 3 + + +namespace std +{ +# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++allocator.h" 3 + template + using __allocator_base = __gnu_cxx::new_allocator<_Tp>; +} +# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 2 3 +# 57 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 3 + template<> + class allocator + { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef void* pointer; + typedef const void* const_pointer; + typedef void value_type; + + template + struct rebind + { typedef allocator<_Tp1> other; }; + + + + + typedef true_type propagate_on_container_move_assignment; + + typedef true_type is_always_equal; + + template + void + construct(_Up* __p, _Args&&... __args) + { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } + + template + void + destroy(_Up* __p) { __p->~_Up(); } + + }; +# 107 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 3 + template + class allocator: public __allocator_base<_Tp> + { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + template + struct rebind + { typedef allocator<_Tp1> other; }; + + + + + typedef true_type propagate_on_container_move_assignment; + + typedef true_type is_always_equal; + + + allocator() throw() { } + + allocator(const allocator& __a) throw() + : __allocator_base<_Tp>(__a) { } + + template + allocator(const allocator<_Tp1>&) throw() { } + + ~allocator() throw() { } + + + }; + + template + inline bool + operator==(const allocator<_T1>&, const allocator<_T2>&) + noexcept + { return true; } + + template + inline bool + operator==(const allocator<_Tp>&, const allocator<_Tp>&) + noexcept + { return true; } + + template + inline bool + operator!=(const allocator<_T1>&, const allocator<_T2>&) + noexcept + { return false; } + + template + inline bool + operator!=(const allocator<_Tp>&, const allocator<_Tp>&) + noexcept + { return false; } + + + + + + + extern template class allocator; + extern template class allocator; + + + + + + + template + struct __alloc_swap + { static void _S_do_it(_Alloc&, _Alloc&) noexcept { } }; + + template + struct __alloc_swap<_Alloc, false> + { + static void + _S_do_it(_Alloc& __one, _Alloc& __two) noexcept + { + + if (__one != __two) + swap(__one, __two); + } + }; + + + template + struct __alloc_neq + { + static bool + _S_do_it(const _Alloc&, const _Alloc&) + { return false; } + }; + + template + struct __alloc_neq<_Alloc, false> + { + static bool + _S_do_it(const _Alloc& __one, const _Alloc& __two) + { return __one != __two; } + }; + + + template, + is_nothrow_move_constructible>::value> + struct __shrink_to_fit_aux + { static bool _S_do_it(_Tp&) noexcept { return false; } }; + + template + struct __shrink_to_fit_aux<_Tp, true> + { + static bool + _S_do_it(_Tp& __c) noexcept + { + + try + { + _Tp(__make_move_if_noexcept_iterator(__c.begin()), + __make_move_if_noexcept_iterator(__c.end()), + __c.get_allocator()).swap(__c); + return true; + } + catch(...) + { return false; } + + + + } + }; + + + +} +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ostream_insert.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ostream_insert.h" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cxxabi_forced.h" 1 3 +# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cxxabi_forced.h" 3 + +#pragma GCC visibility push(default) + + +namespace __cxxabiv1 +{ + + + + + + + + class __forced_unwind + { + virtual ~__forced_unwind() throw(); + + + virtual void __pure_dummy() = 0; + }; +} + + +#pragma GCC visibility pop +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ostream_insert.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + inline void + __ostream_write(basic_ostream<_CharT, _Traits>& __out, + const _CharT* __s, streamsize __n) + { + typedef basic_ostream<_CharT, _Traits> __ostream_type; + typedef typename __ostream_type::ios_base __ios_base; + + const streamsize __put = __out.rdbuf()->sputn(__s, __n); + if (__put != __n) + __out.setstate(__ios_base::badbit); + } + + template + inline void + __ostream_fill(basic_ostream<_CharT, _Traits>& __out, streamsize __n) + { + typedef basic_ostream<_CharT, _Traits> __ostream_type; + typedef typename __ostream_type::ios_base __ios_base; + + const _CharT __c = __out.fill(); + for (; __n > 0; --__n) + { + const typename _Traits::int_type __put = __out.rdbuf()->sputc(__c); + if (_Traits::eq_int_type(__put, _Traits::eof())) + { + __out.setstate(__ios_base::badbit); + break; + } + } + } + + template + basic_ostream<_CharT, _Traits>& + __ostream_insert(basic_ostream<_CharT, _Traits>& __out, + const _CharT* __s, streamsize __n) + { + typedef basic_ostream<_CharT, _Traits> __ostream_type; + typedef typename __ostream_type::ios_base __ios_base; + + typename __ostream_type::sentry __cerb(__out); + if (__cerb) + { + try + { + const streamsize __w = __out.width(); + if (__w > __n) + { + const bool __left = ((__out.flags() + & __ios_base::adjustfield) + == __ios_base::left); + if (!__left) + __ostream_fill(__out, __w - __n); + if (__out.good()) + __ostream_write(__out, __s, __n); + if (__left && __out.good()) + __ostream_fill(__out, __w - __n); + } + else + __ostream_write(__out, __s, __n); + __out.width(0); + } + catch(__cxxabiv1::__forced_unwind&) + { + __out._M_setstate(__ios_base::badbit); + throw; + } + catch(...) + { __out._M_setstate(__ios_base::badbit); } + } + return __out; + } + + + + + extern template ostream& __ostream_insert(ostream&, const char*, streamsize); + + + extern template wostream& __ostream_insert(wostream&, const wchar_t*, + streamsize); + + + + +} +# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3 + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 1 3 +# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 104 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3 + template + struct unary_function + { + + typedef _Arg argument_type; + + + typedef _Result result_type; + }; + + + + + template + struct binary_function + { + + typedef _Arg1 first_argument_type; + + + typedef _Arg2 second_argument_type; + + + typedef _Result result_type; + }; +# 144 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3 + struct __is_transparent; + + template + struct plus; + + template + struct minus; + + template + struct multiplies; + + template + struct divides; + + template + struct modulus; + + template + struct negate; + + + + template + struct plus : public binary_function<_Tp, _Tp, _Tp> + { + constexpr + _Tp + operator()(const _Tp& __x, const _Tp& __y) const + { return __x + __y; } + }; + + + template + struct minus : public binary_function<_Tp, _Tp, _Tp> + { + constexpr + _Tp + operator()(const _Tp& __x, const _Tp& __y) const + { return __x - __y; } + }; + + + template + struct multiplies : public binary_function<_Tp, _Tp, _Tp> + { + constexpr + _Tp + operator()(const _Tp& __x, const _Tp& __y) const + { return __x * __y; } + }; + + + template + struct divides : public binary_function<_Tp, _Tp, _Tp> + { + constexpr + _Tp + operator()(const _Tp& __x, const _Tp& __y) const + { return __x / __y; } + }; + + + template + struct modulus : public binary_function<_Tp, _Tp, _Tp> + { + constexpr + _Tp + operator()(const _Tp& __x, const _Tp& __y) const + { return __x % __y; } + }; + + + template + struct negate : public unary_function<_Tp, _Tp> + { + constexpr + _Tp + operator()(const _Tp& __x) const + { return -__x; } + }; + + + + + + template<> + struct plus + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) + std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) + std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) + std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct minus + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) - std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) - std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) - std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct multiplies + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) * std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) * std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) * std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct divides + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) / std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) / std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) / std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct modulus + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) % std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) % std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) % std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct negate + { + template + constexpr + auto + operator()(_Tp&& __t) const + noexcept(noexcept(-std::forward<_Tp>(__t))) + -> decltype(-std::forward<_Tp>(__t)) + { return -std::forward<_Tp>(__t); } + + typedef __is_transparent is_transparent; + }; +# 330 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3 + template + struct equal_to; + + template + struct not_equal_to; + + template + struct greater; + + template + struct less; + + template + struct greater_equal; + + template + struct less_equal; + + + + template + struct equal_to : public binary_function<_Tp, _Tp, bool> + { + constexpr + bool + operator()(const _Tp& __x, const _Tp& __y) const + { return __x == __y; } + }; + + + template + struct not_equal_to : public binary_function<_Tp, _Tp, bool> + { + constexpr + bool + operator()(const _Tp& __x, const _Tp& __y) const + { return __x != __y; } + }; + + + template + struct greater : public binary_function<_Tp, _Tp, bool> + { + constexpr + bool + operator()(const _Tp& __x, const _Tp& __y) const + { return __x > __y; } + }; + + + template + struct less : public binary_function<_Tp, _Tp, bool> + { + constexpr + bool + operator()(const _Tp& __x, const _Tp& __y) const + { return __x < __y; } + }; + + + template + struct greater_equal : public binary_function<_Tp, _Tp, bool> + { + constexpr + bool + operator()(const _Tp& __x, const _Tp& __y) const + { return __x >= __y; } + }; + + + template + struct less_equal : public binary_function<_Tp, _Tp, bool> + { + constexpr + bool + operator()(const _Tp& __x, const _Tp& __y) const + { return __x <= __y; } + }; + + + + template<> + struct equal_to + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) == std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) == std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) == std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct not_equal_to + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) != std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) != std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) != std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct greater + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) > std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) > std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) > std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct less + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct greater_equal + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) >= std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) >= std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) >= std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct less_equal + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) <= std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) <= std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) <= std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; +# 512 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3 + template + struct logical_and; + + template + struct logical_or; + + template + struct logical_not; + + + + template + struct logical_and : public binary_function<_Tp, _Tp, bool> + { + constexpr + bool + operator()(const _Tp& __x, const _Tp& __y) const + { return __x && __y; } + }; + + + template + struct logical_or : public binary_function<_Tp, _Tp, bool> + { + constexpr + bool + operator()(const _Tp& __x, const _Tp& __y) const + { return __x || __y; } + }; + + + template + struct logical_not : public unary_function<_Tp, bool> + { + constexpr + bool + operator()(const _Tp& __x) const + { return !__x; } + }; + + + + template<> + struct logical_and + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) && std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) && std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) && std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct logical_or + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) || std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) || std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) || std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + + template<> + struct logical_not + { + template + constexpr + auto + operator()(_Tp&& __t) const + noexcept(noexcept(!std::forward<_Tp>(__t))) + -> decltype(!std::forward<_Tp>(__t)) + { return !std::forward<_Tp>(__t); } + + typedef __is_transparent is_transparent; + }; + + + + + template + struct bit_and; + + template + struct bit_or; + + template + struct bit_xor; + + template + struct bit_not; + + + + + template + struct bit_and : public binary_function<_Tp, _Tp, _Tp> + { + constexpr + _Tp + operator()(const _Tp& __x, const _Tp& __y) const + { return __x & __y; } + }; + + template + struct bit_or : public binary_function<_Tp, _Tp, _Tp> + { + constexpr + _Tp + operator()(const _Tp& __x, const _Tp& __y) const + { return __x | __y; } + }; + + template + struct bit_xor : public binary_function<_Tp, _Tp, _Tp> + { + constexpr + _Tp + operator()(const _Tp& __x, const _Tp& __y) const + { return __x ^ __y; } + }; + + template + struct bit_not : public unary_function<_Tp, _Tp> + { + constexpr + _Tp + operator()(const _Tp& __x) const + { return ~__x; } + }; + + + template <> + struct bit_and + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) & std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) & std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) & std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + template <> + struct bit_or + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) | std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) | std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) | std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + template <> + struct bit_xor + { + template + constexpr + auto + operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u))) + -> decltype(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u)) + { return std::forward<_Tp>(__t) ^ std::forward<_Up>(__u); } + + typedef __is_transparent is_transparent; + }; + + template <> + struct bit_not + { + template + constexpr + auto + operator()(_Tp&& __t) const + noexcept(noexcept(~std::forward<_Tp>(__t))) + -> decltype(~std::forward<_Tp>(__t)) + { return ~std::forward<_Tp>(__t); } + + typedef __is_transparent is_transparent; + }; +# 740 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3 + template + class unary_negate + : public unary_function + { + protected: + _Predicate _M_pred; + + public: + constexpr + explicit + unary_negate(const _Predicate& __x) : _M_pred(__x) { } + + constexpr + bool + operator()(const typename _Predicate::argument_type& __x) const + { return !_M_pred(__x); } + }; + + + template + constexpr + inline unary_negate<_Predicate> + not1(const _Predicate& __pred) + { return unary_negate<_Predicate>(__pred); } + + + template + class binary_negate + : public binary_function + { + protected: + _Predicate _M_pred; + + public: + constexpr + explicit + binary_negate(const _Predicate& __x) : _M_pred(__x) { } + + constexpr + bool + operator()(const typename _Predicate::first_argument_type& __x, + const typename _Predicate::second_argument_type& __y) const + { return !_M_pred(__x, __y); } + }; + + + template + constexpr + inline binary_negate<_Predicate> + not2(const _Predicate& __pred) + { return binary_negate<_Predicate>(__pred); } +# 817 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3 + template + class pointer_to_unary_function : public unary_function<_Arg, _Result> + { + protected: + _Result (*_M_ptr)(_Arg); + + public: + pointer_to_unary_function() { } + + explicit + pointer_to_unary_function(_Result (*__x)(_Arg)) + : _M_ptr(__x) { } + + _Result + operator()(_Arg __x) const + { return _M_ptr(__x); } + }; + + + template + inline pointer_to_unary_function<_Arg, _Result> + ptr_fun(_Result (*__x)(_Arg)) + { return pointer_to_unary_function<_Arg, _Result>(__x); } + + + template + class pointer_to_binary_function + : public binary_function<_Arg1, _Arg2, _Result> + { + protected: + _Result (*_M_ptr)(_Arg1, _Arg2); + + public: + pointer_to_binary_function() { } + + explicit + pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2)) + : _M_ptr(__x) { } + + _Result + operator()(_Arg1 __x, _Arg2 __y) const + { return _M_ptr(__x, __y); } + }; + + + template + inline pointer_to_binary_function<_Arg1, _Arg2, _Result> + ptr_fun(_Result (*__x)(_Arg1, _Arg2)) + { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); } + + + template + struct _Identity + : public unary_function<_Tp,_Tp> + { + _Tp& + operator()(_Tp& __x) const + { return __x; } + + const _Tp& + operator()(const _Tp& __x) const + { return __x; } + }; + + template + struct _Select1st + : public unary_function<_Pair, typename _Pair::first_type> + { + typename _Pair::first_type& + operator()(_Pair& __x) const + { return __x.first; } + + const typename _Pair::first_type& + operator()(const _Pair& __x) const + { return __x.first; } + + + template + typename _Pair2::first_type& + operator()(_Pair2& __x) const + { return __x.first; } + + template + const typename _Pair2::first_type& + operator()(const _Pair2& __x) const + { return __x.first; } + + }; + + template + struct _Select2nd + : public unary_function<_Pair, typename _Pair::second_type> + { + typename _Pair::second_type& + operator()(_Pair& __x) const + { return __x.second; } + + const typename _Pair::second_type& + operator()(const _Pair& __x) const + { return __x.second; } + }; +# 937 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3 + template + class mem_fun_t : public unary_function<_Tp*, _Ret> + { + public: + explicit + mem_fun_t(_Ret (_Tp::*__pf)()) + : _M_f(__pf) { } + + _Ret + operator()(_Tp* __p) const + { return (__p->*_M_f)(); } + + private: + _Ret (_Tp::*_M_f)(); + }; + + + + template + class const_mem_fun_t : public unary_function + { + public: + explicit + const_mem_fun_t(_Ret (_Tp::*__pf)() const) + : _M_f(__pf) { } + + _Ret + operator()(const _Tp* __p) const + { return (__p->*_M_f)(); } + + private: + _Ret (_Tp::*_M_f)() const; + }; + + + + template + class mem_fun_ref_t : public unary_function<_Tp, _Ret> + { + public: + explicit + mem_fun_ref_t(_Ret (_Tp::*__pf)()) + : _M_f(__pf) { } + + _Ret + operator()(_Tp& __r) const + { return (__r.*_M_f)(); } + + private: + _Ret (_Tp::*_M_f)(); + }; + + + + template + class const_mem_fun_ref_t : public unary_function<_Tp, _Ret> + { + public: + explicit + const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) + : _M_f(__pf) { } + + _Ret + operator()(const _Tp& __r) const + { return (__r.*_M_f)(); } + + private: + _Ret (_Tp::*_M_f)() const; + }; + + + + template + class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret> + { + public: + explicit + mem_fun1_t(_Ret (_Tp::*__pf)(_Arg)) + : _M_f(__pf) { } + + _Ret + operator()(_Tp* __p, _Arg __x) const + { return (__p->*_M_f)(__x); } + + private: + _Ret (_Tp::*_M_f)(_Arg); + }; + + + + template + class const_mem_fun1_t : public binary_function + { + public: + explicit + const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const) + : _M_f(__pf) { } + + _Ret + operator()(const _Tp* __p, _Arg __x) const + { return (__p->*_M_f)(__x); } + + private: + _Ret (_Tp::*_M_f)(_Arg) const; + }; + + + + template + class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret> + { + public: + explicit + mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg)) + : _M_f(__pf) { } + + _Ret + operator()(_Tp& __r, _Arg __x) const + { return (__r.*_M_f)(__x); } + + private: + _Ret (_Tp::*_M_f)(_Arg); + }; + + + + template + class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret> + { + public: + explicit + const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const) + : _M_f(__pf) { } + + _Ret + operator()(const _Tp& __r, _Arg __x) const + { return (__r.*_M_f)(__x); } + + private: + _Ret (_Tp::*_M_f)(_Arg) const; + }; + + + + template + inline mem_fun_t<_Ret, _Tp> + mem_fun(_Ret (_Tp::*__f)()) + { return mem_fun_t<_Ret, _Tp>(__f); } + + template + inline const_mem_fun_t<_Ret, _Tp> + mem_fun(_Ret (_Tp::*__f)() const) + { return const_mem_fun_t<_Ret, _Tp>(__f); } + + template + inline mem_fun_ref_t<_Ret, _Tp> + mem_fun_ref(_Ret (_Tp::*__f)()) + { return mem_fun_ref_t<_Ret, _Tp>(__f); } + + template + inline const_mem_fun_ref_t<_Ret, _Tp> + mem_fun_ref(_Ret (_Tp::*__f)() const) + { return const_mem_fun_ref_t<_Ret, _Tp>(__f); } + + template + inline mem_fun1_t<_Ret, _Tp, _Arg> + mem_fun(_Ret (_Tp::*__f)(_Arg)) + { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); } + + template + inline const_mem_fun1_t<_Ret, _Tp, _Arg> + mem_fun(_Ret (_Tp::*__f)(_Arg) const) + { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); } + + template + inline mem_fun1_ref_t<_Ret, _Tp, _Arg> + mem_fun_ref(_Ret (_Tp::*__f)(_Arg)) + { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); } + + template + inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg> + mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const) + { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); } + + + + +} + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/backward/binders.h" 1 3 +# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/backward/binders.h" 3 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 107 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/backward/binders.h" 3 + template + class binder1st + : public unary_function + { + protected: + _Operation op; + typename _Operation::first_argument_type value; + + public: + binder1st(const _Operation& __x, + const typename _Operation::first_argument_type& __y) + : op(__x), value(__y) { } + + typename _Operation::result_type + operator()(const typename _Operation::second_argument_type& __x) const + { return op(value, __x); } + + + + typename _Operation::result_type + operator()(typename _Operation::second_argument_type& __x) const + { return op(value, __x); } + } __attribute__ ((__deprecated__)); + + + template + inline binder1st<_Operation> + bind1st(const _Operation& __fn, const _Tp& __x) + { + typedef typename _Operation::first_argument_type _Arg1_type; + return binder1st<_Operation>(__fn, _Arg1_type(__x)); + } + + + template + class binder2nd + : public unary_function + { + protected: + _Operation op; + typename _Operation::second_argument_type value; + + public: + binder2nd(const _Operation& __x, + const typename _Operation::second_argument_type& __y) + : op(__x), value(__y) { } + + typename _Operation::result_type + operator()(const typename _Operation::first_argument_type& __x) const + { return op(__x, value); } + + + + typename _Operation::result_type + operator()(typename _Operation::first_argument_type& __x) const + { return op(__x, value); } + } __attribute__ ((__deprecated__)); + + + template + inline binder2nd<_Operation> + bind2nd(const _Operation& __fn, const _Tp& __x) + { + typedef typename _Operation::second_argument_type _Arg2_type; + return binder2nd<_Operation>(__fn, _Arg2_type(__x)); + } + + + +} + +#pragma GCC diagnostic pop +# 1128 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 2 3 +# 49 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/range_access.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/range_access.h" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/initializer_list" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/initializer_list" 3 + + + + + +#pragma GCC visibility push(default) + + + +namespace std +{ + + template + class initializer_list + { + public: + typedef _E value_type; + typedef const _E& reference; + typedef const _E& const_reference; + typedef size_t size_type; + typedef const _E* iterator; + typedef const _E* const_iterator; + + private: + iterator _M_array; + size_type _M_len; + + + constexpr initializer_list(const_iterator __a, size_type __l) + : _M_array(__a), _M_len(__l) { } + + public: + constexpr initializer_list() noexcept + : _M_array(0), _M_len(0) { } + + + constexpr size_type + size() const noexcept { return _M_len; } + + + constexpr const_iterator + begin() const noexcept { return _M_array; } + + + constexpr const_iterator + end() const noexcept { return begin() + size(); } + }; + + + + + + + template + constexpr const _Tp* + begin(initializer_list<_Tp> __ils) noexcept + { return __ils.begin(); } + + + + + + + template + constexpr const _Tp* + end(initializer_list<_Tp> __ils) noexcept + { return __ils.end(); } +} + +#pragma GCC visibility pop +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/range_access.h" 2 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + + + template + inline auto + begin(_Container& __cont) -> decltype(__cont.begin()) + { return __cont.begin(); } + + + + + + + template + inline auto + begin(const _Container& __cont) -> decltype(__cont.begin()) + { return __cont.begin(); } + + + + + + + template + inline auto + end(_Container& __cont) -> decltype(__cont.end()) + { return __cont.end(); } + + + + + + + template + inline auto + end(const _Container& __cont) -> decltype(__cont.end()) + { return __cont.end(); } + + + + + + template + inline constexpr _Tp* + begin(_Tp (&__arr)[_Nm]) + { return __arr; } + + + + + + + template + inline constexpr _Tp* + end(_Tp (&__arr)[_Nm]) + { return __arr + _Nm; } + + + + template class valarray; + + template _Tp* begin(valarray<_Tp>&); + template const _Tp* begin(const valarray<_Tp>&); + template _Tp* end(valarray<_Tp>&); + template const _Tp* end(const valarray<_Tp>&); + + + + + + + template + inline constexpr auto + cbegin(const _Container& __cont) noexcept(noexcept(std::begin(__cont))) + -> decltype(std::begin(__cont)) + { return std::begin(__cont); } + + + + + + + template + inline constexpr auto + cend(const _Container& __cont) noexcept(noexcept(std::end(__cont))) + -> decltype(std::end(__cont)) + { return std::end(__cont); } + + + + + + + template + inline auto + rbegin(_Container& __cont) -> decltype(__cont.rbegin()) + { return __cont.rbegin(); } + + + + + + + template + inline auto + rbegin(const _Container& __cont) -> decltype(__cont.rbegin()) + { return __cont.rbegin(); } + + + + + + + template + inline auto + rend(_Container& __cont) -> decltype(__cont.rend()) + { return __cont.rend(); } + + + + + + + template + inline auto + rend(const _Container& __cont) -> decltype(__cont.rend()) + { return __cont.rend(); } + + + + + + + template + inline reverse_iterator<_Tp*> + rbegin(_Tp (&__arr)[_Nm]) + { return reverse_iterator<_Tp*>(__arr + _Nm); } + + + + + + + template + inline reverse_iterator<_Tp*> + rend(_Tp (&__arr)[_Nm]) + { return reverse_iterator<_Tp*>(__arr); } + + + + + + + template + inline reverse_iterator + rbegin(initializer_list<_Tp> __il) + { return reverse_iterator(__il.end()); } + + + + + + + template + inline reverse_iterator + rend(initializer_list<_Tp> __il) + { return reverse_iterator(__il.begin()); } + + + + + + + template + inline auto + crbegin(const _Container& __cont) -> decltype(std::rbegin(__cont)) + { return std::rbegin(__cont); } + + + + + + + template + inline auto + crend(const _Container& __cont) -> decltype(std::rend(__cont)) + { return std::rend(__cont); } +# 320 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/range_access.h" 3 +} +# 52 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/alloc_traits.h" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/alloc_traits.h" 3 + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 1 3 +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + struct __allocator_traits_base + { + template + using __rebind = typename _Alloc::template rebind<_Up>::other; + + protected: + template + using __pointer = typename _Tp::pointer; + template + using __c_pointer = typename _Tp::const_pointer; + template + using __v_pointer = typename _Tp::void_pointer; + template + using __cv_pointer = typename _Tp::const_void_pointer; + template + using __diff_type = typename _Tp::difference_type; + template + using __size_type = typename _Tp::size_type; + template + using __pocca = typename _Tp::propagate_on_container_copy_assignment; + template + using __pocma = typename _Tp::propagate_on_container_move_assignment; + template + using __pocs = typename _Tp::propagate_on_container_swap; + template + using __equal = typename _Tp::is_always_equal; + }; + + template + using __alloc_rebind = __detected_or_t_<__replace_first_arg_t, + __allocator_traits_base::__rebind, + _Alloc, _Up>; + + + + + + template + struct allocator_traits : __allocator_traits_base + { + + typedef _Alloc allocator_type; + + typedef typename _Alloc::value_type value_type; + + + + + + + using pointer = __detected_or_t; + + + + + + + + using const_pointer + = __detected_or_t<__ptr_rebind, + __c_pointer, _Alloc>; + + + + + + + + using void_pointer + = __detected_or_t<__ptr_rebind, __v_pointer, _Alloc>; + + + + + + + + using const_void_pointer + = __detected_or_t<__ptr_rebind, __cv_pointer, + _Alloc>; + + + + + + + + using difference_type + = __detected_or_t::difference_type, + __diff_type, _Alloc>; + + + + + + + + using size_type + = __detected_or_t::type, + __size_type, _Alloc>; + + + + + + + + using propagate_on_container_copy_assignment + = __detected_or_t; + + + + + + + + using propagate_on_container_move_assignment + = __detected_or_t; + + + + + + + + using propagate_on_container_swap + = __detected_or_t; + + + + + + + + using is_always_equal + = __detected_or_t::type, __equal, _Alloc>; + + template + using rebind_alloc = __alloc_rebind<_Alloc, _Tp>; + template + using rebind_traits = allocator_traits>; + + static_assert(!is_same, __undefined>::value, + "allocator defines rebind or is like Alloc"); + + private: + template + static auto + _S_allocate(_Alloc2& __a, size_type __n, const_void_pointer __hint, int) + -> decltype(__a.allocate(__n, __hint)) + { return __a.allocate(__n, __hint); } + + template + static pointer + _S_allocate(_Alloc2& __a, size_type __n, const_void_pointer, ...) + { return __a.allocate(__n); } + + template + struct __construct_helper + { + template()->construct( + std::declval<_Tp*>(), std::declval<_Args>()...))> + static true_type __test(int); + + template + static false_type __test(...); + + using type = decltype(__test<_Alloc>(0)); + }; + + template + using __has_construct + = typename __construct_helper<_Tp, _Args...>::type; + + template + static _Require<__has_construct<_Tp, _Args...>> + _S_construct(_Alloc& __a, _Tp* __p, _Args&&... __args) + { __a.construct(__p, std::forward<_Args>(__args)...); } + + template + static + _Require<__and_<__not_<__has_construct<_Tp, _Args...>>, + is_constructible<_Tp, _Args...>>> + _S_construct(_Alloc&, _Tp* __p, _Args&&... __args) + { ::new((void*)__p) _Tp(std::forward<_Args>(__args)...); } + + template + static auto + _S_destroy(_Alloc2& __a, _Tp* __p, int) + -> decltype(__a.destroy(__p)) + { __a.destroy(__p); } + + template + static void + _S_destroy(_Alloc2&, _Tp* __p, ...) + { __p->~_Tp(); } + + template + static auto + _S_max_size(_Alloc2& __a, int) + -> decltype(__a.max_size()) + { return __a.max_size(); } + + template + static size_type + _S_max_size(_Alloc2&, ...) + { + + + return __gnu_cxx::__numeric_traits::__max + / sizeof(value_type); + } + + template + static auto + _S_select(_Alloc2& __a, int) + -> decltype(__a.select_on_container_copy_construction()) + { return __a.select_on_container_copy_construction(); } + + template + static _Alloc2 + _S_select(_Alloc2& __a, ...) + { return __a; } + + public: +# 279 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + static pointer + allocate(_Alloc& __a, size_type __n) + { return __a.allocate(__n); } +# 294 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + static pointer + allocate(_Alloc& __a, size_type __n, const_void_pointer __hint) + { return _S_allocate(__a, __n, __hint, 0); } +# 306 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + static void + deallocate(_Alloc& __a, pointer __p, size_type __n) + { __a.deallocate(__p, __n); } +# 321 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + template + static auto construct(_Alloc& __a, _Tp* __p, _Args&&... __args) + -> decltype(_S_construct(__a, __p, std::forward<_Args>(__args)...)) + { _S_construct(__a, __p, std::forward<_Args>(__args)...); } +# 334 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + template + static void destroy(_Alloc& __a, _Tp* __p) + { _S_destroy(__a, __p, 0); } +# 346 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + static size_type max_size(const _Alloc& __a) noexcept + { return _S_max_size(__a, 0); } +# 357 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + static _Alloc + select_on_container_copy_construction(const _Alloc& __rhs) + { return _S_select(__rhs, 0); } + }; + + + template + struct allocator_traits> + { + + using allocator_type = allocator<_Tp>; + + using value_type = _Tp; + + + using pointer = _Tp*; + + + using const_pointer = const _Tp*; + + + using void_pointer = void*; + + + using const_void_pointer = const void*; + + + using difference_type = std::ptrdiff_t; + + + using size_type = std::size_t; + + + using propagate_on_container_copy_assignment = false_type; + + + using propagate_on_container_move_assignment = true_type; + + + using propagate_on_container_swap = false_type; + + + using is_always_equal = true_type; + + template + using rebind_alloc = allocator<_Up>; + + template + using rebind_traits = allocator_traits>; +# 414 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + static pointer + allocate(allocator_type& __a, size_type __n) + { return __a.allocate(__n); } +# 428 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + static pointer + allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) + { return __a.allocate(__n, __hint); } +# 440 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + static void + deallocate(allocator_type& __a, pointer __p, size_type __n) + { __a.deallocate(__p, __n); } +# 452 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + template + static void + construct(allocator_type& __a, _Up* __p, _Args&&... __args) + { __a.construct(__p, std::forward<_Args>(__args)...); } +# 464 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3 + template + static void + destroy(allocator_type& __a, _Up* __p) + { __a.destroy(__p); } + + + + + + + static size_type + max_size(const allocator_type& __a) noexcept + { return __a.max_size(); } + + + + + + + static allocator_type + select_on_container_copy_construction(const allocator_type& __rhs) + { return __rhs; } + }; + + + template + inline void + __do_alloc_on_copy(_Alloc& __one, const _Alloc& __two, true_type) + { __one = __two; } + + template + inline void + __do_alloc_on_copy(_Alloc&, const _Alloc&, false_type) + { } + + template + inline void __alloc_on_copy(_Alloc& __one, const _Alloc& __two) + { + typedef allocator_traits<_Alloc> __traits; + typedef typename __traits::propagate_on_container_copy_assignment __pocca; + __do_alloc_on_copy(__one, __two, __pocca()); + } + + template + inline _Alloc __alloc_on_copy(const _Alloc& __a) + { + typedef allocator_traits<_Alloc> __traits; + return __traits::select_on_container_copy_construction(__a); + } + + template + inline void __do_alloc_on_move(_Alloc& __one, _Alloc& __two, true_type) + { __one = std::move(__two); } + + template + inline void __do_alloc_on_move(_Alloc&, _Alloc&, false_type) + { } + + template + inline void __alloc_on_move(_Alloc& __one, _Alloc& __two) + { + typedef allocator_traits<_Alloc> __traits; + typedef typename __traits::propagate_on_container_move_assignment __pocma; + __do_alloc_on_move(__one, __two, __pocma()); + } + + template + inline void __do_alloc_on_swap(_Alloc& __one, _Alloc& __two, true_type) + { + using std::swap; + swap(__one, __two); + } + + template + inline void __do_alloc_on_swap(_Alloc&, _Alloc&, false_type) + { } + + template + inline void __alloc_on_swap(_Alloc& __one, _Alloc& __two) + { + typedef allocator_traits<_Alloc> __traits; + typedef typename __traits::propagate_on_container_swap __pocs; + __do_alloc_on_swap(__one, __two, __pocs()); + } + + template + class __is_copy_insertable_impl + { + typedef allocator_traits<_Alloc> _Traits; + + template(), + std::declval<_Up*>(), + std::declval()))> + static true_type + _M_select(int); + + template + static false_type + _M_select(...); + + public: + typedef decltype(_M_select(0)) type; + }; + + + template + struct __is_copy_insertable + : __is_copy_insertable_impl<_Alloc>::type + { }; + + + template + struct __is_copy_insertable> + : is_copy_constructible<_Tp> + { }; + + +} +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/alloc_traits.h" 2 3 + + + + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + + + + + + +template + struct __alloc_traits + + : std::allocator_traits<_Alloc> + + { + typedef _Alloc allocator_type; + + typedef std::allocator_traits<_Alloc> _Base_type; + typedef typename _Base_type::value_type value_type; + typedef typename _Base_type::pointer pointer; + typedef typename _Base_type::const_pointer const_pointer; + typedef typename _Base_type::size_type size_type; + typedef typename _Base_type::difference_type difference_type; + + typedef value_type& reference; + typedef const value_type& const_reference; + using _Base_type::allocate; + using _Base_type::deallocate; + using _Base_type::construct; + using _Base_type::destroy; + using _Base_type::max_size; + + private: + template + using __is_custom_pointer + = std::__and_, + std::__not_>>; + + public: + + template + static typename std::enable_if<__is_custom_pointer<_Ptr>::value>::type + construct(_Alloc& __a, _Ptr __p, _Args&&... __args) + { + _Base_type::construct(__a, std::addressof(*__p), + std::forward<_Args>(__args)...); + } + + + template + static typename std::enable_if<__is_custom_pointer<_Ptr>::value>::type + destroy(_Alloc& __a, _Ptr __p) + { _Base_type::destroy(__a, std::addressof(*__p)); } + + static _Alloc _S_select_on_copy(const _Alloc& __a) + { return _Base_type::select_on_container_copy_construction(__a); } + + static void _S_on_swap(_Alloc& __a, _Alloc& __b) + { std::__alloc_on_swap(__a, __b); } + + static constexpr bool _S_propagate_on_copy_assign() + { return _Base_type::propagate_on_container_copy_assignment::value; } + + static constexpr bool _S_propagate_on_move_assign() + { return _Base_type::propagate_on_container_move_assignment::value; } + + static constexpr bool _S_propagate_on_swap() + { return _Base_type::propagate_on_container_swap::value; } + + static constexpr bool _S_always_equal() + { return _Base_type::is_always_equal::value; } + + static constexpr bool _S_nothrow_move() + { return _S_propagate_on_move_assign() || _S_always_equal(); } + + template + struct rebind + { typedef typename _Base_type::template rebind_alloc<_Tp> other; }; +# 158 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/alloc_traits.h" 3 + }; + + +} +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 2 3 + + + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + +namespace __cxx11 { +# 71 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + class basic_string + { + typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template + rebind<_CharT>::other _Char_alloc_type; + typedef __gnu_cxx::__alloc_traits<_Char_alloc_type> _Alloc_traits; + + + public: + typedef _Traits traits_type; + typedef typename _Traits::char_type value_type; + typedef _Char_alloc_type allocator_type; + typedef typename _Alloc_traits::size_type size_type; + typedef typename _Alloc_traits::difference_type difference_type; + typedef typename _Alloc_traits::reference reference; + typedef typename _Alloc_traits::const_reference const_reference; + typedef typename _Alloc_traits::pointer pointer; + typedef typename _Alloc_traits::const_pointer const_pointer; + typedef __gnu_cxx::__normal_iterator iterator; + typedef __gnu_cxx::__normal_iterator + const_iterator; + typedef std::reverse_iterator const_reverse_iterator; + typedef std::reverse_iterator reverse_iterator; + + + static const size_type npos = static_cast(-1); + + private: + + + + + typedef const_iterator __const_iterator; + + + + struct _Alloc_hider : allocator_type + { + _Alloc_hider(pointer __dat, const _Alloc& __a = _Alloc()) + : allocator_type(__a), _M_p(__dat) { } + + pointer _M_p; + }; + + _Alloc_hider _M_dataplus; + size_type _M_string_length; + + enum { _S_local_capacity = 15 / sizeof(_CharT) }; + + union + { + _CharT _M_local_buf[_S_local_capacity + 1]; + size_type _M_allocated_capacity; + }; + + void + _M_data(pointer __p) + { _M_dataplus._M_p = __p; } + + void + _M_length(size_type __length) + { _M_string_length = __length; } + + pointer + _M_data() const + { return _M_dataplus._M_p; } + + pointer + _M_local_data() + { + + return std::pointer_traits::pointer_to(*_M_local_buf); + + + + } + + const_pointer + _M_local_data() const + { + + return std::pointer_traits::pointer_to(*_M_local_buf); + + + + } + + void + _M_capacity(size_type __capacity) + { _M_allocated_capacity = __capacity; } + + void + _M_set_length(size_type __n) + { + _M_length(__n); + traits_type::assign(_M_data()[__n], _CharT()); + } + + bool + _M_is_local() const + { return _M_data() == _M_local_data(); } + + + pointer + _M_create(size_type&, size_type); + + void + _M_dispose() + { + if (!_M_is_local()) + _M_destroy(_M_allocated_capacity); + } + + void + _M_destroy(size_type __size) throw() + { _Alloc_traits::deallocate(_M_get_allocator(), _M_data(), __size + 1); } + + + + template + void + _M_construct_aux(_InIterator __beg, _InIterator __end, + std::__false_type) + { + typedef typename iterator_traits<_InIterator>::iterator_category _Tag; + _M_construct(__beg, __end, _Tag()); + } + + + + template + void + _M_construct_aux(_Integer __beg, _Integer __end, std::__true_type) + { _M_construct_aux_2(static_cast(__beg), __end); } + + void + _M_construct_aux_2(size_type __req, _CharT __c) + { _M_construct(__req, __c); } + + template + void + _M_construct(_InIterator __beg, _InIterator __end) + { + typedef typename std::__is_integer<_InIterator>::__type _Integral; + _M_construct_aux(__beg, __end, _Integral()); + } + + + template + void + _M_construct(_InIterator __beg, _InIterator __end, + std::input_iterator_tag); + + + + template + void + _M_construct(_FwdIterator __beg, _FwdIterator __end, + std::forward_iterator_tag); + + void + _M_construct(size_type __req, _CharT __c); + + allocator_type& + _M_get_allocator() + { return _M_dataplus; } + + const allocator_type& + _M_get_allocator() const + { return _M_dataplus; } + + private: +# 258 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + _M_check(size_type __pos, const char* __s) const + { + if (__pos > this->size()) + __throw_out_of_range_fmt(("%s: __pos (which is %zu) > " "this->size() (which is %zu)"), + + __s, __pos, this->size()); + return __pos; + } + + void + _M_check_length(size_type __n1, size_type __n2, const char* __s) const + { + if (this->max_size() - (this->size() - __n1) < __n2) + __throw_length_error((__s)); + } + + + + size_type + _M_limit(size_type __pos, size_type __off) const noexcept + { + const bool __testoff = __off < this->size() - __pos; + return __testoff ? __off : this->size() - __pos; + } + + + bool + _M_disjunct(const _CharT* __s) const noexcept + { + return (less()(__s, _M_data()) + || less()(_M_data() + this->size(), __s)); + } + + + + static void + _S_copy(_CharT* __d, const _CharT* __s, size_type __n) + { + if (__n == 1) + traits_type::assign(*__d, *__s); + else + traits_type::copy(__d, __s, __n); + } + + static void + _S_move(_CharT* __d, const _CharT* __s, size_type __n) + { + if (__n == 1) + traits_type::assign(*__d, *__s); + else + traits_type::move(__d, __s, __n); + } + + static void + _S_assign(_CharT* __d, size_type __n, _CharT __c) + { + if (__n == 1) + traits_type::assign(*__d, __c); + else + traits_type::assign(__d, __n, __c); + } + + + + template + static void + _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2) + { + for (; __k1 != __k2; ++__k1, (void)++__p) + traits_type::assign(*__p, *__k1); + } + + static void + _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2) noexcept + { _S_copy_chars(__p, __k1.base(), __k2.base()); } + + static void + _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2) + noexcept + { _S_copy_chars(__p, __k1.base(), __k2.base()); } + + static void + _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) noexcept + { _S_copy(__p, __k1, __k2 - __k1); } + + static void + _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2) + noexcept + { _S_copy(__p, __k1, __k2 - __k1); } + + static int + _S_compare(size_type __n1, size_type __n2) noexcept + { + const difference_type __d = difference_type(__n1 - __n2); + + if (__d > __gnu_cxx::__numeric_traits::__max) + return __gnu_cxx::__numeric_traits::__max; + else if (__d < __gnu_cxx::__numeric_traits::__min) + return __gnu_cxx::__numeric_traits::__min; + else + return int(__d); + } + + void + _M_assign(const basic_string& __rcs); + + void + _M_mutate(size_type __pos, size_type __len1, const _CharT* __s, + size_type __len2); + + void + _M_erase(size_type __pos, size_type __n); + + public: + + + + + + + + basic_string() + noexcept(is_nothrow_default_constructible<_Alloc>::value) + : _M_dataplus(_M_local_data()) + { _M_set_length(0); } + + + + + explicit + basic_string(const _Alloc& __a) noexcept + : _M_dataplus(_M_local_data(), __a) + { _M_set_length(0); } + + + + + + basic_string(const basic_string& __str) + : _M_dataplus(_M_local_data(), + _Alloc_traits::_S_select_on_copy(__str._M_get_allocator())) + { _M_construct(__str._M_data(), __str._M_data() + __str.length()); } +# 410 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string(const basic_string& __str, size_type __pos, + size_type __n = npos) + : _M_dataplus(_M_local_data()) + { + const _CharT* __start = __str._M_data() + + __str._M_check(__pos, "basic_string::basic_string"); + _M_construct(__start, __start + __str._M_limit(__pos, __n)); + } +# 426 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string(const basic_string& __str, size_type __pos, + size_type __n, const _Alloc& __a) + : _M_dataplus(_M_local_data(), __a) + { + const _CharT* __start + = __str._M_data() + __str._M_check(__pos, "string::string"); + _M_construct(__start, __start + __str._M_limit(__pos, __n)); + } +# 444 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string(const _CharT* __s, size_type __n, + const _Alloc& __a = _Alloc()) + : _M_dataplus(_M_local_data(), __a) + { _M_construct(__s, __s + __n); } + + + + + + + basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()) + : _M_dataplus(_M_local_data(), __a) + { _M_construct(__s, __s ? __s + traits_type::length(__s) : __s+npos); } + + + + + + + + basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc()) + : _M_dataplus(_M_local_data(), __a) + { _M_construct(__n, __c); } +# 476 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string(basic_string&& __str) noexcept + : _M_dataplus(_M_local_data(), std::move(__str._M_get_allocator())) + { + if (__str._M_is_local()) + { + traits_type::copy(_M_local_buf, __str._M_local_buf, + _S_local_capacity + 1); + } + else + { + _M_data(__str._M_data()); + _M_capacity(__str._M_allocated_capacity); + } + + + + + _M_length(__str.length()); + __str._M_data(__str._M_local_data()); + __str._M_set_length(0); + } + + + + + + + basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc()) + : _M_dataplus(_M_local_data(), __a) + { _M_construct(__l.begin(), __l.end()); } + + basic_string(const basic_string& __str, const _Alloc& __a) + : _M_dataplus(_M_local_data(), __a) + { _M_construct(__str.begin(), __str.end()); } + + basic_string(basic_string&& __str, const _Alloc& __a) + noexcept(_Alloc_traits::_S_always_equal()) + : _M_dataplus(_M_local_data(), __a) + { + if (__str._M_is_local()) + { + traits_type::copy(_M_local_buf, __str._M_local_buf, + _S_local_capacity + 1); + _M_length(__str.length()); + __str._M_set_length(0); + } + else if (_Alloc_traits::_S_always_equal() + || __str.get_allocator() == __a) + { + _M_data(__str._M_data()); + _M_length(__str.length()); + _M_capacity(__str._M_allocated_capacity); + __str._M_data(__str._M_local_buf); + __str._M_set_length(0); + } + else + _M_construct(__str.begin(), __str.end()); + } +# 544 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template> + + + + basic_string(_InputIterator __beg, _InputIterator __end, + const _Alloc& __a = _Alloc()) + : _M_dataplus(_M_local_data(), __a) + { _M_construct(__beg, __end); } + + + + + ~basic_string() + { _M_dispose(); } + + + + + + basic_string& + operator=(const basic_string& __str) + { + + if (_Alloc_traits::_S_propagate_on_copy_assign()) + { + if (!_Alloc_traits::_S_always_equal() && !_M_is_local() + && _M_get_allocator() != __str._M_get_allocator()) + { + + _M_destroy(_M_allocated_capacity); + _M_data(_M_local_data()); + _M_set_length(0); + } + std::__alloc_on_copy(_M_get_allocator(), __str._M_get_allocator()); + } + + return this->assign(__str); + } + + + + + + basic_string& + operator=(const _CharT* __s) + { return this->assign(__s); } +# 599 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + operator=(_CharT __c) + { + this->assign(1, __c); + return *this; + } +# 617 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + operator=(basic_string&& __str) + noexcept(_Alloc_traits::_S_nothrow_move()) + { + if (!_M_is_local() && _Alloc_traits::_S_propagate_on_move_assign() + && !_Alloc_traits::_S_always_equal() + && _M_get_allocator() != __str._M_get_allocator()) + { + + _M_destroy(_M_allocated_capacity); + _M_data(_M_local_data()); + _M_set_length(0); + } + + std::__alloc_on_move(_M_get_allocator(), __str._M_get_allocator()); + + if (!__str._M_is_local() + && (_Alloc_traits::_S_propagate_on_move_assign() + || _Alloc_traits::_S_always_equal())) + { + pointer __data = nullptr; + size_type __capacity; + if (!_M_is_local()) + { + if (_Alloc_traits::_S_always_equal()) + { + __data = _M_data(); + __capacity = _M_allocated_capacity; + } + else + _M_destroy(_M_allocated_capacity); + } + + _M_data(__str._M_data()); + _M_length(__str.length()); + _M_capacity(__str._M_allocated_capacity); + if (__data) + { + __str._M_data(__data); + __str._M_capacity(__capacity); + } + else + __str._M_data(__str._M_local_buf); + } + else + assign(__str); + __str.clear(); + return *this; + } + + + + + + basic_string& + operator=(initializer_list<_CharT> __l) + { + this->assign(__l.begin(), __l.size()); + return *this; + } + + + + + + + + iterator + begin() noexcept + { return iterator(_M_data()); } + + + + + + const_iterator + begin() const noexcept + { return const_iterator(_M_data()); } + + + + + + iterator + end() noexcept + { return iterator(_M_data() + this->size()); } + + + + + + const_iterator + end() const noexcept + { return const_iterator(_M_data() + this->size()); } + + + + + + + reverse_iterator + rbegin() noexcept + { return reverse_iterator(this->end()); } + + + + + + + const_reverse_iterator + rbegin() const noexcept + { return const_reverse_iterator(this->end()); } + + + + + + + reverse_iterator + rend() noexcept + { return reverse_iterator(this->begin()); } + + + + + + + const_reverse_iterator + rend() const noexcept + { return const_reverse_iterator(this->begin()); } + + + + + + + const_iterator + cbegin() const noexcept + { return const_iterator(this->_M_data()); } + + + + + + const_iterator + cend() const noexcept + { return const_iterator(this->_M_data() + this->size()); } + + + + + + + const_reverse_iterator + crbegin() const noexcept + { return const_reverse_iterator(this->end()); } + + + + + + + const_reverse_iterator + crend() const noexcept + { return const_reverse_iterator(this->begin()); } + + + public: + + + + size_type + size() const noexcept + { return _M_string_length; } + + + + size_type + length() const noexcept + { return _M_string_length; } + + + size_type + max_size() const noexcept + { return (_Alloc_traits::max_size(_M_get_allocator()) - 1) / 2; } +# 813 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + void + resize(size_type __n, _CharT __c); +# 826 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + void + resize(size_type __n) + { this->resize(__n, _CharT()); } + + + + void + shrink_to_fit() noexcept + { + + if (capacity() > size()) + { + try + { reserve(0); } + catch(...) + { } + } + + } + + + + + + + size_type + capacity() const noexcept + { + return _M_is_local() ? size_type(_S_local_capacity) + : _M_allocated_capacity; + } +# 875 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + void + reserve(size_type __res_arg = 0); + + + + + void + clear() noexcept + { _M_set_length(0); } + + + + + + bool + empty() const noexcept + { return this->size() == 0; } +# 904 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + const_reference + operator[] (size_type __pos) const noexcept + { + ; + return _M_data()[__pos]; + } +# 921 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + reference + operator[](size_type __pos) + { + + + ; + + ; + return _M_data()[__pos]; + } +# 942 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + const_reference + at(size_type __n) const + { + if (__n >= this->size()) + __throw_out_of_range_fmt(("basic_string::at: __n " "(which is %zu) >= this->size() " "(which is %zu)"), + + + __n, this->size()); + return _M_data()[__n]; + } +# 963 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + reference + at(size_type __n) + { + if (__n >= size()) + __throw_out_of_range_fmt(("basic_string::at: __n " "(which is %zu) >= this->size() " "(which is %zu)"), + + + __n, this->size()); + return _M_data()[__n]; + } + + + + + + + reference + front() noexcept + { + ; + return operator[](0); + } + + + + + + const_reference + front() const noexcept + { + ; + return operator[](0); + } + + + + + + reference + back() noexcept + { + ; + return operator[](this->size() - 1); + } + + + + + + const_reference + back() const noexcept + { + ; + return operator[](this->size() - 1); + } +# 1026 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + operator+=(const basic_string& __str) + { return this->append(__str); } + + + + + + + basic_string& + operator+=(const _CharT* __s) + { return this->append(__s); } + + + + + + + basic_string& + operator+=(_CharT __c) + { + this->push_back(__c); + return *this; + } + + + + + + + + basic_string& + operator+=(initializer_list<_CharT> __l) + { return this->append(__l.begin(), __l.size()); } + + + + + + + + basic_string& + append(const basic_string& __str) + { return _M_append(__str._M_data(), __str.size()); } +# 1084 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + append(const basic_string& __str, size_type __pos, size_type __n) + { return _M_append(__str._M_data() + + __str._M_check(__pos, "basic_string::append"), + __str._M_limit(__pos, __n)); } + + + + + + + + basic_string& + append(const _CharT* __s, size_type __n) + { + ; + _M_check_length(size_type(0), __n, "basic_string::append"); + return _M_append(__s, __n); + } + + + + + + + basic_string& + append(const _CharT* __s) + { + ; + const size_type __n = traits_type::length(__s); + _M_check_length(size_type(0), __n, "basic_string::append"); + return _M_append(__s, __n); + } +# 1126 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + append(size_type __n, _CharT __c) + { return _M_replace_aux(this->size(), size_type(0), __n, __c); } + + + + + + + + basic_string& + append(initializer_list<_CharT> __l) + { return this->append(__l.begin(), __l.size()); } +# 1150 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template> + + + + basic_string& + append(_InputIterator __first, _InputIterator __last) + { return this->replace(end(), end(), __first, __last); } + + + + + + void + push_back(_CharT __c) + { + const size_type __size = this->size(); + if (__size + 1 > this->capacity()) + this->_M_mutate(__size, size_type(0), 0, size_type(1)); + traits_type::assign(this->_M_data()[__size], __c); + this->_M_set_length(__size + 1); + } + + + + + + + basic_string& + assign(const basic_string& __str) + { + this->_M_assign(__str); + return *this; + } +# 1194 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + assign(basic_string&& __str) + noexcept(_Alloc_traits::_S_nothrow_move()) + { + + + return *this = std::move(__str); + } +# 1217 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + assign(const basic_string& __str, size_type __pos, size_type __n) + { return _M_replace(size_type(0), this->size(), __str._M_data() + + __str._M_check(__pos, "basic_string::assign"), + __str._M_limit(__pos, __n)); } +# 1233 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + assign(const _CharT* __s, size_type __n) + { + ; + return _M_replace(size_type(0), this->size(), __s, __n); + } +# 1249 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + assign(const _CharT* __s) + { + ; + return _M_replace(size_type(0), this->size(), __s, + traits_type::length(__s)); + } +# 1266 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + assign(size_type __n, _CharT __c) + { return _M_replace_aux(size_type(0), this->size(), __n, __c); } +# 1279 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template> + + + + basic_string& + assign(_InputIterator __first, _InputIterator __last) + { return this->replace(begin(), end(), __first, __last); } + + + + + + + + basic_string& + assign(initializer_list<_CharT> __l) + { return this->assign(__l.begin(), __l.size()); } +# 1315 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + iterator + insert(const_iterator __p, size_type __n, _CharT __c) + { + ; + const size_type __pos = __p - begin(); + this->replace(__p, __p, __n, __c); + return iterator(this->_M_data() + __pos); + } +# 1357 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template> + iterator + insert(const_iterator __p, _InputIterator __beg, _InputIterator __end) + { + ; + const size_type __pos = __p - begin(); + this->replace(__p, __p, __beg, __end); + return iterator(this->_M_data() + __pos); + } +# 1393 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + void + insert(iterator __p, initializer_list<_CharT> __l) + { + ; + this->insert(__p - begin(), __l.begin(), __l.size()); + } +# 1413 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + insert(size_type __pos1, const basic_string& __str) + { return this->replace(__pos1, size_type(0), + __str._M_data(), __str.size()); } +# 1436 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + insert(size_type __pos1, const basic_string& __str, + size_type __pos2, size_type __n) + { return this->replace(__pos1, size_type(0), __str._M_data() + + __str._M_check(__pos2, "basic_string::insert"), + __str._M_limit(__pos2, __n)); } +# 1459 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + insert(size_type __pos, const _CharT* __s, size_type __n) + { return this->replace(__pos, size_type(0), __s, __n); } +# 1478 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + insert(size_type __pos, const _CharT* __s) + { + ; + return this->replace(__pos, size_type(0), __s, + traits_type::length(__s)); + } +# 1502 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + insert(size_type __pos, size_type __n, _CharT __c) + { return _M_replace_aux(_M_check(__pos, "basic_string::insert"), + size_type(0), __n, __c); } +# 1520 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + iterator + insert(__const_iterator __p, _CharT __c) + { + ; + const size_type __pos = __p - begin(); + _M_replace_aux(__pos, size_type(0), size_type(1), __c); + return iterator(_M_data() + __pos); + } +# 1544 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + erase(size_type __pos = 0, size_type __n = npos) + { + this->_M_erase(_M_check(__pos, "basic_string::erase"), + _M_limit(__pos, __n)); + return *this; + } +# 1560 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + iterator + erase(__const_iterator __position) + { + + ; + const size_type __pos = __position - begin(); + this->_M_erase(__pos, size_type(1)); + return iterator(_M_data() + __pos); + } +# 1579 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + iterator + erase(__const_iterator __first, __const_iterator __last) + { + + ; + const size_type __pos = __first - begin(); + this->_M_erase(__pos, __last - __first); + return iterator(this->_M_data() + __pos); + } + + + + + + + + void + pop_back() noexcept + { + ; + _M_erase(size() - 1, 1); + } +# 1620 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + replace(size_type __pos, size_type __n, const basic_string& __str) + { return this->replace(__pos, __n, __str._M_data(), __str.size()); } +# 1642 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + replace(size_type __pos1, size_type __n1, const basic_string& __str, + size_type __pos2, size_type __n2) + { return this->replace(__pos1, __n1, __str._M_data() + + __str._M_check(__pos2, "basic_string::replace"), + __str._M_limit(__pos2, __n2)); } +# 1667 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + replace(size_type __pos, size_type __n1, const _CharT* __s, + size_type __n2) + { + ; + return _M_replace(_M_check(__pos, "basic_string::replace"), + _M_limit(__pos, __n1), __s, __n2); + } +# 1692 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + replace(size_type __pos, size_type __n1, const _CharT* __s) + { + ; + return this->replace(__pos, __n1, __s, traits_type::length(__s)); + } +# 1716 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) + { return _M_replace_aux(_M_check(__pos, "basic_string::replace"), + _M_limit(__pos, __n1), __n2, __c); } +# 1734 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + replace(__const_iterator __i1, __const_iterator __i2, + const basic_string& __str) + { return this->replace(__i1, __i2, __str._M_data(), __str.size()); } +# 1754 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + replace(__const_iterator __i1, __const_iterator __i2, + const _CharT* __s, size_type __n) + { + + ; + return this->replace(__i1 - begin(), __i2 - __i1, __s, __n); + } +# 1776 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + replace(__const_iterator __i1, __const_iterator __i2, const _CharT* __s) + { + ; + return this->replace(__i1, __i2, __s, traits_type::length(__s)); + } +# 1797 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + replace(__const_iterator __i1, __const_iterator __i2, size_type __n, + _CharT __c) + { + + ; + return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __c); + } +# 1822 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template> + basic_string& + replace(const_iterator __i1, const_iterator __i2, + _InputIterator __k1, _InputIterator __k2) + { + + ; + ; + return this->_M_replace_dispatch(__i1, __i2, __k1, __k2, + std::__false_type()); + } +# 1854 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& + replace(__const_iterator __i1, __const_iterator __i2, + _CharT* __k1, _CharT* __k2) + { + + ; + ; + return this->replace(__i1 - begin(), __i2 - __i1, + __k1, __k2 - __k1); + } + + basic_string& + replace(__const_iterator __i1, __const_iterator __i2, + const _CharT* __k1, const _CharT* __k2) + { + + ; + ; + return this->replace(__i1 - begin(), __i2 - __i1, + __k1, __k2 - __k1); + } + + basic_string& + replace(__const_iterator __i1, __const_iterator __i2, + iterator __k1, iterator __k2) + { + + ; + ; + return this->replace(__i1 - begin(), __i2 - __i1, + __k1.base(), __k2 - __k1); + } + + basic_string& + replace(__const_iterator __i1, __const_iterator __i2, + const_iterator __k1, const_iterator __k2) + { + + ; + ; + return this->replace(__i1 - begin(), __i2 - __i1, + __k1.base(), __k2 - __k1); + } +# 1913 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string& replace(const_iterator __i1, const_iterator __i2, + initializer_list<_CharT> __l) + { return this->replace(__i1, __i2, __l.begin(), __l.end()); } + + + private: + template + basic_string& + _M_replace_dispatch(const_iterator __i1, const_iterator __i2, + _Integer __n, _Integer __val, __true_type) + { return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __val); } + + template + basic_string& + _M_replace_dispatch(const_iterator __i1, const_iterator __i2, + _InputIterator __k1, _InputIterator __k2, + __false_type); + + basic_string& + _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2, + _CharT __c); + + basic_string& + _M_replace(size_type __pos, size_type __len1, const _CharT* __s, + const size_type __len2); + + basic_string& + _M_append(const _CharT* __s, size_type __n); + + public: +# 1956 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + copy(_CharT* __s, size_type __n, size_type __pos = 0) const; +# 1966 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + void + swap(basic_string& __s) noexcept; +# 1976 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + const _CharT* + c_str() const noexcept + { return _M_data(); } + + + + + + + + const _CharT* + data() const noexcept + { return _M_data(); } + + + + + allocator_type + get_allocator() const noexcept + { return _M_get_allocator(); } +# 2009 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find(const _CharT* __s, size_type __pos, size_type __n) const; +# 2022 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find(const basic_string& __str, size_type __pos = 0) const + noexcept + { return this->find(__str.data(), __pos, __str.size()); } +# 2037 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find(const _CharT* __s, size_type __pos = 0) const + { + ; + return this->find(__s, __pos, traits_type::length(__s)); + } +# 2054 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find(_CharT __c, size_type __pos = 0) const noexcept; +# 2067 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + rfind(const basic_string& __str, size_type __pos = npos) const + noexcept + { return this->rfind(__str.data(), __pos, __str.size()); } +# 2084 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + rfind(const _CharT* __s, size_type __pos, size_type __n) const; +# 2097 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + rfind(const _CharT* __s, size_type __pos = npos) const + { + ; + return this->rfind(__s, __pos, traits_type::length(__s)); + } +# 2114 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + rfind(_CharT __c, size_type __pos = npos) const noexcept; +# 2128 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_first_of(const basic_string& __str, size_type __pos = 0) const + noexcept + { return this->find_first_of(__str.data(), __pos, __str.size()); } +# 2145 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_first_of(const _CharT* __s, size_type __pos, size_type __n) const; +# 2158 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_first_of(const _CharT* __s, size_type __pos = 0) const + { + ; + return this->find_first_of(__s, __pos, traits_type::length(__s)); + } +# 2177 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_first_of(_CharT __c, size_type __pos = 0) const noexcept + { return this->find(__c, __pos); } +# 2192 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_last_of(const basic_string& __str, size_type __pos = npos) const + noexcept + { return this->find_last_of(__str.data(), __pos, __str.size()); } +# 2209 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_last_of(const _CharT* __s, size_type __pos, size_type __n) const; +# 2222 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_last_of(const _CharT* __s, size_type __pos = npos) const + { + ; + return this->find_last_of(__s, __pos, traits_type::length(__s)); + } +# 2241 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_last_of(_CharT __c, size_type __pos = npos) const noexcept + { return this->rfind(__c, __pos); } +# 2255 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_first_not_of(const basic_string& __str, size_type __pos = 0) const + noexcept + { return this->find_first_not_of(__str.data(), __pos, __str.size()); } +# 2272 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_first_not_of(const _CharT* __s, size_type __pos, + size_type __n) const; +# 2286 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_first_not_of(const _CharT* __s, size_type __pos = 0) const + { + ; + return this->find_first_not_of(__s, __pos, traits_type::length(__s)); + } +# 2303 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_first_not_of(_CharT __c, size_type __pos = 0) const + noexcept; +# 2318 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_last_not_of(const basic_string& __str, size_type __pos = npos) const + noexcept + { return this->find_last_not_of(__str.data(), __pos, __str.size()); } +# 2335 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_last_not_of(const _CharT* __s, size_type __pos, + size_type __n) const; +# 2349 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_last_not_of(const _CharT* __s, size_type __pos = npos) const + { + ; + return this->find_last_not_of(__s, __pos, traits_type::length(__s)); + } +# 2366 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + size_type + find_last_not_of(_CharT __c, size_type __pos = npos) const + noexcept; +# 2382 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + basic_string + substr(size_type __pos = 0, size_type __n = npos) const + { return basic_string(*this, + _M_check(__pos, "basic_string::substr"), __n); } +# 2401 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + int + compare(const basic_string& __str) const + { + const size_type __size = this->size(); + const size_type __osize = __str.size(); + const size_type __len = std::min(__size, __osize); + + int __r = traits_type::compare(_M_data(), __str.data(), __len); + if (!__r) + __r = _S_compare(__size, __osize); + return __r; + } +# 2433 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + int + compare(size_type __pos, size_type __n, const basic_string& __str) const; +# 2459 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + int + compare(size_type __pos1, size_type __n1, const basic_string& __str, + size_type __pos2, size_type __n2) const; +# 2477 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + int + compare(const _CharT* __s) const; +# 2501 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + int + compare(size_type __pos, size_type __n1, const _CharT* __s) const; +# 2528 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + int + compare(size_type __pos, size_type __n1, const _CharT* __s, + size_type __n2) const; + }; +} +# 4927 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + basic_string<_CharT, _Traits, _Alloc> + operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + { + basic_string<_CharT, _Traits, _Alloc> __str(__lhs); + __str.append(__rhs); + return __str; + } + + + + + + + + template + basic_string<_CharT,_Traits,_Alloc> + operator+(const _CharT* __lhs, + const basic_string<_CharT,_Traits,_Alloc>& __rhs); + + + + + + + + template + basic_string<_CharT,_Traits,_Alloc> + operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs); + + + + + + + + template + inline basic_string<_CharT, _Traits, _Alloc> + operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const _CharT* __rhs) + { + basic_string<_CharT, _Traits, _Alloc> __str(__lhs); + __str.append(__rhs); + return __str; + } + + + + + + + + template + inline basic_string<_CharT, _Traits, _Alloc> + operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs) + { + typedef basic_string<_CharT, _Traits, _Alloc> __string_type; + typedef typename __string_type::size_type __size_type; + __string_type __str(__lhs); + __str.append(__size_type(1), __rhs); + return __str; + } + + + template + inline basic_string<_CharT, _Traits, _Alloc> + operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + { return std::move(__lhs.append(__rhs)); } + + template + inline basic_string<_CharT, _Traits, _Alloc> + operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + basic_string<_CharT, _Traits, _Alloc>&& __rhs) + { return std::move(__rhs.insert(0, __lhs)); } + + template + inline basic_string<_CharT, _Traits, _Alloc> + operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs, + basic_string<_CharT, _Traits, _Alloc>&& __rhs) + { + const auto __size = __lhs.size() + __rhs.size(); + const bool __cond = (__size > __lhs.capacity() + && __size <= __rhs.capacity()); + return __cond ? std::move(__rhs.insert(0, __lhs)) + : std::move(__lhs.append(__rhs)); + } + + template + inline basic_string<_CharT, _Traits, _Alloc> + operator+(const _CharT* __lhs, + basic_string<_CharT, _Traits, _Alloc>&& __rhs) + { return std::move(__rhs.insert(0, __lhs)); } + + template + inline basic_string<_CharT, _Traits, _Alloc> + operator+(_CharT __lhs, + basic_string<_CharT, _Traits, _Alloc>&& __rhs) + { return std::move(__rhs.insert(0, 1, __lhs)); } + + template + inline basic_string<_CharT, _Traits, _Alloc> + operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs, + const _CharT* __rhs) + { return std::move(__lhs.append(__rhs)); } + + template + inline basic_string<_CharT, _Traits, _Alloc> + operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs, + _CharT __rhs) + { return std::move(__lhs.append(1, __rhs)); } +# 5048 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + inline bool + operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + noexcept + { return __lhs.compare(__rhs) == 0; } + + template + inline + typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type + operator==(const basic_string<_CharT>& __lhs, + const basic_string<_CharT>& __rhs) noexcept + { return (__lhs.size() == __rhs.size() + && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(), + __lhs.size())); } + + + + + + + + template + inline bool + operator==(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + { return __rhs.compare(__lhs) == 0; } + + + + + + + + template + inline bool + operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const _CharT* __rhs) + { return __lhs.compare(__rhs) == 0; } +# 5095 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + inline bool + operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + noexcept + { return !(__lhs == __rhs); } + + + + + + + + template + inline bool + operator!=(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + { return !(__lhs == __rhs); } + + + + + + + + template + inline bool + operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const _CharT* __rhs) + { return !(__lhs == __rhs); } +# 5133 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + inline bool + operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + noexcept + { return __lhs.compare(__rhs) < 0; } + + + + + + + + template + inline bool + operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const _CharT* __rhs) + { return __lhs.compare(__rhs) < 0; } + + + + + + + + template + inline bool + operator<(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + { return __rhs.compare(__lhs) > 0; } +# 5171 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + inline bool + operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + noexcept + { return __lhs.compare(__rhs) > 0; } + + + + + + + + template + inline bool + operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const _CharT* __rhs) + { return __lhs.compare(__rhs) > 0; } + + + + + + + + template + inline bool + operator>(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + { return __rhs.compare(__lhs) < 0; } +# 5209 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + inline bool + operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + noexcept + { return __lhs.compare(__rhs) <= 0; } + + + + + + + + template + inline bool + operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const _CharT* __rhs) + { return __lhs.compare(__rhs) <= 0; } + + + + + + + + template + inline bool + operator<=(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + { return __rhs.compare(__lhs) >= 0; } +# 5247 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + inline bool + operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + noexcept + { return __lhs.compare(__rhs) >= 0; } + + + + + + + + template + inline bool + operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const _CharT* __rhs) + { return __lhs.compare(__rhs) >= 0; } + + + + + + + + template + inline bool + operator>=(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + { return __rhs.compare(__lhs) <= 0; } +# 5285 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + inline void + swap(basic_string<_CharT, _Traits, _Alloc>& __lhs, + basic_string<_CharT, _Traits, _Alloc>& __rhs) + noexcept(noexcept(__lhs.swap(__rhs))) + { __lhs.swap(__rhs); } +# 5305 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT, _Traits, _Alloc>& __str); + + template<> + basic_istream& + operator>>(basic_istream& __is, basic_string& __str); +# 5323 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + inline basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const basic_string<_CharT, _Traits, _Alloc>& __str) + { + + + return __ostream_insert(__os, __str.data(), __str.size()); + } +# 5346 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + basic_istream<_CharT, _Traits>& + getline(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim); +# 5363 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + template + inline basic_istream<_CharT, _Traits>& + getline(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT, _Traits, _Alloc>& __str) + { return std::getline(__is, __str, __is.widen('\n')); } + + + + template + inline basic_istream<_CharT, _Traits>& + getline(basic_istream<_CharT, _Traits>&& __is, + basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim) + { return std::getline(__is, __str, __delim); } + + + template + inline basic_istream<_CharT, _Traits>& + getline(basic_istream<_CharT, _Traits>&& __is, + basic_string<_CharT, _Traits, _Alloc>& __str) + { return std::getline(__is, __str); } + + + template<> + basic_istream& + getline(basic_istream& __in, basic_string& __str, + char __delim); + + + template<> + basic_istream& + getline(basic_istream& __in, basic_string& __str, + wchar_t __delim); + + + +} + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 3 + + + + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3 +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3 + + + + +# 1 "/usr/include/wchar.h" 1 3 4 +# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 2 3 +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdio" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdio" 3 +# 96 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdio" 3 +namespace std +{ + using ::FILE; + using ::fpos_t; + + using ::clearerr; + using ::fclose; + using ::feof; + using ::ferror; + using ::fflush; + using ::fgetc; + using ::fgetpos; + using ::fgets; + using ::fopen; + using ::fprintf; + using ::fputc; + using ::fputs; + using ::fread; + using ::freopen; + using ::fscanf; + using ::fseek; + using ::fsetpos; + using ::ftell; + using ::fwrite; + using ::getc; + using ::getchar; + + + + + using ::perror; + using ::printf; + using ::putc; + using ::putchar; + using ::puts; + using ::remove; + using ::rename; + using ::rewind; + using ::scanf; + using ::setbuf; + using ::setvbuf; + using ::sprintf; + using ::sscanf; + using ::tmpfile; + + using ::tmpnam; + + using ::ungetc; + using ::vfprintf; + using ::vprintf; + using ::vsprintf; +} +# 157 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdio" 3 +namespace __gnu_cxx +{ +# 175 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdio" 3 + using ::snprintf; + using ::vfscanf; + using ::vscanf; + using ::vsnprintf; + using ::vsscanf; + +} + +namespace std +{ + using ::__gnu_cxx::snprintf; + using ::__gnu_cxx::vfscanf; + using ::__gnu_cxx::vscanf; + using ::__gnu_cxx::vsnprintf; + using ::__gnu_cxx::vsscanf; +} +# 44 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 3 + + +# 1 "/usr/include/errno.h" 1 3 4 +# 31 "/usr/include/errno.h" 3 4 +extern "C" { + + + + +# 1 "/usr/include/bits/errno.h" 1 3 4 +# 24 "/usr/include/bits/errno.h" 3 4 +# 1 "/usr/include/linux/errno.h" 1 3 4 +# 1 "/usr/include/asm/errno.h" 1 3 4 +# 1 "/usr/include/asm-generic/errno.h" 1 3 4 + + + +# 1 "/usr/include/asm-generic/errno-base.h" 1 3 4 +# 5 "/usr/include/asm-generic/errno.h" 2 3 4 +# 2 "/usr/include/asm/errno.h" 2 3 4 +# 2 "/usr/include/linux/errno.h" 2 3 4 +# 25 "/usr/include/bits/errno.h" 2 3 4 +# 50 "/usr/include/bits/errno.h" 3 4 +extern int *__errno_location (void) throw () __attribute__ ((__const__)); +# 36 "/usr/include/errno.h" 2 3 4 +# 54 "/usr/include/errno.h" 3 4 +extern char *program_invocation_name, *program_invocation_short_name; + + + +} +# 68 "/usr/include/errno.h" 3 4 +typedef int error_t; +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 2 3 +# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 2 3 + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + + + + template + _Ret + __stoa(_TRet (*__convf) (const _CharT*, _CharT**, _Base...), + const char* __name, const _CharT* __str, std::size_t* __idx, + _Base... __base) + { + _Ret __ret; + + _CharT* __endptr; + + struct _Save_errno { + _Save_errno() : _M_errno((*__errno_location ())) { (*__errno_location ()) = 0; } + ~_Save_errno() { if ((*__errno_location ()) == 0) (*__errno_location ()) = _M_errno; } + int _M_errno; + } const __save_errno; + + const _TRet __tmp = __convf(__str, &__endptr, __base...); + + if (__endptr == __str) + std::__throw_invalid_argument(__name); + else if ((*__errno_location ()) == 34 + || (std::__are_same<_Ret, int>::__value + && (__tmp < __numeric_traits::__min + || __tmp > __numeric_traits::__max))) + std::__throw_out_of_range(__name); + else + __ret = __tmp; + + if (__idx) + *__idx = __endptr - __str; + + return __ret; + } + + + template + _String + __to_xstring(int (*__convf) (_CharT*, std::size_t, const _CharT*, + __builtin_va_list), std::size_t __n, + const _CharT* __fmt, ...) + { + + + _CharT* __s = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) + * __n)); + + __builtin_va_list __args; + __builtin_va_start(__args, __fmt); + + const int __len = __convf(__s, __n, __fmt, __args); + + __builtin_va_end(__args); + + return _String(__s, __s + __len); + } + + +} +# 5403 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + +namespace __cxx11 { + + + + inline int + stoi(const string& __str, size_t* __idx = 0, int __base = 10) + { return __gnu_cxx::__stoa(&std::strtol, "stoi", __str.c_str(), + __idx, __base); } + + inline long + stol(const string& __str, size_t* __idx = 0, int __base = 10) + { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(), + __idx, __base); } + + inline unsigned long + stoul(const string& __str, size_t* __idx = 0, int __base = 10) + { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(), + __idx, __base); } + + inline long long + stoll(const string& __str, size_t* __idx = 0, int __base = 10) + { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(), + __idx, __base); } + + inline unsigned long long + stoull(const string& __str, size_t* __idx = 0, int __base = 10) + { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(), + __idx, __base); } + + + inline float + stof(const string& __str, size_t* __idx = 0) + { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); } + + inline double + stod(const string& __str, size_t* __idx = 0) + { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); } + + inline long double + stold(const string& __str, size_t* __idx = 0) + { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); } + + + + + + + inline string + to_string(int __val) + { return __gnu_cxx::__to_xstring(&std::vsnprintf, 4 * sizeof(int), + "%d", __val); } + + inline string + to_string(unsigned __val) + { return __gnu_cxx::__to_xstring(&std::vsnprintf, + 4 * sizeof(unsigned), + "%u", __val); } + + inline string + to_string(long __val) + { return __gnu_cxx::__to_xstring(&std::vsnprintf, 4 * sizeof(long), + "%ld", __val); } + + inline string + to_string(unsigned long __val) + { return __gnu_cxx::__to_xstring(&std::vsnprintf, + 4 * sizeof(unsigned long), + "%lu", __val); } + + inline string + to_string(long long __val) + { return __gnu_cxx::__to_xstring(&std::vsnprintf, + 4 * sizeof(long long), + "%lld", __val); } + + inline string + to_string(unsigned long long __val) + { return __gnu_cxx::__to_xstring(&std::vsnprintf, + 4 * sizeof(unsigned long long), + "%llu", __val); } + + inline string + to_string(float __val) + { + const int __n = + __gnu_cxx::__numeric_traits::__max_exponent10 + 20; + return __gnu_cxx::__to_xstring(&std::vsnprintf, __n, + "%f", __val); + } + + inline string + to_string(double __val) + { + const int __n = + __gnu_cxx::__numeric_traits::__max_exponent10 + 20; + return __gnu_cxx::__to_xstring(&std::vsnprintf, __n, + "%f", __val); + } + + inline string + to_string(long double __val) + { + const int __n = + __gnu_cxx::__numeric_traits::__max_exponent10 + 20; + return __gnu_cxx::__to_xstring(&std::vsnprintf, __n, + "%Lf", __val); + } + + + + inline int + stoi(const wstring& __str, size_t* __idx = 0, int __base = 10) + { return __gnu_cxx::__stoa(&std::wcstol, "stoi", __str.c_str(), + __idx, __base); } + + inline long + stol(const wstring& __str, size_t* __idx = 0, int __base = 10) + { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(), + __idx, __base); } + + inline unsigned long + stoul(const wstring& __str, size_t* __idx = 0, int __base = 10) + { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(), + __idx, __base); } + + inline long long + stoll(const wstring& __str, size_t* __idx = 0, int __base = 10) + { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(), + __idx, __base); } + + inline unsigned long long + stoull(const wstring& __str, size_t* __idx = 0, int __base = 10) + { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(), + __idx, __base); } + + + inline float + stof(const wstring& __str, size_t* __idx = 0) + { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); } + + inline double + stod(const wstring& __str, size_t* __idx = 0) + { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); } + + inline long double + stold(const wstring& __str, size_t* __idx = 0) + { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); } + + + + inline wstring + to_wstring(int __val) + { return __gnu_cxx::__to_xstring(&std::vswprintf, 4 * sizeof(int), + L"%d", __val); } + + inline wstring + to_wstring(unsigned __val) + { return __gnu_cxx::__to_xstring(&std::vswprintf, + 4 * sizeof(unsigned), + L"%u", __val); } + + inline wstring + to_wstring(long __val) + { return __gnu_cxx::__to_xstring(&std::vswprintf, 4 * sizeof(long), + L"%ld", __val); } + + inline wstring + to_wstring(unsigned long __val) + { return __gnu_cxx::__to_xstring(&std::vswprintf, + 4 * sizeof(unsigned long), + L"%lu", __val); } + + inline wstring + to_wstring(long long __val) + { return __gnu_cxx::__to_xstring(&std::vswprintf, + 4 * sizeof(long long), + L"%lld", __val); } + + inline wstring + to_wstring(unsigned long long __val) + { return __gnu_cxx::__to_xstring(&std::vswprintf, + 4 * sizeof(unsigned long long), + L"%llu", __val); } + + inline wstring + to_wstring(float __val) + { + const int __n = + __gnu_cxx::__numeric_traits::__max_exponent10 + 20; + return __gnu_cxx::__to_xstring(&std::vswprintf, __n, + L"%f", __val); + } + + inline wstring + to_wstring(double __val) + { + const int __n = + __gnu_cxx::__numeric_traits::__max_exponent10 + 20; + return __gnu_cxx::__to_xstring(&std::vswprintf, __n, + L"%f", __val); + } + + inline wstring + to_wstring(long double __val) + { + const int __n = + __gnu_cxx::__numeric_traits::__max_exponent10 + 20; + return __gnu_cxx::__to_xstring(&std::vswprintf, __n, + L"%Lf", __val); + } + + + +} + +} + + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/hash_bytes.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/hash_bytes.h" 3 + + + +namespace std +{ + + + + + + + + size_t + _Hash_bytes(const void* __ptr, size_t __len, size_t __seed); + + + + + + size_t + _Fnv_hash_bytes(const void* __ptr, size_t __len, size_t __seed); + + +} +# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 49 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 3 + template + struct __hash_base + { + typedef _Result result_type; + typedef _Arg argument_type; + }; + + + template + struct hash; + + + template::value> + struct __hash_enum + { + private: + + __hash_enum(__hash_enum&&); + ~__hash_enum(); + }; + + + template + struct __hash_enum<_Tp, true> : public __hash_base + { + size_t + operator()(_Tp __val) const noexcept + { + using __type = typename underlying_type<_Tp>::type; + return hash<__type>{}(static_cast<__type>(__val)); + } + }; + + + + template + struct hash : __hash_enum<_Tp> + { }; + + + template + struct hash<_Tp*> : public __hash_base + { + size_t + operator()(_Tp* __p) const noexcept + { return reinterpret_cast(__p); } + }; +# 108 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 3 + template<> struct hash : public __hash_base { size_t operator()(bool __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(char __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(signed char __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(unsigned char __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(wchar_t __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(char16_t __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(char32_t __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(short __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(int __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(long __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(long long __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(unsigned short __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(unsigned int __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(unsigned long __val) const noexcept { return static_cast(__val); } }; + + + template<> struct hash : public __hash_base { size_t operator()(unsigned long long __val) const noexcept { return static_cast(__val); } }; +# 171 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 3 + struct _Hash_impl + { + static size_t + hash(const void* __ptr, size_t __clength, + size_t __seed = static_cast(0xc70f6907UL)) + { return _Hash_bytes(__ptr, __clength, __seed); } + + template + static size_t + hash(const _Tp& __val) + { return hash(&__val, sizeof(__val)); } + + template + static size_t + __hash_combine(const _Tp& __val, size_t __hash) + { return hash(&__val, sizeof(__val), __hash); } + }; + + struct _Fnv_hash_impl + { + static size_t + hash(const void* __ptr, size_t __clength, + size_t __seed = static_cast(2166136261UL)) + { return _Fnv_hash_bytes(__ptr, __clength, __seed); } + + template + static size_t + hash(const _Tp& __val) + { return hash(&__val, sizeof(__val)); } + + template + static size_t + __hash_combine(const _Tp& __val, size_t __hash) + { return hash(&__val, sizeof(__val), __hash); } + }; + + + template<> + struct hash : public __hash_base + { + size_t + operator()(float __val) const noexcept + { + + return __val != 0.0f ? std::_Hash_impl::hash(__val) : 0; + } + }; + + + template<> + struct hash : public __hash_base + { + size_t + operator()(double __val) const noexcept + { + + return __val != 0.0 ? std::_Hash_impl::hash(__val) : 0; + } + }; + + + template<> + struct hash + : public __hash_base + { + __attribute__ ((__pure__)) size_t + operator()(long double __val) const noexcept; + }; + + + + + + + + template + struct __is_fast_hash : public std::true_type + { }; + + template<> + struct __is_fast_hash> : public std::false_type + { }; + + +} +# 5629 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + + template<> + struct hash + : public __hash_base + { + size_t + operator()(const string& __s) const noexcept + { return std::_Hash_impl::hash(__s.data(), __s.length()); } + }; + + template<> + struct __is_fast_hash> : std::false_type + { }; + + + + template<> + struct hash + : public __hash_base + { + size_t + operator()(const wstring& __s) const noexcept + { return std::_Hash_impl::hash(__s.data(), + __s.length() * sizeof(wchar_t)); } + }; + + template<> + struct __is_fast_hash> : std::false_type + { }; + + + + + + template<> + struct hash + : public __hash_base + { + size_t + operator()(const u16string& __s) const noexcept + { return std::_Hash_impl::hash(__s.data(), + __s.length() * sizeof(char16_t)); } + }; + + template<> + struct __is_fast_hash> : std::false_type + { }; + + + template<> + struct hash + : public __hash_base + { + size_t + operator()(const u32string& __s) const noexcept + { return std::_Hash_impl::hash(__s.data(), + __s.length() * sizeof(char32_t)); } + }; + + template<> + struct __is_fast_hash> : std::false_type + { }; +# 5707 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3 + inline namespace literals + { + inline namespace string_literals + { + + + __attribute ((__abi_tag__ ("cxx11"))) + inline basic_string + operator""s(const char* __str, size_t __len) + { return basic_string{__str, __len}; } + + + __attribute ((__abi_tag__ ("cxx11"))) + inline basic_string + operator""s(const wchar_t* __str, size_t __len) + { return basic_string{__str, __len}; } + + + + __attribute ((__abi_tag__ ("cxx11"))) + inline basic_string + operator""s(const char16_t* __str, size_t __len) + { return basic_string{__str, __len}; } + + __attribute ((__abi_tag__ ("cxx11"))) + inline basic_string + operator""s(const char32_t* __str, size_t __len) + { return basic_string{__str, __len}; } + + + + } + } + + + +} +# 53 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.tcc" 1 3 +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.tcc" 3 + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + template + const typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>::npos; + + template + void + basic_string<_CharT, _Traits, _Alloc>:: + swap(basic_string& __s) noexcept + { + if (this == &__s) + return; + + _Alloc_traits::_S_on_swap(_M_get_allocator(), __s._M_get_allocator()); + + if (_M_is_local()) + if (__s._M_is_local()) + { + if (length() && __s.length()) + { + _CharT __tmp_data[_S_local_capacity + 1]; + traits_type::copy(__tmp_data, __s._M_local_buf, + _S_local_capacity + 1); + traits_type::copy(__s._M_local_buf, _M_local_buf, + _S_local_capacity + 1); + traits_type::copy(_M_local_buf, __tmp_data, + _S_local_capacity + 1); + } + else if (__s.length()) + { + traits_type::copy(_M_local_buf, __s._M_local_buf, + _S_local_capacity + 1); + _M_length(__s.length()); + __s._M_set_length(0); + return; + } + else if (length()) + { + traits_type::copy(__s._M_local_buf, _M_local_buf, + _S_local_capacity + 1); + __s._M_length(length()); + _M_set_length(0); + return; + } + } + else + { + const size_type __tmp_capacity = __s._M_allocated_capacity; + traits_type::copy(__s._M_local_buf, _M_local_buf, + _S_local_capacity + 1); + _M_data(__s._M_data()); + __s._M_data(__s._M_local_buf); + _M_capacity(__tmp_capacity); + } + else + { + const size_type __tmp_capacity = _M_allocated_capacity; + if (__s._M_is_local()) + { + traits_type::copy(_M_local_buf, __s._M_local_buf, + _S_local_capacity + 1); + __s._M_data(_M_data()); + _M_data(_M_local_buf); + } + else + { + pointer __tmp_ptr = _M_data(); + _M_data(__s._M_data()); + __s._M_data(__tmp_ptr); + _M_capacity(__s._M_allocated_capacity); + } + __s._M_capacity(__tmp_capacity); + } + + const size_type __tmp_length = length(); + _M_length(__s.length()); + __s._M_length(__tmp_length); + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::pointer + basic_string<_CharT, _Traits, _Alloc>:: + _M_create(size_type& __capacity, size_type __old_capacity) + { + + + if (__capacity > max_size()) + std::__throw_length_error(("basic_string::_M_create")); + + + + + if (__capacity > __old_capacity && __capacity < 2 * __old_capacity) + { + __capacity = 2 * __old_capacity; + + if (__capacity > max_size()) + __capacity = max_size(); + } + + + + return _Alloc_traits::allocate(_M_get_allocator(), __capacity + 1); + } + + + + + + template + template + void + basic_string<_CharT, _Traits, _Alloc>:: + _M_construct(_InIterator __beg, _InIterator __end, + std::input_iterator_tag) + { + size_type __len = 0; + size_type __capacity = size_type(_S_local_capacity); + + while (__beg != __end && __len < __capacity) + { + _M_data()[__len++] = *__beg; + ++__beg; + } + + try + { + while (__beg != __end) + { + if (__len == __capacity) + { + + __capacity = __len + 1; + pointer __another = _M_create(__capacity, __len); + this->_S_copy(__another, _M_data(), __len); + _M_dispose(); + _M_data(__another); + _M_capacity(__capacity); + } + _M_data()[__len++] = *__beg; + ++__beg; + } + } + catch(...) + { + _M_dispose(); + throw; + } + + _M_set_length(__len); + } + + template + template + void + basic_string<_CharT, _Traits, _Alloc>:: + _M_construct(_InIterator __beg, _InIterator __end, + std::forward_iterator_tag) + { + + if (__gnu_cxx::__is_null_pointer(__beg) && __beg != __end) + std::__throw_logic_error(("basic_string::" "_M_construct null not valid")); + + + size_type __dnew = static_cast(std::distance(__beg, __end)); + + if (__dnew > size_type(_S_local_capacity)) + { + _M_data(_M_create(__dnew, size_type(0))); + _M_capacity(__dnew); + } + + + try + { this->_S_copy_chars(_M_data(), __beg, __end); } + catch(...) + { + _M_dispose(); + throw; + } + + _M_set_length(__dnew); + } + + template + void + basic_string<_CharT, _Traits, _Alloc>:: + _M_construct(size_type __n, _CharT __c) + { + if (__n > size_type(_S_local_capacity)) + { + _M_data(_M_create(__n, size_type(0))); + _M_capacity(__n); + } + + if (__n) + this->_S_assign(_M_data(), __n, __c); + + _M_set_length(__n); + } + + template + void + basic_string<_CharT, _Traits, _Alloc>:: + _M_assign(const basic_string& __str) + { + if (this != &__str) + { + const size_type __rsize = __str.length(); + const size_type __capacity = capacity(); + + if (__rsize > __capacity) + { + size_type __new_capacity = __rsize; + pointer __tmp = _M_create(__new_capacity, __capacity); + _M_dispose(); + _M_data(__tmp); + _M_capacity(__new_capacity); + } + + if (__rsize) + this->_S_copy(_M_data(), __str._M_data(), __rsize); + + _M_set_length(__rsize); + } + } + + template + void + basic_string<_CharT, _Traits, _Alloc>:: + reserve(size_type __res) + { + + if (__res < length()) + __res = length(); + + const size_type __capacity = capacity(); + if (__res != __capacity) + { + if (__res > __capacity + || __res > size_type(_S_local_capacity)) + { + pointer __tmp = _M_create(__res, __capacity); + this->_S_copy(__tmp, _M_data(), length() + 1); + _M_dispose(); + _M_data(__tmp); + _M_capacity(__res); + } + else if (!_M_is_local()) + { + this->_S_copy(_M_local_data(), _M_data(), length() + 1); + _M_destroy(__capacity); + _M_data(_M_local_data()); + } + } + } + + template + void + basic_string<_CharT, _Traits, _Alloc>:: + _M_mutate(size_type __pos, size_type __len1, const _CharT* __s, + size_type __len2) + { + const size_type __how_much = length() - __pos - __len1; + + size_type __new_capacity = length() + __len2 - __len1; + pointer __r = _M_create(__new_capacity, capacity()); + + if (__pos) + this->_S_copy(__r, _M_data(), __pos); + if (__s && __len2) + this->_S_copy(__r + __pos, __s, __len2); + if (__how_much) + this->_S_copy(__r + __pos + __len2, + _M_data() + __pos + __len1, __how_much); + + _M_dispose(); + _M_data(__r); + _M_capacity(__new_capacity); + } + + template + void + basic_string<_CharT, _Traits, _Alloc>:: + _M_erase(size_type __pos, size_type __n) + { + const size_type __how_much = length() - __pos - __n; + + if (__how_much && __n) + this->_S_move(_M_data() + __pos, _M_data() + __pos + __n, __how_much); + + _M_set_length(length() - __n); + } + + template + void + basic_string<_CharT, _Traits, _Alloc>:: + resize(size_type __n, _CharT __c) + { + const size_type __size = this->size(); + if (__size < __n) + this->append(__n - __size, __c); + else if (__n < __size) + this->_M_erase(__n, __size - __n); + } + + template + basic_string<_CharT, _Traits, _Alloc>& + basic_string<_CharT, _Traits, _Alloc>:: + _M_append(const _CharT* __s, size_type __n) + { + const size_type __len = __n + this->size(); + + if (__len <= this->capacity()) + { + if (__n) + this->_S_copy(this->_M_data() + this->size(), __s, __n); + } + else + this->_M_mutate(this->size(), size_type(0), __s, __n); + + this->_M_set_length(__len); + return *this; + } + + template + template + basic_string<_CharT, _Traits, _Alloc>& + basic_string<_CharT, _Traits, _Alloc>:: + _M_replace_dispatch(const_iterator __i1, const_iterator __i2, + _InputIterator __k1, _InputIterator __k2, + std::__false_type) + { + const basic_string __s(__k1, __k2); + const size_type __n1 = __i2 - __i1; + return _M_replace(__i1 - begin(), __n1, __s._M_data(), + __s.size()); + } + + template + basic_string<_CharT, _Traits, _Alloc>& + basic_string<_CharT, _Traits, _Alloc>:: + _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2, + _CharT __c) + { + _M_check_length(__n1, __n2, "basic_string::_M_replace_aux"); + + const size_type __old_size = this->size(); + const size_type __new_size = __old_size + __n2 - __n1; + + if (__new_size <= this->capacity()) + { + pointer __p = this->_M_data() + __pos1; + + const size_type __how_much = __old_size - __pos1 - __n1; + if (__how_much && __n1 != __n2) + this->_S_move(__p + __n2, __p + __n1, __how_much); + } + else + this->_M_mutate(__pos1, __n1, 0, __n2); + + if (__n2) + this->_S_assign(this->_M_data() + __pos1, __n2, __c); + + this->_M_set_length(__new_size); + return *this; + } + + template + basic_string<_CharT, _Traits, _Alloc>& + basic_string<_CharT, _Traits, _Alloc>:: + _M_replace(size_type __pos, size_type __len1, const _CharT* __s, + const size_type __len2) + { + _M_check_length(__len1, __len2, "basic_string::_M_replace"); + + const size_type __old_size = this->size(); + const size_type __new_size = __old_size + __len2 - __len1; + + if (__new_size <= this->capacity()) + { + pointer __p = this->_M_data() + __pos; + + const size_type __how_much = __old_size - __pos - __len1; + if (_M_disjunct(__s)) + { + if (__how_much && __len1 != __len2) + this->_S_move(__p + __len2, __p + __len1, __how_much); + if (__len2) + this->_S_copy(__p, __s, __len2); + } + else + { + + if (__len2 && __len2 <= __len1) + this->_S_move(__p, __s, __len2); + if (__how_much && __len1 != __len2) + this->_S_move(__p + __len2, __p + __len1, __how_much); + if (__len2 > __len1) + { + if (__s + __len2 <= __p + __len1) + this->_S_move(__p, __s, __len2); + else if (__s >= __p + __len1) + this->_S_copy(__p, __s + __len2 - __len1, __len2); + else + { + const size_type __nleft = (__p + __len1) - __s; + this->_S_move(__p, __s, __nleft); + this->_S_copy(__p + __nleft, __p + __len2, + __len2 - __nleft); + } + } + } + } + else + this->_M_mutate(__pos, __len1, __s, __len2); + + this->_M_set_length(__new_size); + return *this; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + copy(_CharT* __s, size_type __n, size_type __pos) const + { + _M_check(__pos, "basic_string::copy"); + __n = _M_limit(__pos, __n); + ; + if (__n) + _S_copy(__s, _M_data() + __pos, __n); + + return __n; + } +# 1145 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.tcc" 3 + template + basic_string<_CharT, _Traits, _Alloc> + operator+(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Alloc>& __rhs) + { + ; + typedef basic_string<_CharT, _Traits, _Alloc> __string_type; + typedef typename __string_type::size_type __size_type; + const __size_type __len = _Traits::length(__lhs); + __string_type __str; + __str.reserve(__len + __rhs.size()); + __str.append(__lhs, __len); + __str.append(__rhs); + return __str; + } + + template + basic_string<_CharT, _Traits, _Alloc> + operator+(_CharT __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs) + { + typedef basic_string<_CharT, _Traits, _Alloc> __string_type; + typedef typename __string_type::size_type __size_type; + __string_type __str; + const __size_type __len = __rhs.size(); + __str.reserve(__len + 1); + __str.append(__size_type(1), __lhs); + __str.append(__rhs); + return __str; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + find(const _CharT* __s, size_type __pos, size_type __n) const + { + ; + const size_type __size = this->size(); + const _CharT* __data = _M_data(); + + if (__n == 0) + return __pos <= __size ? __pos : npos; + + if (__n <= __size) + { + for (; __pos <= __size - __n; ++__pos) + if (traits_type::eq(__data[__pos], __s[0]) + && traits_type::compare(__data + __pos + 1, + __s + 1, __n - 1) == 0) + return __pos; + } + return npos; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + find(_CharT __c, size_type __pos) const noexcept + { + size_type __ret = npos; + const size_type __size = this->size(); + if (__pos < __size) + { + const _CharT* __data = _M_data(); + const size_type __n = __size - __pos; + const _CharT* __p = traits_type::find(__data + __pos, __n, __c); + if (__p) + __ret = __p - __data; + } + return __ret; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + rfind(const _CharT* __s, size_type __pos, size_type __n) const + { + ; + const size_type __size = this->size(); + if (__n <= __size) + { + __pos = std::min(size_type(__size - __n), __pos); + const _CharT* __data = _M_data(); + do + { + if (traits_type::compare(__data + __pos, __s, __n) == 0) + return __pos; + } + while (__pos-- > 0); + } + return npos; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + rfind(_CharT __c, size_type __pos) const noexcept + { + size_type __size = this->size(); + if (__size) + { + if (--__size > __pos) + __size = __pos; + for (++__size; __size-- > 0; ) + if (traits_type::eq(_M_data()[__size], __c)) + return __size; + } + return npos; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + find_first_of(const _CharT* __s, size_type __pos, size_type __n) const + { + ; + for (; __n && __pos < this->size(); ++__pos) + { + const _CharT* __p = traits_type::find(__s, __n, _M_data()[__pos]); + if (__p) + return __pos; + } + return npos; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + find_last_of(const _CharT* __s, size_type __pos, size_type __n) const + { + ; + size_type __size = this->size(); + if (__size && __n) + { + if (--__size > __pos) + __size = __pos; + do + { + if (traits_type::find(__s, __n, _M_data()[__size])) + return __size; + } + while (__size-- != 0); + } + return npos; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const + { + ; + for (; __pos < this->size(); ++__pos) + if (!traits_type::find(__s, __n, _M_data()[__pos])) + return __pos; + return npos; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + find_first_not_of(_CharT __c, size_type __pos) const noexcept + { + for (; __pos < this->size(); ++__pos) + if (!traits_type::eq(_M_data()[__pos], __c)) + return __pos; + return npos; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const + { + ; + size_type __size = this->size(); + if (__size) + { + if (--__size > __pos) + __size = __pos; + do + { + if (!traits_type::find(__s, __n, _M_data()[__size])) + return __size; + } + while (__size--); + } + return npos; + } + + template + typename basic_string<_CharT, _Traits, _Alloc>::size_type + basic_string<_CharT, _Traits, _Alloc>:: + find_last_not_of(_CharT __c, size_type __pos) const noexcept + { + size_type __size = this->size(); + if (__size) + { + if (--__size > __pos) + __size = __pos; + do + { + if (!traits_type::eq(_M_data()[__size], __c)) + return __size; + } + while (__size--); + } + return npos; + } + + template + int + basic_string<_CharT, _Traits, _Alloc>:: + compare(size_type __pos, size_type __n, const basic_string& __str) const + { + _M_check(__pos, "basic_string::compare"); + __n = _M_limit(__pos, __n); + const size_type __osize = __str.size(); + const size_type __len = std::min(__n, __osize); + int __r = traits_type::compare(_M_data() + __pos, __str.data(), __len); + if (!__r) + __r = _S_compare(__n, __osize); + return __r; + } + + template + int + basic_string<_CharT, _Traits, _Alloc>:: + compare(size_type __pos1, size_type __n1, const basic_string& __str, + size_type __pos2, size_type __n2) const + { + _M_check(__pos1, "basic_string::compare"); + __str._M_check(__pos2, "basic_string::compare"); + __n1 = _M_limit(__pos1, __n1); + __n2 = __str._M_limit(__pos2, __n2); + const size_type __len = std::min(__n1, __n2); + int __r = traits_type::compare(_M_data() + __pos1, + __str.data() + __pos2, __len); + if (!__r) + __r = _S_compare(__n1, __n2); + return __r; + } + + template + int + basic_string<_CharT, _Traits, _Alloc>:: + compare(const _CharT* __s) const + { + ; + const size_type __size = this->size(); + const size_type __osize = traits_type::length(__s); + const size_type __len = std::min(__size, __osize); + int __r = traits_type::compare(_M_data(), __s, __len); + if (!__r) + __r = _S_compare(__size, __osize); + return __r; + } + + template + int + basic_string <_CharT, _Traits, _Alloc>:: + compare(size_type __pos, size_type __n1, const _CharT* __s) const + { + ; + _M_check(__pos, "basic_string::compare"); + __n1 = _M_limit(__pos, __n1); + const size_type __osize = traits_type::length(__s); + const size_type __len = std::min(__n1, __osize); + int __r = traits_type::compare(_M_data() + __pos, __s, __len); + if (!__r) + __r = _S_compare(__n1, __osize); + return __r; + } + + template + int + basic_string <_CharT, _Traits, _Alloc>:: + compare(size_type __pos, size_type __n1, const _CharT* __s, + size_type __n2) const + { + ; + _M_check(__pos, "basic_string::compare"); + __n1 = _M_limit(__pos, __n1); + const size_type __len = std::min(__n1, __n2); + int __r = traits_type::compare(_M_data() + __pos, __s, __len); + if (!__r) + __r = _S_compare(__n1, __n2); + return __r; + } + + + template + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __in, + basic_string<_CharT, _Traits, _Alloc>& __str) + { + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef basic_string<_CharT, _Traits, _Alloc> __string_type; + typedef typename __istream_type::ios_base __ios_base; + typedef typename __istream_type::int_type __int_type; + typedef typename __string_type::size_type __size_type; + typedef ctype<_CharT> __ctype_type; + typedef typename __ctype_type::ctype_base __ctype_base; + + __size_type __extracted = 0; + typename __ios_base::iostate __err = __ios_base::goodbit; + typename __istream_type::sentry __cerb(__in, false); + if (__cerb) + { + try + { + + __str.erase(); + _CharT __buf[128]; + __size_type __len = 0; + const streamsize __w = __in.width(); + const __size_type __n = __w > 0 ? static_cast<__size_type>(__w) + : __str.max_size(); + const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc()); + const __int_type __eof = _Traits::eof(); + __int_type __c = __in.rdbuf()->sgetc(); + + while (__extracted < __n + && !_Traits::eq_int_type(__c, __eof) + && !__ct.is(__ctype_base::space, + _Traits::to_char_type(__c))) + { + if (__len == sizeof(__buf) / sizeof(_CharT)) + { + __str.append(__buf, sizeof(__buf) / sizeof(_CharT)); + __len = 0; + } + __buf[__len++] = _Traits::to_char_type(__c); + ++__extracted; + __c = __in.rdbuf()->snextc(); + } + __str.append(__buf, __len); + + if (_Traits::eq_int_type(__c, __eof)) + __err |= __ios_base::eofbit; + __in.width(0); + } + catch(__cxxabiv1::__forced_unwind&) + { + __in._M_setstate(__ios_base::badbit); + throw; + } + catch(...) + { + + + + __in._M_setstate(__ios_base::badbit); + } + } + + if (!__extracted) + __err |= __ios_base::failbit; + if (__err) + __in.setstate(__err); + return __in; + } + + template + basic_istream<_CharT, _Traits>& + getline(basic_istream<_CharT, _Traits>& __in, + basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim) + { + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef basic_string<_CharT, _Traits, _Alloc> __string_type; + typedef typename __istream_type::ios_base __ios_base; + typedef typename __istream_type::int_type __int_type; + typedef typename __string_type::size_type __size_type; + + __size_type __extracted = 0; + const __size_type __n = __str.max_size(); + typename __ios_base::iostate __err = __ios_base::goodbit; + typename __istream_type::sentry __cerb(__in, true); + if (__cerb) + { + try + { + __str.erase(); + const __int_type __idelim = _Traits::to_int_type(__delim); + const __int_type __eof = _Traits::eof(); + __int_type __c = __in.rdbuf()->sgetc(); + + while (__extracted < __n + && !_Traits::eq_int_type(__c, __eof) + && !_Traits::eq_int_type(__c, __idelim)) + { + __str += _Traits::to_char_type(__c); + ++__extracted; + __c = __in.rdbuf()->snextc(); + } + + if (_Traits::eq_int_type(__c, __eof)) + __err |= __ios_base::eofbit; + else if (_Traits::eq_int_type(__c, __idelim)) + { + ++__extracted; + __in.rdbuf()->sbumpc(); + } + else + __err |= __ios_base::failbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + __in._M_setstate(__ios_base::badbit); + throw; + } + catch(...) + { + + + + __in._M_setstate(__ios_base::badbit); + } + } + if (!__extracted) + __err |= __ios_base::failbit; + if (__err) + __in.setstate(__err); + return __in; + } + + + + + extern template class basic_string; + extern template + basic_istream& + operator>>(basic_istream&, string&); + extern template + basic_ostream& + operator<<(basic_ostream&, const string&); + extern template + basic_istream& + getline(basic_istream&, string&, char); + extern template + basic_istream& + getline(basic_istream&, string&); + + + extern template class basic_string; + extern template + basic_istream& + operator>>(basic_istream&, wstring&); + extern template + basic_ostream& + operator<<(basic_ostream&, const wstring&); + extern template + basic_istream& + getline(basic_istream&, wstring&, wchar_t); + extern template + basic_istream& + getline(basic_istream&, wstring&); + + + + +} +# 54 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3 +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 2 3 + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + class locale + { + public: + + + typedef int category; + + + class facet; + class id; + class _Impl; + + friend class facet; + friend class _Impl; + + template + friend bool + has_facet(const locale&) throw(); + + template + friend const _Facet& + use_facet(const locale&); + + template + friend struct __use_cache; +# 98 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + static const category none = 0; + static const category ctype = 1L << 0; + static const category numeric = 1L << 1; + static const category collate = 1L << 2; + static const category time = 1L << 3; + static const category monetary = 1L << 4; + static const category messages = 1L << 5; + static const category all = (ctype | numeric | collate | + time | monetary | messages); +# 117 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + locale() throw(); +# 126 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + locale(const locale& __other) throw(); +# 136 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + explicit + locale(const char* __s); +# 151 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + locale(const locale& __base, const char* __s, category __cat); +# 162 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + explicit + locale(const std::string& __s) : locale(__s.c_str()) { } +# 177 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + locale(const locale& __base, const std::string& __s, category __cat) + : locale(__base, __s.c_str(), __cat) { } +# 192 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + locale(const locale& __base, const locale& __add, category __cat); +# 205 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + template + locale(const locale& __other, _Facet* __f); + + + ~locale() throw(); +# 219 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + const locale& + operator=(const locale& __other) throw(); +# 234 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + template + locale + combine(const locale& __other) const; + + + + + + + __attribute ((__abi_tag__ ("cxx11"))) + string + name() const; +# 254 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + bool + operator==(const locale& __other) const throw(); + + + + + + + + bool + operator!=(const locale& __other) const throw() + { return !(this->operator==(__other)); } +# 282 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + template + bool + operator()(const basic_string<_Char, _Traits, _Alloc>& __s1, + const basic_string<_Char, _Traits, _Alloc>& __s2) const; +# 298 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + static locale + global(const locale& __loc); + + + + + static const locale& + classic(); + + private: + + _Impl* _M_impl; + + + static _Impl* _S_classic; + + + static _Impl* _S_global; + + + + + + static const char* const* const _S_categories; +# 333 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + enum { _S_categories_size = 6 + 6 }; + + + static __gthread_once_t _S_once; + + + explicit + locale(_Impl*) throw(); + + static void + _S_initialize(); + + static void + _S_initialize_once() throw(); + + static category + _S_normalize_category(category); + + void + _M_coalesce(const locale& __base, const locale& __add, category __cat); + + + static const id* const _S_twinned_facets[]; + + }; +# 371 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + class locale::facet + { + private: + friend class locale; + friend class locale::_Impl; + + mutable _Atomic_word _M_refcount; + + + static __c_locale _S_c_locale; + + + static const char _S_c_name[2]; + + + static __gthread_once_t _S_once; + + + static void + _S_initialize_once(); + + protected: +# 402 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + explicit + facet(size_t __refs = 0) throw() : _M_refcount(__refs ? 1 : 0) + { } + + + virtual + ~facet(); + + static void + _S_create_c_locale(__c_locale& __cloc, const char* __s, + __c_locale __old = 0); + + static __c_locale + _S_clone_c_locale(__c_locale& __cloc) throw(); + + static void + _S_destroy_c_locale(__c_locale& __cloc); + + static __c_locale + _S_lc_ctype_c_locale(__c_locale __cloc, const char* __s); + + + + static __c_locale + _S_get_c_locale(); + + __attribute__ ((__const__)) static const char* + _S_get_c_name() throw(); +# 438 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + facet(const facet&) = delete; + + facet& + operator=(const facet&) = delete; + + + private: + void + _M_add_reference() const throw() + { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); } + + void + _M_remove_reference() const throw() + { + + ; + if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1) + { + ; + try + { delete this; } + catch(...) + { } + } + } + + class __shim; + + const facet* _M_sso_shim(const id*) const; + const facet* _M_cow_shim(const id*) const; + }; +# 482 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + class locale::id + { + private: + friend class locale; + friend class locale::_Impl; + + template + friend const _Facet& + use_facet(const locale&); + + template + friend bool + has_facet(const locale&) throw(); + + + + + mutable size_t _M_index; + + + static _Atomic_word _S_refcount; + + void + operator=(const id&); + + id(const id&); + + public: + + + + id() { } + + size_t + _M_id() const throw(); + }; + + + + class locale::_Impl + { + public: + + friend class locale; + friend class locale::facet; + + template + friend bool + has_facet(const locale&) throw(); + + template + friend const _Facet& + use_facet(const locale&); + + template + friend struct __use_cache; + + private: + + _Atomic_word _M_refcount; + const facet** _M_facets; + size_t _M_facets_size; + const facet** _M_caches; + char** _M_names; + static const locale::id* const _S_id_ctype[]; + static const locale::id* const _S_id_numeric[]; + static const locale::id* const _S_id_collate[]; + static const locale::id* const _S_id_time[]; + static const locale::id* const _S_id_monetary[]; + static const locale::id* const _S_id_messages[]; + static const locale::id* const* const _S_facet_categories[]; + + void + _M_add_reference() throw() + { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); } + + void + _M_remove_reference() throw() + { + + ; + if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1) + { + ; + try + { delete this; } + catch(...) + { } + } + } + + _Impl(const _Impl&, size_t); + _Impl(const char*, size_t); + _Impl(size_t) throw(); + + ~_Impl() throw(); + + _Impl(const _Impl&); + + void + operator=(const _Impl&); + + bool + _M_check_same_name() + { + bool __ret = true; + if (_M_names[1]) + + for (size_t __i = 0; __ret && __i < _S_categories_size - 1; ++__i) + __ret = __builtin_strcmp(_M_names[__i], _M_names[__i + 1]) == 0; + return __ret; + } + + void + _M_replace_categories(const _Impl*, category); + + void + _M_replace_category(const _Impl*, const locale::id* const*); + + void + _M_replace_facet(const _Impl*, const locale::id*); + + void + _M_install_facet(const locale::id*, const facet*); + + template + void + _M_init_facet(_Facet* __facet) + { _M_install_facet(&_Facet::id, __facet); } + + template + void + _M_init_facet_unchecked(_Facet* __facet) + { + __facet->_M_add_reference(); + _M_facets[_Facet::id._M_id()] = __facet; + } + + void + _M_install_cache(const facet*, size_t); + + void _M_init_extra(facet**); + void _M_init_extra(void*, void*, const char*, const char*); + }; +# 640 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + template + class __cxx11:: collate : public locale::facet + { + public: + + + + typedef _CharT char_type; + typedef basic_string<_CharT> string_type; + + + protected: + + + __c_locale _M_c_locale_collate; + + public: + + static locale::id id; +# 667 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + explicit + collate(size_t __refs = 0) + : facet(__refs), _M_c_locale_collate(_S_get_c_locale()) + { } +# 681 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + explicit + collate(__c_locale __cloc, size_t __refs = 0) + : facet(__refs), _M_c_locale_collate(_S_clone_c_locale(__cloc)) + { } +# 698 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + int + compare(const _CharT* __lo1, const _CharT* __hi1, + const _CharT* __lo2, const _CharT* __hi2) const + { return this->do_compare(__lo1, __hi1, __lo2, __hi2); } +# 717 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + string_type + transform(const _CharT* __lo, const _CharT* __hi) const + { return this->do_transform(__lo, __hi); } +# 731 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + long + hash(const _CharT* __lo, const _CharT* __hi) const + { return this->do_hash(__lo, __hi); } + + + int + _M_compare(const _CharT*, const _CharT*) const throw(); + + size_t + _M_transform(_CharT*, const _CharT*, size_t) const throw(); + + protected: + + virtual + ~collate() + { _S_destroy_c_locale(_M_c_locale_collate); } +# 760 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + virtual int + do_compare(const _CharT* __lo1, const _CharT* __hi1, + const _CharT* __lo2, const _CharT* __hi2) const; +# 774 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + virtual string_type + do_transform(const _CharT* __lo, const _CharT* __hi) const; +# 787 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3 + virtual long + do_hash(const _CharT* __lo, const _CharT* __hi) const; + }; + + template + locale::id collate<_CharT>::id; + + + template<> + int + collate::_M_compare(const char*, const char*) const throw(); + + template<> + size_t + collate::_M_transform(char*, const char*, size_t) const throw(); + + + template<> + int + collate::_M_compare(const wchar_t*, const wchar_t*) const throw(); + + template<> + size_t + collate::_M_transform(wchar_t*, const wchar_t*, size_t) const throw(); + + + + template + class __cxx11:: collate_byname : public collate<_CharT> + { + public: + + + typedef _CharT char_type; + typedef basic_string<_CharT> string_type; + + + explicit + collate_byname(const char* __s, size_t __refs = 0) + : collate<_CharT>(__refs) + { + if (__builtin_strcmp(__s, "C") != 0 + && __builtin_strcmp(__s, "POSIX") != 0) + { + this->_S_destroy_c_locale(this->_M_c_locale_collate); + this->_S_create_c_locale(this->_M_c_locale_collate, __s); + } + } + + + explicit + collate_byname(const string& __s, size_t __refs = 0) + : collate_byname(__s.c_str(), __refs) { } + + + protected: + virtual + ~collate_byname() { } + }; + + +} + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.tcc" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.tcc" 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + locale:: + locale(const locale& __other, _Facet* __f) + { + _M_impl = new _Impl(*__other._M_impl, 1); + + try + { _M_impl->_M_install_facet(&_Facet::id, __f); } + catch(...) + { + _M_impl->_M_remove_reference(); + throw; + } + delete [] _M_impl->_M_names[0]; + _M_impl->_M_names[0] = 0; + } + + template + locale + locale:: + combine(const locale& __other) const + { + _Impl* __tmp = new _Impl(*_M_impl, 1); + try + { + __tmp->_M_replace_facet(__other._M_impl, &_Facet::id); + } + catch(...) + { + __tmp->_M_remove_reference(); + throw; + } + return locale(__tmp); + } + + template + bool + locale:: + operator()(const basic_string<_CharT, _Traits, _Alloc>& __s1, + const basic_string<_CharT, _Traits, _Alloc>& __s2) const + { + typedef std::collate<_CharT> __collate_type; + const __collate_type& __collate = use_facet<__collate_type>(*this); + return (__collate.compare(__s1.data(), __s1.data() + __s1.length(), + __s2.data(), __s2.data() + __s2.length()) < 0); + } +# 102 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.tcc" 3 + template + bool + has_facet(const locale& __loc) throw() + { + const size_t __i = _Facet::id._M_id(); + const locale::facet** __facets = __loc._M_impl->_M_facets; + return (__i < __loc._M_impl->_M_facets_size + + && dynamic_cast(__facets[__i])); + + + + } +# 130 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.tcc" 3 + template + const _Facet& + use_facet(const locale& __loc) + { + const size_t __i = _Facet::id._M_id(); + const locale::facet** __facets = __loc._M_impl->_M_facets; + if (__i >= __loc._M_impl->_M_facets_size || !__facets[__i]) + __throw_bad_cast(); + + return dynamic_cast(*__facets[__i]); + + + + } + + + + template + int + collate<_CharT>::_M_compare(const _CharT*, const _CharT*) const throw () + { return 0; } + + + template + size_t + collate<_CharT>::_M_transform(_CharT*, const _CharT*, size_t) const throw () + { return 0; } + + template + int + collate<_CharT>:: + do_compare(const _CharT* __lo1, const _CharT* __hi1, + const _CharT* __lo2, const _CharT* __hi2) const + { + + + const string_type __one(__lo1, __hi1); + const string_type __two(__lo2, __hi2); + + const _CharT* __p = __one.c_str(); + const _CharT* __pend = __one.data() + __one.length(); + const _CharT* __q = __two.c_str(); + const _CharT* __qend = __two.data() + __two.length(); + + + + + for (;;) + { + const int __res = _M_compare(__p, __q); + if (__res) + return __res; + + __p += char_traits<_CharT>::length(__p); + __q += char_traits<_CharT>::length(__q); + if (__p == __pend && __q == __qend) + return 0; + else if (__p == __pend) + return -1; + else if (__q == __qend) + return 1; + + __p++; + __q++; + } + } + + template + typename collate<_CharT>::string_type + collate<_CharT>:: + do_transform(const _CharT* __lo, const _CharT* __hi) const + { + string_type __ret; + + + const string_type __str(__lo, __hi); + + const _CharT* __p = __str.c_str(); + const _CharT* __pend = __str.data() + __str.length(); + + size_t __len = (__hi - __lo) * 2; + + _CharT* __c = new _CharT[__len]; + + try + { + + + + for (;;) + { + + size_t __res = _M_transform(__c, __p, __len); + + + if (__res >= __len) + { + __len = __res + 1; + delete [] __c, __c = 0; + __c = new _CharT[__len]; + __res = _M_transform(__c, __p, __len); + } + + __ret.append(__c, __res); + __p += char_traits<_CharT>::length(__p); + if (__p == __pend) + break; + + __p++; + __ret.push_back(_CharT()); + } + } + catch(...) + { + delete [] __c; + throw; + } + + delete [] __c; + + return __ret; + } + + template + long + collate<_CharT>:: + do_hash(const _CharT* __lo, const _CharT* __hi) const + { + unsigned long __val = 0; + for (; __lo < __hi; ++__lo) + __val = + *__lo + ((__val << 7) + | (__val >> (__gnu_cxx::__numeric_traits:: + __digits - 7))); + return static_cast(__val); + } + + + + + extern template class collate; + extern template class collate_byname; + + extern template + const collate& + use_facet >(const locale&); + + extern template + bool + has_facet >(const locale&); + + + extern template class collate; + extern template class collate_byname; + + extern template + const collate& + use_facet >(const locale&); + + extern template + bool + has_facet >(const locale&); + + + + +} +# 851 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 2 3 +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 2 3 + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/system_error" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/system_error" 3 + + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/error_constants.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/error_constants.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 3 + + +# 1 "/usr/include/errno.h" 1 3 4 +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 2 3 +# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/error_constants.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + enum class errc + { + address_family_not_supported = 97, + address_in_use = 98, + address_not_available = 99, + already_connected = 106, + argument_list_too_long = 7, + argument_out_of_domain = 33, + bad_address = 14, + bad_file_descriptor = 9, + + + bad_message = 74, + + + broken_pipe = 32, + connection_aborted = 103, + connection_already_in_progress = 114, + connection_refused = 111, + connection_reset = 104, + cross_device_link = 18, + destination_address_required = 89, + device_or_resource_busy = 16, + directory_not_empty = 39, + executable_format_error = 8, + file_exists = 17, + file_too_large = 27, + filename_too_long = 36, + function_not_supported = 38, + host_unreachable = 113, + + + identifier_removed = 43, + + + illegal_byte_sequence = 84, + inappropriate_io_control_operation = 25, + interrupted = 4, + invalid_argument = 22, + invalid_seek = 29, + io_error = 5, + is_a_directory = 21, + message_size = 90, + network_down = 100, + network_reset = 102, + network_unreachable = 101, + no_buffer_space = 105, + no_child_process = 10, + + + no_link = 67, + + + no_lock_available = 37, + + + no_message_available = 61, + + + no_message = 42, + no_protocol_option = 92, + no_space_on_device = 28, + + + no_stream_resources = 63, + + + no_such_device_or_address = 6, + no_such_device = 19, + no_such_file_or_directory = 2, + no_such_process = 3, + not_a_directory = 20, + not_a_socket = 88, + + + not_a_stream = 60, + + + not_connected = 107, + not_enough_memory = 12, + + + not_supported = 95, + + + + operation_canceled = 125, + + + operation_in_progress = 115, + operation_not_permitted = 1, + operation_not_supported = 95, + operation_would_block = 11, + + + owner_dead = 130, + + + permission_denied = 13, + + + protocol_error = 71, + + + protocol_not_supported = 93, + read_only_file_system = 30, + resource_deadlock_would_occur = 35, + resource_unavailable_try_again = 11, + result_out_of_range = 34, + + + state_not_recoverable = 131, + + + + stream_timeout = 62, + + + + text_file_busy = 26, + + + timed_out = 110, + too_many_files_open_in_system = 23, + too_many_files_open = 24, + too_many_links = 31, + too_many_symbolic_link_levels = 40, + + + value_too_large = 75, + + + wrong_protocol_type = 91 + }; + + +} +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/system_error" 2 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdexcept" 1 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdexcept" 3 + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + struct __cow_string + { + union { + const char* _M_p; + char _M_bytes[sizeof(const char*)]; + }; + + __cow_string(); + __cow_string(const std::string&); + __cow_string(const char*, size_t); + __cow_string(const __cow_string&) noexcept; + __cow_string& operator=(const __cow_string&) noexcept; + ~__cow_string(); + + __cow_string(__cow_string&&) noexcept; + __cow_string& operator=(__cow_string&&) noexcept; + + }; + + typedef basic_string __sso_string; +# 113 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdexcept" 3 + class logic_error : public exception + { + __cow_string _M_msg; + + public: + + explicit + logic_error(const string& __arg) ; + + + explicit + logic_error(const char*) ; + + + + logic_error(const logic_error&) noexcept; + logic_error& operator=(const logic_error&) noexcept; + + + virtual ~logic_error() noexcept; + + + + virtual const char* + what() const noexcept; + + + + + + }; + + + + class domain_error : public logic_error + { + public: + explicit domain_error(const string& __arg) ; + + explicit domain_error(const char*) ; + + virtual ~domain_error() noexcept; + }; + + + class invalid_argument : public logic_error + { + public: + explicit invalid_argument(const string& __arg) ; + + explicit invalid_argument(const char*) ; + + virtual ~invalid_argument() noexcept; + }; + + + + class length_error : public logic_error + { + public: + explicit length_error(const string& __arg) ; + + explicit length_error(const char*) ; + + virtual ~length_error() noexcept; + }; + + + + class out_of_range : public logic_error + { + public: + explicit out_of_range(const string& __arg) ; + + explicit out_of_range(const char*) ; + + virtual ~out_of_range() noexcept; + }; + + + + + + + class runtime_error : public exception + { + __cow_string _M_msg; + + public: + + explicit + runtime_error(const string& __arg) ; + + + explicit + runtime_error(const char*) ; + + + + runtime_error(const runtime_error&) noexcept; + runtime_error& operator=(const runtime_error&) noexcept; + + + virtual ~runtime_error() noexcept; + + + + virtual const char* + what() const noexcept; + + + + + + }; + + + class range_error : public runtime_error + { + public: + explicit range_error(const string& __arg) ; + + explicit range_error(const char*) ; + + virtual ~range_error() noexcept; + }; + + + class overflow_error : public runtime_error + { + public: + explicit overflow_error(const string& __arg) ; + + explicit overflow_error(const char*) ; + + virtual ~overflow_error() noexcept; + }; + + + class underflow_error : public runtime_error + { + public: + explicit underflow_error(const string& __arg) ; + + explicit underflow_error(const char*) ; + + virtual ~underflow_error() noexcept; + }; + + + + +} +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/system_error" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + class error_code; + class error_condition; + class system_error; + + + template + struct is_error_code_enum : public false_type { }; + + + template + struct is_error_condition_enum : public false_type { }; + + template<> + struct is_error_condition_enum + : public true_type { }; + + inline namespace _V2 { + + + class error_category + { + public: + constexpr error_category() noexcept = default; + + virtual ~error_category(); + + error_category(const error_category&) = delete; + error_category& operator=(const error_category&) = delete; + + virtual const char* + name() const noexcept = 0; + + + + + + + private: + __attribute ((__abi_tag__ ("cxx11"))) + virtual __cow_string + _M_message(int) const; + + public: + __attribute ((__abi_tag__ ("cxx11"))) + virtual string + message(int) const = 0; +# 102 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/system_error" 3 + public: + virtual error_condition + default_error_condition(int __i) const noexcept; + + virtual bool + equivalent(int __i, const error_condition& __cond) const noexcept; + + virtual bool + equivalent(const error_code& __code, int __i) const noexcept; + + bool + operator<(const error_category& __other) const noexcept + { return less()(this, &__other); } + + bool + operator==(const error_category& __other) const noexcept + { return this == &__other; } + + bool + operator!=(const error_category& __other) const noexcept + { return this != &__other; } + }; + + + __attribute__ ((__const__)) const error_category& system_category() noexcept; + __attribute__ ((__const__)) const error_category& generic_category() noexcept; + + } + + error_code make_error_code(errc) noexcept; + + template + struct hash; + + + + struct error_code + { + error_code() noexcept + : _M_value(0), _M_cat(&system_category()) { } + + error_code(int __v, const error_category& __cat) noexcept + : _M_value(__v), _M_cat(&__cat) { } + + template::value>::type> + error_code(_ErrorCodeEnum __e) noexcept + { *this = make_error_code(__e); } + + void + assign(int __v, const error_category& __cat) noexcept + { + _M_value = __v; + _M_cat = &__cat; + } + + void + clear() noexcept + { assign(0, system_category()); } + + + template + typename enable_if::value, + error_code&>::type + operator=(_ErrorCodeEnum __e) noexcept + { return *this = make_error_code(__e); } + + int + value() const noexcept { return _M_value; } + + const error_category& + category() const noexcept { return *_M_cat; } + + error_condition + default_error_condition() const noexcept; + + __attribute ((__abi_tag__ ("cxx11"))) + string + message() const + { return category().message(value()); } + + explicit operator bool() const noexcept + { return _M_value != 0; } + + + private: + friend class hash; + + int _M_value; + const error_category* _M_cat; + }; + + + inline error_code + make_error_code(errc __e) noexcept + { return error_code(static_cast(__e), generic_category()); } + + inline bool + operator<(const error_code& __lhs, const error_code& __rhs) noexcept + { + return (__lhs.category() < __rhs.category() + || (__lhs.category() == __rhs.category() + && __lhs.value() < __rhs.value())); + } + + template + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __e) + { return (__os << __e.category().name() << ':' << __e.value()); } + + error_condition make_error_condition(errc) noexcept; + + + + struct error_condition + { + error_condition() noexcept + : _M_value(0), _M_cat(&generic_category()) { } + + error_condition(int __v, const error_category& __cat) noexcept + : _M_value(__v), _M_cat(&__cat) { } + + template::value>::type> + error_condition(_ErrorConditionEnum __e) noexcept + { *this = make_error_condition(__e); } + + void + assign(int __v, const error_category& __cat) noexcept + { + _M_value = __v; + _M_cat = &__cat; + } + + + template + typename enable_if::value, error_condition&>::type + operator=(_ErrorConditionEnum __e) noexcept + { return *this = make_error_condition(__e); } + + void + clear() noexcept + { assign(0, generic_category()); } + + + int + value() const noexcept { return _M_value; } + + const error_category& + category() const noexcept { return *_M_cat; } + + __attribute ((__abi_tag__ ("cxx11"))) + string + message() const + { return category().message(value()); } + + explicit operator bool() const noexcept + { return _M_value != 0; } + + + private: + int _M_value; + const error_category* _M_cat; + }; + + + inline error_condition + make_error_condition(errc __e) noexcept + { return error_condition(static_cast(__e), generic_category()); } + + inline bool + operator<(const error_condition& __lhs, + const error_condition& __rhs) noexcept + { + return (__lhs.category() < __rhs.category() + || (__lhs.category() == __rhs.category() + && __lhs.value() < __rhs.value())); + } + + + inline bool + operator==(const error_code& __lhs, const error_code& __rhs) noexcept + { return (__lhs.category() == __rhs.category() + && __lhs.value() == __rhs.value()); } + + inline bool + operator==(const error_code& __lhs, const error_condition& __rhs) noexcept + { + return (__lhs.category().equivalent(__lhs.value(), __rhs) + || __rhs.category().equivalent(__lhs, __rhs.value())); + } + + inline bool + operator==(const error_condition& __lhs, const error_code& __rhs) noexcept + { + return (__rhs.category().equivalent(__rhs.value(), __lhs) + || __lhs.category().equivalent(__rhs, __lhs.value())); + } + + inline bool + operator==(const error_condition& __lhs, + const error_condition& __rhs) noexcept + { + return (__lhs.category() == __rhs.category() + && __lhs.value() == __rhs.value()); + } + + inline bool + operator!=(const error_code& __lhs, const error_code& __rhs) noexcept + { return !(__lhs == __rhs); } + + inline bool + operator!=(const error_code& __lhs, const error_condition& __rhs) noexcept + { return !(__lhs == __rhs); } + + inline bool + operator!=(const error_condition& __lhs, const error_code& __rhs) noexcept + { return !(__lhs == __rhs); } + + inline bool + operator!=(const error_condition& __lhs, + const error_condition& __rhs) noexcept + { return !(__lhs == __rhs); } + + + + + + + + class system_error : public std::runtime_error + { + private: + error_code _M_code; + + public: + system_error(error_code __ec = error_code()) + : runtime_error(__ec.message()), _M_code(__ec) { } + + system_error(error_code __ec, const string& __what) + : runtime_error(__what + ": " + __ec.message()), _M_code(__ec) { } + + system_error(error_code __ec, const char* __what) + : runtime_error(__what + (": " + __ec.message())), _M_code(__ec) { } + + system_error(int __v, const error_category& __ecat, const char* __what) + : system_error(error_code(__v, __ecat), __what) { } + + system_error(int __v, const error_category& __ecat) + : runtime_error(error_code(__v, __ecat).message()), + _M_code(__v, __ecat) { } + + system_error(int __v, const error_category& __ecat, const string& __what) + : runtime_error(__what + ": " + error_code(__v, __ecat).message()), + _M_code(__v, __ecat) { } + + virtual ~system_error() noexcept; + + const error_code& + code() const noexcept { return _M_code; } + }; + + +} + + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + template<> + struct hash + : public __hash_base + { + size_t + operator()(const error_code& __e) const noexcept + { + const size_t __tmp = std::_Hash_impl::hash(__e._M_value); + return std::_Hash_impl::__hash_combine(__e._M_cat, __tmp); + } + }; + + +} +# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 2 3 + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + + enum _Ios_Fmtflags + { + _S_boolalpha = 1L << 0, + _S_dec = 1L << 1, + _S_fixed = 1L << 2, + _S_hex = 1L << 3, + _S_internal = 1L << 4, + _S_left = 1L << 5, + _S_oct = 1L << 6, + _S_right = 1L << 7, + _S_scientific = 1L << 8, + _S_showbase = 1L << 9, + _S_showpoint = 1L << 10, + _S_showpos = 1L << 11, + _S_skipws = 1L << 12, + _S_unitbuf = 1L << 13, + _S_uppercase = 1L << 14, + _S_adjustfield = _S_left | _S_right | _S_internal, + _S_basefield = _S_dec | _S_oct | _S_hex, + _S_floatfield = _S_scientific | _S_fixed, + _S_ios_fmtflags_end = 1L << 16, + _S_ios_fmtflags_max = 2147483647, + _S_ios_fmtflags_min = ~2147483647 + }; + + inline constexpr _Ios_Fmtflags + operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b) + { return _Ios_Fmtflags(static_cast(__a) & static_cast(__b)); } + + inline constexpr _Ios_Fmtflags + operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b) + { return _Ios_Fmtflags(static_cast(__a) | static_cast(__b)); } + + inline constexpr _Ios_Fmtflags + operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b) + { return _Ios_Fmtflags(static_cast(__a) ^ static_cast(__b)); } + + inline constexpr _Ios_Fmtflags + operator~(_Ios_Fmtflags __a) + { return _Ios_Fmtflags(~static_cast(__a)); } + + inline const _Ios_Fmtflags& + operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) + { return __a = __a | __b; } + + inline const _Ios_Fmtflags& + operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) + { return __a = __a & __b; } + + inline const _Ios_Fmtflags& + operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) + { return __a = __a ^ __b; } + + + enum _Ios_Openmode + { + _S_app = 1L << 0, + _S_ate = 1L << 1, + _S_bin = 1L << 2, + _S_in = 1L << 3, + _S_out = 1L << 4, + _S_trunc = 1L << 5, + _S_ios_openmode_end = 1L << 16, + _S_ios_openmode_max = 2147483647, + _S_ios_openmode_min = ~2147483647 + }; + + inline constexpr _Ios_Openmode + operator&(_Ios_Openmode __a, _Ios_Openmode __b) + { return _Ios_Openmode(static_cast(__a) & static_cast(__b)); } + + inline constexpr _Ios_Openmode + operator|(_Ios_Openmode __a, _Ios_Openmode __b) + { return _Ios_Openmode(static_cast(__a) | static_cast(__b)); } + + inline constexpr _Ios_Openmode + operator^(_Ios_Openmode __a, _Ios_Openmode __b) + { return _Ios_Openmode(static_cast(__a) ^ static_cast(__b)); } + + inline constexpr _Ios_Openmode + operator~(_Ios_Openmode __a) + { return _Ios_Openmode(~static_cast(__a)); } + + inline const _Ios_Openmode& + operator|=(_Ios_Openmode& __a, _Ios_Openmode __b) + { return __a = __a | __b; } + + inline const _Ios_Openmode& + operator&=(_Ios_Openmode& __a, _Ios_Openmode __b) + { return __a = __a & __b; } + + inline const _Ios_Openmode& + operator^=(_Ios_Openmode& __a, _Ios_Openmode __b) + { return __a = __a ^ __b; } + + + enum _Ios_Iostate + { + _S_goodbit = 0, + _S_badbit = 1L << 0, + _S_eofbit = 1L << 1, + _S_failbit = 1L << 2, + _S_ios_iostate_end = 1L << 16, + _S_ios_iostate_max = 2147483647, + _S_ios_iostate_min = ~2147483647 + }; + + inline constexpr _Ios_Iostate + operator&(_Ios_Iostate __a, _Ios_Iostate __b) + { return _Ios_Iostate(static_cast(__a) & static_cast(__b)); } + + inline constexpr _Ios_Iostate + operator|(_Ios_Iostate __a, _Ios_Iostate __b) + { return _Ios_Iostate(static_cast(__a) | static_cast(__b)); } + + inline constexpr _Ios_Iostate + operator^(_Ios_Iostate __a, _Ios_Iostate __b) + { return _Ios_Iostate(static_cast(__a) ^ static_cast(__b)); } + + inline constexpr _Ios_Iostate + operator~(_Ios_Iostate __a) + { return _Ios_Iostate(~static_cast(__a)); } + + inline const _Ios_Iostate& + operator|=(_Ios_Iostate& __a, _Ios_Iostate __b) + { return __a = __a | __b; } + + inline const _Ios_Iostate& + operator&=(_Ios_Iostate& __a, _Ios_Iostate __b) + { return __a = __a & __b; } + + inline const _Ios_Iostate& + operator^=(_Ios_Iostate& __a, _Ios_Iostate __b) + { return __a = __a ^ __b; } + + + enum _Ios_Seekdir + { + _S_beg = 0, + _S_cur = 1, + _S_end = 2, + _S_ios_seekdir_end = 1L << 16 + }; + + + + enum class io_errc { stream = 1 }; + + template <> struct is_error_code_enum : public true_type { }; + + const error_category& iostream_category() noexcept; + + inline error_code + make_error_code(io_errc e) noexcept + { return error_code(static_cast(e), iostream_category()); } + + inline error_condition + make_error_condition(io_errc e) noexcept + { return error_condition(static_cast(e), iostream_category()); } +# 228 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + class ios_base + { +# 246 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + public: +# 255 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + class __attribute ((__abi_tag__ ("cxx11"))) failure : public system_error + { + public: + explicit + failure(const string& __str); + + + explicit + failure(const string&, const error_code&); + + explicit + failure(const char*, const error_code& = io_errc::stream); + + + virtual + ~failure() throw(); + + virtual const char* + what() const throw(); + }; +# 323 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + typedef _Ios_Fmtflags fmtflags; + + + static const fmtflags boolalpha = _S_boolalpha; + + + static const fmtflags dec = _S_dec; + + + static const fmtflags fixed = _S_fixed; + + + static const fmtflags hex = _S_hex; + + + + + static const fmtflags internal = _S_internal; + + + + static const fmtflags left = _S_left; + + + static const fmtflags oct = _S_oct; + + + + static const fmtflags right = _S_right; + + + static const fmtflags scientific = _S_scientific; + + + + static const fmtflags showbase = _S_showbase; + + + + static const fmtflags showpoint = _S_showpoint; + + + static const fmtflags showpos = _S_showpos; + + + static const fmtflags skipws = _S_skipws; + + + static const fmtflags unitbuf = _S_unitbuf; + + + + static const fmtflags uppercase = _S_uppercase; + + + static const fmtflags adjustfield = _S_adjustfield; + + + static const fmtflags basefield = _S_basefield; + + + static const fmtflags floatfield = _S_floatfield; +# 398 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + typedef _Ios_Iostate iostate; + + + + static const iostate badbit = _S_badbit; + + + static const iostate eofbit = _S_eofbit; + + + + + static const iostate failbit = _S_failbit; + + + static const iostate goodbit = _S_goodbit; +# 429 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + typedef _Ios_Openmode openmode; + + + static const openmode app = _S_app; + + + static const openmode ate = _S_ate; + + + + + static const openmode binary = _S_bin; + + + static const openmode in = _S_in; + + + static const openmode out = _S_out; + + + static const openmode trunc = _S_trunc; +# 461 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + typedef _Ios_Seekdir seekdir; + + + static const seekdir beg = _S_beg; + + + static const seekdir cur = _S_cur; + + + static const seekdir end = _S_end; + + + typedef int io_state; + typedef int open_mode; + typedef int seek_dir; + + typedef std::streampos streampos; + typedef std::streamoff streamoff; +# 487 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + enum event + { + erase_event, + imbue_event, + copyfmt_event + }; +# 504 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + typedef void (*event_callback) (event __e, ios_base& __b, int __i); +# 516 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + void + register_callback(event_callback __fn, int __index); + + protected: + streamsize _M_precision; + streamsize _M_width; + fmtflags _M_flags; + iostate _M_exception; + iostate _M_streambuf_state; + + + + struct _Callback_list + { + + _Callback_list* _M_next; + ios_base::event_callback _M_fn; + int _M_index; + _Atomic_word _M_refcount; + + _Callback_list(ios_base::event_callback __fn, int __index, + _Callback_list* __cb) + : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { } + + void + _M_add_reference() { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); } + + + int + _M_remove_reference() + { + + ; + int __res = __gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1); + if (__res == 0) + { + ; + } + return __res; + } + }; + + _Callback_list* _M_callbacks; + + void + _M_call_callbacks(event __ev) throw(); + + void + _M_dispose_callbacks(void) throw(); + + + struct _Words + { + void* _M_pword; + long _M_iword; + _Words() : _M_pword(0), _M_iword(0) { } + }; + + + _Words _M_word_zero; + + + + enum { _S_local_word_size = 8 }; + _Words _M_local_word[_S_local_word_size]; + + + int _M_word_size; + _Words* _M_word; + + _Words& + _M_grow_words(int __index, bool __iword); + + + locale _M_ios_locale; + + void + _M_init() throw(); + + public: + + + + + + class Init + { + friend class ios_base; + public: + Init(); + ~Init(); + + private: + static _Atomic_word _S_refcount; + static bool _S_synced_with_stdio; + }; + + + + + + + fmtflags + flags() const + { return _M_flags; } +# 629 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + fmtflags + flags(fmtflags __fmtfl) + { + fmtflags __old = _M_flags; + _M_flags = __fmtfl; + return __old; + } +# 645 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + fmtflags + setf(fmtflags __fmtfl) + { + fmtflags __old = _M_flags; + _M_flags |= __fmtfl; + return __old; + } +# 662 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + fmtflags + setf(fmtflags __fmtfl, fmtflags __mask) + { + fmtflags __old = _M_flags; + _M_flags &= ~__mask; + _M_flags |= (__fmtfl & __mask); + return __old; + } + + + + + + + + void + unsetf(fmtflags __mask) + { _M_flags &= ~__mask; } +# 688 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + streamsize + precision() const + { return _M_precision; } + + + + + + + streamsize + precision(streamsize __prec) + { + streamsize __old = _M_precision; + _M_precision = __prec; + return __old; + } + + + + + + + + streamsize + width() const + { return _M_width; } + + + + + + + streamsize + width(streamsize __wide) + { + streamsize __old = _M_width; + _M_width = __wide; + return __old; + } +# 739 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + static bool + sync_with_stdio(bool __sync = true); +# 751 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + locale + imbue(const locale& __loc) throw(); +# 762 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + locale + getloc() const + { return _M_ios_locale; } +# 773 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + const locale& + _M_getloc() const + { return _M_ios_locale; } +# 792 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + static int + xalloc() throw(); +# 808 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + long& + iword(int __ix) + { + _Words& __word = (__ix < _M_word_size) + ? _M_word[__ix] : _M_grow_words(__ix, true); + return __word._M_iword; + } +# 829 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + void*& + pword(int __ix) + { + _Words& __word = (__ix < _M_word_size) + ? _M_word[__ix] : _M_grow_words(__ix, false); + return __word._M_pword; + } +# 846 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + virtual ~ios_base(); + + protected: + ios_base() throw (); +# 860 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3 + public: + ios_base(const ios_base&) = delete; + + ios_base& + operator=(const ios_base&) = delete; + + protected: + void + _M_move(ios_base&) noexcept; + + void + _M_swap(ios_base& __rhs) noexcept; + + }; + + + + inline ios_base& + boolalpha(ios_base& __base) + { + __base.setf(ios_base::boolalpha); + return __base; + } + + + inline ios_base& + noboolalpha(ios_base& __base) + { + __base.unsetf(ios_base::boolalpha); + return __base; + } + + + inline ios_base& + showbase(ios_base& __base) + { + __base.setf(ios_base::showbase); + return __base; + } + + + inline ios_base& + noshowbase(ios_base& __base) + { + __base.unsetf(ios_base::showbase); + return __base; + } + + + inline ios_base& + showpoint(ios_base& __base) + { + __base.setf(ios_base::showpoint); + return __base; + } + + + inline ios_base& + noshowpoint(ios_base& __base) + { + __base.unsetf(ios_base::showpoint); + return __base; + } + + + inline ios_base& + showpos(ios_base& __base) + { + __base.setf(ios_base::showpos); + return __base; + } + + + inline ios_base& + noshowpos(ios_base& __base) + { + __base.unsetf(ios_base::showpos); + return __base; + } + + + inline ios_base& + skipws(ios_base& __base) + { + __base.setf(ios_base::skipws); + return __base; + } + + + inline ios_base& + noskipws(ios_base& __base) + { + __base.unsetf(ios_base::skipws); + return __base; + } + + + inline ios_base& + uppercase(ios_base& __base) + { + __base.setf(ios_base::uppercase); + return __base; + } + + + inline ios_base& + nouppercase(ios_base& __base) + { + __base.unsetf(ios_base::uppercase); + return __base; + } + + + inline ios_base& + unitbuf(ios_base& __base) + { + __base.setf(ios_base::unitbuf); + return __base; + } + + + inline ios_base& + nounitbuf(ios_base& __base) + { + __base.unsetf(ios_base::unitbuf); + return __base; + } + + + + inline ios_base& + internal(ios_base& __base) + { + __base.setf(ios_base::internal, ios_base::adjustfield); + return __base; + } + + + inline ios_base& + left(ios_base& __base) + { + __base.setf(ios_base::left, ios_base::adjustfield); + return __base; + } + + + inline ios_base& + right(ios_base& __base) + { + __base.setf(ios_base::right, ios_base::adjustfield); + return __base; + } + + + + inline ios_base& + dec(ios_base& __base) + { + __base.setf(ios_base::dec, ios_base::basefield); + return __base; + } + + + inline ios_base& + hex(ios_base& __base) + { + __base.setf(ios_base::hex, ios_base::basefield); + return __base; + } + + + inline ios_base& + oct(ios_base& __base) + { + __base.setf(ios_base::oct, ios_base::basefield); + return __base; + } + + + + inline ios_base& + fixed(ios_base& __base) + { + __base.setf(ios_base::fixed, ios_base::floatfield); + return __base; + } + + + inline ios_base& + scientific(ios_base& __base) + { + __base.setf(ios_base::scientific, ios_base::floatfield); + return __base; + } + + + + + + + inline ios_base& + hexfloat(ios_base& __base) + { + __base.setf(ios_base::fixed | ios_base::scientific, ios_base::floatfield); + return __base; + } + + + inline ios_base& + defaultfloat(ios_base& __base) + { + __base.unsetf(ios_base::floatfield); + return __base; + } + + + +} +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 1 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + + + + + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + streamsize + __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>*, + basic_streambuf<_CharT, _Traits>*, bool&); +# 119 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + template + class basic_streambuf + { + public: + + + + + + + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + + + + typedef basic_streambuf __streambuf_type; + + + friend class basic_ios; + friend class basic_istream; + friend class basic_ostream; + friend class istreambuf_iterator; + friend class ostreambuf_iterator; + + friend streamsize + __copy_streambufs_eof<>(basic_streambuf*, basic_streambuf*, bool&); + + template + friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, + _CharT2*>::__type + __copy_move_a2(istreambuf_iterator<_CharT2>, + istreambuf_iterator<_CharT2>, _CharT2*); + + template + friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, + istreambuf_iterator<_CharT2> >::__type + find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>, + const _CharT2&); + + template + friend basic_istream<_CharT2, _Traits2>& + operator>>(basic_istream<_CharT2, _Traits2>&, _CharT2*); + + template + friend basic_istream<_CharT2, _Traits2>& + operator>>(basic_istream<_CharT2, _Traits2>&, + basic_string<_CharT2, _Traits2, _Alloc>&); + + template + friend basic_istream<_CharT2, _Traits2>& + getline(basic_istream<_CharT2, _Traits2>&, + basic_string<_CharT2, _Traits2, _Alloc>&, _CharT2); + + protected: + + + + + + + + char_type* _M_in_beg; + char_type* _M_in_cur; + char_type* _M_in_end; + char_type* _M_out_beg; + char_type* _M_out_cur; + char_type* _M_out_end; + + + locale _M_buf_locale; + + public: + + virtual + ~basic_streambuf() + { } +# 208 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + locale + pubimbue(const locale& __loc) + { + locale __tmp(this->getloc()); + this->imbue(__loc); + _M_buf_locale = __loc; + return __tmp; + } +# 225 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + locale + getloc() const + { return _M_buf_locale; } +# 238 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + basic_streambuf* + pubsetbuf(char_type* __s, streamsize __n) + { return this->setbuf(__s, __n); } +# 250 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + pos_type + pubseekoff(off_type __off, ios_base::seekdir __way, + ios_base::openmode __mode = ios_base::in | ios_base::out) + { return this->seekoff(__off, __way, __mode); } +# 262 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + pos_type + pubseekpos(pos_type __sp, + ios_base::openmode __mode = ios_base::in | ios_base::out) + { return this->seekpos(__sp, __mode); } + + + + + int + pubsync() { return this->sync(); } +# 283 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + streamsize + in_avail() + { + const streamsize __ret = this->egptr() - this->gptr(); + return __ret ? __ret : this->showmanyc(); + } +# 297 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + int_type + snextc() + { + int_type __ret = traits_type::eof(); + if (__builtin_expect(!traits_type::eq_int_type(this->sbumpc(), + __ret), true)) + __ret = this->sgetc(); + return __ret; + } +# 315 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + int_type + sbumpc() + { + int_type __ret; + if (__builtin_expect(this->gptr() < this->egptr(), true)) + { + __ret = traits_type::to_int_type(*this->gptr()); + this->gbump(1); + } + else + __ret = this->uflow(); + return __ret; + } +# 337 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + int_type + sgetc() + { + int_type __ret; + if (__builtin_expect(this->gptr() < this->egptr(), true)) + __ret = traits_type::to_int_type(*this->gptr()); + else + __ret = this->underflow(); + return __ret; + } +# 356 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + streamsize + sgetn(char_type* __s, streamsize __n) + { return this->xsgetn(__s, __n); } +# 371 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + int_type + sputbackc(char_type __c) + { + int_type __ret; + const bool __testpos = this->eback() < this->gptr(); + if (__builtin_expect(!__testpos || + !traits_type::eq(__c, this->gptr()[-1]), false)) + __ret = this->pbackfail(traits_type::to_int_type(__c)); + else + { + this->gbump(-1); + __ret = traits_type::to_int_type(*this->gptr()); + } + return __ret; + } +# 396 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + int_type + sungetc() + { + int_type __ret; + if (__builtin_expect(this->eback() < this->gptr(), true)) + { + this->gbump(-1); + __ret = traits_type::to_int_type(*this->gptr()); + } + else + __ret = this->pbackfail(); + return __ret; + } +# 423 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + int_type + sputc(char_type __c) + { + int_type __ret; + if (__builtin_expect(this->pptr() < this->epptr(), true)) + { + *this->pptr() = __c; + this->pbump(1); + __ret = traits_type::to_int_type(__c); + } + else + __ret = this->overflow(traits_type::to_int_type(__c)); + return __ret; + } +# 449 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + streamsize + sputn(const char_type* __s, streamsize __n) + { return this->xsputn(__s, __n); } + + protected: +# 463 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + basic_streambuf() + : _M_in_beg(0), _M_in_cur(0), _M_in_end(0), + _M_out_beg(0), _M_out_cur(0), _M_out_end(0), + _M_buf_locale(locale()) + { } +# 481 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + char_type* + eback() const { return _M_in_beg; } + + char_type* + gptr() const { return _M_in_cur; } + + char_type* + egptr() const { return _M_in_end; } +# 497 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + void + gbump(int __n) { _M_in_cur += __n; } +# 508 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + void + setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) + { + _M_in_beg = __gbeg; + _M_in_cur = __gnext; + _M_in_end = __gend; + } +# 528 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + char_type* + pbase() const { return _M_out_beg; } + + char_type* + pptr() const { return _M_out_cur; } + + char_type* + epptr() const { return _M_out_end; } +# 544 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + void + pbump(int __n) { _M_out_cur += __n; } +# 554 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + void + setp(char_type* __pbeg, char_type* __pend) + { + _M_out_beg = _M_out_cur = __pbeg; + _M_out_end = __pend; + } +# 575 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual void + imbue(const locale& __loc) + { } +# 590 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual basic_streambuf* + setbuf(char_type*, streamsize) + { return this; } +# 601 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual pos_type + seekoff(off_type, ios_base::seekdir, + ios_base::openmode = ios_base::in | ios_base::out) + { return pos_type(off_type(-1)); } +# 613 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual pos_type + seekpos(pos_type, + ios_base::openmode = ios_base::in | ios_base::out) + { return pos_type(off_type(-1)); } +# 626 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual int + sync() { return 0; } +# 648 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual streamsize + showmanyc() { return 0; } +# 664 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual streamsize + xsgetn(char_type* __s, streamsize __n); +# 686 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual int_type + underflow() + { return traits_type::eof(); } +# 699 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual int_type + uflow() + { + int_type __ret = traits_type::eof(); + const bool __testeof = traits_type::eq_int_type(this->underflow(), + __ret); + if (!__testeof) + { + __ret = traits_type::to_int_type(*this->gptr()); + this->gbump(1); + } + return __ret; + } +# 723 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual int_type + pbackfail(int_type __c = traits_type::eof()) + { return traits_type::eof(); } +# 741 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual streamsize + xsputn(const char_type* __s, streamsize __n); +# 767 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + virtual int_type + overflow(int_type __c = traits_type::eof()) + { return traits_type::eof(); } + + + + public: +# 782 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3 + void + stossc() + { + if (this->gptr() < this->egptr()) + this->gbump(1); + else + this->uflow(); + } + + + + void + __safe_gbump(streamsize __n) { _M_in_cur += __n; } + + void + __safe_pbump(streamsize __n) { _M_out_cur += __n; } + + + + + protected: + + basic_streambuf(const basic_streambuf&); + + basic_streambuf& + operator=(const basic_streambuf&); + + + void + swap(basic_streambuf& __sb) + { + std::swap(_M_in_beg, __sb._M_in_beg); + std::swap(_M_in_cur, __sb._M_in_cur); + std::swap(_M_in_end, __sb._M_in_end); + std::swap(_M_out_beg, __sb._M_out_beg); + std::swap(_M_out_cur, __sb._M_out_cur); + std::swap(_M_out_end, __sb._M_out_end); + std::swap(_M_buf_locale, __sb._M_buf_locale); + } + + }; + + + template + std::basic_streambuf<_CharT, _Traits>:: + basic_streambuf(const basic_streambuf&) = default; + + template + std::basic_streambuf<_CharT, _Traits>& + std::basic_streambuf<_CharT, _Traits>:: + operator=(const basic_streambuf&) = default; + + + + template<> + streamsize + __copy_streambufs_eof(basic_streambuf* __sbin, + basic_streambuf* __sbout, bool& __ineof); + + template<> + streamsize + __copy_streambufs_eof(basic_streambuf* __sbin, + basic_streambuf* __sbout, bool& __ineof); + + + +} + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/streambuf.tcc" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/streambuf.tcc" 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + streamsize + basic_streambuf<_CharT, _Traits>:: + xsgetn(char_type* __s, streamsize __n) + { + streamsize __ret = 0; + while (__ret < __n) + { + const streamsize __buf_len = this->egptr() - this->gptr(); + if (__buf_len) + { + const streamsize __remaining = __n - __ret; + const streamsize __len = std::min(__buf_len, __remaining); + traits_type::copy(__s, this->gptr(), __len); + __ret += __len; + __s += __len; + this->__safe_gbump(__len); + } + + if (__ret < __n) + { + const int_type __c = this->uflow(); + if (!traits_type::eq_int_type(__c, traits_type::eof())) + { + traits_type::assign(*__s++, traits_type::to_char_type(__c)); + ++__ret; + } + else + break; + } + } + return __ret; + } + + template + streamsize + basic_streambuf<_CharT, _Traits>:: + xsputn(const char_type* __s, streamsize __n) + { + streamsize __ret = 0; + while (__ret < __n) + { + const streamsize __buf_len = this->epptr() - this->pptr(); + if (__buf_len) + { + const streamsize __remaining = __n - __ret; + const streamsize __len = std::min(__buf_len, __remaining); + traits_type::copy(this->pptr(), __s, __len); + __ret += __len; + __s += __len; + this->__safe_pbump(__len); + } + + if (__ret < __n) + { + int_type __c = this->overflow(traits_type::to_int_type(*__s)); + if (!traits_type::eq_int_type(__c, traits_type::eof())) + { + ++__ret; + ++__s; + } + else + break; + } + } + return __ret; + } + + + + + template + streamsize + __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>* __sbin, + basic_streambuf<_CharT, _Traits>* __sbout, + bool& __ineof) + { + streamsize __ret = 0; + __ineof = true; + typename _Traits::int_type __c = __sbin->sgetc(); + while (!_Traits::eq_int_type(__c, _Traits::eof())) + { + __c = __sbout->sputc(_Traits::to_char_type(__c)); + if (_Traits::eq_int_type(__c, _Traits::eof())) + { + __ineof = false; + break; + } + ++__ret; + __c = __sbin->snextc(); + } + return __ret; + } + + template + inline streamsize + __copy_streambufs(basic_streambuf<_CharT, _Traits>* __sbin, + basic_streambuf<_CharT, _Traits>* __sbout) + { + bool __ineof; + return __copy_streambufs_eof(__sbin, __sbout, __ineof); + } + + + + + extern template class basic_streambuf; + extern template + streamsize + __copy_streambufs(basic_streambuf*, + basic_streambuf*); + extern template + streamsize + __copy_streambufs_eof(basic_streambuf*, + basic_streambuf*, bool&); + + + extern template class basic_streambuf; + extern template + streamsize + __copy_streambufs(basic_streambuf*, + basic_streambuf*); + extern template + streamsize + __copy_streambufs_eof(basic_streambuf*, + basic_streambuf*, bool&); + + + + +} +# 851 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 2 3 +# 44 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwctype" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwctype" 3 +# 50 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwctype" 3 +# 1 "/usr/include/wctype.h" 1 3 4 +# 33 "/usr/include/wctype.h" 3 4 +# 1 "/usr/include/wchar.h" 1 3 4 +# 34 "/usr/include/wctype.h" 2 3 4 +# 52 "/usr/include/wctype.h" 3 4 +typedef unsigned long int wctype_t; +# 71 "/usr/include/wctype.h" 3 4 +enum +{ + __ISwupper = 0, + __ISwlower = 1, + __ISwalpha = 2, + __ISwdigit = 3, + __ISwxdigit = 4, + __ISwspace = 5, + __ISwprint = 6, + __ISwgraph = 7, + __ISwblank = 8, + __ISwcntrl = 9, + __ISwpunct = 10, + __ISwalnum = 11, + + _ISwupper = ((__ISwupper) < 8 ? (int) ((1UL << (__ISwupper)) << 24) : ((__ISwupper) < 16 ? (int) ((1UL << (__ISwupper)) << 8) : ((__ISwupper) < 24 ? (int) ((1UL << (__ISwupper)) >> 8) : (int) ((1UL << (__ISwupper)) >> 24)))), + _ISwlower = ((__ISwlower) < 8 ? (int) ((1UL << (__ISwlower)) << 24) : ((__ISwlower) < 16 ? (int) ((1UL << (__ISwlower)) << 8) : ((__ISwlower) < 24 ? (int) ((1UL << (__ISwlower)) >> 8) : (int) ((1UL << (__ISwlower)) >> 24)))), + _ISwalpha = ((__ISwalpha) < 8 ? (int) ((1UL << (__ISwalpha)) << 24) : ((__ISwalpha) < 16 ? (int) ((1UL << (__ISwalpha)) << 8) : ((__ISwalpha) < 24 ? (int) ((1UL << (__ISwalpha)) >> 8) : (int) ((1UL << (__ISwalpha)) >> 24)))), + _ISwdigit = ((__ISwdigit) < 8 ? (int) ((1UL << (__ISwdigit)) << 24) : ((__ISwdigit) < 16 ? (int) ((1UL << (__ISwdigit)) << 8) : ((__ISwdigit) < 24 ? (int) ((1UL << (__ISwdigit)) >> 8) : (int) ((1UL << (__ISwdigit)) >> 24)))), + _ISwxdigit = ((__ISwxdigit) < 8 ? (int) ((1UL << (__ISwxdigit)) << 24) : ((__ISwxdigit) < 16 ? (int) ((1UL << (__ISwxdigit)) << 8) : ((__ISwxdigit) < 24 ? (int) ((1UL << (__ISwxdigit)) >> 8) : (int) ((1UL << (__ISwxdigit)) >> 24)))), + _ISwspace = ((__ISwspace) < 8 ? (int) ((1UL << (__ISwspace)) << 24) : ((__ISwspace) < 16 ? (int) ((1UL << (__ISwspace)) << 8) : ((__ISwspace) < 24 ? (int) ((1UL << (__ISwspace)) >> 8) : (int) ((1UL << (__ISwspace)) >> 24)))), + _ISwprint = ((__ISwprint) < 8 ? (int) ((1UL << (__ISwprint)) << 24) : ((__ISwprint) < 16 ? (int) ((1UL << (__ISwprint)) << 8) : ((__ISwprint) < 24 ? (int) ((1UL << (__ISwprint)) >> 8) : (int) ((1UL << (__ISwprint)) >> 24)))), + _ISwgraph = ((__ISwgraph) < 8 ? (int) ((1UL << (__ISwgraph)) << 24) : ((__ISwgraph) < 16 ? (int) ((1UL << (__ISwgraph)) << 8) : ((__ISwgraph) < 24 ? (int) ((1UL << (__ISwgraph)) >> 8) : (int) ((1UL << (__ISwgraph)) >> 24)))), + _ISwblank = ((__ISwblank) < 8 ? (int) ((1UL << (__ISwblank)) << 24) : ((__ISwblank) < 16 ? (int) ((1UL << (__ISwblank)) << 8) : ((__ISwblank) < 24 ? (int) ((1UL << (__ISwblank)) >> 8) : (int) ((1UL << (__ISwblank)) >> 24)))), + _ISwcntrl = ((__ISwcntrl) < 8 ? (int) ((1UL << (__ISwcntrl)) << 24) : ((__ISwcntrl) < 16 ? (int) ((1UL << (__ISwcntrl)) << 8) : ((__ISwcntrl) < 24 ? (int) ((1UL << (__ISwcntrl)) >> 8) : (int) ((1UL << (__ISwcntrl)) >> 24)))), + _ISwpunct = ((__ISwpunct) < 8 ? (int) ((1UL << (__ISwpunct)) << 24) : ((__ISwpunct) < 16 ? (int) ((1UL << (__ISwpunct)) << 8) : ((__ISwpunct) < 24 ? (int) ((1UL << (__ISwpunct)) >> 8) : (int) ((1UL << (__ISwpunct)) >> 24)))), + _ISwalnum = ((__ISwalnum) < 8 ? (int) ((1UL << (__ISwalnum)) << 24) : ((__ISwalnum) < 16 ? (int) ((1UL << (__ISwalnum)) << 8) : ((__ISwalnum) < 24 ? (int) ((1UL << (__ISwalnum)) >> 8) : (int) ((1UL << (__ISwalnum)) >> 24)))) +}; + + + +extern "C" { +# 111 "/usr/include/wctype.h" 3 4 +extern int iswalnum (wint_t __wc) throw (); + + + + + +extern int iswalpha (wint_t __wc) throw (); + + +extern int iswcntrl (wint_t __wc) throw (); + + + +extern int iswdigit (wint_t __wc) throw (); + + + +extern int iswgraph (wint_t __wc) throw (); + + + + +extern int iswlower (wint_t __wc) throw (); + + +extern int iswprint (wint_t __wc) throw (); + + + + +extern int iswpunct (wint_t __wc) throw (); + + + + +extern int iswspace (wint_t __wc) throw (); + + + + +extern int iswupper (wint_t __wc) throw (); + + + + +extern int iswxdigit (wint_t __wc) throw (); + + + + + +extern int iswblank (wint_t __wc) throw (); +# 171 "/usr/include/wctype.h" 3 4 +extern wctype_t wctype (const char *__property) throw (); + + + +extern int iswctype (wint_t __wc, wctype_t __desc) throw (); +# 186 "/usr/include/wctype.h" 3 4 +typedef const __int32_t *wctrans_t; + + + + + + + +extern wint_t towlower (wint_t __wc) throw (); + + +extern wint_t towupper (wint_t __wc) throw (); + + +} +# 213 "/usr/include/wctype.h" 3 4 +extern "C" { + + + + +extern wctrans_t wctrans (const char *__property) throw (); + + +extern wint_t towctrans (wint_t __wc, wctrans_t __desc) throw (); +# 230 "/usr/include/wctype.h" 3 4 +extern int iswalnum_l (wint_t __wc, __locale_t __locale) throw (); + + + + + +extern int iswalpha_l (wint_t __wc, __locale_t __locale) throw (); + + +extern int iswcntrl_l (wint_t __wc, __locale_t __locale) throw (); + + + +extern int iswdigit_l (wint_t __wc, __locale_t __locale) throw (); + + + +extern int iswgraph_l (wint_t __wc, __locale_t __locale) throw (); + + + + +extern int iswlower_l (wint_t __wc, __locale_t __locale) throw (); + + +extern int iswprint_l (wint_t __wc, __locale_t __locale) throw (); + + + + +extern int iswpunct_l (wint_t __wc, __locale_t __locale) throw (); + + + + +extern int iswspace_l (wint_t __wc, __locale_t __locale) throw (); + + + + +extern int iswupper_l (wint_t __wc, __locale_t __locale) throw (); + + + + +extern int iswxdigit_l (wint_t __wc, __locale_t __locale) throw (); + + + + +extern int iswblank_l (wint_t __wc, __locale_t __locale) throw (); + + + +extern wctype_t wctype_l (const char *__property, __locale_t __locale) + throw (); + + + +extern int iswctype_l (wint_t __wc, wctype_t __desc, __locale_t __locale) + throw (); + + + + + + + +extern wint_t towlower_l (wint_t __wc, __locale_t __locale) throw (); + + +extern wint_t towupper_l (wint_t __wc, __locale_t __locale) throw (); + + + +extern wctrans_t wctrans_l (const char *__property, __locale_t __locale) + throw (); + + +extern wint_t towctrans_l (wint_t __wc, wctrans_t __desc, + __locale_t __locale) throw (); + + + +} +# 51 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwctype" 2 3 +# 80 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwctype" 3 +namespace std +{ + using ::wctrans_t; + using ::wctype_t; + using ::wint_t; + + using ::iswalnum; + using ::iswalpha; + + using ::iswblank; + + using ::iswcntrl; + using ::iswctype; + using ::iswdigit; + using ::iswgraph; + using ::iswlower; + using ::iswprint; + using ::iswpunct; + using ::iswspace; + using ::iswupper; + using ::iswxdigit; + using ::towctrans; + using ::towlower; + using ::towupper; + using ::wctrans; + using ::wctype; +} +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 3 +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/ctype_base.h" 1 3 +# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/ctype_base.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + struct ctype_base + { + + typedef const int* __to_type; + + + + typedef unsigned short mask; + static const mask upper = _ISupper; + static const mask lower = _ISlower; + static const mask alpha = _ISalpha; + static const mask digit = _ISdigit; + static const mask xdigit = _ISxdigit; + static const mask space = _ISspace; + static const mask print = _ISprint; + static const mask graph = _ISalpha | _ISdigit | _ISpunct; + static const mask cntrl = _IScntrl; + static const mask punct = _ISpunct; + static const mask alnum = _ISalpha | _ISdigit; + + static const mask blank = _ISblank; + + }; + + +} +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3 + + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/streambuf_iterator.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/streambuf_iterator.h" 3 + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 49 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/streambuf_iterator.h" 3 + template + class istreambuf_iterator + : public iterator + + + + { + public: + + + + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename _Traits::int_type int_type; + typedef basic_streambuf<_CharT, _Traits> streambuf_type; + typedef basic_istream<_CharT, _Traits> istream_type; + + + template + friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, + ostreambuf_iterator<_CharT2> >::__type + copy(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>, + ostreambuf_iterator<_CharT2>); + + template + friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, + _CharT2*>::__type + __copy_move_a2(istreambuf_iterator<_CharT2>, + istreambuf_iterator<_CharT2>, _CharT2*); + + template + friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, + istreambuf_iterator<_CharT2> >::__type + find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>, + const _CharT2&); + + private: + + + + + + + + mutable streambuf_type* _M_sbuf; + mutable int_type _M_c; + + public: + + constexpr istreambuf_iterator() noexcept + : _M_sbuf(0), _M_c(traits_type::eof()) { } + + + istreambuf_iterator(const istreambuf_iterator&) noexcept = default; + + ~istreambuf_iterator() = default; + + + + istreambuf_iterator(istream_type& __s) noexcept + : _M_sbuf(__s.rdbuf()), _M_c(traits_type::eof()) { } + + + istreambuf_iterator(streambuf_type* __s) noexcept + : _M_sbuf(__s), _M_c(traits_type::eof()) { } + + + + + char_type + operator*() const + { + + + + + + + + return traits_type::to_char_type(_M_get()); + } + + + istreambuf_iterator& + operator++() + { + + + ; + if (_M_sbuf) + { + _M_sbuf->sbumpc(); + _M_c = traits_type::eof(); + } + return *this; + } + + + istreambuf_iterator + operator++(int) + { + + + ; + + istreambuf_iterator __old = *this; + if (_M_sbuf) + { + __old._M_c = _M_sbuf->sbumpc(); + _M_c = traits_type::eof(); + } + return __old; + } + + + + + + bool + equal(const istreambuf_iterator& __b) const + { return _M_at_eof() == __b._M_at_eof(); } + + private: + int_type + _M_get() const + { + const int_type __eof = traits_type::eof(); + int_type __ret = __eof; + if (_M_sbuf) + { + if (!traits_type::eq_int_type(_M_c, __eof)) + __ret = _M_c; + else if (!traits_type::eq_int_type((__ret = _M_sbuf->sgetc()), + __eof)) + _M_c = __ret; + else + _M_sbuf = 0; + } + return __ret; + } + + bool + _M_at_eof() const + { + const int_type __eof = traits_type::eof(); + return traits_type::eq_int_type(_M_get(), __eof); + } + }; + + template + inline bool + operator==(const istreambuf_iterator<_CharT, _Traits>& __a, + const istreambuf_iterator<_CharT, _Traits>& __b) + { return __a.equal(__b); } + + template + inline bool + operator!=(const istreambuf_iterator<_CharT, _Traits>& __a, + const istreambuf_iterator<_CharT, _Traits>& __b) + { return !__a.equal(__b); } + + + template + class ostreambuf_iterator + : public iterator + { + public: + + + + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_streambuf<_CharT, _Traits> streambuf_type; + typedef basic_ostream<_CharT, _Traits> ostream_type; + + + template + friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, + ostreambuf_iterator<_CharT2> >::__type + copy(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>, + ostreambuf_iterator<_CharT2>); + + private: + streambuf_type* _M_sbuf; + bool _M_failed; + + public: + + ostreambuf_iterator(ostream_type& __s) noexcept + : _M_sbuf(__s.rdbuf()), _M_failed(!_M_sbuf) { } + + + ostreambuf_iterator(streambuf_type* __s) noexcept + : _M_sbuf(__s), _M_failed(!_M_sbuf) { } + + + ostreambuf_iterator& + operator=(_CharT __c) + { + if (!_M_failed && + _Traits::eq_int_type(_M_sbuf->sputc(__c), _Traits::eof())) + _M_failed = true; + return *this; + } + + + ostreambuf_iterator& + operator*() + { return *this; } + + + ostreambuf_iterator& + operator++(int) + { return *this; } + + + ostreambuf_iterator& + operator++() + { return *this; } + + + bool + failed() const noexcept + { return _M_failed; } + + ostreambuf_iterator& + _M_put(const _CharT* __ws, streamsize __len) + { + if (__builtin_expect(!_M_failed, true) + && __builtin_expect(this->_M_sbuf->sputn(__ws, __len) != __len, + false)) + _M_failed = true; + return *this; + } + }; + + + template + typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, + ostreambuf_iterator<_CharT> >::__type + copy(istreambuf_iterator<_CharT> __first, + istreambuf_iterator<_CharT> __last, + ostreambuf_iterator<_CharT> __result) + { + if (__first._M_sbuf && !__last._M_sbuf && !__result._M_failed) + { + bool __ineof; + __copy_streambufs_eof(__first._M_sbuf, __result._M_sbuf, __ineof); + if (!__ineof) + __result._M_failed = true; + } + return __result; + } + + template + typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, + ostreambuf_iterator<_CharT> >::__type + __copy_move_a2(_CharT* __first, _CharT* __last, + ostreambuf_iterator<_CharT> __result) + { + const streamsize __num = __last - __first; + if (__num > 0) + __result._M_put(__first, __num); + return __result; + } + + template + typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, + ostreambuf_iterator<_CharT> >::__type + __copy_move_a2(const _CharT* __first, const _CharT* __last, + ostreambuf_iterator<_CharT> __result) + { + const streamsize __num = __last - __first; + if (__num > 0) + __result._M_put(__first, __num); + return __result; + } + + template + typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, + _CharT*>::__type + __copy_move_a2(istreambuf_iterator<_CharT> __first, + istreambuf_iterator<_CharT> __last, _CharT* __result) + { + typedef istreambuf_iterator<_CharT> __is_iterator_type; + typedef typename __is_iterator_type::traits_type traits_type; + typedef typename __is_iterator_type::streambuf_type streambuf_type; + typedef typename traits_type::int_type int_type; + + if (__first._M_sbuf && !__last._M_sbuf) + { + streambuf_type* __sb = __first._M_sbuf; + int_type __c = __sb->sgetc(); + while (!traits_type::eq_int_type(__c, traits_type::eof())) + { + const streamsize __n = __sb->egptr() - __sb->gptr(); + if (__n > 1) + { + traits_type::copy(__result, __sb->gptr(), __n); + __sb->__safe_gbump(__n); + __result += __n; + __c = __sb->underflow(); + } + else + { + *__result++ = traits_type::to_char_type(__c); + __c = __sb->snextc(); + } + } + } + return __result; + } + + template + typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, + istreambuf_iterator<_CharT> >::__type + find(istreambuf_iterator<_CharT> __first, + istreambuf_iterator<_CharT> __last, const _CharT& __val) + { + typedef istreambuf_iterator<_CharT> __is_iterator_type; + typedef typename __is_iterator_type::traits_type traits_type; + typedef typename __is_iterator_type::streambuf_type streambuf_type; + typedef typename traits_type::int_type int_type; + + if (__first._M_sbuf && !__last._M_sbuf) + { + const int_type __ival = traits_type::to_int_type(__val); + streambuf_type* __sb = __first._M_sbuf; + int_type __c = __sb->sgetc(); + while (!traits_type::eq_int_type(__c, traits_type::eof()) + && !traits_type::eq_int_type(__c, __ival)) + { + streamsize __n = __sb->egptr() - __sb->gptr(); + if (__n > 1) + { + const _CharT* __p = traits_type::find(__sb->gptr(), + __n, __val); + if (__p) + __n = __p - __sb->gptr(); + __sb->__safe_gbump(__n); + __c = __sb->sgetc(); + } + else + __c = __sb->snextc(); + } + + if (!traits_type::eq_int_type(__c, traits_type::eof())) + __first._M_c = __c; + else + __first._M_sbuf = 0; + } + return __first; + } + + + + +} +# 49 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 71 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + template + void + __convert_to_v(const char*, _Tp&, ios_base::iostate&, + const __c_locale&) throw(); + + + template<> + void + __convert_to_v(const char*, float&, ios_base::iostate&, + const __c_locale&) throw(); + + template<> + void + __convert_to_v(const char*, double&, ios_base::iostate&, + const __c_locale&) throw(); + + template<> + void + __convert_to_v(const char*, long double&, ios_base::iostate&, + const __c_locale&) throw(); + + + + template + struct __pad + { + static void + _S_pad(ios_base& __io, _CharT __fill, _CharT* __news, + const _CharT* __olds, streamsize __newlen, streamsize __oldlen); + }; + + + + + + + template + _CharT* + __add_grouping(_CharT* __s, _CharT __sep, + const char* __gbeg, size_t __gsize, + const _CharT* __first, const _CharT* __last); + + + + + template + inline + ostreambuf_iterator<_CharT> + __write(ostreambuf_iterator<_CharT> __s, const _CharT* __ws, int __len) + { + __s._M_put(__ws, __len); + return __s; + } + + + template + inline + _OutIter + __write(_OutIter __s, const _CharT* __ws, int __len) + { + for (int __j = 0; __j < __len; __j++, ++__s) + *__s = __ws[__j]; + return __s; + } +# 149 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + template + class __ctype_abstract_base : public locale::facet, public ctype_base + { + public: + + + typedef _CharT char_type; +# 168 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + bool + is(mask __m, char_type __c) const + { return this->do_is(__m, __c); } +# 185 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char_type* + is(const char_type *__lo, const char_type *__hi, mask *__vec) const + { return this->do_is(__lo, __hi, __vec); } +# 201 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char_type* + scan_is(mask __m, const char_type* __lo, const char_type* __hi) const + { return this->do_scan_is(__m, __lo, __hi); } +# 217 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char_type* + scan_not(mask __m, const char_type* __lo, const char_type* __hi) const + { return this->do_scan_not(__m, __lo, __hi); } +# 231 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + char_type + toupper(char_type __c) const + { return this->do_toupper(__c); } +# 246 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char_type* + toupper(char_type *__lo, const char_type* __hi) const + { return this->do_toupper(__lo, __hi); } +# 260 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + char_type + tolower(char_type __c) const + { return this->do_tolower(__c); } +# 275 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char_type* + tolower(char_type* __lo, const char_type* __hi) const + { return this->do_tolower(__lo, __hi); } +# 292 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + char_type + widen(char __c) const + { return this->do_widen(__c); } +# 311 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char* + widen(const char* __lo, const char* __hi, char_type* __to) const + { return this->do_widen(__lo, __hi, __to); } +# 330 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + char + narrow(char_type __c, char __dfault) const + { return this->do_narrow(__c, __dfault); } +# 352 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char_type* + narrow(const char_type* __lo, const char_type* __hi, + char __dfault, char* __to) const + { return this->do_narrow(__lo, __hi, __dfault, __to); } + + protected: + explicit + __ctype_abstract_base(size_t __refs = 0): facet(__refs) { } + + virtual + ~__ctype_abstract_base() { } +# 377 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual bool + do_is(mask __m, char_type __c) const = 0; +# 396 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_is(const char_type* __lo, const char_type* __hi, + mask* __vec) const = 0; +# 415 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_scan_is(mask __m, const char_type* __lo, + const char_type* __hi) const = 0; +# 434 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_scan_not(mask __m, const char_type* __lo, + const char_type* __hi) const = 0; +# 452 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_toupper(char_type __c) const = 0; +# 469 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_toupper(char_type* __lo, const char_type* __hi) const = 0; +# 485 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_tolower(char_type __c) const = 0; +# 502 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_tolower(char_type* __lo, const char_type* __hi) const = 0; +# 521 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_widen(char __c) const = 0; +# 542 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char* + do_widen(const char* __lo, const char* __hi, char_type* __to) const = 0; +# 563 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char + do_narrow(char_type __c, char __dfault) const = 0; +# 588 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_narrow(const char_type* __lo, const char_type* __hi, + char __dfault, char* __to) const = 0; + }; +# 611 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + template + class ctype : public __ctype_abstract_base<_CharT> + { + public: + + typedef _CharT char_type; + typedef typename __ctype_abstract_base<_CharT>::mask mask; + + + static locale::id id; + + explicit + ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { } + + protected: + virtual + ~ctype(); + + virtual bool + do_is(mask __m, char_type __c) const; + + virtual const char_type* + do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const; + + virtual const char_type* + do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const; + + virtual const char_type* + do_scan_not(mask __m, const char_type* __lo, + const char_type* __hi) const; + + virtual char_type + do_toupper(char_type __c) const; + + virtual const char_type* + do_toupper(char_type* __lo, const char_type* __hi) const; + + virtual char_type + do_tolower(char_type __c) const; + + virtual const char_type* + do_tolower(char_type* __lo, const char_type* __hi) const; + + virtual char_type + do_widen(char __c) const; + + virtual const char* + do_widen(const char* __lo, const char* __hi, char_type* __dest) const; + + virtual char + do_narrow(char_type, char __dfault) const; + + virtual const char_type* + do_narrow(const char_type* __lo, const char_type* __hi, + char __dfault, char* __to) const; + }; + + template + locale::id ctype<_CharT>::id; +# 680 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + template<> + class ctype : public locale::facet, public ctype_base + { + public: + + + typedef char char_type; + + protected: + + __c_locale _M_c_locale_ctype; + bool _M_del; + __to_type _M_toupper; + __to_type _M_tolower; + const mask* _M_table; + mutable char _M_widen_ok; + mutable char _M_widen[1 + static_cast(-1)]; + mutable char _M_narrow[1 + static_cast(-1)]; + mutable char _M_narrow_ok; + + + public: + + static locale::id id; + + static const size_t table_size = 1 + static_cast(-1); +# 717 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + explicit + ctype(const mask* __table = 0, bool __del = false, size_t __refs = 0); +# 730 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + explicit + ctype(__c_locale __cloc, const mask* __table = 0, bool __del = false, + size_t __refs = 0); +# 743 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + inline bool + is(mask __m, char __c) const; +# 758 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + inline const char* + is(const char* __lo, const char* __hi, mask* __vec) const; +# 772 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + inline const char* + scan_is(mask __m, const char* __lo, const char* __hi) const; +# 786 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + inline const char* + scan_not(mask __m, const char* __lo, const char* __hi) const; +# 801 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + char_type + toupper(char_type __c) const + { return this->do_toupper(__c); } +# 818 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char_type* + toupper(char_type *__lo, const char_type* __hi) const + { return this->do_toupper(__lo, __hi); } +# 834 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + char_type + tolower(char_type __c) const + { return this->do_tolower(__c); } +# 851 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char_type* + tolower(char_type* __lo, const char_type* __hi) const + { return this->do_tolower(__lo, __hi); } +# 871 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + char_type + widen(char __c) const + { + if (_M_widen_ok) + return _M_widen[static_cast(__c)]; + this->_M_widen_init(); + return this->do_widen(__c); + } +# 898 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char* + widen(const char* __lo, const char* __hi, char_type* __to) const + { + if (_M_widen_ok == 1) + { + __builtin_memcpy(__to, __lo, __hi - __lo); + return __hi; + } + if (!_M_widen_ok) + _M_widen_init(); + return this->do_widen(__lo, __hi, __to); + } +# 929 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + char + narrow(char_type __c, char __dfault) const + { + if (_M_narrow[static_cast(__c)]) + return _M_narrow[static_cast(__c)]; + const char __t = do_narrow(__c, __dfault); + if (__t != __dfault) + _M_narrow[static_cast(__c)] = __t; + return __t; + } +# 962 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + const char_type* + narrow(const char_type* __lo, const char_type* __hi, + char __dfault, char* __to) const + { + if (__builtin_expect(_M_narrow_ok == 1, true)) + { + __builtin_memcpy(__to, __lo, __hi - __lo); + return __hi; + } + if (!_M_narrow_ok) + _M_narrow_init(); + return this->do_narrow(__lo, __hi, __dfault, __to); + } + + + + + + const mask* + table() const throw() + { return _M_table; } + + + static const mask* + classic_table() throw(); + protected: + + + + + + + + virtual + ~ctype(); +# 1011 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_toupper(char_type __c) const; +# 1028 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_toupper(char_type* __lo, const char_type* __hi) const; +# 1044 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_tolower(char_type __c) const; +# 1061 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_tolower(char_type* __lo, const char_type* __hi) const; +# 1081 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_widen(char __c) const + { return __c; } +# 1104 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char* + do_widen(const char* __lo, const char* __hi, char_type* __to) const + { + __builtin_memcpy(__to, __lo, __hi - __lo); + return __hi; + } +# 1130 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char + do_narrow(char_type __c, char __dfault) const + { return __c; } +# 1156 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_narrow(const char_type* __lo, const char_type* __hi, + char __dfault, char* __to) const + { + __builtin_memcpy(__to, __lo, __hi - __lo); + return __hi; + } + + private: + void _M_narrow_init() const; + void _M_widen_init() const; + }; +# 1181 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + template<> + class ctype : public __ctype_abstract_base + { + public: + + + typedef wchar_t char_type; + typedef wctype_t __wmask_type; + + protected: + __c_locale _M_c_locale_ctype; + + + bool _M_narrow_ok; + char _M_narrow[128]; + wint_t _M_widen[1 + static_cast(-1)]; + + + mask _M_bit[16]; + __wmask_type _M_wmask[16]; + + public: + + + static locale::id id; +# 1214 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + explicit + ctype(size_t __refs = 0); +# 1225 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + explicit + ctype(__c_locale __cloc, size_t __refs = 0); + + protected: + __wmask_type + _M_convert_to_wmask(const mask __m) const throw(); + + + virtual + ~ctype(); +# 1249 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual bool + do_is(mask __m, char_type __c) const; +# 1268 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const; +# 1286 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const; +# 1304 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_scan_not(mask __m, const char_type* __lo, + const char_type* __hi) const; +# 1321 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_toupper(char_type __c) const; +# 1338 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_toupper(char_type* __lo, const char_type* __hi) const; +# 1354 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_tolower(char_type __c) const; +# 1371 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_tolower(char_type* __lo, const char_type* __hi) const; +# 1391 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_widen(char __c) const; +# 1413 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char* + do_widen(const char* __lo, const char* __hi, char_type* __to) const; +# 1436 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char + do_narrow(char_type __c, char __dfault) const; +# 1462 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual const char_type* + do_narrow(const char_type* __lo, const char_type* __hi, + char __dfault, char* __to) const; + + + void + _M_initialize_ctype() throw(); + }; + + + + template + class ctype_byname : public ctype<_CharT> + { + public: + typedef typename ctype<_CharT>::mask mask; + + explicit + ctype_byname(const char* __s, size_t __refs = 0); + + + explicit + ctype_byname(const string& __s, size_t __refs = 0) + : ctype_byname(__s.c_str(), __refs) { } + + + protected: + virtual + ~ctype_byname() { }; + }; + + + template<> + class ctype_byname : public ctype + { + public: + explicit + ctype_byname(const char* __s, size_t __refs = 0); + + + explicit + ctype_byname(const string& __s, size_t __refs = 0); + + + protected: + virtual + ~ctype_byname(); + }; + + + template<> + class ctype_byname : public ctype + { + public: + explicit + ctype_byname(const char* __s, size_t __refs = 0); + + + explicit + ctype_byname(const string& __s, size_t __refs = 0); + + + protected: + virtual + ~ctype_byname(); + }; + + + +} + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/ctype_inline.h" 1 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/ctype_inline.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + bool + ctype:: + is(mask __m, char __c) const + { return _M_table[static_cast(__c)] & __m; } + + const char* + ctype:: + is(const char* __low, const char* __high, mask* __vec) const + { + while (__low < __high) + *__vec++ = _M_table[static_cast(*__low++)]; + return __high; + } + + const char* + ctype:: + scan_is(mask __m, const char* __low, const char* __high) const + { + while (__low < __high + && !(_M_table[static_cast(*__low)] & __m)) + ++__low; + return __low; + } + + const char* + ctype:: + scan_not(mask __m, const char* __low, const char* __high) const + { + while (__low < __high + && (_M_table[static_cast(*__low)] & __m) != 0) + ++__low; + return __low; + } + + +} +# 1535 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + class __num_base + { + public: + + + enum + { + _S_ominus, + _S_oplus, + _S_ox, + _S_oX, + _S_odigits, + _S_odigits_end = _S_odigits + 16, + _S_oudigits = _S_odigits_end, + _S_oudigits_end = _S_oudigits + 16, + _S_oe = _S_odigits + 14, + _S_oE = _S_oudigits + 14, + _S_oend = _S_oudigits_end + }; + + + + + + + static const char* _S_atoms_out; + + + + static const char* _S_atoms_in; + + enum + { + _S_iminus, + _S_iplus, + _S_ix, + _S_iX, + _S_izero, + _S_ie = _S_izero + 14, + _S_iE = _S_izero + 20, + _S_iend = 26 + }; + + + + static void + _S_format_float(const ios_base& __io, char* __fptr, char __mod) throw(); + }; + + template + struct __numpunct_cache : public locale::facet + { + const char* _M_grouping; + size_t _M_grouping_size; + bool _M_use_grouping; + const _CharT* _M_truename; + size_t _M_truename_size; + const _CharT* _M_falsename; + size_t _M_falsename_size; + _CharT _M_decimal_point; + _CharT _M_thousands_sep; + + + + + + _CharT _M_atoms_out[__num_base::_S_oend]; + + + + + + _CharT _M_atoms_in[__num_base::_S_iend]; + + bool _M_allocated; + + __numpunct_cache(size_t __refs = 0) + : facet(__refs), _M_grouping(0), _M_grouping_size(0), + _M_use_grouping(false), + _M_truename(0), _M_truename_size(0), _M_falsename(0), + _M_falsename_size(0), _M_decimal_point(_CharT()), + _M_thousands_sep(_CharT()), _M_allocated(false) + { } + + ~__numpunct_cache(); + + void + _M_cache(const locale& __loc); + + private: + __numpunct_cache& + operator=(const __numpunct_cache&); + + explicit + __numpunct_cache(const __numpunct_cache&); + }; + + template + __numpunct_cache<_CharT>::~__numpunct_cache() + { + if (_M_allocated) + { + delete [] _M_grouping; + delete [] _M_truename; + delete [] _M_falsename; + } + } + +namespace __cxx11 { +# 1665 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + template + class numpunct : public locale::facet + { + public: + + + + typedef _CharT char_type; + typedef basic_string<_CharT> string_type; + + typedef __numpunct_cache<_CharT> __cache_type; + + protected: + __cache_type* _M_data; + + public: + + static locale::id id; + + + + + + + explicit + numpunct(size_t __refs = 0) + : facet(__refs), _M_data(0) + { _M_initialize_numpunct(); } +# 1703 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + explicit + numpunct(__cache_type* __cache, size_t __refs = 0) + : facet(__refs), _M_data(__cache) + { _M_initialize_numpunct(); } +# 1717 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + explicit + numpunct(__c_locale __cloc, size_t __refs = 0) + : facet(__refs), _M_data(0) + { _M_initialize_numpunct(__cloc); } +# 1731 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + char_type + decimal_point() const + { return this->do_decimal_point(); } +# 1744 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + char_type + thousands_sep() const + { return this->do_thousands_sep(); } +# 1775 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + string + grouping() const + { return this->do_grouping(); } +# 1788 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + string_type + truename() const + { return this->do_truename(); } +# 1801 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + string_type + falsename() const + { return this->do_falsename(); } + + protected: + + virtual + ~numpunct(); +# 1818 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_decimal_point() const + { return _M_data->_M_decimal_point; } +# 1830 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual char_type + do_thousands_sep() const + { return _M_data->_M_thousands_sep; } +# 1843 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual string + do_grouping() const + { return _M_data->_M_grouping; } +# 1856 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual string_type + do_truename() const + { return _M_data->_M_truename; } +# 1869 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual string_type + do_falsename() const + { return _M_data->_M_falsename; } + + + void + _M_initialize_numpunct(__c_locale __cloc = 0); + }; + + template + locale::id numpunct<_CharT>::id; + + template<> + numpunct::~numpunct(); + + template<> + void + numpunct::_M_initialize_numpunct(__c_locale __cloc); + + + template<> + numpunct::~numpunct(); + + template<> + void + numpunct::_M_initialize_numpunct(__c_locale __cloc); + + + + template + class numpunct_byname : public numpunct<_CharT> + { + public: + typedef _CharT char_type; + typedef basic_string<_CharT> string_type; + + explicit + numpunct_byname(const char* __s, size_t __refs = 0) + : numpunct<_CharT>(__refs) + { + if (__builtin_strcmp(__s, "C") != 0 + && __builtin_strcmp(__s, "POSIX") != 0) + { + __c_locale __tmp; + this->_S_create_c_locale(__tmp, __s); + this->_M_initialize_numpunct(__tmp); + this->_S_destroy_c_locale(__tmp); + } + } + + + explicit + numpunct_byname(const string& __s, size_t __refs = 0) + : numpunct_byname(__s.c_str(), __refs) { } + + + protected: + virtual + ~numpunct_byname() { } + }; + +} +# 1947 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + template + class num_get : public locale::facet + { + public: + + + + typedef _CharT char_type; + typedef _InIter iter_type; + + + + static locale::id id; +# 1968 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + explicit + num_get(size_t __refs = 0) : facet(__refs) { } +# 1994 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, bool& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } +# 2031 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, long& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } + + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, unsigned short& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } + + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, unsigned int& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } + + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, unsigned long& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } + + + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, long long& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } + + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, unsigned long long& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } +# 2091 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, float& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } + + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, double& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } + + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, long double& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } +# 2134 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + iter_type + get(iter_type __in, iter_type __end, ios_base& __io, + ios_base::iostate& __err, void*& __v) const + { return this->do_get(__in, __end, __io, __err, __v); } + + protected: + + virtual ~num_get() { } + + __attribute ((__abi_tag__ ("cxx11"))) + iter_type + _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&, + string&) const; + + template + __attribute ((__abi_tag__ ("cxx11"))) + iter_type + _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&, + _ValueT&) const; + + template + typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, int>::__type + _M_find(const _CharT2*, size_t __len, _CharT2 __c) const + { + int __ret = -1; + if (__len <= 10) + { + if (__c >= _CharT2('0') && __c < _CharT2(_CharT2('0') + __len)) + __ret = __c - _CharT2('0'); + } + else + { + if (__c >= _CharT2('0') && __c <= _CharT2('9')) + __ret = __c - _CharT2('0'); + else if (__c >= _CharT2('a') && __c <= _CharT2('f')) + __ret = 10 + (__c - _CharT2('a')); + else if (__c >= _CharT2('A') && __c <= _CharT2('F')) + __ret = 10 + (__c - _CharT2('A')); + } + return __ret; + } + + template + typename __gnu_cxx::__enable_if::__value, + int>::__type + _M_find(const _CharT2* __zero, size_t __len, _CharT2 __c) const + { + int __ret = -1; + const char_type* __q = char_traits<_CharT2>::find(__zero, __len, __c); + if (__q) + { + __ret = __q - __zero; + if (__ret > 15) + __ret -= 6; + } + return __ret; + } +# 2207 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const; + + virtual iter_type + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, long& __v) const + { return _M_extract_int(__beg, __end, __io, __err, __v); } + + virtual iter_type + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, unsigned short& __v) const + { return _M_extract_int(__beg, __end, __io, __err, __v); } + + virtual iter_type + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, unsigned int& __v) const + { return _M_extract_int(__beg, __end, __io, __err, __v); } + + virtual iter_type + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, unsigned long& __v) const + { return _M_extract_int(__beg, __end, __io, __err, __v); } + + + virtual iter_type + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, long long& __v) const + { return _M_extract_int(__beg, __end, __io, __err, __v); } + + virtual iter_type + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, unsigned long long& __v) const + { return _M_extract_int(__beg, __end, __io, __err, __v); } + + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, float&) const; + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, + double&) const; + + + + + + + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, + long double&) const; + + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, void*&) const; +# 2270 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + }; + + template + locale::id num_get<_CharT, _InIter>::id; +# 2288 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + template + class num_put : public locale::facet + { + public: + + + + typedef _CharT char_type; + typedef _OutIter iter_type; + + + + static locale::id id; +# 2309 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + explicit + num_put(size_t __refs = 0) : facet(__refs) { } +# 2327 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + iter_type + put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const + { return this->do_put(__s, __io, __fill, __v); } +# 2369 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + iter_type + put(iter_type __s, ios_base& __io, char_type __fill, long __v) const + { return this->do_put(__s, __io, __fill, __v); } + + iter_type + put(iter_type __s, ios_base& __io, char_type __fill, + unsigned long __v) const + { return this->do_put(__s, __io, __fill, __v); } + + + iter_type + put(iter_type __s, ios_base& __io, char_type __fill, long long __v) const + { return this->do_put(__s, __io, __fill, __v); } + + iter_type + put(iter_type __s, ios_base& __io, char_type __fill, + unsigned long long __v) const + { return this->do_put(__s, __io, __fill, __v); } +# 2432 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + iter_type + put(iter_type __s, ios_base& __io, char_type __fill, double __v) const + { return this->do_put(__s, __io, __fill, __v); } + + iter_type + put(iter_type __s, ios_base& __io, char_type __fill, + long double __v) const + { return this->do_put(__s, __io, __fill, __v); } +# 2457 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + iter_type + put(iter_type __s, ios_base& __io, char_type __fill, + const void* __v) const + { return this->do_put(__s, __io, __fill, __v); } + + protected: + template + iter_type + _M_insert_float(iter_type, ios_base& __io, char_type __fill, + char __mod, _ValueT __v) const; + + void + _M_group_float(const char* __grouping, size_t __grouping_size, + char_type __sep, const char_type* __p, char_type* __new, + char_type* __cs, int& __len) const; + + template + iter_type + _M_insert_int(iter_type, ios_base& __io, char_type __fill, + _ValueT __v) const; + + void + _M_group_int(const char* __grouping, size_t __grouping_size, + char_type __sep, ios_base& __io, char_type* __new, + char_type* __cs, int& __len) const; + + void + _M_pad(char_type __fill, streamsize __w, ios_base& __io, + char_type* __new, const char_type* __cs, int& __len) const; + + + virtual + ~num_put() { }; +# 2505 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + virtual iter_type + do_put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const; + + virtual iter_type + do_put(iter_type __s, ios_base& __io, char_type __fill, long __v) const + { return _M_insert_int(__s, __io, __fill, __v); } + + virtual iter_type + do_put(iter_type __s, ios_base& __io, char_type __fill, + unsigned long __v) const + { return _M_insert_int(__s, __io, __fill, __v); } + + + virtual iter_type + do_put(iter_type __s, ios_base& __io, char_type __fill, + long long __v) const + { return _M_insert_int(__s, __io, __fill, __v); } + + virtual iter_type + do_put(iter_type __s, ios_base& __io, char_type __fill, + unsigned long long __v) const + { return _M_insert_int(__s, __io, __fill, __v); } + + + virtual iter_type + do_put(iter_type, ios_base&, char_type, double) const; + + + + + + + virtual iter_type + do_put(iter_type, ios_base&, char_type, long double) const; + + + virtual iter_type + do_put(iter_type, ios_base&, char_type, const void*) const; + + + + + + + + }; + + template + locale::id num_put<_CharT, _OutIter>::id; +# 2563 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3 + template + inline bool + isspace(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::space, __c); } + + + template + inline bool + isprint(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::print, __c); } + + + template + inline bool + iscntrl(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::cntrl, __c); } + + + template + inline bool + isupper(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::upper, __c); } + + + template + inline bool + islower(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::lower, __c); } + + + template + inline bool + isalpha(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::alpha, __c); } + + + template + inline bool + isdigit(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::digit, __c); } + + + template + inline bool + ispunct(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::punct, __c); } + + + template + inline bool + isxdigit(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::xdigit, __c); } + + + template + inline bool + isalnum(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::alnum, __c); } + + + template + inline bool + isgraph(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::graph, __c); } + + + + template + inline bool + isblank(_CharT __c, const locale& __loc) + { return use_facet >(__loc).is(ctype_base::blank, __c); } + + + + template + inline _CharT + toupper(_CharT __c, const locale& __loc) + { return use_facet >(__loc).toupper(__c); } + + + template + inline _CharT + tolower(_CharT __c, const locale& __loc) + { return use_facet >(__loc).tolower(__c); } + + +} + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + template + struct __use_cache + { + const _Facet* + operator() (const locale& __loc) const; + }; + + + template + struct __use_cache<__numpunct_cache<_CharT> > + { + const __numpunct_cache<_CharT>* + operator() (const locale& __loc) const + { + const size_t __i = numpunct<_CharT>::id._M_id(); + const locale::facet** __caches = __loc._M_impl->_M_caches; + if (!__caches[__i]) + { + __numpunct_cache<_CharT>* __tmp = 0; + try + { + __tmp = new __numpunct_cache<_CharT>; + __tmp->_M_cache(__loc); + } + catch(...) + { + delete __tmp; + throw; + } + __loc._M_impl->_M_install_cache(__tmp, __i); + } + return static_cast*>(__caches[__i]); + } + }; + + template + void + __numpunct_cache<_CharT>::_M_cache(const locale& __loc) + { + const numpunct<_CharT>& __np = use_facet >(__loc); + + char* __grouping = 0; + _CharT* __truename = 0; + _CharT* __falsename = 0; + try + { + const string& __g = __np.grouping(); + _M_grouping_size = __g.size(); + __grouping = new char[_M_grouping_size]; + __g.copy(__grouping, _M_grouping_size); + _M_use_grouping = (_M_grouping_size + && static_cast(__grouping[0]) > 0 + && (__grouping[0] + != __gnu_cxx::__numeric_traits::__max)); + + const basic_string<_CharT>& __tn = __np.truename(); + _M_truename_size = __tn.size(); + __truename = new _CharT[_M_truename_size]; + __tn.copy(__truename, _M_truename_size); + + const basic_string<_CharT>& __fn = __np.falsename(); + _M_falsename_size = __fn.size(); + __falsename = new _CharT[_M_falsename_size]; + __fn.copy(__falsename, _M_falsename_size); + + _M_decimal_point = __np.decimal_point(); + _M_thousands_sep = __np.thousands_sep(); + + const ctype<_CharT>& __ct = use_facet >(__loc); + __ct.widen(__num_base::_S_atoms_out, + __num_base::_S_atoms_out + + __num_base::_S_oend, _M_atoms_out); + __ct.widen(__num_base::_S_atoms_in, + __num_base::_S_atoms_in + + __num_base::_S_iend, _M_atoms_in); + + _M_grouping = __grouping; + _M_truename = __truename; + _M_falsename = __falsename; + _M_allocated = true; + } + catch(...) + { + delete [] __grouping; + delete [] __truename; + delete [] __falsename; + throw; + } + } +# 139 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3 + __attribute__ ((__pure__)) bool + __verify_grouping(const char* __grouping, size_t __grouping_size, + const string& __grouping_tmp) throw (); + + + + template + __attribute ((__abi_tag__ ("cxx11"))) + _InIter + num_get<_CharT, _InIter>:: + _M_extract_float(_InIter __beg, _InIter __end, ios_base& __io, + ios_base::iostate& __err, string& __xtrc) const + { + typedef char_traits<_CharT> __traits_type; + typedef __numpunct_cache<_CharT> __cache_type; + __use_cache<__cache_type> __uc; + const locale& __loc = __io._M_getloc(); + const __cache_type* __lc = __uc(__loc); + const _CharT* __lit = __lc->_M_atoms_in; + char_type __c = char_type(); + + + bool __testeof = __beg == __end; + + + if (!__testeof) + { + __c = *__beg; + const bool __plus = __c == __lit[__num_base::_S_iplus]; + if ((__plus || __c == __lit[__num_base::_S_iminus]) + && !(__lc->_M_use_grouping && __c == __lc->_M_thousands_sep) + && !(__c == __lc->_M_decimal_point)) + { + __xtrc += __plus ? '+' : '-'; + if (++__beg != __end) + __c = *__beg; + else + __testeof = true; + } + } + + + bool __found_mantissa = false; + int __sep_pos = 0; + while (!__testeof) + { + if ((__lc->_M_use_grouping && __c == __lc->_M_thousands_sep) + || __c == __lc->_M_decimal_point) + break; + else if (__c == __lit[__num_base::_S_izero]) + { + if (!__found_mantissa) + { + __xtrc += '0'; + __found_mantissa = true; + } + ++__sep_pos; + + if (++__beg != __end) + __c = *__beg; + else + __testeof = true; + } + else + break; + } + + + bool __found_dec = false; + bool __found_sci = false; + string __found_grouping; + if (__lc->_M_use_grouping) + __found_grouping.reserve(32); + const char_type* __lit_zero = __lit + __num_base::_S_izero; + + if (!__lc->_M_allocated) + + while (!__testeof) + { + const int __digit = _M_find(__lit_zero, 10, __c); + if (__digit != -1) + { + __xtrc += '0' + __digit; + __found_mantissa = true; + } + else if (__c == __lc->_M_decimal_point + && !__found_dec && !__found_sci) + { + __xtrc += '.'; + __found_dec = true; + } + else if ((__c == __lit[__num_base::_S_ie] + || __c == __lit[__num_base::_S_iE]) + && !__found_sci && __found_mantissa) + { + + __xtrc += 'e'; + __found_sci = true; + + + if (++__beg != __end) + { + __c = *__beg; + const bool __plus = __c == __lit[__num_base::_S_iplus]; + if (__plus || __c == __lit[__num_base::_S_iminus]) + __xtrc += __plus ? '+' : '-'; + else + continue; + } + else + { + __testeof = true; + break; + } + } + else + break; + + if (++__beg != __end) + __c = *__beg; + else + __testeof = true; + } + else + while (!__testeof) + { + + + if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep) + { + if (!__found_dec && !__found_sci) + { + + + if (__sep_pos) + { + __found_grouping += static_cast(__sep_pos); + __sep_pos = 0; + } + else + { + + + __xtrc.clear(); + break; + } + } + else + break; + } + else if (__c == __lc->_M_decimal_point) + { + if (!__found_dec && !__found_sci) + { + + + + if (__found_grouping.size()) + __found_grouping += static_cast(__sep_pos); + __xtrc += '.'; + __found_dec = true; + } + else + break; + } + else + { + const char_type* __q = + __traits_type::find(__lit_zero, 10, __c); + if (__q) + { + __xtrc += '0' + (__q - __lit_zero); + __found_mantissa = true; + ++__sep_pos; + } + else if ((__c == __lit[__num_base::_S_ie] + || __c == __lit[__num_base::_S_iE]) + && !__found_sci && __found_mantissa) + { + + if (__found_grouping.size() && !__found_dec) + __found_grouping += static_cast(__sep_pos); + __xtrc += 'e'; + __found_sci = true; + + + if (++__beg != __end) + { + __c = *__beg; + const bool __plus = __c == __lit[__num_base::_S_iplus]; + if ((__plus || __c == __lit[__num_base::_S_iminus]) + && !(__lc->_M_use_grouping + && __c == __lc->_M_thousands_sep) + && !(__c == __lc->_M_decimal_point)) + __xtrc += __plus ? '+' : '-'; + else + continue; + } + else + { + __testeof = true; + break; + } + } + else + break; + } + + if (++__beg != __end) + __c = *__beg; + else + __testeof = true; + } + + + + if (__found_grouping.size()) + { + + if (!__found_dec && !__found_sci) + __found_grouping += static_cast(__sep_pos); + + if (!std::__verify_grouping(__lc->_M_grouping, + __lc->_M_grouping_size, + __found_grouping)) + __err = ios_base::failbit; + } + + return __beg; + } + + template + template + __attribute ((__abi_tag__ ("cxx11"))) + _InIter + num_get<_CharT, _InIter>:: + _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io, + ios_base::iostate& __err, _ValueT& __v) const + { + typedef char_traits<_CharT> __traits_type; + using __gnu_cxx::__add_unsigned; + typedef typename __add_unsigned<_ValueT>::__type __unsigned_type; + typedef __numpunct_cache<_CharT> __cache_type; + __use_cache<__cache_type> __uc; + const locale& __loc = __io._M_getloc(); + const __cache_type* __lc = __uc(__loc); + const _CharT* __lit = __lc->_M_atoms_in; + char_type __c = char_type(); + + + const ios_base::fmtflags __basefield = __io.flags() + & ios_base::basefield; + const bool __oct = __basefield == ios_base::oct; + int __base = __oct ? 8 : (__basefield == ios_base::hex ? 16 : 10); + + + bool __testeof = __beg == __end; + + + bool __negative = false; + if (!__testeof) + { + __c = *__beg; + __negative = __c == __lit[__num_base::_S_iminus]; + if ((__negative || __c == __lit[__num_base::_S_iplus]) + && !(__lc->_M_use_grouping && __c == __lc->_M_thousands_sep) + && !(__c == __lc->_M_decimal_point)) + { + if (++__beg != __end) + __c = *__beg; + else + __testeof = true; + } + } + + + + bool __found_zero = false; + int __sep_pos = 0; + while (!__testeof) + { + if ((__lc->_M_use_grouping && __c == __lc->_M_thousands_sep) + || __c == __lc->_M_decimal_point) + break; + else if (__c == __lit[__num_base::_S_izero] + && (!__found_zero || __base == 10)) + { + __found_zero = true; + ++__sep_pos; + if (__basefield == 0) + __base = 8; + if (__base == 8) + __sep_pos = 0; + } + else if (__found_zero + && (__c == __lit[__num_base::_S_ix] + || __c == __lit[__num_base::_S_iX])) + { + if (__basefield == 0) + __base = 16; + if (__base == 16) + { + __found_zero = false; + __sep_pos = 0; + } + else + break; + } + else + break; + + if (++__beg != __end) + { + __c = *__beg; + if (!__found_zero) + break; + } + else + __testeof = true; + } + + + + const size_t __len = (__base == 16 ? __num_base::_S_iend + - __num_base::_S_izero : __base); + + + string __found_grouping; + if (__lc->_M_use_grouping) + __found_grouping.reserve(32); + bool __testfail = false; + bool __testoverflow = false; + const __unsigned_type __max = + (__negative && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed) + ? -__gnu_cxx::__numeric_traits<_ValueT>::__min + : __gnu_cxx::__numeric_traits<_ValueT>::__max; + const __unsigned_type __smax = __max / __base; + __unsigned_type __result = 0; + int __digit = 0; + const char_type* __lit_zero = __lit + __num_base::_S_izero; + + if (!__lc->_M_allocated) + + while (!__testeof) + { + __digit = _M_find(__lit_zero, __len, __c); + if (__digit == -1) + break; + + if (__result > __smax) + __testoverflow = true; + else + { + __result *= __base; + __testoverflow |= __result > __max - __digit; + __result += __digit; + ++__sep_pos; + } + + if (++__beg != __end) + __c = *__beg; + else + __testeof = true; + } + else + while (!__testeof) + { + + + if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep) + { + + + if (__sep_pos) + { + __found_grouping += static_cast(__sep_pos); + __sep_pos = 0; + } + else + { + __testfail = true; + break; + } + } + else if (__c == __lc->_M_decimal_point) + break; + else + { + const char_type* __q = + __traits_type::find(__lit_zero, __len, __c); + if (!__q) + break; + + __digit = __q - __lit_zero; + if (__digit > 15) + __digit -= 6; + if (__result > __smax) + __testoverflow = true; + else + { + __result *= __base; + __testoverflow |= __result > __max - __digit; + __result += __digit; + ++__sep_pos; + } + } + + if (++__beg != __end) + __c = *__beg; + else + __testeof = true; + } + + + + if (__found_grouping.size()) + { + + __found_grouping += static_cast(__sep_pos); + + if (!std::__verify_grouping(__lc->_M_grouping, + __lc->_M_grouping_size, + __found_grouping)) + __err = ios_base::failbit; + } + + + + if ((!__sep_pos && !__found_zero && !__found_grouping.size()) + || __testfail) + { + __v = 0; + __err = ios_base::failbit; + } + else if (__testoverflow) + { + if (__negative + && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed) + __v = __gnu_cxx::__numeric_traits<_ValueT>::__min; + else + __v = __gnu_cxx::__numeric_traits<_ValueT>::__max; + __err = ios_base::failbit; + } + else + __v = __negative ? -__result : __result; + + if (__testeof) + __err |= ios_base::eofbit; + return __beg; + } + + + + template + _InIter + num_get<_CharT, _InIter>:: + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, bool& __v) const + { + if (!(__io.flags() & ios_base::boolalpha)) + { + + + + long __l = -1; + __beg = _M_extract_int(__beg, __end, __io, __err, __l); + if (__l == 0 || __l == 1) + __v = bool(__l); + else + { + + + __v = true; + __err = ios_base::failbit; + if (__beg == __end) + __err |= ios_base::eofbit; + } + } + else + { + + typedef __numpunct_cache<_CharT> __cache_type; + __use_cache<__cache_type> __uc; + const locale& __loc = __io._M_getloc(); + const __cache_type* __lc = __uc(__loc); + + bool __testf = true; + bool __testt = true; + bool __donef = __lc->_M_falsename_size == 0; + bool __donet = __lc->_M_truename_size == 0; + bool __testeof = false; + size_t __n = 0; + while (!__donef || !__donet) + { + if (__beg == __end) + { + __testeof = true; + break; + } + + const char_type __c = *__beg; + + if (!__donef) + __testf = __c == __lc->_M_falsename[__n]; + + if (!__testf && __donet) + break; + + if (!__donet) + __testt = __c == __lc->_M_truename[__n]; + + if (!__testt && __donef) + break; + + if (!__testt && !__testf) + break; + + ++__n; + ++__beg; + + __donef = !__testf || __n >= __lc->_M_falsename_size; + __donet = !__testt || __n >= __lc->_M_truename_size; + } + if (__testf && __n == __lc->_M_falsename_size && __n) + { + __v = false; + if (__testt && __n == __lc->_M_truename_size) + __err = ios_base::failbit; + else + __err = __testeof ? ios_base::eofbit : ios_base::goodbit; + } + else if (__testt && __n == __lc->_M_truename_size && __n) + { + __v = true; + __err = __testeof ? ios_base::eofbit : ios_base::goodbit; + } + else + { + + + __v = false; + __err = ios_base::failbit; + if (__testeof) + __err |= ios_base::eofbit; + } + } + return __beg; + } + + template + _InIter + num_get<_CharT, _InIter>:: + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, float& __v) const + { + string __xtrc; + __xtrc.reserve(32); + __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc); + std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale()); + if (__beg == __end) + __err |= ios_base::eofbit; + return __beg; + } + + template + _InIter + num_get<_CharT, _InIter>:: + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, double& __v) const + { + string __xtrc; + __xtrc.reserve(32); + __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc); + std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale()); + if (__beg == __end) + __err |= ios_base::eofbit; + return __beg; + } +# 735 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3 + template + _InIter + num_get<_CharT, _InIter>:: + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, long double& __v) const + { + string __xtrc; + __xtrc.reserve(32); + __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc); + std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale()); + if (__beg == __end) + __err |= ios_base::eofbit; + return __beg; + } + + template + _InIter + num_get<_CharT, _InIter>:: + do_get(iter_type __beg, iter_type __end, ios_base& __io, + ios_base::iostate& __err, void*& __v) const + { + + typedef ios_base::fmtflags fmtflags; + const fmtflags __fmt = __io.flags(); + __io.flags((__fmt & ~ios_base::basefield) | ios_base::hex); + + typedef __gnu_cxx::__conditional_type<(sizeof(void*) + <= sizeof(unsigned long)), + unsigned long, unsigned long long>::__type _UIntPtrType; + + _UIntPtrType __ul; + __beg = _M_extract_int(__beg, __end, __io, __err, __ul); + + + __io.flags(__fmt); + + __v = reinterpret_cast(__ul); + return __beg; + } + + + + template + void + num_put<_CharT, _OutIter>:: + _M_pad(_CharT __fill, streamsize __w, ios_base& __io, + _CharT* __new, const _CharT* __cs, int& __len) const + { + + + __pad<_CharT, char_traits<_CharT> >::_S_pad(__io, __fill, __new, + __cs, __w, __len); + __len = static_cast(__w); + } + + + + template + int + __int_to_char(_CharT* __bufend, _ValueT __v, const _CharT* __lit, + ios_base::fmtflags __flags, bool __dec) + { + _CharT* __buf = __bufend; + if (__builtin_expect(__dec, true)) + { + + do + { + *--__buf = __lit[(__v % 10) + __num_base::_S_odigits]; + __v /= 10; + } + while (__v != 0); + } + else if ((__flags & ios_base::basefield) == ios_base::oct) + { + + do + { + *--__buf = __lit[(__v & 0x7) + __num_base::_S_odigits]; + __v >>= 3; + } + while (__v != 0); + } + else + { + + const bool __uppercase = __flags & ios_base::uppercase; + const int __case_offset = __uppercase ? __num_base::_S_oudigits + : __num_base::_S_odigits; + do + { + *--__buf = __lit[(__v & 0xf) + __case_offset]; + __v >>= 4; + } + while (__v != 0); + } + return __bufend - __buf; + } + + + + template + void + num_put<_CharT, _OutIter>:: + _M_group_int(const char* __grouping, size_t __grouping_size, _CharT __sep, + ios_base&, _CharT* __new, _CharT* __cs, int& __len) const + { + _CharT* __p = std::__add_grouping(__new, __sep, __grouping, + __grouping_size, __cs, __cs + __len); + __len = __p - __new; + } + + template + template + _OutIter + num_put<_CharT, _OutIter>:: + _M_insert_int(_OutIter __s, ios_base& __io, _CharT __fill, + _ValueT __v) const + { + using __gnu_cxx::__add_unsigned; + typedef typename __add_unsigned<_ValueT>::__type __unsigned_type; + typedef __numpunct_cache<_CharT> __cache_type; + __use_cache<__cache_type> __uc; + const locale& __loc = __io._M_getloc(); + const __cache_type* __lc = __uc(__loc); + const _CharT* __lit = __lc->_M_atoms_out; + const ios_base::fmtflags __flags = __io.flags(); + + + const int __ilen = 5 * sizeof(_ValueT); + _CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) + * __ilen)); + + + + const ios_base::fmtflags __basefield = __flags & ios_base::basefield; + const bool __dec = (__basefield != ios_base::oct + && __basefield != ios_base::hex); + const __unsigned_type __u = ((__v > 0 || !__dec) + ? __unsigned_type(__v) + : -__unsigned_type(__v)); + int __len = __int_to_char(__cs + __ilen, __u, __lit, __flags, __dec); + __cs += __ilen - __len; + + + if (__lc->_M_use_grouping) + { + + + _CharT* __cs2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) + * (__len + 1) + * 2)); + _M_group_int(__lc->_M_grouping, __lc->_M_grouping_size, + __lc->_M_thousands_sep, __io, __cs2 + 2, __cs, __len); + __cs = __cs2 + 2; + } + + + if (__builtin_expect(__dec, true)) + { + + if (__v >= 0) + { + if (bool(__flags & ios_base::showpos) + && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed) + *--__cs = __lit[__num_base::_S_oplus], ++__len; + } + else + *--__cs = __lit[__num_base::_S_ominus], ++__len; + } + else if (bool(__flags & ios_base::showbase) && __v) + { + if (__basefield == ios_base::oct) + *--__cs = __lit[__num_base::_S_odigits], ++__len; + else + { + + const bool __uppercase = __flags & ios_base::uppercase; + *--__cs = __lit[__num_base::_S_ox + __uppercase]; + + *--__cs = __lit[__num_base::_S_odigits]; + __len += 2; + } + } + + + const streamsize __w = __io.width(); + if (__w > static_cast(__len)) + { + _CharT* __cs3 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) + * __w)); + _M_pad(__fill, __w, __io, __cs3, __cs, __len); + __cs = __cs3; + } + __io.width(0); + + + + return std::__write(__s, __cs, __len); + } + + template + void + num_put<_CharT, _OutIter>:: + _M_group_float(const char* __grouping, size_t __grouping_size, + _CharT __sep, const _CharT* __p, _CharT* __new, + _CharT* __cs, int& __len) const + { + + + + const int __declen = __p ? __p - __cs : __len; + _CharT* __p2 = std::__add_grouping(__new, __sep, __grouping, + __grouping_size, + __cs, __cs + __declen); + + + int __newlen = __p2 - __new; + if (__p) + { + char_traits<_CharT>::copy(__p2, __p, __len - __declen); + __newlen += __len - __declen; + } + __len = __newlen; + } +# 971 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3 + template + template + _OutIter + num_put<_CharT, _OutIter>:: + _M_insert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod, + _ValueT __v) const + { + typedef __numpunct_cache<_CharT> __cache_type; + __use_cache<__cache_type> __uc; + const locale& __loc = __io._M_getloc(); + const __cache_type* __lc = __uc(__loc); + + + const streamsize __prec = __io.precision() < 0 ? 6 : __io.precision(); + + const int __max_digits = + __gnu_cxx::__numeric_traits<_ValueT>::__digits10; + + + int __len; + + char __fbuf[16]; + __num_base::_S_format_float(__io, __fbuf, __mod); + + + + const bool __use_prec = + (__io.flags() & ios_base::floatfield) != ios_base::floatfield; + + + + int __cs_size = __max_digits * 3; + char* __cs = static_cast(__builtin_alloca(__cs_size)); + if (__use_prec) + __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, + __fbuf, __prec, __v); + else + __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, + __fbuf, __v); + + + if (__len >= __cs_size) + { + __cs_size = __len + 1; + __cs = static_cast(__builtin_alloca(__cs_size)); + if (__use_prec) + __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, + __fbuf, __prec, __v); + else + __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, + __fbuf, __v); + } +# 1044 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3 + const ctype<_CharT>& __ctype = use_facet >(__loc); + + _CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) + * __len)); + __ctype.widen(__cs, __cs + __len, __ws); + + + _CharT* __wp = 0; + const char* __p = char_traits::find(__cs, __len, '.'); + if (__p) + { + __wp = __ws + (__p - __cs); + *__wp = __lc->_M_decimal_point; + } + + + + + if (__lc->_M_use_grouping + && (__wp || __len < 3 || (__cs[1] <= '9' && __cs[2] <= '9' + && __cs[1] >= '0' && __cs[2] >= '0'))) + { + + + _CharT* __ws2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) + * __len * 2)); + + streamsize __off = 0; + if (__cs[0] == '-' || __cs[0] == '+') + { + __off = 1; + __ws2[0] = __ws[0]; + __len -= 1; + } + + _M_group_float(__lc->_M_grouping, __lc->_M_grouping_size, + __lc->_M_thousands_sep, __wp, __ws2 + __off, + __ws + __off, __len); + __len += __off; + + __ws = __ws2; + } + + + const streamsize __w = __io.width(); + if (__w > static_cast(__len)) + { + _CharT* __ws3 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) + * __w)); + _M_pad(__fill, __w, __io, __ws3, __ws, __len); + __ws = __ws3; + } + __io.width(0); + + + + return std::__write(__s, __ws, __len); + } + + template + _OutIter + num_put<_CharT, _OutIter>:: + do_put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const + { + const ios_base::fmtflags __flags = __io.flags(); + if ((__flags & ios_base::boolalpha) == 0) + { + const long __l = __v; + __s = _M_insert_int(__s, __io, __fill, __l); + } + else + { + typedef __numpunct_cache<_CharT> __cache_type; + __use_cache<__cache_type> __uc; + const locale& __loc = __io._M_getloc(); + const __cache_type* __lc = __uc(__loc); + + const _CharT* __name = __v ? __lc->_M_truename + : __lc->_M_falsename; + int __len = __v ? __lc->_M_truename_size + : __lc->_M_falsename_size; + + const streamsize __w = __io.width(); + if (__w > static_cast(__len)) + { + const streamsize __plen = __w - __len; + _CharT* __ps + = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) + * __plen)); + + char_traits<_CharT>::assign(__ps, __plen, __fill); + __io.width(0); + + if ((__flags & ios_base::adjustfield) == ios_base::left) + { + __s = std::__write(__s, __name, __len); + __s = std::__write(__s, __ps, __plen); + } + else + { + __s = std::__write(__s, __ps, __plen); + __s = std::__write(__s, __name, __len); + } + return __s; + } + __io.width(0); + __s = std::__write(__s, __name, __len); + } + return __s; + } + + template + _OutIter + num_put<_CharT, _OutIter>:: + do_put(iter_type __s, ios_base& __io, char_type __fill, double __v) const + { return _M_insert_float(__s, __io, __fill, char(), __v); } +# 1169 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3 + template + _OutIter + num_put<_CharT, _OutIter>:: + do_put(iter_type __s, ios_base& __io, char_type __fill, + long double __v) const + { return _M_insert_float(__s, __io, __fill, 'L', __v); } + + template + _OutIter + num_put<_CharT, _OutIter>:: + do_put(iter_type __s, ios_base& __io, char_type __fill, + const void* __v) const + { + const ios_base::fmtflags __flags = __io.flags(); + const ios_base::fmtflags __fmt = ~(ios_base::basefield + | ios_base::uppercase); + __io.flags((__flags & __fmt) | (ios_base::hex | ios_base::showbase)); + + typedef __gnu_cxx::__conditional_type<(sizeof(const void*) + <= sizeof(unsigned long)), + unsigned long, unsigned long long>::__type _UIntPtrType; + + __s = _M_insert_int(__s, __io, __fill, + reinterpret_cast<_UIntPtrType>(__v)); + __io.flags(__flags); + return __s; + } +# 1206 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3 + template + void + __pad<_CharT, _Traits>::_S_pad(ios_base& __io, _CharT __fill, + _CharT* __news, const _CharT* __olds, + streamsize __newlen, streamsize __oldlen) + { + const size_t __plen = static_cast(__newlen - __oldlen); + const ios_base::fmtflags __adjust = __io.flags() & ios_base::adjustfield; + + + if (__adjust == ios_base::left) + { + _Traits::copy(__news, __olds, __oldlen); + _Traits::assign(__news + __oldlen, __plen, __fill); + return; + } + + size_t __mod = 0; + if (__adjust == ios_base::internal) + { + + + + const locale& __loc = __io._M_getloc(); + const ctype<_CharT>& __ctype = use_facet >(__loc); + + if (__ctype.widen('-') == __olds[0] + || __ctype.widen('+') == __olds[0]) + { + __news[0] = __olds[0]; + __mod = 1; + ++__news; + } + else if (__ctype.widen('0') == __olds[0] + && __oldlen > 1 + && (__ctype.widen('x') == __olds[1] + || __ctype.widen('X') == __olds[1])) + { + __news[0] = __olds[0]; + __news[1] = __olds[1]; + __mod = 2; + __news += 2; + } + + } + _Traits::assign(__news, __plen, __fill); + _Traits::copy(__news + __plen, __olds + __mod, __oldlen - __mod); + } + + template + _CharT* + __add_grouping(_CharT* __s, _CharT __sep, + const char* __gbeg, size_t __gsize, + const _CharT* __first, const _CharT* __last) + { + size_t __idx = 0; + size_t __ctr = 0; + + while (__last - __first > __gbeg[__idx] + && static_cast(__gbeg[__idx]) > 0 + && __gbeg[__idx] != __gnu_cxx::__numeric_traits::__max) + { + __last -= __gbeg[__idx]; + __idx < __gsize - 1 ? ++__idx : ++__ctr; + } + + while (__first != __last) + *__s++ = *__first++; + + while (__ctr--) + { + *__s++ = __sep; + for (char __i = __gbeg[__idx]; __i > 0; --__i) + *__s++ = *__first++; + } + + while (__idx--) + { + *__s++ = __sep; + for (char __i = __gbeg[__idx]; __i > 0; --__i) + *__s++ = *__first++; + } + + return __s; + } + + + + + extern template class __cxx11:: numpunct; + extern template class __cxx11:: numpunct_byname; + extern template class num_get; + extern template class num_put; + extern template class ctype_byname; + + extern template + const ctype& + use_facet >(const locale&); + + extern template + const numpunct& + use_facet >(const locale&); + + extern template + const num_put& + use_facet >(const locale&); + + extern template + const num_get& + use_facet >(const locale&); + + extern template + bool + has_facet >(const locale&); + + extern template + bool + has_facet >(const locale&); + + extern template + bool + has_facet >(const locale&); + + extern template + bool + has_facet >(const locale&); + + + extern template class __cxx11:: numpunct; + extern template class __cxx11:: numpunct_byname; + extern template class num_get; + extern template class num_put; + extern template class ctype_byname; + + extern template + const ctype& + use_facet >(const locale&); + + extern template + const numpunct& + use_facet >(const locale&); + + extern template + const num_put& + use_facet >(const locale&); + + extern template + const num_get& + use_facet >(const locale&); + + extern template + bool + has_facet >(const locale&); + + extern template + bool + has_facet >(const locale&); + + extern template + bool + has_facet >(const locale&); + + extern template + bool + has_facet >(const locale&); + + + + +} +# 2652 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 2 3 + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + inline const _Facet& + __check_facet(const _Facet* __f) + { + if (!__f) + __throw_bad_cast(); + return *__f; + } +# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + template + class basic_ios : public ios_base + { + public: + + + + + + + typedef _CharT char_type; + typedef typename _Traits::int_type int_type; + typedef typename _Traits::pos_type pos_type; + typedef typename _Traits::off_type off_type; + typedef _Traits traits_type; + + + + + + + typedef ctype<_CharT> __ctype_type; + typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> > + __num_put_type; + typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> > + __num_get_type; + + + + protected: + basic_ostream<_CharT, _Traits>* _M_tie; + mutable char_type _M_fill; + mutable bool _M_fill_init; + basic_streambuf<_CharT, _Traits>* _M_streambuf; + + + const __ctype_type* _M_ctype; + + const __num_put_type* _M_num_put; + + const __num_get_type* _M_num_get; + + public: +# 117 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + explicit operator bool() const + { return !this->fail(); } + + + + + + bool + operator!() const + { return this->fail(); } +# 136 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + iostate + rdstate() const + { return _M_streambuf_state; } +# 147 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + void + clear(iostate __state = goodbit); + + + + + + + + void + setstate(iostate __state) + { this->clear(this->rdstate() | __state); } + + + + + void + _M_setstate(iostate __state) + { + + + _M_streambuf_state |= __state; + if (this->exceptions() & __state) + throw; + } + + + + + + + + bool + good() const + { return this->rdstate() == 0; } + + + + + + + + bool + eof() const + { return (this->rdstate() & eofbit) != 0; } +# 200 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + bool + fail() const + { return (this->rdstate() & (badbit | failbit)) != 0; } + + + + + + + + bool + bad() const + { return (this->rdstate() & badbit) != 0; } +# 221 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + iostate + exceptions() const + { return _M_exception; } +# 256 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + void + exceptions(iostate __except) + { + _M_exception = __except; + this->clear(_M_streambuf_state); + } + + + + + + + + explicit + basic_ios(basic_streambuf<_CharT, _Traits>* __sb) + : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0), + _M_ctype(0), _M_num_put(0), _M_num_get(0) + { this->init(__sb); } + + + + + + + + virtual + ~basic_ios() { } +# 294 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + basic_ostream<_CharT, _Traits>* + tie() const + { return _M_tie; } +# 306 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + basic_ostream<_CharT, _Traits>* + tie(basic_ostream<_CharT, _Traits>* __tiestr) + { + basic_ostream<_CharT, _Traits>* __old = _M_tie; + _M_tie = __tiestr; + return __old; + } + + + + + + + + basic_streambuf<_CharT, _Traits>* + rdbuf() const + { return _M_streambuf; } +# 346 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + basic_streambuf<_CharT, _Traits>* + rdbuf(basic_streambuf<_CharT, _Traits>* __sb); +# 360 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + basic_ios& + copyfmt(const basic_ios& __rhs); + + + + + + + + char_type + fill() const + { + if (!_M_fill_init) + { + _M_fill = this->widen(' '); + _M_fill_init = true; + } + return _M_fill; + } +# 389 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + char_type + fill(char_type __ch) + { + char_type __old = this->fill(); + _M_fill = __ch; + return __old; + } +# 409 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + locale + imbue(const locale& __loc); +# 429 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + char + narrow(char_type __c, char __dfault) const + { return __check_facet(_M_ctype).narrow(__c, __dfault); } +# 448 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3 + char_type + widen(char __c) const + { return __check_facet(_M_ctype).widen(__c); } + + protected: + + + + + + + + basic_ios() + : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false), + _M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0) + { } + + + + + + + + void + init(basic_streambuf<_CharT, _Traits>* __sb); + + + basic_ios(const basic_ios&) = delete; + basic_ios& operator=(const basic_ios&) = delete; + + void + move(basic_ios& __rhs) + { + ios_base::_M_move(__rhs); + _M_cache_locale(_M_ios_locale); + this->tie(__rhs.tie(nullptr)); + _M_fill = __rhs._M_fill; + _M_fill_init = __rhs._M_fill_init; + _M_streambuf = nullptr; + } + + void + move(basic_ios&& __rhs) + { this->move(__rhs); } + + void + swap(basic_ios& __rhs) noexcept + { + ios_base::_M_swap(__rhs); + _M_cache_locale(_M_ios_locale); + __rhs._M_cache_locale(__rhs._M_ios_locale); + std::swap(_M_tie, __rhs._M_tie); + std::swap(_M_fill, __rhs._M_fill); + std::swap(_M_fill_init, __rhs._M_fill_init); + } + + void + set_rdbuf(basic_streambuf<_CharT, _Traits>* __sb) + { _M_streambuf = __sb; } + + + void + _M_cache_locale(const locale& __loc); + }; + + +} + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.tcc" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.tcc" 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + void + basic_ios<_CharT, _Traits>::clear(iostate __state) + { + if (this->rdbuf()) + _M_streambuf_state = __state; + else + _M_streambuf_state = __state | badbit; + if (this->exceptions() & this->rdstate()) + __throw_ios_failure(("basic_ios::clear")); + } + + template + basic_streambuf<_CharT, _Traits>* + basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<_CharT, _Traits>* __sb) + { + basic_streambuf<_CharT, _Traits>* __old = _M_streambuf; + _M_streambuf = __sb; + this->clear(); + return __old; + } + + template + basic_ios<_CharT, _Traits>& + basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs) + { + + + if (this != &__rhs) + { + + + + + _Words* __words = (__rhs._M_word_size <= _S_local_word_size) ? + _M_local_word : new _Words[__rhs._M_word_size]; + + + _Callback_list* __cb = __rhs._M_callbacks; + if (__cb) + __cb->_M_add_reference(); + _M_call_callbacks(erase_event); + if (_M_word != _M_local_word) + { + delete [] _M_word; + _M_word = 0; + } + _M_dispose_callbacks(); + + + _M_callbacks = __cb; + for (int __i = 0; __i < __rhs._M_word_size; ++__i) + __words[__i] = __rhs._M_word[__i]; + _M_word = __words; + _M_word_size = __rhs._M_word_size; + + this->flags(__rhs.flags()); + this->width(__rhs.width()); + this->precision(__rhs.precision()); + this->tie(__rhs.tie()); + this->fill(__rhs.fill()); + _M_ios_locale = __rhs.getloc(); + _M_cache_locale(_M_ios_locale); + + _M_call_callbacks(copyfmt_event); + + + this->exceptions(__rhs.exceptions()); + } + return *this; + } + + + template + locale + basic_ios<_CharT, _Traits>::imbue(const locale& __loc) + { + locale __old(this->getloc()); + ios_base::imbue(__loc); + _M_cache_locale(__loc); + if (this->rdbuf() != 0) + this->rdbuf()->pubimbue(__loc); + return __old; + } + + template + void + basic_ios<_CharT, _Traits>::init(basic_streambuf<_CharT, _Traits>* __sb) + { + + ios_base::_M_init(); + + + _M_cache_locale(_M_ios_locale); +# 146 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.tcc" 3 + _M_fill = _CharT(); + _M_fill_init = false; + + _M_tie = 0; + _M_exception = goodbit; + _M_streambuf = __sb; + _M_streambuf_state = __sb ? goodbit : badbit; + } + + template + void + basic_ios<_CharT, _Traits>::_M_cache_locale(const locale& __loc) + { + if (__builtin_expect(has_facet<__ctype_type>(__loc), true)) + _M_ctype = &use_facet<__ctype_type>(__loc); + else + _M_ctype = 0; + + if (__builtin_expect(has_facet<__num_put_type>(__loc), true)) + _M_num_put = &use_facet<__num_put_type>(__loc); + else + _M_num_put = 0; + + if (__builtin_expect(has_facet<__num_get_type>(__loc), true)) + _M_num_get = &use_facet<__num_get_type>(__loc); + else + _M_num_get = 0; + } + + + + + extern template class basic_ios; + + + extern template class basic_ios; + + + + +} +# 517 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 2 3 +# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3 +# 39 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 2 3 + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 57 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + template + class basic_ostream : virtual public basic_ios<_CharT, _Traits> + { + public: + + typedef _CharT char_type; + typedef typename _Traits::int_type int_type; + typedef typename _Traits::pos_type pos_type; + typedef typename _Traits::off_type off_type; + typedef _Traits traits_type; + + + typedef basic_streambuf<_CharT, _Traits> __streambuf_type; + typedef basic_ios<_CharT, _Traits> __ios_type; + typedef basic_ostream<_CharT, _Traits> __ostream_type; + typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> > + __num_put_type; + typedef ctype<_CharT> __ctype_type; +# 83 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + explicit + basic_ostream(__streambuf_type* __sb) + { this->init(__sb); } + + + + + + + virtual + ~basic_ostream() { } + + + class sentry; + friend class sentry; +# 107 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + __ostream_type& + operator<<(__ostream_type& (*__pf)(__ostream_type&)) + { + + + + return __pf(*this); + } + + __ostream_type& + operator<<(__ios_type& (*__pf)(__ios_type&)) + { + + + + __pf(*this); + return *this; + } + + __ostream_type& + operator<<(ios_base& (*__pf) (ios_base&)) + { + + + + __pf(*this); + return *this; + } +# 165 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + __ostream_type& + operator<<(long __n) + { return _M_insert(__n); } + + __ostream_type& + operator<<(unsigned long __n) + { return _M_insert(__n); } + + __ostream_type& + operator<<(bool __n) + { return _M_insert(__n); } + + __ostream_type& + operator<<(short __n); + + __ostream_type& + operator<<(unsigned short __n) + { + + + return _M_insert(static_cast(__n)); + } + + __ostream_type& + operator<<(int __n); + + __ostream_type& + operator<<(unsigned int __n) + { + + + return _M_insert(static_cast(__n)); + } + + + __ostream_type& + operator<<(long long __n) + { return _M_insert(__n); } + + __ostream_type& + operator<<(unsigned long long __n) + { return _M_insert(__n); } +# 219 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + __ostream_type& + operator<<(double __f) + { return _M_insert(__f); } + + __ostream_type& + operator<<(float __f) + { + + + return _M_insert(static_cast(__f)); + } + + __ostream_type& + operator<<(long double __f) + { return _M_insert(__f); } +# 244 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + __ostream_type& + operator<<(const void* __p) + { return _M_insert(__p); } +# 269 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + __ostream_type& + operator<<(__streambuf_type* __sb); +# 302 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + __ostream_type& + put(char_type __c); + + + + + + + void + _M_write(const char_type* __s, streamsize __n) + { + const streamsize __put = this->rdbuf()->sputn(__s, __n); + if (__put != __n) + this->setstate(ios_base::badbit); + } +# 334 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + __ostream_type& + write(const char_type* __s, streamsize __n); +# 347 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + __ostream_type& + flush(); +# 357 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + pos_type + tellp(); +# 368 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + __ostream_type& + seekp(pos_type); +# 380 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + __ostream_type& + seekp(off_type, ios_base::seekdir); + + protected: + basic_ostream() + { this->init(0); } + + + + basic_ostream(basic_iostream<_CharT, _Traits>&) { } + + basic_ostream(const basic_ostream&) = delete; + + basic_ostream(basic_ostream&& __rhs) + : __ios_type() + { __ios_type::move(__rhs); } + + + + basic_ostream& operator=(const basic_ostream&) = delete; + + basic_ostream& + operator=(basic_ostream&& __rhs) + { + swap(__rhs); + return *this; + } + + void + swap(basic_ostream& __rhs) + { __ios_type::swap(__rhs); } + + + template + __ostream_type& + _M_insert(_ValueT __v); + }; +# 425 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + template + class basic_ostream<_CharT, _Traits>::sentry + { + + bool _M_ok; + basic_ostream<_CharT, _Traits>& _M_os; + + public: +# 444 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + explicit + sentry(basic_ostream<_CharT, _Traits>& __os); +# 454 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + ~sentry() + { + + if (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception()) + { + + if (_M_os.rdbuf() && _M_os.rdbuf()->pubsync() == -1) + _M_os.setstate(ios_base::badbit); + } + } +# 473 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + explicit + + operator bool() const + { return _M_ok; } + }; +# 495 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + template + inline basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c) + { return __ostream_insert(__out, &__c, 1); } + + template + inline basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __out, char __c) + { return (__out << __out.widen(__c)); } + + + template + inline basic_ostream& + operator<<(basic_ostream& __out, char __c) + { return __ostream_insert(__out, &__c, 1); } + + + template + inline basic_ostream& + operator<<(basic_ostream& __out, signed char __c) + { return (__out << static_cast(__c)); } + + template + inline basic_ostream& + operator<<(basic_ostream& __out, unsigned char __c) + { return (__out << static_cast(__c)); } +# 537 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + template + inline basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s) + { + if (!__s) + __out.setstate(ios_base::badbit); + else + __ostream_insert(__out, __s, + static_cast(_Traits::length(__s))); + return __out; + } + + template + basic_ostream<_CharT, _Traits> & + operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s); + + + template + inline basic_ostream& + operator<<(basic_ostream& __out, const char* __s) + { + if (!__s) + __out.setstate(ios_base::badbit); + else + __ostream_insert(__out, __s, + static_cast(_Traits::length(__s))); + return __out; + } + + + template + inline basic_ostream& + operator<<(basic_ostream& __out, const signed char* __s) + { return (__out << reinterpret_cast(__s)); } + + template + inline basic_ostream & + operator<<(basic_ostream& __out, const unsigned char* __s) + { return (__out << reinterpret_cast(__s)); } +# 588 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + template + inline basic_ostream<_CharT, _Traits>& + endl(basic_ostream<_CharT, _Traits>& __os) + { return flush(__os.put(__os.widen('\n'))); } +# 600 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + template + inline basic_ostream<_CharT, _Traits>& + ends(basic_ostream<_CharT, _Traits>& __os) + { return __os.put(_CharT()); } + + + + + + + template + inline basic_ostream<_CharT, _Traits>& + flush(basic_ostream<_CharT, _Traits>& __os) + { return __os.flush(); } +# 626 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3 + template + inline basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) + { + __os << __x; + return __os; + } + + + +} + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ostream.tcc" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ostream.tcc" 3 + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + basic_ostream<_CharT, _Traits>::sentry:: + sentry(basic_ostream<_CharT, _Traits>& __os) + : _M_ok(false), _M_os(__os) + { + + if (__os.tie() && __os.good()) + __os.tie()->flush(); + + if (__os.good()) + _M_ok = true; + else + __os.setstate(ios_base::failbit); + } + + template + template + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + _M_insert(_ValueT __v) + { + sentry __cerb(*this); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + const __num_put_type& __np = __check_facet(this->_M_num_put); + if (__np.put(*this, *this, this->fill(), __v).failed()) + __err |= ios_base::badbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + operator<<(short __n) + { + + + const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield; + if (__fmt == ios_base::oct || __fmt == ios_base::hex) + return _M_insert(static_cast(static_cast(__n))); + else + return _M_insert(static_cast(__n)); + } + + template + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + operator<<(int __n) + { + + + const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield; + if (__fmt == ios_base::oct || __fmt == ios_base::hex) + return _M_insert(static_cast(static_cast(__n))); + else + return _M_insert(static_cast(__n)); + } + + template + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + operator<<(__streambuf_type* __sbin) + { + ios_base::iostate __err = ios_base::goodbit; + sentry __cerb(*this); + if (__cerb && __sbin) + { + try + { + if (!__copy_streambufs(__sbin, this->rdbuf())) + __err |= ios_base::failbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::failbit); } + } + else if (!__sbin) + __err |= ios_base::badbit; + if (__err) + this->setstate(__err); + return *this; + } + + template + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + put(char_type __c) + { + + + + + + + sentry __cerb(*this); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + const int_type __put = this->rdbuf()->sputc(__c); + if (traits_type::eq_int_type(__put, traits_type::eof())) + __err |= ios_base::badbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + write(const _CharT* __s, streamsize __n) + { + + + + + + + + sentry __cerb(*this); + if (__cerb) + { + try + { _M_write(__s, __n); } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + } + return *this; + } + + template + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + flush() + { + + + + ios_base::iostate __err = ios_base::goodbit; + try + { + if (this->rdbuf() && this->rdbuf()->pubsync() == -1) + __err |= ios_base::badbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + return *this; + } + + template + typename basic_ostream<_CharT, _Traits>::pos_type + basic_ostream<_CharT, _Traits>:: + tellp() + { + pos_type __ret = pos_type(-1); + try + { + if (!this->fail()) + __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out); + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + return __ret; + } + + template + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + seekp(pos_type __pos) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + if (!this->fail()) + { + + + const pos_type __p = this->rdbuf()->pubseekpos(__pos, + ios_base::out); + + + if (__p == pos_type(off_type(-1))) + __err |= ios_base::failbit; + } + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + return *this; + } + + template + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + seekp(off_type __off, ios_base::seekdir __dir) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + if (!this->fail()) + { + + + const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir, + ios_base::out); + + + if (__p == pos_type(off_type(-1))) + __err |= ios_base::failbit; + } + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + return *this; + } + + template + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s) + { + if (!__s) + __out.setstate(ios_base::badbit); + else + { + + + const size_t __clen = char_traits::length(__s); + try + { + struct __ptr_guard + { + _CharT *__p; + __ptr_guard (_CharT *__ip): __p(__ip) { } + ~__ptr_guard() { delete[] __p; } + _CharT* __get() { return __p; } + } __pg (new _CharT[__clen]); + + _CharT *__ws = __pg.__get(); + for (size_t __i = 0; __i < __clen; ++__i) + __ws[__i] = __out.widen(__s[__i]); + __ostream_insert(__out, __ws, __clen); + } + catch(__cxxabiv1::__forced_unwind&) + { + __out._M_setstate(ios_base::badbit); + throw; + } + catch(...) + { __out._M_setstate(ios_base::badbit); } + } + return __out; + } + + + + + extern template class basic_ostream; + extern template ostream& endl(ostream&); + extern template ostream& ends(ostream&); + extern template ostream& flush(ostream&); + extern template ostream& operator<<(ostream&, char); + extern template ostream& operator<<(ostream&, unsigned char); + extern template ostream& operator<<(ostream&, signed char); + extern template ostream& operator<<(ostream&, const char*); + extern template ostream& operator<<(ostream&, const unsigned char*); + extern template ostream& operator<<(ostream&, const signed char*); + + extern template ostream& ostream::_M_insert(long); + extern template ostream& ostream::_M_insert(unsigned long); + extern template ostream& ostream::_M_insert(bool); + + extern template ostream& ostream::_M_insert(long long); + extern template ostream& ostream::_M_insert(unsigned long long); + + extern template ostream& ostream::_M_insert(double); + extern template ostream& ostream::_M_insert(long double); + extern template ostream& ostream::_M_insert(const void*); + + + extern template class basic_ostream; + extern template wostream& endl(wostream&); + extern template wostream& ends(wostream&); + extern template wostream& flush(wostream&); + extern template wostream& operator<<(wostream&, wchar_t); + extern template wostream& operator<<(wostream&, char); + extern template wostream& operator<<(wostream&, const wchar_t*); + extern template wostream& operator<<(wostream&, const char*); + + extern template wostream& wostream::_M_insert(long); + extern template wostream& wostream::_M_insert(unsigned long); + extern template wostream& wostream::_M_insert(bool); + + extern template wostream& wostream::_M_insert(long long); + extern template wostream& wostream::_M_insert(unsigned long long); + + extern template wostream& wostream::_M_insert(double); + extern template wostream& wostream::_M_insert(long double); + extern template wostream& wostream::_M_insert(const void*); + + + + +} +# 639 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 2 3 +# 65 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 1 3 +# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 57 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + template + class basic_istream : virtual public basic_ios<_CharT, _Traits> + { + public: + + typedef _CharT char_type; + typedef typename _Traits::int_type int_type; + typedef typename _Traits::pos_type pos_type; + typedef typename _Traits::off_type off_type; + typedef _Traits traits_type; + + + typedef basic_streambuf<_CharT, _Traits> __streambuf_type; + typedef basic_ios<_CharT, _Traits> __ios_type; + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> > + __num_get_type; + typedef ctype<_CharT> __ctype_type; + + protected: + + + + + + streamsize _M_gcount; + + public: + + + + + + + + explicit + basic_istream(__streambuf_type* __sb) + : _M_gcount(streamsize(0)) + { this->init(__sb); } + + + + + + + virtual + ~basic_istream() + { _M_gcount = streamsize(0); } + + + class sentry; + friend class sentry; +# 119 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + operator>>(__istream_type& (*__pf)(__istream_type&)) + { return __pf(*this); } + + __istream_type& + operator>>(__ios_type& (*__pf)(__ios_type&)) + { + __pf(*this); + return *this; + } + + __istream_type& + operator>>(ios_base& (*__pf)(ios_base&)) + { + __pf(*this); + return *this; + } +# 167 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + operator>>(bool& __n) + { return _M_extract(__n); } + + __istream_type& + operator>>(short& __n); + + __istream_type& + operator>>(unsigned short& __n) + { return _M_extract(__n); } + + __istream_type& + operator>>(int& __n); + + __istream_type& + operator>>(unsigned int& __n) + { return _M_extract(__n); } + + __istream_type& + operator>>(long& __n) + { return _M_extract(__n); } + + __istream_type& + operator>>(unsigned long& __n) + { return _M_extract(__n); } + + + __istream_type& + operator>>(long long& __n) + { return _M_extract(__n); } + + __istream_type& + operator>>(unsigned long long& __n) + { return _M_extract(__n); } +# 213 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + operator>>(float& __f) + { return _M_extract(__f); } + + __istream_type& + operator>>(double& __f) + { return _M_extract(__f); } + + __istream_type& + operator>>(long double& __f) + { return _M_extract(__f); } +# 234 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + operator>>(void*& __p) + { return _M_extract(__p); } +# 258 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + operator>>(__streambuf_type* __sb); +# 268 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + streamsize + gcount() const + { return _M_gcount; } +# 301 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + int_type + get(); +# 315 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + get(char_type& __c); +# 342 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + get(char_type* __s, streamsize __n, char_type __delim); +# 353 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + get(char_type* __s, streamsize __n) + { return this->get(__s, __n, this->widen('\n')); } +# 376 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + get(__streambuf_type& __sb, char_type __delim); +# 386 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + get(__streambuf_type& __sb) + { return this->get(__sb, this->widen('\n')); } +# 415 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + getline(char_type* __s, streamsize __n, char_type __delim); +# 426 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + getline(char_type* __s, streamsize __n) + { return this->getline(__s, __n, this->widen('\n')); } +# 450 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + ignore(streamsize __n, int_type __delim); + + __istream_type& + ignore(streamsize __n); + + __istream_type& + ignore(); +# 467 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + int_type + peek(); +# 485 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + read(char_type* __s, streamsize __n); +# 504 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + streamsize + readsome(char_type* __s, streamsize __n); +# 521 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + putback(char_type __c); +# 537 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + unget(); +# 555 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + int + sync(); +# 570 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + pos_type + tellg(); +# 585 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + seekg(pos_type); +# 601 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + __istream_type& + seekg(off_type, ios_base::seekdir); + + + protected: + basic_istream() + : _M_gcount(streamsize(0)) + { this->init(0); } + + + basic_istream(const basic_istream&) = delete; + + basic_istream(basic_istream&& __rhs) + : __ios_type(), _M_gcount(__rhs._M_gcount) + { + __ios_type::move(__rhs); + __rhs._M_gcount = 0; + } + + + + basic_istream& operator=(const basic_istream&) = delete; + + basic_istream& + operator=(basic_istream&& __rhs) + { + swap(__rhs); + return *this; + } + + void + swap(basic_istream& __rhs) + { + __ios_type::swap(__rhs); + std::swap(_M_gcount, __rhs._M_gcount); + } + + + template + __istream_type& + _M_extract(_ValueT& __v); + }; + + + template<> + basic_istream& + basic_istream:: + getline(char_type* __s, streamsize __n, char_type __delim); + + template<> + basic_istream& + basic_istream:: + ignore(streamsize __n); + + template<> + basic_istream& + basic_istream:: + ignore(streamsize __n, int_type __delim); + + + template<> + basic_istream& + basic_istream:: + getline(char_type* __s, streamsize __n, char_type __delim); + + template<> + basic_istream& + basic_istream:: + ignore(streamsize __n); + + template<> + basic_istream& + basic_istream:: + ignore(streamsize __n, int_type __delim); +# 685 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + template + class basic_istream<_CharT, _Traits>::sentry + { + + bool _M_ok; + + public: + + typedef _Traits traits_type; + typedef basic_streambuf<_CharT, _Traits> __streambuf_type; + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef typename __istream_type::__ctype_type __ctype_type; + typedef typename _Traits::int_type __int_type; +# 721 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + explicit + sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false); +# 732 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + explicit + + operator bool() const + { return _M_ok; } + }; +# 750 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + template + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c); + + template + inline basic_istream& + operator>>(basic_istream& __in, unsigned char& __c) + { return (__in >> reinterpret_cast(__c)); } + + template + inline basic_istream& + operator>>(basic_istream& __in, signed char& __c) + { return (__in >> reinterpret_cast(__c)); } +# 792 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + template + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s); + + + template<> + basic_istream& + operator>>(basic_istream& __in, char* __s); + + template + inline basic_istream& + operator>>(basic_istream& __in, unsigned char* __s) + { return (__in >> reinterpret_cast(__s)); } + + template + inline basic_istream& + operator>>(basic_istream& __in, signed char* __s) + { return (__in >> reinterpret_cast(__s)); } +# 823 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + template + class basic_iostream + : public basic_istream<_CharT, _Traits>, + public basic_ostream<_CharT, _Traits> + { + public: + + + + typedef _CharT char_type; + typedef typename _Traits::int_type int_type; + typedef typename _Traits::pos_type pos_type; + typedef typename _Traits::off_type off_type; + typedef _Traits traits_type; + + + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef basic_ostream<_CharT, _Traits> __ostream_type; + + + + + + + + explicit + basic_iostream(basic_streambuf<_CharT, _Traits>* __sb) + : __istream_type(__sb), __ostream_type(__sb) { } + + + + + virtual + ~basic_iostream() { } + + protected: + basic_iostream() + : __istream_type(), __ostream_type() { } + + + basic_iostream(const basic_iostream&) = delete; + + basic_iostream(basic_iostream&& __rhs) + : __istream_type(std::move(__rhs)), __ostream_type(*this) + { } + + + + basic_iostream& operator=(const basic_iostream&) = delete; + + basic_iostream& + operator=(basic_iostream&& __rhs) + { + swap(__rhs); + return *this; + } + + void + swap(basic_iostream& __rhs) + { __istream_type::swap(__rhs); } + + }; +# 906 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + template + basic_istream<_CharT, _Traits>& + ws(basic_istream<_CharT, _Traits>& __is); +# 922 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3 + template + inline basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x) + { + __is >> __x; + return __is; + } + + + +} + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/istream.tcc" 1 3 +# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/istream.tcc" 3 + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + basic_istream<_CharT, _Traits>::sentry:: + sentry(basic_istream<_CharT, _Traits>& __in, bool __noskip) : _M_ok(false) + { + ios_base::iostate __err = ios_base::goodbit; + if (__in.good()) + { + if (__in.tie()) + __in.tie()->flush(); + if (!__noskip && bool(__in.flags() & ios_base::skipws)) + { + const __int_type __eof = traits_type::eof(); + __streambuf_type* __sb = __in.rdbuf(); + __int_type __c = __sb->sgetc(); + + const __ctype_type& __ct = __check_facet(__in._M_ctype); + while (!traits_type::eq_int_type(__c, __eof) + && __ct.is(ctype_base::space, + traits_type::to_char_type(__c))) + __c = __sb->snextc(); + + + + + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + } + } + + if (__in.good() && __err == ios_base::goodbit) + _M_ok = true; + else + { + __err |= ios_base::failbit; + __in.setstate(__err); + } + } + + template + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + _M_extract(_ValueT& __v) + { + sentry __cerb(*this, false); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + const __num_get_type& __ng = __check_facet(this->_M_num_get); + __ng.get(*this, 0, *this, __err, __v); + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + operator>>(short& __n) + { + + + sentry __cerb(*this, false); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + long __l; + const __num_get_type& __ng = __check_facet(this->_M_num_get); + __ng.get(*this, 0, *this, __err, __l); + + + + if (__l < __gnu_cxx::__numeric_traits::__min) + { + __err |= ios_base::failbit; + __n = __gnu_cxx::__numeric_traits::__min; + } + else if (__l > __gnu_cxx::__numeric_traits::__max) + { + __err |= ios_base::failbit; + __n = __gnu_cxx::__numeric_traits::__max; + } + else + __n = short(__l); + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + operator>>(int& __n) + { + + + sentry __cerb(*this, false); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + long __l; + const __num_get_type& __ng = __check_facet(this->_M_num_get); + __ng.get(*this, 0, *this, __err, __l); + + + + if (__l < __gnu_cxx::__numeric_traits::__min) + { + __err |= ios_base::failbit; + __n = __gnu_cxx::__numeric_traits::__min; + } + else if (__l > __gnu_cxx::__numeric_traits::__max) + { + __err |= ios_base::failbit; + __n = __gnu_cxx::__numeric_traits::__max; + } + else + __n = int(__l); + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + operator>>(__streambuf_type* __sbout) + { + ios_base::iostate __err = ios_base::goodbit; + sentry __cerb(*this, false); + if (__cerb && __sbout) + { + try + { + bool __ineof; + if (!__copy_streambufs_eof(this->rdbuf(), __sbout, __ineof)) + __err |= ios_base::failbit; + if (__ineof) + __err |= ios_base::eofbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::failbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::failbit); } + } + else if (!__sbout) + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); + return *this; + } + + template + typename basic_istream<_CharT, _Traits>::int_type + basic_istream<_CharT, _Traits>:: + get(void) + { + const int_type __eof = traits_type::eof(); + int_type __c = __eof; + _M_gcount = 0; + ios_base::iostate __err = ios_base::goodbit; + sentry __cerb(*this, true); + if (__cerb) + { + try + { + __c = this->rdbuf()->sbumpc(); + + if (!traits_type::eq_int_type(__c, __eof)) + _M_gcount = 1; + else + __err |= ios_base::eofbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + } + if (!_M_gcount) + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); + return __c; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + get(char_type& __c) + { + _M_gcount = 0; + ios_base::iostate __err = ios_base::goodbit; + sentry __cerb(*this, true); + if (__cerb) + { + try + { + const int_type __cb = this->rdbuf()->sbumpc(); + + if (!traits_type::eq_int_type(__cb, traits_type::eof())) + { + _M_gcount = 1; + __c = traits_type::to_char_type(__cb); + } + else + __err |= ios_base::eofbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + } + if (!_M_gcount) + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + get(char_type* __s, streamsize __n, char_type __delim) + { + _M_gcount = 0; + ios_base::iostate __err = ios_base::goodbit; + sentry __cerb(*this, true); + if (__cerb) + { + try + { + const int_type __idelim = traits_type::to_int_type(__delim); + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sgetc(); + + while (_M_gcount + 1 < __n + && !traits_type::eq_int_type(__c, __eof) + && !traits_type::eq_int_type(__c, __idelim)) + { + *__s++ = traits_type::to_char_type(__c); + ++_M_gcount; + __c = __sb->snextc(); + } + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + } + + + if (__n > 0) + *__s = char_type(); + if (!_M_gcount) + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + get(__streambuf_type& __sb, char_type __delim) + { + _M_gcount = 0; + ios_base::iostate __err = ios_base::goodbit; + sentry __cerb(*this, true); + if (__cerb) + { + try + { + const int_type __idelim = traits_type::to_int_type(__delim); + const int_type __eof = traits_type::eof(); + __streambuf_type* __this_sb = this->rdbuf(); + int_type __c = __this_sb->sgetc(); + char_type __c2 = traits_type::to_char_type(__c); + + while (!traits_type::eq_int_type(__c, __eof) + && !traits_type::eq_int_type(__c, __idelim) + && !traits_type::eq_int_type(__sb.sputc(__c2), __eof)) + { + ++_M_gcount; + __c = __this_sb->snextc(); + __c2 = traits_type::to_char_type(__c); + } + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + } + if (!_M_gcount) + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + getline(char_type* __s, streamsize __n, char_type __delim) + { + _M_gcount = 0; + ios_base::iostate __err = ios_base::goodbit; + sentry __cerb(*this, true); + if (__cerb) + { + try + { + const int_type __idelim = traits_type::to_int_type(__delim); + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sgetc(); + + while (_M_gcount + 1 < __n + && !traits_type::eq_int_type(__c, __eof) + && !traits_type::eq_int_type(__c, __idelim)) + { + *__s++ = traits_type::to_char_type(__c); + __c = __sb->snextc(); + ++_M_gcount; + } + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + else + { + if (traits_type::eq_int_type(__c, __idelim)) + { + __sb->sbumpc(); + ++_M_gcount; + } + else + __err |= ios_base::failbit; + } + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + } + + + if (__n > 0) + *__s = char_type(); + if (!_M_gcount) + __err |= ios_base::failbit; + if (__err) + this->setstate(__err); + return *this; + } + + + + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + ignore(void) + { + _M_gcount = 0; + sentry __cerb(*this, true); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + + if (traits_type::eq_int_type(__sb->sbumpc(), __eof)) + __err |= ios_base::eofbit; + else + _M_gcount = 1; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + ignore(streamsize __n) + { + _M_gcount = 0; + sentry __cerb(*this, true); + if (__cerb && __n > 0) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sgetc(); +# 513 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/istream.tcc" 3 + bool __large_ignore = false; + while (true) + { + while (_M_gcount < __n + && !traits_type::eq_int_type(__c, __eof)) + { + ++_M_gcount; + __c = __sb->snextc(); + } + if (__n == __gnu_cxx::__numeric_traits::__max + && !traits_type::eq_int_type(__c, __eof)) + { + _M_gcount = + __gnu_cxx::__numeric_traits::__min; + __large_ignore = true; + } + else + break; + } + + if (__large_ignore) + _M_gcount = __gnu_cxx::__numeric_traits::__max; + + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + ignore(streamsize __n, int_type __delim) + { + _M_gcount = 0; + sentry __cerb(*this, true); + if (__cerb && __n > 0) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sgetc(); + + + bool __large_ignore = false; + while (true) + { + while (_M_gcount < __n + && !traits_type::eq_int_type(__c, __eof) + && !traits_type::eq_int_type(__c, __delim)) + { + ++_M_gcount; + __c = __sb->snextc(); + } + if (__n == __gnu_cxx::__numeric_traits::__max + && !traits_type::eq_int_type(__c, __eof) + && !traits_type::eq_int_type(__c, __delim)) + { + _M_gcount = + __gnu_cxx::__numeric_traits::__min; + __large_ignore = true; + } + else + break; + } + + if (__large_ignore) + _M_gcount = __gnu_cxx::__numeric_traits::__max; + + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + else if (traits_type::eq_int_type(__c, __delim)) + { + if (_M_gcount + < __gnu_cxx::__numeric_traits::__max) + ++_M_gcount; + __sb->sbumpc(); + } + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + typename basic_istream<_CharT, _Traits>::int_type + basic_istream<_CharT, _Traits>:: + peek(void) + { + int_type __c = traits_type::eof(); + _M_gcount = 0; + sentry __cerb(*this, true); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + __c = this->rdbuf()->sgetc(); + if (traits_type::eq_int_type(__c, traits_type::eof())) + __err |= ios_base::eofbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return __c; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + read(char_type* __s, streamsize __n) + { + _M_gcount = 0; + sentry __cerb(*this, true); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + _M_gcount = this->rdbuf()->sgetn(__s, __n); + if (_M_gcount != __n) + __err |= (ios_base::eofbit | ios_base::failbit); + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + streamsize + basic_istream<_CharT, _Traits>:: + readsome(char_type* __s, streamsize __n) + { + _M_gcount = 0; + sentry __cerb(*this, true); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + + const streamsize __num = this->rdbuf()->in_avail(); + if (__num > 0) + _M_gcount = this->rdbuf()->sgetn(__s, std::min(__num, __n)); + else if (__num == -1) + __err |= ios_base::eofbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return _M_gcount; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + putback(char_type __c) + { + + + _M_gcount = 0; + + this->clear(this->rdstate() & ~ios_base::eofbit); + sentry __cerb(*this, true); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + if (!__sb + || traits_type::eq_int_type(__sb->sputbackc(__c), __eof)) + __err |= ios_base::badbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + unget(void) + { + + + _M_gcount = 0; + + this->clear(this->rdstate() & ~ios_base::eofbit); + sentry __cerb(*this, true); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + if (!__sb + || traits_type::eq_int_type(__sb->sungetc(), __eof)) + __err |= ios_base::badbit; + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + int + basic_istream<_CharT, _Traits>:: + sync(void) + { + + + int __ret = -1; + sentry __cerb(*this, true); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + __streambuf_type* __sb = this->rdbuf(); + if (__sb) + { + if (__sb->pubsync() == -1) + __err |= ios_base::badbit; + else + __ret = 0; + } + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return __ret; + } + + template + typename basic_istream<_CharT, _Traits>::pos_type + basic_istream<_CharT, _Traits>:: + tellg(void) + { + + + pos_type __ret = pos_type(-1); + sentry __cerb(*this, true); + if (__cerb) + { + try + { + if (!this->fail()) + __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, + ios_base::in); + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + } + return __ret; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + seekg(pos_type __pos) + { + + + + this->clear(this->rdstate() & ~ios_base::eofbit); + sentry __cerb(*this, true); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + if (!this->fail()) + { + + const pos_type __p = this->rdbuf()->pubseekpos(__pos, + ios_base::in); + + + if (__p == pos_type(off_type(-1))) + __err |= ios_base::failbit; + } + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + seekg(off_type __off, ios_base::seekdir __dir) + { + + + + this->clear(this->rdstate() & ~ios_base::eofbit); + sentry __cerb(*this, true); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + if (!this->fail()) + { + + const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir, + ios_base::in); + + + if (__p == pos_type(off_type(-1))) + __err |= ios_base::failbit; + } + } + catch(__cxxabiv1::__forced_unwind&) + { + this->_M_setstate(ios_base::badbit); + throw; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + + template + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) + { + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef typename __istream_type::int_type __int_type; + + typename __istream_type::sentry __cerb(__in, false); + if (__cerb) + { + ios_base::iostate __err = ios_base::goodbit; + try + { + const __int_type __cb = __in.rdbuf()->sbumpc(); + if (!_Traits::eq_int_type(__cb, _Traits::eof())) + __c = _Traits::to_char_type(__cb); + else + __err |= (ios_base::eofbit | ios_base::failbit); + } + catch(__cxxabiv1::__forced_unwind&) + { + __in._M_setstate(ios_base::badbit); + throw; + } + catch(...) + { __in._M_setstate(ios_base::badbit); } + if (__err) + __in.setstate(__err); + } + return __in; + } + + template + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) + { + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef basic_streambuf<_CharT, _Traits> __streambuf_type; + typedef typename _Traits::int_type int_type; + typedef _CharT char_type; + typedef ctype<_CharT> __ctype_type; + + streamsize __extracted = 0; + ios_base::iostate __err = ios_base::goodbit; + typename __istream_type::sentry __cerb(__in, false); + if (__cerb) + { + try + { + + streamsize __num = __in.width(); + if (__num <= 0) + __num = __gnu_cxx::__numeric_traits::__max; + + const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc()); + + const int_type __eof = _Traits::eof(); + __streambuf_type* __sb = __in.rdbuf(); + int_type __c = __sb->sgetc(); + + while (__extracted < __num - 1 + && !_Traits::eq_int_type(__c, __eof) + && !__ct.is(ctype_base::space, + _Traits::to_char_type(__c))) + { + *__s++ = _Traits::to_char_type(__c); + ++__extracted; + __c = __sb->snextc(); + } + if (_Traits::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + + + + *__s = char_type(); + __in.width(0); + } + catch(__cxxabiv1::__forced_unwind&) + { + __in._M_setstate(ios_base::badbit); + throw; + } + catch(...) + { __in._M_setstate(ios_base::badbit); } + } + if (!__extracted) + __err |= ios_base::failbit; + if (__err) + __in.setstate(__err); + return __in; + } + + + template + basic_istream<_CharT, _Traits>& + ws(basic_istream<_CharT, _Traits>& __in) + { + typedef basic_istream<_CharT, _Traits> __istream_type; + typedef basic_streambuf<_CharT, _Traits> __streambuf_type; + typedef typename __istream_type::int_type __int_type; + typedef ctype<_CharT> __ctype_type; + + const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc()); + const __int_type __eof = _Traits::eof(); + __streambuf_type* __sb = __in.rdbuf(); + __int_type __c = __sb->sgetc(); + + while (!_Traits::eq_int_type(__c, __eof) + && __ct.is(ctype_base::space, _Traits::to_char_type(__c))) + __c = __sb->snextc(); + + if (_Traits::eq_int_type(__c, __eof)) + __in.setstate(ios_base::eofbit); + return __in; + } + + + + + extern template class basic_istream; + extern template istream& ws(istream&); + extern template istream& operator>>(istream&, char&); + extern template istream& operator>>(istream&, char*); + extern template istream& operator>>(istream&, unsigned char&); + extern template istream& operator>>(istream&, signed char&); + extern template istream& operator>>(istream&, unsigned char*); + extern template istream& operator>>(istream&, signed char*); + + extern template istream& istream::_M_extract(unsigned short&); + extern template istream& istream::_M_extract(unsigned int&); + extern template istream& istream::_M_extract(long&); + extern template istream& istream::_M_extract(unsigned long&); + extern template istream& istream::_M_extract(bool&); + + extern template istream& istream::_M_extract(long long&); + extern template istream& istream::_M_extract(unsigned long long&); + + extern template istream& istream::_M_extract(float&); + extern template istream& istream::_M_extract(double&); + extern template istream& istream::_M_extract(long double&); + extern template istream& istream::_M_extract(void*&); + + extern template class basic_iostream; + + + extern template class basic_istream; + extern template wistream& ws(wistream&); + extern template wistream& operator>>(wistream&, wchar_t&); + extern template wistream& operator>>(wistream&, wchar_t*); + + extern template wistream& wistream::_M_extract(unsigned short&); + extern template wistream& wistream::_M_extract(unsigned int&); + extern template wistream& wistream::_M_extract(long&); + extern template wistream& wistream::_M_extract(unsigned long&); + extern template wistream& wistream::_M_extract(bool&); + + extern template wistream& wistream::_M_extract(long long&); + extern template wistream& wistream::_M_extract(unsigned long long&); + + extern template wistream& wistream::_M_extract(float&); + extern template wistream& wistream::_M_extract(double&); + extern template wistream& wistream::_M_extract(long double&); + extern template wistream& wistream::_M_extract(void*&); + + extern template class basic_iostream; + + + + +} +# 935 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 2 3 +# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stream_iterator.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stream_iterator.h" 3 + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stream_iterator.h" 3 + template, typename _Dist = ptrdiff_t> + class istream_iterator + : public iterator + { + public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_istream<_CharT, _Traits> istream_type; + + private: + istream_type* _M_stream; + _Tp _M_value; + bool _M_ok; + + public: + + constexpr istream_iterator() + : _M_stream(0), _M_value(), _M_ok(false) {} + + + istream_iterator(istream_type& __s) + : _M_stream(&__s) + { _M_read(); } + + istream_iterator(const istream_iterator& __obj) + : _M_stream(__obj._M_stream), _M_value(__obj._M_value), + _M_ok(__obj._M_ok) + { } + + const _Tp& + operator*() const + { + + + ; + return _M_value; + } + + const _Tp* + operator->() const { return &(operator*()); } + + istream_iterator& + operator++() + { + + + ; + _M_read(); + return *this; + } + + istream_iterator + operator++(int) + { + + + ; + istream_iterator __tmp = *this; + _M_read(); + return __tmp; + } + + bool + _M_equal(const istream_iterator& __x) const + { return (_M_ok == __x._M_ok) && (!_M_ok || _M_stream == __x._M_stream); } + + private: + void + _M_read() + { + _M_ok = (_M_stream && *_M_stream) ? true : false; + if (_M_ok) + { + *_M_stream >> _M_value; + _M_ok = *_M_stream ? true : false; + } + } + }; + + + template + inline bool + operator==(const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __x, + const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __y) + { return __x._M_equal(__y); } + + + template + inline bool + operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __x, + const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __y) + { return !__x._M_equal(__y); } +# 152 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stream_iterator.h" 3 + template > + class ostream_iterator + : public iterator + { + public: + + + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_ostream<_CharT, _Traits> ostream_type; + + + private: + ostream_type* _M_stream; + const _CharT* _M_string; + + public: + + ostream_iterator(ostream_type& __s) : _M_stream(&__s), _M_string(0) {} +# 183 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stream_iterator.h" 3 + ostream_iterator(ostream_type& __s, const _CharT* __c) + : _M_stream(&__s), _M_string(__c) { } + + + ostream_iterator(const ostream_iterator& __obj) + : _M_stream(__obj._M_stream), _M_string(__obj._M_string) { } + + + + ostream_iterator& + operator=(const _Tp& __value) + { + + + ; + *_M_stream << __value; + if (_M_string) *_M_stream << _M_string; + return *this; + } + + ostream_iterator& + operator*() + { return *this; } + + ostream_iterator& + operator++() + { return *this; } + + ostream_iterator& + operator++(int) + { return *this; } + }; + + + + +} +# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 2 3 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayIterator.h" 2 + + + +namespace mozilla { +# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayIterator.h" +template +class ArrayIterator +{ +public: + typedef ArrayType array_type; + typedef ArrayIterator iterator_type; + typedef typename array_type::index_type index_type; + typedef typename RemoveReference::Type value_type; + typedef ptrdiff_t difference_type; + typedef value_type* pointer; + typedef value_type& reference; + typedef std::random_access_iterator_tag iterator_category; + +private: + const array_type* mArray; + index_type mIndex; + +public: + ArrayIterator() : mArray(nullptr), mIndex(0) {} + ArrayIterator(const iterator_type& aOther) + : mArray(aOther.mArray), mIndex(aOther.mIndex) {} + ArrayIterator(const array_type& aArray, index_type aIndex) + : mArray(&aArray), mIndex(aIndex) {} + + iterator_type& operator=(const iterator_type& aOther) { + mArray = aOther.mArray; + mIndex = aOther.mIndex; + return *this; + } + + bool operator==(const iterator_type& aRhs) const { + return mIndex == aRhs.mIndex; + } + bool operator!=(const iterator_type& aRhs) const { + return !(*this == aRhs); + } + bool operator<(const iterator_type& aRhs) const { + return mIndex < aRhs.mIndex; + } + bool operator>(const iterator_type& aRhs) const { + return mIndex > aRhs.mIndex; + } + bool operator<=(const iterator_type& aRhs) const { + return mIndex <= aRhs.mIndex; + } + bool operator>=(const iterator_type& aRhs) const { + return mIndex >= aRhs.mIndex; + } + + + + value_type* operator->() const { + return const_cast(&mArray->ElementAt(mIndex)); + } + Element operator*() const { + return const_cast(mArray->ElementAt(mIndex)); + } + + iterator_type& operator++() { + ++mIndex; + return *this; + } + iterator_type operator++(int) { + iterator_type it = *this; + ++*this; + return it; + } + iterator_type& operator--() { + --mIndex; + return *this; + } + iterator_type operator--(int) { + iterator_type it = *this; + --*this; + return it; + } + + iterator_type& operator+=(difference_type aDiff) { + mIndex += aDiff; + return *this; + } + iterator_type& operator-=(difference_type aDiff) { + mIndex -= aDiff; + return *this; + } + + iterator_type operator+(difference_type aDiff) const { + iterator_type it = *this; + it += aDiff; + return it; + } + iterator_type operator-(difference_type aDiff) const { + iterator_type it = *this; + it -= aDiff; + return it; + } + + difference_type operator-(const iterator_type& aOther) const { + return static_cast(mIndex) - + static_cast(aOther.mIndex); + } + + Element operator[](difference_type aIndex) const { + return *this->operator+(aIndex); + } +}; + +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BinarySearch.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BinarySearch.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BinarySearch.h" 2 + +namespace mozilla { +# 66 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BinarySearch.h" +template +bool +BinarySearchIf(const Container& aContainer, size_t aBegin, size_t aEnd, + const Comparator& aCompare, size_t* aMatchOrInsertionPoint) +{ + do { } while (0); + + size_t low = aBegin; + size_t high = aEnd; + while (high != low) { + size_t middle = low + (high - low) / 2; + + + + const int result = aCompare(aContainer[middle]); + + if (result == 0) { + *aMatchOrInsertionPoint = middle; + return true; + } + + if (result < 0) { + high = middle; + } else { + low = middle + 1; + } + } + + *aMatchOrInsertionPoint = low; + return false; +} + +namespace detail { + +template +class BinarySearchDefaultComparator +{ +public: + explicit BinarySearchDefaultComparator(const T& aTarget) + : mTarget(aTarget) + {} + + template + int operator()(const U& aVal) const { + if (mTarget == aVal) { + return 0; + } + + if (mTarget < aVal) { + return -1; + } + + return 1; + } + +private: + const T& mTarget; +}; + +} + +template +bool +BinarySearch(const Container& aContainer, size_t aBegin, size_t aEnd, + T aTarget, size_t* aMatchOrInsertionPoint) +{ + return BinarySearchIf(aContainer, aBegin, aEnd, + detail::BinarySearchDefaultComparator(aTarget), + aMatchOrInsertionPoint); +} + +} +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" 1 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 + + + + + +# 1 "/usr/include/math.h" 1 3 4 +# 28 "/usr/include/math.h" 3 4 +extern "C" { + + + +# 1 "/usr/include/bits/math-vector.h" 1 3 4 +# 25 "/usr/include/bits/math-vector.h" 3 4 +# 1 "/usr/include/bits/libm-simd-decl-stubs.h" 1 3 4 +# 26 "/usr/include/bits/math-vector.h" 2 3 4 +# 32 "/usr/include/math.h" 2 3 4 + + + +# 1 "/usr/include/bits/huge_val.h" 1 3 4 +# 36 "/usr/include/math.h" 2 3 4 + +# 1 "/usr/include/bits/huge_valf.h" 1 3 4 +# 38 "/usr/include/math.h" 2 3 4 +# 1 "/usr/include/bits/huge_vall.h" 1 3 4 +# 39 "/usr/include/math.h" 2 3 4 + + +# 1 "/usr/include/bits/inf.h" 1 3 4 +# 42 "/usr/include/math.h" 2 3 4 + + +# 1 "/usr/include/bits/nan.h" 1 3 4 +# 45 "/usr/include/math.h" 2 3 4 + + + +# 1 "/usr/include/bits/mathdef.h" 1 3 4 +# 28 "/usr/include/bits/mathdef.h" 3 4 +typedef float float_t; +typedef double double_t; +# 49 "/usr/include/math.h" 2 3 4 +# 83 "/usr/include/math.h" 3 4 +# 1 "/usr/include/bits/mathcalls.h" 1 3 4 +# 54 "/usr/include/bits/mathcalls.h" 3 4 +extern double acos (double __x) throw (); extern double __acos (double __x) throw (); + +extern double asin (double __x) throw (); extern double __asin (double __x) throw (); + +extern double atan (double __x) throw (); extern double __atan (double __x) throw (); + +extern double atan2 (double __y, double __x) throw (); extern double __atan2 (double __y, double __x) throw (); + + + extern double cos (double __x) throw (); extern double __cos (double __x) throw (); + + extern double sin (double __x) throw (); extern double __sin (double __x) throw (); + +extern double tan (double __x) throw (); extern double __tan (double __x) throw (); + + + + +extern double cosh (double __x) throw (); extern double __cosh (double __x) throw (); + +extern double sinh (double __x) throw (); extern double __sinh (double __x) throw (); + +extern double tanh (double __x) throw (); extern double __tanh (double __x) throw (); + + + + + extern void sincos (double __x, double *__sinx, double *__cosx) throw (); extern void __sincos (double __x, double *__sinx, double *__cosx) throw (); + + + + + + +extern double acosh (double __x) throw (); extern double __acosh (double __x) throw (); + +extern double asinh (double __x) throw (); extern double __asinh (double __x) throw (); + +extern double atanh (double __x) throw (); extern double __atanh (double __x) throw (); + + + + + + + + extern double exp (double __x) throw (); extern double __exp (double __x) throw (); + + +extern double frexp (double __x, int *__exponent) throw (); extern double __frexp (double __x, int *__exponent) throw (); + + +extern double ldexp (double __x, int __exponent) throw (); extern double __ldexp (double __x, int __exponent) throw (); + + + extern double log (double __x) throw (); extern double __log (double __x) throw (); + + +extern double log10 (double __x) throw (); extern double __log10 (double __x) throw (); + + +extern double modf (double __x, double *__iptr) throw (); extern double __modf (double __x, double *__iptr) throw () __attribute__ ((__nonnull__ (2))); + + + + +extern double exp10 (double __x) throw (); extern double __exp10 (double __x) throw (); + +extern double pow10 (double __x) throw (); extern double __pow10 (double __x) throw (); + + + + + +extern double expm1 (double __x) throw (); extern double __expm1 (double __x) throw (); + + +extern double log1p (double __x) throw (); extern double __log1p (double __x) throw (); + + +extern double logb (double __x) throw (); extern double __logb (double __x) throw (); + + + + + + +extern double exp2 (double __x) throw (); extern double __exp2 (double __x) throw (); + + +extern double log2 (double __x) throw (); extern double __log2 (double __x) throw (); +# 153 "/usr/include/bits/mathcalls.h" 3 4 + extern double pow (double __x, double __y) throw (); extern double __pow (double __x, double __y) throw (); + + +extern double sqrt (double __x) throw (); extern double __sqrt (double __x) throw (); + + + + + +extern double hypot (double __x, double __y) throw (); extern double __hypot (double __x, double __y) throw (); + + + + + + +extern double cbrt (double __x) throw (); extern double __cbrt (double __x) throw (); +# 178 "/usr/include/bits/mathcalls.h" 3 4 +extern double ceil (double __x) throw () __attribute__ ((__const__)); extern double __ceil (double __x) throw () __attribute__ ((__const__)); + + +extern double fabs (double __x) throw () __attribute__ ((__const__)); extern double __fabs (double __x) throw () __attribute__ ((__const__)); + + +extern double floor (double __x) throw () __attribute__ ((__const__)); extern double __floor (double __x) throw () __attribute__ ((__const__)); + + +extern double fmod (double __x, double __y) throw (); extern double __fmod (double __x, double __y) throw (); + + + + +extern int __isinf (double __value) throw () __attribute__ ((__const__)); + + +extern int __finite (double __value) throw () __attribute__ ((__const__)); +# 208 "/usr/include/bits/mathcalls.h" 3 4 +extern int finite (double __value) throw () __attribute__ ((__const__)); + + +extern double drem (double __x, double __y) throw (); extern double __drem (double __x, double __y) throw (); + + + +extern double significand (double __x) throw (); extern double __significand (double __x) throw (); + + + + + +extern double copysign (double __x, double __y) throw () __attribute__ ((__const__)); extern double __copysign (double __x, double __y) throw () __attribute__ ((__const__)); + + + + + + +extern double nan (const char *__tagb) throw () __attribute__ ((__const__)); extern double __nan (const char *__tagb) throw () __attribute__ ((__const__)); + + + + + +extern int __isnan (double __value) throw () __attribute__ ((__const__)); +# 247 "/usr/include/bits/mathcalls.h" 3 4 +extern double j0 (double) throw (); extern double __j0 (double) throw (); +extern double j1 (double) throw (); extern double __j1 (double) throw (); +extern double jn (int, double) throw (); extern double __jn (int, double) throw (); +extern double y0 (double) throw (); extern double __y0 (double) throw (); +extern double y1 (double) throw (); extern double __y1 (double) throw (); +extern double yn (int, double) throw (); extern double __yn (int, double) throw (); + + + + + + +extern double erf (double) throw (); extern double __erf (double) throw (); +extern double erfc (double) throw (); extern double __erfc (double) throw (); +extern double lgamma (double) throw (); extern double __lgamma (double) throw (); + + + + + + +extern double tgamma (double) throw (); extern double __tgamma (double) throw (); + + + + + +extern double gamma (double) throw (); extern double __gamma (double) throw (); + + + + + + +extern double lgamma_r (double, int *__signgamp) throw (); extern double __lgamma_r (double, int *__signgamp) throw (); + + + + + + + +extern double rint (double __x) throw (); extern double __rint (double __x) throw (); + + +extern double nextafter (double __x, double __y) throw () __attribute__ ((__const__)); extern double __nextafter (double __x, double __y) throw () __attribute__ ((__const__)); + +extern double nexttoward (double __x, long double __y) throw () __attribute__ ((__const__)); extern double __nexttoward (double __x, long double __y) throw () __attribute__ ((__const__)); + + + + +extern double nextdown (double __x) throw (); extern double __nextdown (double __x) throw (); + +extern double nextup (double __x) throw (); extern double __nextup (double __x) throw (); + + + +extern double remainder (double __x, double __y) throw (); extern double __remainder (double __x, double __y) throw (); + + + +extern double scalbn (double __x, int __n) throw (); extern double __scalbn (double __x, int __n) throw (); + + + +extern int ilogb (double __x) throw (); extern int __ilogb (double __x) throw (); + + + + +extern double scalbln (double __x, long int __n) throw (); extern double __scalbln (double __x, long int __n) throw (); + + + +extern double nearbyint (double __x) throw (); extern double __nearbyint (double __x) throw (); + + + +extern double round (double __x) throw () __attribute__ ((__const__)); extern double __round (double __x) throw () __attribute__ ((__const__)); + + + +extern double trunc (double __x) throw () __attribute__ ((__const__)); extern double __trunc (double __x) throw () __attribute__ ((__const__)); + + + + +extern double remquo (double __x, double __y, int *__quo) throw (); extern double __remquo (double __x, double __y, int *__quo) throw (); + + + + + + +extern long int lrint (double __x) throw (); extern long int __lrint (double __x) throw (); +__extension__ +extern long long int llrint (double __x) throw (); extern long long int __llrint (double __x) throw (); + + + +extern long int lround (double __x) throw (); extern long int __lround (double __x) throw (); +__extension__ +extern long long int llround (double __x) throw (); extern long long int __llround (double __x) throw (); + + + +extern double fdim (double __x, double __y) throw (); extern double __fdim (double __x, double __y) throw (); + + +extern double fmax (double __x, double __y) throw () __attribute__ ((__const__)); extern double __fmax (double __x, double __y) throw () __attribute__ ((__const__)); + + +extern double fmin (double __x, double __y) throw () __attribute__ ((__const__)); extern double __fmin (double __x, double __y) throw () __attribute__ ((__const__)); + + + +extern int __fpclassify (double __value) throw () + __attribute__ ((__const__)); + + +extern int __signbit (double __value) throw () + __attribute__ ((__const__)); + + + +extern double fma (double __x, double __y, double __z) throw (); extern double __fma (double __x, double __y, double __z) throw (); +# 382 "/usr/include/bits/mathcalls.h" 3 4 +extern int __issignaling (double __value) throw () + __attribute__ ((__const__)); + + + + + + +extern double scalb (double __x, double __n) throw (); extern double __scalb (double __x, double __n) throw (); +# 84 "/usr/include/math.h" 2 3 4 +# 104 "/usr/include/math.h" 3 4 +# 1 "/usr/include/bits/mathcalls.h" 1 3 4 +# 54 "/usr/include/bits/mathcalls.h" 3 4 +extern float acosf (float __x) throw (); extern float __acosf (float __x) throw (); + +extern float asinf (float __x) throw (); extern float __asinf (float __x) throw (); + +extern float atanf (float __x) throw (); extern float __atanf (float __x) throw (); + +extern float atan2f (float __y, float __x) throw (); extern float __atan2f (float __y, float __x) throw (); + + + extern float cosf (float __x) throw (); extern float __cosf (float __x) throw (); + + extern float sinf (float __x) throw (); extern float __sinf (float __x) throw (); + +extern float tanf (float __x) throw (); extern float __tanf (float __x) throw (); + + + + +extern float coshf (float __x) throw (); extern float __coshf (float __x) throw (); + +extern float sinhf (float __x) throw (); extern float __sinhf (float __x) throw (); + +extern float tanhf (float __x) throw (); extern float __tanhf (float __x) throw (); + + + + + extern void sincosf (float __x, float *__sinx, float *__cosx) throw (); extern void __sincosf (float __x, float *__sinx, float *__cosx) throw (); + + + + + + +extern float acoshf (float __x) throw (); extern float __acoshf (float __x) throw (); + +extern float asinhf (float __x) throw (); extern float __asinhf (float __x) throw (); + +extern float atanhf (float __x) throw (); extern float __atanhf (float __x) throw (); + + + + + + + + extern float expf (float __x) throw (); extern float __expf (float __x) throw (); + + +extern float frexpf (float __x, int *__exponent) throw (); extern float __frexpf (float __x, int *__exponent) throw (); + + +extern float ldexpf (float __x, int __exponent) throw (); extern float __ldexpf (float __x, int __exponent) throw (); + + + extern float logf (float __x) throw (); extern float __logf (float __x) throw (); + + +extern float log10f (float __x) throw (); extern float __log10f (float __x) throw (); + + +extern float modff (float __x, float *__iptr) throw (); extern float __modff (float __x, float *__iptr) throw () __attribute__ ((__nonnull__ (2))); + + + + +extern float exp10f (float __x) throw (); extern float __exp10f (float __x) throw (); + +extern float pow10f (float __x) throw (); extern float __pow10f (float __x) throw (); + + + + + +extern float expm1f (float __x) throw (); extern float __expm1f (float __x) throw (); + + +extern float log1pf (float __x) throw (); extern float __log1pf (float __x) throw (); + + +extern float logbf (float __x) throw (); extern float __logbf (float __x) throw (); + + + + + + +extern float exp2f (float __x) throw (); extern float __exp2f (float __x) throw (); + + +extern float log2f (float __x) throw (); extern float __log2f (float __x) throw (); +# 153 "/usr/include/bits/mathcalls.h" 3 4 + extern float powf (float __x, float __y) throw (); extern float __powf (float __x, float __y) throw (); + + +extern float sqrtf (float __x) throw (); extern float __sqrtf (float __x) throw (); + + + + + +extern float hypotf (float __x, float __y) throw (); extern float __hypotf (float __x, float __y) throw (); + + + + + + +extern float cbrtf (float __x) throw (); extern float __cbrtf (float __x) throw (); +# 178 "/usr/include/bits/mathcalls.h" 3 4 +extern float ceilf (float __x) throw () __attribute__ ((__const__)); extern float __ceilf (float __x) throw () __attribute__ ((__const__)); + + +extern float fabsf (float __x) throw () __attribute__ ((__const__)); extern float __fabsf (float __x) throw () __attribute__ ((__const__)); + + +extern float floorf (float __x) throw () __attribute__ ((__const__)); extern float __floorf (float __x) throw () __attribute__ ((__const__)); + + +extern float fmodf (float __x, float __y) throw (); extern float __fmodf (float __x, float __y) throw (); + + + + +extern int __isinff (float __value) throw () __attribute__ ((__const__)); + + +extern int __finitef (float __value) throw () __attribute__ ((__const__)); +# 204 "/usr/include/bits/mathcalls.h" 3 4 +extern int isinff (float __value) throw () __attribute__ ((__const__)); + + + +extern int finitef (float __value) throw () __attribute__ ((__const__)); + + +extern float dremf (float __x, float __y) throw (); extern float __dremf (float __x, float __y) throw (); + + + +extern float significandf (float __x) throw (); extern float __significandf (float __x) throw (); + + + + + +extern float copysignf (float __x, float __y) throw () __attribute__ ((__const__)); extern float __copysignf (float __x, float __y) throw () __attribute__ ((__const__)); + + + + + + +extern float nanf (const char *__tagb) throw () __attribute__ ((__const__)); extern float __nanf (const char *__tagb) throw () __attribute__ ((__const__)); + + + + + +extern int __isnanf (float __value) throw () __attribute__ ((__const__)); + + + + + + +extern int isnanf (float __value) throw () __attribute__ ((__const__)); + + + + + +extern float j0f (float) throw (); extern float __j0f (float) throw (); +extern float j1f (float) throw (); extern float __j1f (float) throw (); +extern float jnf (int, float) throw (); extern float __jnf (int, float) throw (); +extern float y0f (float) throw (); extern float __y0f (float) throw (); +extern float y1f (float) throw (); extern float __y1f (float) throw (); +extern float ynf (int, float) throw (); extern float __ynf (int, float) throw (); + + + + + + +extern float erff (float) throw (); extern float __erff (float) throw (); +extern float erfcf (float) throw (); extern float __erfcf (float) throw (); +extern float lgammaf (float) throw (); extern float __lgammaf (float) throw (); + + + + + + +extern float tgammaf (float) throw (); extern float __tgammaf (float) throw (); + + + + + +extern float gammaf (float) throw (); extern float __gammaf (float) throw (); + + + + + + +extern float lgammaf_r (float, int *__signgamp) throw (); extern float __lgammaf_r (float, int *__signgamp) throw (); + + + + + + + +extern float rintf (float __x) throw (); extern float __rintf (float __x) throw (); + + +extern float nextafterf (float __x, float __y) throw () __attribute__ ((__const__)); extern float __nextafterf (float __x, float __y) throw () __attribute__ ((__const__)); + +extern float nexttowardf (float __x, long double __y) throw () __attribute__ ((__const__)); extern float __nexttowardf (float __x, long double __y) throw () __attribute__ ((__const__)); + + + + +extern float nextdownf (float __x) throw (); extern float __nextdownf (float __x) throw (); + +extern float nextupf (float __x) throw (); extern float __nextupf (float __x) throw (); + + + +extern float remainderf (float __x, float __y) throw (); extern float __remainderf (float __x, float __y) throw (); + + + +extern float scalbnf (float __x, int __n) throw (); extern float __scalbnf (float __x, int __n) throw (); + + + +extern int ilogbf (float __x) throw (); extern int __ilogbf (float __x) throw (); + + + + +extern float scalblnf (float __x, long int __n) throw (); extern float __scalblnf (float __x, long int __n) throw (); + + + +extern float nearbyintf (float __x) throw (); extern float __nearbyintf (float __x) throw (); + + + +extern float roundf (float __x) throw () __attribute__ ((__const__)); extern float __roundf (float __x) throw () __attribute__ ((__const__)); + + + +extern float truncf (float __x) throw () __attribute__ ((__const__)); extern float __truncf (float __x) throw () __attribute__ ((__const__)); + + + + +extern float remquof (float __x, float __y, int *__quo) throw (); extern float __remquof (float __x, float __y, int *__quo) throw (); + + + + + + +extern long int lrintf (float __x) throw (); extern long int __lrintf (float __x) throw (); +__extension__ +extern long long int llrintf (float __x) throw (); extern long long int __llrintf (float __x) throw (); + + + +extern long int lroundf (float __x) throw (); extern long int __lroundf (float __x) throw (); +__extension__ +extern long long int llroundf (float __x) throw (); extern long long int __llroundf (float __x) throw (); + + + +extern float fdimf (float __x, float __y) throw (); extern float __fdimf (float __x, float __y) throw (); + + +extern float fmaxf (float __x, float __y) throw () __attribute__ ((__const__)); extern float __fmaxf (float __x, float __y) throw () __attribute__ ((__const__)); + + +extern float fminf (float __x, float __y) throw () __attribute__ ((__const__)); extern float __fminf (float __x, float __y) throw () __attribute__ ((__const__)); + + + +extern int __fpclassifyf (float __value) throw () + __attribute__ ((__const__)); + + +extern int __signbitf (float __value) throw () + __attribute__ ((__const__)); + + + +extern float fmaf (float __x, float __y, float __z) throw (); extern float __fmaf (float __x, float __y, float __z) throw (); +# 382 "/usr/include/bits/mathcalls.h" 3 4 +extern int __issignalingf (float __value) throw () + __attribute__ ((__const__)); + + + + + + +extern float scalbf (float __x, float __n) throw (); extern float __scalbf (float __x, float __n) throw (); +# 105 "/usr/include/math.h" 2 3 4 +# 151 "/usr/include/math.h" 3 4 +# 1 "/usr/include/bits/mathcalls.h" 1 3 4 +# 54 "/usr/include/bits/mathcalls.h" 3 4 +extern long double acosl (long double __x) throw (); extern long double __acosl (long double __x) throw (); + +extern long double asinl (long double __x) throw (); extern long double __asinl (long double __x) throw (); + +extern long double atanl (long double __x) throw (); extern long double __atanl (long double __x) throw (); + +extern long double atan2l (long double __y, long double __x) throw (); extern long double __atan2l (long double __y, long double __x) throw (); + + + extern long double cosl (long double __x) throw (); extern long double __cosl (long double __x) throw (); + + extern long double sinl (long double __x) throw (); extern long double __sinl (long double __x) throw (); + +extern long double tanl (long double __x) throw (); extern long double __tanl (long double __x) throw (); + + + + +extern long double coshl (long double __x) throw (); extern long double __coshl (long double __x) throw (); + +extern long double sinhl (long double __x) throw (); extern long double __sinhl (long double __x) throw (); + +extern long double tanhl (long double __x) throw (); extern long double __tanhl (long double __x) throw (); + + + + + extern void sincosl (long double __x, long double *__sinx, long double *__cosx) throw (); extern void __sincosl (long double __x, long double *__sinx, long double *__cosx) throw (); + + + + + + +extern long double acoshl (long double __x) throw (); extern long double __acoshl (long double __x) throw (); + +extern long double asinhl (long double __x) throw (); extern long double __asinhl (long double __x) throw (); + +extern long double atanhl (long double __x) throw (); extern long double __atanhl (long double __x) throw (); + + + + + + + + extern long double expl (long double __x) throw (); extern long double __expl (long double __x) throw (); + + +extern long double frexpl (long double __x, int *__exponent) throw (); extern long double __frexpl (long double __x, int *__exponent) throw (); + + +extern long double ldexpl (long double __x, int __exponent) throw (); extern long double __ldexpl (long double __x, int __exponent) throw (); + + + extern long double logl (long double __x) throw (); extern long double __logl (long double __x) throw (); + + +extern long double log10l (long double __x) throw (); extern long double __log10l (long double __x) throw (); + + +extern long double modfl (long double __x, long double *__iptr) throw (); extern long double __modfl (long double __x, long double *__iptr) throw () __attribute__ ((__nonnull__ (2))); + + + + +extern long double exp10l (long double __x) throw (); extern long double __exp10l (long double __x) throw (); + +extern long double pow10l (long double __x) throw (); extern long double __pow10l (long double __x) throw (); + + + + + +extern long double expm1l (long double __x) throw (); extern long double __expm1l (long double __x) throw (); + + +extern long double log1pl (long double __x) throw (); extern long double __log1pl (long double __x) throw (); + + +extern long double logbl (long double __x) throw (); extern long double __logbl (long double __x) throw (); + + + + + + +extern long double exp2l (long double __x) throw (); extern long double __exp2l (long double __x) throw (); + + +extern long double log2l (long double __x) throw (); extern long double __log2l (long double __x) throw (); +# 153 "/usr/include/bits/mathcalls.h" 3 4 + extern long double powl (long double __x, long double __y) throw (); extern long double __powl (long double __x, long double __y) throw (); + + +extern long double sqrtl (long double __x) throw (); extern long double __sqrtl (long double __x) throw (); + + + + + +extern long double hypotl (long double __x, long double __y) throw (); extern long double __hypotl (long double __x, long double __y) throw (); + + + + + + +extern long double cbrtl (long double __x) throw (); extern long double __cbrtl (long double __x) throw (); +# 178 "/usr/include/bits/mathcalls.h" 3 4 +extern long double ceill (long double __x) throw () __attribute__ ((__const__)); extern long double __ceill (long double __x) throw () __attribute__ ((__const__)); + + +extern long double fabsl (long double __x) throw () __attribute__ ((__const__)); extern long double __fabsl (long double __x) throw () __attribute__ ((__const__)); + + +extern long double floorl (long double __x) throw () __attribute__ ((__const__)); extern long double __floorl (long double __x) throw () __attribute__ ((__const__)); + + +extern long double fmodl (long double __x, long double __y) throw (); extern long double __fmodl (long double __x, long double __y) throw (); + + + + +extern int __isinfl (long double __value) throw () __attribute__ ((__const__)); + + +extern int __finitel (long double __value) throw () __attribute__ ((__const__)); +# 204 "/usr/include/bits/mathcalls.h" 3 4 +extern int isinfl (long double __value) throw () __attribute__ ((__const__)); + + + +extern int finitel (long double __value) throw () __attribute__ ((__const__)); + + +extern long double dreml (long double __x, long double __y) throw (); extern long double __dreml (long double __x, long double __y) throw (); + + + +extern long double significandl (long double __x) throw (); extern long double __significandl (long double __x) throw (); + + + + + +extern long double copysignl (long double __x, long double __y) throw () __attribute__ ((__const__)); extern long double __copysignl (long double __x, long double __y) throw () __attribute__ ((__const__)); + + + + + + +extern long double nanl (const char *__tagb) throw () __attribute__ ((__const__)); extern long double __nanl (const char *__tagb) throw () __attribute__ ((__const__)); + + + + + +extern int __isnanl (long double __value) throw () __attribute__ ((__const__)); + + + + + + +extern int isnanl (long double __value) throw () __attribute__ ((__const__)); + + + + + +extern long double j0l (long double) throw (); extern long double __j0l (long double) throw (); +extern long double j1l (long double) throw (); extern long double __j1l (long double) throw (); +extern long double jnl (int, long double) throw (); extern long double __jnl (int, long double) throw (); +extern long double y0l (long double) throw (); extern long double __y0l (long double) throw (); +extern long double y1l (long double) throw (); extern long double __y1l (long double) throw (); +extern long double ynl (int, long double) throw (); extern long double __ynl (int, long double) throw (); + + + + + + +extern long double erfl (long double) throw (); extern long double __erfl (long double) throw (); +extern long double erfcl (long double) throw (); extern long double __erfcl (long double) throw (); +extern long double lgammal (long double) throw (); extern long double __lgammal (long double) throw (); + + + + + + +extern long double tgammal (long double) throw (); extern long double __tgammal (long double) throw (); + + + + + +extern long double gammal (long double) throw (); extern long double __gammal (long double) throw (); + + + + + + +extern long double lgammal_r (long double, int *__signgamp) throw (); extern long double __lgammal_r (long double, int *__signgamp) throw (); + + + + + + + +extern long double rintl (long double __x) throw (); extern long double __rintl (long double __x) throw (); + + +extern long double nextafterl (long double __x, long double __y) throw () __attribute__ ((__const__)); extern long double __nextafterl (long double __x, long double __y) throw () __attribute__ ((__const__)); + +extern long double nexttowardl (long double __x, long double __y) throw () __attribute__ ((__const__)); extern long double __nexttowardl (long double __x, long double __y) throw () __attribute__ ((__const__)); + + + + +extern long double nextdownl (long double __x) throw (); extern long double __nextdownl (long double __x) throw (); + +extern long double nextupl (long double __x) throw (); extern long double __nextupl (long double __x) throw (); + + + +extern long double remainderl (long double __x, long double __y) throw (); extern long double __remainderl (long double __x, long double __y) throw (); + + + +extern long double scalbnl (long double __x, int __n) throw (); extern long double __scalbnl (long double __x, int __n) throw (); + + + +extern int ilogbl (long double __x) throw (); extern int __ilogbl (long double __x) throw (); + + + + +extern long double scalblnl (long double __x, long int __n) throw (); extern long double __scalblnl (long double __x, long int __n) throw (); + + + +extern long double nearbyintl (long double __x) throw (); extern long double __nearbyintl (long double __x) throw (); + + + +extern long double roundl (long double __x) throw () __attribute__ ((__const__)); extern long double __roundl (long double __x) throw () __attribute__ ((__const__)); + + + +extern long double truncl (long double __x) throw () __attribute__ ((__const__)); extern long double __truncl (long double __x) throw () __attribute__ ((__const__)); + + + + +extern long double remquol (long double __x, long double __y, int *__quo) throw (); extern long double __remquol (long double __x, long double __y, int *__quo) throw (); + + + + + + +extern long int lrintl (long double __x) throw (); extern long int __lrintl (long double __x) throw (); +__extension__ +extern long long int llrintl (long double __x) throw (); extern long long int __llrintl (long double __x) throw (); + + + +extern long int lroundl (long double __x) throw (); extern long int __lroundl (long double __x) throw (); +__extension__ +extern long long int llroundl (long double __x) throw (); extern long long int __llroundl (long double __x) throw (); + + + +extern long double fdiml (long double __x, long double __y) throw (); extern long double __fdiml (long double __x, long double __y) throw (); + + +extern long double fmaxl (long double __x, long double __y) throw () __attribute__ ((__const__)); extern long double __fmaxl (long double __x, long double __y) throw () __attribute__ ((__const__)); + + +extern long double fminl (long double __x, long double __y) throw () __attribute__ ((__const__)); extern long double __fminl (long double __x, long double __y) throw () __attribute__ ((__const__)); + + + +extern int __fpclassifyl (long double __value) throw () + __attribute__ ((__const__)); + + +extern int __signbitl (long double __value) throw () + __attribute__ ((__const__)); + + + +extern long double fmal (long double __x, long double __y, long double __z) throw (); extern long double __fmal (long double __x, long double __y, long double __z) throw (); +# 382 "/usr/include/bits/mathcalls.h" 3 4 +extern int __issignalingl (long double __value) throw () + __attribute__ ((__const__)); + + + + + + +extern long double scalbl (long double __x, long double __n) throw (); extern long double __scalbl (long double __x, long double __n) throw (); +# 152 "/usr/include/math.h" 2 3 4 +# 168 "/usr/include/math.h" 3 4 +extern int signgam; +# 209 "/usr/include/math.h" 3 4 +enum + { + FP_NAN = + + 0, + FP_INFINITE = + + 1, + FP_ZERO = + + 2, + FP_SUBNORMAL = + + 3, + FP_NORMAL = + + 4 + }; +# 347 "/usr/include/math.h" 3 4 +typedef enum +{ + _IEEE_ = -1, + _SVID_, + _XOPEN_, + _POSIX_, + _ISOC_ +} _LIB_VERSION_TYPE; + + + + +extern _LIB_VERSION_TYPE _LIB_VERSION; +# 370 "/usr/include/math.h" 3 4 +struct __exception + + + + { + int type; + char *name; + double arg1; + double arg2; + double retval; + }; + + +extern int matherr (struct __exception *__exc) throw (); +# 534 "/usr/include/math.h" 3 4 +} +# 46 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 2 3 +# 77 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +extern "C++" +{ +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + inline constexpr double + abs(double __x) + { return __builtin_fabs(__x); } + + + + inline constexpr float + abs(float __x) + { return __builtin_fabsf(__x); } + + inline constexpr long double + abs(long double __x) + { return __builtin_fabsl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + abs(_Tp __x) + { return __builtin_fabs(__x); } + + using ::acos; + + + inline constexpr float + acos(float __x) + { return __builtin_acosf(__x); } + + inline constexpr long double + acos(long double __x) + { return __builtin_acosl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + acos(_Tp __x) + { return __builtin_acos(__x); } + + using ::asin; + + + inline constexpr float + asin(float __x) + { return __builtin_asinf(__x); } + + inline constexpr long double + asin(long double __x) + { return __builtin_asinl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + asin(_Tp __x) + { return __builtin_asin(__x); } + + using ::atan; + + + inline constexpr float + atan(float __x) + { return __builtin_atanf(__x); } + + inline constexpr long double + atan(long double __x) + { return __builtin_atanl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + atan(_Tp __x) + { return __builtin_atan(__x); } + + using ::atan2; + + + inline constexpr float + atan2(float __y, float __x) + { return __builtin_atan2f(__y, __x); } + + inline constexpr long double + atan2(long double __y, long double __x) + { return __builtin_atan2l(__y, __x); } + + + template + inline constexpr + typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + atan2(_Tp __y, _Up __x) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return atan2(__type(__y), __type(__x)); + } + + using ::ceil; + + + inline constexpr float + ceil(float __x) + { return __builtin_ceilf(__x); } + + inline constexpr long double + ceil(long double __x) + { return __builtin_ceill(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + ceil(_Tp __x) + { return __builtin_ceil(__x); } + + using ::cos; + + + inline constexpr float + cos(float __x) + { return __builtin_cosf(__x); } + + inline constexpr long double + cos(long double __x) + { return __builtin_cosl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + cos(_Tp __x) + { return __builtin_cos(__x); } + + using ::cosh; + + + inline constexpr float + cosh(float __x) + { return __builtin_coshf(__x); } + + inline constexpr long double + cosh(long double __x) + { return __builtin_coshl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + cosh(_Tp __x) + { return __builtin_cosh(__x); } + + using ::exp; + + + inline constexpr float + exp(float __x) + { return __builtin_expf(__x); } + + inline constexpr long double + exp(long double __x) + { return __builtin_expl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + exp(_Tp __x) + { return __builtin_exp(__x); } + + using ::fabs; + + + inline constexpr float + fabs(float __x) + { return __builtin_fabsf(__x); } + + inline constexpr long double + fabs(long double __x) + { return __builtin_fabsl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + fabs(_Tp __x) + { return __builtin_fabs(__x); } + + using ::floor; + + + inline constexpr float + floor(float __x) + { return __builtin_floorf(__x); } + + inline constexpr long double + floor(long double __x) + { return __builtin_floorl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + floor(_Tp __x) + { return __builtin_floor(__x); } + + using ::fmod; + + + inline constexpr float + fmod(float __x, float __y) + { return __builtin_fmodf(__x, __y); } + + inline constexpr long double + fmod(long double __x, long double __y) + { return __builtin_fmodl(__x, __y); } + + + template + inline constexpr + typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + fmod(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return fmod(__type(__x), __type(__y)); + } + + using ::frexp; + + + inline float + frexp(float __x, int* __exp) + { return __builtin_frexpf(__x, __exp); } + + inline long double + frexp(long double __x, int* __exp) + { return __builtin_frexpl(__x, __exp); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + frexp(_Tp __x, int* __exp) + { return __builtin_frexp(__x, __exp); } + + using ::ldexp; + + + inline constexpr float + ldexp(float __x, int __exp) + { return __builtin_ldexpf(__x, __exp); } + + inline constexpr long double + ldexp(long double __x, int __exp) + { return __builtin_ldexpl(__x, __exp); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + ldexp(_Tp __x, int __exp) + { return __builtin_ldexp(__x, __exp); } + + using ::log; + + + inline constexpr float + log(float __x) + { return __builtin_logf(__x); } + + inline constexpr long double + log(long double __x) + { return __builtin_logl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + log(_Tp __x) + { return __builtin_log(__x); } + + using ::log10; + + + inline constexpr float + log10(float __x) + { return __builtin_log10f(__x); } + + inline constexpr long double + log10(long double __x) + { return __builtin_log10l(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + log10(_Tp __x) + { return __builtin_log10(__x); } + + using ::modf; + + + inline float + modf(float __x, float* __iptr) + { return __builtin_modff(__x, __iptr); } + + inline long double + modf(long double __x, long double* __iptr) + { return __builtin_modfl(__x, __iptr); } + + + using ::pow; + + + inline constexpr float + pow(float __x, float __y) + { return __builtin_powf(__x, __y); } + + inline constexpr long double + pow(long double __x, long double __y) + { return __builtin_powl(__x, __y); } +# 435 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 + template + inline constexpr + typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + pow(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return pow(__type(__x), __type(__y)); + } + + using ::sin; + + + inline constexpr float + sin(float __x) + { return __builtin_sinf(__x); } + + inline constexpr long double + sin(long double __x) + { return __builtin_sinl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + sin(_Tp __x) + { return __builtin_sin(__x); } + + using ::sinh; + + + inline constexpr float + sinh(float __x) + { return __builtin_sinhf(__x); } + + inline constexpr long double + sinh(long double __x) + { return __builtin_sinhl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + sinh(_Tp __x) + { return __builtin_sinh(__x); } + + using ::sqrt; + + + inline constexpr float + sqrt(float __x) + { return __builtin_sqrtf(__x); } + + inline constexpr long double + sqrt(long double __x) + { return __builtin_sqrtl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + sqrt(_Tp __x) + { return __builtin_sqrt(__x); } + + using ::tan; + + + inline constexpr float + tan(float __x) + { return __builtin_tanf(__x); } + + inline constexpr long double + tan(long double __x) + { return __builtin_tanl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + tan(_Tp __x) + { return __builtin_tan(__x); } + + using ::tanh; + + + inline constexpr float + tanh(float __x) + { return __builtin_tanhf(__x); } + + inline constexpr long double + tanh(long double __x) + { return __builtin_tanhl(__x); } + + + template + inline constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + tanh(_Tp __x) + { return __builtin_tanh(__x); } + + +} +# 559 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + constexpr int + fpclassify(float __x) + { return __builtin_fpclassify(0, 1, 4, + 3, 2, __x); } + + constexpr int + fpclassify(double __x) + { return __builtin_fpclassify(0, 1, 4, + 3, 2, __x); } + + constexpr int + fpclassify(long double __x) + { return __builtin_fpclassify(0, 1, 4, + 3, 2, __x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + int>::__type + fpclassify(_Tp __x) + { return __x != 0 ? 4 : 2; } + + + + constexpr bool + isfinite(float __x) + { return __builtin_isfinite(__x); } + + constexpr bool + isfinite(double __x) + { return __builtin_isfinite(__x); } + + constexpr bool + isfinite(long double __x) + { return __builtin_isfinite(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + bool>::__type + isfinite(_Tp __x) + { return true; } + + + + constexpr bool + isinf(float __x) + { return __builtin_isinf(__x); } + + + + + + constexpr bool + isinf(double __x) + { return __builtin_isinf(__x); } + + + constexpr bool + isinf(long double __x) + { return __builtin_isinf(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + bool>::__type + isinf(_Tp __x) + { return false; } + + + + constexpr bool + isnan(float __x) + { return __builtin_isnan(__x); } + + + + + + constexpr bool + isnan(double __x) + { return __builtin_isnan(__x); } + + + constexpr bool + isnan(long double __x) + { return __builtin_isnan(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + bool>::__type + isnan(_Tp __x) + { return false; } + + + + constexpr bool + isnormal(float __x) + { return __builtin_isnormal(__x); } + + constexpr bool + isnormal(double __x) + { return __builtin_isnormal(__x); } + + constexpr bool + isnormal(long double __x) + { return __builtin_isnormal(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + bool>::__type + isnormal(_Tp __x) + { return __x != 0 ? true : false; } + + + + + constexpr bool + signbit(float __x) + { return __builtin_signbit(__x); } + + constexpr bool + signbit(double __x) + { return __builtin_signbit(__x); } + + constexpr bool + signbit(long double __x) + { return __builtin_signbit(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + bool>::__type + signbit(_Tp __x) + { return __x < 0 ? true : false; } + + + + constexpr bool + isgreater(float __x, float __y) + { return __builtin_isgreater(__x, __y); } + + constexpr bool + isgreater(double __x, double __y) + { return __builtin_isgreater(__x, __y); } + + constexpr bool + isgreater(long double __x, long double __y) + { return __builtin_isgreater(__x, __y); } + + + + template + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + isgreater(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_isgreater(__type(__x), __type(__y)); + } + + + + constexpr bool + isgreaterequal(float __x, float __y) + { return __builtin_isgreaterequal(__x, __y); } + + constexpr bool + isgreaterequal(double __x, double __y) + { return __builtin_isgreaterequal(__x, __y); } + + constexpr bool + isgreaterequal(long double __x, long double __y) + { return __builtin_isgreaterequal(__x, __y); } + + + + template + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + isgreaterequal(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_isgreaterequal(__type(__x), __type(__y)); + } + + + + constexpr bool + isless(float __x, float __y) + { return __builtin_isless(__x, __y); } + + constexpr bool + isless(double __x, double __y) + { return __builtin_isless(__x, __y); } + + constexpr bool + isless(long double __x, long double __y) + { return __builtin_isless(__x, __y); } + + + + template + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + isless(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_isless(__type(__x), __type(__y)); + } + + + + constexpr bool + islessequal(float __x, float __y) + { return __builtin_islessequal(__x, __y); } + + constexpr bool + islessequal(double __x, double __y) + { return __builtin_islessequal(__x, __y); } + + constexpr bool + islessequal(long double __x, long double __y) + { return __builtin_islessequal(__x, __y); } + + + + template + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + islessequal(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_islessequal(__type(__x), __type(__y)); + } + + + + constexpr bool + islessgreater(float __x, float __y) + { return __builtin_islessgreater(__x, __y); } + + constexpr bool + islessgreater(double __x, double __y) + { return __builtin_islessgreater(__x, __y); } + + constexpr bool + islessgreater(long double __x, long double __y) + { return __builtin_islessgreater(__x, __y); } + + + + template + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + islessgreater(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_islessgreater(__type(__x), __type(__y)); + } + + + + constexpr bool + isunordered(float __x, float __y) + { return __builtin_isunordered(__x, __y); } + + constexpr bool + isunordered(double __x, double __y) + { return __builtin_isunordered(__x, __y); } + + constexpr bool + isunordered(long double __x, long double __y) + { return __builtin_isunordered(__x, __y); } + + + + template + constexpr typename + __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value + && __is_arithmetic<_Up>::__value), bool>::__type + isunordered(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return __builtin_isunordered(__type(__x), __type(__y)); + } +# 981 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +} +# 1096 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + using ::double_t; + using ::float_t; + + + using ::acosh; + using ::acoshf; + using ::acoshl; + + using ::asinh; + using ::asinhf; + using ::asinhl; + + using ::atanh; + using ::atanhf; + using ::atanhl; + + using ::cbrt; + using ::cbrtf; + using ::cbrtl; + + using ::copysign; + using ::copysignf; + using ::copysignl; + + using ::erf; + using ::erff; + using ::erfl; + + using ::erfc; + using ::erfcf; + using ::erfcl; + + using ::exp2; + using ::exp2f; + using ::exp2l; + + using ::expm1; + using ::expm1f; + using ::expm1l; + + using ::fdim; + using ::fdimf; + using ::fdiml; + + using ::fma; + using ::fmaf; + using ::fmal; + + using ::fmax; + using ::fmaxf; + using ::fmaxl; + + using ::fmin; + using ::fminf; + using ::fminl; + + using ::hypot; + using ::hypotf; + using ::hypotl; + + using ::ilogb; + using ::ilogbf; + using ::ilogbl; + + using ::lgamma; + using ::lgammaf; + using ::lgammal; + + using ::llrint; + using ::llrintf; + using ::llrintl; + + using ::llround; + using ::llroundf; + using ::llroundl; + + using ::log1p; + using ::log1pf; + using ::log1pl; + + using ::log2; + using ::log2f; + using ::log2l; + + using ::logb; + using ::logbf; + using ::logbl; + + using ::lrint; + using ::lrintf; + using ::lrintl; + + using ::lround; + using ::lroundf; + using ::lroundl; + + using ::nan; + using ::nanf; + using ::nanl; + + using ::nearbyint; + using ::nearbyintf; + using ::nearbyintl; + + using ::nextafter; + using ::nextafterf; + using ::nextafterl; + + using ::nexttoward; + using ::nexttowardf; + using ::nexttowardl; + + using ::remainder; + using ::remainderf; + using ::remainderl; + + using ::remquo; + using ::remquof; + using ::remquol; + + using ::rint; + using ::rintf; + using ::rintl; + + using ::round; + using ::roundf; + using ::roundl; + + using ::scalbln; + using ::scalblnf; + using ::scalblnl; + + using ::scalbn; + using ::scalbnf; + using ::scalbnl; + + using ::tgamma; + using ::tgammaf; + using ::tgammal; + + using ::trunc; + using ::truncf; + using ::truncl; + + + + constexpr float + acosh(float __x) + { return __builtin_acoshf(__x); } + + constexpr long double + acosh(long double __x) + { return __builtin_acoshl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + acosh(_Tp __x) + { return __builtin_acosh(__x); } + + + + constexpr float + asinh(float __x) + { return __builtin_asinhf(__x); } + + constexpr long double + asinh(long double __x) + { return __builtin_asinhl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + asinh(_Tp __x) + { return __builtin_asinh(__x); } + + + + constexpr float + atanh(float __x) + { return __builtin_atanhf(__x); } + + constexpr long double + atanh(long double __x) + { return __builtin_atanhl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + atanh(_Tp __x) + { return __builtin_atanh(__x); } + + + + constexpr float + cbrt(float __x) + { return __builtin_cbrtf(__x); } + + constexpr long double + cbrt(long double __x) + { return __builtin_cbrtl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + cbrt(_Tp __x) + { return __builtin_cbrt(__x); } + + + + constexpr float + copysign(float __x, float __y) + { return __builtin_copysignf(__x, __y); } + + constexpr long double + copysign(long double __x, long double __y) + { return __builtin_copysignl(__x, __y); } + + + + template + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + copysign(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return copysign(__type(__x), __type(__y)); + } + + + + constexpr float + erf(float __x) + { return __builtin_erff(__x); } + + constexpr long double + erf(long double __x) + { return __builtin_erfl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + erf(_Tp __x) + { return __builtin_erf(__x); } + + + + constexpr float + erfc(float __x) + { return __builtin_erfcf(__x); } + + constexpr long double + erfc(long double __x) + { return __builtin_erfcl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + erfc(_Tp __x) + { return __builtin_erfc(__x); } + + + + constexpr float + exp2(float __x) + { return __builtin_exp2f(__x); } + + constexpr long double + exp2(long double __x) + { return __builtin_exp2l(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + exp2(_Tp __x) + { return __builtin_exp2(__x); } + + + + constexpr float + expm1(float __x) + { return __builtin_expm1f(__x); } + + constexpr long double + expm1(long double __x) + { return __builtin_expm1l(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + expm1(_Tp __x) + { return __builtin_expm1(__x); } + + + + constexpr float + fdim(float __x, float __y) + { return __builtin_fdimf(__x, __y); } + + constexpr long double + fdim(long double __x, long double __y) + { return __builtin_fdiml(__x, __y); } + + + + template + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + fdim(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return fdim(__type(__x), __type(__y)); + } + + + + constexpr float + fma(float __x, float __y, float __z) + { return __builtin_fmaf(__x, __y, __z); } + + constexpr long double + fma(long double __x, long double __y, long double __z) + { return __builtin_fmal(__x, __y, __z); } + + + + template + constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type + fma(_Tp __x, _Up __y, _Vp __z) + { + typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type; + return fma(__type(__x), __type(__y), __type(__z)); + } + + + + constexpr float + fmax(float __x, float __y) + { return __builtin_fmaxf(__x, __y); } + + constexpr long double + fmax(long double __x, long double __y) + { return __builtin_fmaxl(__x, __y); } + + + + template + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + fmax(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return fmax(__type(__x), __type(__y)); + } + + + + constexpr float + fmin(float __x, float __y) + { return __builtin_fminf(__x, __y); } + + constexpr long double + fmin(long double __x, long double __y) + { return __builtin_fminl(__x, __y); } + + + + template + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + fmin(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return fmin(__type(__x), __type(__y)); + } + + + + constexpr float + hypot(float __x, float __y) + { return __builtin_hypotf(__x, __y); } + + constexpr long double + hypot(long double __x, long double __y) + { return __builtin_hypotl(__x, __y); } + + + + template + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + hypot(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return hypot(__type(__x), __type(__y)); + } + + + + constexpr int + ilogb(float __x) + { return __builtin_ilogbf(__x); } + + constexpr int + ilogb(long double __x) + { return __builtin_ilogbl(__x); } + + + + template + constexpr + typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + int>::__type + ilogb(_Tp __x) + { return __builtin_ilogb(__x); } + + + + constexpr float + lgamma(float __x) + { return __builtin_lgammaf(__x); } + + constexpr long double + lgamma(long double __x) + { return __builtin_lgammal(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + lgamma(_Tp __x) + { return __builtin_lgamma(__x); } + + + + constexpr long long + llrint(float __x) + { return __builtin_llrintf(__x); } + + constexpr long long + llrint(long double __x) + { return __builtin_llrintl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + long long>::__type + llrint(_Tp __x) + { return __builtin_llrint(__x); } + + + + constexpr long long + llround(float __x) + { return __builtin_llroundf(__x); } + + constexpr long long + llround(long double __x) + { return __builtin_llroundl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + long long>::__type + llround(_Tp __x) + { return __builtin_llround(__x); } + + + + constexpr float + log1p(float __x) + { return __builtin_log1pf(__x); } + + constexpr long double + log1p(long double __x) + { return __builtin_log1pl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + log1p(_Tp __x) + { return __builtin_log1p(__x); } + + + + + constexpr float + log2(float __x) + { return __builtin_log2f(__x); } + + constexpr long double + log2(long double __x) + { return __builtin_log2l(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + log2(_Tp __x) + { return __builtin_log2(__x); } + + + + constexpr float + logb(float __x) + { return __builtin_logbf(__x); } + + constexpr long double + logb(long double __x) + { return __builtin_logbl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + logb(_Tp __x) + { return __builtin_logb(__x); } + + + + constexpr long + lrint(float __x) + { return __builtin_lrintf(__x); } + + constexpr long + lrint(long double __x) + { return __builtin_lrintl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + long>::__type + lrint(_Tp __x) + { return __builtin_lrint(__x); } + + + + constexpr long + lround(float __x) + { return __builtin_lroundf(__x); } + + constexpr long + lround(long double __x) + { return __builtin_lroundl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + long>::__type + lround(_Tp __x) + { return __builtin_lround(__x); } + + + + constexpr float + nearbyint(float __x) + { return __builtin_nearbyintf(__x); } + + constexpr long double + nearbyint(long double __x) + { return __builtin_nearbyintl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + nearbyint(_Tp __x) + { return __builtin_nearbyint(__x); } + + + + constexpr float + nextafter(float __x, float __y) + { return __builtin_nextafterf(__x, __y); } + + constexpr long double + nextafter(long double __x, long double __y) + { return __builtin_nextafterl(__x, __y); } + + + + template + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + nextafter(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return nextafter(__type(__x), __type(__y)); + } + + + + constexpr float + nexttoward(float __x, long double __y) + { return __builtin_nexttowardf(__x, __y); } + + constexpr long double + nexttoward(long double __x, long double __y) + { return __builtin_nexttowardl(__x, __y); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + nexttoward(_Tp __x, long double __y) + { return __builtin_nexttoward(__x, __y); } + + + + constexpr float + remainder(float __x, float __y) + { return __builtin_remainderf(__x, __y); } + + constexpr long double + remainder(long double __x, long double __y) + { return __builtin_remainderl(__x, __y); } + + + + template + constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + remainder(_Tp __x, _Up __y) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return remainder(__type(__x), __type(__y)); + } + + + + inline float + remquo(float __x, float __y, int* __pquo) + { return __builtin_remquof(__x, __y, __pquo); } + + inline long double + remquo(long double __x, long double __y, int* __pquo) + { return __builtin_remquol(__x, __y, __pquo); } + + + + template + inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type + remquo(_Tp __x, _Up __y, int* __pquo) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return remquo(__type(__x), __type(__y), __pquo); + } + + + + constexpr float + rint(float __x) + { return __builtin_rintf(__x); } + + constexpr long double + rint(long double __x) + { return __builtin_rintl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + rint(_Tp __x) + { return __builtin_rint(__x); } + + + + constexpr float + round(float __x) + { return __builtin_roundf(__x); } + + constexpr long double + round(long double __x) + { return __builtin_roundl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + round(_Tp __x) + { return __builtin_round(__x); } + + + + constexpr float + scalbln(float __x, long __ex) + { return __builtin_scalblnf(__x, __ex); } + + constexpr long double + scalbln(long double __x, long __ex) + { return __builtin_scalblnl(__x, __ex); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + scalbln(_Tp __x, long __ex) + { return __builtin_scalbln(__x, __ex); } + + + + constexpr float + scalbn(float __x, int __ex) + { return __builtin_scalbnf(__x, __ex); } + + constexpr long double + scalbn(long double __x, int __ex) + { return __builtin_scalbnl(__x, __ex); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + scalbn(_Tp __x, int __ex) + { return __builtin_scalbn(__x, __ex); } + + + + constexpr float + tgamma(float __x) + { return __builtin_tgammaf(__x); } + + constexpr long double + tgamma(long double __x) + { return __builtin_tgammal(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + tgamma(_Tp __x) + { return __builtin_tgamma(__x); } + + + + constexpr float + trunc(float __x) + { return __builtin_truncf(__x); } + + constexpr long double + trunc(long double __x) + { return __builtin_truncl(__x); } + + + + template + constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, + double>::__type + trunc(_Tp __x) + { return __builtin_trunc(__x); } + + + +} +# 1889 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3 +} +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" 2 + + + +namespace mozilla { + + +template +__attribute__((always_inline)) inline IntegerType +EuclidGCD(IntegerType aA, IntegerType aB) +{ + + + do { } while (0); + do { } while (0); + + while (aA != aB) { + if (aA > aB) { + aA = aA - aB; + } else { + aB = aB - aA; + } + } + + return aA; +} + + +template +__attribute__((always_inline)) inline IntegerType +EuclidLCM(IntegerType aA, IntegerType aB) +{ + + return (aA / EuclidGCD(aA, aB)) * aB; +} + +namespace detail { + +template +struct AllowDeprecatedAbsFixed : FalseType {}; + +template<> struct AllowDeprecatedAbsFixed : TrueType {}; +template<> struct AllowDeprecatedAbsFixed : TrueType {}; + +template +struct AllowDeprecatedAbs : AllowDeprecatedAbsFixed {}; + +template<> struct AllowDeprecatedAbs : TrueType {}; +template<> struct AllowDeprecatedAbs : TrueType {}; + +} + + + +template +inline typename mozilla::EnableIf::value, T>::Type +DeprecatedAbs(const T aValue) +{ +# 82 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" + do { } while (0); + + + return aValue >= 0 ? aValue : -aValue; +} + +namespace detail { + + + + + +template +struct AbsReturnTypeFixed; + +template<> struct AbsReturnTypeFixed { typedef uint8_t Type; }; +template<> struct AbsReturnTypeFixed { typedef uint16_t Type; }; +template<> struct AbsReturnTypeFixed { typedef uint32_t Type; }; +template<> struct AbsReturnTypeFixed { typedef uint64_t Type; }; + +template +struct AbsReturnType : AbsReturnTypeFixed {}; + +template<> struct AbsReturnType : + EnableIf {}; +template<> struct AbsReturnType { typedef unsigned char Type; }; +template<> struct AbsReturnType { typedef unsigned short Type; }; +template<> struct AbsReturnType { typedef unsigned int Type; }; +template<> struct AbsReturnType { typedef unsigned long Type; }; +template<> struct AbsReturnType { typedef unsigned long long Type; }; +template<> struct AbsReturnType { typedef float Type; }; +template<> struct AbsReturnType { typedef double Type; }; +template<> struct AbsReturnType { typedef long double Type; }; + +} + +template +inline typename detail::AbsReturnType::Type +Abs(const T aValue) +{ + typedef typename detail::AbsReturnType::Type ReturnType; + return aValue >= 0 ? ReturnType(aValue) : ~ReturnType(aValue) + 1; +} + +template<> +inline float +Abs(const float aFloat) +{ + return std::fabs(aFloat); +} + +template<> +inline double +Abs(const double aDouble) +{ + return std::fabs(aDouble); +} + +template<> +inline long double +Abs(const long double aLongDouble) +{ + return std::fabs(aLongDouble); +} + +} +# 163 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" +namespace mozilla { + +namespace detail { +# 250 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" +inline uint_fast8_t +CountLeadingZeroes32(uint32_t aValue) +{ + return __builtin_clz(aValue); +} + +inline uint_fast8_t +CountTrailingZeroes32(uint32_t aValue) +{ + return __builtin_ctz(aValue); +} + +inline uint_fast8_t +CountPopulation32(uint32_t aValue) +{ + return __builtin_popcount(aValue); +} + +inline uint_fast8_t +CountPopulation64(uint64_t aValue) +{ + return __builtin_popcountll(aValue); +} + +inline uint_fast8_t +CountLeadingZeroes64(uint64_t aValue) +{ + return __builtin_clzll(aValue); +} + +inline uint_fast8_t +CountTrailingZeroes64(uint64_t aValue) +{ + return __builtin_ctzll(aValue); +} +# 296 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" +} +# 309 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" +inline uint_fast8_t +CountLeadingZeroes32(uint32_t aValue) +{ + do { } while (0); + return detail::CountLeadingZeroes32(aValue); +} +# 327 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" +inline uint_fast8_t +CountTrailingZeroes32(uint32_t aValue) +{ + do { } while (0); + return detail::CountTrailingZeroes32(aValue); +} + + + + +inline uint_fast8_t +CountPopulation32(uint32_t aValue) +{ + return detail::CountPopulation32(aValue); +} + + +inline uint_fast8_t +CountPopulation64(uint64_t aValue) +{ + return detail::CountPopulation64(aValue); +} + + +inline uint_fast8_t +CountLeadingZeroes64(uint64_t aValue) +{ + do { } while (0); + return detail::CountLeadingZeroes64(aValue); +} + + +inline uint_fast8_t +CountTrailingZeroes64(uint64_t aValue) +{ + do { } while (0); + return detail::CountTrailingZeroes64(aValue); +} + +namespace detail { + +template +class CeilingLog2; + +template +class CeilingLog2 +{ +public: + static uint_fast8_t compute(const T aValue) + { + + return aValue <= 1 ? 0u : 32u - CountLeadingZeroes32(aValue - 1); + } +}; + +template +class CeilingLog2 +{ +public: + static uint_fast8_t compute(const T aValue) + { + + return aValue <= 1 ? 0u : 64u - CountLeadingZeroes64(aValue - 1); + } +}; + +} +# 404 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" +template +inline uint_fast8_t +CeilingLog2(const T aValue) +{ + return detail::CeilingLog2::compute(aValue); +} + + +inline uint_fast8_t +CeilingLog2Size(size_t aValue) +{ + return CeilingLog2(aValue); +} + +namespace detail { + +template +class FloorLog2; + +template +class FloorLog2 +{ +public: + static uint_fast8_t compute(const T aValue) + { + return 31u - CountLeadingZeroes32(aValue | 1); + } +}; + +template +class FloorLog2 +{ +public: + static uint_fast8_t compute(const T aValue) + { + return 63u - CountLeadingZeroes64(aValue | 1); + } +}; + +} +# 453 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" +template +inline uint_fast8_t +FloorLog2(const T aValue) +{ + return detail::FloorLog2::compute(aValue); +} + + +inline uint_fast8_t +FloorLog2Size(size_t aValue) +{ + return FloorLog2(aValue); +} + + + + + +inline size_t +RoundUpPow2(size_t aValue) +{ + do { } while (0); + + return size_t(1) << CeilingLog2(aValue); +} + + + + +template +inline T +RotateLeft(const T aValue, uint_fast8_t aShift) +{ + do { } while (0); + do { } while (0); + + + + + static_assert(IsUnsigned::value, "Rotates require unsigned values"); + return (aValue << aShift) | (aValue >> (sizeof(T) * 8 - aShift)); +} + + + + +template +inline T +RotateRight(const T aValue, uint_fast8_t aShift) +{ + do { } while (0); + do { } while (0); + + + + + static_assert(IsUnsigned::value, "Rotates require unsigned values"); + return (aValue >> aShift) | (aValue << (sizeof(T) * 8 - aShift)); +} + + + + + +template +constexpr bool +IsPowerOfTwo(T x) +{ + static_assert(IsUnsigned::value, + "IsPowerOfTwo requires unsigned values"); + return x && (x & (x - 1)) == 0; +} + +template +inline T +Clamp(const T aValue, const T aMin, const T aMax) +{ + static_assert(IsIntegral::value, + "Clamp accepts only integral types, so that it doesn't have" + " to distinguish differently-signed zeroes (which users may" + " or may not care to distinguish, likely at a perf cost) or" + " to decide how to clamp NaN or a range with a NaN" + " endpoint."); + do { } while (0); + + if (aValue <= aMin) + return aMin; + if (aValue >= aMax) + return aMax; + return aValue; +} + +} +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MemoryReporting.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MemoryReporting.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MemoryReporting.h" 2 + + + +namespace mozilla { + + + + + +typedef size_t (*MallocSizeOf)(const void* p); + +} + + + +typedef size_t (*MozMallocSizeOf)(const void* p); +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ReverseIterator.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ReverseIterator.h" +namespace mozilla { + +template +class ReverseIterator +{ +public: + template + explicit ReverseIterator(Iterator aIter) + : mCurrent(aIter) { } + + template + ReverseIterator(const ReverseIterator& aOther) + : mCurrent(aOther.mCurrent) { } + + decltype(*DeclVal()) operator*() const + { + IteratorT tmp = mCurrent; + return *--tmp; + } + + + + ReverseIterator& operator++() { --mCurrent; return *this; } + ReverseIterator& operator--() { ++mCurrent; return *this; } + ReverseIterator operator++(int) { auto ret = *this; mCurrent--; return ret; } + ReverseIterator operator--(int) { auto ret = *this; mCurrent++; return ret; } + + + + template + friend bool operator==(const ReverseIterator& aIter1, + const ReverseIterator& aIter2); + template + friend bool operator!=(const ReverseIterator& aIter1, + const ReverseIterator& aIter2); + template + friend bool operator<(const ReverseIterator& aIter1, + const ReverseIterator& aIter2); + template + friend bool operator<=(const ReverseIterator& aIter1, + const ReverseIterator& aIter2); + template + friend bool operator>(const ReverseIterator& aIter1, + const ReverseIterator& aIter2); + template + friend bool operator>=(const ReverseIterator& aIter1, + const ReverseIterator& aIter2); + +private: + IteratorT mCurrent; +}; + +template +bool +operator==(const ReverseIterator& aIter1, + const ReverseIterator& aIter2) +{ + return aIter1.mCurrent == aIter2.mCurrent; +} + +template +bool +operator!=(const ReverseIterator& aIter1, + const ReverseIterator& aIter2) +{ + return aIter1.mCurrent != aIter2.mCurrent; +} + +template +bool +operator<(const ReverseIterator& aIter1, + const ReverseIterator& aIter2) +{ + return aIter1.mCurrent > aIter2.mCurrent; +} + +template +bool +operator<=(const ReverseIterator& aIter1, + const ReverseIterator& aIter2) +{ + return aIter1.mCurrent >= aIter2.mCurrent; +} + +template +bool +operator>(const ReverseIterator& aIter1, + const ReverseIterator& aIter2) +{ + return aIter1.mCurrent < aIter2.mCurrent; +} + +template +bool +operator>=(const ReverseIterator& aIter1, + const ReverseIterator& aIter2) +{ + return aIter1.mCurrent <= aIter2.mCurrent; +} + +namespace detail { + +template +class IteratorRange +{ +public: + typedef IteratorT iterator; + typedef IteratorT const_iterator; + typedef ReverseIterator reverse_iterator; + typedef ReverseIterator const_reverse_iterator; + + template + IteratorRange(Iterator1 aIterBegin, Iterator2 aIterEnd) + : mIterBegin(aIterBegin), mIterEnd(aIterEnd) { } + + template + IteratorRange(const IteratorRange& aOther) + : mIterBegin(aOther.mIterBegin), mIterEnd(aOther.mIterEnd) { } + + iterator begin() const { return mIterBegin; } + const_iterator cbegin() const { return begin(); } + iterator end() const { return mIterEnd; } + const_iterator cend() const { return end(); } + reverse_iterator rbegin() const { return reverse_iterator(mIterEnd); } + const_reverse_iterator crbegin() const { return rbegin(); } + reverse_iterator rend() const { return reverse_iterator(mIterBegin); } + const_reverse_iterator crend() const { return rend(); } + +private: + IteratorT mIterBegin; + IteratorT mIterEnd; +}; + +} + +template +detail::IteratorRange +Reversed(Range& aRange) +{ + return {aRange.rbegin(), aRange.rend()}; +} + +template +detail::IteratorRange +Reversed(const Range& aRange) +{ + return {aRange.rbegin(), aRange.rend()}; +} + +} +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" 1 +# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Array.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Array.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Array.h" 2 + +namespace mozilla { + +template +class Array +{ + T mArr[Length]; + +public: + Array() {} + + template + Array(Args&&... aArgs) + : mArr{mozilla::Forward(aArgs)...} + { + static_assert(sizeof...(aArgs) == Length, + "The number of arguments should be equal to the template parameter Length"); + } + + T& operator[](size_t aIndex) + { + do { } while (0); + return mArr[aIndex]; + } + + const T& operator[](size_t aIndex) const + { + do { } while (0); + return mArr[aIndex]; + } + + bool operator==(const Array& aOther) const + { + for (size_t i = 0; i < Length; i++) { + if (mArr[i] != aOther[i]) { + return false; + } + } + return true; + } + + typedef T* iterator; + typedef const T* const_iterator; + typedef ReverseIterator reverse_iterator; + typedef ReverseIterator const_reverse_iterator; + + + iterator begin() { return mArr; } + const_iterator begin() const { return mArr; } + const_iterator cbegin() const { return begin(); } + iterator end() { return mArr + Length; } + const_iterator end() const { return mArr + Length; } + const_iterator cend() const { return end(); } + + + reverse_iterator rbegin() { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + const_reverse_iterator crbegin() const { return rbegin(); } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } + const_reverse_iterator crend() const { return rend(); } +}; + +template +class Array +{ +public: + T& operator[](size_t aIndex) + { + do { AnnotateMozCrashReason("MOZ_CRASH(" "indexing into zero-length array" ")"); do { *((volatile int*) __null) = 87; ::abort(); } while (0); } while (0); + } + + const T& operator[](size_t aIndex) const + { + do { AnnotateMozCrashReason("MOZ_CRASH(" "indexing into zero-length array" ")"); do { *((volatile int*) __null) = 92; ::abort(); } while (0); } while (0); + } +}; + +} +# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Casting.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Casting.h" +namespace mozilla { +# 40 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Casting.h" +template +inline void +BitwiseCast(const From aFrom, To* aResult) +{ + static_assert(sizeof(From) == sizeof(To), + "To and From must have the same size"); + union + { + From mFrom; + To mTo; + } u; + u.mFrom = aFrom; + *aResult = u.mTo; +} + +template +inline To +BitwiseCast(const From aFrom) +{ + To temp; + BitwiseCast(aFrom, &temp); + return temp; +} + +namespace detail { + +enum ToSignedness { ToIsSigned, ToIsUnsigned }; +enum FromSignedness { FromIsSigned, FromIsUnsigned }; + +template::value ? FromIsSigned : FromIsUnsigned, + ToSignedness = IsSigned::value ? ToIsSigned : ToIsUnsigned> +struct BoundsCheckImpl; + + + + + + +enum UUComparison { FromIsBigger, FromIsNotBigger }; + + + +template sizeof(To)) + ? FromIsBigger + : FromIsNotBigger> +struct UnsignedUnsignedCheck; + +template +struct UnsignedUnsignedCheck +{ +public: + static bool checkBounds(const From aFrom) + { + return aFrom <= From(To(-1)); + } +}; + +template +struct UnsignedUnsignedCheck +{ +public: + static bool checkBounds(const From aFrom) + { + return true; + } +}; + +template +struct BoundsCheckImpl +{ +public: + static bool checkBounds(const From aFrom) + { + return UnsignedUnsignedCheck::checkBounds(aFrom); + } +}; + + + +template +struct BoundsCheckImpl +{ +public: + static bool checkBounds(const From aFrom) + { + if (aFrom < 0) { + return false; + } + if (sizeof(To) >= sizeof(From)) { + return true; + } + return aFrom <= From(To(-1)); + } +}; + + + +enum USComparison { FromIsSmaller, FromIsNotSmaller }; + +template +struct UnsignedSignedCheck; + +template +struct UnsignedSignedCheck +{ +public: + static bool checkBounds(const From aFrom) + { + return true; + } +}; + +template +struct UnsignedSignedCheck +{ +public: + static bool checkBounds(const From aFrom) + { + const To MaxValue = To((1ULL << (8 * sizeof(To) - 1)) - 1); + return aFrom <= From(MaxValue); + } +}; + +template +struct BoundsCheckImpl +{ +public: + static bool checkBounds(const From aFrom) + { + return UnsignedSignedCheck::checkBounds(aFrom); + } +}; + + + +template +struct BoundsCheckImpl +{ +public: + static bool checkBounds(const From aFrom) + { + if (sizeof(From) <= sizeof(To)) { + return true; + } + const To MaxValue = To((1ULL << (8 * sizeof(To) - 1)) - 1); + const To MinValue = -MaxValue - To(1); + return From(MinValue) <= aFrom && + From(aFrom) <= From(MaxValue); + } +}; + +template::value && + IsIntegral::value> +class BoundsChecker; + +template +class BoundsChecker +{ +public: + static bool checkBounds(const From aFrom) { return true; } +}; + +template +class BoundsChecker +{ +public: + static bool checkBounds(const From aFrom) + { + return BoundsCheckImpl::checkBounds(aFrom); + } +}; + +template +inline bool +IsInBounds(const From aFrom) +{ + return BoundsChecker::checkBounds(aFrom); +} + +} + + + + + + +template +inline To +AssertedCast(const From aFrom) +{ + do { } while (0); + return static_cast(aFrom); +} + + + + + + +template +inline To +ReleaseAssertedCast(const From aFrom) +{ + do { static_assert(mozilla::detail::AssertionConditionType(aFrom)))>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!((detail::IsInBounds(aFrom))))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "(detail::IsInBounds(aFrom))" ")"); do { *((volatile int*) __null) = 250; ::abort(); } while (0); } } while (0); + return static_cast(aFrom); +} + +} +# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" 2 + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/algorithm" 1 3 +# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/algorithm" 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/utility" 1 3 +# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/utility" 3 +# 69 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/utility" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 1 3 +# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + namespace rel_ops + { +# 85 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 3 + template + inline bool + operator!=(const _Tp& __x, const _Tp& __y) + { return !(__x == __y); } +# 98 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 3 + template + inline bool + operator>(const _Tp& __x, const _Tp& __y) + { return __y < __x; } +# 111 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 3 + template + inline bool + operator<=(const _Tp& __x, const _Tp& __y) + { return !(__y < __x); } +# 124 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 3 + template + inline bool + operator>=(const _Tp& __x, const _Tp& __y) + { return !(__x < __y); } + + + } + +} +# 70 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/utility" 2 3 + + + + + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + template + struct tuple_size; + + + + template + struct tuple_size + : integral_constant::value> { }; + + template + struct tuple_size + : integral_constant::value> { }; + + template + struct tuple_size + : integral_constant::value> { }; + + + template + struct tuple_element; + + + template + using __tuple_element_t = typename tuple_element<__i, _Tp>::type; + + template + struct tuple_element<__i, const _Tp> + { + typedef typename add_const<__tuple_element_t<__i, _Tp>>::type type; + }; + + template + struct tuple_element<__i, volatile _Tp> + { + typedef typename add_volatile<__tuple_element_t<__i, _Tp>>::type type; + }; + + template + struct tuple_element<__i, const volatile _Tp> + { + typedef typename add_cv<__tuple_element_t<__i, _Tp>>::type type; + }; + + + + + template + using tuple_element_t = typename tuple_element<__i, _Tp>::type; + + + template + struct __is_tuple_like_impl : false_type + { }; + + + + + template + struct __is_tuple_like_impl> : true_type + { }; + + + template + struct tuple_size> + : public integral_constant { }; + + + template + struct tuple_element<0, std::pair<_Tp1, _Tp2>> + { typedef _Tp1 type; }; + + + template + struct tuple_element<1, std::pair<_Tp1, _Tp2>> + { typedef _Tp2 type; }; + + template + struct __pair_get; + + template<> + struct __pair_get<0> + { + template + static constexpr _Tp1& + __get(std::pair<_Tp1, _Tp2>& __pair) noexcept + { return __pair.first; } + + template + static constexpr _Tp1&& + __move_get(std::pair<_Tp1, _Tp2>&& __pair) noexcept + { return std::forward<_Tp1>(__pair.first); } + + template + static constexpr const _Tp1& + __const_get(const std::pair<_Tp1, _Tp2>& __pair) noexcept + { return __pair.first; } + }; + + template<> + struct __pair_get<1> + { + template + static constexpr _Tp2& + __get(std::pair<_Tp1, _Tp2>& __pair) noexcept + { return __pair.second; } + + template + static constexpr _Tp2&& + __move_get(std::pair<_Tp1, _Tp2>&& __pair) noexcept + { return std::forward<_Tp2>(__pair.second); } + + template + static constexpr const _Tp2& + __const_get(const std::pair<_Tp1, _Tp2>& __pair) noexcept + { return __pair.second; } + }; + + template + constexpr typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type& + get(std::pair<_Tp1, _Tp2>& __in) noexcept + { return __pair_get<_Int>::__get(__in); } + + template + constexpr typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&& + get(std::pair<_Tp1, _Tp2>&& __in) noexcept + { return __pair_get<_Int>::__move_get(std::move(__in)); } + + template + constexpr const typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type& + get(const std::pair<_Tp1, _Tp2>& __in) noexcept + { return __pair_get<_Int>::__const_get(__in); } + + + + + + template + constexpr _Tp& + get(pair<_Tp, _Up>& __p) noexcept + { return __p.first; } + + template + constexpr const _Tp& + get(const pair<_Tp, _Up>& __p) noexcept + { return __p.first; } + + template + constexpr _Tp&& + get(pair<_Tp, _Up>&& __p) noexcept + { return std::move(__p.first); } + + template + constexpr _Tp& + get(pair<_Up, _Tp>& __p) noexcept + { return __p.second; } + + template + constexpr const _Tp& + get(const pair<_Up, _Tp>& __p) noexcept + { return __p.second; } + + template + constexpr _Tp&& + get(pair<_Up, _Tp>&& __p) noexcept + { return std::move(__p.second); } + + + + + template + inline _Tp + exchange(_Tp& __obj, _Up&& __new_val) + { return std::__exchange(__obj, std::forward<_Up>(__new_val)); } + + + + + template struct _Index_tuple { }; + + + template struct _Itup_cat; + + template + struct _Itup_cat<_Index_tuple<_Ind1...>, _Index_tuple<_Ind2...>> + { + using __type = _Index_tuple<_Ind1..., (_Ind2 + sizeof...(_Ind1))...>; + }; + + + template + struct _Build_index_tuple + : _Itup_cat::__type, + typename _Build_index_tuple<_Num - _Num / 2>::__type> + { }; + + template<> + struct _Build_index_tuple<1> + { + typedef _Index_tuple<0> __type; + }; + + template<> + struct _Build_index_tuple<0> + { + typedef _Index_tuple<> __type; + }; + + + + + + + template + struct integer_sequence + { + typedef _Tp value_type; + static constexpr size_t size() { return sizeof...(_Idx); } + }; + + template::__type> + struct _Make_integer_sequence; + + template + struct _Make_integer_sequence<_Tp, _Num, _Index_tuple<_Idx...>> + { + static_assert( _Num >= 0, + "Cannot make integer sequence of negative length" ); + + typedef integer_sequence<_Tp, static_cast<_Tp>(_Idx)...> __type; + }; + + + template + using make_integer_sequence + = typename _Make_integer_sequence<_Tp, _Num>::__type; + + + template + using index_sequence = integer_sequence; + + + template + using make_index_sequence = make_integer_sequence; + + + template + using index_sequence_for = make_index_sequence; + + + +} +# 61 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/algorithm" 2 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 1 3 +# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3 +# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/algorithmfwd.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/algorithmfwd.h" 3 + + + + + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 194 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/algorithmfwd.h" 3 + template + bool + all_of(_IIter, _IIter, _Predicate); + + template + bool + any_of(_IIter, _IIter, _Predicate); + + + template + bool + binary_search(_FIter, _FIter, const _Tp&); + + template + bool + binary_search(_FIter, _FIter, const _Tp&, _Compare); + + template + _OIter + copy(_IIter, _IIter, _OIter); + + template + _BIter2 + copy_backward(_BIter1, _BIter1, _BIter2); + + + template + _OIter + copy_if(_IIter, _IIter, _OIter, _Predicate); + + template + _OIter + copy_n(_IIter, _Size, _OIter); + + + + + + template + pair<_FIter, _FIter> + equal_range(_FIter, _FIter, const _Tp&); + + template + pair<_FIter, _FIter> + equal_range(_FIter, _FIter, const _Tp&, _Compare); + + template + void + fill(_FIter, _FIter, const _Tp&); + + template + _OIter + fill_n(_OIter, _Size, const _Tp&); + + + + template + _FIter1 + find_end(_FIter1, _FIter1, _FIter2, _FIter2); + + template + _FIter1 + find_end(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate); + + + + + + template + _IIter + find_if_not(_IIter, _IIter, _Predicate); + + + + + + + template + bool + includes(_IIter1, _IIter1, _IIter2, _IIter2); + + template + bool + includes(_IIter1, _IIter1, _IIter2, _IIter2, _Compare); + + template + void + inplace_merge(_BIter, _BIter, _BIter); + + template + void + inplace_merge(_BIter, _BIter, _BIter, _Compare); + + + template + bool + is_heap(_RAIter, _RAIter); + + template + bool + is_heap(_RAIter, _RAIter, _Compare); + + template + _RAIter + is_heap_until(_RAIter, _RAIter); + + template + _RAIter + is_heap_until(_RAIter, _RAIter, _Compare); + + template + bool + is_partitioned(_IIter, _IIter, _Predicate); + + template + bool + is_permutation(_FIter1, _FIter1, _FIter2); + + template + bool + is_permutation(_FIter1, _FIter1, _FIter2, _BinaryPredicate); + + template + bool + is_sorted(_FIter, _FIter); + + template + bool + is_sorted(_FIter, _FIter, _Compare); + + template + _FIter + is_sorted_until(_FIter, _FIter); + + template + _FIter + is_sorted_until(_FIter, _FIter, _Compare); + + + template + void + iter_swap(_FIter1, _FIter2); + + template + _FIter + lower_bound(_FIter, _FIter, const _Tp&); + + template + _FIter + lower_bound(_FIter, _FIter, const _Tp&, _Compare); + + template + void + make_heap(_RAIter, _RAIter); + + template + void + make_heap(_RAIter, _RAIter, _Compare); + + template + constexpr + const _Tp& + max(const _Tp&, const _Tp&); + + template + constexpr + const _Tp& + max(const _Tp&, const _Tp&, _Compare); + + + + + template + constexpr + const _Tp& + min(const _Tp&, const _Tp&); + + template + constexpr + const _Tp& + min(const _Tp&, const _Tp&, _Compare); + + + + + template + constexpr + pair + minmax(const _Tp&, const _Tp&); + + template + constexpr + pair + minmax(const _Tp&, const _Tp&, _Compare); + + template + constexpr + pair<_FIter, _FIter> + minmax_element(_FIter, _FIter); + + template + constexpr + pair<_FIter, _FIter> + minmax_element(_FIter, _FIter, _Compare); + + template + constexpr + _Tp + min(initializer_list<_Tp>); + + template + constexpr + _Tp + min(initializer_list<_Tp>, _Compare); + + template + constexpr + _Tp + max(initializer_list<_Tp>); + + template + constexpr + _Tp + max(initializer_list<_Tp>, _Compare); + + template + constexpr + pair<_Tp, _Tp> + minmax(initializer_list<_Tp>); + + template + constexpr + pair<_Tp, _Tp> + minmax(initializer_list<_Tp>, _Compare); + + + + + template + bool + next_permutation(_BIter, _BIter); + + template + bool + next_permutation(_BIter, _BIter, _Compare); + + + template + bool + none_of(_IIter, _IIter, _Predicate); + + + + + + template + _RAIter + partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter); + + template + _RAIter + partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare); + + + + + template + pair<_OIter1, _OIter2> + partition_copy(_IIter, _IIter, _OIter1, _OIter2, _Predicate); + + template + _FIter + partition_point(_FIter, _FIter, _Predicate); + + + template + void + pop_heap(_RAIter, _RAIter); + + template + void + pop_heap(_RAIter, _RAIter, _Compare); + + template + bool + prev_permutation(_BIter, _BIter); + + template + bool + prev_permutation(_BIter, _BIter, _Compare); + + template + void + push_heap(_RAIter, _RAIter); + + template + void + push_heap(_RAIter, _RAIter, _Compare); + + + + template + _FIter + remove(_FIter, _FIter, const _Tp&); + + template + _FIter + remove_if(_FIter, _FIter, _Predicate); + + template + _OIter + remove_copy(_IIter, _IIter, _OIter, const _Tp&); + + template + _OIter + remove_copy_if(_IIter, _IIter, _OIter, _Predicate); + + + + template + _OIter + replace_copy(_IIter, _IIter, _OIter, const _Tp&, const _Tp&); + + template + _OIter + replace_copy_if(_Iter, _Iter, _OIter, _Predicate, const _Tp&); + + + + template + void + reverse(_BIter, _BIter); + + template + _OIter + reverse_copy(_BIter, _BIter, _OIter); + + inline namespace _V2 + { + template + _FIter + rotate(_FIter, _FIter, _FIter); + } + + template + _OIter + rotate_copy(_FIter, _FIter, _FIter, _OIter); +# 552 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/algorithmfwd.h" 3 + template + void + shuffle(_RAIter, _RAIter, _UGenerator&&); + + + template + void + sort_heap(_RAIter, _RAIter); + + template + void + sort_heap(_RAIter, _RAIter, _Compare); + + template + _BIter + stable_partition(_BIter, _BIter, _Predicate); +# 581 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/algorithmfwd.h" 3 + template + _FIter2 + swap_ranges(_FIter1, _FIter1, _FIter2); + + + + template + _FIter + unique(_FIter, _FIter); + + template + _FIter + unique(_FIter, _FIter, _BinaryPredicate); + + + + template + _FIter + upper_bound(_FIter, _FIter, const _Tp&); + + template + _FIter + upper_bound(_FIter, _FIter, const _Tp&, _Compare); + + + + + + template + _FIter + adjacent_find(_FIter, _FIter); + + template + _FIter + adjacent_find(_FIter, _FIter, _BinaryPredicate); + + template + typename iterator_traits<_IIter>::difference_type + count(_IIter, _IIter, const _Tp&); + + template + typename iterator_traits<_IIter>::difference_type + count_if(_IIter, _IIter, _Predicate); + + template + bool + equal(_IIter1, _IIter1, _IIter2); + + template + bool + equal(_IIter1, _IIter1, _IIter2, _BinaryPredicate); + + template + _IIter + find(_IIter, _IIter, const _Tp&); + + template + _FIter1 + find_first_of(_FIter1, _FIter1, _FIter2, _FIter2); + + template + _FIter1 + find_first_of(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate); + + template + _IIter + find_if(_IIter, _IIter, _Predicate); + + template + _Funct + for_each(_IIter, _IIter, _Funct); + + template + void + generate(_FIter, _FIter, _Generator); + + template + _OIter + generate_n(_OIter, _Size, _Generator); + + template + bool + lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2); + + template + bool + lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Compare); + + template + constexpr + _FIter + max_element(_FIter, _FIter); + + template + constexpr + _FIter + max_element(_FIter, _FIter, _Compare); + + template + _OIter + merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter); + + template + _OIter + merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare); + + template + constexpr + _FIter + min_element(_FIter, _FIter); + + template + constexpr + _FIter + min_element(_FIter, _FIter, _Compare); + + template + pair<_IIter1, _IIter2> + mismatch(_IIter1, _IIter1, _IIter2); + + template + pair<_IIter1, _IIter2> + mismatch(_IIter1, _IIter1, _IIter2, _BinaryPredicate); + + template + void + nth_element(_RAIter, _RAIter, _RAIter); + + template + void + nth_element(_RAIter, _RAIter, _RAIter, _Compare); + + template + void + partial_sort(_RAIter, _RAIter, _RAIter); + + template + void + partial_sort(_RAIter, _RAIter, _RAIter, _Compare); + + template + _BIter + partition(_BIter, _BIter, _Predicate); + + template + void + random_shuffle(_RAIter, _RAIter); + + template + void + random_shuffle(_RAIter, _RAIter, + + _Generator&&); + + + + + template + void + replace(_FIter, _FIter, const _Tp&, const _Tp&); + + template + void + replace_if(_FIter, _FIter, _Predicate, const _Tp&); + + template + _FIter1 + search(_FIter1, _FIter1, _FIter2, _FIter2); + + template + _FIter1 + search(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate); + + template + _FIter + search_n(_FIter, _FIter, _Size, const _Tp&); + + template + _FIter + search_n(_FIter, _FIter, _Size, const _Tp&, _BinaryPredicate); + + template + _OIter + set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter); + + template + _OIter + set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare); + + template + _OIter + set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter); + + template + _OIter + set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare); + + template + _OIter + set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter); + + template + _OIter + set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, + _OIter, _Compare); + + template + _OIter + set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter); + + template + _OIter + set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare); + + template + void + sort(_RAIter, _RAIter); + + template + void + sort(_RAIter, _RAIter, _Compare); + + template + void + stable_sort(_RAIter, _RAIter); + + template + void + stable_sort(_RAIter, _RAIter, _Compare); + + template + _OIter + transform(_IIter, _IIter, _OIter, _UnaryOperation); + + template + _OIter + transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation); + + template + _OIter + unique_copy(_IIter, _IIter, _OIter); + + template + _OIter + unique_copy(_IIter, _IIter, _OIter, _BinaryPredicate); + + +} +# 61 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 1 3 +# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + + + template + _Distance + __is_heap_until(_RandomAccessIterator __first, _Distance __n, + _Compare __comp) + { + _Distance __parent = 0; + for (_Distance __child = 1; __child < __n; ++__child) + { + if (__comp(__first + __parent, __first + __child)) + return __child; + if ((__child & 1) == 0) + ++__parent; + } + return __n; + } + + + + template + inline bool + __is_heap(_RandomAccessIterator __first, _Distance __n) + { + return std::__is_heap_until(__first, __n, + __gnu_cxx::__ops::__iter_less_iter()) == __n; + } + + template + inline bool + __is_heap(_RandomAccessIterator __first, _Compare __comp, _Distance __n) + { + return std::__is_heap_until(__first, __n, + __gnu_cxx::__ops::__iter_comp_iter(__comp)) == __n; + } + + template + inline bool + __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) + { return std::__is_heap(__first, std::distance(__first, __last)); } + + template + inline bool + __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { return std::__is_heap(__first, __comp, std::distance(__first, __last)); } + + + + + template + void + __push_heap(_RandomAccessIterator __first, + _Distance __holeIndex, _Distance __topIndex, _Tp __value, + _Compare __comp) + { + _Distance __parent = (__holeIndex - 1) / 2; + while (__holeIndex > __topIndex && __comp(__first + __parent, __value)) + { + *(__first + __holeIndex) = std::move(*(__first + __parent)); + __holeIndex = __parent; + __parent = (__holeIndex - 1) / 2; + } + *(__first + __holeIndex) = std::move(__value); + } +# 148 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline void + push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) + { + typedef typename iterator_traits<_RandomAccessIterator>::value_type + _ValueType; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type + _DistanceType; + + + + + + ; + ; + ; + + _ValueType __value = std::move(*(__last - 1)); + std::__push_heap(__first, _DistanceType((__last - __first) - 1), + _DistanceType(0), std::move(__value), + __gnu_cxx::__ops::__iter_less_val()); + } +# 183 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline void + push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { + typedef typename iterator_traits<_RandomAccessIterator>::value_type + _ValueType; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type + _DistanceType; + + + + + ; + ; + ; + + _ValueType __value = std::move(*(__last - 1)); + std::__push_heap(__first, _DistanceType((__last - __first) - 1), + _DistanceType(0), std::move(__value), + __gnu_cxx::__ops::__iter_comp_val(__comp)); + } + + template + void + __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex, + _Distance __len, _Tp __value, _Compare __comp) + { + const _Distance __topIndex = __holeIndex; + _Distance __secondChild = __holeIndex; + while (__secondChild < (__len - 1) / 2) + { + __secondChild = 2 * (__secondChild + 1); + if (__comp(__first + __secondChild, + __first + (__secondChild - 1))) + __secondChild--; + *(__first + __holeIndex) = std::move(*(__first + __secondChild)); + __holeIndex = __secondChild; + } + if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2) + { + __secondChild = 2 * (__secondChild + 1); + *(__first + __holeIndex) = std::move(*(__first + (__secondChild - 1))); + + __holeIndex = __secondChild - 1; + } + std::__push_heap(__first, __holeIndex, __topIndex, + std::move(__value), + __gnu_cxx::__ops::__iter_comp_val(__comp)); + } + + template + inline void + __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _RandomAccessIterator __result, _Compare __comp) + { + typedef typename iterator_traits<_RandomAccessIterator>::value_type + _ValueType; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type + _DistanceType; + + _ValueType __value = std::move(*__result); + *__result = std::move(*__first); + std::__adjust_heap(__first, _DistanceType(0), + _DistanceType(__last - __first), + std::move(__value), __comp); + } +# 263 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline void + pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) + { + + + + + + ; + ; + ; + ; + + if (__last - __first > 1) + { + --__last; + std::__pop_heap(__first, __last, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } + } +# 296 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline void + pop_heap(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Compare __comp) + { + + + + ; + ; + ; + ; + + if (__last - __first > 1) + { + --__last; + std::__pop_heap(__first, __last, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + } + + template + void + __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { + typedef typename iterator_traits<_RandomAccessIterator>::value_type + _ValueType; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type + _DistanceType; + + if (__last - __first < 2) + return; + + const _DistanceType __len = __last - __first; + _DistanceType __parent = (__len - 2) / 2; + while (true) + { + _ValueType __value = std::move(*(__first + __parent)); + std::__adjust_heap(__first, __parent, __len, std::move(__value), + __comp); + if (__parent == 0) + return; + __parent--; + } + } +# 351 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline void + make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) + { + + + + + + ; + ; + + std::__make_heap(__first, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 377 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline void + make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { + + + + ; + ; + + std::__make_heap(__first, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + void + __sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { + while (__last - __first > 1) + { + --__last; + std::__pop_heap(__first, __last, __last, __comp); + } + } +# 412 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline void + sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) + { + + + + + + ; + ; + ; + + std::__sort_heap(__first, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 439 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline void + sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { + + + + ; + ; + ; + + std::__sort_heap(__first, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } +# 466 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline _RandomAccessIterator + is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last) + { + + + + + + ; + ; + + return __first + + std::__is_heap_until(__first, std::distance(__first, __last), + __gnu_cxx::__ops::__iter_less_iter()); + } +# 494 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline _RandomAccessIterator + is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { + + + + ; + ; + + return __first + + std::__is_heap_until(__first, std::distance(__first, __last), + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } +# 517 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline bool + is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) + { return std::is_heap_until(__first, __last) == __last; } +# 530 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3 + template + inline bool + is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { return std::is_heap_until(__first, __last, __comp) == __last; } + + + +} +# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 2 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 1 3 +# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_construct.h" 1 3 +# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_construct.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + + + template + inline void + _Construct(_T1* __p, _Args&&... __args) + { ::new(static_cast(__p)) _T1(std::forward<_Args>(__args)...); } +# 90 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_construct.h" 3 + template + inline void + _Destroy(_Tp* __pointer) + { __pointer->~_Tp(); } + + template + struct _Destroy_aux + { + template + static void + __destroy(_ForwardIterator __first, _ForwardIterator __last) + { + for (; __first != __last; ++__first) + std::_Destroy(std::__addressof(*__first)); + } + }; + + template<> + struct _Destroy_aux + { + template + static void + __destroy(_ForwardIterator, _ForwardIterator) { } + }; + + + + + + + template + inline void + _Destroy(_ForwardIterator __first, _ForwardIterator __last) + { + typedef typename iterator_traits<_ForwardIterator>::value_type + _Value_type; + std::_Destroy_aux<__has_trivial_destructor(_Value_type)>:: + __destroy(__first, __last); + } + + + + + + + + template + void + _Destroy(_ForwardIterator __first, _ForwardIterator __last, + _Allocator& __alloc) + { + typedef __gnu_cxx::__alloc_traits<_Allocator> __traits; + for (; __first != __last; ++__first) + __traits::destroy(__alloc, std::__addressof(*__first)); + } + + template + inline void + _Destroy(_ForwardIterator __first, _ForwardIterator __last, + allocator<_Tp>&) + { + _Destroy(__first, __last); + } + + +} +# 61 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 83 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 3 + template + pair<_Tp*, ptrdiff_t> + get_temporary_buffer(ptrdiff_t __len) noexcept + { + const ptrdiff_t __max = + __gnu_cxx::__numeric_traits::__max / sizeof(_Tp); + if (__len > __max) + __len = __max; + + while (__len > 0) + { + _Tp* __tmp = static_cast<_Tp*>(::operator new(__len * sizeof(_Tp), + std::nothrow)); + if (__tmp != 0) + return std::pair<_Tp*, ptrdiff_t>(__tmp, __len); + __len /= 2; + } + return std::pair<_Tp*, ptrdiff_t>(static_cast<_Tp*>(0), 0); + } +# 110 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 3 + template + inline void + return_temporary_buffer(_Tp* __p) + { ::operator delete(__p, std::nothrow); } + + + + + + + + template + class _Temporary_buffer + { + + + + public: + typedef _Tp value_type; + typedef value_type* pointer; + typedef pointer iterator; + typedef ptrdiff_t size_type; + + protected: + size_type _M_original_len; + size_type _M_len; + pointer _M_buffer; + + public: + + size_type + size() const + { return _M_len; } + + + size_type + requested_size() const + { return _M_original_len; } + + + iterator + begin() + { return _M_buffer; } + + + iterator + end() + { return _M_buffer + _M_len; } + + + + + + _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last); + + ~_Temporary_buffer() + { + std::_Destroy(_M_buffer, _M_buffer + _M_len); + std::return_temporary_buffer(_M_buffer); + } + + private: + + _Temporary_buffer(const _Temporary_buffer&); + + void + operator=(const _Temporary_buffer&); + }; + + + template + struct __uninitialized_construct_buf_dispatch + { + template + static void + __ucr(_Pointer __first, _Pointer __last, + _ForwardIterator __seed) + { + if(__first == __last) + return; + + _Pointer __cur = __first; + try + { + std::_Construct(std::__addressof(*__first), + std::move(*__seed)); + _Pointer __prev = __cur; + ++__cur; + for(; __cur != __last; ++__cur, ++__prev) + std::_Construct(std::__addressof(*__cur), + std::move(*__prev)); + *__seed = std::move(*__prev); + } + catch(...) + { + std::_Destroy(__first, __cur); + throw; + } + } + }; + + template<> + struct __uninitialized_construct_buf_dispatch + { + template + static void + __ucr(_Pointer, _Pointer, _ForwardIterator) { } + }; +# 229 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 3 + template + inline void + __uninitialized_construct_buf(_Pointer __first, _Pointer __last, + _ForwardIterator __seed) + { + typedef typename std::iterator_traits<_Pointer>::value_type + _ValueType; + + std::__uninitialized_construct_buf_dispatch< + __has_trivial_constructor(_ValueType)>:: + __ucr(__first, __last, __seed); + } + + template + _Temporary_buffer<_ForwardIterator, _Tp>:: + _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) + : _M_original_len(std::distance(__first, __last)), + _M_len(0), _M_buffer(0) + { + try + { + std::pair __p(std::get_temporary_buffer< + value_type>(_M_original_len)); + _M_buffer = __p.first; + _M_len = __p.second; + if (_M_buffer) + std::__uninitialized_construct_buf(_M_buffer, _M_buffer + _M_len, + __first); + } + catch(...) + { + std::return_temporary_buffer(_M_buffer); + _M_buffer = 0; + _M_len = 0; + throw; + } + } + + +} +# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 2 3 + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 1 3 +# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 3 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 1 3 +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3 +# 158 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + + + enum float_round_style + { + round_indeterminate = -1, + round_toward_zero = 0, + round_to_nearest = 1, + round_toward_infinity = 2, + round_toward_neg_infinity = 3 + }; + + + + + + + + enum float_denorm_style + { + + denorm_indeterminate = -1, + + denorm_absent = 0, + + denorm_present = 1 + }; +# 202 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3 + struct __numeric_limits_base + { + + + static constexpr bool is_specialized = false; + + + + + static constexpr int digits = 0; + + + static constexpr int digits10 = 0; + + + + + static constexpr int max_digits10 = 0; + + + + static constexpr bool is_signed = false; + + + static constexpr bool is_integer = false; + + + + + static constexpr bool is_exact = false; + + + + static constexpr int radix = 0; + + + + static constexpr int min_exponent = 0; + + + + static constexpr int min_exponent10 = 0; + + + + + static constexpr int max_exponent = 0; + + + + static constexpr int max_exponent10 = 0; + + + static constexpr bool has_infinity = false; + + + + static constexpr bool has_quiet_NaN = false; + + + + static constexpr bool has_signaling_NaN = false; + + + static constexpr float_denorm_style has_denorm = denorm_absent; + + + + static constexpr bool has_denorm_loss = false; + + + + static constexpr bool is_iec559 = false; + + + + + static constexpr bool is_bounded = false; +# 288 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3 + static constexpr bool is_modulo = false; + + + static constexpr bool traps = false; + + + static constexpr bool tinyness_before = false; + + + + + static constexpr float_round_style round_style = + round_toward_zero; + }; +# 314 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3 + template + struct numeric_limits : public __numeric_limits_base + { + + + static constexpr _Tp + min() noexcept { return _Tp(); } + + + static constexpr _Tp + max() noexcept { return _Tp(); } + + + + + static constexpr _Tp + lowest() noexcept { return _Tp(); } + + + + + static constexpr _Tp + epsilon() noexcept { return _Tp(); } + + + static constexpr _Tp + round_error() noexcept { return _Tp(); } + + + static constexpr _Tp + infinity() noexcept { return _Tp(); } + + + + static constexpr _Tp + quiet_NaN() noexcept { return _Tp(); } + + + + static constexpr _Tp + signaling_NaN() noexcept { return _Tp(); } + + + + + static constexpr _Tp + denorm_min() noexcept { return _Tp(); } + }; + + + template + struct numeric_limits + : public numeric_limits<_Tp> { }; + + template + struct numeric_limits + : public numeric_limits<_Tp> { }; + + template + struct numeric_limits + : public numeric_limits<_Tp> { }; + + + + + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr bool + min() noexcept { return false; } + + static constexpr bool + max() noexcept { return true; } + + + static constexpr bool + lowest() noexcept { return min(); } + + static constexpr int digits = 1; + static constexpr int digits10 = 0; + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = false; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr bool + epsilon() noexcept { return false; } + + static constexpr bool + round_error() noexcept { return false; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr bool + infinity() noexcept { return false; } + + static constexpr bool + quiet_NaN() noexcept { return false; } + + static constexpr bool + signaling_NaN() noexcept { return false; } + + static constexpr bool + denorm_min() noexcept { return false; } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = false; + + + + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr char + min() noexcept { return (((char)(-1) < 0) ? -(((char)(-1) < 0) ? (((((char)1 << ((sizeof(char) * 8 - ((char)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char)0) - 1 : (char)0); } + + static constexpr char + max() noexcept { return (((char)(-1) < 0) ? (((((char)1 << ((sizeof(char) * 8 - ((char)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char)0); } + + + static constexpr char + lowest() noexcept { return min(); } + + + static constexpr int digits = (sizeof(char) * 8 - ((char)(-1) < 0)); + static constexpr int digits10 = ((sizeof(char) * 8 - ((char)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = ((char)(-1) < 0); + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr char + epsilon() noexcept { return 0; } + + static constexpr char + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr + char infinity() noexcept { return char(); } + + static constexpr char + quiet_NaN() noexcept { return char(); } + + static constexpr char + signaling_NaN() noexcept { return char(); } + + static constexpr char + denorm_min() noexcept { return static_cast(0); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = !is_signed; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr signed char + min() noexcept { return -127 - 1; } + + static constexpr signed char + max() noexcept { return 127; } + + + static constexpr signed char + lowest() noexcept { return min(); } + + + static constexpr int digits = (sizeof(signed char) * 8 - ((signed char)(-1) < 0)); + static constexpr int digits10 + = ((sizeof(signed char) * 8 - ((signed char)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = true; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr signed char + epsilon() noexcept { return 0; } + + static constexpr signed char + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr signed char + infinity() noexcept { return static_cast(0); } + + static constexpr signed char + quiet_NaN() noexcept { return static_cast(0); } + + static constexpr signed char + signaling_NaN() noexcept + { return static_cast(0); } + + static constexpr signed char + denorm_min() noexcept + { return static_cast(0); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = false; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr unsigned char + min() noexcept { return 0; } + + static constexpr unsigned char + max() noexcept { return 127 * 2U + 1; } + + + static constexpr unsigned char + lowest() noexcept { return min(); } + + + static constexpr int digits + = (sizeof(unsigned char) * 8 - ((unsigned char)(-1) < 0)); + static constexpr int digits10 + = ((sizeof(unsigned char) * 8 - ((unsigned char)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = false; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr unsigned char + epsilon() noexcept { return 0; } + + static constexpr unsigned char + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr unsigned char + infinity() noexcept + { return static_cast(0); } + + static constexpr unsigned char + quiet_NaN() noexcept + { return static_cast(0); } + + static constexpr unsigned char + signaling_NaN() noexcept + { return static_cast(0); } + + static constexpr unsigned char + denorm_min() noexcept + { return static_cast(0); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = true; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr wchar_t + min() noexcept { return (((wchar_t)(-1) < 0) ? -(((wchar_t)(-1) < 0) ? (((((wchar_t)1 << ((sizeof(wchar_t) * 8 - ((wchar_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(wchar_t)0) - 1 : (wchar_t)0); } + + static constexpr wchar_t + max() noexcept { return (((wchar_t)(-1) < 0) ? (((((wchar_t)1 << ((sizeof(wchar_t) * 8 - ((wchar_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(wchar_t)0); } + + + static constexpr wchar_t + lowest() noexcept { return min(); } + + + static constexpr int digits = (sizeof(wchar_t) * 8 - ((wchar_t)(-1) < 0)); + static constexpr int digits10 + = ((sizeof(wchar_t) * 8 - ((wchar_t)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = ((wchar_t)(-1) < 0); + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr wchar_t + epsilon() noexcept { return 0; } + + static constexpr wchar_t + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr wchar_t + infinity() noexcept { return wchar_t(); } + + static constexpr wchar_t + quiet_NaN() noexcept { return wchar_t(); } + + static constexpr wchar_t + signaling_NaN() noexcept { return wchar_t(); } + + static constexpr wchar_t + denorm_min() noexcept { return wchar_t(); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = !is_signed; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr char16_t + min() noexcept { return (((char16_t)(-1) < 0) ? -(((char16_t)(-1) < 0) ? (((((char16_t)1 << ((sizeof(char16_t) * 8 - ((char16_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char16_t)0) - 1 : (char16_t)0); } + + static constexpr char16_t + max() noexcept { return (((char16_t)(-1) < 0) ? (((((char16_t)1 << ((sizeof(char16_t) * 8 - ((char16_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char16_t)0); } + + static constexpr char16_t + lowest() noexcept { return min(); } + + static constexpr int digits = (sizeof(char16_t) * 8 - ((char16_t)(-1) < 0)); + static constexpr int digits10 = ((sizeof(char16_t) * 8 - ((char16_t)(-1) < 0)) * 643L / 2136); + static constexpr int max_digits10 = 0; + static constexpr bool is_signed = ((char16_t)(-1) < 0); + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr char16_t + epsilon() noexcept { return 0; } + + static constexpr char16_t + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr char16_t + infinity() noexcept { return char16_t(); } + + static constexpr char16_t + quiet_NaN() noexcept { return char16_t(); } + + static constexpr char16_t + signaling_NaN() noexcept { return char16_t(); } + + static constexpr char16_t + denorm_min() noexcept { return char16_t(); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = !is_signed; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr char32_t + min() noexcept { return (((char32_t)(-1) < 0) ? -(((char32_t)(-1) < 0) ? (((((char32_t)1 << ((sizeof(char32_t) * 8 - ((char32_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char32_t)0) - 1 : (char32_t)0); } + + static constexpr char32_t + max() noexcept { return (((char32_t)(-1) < 0) ? (((((char32_t)1 << ((sizeof(char32_t) * 8 - ((char32_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char32_t)0); } + + static constexpr char32_t + lowest() noexcept { return min(); } + + static constexpr int digits = (sizeof(char32_t) * 8 - ((char32_t)(-1) < 0)); + static constexpr int digits10 = ((sizeof(char32_t) * 8 - ((char32_t)(-1) < 0)) * 643L / 2136); + static constexpr int max_digits10 = 0; + static constexpr bool is_signed = ((char32_t)(-1) < 0); + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr char32_t + epsilon() noexcept { return 0; } + + static constexpr char32_t + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr char32_t + infinity() noexcept { return char32_t(); } + + static constexpr char32_t + quiet_NaN() noexcept { return char32_t(); } + + static constexpr char32_t + signaling_NaN() noexcept { return char32_t(); } + + static constexpr char32_t + denorm_min() noexcept { return char32_t(); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = !is_signed; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style = round_toward_zero; + }; + + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr short + min() noexcept { return -32767 - 1; } + + static constexpr short + max() noexcept { return 32767; } + + + static constexpr short + lowest() noexcept { return min(); } + + + static constexpr int digits = (sizeof(short) * 8 - ((short)(-1) < 0)); + static constexpr int digits10 = ((sizeof(short) * 8 - ((short)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = true; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr short + epsilon() noexcept { return 0; } + + static constexpr short + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr short + infinity() noexcept { return short(); } + + static constexpr short + quiet_NaN() noexcept { return short(); } + + static constexpr short + signaling_NaN() noexcept { return short(); } + + static constexpr short + denorm_min() noexcept { return short(); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = false; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr unsigned short + min() noexcept { return 0; } + + static constexpr unsigned short + max() noexcept { return 32767 * 2U + 1; } + + + static constexpr unsigned short + lowest() noexcept { return min(); } + + + static constexpr int digits + = (sizeof(unsigned short) * 8 - ((unsigned short)(-1) < 0)); + static constexpr int digits10 + = ((sizeof(unsigned short) * 8 - ((unsigned short)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = false; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr unsigned short + epsilon() noexcept { return 0; } + + static constexpr unsigned short + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr unsigned short + infinity() noexcept + { return static_cast(0); } + + static constexpr unsigned short + quiet_NaN() noexcept + { return static_cast(0); } + + static constexpr unsigned short + signaling_NaN() noexcept + { return static_cast(0); } + + static constexpr unsigned short + denorm_min() noexcept + { return static_cast(0); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = true; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr int + min() noexcept { return -2147483647 - 1; } + + static constexpr int + max() noexcept { return 2147483647; } + + + static constexpr int + lowest() noexcept { return min(); } + + + static constexpr int digits = (sizeof(int) * 8 - ((int)(-1) < 0)); + static constexpr int digits10 = ((sizeof(int) * 8 - ((int)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = true; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr int + epsilon() noexcept { return 0; } + + static constexpr int + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr int + infinity() noexcept { return static_cast(0); } + + static constexpr int + quiet_NaN() noexcept { return static_cast(0); } + + static constexpr int + signaling_NaN() noexcept { return static_cast(0); } + + static constexpr int + denorm_min() noexcept { return static_cast(0); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = false; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr unsigned int + min() noexcept { return 0; } + + static constexpr unsigned int + max() noexcept { return 2147483647 * 2U + 1; } + + + static constexpr unsigned int + lowest() noexcept { return min(); } + + + static constexpr int digits + = (sizeof(unsigned int) * 8 - ((unsigned int)(-1) < 0)); + static constexpr int digits10 + = ((sizeof(unsigned int) * 8 - ((unsigned int)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = false; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr unsigned int + epsilon() noexcept { return 0; } + + static constexpr unsigned int + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr unsigned int + infinity() noexcept { return static_cast(0); } + + static constexpr unsigned int + quiet_NaN() noexcept + { return static_cast(0); } + + static constexpr unsigned int + signaling_NaN() noexcept + { return static_cast(0); } + + static constexpr unsigned int + denorm_min() noexcept + { return static_cast(0); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = true; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr long + min() noexcept { return -9223372036854775807L - 1; } + + static constexpr long + max() noexcept { return 9223372036854775807L; } + + + static constexpr long + lowest() noexcept { return min(); } + + + static constexpr int digits = (sizeof(long) * 8 - ((long)(-1) < 0)); + static constexpr int digits10 = ((sizeof(long) * 8 - ((long)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = true; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr long + epsilon() noexcept { return 0; } + + static constexpr long + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr long + infinity() noexcept { return static_cast(0); } + + static constexpr long + quiet_NaN() noexcept { return static_cast(0); } + + static constexpr long + signaling_NaN() noexcept { return static_cast(0); } + + static constexpr long + denorm_min() noexcept { return static_cast(0); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = false; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr unsigned long + min() noexcept { return 0; } + + static constexpr unsigned long + max() noexcept { return 9223372036854775807L * 2UL + 1; } + + + static constexpr unsigned long + lowest() noexcept { return min(); } + + + static constexpr int digits + = (sizeof(unsigned long) * 8 - ((unsigned long)(-1) < 0)); + static constexpr int digits10 + = ((sizeof(unsigned long) * 8 - ((unsigned long)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = false; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr unsigned long + epsilon() noexcept { return 0; } + + static constexpr unsigned long + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr unsigned long + infinity() noexcept + { return static_cast(0); } + + static constexpr unsigned long + quiet_NaN() noexcept + { return static_cast(0); } + + static constexpr unsigned long + signaling_NaN() noexcept + { return static_cast(0); } + + static constexpr unsigned long + denorm_min() noexcept + { return static_cast(0); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = true; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr long long + min() noexcept { return -9223372036854775807LL - 1; } + + static constexpr long long + max() noexcept { return 9223372036854775807LL; } + + + static constexpr long long + lowest() noexcept { return min(); } + + + static constexpr int digits + = (sizeof(long long) * 8 - ((long long)(-1) < 0)); + static constexpr int digits10 + = ((sizeof(long long) * 8 - ((long long)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = true; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr long long + epsilon() noexcept { return 0; } + + static constexpr long long + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr long long + infinity() noexcept { return static_cast(0); } + + static constexpr long long + quiet_NaN() noexcept { return static_cast(0); } + + static constexpr long long + signaling_NaN() noexcept + { return static_cast(0); } + + static constexpr long long + denorm_min() noexcept { return static_cast(0); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = false; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr unsigned long long + min() noexcept { return 0; } + + static constexpr unsigned long long + max() noexcept { return 9223372036854775807LL * 2ULL + 1; } + + + static constexpr unsigned long long + lowest() noexcept { return min(); } + + + static constexpr int digits + = (sizeof(unsigned long long) * 8 - ((unsigned long long)(-1) < 0)); + static constexpr int digits10 + = ((sizeof(unsigned long long) * 8 - ((unsigned long long)(-1) < 0)) * 643L / 2136); + + static constexpr int max_digits10 = 0; + + static constexpr bool is_signed = false; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr int radix = 2; + + static constexpr unsigned long long + epsilon() noexcept { return 0; } + + static constexpr unsigned long long + round_error() noexcept { return 0; } + + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm + = denorm_absent; + static constexpr bool has_denorm_loss = false; + + static constexpr unsigned long long + infinity() noexcept + { return static_cast(0); } + + static constexpr unsigned long long + quiet_NaN() noexcept + { return static_cast(0); } + + static constexpr unsigned long long + signaling_NaN() noexcept + { return static_cast(0); } + + static constexpr unsigned long long + denorm_min() noexcept + { return static_cast(0); } + + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = true; + + static constexpr bool traps = true; + static constexpr bool tinyness_before = false; + static constexpr float_round_style round_style + = round_toward_zero; + }; +# 1592 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3 + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr float + min() noexcept { return 1.17549435e-38F; } + + static constexpr float + max() noexcept { return 3.40282347e+38F; } + + + static constexpr float + lowest() noexcept { return -3.40282347e+38F; } + + + static constexpr int digits = 24; + static constexpr int digits10 = 6; + + static constexpr int max_digits10 + = (2 + (24) * 643L / 2136); + + static constexpr bool is_signed = true; + static constexpr bool is_integer = false; + static constexpr bool is_exact = false; + static constexpr int radix = 2; + + static constexpr float + epsilon() noexcept { return 1.19209290e-7F; } + + static constexpr float + round_error() noexcept { return 0.5F; } + + static constexpr int min_exponent = (-125); + static constexpr int min_exponent10 = (-37); + static constexpr int max_exponent = 128; + static constexpr int max_exponent10 = 38; + + static constexpr bool has_infinity = 1; + static constexpr bool has_quiet_NaN = 1; + static constexpr bool has_signaling_NaN = has_quiet_NaN; + static constexpr float_denorm_style has_denorm + = bool(1) ? denorm_present : denorm_absent; + static constexpr bool has_denorm_loss + = false; + + static constexpr float + infinity() noexcept { return __builtin_huge_valf(); } + + static constexpr float + quiet_NaN() noexcept { return __builtin_nanf(""); } + + static constexpr float + signaling_NaN() noexcept { return __builtin_nansf(""); } + + static constexpr float + denorm_min() noexcept { return 1.40129846e-45F; } + + static constexpr bool is_iec559 + = has_infinity && has_quiet_NaN && has_denorm == denorm_present; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = false; + + static constexpr bool traps = false; + static constexpr bool tinyness_before + = false; + static constexpr float_round_style round_style + = round_to_nearest; + }; + + + + + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr double + min() noexcept { return 2.2250738585072014e-308; } + + static constexpr double + max() noexcept { return 1.7976931348623157e+308; } + + + static constexpr double + lowest() noexcept { return -1.7976931348623157e+308; } + + + static constexpr int digits = 53; + static constexpr int digits10 = 15; + + static constexpr int max_digits10 + = (2 + (53) * 643L / 2136); + + static constexpr bool is_signed = true; + static constexpr bool is_integer = false; + static constexpr bool is_exact = false; + static constexpr int radix = 2; + + static constexpr double + epsilon() noexcept { return 2.2204460492503131e-16; } + + static constexpr double + round_error() noexcept { return 0.5; } + + static constexpr int min_exponent = (-1021); + static constexpr int min_exponent10 = (-307); + static constexpr int max_exponent = 1024; + static constexpr int max_exponent10 = 308; + + static constexpr bool has_infinity = 1; + static constexpr bool has_quiet_NaN = 1; + static constexpr bool has_signaling_NaN = has_quiet_NaN; + static constexpr float_denorm_style has_denorm + = bool(1) ? denorm_present : denorm_absent; + static constexpr bool has_denorm_loss + = false; + + static constexpr double + infinity() noexcept { return __builtin_huge_val(); } + + static constexpr double + quiet_NaN() noexcept { return __builtin_nan(""); } + + static constexpr double + signaling_NaN() noexcept { return __builtin_nans(""); } + + static constexpr double + denorm_min() noexcept { return 4.9406564584124654e-324; } + + static constexpr bool is_iec559 + = has_infinity && has_quiet_NaN && has_denorm == denorm_present; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = false; + + static constexpr bool traps = false; + static constexpr bool tinyness_before + = false; + static constexpr float_round_style round_style + = round_to_nearest; + }; + + + + + + + template<> + struct numeric_limits + { + static constexpr bool is_specialized = true; + + static constexpr long double + min() noexcept { return 3.36210314311209350626e-4932L; } + + static constexpr long double + max() noexcept { return 1.18973149535723176502e+4932L; } + + + static constexpr long double + lowest() noexcept { return -1.18973149535723176502e+4932L; } + + + static constexpr int digits = 64; + static constexpr int digits10 = 18; + + static constexpr int max_digits10 + = (2 + (64) * 643L / 2136); + + static constexpr bool is_signed = true; + static constexpr bool is_integer = false; + static constexpr bool is_exact = false; + static constexpr int radix = 2; + + static constexpr long double + epsilon() noexcept { return 1.08420217248550443401e-19L; } + + static constexpr long double + round_error() noexcept { return 0.5L; } + + static constexpr int min_exponent = (-16381); + static constexpr int min_exponent10 = (-4931); + static constexpr int max_exponent = 16384; + static constexpr int max_exponent10 = 4932; + + static constexpr bool has_infinity = 1; + static constexpr bool has_quiet_NaN = 1; + static constexpr bool has_signaling_NaN = has_quiet_NaN; + static constexpr float_denorm_style has_denorm + = bool(1) ? denorm_present : denorm_absent; + static constexpr bool has_denorm_loss + = false; + + static constexpr long double + infinity() noexcept { return __builtin_huge_vall(); } + + static constexpr long double + quiet_NaN() noexcept { return __builtin_nanl(""); } + + static constexpr long double + signaling_NaN() noexcept { return __builtin_nansl(""); } + + static constexpr long double + denorm_min() noexcept { return 3.64519953188247460253e-4951L; } + + static constexpr bool is_iec559 + = has_infinity && has_quiet_NaN && has_denorm == denorm_present; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = false; + + static constexpr bool traps = false; + static constexpr bool tinyness_before = + false; + static constexpr float_round_style round_style = + round_to_nearest; + }; + + + + + + +} +# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + namespace __detail + { + + + template + inline bool + _Power_of_2(_Tp __x) + { + return ((__x - 1) & __x) == 0; + }; + + } +# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 3 + template + class uniform_int_distribution + { + static_assert(std::is_integral<_IntType>::value, + "template argument not an integral type"); + + public: + + typedef _IntType result_type; + + struct param_type + { + typedef uniform_int_distribution<_IntType> distribution_type; + + explicit + param_type(_IntType __a = 0, + _IntType __b = std::numeric_limits<_IntType>::max()) + : _M_a(__a), _M_b(__b) + { + ; + } + + result_type + a() const + { return _M_a; } + + result_type + b() const + { return _M_b; } + + friend bool + operator==(const param_type& __p1, const param_type& __p2) + { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } + + private: + _IntType _M_a; + _IntType _M_b; + }; + + public: + + + + explicit + uniform_int_distribution(_IntType __a = 0, + _IntType __b = std::numeric_limits<_IntType>::max()) + : _M_param(__a, __b) + { } + + explicit + uniform_int_distribution(const param_type& __p) + : _M_param(__p) + { } + + + + + + + void + reset() { } + + result_type + a() const + { return _M_param.a(); } + + result_type + b() const + { return _M_param.b(); } + + + + + param_type + param() const + { return _M_param; } + + + + + + void + param(const param_type& __param) + { _M_param = __param; } + + + + + result_type + min() const + { return this->a(); } + + + + + result_type + max() const + { return this->b(); } + + + + + template + result_type + operator()(_UniformRandomNumberGenerator& __urng) + { return this->operator()(__urng, _M_param); } + + template + result_type + operator()(_UniformRandomNumberGenerator& __urng, + const param_type& __p); + + template + void + __generate(_ForwardIterator __f, _ForwardIterator __t, + _UniformRandomNumberGenerator& __urng) + { this->__generate(__f, __t, __urng, _M_param); } + + template + void + __generate(_ForwardIterator __f, _ForwardIterator __t, + _UniformRandomNumberGenerator& __urng, + const param_type& __p) + { this->__generate_impl(__f, __t, __urng, __p); } + + template + void + __generate(result_type* __f, result_type* __t, + _UniformRandomNumberGenerator& __urng, + const param_type& __p) + { this->__generate_impl(__f, __t, __urng, __p); } + + + + + + friend bool + operator==(const uniform_int_distribution& __d1, + const uniform_int_distribution& __d2) + { return __d1._M_param == __d2._M_param; } + + private: + template + void + __generate_impl(_ForwardIterator __f, _ForwardIterator __t, + _UniformRandomNumberGenerator& __urng, + const param_type& __p); + + param_type _M_param; + }; + + template + template + typename uniform_int_distribution<_IntType>::result_type + uniform_int_distribution<_IntType>:: + operator()(_UniformRandomNumberGenerator& __urng, + const param_type& __param) + { + typedef typename _UniformRandomNumberGenerator::result_type + _Gresult_type; + typedef typename std::make_unsigned::type __utype; + typedef typename std::common_type<_Gresult_type, __utype>::type + __uctype; + + const __uctype __urngmin = __urng.min(); + const __uctype __urngmax = __urng.max(); + const __uctype __urngrange = __urngmax - __urngmin; + const __uctype __urange + = __uctype(__param.b()) - __uctype(__param.a()); + + __uctype __ret; + + if (__urngrange > __urange) + { + + const __uctype __uerange = __urange + 1; + const __uctype __scaling = __urngrange / __uerange; + const __uctype __past = __uerange * __scaling; + do + __ret = __uctype(__urng()) - __urngmin; + while (__ret >= __past); + __ret /= __scaling; + } + else if (__urngrange < __urange) + { +# 263 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 3 + __uctype __tmp; + do + { + const __uctype __uerngrange = __urngrange + 1; + __tmp = (__uerngrange * operator() + (__urng, param_type(0, __urange / __uerngrange))); + __ret = __tmp + (__uctype(__urng()) - __urngmin); + } + while (__ret > __urange || __ret < __tmp); + } + else + __ret = __uctype(__urng()) - __urngmin; + + return __ret + __param.a(); + } + + + template + template + void + uniform_int_distribution<_IntType>:: + __generate_impl(_ForwardIterator __f, _ForwardIterator __t, + _UniformRandomNumberGenerator& __urng, + const param_type& __param) + { + + typedef typename _UniformRandomNumberGenerator::result_type + _Gresult_type; + typedef typename std::make_unsigned::type __utype; + typedef typename std::common_type<_Gresult_type, __utype>::type + __uctype; + + const __uctype __urngmin = __urng.min(); + const __uctype __urngmax = __urng.max(); + const __uctype __urngrange = __urngmax - __urngmin; + const __uctype __urange + = __uctype(__param.b()) - __uctype(__param.a()); + + __uctype __ret; + + if (__urngrange > __urange) + { + if (__detail::_Power_of_2(__urngrange + 1) + && __detail::_Power_of_2(__urange + 1)) + { + while (__f != __t) + { + __ret = __uctype(__urng()) - __urngmin; + *__f++ = (__ret & __urange) + __param.a(); + } + } + else + { + + const __uctype __uerange = __urange + 1; + const __uctype __scaling = __urngrange / __uerange; + const __uctype __past = __uerange * __scaling; + while (__f != __t) + { + do + __ret = __uctype(__urng()) - __urngmin; + while (__ret >= __past); + *__f++ = __ret / __scaling + __param.a(); + } + } + } + else if (__urngrange < __urange) + { +# 347 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 3 + __uctype __tmp; + while (__f != __t) + { + do + { + const __uctype __uerngrange = __urngrange + 1; + __tmp = (__uerngrange * operator() + (__urng, param_type(0, __urange / __uerngrange))); + __ret = __tmp + (__uctype(__urng()) - __urngmin); + } + while (__ret > __urange || __ret < __tmp); + *__f++ = __ret; + } + } + else + while (__f != __t) + *__f++ = __uctype(__urng()) - __urngmin + __param.a(); + } + + +} +# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 2 3 + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + template + void + __move_median_to_first(_Iterator __result,_Iterator __a, _Iterator __b, + _Iterator __c, _Compare __comp) + { + if (__comp(__a, __b)) + { + if (__comp(__b, __c)) + std::iter_swap(__result, __b); + else if (__comp(__a, __c)) + std::iter_swap(__result, __c); + else + std::iter_swap(__result, __a); + } + else if (__comp(__a, __c)) + std::iter_swap(__result, __a); + else if (__comp(__b, __c)) + std::iter_swap(__result, __c); + else + std::iter_swap(__result, __b); + } + + + template + inline _InputIterator + __find_if(_InputIterator __first, _InputIterator __last, + _Predicate __pred, input_iterator_tag) + { + while (__first != __last && !__pred(__first)) + ++__first; + return __first; + } + + + template + _RandomAccessIterator + __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Predicate __pred, random_access_iterator_tag) + { + typename iterator_traits<_RandomAccessIterator>::difference_type + __trip_count = (__last - __first) >> 2; + + for (; __trip_count > 0; --__trip_count) + { + if (__pred(__first)) + return __first; + ++__first; + + if (__pred(__first)) + return __first; + ++__first; + + if (__pred(__first)) + return __first; + ++__first; + + if (__pred(__first)) + return __first; + ++__first; + } + + switch (__last - __first) + { + case 3: + if (__pred(__first)) + return __first; + ++__first; + case 2: + if (__pred(__first)) + return __first; + ++__first; + case 1: + if (__pred(__first)) + return __first; + ++__first; + case 0: + default: + return __last; + } + } + + template + inline _Iterator + __find_if(_Iterator __first, _Iterator __last, _Predicate __pred) + { + return __find_if(__first, __last, __pred, + std::__iterator_category(__first)); + } + + + template + inline _InputIterator + __find_if_not(_InputIterator __first, _InputIterator __last, + _Predicate __pred) + { + return std::__find_if(__first, __last, + __gnu_cxx::__ops::__negate(__pred), + std::__iterator_category(__first)); + } + + + + + template + _InputIterator + __find_if_not_n(_InputIterator __first, _Distance& __len, _Predicate __pred) + { + for (; __len; --__len, ++__first) + if (!__pred(__first)) + break; + return __first; + } +# 202 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _ForwardIterator1 + __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + _BinaryPredicate __predicate) + { + + if (__first1 == __last1 || __first2 == __last2) + return __first1; + + + _ForwardIterator2 __p1(__first2); + if (++__p1 == __last2) + return std::__find_if(__first1, __last1, + __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2)); + + + _ForwardIterator2 __p; + _ForwardIterator1 __current = __first1; + + for (;;) + { + __first1 = + std::__find_if(__first1, __last1, + __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2)); + + if (__first1 == __last1) + return __last1; + + __p = __p1; + __current = __first1; + if (++__current == __last1) + return __last1; + + while (__predicate(__current, __p)) + { + if (++__p == __last2) + return __first1; + if (++__current == __last1) + return __last1; + } + ++__first1; + } + return __first1; + } + + + + + + + template + _ForwardIterator + __search_n_aux(_ForwardIterator __first, _ForwardIterator __last, + _Integer __count, _UnaryPredicate __unary_pred, + std::forward_iterator_tag) + { + __first = std::__find_if(__first, __last, __unary_pred); + while (__first != __last) + { + typename iterator_traits<_ForwardIterator>::difference_type + __n = __count; + _ForwardIterator __i = __first; + ++__i; + while (__i != __last && __n != 1 && __unary_pred(__i)) + { + ++__i; + --__n; + } + if (__n == 1) + return __first; + if (__i == __last) + return __last; + __first = std::__find_if(++__i, __last, __unary_pred); + } + return __last; + } + + + + + + template + _RandomAccessIter + __search_n_aux(_RandomAccessIter __first, _RandomAccessIter __last, + _Integer __count, _UnaryPredicate __unary_pred, + std::random_access_iterator_tag) + { + typedef typename std::iterator_traits<_RandomAccessIter>::difference_type + _DistanceType; + + _DistanceType __tailSize = __last - __first; + _DistanceType __remainder = __count; + + while (__remainder <= __tailSize) + { + __first += __remainder; + __tailSize -= __remainder; + + + _RandomAccessIter __backTrack = __first; + while (__unary_pred(--__backTrack)) + { + if (--__remainder == 0) + return (__first - __count); + } + __remainder = __count + 1 - (__first - __backTrack); + } + return __last; + } + + template + _ForwardIterator + __search_n(_ForwardIterator __first, _ForwardIterator __last, + _Integer __count, + _UnaryPredicate __unary_pred) + { + if (__count <= 0) + return __first; + + if (__count == 1) + return std::__find_if(__first, __last, __unary_pred); + + return std::__search_n_aux(__first, __last, __count, __unary_pred, + std::__iterator_category(__first)); + } + + + template + _ForwardIterator1 + __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + forward_iterator_tag, forward_iterator_tag, + _BinaryPredicate __comp) + { + if (__first2 == __last2) + return __last1; + + _ForwardIterator1 __result = __last1; + while (1) + { + _ForwardIterator1 __new_result + = std::__search(__first1, __last1, __first2, __last2, __comp); + if (__new_result == __last1) + return __result; + else + { + __result = __new_result; + __first1 = __new_result; + ++__first1; + } + } + } + + + template + _BidirectionalIterator1 + __find_end(_BidirectionalIterator1 __first1, + _BidirectionalIterator1 __last1, + _BidirectionalIterator2 __first2, + _BidirectionalIterator2 __last2, + bidirectional_iterator_tag, bidirectional_iterator_tag, + _BinaryPredicate __comp) + { + + + + + + + typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1; + typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2; + + _RevIterator1 __rlast1(__first1); + _RevIterator2 __rlast2(__first2); + _RevIterator1 __rresult = std::__search(_RevIterator1(__last1), __rlast1, + _RevIterator2(__last2), __rlast2, + __comp); + + if (__rresult == __rlast1) + return __last1; + else + { + _BidirectionalIterator1 __result = __rresult.base(); + std::advance(__result, -std::distance(__first2, __last2)); + return __result; + } + } +# 423 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator1 + find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2) + { + + + + + + + ; + ; + + return std::__find_end(__first1, __last1, __first2, __last2, + std::__iterator_category(__first1), + std::__iterator_category(__first2), + __gnu_cxx::__ops::__iter_equal_to_iter()); + } +# 471 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator1 + find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + _BinaryPredicate __comp) + { + + + + + + + ; + ; + + return std::__find_end(__first1, __last1, __first2, __last2, + std::__iterator_category(__first1), + std::__iterator_category(__first2), + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } +# 506 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) + { return __last == std::find_if_not(__first, __last, __pred); } +# 523 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) + { return __last == std::find_if(__first, __last, __pred); } +# 541 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) + { return !std::none_of(__first, __last, __pred); } +# 556 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _InputIterator + find_if_not(_InputIterator __first, _InputIterator __last, + _Predicate __pred) + { + + + + + ; + return std::__find_if_not(__first, __last, + __gnu_cxx::__ops::__pred_iter(__pred)); + } +# 580 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + is_partitioned(_InputIterator __first, _InputIterator __last, + _Predicate __pred) + { + __first = std::find_if_not(__first, __last, __pred); + return std::none_of(__first, __last, __pred); + } +# 598 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _ForwardIterator + partition_point(_ForwardIterator __first, _ForwardIterator __last, + _Predicate __pred) + { + + + + + + + ; + + typedef typename iterator_traits<_ForwardIterator>::difference_type + _DistanceType; + + _DistanceType __len = std::distance(__first, __last); + _DistanceType __half; + _ForwardIterator __middle; + + while (__len > 0) + { + __half = __len >> 1; + __middle = __first; + std::advance(__middle, __half); + if (__pred(*__middle)) + { + __first = __middle; + ++__first; + __len = __len - __half - 1; + } + else + __len = __half; + } + return __first; + } + + + template + _OutputIterator + __remove_copy_if(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _Predicate __pred) + { + for (; __first != __last; ++__first) + if (!__pred(__first)) + { + *__result = *__first; + ++__result; + } + return __result; + } +# 665 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + remove_copy(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, const _Tp& __value) + { + + + + + + + ; + + return std::__remove_copy_if(__first, __last, __result, + __gnu_cxx::__ops::__iter_equals_val(__value)); + } +# 697 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + remove_copy_if(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _Predicate __pred) + { + + + + + + + ; + + return std::__remove_copy_if(__first, __last, __result, + __gnu_cxx::__ops::__pred_iter(__pred)); + } +# 731 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _OutputIterator + copy_if(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _Predicate __pred) + { + + + + + + + ; + + for (; __first != __last; ++__first) + if (__pred(*__first)) + { + *__result = *__first; + ++__result; + } + return __result; + } + + template + _OutputIterator + __copy_n(_InputIterator __first, _Size __n, + _OutputIterator __result, input_iterator_tag) + { + if (__n > 0) + { + while (true) + { + *__result = *__first; + ++__result; + if (--__n > 0) + ++__first; + else + break; + } + } + return __result; + } + + template + inline _OutputIterator + __copy_n(_RandomAccessIterator __first, _Size __n, + _OutputIterator __result, random_access_iterator_tag) + { return std::copy(__first, __first + __n, __result); } +# 794 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + copy_n(_InputIterator __first, _Size __n, _OutputIterator __result) + { + + + + + + return std::__copy_n(__first, __n, __result, + std::__iterator_category(__first)); + } +# 822 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + pair<_OutputIterator1, _OutputIterator2> + partition_copy(_InputIterator __first, _InputIterator __last, + _OutputIterator1 __out_true, _OutputIterator2 __out_false, + _Predicate __pred) + { +# 837 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + + for (; __first != __last; ++__first) + if (__pred(*__first)) + { + *__out_true = *__first; + ++__out_true; + } + else + { + *__out_false = *__first; + ++__out_false; + } + + return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false); + } + + + template + _ForwardIterator + __remove_if(_ForwardIterator __first, _ForwardIterator __last, + _Predicate __pred) + { + __first = std::__find_if(__first, __last, __pred); + if (__first == __last) + return __first; + _ForwardIterator __result = __first; + ++__first; + for (; __first != __last; ++__first) + if (!__pred(__first)) + { + *__result = std::move(*__first); + ++__result; + } + return __result; + } +# 891 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + remove(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __value) + { + + + + + + ; + + return std::__remove_if(__first, __last, + __gnu_cxx::__ops::__iter_equals_val(__value)); + } +# 924 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + remove_if(_ForwardIterator __first, _ForwardIterator __last, + _Predicate __pred) + { + + + + + + ; + + return std::__remove_if(__first, __last, + __gnu_cxx::__ops::__pred_iter(__pred)); + } + + template + _ForwardIterator + __adjacent_find(_ForwardIterator __first, _ForwardIterator __last, + _BinaryPredicate __binary_pred) + { + if (__first == __last) + return __last; + _ForwardIterator __next = __first; + while (++__next != __last) + { + if (__binary_pred(__first, __next)) + return __first; + __first = __next; + } + return __last; + } + + template + _ForwardIterator + __unique(_ForwardIterator __first, _ForwardIterator __last, + _BinaryPredicate __binary_pred) + { + + __first = std::__adjacent_find(__first, __last, __binary_pred); + if (__first == __last) + return __last; + + + _ForwardIterator __dest = __first; + ++__first; + while (++__first != __last) + if (!__binary_pred(__dest, __first)) + *++__dest = std::move(*__first); + return ++__dest; + } +# 990 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + unique(_ForwardIterator __first, _ForwardIterator __last) + { + + + + + + ; + + return std::__unique(__first, __last, + __gnu_cxx::__ops::__iter_equal_to_iter()); + } +# 1020 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + unique(_ForwardIterator __first, _ForwardIterator __last, + _BinaryPredicate __binary_pred) + { + + + + + + + ; + + return std::__unique(__first, __last, + __gnu_cxx::__ops::__iter_comp_iter(__binary_pred)); + } + + + + + + + + template + _OutputIterator + __unique_copy(_ForwardIterator __first, _ForwardIterator __last, + _OutputIterator __result, _BinaryPredicate __binary_pred, + forward_iterator_tag, output_iterator_tag) + { + + + + + + _ForwardIterator __next = __first; + *__result = *__first; + while (++__next != __last) + if (!__binary_pred(__first, __next)) + { + __first = __next; + *++__result = *__first; + } + return ++__result; + } + + + + + + + + template + _OutputIterator + __unique_copy(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _BinaryPredicate __binary_pred, + input_iterator_tag, output_iterator_tag) + { + + + + + + typename iterator_traits<_InputIterator>::value_type __value = *__first; + __decltype(__gnu_cxx::__ops::__iter_comp_val(__binary_pred)) + __rebound_pred + = __gnu_cxx::__ops::__iter_comp_val(__binary_pred); + *__result = __value; + while (++__first != __last) + if (!__rebound_pred(__first, __value)) + { + __value = *__first; + *++__result = __value; + } + return ++__result; + } + + + + + + + + template + _ForwardIterator + __unique_copy(_InputIterator __first, _InputIterator __last, + _ForwardIterator __result, _BinaryPredicate __binary_pred, + input_iterator_tag, forward_iterator_tag) + { + + + + + *__result = *__first; + while (++__first != __last) + if (!__binary_pred(__result, __first)) + *++__result = *__first; + return ++__result; + } + + + + + + + template + void + __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, + bidirectional_iterator_tag) + { + while (true) + if (__first == __last || __first == --__last) + return; + else + { + std::iter_swap(__first, __last); + ++__first; + } + } + + + + + + + template + void + __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, + random_access_iterator_tag) + { + if (__first == __last) + return; + --__last; + while (__first < __last) + { + std::iter_swap(__first, __last); + ++__first; + --__last; + } + } +# 1175 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + reverse(_BidirectionalIterator __first, _BidirectionalIterator __last) + { + + + + ; + std::__reverse(__first, __last, std::__iterator_category(__first)); + } +# 1202 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _OutputIterator + reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, + _OutputIterator __result) + { + + + + + + ; + + while (__first != __last) + { + --__last; + *__result = *__last; + ++__result; + } + return __result; + } + + + + + + template + _EuclideanRingElement + __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n) + { + while (__n != 0) + { + _EuclideanRingElement __t = __m % __n; + __m = __n; + __n = __t; + } + return __m; + } + + inline namespace _V2 + { + + + template + _ForwardIterator + __rotate(_ForwardIterator __first, + _ForwardIterator __middle, + _ForwardIterator __last, + forward_iterator_tag) + { + if (__first == __middle) + return __last; + else if (__last == __middle) + return __first; + + _ForwardIterator __first2 = __middle; + do + { + std::iter_swap(__first, __first2); + ++__first; + ++__first2; + if (__first == __middle) + __middle = __first2; + } + while (__first2 != __last); + + _ForwardIterator __ret = __first; + + __first2 = __middle; + + while (__first2 != __last) + { + std::iter_swap(__first, __first2); + ++__first; + ++__first2; + if (__first == __middle) + __middle = __first2; + else if (__first2 == __last) + __first2 = __middle; + } + return __ret; + } + + + template + _BidirectionalIterator + __rotate(_BidirectionalIterator __first, + _BidirectionalIterator __middle, + _BidirectionalIterator __last, + bidirectional_iterator_tag) + { + + + + + if (__first == __middle) + return __last; + else if (__last == __middle) + return __first; + + std::__reverse(__first, __middle, bidirectional_iterator_tag()); + std::__reverse(__middle, __last, bidirectional_iterator_tag()); + + while (__first != __middle && __middle != __last) + { + std::iter_swap(__first, --__last); + ++__first; + } + + if (__first == __middle) + { + std::__reverse(__middle, __last, bidirectional_iterator_tag()); + return __last; + } + else + { + std::__reverse(__first, __middle, bidirectional_iterator_tag()); + return __first; + } + } + + + template + _RandomAccessIterator + __rotate(_RandomAccessIterator __first, + _RandomAccessIterator __middle, + _RandomAccessIterator __last, + random_access_iterator_tag) + { + + + + + if (__first == __middle) + return __last; + else if (__last == __middle) + return __first; + + typedef typename iterator_traits<_RandomAccessIterator>::difference_type + _Distance; + typedef typename iterator_traits<_RandomAccessIterator>::value_type + _ValueType; + + _Distance __n = __last - __first; + _Distance __k = __middle - __first; + + if (__k == __n - __k) + { + std::swap_ranges(__first, __middle, __middle); + return __middle; + } + + _RandomAccessIterator __p = __first; + _RandomAccessIterator __ret = __first + (__last - __middle); + + for (;;) + { + if (__k < __n - __k) + { + if (__is_pod(_ValueType) && __k == 1) + { + _ValueType __t = std::move(*__p); + std::move(__p + 1, __p + __n, __p); + *(__p + __n - 1) = std::move(__t); + return __ret; + } + _RandomAccessIterator __q = __p + __k; + for (_Distance __i = 0; __i < __n - __k; ++ __i) + { + std::iter_swap(__p, __q); + ++__p; + ++__q; + } + __n %= __k; + if (__n == 0) + return __ret; + std::swap(__n, __k); + __k = __n - __k; + } + else + { + __k = __n - __k; + if (__is_pod(_ValueType) && __k == 1) + { + _ValueType __t = std::move(*(__p + __n - 1)); + std::move_backward(__p, __p + __n - 1, __p + __n); + *__p = std::move(__t); + return __ret; + } + _RandomAccessIterator __q = __p + __n; + __p = __q - __k; + for (_Distance __i = 0; __i < __n - __k; ++ __i) + { + --__p; + --__q; + std::iter_swap(__p, __q); + } + __n %= __k; + if (__n == 0) + return __ret; + std::swap(__n, __k); + } + } + } +# 1429 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + rotate(_ForwardIterator __first, _ForwardIterator __middle, + _ForwardIterator __last) + { + + + + ; + ; + + return std::__rotate(__first, __middle, __last, + std::__iterator_category(__first)); + } + + } +# 1466 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, + _ForwardIterator __last, _OutputIterator __result) + { + + + + + ; + ; + + return std::copy(__first, __middle, + std::copy(__middle, __last, __result)); + } + + + template + _ForwardIterator + __partition(_ForwardIterator __first, _ForwardIterator __last, + _Predicate __pred, forward_iterator_tag) + { + if (__first == __last) + return __first; + + while (__pred(*__first)) + if (++__first == __last) + return __first; + + _ForwardIterator __next = __first; + + while (++__next != __last) + if (__pred(*__next)) + { + std::iter_swap(__first, __next); + ++__first; + } + + return __first; + } + + + template + _BidirectionalIterator + __partition(_BidirectionalIterator __first, _BidirectionalIterator __last, + _Predicate __pred, bidirectional_iterator_tag) + { + while (true) + { + while (true) + if (__first == __last) + return __first; + else if (__pred(*__first)) + ++__first; + else + break; + --__last; + while (true) + if (__first == __last) + return __first; + else if (!bool(__pred(*__last))) + --__last; + else + break; + std::iter_swap(__first, __last); + ++__first; + } + } +# 1543 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _ForwardIterator + __stable_partition_adaptive(_ForwardIterator __first, + _ForwardIterator __last, + _Predicate __pred, _Distance __len, + _Pointer __buffer, + _Distance __buffer_size) + { + if (__len == 1) + return __first; + + if (__len <= __buffer_size) + { + _ForwardIterator __result1 = __first; + _Pointer __result2 = __buffer; + + + + + *__result2 = std::move(*__first); + ++__result2; + ++__first; + for (; __first != __last; ++__first) + if (__pred(__first)) + { + *__result1 = std::move(*__first); + ++__result1; + } + else + { + *__result2 = std::move(*__first); + ++__result2; + } + + std::move(__buffer, __result2, __result1); + return __result1; + } + + _ForwardIterator __middle = __first; + std::advance(__middle, __len / 2); + _ForwardIterator __left_split = + std::__stable_partition_adaptive(__first, __middle, __pred, + __len / 2, __buffer, + __buffer_size); + + + + _Distance __right_len = __len - __len / 2; + _ForwardIterator __right_split = + std::__find_if_not_n(__middle, __right_len, __pred); + + if (__right_len) + __right_split = + std::__stable_partition_adaptive(__right_split, __last, __pred, + __right_len, + __buffer, __buffer_size); + + std::rotate(__left_split, __middle, __right_split); + std::advance(__left_split, std::distance(__middle, __right_split)); + return __left_split; + } + + template + _ForwardIterator + __stable_partition(_ForwardIterator __first, _ForwardIterator __last, + _Predicate __pred) + { + __first = std::__find_if_not(__first, __last, __pred); + + if (__first == __last) + return __first; + + typedef typename iterator_traits<_ForwardIterator>::value_type + _ValueType; + typedef typename iterator_traits<_ForwardIterator>::difference_type + _DistanceType; + + _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first, __last); + return + std::__stable_partition_adaptive(__first, __last, __pred, + _DistanceType(__buf.requested_size()), + __buf.begin(), + _DistanceType(__buf.size())); + } +# 1646 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + stable_partition(_ForwardIterator __first, _ForwardIterator __last, + _Predicate __pred) + { + + + + + + ; + + return std::__stable_partition(__first, __last, + __gnu_cxx::__ops::__pred_iter(__pred)); + } + + + template + void + __heap_select(_RandomAccessIterator __first, + _RandomAccessIterator __middle, + _RandomAccessIterator __last, _Compare __comp) + { + std::__make_heap(__first, __middle, __comp); + for (_RandomAccessIterator __i = __middle; __i < __last; ++__i) + if (__comp(__i, __first)) + std::__pop_heap(__first, __middle, __i, __comp); + } + + + + template + _RandomAccessIterator + __partial_sort_copy(_InputIterator __first, _InputIterator __last, + _RandomAccessIterator __result_first, + _RandomAccessIterator __result_last, + _Compare __comp) + { + typedef typename iterator_traits<_InputIterator>::value_type + _InputValueType; + typedef iterator_traits<_RandomAccessIterator> _RItTraits; + typedef typename _RItTraits::difference_type _DistanceType; + + if (__result_first == __result_last) + return __result_last; + _RandomAccessIterator __result_real_last = __result_first; + while (__first != __last && __result_real_last != __result_last) + { + *__result_real_last = *__first; + ++__result_real_last; + ++__first; + } + + std::__make_heap(__result_first, __result_real_last, __comp); + while (__first != __last) + { + if (__comp(__first, __result_first)) + std::__adjust_heap(__result_first, _DistanceType(0), + _DistanceType(__result_real_last + - __result_first), + _InputValueType(*__first), __comp); + ++__first; + } + std::__sort_heap(__result_first, __result_real_last, __comp); + return __result_real_last; + } +# 1732 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _RandomAccessIterator + partial_sort_copy(_InputIterator __first, _InputIterator __last, + _RandomAccessIterator __result_first, + _RandomAccessIterator __result_last) + { +# 1752 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + + return std::__partial_sort_copy(__first, __last, + __result_first, __result_last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 1781 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _RandomAccessIterator + partial_sort_copy(_InputIterator __first, _InputIterator __last, + _RandomAccessIterator __result_first, + _RandomAccessIterator __result_last, + _Compare __comp) + { +# 1806 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + + return std::__partial_sort_copy(__first, __last, + __result_first, __result_last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + + template + void + __unguarded_linear_insert(_RandomAccessIterator __last, + _Compare __comp) + { + typename iterator_traits<_RandomAccessIterator>::value_type + __val = std::move(*__last); + _RandomAccessIterator __next = __last; + --__next; + while (__comp(__val, __next)) + { + *__last = std::move(*__next); + __last = __next; + --__next; + } + *__last = std::move(__val); + } + + + template + void + __insertion_sort(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Compare __comp) + { + if (__first == __last) return; + + for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) + { + if (__comp(__i, __first)) + { + typename iterator_traits<_RandomAccessIterator>::value_type + __val = std::move(*__i); + std::move_backward(__first, __i, __i + 1); + *__first = std::move(__val); + } + else + std::__unguarded_linear_insert(__i, + __gnu_cxx::__ops::__val_comp_iter(__comp)); + } + } + + + template + inline void + __unguarded_insertion_sort(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Compare __comp) + { + for (_RandomAccessIterator __i = __first; __i != __last; ++__i) + std::__unguarded_linear_insert(__i, + __gnu_cxx::__ops::__val_comp_iter(__comp)); + } + + + + + + enum { _S_threshold = 16 }; + + + template + void + __final_insertion_sort(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Compare __comp) + { + if (__last - __first > int(_S_threshold)) + { + std::__insertion_sort(__first, __first + int(_S_threshold), __comp); + std::__unguarded_insertion_sort(__first + int(_S_threshold), __last, + __comp); + } + else + std::__insertion_sort(__first, __last, __comp); + } + + + template + _RandomAccessIterator + __unguarded_partition(_RandomAccessIterator __first, + _RandomAccessIterator __last, + _RandomAccessIterator __pivot, _Compare __comp) + { + while (true) + { + while (__comp(__first, __pivot)) + ++__first; + --__last; + while (__comp(__pivot, __last)) + --__last; + if (!(__first < __last)) + return __first; + std::iter_swap(__first, __last); + ++__first; + } + } + + + template + inline _RandomAccessIterator + __unguarded_partition_pivot(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Compare __comp) + { + _RandomAccessIterator __mid = __first + (__last - __first) / 2; + std::__move_median_to_first(__first, __first + 1, __mid, __last - 1, + __comp); + return std::__unguarded_partition(__first + 1, __last, __first, __comp); + } + + template + inline void + __partial_sort(_RandomAccessIterator __first, + _RandomAccessIterator __middle, + _RandomAccessIterator __last, + _Compare __comp) + { + std::__heap_select(__first, __middle, __last, __comp); + std::__sort_heap(__first, __middle, __comp); + } + + + template + void + __introsort_loop(_RandomAccessIterator __first, + _RandomAccessIterator __last, + _Size __depth_limit, _Compare __comp) + { + while (__last - __first > int(_S_threshold)) + { + if (__depth_limit == 0) + { + std::__partial_sort(__first, __last, __last, __comp); + return; + } + --__depth_limit; + _RandomAccessIterator __cut = + std::__unguarded_partition_pivot(__first, __last, __comp); + std::__introsort_loop(__cut, __last, __depth_limit, __comp); + __last = __cut; + } + } + + + + template + inline void + __sort(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { + if (__first != __last) + { + std::__introsort_loop(__first, __last, + std::__lg(__last - __first) * 2, + __comp); + std::__final_insertion_sort(__first, __last, __comp); + } + } + + template + void + __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth, + _RandomAccessIterator __last, _Size __depth_limit, + _Compare __comp) + { + while (__last - __first > 3) + { + if (__depth_limit == 0) + { + std::__heap_select(__first, __nth + 1, __last, __comp); + + std::iter_swap(__first, __nth); + return; + } + --__depth_limit; + _RandomAccessIterator __cut = + std::__unguarded_partition_pivot(__first, __last, __comp); + if (__cut <= __nth) + __first = __cut; + else + __last = __cut; + } + std::__insertion_sort(__first, __last, __comp); + } +# 2018 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + lower_bound(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val, _Compare __comp) + { + + + + + + ; + + return std::__lower_bound(__first, __last, __val, + __gnu_cxx::__ops::__iter_comp_val(__comp)); + } + + template + _ForwardIterator + __upper_bound(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val, _Compare __comp) + { + typedef typename iterator_traits<_ForwardIterator>::difference_type + _DistanceType; + + _DistanceType __len = std::distance(__first, __last); + + while (__len > 0) + { + _DistanceType __half = __len >> 1; + _ForwardIterator __middle = __first; + std::advance(__middle, __half); + if (__comp(__val, __middle)) + __len = __half; + else + { + __first = __middle; + ++__first; + __len = __len - __half - 1; + } + } + return __first; + } +# 2072 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + upper_bound(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val) + { + + + + + ; + + return std::__upper_bound(__first, __last, __val, + __gnu_cxx::__ops::__val_less_iter()); + } +# 2102 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + upper_bound(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val, _Compare __comp) + { + + + + + + ; + + return std::__upper_bound(__first, __last, __val, + __gnu_cxx::__ops::__val_comp_iter(__comp)); + } + + template + pair<_ForwardIterator, _ForwardIterator> + __equal_range(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val, + _CompareItTp __comp_it_val, _CompareTpIt __comp_val_it) + { + typedef typename iterator_traits<_ForwardIterator>::difference_type + _DistanceType; + + _DistanceType __len = std::distance(__first, __last); + + while (__len > 0) + { + _DistanceType __half = __len >> 1; + _ForwardIterator __middle = __first; + std::advance(__middle, __half); + if (__comp_it_val(__middle, __val)) + { + __first = __middle; + ++__first; + __len = __len - __half - 1; + } + else if (__comp_val_it(__val, __middle)) + __len = __half; + else + { + _ForwardIterator __left + = std::__lower_bound(__first, __middle, __val, __comp_it_val); + std::advance(__first, __len); + _ForwardIterator __right + = std::__upper_bound(++__middle, __first, __val, __comp_val_it); + return pair<_ForwardIterator, _ForwardIterator>(__left, __right); + } + } + return pair<_ForwardIterator, _ForwardIterator>(__first, __first); + } +# 2173 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline pair<_ForwardIterator, _ForwardIterator> + equal_range(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val) + { + + + + + + + ; + ; + + return std::__equal_range(__first, __last, __val, + __gnu_cxx::__ops::__iter_less_val(), + __gnu_cxx::__ops::__val_less_iter()); + } +# 2209 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline pair<_ForwardIterator, _ForwardIterator> + equal_range(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val, _Compare __comp) + { + + + + + + + + ; + + ; + + return std::__equal_range(__first, __last, __val, + __gnu_cxx::__ops::__iter_comp_val(__comp), + __gnu_cxx::__ops::__val_comp_iter(__comp)); + } +# 2242 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + bool + binary_search(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val) + { + + + + + ; + ; + + _ForwardIterator __i + = std::__lower_bound(__first, __last, __val, + __gnu_cxx::__ops::__iter_less_val()); + return __i != __last && !(__val < *__i); + } +# 2275 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + bool + binary_search(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __val, _Compare __comp) + { + + + + + + ; + + ; + + _ForwardIterator __i + = std::__lower_bound(__first, __last, __val, + __gnu_cxx::__ops::__iter_comp_val(__comp)); + return __i != __last && !bool(__comp(__val, *__i)); + } + + + + + template + void + __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) + { + while (__first1 != __last1 && __first2 != __last2) + { + if (__comp(__first2, __first1)) + { + *__result = std::move(*__first2); + ++__first2; + } + else + { + *__result = std::move(*__first1); + ++__first1; + } + ++__result; + } + if (__first1 != __last1) + std::move(__first1, __last1, __result); + } + + + template + void + __move_merge_adaptive_backward(_BidirectionalIterator1 __first1, + _BidirectionalIterator1 __last1, + _BidirectionalIterator2 __first2, + _BidirectionalIterator2 __last2, + _BidirectionalIterator3 __result, + _Compare __comp) + { + if (__first1 == __last1) + { + std::move_backward(__first2, __last2, __result); + return; + } + else if (__first2 == __last2) + return; + + --__last1; + --__last2; + while (true) + { + if (__comp(__last2, __last1)) + { + *--__result = std::move(*__last1); + if (__first1 == __last1) + { + std::move_backward(__first2, ++__last2, __result); + return; + } + --__last1; + } + else + { + *--__result = std::move(*__last2); + if (__first2 == __last2) + return; + --__last2; + } + } + } + + + template + _BidirectionalIterator1 + __rotate_adaptive(_BidirectionalIterator1 __first, + _BidirectionalIterator1 __middle, + _BidirectionalIterator1 __last, + _Distance __len1, _Distance __len2, + _BidirectionalIterator2 __buffer, + _Distance __buffer_size) + { + _BidirectionalIterator2 __buffer_end; + if (__len1 > __len2 && __len2 <= __buffer_size) + { + if (__len2) + { + __buffer_end = std::move(__middle, __last, __buffer); + std::move_backward(__first, __middle, __last); + return std::move(__buffer, __buffer_end, __first); + } + else + return __first; + } + else if (__len1 <= __buffer_size) + { + if (__len1) + { + __buffer_end = std::move(__first, __middle, __buffer); + std::move(__middle, __last, __first); + return std::move_backward(__buffer, __buffer_end, __last); + } + else + return __last; + } + else + { + std::rotate(__first, __middle, __last); + std::advance(__first, std::distance(__middle, __last)); + return __first; + } + } + + + template + void + __merge_adaptive(_BidirectionalIterator __first, + _BidirectionalIterator __middle, + _BidirectionalIterator __last, + _Distance __len1, _Distance __len2, + _Pointer __buffer, _Distance __buffer_size, + _Compare __comp) + { + if (__len1 <= __len2 && __len1 <= __buffer_size) + { + _Pointer __buffer_end = std::move(__first, __middle, __buffer); + std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last, + __first, __comp); + } + else if (__len2 <= __buffer_size) + { + _Pointer __buffer_end = std::move(__middle, __last, __buffer); + std::__move_merge_adaptive_backward(__first, __middle, __buffer, + __buffer_end, __last, __comp); + } + else + { + _BidirectionalIterator __first_cut = __first; + _BidirectionalIterator __second_cut = __middle; + _Distance __len11 = 0; + _Distance __len22 = 0; + if (__len1 > __len2) + { + __len11 = __len1 / 2; + std::advance(__first_cut, __len11); + __second_cut + = std::__lower_bound(__middle, __last, *__first_cut, + __gnu_cxx::__ops::__iter_comp_val(__comp)); + __len22 = std::distance(__middle, __second_cut); + } + else + { + __len22 = __len2 / 2; + std::advance(__second_cut, __len22); + __first_cut + = std::__upper_bound(__first, __middle, *__second_cut, + __gnu_cxx::__ops::__val_comp_iter(__comp)); + __len11 = std::distance(__first, __first_cut); + } + + _BidirectionalIterator __new_middle + = std::__rotate_adaptive(__first_cut, __middle, __second_cut, + __len1 - __len11, __len22, __buffer, + __buffer_size); + std::__merge_adaptive(__first, __first_cut, __new_middle, __len11, + __len22, __buffer, __buffer_size, __comp); + std::__merge_adaptive(__new_middle, __second_cut, __last, + __len1 - __len11, + __len2 - __len22, __buffer, + __buffer_size, __comp); + } + } + + + template + void + __merge_without_buffer(_BidirectionalIterator __first, + _BidirectionalIterator __middle, + _BidirectionalIterator __last, + _Distance __len1, _Distance __len2, + _Compare __comp) + { + if (__len1 == 0 || __len2 == 0) + return; + + if (__len1 + __len2 == 2) + { + if (__comp(__middle, __first)) + std::iter_swap(__first, __middle); + return; + } + + _BidirectionalIterator __first_cut = __first; + _BidirectionalIterator __second_cut = __middle; + _Distance __len11 = 0; + _Distance __len22 = 0; + if (__len1 > __len2) + { + __len11 = __len1 / 2; + std::advance(__first_cut, __len11); + __second_cut + = std::__lower_bound(__middle, __last, *__first_cut, + __gnu_cxx::__ops::__iter_comp_val(__comp)); + __len22 = std::distance(__middle, __second_cut); + } + else + { + __len22 = __len2 / 2; + std::advance(__second_cut, __len22); + __first_cut + = std::__upper_bound(__first, __middle, *__second_cut, + __gnu_cxx::__ops::__val_comp_iter(__comp)); + __len11 = std::distance(__first, __first_cut); + } + + std::rotate(__first_cut, __middle, __second_cut); + _BidirectionalIterator __new_middle = __first_cut; + std::advance(__new_middle, std::distance(__middle, __second_cut)); + std::__merge_without_buffer(__first, __first_cut, __new_middle, + __len11, __len22, __comp); + std::__merge_without_buffer(__new_middle, __second_cut, __last, + __len1 - __len11, __len2 - __len22, __comp); + } + + template + void + __inplace_merge(_BidirectionalIterator __first, + _BidirectionalIterator __middle, + _BidirectionalIterator __last, + _Compare __comp) + { + typedef typename iterator_traits<_BidirectionalIterator>::value_type + _ValueType; + typedef typename iterator_traits<_BidirectionalIterator>::difference_type + _DistanceType; + + if (__first == __middle || __middle == __last) + return; + + const _DistanceType __len1 = std::distance(__first, __middle); + const _DistanceType __len2 = std::distance(__middle, __last); + + typedef _Temporary_buffer<_BidirectionalIterator, _ValueType> _TmpBuf; + _TmpBuf __buf(__first, __last); + + if (__buf.begin() == 0) + std::__merge_without_buffer + (__first, __middle, __last, __len1, __len2, __comp); + else + std::__merge_adaptive + (__first, __middle, __last, __len1, __len2, __buf.begin(), + _DistanceType(__buf.size()), __comp); + } +# 2569 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + inplace_merge(_BidirectionalIterator __first, + _BidirectionalIterator __middle, + _BidirectionalIterator __last) + { + + + + + + ; + ; + ; + + std::__inplace_merge(__first, __middle, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 2610 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + inplace_merge(_BidirectionalIterator __first, + _BidirectionalIterator __middle, + _BidirectionalIterator __last, + _Compare __comp) + { + + + + + + + ; + ; + ; + + std::__inplace_merge(__first, __middle, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + + + template + _OutputIterator + __move_merge(_InputIterator __first1, _InputIterator __last1, + _InputIterator __first2, _InputIterator __last2, + _OutputIterator __result, _Compare __comp) + { + while (__first1 != __last1 && __first2 != __last2) + { + if (__comp(__first2, __first1)) + { + *__result = std::move(*__first2); + ++__first2; + } + else + { + *__result = std::move(*__first1); + ++__first1; + } + ++__result; + } + return std::move(__first2, __last2, std::move(__first1, __last1, __result)); + + + } + + template + void + __merge_sort_loop(_RandomAccessIterator1 __first, + _RandomAccessIterator1 __last, + _RandomAccessIterator2 __result, _Distance __step_size, + _Compare __comp) + { + const _Distance __two_step = 2 * __step_size; + + while (__last - __first >= __two_step) + { + __result = std::__move_merge(__first, __first + __step_size, + __first + __step_size, + __first + __two_step, + __result, __comp); + __first += __two_step; + } + __step_size = std::min(_Distance(__last - __first), __step_size); + + std::__move_merge(__first, __first + __step_size, + __first + __step_size, __last, __result, __comp); + } + + template + void + __chunk_insertion_sort(_RandomAccessIterator __first, + _RandomAccessIterator __last, + _Distance __chunk_size, _Compare __comp) + { + while (__last - __first >= __chunk_size) + { + std::__insertion_sort(__first, __first + __chunk_size, __comp); + __first += __chunk_size; + } + std::__insertion_sort(__first, __last, __comp); + } + + enum { _S_chunk_size = 7 }; + + template + void + __merge_sort_with_buffer(_RandomAccessIterator __first, + _RandomAccessIterator __last, + _Pointer __buffer, _Compare __comp) + { + typedef typename iterator_traits<_RandomAccessIterator>::difference_type + _Distance; + + const _Distance __len = __last - __first; + const _Pointer __buffer_last = __buffer + __len; + + _Distance __step_size = _S_chunk_size; + std::__chunk_insertion_sort(__first, __last, __step_size, __comp); + + while (__step_size < __len) + { + std::__merge_sort_loop(__first, __last, __buffer, + __step_size, __comp); + __step_size *= 2; + std::__merge_sort_loop(__buffer, __buffer_last, __first, + __step_size, __comp); + __step_size *= 2; + } + } + + template + void + __stable_sort_adaptive(_RandomAccessIterator __first, + _RandomAccessIterator __last, + _Pointer __buffer, _Distance __buffer_size, + _Compare __comp) + { + const _Distance __len = (__last - __first + 1) / 2; + const _RandomAccessIterator __middle = __first + __len; + if (__len > __buffer_size) + { + std::__stable_sort_adaptive(__first, __middle, __buffer, + __buffer_size, __comp); + std::__stable_sort_adaptive(__middle, __last, __buffer, + __buffer_size, __comp); + } + else + { + std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp); + std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp); + } + std::__merge_adaptive(__first, __middle, __last, + _Distance(__middle - __first), + _Distance(__last - __middle), + __buffer, __buffer_size, + __comp); + } + + + template + void + __inplace_stable_sort(_RandomAccessIterator __first, + _RandomAccessIterator __last, _Compare __comp) + { + if (__last - __first < 15) + { + std::__insertion_sort(__first, __last, __comp); + return; + } + _RandomAccessIterator __middle = __first + (__last - __first) / 2; + std::__inplace_stable_sort(__first, __middle, __comp); + std::__inplace_stable_sort(__middle, __last, __comp); + std::__merge_without_buffer(__first, __middle, __last, + __middle - __first, + __last - __middle, + __comp); + } +# 2782 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + bool + __includes(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _Compare __comp) + { + while (__first1 != __last1 && __first2 != __last2) + if (__comp(__first2, __first1)) + return false; + else if (__comp(__first1, __first2)) + ++__first1; + else + { + ++__first1; + ++__first2; + } + + return __first2 == __last2; + } +# 2821 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + includes(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2) + { +# 2835 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__includes(__first1, __last1, __first2, __last2, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 2865 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + includes(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _Compare __comp) + { +# 2881 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__includes(__first1, __last1, __first2, __last2, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } +# 2900 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + bool + __next_permutation(_BidirectionalIterator __first, + _BidirectionalIterator __last, _Compare __comp) + { + if (__first == __last) + return false; + _BidirectionalIterator __i = __first; + ++__i; + if (__i == __last) + return false; + __i = __last; + --__i; + + for(;;) + { + _BidirectionalIterator __ii = __i; + --__i; + if (__comp(__i, __ii)) + { + _BidirectionalIterator __j = __last; + while (!__comp(__i, --__j)) + {} + std::iter_swap(__i, __j); + std::__reverse(__ii, __last, + std::__iterator_category(__first)); + return true; + } + if (__i == __first) + { + std::__reverse(__first, __last, + std::__iterator_category(__first)); + return false; + } + } + } +# 2949 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + next_permutation(_BidirectionalIterator __first, + _BidirectionalIterator __last) + { + + + + + + ; + ; + + return std::__next_permutation + (__first, __last, __gnu_cxx::__ops::__iter_less_iter()); + } +# 2981 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + next_permutation(_BidirectionalIterator __first, + _BidirectionalIterator __last, _Compare __comp) + { + + + + + + + ; + ; + + return std::__next_permutation + (__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + bool + __prev_permutation(_BidirectionalIterator __first, + _BidirectionalIterator __last, _Compare __comp) + { + if (__first == __last) + return false; + _BidirectionalIterator __i = __first; + ++__i; + if (__i == __last) + return false; + __i = __last; + --__i; + + for(;;) + { + _BidirectionalIterator __ii = __i; + --__i; + if (__comp(__ii, __i)) + { + _BidirectionalIterator __j = __last; + while (!__comp(--__j, __i)) + {} + std::iter_swap(__i, __j); + std::__reverse(__ii, __last, + std::__iterator_category(__first)); + return true; + } + if (__i == __first) + { + std::__reverse(__first, __last, + std::__iterator_category(__first)); + return false; + } + } + } +# 3049 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + prev_permutation(_BidirectionalIterator __first, + _BidirectionalIterator __last) + { + + + + + + ; + ; + + return std::__prev_permutation(__first, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 3081 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + prev_permutation(_BidirectionalIterator __first, + _BidirectionalIterator __last, _Compare __comp) + { + + + + + + + ; + ; + + return std::__prev_permutation(__first, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + + + + template + _OutputIterator + __replace_copy_if(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, + _Predicate __pred, const _Tp& __new_value) + { + for (; __first != __last; ++__first, (void)++__result) + if (__pred(__first)) + *__result = __new_value; + else + *__result = *__first; + return __result; + } +# 3131 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + replace_copy(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, + const _Tp& __old_value, const _Tp& __new_value) + { + + + + + + + ; + + return std::__replace_copy_if(__first, __last, __result, + __gnu_cxx::__ops::__iter_equals_val(__old_value), + __new_value); + } +# 3165 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + replace_copy_if(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, + _Predicate __pred, const _Tp& __new_value) + { + + + + + + + ; + + return std::__replace_copy_if(__first, __last, __result, + __gnu_cxx::__ops::__pred_iter(__pred), + __new_value); + } + + template + typename iterator_traits<_InputIterator>::difference_type + __count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) + { + typename iterator_traits<_InputIterator>::difference_type __n = 0; + for (; __first != __last; ++__first) + if (__pred(__first)) + ++__n; + return __n; + } +# 3204 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + is_sorted(_ForwardIterator __first, _ForwardIterator __last) + { return std::is_sorted_until(__first, __last) == __last; } +# 3218 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + is_sorted(_ForwardIterator __first, _ForwardIterator __last, + _Compare __comp) + { return std::is_sorted_until(__first, __last, __comp) == __last; } + + template + _ForwardIterator + __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, + _Compare __comp) + { + if (__first == __last) + return __last; + + _ForwardIterator __next = __first; + for (++__next; __next != __last; __first = __next, (void)++__next) + if (__comp(__next, __first)) + return __next; + return __next; + } +# 3247 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + is_sorted_until(_ForwardIterator __first, _ForwardIterator __last) + { + + + + + ; + ; + + return std::__is_sorted_until(__first, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 3271 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, + _Compare __comp) + { + + + + + + ; + ; + + return std::__is_sorted_until(__first, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } +# 3296 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + constexpr + inline pair + minmax(const _Tp& __a, const _Tp& __b) + { + + + + return __b < __a ? pair(__b, __a) + : pair(__a, __b); + } +# 3317 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + constexpr + inline pair + minmax(const _Tp& __a, const _Tp& __b, _Compare __comp) + { + return __comp(__b, __a) ? pair(__b, __a) + : pair(__a, __b); + } + + template + constexpr + pair<_ForwardIterator, _ForwardIterator> + __minmax_element(_ForwardIterator __first, _ForwardIterator __last, + _Compare __comp) + { + _ForwardIterator __next = __first; + if (__first == __last + || ++__next == __last) + return std::make_pair(__first, __first); + + _ForwardIterator __min{}, __max{}; + if (__comp(__next, __first)) + { + __min = __next; + __max = __first; + } + else + { + __min = __first; + __max = __next; + } + + __first = __next; + ++__first; + + while (__first != __last) + { + __next = __first; + if (++__next == __last) + { + if (__comp(__first, __min)) + __min = __first; + else if (!__comp(__first, __max)) + __max = __first; + break; + } + + if (__comp(__next, __first)) + { + if (__comp(__next, __min)) + __min = __next; + if (!__comp(__first, __max)) + __max = __first; + } + else + { + if (__comp(__first, __min)) + __min = __first; + if (!__comp(__next, __max)) + __max = __next; + } + + __first = __next; + ++__first; + } + + return std::make_pair(__min, __max); + } +# 3397 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + constexpr + inline pair<_ForwardIterator, _ForwardIterator> + minmax_element(_ForwardIterator __first, _ForwardIterator __last) + { + + + + + ; + ; + + return std::__minmax_element(__first, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 3425 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + constexpr + inline pair<_ForwardIterator, _ForwardIterator> + minmax_element(_ForwardIterator __first, _ForwardIterator __last, + _Compare __comp) + { + + + + + + ; + ; + + return std::__minmax_element(__first, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + + template + constexpr + inline _Tp + min(initializer_list<_Tp> __l) + { return *std::min_element(__l.begin(), __l.end()); } + + template + constexpr + inline _Tp + min(initializer_list<_Tp> __l, _Compare __comp) + { return *std::min_element(__l.begin(), __l.end(), __comp); } + + template + constexpr + inline _Tp + max(initializer_list<_Tp> __l) + { return *std::max_element(__l.begin(), __l.end()); } + + template + constexpr + inline _Tp + max(initializer_list<_Tp> __l, _Compare __comp) + { return *std::max_element(__l.begin(), __l.end(), __comp); } + + template + constexpr + inline pair<_Tp, _Tp> + minmax(initializer_list<_Tp> __l) + { + pair __p = + std::minmax_element(__l.begin(), __l.end()); + return std::make_pair(*__p.first, *__p.second); + } + + template + constexpr + inline pair<_Tp, _Tp> + minmax(initializer_list<_Tp> __l, _Compare __comp) + { + pair __p = + std::minmax_element(__l.begin(), __l.end(), __comp); + return std::make_pair(*__p.first, *__p.second); + } + + template + bool + __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _BinaryPredicate __pred) + { + + + for (; __first1 != __last1; ++__first1, (void)++__first2) + if (!__pred(__first1, __first2)) + break; + + if (__first1 == __last1) + return true; + + + + _ForwardIterator2 __last2 = __first2; + std::advance(__last2, std::distance(__first1, __last1)); + for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan) + { + if (__scan != std::__find_if(__first1, __scan, + __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))) + continue; + + auto __matches + = std::__count_if(__first2, __last2, + __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)); + if (0 == __matches || + std::__count_if(__scan, __last1, + __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)) + != __matches) + return false; + } + return true; + } +# 3537 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2) + { + + + + + + + ; + + return std::__is_permutation(__first1, __last1, __first2, + __gnu_cxx::__ops::__iter_equal_to_iter()); + } +# 3568 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _BinaryPredicate __pred) + { + + + + + + + ; + + return std::__is_permutation(__first1, __last1, __first2, + __gnu_cxx::__ops::__iter_comp_iter(__pred)); + } + + + template + bool + __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + _BinaryPredicate __pred) + { + using _Cat1 + = typename iterator_traits<_ForwardIterator1>::iterator_category; + using _Cat2 + = typename iterator_traits<_ForwardIterator2>::iterator_category; + using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>; + using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>; + constexpr bool __ra_iters = _It1_is_RA() && _It2_is_RA(); + if (__ra_iters) + { + auto __d1 = std::distance(__first1, __last1); + auto __d2 = std::distance(__first2, __last2); + if (__d1 != __d2) + return false; + } + + + + for (; __first1 != __last1 && __first2 != __last2; + ++__first1, (void)++__first2) + if (!__pred(__first1, __first2)) + break; + + if (__ra_iters) + { + if (__first1 == __last1) + return true; + } + else + { + auto __d1 = std::distance(__first1, __last1); + auto __d2 = std::distance(__first2, __last2); + if (__d1 == 0 && __d2 == 0) + return true; + if (__d1 != __d2) + return false; + } + + for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan) + { + if (__scan != std::__find_if(__first1, __scan, + __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))) + continue; + + auto __matches = std::__count_if(__first2, __last2, + __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)); + if (0 == __matches + || std::__count_if(__scan, __last1, + __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)) + != __matches) + return false; + } + return true; + } +# 3661 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2) + { + ; + ; + + return + std::__is_permutation(__first1, __last1, __first2, __last2, + __gnu_cxx::__ops::__iter_equal_to_iter()); + } +# 3688 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline bool + is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + _BinaryPredicate __pred) + { + ; + ; + + return std::__is_permutation(__first1, __last1, __first2, __last2, + __gnu_cxx::__ops::__iter_comp_iter(__pred)); + } +# 3716 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + void + shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, + _UniformRandomNumberGenerator&& __g) + { + + + + ; + + if (__first == __last) + return; + + typedef typename iterator_traits<_RandomAccessIterator>::difference_type + _DistanceType; + + typedef typename std::make_unsigned<_DistanceType>::type __ud_type; + typedef typename std::uniform_int_distribution<__ud_type> __distr_type; + typedef typename __distr_type::param_type __p_type; + __distr_type __d; + + for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) + std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first))); + } +# 3761 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _Function + for_each(_InputIterator __first, _InputIterator __last, _Function __f) + { + + + ; + for (; __first != __last; ++__first) + __f(*__first); + return std::move(__f); + } +# 3782 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _InputIterator + find(_InputIterator __first, _InputIterator __last, + const _Tp& __val) + { + + + + + ; + return std::__find_if(__first, __last, + __gnu_cxx::__ops::__iter_equals_val(__val)); + } +# 3806 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _InputIterator + find_if(_InputIterator __first, _InputIterator __last, + _Predicate __pred) + { + + + + + ; + + return std::__find_if(__first, __last, + __gnu_cxx::__ops::__pred_iter(__pred)); + } +# 3837 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _InputIterator + find_first_of(_InputIterator __first1, _InputIterator __last1, + _ForwardIterator __first2, _ForwardIterator __last2) + { + + + + + + + ; + ; + + for (; __first1 != __last1; ++__first1) + for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter) + if (*__first1 == *__iter) + return __first1; + return __last1; + } +# 3877 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _InputIterator + find_first_of(_InputIterator __first1, _InputIterator __last1, + _ForwardIterator __first2, _ForwardIterator __last2, + _BinaryPredicate __comp) + { + + + + + + + ; + ; + + for (; __first1 != __last1; ++__first1) + for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter) + if (__comp(*__first1, *__iter)) + return __first1; + return __last1; + } +# 3909 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + adjacent_find(_ForwardIterator __first, _ForwardIterator __last) + { + + + + + ; + + return std::__adjacent_find(__first, __last, + __gnu_cxx::__ops::__iter_equal_to_iter()); + } +# 3934 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + adjacent_find(_ForwardIterator __first, _ForwardIterator __last, + _BinaryPredicate __binary_pred) + { + + + + + + ; + + return std::__adjacent_find(__first, __last, + __gnu_cxx::__ops::__iter_comp_iter(__binary_pred)); + } +# 3959 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline typename iterator_traits<_InputIterator>::difference_type + count(_InputIterator __first, _InputIterator __last, const _Tp& __value) + { + + + + + ; + + return std::__count_if(__first, __last, + __gnu_cxx::__ops::__iter_equals_val(__value)); + } +# 3982 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline typename iterator_traits<_InputIterator>::difference_type + count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) + { + + + + + ; + + return std::__count_if(__first, __last, + __gnu_cxx::__ops::__pred_iter(__pred)); + } +# 4022 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator1 + search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2) + { + + + + + + + ; + ; + + return std::__search(__first1, __last1, __first2, __last2, + __gnu_cxx::__ops::__iter_equal_to_iter()); + } +# 4061 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator1 + search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + _BinaryPredicate __predicate) + { + + + + + + + ; + ; + + return std::__search(__first1, __last1, __first2, __last2, + __gnu_cxx::__ops::__iter_comp_iter(__predicate)); + } +# 4096 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + search_n(_ForwardIterator __first, _ForwardIterator __last, + _Integer __count, const _Tp& __val) + { + + + + + ; + + return std::__search_n(__first, __last, __count, + __gnu_cxx::__ops::__iter_equals_val(__val)); + } +# 4129 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + search_n(_ForwardIterator __first, _ForwardIterator __last, + _Integer __count, const _Tp& __val, + _BinaryPredicate __binary_pred) + { + + + + + ; + + return std::__search_n(__first, __last, __count, + __gnu_cxx::__ops::__iter_comp_val(__binary_pred, __val)); + } +# 4163 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _OutputIterator + transform(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _UnaryOperation __unary_op) + { + + + + + + ; + + for (; __first != __last; ++__first, (void)++__result) + *__result = __unary_op(*__first); + return __result; + } +# 4200 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _OutputIterator + transform(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _OutputIterator __result, + _BinaryOperation __binary_op) + { + + + + + + + ; + + for (; __first1 != __last1; ++__first1, (void)++__first2, ++__result) + *__result = __binary_op(*__first1, *__first2); + return __result; + } +# 4233 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + void + replace(_ForwardIterator __first, _ForwardIterator __last, + const _Tp& __old_value, const _Tp& __new_value) + { + + + + + + + + ; + + for (; __first != __last; ++__first) + if (*__first == __old_value) + *__first = __new_value; + } +# 4265 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + void + replace_if(_ForwardIterator __first, _ForwardIterator __last, + _Predicate __pred, const _Tp& __new_value) + { + + + + + + + + ; + + for (; __first != __last; ++__first) + if (__pred(*__first)) + *__first = __new_value; + } +# 4297 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + void + generate(_ForwardIterator __first, _ForwardIterator __last, + _Generator __gen) + { + + + + + ; + + for (; __first != __last; ++__first) + *__first = __gen(); + } +# 4328 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + _OutputIterator + generate_n(_OutputIterator __first, _Size __n, _Generator __gen) + { + + + + + + for (__decltype(__n + 0) __niter = __n; + __niter > 0; --__niter, ++__first) + *__first = __gen(); + return __first; + } +# 4364 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + unique_copy(_InputIterator __first, _InputIterator __last, + _OutputIterator __result) + { + + + + + + + ; + + if (__first == __last) + return __result; + return std::__unique_copy(__first, __last, __result, + __gnu_cxx::__ops::__iter_equal_to_iter(), + std::__iterator_category(__first), + std::__iterator_category(__result)); + } +# 4404 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + unique_copy(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, + _BinaryPredicate __binary_pred) + { + + + + + ; + + if (__first == __last) + return __result; + return std::__unique_copy(__first, __last, __result, + __gnu_cxx::__ops::__iter_comp_iter(__binary_pred), + std::__iterator_category(__first), + std::__iterator_category(__result)); + } +# 4437 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last) + { + + + + ; + + if (__first != __last) + for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) + { + + _RandomAccessIterator __j = __first + + std::rand() % ((__i - __first) + 1); + if (__i != __j) + std::iter_swap(__i, __j); + } + } +# 4472 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + void + random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, + + _RandomNumberGenerator&& __rand) + + + + { + + + + ; + + if (__first == __last) + return; + for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) + { + _RandomAccessIterator __j = __first + __rand((__i - __first) + 1); + if (__i != __j) + std::iter_swap(__i, __j); + } + } +# 4512 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _ForwardIterator + partition(_ForwardIterator __first, _ForwardIterator __last, + _Predicate __pred) + { + + + + + + ; + + return std::__partition(__first, __last, __pred, + std::__iterator_category(__first)); + } +# 4545 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + partial_sort(_RandomAccessIterator __first, + _RandomAccessIterator __middle, + _RandomAccessIterator __last) + { + + + + + + ; + ; + ; + + std::__partial_sort(__first, __middle, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 4583 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + partial_sort(_RandomAccessIterator __first, + _RandomAccessIterator __middle, + _RandomAccessIterator __last, + _Compare __comp) + { + + + + + + + ; + ; + ; + + std::__partial_sort(__first, __middle, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } +# 4619 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, + _RandomAccessIterator __last) + { + + + + + + ; + ; + ; + + if (__first == __last || __nth == __last) + return; + + std::__introselect(__first, __nth, __last, + std::__lg(__last - __first) * 2, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 4658 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, + _RandomAccessIterator __last, _Compare __comp) + { + + + + + + + ; + ; + ; + + if (__first == __last || __nth == __last) + return; + + std::__introselect(__first, __nth, __last, + std::__lg(__last - __first) * 2, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } +# 4695 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + sort(_RandomAccessIterator __first, _RandomAccessIterator __last) + { + + + + + + ; + ; + + std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter()); + } +# 4725 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + sort(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { + + + + + + + ; + ; + + std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + _OutputIterator + __merge(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) + { + while (__first1 != __last1 && __first2 != __last2) + { + if (__comp(__first2, __first1)) + { + *__result = *__first2; + ++__first2; + } + else + { + *__result = *__first1; + ++__first1; + } + ++__result; + } + return std::copy(__first2, __last2, + std::copy(__first1, __last1, __result)); + } +# 4786 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + merge(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result) + { +# 4803 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__merge(__first1, __last1, + __first2, __last2, __result, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 4836 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + merge(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) + { +# 4853 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__merge(__first1, __last1, + __first2, __last2, __result, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + inline void + __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { + typedef typename iterator_traits<_RandomAccessIterator>::value_type + _ValueType; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type + _DistanceType; + + typedef _Temporary_buffer<_RandomAccessIterator, _ValueType> _TmpBuf; + _TmpBuf __buf(__first, __last); + + if (__buf.begin() == 0) + std::__inplace_stable_sort(__first, __last, __comp); + else + std::__stable_sort_adaptive(__first, __last, __buf.begin(), + _DistanceType(__buf.size()), __comp); + } +# 4900 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) + { + + + + + + ; + ; + + std::__stable_sort(__first, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 4934 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline void + stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Compare __comp) + { + + + + + + + ; + ; + + std::__stable_sort(__first, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + _OutputIterator + __set_union(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) + { + while (__first1 != __last1 && __first2 != __last2) + { + if (__comp(__first1, __first2)) + { + *__result = *__first1; + ++__first1; + } + else if (__comp(__first2, __first1)) + { + *__result = *__first2; + ++__first2; + } + else + { + *__result = *__first1; + ++__first1; + ++__first2; + } + ++__result; + } + return std::copy(__first2, __last2, + std::copy(__first1, __last1, __result)); + } +# 5002 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + set_union(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result) + { +# 5022 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__set_union(__first1, __last1, + __first2, __last2, __result, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 5051 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + set_union(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) + { +# 5071 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__set_union(__first1, __last1, + __first2, __last2, __result, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + _OutputIterator + __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) + { + while (__first1 != __last1 && __first2 != __last2) + if (__comp(__first1, __first2)) + ++__first1; + else if (__comp(__first2, __first1)) + ++__first2; + else + { + *__result = *__first1; + ++__first1; + ++__first2; + ++__result; + } + return __result; + } +# 5121 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result) + { +# 5139 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__set_intersection(__first1, __last1, + __first2, __last2, __result, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 5169 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) + { +# 5187 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__set_intersection(__first1, __last1, + __first2, __last2, __result, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + _OutputIterator + __set_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) + { + while (__first1 != __last1 && __first2 != __last2) + if (__comp(__first1, __first2)) + { + *__result = *__first1; + ++__first1; + ++__result; + } + else if (__comp(__first2, __first1)) + ++__first2; + else + { + ++__first1; + ++__first2; + } + return std::copy(__first1, __last1, __result); + } +# 5241 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + set_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result) + { +# 5259 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__set_difference(__first1, __last1, + __first2, __last2, __result, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 5291 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + set_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) + { +# 5309 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__set_difference(__first1, __last1, + __first2, __last2, __result, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + _OutputIterator + __set_symmetric_difference(_InputIterator1 __first1, + _InputIterator1 __last1, + _InputIterator2 __first2, + _InputIterator2 __last2, + _OutputIterator __result, + _Compare __comp) + { + while (__first1 != __last1 && __first2 != __last2) + if (__comp(__first1, __first2)) + { + *__result = *__first1; + ++__first1; + ++__result; + } + else if (__comp(__first2, __first1)) + { + *__result = *__first2; + ++__first2; + ++__result; + } + else + { + ++__first1; + ++__first2; + } + return std::copy(__first2, __last2, + std::copy(__first1, __last1, __result)); + } +# 5369 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result) + { +# 5389 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__set_symmetric_difference(__first1, __last1, + __first2, __last2, __result, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 5419 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + inline _OutputIterator + set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, + _Compare __comp) + { +# 5440 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + ; + ; + ; + ; + + return std::__set_symmetric_difference(__first1, __last1, + __first2, __last2, __result, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + constexpr + _ForwardIterator + __min_element(_ForwardIterator __first, _ForwardIterator __last, + _Compare __comp) + { + if (__first == __last) + return __first; + _ForwardIterator __result = __first; + while (++__first != __last) + if (__comp(__first, __result)) + __result = __first; + return __result; + } +# 5472 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + constexpr + _ForwardIterator + inline min_element(_ForwardIterator __first, _ForwardIterator __last) + { + + + + + ; + ; + + return std::__min_element(__first, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 5497 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + constexpr + inline _ForwardIterator + min_element(_ForwardIterator __first, _ForwardIterator __last, + _Compare __comp) + { + + + + + + ; + ; + + return std::__min_element(__first, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + template + constexpr + _ForwardIterator + __max_element(_ForwardIterator __first, _ForwardIterator __last, + _Compare __comp) + { + if (__first == __last) return __first; + _ForwardIterator __result = __first; + while (++__first != __last) + if (__comp(__result, __first)) + __result = __first; + return __result; + } +# 5536 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + constexpr + inline _ForwardIterator + max_element(_ForwardIterator __first, _ForwardIterator __last) + { + + + + + ; + ; + + return std::__max_element(__first, __last, + __gnu_cxx::__ops::__iter_less_iter()); + } +# 5561 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3 + template + constexpr + inline _ForwardIterator + max_element(_ForwardIterator __first, _ForwardIterator __last, + _Compare __comp) + { + + + + + + ; + ; + + return std::__max_element(__first, __last, + __gnu_cxx::__ops::__iter_comp_iter(__comp)); + } + + +} +# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/algorithm" 2 3 +# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" 2 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/array" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/array" 3 +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/array" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + struct __array_traits + { + typedef _Tp _Type[_Nm]; + + static constexpr _Tp& + _S_ref(const _Type& __t, std::size_t __n) noexcept + { return const_cast<_Tp&>(__t[__n]); } + + static constexpr _Tp* + _S_ptr(const _Type& __t) noexcept + { return const_cast<_Tp*>(__t); } + }; + + template + struct __array_traits<_Tp, 0> + { + struct _Type { }; + + static constexpr _Tp& + _S_ref(const _Type&, std::size_t) noexcept + { return *static_cast<_Tp*>(nullptr); } + + static constexpr _Tp* + _S_ptr(const _Type&) noexcept + { return nullptr; } + }; +# 89 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/array" 3 + template + struct array + { + typedef _Tp value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* iterator; + typedef const value_type* const_iterator; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef std::reverse_iterator reverse_iterator; + typedef std::reverse_iterator const_reverse_iterator; + + + typedef std::__array_traits<_Tp, _Nm> _AT_Type; + typename _AT_Type::_Type _M_elems; + + + + + void + fill(const value_type& __u) + { std::fill_n(begin(), size(), __u); } + + void + swap(array& __other) + noexcept(__is_nothrow_swappable<_Tp>::value) + { std::swap_ranges(begin(), end(), __other.begin()); } + + + iterator + begin() noexcept + { return iterator(data()); } + + const_iterator + begin() const noexcept + { return const_iterator(data()); } + + iterator + end() noexcept + { return iterator(data() + _Nm); } + + const_iterator + end() const noexcept + { return const_iterator(data() + _Nm); } + + reverse_iterator + rbegin() noexcept + { return reverse_iterator(end()); } + + const_reverse_iterator + rbegin() const noexcept + { return const_reverse_iterator(end()); } + + reverse_iterator + rend() noexcept + { return reverse_iterator(begin()); } + + const_reverse_iterator + rend() const noexcept + { return const_reverse_iterator(begin()); } + + const_iterator + cbegin() const noexcept + { return const_iterator(data()); } + + const_iterator + cend() const noexcept + { return const_iterator(data() + _Nm); } + + const_reverse_iterator + crbegin() const noexcept + { return const_reverse_iterator(end()); } + + const_reverse_iterator + crend() const noexcept + { return const_reverse_iterator(begin()); } + + + constexpr size_type + size() const noexcept { return _Nm; } + + constexpr size_type + max_size() const noexcept { return _Nm; } + + constexpr bool + empty() const noexcept { return size() == 0; } + + + reference + operator[](size_type __n) noexcept + { return _AT_Type::_S_ref(_M_elems, __n); } + + constexpr const_reference + operator[](size_type __n) const noexcept + { return _AT_Type::_S_ref(_M_elems, __n); } + + reference + at(size_type __n) + { + if (__n >= _Nm) + std::__throw_out_of_range_fmt(("array::at: __n (which is %zu) " ">= _Nm (which is %zu)"), + + __n, _Nm); + return _AT_Type::_S_ref(_M_elems, __n); + } + + constexpr const_reference + at(size_type __n) const + { + + + return __n < _Nm ? _AT_Type::_S_ref(_M_elems, __n) + : (std::__throw_out_of_range_fmt(("array::at: __n (which is %zu) " ">= _Nm (which is %zu)"), + + __n, _Nm), + _AT_Type::_S_ref(_M_elems, 0)); + } + + reference + front() noexcept + { return *begin(); } + + constexpr const_reference + front() const noexcept + { return _AT_Type::_S_ref(_M_elems, 0); } + + reference + back() noexcept + { return _Nm ? *(end() - 1) : *end(); } + + constexpr const_reference + back() const noexcept + { + return _Nm ? _AT_Type::_S_ref(_M_elems, _Nm - 1) + : _AT_Type::_S_ref(_M_elems, 0); + } + + pointer + data() noexcept + { return _AT_Type::_S_ptr(_M_elems); } + + const_pointer + data() const noexcept + { return _AT_Type::_S_ptr(_M_elems); } + }; + + + template + inline bool + operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return std::equal(__one.begin(), __one.end(), __two.begin()); } + + template + inline bool + operator!=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return !(__one == __two); } + + template + inline bool + operator<(const array<_Tp, _Nm>& __a, const array<_Tp, _Nm>& __b) + { + return std::lexicographical_compare(__a.begin(), __a.end(), + __b.begin(), __b.end()); + } + + template + inline bool + operator>(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return __two < __one; } + + template + inline bool + operator<=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return !(__one > __two); } + + template + inline bool + operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return !(__one < __two); } + + + template + inline void + swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two) + noexcept(noexcept(__one.swap(__two))) + { __one.swap(__two); } + + template + constexpr _Tp& + get(array<_Tp, _Nm>& __arr) noexcept + { + static_assert(_Int < _Nm, "index is out of bounds"); + return std::__array_traits<_Tp, _Nm>:: + _S_ref(__arr._M_elems, _Int); + } + + template + constexpr _Tp&& + get(array<_Tp, _Nm>&& __arr) noexcept + { + static_assert(_Int < _Nm, "index is out of bounds"); + return std::move(std::get<_Int>(__arr)); + } + + template + constexpr const _Tp& + get(const array<_Tp, _Nm>& __arr) noexcept + { + static_assert(_Int < _Nm, "index is out of bounds"); + return std::__array_traits<_Tp, _Nm>:: + _S_ref(__arr._M_elems, _Int); + } + + +} + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + template + class tuple_size; + + + template + struct tuple_size> + : public integral_constant { }; + + + template + class tuple_element; + + + template + struct tuple_element<_Int, std::array<_Tp, _Nm>> + { + static_assert(_Int < _Nm, "index is out of bounds"); + typedef _Tp type; + }; + + template + struct __is_tuple_like_impl> : true_type + { }; + + +} +# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" 2 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 1 3 +# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 3 +# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" 2 +# 63 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" +namespace mozilla { + + + + +template +inline constexpr T +narrow_cast(U&& u) +{ + return static_cast(mozilla::Forward(u)); +} +# 82 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" +constexpr const size_t dynamic_extent = mozilla::MaxValue::value; + +template +class Span; + + +namespace span_details { + +inline size_t strlen16(const char16_t* aZeroTerminated) { + size_t len = 0; + while (*(aZeroTerminated++)) { + len++; + } + return len; +} + + +template +using remove_cv_t = typename mozilla::RemoveCV::Type; +template +using remove_const_t = typename mozilla::RemoveConst::Type; +template +using conditional_t = typename mozilla::Conditional::Type; +template +using add_pointer_t = typename mozilla::AddPointer::Type; +template +using enable_if_t = typename mozilla::EnableIf::Type; + +template +struct is_span_oracle : mozilla::FalseType +{ +}; + +template +struct is_span_oracle> : mozilla::TrueType +{ +}; + +template +struct is_span : public is_span_oracle> +{ +}; + +template +struct is_std_array_oracle : mozilla::FalseType +{ +}; + +template +struct is_std_array_oracle> : mozilla::TrueType +{ +}; + +template +struct is_std_array : public is_std_array_oracle> +{ +}; + +template +struct is_allowed_extent_conversion + : public mozilla::IntegralConstant +{ +}; + +template +struct is_allowed_element_type_conversion + : public mozilla::IntegralConstant::value> +{ +}; + +template +class span_iterator +{ + using element_type_ = typename Span::element_type; + +public: + using iterator_category = std::random_access_iterator_tag; + using value_type = remove_const_t; + using difference_type = typename Span::index_type; + + using reference = conditional_t&; + using pointer = add_pointer_t; + + constexpr span_iterator() : span_iterator(nullptr, 0) {} + + span_iterator(const Span* span, + typename Span::index_type index) + : span_(span) + , index_(index) + { + do { static_assert(mozilla::detail::AssertionConditionType= 0 && index <= span_->Length()))>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span == nullptr || (index_ >= 0 && index <= span_->Length())))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span == nullptr || (index_ >= 0 && index <= span_->Length())" ")"); do { *((volatile int*) __null) = 176; ::abort(); } while (0); } } while (0); + + } + + friend class span_iterator; + constexpr span_iterator(const span_iterator& other) + : span_iterator(other.span_, other.index_) + { + } + + span_iterator& + operator=(const span_iterator&) = default; + + reference operator*() const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_" ")"); do { *((volatile int*) __null) = 190; ::abort(); } while (0); } } while (0); + return (*span_)[index_]; + } + + pointer operator->() const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_" ")"); do { *((volatile int*) __null) = 196; ::abort(); } while (0); } } while (0); + return &((*span_)[index_]); + } + + span_iterator& operator++() + { + do { static_assert(mozilla::detail::AssertionConditionType= 0 && index_ < span_->Length())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_ && index_ >= 0 && index_ < span_->Length()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_ && index_ >= 0 && index_ < span_->Length()" ")"); do { *((volatile int*) __null) = 202; ::abort(); } while (0); } } while (0); + ++index_; + return *this; + } + + span_iterator operator++(int) + { + auto ret = *this; + ++(*this); + return ret; + } + + span_iterator& operator--() + { + do { static_assert(mozilla::detail::AssertionConditionType 0 && index_ <= span_->Length())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_ && index_ > 0 && index_ <= span_->Length()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_ && index_ > 0 && index_ <= span_->Length()" ")"); do { *((volatile int*) __null) = 216; ::abort(); } while (0); } } while (0); + --index_; + return *this; + } + + span_iterator operator--(int) + { + auto ret = *this; + --(*this); + return ret; + } + + span_iterator + operator+(difference_type n) const + { + auto ret = *this; + return ret += n; + } + + span_iterator& operator+=(difference_type n) + { + do { static_assert(mozilla::detail::AssertionConditionType= 0 && (index_ + n) <= span_->Length())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_ && (index_ + n) >= 0 && (index_ + n) <= span_->Length()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_ && (index_ + n) >= 0 && (index_ + n) <= span_->Length()" ")"); do { *((volatile int*) __null) = 238; ::abort(); } while (0); } } while (0); + + index_ += n; + return *this; + } + + span_iterator + operator-(difference_type n) const + { + auto ret = *this; + return ret -= n; + } + + span_iterator& operator-=(difference_type n) + + { + return *this += -n; + } + + difference_type + operator-(const span_iterator& rhs) const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_ == rhs.span_))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_ == rhs.span_" ")"); do { *((volatile int*) __null) = 259; ::abort(); } while (0); } } while (0); + return index_ - rhs.index_; + } + + constexpr reference operator[](difference_type n) const + { + return *(*this + n); + } + + constexpr friend bool operator==(const span_iterator& lhs, + const span_iterator& rhs) + { + return lhs.span_ == rhs.span_ && lhs.index_ == rhs.index_; + } + + constexpr friend bool operator!=(const span_iterator& lhs, + const span_iterator& rhs) + { + return !(lhs == rhs); + } + + friend bool operator<(const span_iterator& lhs, + const span_iterator& rhs) + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(lhs.span_ == rhs.span_))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "lhs.span_ == rhs.span_" ")"); do { *((volatile int*) __null) = 283; ::abort(); } while (0); } } while (0); + return lhs.index_ < rhs.index_; + } + + constexpr friend bool operator<=(const span_iterator& lhs, + const span_iterator& rhs) + { + return !(rhs < lhs); + } + + constexpr friend bool operator>(const span_iterator& lhs, + const span_iterator& rhs) + { + return rhs < lhs; + } + + constexpr friend bool operator>=(const span_iterator& lhs, + const span_iterator& rhs) + { + return !(rhs > lhs); + } + + void swap(span_iterator& rhs) + { + std::swap(index_, rhs.index_); + std::swap(span_, rhs.span_); + } + +protected: + const Span* span_; + size_t index_; +}; + +template +inline constexpr span_iterator +operator+(typename span_iterator::difference_type n, + const span_iterator& rhs) +{ + return rhs + n; +} + +template +class extent_type +{ +public: + using index_type = size_t; + + static_assert(Ext >= 0, "A fixed-size Span must be >= 0 in size."); + + constexpr extent_type() {} + + template + extent_type(extent_type ext) + { + static_assert( + Other == Ext || Other == dynamic_extent, + "Mismatch between fixed-size extent and size of initializing data."); + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(ext.size() == Ext))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "ext.size() == Ext" ")"); do { *((volatile int*) __null) = 340; ::abort(); } while (0); } } while (0); + } + + extent_type(index_type length) + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(length == Ext))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "length == Ext" ")"); do { *((volatile int*) __null) = 345; ::abort(); } while (0); } } while (0); + } + + constexpr index_type size() const { return Ext; } +}; + +template<> +class extent_type +{ +public: + using index_type = size_t; + + template + explicit constexpr extent_type(extent_type ext) + : size_(ext.size()) + { + } + + explicit constexpr extent_type(index_type length) + : size_(length) + { + } + + constexpr index_type size() const { return size_; } + +private: + index_type size_; +}; +} +# 436 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" +template +class Span +{ +public: + + using element_type = ElementType; + using index_type = size_t; + using pointer = element_type*; + using reference = element_type&; + + using iterator = + span_details::span_iterator, false>; + using const_iterator = + span_details::span_iterator, true>; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + constexpr static const index_type extent = Extent; + + + + + + + + template< + bool Dependent = false, + class = span_details::enable_if_t< + (Dependent || Extent == 0 || Extent == mozilla::MaxValue::value)>> + constexpr Span() + : storage_(nullptr, span_details::extent_type<0>()) + { + } + + + + + constexpr Span(std::nullptr_t) : Span() {} + + + + + constexpr Span(pointer aPtr, index_type aLength) + : storage_(aPtr, aLength) + { + } + + + + + constexpr Span(pointer aStartPtr, pointer aEndPtr) + : storage_(aStartPtr, std::distance(aStartPtr, aEndPtr)) + { + } + + + + + template + constexpr Span(element_type (&aArr)[N]) + : storage_(&aArr[0], span_details::extent_type()) + { + } + + + + + template> + constexpr Span(std::array& aArr) + : storage_(&aArr[0], span_details::extent_type()) + { + } + + + + + template + constexpr Span( + const std::array, N>& aArr) + : storage_(&aArr[0], span_details::extent_type()) + { + } + + + + + template> + constexpr Span(mozilla::Array& aArr) + : storage_(&aArr[0], span_details::extent_type()) + { + } + + + + + template + constexpr Span( + const mozilla::Array, N>& aArr) + : storage_(&aArr[0], span_details::extent_type()) + { + } + + + + + template> + constexpr Span(const mozilla::UniquePtr& aPtr, + index_type aLength) + : storage_(aPtr.get(), aLength) + { + } + + + + + + + template< + class Container, + class = span_details::enable_if_t< + !span_details::is_span::value && + !span_details::is_std_array::value && + mozilla::IsConvertible::value && + mozilla::IsConvertible().data())>::value>> + constexpr Span(Container& cont) + : Span(cont.data(), ReleaseAssertedCast(cont.size())) + { + } + + + + + template< + class Container, + class = span_details::enable_if_t< + mozilla::IsConst::value && + !span_details::is_span::value && + mozilla::IsConvertible::value && + mozilla::IsConvertible().data())>::value>> + constexpr Span(const Container& cont) + : Span(cont.data(), ReleaseAssertedCast(cont.size())) + { + } + + + + + constexpr Span(const Span& other) = default; + + + + + constexpr Span(Span&& other) = default; + + + + + template< + class OtherElementType, + size_t OtherExtent, + class = span_details::enable_if_t< + span_details::is_allowed_extent_conversion::value && + span_details::is_allowed_element_type_conversion::value>> + constexpr Span(const Span& other) + : storage_(other.data(), + span_details::extent_type(other.size())) + { + } + + + + + template< + class OtherElementType, + size_t OtherExtent, + class = span_details::enable_if_t< + span_details::is_allowed_extent_conversion::value && + span_details::is_allowed_element_type_conversion::value>> + constexpr Span(Span&& other) + : storage_(other.data(), + span_details::extent_type(other.size())) + { + } + + ~Span() = default; + Span& operator=(const Span& other) + = default; + + Span& operator=(Span&& other) + = default; + + + + + + template + Span First() const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(Count <= size()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "Count <= size()" ")"); do { *((volatile int*) __null) = 640; ::abort(); } while (0); } } while (0); + return { data(), Count }; + } + + + + + template + Span Last() const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(Count <= size()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "Count <= size()" ")"); do { *((volatile int*) __null) = 650; ::abort(); } while (0); } } while (0); + return { data() + (size() - Count), Count }; + } + + + + + template + Span Subspan() const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(Offset <= size() && (Count == dynamic_extent || (Offset + Count <= size()))))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "Offset <= size() && (Count == dynamic_extent || (Offset + Count <= size()))" ")"); do { *((volatile int*) __null) = 661; ::abort(); } while (0); } } while (0); + + return { data() + Offset, + Count == dynamic_extent ? size() - Offset : Count }; + } + + + + + Span First( + index_type aCount) const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aCount <= size()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aCount <= size()" ")"); do { *((volatile int*) __null) = 672; ::abort(); } while (0); } } while (0); + return { data(), aCount }; + } + + + + + Span Last( + index_type aCount) const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aCount <= size()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aCount <= size()" ")"); do { *((volatile int*) __null) = 682; ::abort(); } while (0); } } while (0); + return { data() + (size() - aCount), aCount }; + } + + + + + Span Subspan( + index_type aStart, + index_type aLength = dynamic_extent) const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aStart <= size() && (aLength == dynamic_extent || (aStart + aLength <= size()))))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aStart <= size() && (aLength == dynamic_extent || (aStart + aLength <= size()))" ")"); do { *((volatile int*) __null) = 695; ::abort(); } while (0); } } while (0); + + + return { data() + aStart, + aLength == dynamic_extent ? size() - aStart : aLength }; + } + + + + + Span From( + index_type aStart) const + { + return Subspan(aStart); + } + + + + + Span To( + index_type aEnd) const + { + return Subspan(0, aEnd); + } + + + + + + Span FromTo( + index_type aStart, + index_type aEnd) const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aStart <= aEnd))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aStart <= aEnd" ")"); do { *((volatile int*) __null) = 726; ::abort(); } while (0); } } while (0); + return Subspan(aStart, aEnd - aStart); + } + + + + + + constexpr index_type Length() const { return size(); } + + + + + constexpr index_type size() const { return storage_.size(); } + + + + + constexpr index_type LengthBytes() const { return size_bytes(); } + + + + + constexpr index_type size_bytes() const + { + return size() * narrow_cast(sizeof(element_type)); + } + + + + + constexpr bool IsEmpty() const { return empty(); } + + + + + + constexpr bool empty() const { return size() == 0; } + + + reference operator[](index_type idx) const + { + do { static_assert(mozilla::detail::AssertionConditionType::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(idx < storage_.size()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "idx < storage_.size()" ")"); do { *((volatile int*) __null) = 768; ::abort(); } while (0); } } while (0); + return data()[idx]; + } + + + + + constexpr reference at(index_type idx) const { return this->operator[](idx); } + + constexpr reference operator()(index_type idx) const + { + return this->operator[](idx); + } + + + + + constexpr pointer Elements() const { return data(); } + + + + + constexpr pointer data() const { return storage_.data(); } + + + iterator begin() const { return { this, 0 }; } + iterator end() const { return { this, Length() }; } + + const_iterator cbegin() const { return { this, 0 }; } + const_iterator cend() const { return { this, Length() }; } + + reverse_iterator rbegin() const + { + return reverse_iterator{ end() }; + } + reverse_iterator rend() const + { + return reverse_iterator{ begin() }; + } + + const_reverse_iterator crbegin() const + { + return const_reverse_iterator{ cend() }; + } + const_reverse_iterator crend() const + { + return const_reverse_iterator{ cbegin() }; + } + +private: + + + + template + class storage_type : public ExtentType + { + public: + template + storage_type(pointer elements, + OtherExtentType ext) + : ExtentType(ext) + , data_(elements) + { + do { static_assert(mozilla::detail::AssertionConditionType::value))>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!((!elements && ExtentType::size() == 0) || (elements && ExtentType::size() != mozilla::MaxValue::value)))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "(!elements && ExtentType::size() == 0) || (elements && ExtentType::size() != mozilla::MaxValue::value)" ")"); do { *((volatile int*) __null) = 833; ::abort(); } while (0); } } while (0); + + + } + + constexpr pointer data() const { return data_; } + + private: + pointer data_; + }; + + storage_type> storage_; +}; + + +template +inline constexpr bool +operator==(const Span& l, + const Span& r) +{ + return (l.size() == r.size()) && std::equal(l.begin(), l.end(), r.begin()); +} + +template +inline constexpr bool +operator!=(const Span& l, + const Span& r) +{ + return !(l == r); +} + +template +inline constexpr bool +operator<(const Span& l, + const Span& r) +{ + return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end()); +} + +template +inline constexpr bool +operator<=(const Span& l, + const Span& r) +{ + return !(l > r); +} + +template +inline constexpr bool +operator>(const Span& l, + const Span& r) +{ + return r < l; +} + +template +inline constexpr bool +operator>=(const Span& l, + const Span& r) +{ + return !(l < r); +} + +namespace span_details { + + + + + + +template +struct calculate_byte_size + : mozilla::IntegralConstant(sizeof(ElementType) * + static_cast(Extent))> +{ +}; + +template +struct calculate_byte_size + : mozilla::IntegralConstant +{ +}; +} + + + + + +template +Span::value> +AsBytes(Span s) +{ + return { reinterpret_cast(s.data()), s.size_bytes() }; +} + + + + +template::value>> +Span::value> +AsWritableBytes(Span s) +{ + return { reinterpret_cast(s.data()), s.size_bytes() }; +} + + + + + + + +template +Span +MakeSpan(ElementType* aPtr, typename Span::index_type aLength) +{ + return Span(aPtr, aLength); +} + + + + +template +Span +MakeSpan(ElementType* aStartPtr, ElementType* aEndPtr) +{ + return Span(aStartPtr, aEndPtr); +} + + + + +template +Span MakeSpan(ElementType (&aArr)[N]) +{ + return Span(aArr); +} + + + + +template +Span +MakeSpan(mozilla::Array& aArr) +{ + return aArr; +} + + + + +template +Span +MakeSpan(const mozilla::Array& arr) +{ + return arr; +} + + + + +template +Span +MakeSpan(Container& cont) +{ + return Span(cont); +} + + + + +template +Span +MakeSpan(const Container& cont) +{ + return Span(cont); +} + + + + +template +Span +MakeSpan(Ptr& aPtr, size_t aLength) +{ + return Span(aPtr, aLength); +} + + + + +inline Span +MakeStringSpan(const char* aZeroTerminated) +{ + return Span(aZeroTerminated, std::strlen(aZeroTerminated)); +} + + + + +inline Span +MakeStringSpan(const char16_t* aZeroTerminated) +{ + return Span(aZeroTerminated, span_details::strlen16(aZeroTerminated)); +} + +} +# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionNoteChild.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionNoteChild.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionTraversalCallback.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionTraversalCallback.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 1 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EnumeratedArray.h" 1 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EnumeratedArray.h" +namespace mozilla { +# 41 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EnumeratedArray.h" +template +class EnumeratedArray +{ +public: + static const size_t kSize = size_t(SizeAsEnumValue); + +private: + typedef Array ArrayType; + + ArrayType mArray; + +public: + EnumeratedArray() {} + + template + EnumeratedArray(Args&&... aArgs) + : mArray{mozilla::Forward(aArgs)...} + {} + + explicit EnumeratedArray(const EnumeratedArray& aOther) + { + for (size_t i = 0; i < kSize; i++) { + mArray[i] = aOther.mArray[i]; + } + } + + EnumeratedArray(EnumeratedArray&& aOther) + { + for (size_t i = 0; i < kSize; i++) { + mArray[i] = Move(aOther.mArray[i]); + } + } + + ValueType& operator[](IndexType aIndex) + { + return mArray[size_t(aIndex)]; + } + + const ValueType& operator[](IndexType aIndex) const + { + return mArray[size_t(aIndex)]; + } + + typedef typename ArrayType::iterator iterator; + typedef typename ArrayType::const_iterator const_iterator; + typedef typename ArrayType::reverse_iterator reverse_iterator; + typedef typename ArrayType::const_reverse_iterator const_reverse_iterator; + + + iterator begin() { return mArray.begin(); } + const_iterator begin() const { return mArray.begin(); } + const_iterator cbegin() const { return mArray.cbegin(); } + iterator end() { return mArray.end(); } + const_iterator end() const { return mArray.end(); } + const_iterator cend() const { return mArray.cend(); } + + + reverse_iterator rbegin() { return mArray.rbegin(); } + const_reverse_iterator rbegin() const { return mArray.rbegin(); } + const_reverse_iterator crbegin() const { return mArray.crbegin(); } + reverse_iterator rend() { return mArray.rend(); } + const_reverse_iterator rend() const { return mArray.rend(); } + const_reverse_iterator crend() const { return mArray.crend(); } +}; + +} +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h" 1 +# 75 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h" +namespace mozilla { + +template +class LinkedListElement; + +namespace detail { + + + + + + +template +struct LinkedListElementTraits +{ + typedef T* RawType; + typedef const T* ConstRawType; + typedef T* ClientType; + typedef const T* ConstClientType; + + + + + + + static void enterList(LinkedListElement* elt) {} + static void exitList(LinkedListElement* elt) {} +}; + +template +struct LinkedListElementTraits> +{ + typedef T* RawType; + typedef const T* ConstRawType; + typedef RefPtr ClientType; + typedef RefPtr ConstClientType; + + static void enterList(LinkedListElement>* elt) { elt->asT()->AddRef(); } + static void exitList(LinkedListElement>* elt) { elt->asT()->Release(); } +}; + +} + +template +class LinkedList; + +template +class LinkedListElement +{ + typedef typename detail::LinkedListElementTraits Traits; + typedef typename Traits::RawType RawType; + typedef typename Traits::ConstRawType ConstRawType; + typedef typename Traits::ClientType ClientType; + typedef typename Traits::ConstClientType ConstClientType; +# 164 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h" +private: + LinkedListElement* mNext; + LinkedListElement* mPrev; + const bool mIsSentinel; + +public: + LinkedListElement() + : mNext(this), + mPrev(this), + mIsSentinel(false) + { } + + + + + + LinkedListElement(LinkedListElement&& aOther) + : mIsSentinel(aOther.mIsSentinel) + { + adjustLinkForMove(Move(aOther)); + } + + LinkedListElement& operator=(LinkedListElement&& aOther) + { + do { } while (0); + do { } while (0); + + adjustLinkForMove(Move(aOther)); + return *this; + } + + ~LinkedListElement() + { + if (!mIsSentinel && isInList()) { + remove(); + } + } + + + + + + RawType getNext() { return mNext->asT(); } + ConstRawType getNext() const { return mNext->asT(); } + + + + + + RawType getPrevious() { return mPrev->asT(); } + ConstRawType getPrevious() const { return mPrev->asT(); } + + + + + + void setNext(RawType aElem) + { + do { } while (0); + setNextUnsafe(aElem); + } + + + + + + + void setPrevious(RawType aElem) + { + do { } while (0); + setPreviousUnsafe(aElem); + } + + + + + + void remove() + { + do { } while (0); + + mPrev->mNext = mNext; + mNext->mPrev = mPrev; + mNext = this; + mPrev = this; + + Traits::exitList(this); + } + + + + + + + ClientType removeAndGetNext() + { + ClientType r = getNext(); + remove(); + return r; + } + + + + + + + ClientType removeAndGetPrevious() + { + ClientType r = getPrevious(); + remove(); + return r; + } + + + + + + void removeFrom(const LinkedList& aList) + { + aList.assertContains(asT()); + remove(); + } + + + + + bool isInList() const + { + do { } while (0); + return mNext != this; + } + +private: + friend class LinkedList; + friend struct detail::LinkedListElementTraits; + + enum class NodeKind { + Normal, + Sentinel + }; + + explicit LinkedListElement(NodeKind nodeKind) + : mNext(this), + mPrev(this), + mIsSentinel(nodeKind == NodeKind::Sentinel) + { } + + + + + + RawType asT() + { + return mIsSentinel ? nullptr : static_cast(this); + } + ConstRawType asT() const + { + return mIsSentinel ? nullptr : static_cast(this); + } + + + + + + void setNextUnsafe(RawType aElem) + { + LinkedListElement *listElem = static_cast(aElem); + do { } while (0); + + listElem->mNext = this->mNext; + listElem->mPrev = this; + this->mNext->mPrev = listElem; + this->mNext = listElem; + + Traits::enterList(aElem); + } + + + + + + void setPreviousUnsafe(RawType aElem) + { + LinkedListElement* listElem = static_cast*>(aElem); + do { } while (0); + + listElem->mNext = this; + listElem->mPrev = this->mPrev; + this->mPrev->mNext = listElem; + this->mPrev = listElem; + + Traits::enterList(aElem); + } + + + + + + void adjustLinkForMove(LinkedListElement&& aOther) + { + if (!aOther.isInList()) { + mNext = this; + mPrev = this; + return; + } + + if (!mIsSentinel) { + Traits::enterList(this); + } + + do { } while (0); + do { } while (0); + + + + + + mNext = aOther.mNext; + mPrev = aOther.mPrev; + + mNext->mPrev = this; + mPrev->mNext = this; + + + + + + aOther.mNext = &aOther; + aOther.mPrev = &aOther; + + if (!mIsSentinel) { + Traits::exitList(&aOther); + } + } + + LinkedListElement& operator=(const LinkedListElement& aOther) = delete; + LinkedListElement(const LinkedListElement& aOther) = delete; +}; + +template +class LinkedList +{ +private: + typedef typename detail::LinkedListElementTraits Traits; + typedef typename Traits::RawType RawType; + typedef typename Traits::ConstRawType ConstRawType; + typedef typename Traits::ClientType ClientType; + typedef typename Traits::ConstClientType ConstClientType; + + LinkedListElement sentinel; + +public: + class Iterator { + RawType mCurrent; + + public: + explicit Iterator(RawType aCurrent) : mCurrent(aCurrent) {} + + RawType operator *() const { + return mCurrent; + } + + const Iterator& operator++() { + mCurrent = mCurrent->getNext(); + return *this; + } + + bool operator!=(Iterator& aOther) const { + return mCurrent != aOther.mCurrent; + } + }; + + LinkedList() : sentinel(LinkedListElement::NodeKind::Sentinel) { } + + LinkedList(LinkedList&& aOther) + : sentinel(mozilla::Move(aOther.sentinel)) + { } + + LinkedList& operator=(LinkedList&& aOther) + { + do { } while (0); + sentinel = mozilla::Move(aOther.sentinel); + return *this; + } + + ~LinkedList() { + do { } while (0); + + + + } + + + + + void insertFront(RawType aElem) + { + + sentinel.setNextUnsafe(aElem); + } + + + + + void insertBack(RawType aElem) + { + sentinel.setPreviousUnsafe(aElem); + } + + + + + RawType getFirst() { return sentinel.getNext(); } + ConstRawType getFirst() const { return sentinel.getNext(); } + + + + + RawType getLast() { return sentinel.getPrevious(); } + ConstRawType getLast() const { return sentinel.getPrevious(); } + + + + + + ClientType popFirst() + { + ClientType ret = sentinel.getNext(); + if (ret) { + static_cast*>(RawType(ret))->remove(); + } + return ret; + } + + + + + + ClientType popLast() + { + ClientType ret = sentinel.getPrevious(); + if (ret) { + static_cast*>(RawType(ret))->remove(); + } + return ret; + } + + + + + bool isEmpty() const + { + return !sentinel.isInList(); + } + + + + + + + + void clear() + { + while (popFirst()) { + continue; + } + } + + + + + + + Iterator begin() { + return Iterator(getFirst()); + } + Iterator end() { + return Iterator(nullptr); + } + + + + + + + + size_t sizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const + { + size_t n = 0; + for (const T* t = getFirst(); t; t = t->getNext()) { + n += aMallocSizeOf(t); + } + return n; + } + + + + + size_t sizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const + { + return aMallocSizeOf(this) + sizeOfExcludingThis(aMallocSizeOf); + } + + + + + + void debugAssertIsSane() const + { +# 622 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h" + } + +private: + friend class LinkedListElement; + + void assertContains(const RawType aValue) const + { +# 637 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h" + } + + LinkedList& operator=(const LinkedList& aOther) = delete; + LinkedList(const LinkedList& aOther) = delete; +}; + +template +class AutoCleanLinkedList : public LinkedList +{ +public: + ~AutoCleanLinkedList() + { + while (T* element = this->popFirst()) { + delete element; + } + } +}; + +} +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PodOperations.h" 1 +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PodOperations.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayUtils.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayUtils.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayUtils.h" 2 + + + + + + + + +namespace mozilla { +# 40 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayUtils.h" +template +__attribute__((always_inline)) inline size_t +PointerRangeSize(T* aBegin, T* aEnd) +{ + do { } while (0); + return (size_t(aEnd) - size_t(aBegin)) / sizeof(T); +} + + + + + + + +template +constexpr size_t +ArrayLength(T (&aArr)[N]) +{ + return N; +} + +template +constexpr size_t +ArrayLength(const Array& aArr) +{ + return N; +} + +template +constexpr size_t +ArrayLength(const EnumeratedArray& aArr) +{ + return size_t(N); +} + + + + + + +template +constexpr T* +ArrayEnd(T (&aArr)[N]) +{ + return aArr + ArrayLength(aArr); +} + +template +constexpr T* +ArrayEnd(Array& aArr) +{ + return &aArr[0] + ArrayLength(aArr); +} + +template +constexpr const T* +ArrayEnd(const Array& aArr) +{ + return &aArr[0] + ArrayLength(aArr); +} + +namespace detail { + +template::value>> +struct AlignedChecker +{ + static void + test(const Pointee* aPtr) + { + do { } while (0); + + } +}; + +template +struct AlignedChecker +{ + static void + test(const Pointee* aPtr) + { + } +}; + +} +# 139 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayUtils.h" +template +inline typename EnableIf::value || + IsBaseOf::value || + IsVoid::value, + bool>::Type +IsInRange(const T* aPtr, const U* aBegin, const U* aEnd) +{ + do { } while (0); + detail::AlignedChecker::test(aPtr); + detail::AlignedChecker::test(aBegin); + detail::AlignedChecker::test(aEnd); + return aBegin <= reinterpret_cast(aPtr) && + reinterpret_cast(aPtr) < aEnd; +} + + + + + + +template +inline bool +IsInRange(const T* aPtr, uintptr_t aBegin, uintptr_t aEnd) +{ + return IsInRange(aPtr, + reinterpret_cast(aBegin), + reinterpret_cast(aEnd)); +} + +namespace detail { + + + + + +template +char (&ArrayLengthHelper(T (&array)[N]))[N]; + +} + +} +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PodOperations.h" 2 + + + + + +namespace mozilla { + + +template +static __attribute__((always_inline)) inline void +PodZero(T* aT) +{ + memset(aT, 0, sizeof(T)); +} + + +template +static __attribute__((always_inline)) inline void +PodZero(T* aT, size_t aNElem) +{ + + + + + + for (T* end = aT + aNElem; aT < end; aT++) { + memset(aT, 0, sizeof(T)); + } +} +# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PodOperations.h" +template +static void PodZero(T (&aT)[N]) = delete; +template +static void PodZero(T (&aT)[N], size_t aNElem) = delete; + + +template +static __attribute__((always_inline)) inline void +PodArrayZero(T (&aT)[N]) +{ + memset(aT, 0, N * sizeof(T)); +} + +template +static __attribute__((always_inline)) inline void +PodArrayZero(Array& aArr) +{ + memset(&aArr[0], 0, N * sizeof(T)); +} + + + + + +template +static __attribute__((always_inline)) inline void +PodAssign(T* aDst, const T* aSrc) +{ + do { } while (0); + + memcpy(reinterpret_cast(aDst), reinterpret_cast(aSrc), + sizeof(T)); +} + + + + + +template +static __attribute__((always_inline)) inline void +PodCopy(T* aDst, const T* aSrc, size_t aNElem) +{ + do { } while (0); + + if (aNElem < 128) { + + + + + for (const T* srcend = aSrc + aNElem; aSrc < srcend; aSrc++, aDst++) { + PodAssign(aDst, aSrc); + } + } else { + memcpy(aDst, aSrc, aNElem * sizeof(T)); + } +} + +template +static __attribute__((always_inline)) inline void +PodCopy(volatile T* aDst, const volatile T* aSrc, size_t aNElem) +{ + do { } while (0); +# 127 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PodOperations.h" + for (const volatile T* srcend = aSrc + aNElem; + aSrc < srcend; + aSrc++, aDst++) { + *aDst = *aSrc; + } +} + + + + + +template +static __attribute__((always_inline)) inline void +PodArrayCopy(T (&aDst)[N], const T (&aSrc)[N]) +{ + PodCopy(aDst, aSrc, N); +} + + + + + + + +template +static __attribute__((always_inline)) inline void +PodMove(T* aDst, const T* aSrc, size_t aNElem) +{ + do { } while (0); + + memmove(aDst, aSrc, aNElem * sizeof(T)); +} + + + + + +template +static __attribute__((always_inline)) inline bool +PodEqual(const T* one, const T* two, size_t len) +{ + if (len < 128) { + const T* p1end = one + len; + const T* p1 = one; + const T* p2 = two; + for (; p1 < p1end; p1++, p2++) { + if (*p1 != *p2) { + return false; + } + } + return true; + } + + return !memcmp(one, two, len * sizeof(T)); +} + + + + + +template +static __attribute__((always_inline)) inline bool +PodEqual(const T (&one)[N], const T (&two)[N]) +{ + return PodEqual(one, two, N); +} + +} +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsprototypes.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" 1 +# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js-config.h" 1 +# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsversion.h" 1 +# 36 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" 2 +# 139 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jscpucfg.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jscpucfg.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h" 1 +# 70 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/DebugOnly.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/DebugOnly.h" +namespace mozilla { +# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/DebugOnly.h" +template +class DebugOnly +{ +public: +# 69 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/DebugOnly.h" + DebugOnly() { } + DebugOnly(const T&) { } + DebugOnly(const DebugOnly&) { } + DebugOnly& operator=(const T&) { return *this; } + void operator++(int) { } + void operator--(int) { } + DebugOnly& operator+=(const T&) { return *this; } + DebugOnly& operator-=(const T&) { return *this; } + DebugOnly& operator&=(const T&) { return *this; } + DebugOnly& operator|=(const T&) { return *this; } + DebugOnly& operator^=(const T&) { return *this; } + + + + + + + + ~DebugOnly() {} +}; + +} +# 71 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h" 2 +# 158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h" +namespace mozilla { + +namespace detail { + + + + + + +template +struct Swapper; + +template +struct Swapper +{ + static T swap(T aValue) + { + + return __builtin_bswap16(aValue); + + + + } +}; + +template +struct Swapper +{ + static T swap(T aValue) + { + + return T(__builtin_bswap32(aValue)); +# 198 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h" + } +}; + +template +struct Swapper +{ + static inline T swap(T aValue) + { + + return T(__builtin_bswap64(aValue)); +# 220 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h" + } +}; + +enum Endianness { Little, Big }; + + + + + + + +class EndianUtils +{ + + + + + static void assertNoOverlap(const void* aDest, const void* aSrc, + size_t aCount) + { + DebugOnly byteDestPtr = static_cast(aDest); + DebugOnly byteSrcPtr = static_cast(aSrc); + do { } while (0); + + + + } + + template + static void assertAligned(T* aPtr) + { + do { } while (0); + } + +protected: + + + + + template + static inline T maybeSwap(T aValue) + { + if (SourceEndian == DestEndian) { + return aValue; + } + return Swapper::swap(aValue); + } + + + + + + template + static inline void maybeSwapInPlace(T* aPtr, size_t aCount) + { + assertAligned(aPtr); + + if (SourceEndian == DestEndian) { + return; + } + for (size_t i = 0; i < aCount; i++) { + aPtr[i] = Swapper::swap(aPtr[i]); + } + } + + + + + + template + static void copyAndSwapTo(void* aDest, const T* aSrc, size_t aCount) + { + assertNoOverlap(aDest, aSrc, aCount * sizeof(T)); + assertAligned(aSrc); + + if (SourceEndian == DestEndian) { + memcpy(aDest, aSrc, aCount * sizeof(T)); + return; + } + + uint8_t* byteDestPtr = static_cast(aDest); + for (size_t i = 0; i < aCount; ++i) { + union + { + T mVal; + uint8_t mBuffer[sizeof(T)]; + } u; + u.mVal = maybeSwap(aSrc[i]); + memcpy(byteDestPtr, u.mBuffer, sizeof(T)); + byteDestPtr += sizeof(T); + } + } + + + + + + template + static void copyAndSwapFrom(T* aDest, const void* aSrc, size_t aCount) + { + assertNoOverlap(aDest, aSrc, aCount * sizeof(T)); + assertAligned(aDest); + + if (SourceEndian == DestEndian) { + memcpy(aDest, aSrc, aCount * sizeof(T)); + return; + } + + const uint8_t* byteSrcPtr = static_cast(aSrc); + for (size_t i = 0; i < aCount; ++i) { + union + { + T mVal; + uint8_t mBuffer[sizeof(T)]; + } u; + memcpy(u.mBuffer, byteSrcPtr, sizeof(T)); + aDest[i] = maybeSwap(u.mVal); + byteSrcPtr += sizeof(T); + } + } +}; + +template +class Endian : private EndianUtils +{ +protected: + + static __attribute__ ((warn_unused_result)) uint16_t readUint16(const void* aPtr) + { + return read(aPtr); + } + + + static __attribute__ ((warn_unused_result)) uint32_t readUint32(const void* aPtr) + { + return read(aPtr); + } + + + static __attribute__ ((warn_unused_result)) uint64_t readUint64(const void* aPtr) + { + return read(aPtr); + } + + + static __attribute__ ((warn_unused_result)) int16_t readInt16(const void* aPtr) + { + return read(aPtr); + } + + + static __attribute__ ((warn_unused_result)) int32_t readInt32(const void* aPtr) + { + return read(aPtr); + } + + + static __attribute__ ((warn_unused_result)) int64_t readInt64(const void* aPtr) + { + return read(aPtr); + } + + + static void writeUint16(void* aPtr, uint16_t aValue) + { + write(aPtr, aValue); + } + + + static void writeUint32(void* aPtr, uint32_t aValue) + { + write(aPtr, aValue); + } + + + static void writeUint64(void* aPtr, uint64_t aValue) + { + write(aPtr, aValue); + } + + + static void writeInt16(void* aPtr, int16_t aValue) + { + write(aPtr, aValue); + } + + + static void writeInt32(void* aPtr, int32_t aValue) + { + write(aPtr, aValue); + } + + + static void writeInt64(void* aPtr, int64_t aValue) + { + write(aPtr, aValue); + } +# 425 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h" + template + __attribute__ ((warn_unused_result)) static T swapToLittleEndian(T aValue) + { + return maybeSwap(aValue); + } + + + + + + + template + static void copyAndSwapToLittleEndian(void* aDest, const T* aSrc, + size_t aCount) + { + copyAndSwapTo(aDest, aSrc, aCount); + } + + + + + template + static void swapToLittleEndianInPlace(T* aPtr, size_t aCount) + { + maybeSwapInPlace(aPtr, aCount); + } + + + + + template + __attribute__ ((warn_unused_result)) static T swapToBigEndian(T aValue) + { + return maybeSwap(aValue); + } + + + + + + + template + static void copyAndSwapToBigEndian(void* aDest, const T* aSrc, + size_t aCount) + { + copyAndSwapTo(aDest, aSrc, aCount); + } + + + + + template + static void swapToBigEndianInPlace(T* aPtr, size_t aCount) + { + maybeSwapInPlace(aPtr, aCount); + } + + + + + + + template + __attribute__ ((warn_unused_result)) static T swapToNetworkOrder(T aValue) + { + return swapToBigEndian(aValue); + } + + template + static void + copyAndSwapToNetworkOrder(void* aDest, const T* aSrc, size_t aCount) + { + copyAndSwapToBigEndian(aDest, aSrc, aCount); + } + + template + static void + swapToNetworkOrderInPlace(T* aPtr, size_t aCount) + { + swapToBigEndianInPlace(aPtr, aCount); + } + + + + + template + __attribute__ ((warn_unused_result)) static T swapFromLittleEndian(T aValue) + { + return maybeSwap(aValue); + } + + + + + + + template + static void copyAndSwapFromLittleEndian(T* aDest, const void* aSrc, + size_t aCount) + { + copyAndSwapFrom(aDest, aSrc, aCount); + } + + + + + template + static void swapFromLittleEndianInPlace(T* aPtr, size_t aCount) + { + maybeSwapInPlace(aPtr, aCount); + } + + + + + template + __attribute__ ((warn_unused_result)) static T swapFromBigEndian(T aValue) + { + return maybeSwap(aValue); + } + + + + + + + template + static void copyAndSwapFromBigEndian(T* aDest, const void* aSrc, + size_t aCount) + { + copyAndSwapFrom(aDest, aSrc, aCount); + } + + + + + template + static void swapFromBigEndianInPlace(T* aPtr, size_t aCount) + { + maybeSwapInPlace(aPtr, aCount); + } + + + + + + template + __attribute__ ((warn_unused_result)) static T swapFromNetworkOrder(T aValue) + { + return swapFromBigEndian(aValue); + } + + template + static void copyAndSwapFromNetworkOrder(T* aDest, const void* aSrc, + size_t aCount) + { + copyAndSwapFromBigEndian(aDest, aSrc, aCount); + } + + template + static void swapFromNetworkOrderInPlace(T* aPtr, size_t aCount) + { + swapFromBigEndianInPlace(aPtr, aCount); + } + +private: + + + + + template + static T read(const void* aPtr) + { + union + { + T mVal; + uint8_t mBuffer[sizeof(T)]; + } u; + memcpy(u.mBuffer, aPtr, sizeof(T)); + return maybeSwap(u.mVal); + } + + + + + + template + static void write(void* aPtr, T aValue) + { + T tmp = maybeSwap(aValue); + memcpy(aPtr, &tmp, sizeof(T)); + } + + Endian() = delete; + Endian(const Endian& aTther) = delete; + void operator=(const Endian& aOther) = delete; +}; + +template +class EndianReadWrite : public Endian +{ +private: + typedef Endian super; + +public: + using super::readUint16; + using super::readUint32; + using super::readUint64; + using super::readInt16; + using super::readInt32; + using super::readInt64; + using super::writeUint16; + using super::writeUint32; + using super::writeUint64; + using super::writeInt16; + using super::writeInt32; + using super::writeInt64; +}; + +} + +class LittleEndian final : public detail::EndianReadWrite +{}; + +class BigEndian final : public detail::EndianReadWrite +{}; + +typedef BigEndian NetworkEndian; + +class NativeEndian final : public detail::Endian +{ +private: + typedef detail::Endian super; + +public: + + + + + + using super::swapToLittleEndian; + using super::copyAndSwapToLittleEndian; + using super::swapToLittleEndianInPlace; + using super::swapToBigEndian; + using super::copyAndSwapToBigEndian; + using super::swapToBigEndianInPlace; + using super::swapToNetworkOrder; + using super::copyAndSwapToNetworkOrder; + using super::swapToNetworkOrderInPlace; + + + + + + + using super::swapFromLittleEndian; + using super::copyAndSwapFromLittleEndian; + using super::swapFromLittleEndianInPlace; + using super::swapFromBigEndian; + using super::copyAndSwapFromBigEndian; + using super::swapFromBigEndianInPlace; + using super::swapFromNetworkOrder; + using super::copyAndSwapFromNetworkOrder; + using super::swapFromNetworkOrderInPlace; +}; + + + +} +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jscpucfg.h" 2 +# 140 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" 2 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Result.h" 1 +# 119 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Result.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h" 1 +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OperatorNewExtensions.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OperatorNewExtensions.h" +namespace mozilla { +enum NotNullTag { + KnownNotNull, +}; +} +# 45 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OperatorNewExtensions.h" +inline void* +operator new(size_t, mozilla::NotNullTag, void* p) +{ + do { } while (0); + return p; +} +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h" 2 + + + + + + +namespace mozilla { + +template +class Variant; + +namespace detail { + +template +struct FirstTypeIsInRest; + +template +struct FirstTypeIsInRest : FalseType {}; + +template +struct FirstTypeIsInRest +{ + static constexpr bool value = + IsSame::value || + FirstTypeIsInRest::value; +}; + +template +struct TypesAreDistinct; + +template <> +struct TypesAreDistinct<> : TrueType { }; + +template +struct TypesAreDistinct +{ + static constexpr bool value = + !FirstTypeIsInRest::value && + TypesAreDistinct::value; +}; + + + + + + +template +struct IsVariant; + +template +struct IsVariant : FalseType {}; + +template +struct IsVariant : TrueType {}; + +template +struct IsVariant : public IsVariant { }; + + +template +struct SelectVariantTypeHelper; + +template +struct SelectVariantTypeHelper +{ }; + +template +struct SelectVariantTypeHelper +{ + typedef T Type; +}; + +template +struct SelectVariantTypeHelper +{ + typedef const T Type; +}; + +template +struct SelectVariantTypeHelper +{ + typedef const T& Type; +}; + +template +struct SelectVariantTypeHelper +{ + typedef T&& Type; +}; + +template +struct SelectVariantTypeHelper + : public SelectVariantTypeHelper +{ }; + + + + + + +template +struct SelectVariantType + : public SelectVariantTypeHelper::Type>::Type, + Variants...> +{ }; + + + +template +struct VariantTag +{ +private: + static const size_t TypeCount = sizeof...(Ts); + +public: + using Type = + typename Conditional::Type + >::Type; +}; + + + + + +template +struct TagHelper; + + +template +struct TagHelper +{ + static Tag tag() { return Next::template tag(); } +}; + + +template +struct TagHelper +{ + static Tag tag() { return Tag(N); } +}; + + + + + + + +template +struct VariantImplementation; + + +template +struct VariantImplementation +{ + template + static Tag tag() { + static_assert(mozilla::IsSame::value, + "mozilla::Variant: tag: bad type!"); + return Tag(N); + } + + template + static void copyConstruct(void* aLhs, const Variant& aRhs) { + ::new (KnownNotNull, aLhs) T(aRhs.template as()); + } + + template + static void moveConstruct(void* aLhs, Variant&& aRhs) { + ::new (KnownNotNull, aLhs) T(aRhs.template extract()); + } + + template + static void destroy(Variant& aV) { + aV.template as().~T(); + } + + template + static bool + equal(const Variant& aLhs, const Variant& aRhs) { + return aLhs.template as() == aRhs.template as(); + } + + template + static auto + match(Matcher&& aMatcher, ConcreteVariant& aV) + -> decltype(aMatcher.match(aV.template as())) + { + return aMatcher.match(aV.template as()); + } +}; + + +template +struct VariantImplementation +{ + + using Next = VariantImplementation; + + template + static Tag tag() { + return TagHelper::value>::tag(); + } + + template + static void copyConstruct(void* aLhs, const Variant& aRhs) { + if (aRhs.template is()) { + ::new (KnownNotNull, aLhs) T(aRhs.template as()); + } else { + Next::copyConstruct(aLhs, aRhs); + } + } + + template + static void moveConstruct(void* aLhs, Variant&& aRhs) { + if (aRhs.template is()) { + ::new (KnownNotNull, aLhs) T(aRhs.template extract()); + } else { + Next::moveConstruct(aLhs, aRhs); + } + } + + template + static void destroy(Variant& aV) { + if (aV.template is()) { + aV.template as().~T(); + } else { + Next::destroy(aV); + } + } + + template + static bool equal(const Variant& aLhs, const Variant& aRhs) { + if (aLhs.template is()) { + do { } while (0); + return aLhs.template as() == aRhs.template as(); + } else { + return Next::equal(aLhs, aRhs); + } + } + + template + static auto + match(Matcher&& aMatcher, ConcreteVariant& aV) + -> decltype(aMatcher.match(aV.template as())) + { + if (aV.template is()) { + return aMatcher.match(aV.template as()); + } else { +# 278 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h" + return Next::match(aMatcher, aV); + } + } +}; + + + + + + + +template +struct AsVariantTemporary +{ + explicit AsVariantTemporary(const T& aValue) + : mValue(aValue) + {} + + template + explicit AsVariantTemporary(U&& aValue) + : mValue(Forward(aValue)) + {} + + AsVariantTemporary(const AsVariantTemporary& aOther) + : mValue(aOther.mValue) + {} + + AsVariantTemporary(AsVariantTemporary&& aOther) + : mValue(Move(aOther.mValue)) + {} + + AsVariantTemporary() = delete; + void operator=(const AsVariantTemporary&) = delete; + void operator=(AsVariantTemporary&&) = delete; + + typename RemoveConst::Type>::Type mValue; +}; + +} +# 447 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h" +template +class Variant +{ + static_assert(detail::TypesAreDistinct::value, + "Variant with duplicate types is not supported"); + + using Tag = typename detail::VariantTag::Type; + using Impl = detail::VariantImplementation; + + static constexpr size_t RawDataAlignment = tl::Max::value; + static constexpr size_t RawDataSize = tl::Max::value; + + + alignas(RawDataAlignment) unsigned char rawData[RawDataSize]; + + + + Tag tag; + + + + + + void* ptr() { + return rawData; + } + + const void* ptr() const { + return rawData; + } + +public: + + template::Type> + explicit Variant(RefT&& aT) + : tag(Impl::template tag()) + { + ::new (KnownNotNull, ptr()) T(Forward(aT)); + } + + + + + + + template::Type> + Variant(detail::AsVariantTemporary&& aValue) + : tag(Impl::template tag()) + { + ::new (KnownNotNull, ptr()) T(Move(aValue.mValue)); + } + + + Variant(const Variant& aRhs) + : tag(aRhs.tag) + { + Impl::copyConstruct(ptr(), aRhs); + } + + + Variant(Variant&& aRhs) + : tag(aRhs.tag) + { + Impl::moveConstruct(ptr(), Move(aRhs)); + } + + + Variant& operator=(const Variant& aRhs) { + do { } while (0); + this->~Variant(); + ::new (KnownNotNull, this) Variant(aRhs); + return *this; + } + + + Variant& operator=(Variant&& aRhs) { + do { } while (0); + this->~Variant(); + ::new (KnownNotNull, this) Variant(Move(aRhs)); + return *this; + } + + + template + Variant& operator=(detail::AsVariantTemporary&& aValue) + { + this->~Variant(); + ::new (KnownNotNull, this) Variant(Move(aValue)); + return *this; + } + + ~Variant() + { + Impl::destroy(*this); + } + + + template + bool is() const { + static_assert(detail::IsVariant::value, + "provided a type not found in this Variant's type list"); + return Impl::template tag() == tag; + } + + + + + + bool operator==(const Variant& aRhs) const { + return tag == aRhs.tag && Impl::equal(*this, aRhs); + } + + + + + + + bool operator!=(const Variant& aRhs) const { + return !(*this == aRhs); + } + + + + + template + T& as() { + static_assert(detail::IsVariant::value, + "provided a type not found in this Variant's type list"); + do { static_assert(mozilla::detail::AssertionConditionType())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(is()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "is()" ")"); do { *((volatile int*) __null) = 581; ::abort(); } while (0); } } while (0); + return *static_cast(ptr()); + } + + + template + const T& as() const { + static_assert(detail::IsVariant::value, + "provided a type not found in this Variant's type list"); + do { static_assert(mozilla::detail::AssertionConditionType())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(is()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "is()" ")"); do { *((volatile int*) __null) = 590; ::abort(); } while (0); } } while (0); + return *static_cast(ptr()); + } + + + + + + + + template + T extract() { + static_assert(detail::IsVariant::value, + "provided a type not found in this Variant's type list"); + do { } while (0); + return T(Move(as())); + } + + + + + template + auto + match(Matcher&& aMatcher) const + -> decltype(Impl::match(aMatcher, *this)) + { + return Impl::match(aMatcher, *this); + } + + + template + auto + match(Matcher&& aMatcher) + -> decltype(Impl::match(aMatcher, *this)) + { + return Impl::match(aMatcher, *this); + } +}; +# 642 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h" +template +detail::AsVariantTemporary +AsVariant(T&& aValue) +{ + return detail::AsVariantTemporary(Forward(aValue)); +} + +} +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h" 2 + +namespace mozilla { + + + + + + +struct Ok {}; + +template class GenericErrorResult; +template class Result; + +namespace detail { + +enum class PackingStrategy { + Variant, + NullIsOk, + LowBitTagIsError, + PackedVariant, +}; + +template +class ResultImplementation; + +template +class ResultImplementation +{ + mozilla::Variant mStorage; + +public: + explicit ResultImplementation(V aValue) : mStorage(aValue) {} + explicit ResultImplementation(E aErrorValue) : mStorage(aErrorValue) {} + + bool isOk() const { return mStorage.template is(); } + + + + + V unwrap() const { return mStorage.template as(); } + E unwrapErr() const { return mStorage.template as(); } +}; + + + + + +template +class ResultImplementation +{ + mozilla::Variant mStorage; + +public: + explicit ResultImplementation(V aValue) : mStorage(aValue) {} + explicit ResultImplementation(E& aErrorValue) : mStorage(&aErrorValue) {} + + bool isOk() const { return mStorage.template is(); } + V unwrap() const { return mStorage.template as(); } + E& unwrapErr() const { return *mStorage.template as(); } +}; + + + + + +template +class ResultImplementation +{ + E* mErrorValue; + +public: + explicit ResultImplementation(V) : mErrorValue(nullptr) {} + explicit ResultImplementation(E& aErrorValue) : mErrorValue(&aErrorValue) {} + + bool isOk() const { return mErrorValue == nullptr; } + + V unwrap() const { return V(); } + E& unwrapErr() const { return *mErrorValue; } +}; + + + + + +template +class ResultImplementation +{ + uintptr_t mBits; + +public: + explicit ResultImplementation(V* aValue) + : mBits(reinterpret_cast(aValue)) + { + do { } while (0); + + } + explicit ResultImplementation(E& aErrorValue) + : mBits(reinterpret_cast(&aErrorValue) | 1) + { + do { } while (0); + + } + + bool isOk() const { return (mBits & 1) == 0; } + + V* unwrap() const { return reinterpret_cast(mBits); } + E& unwrapErr() const { return *reinterpret_cast(mBits ^ 1); } +}; + + +template +struct IsPackableVariant +{ + struct VEbool { + V v; + E e; + bool ok; + }; + struct EVbool { + E e; + V v; + bool ok; + }; + + using Impl = typename Conditional::Type; + + static const bool value = sizeof(Impl) <= sizeof(uintptr_t); +}; + + + + + +template +class ResultImplementation +{ + using Impl = typename IsPackableVariant::Impl; + Impl data; + +public: + explicit ResultImplementation(V aValue) + { + data.v = aValue; + data.ok = true; + } + explicit ResultImplementation(E aErrorValue) + { + data.e = aErrorValue; + data.ok = false; + } + + bool isOk() const { return data.ok; } + + V unwrap() const { return data.v; } + E unwrapErr() const { return data.e; } +}; + + + + + +template +struct UnusedZero +{ + static const bool value = false; +}; + + +template +struct UnusedZero +{ + static const bool value = true; +}; + + + + +template struct HasFreeLSB { static const bool value = false; }; + + + + +template struct HasFreeLSB { + static const bool value = (mozilla::AlignmentFinder::alignment & 1) == 0; +}; + + + +template struct HasFreeLSB { + static const bool value = HasFreeLSB::value; +}; + + + +template +struct SelectResultImpl +{ + static const PackingStrategy value = + (IsEmpty::value && UnusedZero::value) + ? PackingStrategy::NullIsOk + : (detail::HasFreeLSB::value && detail::HasFreeLSB::value) + ? PackingStrategy::LowBitTagIsError + : (IsDefaultConstructible::value && IsDefaultConstructible::value && + IsPackableVariant::value) + ? PackingStrategy::PackedVariant + : PackingStrategy::Variant; + + using Type = detail::ResultImplementation; +}; + +template +struct IsResult : FalseType { }; + +template +struct IsResult> : TrueType { }; + +} +# 263 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h" +template +class Result final +{ + using Impl = typename detail::SelectResultImpl::Type; + + Impl mImpl; + +public: + + + + Result(V aValue) : mImpl(aValue) { do { } while (0); } + + + + + explicit Result(E aErrorValue) : mImpl(aErrorValue) { do { } while (0); } + + + + + + template + Result(const GenericErrorResult& aErrorResult) + : mImpl(aErrorResult.mErrorValue) + { + static_assert(mozilla::IsConvertible::value, + "E2 must be convertible to E"); + do { } while (0); + } + + Result(const Result&) = default; + Result& operator=(const Result&) = default; + + + bool isOk() const { return mImpl.isOk(); } + + + bool isErr() const { return !mImpl.isOk(); } + + + V unwrap() const { + do { } while (0); + return mImpl.unwrap(); + } + + + E unwrapErr() const { + do { } while (0); + return mImpl.unwrapErr(); + } +# 340 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h" + template + auto map(F f) const -> Result { + using RetResult = Result; + return isOk() ? RetResult(f(unwrap())) : RetResult(unwrapErr()); + } +# 374 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h" + template< + typename F, + typename = typename EnableIf< + detail::IsResult::value + >::Type + > + auto andThen(F f) const -> decltype(f(*((V*) nullptr))) { + return isOk() ? f(unwrap()) : GenericErrorResult(unwrapErr()); + } +}; + + + + + + + +template +class GenericErrorResult +{ + E mErrorValue; + + template friend class Result; + +public: + explicit GenericErrorResult(E aErrorValue) : mErrorValue(aErrorValue) {} +}; + +template +inline GenericErrorResult +Err(E&& aErrorValue) +{ + return GenericErrorResult(aErrorValue); +} + +} +# 120 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Result.h" 2 + +struct JSContext; +# 179 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Result.h" +namespace JS { + +using mozilla::Ok; + + + + + +struct Error +{ + + + int dummy; +}; + +struct OOM : public Error +{ +}; +# 213 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Result.h" +template +using Result = mozilla::Result; + +static_assert(sizeof(Result<>) == sizeof(uintptr_t), + "Result<> should be pointer-sized"); + +static_assert(sizeof(Result) == sizeof(uintptr_t), + "Result should be pointer-sized"); + +} +# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TypeDecls.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TypeDecls.h" +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TypeDecls.h" 2 + + + + +struct JSContext; +class JSFunction; +class JSObject; +class JSScript; +class JSString; +class JSAddonId; + +struct jsid; + +namespace JS { + +typedef unsigned char Latin1Char; + +class Symbol; +class Value; +template class Handle; +template class MutableHandle; +template class Rooted; +template class PersistentRooted; + +typedef Handle HandleFunction; +typedef Handle HandleId; +typedef Handle HandleObject; +typedef Handle HandleScript; +typedef Handle HandleString; +typedef Handle HandleSymbol; +typedef Handle HandleValue; + +typedef MutableHandle MutableHandleFunction; +typedef MutableHandle MutableHandleId; +typedef MutableHandle MutableHandleObject; +typedef MutableHandle MutableHandleScript; +typedef MutableHandle MutableHandleString; +typedef MutableHandle MutableHandleSymbol; +typedef MutableHandle MutableHandleValue; + +typedef Rooted RootedObject; +typedef Rooted RootedFunction; +typedef Rooted RootedScript; +typedef Rooted RootedString; +typedef Rooted RootedSymbol; +typedef Rooted RootedId; +typedef Rooted RootedValue; + +typedef PersistentRooted PersistentRootedFunction; +typedef PersistentRooted PersistentRootedId; +typedef PersistentRooted PersistentRootedObject; +typedef PersistentRooted PersistentRootedScript; +typedef PersistentRooted PersistentRootedString; +typedef PersistentRooted PersistentRootedSymbol; +typedef PersistentRooted PersistentRootedValue; + +} +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h" 2 + + +namespace js { +class BaseShape; +class LazyScript; +class ObjectGroup; +class RegExpShared; +class Shape; +class Scope; +namespace jit { +class JitCode; +} +} + +namespace JS { +# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h" +enum class TraceKind +{ + + + + Object = 0x00, + String = 0x02, + Symbol = 0x03, + + + Script = 0x01, + + + Shape = 0x04, + + + ObjectGroup = 0x05, + + + Null = 0x06, + + + BaseShape = 0x0F, + JitCode = 0x1F, + LazyScript = 0x2F, + Scope = 0x3F, + RegExpShared = 0x4F +}; +const static uintptr_t OutOfLineTraceKindMask = 0x07; +static_assert(uintptr_t(JS::TraceKind::BaseShape) & OutOfLineTraceKindMask, "mask bits are set"); +static_assert(uintptr_t(JS::TraceKind::JitCode) & OutOfLineTraceKindMask, "mask bits are set"); +static_assert(uintptr_t(JS::TraceKind::LazyScript) & OutOfLineTraceKindMask, "mask bits are set"); +static_assert(uintptr_t(JS::TraceKind::Scope) & OutOfLineTraceKindMask, "mask bits are set"); +static_assert(uintptr_t(JS::TraceKind::RegExpShared) & OutOfLineTraceKindMask, "mask bits are set"); + + + + +template +struct MapTypeToTraceKind { + static const JS::TraceKind kind = T::TraceKind; +}; +# 102 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h" +template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::BaseShape; }; template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::JitCode; }; template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::LazyScript; }; template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::Scope; }; template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::Object; }; template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::ObjectGroup; }; template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::Script; }; template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::Shape; }; template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::String; }; template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::Symbol; }; template <> struct MapTypeToTraceKind { static const JS::TraceKind kind = JS::TraceKind::RegExpShared; };; + + + + + +enum class RootKind : int8_t +{ + + + +BaseShape, JitCode, LazyScript, Scope, Object, ObjectGroup, Script, Shape, String, Symbol, RegExpShared, + + + + Id, + Value, + + + Traceable, + + Limit +}; + + +template struct MapTraceKindToRootKind {}; + + + + +template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::BaseShape; }; template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::JitCode; }; template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::LazyScript; }; template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::Scope; }; template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::Object; }; template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::ObjectGroup; }; template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::Script; }; template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::Shape; }; template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::String; }; template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::Symbol; }; template <> struct MapTraceKindToRootKind { static const JS::RootKind kind = JS::RootKind::RegExpShared; }; + + + + + +template +struct MapTypeToRootKind { + static const JS::RootKind kind = JS::RootKind::Traceable; +}; +template +struct MapTypeToRootKind { + static const JS::RootKind kind = + JS::MapTraceKindToRootKind::kind>::kind; +}; +template +struct MapTypeToRootKind> { + static const JS::RootKind kind = JS::MapTypeToRootKind::kind; +}; +template <> struct MapTypeToRootKind { + static const JS::RootKind kind = JS::RootKind::Value; +}; +template <> struct MapTypeToRootKind { + static const JS::RootKind kind = JS::RootKind::Id; +}; +template <> struct MapTypeToRootKind : public MapTypeToRootKind {}; +# 183 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h" +template +auto +DispatchTraceKindTyped(F f, JS::TraceKind traceKind, Args&&... args) + -> decltype(f. template operator()(mozilla::Forward(args)...)) +{ + switch (traceKind) { + + + + case JS::TraceKind::BaseShape: return f. template operator()(mozilla::Forward(args)...); case JS::TraceKind::JitCode: return f. template operator()(mozilla::Forward(args)...); case JS::TraceKind::LazyScript: return f. template operator()(mozilla::Forward(args)...); case JS::TraceKind::Scope: return f. template operator()(mozilla::Forward(args)...); case JS::TraceKind::Object: return f. template operator()(mozilla::Forward(args)...); case JS::TraceKind::ObjectGroup: return f. template operator()(mozilla::Forward(args)...); case JS::TraceKind::Script: return f. template operator()(mozilla::Forward(args)...); case JS::TraceKind::Shape: return f. template operator()(mozilla::Forward(args)...); case JS::TraceKind::String: return f. template operator()(mozilla::Forward(args)...); case JS::TraceKind::Symbol: return f. template operator()(mozilla::Forward(args)...); case JS::TraceKind::RegExpShared: return f. template operator()(mozilla::Forward(args)...);; + + default: + do { AnnotateMozCrashReason("MOZ_CRASH(" "Invalid trace kind in DispatchTraceKindTyped." ")"); do { *((volatile int*) __null) = 195; ::abort(); } while (0); } while (0); + } +} + + +template +auto +DispatchTraceKindTyped(F f, void* thing, JS::TraceKind traceKind, Args&&... args) + -> decltype(f(static_cast(nullptr), mozilla::Forward(args)...)) +{ + switch (traceKind) { + + + + case JS::TraceKind::BaseShape: return f(static_cast(thing), mozilla::Forward(args)...); case JS::TraceKind::JitCode: return f(static_cast(thing), mozilla::Forward(args)...); case JS::TraceKind::LazyScript: return f(static_cast(thing), mozilla::Forward(args)...); case JS::TraceKind::Scope: return f(static_cast(thing), mozilla::Forward(args)...); case JS::TraceKind::Object: return f(static_cast(thing), mozilla::Forward(args)...); case JS::TraceKind::ObjectGroup: return f(static_cast(thing), mozilla::Forward(args)...); case JS::TraceKind::Script: return f(static_cast(thing), mozilla::Forward(args)...); case JS::TraceKind::Shape: return f(static_cast(thing), mozilla::Forward(args)...); case JS::TraceKind::String: return f(static_cast(thing), mozilla::Forward(args)...); case JS::TraceKind::Symbol: return f(static_cast(thing), mozilla::Forward(args)...); case JS::TraceKind::RegExpShared: return f(static_cast(thing), mozilla::Forward(args)...);; + + default: + do { AnnotateMozCrashReason("MOZ_CRASH(" "Invalid trace kind in DispatchTraceKindTyped." ")"); do { *((volatile int*) __null) = 212; ::abort(); } while (0); } while (0); + } +} + +} +# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2 + + + + + + +namespace JS { + +class AutoIdVector; +class CallArgs; + +template +class Rooted; + +class CompileOptions; +class ReadOnlyCompileOptions; +class OwningCompileOptions; +class TransitiveCompileOptions; +class CompartmentOptions; + +class Value; +struct Zone; + +} + + + + + + +enum JSVersion { + JSVERSION_ECMA_3 = 148, + JSVERSION_1_6 = 160, + JSVERSION_1_7 = 170, + JSVERSION_1_8 = 180, + JSVERSION_ECMA_5 = 185, + JSVERSION_DEFAULT = 0, + JSVERSION_UNKNOWN = -1, + JSVERSION_LATEST = JSVERSION_ECMA_5 +}; + + +enum JSType { + JSTYPE_UNDEFINED, + JSTYPE_OBJECT, + JSTYPE_FUNCTION, + JSTYPE_STRING, + JSTYPE_NUMBER, + JSTYPE_BOOLEAN, + JSTYPE_NULL, + JSTYPE_SYMBOL, + JSTYPE_LIMIT +}; + + +enum JSProtoKey { + + JSProto_Null = 0, JSProto_Object = 1, JSProto_Function = 2, JSProto_Array = 3, JSProto_Boolean = 4, JSProto_JSON = 5, JSProto_Date = 6, JSProto_Math = 7, JSProto_Number = 8, JSProto_String = 9, JSProto_RegExp = 10, JSProto_Error = 11, JSProto_InternalError = 12, JSProto_EvalError = 13, JSProto_RangeError = 14, JSProto_ReferenceError = 15, JSProto_SyntaxError = 16, JSProto_TypeError = 17, JSProto_URIError = 18, JSProto_DebuggeeWouldRun = 19, JSProto_CompileError = 20, JSProto_LinkError = 21, JSProto_RuntimeError = 22, JSProto_Iterator = 23, JSProto_StopIteration = 24, JSProto_ArrayBuffer = 25, JSProto_Int8Array = 26, JSProto_Uint8Array = 27, JSProto_Int16Array = 28, JSProto_Uint16Array = 29, JSProto_Int32Array = 30, JSProto_Uint32Array = 31, JSProto_Float32Array = 32, JSProto_Float64Array = 33, JSProto_Uint8ClampedArray = 34, JSProto_Proxy = 35, JSProto_WeakMap = 36, JSProto_Map = 37, JSProto_Set = 38, JSProto_DataView = 39, JSProto_Symbol = 40, JSProto_SharedArrayBuffer = 41, JSProto_Intl = 42, JSProto_TypedObject = 43, JSProto_Reflect = 44, JSProto_SIMD = 45, JSProto_WeakSet = 46, JSProto_TypedArray = 47, JSProto_Atomics = 48, JSProto_SavedFrame = 49, JSProto_WebAssembly = 50, JSProto_WasmModule = 51, JSProto_WasmInstance = 52, JSProto_WasmMemory = 53, JSProto_WasmTable = 54, JSProto_Promise = 55, + + JSProto_LIMIT +}; + + +struct JSClass; +struct JSCompartment; +struct JSCrossCompartmentCall; +class JSErrorReport; +struct JSExceptionState; +struct JSFunctionSpec; +struct JSLocaleCallbacks; +struct JSObjectMap; +struct JSPrincipals; +struct JSPropertyName; +struct JSPropertySpec; +struct JSRuntime; +struct JSSecurityCallbacks; +struct JSStructuredCloneCallbacks; +struct JSStructuredCloneReader; +struct JSStructuredCloneWriter; +class JSTracer; + +class JSFlatString; + +typedef bool (*JSInitCallback)(void); + +template struct JSConstScalarSpec; +typedef JSConstScalarSpec JSConstDoubleSpec; +typedef JSConstScalarSpec JSConstIntegerSpec; + + + + + +typedef void +(* JSTraceDataOp)(JSTracer* trc, void* data); + +namespace js { +namespace gc { +class AutoTraceSession; +class StoreBuffer; +} + +class CooperatingContext; + +inline JSCompartment* GetContextCompartment(const JSContext* cx); +inline JS::Zone* GetContextZone(const JSContext* cx); + + + +bool +CurrentThreadCanAccessRuntime(const JSRuntime* rt); + + + + + + +} + +namespace JS { + +class AutoEnterCycleCollection; +class AutoAssertOnBarrier; +struct PropertyDescriptor; + +typedef void (*OffThreadCompileCallback)(void* token, void* callbackData); + +enum class HeapState { + Idle, + Tracing, + MajorCollecting, + MinorCollecting, + CycleCollecting +}; + +HeapState +CurrentThreadHeapState(); + +static inline bool +CurrentThreadIsHeapBusy() +{ + return CurrentThreadHeapState() != HeapState::Idle; +} + +static inline bool +CurrentThreadIsHeapTracing() +{ + return CurrentThreadHeapState() == HeapState::Tracing; +} + +static inline bool +CurrentThreadIsHeapMajorCollecting() +{ + return CurrentThreadHeapState() == HeapState::MajorCollecting; +} + +static inline bool +CurrentThreadIsHeapMinorCollecting() +{ + return CurrentThreadHeapState() == HeapState::MinorCollecting; +} + +static inline bool +CurrentThreadIsHeapCollecting() +{ + HeapState state = CurrentThreadHeapState(); + return state == HeapState::MajorCollecting || state == HeapState::MinorCollecting; +} + +static inline bool +CurrentThreadIsHeapCycleCollecting() +{ + return CurrentThreadHeapState() == HeapState::CycleCollecting; +} + + + +class AutoEnterCycleCollection +{ + + + + + + + + public: + explicit AutoEnterCycleCollection(JSContext* cx) {} + ~AutoEnterCycleCollection() {} + +}; + +class RootingContext; + +class AutoGCRooter +{ + public: + AutoGCRooter(JSContext* cx, ptrdiff_t tag); + AutoGCRooter(RootingContext* cx, ptrdiff_t tag); + + ~AutoGCRooter() { + do { } while (0); + *stackTop = down; + } + + + inline void trace(JSTracer* trc); + static void traceAll(const js::CooperatingContext& target, JSTracer* trc); + static void traceAllWrappers(const js::CooperatingContext& target, JSTracer* trc); + + protected: + AutoGCRooter * const down; +# 244 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" + ptrdiff_t tag_; + + enum { + VALARRAY = -2, + PARSER = -3, + VALVECTOR = -10, + IDVECTOR = -11, + OBJVECTOR = -14, + IONMASM = -19, + WRAPVECTOR = -20, + WRAPPER = -21, + CUSTOM = -26 + }; + + static ptrdiff_t GetTag(const Value& value) { return VALVECTOR; } + static ptrdiff_t GetTag(const jsid& id) { return IDVECTOR; } + static ptrdiff_t GetTag(JSObject* obj) { return OBJVECTOR; } + + private: + AutoGCRooter ** const stackTop; + + + AutoGCRooter(AutoGCRooter& ida) = delete; + void operator=(AutoGCRooter& ida) = delete; +}; + + + +template <> +struct MapTypeToRootKind { + static const RootKind kind = RootKind::Traceable; +}; + +using RootedListHeads = mozilla::EnumeratedArray*>; + + + + + + +enum StackKind +{ + StackForSystemCode, + StackForTrustedScript, + StackForUntrustedScript, + StackKindCount +}; + + + +class RootingContext +{ + + RootedListHeads stackRoots_; + template friend class JS::Rooted; + + + JS::AutoGCRooter* autoGCRooters_; + friend class JS::AutoGCRooter; + + public: + RootingContext(); + + void traceStackRoots(JSTracer* trc); + void checkNoGCRooters(); + + protected: + + + + + + JSCompartment* compartment_; + + + JS::Zone* zone_; + + public: + + uintptr_t nativeStackLimit[StackKindCount]; + + static const RootingContext* get(const JSContext* cx) { + return reinterpret_cast(cx); + } + + static RootingContext* get(JSContext* cx) { + return reinterpret_cast(cx); + } + + friend JSCompartment* js::GetContextCompartment(const JSContext* cx); + friend JS::Zone* js::GetContextZone(const JSContext* cx); +}; + +} + +namespace js { +# 352 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" +inline JSCompartment* +GetContextCompartment(const JSContext* cx) +{ + return JS::RootingContext::get(cx)->compartment_; +} + +inline JS::Zone* +GetContextZone(const JSContext* cx) +{ + return JS::RootingContext::get(cx)->zone_; +} + +} + +extern "C" { + + +typedef struct PRFileDesc PRFileDesc; + +} +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionTraversalCallback.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HeapAPI.h" 1 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HeapAPI.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" 1 +# 49 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" +namespace mozilla { +# 81 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" +enum MemoryOrdering { +# 111 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" + Relaxed, +# 133 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" + ReleaseAcquire, +# 162 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" + SequentiallyConsistent, +}; + +} + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/atomic" 1 3 +# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/atomic" 3 + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 1 3 +# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 3 +# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ +# 55 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 3 + typedef enum memory_order + { + memory_order_relaxed, + memory_order_consume, + memory_order_acquire, + memory_order_release, + memory_order_acq_rel, + memory_order_seq_cst + } memory_order; + + enum __memory_order_modifier + { + __memory_order_mask = 0x0ffff, + __memory_order_modifier_mask = 0xffff0000, + __memory_order_hle_acquire = 0x10000, + __memory_order_hle_release = 0x20000 + }; + + constexpr memory_order + operator|(memory_order __m, __memory_order_modifier __mod) + { + return memory_order(__m | int(__mod)); + } + + constexpr memory_order + operator&(memory_order __m, __memory_order_modifier __mod) + { + return memory_order(__m & int(__mod)); + } + + + constexpr memory_order + __cmpexch_failure_order2(memory_order __m) noexcept + { + return __m == memory_order_acq_rel ? memory_order_acquire + : __m == memory_order_release ? memory_order_relaxed : __m; + } + + constexpr memory_order + __cmpexch_failure_order(memory_order __m) noexcept + { + return memory_order(__cmpexch_failure_order2(__m & __memory_order_mask) + | (__m & __memory_order_modifier_mask)); + } + + inline __attribute__((__always_inline__)) void + atomic_thread_fence(memory_order __m) noexcept + { __atomic_thread_fence(__m); } + + inline __attribute__((__always_inline__)) void + atomic_signal_fence(memory_order __m) noexcept + { __atomic_signal_fence(__m); } + + + template + inline _Tp + kill_dependency(_Tp __y) noexcept + { + _Tp __ret(__y); + return __ret; + } + + + + template + struct __atomic_base; + + + + + template + struct atomic; + + template + struct atomic<_Tp*>; + + + + typedef bool __atomic_flag_data_type; +# 148 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 3 + extern "C" { + + struct __atomic_flag_base + { + __atomic_flag_data_type _M_i; + }; + + } + + + + + struct atomic_flag : public __atomic_flag_base + { + atomic_flag() noexcept = default; + ~atomic_flag() noexcept = default; + atomic_flag(const atomic_flag&) = delete; + atomic_flag& operator=(const atomic_flag&) = delete; + atomic_flag& operator=(const atomic_flag&) volatile = delete; + + + constexpr atomic_flag(bool __i) noexcept + : __atomic_flag_base{ _S_init(__i) } + { } + + inline __attribute__((__always_inline__)) bool + test_and_set(memory_order __m = memory_order_seq_cst) noexcept + { + return __atomic_test_and_set (&_M_i, __m); + } + + inline __attribute__((__always_inline__)) bool + test_and_set(memory_order __m = memory_order_seq_cst) volatile noexcept + { + return __atomic_test_and_set (&_M_i, __m); + } + + inline __attribute__((__always_inline__)) void + clear(memory_order __m = memory_order_seq_cst) noexcept + { + memory_order __b = __m & __memory_order_mask; + ; + ; + ; + + __atomic_clear (&_M_i, __m); + } + + inline __attribute__((__always_inline__)) void + clear(memory_order __m = memory_order_seq_cst) volatile noexcept + { + memory_order __b = __m & __memory_order_mask; + ; + ; + ; + + __atomic_clear (&_M_i, __m); + } + + private: + static constexpr __atomic_flag_data_type + _S_init(bool __i) + { return __i ? 1 : 0; } + }; +# 237 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 3 + template + struct __atomic_base + { + private: + typedef _ITp __int_type; + + static constexpr int _S_alignment = + sizeof(_ITp) > alignof(_ITp) ? sizeof(_ITp) : alignof(_ITp); + + alignas(_S_alignment) __int_type _M_i; + + public: + __atomic_base() noexcept = default; + ~__atomic_base() noexcept = default; + __atomic_base(const __atomic_base&) = delete; + __atomic_base& operator=(const __atomic_base&) = delete; + __atomic_base& operator=(const __atomic_base&) volatile = delete; + + + constexpr __atomic_base(__int_type __i) noexcept : _M_i (__i) { } + + operator __int_type() const noexcept + { return load(); } + + operator __int_type() const volatile noexcept + { return load(); } + + __int_type + operator=(__int_type __i) noexcept + { + store(__i); + return __i; + } + + __int_type + operator=(__int_type __i) volatile noexcept + { + store(__i); + return __i; + } + + __int_type + operator++(int) noexcept + { return fetch_add(1); } + + __int_type + operator++(int) volatile noexcept + { return fetch_add(1); } + + __int_type + operator--(int) noexcept + { return fetch_sub(1); } + + __int_type + operator--(int) volatile noexcept + { return fetch_sub(1); } + + __int_type + operator++() noexcept + { return __atomic_add_fetch(&_M_i, 1, memory_order_seq_cst); } + + __int_type + operator++() volatile noexcept + { return __atomic_add_fetch(&_M_i, 1, memory_order_seq_cst); } + + __int_type + operator--() noexcept + { return __atomic_sub_fetch(&_M_i, 1, memory_order_seq_cst); } + + __int_type + operator--() volatile noexcept + { return __atomic_sub_fetch(&_M_i, 1, memory_order_seq_cst); } + + __int_type + operator+=(__int_type __i) noexcept + { return __atomic_add_fetch(&_M_i, __i, memory_order_seq_cst); } + + __int_type + operator+=(__int_type __i) volatile noexcept + { return __atomic_add_fetch(&_M_i, __i, memory_order_seq_cst); } + + __int_type + operator-=(__int_type __i) noexcept + { return __atomic_sub_fetch(&_M_i, __i, memory_order_seq_cst); } + + __int_type + operator-=(__int_type __i) volatile noexcept + { return __atomic_sub_fetch(&_M_i, __i, memory_order_seq_cst); } + + __int_type + operator&=(__int_type __i) noexcept + { return __atomic_and_fetch(&_M_i, __i, memory_order_seq_cst); } + + __int_type + operator&=(__int_type __i) volatile noexcept + { return __atomic_and_fetch(&_M_i, __i, memory_order_seq_cst); } + + __int_type + operator|=(__int_type __i) noexcept + { return __atomic_or_fetch(&_M_i, __i, memory_order_seq_cst); } + + __int_type + operator|=(__int_type __i) volatile noexcept + { return __atomic_or_fetch(&_M_i, __i, memory_order_seq_cst); } + + __int_type + operator^=(__int_type __i) noexcept + { return __atomic_xor_fetch(&_M_i, __i, memory_order_seq_cst); } + + __int_type + operator^=(__int_type __i) volatile noexcept + { return __atomic_xor_fetch(&_M_i, __i, memory_order_seq_cst); } + + bool + is_lock_free() const noexcept + { + + return __atomic_is_lock_free(sizeof(_M_i), + reinterpret_cast(-__alignof(_M_i))); + } + + bool + is_lock_free() const volatile noexcept + { + + return __atomic_is_lock_free(sizeof(_M_i), + reinterpret_cast(-__alignof(_M_i))); + } + + inline __attribute__((__always_inline__)) void + store(__int_type __i, memory_order __m = memory_order_seq_cst) noexcept + { + memory_order __b = __m & __memory_order_mask; + ; + ; + ; + + __atomic_store_n(&_M_i, __i, __m); + } + + inline __attribute__((__always_inline__)) void + store(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { + memory_order __b = __m & __memory_order_mask; + ; + ; + ; + + __atomic_store_n(&_M_i, __i, __m); + } + + inline __attribute__((__always_inline__)) __int_type + load(memory_order __m = memory_order_seq_cst) const noexcept + { + memory_order __b = __m & __memory_order_mask; + ; + ; + + return __atomic_load_n(&_M_i, __m); + } + + inline __attribute__((__always_inline__)) __int_type + load(memory_order __m = memory_order_seq_cst) const volatile noexcept + { + memory_order __b = __m & __memory_order_mask; + ; + ; + + return __atomic_load_n(&_M_i, __m); + } + + inline __attribute__((__always_inline__)) __int_type + exchange(__int_type __i, + memory_order __m = memory_order_seq_cst) noexcept + { + return __atomic_exchange_n(&_M_i, __i, __m); + } + + + inline __attribute__((__always_inline__)) __int_type + exchange(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { + return __atomic_exchange_n(&_M_i, __i, __m); + } + + inline __attribute__((__always_inline__)) bool + compare_exchange_weak(__int_type& __i1, __int_type __i2, + memory_order __m1, memory_order __m2) noexcept + { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + ; + ; + ; + + return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 1, __m1, __m2); + } + + inline __attribute__((__always_inline__)) bool + compare_exchange_weak(__int_type& __i1, __int_type __i2, + memory_order __m1, + memory_order __m2) volatile noexcept + { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + ; + ; + ; + + return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 1, __m1, __m2); + } + + inline __attribute__((__always_inline__)) bool + compare_exchange_weak(__int_type& __i1, __int_type __i2, + memory_order __m = memory_order_seq_cst) noexcept + { + return compare_exchange_weak(__i1, __i2, __m, + __cmpexch_failure_order(__m)); + } + + inline __attribute__((__always_inline__)) bool + compare_exchange_weak(__int_type& __i1, __int_type __i2, + memory_order __m = memory_order_seq_cst) volatile noexcept + { + return compare_exchange_weak(__i1, __i2, __m, + __cmpexch_failure_order(__m)); + } + + inline __attribute__((__always_inline__)) bool + compare_exchange_strong(__int_type& __i1, __int_type __i2, + memory_order __m1, memory_order __m2) noexcept + { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + ; + ; + ; + + return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0, __m1, __m2); + } + + inline __attribute__((__always_inline__)) bool + compare_exchange_strong(__int_type& __i1, __int_type __i2, + memory_order __m1, + memory_order __m2) volatile noexcept + { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + + ; + ; + ; + + return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0, __m1, __m2); + } + + inline __attribute__((__always_inline__)) bool + compare_exchange_strong(__int_type& __i1, __int_type __i2, + memory_order __m = memory_order_seq_cst) noexcept + { + return compare_exchange_strong(__i1, __i2, __m, + __cmpexch_failure_order(__m)); + } + + inline __attribute__((__always_inline__)) bool + compare_exchange_strong(__int_type& __i1, __int_type __i2, + memory_order __m = memory_order_seq_cst) volatile noexcept + { + return compare_exchange_strong(__i1, __i2, __m, + __cmpexch_failure_order(__m)); + } + + inline __attribute__((__always_inline__)) __int_type + fetch_add(__int_type __i, + memory_order __m = memory_order_seq_cst) noexcept + { return __atomic_fetch_add(&_M_i, __i, __m); } + + inline __attribute__((__always_inline__)) __int_type + fetch_add(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return __atomic_fetch_add(&_M_i, __i, __m); } + + inline __attribute__((__always_inline__)) __int_type + fetch_sub(__int_type __i, + memory_order __m = memory_order_seq_cst) noexcept + { return __atomic_fetch_sub(&_M_i, __i, __m); } + + inline __attribute__((__always_inline__)) __int_type + fetch_sub(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return __atomic_fetch_sub(&_M_i, __i, __m); } + + inline __attribute__((__always_inline__)) __int_type + fetch_and(__int_type __i, + memory_order __m = memory_order_seq_cst) noexcept + { return __atomic_fetch_and(&_M_i, __i, __m); } + + inline __attribute__((__always_inline__)) __int_type + fetch_and(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return __atomic_fetch_and(&_M_i, __i, __m); } + + inline __attribute__((__always_inline__)) __int_type + fetch_or(__int_type __i, + memory_order __m = memory_order_seq_cst) noexcept + { return __atomic_fetch_or(&_M_i, __i, __m); } + + inline __attribute__((__always_inline__)) __int_type + fetch_or(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return __atomic_fetch_or(&_M_i, __i, __m); } + + inline __attribute__((__always_inline__)) __int_type + fetch_xor(__int_type __i, + memory_order __m = memory_order_seq_cst) noexcept + { return __atomic_fetch_xor(&_M_i, __i, __m); } + + inline __attribute__((__always_inline__)) __int_type + fetch_xor(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return __atomic_fetch_xor(&_M_i, __i, __m); } + }; + + + + template + struct __atomic_base<_PTp*> + { + private: + typedef _PTp* __pointer_type; + + __pointer_type _M_p; + + + constexpr ptrdiff_t + _M_type_size(ptrdiff_t __d) const { return __d * sizeof(_PTp); } + + constexpr ptrdiff_t + _M_type_size(ptrdiff_t __d) const volatile { return __d * sizeof(_PTp); } + + public: + __atomic_base() noexcept = default; + ~__atomic_base() noexcept = default; + __atomic_base(const __atomic_base&) = delete; + __atomic_base& operator=(const __atomic_base&) = delete; + __atomic_base& operator=(const __atomic_base&) volatile = delete; + + + constexpr __atomic_base(__pointer_type __p) noexcept : _M_p (__p) { } + + operator __pointer_type() const noexcept + { return load(); } + + operator __pointer_type() const volatile noexcept + { return load(); } + + __pointer_type + operator=(__pointer_type __p) noexcept + { + store(__p); + return __p; + } + + __pointer_type + operator=(__pointer_type __p) volatile noexcept + { + store(__p); + return __p; + } + + __pointer_type + operator++(int) noexcept + { return fetch_add(1); } + + __pointer_type + operator++(int) volatile noexcept + { return fetch_add(1); } + + __pointer_type + operator--(int) noexcept + { return fetch_sub(1); } + + __pointer_type + operator--(int) volatile noexcept + { return fetch_sub(1); } + + __pointer_type + operator++() noexcept + { return __atomic_add_fetch(&_M_p, _M_type_size(1), + memory_order_seq_cst); } + + __pointer_type + operator++() volatile noexcept + { return __atomic_add_fetch(&_M_p, _M_type_size(1), + memory_order_seq_cst); } + + __pointer_type + operator--() noexcept + { return __atomic_sub_fetch(&_M_p, _M_type_size(1), + memory_order_seq_cst); } + + __pointer_type + operator--() volatile noexcept + { return __atomic_sub_fetch(&_M_p, _M_type_size(1), + memory_order_seq_cst); } + + __pointer_type + operator+=(ptrdiff_t __d) noexcept + { return __atomic_add_fetch(&_M_p, _M_type_size(__d), + memory_order_seq_cst); } + + __pointer_type + operator+=(ptrdiff_t __d) volatile noexcept + { return __atomic_add_fetch(&_M_p, _M_type_size(__d), + memory_order_seq_cst); } + + __pointer_type + operator-=(ptrdiff_t __d) noexcept + { return __atomic_sub_fetch(&_M_p, _M_type_size(__d), + memory_order_seq_cst); } + + __pointer_type + operator-=(ptrdiff_t __d) volatile noexcept + { return __atomic_sub_fetch(&_M_p, _M_type_size(__d), + memory_order_seq_cst); } + + bool + is_lock_free() const noexcept + { + + return __atomic_is_lock_free(sizeof(_M_p), + reinterpret_cast(-__alignof(_M_p))); + } + + bool + is_lock_free() const volatile noexcept + { + + return __atomic_is_lock_free(sizeof(_M_p), + reinterpret_cast(-__alignof(_M_p))); + } + + inline __attribute__((__always_inline__)) void + store(__pointer_type __p, + memory_order __m = memory_order_seq_cst) noexcept + { + memory_order __b = __m & __memory_order_mask; + + ; + ; + ; + + __atomic_store_n(&_M_p, __p, __m); + } + + inline __attribute__((__always_inline__)) void + store(__pointer_type __p, + memory_order __m = memory_order_seq_cst) volatile noexcept + { + memory_order __b = __m & __memory_order_mask; + ; + ; + ; + + __atomic_store_n(&_M_p, __p, __m); + } + + inline __attribute__((__always_inline__)) __pointer_type + load(memory_order __m = memory_order_seq_cst) const noexcept + { + memory_order __b = __m & __memory_order_mask; + ; + ; + + return __atomic_load_n(&_M_p, __m); + } + + inline __attribute__((__always_inline__)) __pointer_type + load(memory_order __m = memory_order_seq_cst) const volatile noexcept + { + memory_order __b = __m & __memory_order_mask; + ; + ; + + return __atomic_load_n(&_M_p, __m); + } + + inline __attribute__((__always_inline__)) __pointer_type + exchange(__pointer_type __p, + memory_order __m = memory_order_seq_cst) noexcept + { + return __atomic_exchange_n(&_M_p, __p, __m); + } + + + inline __attribute__((__always_inline__)) __pointer_type + exchange(__pointer_type __p, + memory_order __m = memory_order_seq_cst) volatile noexcept + { + return __atomic_exchange_n(&_M_p, __p, __m); + } + + inline __attribute__((__always_inline__)) bool + compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, + memory_order __m2) noexcept + { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + ; + ; + ; + + return __atomic_compare_exchange_n(&_M_p, &__p1, __p2, 0, __m1, __m2); + } + + inline __attribute__((__always_inline__)) bool + compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, + memory_order __m2) volatile noexcept + { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + + ; + ; + ; + + return __atomic_compare_exchange_n(&_M_p, &__p1, __p2, 0, __m1, __m2); + } + + inline __attribute__((__always_inline__)) __pointer_type + fetch_add(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) noexcept + { return __atomic_fetch_add(&_M_p, _M_type_size(__d), __m); } + + inline __attribute__((__always_inline__)) __pointer_type + fetch_add(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return __atomic_fetch_add(&_M_p, _M_type_size(__d), __m); } + + inline __attribute__((__always_inline__)) __pointer_type + fetch_sub(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) noexcept + { return __atomic_fetch_sub(&_M_p, _M_type_size(__d), __m); } + + inline __attribute__((__always_inline__)) __pointer_type + fetch_sub(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return __atomic_fetch_sub(&_M_p, _M_type_size(__d), __m); } + }; + + + + +} +# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/atomic" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + + + template + struct atomic; + + + + template<> + struct atomic + { + private: + __atomic_base _M_base; + + public: + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(bool __i) noexcept : _M_base(__i) { } + + bool + operator=(bool __i) noexcept + { return _M_base.operator=(__i); } + + bool + operator=(bool __i) volatile noexcept + { return _M_base.operator=(__i); } + + operator bool() const noexcept + { return _M_base.load(); } + + operator bool() const volatile noexcept + { return _M_base.load(); } + + bool + is_lock_free() const noexcept { return _M_base.is_lock_free(); } + + bool + is_lock_free() const volatile noexcept { return _M_base.is_lock_free(); } + + void + store(bool __i, memory_order __m = memory_order_seq_cst) noexcept + { _M_base.store(__i, __m); } + + void + store(bool __i, memory_order __m = memory_order_seq_cst) volatile noexcept + { _M_base.store(__i, __m); } + + bool + load(memory_order __m = memory_order_seq_cst) const noexcept + { return _M_base.load(__m); } + + bool + load(memory_order __m = memory_order_seq_cst) const volatile noexcept + { return _M_base.load(__m); } + + bool + exchange(bool __i, memory_order __m = memory_order_seq_cst) noexcept + { return _M_base.exchange(__i, __m); } + + bool + exchange(bool __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return _M_base.exchange(__i, __m); } + + bool + compare_exchange_weak(bool& __i1, bool __i2, memory_order __m1, + memory_order __m2) noexcept + { return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); } + + bool + compare_exchange_weak(bool& __i1, bool __i2, memory_order __m1, + memory_order __m2) volatile noexcept + { return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); } + + bool + compare_exchange_weak(bool& __i1, bool __i2, + memory_order __m = memory_order_seq_cst) noexcept + { return _M_base.compare_exchange_weak(__i1, __i2, __m); } + + bool + compare_exchange_weak(bool& __i1, bool __i2, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return _M_base.compare_exchange_weak(__i1, __i2, __m); } + + bool + compare_exchange_strong(bool& __i1, bool __i2, memory_order __m1, + memory_order __m2) noexcept + { return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); } + + bool + compare_exchange_strong(bool& __i1, bool __i2, memory_order __m1, + memory_order __m2) volatile noexcept + { return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); } + + bool + compare_exchange_strong(bool& __i1, bool __i2, + memory_order __m = memory_order_seq_cst) noexcept + { return _M_base.compare_exchange_strong(__i1, __i2, __m); } + + bool + compare_exchange_strong(bool& __i1, bool __i2, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return _M_base.compare_exchange_strong(__i1, __i2, __m); } + }; + + + + + + + + template + struct atomic + { + private: + + static constexpr int _S_min_alignment + = (sizeof(_Tp) & (sizeof(_Tp) - 1)) || sizeof(_Tp) > 16 + ? 0 : sizeof(_Tp); + + static constexpr int _S_alignment + = _S_min_alignment > alignof(_Tp) ? _S_min_alignment : alignof(_Tp); + + alignas(_S_alignment) _Tp _M_i; + + static_assert(__is_trivially_copyable(_Tp), + "std::atomic requires a trivially copyable type"); + + static_assert(sizeof(_Tp) > 0, + "Incomplete or zero-sized types are not supported"); + + public: + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(_Tp __i) noexcept : _M_i(__i) { } + + operator _Tp() const noexcept + { return load(); } + + operator _Tp() const volatile noexcept + { return load(); } + + _Tp + operator=(_Tp __i) noexcept + { store(__i); return __i; } + + _Tp + operator=(_Tp __i) volatile noexcept + { store(__i); return __i; } + + bool + is_lock_free() const noexcept + { + + return __atomic_is_lock_free(sizeof(_M_i), + reinterpret_cast(-__alignof(_M_i))); + } + + bool + is_lock_free() const volatile noexcept + { + + return __atomic_is_lock_free(sizeof(_M_i), + reinterpret_cast(-__alignof(_M_i))); + } + + void + store(_Tp __i, memory_order __m = memory_order_seq_cst) noexcept + { __atomic_store(&_M_i, &__i, __m); } + + void + store(_Tp __i, memory_order __m = memory_order_seq_cst) volatile noexcept + { __atomic_store(&_M_i, &__i, __m); } + + _Tp + load(memory_order __m = memory_order_seq_cst) const noexcept + { + _Tp tmp; + __atomic_load(&_M_i, &tmp, __m); + return tmp; + } + + _Tp + load(memory_order __m = memory_order_seq_cst) const volatile noexcept + { + _Tp tmp; + __atomic_load(&_M_i, &tmp, __m); + return tmp; + } + + _Tp + exchange(_Tp __i, memory_order __m = memory_order_seq_cst) noexcept + { + _Tp tmp; + __atomic_exchange(&_M_i, &__i, &tmp, __m); + return tmp; + } + + _Tp + exchange(_Tp __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { + _Tp tmp; + __atomic_exchange(&_M_i, &__i, &tmp, __m); + return tmp; + } + + bool + compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) noexcept + { + return __atomic_compare_exchange(&_M_i, &__e, &__i, true, __s, __f); + } + + bool + compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) volatile noexcept + { + return __atomic_compare_exchange(&_M_i, &__e, &__i, true, __s, __f); + } + + bool + compare_exchange_weak(_Tp& __e, _Tp __i, + memory_order __m = memory_order_seq_cst) noexcept + { return compare_exchange_weak(__e, __i, __m, + __cmpexch_failure_order(__m)); } + + bool + compare_exchange_weak(_Tp& __e, _Tp __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return compare_exchange_weak(__e, __i, __m, + __cmpexch_failure_order(__m)); } + + bool + compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) noexcept + { + return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f); + } + + bool + compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) volatile noexcept + { + return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f); + } + + bool + compare_exchange_strong(_Tp& __e, _Tp __i, + memory_order __m = memory_order_seq_cst) noexcept + { return compare_exchange_strong(__e, __i, __m, + __cmpexch_failure_order(__m)); } + + bool + compare_exchange_strong(_Tp& __e, _Tp __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return compare_exchange_strong(__e, __i, __m, + __cmpexch_failure_order(__m)); } + }; + + + + template + struct atomic<_Tp*> + { + typedef _Tp* __pointer_type; + typedef __atomic_base<_Tp*> __base_type; + __base_type _M_b; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__pointer_type __p) noexcept : _M_b(__p) { } + + operator __pointer_type() const noexcept + { return __pointer_type(_M_b); } + + operator __pointer_type() const volatile noexcept + { return __pointer_type(_M_b); } + + __pointer_type + operator=(__pointer_type __p) noexcept + { return _M_b.operator=(__p); } + + __pointer_type + operator=(__pointer_type __p) volatile noexcept + { return _M_b.operator=(__p); } + + __pointer_type + operator++(int) noexcept + { return _M_b++; } + + __pointer_type + operator++(int) volatile noexcept + { return _M_b++; } + + __pointer_type + operator--(int) noexcept + { return _M_b--; } + + __pointer_type + operator--(int) volatile noexcept + { return _M_b--; } + + __pointer_type + operator++() noexcept + { return ++_M_b; } + + __pointer_type + operator++() volatile noexcept + { return ++_M_b; } + + __pointer_type + operator--() noexcept + { return --_M_b; } + + __pointer_type + operator--() volatile noexcept + { return --_M_b; } + + __pointer_type + operator+=(ptrdiff_t __d) noexcept + { return _M_b.operator+=(__d); } + + __pointer_type + operator+=(ptrdiff_t __d) volatile noexcept + { return _M_b.operator+=(__d); } + + __pointer_type + operator-=(ptrdiff_t __d) noexcept + { return _M_b.operator-=(__d); } + + __pointer_type + operator-=(ptrdiff_t __d) volatile noexcept + { return _M_b.operator-=(__d); } + + bool + is_lock_free() const noexcept + { return _M_b.is_lock_free(); } + + bool + is_lock_free() const volatile noexcept + { return _M_b.is_lock_free(); } + + void + store(__pointer_type __p, + memory_order __m = memory_order_seq_cst) noexcept + { return _M_b.store(__p, __m); } + + void + store(__pointer_type __p, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return _M_b.store(__p, __m); } + + __pointer_type + load(memory_order __m = memory_order_seq_cst) const noexcept + { return _M_b.load(__m); } + + __pointer_type + load(memory_order __m = memory_order_seq_cst) const volatile noexcept + { return _M_b.load(__m); } + + __pointer_type + exchange(__pointer_type __p, + memory_order __m = memory_order_seq_cst) noexcept + { return _M_b.exchange(__p, __m); } + + __pointer_type + exchange(__pointer_type __p, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return _M_b.exchange(__p, __m); } + + bool + compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, memory_order __m2) noexcept + { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); } + + bool + compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, + memory_order __m2) volatile noexcept + { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); } + + bool + compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, + memory_order __m = memory_order_seq_cst) noexcept + { + return compare_exchange_weak(__p1, __p2, __m, + __cmpexch_failure_order(__m)); + } + + bool + compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, + memory_order __m = memory_order_seq_cst) volatile noexcept + { + return compare_exchange_weak(__p1, __p2, __m, + __cmpexch_failure_order(__m)); + } + + bool + compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, memory_order __m2) noexcept + { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); } + + bool + compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, + memory_order __m2) volatile noexcept + { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); } + + bool + compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m = memory_order_seq_cst) noexcept + { + return _M_b.compare_exchange_strong(__p1, __p2, __m, + __cmpexch_failure_order(__m)); + } + + bool + compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m = memory_order_seq_cst) volatile noexcept + { + return _M_b.compare_exchange_strong(__p1, __p2, __m, + __cmpexch_failure_order(__m)); + } + + __pointer_type + fetch_add(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) noexcept + { return _M_b.fetch_add(__d, __m); } + + __pointer_type + fetch_add(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return _M_b.fetch_add(__d, __m); } + + __pointer_type + fetch_sub(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) noexcept + { return _M_b.fetch_sub(__d, __m); } + + __pointer_type + fetch_sub(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return _M_b.fetch_sub(__d, __m); } + }; + + + + template<> + struct atomic : __atomic_base + { + typedef char __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef signed char __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept= default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef unsigned char __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept= default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef short __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef unsigned short __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef int __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef unsigned int __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef long __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef unsigned long __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef long long __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef unsigned long long __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef wchar_t __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef char16_t __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + template<> + struct atomic : __atomic_base + { + typedef char32_t __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { } + + using __base_type::operator __integral_type; + using __base_type::operator=; + }; + + + + typedef atomic atomic_bool; + + + typedef atomic atomic_char; + + + typedef atomic atomic_schar; + + + typedef atomic atomic_uchar; + + + typedef atomic atomic_short; + + + typedef atomic atomic_ushort; + + + typedef atomic atomic_int; + + + typedef atomic atomic_uint; + + + typedef atomic atomic_long; + + + typedef atomic atomic_ulong; + + + typedef atomic atomic_llong; + + + typedef atomic atomic_ullong; + + + typedef atomic atomic_wchar_t; + + + typedef atomic atomic_char16_t; + + + typedef atomic atomic_char32_t; + + + + typedef atomic atomic_int_least8_t; + + + typedef atomic atomic_uint_least8_t; + + + typedef atomic atomic_int_least16_t; + + + typedef atomic atomic_uint_least16_t; + + + typedef atomic atomic_int_least32_t; + + + typedef atomic atomic_uint_least32_t; + + + typedef atomic atomic_int_least64_t; + + + typedef atomic atomic_uint_least64_t; + + + + typedef atomic atomic_int_fast8_t; + + + typedef atomic atomic_uint_fast8_t; + + + typedef atomic atomic_int_fast16_t; + + + typedef atomic atomic_uint_fast16_t; + + + typedef atomic atomic_int_fast32_t; + + + typedef atomic atomic_uint_fast32_t; + + + typedef atomic atomic_int_fast64_t; + + + typedef atomic atomic_uint_fast64_t; + + + + typedef atomic atomic_intptr_t; + + + typedef atomic atomic_uintptr_t; + + + typedef atomic atomic_size_t; + + + typedef atomic atomic_intmax_t; + + + typedef atomic atomic_uintmax_t; + + + typedef atomic atomic_ptrdiff_t; + + + + inline bool + atomic_flag_test_and_set_explicit(atomic_flag* __a, + memory_order __m) noexcept + { return __a->test_and_set(__m); } + + inline bool + atomic_flag_test_and_set_explicit(volatile atomic_flag* __a, + memory_order __m) noexcept + { return __a->test_and_set(__m); } + + inline void + atomic_flag_clear_explicit(atomic_flag* __a, memory_order __m) noexcept + { __a->clear(__m); } + + inline void + atomic_flag_clear_explicit(volatile atomic_flag* __a, + memory_order __m) noexcept + { __a->clear(__m); } + + inline bool + atomic_flag_test_and_set(atomic_flag* __a) noexcept + { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); } + + inline bool + atomic_flag_test_and_set(volatile atomic_flag* __a) noexcept + { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); } + + inline void + atomic_flag_clear(atomic_flag* __a) noexcept + { atomic_flag_clear_explicit(__a, memory_order_seq_cst); } + + inline void + atomic_flag_clear(volatile atomic_flag* __a) noexcept + { atomic_flag_clear_explicit(__a, memory_order_seq_cst); } + + + + template + inline bool + atomic_is_lock_free(const atomic<_ITp>* __a) noexcept + { return __a->is_lock_free(); } + + template + inline bool + atomic_is_lock_free(const volatile atomic<_ITp>* __a) noexcept + { return __a->is_lock_free(); } + + template + inline void + atomic_init(atomic<_ITp>* __a, _ITp __i) noexcept + { __a->store(__i, memory_order_relaxed); } + + template + inline void + atomic_init(volatile atomic<_ITp>* __a, _ITp __i) noexcept + { __a->store(__i, memory_order_relaxed); } + + template + inline void + atomic_store_explicit(atomic<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { __a->store(__i, __m); } + + template + inline void + atomic_store_explicit(volatile atomic<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { __a->store(__i, __m); } + + template + inline _ITp + atomic_load_explicit(const atomic<_ITp>* __a, memory_order __m) noexcept + { return __a->load(__m); } + + template + inline _ITp + atomic_load_explicit(const volatile atomic<_ITp>* __a, + memory_order __m) noexcept + { return __a->load(__m); } + + template + inline _ITp + atomic_exchange_explicit(atomic<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->exchange(__i, __m); } + + template + inline _ITp + atomic_exchange_explicit(volatile atomic<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->exchange(__i, __m); } + + template + inline bool + atomic_compare_exchange_weak_explicit(atomic<_ITp>* __a, + _ITp* __i1, _ITp __i2, + memory_order __m1, + memory_order __m2) noexcept + { return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); } + + template + inline bool + atomic_compare_exchange_weak_explicit(volatile atomic<_ITp>* __a, + _ITp* __i1, _ITp __i2, + memory_order __m1, + memory_order __m2) noexcept + { return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); } + + template + inline bool + atomic_compare_exchange_strong_explicit(atomic<_ITp>* __a, + _ITp* __i1, _ITp __i2, + memory_order __m1, + memory_order __m2) noexcept + { return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); } + + template + inline bool + atomic_compare_exchange_strong_explicit(volatile atomic<_ITp>* __a, + _ITp* __i1, _ITp __i2, + memory_order __m1, + memory_order __m2) noexcept + { return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); } + + + template + inline void + atomic_store(atomic<_ITp>* __a, _ITp __i) noexcept + { atomic_store_explicit(__a, __i, memory_order_seq_cst); } + + template + inline void + atomic_store(volatile atomic<_ITp>* __a, _ITp __i) noexcept + { atomic_store_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_load(const atomic<_ITp>* __a) noexcept + { return atomic_load_explicit(__a, memory_order_seq_cst); } + + template + inline _ITp + atomic_load(const volatile atomic<_ITp>* __a) noexcept + { return atomic_load_explicit(__a, memory_order_seq_cst); } + + template + inline _ITp + atomic_exchange(atomic<_ITp>* __a, _ITp __i) noexcept + { return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_exchange(volatile atomic<_ITp>* __a, _ITp __i) noexcept + { return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); } + + template + inline bool + atomic_compare_exchange_weak(atomic<_ITp>* __a, + _ITp* __i1, _ITp __i2) noexcept + { + return atomic_compare_exchange_weak_explicit(__a, __i1, __i2, + memory_order_seq_cst, + memory_order_seq_cst); + } + + template + inline bool + atomic_compare_exchange_weak(volatile atomic<_ITp>* __a, + _ITp* __i1, _ITp __i2) noexcept + { + return atomic_compare_exchange_weak_explicit(__a, __i1, __i2, + memory_order_seq_cst, + memory_order_seq_cst); + } + + template + inline bool + atomic_compare_exchange_strong(atomic<_ITp>* __a, + _ITp* __i1, _ITp __i2) noexcept + { + return atomic_compare_exchange_strong_explicit(__a, __i1, __i2, + memory_order_seq_cst, + memory_order_seq_cst); + } + + template + inline bool + atomic_compare_exchange_strong(volatile atomic<_ITp>* __a, + _ITp* __i1, _ITp __i2) noexcept + { + return atomic_compare_exchange_strong_explicit(__a, __i1, __i2, + memory_order_seq_cst, + memory_order_seq_cst); + } + + + + + + template + inline _ITp + atomic_fetch_add_explicit(__atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->fetch_add(__i, __m); } + + template + inline _ITp + atomic_fetch_add_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->fetch_add(__i, __m); } + + template + inline _ITp + atomic_fetch_sub_explicit(__atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->fetch_sub(__i, __m); } + + template + inline _ITp + atomic_fetch_sub_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->fetch_sub(__i, __m); } + + template + inline _ITp + atomic_fetch_and_explicit(__atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->fetch_and(__i, __m); } + + template + inline _ITp + atomic_fetch_and_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->fetch_and(__i, __m); } + + template + inline _ITp + atomic_fetch_or_explicit(__atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->fetch_or(__i, __m); } + + template + inline _ITp + atomic_fetch_or_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->fetch_or(__i, __m); } + + template + inline _ITp + atomic_fetch_xor_explicit(__atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->fetch_xor(__i, __m); } + + template + inline _ITp + atomic_fetch_xor_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept + { return __a->fetch_xor(__i, __m); } + + template + inline _ITp + atomic_fetch_add(__atomic_base<_ITp>* __a, _ITp __i) noexcept + { return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_fetch_add(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept + { return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_fetch_sub(__atomic_base<_ITp>* __a, _ITp __i) noexcept + { return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_fetch_sub(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept + { return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_fetch_and(__atomic_base<_ITp>* __a, _ITp __i) noexcept + { return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_fetch_and(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept + { return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_fetch_or(__atomic_base<_ITp>* __a, _ITp __i) noexcept + { return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_fetch_or(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept + { return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_fetch_xor(__atomic_base<_ITp>* __a, _ITp __i) noexcept + { return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); } + + template + inline _ITp + atomic_fetch_xor(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept + { return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); } + + + + template + inline _ITp* + atomic_fetch_add_explicit(atomic<_ITp*>* __a, ptrdiff_t __d, + memory_order __m) noexcept + { return __a->fetch_add(__d, __m); } + + template + inline _ITp* + atomic_fetch_add_explicit(volatile atomic<_ITp*>* __a, ptrdiff_t __d, + memory_order __m) noexcept + { return __a->fetch_add(__d, __m); } + + template + inline _ITp* + atomic_fetch_add(volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept + { return __a->fetch_add(__d); } + + template + inline _ITp* + atomic_fetch_add(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept + { return __a->fetch_add(__d); } + + template + inline _ITp* + atomic_fetch_sub_explicit(volatile atomic<_ITp*>* __a, + ptrdiff_t __d, memory_order __m) noexcept + { return __a->fetch_sub(__d, __m); } + + template + inline _ITp* + atomic_fetch_sub_explicit(atomic<_ITp*>* __a, ptrdiff_t __d, + memory_order __m) noexcept + { return __a->fetch_sub(__d, __m); } + + template + inline _ITp* + atomic_fetch_sub(volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept + { return __a->fetch_sub(__d); } + + template + inline _ITp* + atomic_fetch_sub(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept + { return __a->fetch_sub(__d); } + + + +} +# 171 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" 2 + +namespace mozilla { +namespace detail { + + + + + +template struct AtomicOrderConstraints; + +template<> +struct AtomicOrderConstraints +{ + static const std::memory_order AtomicRMWOrder = std::memory_order_relaxed; + static const std::memory_order LoadOrder = std::memory_order_relaxed; + static const std::memory_order StoreOrder = std::memory_order_relaxed; + static const std::memory_order CompareExchangeFailureOrder = + std::memory_order_relaxed; +}; + +template<> +struct AtomicOrderConstraints +{ + static const std::memory_order AtomicRMWOrder = std::memory_order_acq_rel; + static const std::memory_order LoadOrder = std::memory_order_acquire; + static const std::memory_order StoreOrder = std::memory_order_release; + static const std::memory_order CompareExchangeFailureOrder = + std::memory_order_acquire; +}; + +template<> +struct AtomicOrderConstraints +{ + static const std::memory_order AtomicRMWOrder = std::memory_order_seq_cst; + static const std::memory_order LoadOrder = std::memory_order_seq_cst; + static const std::memory_order StoreOrder = std::memory_order_seq_cst; + static const std::memory_order CompareExchangeFailureOrder = + std::memory_order_seq_cst; +}; + +template +struct IntrinsicBase +{ + typedef std::atomic ValueType; + typedef AtomicOrderConstraints OrderedOp; +}; + +template +struct IntrinsicMemoryOps : public IntrinsicBase +{ + typedef IntrinsicBase Base; + + static T load(const typename Base::ValueType& aPtr) + { + return aPtr.load(Base::OrderedOp::LoadOrder); + } + + static void store(typename Base::ValueType& aPtr, T aVal) + { + aPtr.store(aVal, Base::OrderedOp::StoreOrder); + } + + static T exchange(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.exchange(aVal, Base::OrderedOp::AtomicRMWOrder); + } + + static bool compareExchange(typename Base::ValueType& aPtr, + T aOldVal, T aNewVal) + { + return aPtr.compare_exchange_strong(aOldVal, aNewVal, + Base::OrderedOp::AtomicRMWOrder, + Base::OrderedOp::CompareExchangeFailureOrder); + } +}; + +template +struct IntrinsicAddSub : public IntrinsicBase +{ + typedef IntrinsicBase Base; + + static T add(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.fetch_add(aVal, Base::OrderedOp::AtomicRMWOrder); + } + + static T sub(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.fetch_sub(aVal, Base::OrderedOp::AtomicRMWOrder); + } +}; + +template +struct IntrinsicAddSub : public IntrinsicBase +{ + typedef IntrinsicBase Base; + + static T* add(typename Base::ValueType& aPtr, ptrdiff_t aVal) + { + return aPtr.fetch_add(aVal, Base::OrderedOp::AtomicRMWOrder); + } + + static T* sub(typename Base::ValueType& aPtr, ptrdiff_t aVal) + { + return aPtr.fetch_sub(aVal, Base::OrderedOp::AtomicRMWOrder); + } +}; + +template +struct IntrinsicIncDec : public IntrinsicAddSub +{ + typedef IntrinsicBase Base; + + static T inc(typename Base::ValueType& aPtr) + { + return IntrinsicAddSub::add(aPtr, 1); + } + + static T dec(typename Base::ValueType& aPtr) + { + return IntrinsicAddSub::sub(aPtr, 1); + } +}; + +template +struct AtomicIntrinsics : public IntrinsicMemoryOps, + public IntrinsicIncDec +{ + typedef IntrinsicBase Base; + + static T or_(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.fetch_or(aVal, Base::OrderedOp::AtomicRMWOrder); + } + + static T xor_(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.fetch_xor(aVal, Base::OrderedOp::AtomicRMWOrder); + } + + static T and_(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.fetch_and(aVal, Base::OrderedOp::AtomicRMWOrder); + } +}; + +template +struct AtomicIntrinsics + : public IntrinsicMemoryOps, public IntrinsicIncDec +{ +}; + +template +struct ToStorageTypeArgument +{ + static constexpr T convert (T aT) { return aT; } +}; + +} +} +# 533 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" +namespace mozilla { + +namespace detail { + +template +class AtomicBase +{ + static_assert(sizeof(T) == 4 || sizeof(T) == 8, + "mozilla/Atomics.h only supports 32-bit and 64-bit types"); + +protected: + typedef typename detail::AtomicIntrinsics Intrinsics; + typedef typename Intrinsics::ValueType ValueType; + ValueType mValue; + +public: + constexpr AtomicBase() : mValue() {} + explicit constexpr AtomicBase(T aInit) + : mValue(ToStorageTypeArgument::convert(aInit)) + {} + + + + + + + T operator=(T aVal) + { + Intrinsics::store(mValue, aVal); + return aVal; + } + + + + + + T exchange(T aVal) + { + return Intrinsics::exchange(mValue, aVal); + } +# 585 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" + bool compareExchange(T aOldValue, T aNewValue) + { + return Intrinsics::compareExchange(mValue, aOldValue, aNewValue); + } + +private: + template + AtomicBase(const AtomicBase& aCopy) = delete; +}; + +template +class AtomicBaseIncDec : public AtomicBase +{ + typedef typename detail::AtomicBase Base; + +public: + constexpr AtomicBaseIncDec() : Base() {} + explicit constexpr AtomicBaseIncDec(T aInit) : Base(aInit) {} + + using Base::operator=; + + operator T() const { return Base::Intrinsics::load(Base::mValue); } + T operator++(int) { return Base::Intrinsics::inc(Base::mValue); } + T operator--(int) { return Base::Intrinsics::dec(Base::mValue); } + T operator++() { return Base::Intrinsics::inc(Base::mValue) + 1; } + T operator--() { return Base::Intrinsics::dec(Base::mValue) - 1; } + +private: + template + AtomicBaseIncDec(const AtomicBaseIncDec& aCopy) = delete; +}; + +} +# 636 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" +template +class Atomic; +# 649 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" +template +class Atomic::value && + !IsSame::value>::Type> + : public detail::AtomicBaseIncDec +{ + typedef typename detail::AtomicBaseIncDec Base; + +public: + constexpr Atomic() : Base() {} + explicit constexpr Atomic(T aInit) : Base(aInit) {} + + using Base::operator=; + + T operator+=(T aDelta) + { + return Base::Intrinsics::add(Base::mValue, aDelta) + aDelta; + } + + T operator-=(T aDelta) + { + return Base::Intrinsics::sub(Base::mValue, aDelta) - aDelta; + } + + T operator|=(T aVal) + { + return Base::Intrinsics::or_(Base::mValue, aVal) | aVal; + } + + T operator^=(T aVal) + { + return Base::Intrinsics::xor_(Base::mValue, aVal) ^ aVal; + } + + T operator&=(T aVal) + { + return Base::Intrinsics::and_(Base::mValue, aVal) & aVal; + } + +private: + Atomic(Atomic& aOther) = delete; +}; +# 699 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" +template +class Atomic : public detail::AtomicBaseIncDec +{ + typedef typename detail::AtomicBaseIncDec Base; + +public: + constexpr Atomic() : Base() {} + explicit constexpr Atomic(T* aInit) : Base(aInit) {} + + using Base::operator=; + + T* operator+=(ptrdiff_t aDelta) + { + return Base::Intrinsics::add(Base::mValue, aDelta) + aDelta; + } + + T* operator-=(ptrdiff_t aDelta) + { + return Base::Intrinsics::sub(Base::mValue, aDelta) - aDelta; + } + +private: + Atomic(Atomic& aOther) = delete; +}; + + + + + + +template +class Atomic::value>::Type> + : public detail::AtomicBase +{ + typedef typename detail::AtomicBase Base; + +public: + constexpr Atomic() : Base() {} + explicit constexpr Atomic(T aInit) : Base(aInit) {} + + operator T() const { return T(Base::Intrinsics::load(Base::mValue)); } + + using Base::operator=; + +private: + Atomic(Atomic& aOther) = delete; +}; +# 763 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" +template +class Atomic + : protected detail::AtomicBase +{ + typedef typename detail::AtomicBase Base; + +public: + constexpr Atomic() : Base() {} + explicit constexpr Atomic(bool aInit) : Base(aInit) {} + + + operator bool() const + { + return Base::Intrinsics::load(Base::mValue); + } + + bool operator=(bool aVal) + { + return Base::operator=(aVal); + } + + bool exchange(bool aVal) + { + return Base::exchange(aVal); + } + + bool compareExchange(bool aOldValue, bool aNewValue) + { + return Base::compareExchange(aOldValue, aNewValue); + } + +private: + Atomic(Atomic& aOther) = delete; +}; + +} +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" 2 + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h" 1 +# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/GuardObjects.h" 1 +# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h" 2 + + +namespace mozilla { +# 67 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h" +template +class Scoped +{ +public: + typedef typename Traits::type Resource; + + explicit Scoped() + : mValue(Traits::empty()) + { + do { } while (0); + } + + explicit Scoped(const Resource& aValue + ) + : mValue(aValue) + { + do { } while (0); + } + + + Scoped(Scoped&& aOther + ) + : mValue(Move(aOther.mValue)) + { + do { } while (0); + aOther.mValue = Traits::empty(); + } + + ~Scoped() { Traits::release(mValue); } + + + operator const Resource&() const { return mValue; } + const Resource& operator->() const { return mValue; } + const Resource& get() const { return mValue; } + + Resource& rwget() { return mValue; } +# 113 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h" + Resource forget() + { + Resource tmp = mValue; + mValue = Traits::empty(); + return tmp; + } + + + + + + + void dispose() + { + Traits::release(mValue); + mValue = Traits::empty(); + } + + bool operator==(const Resource& aOther) const { return mValue == aOther; } +# 141 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h" + Scoped& operator=(const Resource& aOther) { return reset(aOther); } + + Scoped& reset(const Resource& aOther) + { + Traits::release(mValue); + mValue = aOther; + return *this; + } + + + Scoped& operator=(Scoped&& aRhs) + { + do { } while (0); + this->~Scoped(); + new(this) Scoped(Move(aRhs)); + return *this; + } + +private: + explicit Scoped(const Scoped& aValue) = delete; + Scoped& operator=(const Scoped& aValue) = delete; + +private: + Resource mValue; + +}; +# 236 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h" +template void TypeSpecificDelete(T* aValue); + +template +struct TypeSpecificScopedPointerTraits +{ + typedef T* type; + static type empty() { return nullptr; } + static void release(type aValue) + { + if (aValue) { + TypeSpecificDelete(aValue); + } + } +}; + +template struct TypeSpecificScopedPointer : public mozilla::Scoped > { typedef mozilla::Scoped > Super; typedef typename Super::Resource Resource; TypeSpecificScopedPointer& operator=(Resource aRhs) { Super::operator=(aRhs); return *this; } TypeSpecificScopedPointer& operator=(TypeSpecificScopedPointer&& aRhs) { Super::operator=(Move(aRhs)); return *this; } explicit TypeSpecificScopedPointer() : Super() {} explicit TypeSpecificScopedPointer(Resource aRhs ) : Super(aRhs ) {} TypeSpecificScopedPointer(TypeSpecificScopedPointer&& aRhs ) : Super(Move(aRhs) ) {} private: explicit TypeSpecificScopedPointer(TypeSpecificScopedPointer&) = delete; TypeSpecificScopedPointer& operator=(TypeSpecificScopedPointer&) = delete; }; + +} +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" 2 + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" 2 +# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" +namespace JS {} + + +namespace mozilla {} + + +namespace js {} + + + + +extern __attribute__((noreturn)) __attribute__ ((cold)) void +JS_Assert(const char* s, const char* file, int ln); +# 51 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" +namespace js { +namespace oom { + + + + + + + +enum ThreadType { + THREAD_TYPE_NONE = 0, + THREAD_TYPE_COOPERATING, + THREAD_TYPE_WASM, + THREAD_TYPE_ION, + THREAD_TYPE_PARSE, + THREAD_TYPE_COMPRESS, + THREAD_TYPE_GCHELPER, + THREAD_TYPE_GCPARALLEL, + THREAD_TYPE_PROMISE_TASK, + THREAD_TYPE_MAX +}; +# 82 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" +inline bool InitThreadType(void) { return true; } +inline void SetThreadType(ThreadType t) {}; +inline uint32_t GetThreadType(void) { return 0; } + + +} +} +# 169 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" +namespace js { +namespace oom { +static inline bool IsSimulatedOOMAllocation() { return false; } +static inline bool ShouldFailWithOOM() { return false; } +} +} + + + +namespace js { + + +struct AutoEnterOOMUnsafeRegion +{ + __attribute__((noreturn)) __attribute__ ((cold)) void crash(const char* reason); + __attribute__((noreturn)) __attribute__ ((cold)) void crash(size_t size, const char* reason); + + using AnnotateOOMAllocationSizeCallback = void(*)(size_t); + static AnnotateOOMAllocationSizeCallback annotateOOMSizeCallback; + static void setAnnotateOOMAllocationSizeCallback(AnnotateOOMAllocationSizeCallback callback) { + annotateOOMSizeCallback = callback; + } +# 222 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" +}; + +} + +static inline void* js_malloc(size_t bytes) +{ + do {} while(0); + return malloc(bytes); +} + +static inline void* js_calloc(size_t bytes) +{ + do {} while(0); + return calloc(bytes, 1); +} + +static inline void* js_calloc(size_t nmemb, size_t size) +{ + do {} while(0); + return calloc(nmemb, size); +} + +static inline void* js_realloc(void* p, size_t bytes) +{ + + + + do { } while (0); + + do {} while(0); + return realloc(p, bytes); +} + +static inline void js_free(void* p) +{ + free(p); +} + +static inline char* js_strdup(const char* s) +{ + do {} while(0); + return strdup(s); +} +# 346 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" +template static __attribute__((always_inline)) inline T * js_new(Args&&... args) { void* memory = js_malloc(sizeof(T)); return (__builtin_expect(!!(memory), 1)) ? new(memory) T(mozilla::Forward(args)...) : nullptr; } + +namespace js { + + + + + +template +__attribute__ ((warn_unused_result)) inline bool +CalculateAllocSize(size_t numElems, size_t* bytesOut) +{ + *bytesOut = numElems * sizeof(T); + return (numElems & mozilla::tl::MulOverflowMask::value) == 0; +} + + + + + + +template +__attribute__ ((warn_unused_result)) inline bool +CalculateAllocSizeWithExtra(size_t numExtra, size_t* bytesOut) +{ + *bytesOut = sizeof(T) + numExtra * sizeof(Extra); + return (numExtra & mozilla::tl::MulOverflowMask::value) == 0 && + *bytesOut >= sizeof(T); +} + +} + +template +static __attribute__((always_inline)) inline void +js_delete(const T* p) +{ + if (p) { + p->~T(); + js_free(const_cast(p)); + } +} + +template +static __attribute__((always_inline)) inline void +js_delete_poison(const T* p) +{ + if (p) { + p->~T(); + memset(const_cast(p), 0x3B, sizeof(T)); + js_free(const_cast(p)); + } +} + +template +static __attribute__((always_inline)) inline T* +js_pod_malloc() +{ + return static_cast(js_malloc(sizeof(T))); +} + +template +static __attribute__((always_inline)) inline T* +js_pod_calloc() +{ + return static_cast(js_calloc(sizeof(T))); +} + +template +static __attribute__((always_inline)) inline T* +js_pod_malloc(size_t numElems) +{ + size_t bytes; + if ((__builtin_expect(!!(!js::CalculateAllocSize(numElems, &bytes)), 0))) + return nullptr; + return static_cast(js_malloc(bytes)); +} + +template +static __attribute__((always_inline)) inline T* +js_pod_calloc(size_t numElems) +{ + size_t bytes; + if ((__builtin_expect(!!(!js::CalculateAllocSize(numElems, &bytes)), 0))) + return nullptr; + return static_cast(js_calloc(bytes)); +} + +template +static __attribute__((always_inline)) inline T* +js_pod_realloc(T* prior, size_t oldSize, size_t newSize) +{ + do { } while (0); + size_t bytes; + if ((__builtin_expect(!!(!js::CalculateAllocSize(newSize, &bytes)), 0))) + return nullptr; + return static_cast(js_realloc(prior, bytes)); +} + +namespace js { + +template +struct ScopedFreePtrTraits +{ + typedef T* type; + static T* empty() { return nullptr; } + static void release(T* ptr) { js_free(ptr); } +}; +template struct ScopedJSFreePtr : public mozilla::Scoped > { typedef mozilla::Scoped > Super; typedef typename Super::Resource Resource; ScopedJSFreePtr& operator=(Resource aRhs) { Super::operator=(aRhs); return *this; } ScopedJSFreePtr& operator=(ScopedJSFreePtr&& aRhs) { Super::operator=(Move(aRhs)); return *this; } explicit ScopedJSFreePtr() : Super() {} explicit ScopedJSFreePtr(Resource aRhs ) : Super(aRhs ) {} ScopedJSFreePtr(ScopedJSFreePtr&& aRhs ) : Super(Move(aRhs) ) {} private: explicit ScopedJSFreePtr(ScopedJSFreePtr&) = delete; ScopedJSFreePtr& operator=(ScopedJSFreePtr&) = delete; }; + +template +struct ScopedDeletePtrTraits : public ScopedFreePtrTraits +{ + static void release(T* ptr) { js_delete(ptr); } +}; +template struct ScopedJSDeletePtr : public mozilla::Scoped > { typedef mozilla::Scoped > Super; typedef typename Super::Resource Resource; ScopedJSDeletePtr& operator=(Resource aRhs) { Super::operator=(aRhs); return *this; } ScopedJSDeletePtr& operator=(ScopedJSDeletePtr&& aRhs) { Super::operator=(Move(aRhs)); return *this; } explicit ScopedJSDeletePtr() : Super() {} explicit ScopedJSDeletePtr(Resource aRhs ) : Super(aRhs ) {} ScopedJSDeletePtr(ScopedJSDeletePtr&& aRhs ) : Super(Move(aRhs) ) {} private: explicit ScopedJSDeletePtr(ScopedJSDeletePtr&) = delete; ScopedJSDeletePtr& operator=(ScopedJSDeletePtr&) = delete; }; + +template +struct ScopedReleasePtrTraits : public ScopedFreePtrTraits +{ + static void release(T* ptr) { if (ptr) ptr->release(); } +}; +template struct ScopedReleasePtr : public mozilla::Scoped > { typedef mozilla::Scoped > Super; typedef typename Super::Resource Resource; ScopedReleasePtr& operator=(Resource aRhs) { Super::operator=(aRhs); return *this; } ScopedReleasePtr& operator=(ScopedReleasePtr&& aRhs) { Super::operator=(Move(aRhs)); return *this; } explicit ScopedReleasePtr() : Super() {} explicit ScopedReleasePtr(Resource aRhs ) : Super(aRhs ) {} ScopedReleasePtr(ScopedReleasePtr&& aRhs ) : Super(Move(aRhs) ) {} private: explicit ScopedReleasePtr(ScopedReleasePtr&) = delete; ScopedReleasePtr& operator=(ScopedReleasePtr&) = delete; }; + +} + +namespace JS { + +template +struct DeletePolicy +{ + constexpr DeletePolicy() {} + + template + DeletePolicy(DeletePolicy other, + typename mozilla::EnableIf::value, + int>::Type dummy = 0) + {} + + void operator()(const T* ptr) { + js_delete(const_cast(ptr)); + } +}; + +struct FreePolicy +{ + void operator()(const void* ptr) { + js_free(const_cast(ptr)); + } +}; + +typedef mozilla::UniquePtr UniqueChars; +typedef mozilla::UniquePtr UniqueTwoByteChars; + +} + +namespace js { + + +typedef uint32_t HashNumber; +const unsigned HashNumberSizeBits = 32; + +namespace detail { +# 524 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" +inline HashNumber +ScrambleHashCode(HashNumber h) +{ +# 542 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" + static const HashNumber goldenRatio = 0x9E3779B9U; + return h * goldenRatio; +} + +} + +} +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HeapAPI.h" 2 + + +namespace js { + +bool +CurrentThreadCanAccessZone(JS::Zone* zone); + +namespace gc { + +struct Cell; + +const size_t ArenaShift = 12; +const size_t ArenaSize = size_t(1) << ArenaShift; +const size_t ArenaMask = ArenaSize - 1; + + + + +const size_t ChunkShift = 20; + +const size_t ChunkSize = size_t(1) << ChunkShift; +const size_t ChunkMask = ChunkSize - 1; + +const size_t CellShift = 3; +const size_t CellSize = size_t(1) << CellShift; +const size_t CellMask = CellSize - 1; + + + + + + +const size_t ChunkMarkBitmapOffset = 1032352; +const size_t ChunkMarkBitmapBits = 129024; + +const size_t ChunkRuntimeOffset = ChunkSize - sizeof(void*); +const size_t ChunkTrailerSize = 2 * sizeof(uintptr_t) + sizeof(uint64_t); +const size_t ChunkLocationOffset = ChunkSize - ChunkTrailerSize; +const size_t ArenaZoneOffset = sizeof(size_t); +const size_t ArenaHeaderSize = sizeof(size_t) + 2 * sizeof(uintptr_t) + + sizeof(size_t) + sizeof(uintptr_t); + + + + + + +static const uint32_t BLACK = 0; +static const uint32_t GRAY = 1; + + + + + +enum class ChunkLocation : uint32_t +{ + Invalid = 0, + Nursery = 1, + TenuredHeap = 2 +}; + + + +extern void +AssertGCThingHasType(js::gc::Cell* cell, JS::TraceKind kind); + + + + + +__attribute__((always_inline)) inline bool IsInsideNursery(const js::gc::Cell* cell); + +} +} + +namespace JS { +struct Zone; + + +const uint32_t DefaultNurseryBytes = 16 * js::gc::ChunkSize; + + +const uint32_t DefaultHeapMaxBytes = 32 * 1024 * 1024; + +namespace shadow { + +struct Zone +{ + protected: + JSRuntime* const runtime_; + JSTracer* const barrierTracer_; + + public: + bool needsIncrementalBarrier_; + + Zone(JSRuntime* runtime, JSTracer* barrierTracerArg) + : runtime_(runtime), + barrierTracer_(barrierTracerArg), + needsIncrementalBarrier_(false) + {} + + bool needsIncrementalBarrier() const { + return needsIncrementalBarrier_; + } + + JSTracer* barrierTracer() { + do { } while (0); + do { } while (0); + return barrierTracer_; + } + + JSRuntime* runtimeFromActiveCooperatingThread() const { + do { } while (0); + return runtime_; + } + + + + JSRuntime* runtimeFromAnyThread() const { + return runtime_; + } + + static __attribute__((always_inline)) inline JS::shadow::Zone* asShadowZone(JS::Zone* zone) { + return reinterpret_cast(zone); + } +}; + +} +# 152 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HeapAPI.h" +class GCCellPtr +{ + public: + + GCCellPtr(void* gcthing, JS::TraceKind traceKind) : ptr(checkedCast(gcthing, traceKind)) {} + + + GCCellPtr(decltype(nullptr)) : ptr(checkedCast(nullptr, JS::TraceKind::Null)) {} + + + template + explicit GCCellPtr(T* p) : ptr(checkedCast(p, JS::MapTypeToTraceKind::kind)) { } + explicit GCCellPtr(JSFunction* p) : ptr(checkedCast(p, JS::TraceKind::Object)) { } + explicit GCCellPtr(JSFlatString* str) : ptr(checkedCast(str, JS::TraceKind::String)) { } + explicit GCCellPtr(const Value& v); + + JS::TraceKind kind() const { + JS::TraceKind traceKind = JS::TraceKind(ptr & OutOfLineTraceKindMask); + if (uintptr_t(traceKind) != OutOfLineTraceKindMask) + return traceKind; + return outOfLineKind(); + } + + + explicit operator bool() const { + do { } while (0); + return asCell(); + } + + + template + bool is() const { return kind() == JS::MapTypeToTraceKind::kind; } + + + + template + T& as() const { + do { } while (0); + + + return *reinterpret_cast(asCell()); + } + + + + + js::gc::Cell* asCell() const { + return reinterpret_cast(ptr & ~OutOfLineTraceKindMask); + } + + + uint64_t unsafeAsInteger() const { + return static_cast(unsafeAsUIntPtr()); + } + + uintptr_t unsafeAsUIntPtr() const { + do { } while (0); + do { } while (0); + return reinterpret_cast(asCell()); + } + + bool mayBeOwnedByOtherRuntime() const; + + private: + static uintptr_t checkedCast(void* p, JS::TraceKind traceKind) { + js::gc::Cell* cell = static_cast(p); + do { } while (0); + AssertGCThingHasType(cell, traceKind); + + + do { } while (0); + + return uintptr_t(p) | (uintptr_t(traceKind) & OutOfLineTraceKindMask); + } + + JS::TraceKind outOfLineKind() const; + + uintptr_t ptr; +}; + +inline bool +operator==(const GCCellPtr& ptr1, const GCCellPtr& ptr2) +{ + return ptr1.asCell() == ptr2.asCell(); +} + +inline bool +operator!=(const GCCellPtr& ptr1, const GCCellPtr& ptr2) +{ + return !(ptr1 == ptr2); +} + + + +template +auto +DispatchTyped(F f, GCCellPtr thing, Args&&... args) + -> decltype(f(static_cast(nullptr), mozilla::Forward(args)...)) +{ + switch (thing.kind()) { + + + + case JS::TraceKind::BaseShape: return f(&thing.as(), mozilla::Forward(args)...); case JS::TraceKind::JitCode: return f(&thing.as(), mozilla::Forward(args)...); case JS::TraceKind::LazyScript: return f(&thing.as(), mozilla::Forward(args)...); case JS::TraceKind::Scope: return f(&thing.as(), mozilla::Forward(args)...); case JS::TraceKind::Object: return f(&thing.as(), mozilla::Forward(args)...); case JS::TraceKind::ObjectGroup: return f(&thing.as(), mozilla::Forward(args)...); case JS::TraceKind::Script: return f(&thing.as(), mozilla::Forward(args)...); case JS::TraceKind::Shape: return f(&thing.as(), mozilla::Forward(args)...); case JS::TraceKind::String: return f(&thing.as(), mozilla::Forward(args)...); case JS::TraceKind::Symbol: return f(&thing.as(), mozilla::Forward(args)...); case JS::TraceKind::RegExpShared: return f(&thing.as(), mozilla::Forward(args)...);; + + default: + do { AnnotateMozCrashReason("MOZ_CRASH(" "Invalid trace kind in DispatchTyped for GCCellPtr." ")"); do { *((volatile int*) __null) = 258; ::abort(); } while (0); } while (0); + } +} + +} + +namespace js { +namespace gc { +namespace detail { + +static __attribute__((always_inline)) inline uintptr_t* +GetGCThingMarkBitmap(const uintptr_t addr) +{ + do { } while (0); + const uintptr_t bmap_addr = (addr & ~ChunkMask) | ChunkMarkBitmapOffset; + return reinterpret_cast(bmap_addr); +} + +static __attribute__((always_inline)) inline void +GetGCThingMarkWordAndMask(const uintptr_t addr, uint32_t color, + uintptr_t** wordp, uintptr_t* maskp) +{ + do { } while (0); + const size_t bit = (addr & js::gc::ChunkMask) / js::gc::CellSize + color; + do { } while (0); + uintptr_t* bitmap = GetGCThingMarkBitmap(addr); + const uintptr_t nbits = sizeof(*bitmap) * 8; + *maskp = uintptr_t(1) << (bit % nbits); + *wordp = &bitmap[bit / nbits]; +} + +static __attribute__((always_inline)) inline JS::Zone* +GetGCThingZone(const uintptr_t addr) +{ + do { } while (0); + const uintptr_t zone_addr = (addr & ~ArenaMask) | ArenaZoneOffset; + return *reinterpret_cast(zone_addr); + +} + +static __attribute__((always_inline)) inline bool +CellIsMarkedGray(const Cell* cell) +{ + do { } while (0); + if (js::gc::IsInsideNursery(cell)) + return false; + + uintptr_t* word, mask; + js::gc::detail::GetGCThingMarkWordAndMask(uintptr_t(cell), js::gc::GRAY, &word, &mask); + return *word & mask; +} + +extern bool +CellIsMarkedGrayIfKnown(const Cell* cell); + + + + + + +} + +__attribute__((always_inline)) inline bool +IsInsideNursery(const js::gc::Cell* cell) +{ + if (!cell) + return false; + uintptr_t addr = uintptr_t(cell); + addr &= ~js::gc::ChunkMask; + addr |= js::gc::ChunkLocationOffset; + auto location = *reinterpret_cast(addr); + do { } while (0); + return location == ChunkLocation::Nursery; +} + +} +} + +namespace JS { + +static __attribute__((always_inline)) inline Zone* +GetTenuredGCThingZone(GCCellPtr thing) +{ + do { } while (0); + return js::gc::detail::GetGCThingZone(thing.unsafeAsUIntPtr()); +} + +static __attribute__((always_inline)) inline Zone* +GetStringZone(JSString* str) +{ + return js::gc::detail::GetGCThingZone(uintptr_t(str)); +} + +extern Zone* +GetObjectZone(JSObject* obj); + +static __attribute__((always_inline)) inline bool +GCThingIsMarkedGray(GCCellPtr thing) +{ + if (thing.mayBeOwnedByOtherRuntime()) + return false; + return js::gc::detail::CellIsMarkedGrayIfKnown(thing.asCell()); +} + +extern JS::TraceKind +GCThingTraceKind(void* thing); + +} + +namespace js { +namespace gc { + +static __attribute__((always_inline)) inline bool +IsIncrementalBarrierNeededOnTenuredGCThing(const JS::GCCellPtr thing) +{ + do { } while (0); + do { } while (0); + + + + + do { } while (0); + + JS::Zone* zone = JS::GetTenuredGCThingZone(thing); + return JS::shadow::Zone::asShadowZone(zone)->needsIncrementalBarrier(); +} + + + + + + +extern JSObject* +NewMemoryInfoObject(JSContext* cx); + +} +} +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionTraversalCallback.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsrootidl.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsrootidl.h" +typedef int64_t PRTime; + + + +class nsAString; +class nsACString; +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h" 2 +# 129 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h" 1 +# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsID.h" 1 +# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsID.h" +struct nsID +{ + + + + + + uint32_t m0; + uint16_t m1; + uint16_t m2; + uint8_t m3[8]; +# 41 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsID.h" + void Clear(); + + + + + + + inline bool Equals(const nsID& aOther) const + { + + return + (((uint32_t*)&m0)[0] == ((uint32_t*)&aOther.m0)[0]) && + (((uint32_t*)&m0)[1] == ((uint32_t*)&aOther.m0)[1]) && + (((uint32_t*)&m0)[2] == ((uint32_t*)&aOther.m0)[2]) && + (((uint32_t*)&m0)[3] == ((uint32_t*)&aOther.m0)[3]); + } + + inline bool operator==(const nsID& aOther) const + { + return Equals(aOther); + } + + + + + + bool Parse(const char* aIDStr); + + + + + + + + char* ToString() const; + + + + + + + void ToProvidedString(char (&aDest)[39]) const; + + + + +}; +# 96 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsID.h" +class nsIDToCString +{ +public: + explicit nsIDToCString(const nsID& aID) + { + aID.ToProvidedString(mStringBytes); + } + + const char *get() const + { + return mStringBytes; + } + +protected: + char mStringBytes[39]; +}; + + + + + + +typedef nsID nsCID; +# 134 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsID.h" +typedef nsID nsIID; +# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h" 2 +# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h" +class nsISupports +{ +public: + + template struct COMTypeInfo; +# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h" + virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) = 0; + + + + + + + + virtual MozExternalRefCountType AddRef(void) = 0; +# 76 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h" + virtual MozExternalRefCountType Release(void) = 0; + + +}; + +template struct nsISupports::COMTypeInfo { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template const nsIID nsISupports::COMTypeInfo::kIID __attribute__ ((visibility ("hidden"))) = { 0x00000000, 0x0000, 0x0000, {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46} }; +# 130 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h" 1 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOMCID.h" 1 +# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" 2 +# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +class nsAString; +class nsACString; + +class nsISupports; +class nsIModule; +class nsIComponentManager; +class nsIComponentRegistrar; +class nsIServiceManager; +class nsIFile; +class nsILocalFile; +class nsIDirectoryServiceProvider; +class nsIMemory; +class nsIDebug2; + + +namespace mozilla { +struct Module; +} +# 73 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" nsresult +NS_InitXPCOM2(nsIServiceManager** aResult, + nsIFile* aBinDirectory, + nsIDirectoryServiceProvider* aAppFileLocationProvider); + + + + + +extern "C" nsresult +NS_InitMinimalXPCOM(); +# 95 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" nsresult NS_ShutdownXPCOM(nsIServiceManager* aServMgr); +# 106 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" nsresult NS_GetServiceManager(nsIServiceManager** aResult); +# 116 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" nsresult NS_GetComponentManager(nsIComponentManager** aResult); +# 127 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" nsresult NS_GetComponentRegistrar(nsIComponentRegistrar** aResult); +# 137 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" nsresult NS_GetMemoryManager(nsIMemory** aResult); +# 162 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" nsresult NS_NewLocalFile(const nsAString& aPath, + bool aFollowLinks, + nsIFile** aResult); + +extern "C" nsresult NS_NewNativeLocalFile(const nsACString& aPath, + bool aFollowLinks, + nsIFile** aResult); + + + + +class NS_ConvertUTF16toUTF8; +nsresult NS_NewNativeLocalFile(const NS_ConvertUTF16toUTF8& aPath, + bool aFollowLinks, + nsIFile** aResult) = delete; +# 232 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +enum +{ + NS_DEBUG_WARNING = 0, + NS_DEBUG_ASSERTION = 1, + NS_DEBUG_BREAK = 2, + NS_DEBUG_ABORT = 3 +}; +# 255 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" void NS_DebugBreak(uint32_t aSeverity, + const char* aStr, const char* aExpr, + const char* aFile, int32_t aLine); +# 275 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" void NS_LogInit(); + +extern "C" void NS_LogTerm(); + + + + + + + +class ScopedLogging +{ +public: + ScopedLogging() + { + NS_LogInit(); + } + + ~ScopedLogging() + { + NS_LogTerm(); + } +}; +# 310 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" void NS_LogCtor(void* aPtr, const char* aTypeName, + uint32_t aInstanceSize); + +extern "C" void NS_LogDtor(void* aPtr, const char* aTypeName, + uint32_t aInstanceSize); +# 326 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" void NS_LogAddRef(void* aPtr, nsrefcnt aNewRefCnt, + const char* aTypeName, uint32_t aInstanceSize); + +extern "C" void NS_LogRelease(void* aPtr, nsrefcnt aNewRefCnt, + const char* aTypeName); +# 342 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" void NS_LogCOMPtrAddRef(void* aCOMPtr, nsISupports* aObject); + +extern "C" void NS_LogCOMPtrRelease(void* aCOMPtr, nsISupports* aObject); +# 354 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +class nsCycleCollectionParticipant; +class nsCycleCollectingAutoRefCnt; + +extern "C" void NS_CycleCollectorSuspect3(void* aPtr, + nsCycleCollectionParticipant* aCp, + nsCycleCollectingAutoRefCnt* aRefCnt, + bool* aShouldDelete); +# 439 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" +extern "C" nsresult NS_GetDebug(nsIDebug2** aResult); +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h" 2 +# 376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h" +void NS_ABORT_OOM(size_t aSize); +# 390 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h" +extern "C" { +# 402 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h" +void printf_stderr(const char* aFmt, ...) __attribute__ ((format (printf, 1, 2))); + + + + +void vprintf_stderr(const char* aFmt, va_list aArgs); +# 424 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h" +void fprintf_stderr(FILE* aFile, const char* aFmt, ...) __attribute__ ((format (printf, 2, 3))); + + +} +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" 1 +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h" 1 +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" 2 + + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" 1 +# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" 1 +# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prcpucfg.h" 1 +# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prcpucfg.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/md/_linux.cfg" 1 +# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prcpucfg.h" 2 +# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" 2 + + +# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 +# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" 2 +# 206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +extern "C" { +# 246 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef unsigned char PRUint8; +# 260 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef signed char PRInt8; +# 285 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef unsigned short PRUint16; +typedef short PRInt16; +# 310 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef unsigned int PRUint32; +typedef int PRInt32; +# 365 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef long PRInt64; +typedef unsigned long PRUint64; +# 410 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef int PRIntn; +typedef unsigned int PRUintn; +# 421 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef double PRFloat64; + + + + + + +typedef size_t PRSize; + + + + + + + +typedef PRInt32 PROffset32; +typedef PRInt64 PROffset64; + + + + + + + +typedef ptrdiff_t PRPtrdiff; +# 456 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef unsigned long PRUptrdiff; +# 467 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef PRIntn PRBool; +# 477 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef PRUint8 PRPackedBool; + + + + + +typedef enum { PR_FAILURE = -1, PR_SUCCESS = 0 } PRStatus; + + + + + + +typedef PRUint16 PRUnichar; +# 509 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +typedef long PRWord; +typedef unsigned long PRUword; +# 587 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" +} +# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h" 1 +# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h" +extern "C" { + + + + + +typedef PRUint32 PRIntervalTime; +# 79 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h" +extern __attribute__((visibility("default"))) PRIntervalTime PR_IntervalNow(void); +# 97 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h" +extern __attribute__((visibility("default"))) PRUint32 PR_TicksPerSecond(void); +# 116 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h" +extern __attribute__((visibility("default"))) PRIntervalTime PR_SecondsToInterval(PRUint32 seconds); +extern __attribute__((visibility("default"))) PRIntervalTime PR_MillisecondsToInterval(PRUint32 milli); +extern __attribute__((visibility("default"))) PRIntervalTime PR_MicrosecondsToInterval(PRUint32 micro); +# 137 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h" +extern __attribute__((visibility("default"))) PRUint32 PR_IntervalToSeconds(PRIntervalTime ticks); +extern __attribute__((visibility("default"))) PRUint32 PR_IntervalToMilliseconds(PRIntervalTime ticks); +extern __attribute__((visibility("default"))) PRUint32 PR_IntervalToMicroseconds(PRIntervalTime ticks); + +} +# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" 2 + +extern "C" { + +typedef struct PRThread PRThread; +typedef struct PRThreadStack PRThreadStack; + +typedef enum PRThreadType { + PR_USER_THREAD, + PR_SYSTEM_THREAD +} PRThreadType; + +typedef enum PRThreadScope { + PR_LOCAL_THREAD, + PR_GLOBAL_THREAD, + PR_GLOBAL_BOUND_THREAD +} PRThreadScope; + +typedef enum PRThreadState { + PR_JOINABLE_THREAD, + PR_UNJOINABLE_THREAD +} PRThreadState; + +typedef enum PRThreadPriority +{ + PR_PRIORITY_FIRST = 0, + PR_PRIORITY_LOW = 0, + PR_PRIORITY_NORMAL = 1, + PR_PRIORITY_HIGH = 2, + PR_PRIORITY_URGENT = 3, + PR_PRIORITY_LAST = 3 +} PRThreadPriority; +# 105 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" +extern __attribute__((visibility("default"))) PRThread* PR_CreateThread(PRThreadType type, + void ( *start)(void *arg), + void *arg, + PRThreadPriority priority, + PRThreadScope scope, + PRThreadState state, + PRUint32 stackSize); +# 126 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" +extern __attribute__((visibility("default"))) PRStatus PR_JoinThread(PRThread *thread); + + + + + +extern __attribute__((visibility("default"))) PRThread* PR_GetCurrentThread(void); + + + + + + + +extern __attribute__((visibility("default"))) PRThreadPriority PR_GetThreadPriority(const PRThread *thread); +# 152 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" +extern __attribute__((visibility("default"))) void PR_SetThreadPriority(PRThread *thread, PRThreadPriority priority); + + + + + +extern __attribute__((visibility("default"))) PRStatus PR_SetCurrentThreadName(const char *name); + + + + +extern __attribute__((visibility("default"))) const char * PR_GetThreadName(const PRThread *thread); +# 189 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" +typedef void ( *PRThreadPrivateDTOR)(void *priv); + +extern __attribute__((visibility("default"))) PRStatus PR_NewThreadPrivateIndex( + PRUintn *newIndex, PRThreadPrivateDTOR destructor); +# 205 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" +extern __attribute__((visibility("default"))) PRStatus PR_SetThreadPrivate(PRUintn tpdIndex, void *priv); +# 216 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" +extern __attribute__((visibility("default"))) void* PR_GetThreadPrivate(PRUintn tpdIndex); +# 228 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" +extern __attribute__((visibility("default"))) PRStatus PR_Interrupt(PRThread *thread); + + + + + +extern __attribute__((visibility("default"))) void PR_ClearInterrupt(void); + + + + +extern __attribute__((visibility("default"))) void PR_BlockInterrupt(void); + + + + +extern __attribute__((visibility("default"))) void PR_UnblockInterrupt(void); +# 253 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" +extern __attribute__((visibility("default"))) PRStatus PR_Sleep(PRIntervalTime ticks); + + + + +extern __attribute__((visibility("default"))) PRThreadScope PR_GetThreadScope(const PRThread *thread); + + + + +extern __attribute__((visibility("default"))) PRThreadType PR_GetThreadType(const PRThread *thread); + + + + +extern __attribute__((visibility("default"))) PRThreadState PR_GetThreadState(const PRThread *thread); + +} +# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" 2 +# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MacroForEach.h" 1 +# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" 2 + + + + + + + +inline nsISupports* +ToSupports(nsISupports* aSupports) +{ + return aSupports; +} + +inline nsISupports* +ToCanonicalSupports(nsISupports* aSupports) +{ + return nullptr; +} +# 174 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" +class nsCycleCollectingAutoRefCnt +{ +public: + nsCycleCollectingAutoRefCnt() : mRefCntAndFlags(0) {} + + explicit nsCycleCollectingAutoRefCnt(uintptr_t aValue) + : mRefCntAndFlags(aValue << 2) + { + } + + nsCycleCollectingAutoRefCnt(const nsCycleCollectingAutoRefCnt&) = delete; + void operator=(const nsCycleCollectingAutoRefCnt&) = delete; + + __attribute__((always_inline)) inline uintptr_t incr(nsISupports* aOwner) + { + return incr(aOwner, nullptr); + } + + __attribute__((always_inline)) inline uintptr_t incr(void* aOwner, + nsCycleCollectionParticipant* aCp) + { + mRefCntAndFlags += (1 << 2); + mRefCntAndFlags &= ~(1 << 1); + + + if (!IsInPurpleBuffer()) { + mRefCntAndFlags |= (1 << 0); + + do { } while (0); + NS_CycleCollectorSuspect3(aOwner, aCp, this, nullptr); + } + return (mRefCntAndFlags >> 2); + } + + __attribute__((always_inline)) inline void stabilizeForDeletion() + { + + + mRefCntAndFlags = (1 << 2) | (1 << 0); + } + + __attribute__((always_inline)) inline uintptr_t decr(nsISupports* aOwner, + bool* aShouldDelete = nullptr) + { + return decr(aOwner, nullptr, aShouldDelete); + } + + __attribute__((always_inline)) inline uintptr_t decr(void* aOwner, + nsCycleCollectionParticipant* aCp, + bool* aShouldDelete = nullptr) + { + do { } while (0); + if (!IsInPurpleBuffer()) { + mRefCntAndFlags -= (1 << 2); + mRefCntAndFlags |= ((1 << 0) | (1 << 1)); + uintptr_t retval = (mRefCntAndFlags >> 2); + + NS_CycleCollectorSuspect3(aOwner, aCp, this, aShouldDelete); + return retval; + } + mRefCntAndFlags -= (1 << 2); + mRefCntAndFlags |= ((1 << 0) | (1 << 1)); + return (mRefCntAndFlags >> 2); + } + + __attribute__((always_inline)) inline void RemovePurple() + { + do { } while (0); + mRefCntAndFlags &= ~(1 << 1); + } + + __attribute__((always_inline)) inline void RemoveFromPurpleBuffer() + { + do { } while (0); + mRefCntAndFlags &= ~((1 << 1) | (1 << 0)); + } + + __attribute__((always_inline)) inline bool IsPurple() const + { + return !!(mRefCntAndFlags & (1 << 1)); + } + + __attribute__((always_inline)) inline bool IsInPurpleBuffer() const + { + return !!(mRefCntAndFlags & (1 << 0)); + } + + __attribute__((always_inline)) inline nsrefcnt get() const + { + return (mRefCntAndFlags >> 2); + } + + __attribute__((always_inline)) inline operator nsrefcnt() const + { + return get(); + } + +private: + uintptr_t mRefCntAndFlags; +}; + +class nsAutoRefCnt +{ +public: + nsAutoRefCnt() : mValue(0) {} + explicit nsAutoRefCnt(nsrefcnt aValue) : mValue(aValue) {} + + nsAutoRefCnt(const nsAutoRefCnt&) = delete; + void operator=(const nsAutoRefCnt&) = delete; + + + nsrefcnt operator++() { return ++mValue; } + nsrefcnt operator--() { return --mValue; } + + nsrefcnt operator=(nsrefcnt aValue) { return (mValue = aValue); } + operator nsrefcnt() const { return mValue; } + nsrefcnt get() const { return mValue; } + + static const bool isThreadSafe = false; +private: + nsrefcnt operator++(int) = delete; + nsrefcnt operator--(int) = delete; + nsrefcnt mValue; +}; + +namespace mozilla { +class ThreadSafeAutoRefCnt +{ +public: + ThreadSafeAutoRefCnt() : mValue(0) {} + explicit ThreadSafeAutoRefCnt(nsrefcnt aValue) : mValue(aValue) {} + + ThreadSafeAutoRefCnt(const ThreadSafeAutoRefCnt&) = delete; + void operator=(const ThreadSafeAutoRefCnt&) = delete; + + + __attribute__((always_inline)) inline nsrefcnt operator++() + { +# 320 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" + return mValue.fetch_add(1, std::memory_order_relaxed) + 1; + } + __attribute__((always_inline)) inline nsrefcnt operator--() + { + + + + + nsrefcnt result = mValue.fetch_sub(1, std::memory_order_release) - 1; + if (result == 0) { + + + + + result = mValue.load(std::memory_order_acquire); + } + return result; + } + + __attribute__((always_inline)) inline nsrefcnt operator=(nsrefcnt aValue) + { + + + mValue.store(aValue, std::memory_order_release); + return aValue; + } + __attribute__((always_inline)) inline operator nsrefcnt() const { return get(); } + __attribute__((always_inline)) inline nsrefcnt get() const + { + + + return mValue.load(std::memory_order_acquire); + } + + static const bool isThreadSafe = true; +private: + nsrefcnt operator++(int) = delete; + nsrefcnt operator--(int) = delete; + std::atomic mValue; +}; +} +# 759 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" +struct QITableEntry +{ + const nsIID* iid; + int32_t offset; +}; + +nsresult +NS_TableDrivenQI(void* aThis, const nsIID& aIID, + void** aInstancePtr, const QITableEntry* aEntries); +# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h" 2 +# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h" +template +inline void +ns_if_addref(T aExpr) +{ + if (aExpr) { + aExpr->AddRef(); + } +} +# 121 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h" +template +inline nsresult +CallQueryInterface(T* aSource, DestinationType** aDestination) +{ + + + static_assert(!mozilla::IsSame::value || + mozilla::IsSame::value, + "don't use CallQueryInterface for compile-time-determinable casts"); + + do { } while(0); + do { } while(0); + + return aSource->QueryInterface((DestinationType::template COMTypeInfo::kIID), + reinterpret_cast(aDestination)); +} + +template +inline nsresult +CallQueryInterface(RefPtr& aSourcePtr, DestinationType** aDestPtr) +{ + return CallQueryInterface(aSourcePtr.get(), aDestPtr); +} +# 131 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h" 2 +# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionTraversalCallback.h" 2 + +class nsCycleCollectionParticipant; + +class nsCycleCollectionTraversalCallback +{ +public: + + + + + virtual void DescribeRefCountedNode(nsrefcnt aRefcount, + const char* aObjName) = 0; + + virtual void DescribeGCedNode(bool aIsMarked, + const char* aObjName, + uint64_t aCompartmentAddress = 0) = 0; + + virtual void NoteXPCOMChild(nsISupports* aChild) = 0; + virtual void NoteJSChild(const JS::GCCellPtr& aThing) = 0; + virtual void NoteNativeChild(void* aChild, + nsCycleCollectionParticipant* aHelper) = 0; + + + + + + virtual void NoteNextEdgeName(const char* aName) = 0; + + enum + { + + + + + WANT_DEBUG_INFO = (1 << 0), + + + + WANT_ALL_TRACES = (1 << 1) + }; + uint32_t Flags() const { return mFlags; } + bool WantDebugInfo() const { return (mFlags & WANT_DEBUG_INFO) != 0; } + bool WantAllTraces() const { return (mFlags & WANT_ALL_TRACES) != 0; } +protected: + nsCycleCollectionTraversalCallback() : mFlags(0) {} + + uint32_t mFlags; +}; +# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionNoteChild.h" 2 + + + +enum +{ + CycleCollectionEdgeNameArrayFlag = 1 +}; + + +void +CycleCollectionNoteEdgeNameImpl(nsCycleCollectionTraversalCallback& aCallback, + const char* aName, + uint32_t aFlags = 0); + + +__attribute__((always_inline)) inline void +CycleCollectionNoteEdgeName(nsCycleCollectionTraversalCallback& aCallback, + const char* aName, + uint32_t aFlags = 0) +{ + if ((__builtin_expect(!!(aCallback.WantDebugInfo()), 0))) { + CycleCollectionNoteEdgeNameImpl(aCallback, aName, aFlags); + } +} +# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionNoteChild.h" +template +nsISupports* +ToSupports(T* aPtr, typename T::cycleCollection* aDummy = 0) +{ + return T::cycleCollection::Upcast(aPtr); +} + + + +template::value> +struct CycleCollectionNoteChildImpl +{ +}; + +template +struct CycleCollectionNoteChildImpl +{ + static void Run(nsCycleCollectionTraversalCallback& aCallback, T* aChild) + { + aCallback.NoteXPCOMChild(ToSupports(aChild)); + } +}; + +template +struct CycleCollectionNoteChildImpl +{ + static void Run(nsCycleCollectionTraversalCallback& aCallback, T* aChild) + { + aCallback.NoteNativeChild(aChild, T::cycleCollection::GetParticipant()); + } +}; + + + + +template +inline void +CycleCollectionNoteChild(nsCycleCollectionTraversalCallback& aCallback, + T* aChild, const char* aName, uint32_t aFlags) +{ + CycleCollectionNoteEdgeName(aCallback, aName, aFlags); + CycleCollectionNoteChildImpl::Run(aCallback, aChild); +} + +template +inline void +CycleCollectionNoteChild(nsCycleCollectionTraversalCallback& aCallback, + T* aChild, const char* aName) +{ + CycleCollectionNoteChild(aCallback, aChild, aName, 0); +} +# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAlgorithm.h" 1 +# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAlgorithm.h" +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCharTraits.h" 1 +# 86 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCharTraits.h" +template +struct nsCharTraits +{ +}; + +template <> +struct nsCharTraits +{ + typedef char16_t char_type; + typedef uint16_t unsigned_char_type; + typedef char incompatible_char_type; + + static char_type* const sEmptyBuffer; + + static void + assign(char_type& aLhs, char_type aRhs) + { + aLhs = aRhs; + } + + + + typedef int int_type; + + static char_type + to_char_type(int_type aChar) + { + return char_type(aChar); + } + + static int_type + to_int_type(char_type aChar) + { + return int_type(static_cast(aChar)); + } + + static bool + eq_int_type(int_type aLhs, int_type aRhs) + { + return aLhs == aRhs; + } + + + + + static bool + eq(char_type aLhs, char_type aRhs) + { + return aLhs == aRhs; + } + + static bool + lt(char_type aLhs, char_type aRhs) + { + return aLhs < aRhs; + } + + + + + static char_type* + move(char_type* aStr1, const char_type* aStr2, size_t aN) + { + return static_cast(memmove(aStr1, aStr2, + aN * sizeof(char_type))); + } + + static char_type* + copy(char_type* aStr1, const char_type* aStr2, size_t aN) + { + return static_cast(memcpy(aStr1, aStr2, + aN * sizeof(char_type))); + } + + static char_type* + copyASCII(char_type* aStr1, const char* aStr2, size_t aN) + { + for (char_type* s = aStr1; aN--; ++s, ++aStr2) { + do { } while(0); + *s = static_cast(*aStr2); + } + return aStr1; + } + + static char_type* + assign(char_type* aStr, size_t aN, char_type aChar) + { + char_type* result = aStr; + while (aN--) { + assign(*aStr++, aChar); + } + return result; + } + + static int + compare(const char_type* aStr1, const char_type* aStr2, size_t aN) + { + for (; aN--; ++aStr1, ++aStr2) { + if (!eq(*aStr1, *aStr2)) { + return to_int_type(*aStr1) - to_int_type(*aStr2); + } + } + + return 0; + } + + static int + compareASCII(const char_type* aStr1, const char* aStr2, size_t aN) + { + for (; aN--; ++aStr1, ++aStr2) { + do { } while(0); + if (!eq_int_type(to_int_type(*aStr1), + to_int_type(static_cast(*aStr2)))) { + return to_int_type(*aStr1) - + to_int_type(static_cast(*aStr2)); + } + } + + return 0; + } + + + + + static int + compareASCIINullTerminated(const char_type* aStr1, size_t aN, + const char* aStr2) + { + for (; aN--; ++aStr1, ++aStr2) { + if (!*aStr2) { + return 1; + } + do { } while(0); + if (!eq_int_type(to_int_type(*aStr1), + to_int_type(static_cast(*aStr2)))) { + return to_int_type(*aStr1) - + to_int_type(static_cast(*aStr2)); + } + } + + if (*aStr2) { + return -1; + } + + return 0; + } + + + + + + static char_type + ASCIIToLower(char_type aChar) + { + if (aChar >= 'A' && aChar <= 'Z') { + return char_type(aChar + ('a' - 'A')); + } + + return aChar; + } + + static int + compareLowerCaseToASCII(const char_type* aStr1, const char* aStr2, size_t aN) + { + for (; aN--; ++aStr1, ++aStr2) { + do { } while(0); + do { } while(0); + + char_type lower_s1 = ASCIIToLower(*aStr1); + if (lower_s1 != static_cast(*aStr2)) { + return to_int_type(lower_s1) - + to_int_type(static_cast(*aStr2)); + } + } + + return 0; + } + + + + + static int + compareLowerCaseToASCIINullTerminated(const char_type* aStr1, + size_t aN, const char* aStr2) + { + for (; aN--; ++aStr1, ++aStr2) { + if (!*aStr2) { + return 1; + } + do { } while(0); + do { } while(0); + + char_type lower_s1 = ASCIIToLower(*aStr1); + if (lower_s1 != static_cast(*aStr2)) { + return to_int_type(lower_s1) - + to_int_type(static_cast(*aStr2)); + } + } + + if (*aStr2) { + return -1; + } + + return 0; + } + + static size_t + length(const char_type* aStr) + { + size_t result = 0; + while (!eq(*aStr++, char_type(0))) { + ++result; + } + return result; + } + + static const char_type* + find(const char_type* aStr, size_t aN, char_type aChar) + { + while (aN--) { + if (eq(*aStr, aChar)) { + return aStr; + } + ++aStr; + } + + return 0; + } +}; + +template <> +struct nsCharTraits +{ + typedef char char_type; + typedef unsigned char unsigned_char_type; + typedef char16_t incompatible_char_type; + + static char_type* const sEmptyBuffer; + + static void + assign(char_type& aLhs, char_type aRhs) + { + aLhs = aRhs; + } + + + + + typedef int int_type; + + static char_type + to_char_type(int_type aChar) + { + return char_type(aChar); + } + + static int_type + to_int_type(char_type aChar) + { + return int_type(static_cast(aChar)); + } + + static bool + eq_int_type(int_type aLhs, int_type aRhs) + { + return aLhs == aRhs; + } + + + + + static bool eq(char_type aLhs, char_type aRhs) + { + return aLhs == aRhs; + } + + static bool + lt(char_type aLhs, char_type aRhs) + { + return aLhs < aRhs; + } + + + + + static char_type* + move(char_type* aStr1, const char_type* aStr2, size_t aN) + { + return static_cast(memmove(aStr1, aStr2, + aN * sizeof(char_type))); + } + + static char_type* + copy(char_type* aStr1, const char_type* aStr2, size_t aN) + { + return static_cast(memcpy(aStr1, aStr2, + aN * sizeof(char_type))); + } + + static char_type* + copyASCII(char_type* aStr1, const char* aStr2, size_t aN) + { + return copy(aStr1, aStr2, aN); + } + + static char_type* + assign(char_type* aStr, size_t aN, char_type aChar) + { + return static_cast(memset(aStr, to_int_type(aChar), aN)); + } + + static int + compare(const char_type* aStr1, const char_type* aStr2, size_t aN) + { + return memcmp(aStr1, aStr2, aN); + } + + static int + compareASCII(const char_type* aStr1, const char* aStr2, size_t aN) + { + + + + + + return compare(aStr1, aStr2, aN); + } + + + + + static int + compareASCIINullTerminated(const char_type* aStr1, size_t aN, + const char* aStr2) + { + + + for (; aN--; ++aStr1, ++aStr2) { + if (!*aStr2) { + return 1; + } + do { } while(0); + if (*aStr1 != *aStr2) { + return to_int_type(*aStr1) - to_int_type(*aStr2); + } + } + + if (*aStr2) { + return -1; + } + + return 0; + } + + + + + static char_type + ASCIIToLower(char_type aChar) + { + if (aChar >= 'A' && aChar <= 'Z') { + return char_type(aChar + ('a' - 'A')); + } + + return aChar; + } + + static int + compareLowerCaseToASCII(const char_type* aStr1, const char* aStr2, size_t aN) + { + for (; aN--; ++aStr1, ++aStr2) { + do { } while(0); + do { } while(0); + + char_type lower_s1 = ASCIIToLower(*aStr1); + if (lower_s1 != *aStr2) { + return to_int_type(lower_s1) - to_int_type(*aStr2); + } + } + return 0; + } + + + + + static int + compareLowerCaseToASCIINullTerminated(const char_type* aStr1, size_t aN, + const char* aStr2) + { + for (; aN--; ++aStr1, ++aStr2) { + if (!*aStr2) { + return 1; + } + do { } while(0); + do { } while(0); + + char_type lower_s1 = ASCIIToLower(*aStr1); + if (lower_s1 != *aStr2) { + return to_int_type(lower_s1) - to_int_type(*aStr2); + } + } + + if (*aStr2) { + return -1; + } + + return 0; + } + + static size_t + length(const char_type* aStr) + { + return strlen(aStr); + } + + static const char_type* + find(const char_type* aStr, size_t aN, char_type aChar) + { + return reinterpret_cast(memchr(aStr, to_int_type(aChar), + aN)); + } +}; + +template +struct nsCharSourceTraits +{ + typedef typename InputIterator::difference_type difference_type; + + static uint32_t + readable_distance(const InputIterator& aFirst, const InputIterator& aLast) + { + + return uint32_t(aLast.get() - aFirst.get()); + } + + static const typename InputIterator::value_type* + read(const InputIterator& aIter) + { + return aIter.get(); + } + + static void + advance(InputIterator& aStr, difference_type aN) + { + aStr.advance(aN); + } +}; + +template +struct nsCharSourceTraits +{ + typedef ptrdiff_t difference_type; + + static uint32_t + readable_distance(CharT* aStr) + { + return uint32_t(nsCharTraits::length(aStr)); + + } + + static uint32_t + readable_distance(CharT* aFirst, CharT* aLast) + { + return uint32_t(aLast - aFirst); + } + + static const CharT* + read(CharT* aStr) + { + return aStr; + } + + static void + advance(CharT*& aStr, difference_type aN) + { + aStr += aN; + } +}; + +template +struct nsCharSinkTraits +{ + static void + write(OutputIterator& aIter, const typename OutputIterator::value_type* aStr, + uint32_t aN) + { + aIter.write(aStr, aN); + } +}; + +template +struct nsCharSinkTraits +{ + static void + write(CharT*& aIter, const CharT* aStr, uint32_t aN) + { + nsCharTraits::move(aIter, aStr, aN); + aIter += aN; + } +}; +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAlgorithm.h" 2 + +template +inline T +NS_ROUNDUP(const T& aA, const T& aB) +{ + return ((aA + (aB - 1)) / aB) * aB; +} + + + + +template +inline const T& +XPCOM_MIN(const T& aA, const T& aB) +{ + return aB < aA ? aB : aA; +} + + +template +inline const T& +XPCOM_MAX(const T& aA, const T& aB) +{ + return aA > aB ? aA : aB; +} + +namespace mozilla { + +template +inline const T& +clamped(const T& aA, const T& aMin, const T& aMax) +{ + do { } while (0); + + return XPCOM_MIN(XPCOM_MAX(aA, aMin), aMax); +} + +} + +template +inline uint32_t +NS_COUNT(InputIterator& aFirst, const InputIterator& aLast, const T& aValue) +{ + uint32_t result = 0; + for (; aFirst != aLast; ++aFirst) + if (*aFirst == aValue) { + ++result; + } + return result; +} + +template +inline OutputIterator& +copy_string(const InputIterator& aFirst, const InputIterator& aLast, + OutputIterator& aResult) +{ + typedef nsCharSourceTraits source_traits; + typedef nsCharSinkTraits sink_traits; + + sink_traits::write(aResult, source_traits::read(aFirst), + source_traits::readable_distance(aFirst, aLast)); + return aResult; +} +# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsQuickSort.h" 1 +# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsQuickSort.h" +extern "C" { +# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsQuickSort.h" +void NS_QuickSort(void*, unsigned int, unsigned int, + int (*)(const void*, const void*, void*), + void*); + + +} +# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 + + +# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegionFwd.h" 1 +# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegionFwd.h" +namespace mozilla { +namespace gfx { + +struct UnknownUnits; + +template +class IntRegionTyped; + +typedef IntRegionTyped IntRegion; + +} +} + +typedef mozilla::gfx::IntRegion nsIntRegion; +# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 1 3 +# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/typeinfo" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/typeinfo" 3 + + + + + + +#pragma GCC visibility push(default) + +extern "C++" { + +namespace __cxxabiv1 +{ + class __class_type_info; +} +# 80 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/typeinfo" 3 +namespace std +{ + + + + + + + class type_info + { + public: + + + + + virtual ~type_info(); + + + + const char* name() const noexcept + { return __name[0] == '*' ? __name + 1 : __name; } +# 115 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/typeinfo" 3 + bool before(const type_info& __arg) const noexcept + { return (__name[0] == '*' && __arg.__name[0] == '*') + ? __name < __arg.__name + : __builtin_strcmp (__name, __arg.__name) < 0; } + + bool operator==(const type_info& __arg) const noexcept + { + return ((__name == __arg.__name) + || (__name[0] != '*' && + __builtin_strcmp (__name, __arg.__name) == 0)); + } +# 136 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/typeinfo" 3 + bool operator!=(const type_info& __arg) const noexcept + { return !operator==(__arg); } + + + size_t hash_code() const noexcept + { + + return _Hash_bytes(name(), __builtin_strlen(name()), + static_cast(0xc70f6907UL)); + + + + } + + + + virtual bool __is_pointer_p() const; + + + virtual bool __is_function_p() const; + + + + + + + + virtual bool __do_catch(const type_info *__thr_type, void **__thr_obj, + unsigned __outer) const; + + + virtual bool __do_upcast(const __cxxabiv1::__class_type_info *__target, + void **__obj_ptr) const; + + protected: + const char *__name; + + explicit type_info(const char *__n): __name(__n) { } + + private: + + type_info& operator=(const type_info&); + type_info(const type_info&); + }; + + + + + + + + class bad_cast : public exception + { + public: + bad_cast() noexcept { } + + + + virtual ~bad_cast() noexcept; + + + virtual const char* what() const noexcept; + }; + + + + + + class bad_typeid : public exception + { + public: + bad_typeid () noexcept { } + + + + virtual ~bad_typeid() noexcept; + + + virtual const char* what() const noexcept; + }; +} + +} + +#pragma GCC visibility pop +# 54 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 2 3 + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/tuple" 1 3 +# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/tuple" 3 + + + + + + + +# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uses_allocator.h" 1 3 +# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uses_allocator.h" 3 +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + struct __erased_type { }; + + template + using __is_erased_or_convertible + = __or_, is_convertible<_Alloc, _Tp>>; + + + struct allocator_arg_t { explicit allocator_arg_t() = default; }; + + constexpr allocator_arg_t allocator_arg = allocator_arg_t(); + + template> + struct __uses_allocator_helper + : false_type { }; + + template + struct __uses_allocator_helper<_Tp, _Alloc, + __void_t> + : __is_erased_or_convertible<_Alloc, typename _Tp::allocator_type>::type + { }; + + + template + struct uses_allocator + : __uses_allocator_helper<_Tp, _Alloc>::type + { }; + + struct __uses_alloc_base { }; + + struct __uses_alloc0 : __uses_alloc_base + { + struct _Sink { void operator=(const void*) { } } _M_a; + }; + + template + struct __uses_alloc1 : __uses_alloc_base { const _Alloc* _M_a; }; + + template + struct __uses_alloc2 : __uses_alloc_base { const _Alloc* _M_a; }; + + template + struct __uses_alloc; + + template + struct __uses_alloc + : conditional< + is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value, + __uses_alloc1<_Alloc>, + __uses_alloc2<_Alloc>>::type + { + static_assert(__or_< + is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>, + is_constructible<_Tp, _Args..., _Alloc>>::value, "construction with" + " an allocator must be possible if uses_allocator is true"); + }; + + template + struct __uses_alloc + : __uses_alloc0 { }; + + template + using __uses_alloc_t = + __uses_alloc::value, _Tp, _Alloc, _Args...>; + + template + inline __uses_alloc_t<_Tp, _Alloc, _Args...> + __use_alloc(const _Alloc& __a) + { + __uses_alloc_t<_Tp, _Alloc, _Args...> __ret; + __ret._M_a = std::__addressof(__a); + return __ret; + } + + +} +# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/tuple" 2 3 + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + + + + + + template + struct _Head_base; + + template + struct _Head_base<_Idx, _Head, true> + : public _Head + { + constexpr _Head_base() + : _Head() { } + + constexpr _Head_base(const _Head& __h) + : _Head(__h) { } + + constexpr _Head_base(const _Head_base&) = default; + constexpr _Head_base(_Head_base&&) = default; + + template + constexpr _Head_base(_UHead&& __h) + : _Head(std::forward<_UHead>(__h)) { } + + _Head_base(allocator_arg_t, __uses_alloc0) + : _Head() { } + + template + _Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a) + : _Head(allocator_arg, *__a._M_a) { } + + template + _Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a) + : _Head(*__a._M_a) { } + + template + _Head_base(__uses_alloc0, _UHead&& __uhead) + : _Head(std::forward<_UHead>(__uhead)) { } + + template + _Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead) + : _Head(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead)) { } + + template + _Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead) + : _Head(std::forward<_UHead>(__uhead), *__a._M_a) { } + + static constexpr _Head& + _M_head(_Head_base& __b) noexcept { return __b; } + + static constexpr const _Head& + _M_head(const _Head_base& __b) noexcept { return __b; } + }; + + template + struct _Head_base<_Idx, _Head, false> + { + constexpr _Head_base() + : _M_head_impl() { } + + constexpr _Head_base(const _Head& __h) + : _M_head_impl(__h) { } + + constexpr _Head_base(const _Head_base&) = default; + constexpr _Head_base(_Head_base&&) = default; + + template + constexpr _Head_base(_UHead&& __h) + : _M_head_impl(std::forward<_UHead>(__h)) { } + + _Head_base(allocator_arg_t, __uses_alloc0) + : _M_head_impl() { } + + template + _Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a) + : _M_head_impl(allocator_arg, *__a._M_a) { } + + template + _Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a) + : _M_head_impl(*__a._M_a) { } + + template + _Head_base(__uses_alloc0, _UHead&& __uhead) + : _M_head_impl(std::forward<_UHead>(__uhead)) { } + + template + _Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead) + : _M_head_impl(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead)) + { } + + template + _Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead) + : _M_head_impl(std::forward<_UHead>(__uhead), *__a._M_a) { } + + static constexpr _Head& + _M_head(_Head_base& __b) noexcept { return __b._M_head_impl; } + + static constexpr const _Head& + _M_head(const _Head_base& __b) noexcept { return __b._M_head_impl; } + + _Head _M_head_impl; + }; +# 158 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/tuple" 3 + template + struct _Tuple_impl; + + template + struct __is_empty_non_tuple : is_empty<_Tp> { }; + + + template + struct __is_empty_non_tuple> : false_type { }; + + + template + using __empty_not_final + = typename conditional<__is_final(_Tp), false_type, + __is_empty_non_tuple<_Tp>>::type; + + + + + + + template + struct _Tuple_impl<_Idx, _Head, _Tail...> + : public _Tuple_impl<_Idx + 1, _Tail...>, + private _Head_base<_Idx, _Head, __empty_not_final<_Head>::value> + { + template friend class _Tuple_impl; + + typedef _Tuple_impl<_Idx + 1, _Tail...> _Inherited; + typedef _Head_base<_Idx, _Head, __empty_not_final<_Head>::value> _Base; + + static constexpr _Head& + _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); } + + static constexpr const _Head& + _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); } + + static constexpr _Inherited& + _M_tail(_Tuple_impl& __t) noexcept { return __t; } + + static constexpr const _Inherited& + _M_tail(const _Tuple_impl& __t) noexcept { return __t; } + + constexpr _Tuple_impl() + : _Inherited(), _Base() { } + + explicit + constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail) + : _Inherited(__tail...), _Base(__head) { } + + template::type> + explicit + constexpr _Tuple_impl(_UHead&& __head, _UTail&&... __tail) + : _Inherited(std::forward<_UTail>(__tail)...), + _Base(std::forward<_UHead>(__head)) { } + + constexpr _Tuple_impl(const _Tuple_impl&) = default; + + constexpr + _Tuple_impl(_Tuple_impl&& __in) + noexcept(__and_, + is_nothrow_move_constructible<_Inherited>>::value) + : _Inherited(std::move(_M_tail(__in))), + _Base(std::forward<_Head>(_M_head(__in))) { } + + template + constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UElements...>& __in) + : _Inherited(_Tuple_impl<_Idx, _UElements...>::_M_tail(__in)), + _Base(_Tuple_impl<_Idx, _UElements...>::_M_head(__in)) { } + + template + constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in) + : _Inherited(std::move + (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))), + _Base(std::forward<_UHead> + (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in))) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a) + : _Inherited(__tag, __a), + _Base(__tag, __use_alloc<_Head>(__a)) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + const _Head& __head, const _Tail&... __tail) + : _Inherited(__tag, __a, __tail...), + _Base(__use_alloc<_Head, _Alloc, _Head>(__a), __head) { } + + template::type> + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + _UHead&& __head, _UTail&&... __tail) + : _Inherited(__tag, __a, std::forward<_UTail>(__tail)...), + _Base(__use_alloc<_Head, _Alloc, _UHead>(__a), + std::forward<_UHead>(__head)) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + const _Tuple_impl& __in) + : _Inherited(__tag, __a, _M_tail(__in)), + _Base(__use_alloc<_Head, _Alloc, _Head>(__a), _M_head(__in)) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + _Tuple_impl&& __in) + : _Inherited(__tag, __a, std::move(_M_tail(__in))), + _Base(__use_alloc<_Head, _Alloc, _Head>(__a), + std::forward<_Head>(_M_head(__in))) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + const _Tuple_impl<_Idx, _UElements...>& __in) + : _Inherited(__tag, __a, + _Tuple_impl<_Idx, _UElements...>::_M_tail(__in)), + _Base(__use_alloc<_Head, _Alloc, _Head>(__a), + _Tuple_impl<_Idx, _UElements...>::_M_head(__in)) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + _Tuple_impl<_Idx, _UHead, _UTails...>&& __in) + : _Inherited(__tag, __a, std::move + (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))), + _Base(__use_alloc<_Head, _Alloc, _UHead>(__a), + std::forward<_UHead> + (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in))) { } + + _Tuple_impl& + operator=(const _Tuple_impl& __in) + { + _M_head(*this) = _M_head(__in); + _M_tail(*this) = _M_tail(__in); + return *this; + } + + _Tuple_impl& + operator=(_Tuple_impl&& __in) + noexcept(__and_, + is_nothrow_move_assignable<_Inherited>>::value) + { + _M_head(*this) = std::forward<_Head>(_M_head(__in)); + _M_tail(*this) = std::move(_M_tail(__in)); + return *this; + } + + template + _Tuple_impl& + operator=(const _Tuple_impl<_Idx, _UElements...>& __in) + { + _M_head(*this) = _Tuple_impl<_Idx, _UElements...>::_M_head(__in); + _M_tail(*this) = _Tuple_impl<_Idx, _UElements...>::_M_tail(__in); + return *this; + } + + template + _Tuple_impl& + operator=(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in) + { + _M_head(*this) = std::forward<_UHead> + (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in)); + _M_tail(*this) = std::move + (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in)); + return *this; + } + + protected: + void + _M_swap(_Tuple_impl& __in) + noexcept(__is_nothrow_swappable<_Head>::value + && noexcept(_M_tail(__in)._M_swap(_M_tail(__in)))) + { + using std::swap; + swap(_M_head(*this), _M_head(__in)); + _Inherited::_M_swap(_M_tail(__in)); + } + }; + + + template + struct _Tuple_impl<_Idx, _Head> + : private _Head_base<_Idx, _Head, __empty_not_final<_Head>::value> + { + template friend class _Tuple_impl; + + typedef _Head_base<_Idx, _Head, __empty_not_final<_Head>::value> _Base; + + static constexpr _Head& + _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); } + + static constexpr const _Head& + _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); } + + constexpr _Tuple_impl() + : _Base() { } + + explicit + constexpr _Tuple_impl(const _Head& __head) + : _Base(__head) { } + + template + explicit + constexpr _Tuple_impl(_UHead&& __head) + : _Base(std::forward<_UHead>(__head)) { } + + constexpr _Tuple_impl(const _Tuple_impl&) = default; + + constexpr + _Tuple_impl(_Tuple_impl&& __in) + noexcept(is_nothrow_move_constructible<_Head>::value) + : _Base(std::forward<_Head>(_M_head(__in))) { } + + template + constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UHead>& __in) + : _Base(_Tuple_impl<_Idx, _UHead>::_M_head(__in)) { } + + template + constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead>&& __in) + : _Base(std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in))) + { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a) + : _Base(__tag, __use_alloc<_Head>(__a)) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + const _Head& __head) + : _Base(__use_alloc<_Head, _Alloc, _Head>(__a), __head) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + _UHead&& __head) + : _Base(__use_alloc<_Head, _Alloc, _UHead>(__a), + std::forward<_UHead>(__head)) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + const _Tuple_impl& __in) + : _Base(__use_alloc<_Head, _Alloc, _Head>(__a), _M_head(__in)) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + _Tuple_impl&& __in) + : _Base(__use_alloc<_Head, _Alloc, _Head>(__a), + std::forward<_Head>(_M_head(__in))) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + const _Tuple_impl<_Idx, _UHead>& __in) + : _Base(__use_alloc<_Head, _Alloc, _Head>(__a), + _Tuple_impl<_Idx, _UHead>::_M_head(__in)) { } + + template + _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, + _Tuple_impl<_Idx, _UHead>&& __in) + : _Base(__use_alloc<_Head, _Alloc, _UHead>(__a), + std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in))) + { } + + _Tuple_impl& + operator=(const _Tuple_impl& __in) + { + _M_head(*this) = _M_head(__in); + return *this; + } + + _Tuple_impl& + operator=(_Tuple_impl&& __in) + noexcept(is_nothrow_move_assignable<_Head>::value) + { + _M_head(*this) = std::forward<_Head>(_M_head(__in)); + return *this; + } + + template + _Tuple_impl& + operator=(const _Tuple_impl<_Idx, _UHead>& __in) + { + _M_head(*this) = _Tuple_impl<_Idx, _UHead>::_M_head(__in); + return *this; + } + + template + _Tuple_impl& + operator=(_Tuple_impl<_Idx, _UHead>&& __in) + { + _M_head(*this) + = std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)); + return *this; + } + + protected: + void + _M_swap(_Tuple_impl& __in) + noexcept(__is_nothrow_swappable<_Head>::value) + { + using std::swap; + swap(_M_head(*this), _M_head(__in)); + } + }; + + template + class tuple; + + + + template + struct _TC + { + template + static constexpr bool _ConstructibleTuple() + { + return __and_...>::value; + } + + template + static constexpr bool _ImplicitlyConvertibleTuple() + { + return __and_...>::value; + } + + template + static constexpr bool _MoveConstructibleTuple() + { + return __and_...>::value; + } + + template + static constexpr bool _ImplicitlyMoveConvertibleTuple() + { + return __and_...>::value; + } + + template + static constexpr bool _NonNestedTuple() + { + return __and_<__not_, + typename remove_cv< + typename remove_reference<_SrcTuple>::type + >::type>>, + __not_>, + __not_> + >::value; + } + template + static constexpr bool _NotSameTuple() + { + return __not_, + typename remove_const< + typename remove_reference<_UElements...>::type + >::type>>::value; + } + }; + + template + struct _TC + { + template + static constexpr bool _ConstructibleTuple() + { + return false; + } + + template + static constexpr bool _ImplicitlyConvertibleTuple() + { + return false; + } + + template + static constexpr bool _MoveConstructibleTuple() + { + return false; + } + + template + static constexpr bool _ImplicitlyMoveConvertibleTuple() + { + return false; + } + + template + static constexpr bool _NonNestedTuple() + { + return true; + } + template + static constexpr bool _NotSameTuple() + { + return true; + } + }; + + + template + class tuple : public _Tuple_impl<0, _Elements...> + { + typedef _Tuple_impl<0, _Elements...> _Inherited; + + + + template + struct _TC2 + { + static constexpr bool _DefaultConstructibleTuple() + { + return __and_...>::value; + } + static constexpr bool _ImplicitlyDefaultConstructibleTuple() + { + return __and_<__is_implicitly_default_constructible<_Elements>...> + ::value; + } + }; + + public: + template:: + _ImplicitlyDefaultConstructibleTuple(), + bool>::type = true> + constexpr tuple() + : _Inherited() { } + + template:: + _DefaultConstructibleTuple() + && + !_TC2<_Dummy>:: + _ImplicitlyDefaultConstructibleTuple(), + bool>::type = false> + explicit constexpr tuple() + : _Inherited() { } + + + + template using _TCC = + _TC::value, + _Elements...>; + + template::template + _ConstructibleTuple<_Elements...>() + && _TCC<_Dummy>::template + _ImplicitlyConvertibleTuple<_Elements...>() + && (sizeof...(_Elements) >= 1), + bool>::type=true> + constexpr tuple(const _Elements&... __elements) + : _Inherited(__elements...) { } + + template::template + _ConstructibleTuple<_Elements...>() + && !_TCC<_Dummy>::template + _ImplicitlyConvertibleTuple<_Elements...>() + && (sizeof...(_Elements) >= 1), + bool>::type=false> + explicit constexpr tuple(const _Elements&... __elements) + : _Inherited(__elements...) { } + + + + template using _TMC = + _TC<(sizeof...(_Elements) == sizeof...(_UElements)), + _Elements...>; + + template::template + _NotSameTuple<_UElements...>() + && _TMC<_UElements...>::template + _MoveConstructibleTuple<_UElements...>() + && _TMC<_UElements...>::template + _ImplicitlyMoveConvertibleTuple<_UElements...>() + && (sizeof...(_Elements) >= 1), + bool>::type=true> + constexpr tuple(_UElements&&... __elements) + : _Inherited(std::forward<_UElements>(__elements)...) { } + + template::template + _NotSameTuple<_UElements...>() + && _TMC<_UElements...>::template + _MoveConstructibleTuple<_UElements...>() + && !_TMC<_UElements...>::template + _ImplicitlyMoveConvertibleTuple<_UElements...>() + && (sizeof...(_Elements) >= 1), + bool>::type=false> + explicit constexpr tuple(_UElements&&... __elements) + : _Inherited(std::forward<_UElements>(__elements)...) { } + + constexpr tuple(const tuple&) = default; + + constexpr tuple(tuple&&) = default; + + + + template using _TNTC = + _TC::value && sizeof...(_Elements) == 1, + _Elements...>; + + template::template + _ConstructibleTuple<_UElements...>() + && _TMC<_UElements...>::template + _ImplicitlyConvertibleTuple<_UElements...>() + && _TNTC<_Dummy>::template + _NonNestedTuple&>(), + bool>::type=true> + constexpr tuple(const tuple<_UElements...>& __in) + : _Inherited(static_cast&>(__in)) + { } + + template::template + _ConstructibleTuple<_UElements...>() + && !_TMC<_UElements...>::template + _ImplicitlyConvertibleTuple<_UElements...>() + && _TNTC<_Dummy>::template + _NonNestedTuple&>(), + bool>::type=false> + explicit constexpr tuple(const tuple<_UElements...>& __in) + : _Inherited(static_cast&>(__in)) + { } + + template::template + _MoveConstructibleTuple<_UElements...>() + && _TMC<_UElements...>::template + _ImplicitlyMoveConvertibleTuple<_UElements...>() + && _TNTC<_Dummy>::template + _NonNestedTuple&&>(), + bool>::type=true> + constexpr tuple(tuple<_UElements...>&& __in) + : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { } + + template::template + _MoveConstructibleTuple<_UElements...>() + && !_TMC<_UElements...>::template + _ImplicitlyMoveConvertibleTuple<_UElements...>() + && _TNTC<_Dummy>::template + _NonNestedTuple&&>(), + bool>::type=false> + explicit constexpr tuple(tuple<_UElements...>&& __in) + : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { } + + + + template + tuple(allocator_arg_t __tag, const _Alloc& __a) + : _Inherited(__tag, __a) { } + + template::template + _ConstructibleTuple<_Elements...>() + && _TCC<_Dummy>::template + _ImplicitlyConvertibleTuple<_Elements...>(), + bool>::type=true> + tuple(allocator_arg_t __tag, const _Alloc& __a, + const _Elements&... __elements) + : _Inherited(__tag, __a, __elements...) { } + + template::template + _ConstructibleTuple<_Elements...>() + && !_TCC<_Dummy>::template + _ImplicitlyConvertibleTuple<_Elements...>(), + bool>::type=false> + explicit tuple(allocator_arg_t __tag, const _Alloc& __a, + const _Elements&... __elements) + : _Inherited(__tag, __a, __elements...) { } + + template::template + _MoveConstructibleTuple<_UElements...>() + && _TMC<_UElements...>::template + _ImplicitlyMoveConvertibleTuple<_UElements...>(), + bool>::type=true> + tuple(allocator_arg_t __tag, const _Alloc& __a, + _UElements&&... __elements) + : _Inherited(__tag, __a, std::forward<_UElements>(__elements)...) + { } + + template::template + _MoveConstructibleTuple<_UElements...>() + && !_TMC<_UElements...>::template + _ImplicitlyMoveConvertibleTuple<_UElements...>(), + bool>::type=false> + explicit tuple(allocator_arg_t __tag, const _Alloc& __a, + _UElements&&... __elements) + : _Inherited(__tag, __a, std::forward<_UElements>(__elements)...) + { } + + template + tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in) + : _Inherited(__tag, __a, static_cast(__in)) { } + + template + tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in) + : _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { } + + template::template + _ConstructibleTuple<_UElements...>() + && _TMC<_UElements...>::template + _ImplicitlyConvertibleTuple<_UElements...>(), + bool>::type=true> + tuple(allocator_arg_t __tag, const _Alloc& __a, + const tuple<_UElements...>& __in) + : _Inherited(__tag, __a, + static_cast&>(__in)) + { } + + template::template + _ConstructibleTuple<_UElements...>() + && !_TMC<_UElements...>::template + _ImplicitlyConvertibleTuple<_UElements...>(), + bool>::type=false> + explicit tuple(allocator_arg_t __tag, const _Alloc& __a, + const tuple<_UElements...>& __in) + : _Inherited(__tag, __a, + static_cast&>(__in)) + { } + + template::template + _MoveConstructibleTuple<_UElements...>() + && _TMC<_UElements...>::template + _ImplicitlyMoveConvertibleTuple<_UElements...>(), + bool>::type=true> + tuple(allocator_arg_t __tag, const _Alloc& __a, + tuple<_UElements...>&& __in) + : _Inherited(__tag, __a, + static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) + { } + + template::template + _MoveConstructibleTuple<_UElements...>() + && !_TMC<_UElements...>::template + _ImplicitlyMoveConvertibleTuple<_UElements...>(), + bool>::type=false> + explicit tuple(allocator_arg_t __tag, const _Alloc& __a, + tuple<_UElements...>&& __in) + : _Inherited(__tag, __a, + static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) + { } + + tuple& + operator=(const tuple& __in) + { + static_cast<_Inherited&>(*this) = __in; + return *this; + } + + tuple& + operator=(tuple&& __in) + noexcept(is_nothrow_move_assignable<_Inherited>::value) + { + static_cast<_Inherited&>(*this) = std::move(__in); + return *this; + } + + template::type> + tuple& + operator=(const tuple<_UElements...>& __in) + { + static_cast<_Inherited&>(*this) = __in; + return *this; + } + + template::type> + tuple& + operator=(tuple<_UElements...>&& __in) + { + static_cast<_Inherited&>(*this) = std::move(__in); + return *this; + } + + void + swap(tuple& __in) + noexcept(noexcept(__in._M_swap(__in))) + { _Inherited::_M_swap(__in); } + }; + + + template<> + class tuple<> + { + public: + void swap(tuple&) noexcept { } + }; + + + + template + class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2> + { + typedef _Tuple_impl<0, _T1, _T2> _Inherited; + + public: + template , + __is_implicitly_default_constructible<_U2>> + ::value, bool>::type = true> + + constexpr tuple() + : _Inherited() { } + + template , + is_default_constructible<_U2>, + __not_< + __and_<__is_implicitly_default_constructible<_U1>, + __is_implicitly_default_constructible<_U2>>>> + ::value, bool>::type = false> + + explicit constexpr tuple() + : _Inherited() { } + + + + template using _TCC = + _TC::value, _T1, _T2>; + + template::template + _ConstructibleTuple<_T1, _T2>() + && _TCC<_Dummy>::template + _ImplicitlyConvertibleTuple<_T1, _T2>(), + bool>::type = true> + constexpr tuple(const _T1& __a1, const _T2& __a2) + : _Inherited(__a1, __a2) { } + + template::template + _ConstructibleTuple<_T1, _T2>() + && !_TCC<_Dummy>::template + _ImplicitlyConvertibleTuple<_T1, _T2>(), + bool>::type = false> + explicit constexpr tuple(const _T1& __a1, const _T2& __a2) + : _Inherited(__a1, __a2) { } + + + + using _TMC = _TC; + + template() + && _TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = true> + constexpr tuple(_U1&& __a1, _U2&& __a2) + : _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { } + + template() + && !_TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = false> + explicit constexpr tuple(_U1&& __a1, _U2&& __a2) + : _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { } + + constexpr tuple(const tuple&) = default; + + constexpr tuple(tuple&&) = default; + + template() + && _TMC::template + _ImplicitlyConvertibleTuple<_U1, _U2>(), + bool>::type = true> + constexpr tuple(const tuple<_U1, _U2>& __in) + : _Inherited(static_cast&>(__in)) { } + + template() + && !_TMC::template + _ImplicitlyConvertibleTuple<_U1, _U2>(), + bool>::type = false> + explicit constexpr tuple(const tuple<_U1, _U2>& __in) + : _Inherited(static_cast&>(__in)) { } + + template() + && _TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = true> + constexpr tuple(tuple<_U1, _U2>&& __in) + : _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) { } + + template() + && !_TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = false> + explicit constexpr tuple(tuple<_U1, _U2>&& __in) + : _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) { } + + template() + && _TMC::template + _ImplicitlyConvertibleTuple<_U1, _U2>(), + bool>::type = true> + constexpr tuple(const pair<_U1, _U2>& __in) + : _Inherited(__in.first, __in.second) { } + + template() + && !_TMC::template + _ImplicitlyConvertibleTuple<_U1, _U2>(), + bool>::type = false> + explicit constexpr tuple(const pair<_U1, _U2>& __in) + : _Inherited(__in.first, __in.second) { } + + template() + && _TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = true> + constexpr tuple(pair<_U1, _U2>&& __in) + : _Inherited(std::forward<_U1>(__in.first), + std::forward<_U2>(__in.second)) { } + + template() + && !_TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = false> + explicit constexpr tuple(pair<_U1, _U2>&& __in) + : _Inherited(std::forward<_U1>(__in.first), + std::forward<_U2>(__in.second)) { } + + + + template + tuple(allocator_arg_t __tag, const _Alloc& __a) + : _Inherited(__tag, __a) { } + + template::template + _ConstructibleTuple<_T1, _T2>() + && _TCC<_Dummy>::template + _ImplicitlyConvertibleTuple<_T1, _T2>(), + bool>::type=true> + + tuple(allocator_arg_t __tag, const _Alloc& __a, + const _T1& __a1, const _T2& __a2) + : _Inherited(__tag, __a, __a1, __a2) { } + + template::template + _ConstructibleTuple<_T1, _T2>() + && !_TCC<_Dummy>::template + _ImplicitlyConvertibleTuple<_T1, _T2>(), + bool>::type=false> + + explicit tuple(allocator_arg_t __tag, const _Alloc& __a, + const _T1& __a1, const _T2& __a2) + : _Inherited(__tag, __a, __a1, __a2) { } + + template() + && _TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = true> + tuple(allocator_arg_t __tag, const _Alloc& __a, _U1&& __a1, _U2&& __a2) + : _Inherited(__tag, __a, std::forward<_U1>(__a1), + std::forward<_U2>(__a2)) { } + + template() + && !_TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = false> + explicit tuple(allocator_arg_t __tag, const _Alloc& __a, + _U1&& __a1, _U2&& __a2) + : _Inherited(__tag, __a, std::forward<_U1>(__a1), + std::forward<_U2>(__a2)) { } + + template + tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in) + : _Inherited(__tag, __a, static_cast(__in)) { } + + template + tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in) + : _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { } + + template() + && _TMC::template + _ImplicitlyConvertibleTuple<_U1, _U2>(), + bool>::type = true> + tuple(allocator_arg_t __tag, const _Alloc& __a, + const tuple<_U1, _U2>& __in) + : _Inherited(__tag, __a, + static_cast&>(__in)) + { } + + template() + && !_TMC::template + _ImplicitlyConvertibleTuple<_U1, _U2>(), + bool>::type = false> + explicit tuple(allocator_arg_t __tag, const _Alloc& __a, + const tuple<_U1, _U2>& __in) + : _Inherited(__tag, __a, + static_cast&>(__in)) + { } + + template() + && _TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = true> + tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_U1, _U2>&& __in) + : _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) + { } + + template() + && !_TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = false> + explicit tuple(allocator_arg_t __tag, const _Alloc& __a, + tuple<_U1, _U2>&& __in) + : _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) + { } + + template() + && _TMC::template + _ImplicitlyConvertibleTuple<_U1, _U2>(), + bool>::type = true> + tuple(allocator_arg_t __tag, const _Alloc& __a, + const pair<_U1, _U2>& __in) + : _Inherited(__tag, __a, __in.first, __in.second) { } + + template() + && !_TMC::template + _ImplicitlyConvertibleTuple<_U1, _U2>(), + bool>::type = false> + explicit tuple(allocator_arg_t __tag, const _Alloc& __a, + const pair<_U1, _U2>& __in) + : _Inherited(__tag, __a, __in.first, __in.second) { } + + template() + && _TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = true> + tuple(allocator_arg_t __tag, const _Alloc& __a, pair<_U1, _U2>&& __in) + : _Inherited(__tag, __a, std::forward<_U1>(__in.first), + std::forward<_U2>(__in.second)) { } + + template() + && !_TMC::template + _ImplicitlyMoveConvertibleTuple<_U1, _U2>(), + bool>::type = false> + explicit tuple(allocator_arg_t __tag, const _Alloc& __a, + pair<_U1, _U2>&& __in) + : _Inherited(__tag, __a, std::forward<_U1>(__in.first), + std::forward<_U2>(__in.second)) { } + + tuple& + operator=(const tuple& __in) + { + static_cast<_Inherited&>(*this) = __in; + return *this; + } + + tuple& + operator=(tuple&& __in) + noexcept(is_nothrow_move_assignable<_Inherited>::value) + { + static_cast<_Inherited&>(*this) = std::move(__in); + return *this; + } + + template + tuple& + operator=(const tuple<_U1, _U2>& __in) + { + static_cast<_Inherited&>(*this) = __in; + return *this; + } + + template + tuple& + operator=(tuple<_U1, _U2>&& __in) + { + static_cast<_Inherited&>(*this) = std::move(__in); + return *this; + } + + template + tuple& + operator=(const pair<_U1, _U2>& __in) + { + this->_M_head(*this) = __in.first; + this->_M_tail(*this)._M_head(*this) = __in.second; + return *this; + } + + template + tuple& + operator=(pair<_U1, _U2>&& __in) + { + this->_M_head(*this) = std::forward<_U1>(__in.first); + this->_M_tail(*this)._M_head(*this) = std::forward<_U2>(__in.second); + return *this; + } + + void + swap(tuple& __in) + noexcept(noexcept(__in._M_swap(__in))) + { _Inherited::_M_swap(__in); } + }; + + + + + + + template + struct tuple_element<__i, tuple<_Head, _Tail...> > + : tuple_element<__i - 1, tuple<_Tail...> > { }; + + + + + template + struct tuple_element<0, tuple<_Head, _Tail...> > + { + typedef _Head type; + }; + + + template + struct tuple_size> + : public integral_constant { }; + + template + constexpr _Head& + __get_helper(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept + { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); } + + template + constexpr const _Head& + __get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept + { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); } + + + template + constexpr __tuple_element_t<__i, tuple<_Elements...>>& + get(tuple<_Elements...>& __t) noexcept + { return std::__get_helper<__i>(__t); } + + + template + constexpr const __tuple_element_t<__i, tuple<_Elements...>>& + get(const tuple<_Elements...>& __t) noexcept + { return std::__get_helper<__i>(__t); } + + + template + constexpr __tuple_element_t<__i, tuple<_Elements...>>&& + get(tuple<_Elements...>&& __t) noexcept + { + typedef __tuple_element_t<__i, tuple<_Elements...>> __element_type; + return std::forward<__element_type&&>(std::get<__i>(__t)); + } + + + + + + template + constexpr _Head& + __get_helper2(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept + { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); } + + template + constexpr const _Head& + __get_helper2(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept + { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); } + + + template + constexpr _Tp& + get(tuple<_Types...>& __t) noexcept + { return std::__get_helper2<_Tp>(__t); } + + + template + constexpr _Tp&& + get(tuple<_Types...>&& __t) noexcept + { return std::forward<_Tp&&>(std::__get_helper2<_Tp>(__t)); } + + + template + constexpr const _Tp& + get(const tuple<_Types...>& __t) noexcept + { return std::__get_helper2<_Tp>(__t); } + + + + template + struct __tuple_compare + { + static constexpr bool + __eq(const _Tp& __t, const _Up& __u) + { + return bool(std::get<__i>(__t) == std::get<__i>(__u)) + && __tuple_compare<_Tp, _Up, __i + 1, __size>::__eq(__t, __u); + } + + static constexpr bool + __less(const _Tp& __t, const _Up& __u) + { + return bool(std::get<__i>(__t) < std::get<__i>(__u)) + || (!bool(std::get<__i>(__u) < std::get<__i>(__t)) + && __tuple_compare<_Tp, _Up, __i + 1, __size>::__less(__t, __u)); + } + }; + + template + struct __tuple_compare<_Tp, _Up, __size, __size> + { + static constexpr bool + __eq(const _Tp&, const _Up&) { return true; } + + static constexpr bool + __less(const _Tp&, const _Up&) { return false; } + }; + + template + constexpr bool + operator==(const tuple<_TElements...>& __t, + const tuple<_UElements...>& __u) + { + static_assert(sizeof...(_TElements) == sizeof...(_UElements), + "tuple objects can only be compared if they have equal sizes."); + using __compare = __tuple_compare, + tuple<_UElements...>, + 0, sizeof...(_TElements)>; + return __compare::__eq(__t, __u); + } + + template + constexpr bool + operator<(const tuple<_TElements...>& __t, + const tuple<_UElements...>& __u) + { + static_assert(sizeof...(_TElements) == sizeof...(_UElements), + "tuple objects can only be compared if they have equal sizes."); + using __compare = __tuple_compare, + tuple<_UElements...>, + 0, sizeof...(_TElements)>; + return __compare::__less(__t, __u); + } + + template + constexpr bool + operator!=(const tuple<_TElements...>& __t, + const tuple<_UElements...>& __u) + { return !(__t == __u); } + + template + constexpr bool + operator>(const tuple<_TElements...>& __t, + const tuple<_UElements...>& __u) + { return __u < __t; } + + template + constexpr bool + operator<=(const tuple<_TElements...>& __t, + const tuple<_UElements...>& __u) + { return !(__u < __t); } + + template + constexpr bool + operator>=(const tuple<_TElements...>& __t, + const tuple<_UElements...>& __u) + { return !(__t < __u); } + + + template + constexpr tuple::__type...> + make_tuple(_Elements&&... __args) + { + typedef tuple::__type...> + __result_type; + return __result_type(std::forward<_Elements>(__args)...); + } + + + + template + constexpr tuple<_Elements&&...> + forward_as_tuple(_Elements&&... __args) noexcept + { return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); } + + template + struct __is_tuple_like_impl> : true_type + { }; + + + template + struct __is_tuple_like + : public __is_tuple_like_impl::type>::type>::type + { }; + + template + struct __make_tuple_impl; + + template + struct __make_tuple_impl<_Idx, tuple<_Tp...>, _Tuple, _Nm> + : __make_tuple_impl<_Idx + 1, + tuple<_Tp..., __tuple_element_t<_Idx, _Tuple>>, + _Tuple, _Nm> + { }; + + template + struct __make_tuple_impl<_Nm, tuple<_Tp...>, _Tuple, _Nm> + { + typedef tuple<_Tp...> __type; + }; + + template + struct __do_make_tuple + : __make_tuple_impl<0, tuple<>, _Tuple, std::tuple_size<_Tuple>::value> + { }; + + + template + struct __make_tuple + : public __do_make_tuple::type>::type> + { }; + + + template + struct __combine_tuples; + + template<> + struct __combine_tuples<> + { + typedef tuple<> __type; + }; + + template + struct __combine_tuples> + { + typedef tuple<_Ts...> __type; + }; + + template + struct __combine_tuples, tuple<_T2s...>, _Rem...> + { + typedef typename __combine_tuples, + _Rem...>::__type __type; + }; + + + template + struct __tuple_cat_result + { + typedef typename __combine_tuples + ::__type...>::__type __type; + }; + + + + template + struct __make_1st_indices; + + template<> + struct __make_1st_indices<> + { + typedef std::_Index_tuple<> __type; + }; + + template + struct __make_1st_indices<_Tp, _Tpls...> + { + typedef typename std::_Build_index_tuple::type>::value>::__type __type; + }; + + + + + template + struct __tuple_concater; + + template + struct __tuple_concater<_Ret, std::_Index_tuple<_Is...>, _Tp, _Tpls...> + { + template + static constexpr _Ret + _S_do(_Tp&& __tp, _Tpls&&... __tps, _Us&&... __us) + { + typedef typename __make_1st_indices<_Tpls...>::__type __idx; + typedef __tuple_concater<_Ret, __idx, _Tpls...> __next; + return __next::_S_do(std::forward<_Tpls>(__tps)..., + std::forward<_Us>(__us)..., + std::get<_Is>(std::forward<_Tp>(__tp))...); + } + }; + + template + struct __tuple_concater<_Ret, std::_Index_tuple<>> + { + template + static constexpr _Ret + _S_do(_Us&&... __us) + { + return _Ret(std::forward<_Us>(__us)...); + } + }; + + + template...>::value>::type> + constexpr auto + tuple_cat(_Tpls&&... __tpls) + -> typename __tuple_cat_result<_Tpls...>::__type + { + typedef typename __tuple_cat_result<_Tpls...>::__type __ret; + typedef typename __make_1st_indices<_Tpls...>::__type __idx; + typedef __tuple_concater<__ret, __idx, _Tpls...> __concater; + return __concater::_S_do(std::forward<_Tpls>(__tpls)...); + } + + + + + template + constexpr tuple<_Elements&...> + tie(_Elements&... __args) noexcept + { return tuple<_Elements&...>(__args...); } + + + template + inline void + swap(tuple<_Elements...>& __x, tuple<_Elements...>& __y) + noexcept(noexcept(__x.swap(__y))) + { __x.swap(__y); } + + + + struct _Swallow_assign + { + template + const _Swallow_assign& + operator=(const _Tp&) const + { return *this; } + }; + + const _Swallow_assign ignore{}; + + + template + struct uses_allocator, _Alloc> : true_type { }; + + + template + template + inline + pair<_T1, _T2>:: + pair(piecewise_construct_t, + tuple<_Args1...> __first, tuple<_Args2...> __second) + : pair(__first, __second, + typename _Build_index_tuple::__type(), + typename _Build_index_tuple::__type()) + { } + + template + template + inline + pair<_T1, _T2>:: + pair(tuple<_Args1...>& __tuple1, tuple<_Args2...>& __tuple2, + _Index_tuple<_Indexes1...>, _Index_tuple<_Indexes2...>) + : first(std::forward<_Args1>(std::get<_Indexes1>(__tuple1))...), + second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...) + { } + + + + +} +# 56 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 2 3 + + + + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + + + template + class _Mem_fn; + template + _Mem_fn<_Tp _Class::*> + mem_fn(_Tp _Class::*) noexcept; + + + template> + struct _Maybe_get_result_type + { }; + + template + struct _Maybe_get_result_type<_Functor, + __void_t> + { typedef typename _Functor::result_type result_type; }; + + + + + + template + struct _Weak_result_type_impl + : _Maybe_get_result_type<_Functor> + { }; + + + template + struct _Weak_result_type_impl<_Res(_ArgTypes...)> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes......)> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes...) const> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes......) const> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes...) volatile> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes......) volatile> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes...) const volatile> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(_ArgTypes......) const volatile> + { typedef _Res result_type; }; + + + template + struct _Weak_result_type_impl<_Res(&)(_ArgTypes...)> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(&)(_ArgTypes......)> + { typedef _Res result_type; }; + + + template + struct _Weak_result_type_impl<_Res(*)(_ArgTypes...)> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res(*)(_ArgTypes......)> + { typedef _Res result_type; }; + + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......)> + { typedef _Res result_type; }; + + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) const> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) const> + { typedef _Res result_type; }; + + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) volatile> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) volatile> + { typedef _Res result_type; }; + + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) + const volatile> + { typedef _Res result_type; }; + + template + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) + const volatile> + { typedef _Res result_type; }; + + + + + + template + struct _Weak_result_type + : _Weak_result_type_impl::type> + { }; + + template::type> + struct __inv_unwrap + { + using type = _Tp; + }; + + template + struct __inv_unwrap<_Tp, reference_wrapper<_Up>> + { + using type = _Up&; + }; + + + + template::type> + inline _Up&& + __invfwd(typename remove_reference<_Tp>::type& __t) noexcept + { return static_cast<_Up&&>(__t); } + + template + inline _Res + __invoke_impl(__invoke_other, _Fn&& __f, _Args&&... __args) + noexcept(noexcept(std::forward<_Fn>(__f)(std::forward<_Args>(__args)...))) + { return std::forward<_Fn>(__f)(std::forward<_Args>(__args)...); } + + template + inline _Res + __invoke_impl(__invoke_memfun_ref, _MemFun&& __f, _Tp&& __t, + _Args&&... __args) + noexcept(noexcept( + (__invfwd<_Tp>(__t).*__f)(std::forward<_Args>(__args)...))) + { return (__invfwd<_Tp>(__t).*__f)(std::forward<_Args>(__args)...); } + + template + inline _Res + __invoke_impl(__invoke_memfun_deref, _MemFun&& __f, _Tp&& __t, + _Args&&... __args) + noexcept(noexcept( + ((*std::forward<_Tp>(__t)).*__f)(std::forward<_Args>(__args)...))) + { + return ((*std::forward<_Tp>(__t)).*__f)(std::forward<_Args>(__args)...); + } + + template + inline _Res + __invoke_impl(__invoke_memobj_ref, _MemPtr&& __f, _Tp&& __t) + noexcept(noexcept(__invfwd<_Tp>(__t).*__f)) + { return __invfwd<_Tp>(__t).*__f; } + + template + inline _Res + __invoke_impl(__invoke_memobj_deref, _MemPtr&& __f, _Tp&& __t) + noexcept(noexcept((*std::forward<_Tp>(__t)).*__f)) + { return (*std::forward<_Tp>(__t)).*__f; } + + + template + inline typename result_of<_Callable&&(_Args&&...)>::type + __invoke(_Callable&& __fn, _Args&&... __args) + { + using __result_of = result_of<_Callable&&(_Args&&...)>; + using __type = typename __result_of::type; + using __tag = typename __result_of::__invoke_type; + return std::__invoke_impl<__type>(__tag{}, std::forward<_Callable>(__fn), + std::forward<_Args>(__args)...); + } +# 272 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template + struct _Reference_wrapper_base_impl; + + + template + struct _Reference_wrapper_base_impl + : _Weak_result_type<_Tp> + { }; + + + template + struct _Reference_wrapper_base_impl + : _Weak_result_type<_Tp> + { + typedef typename _Tp::argument_type argument_type; + }; + + + template + struct _Reference_wrapper_base_impl + : _Weak_result_type<_Tp> + { + typedef typename _Tp::first_argument_type first_argument_type; + typedef typename _Tp::second_argument_type second_argument_type; + }; + + + template + struct _Reference_wrapper_base_impl + : _Weak_result_type<_Tp> + { + typedef typename _Tp::argument_type argument_type; + typedef typename _Tp::first_argument_type first_argument_type; + typedef typename _Tp::second_argument_type second_argument_type; + }; + + template> struct __has_argument_type : false_type { }; template struct __has_argument_type<_Tp, __void_t> : true_type { }; + template> struct __has_first_argument_type : false_type { }; template struct __has_first_argument_type<_Tp, __void_t> : true_type { }; + template> struct __has_second_argument_type : false_type { }; template struct __has_second_argument_type<_Tp, __void_t> : true_type { }; + + + + + + + + template + struct _Reference_wrapper_base + : _Reference_wrapper_base_impl< + __has_argument_type<_Tp>::value, + __has_first_argument_type<_Tp>::value + && __has_second_argument_type<_Tp>::value, + _Tp> + { }; + + + template + struct _Reference_wrapper_base<_Res(_T1)> + : unary_function<_T1, _Res> + { }; + + template + struct _Reference_wrapper_base<_Res(_T1) const> + : unary_function<_T1, _Res> + { }; + + template + struct _Reference_wrapper_base<_Res(_T1) volatile> + : unary_function<_T1, _Res> + { }; + + template + struct _Reference_wrapper_base<_Res(_T1) const volatile> + : unary_function<_T1, _Res> + { }; + + + template + struct _Reference_wrapper_base<_Res(_T1, _T2)> + : binary_function<_T1, _T2, _Res> + { }; + + template + struct _Reference_wrapper_base<_Res(_T1, _T2) const> + : binary_function<_T1, _T2, _Res> + { }; + + template + struct _Reference_wrapper_base<_Res(_T1, _T2) volatile> + : binary_function<_T1, _T2, _Res> + { }; + + template + struct _Reference_wrapper_base<_Res(_T1, _T2) const volatile> + : binary_function<_T1, _T2, _Res> + { }; + + + template + struct _Reference_wrapper_base<_Res(*)(_T1)> + : unary_function<_T1, _Res> + { }; + + + template + struct _Reference_wrapper_base<_Res(*)(_T1, _T2)> + : binary_function<_T1, _T2, _Res> + { }; + + + template + struct _Reference_wrapper_base<_Res (_T1::*)()> + : unary_function<_T1*, _Res> + { }; + + + template + struct _Reference_wrapper_base<_Res (_T1::*)(_T2)> + : binary_function<_T1*, _T2, _Res> + { }; + + + template + struct _Reference_wrapper_base<_Res (_T1::*)() const> + : unary_function + { }; + + + template + struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const> + : binary_function + { }; + + + template + struct _Reference_wrapper_base<_Res (_T1::*)() volatile> + : unary_function + { }; + + + template + struct _Reference_wrapper_base<_Res (_T1::*)(_T2) volatile> + : binary_function + { }; + + + template + struct _Reference_wrapper_base<_Res (_T1::*)() const volatile> + : unary_function + { }; + + + template + struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const volatile> + : binary_function + { }; + + + + + + + template + class reference_wrapper + : public _Reference_wrapper_base::type> + { + _Tp* _M_data; + + public: + typedef _Tp type; + + reference_wrapper(_Tp& __indata) noexcept + : _M_data(std::__addressof(__indata)) + { } + + reference_wrapper(_Tp&&) = delete; + + reference_wrapper(const reference_wrapper&) = default; + + reference_wrapper& + operator=(const reference_wrapper&) = default; + + operator _Tp&() const noexcept + { return this->get(); } + + _Tp& + get() const noexcept + { return *_M_data; } + + template + typename result_of<_Tp&(_Args&&...)>::type + operator()(_Args&&... __args) const + { + return std::__invoke(get(), std::forward<_Args>(__args)...); + } + }; + + + + template + inline reference_wrapper<_Tp> + ref(_Tp& __t) noexcept + { return reference_wrapper<_Tp>(__t); } + + + template + inline reference_wrapper + cref(const _Tp& __t) noexcept + { return reference_wrapper(__t); } + + template + void ref(const _Tp&&) = delete; + + template + void cref(const _Tp&&) = delete; + + + template + inline reference_wrapper<_Tp> + ref(reference_wrapper<_Tp> __t) noexcept + { return ref(__t.get()); } + + + template + inline reference_wrapper + cref(reference_wrapper<_Tp> __t) noexcept + { return cref(__t.get()); } + + + + template + struct _Pack : integral_constant + { }; + + template + struct _AllConvertible : false_type + { }; + + template + struct _AllConvertible<_Pack<_From...>, _Pack<_To...>, true> + : __and_...> + { }; + + template + using _NotSame = __not_::type, + typename std::decay<_Tp2>::type>>; + + + + + + + template + struct _Maybe_unary_or_binary_function { }; + + + template + struct _Maybe_unary_or_binary_function<_Res, _T1> + : std::unary_function<_T1, _Res> { }; + + + template + struct _Maybe_unary_or_binary_function<_Res, _T1, _T2> + : std::binary_function<_T1, _T2, _Res> { }; + + template + struct _Mem_fn_traits; + + template + struct _Mem_fn_traits_base + { + using __result_type = _Res; + using __maybe_type + = _Maybe_unary_or_binary_function<_Res, _Class*, _ArgTypes...>; + using __arity = integral_constant; + }; +# 569 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 +template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) > : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) > : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = true_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const > : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const > : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = true_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) volatile > : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) volatile > : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = true_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const volatile > : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const volatile > : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = true_type; }; +template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) &> : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) &> : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = true_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const &> : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const &> : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = true_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) volatile &> : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) volatile &> : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = true_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const volatile &> : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const volatile &> : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = true_type; }; +template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) &&> : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) &&> : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = true_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const &&> : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const &&> : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = true_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) volatile &&> : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) volatile &&> : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = true_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const volatile &&> : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const volatile &&> : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = true_type; }; + + + + + template::value> + class _Mem_fn_base + : public _Mem_fn_traits<_MemFunPtr>::__maybe_type + { + using _Traits = _Mem_fn_traits<_MemFunPtr>; + + using _Arity = typename _Traits::__arity; + using _Varargs = typename _Traits::__vararg; + + template + friend struct _Bind_check_arity; + + _MemFunPtr _M_pmf; + + public: + + using result_type = typename _Traits::__result_type; + + explicit constexpr + _Mem_fn_base(_MemFunPtr __pmf) noexcept : _M_pmf(__pmf) { } + + template + auto + operator()(_Args&&... __args) const + noexcept(noexcept( + std::__invoke(_M_pmf, std::forward<_Args>(__args)...))) + -> decltype(std::__invoke(_M_pmf, std::forward<_Args>(__args)...)) + { return std::__invoke(_M_pmf, std::forward<_Args>(__args)...); } + }; + + + template + class _Mem_fn_base<_MemObjPtr, false> + { + using _Arity = integral_constant; + using _Varargs = false_type; + + template + friend struct _Bind_check_arity; + + _MemObjPtr _M_pm; + + public: + explicit constexpr + _Mem_fn_base(_MemObjPtr __pm) noexcept : _M_pm(__pm) { } + + template + auto + operator()(_Tp&& __obj) const + noexcept(noexcept(std::__invoke(_M_pm, std::forward<_Tp>(__obj)))) + -> decltype(std::__invoke(_M_pm, std::forward<_Tp>(__obj))) + { return std::__invoke(_M_pm, std::forward<_Tp>(__obj)); } + }; + + template + struct _Mem_fn<_Res _Class::*> + : _Mem_fn_base<_Res _Class::*> + { + using _Mem_fn_base<_Res _Class::*>::_Mem_fn_base; + }; +# 645 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template + inline _Mem_fn<_Tp _Class::*> + mem_fn(_Tp _Class::* __pm) noexcept + { + return _Mem_fn<_Tp _Class::*>(__pm); + } +# 660 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template + struct is_bind_expression + : public false_type { }; +# 671 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template + struct is_placeholder + : public integral_constant + { }; + + + + + template struct _Placeholder { }; + + + + + + + + namespace placeholders + { + + + + + + extern const _Placeholder<1> _1; + extern const _Placeholder<2> _2; + extern const _Placeholder<3> _3; + extern const _Placeholder<4> _4; + extern const _Placeholder<5> _5; + extern const _Placeholder<6> _6; + extern const _Placeholder<7> _7; + extern const _Placeholder<8> _8; + extern const _Placeholder<9> _9; + extern const _Placeholder<10> _10; + extern const _Placeholder<11> _11; + extern const _Placeholder<12> _12; + extern const _Placeholder<13> _13; + extern const _Placeholder<14> _14; + extern const _Placeholder<15> _15; + extern const _Placeholder<16> _16; + extern const _Placeholder<17> _17; + extern const _Placeholder<18> _18; + extern const _Placeholder<19> _19; + extern const _Placeholder<20> _20; + extern const _Placeholder<21> _21; + extern const _Placeholder<22> _22; + extern const _Placeholder<23> _23; + extern const _Placeholder<24> _24; + extern const _Placeholder<25> _25; + extern const _Placeholder<26> _26; + extern const _Placeholder<27> _27; + extern const _Placeholder<28> _28; + extern const _Placeholder<29> _29; + + } +# 733 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template + struct is_placeholder<_Placeholder<_Num> > + : public integral_constant + { }; + + template + struct is_placeholder > + : public integral_constant + { }; + + + + template + using _Safe_tuple_element_t + = typename enable_if<(__i < tuple_size<_Tuple>::value), + tuple_element<__i, _Tuple>>::type::type; +# 761 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template::value, + bool _IsPlaceholder = (is_placeholder<_Arg>::value > 0)> + class _Mu; + + + + + + + template + class _Mu, false, false> + { + public: + + + + + template + _Tp& + operator()(_CVRef& __arg, _Tuple&) const volatile + { return __arg.get(); } + }; + + + + + + + + template + class _Mu<_Arg, true, false> + { + public: + template + auto + operator()(_CVArg& __arg, + tuple<_Args...>& __tuple) const volatile + -> decltype(__arg(declval<_Args>()...)) + { + + typedef typename _Build_index_tuple::__type + _Indexes; + return this->__call(__arg, __tuple, _Indexes()); + } + + private: + + + template + auto + __call(_CVArg& __arg, tuple<_Args...>& __tuple, + const _Index_tuple<_Indexes...>&) const volatile + -> decltype(__arg(declval<_Args>()...)) + { + return __arg(std::forward<_Args>(std::get<_Indexes>(__tuple))...); + } + }; + + + + + + + template + class _Mu<_Arg, false, true> + { + public: + template + _Safe_tuple_element_t<(is_placeholder<_Arg>::value - 1), _Tuple>&& + operator()(const volatile _Arg&, _Tuple& __tuple) const volatile + { + using __type + = __tuple_element_t<(is_placeholder<_Arg>::value - 1), _Tuple>; + return std::forward<__type>( + ::std::get<(is_placeholder<_Arg>::value - 1)>(__tuple)); + } + }; + + + + + + + template + class _Mu<_Arg, false, false> + { + public: + template + _CVArg&& + operator()(_CVArg&& __arg, _Tuple&) const volatile + { return std::forward<_CVArg>(__arg); } + }; + + + + + + + template + struct _Maybe_wrap_member_pointer + { + typedef _Tp type; + + static constexpr const _Tp& + __do_wrap(const _Tp& __x) + { return __x; } + + static constexpr _Tp&& + __do_wrap(_Tp&& __x) + { return static_cast<_Tp&&>(__x); } + }; + + + + + + + template + struct _Maybe_wrap_member_pointer<_Tp _Class::*> + { + typedef _Mem_fn<_Tp _Class::*> type; + + static constexpr type + __do_wrap(_Tp _Class::* __pm) + { return type(__pm); } + }; + + + + + + template<> + struct _Maybe_wrap_member_pointer + { + typedef void type; + }; + + + template + inline auto + __volget(volatile tuple<_Tp...>& __tuple) + -> __tuple_element_t<_Ind, tuple<_Tp...>> volatile& + { return std::get<_Ind>(const_cast&>(__tuple)); } + + + template + inline auto + __volget(const volatile tuple<_Tp...>& __tuple) + -> __tuple_element_t<_Ind, tuple<_Tp...>> const volatile& + { return std::get<_Ind>(const_cast&>(__tuple)); } + + + template + struct _Bind; + + template + class _Bind<_Functor(_Bound_args...)> + : public _Weak_result_type<_Functor> + { + typedef _Bind __self_type; + typedef typename _Build_index_tuple::__type + _Bound_indexes; + + _Functor _M_f; + tuple<_Bound_args...> _M_bound_args; + + + template + _Result + __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>) + { + return _M_f(_Mu<_Bound_args>() + (std::get<_Indexes>(_M_bound_args), __args)...); + } + + + template + _Result + __call_c(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>) const + { + return _M_f(_Mu<_Bound_args>() + (std::get<_Indexes>(_M_bound_args), __args)...); + } + + + template + _Result + __call_v(tuple<_Args...>&& __args, + _Index_tuple<_Indexes...>) volatile + { + return _M_f(_Mu<_Bound_args>() + (__volget<_Indexes>(_M_bound_args), __args)...); + } + + + template + _Result + __call_c_v(tuple<_Args...>&& __args, + _Index_tuple<_Indexes...>) const volatile + { + return _M_f(_Mu<_Bound_args>() + (__volget<_Indexes>(_M_bound_args), __args)...); + } + + public: + template + explicit _Bind(const _Functor& __f, _Args&&... __args) + : _M_f(__f), _M_bound_args(std::forward<_Args>(__args)...) + { } + + template + explicit _Bind(_Functor&& __f, _Args&&... __args) + : _M_f(std::move(__f)), _M_bound_args(std::forward<_Args>(__args)...) + { } + + _Bind(const _Bind&) = default; + + _Bind(_Bind&& __b) + : _M_f(std::move(__b._M_f)), _M_bound_args(std::move(__b._M_bound_args)) + { } + + + template()( + _Mu<_Bound_args>()( std::declval<_Bound_args&>(), + std::declval&>() )... ) )> + _Result + operator()(_Args&&... __args) + { + return this->__call<_Result>( + std::forward_as_tuple(std::forward<_Args>(__args)...), + _Bound_indexes()); + } + + + template= 0), + typename add_const<_Functor>::type&>::type>()( + _Mu<_Bound_args>()( std::declval(), + std::declval&>() )... ) )> + _Result + operator()(_Args&&... __args) const + { + return this->__call_c<_Result>( + std::forward_as_tuple(std::forward<_Args>(__args)...), + _Bound_indexes()); + } + + + template= 0), + typename add_volatile<_Functor>::type&>::type>()( + _Mu<_Bound_args>()( std::declval(), + std::declval&>() )... ) )> + _Result + operator()(_Args&&... __args) volatile + { + return this->__call_v<_Result>( + std::forward_as_tuple(std::forward<_Args>(__args)...), + _Bound_indexes()); + } + + + template= 0), + typename add_cv<_Functor>::type&>::type>()( + _Mu<_Bound_args>()( std::declval(), + std::declval&>() )... ) )> + _Result + operator()(_Args&&... __args) const volatile + { + return this->__call_c_v<_Result>( + std::forward_as_tuple(std::forward<_Args>(__args)...), + _Bound_indexes()); + } + }; + + + template + struct _Bind_result; + + template + class _Bind_result<_Result, _Functor(_Bound_args...)> + { + typedef _Bind_result __self_type; + typedef typename _Build_index_tuple::__type + _Bound_indexes; + + _Functor _M_f; + tuple<_Bound_args...> _M_bound_args; + + + template + struct __enable_if_void : enable_if::value, int> { }; + template + struct __disable_if_void : enable_if::value, int> { }; + + + template + _Result + __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>, + typename __disable_if_void<_Res>::type = 0) + { + return _M_f(_Mu<_Bound_args>() + (std::get<_Indexes>(_M_bound_args), __args)...); + } + + + template + void + __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>, + typename __enable_if_void<_Res>::type = 0) + { + _M_f(_Mu<_Bound_args>() + (std::get<_Indexes>(_M_bound_args), __args)...); + } + + + template + _Result + __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>, + typename __disable_if_void<_Res>::type = 0) const + { + return _M_f(_Mu<_Bound_args>() + (std::get<_Indexes>(_M_bound_args), __args)...); + } + + + template + void + __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>, + typename __enable_if_void<_Res>::type = 0) const + { + _M_f(_Mu<_Bound_args>() + (std::get<_Indexes>(_M_bound_args), __args)...); + } + + + template + _Result + __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>, + typename __disable_if_void<_Res>::type = 0) volatile + { + return _M_f(_Mu<_Bound_args>() + (__volget<_Indexes>(_M_bound_args), __args)...); + } + + + template + void + __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>, + typename __enable_if_void<_Res>::type = 0) volatile + { + _M_f(_Mu<_Bound_args>() + (__volget<_Indexes>(_M_bound_args), __args)...); + } + + + template + _Result + __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>, + typename __disable_if_void<_Res>::type = 0) const volatile + { + return _M_f(_Mu<_Bound_args>() + (__volget<_Indexes>(_M_bound_args), __args)...); + } + + + template + void + __call(tuple<_Args...>&& __args, + _Index_tuple<_Indexes...>, + typename __enable_if_void<_Res>::type = 0) const volatile + { + _M_f(_Mu<_Bound_args>() + (__volget<_Indexes>(_M_bound_args), __args)...); + } + + public: + typedef _Result result_type; + + template + explicit _Bind_result(const _Functor& __f, _Args&&... __args) + : _M_f(__f), _M_bound_args(std::forward<_Args>(__args)...) + { } + + template + explicit _Bind_result(_Functor&& __f, _Args&&... __args) + : _M_f(std::move(__f)), _M_bound_args(std::forward<_Args>(__args)...) + { } + + _Bind_result(const _Bind_result&) = default; + + _Bind_result(_Bind_result&& __b) + : _M_f(std::move(__b._M_f)), _M_bound_args(std::move(__b._M_bound_args)) + { } + + + template + result_type + operator()(_Args&&... __args) + { + return this->__call<_Result>( + std::forward_as_tuple(std::forward<_Args>(__args)...), + _Bound_indexes()); + } + + + template + result_type + operator()(_Args&&... __args) const + { + return this->__call<_Result>( + std::forward_as_tuple(std::forward<_Args>(__args)...), + _Bound_indexes()); + } + + + template + result_type + operator()(_Args&&... __args) volatile + { + return this->__call<_Result>( + std::forward_as_tuple(std::forward<_Args>(__args)...), + _Bound_indexes()); + } + + + template + result_type + operator()(_Args&&... __args) const volatile + { + return this->__call<_Result>( + std::forward_as_tuple(std::forward<_Args>(__args)...), + _Bound_indexes()); + } + }; + + + + + + template + struct is_bind_expression<_Bind<_Signature> > + : public true_type { }; + + + + + + template + struct is_bind_expression > + : public true_type { }; + + + + + + template + struct is_bind_expression > + : public true_type { }; + + + + + + template + struct is_bind_expression> + : public true_type { }; + + + + + + template + struct is_bind_expression<_Bind_result<_Result, _Signature>> + : public true_type { }; + + + + + + template + struct is_bind_expression> + : public true_type { }; + + + + + + template + struct is_bind_expression> + : public true_type { }; + + + + + + template + struct is_bind_expression> + : public true_type { }; + + template + struct _Bind_check_arity { }; + + template + struct _Bind_check_arity<_Ret (*)(_Args...), _BoundArgs...> + { + static_assert(sizeof...(_BoundArgs) == sizeof...(_Args), + "Wrong number of arguments for function"); + }; + + template + struct _Bind_check_arity<_Ret (*)(_Args......), _BoundArgs...> + { + static_assert(sizeof...(_BoundArgs) >= sizeof...(_Args), + "Wrong number of arguments for function"); + }; + + template + struct _Bind_check_arity<_Tp _Class::*, _BoundArgs...> + { + using _Arity = typename _Mem_fn<_Tp _Class::*>::_Arity; + using _Varargs = typename _Mem_fn<_Tp _Class::*>::_Varargs; + static_assert(_Varargs::value + ? sizeof...(_BoundArgs) >= _Arity::value + 1 + : sizeof...(_BoundArgs) == _Arity::value + 1, + "Wrong number of arguments for pointer-to-member"); + }; + + + + + template::type> + using __is_socketlike = __or_, is_enum<_Tp2>>; + + template + struct _Bind_helper + : _Bind_check_arity::type, _BoundArgs...> + { + typedef _Maybe_wrap_member_pointer::type> + __maybe_type; + typedef typename __maybe_type::type __func_type; + typedef _Bind<__func_type(typename decay<_BoundArgs>::type...)> type; + }; + + + + + template + struct _Bind_helper + { }; + + + + + + template + inline typename + _Bind_helper<__is_socketlike<_Func>::value, _Func, _BoundArgs...>::type + bind(_Func&& __f, _BoundArgs&&... __args) + { + typedef _Bind_helper __helper_type; + typedef typename __helper_type::__maybe_type __maybe_type; + typedef typename __helper_type::type __result_type; + return __result_type(__maybe_type::__do_wrap(std::forward<_Func>(__f)), + std::forward<_BoundArgs>(__args)...); + } + + template + struct _Bindres_helper + : _Bind_check_arity::type, _BoundArgs...> + { + typedef _Maybe_wrap_member_pointer::type> + __maybe_type; + typedef typename __maybe_type::type __functor_type; + typedef _Bind_result<_Result, + __functor_type(typename decay<_BoundArgs>::type...)> + type; + }; + + + + + + template + inline + typename _Bindres_helper<_Result, _Func, _BoundArgs...>::type + bind(_Func&& __f, _BoundArgs&&... __args) + { + typedef _Bindres_helper<_Result, _Func, _BoundArgs...> __helper_type; + typedef typename __helper_type::__maybe_type __maybe_type; + typedef typename __helper_type::type __result_type; + return __result_type(__maybe_type::__do_wrap(std::forward<_Func>(__f)), + std::forward<_BoundArgs>(__args)...); + } + + template + struct _Bind_simple; + + template + struct _Bind_simple<_Callable(_Args...)> + { + typedef typename result_of<_Callable(_Args...)>::type result_type; + + template + explicit + _Bind_simple(_Tp&& __f, _Up&&... __args) + : _M_bound(std::forward<_Tp>(__f), std::forward<_Up>(__args)...) + { } + + _Bind_simple(const _Bind_simple&) = default; + _Bind_simple(_Bind_simple&&) = default; + + result_type + operator()() + { + typedef typename _Build_index_tuple::__type _Indices; + return _M_invoke(_Indices()); + } + + private: + template + typename result_of<_Callable(_Args...)>::type + _M_invoke(_Index_tuple<_Indices...>) + { + + + return std::forward<_Callable>(std::get<0>(_M_bound))( + std::forward<_Args>(std::get<_Indices+1>(_M_bound))...); + } + + std::tuple<_Callable, _Args...> _M_bound; + }; + + template + struct _Bind_simple_helper + : _Bind_check_arity::type, _BoundArgs...> + { + typedef _Maybe_wrap_member_pointer::type> + __maybe_type; + typedef typename __maybe_type::type __func_type; + typedef _Bind_simple<__func_type(typename decay<_BoundArgs>::type...)> + __type; + }; + + + + template + typename _Bind_simple_helper<_Callable, _Args...>::__type + __bind_simple(_Callable&& __callable, _Args&&... __args) + { + typedef _Bind_simple_helper<_Callable, _Args...> __helper_type; + typedef typename __helper_type::__maybe_type __maybe_type; + typedef typename __helper_type::__type __result_type; + return __result_type( + __maybe_type::__do_wrap( std::forward<_Callable>(__callable)), + std::forward<_Args>(__args)...); + } + + + + + + + class bad_function_call : public std::exception + { + public: + virtual ~bad_function_call() noexcept; + + const char* what() const noexcept; + }; + + + + + + + + template + struct __is_location_invariant + : is_trivially_copyable<_Tp>::type + { }; + + class _Undefined_class; + + union _Nocopy_types + { + void* _M_object; + const void* _M_const_object; + void (*_M_function_pointer)(); + void (_Undefined_class::*_M_member_pointer)(); + }; + + union [[gnu::may_alias]] _Any_data + { + void* _M_access() { return &_M_pod_data[0]; } + const void* _M_access() const { return &_M_pod_data[0]; } + + template + _Tp& + _M_access() + { return *static_cast<_Tp*>(_M_access()); } + + template + const _Tp& + _M_access() const + { return *static_cast(_M_access()); } + + _Nocopy_types _M_unused; + char _M_pod_data[sizeof(_Nocopy_types)]; + }; + + enum _Manager_operation + { + __get_type_info, + __get_functor_ptr, + __clone_functor, + __destroy_functor + }; + + + + template + struct _Simple_type_wrapper + { + _Simple_type_wrapper(_Tp __value) : __value(__value) { } + + _Tp __value; + }; + + template + struct __is_location_invariant<_Simple_type_wrapper<_Tp> > + : __is_location_invariant<_Tp> + { }; + + + + template + inline _Functor& + __callable_functor(_Functor& __f) + { return __f; } + + template + inline _Mem_fn<_Member _Class::*> + __callable_functor(_Member _Class::* &__p) + { return std::mem_fn(__p); } + + template + inline _Mem_fn<_Member _Class::*> + __callable_functor(_Member _Class::* const &__p) + { return std::mem_fn(__p); } + + template + inline _Mem_fn<_Member _Class::*> + __callable_functor(_Member _Class::* volatile &__p) + { return std::mem_fn(__p); } + + template + inline _Mem_fn<_Member _Class::*> + __callable_functor(_Member _Class::* const volatile &__p) + { return std::mem_fn(__p); } + + template + class function; + + + class _Function_base + { + public: + static const std::size_t _M_max_size = sizeof(_Nocopy_types); + static const std::size_t _M_max_align = __alignof__(_Nocopy_types); + + template + class _Base_manager + { + protected: + static const bool __stored_locally = + (__is_location_invariant<_Functor>::value + && sizeof(_Functor) <= _M_max_size + && __alignof__(_Functor) <= _M_max_align + && (_M_max_align % __alignof__(_Functor) == 0)); + + typedef integral_constant _Local_storage; + + + static _Functor* + _M_get_pointer(const _Any_data& __source) + { + const _Functor* __ptr = + __stored_locally? std::__addressof(__source._M_access<_Functor>()) + : __source._M_access<_Functor*>(); + return const_cast<_Functor*>(__ptr); + } + + + + static void + _M_clone(_Any_data& __dest, const _Any_data& __source, true_type) + { + ::new (__dest._M_access()) _Functor(__source._M_access<_Functor>()); + } + + + + static void + _M_clone(_Any_data& __dest, const _Any_data& __source, false_type) + { + __dest._M_access<_Functor*>() = + new _Functor(*__source._M_access<_Functor*>()); + } + + + + static void + _M_destroy(_Any_data& __victim, true_type) + { + __victim._M_access<_Functor>().~_Functor(); + } + + + static void + _M_destroy(_Any_data& __victim, false_type) + { + delete __victim._M_access<_Functor*>(); + } + + public: + static bool + _M_manager(_Any_data& __dest, const _Any_data& __source, + _Manager_operation __op) + { + switch (__op) + { + + case __get_type_info: + __dest._M_access() = &typeid(_Functor); + break; + + case __get_functor_ptr: + __dest._M_access<_Functor*>() = _M_get_pointer(__source); + break; + + case __clone_functor: + _M_clone(__dest, __source, _Local_storage()); + break; + + case __destroy_functor: + _M_destroy(__dest, _Local_storage()); + break; + } + return false; + } + + static void + _M_init_functor(_Any_data& __functor, _Functor&& __f) + { _M_init_functor(__functor, std::move(__f), _Local_storage()); } + + template + static bool + _M_not_empty_function(const function<_Signature>& __f) + { return static_cast(__f); } + + template + static bool + _M_not_empty_function(_Tp* __fp) + { return __fp != nullptr; } + + template + static bool + _M_not_empty_function(_Tp _Class::* __mp) + { return __mp != nullptr; } + + template + static bool + _M_not_empty_function(const _Tp&) + { return true; } + + private: + static void + _M_init_functor(_Any_data& __functor, _Functor&& __f, true_type) + { ::new (__functor._M_access()) _Functor(std::move(__f)); } + + static void + _M_init_functor(_Any_data& __functor, _Functor&& __f, false_type) + { __functor._M_access<_Functor*>() = new _Functor(std::move(__f)); } + }; + + template + class _Ref_manager : public _Base_manager<_Functor*> + { + typedef _Function_base::_Base_manager<_Functor*> _Base; + + public: + static bool + _M_manager(_Any_data& __dest, const _Any_data& __source, + _Manager_operation __op) + { + switch (__op) + { + + case __get_type_info: + __dest._M_access() = &typeid(_Functor); + break; + + case __get_functor_ptr: + __dest._M_access<_Functor*>() = *_Base::_M_get_pointer(__source); + return is_const<_Functor>::value; + break; + + default: + _Base::_M_manager(__dest, __source, __op); + } + return false; + } + + static void + _M_init_functor(_Any_data& __functor, reference_wrapper<_Functor> __f) + { + _Base::_M_init_functor(__functor, std::__addressof(__f.get())); + } + }; + + _Function_base() : _M_manager(nullptr) { } + + ~_Function_base() + { + if (_M_manager) + _M_manager(_M_functor, _M_functor, __destroy_functor); + } + + + bool _M_empty() const { return !_M_manager; } + + typedef bool (*_Manager_type)(_Any_data&, const _Any_data&, + _Manager_operation); + + _Any_data _M_functor; + _Manager_type _M_manager; + }; + + template + class _Function_handler; + + template + class _Function_handler<_Res(_ArgTypes...), _Functor> + : public _Function_base::_Base_manager<_Functor> + { + typedef _Function_base::_Base_manager<_Functor> _Base; + + public: + static _Res + _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) + { + return (*_Base::_M_get_pointer(__functor))( + std::forward<_ArgTypes>(__args)...); + } + }; + + template + class _Function_handler + : public _Function_base::_Base_manager<_Functor> + { + typedef _Function_base::_Base_manager<_Functor> _Base; + + public: + static void + _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) + { + (*_Base::_M_get_pointer(__functor))( + std::forward<_ArgTypes>(__args)...); + } + }; + + template + class _Function_handler<_Res(_ArgTypes...), reference_wrapper<_Functor> > + : public _Function_base::_Ref_manager<_Functor> + { + typedef _Function_base::_Ref_manager<_Functor> _Base; + + public: + static _Res + _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) + { + return std::__callable_functor(**_Base::_M_get_pointer(__functor))( + std::forward<_ArgTypes>(__args)...); + } + }; + + template + class _Function_handler > + : public _Function_base::_Ref_manager<_Functor> + { + typedef _Function_base::_Ref_manager<_Functor> _Base; + + public: + static void + _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) + { + std::__callable_functor(**_Base::_M_get_pointer(__functor))( + std::forward<_ArgTypes>(__args)...); + } + }; + + template + class _Function_handler<_Res(_ArgTypes...), _Member _Class::*> + : public _Function_handler + { + typedef _Function_handler + _Base; + + public: + static _Res + _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) + { + return std::mem_fn(_Base::_M_get_pointer(__functor)->__value)( + std::forward<_ArgTypes>(__args)...); + } + }; + + template + class _Function_handler + : public _Function_base::_Base_manager< + _Simple_type_wrapper< _Member _Class::* > > + { + typedef _Member _Class::* _Functor; + typedef _Simple_type_wrapper<_Functor> _Wrapper; + typedef _Function_base::_Base_manager<_Wrapper> _Base; + + public: + static bool + _M_manager(_Any_data& __dest, const _Any_data& __source, + _Manager_operation __op) + { + switch (__op) + { + + case __get_type_info: + __dest._M_access() = &typeid(_Functor); + break; + + case __get_functor_ptr: + __dest._M_access<_Functor*>() = + &_Base::_M_get_pointer(__source)->__value; + break; + + default: + _Base::_M_manager(__dest, __source, __op); + } + return false; + } + + static void + _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args) + { + std::mem_fn(_Base::_M_get_pointer(__functor)->__value)( + std::forward<_ArgTypes>(__args)...); + } + }; + + template + using __check_func_return_type + = __or_, is_same<_From, _To>, is_convertible<_From, _To>>; + + + + + + + + template + class function<_Res(_ArgTypes...)> + : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>, + private _Function_base + { + typedef _Res _Signature_type(_ArgTypes...); + + template::type> + struct _Callable : __check_func_return_type<_Res2, _Res> { }; + + + + template + struct _Callable : false_type { }; + + template + using _Requires = typename enable_if<_Cond::value, _Tp>::type; + + public: + typedef _Res result_type; + + + + + + + + function() noexcept + : _Function_base() { } + + + + + + function(nullptr_t) noexcept + : _Function_base() { } +# 1879 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + function(const function& __x); +# 1888 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + function(function&& __x) : _Function_base() + { + __x.swap(*this); + } +# 1911 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template>, void>, + typename = _Requires<_Callable<_Functor>, void>> + function(_Functor); +# 1928 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + function& + operator=(const function& __x) + { + function(__x).swap(*this); + return *this; + } +# 1946 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + function& + operator=(function&& __x) + { + function(std::move(__x)).swap(*this); + return *this; + } +# 1960 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + function& + operator=(nullptr_t) noexcept + { + if (_M_manager) + { + _M_manager(_M_functor, _M_functor, __destroy_functor); + _M_manager = nullptr; + _M_invoker = nullptr; + } + return *this; + } +# 1988 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template + _Requires<_Callable::type>, function&> + operator=(_Functor&& __f) + { + function(std::forward<_Functor>(__f)).swap(*this); + return *this; + } + + + template + function& + operator=(reference_wrapper<_Functor> __f) noexcept + { + function(__f).swap(*this); + return *this; + } +# 2014 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + void swap(function& __x) noexcept + { + std::swap(_M_functor, __x._M_functor); + std::swap(_M_manager, __x._M_manager); + std::swap(_M_invoker, __x._M_invoker); + } +# 2042 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + explicit operator bool() const noexcept + { return !_M_empty(); } +# 2055 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + _Res operator()(_ArgTypes... __args) const; +# 2068 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + const type_info& target_type() const noexcept; +# 2079 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template _Functor* target() noexcept; + + + template const _Functor* target() const noexcept; + + + private: + using _Invoker_type = _Res (*)(const _Any_data&, _ArgTypes&&...); + _Invoker_type _M_invoker; + }; + + + template + function<_Res(_ArgTypes...)>:: + function(const function& __x) + : _Function_base() + { + if (static_cast(__x)) + { + __x._M_manager(_M_functor, __x._M_functor, __clone_functor); + _M_invoker = __x._M_invoker; + _M_manager = __x._M_manager; + } + } + + template + template + function<_Res(_ArgTypes...)>:: + function(_Functor __f) + : _Function_base() + { + typedef _Function_handler<_Signature_type, _Functor> _My_handler; + + if (_My_handler::_M_not_empty_function(__f)) + { + _My_handler::_M_init_functor(_M_functor, std::move(__f)); + _M_invoker = &_My_handler::_M_invoke; + _M_manager = &_My_handler::_M_manager; + } + } + + template + _Res + function<_Res(_ArgTypes...)>:: + operator()(_ArgTypes... __args) const + { + if (_M_empty()) + __throw_bad_function_call(); + return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...); + } + + + template + const type_info& + function<_Res(_ArgTypes...)>:: + target_type() const noexcept + { + if (_M_manager) + { + _Any_data __typeinfo_result; + _M_manager(__typeinfo_result, _M_functor, __get_type_info); + return *__typeinfo_result._M_access(); + } + else + return typeid(void); + } + + template + template + _Functor* + function<_Res(_ArgTypes...)>:: + target() noexcept + { + if (typeid(_Functor) == target_type() && _M_manager) + { + _Any_data __ptr; + if (_M_manager(__ptr, _M_functor, __get_functor_ptr) + && !is_const<_Functor>::value) + return 0; + else + return __ptr._M_access<_Functor*>(); + } + else + return 0; + } + + template + template + const _Functor* + function<_Res(_ArgTypes...)>:: + target() const noexcept + { + if (typeid(_Functor) == target_type() && _M_manager) + { + _Any_data __ptr; + _M_manager(__ptr, _M_functor, __get_functor_ptr); + return __ptr._M_access(); + } + else + return 0; + } +# 2191 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template + inline bool + operator==(const function<_Res(_Args...)>& __f, nullptr_t) noexcept + { return !static_cast(__f); } + + + template + inline bool + operator==(nullptr_t, const function<_Res(_Args...)>& __f) noexcept + { return !static_cast(__f); } +# 2209 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template + inline bool + operator!=(const function<_Res(_Args...)>& __f, nullptr_t) noexcept + { return static_cast(__f); } + + + template + inline bool + operator!=(nullptr_t, const function<_Res(_Args...)>& __f) noexcept + { return static_cast(__f); } +# 2229 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3 + template + inline void + swap(function<_Res(_Args...)>& __x, function<_Res(_Args...)>& __y) noexcept + { __x.swap(__y); } + + +} +# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2 + + + +namespace JS { +template +class Heap; +} + +class nsRegion; +namespace mozilla { +namespace layers { +struct TileClient; +} +} + +namespace mozilla { +struct SerializedStructuredCloneBuffer; +class SourceBufferTask; +} + +namespace mozilla { +namespace dom { +namespace ipc { +class StructuredCloneData; +} +} +} + +namespace mozilla { +namespace dom { +class ClonedMessageData; +class MessagePortMessage; +namespace indexedDB { +struct StructuredCloneReadInfo; +class SerializedStructuredCloneReadInfo; +class ObjectStoreCursorResponse; +} +} +} + +class JSStructuredCloneData; +# 137 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +struct nsTArrayFallibleResult +{ + + nsTArrayFallibleResult(bool aResult) : mResult(aResult) {} + + operator bool() { return mResult; } + +private: + bool mResult; +}; + +struct nsTArrayInfallibleResult +{ +}; + + + + + + +struct nsTArrayFallibleAllocatorBase +{ + typedef bool ResultType; + typedef nsTArrayFallibleResult ResultTypeProxy; + + static ResultType Result(ResultTypeProxy aResult) { return aResult; } + static bool Successful(ResultTypeProxy aResult) { return aResult; } + static ResultTypeProxy SuccessResult() { return true; } + static ResultTypeProxy FailureResult() { return false; } + static ResultType ConvertBoolToResultType(bool aValue) { return aValue; } +}; + +struct nsTArrayInfallibleAllocatorBase +{ + typedef void ResultType; + typedef nsTArrayInfallibleResult ResultTypeProxy; + + static ResultType Result(ResultTypeProxy aResult) {} + static bool Successful(ResultTypeProxy) { return true; } + static ResultTypeProxy SuccessResult() { return ResultTypeProxy(); } + + static ResultTypeProxy FailureResult() + { + do { AnnotateMozCrashReason("MOZ_CRASH(" "Infallible nsTArray should never fail" ")"); do { *((volatile int*) __null) = 180; ::abort(); } while (0); } while (0); + return ResultTypeProxy(); + } + + static ResultType ConvertBoolToResultType(bool aValue) + { + if (!aValue) { + do { AnnotateMozCrashReason("MOZ_CRASH(" "infallible nsTArray should never convert false to ResultType" ")"); do { *((volatile int*) __null) = 187; ::abort(); } while (0); } while (0); + } + } +}; + +struct nsTArrayFallibleAllocator : nsTArrayFallibleAllocatorBase +{ + static void* Malloc(size_t aSize) { return malloc(aSize); } + static void* Realloc(void* aPtr, size_t aSize) + { + return realloc(aPtr, aSize); + } + + static void Free(void* aPtr) { free(aPtr); } + static void SizeTooBig(size_t) {} +}; + + + + +struct nsTArrayInfallibleAllocator : nsTArrayInfallibleAllocatorBase +{ + static void* Malloc(size_t aSize) { return moz_xmalloc(aSize); } + static void* Realloc(void* aPtr, size_t aSize) + { + return moz_xrealloc(aPtr, aSize); + } + + static void Free(void* aPtr) { free(aPtr); } + static void SizeTooBig(size_t aSize) { NS_ABORT_OOM(aSize); } +}; +# 251 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +struct nsTArrayHeader +{ + static nsTArrayHeader sEmptyHdr; + + uint32_t mLength; + uint32_t mCapacity : 31; + uint32_t mIsAutoArray : 1; +}; + + + +template +struct nsTArray_SafeElementAtHelper +{ + typedef E* elem_type; + typedef size_t index_type; + + + + + elem_type& SafeElementAt(index_type aIndex); + const elem_type& SafeElementAt(index_type aIndex) const; +}; + +template +struct nsTArray_SafeElementAtHelper +{ + typedef E* elem_type; + + typedef size_t index_type; + + elem_type SafeElementAt(index_type aIndex) + { + return static_cast(this)->SafeElementAt(aIndex, nullptr); + } + + + + + + elem_type SafeElementAt(index_type aIndex) const + { + return static_cast(this)->SafeElementAt(aIndex, nullptr); + } +}; + + + +template +struct nsTArray_SafeElementAtSmartPtrHelper +{ + typedef E* elem_type; + typedef const E* const_elem_type; + typedef size_t index_type; + + elem_type SafeElementAt(index_type aIndex) + { + return static_cast(this)->SafeElementAt(aIndex, nullptr); + } + + + elem_type SafeElementAt(index_type aIndex) const + { + return static_cast(this)->SafeElementAt(aIndex, nullptr); + } +}; + +template class nsCOMPtr; + +template +struct nsTArray_SafeElementAtHelper, Derived> + : public nsTArray_SafeElementAtSmartPtrHelper +{ +}; + +template +struct nsTArray_SafeElementAtHelper, Derived> + : public nsTArray_SafeElementAtSmartPtrHelper +{ +}; + +namespace mozilla { +template class OwningNonNull; +} + +template +struct nsTArray_SafeElementAtHelper, Derived> +{ + typedef E* elem_type; + typedef const E* const_elem_type; + typedef size_t index_type; + + elem_type SafeElementAt(index_type aIndex) + { + if (aIndex < static_cast(this)->Length()) { + return static_cast(this)->ElementAt(aIndex); + } + return nullptr; + } + + + elem_type SafeElementAt(index_type aIndex) const + { + if (aIndex < static_cast(this)->Length()) { + return static_cast(this)->ElementAt(aIndex); + } + return nullptr; + } +}; + + +extern "C" void Gecko_EnsureTArrayCapacity(void* aArray, + size_t aCapacity, + size_t aElementSize); +extern "C" void Gecko_ClearPODTArray(void* aArray, + size_t aElementSize, + size_t aElementAlign); + +__attribute__((noreturn)) __attribute__ ((cold)) void +InvalidArrayIndex_CRASH(size_t aIndex, size_t aLength); + + + + + + +template +class nsTArray_base +{ + + + + template + friend class nsTArray_base; + friend void Gecko_EnsureTArrayCapacity(void* aArray, size_t aCapacity, + size_t aElemSize); + friend void Gecko_ClearPODTArray(void* aTArray, size_t aElementSize, + size_t aElementAlign); + +protected: + typedef nsTArrayHeader Header; + +public: + typedef size_t size_type; + typedef size_t index_type; + + + size_type Length() const { return mHdr->mLength; } + + + bool IsEmpty() const { return Length() == 0; } + + + + + size_type Capacity() const { return mHdr->mCapacity; } + + + + + +protected: + nsTArray_base(); + + ~nsTArray_base(); + + + + + + template + typename ActualAlloc::ResultTypeProxy EnsureCapacity(size_type aCapacity, + size_type aElemSize); + + + + + + void ShrinkCapacity(size_type aElemSize, size_t aElemAlign); +# 439 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + template + void ShiftData(index_type aStart, size_type aOldLen, size_type aNewLen, + size_type aElemSize, size_t aElemAlign); + + + + + + void IncrementLength(size_t aNum) + { + if (mHdr == EmptyHdr()) { + if ((__builtin_expect(!!(aNum != 0), 0))) { + + do { AnnotateMozCrashReason("MOZ_CRASH(" ")"); do { *((volatile int*) __null) = 452; ::abort(); } while (0); } while (0); + } + } else { + mHdr->mLength += aNum; + } + } + + + + + + + + template + bool InsertSlotsAt(index_type aIndex, size_type aCount, + size_type aElementSize, size_t aElemAlign); + + template + typename ActualAlloc::ResultTypeProxy + SwapArrayElements(nsTArray_base& aOther, + size_type aElemSize, + size_t aElemAlign); + + + class IsAutoArrayRestorer + { + public: + IsAutoArrayRestorer(nsTArray_base& aArray, size_t aElemAlign); + ~IsAutoArrayRestorer(); + + private: + nsTArray_base& mArray; + size_t mElemAlign; + bool mIsAuto; + }; + + + + template + bool EnsureNotUsingAutoArrayBuffer(size_type aElemSize); + + + bool IsAutoArray() const { return mHdr->mIsAutoArray; } + + + Header* GetAutoArrayBuffer(size_t aElemAlign) + { + do { } while (0); + return GetAutoArrayBufferUnsafe(aElemAlign); + } + const Header* GetAutoArrayBuffer(size_t aElemAlign) const + { + do { } while (0); + return GetAutoArrayBufferUnsafe(aElemAlign); + } + + + + Header* GetAutoArrayBufferUnsafe(size_t aElemAlign) + { + return const_cast(static_cast*>( + this)->GetAutoArrayBufferUnsafe(aElemAlign)); + } + const Header* GetAutoArrayBufferUnsafe(size_t aElemAlign) const; + + + + bool UsesAutoArrayBuffer() const; + + + + Header* mHdr; + + Header* Hdr() const { return mHdr; } + Header** PtrToHdr() { return &mHdr; } + static Header* EmptyHdr() { return &Header::sEmptyHdr; } +}; + + + + + +template +class nsTArrayElementTraits +{ +public: + + static inline void Construct(E* aE) + { + + + + + + new (static_cast(aE)) E; + } + + template + static inline void Construct(E* aE, A&& aArg) + { + typedef typename mozilla::RemoveCV::Type E_NoCV; + typedef typename mozilla::RemoveCV::Type A_NoCV; + static_assert(!mozilla::IsSame::value, + "For safety, we disallow constructing nsTArray elements " + "from E* pointers. See bug 960591."); + new (static_cast(aE)) E(mozilla::Forward(aArg)); + } + + static inline void Destruct(E* aE) { aE->~E(); } +}; + + +template +class nsDefaultComparator +{ +public: + bool Equals(const A& aA, const B& aB) const { return aA == aB; } + bool LessThan(const A& aA, const B& aB) const { return aA < aB; } +}; + +template +struct AssignRangeAlgorithm +{ + template + static void implementation(ElemType* aElements, IndexType aStart, + SizeType aCount, const Item* aValues) + { + ElemType* iter = aElements + aStart; + ElemType* end = iter + aCount; + for (; iter != end; ++iter, ++aValues) { + nsTArrayElementTraits::Construct(iter, *aValues); + } + } +}; + +template<> +struct AssignRangeAlgorithm +{ + template + static void implementation(ElemType* aElements, IndexType aStart, + SizeType aCount, const Item* aValues) + { + memcpy(aElements + aStart, aValues, aCount * sizeof(ElemType)); + } +}; +# 608 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +struct nsTArray_CopyWithMemutils +{ + const static bool allowRealloc = true; + + static void MoveNonOverlappingRegionWithHeader(void* aDest, const void* aSrc, + size_t aCount, size_t aElemSize) + { + memcpy(aDest, aSrc, sizeof(nsTArrayHeader) + aCount * aElemSize); + } + + static void MoveOverlappingRegion(void* aDest, void* aSrc, size_t aCount, + size_t aElemSize) + { + memmove(aDest, aSrc, aCount * aElemSize); + } + + static void MoveNonOverlappingRegion(void* aDest, void* aSrc, size_t aCount, + size_t aElemSize) + { + memcpy(aDest, aSrc, aCount * aElemSize); + } +}; + + + + + +template +struct nsTArray_CopyWithConstructors +{ + typedef nsTArrayElementTraits traits; + + const static bool allowRealloc = false; + + static void MoveNonOverlappingRegionWithHeader(void* aDest, void* aSrc, size_t aCount, + size_t aElemSize) + { + nsTArrayHeader* destHeader = static_cast(aDest); + nsTArrayHeader* srcHeader = static_cast(aSrc); + *destHeader = *srcHeader; + MoveNonOverlappingRegion(static_cast(aDest) + sizeof(nsTArrayHeader), + static_cast(aSrc) + sizeof(nsTArrayHeader), + aCount, aElemSize); + } +# 662 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + static void MoveOverlappingRegion(void* aDest, void* aSrc, size_t aCount, + size_t aElemSize) + { + ElemType* destElem = static_cast(aDest); + ElemType* srcElem = static_cast(aSrc); + ElemType* destElemEnd = destElem + aCount; + ElemType* srcElemEnd = srcElem + aCount; + if (destElem == srcElem) { + return; + } + + + if (srcElemEnd > destElem && srcElemEnd < destElemEnd) { + while (destElemEnd != destElem) { + --destElemEnd; + --srcElemEnd; + traits::Construct(destElemEnd, mozilla::Move(*srcElemEnd)); + traits::Destruct(srcElemEnd); + } + } else { + MoveNonOverlappingRegion(aDest, aSrc, aCount, aElemSize); + } + } + + static void MoveNonOverlappingRegion(void* aDest, void* aSrc, size_t aCount, + size_t aElemSize) + { + ElemType* destElem = static_cast(aDest); + ElemType* srcElem = static_cast(aSrc); + ElemType* destElemEnd = destElem + aCount; + + + + + while (destElem != destElemEnd) { + traits::Construct(destElem, mozilla::Move(*srcElem)); + traits::Destruct(srcElem); + ++destElem; + ++srcElem; + } + } +}; + + + + +template +struct nsTArray_CopyChooser +{ + typedef nsTArray_CopyWithMemutils Type; +}; +# 725 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +template +struct nsTArray_CopyChooser> +{ + typedef nsTArray_CopyWithConstructors> Type; +}; + +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; }; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; }; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; }; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; }; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; }; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; }; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; };; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; }; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; };; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; }; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; }; +template<> struct nsTArray_CopyChooser { typedef nsTArray_CopyWithConstructors Type; }; + +template +struct nsTArray_CopyChooser> +{ + typedef nsTArray_CopyWithConstructors> Type; +}; + + + + + + + +template +struct nsTArray_TypedBase : public nsTArray_SafeElementAtHelper +{ +}; +# 772 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +template +struct nsTArray_TypedBase, Derived> + : public nsTArray_SafeElementAtHelper, Derived> +{ + operator const nsTArray&() + { + static_assert(sizeof(E) == sizeof(JS::Heap), + "JS::Heap must be binary compatible with E."); + Derived* self = static_cast(this); + return *reinterpret_cast *>(self); + } + + operator const FallibleTArray&() + { + Derived* self = static_cast(this); + return *reinterpret_cast *>(self); + } +}; + +namespace detail { + +template +struct ItemComparatorEq +{ + const Item& mItem; + const Comparator& mComp; + ItemComparatorEq(const Item& aItem, const Comparator& aComp) + : mItem(aItem) + , mComp(aComp) + {} + template + int operator()(const T& aElement) const { + if (mComp.Equals(aElement, mItem)) { + return 0; + } + + return mComp.LessThan(aElement, mItem) ? 1 : -1; + } +}; + +template +struct ItemComparatorFirstElementGT +{ + const Item& mItem; + const Comparator& mComp; + ItemComparatorFirstElementGT(const Item& aItem, const Comparator& aComp) + : mItem(aItem) + , mComp(aComp) + {} + template + int operator()(const T& aElement) const { + if (mComp.LessThan(aElement, mItem) || + mComp.Equals(aElement, mItem)) { + return 1; + } else { + return -1; + } + } +}; + +} +# 846 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +template +class nsTArray_Impl + : public nsTArray_base::Type> + , public nsTArray_TypedBase> +{ +private: + typedef nsTArrayFallibleAllocator FallibleAlloc; + typedef nsTArrayInfallibleAllocator InfallibleAlloc; + +public: + typedef typename nsTArray_CopyChooser::Type copy_type; + typedef nsTArray_base base_type; + typedef typename base_type::size_type size_type; + typedef typename base_type::index_type index_type; + typedef E elem_type; + typedef nsTArray_Impl self_type; + typedef nsTArrayElementTraits elem_traits; + typedef nsTArray_SafeElementAtHelper safeelementat_helper_type; + typedef mozilla::ArrayIterator> iterator; + typedef mozilla::ArrayIterator> const_iterator; + typedef mozilla::ReverseIterator reverse_iterator; + typedef mozilla::ReverseIterator const_reverse_iterator; + + using safeelementat_helper_type::SafeElementAt; + using base_type::EmptyHdr; + + + + static const index_type NoIndex = index_type(-1); + + using base_type::Length; + + + + + + ~nsTArray_Impl() { Clear(); } + + + + + + nsTArray_Impl() {} + + + explicit nsTArray_Impl(size_type aCapacity) { SetCapacity(aCapacity); } + + + + template + explicit nsTArray_Impl(nsTArray_Impl&& aOther) + { + SwapElements(aOther); + } +# 916 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + explicit nsTArray_Impl(const self_type& aOther) { AppendElements(aOther); } + + explicit nsTArray_Impl(std::initializer_list aIL) { AppendElements(aIL.begin(), aIL.size()); } + + + template + operator const nsTArray_Impl&() const + { + return *reinterpret_cast*>(this); + } + + operator const nsTArray&() const + { + return *reinterpret_cast*>(this); + } + operator const FallibleTArray&() const + { + return *reinterpret_cast*>(this); + } + + + + + self_type& operator=(const self_type& aOther) + { + if (this != &aOther) { + ReplaceElementsAt(0, Length(), aOther.Elements(), aOther.Length()); + } + return *this; + } + + + + + self_type& operator=(self_type&& aOther) + { + if (this != &aOther) { + Clear(); + SwapElements(aOther); + } + return *this; + } + + + + template + bool operator==(const nsTArray_Impl& aOther) const + { + size_type len = Length(); + if (len != aOther.Length()) { + return false; + } + + + for (index_type i = 0; i < len; ++i) { + if (!(operator[](i) == aOther[i])) { + return false; + } + } + + return true; + } + + + + bool operator!=(const self_type& aOther) const { return !operator==(aOther); } + + template + self_type& operator=(const nsTArray_Impl& aOther) + { + ReplaceElementsAt(0, Length(), aOther.Elements(), aOther.Length()); + return *this; + } + + template + self_type& operator=(nsTArray_Impl&& aOther) + { + Clear(); + SwapElements(aOther); + return *this; + } + + + + + + size_t ShallowSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const + { + if (this->UsesAutoArrayBuffer() || Hdr() == EmptyHdr()) { + return 0; + } + return aMallocSizeOf(this->Hdr()); + } + + + + + + size_t ShallowSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const + { + return aMallocSizeOf(this) + ShallowSizeOfExcludingThis(aMallocSizeOf); + } +# 1026 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + elem_type* Elements() { return reinterpret_cast(Hdr() + 1); } + + + + + const elem_type* Elements() const + { + return reinterpret_cast(Hdr() + 1); + } + + + + + + elem_type& ElementAt(index_type aIndex) + { + if ((__builtin_expect(!!(aIndex >= Length()), 0))) { + InvalidArrayIndex_CRASH(aIndex, Length()); + } + return Elements()[aIndex]; + } + + + + + + const elem_type& ElementAt(index_type aIndex) const + { + if ((__builtin_expect(!!(aIndex >= Length()), 0))) { + InvalidArrayIndex_CRASH(aIndex, Length()); + } + return Elements()[aIndex]; + } + + + + + + + elem_type& SafeElementAt(index_type aIndex, elem_type& aDef) + { + return aIndex < Length() ? Elements()[aIndex] : aDef; + } + + + + + + + const elem_type& SafeElementAt(index_type aIndex, const elem_type& aDef) const + { + return aIndex < Length() ? Elements()[aIndex] : aDef; + } + + + elem_type& operator[](index_type aIndex) { return ElementAt(aIndex); } + + + const elem_type& operator[](index_type aIndex) const { return ElementAt(aIndex); } + + + elem_type& LastElement() { return ElementAt(Length() - 1); } + + + const elem_type& LastElement() const { return ElementAt(Length() - 1); } + + + elem_type& SafeLastElement(elem_type& aDef) + { + return SafeElementAt(Length() - 1, aDef); + } + + + const elem_type& SafeLastElement(const elem_type& aDef) const + { + return SafeElementAt(Length() - 1, aDef); + } + + + iterator begin() { return iterator(*this, 0); } + const_iterator begin() const { return const_iterator(*this, 0); } + const_iterator cbegin() const { return begin(); } + iterator end() { return iterator(*this, Length()); } + const_iterator end() const { return const_iterator(*this, Length()); } + const_iterator cend() const { return end(); } + + + reverse_iterator rbegin() { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + const_reverse_iterator crbegin() const { return rbegin(); } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } + const_reverse_iterator crend() const { return rend(); } + + + + operator mozilla::Span() + { + return mozilla::Span(Elements(), Length()); + } + + operator mozilla::Span() const + { + return mozilla::Span(Elements(), Length()); + } +# 1141 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + template + bool Contains(const Item& aItem, const Comparator& aComp) const + { + return IndexOf(aItem, 0, aComp) != NoIndex; + } + + + + + + + template + bool Contains(const Item& aItem) const + { + return IndexOf(aItem) != NoIndex; + } + + + + + + + + template + index_type IndexOf(const Item& aItem, index_type aStart, + const Comparator& aComp) const + { + const elem_type* iter = Elements() + aStart; + const elem_type* iend = Elements() + Length(); + for (; iter != iend; ++iter) { + if (aComp.Equals(*iter, aItem)) { + return index_type(iter - Elements()); + } + } + return NoIndex; + } + + + + + + + + template + index_type IndexOf(const Item& aItem, index_type aStart = 0) const + { + return IndexOf(aItem, aStart, nsDefaultComparator()); + } +# 1197 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + template + index_type LastIndexOf(const Item& aItem, index_type aStart, + const Comparator& aComp) const + { + size_type endOffset = aStart >= Length() ? Length() : aStart + 1; + const elem_type* iend = Elements() - 1; + const elem_type* iter = iend + endOffset; + for (; iter != iend; --iter) { + if (aComp.Equals(*iter, aItem)) { + return index_type(iter - Elements()); + } + } + return NoIndex; + } +# 1219 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + template + index_type LastIndexOf(const Item& aItem, + index_type aStart = NoIndex) const + { + return LastIndexOf(aItem, aStart, nsDefaultComparator()); + } +# 1233 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + template + index_type BinaryIndexOf(const Item& aItem, const Comparator& aComp) const + { + using mozilla::BinarySearchIf; + typedef ::detail::ItemComparatorEq Cmp; + + size_t index; + bool found = BinarySearchIf(*this, 0, Length(), Cmp(aItem, aComp), &index); + return found ? index : NoIndex; + } + + + + + + + template + index_type BinaryIndexOf(const Item& aItem) const + { + return BinaryIndexOf(aItem, nsDefaultComparator()); + } + + + + + + template + typename ActualAlloc::ResultType Assign( + const nsTArray_Impl& aOther) + { + return ActualAlloc::ConvertBoolToResultType( + !!ReplaceElementsAt(0, Length(), + aOther.Elements(), aOther.Length())); + } + + template + __attribute__ ((warn_unused_result)) + bool Assign(const nsTArray_Impl& aOther, + const mozilla::fallible_t&) + { + return Assign(aOther); + } + + template + void Assign(nsTArray_Impl&& aOther) + { + Clear(); + SwapElements(aOther); + } + + + + + + + void ClearAndRetainStorage() + { + if (base_type::mHdr == EmptyHdr()) { + return; + } + + DestructRange(0, Length()); + base_type::mHdr->mLength = 0; + } +# 1306 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + void SetLengthAndRetainStorage(size_type aNewLen) + { + do { } while (0); + size_type oldLen = Length(); + if (aNewLen > oldLen) { + InsertElementsAt(oldLen, aNewLen - oldLen); + return; + } + if (aNewLen < oldLen) { + DestructRange(aNewLen, oldLen - aNewLen); + base_type::mHdr->mLength = aNewLen; + } + } +# 1330 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +protected: + template + elem_type* ReplaceElementsAt(index_type aStart, size_type aCount, + const Item* aArray, size_type aArrayLen); + +public: + + template + __attribute__ ((warn_unused_result)) + elem_type* ReplaceElementsAt(index_type aStart, size_type aCount, + const Item* aArray, size_type aArrayLen, + const mozilla::fallible_t&) + { + return ReplaceElementsAt(aStart, aCount, + aArray, aArrayLen); + } + + +protected: + template + elem_type* ReplaceElementsAt(index_type aStart, size_type aCount, + const nsTArray& aArray) + { + return ReplaceElementsAt( + aStart, aCount, aArray.Elements(), aArray.Length()); + } + + template + elem_type* ReplaceElementsAt(index_type aStart, + size_type aCount, + mozilla::Span aSpan) + { + return ReplaceElementsAt( + aStart, aCount, aSpan.Elements(), aSpan.Length()); + } + +public: + + template + __attribute__ ((warn_unused_result)) + elem_type* ReplaceElementsAt(index_type aStart, size_type aCount, + const nsTArray& aArray, + const mozilla::fallible_t&) + { + return ReplaceElementsAt(aStart, aCount, aArray); + } + + template + __attribute__ ((warn_unused_result)) elem_type* ReplaceElementsAt(index_type aStart, + size_type aCount, + mozilla::Span aSpan, + const mozilla::fallible_t&) + { + return ReplaceElementsAt(aStart, aCount, aSpan); + } + + +protected: + template + elem_type* ReplaceElementsAt(index_type aStart, size_type aCount, + const Item& aItem) + { + return ReplaceElementsAt(aStart, aCount, &aItem, 1); + } +public: + + template + __attribute__ ((warn_unused_result)) + elem_type* ReplaceElementsAt(index_type aStart, size_type aCount, + const Item& aItem, const mozilla::fallible_t&) + { + return ReplaceElementsAt(aStart, aCount, aItem); + } + + + template + elem_type* ReplaceElementAt(index_type aIndex, const Item& aItem) + { + return ReplaceElementsAt(aIndex, 1, &aItem, 1); + } + + +protected: + template + elem_type* InsertElementsAt(index_type aIndex, const Item* aArray, + size_type aArrayLen) + { + return ReplaceElementsAt(aIndex, 0, aArray, aArrayLen); + } +public: + + template + __attribute__ ((warn_unused_result)) + elem_type* InsertElementsAt(index_type aIndex, const Item* aArray, + size_type aArrayLen, const mozilla::fallible_t&) + { + return InsertElementsAt(aIndex, aArray, aArrayLen); + } + + +protected: + template + elem_type* InsertElementsAt(index_type aIndex, + const nsTArray_Impl& aArray) + { + return ReplaceElementsAt( + aIndex, 0, aArray.Elements(), aArray.Length()); + } + + template + elem_type* InsertElementsAt(index_type aIndex, + mozilla::Span aSpan) + { + return ReplaceElementsAt( + aIndex, 0, aSpan.Elements(), aSpan.Length()); + } + +public: + + template + __attribute__ ((warn_unused_result)) + elem_type* InsertElementsAt(index_type aIndex, + const nsTArray_Impl& aArray, + const mozilla::fallible_t&) + { + return InsertElementsAt(aIndex, aArray); + } + + template + __attribute__ ((warn_unused_result)) elem_type* InsertElementsAt(index_type aIndex, + mozilla::Span aSpan, + const mozilla::fallible_t&) + { + return InsertElementsAt(aIndex, aSpan); + } + + + + +protected: + template + elem_type* InsertElementAt(index_type aIndex); + +public: + + __attribute__ ((warn_unused_result)) + elem_type* InsertElementAt(index_type aIndex, const mozilla::fallible_t&) + { + return InsertElementAt(aIndex); + } + + +protected: + template + elem_type* InsertElementAt(index_type aIndex, Item&& aItem); + +public: + + template + __attribute__ ((warn_unused_result)) + elem_type* InsertElementAt(index_type aIndex, Item&& aItem, + const mozilla::fallible_t&) + { + return InsertElementAt(aIndex, + mozilla::Forward(aItem)); + } +# 1507 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + elem_type* ReconstructElementAt(index_type aIndex) + { + elem_type* elem = &ElementAt(aIndex); + elem_traits::Destruct(elem); + elem_traits::Construct(elem); + return elem; + } +# 1530 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + template + index_type IndexOfFirstElementGt(const Item& aItem, + const Comparator& aComp) const + { + using mozilla::BinarySearchIf; + typedef ::detail::ItemComparatorFirstElementGT Cmp; + + size_t index; + BinarySearchIf(*this, 0, Length(), Cmp(aItem, aComp), &index); + return index; + } + + + template + index_type + IndexOfFirstElementGt(const Item& aItem) const + { + return IndexOfFirstElementGt(aItem, nsDefaultComparator()); + } + + + + +protected: + template + elem_type* InsertElementSorted(Item&& aItem, const Comparator& aComp) + { + index_type index = IndexOfFirstElementGt(aItem, aComp); + return InsertElementAt( + index, mozilla::Forward(aItem)); + } +public: + + template + __attribute__ ((warn_unused_result)) + elem_type* InsertElementSorted(Item&& aItem, const Comparator& aComp, + const mozilla::fallible_t&) + { + return InsertElementSorted( + mozilla::Forward(aItem), aComp); + } + + +protected: + template + elem_type* InsertElementSorted(Item&& aItem) + { + nsDefaultComparator comp; + return InsertElementSorted( + mozilla::Forward(aItem), comp); + } +public: + + template + __attribute__ ((warn_unused_result)) + elem_type* InsertElementSorted(Item&& aItem, const mozilla::fallible_t&) + { + return InsertElementSorted( + mozilla::Forward(aItem)); + } + + + + + + +protected: + template + elem_type* AppendElements(const Item* aArray, size_type aArrayLen); + + template + elem_type* AppendElements(mozilla::Span aSpan) + { + return AppendElements(aSpan.Elements(), + aSpan.Length()); + } + + template + elem_type* AppendElements(const mozilla::Array& aArray) + { + return AppendElements(&aArray[0], Length); + } + +public: + + template + + elem_type* AppendElements(const Item* aArray, size_type aArrayLen, + const mozilla::fallible_t&) + { + return AppendElements(aArray, aArrayLen); + } + + template + + elem_type* AppendElements(mozilla::Span aSpan, + const mozilla::fallible_t&) + { + return AppendElements(aSpan.Elements(), + aSpan.Length()); + } + + +protected: + template + elem_type* AppendElements(const nsTArray_Impl& aArray) + { + return AppendElements(aArray.Elements(), aArray.Length()); + } +public: + + template + + elem_type* AppendElements(const nsTArray_Impl& aArray, + const mozilla::fallible_t&) + { + return AppendElements(aArray); + } + + + +protected: + template + elem_type* AppendElements(nsTArray_Impl&& aArray); + +public: + + template + + elem_type* AppendElements(nsTArray_Impl&& aArray, + const mozilla::fallible_t&) + { + return AppendElements(mozilla::Move(aArray)); + } + + +protected: + template + elem_type* AppendElement(Item&& aItem); + +public: + + template + + elem_type* AppendElement(Item&& aItem, + const mozilla::fallible_t&) + { + return AppendElement(mozilla::Forward(aItem)); + } + + + + +protected: + template + elem_type* AppendElements(size_type aCount) { + if (!ActualAlloc::Successful(this->template EnsureCapacity( + Length() + aCount, sizeof(elem_type)))) { + return nullptr; + } + elem_type* elems = Elements() + Length(); + size_type i; + for (i = 0; i < aCount; ++i) { + elem_traits::Construct(elems + i); + } + this->IncrementLength(aCount); + return elems; + } +public: + + + elem_type* AppendElements(size_type aCount, + const mozilla::fallible_t&) + { + return AppendElements(aCount); + } + + + + +protected: + template + elem_type* AppendElement() + { + return AppendElements(1); + } +public: + + + elem_type* AppendElement(const mozilla::fallible_t&) + { + return AppendElement(); + } + + + + + void RemoveElementsAt(index_type aStart, size_type aCount); + + + void RemoveElementAt(index_type aIndex) { RemoveElementsAt(aIndex, 1); } + + + void Clear() { RemoveElementsAt(0, Length()); } + + + + + + + template + void RemoveElementsBy(Predicate aPredicate); + + + + + + + template + bool RemoveElement(const Item& aItem, const Comparator& aComp) + { + index_type i = IndexOf(aItem, 0, aComp); + if (i == NoIndex) { + return false; + } + + RemoveElementAt(i); + return true; + } + + + + template + bool RemoveElement(const Item& aItem) + { + return RemoveElement(aItem, nsDefaultComparator()); + } + + + + + + + + template + bool RemoveElementSorted(const Item& aItem, const Comparator& aComp) + { + index_type index = IndexOfFirstElementGt(aItem, aComp); + if (index > 0 && aComp.Equals(ElementAt(index - 1), aItem)) { + RemoveElementAt(index - 1); + return true; + } + return false; + } + + + template + bool RemoveElementSorted(const Item& aItem) + { + return RemoveElementSorted(aItem, nsDefaultComparator()); + } + + + + template + typename Alloc::ResultType SwapElements(nsTArray_Impl& aOther) + { + return Alloc::Result(this->template SwapArrayElements( + aOther, sizeof(elem_type), mozilla::AlignmentFinder::alignment)); + } +# 1811 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +protected: + template + typename ActualAlloc::ResultType SetCapacity(size_type aCapacity) + { + return ActualAlloc::Result(this->template EnsureCapacity( + aCapacity, sizeof(elem_type))); + } +public: + + __attribute__ ((warn_unused_result)) + bool SetCapacity(size_type aCapacity, const mozilla::fallible_t&) + { + return SetCapacity(aCapacity); + } +# 1834 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +protected: + template + typename ActualAlloc::ResultType SetLength(size_type aNewLen) + { + size_type oldLen = Length(); + if (aNewLen > oldLen) { + return ActualAlloc::ConvertBoolToResultType( + InsertElementsAt(oldLen, aNewLen - oldLen) != nullptr); + } + + TruncateLength(aNewLen); + return ActualAlloc::ConvertBoolToResultType(true); + } +public: + + __attribute__ ((warn_unused_result)) + bool SetLength(size_type aNewLen, const mozilla::fallible_t&) + { + return SetLength(aNewLen); + } + + + + + + + + void TruncateLength(size_type aNewLen) + { + size_type oldLen = Length(); + do { } while (0); + + RemoveElementsAt(aNewLen, oldLen - aNewLen); + } + + + + + + + +protected: + template + typename ActualAlloc::ResultType EnsureLengthAtLeast(size_type aMinLen) + { + size_type oldLen = Length(); + if (aMinLen > oldLen) { + return ActualAlloc::ConvertBoolToResultType( + !!InsertElementsAt(oldLen, aMinLen - oldLen)); + } + return ActualAlloc::ConvertBoolToResultType(true); + } +public: + + __attribute__ ((warn_unused_result)) + bool EnsureLengthAtLeast(size_type aMinLen, const mozilla::fallible_t&) + { + return EnsureLengthAtLeast(aMinLen); + } + + + + + + +protected: + template + elem_type* InsertElementsAt(index_type aIndex, size_type aCount) + { + if (!base_type::template InsertSlotsAt(aIndex, aCount, + sizeof(elem_type), + mozilla::AlignmentFinder::alignment)) { + return nullptr; + } + + + elem_type* iter = Elements() + aIndex; + elem_type* iend = iter + aCount; + for (; iter != iend; ++iter) { + elem_traits::Construct(iter); + } + + return Elements() + aIndex; + } +public: + + __attribute__ ((warn_unused_result)) + elem_type* InsertElementsAt(index_type aIndex, size_type aCount, + const mozilla::fallible_t&) + { + return InsertElementsAt(aIndex, aCount); + } +# 1934 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" +protected: + template + elem_type* InsertElementsAt(index_type aIndex, size_type aCount, + const Item& aItem); + +public: + + template + __attribute__ ((warn_unused_result)) + elem_type* InsertElementsAt(index_type aIndex, size_type aCount, + const Item& aItem, const mozilla::fallible_t&) + { + return InsertElementsAt(aIndex, aCount, aItem); + } + + + void Compact() + { + ShrinkCapacity(sizeof(elem_type), mozilla::AlignmentFinder::alignment); + } +# 1962 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" + template + static int Compare(const void* aE1, const void* aE2, void* aData) + { + const Comparator* c = reinterpret_cast(aData); + const elem_type* a = static_cast(aE1); + const elem_type* b = static_cast(aE2); + return c->LessThan(*a, *b) ? -1 : (c->Equals(*a, *b) ? 0 : 1); + } + + + + + template + void Sort(const Comparator& aComp) + { + NS_QuickSort(Elements(), Length(), sizeof(elem_type), + Compare, const_cast(&aComp)); + } + + + + void Sort() { Sort(nsDefaultComparator()); } + + + void Reverse() + { + elem_type* elements = Elements(); + const size_type len = Length(); + for (index_type i = 0, iend = len / 2; i < iend; ++i) { + mozilla::Swap(elements[i], elements[len - i - 1]); + } + } + +protected: + using base_type::Hdr; + using base_type::ShrinkCapacity; + + + + + void DestructRange(index_type aStart, size_type aCount) + { + elem_type* iter = Elements() + aStart; + elem_type *iend = iter + aCount; + for (; iter != iend; ++iter) { + elem_traits::Destruct(iter); + } + } + + + + + + template + void AssignRange(index_type aStart, size_type aCount, const Item* aValues) + { + AssignRangeAlgorithm::value, + mozilla::IsSame::value> + ::implementation(Elements(), aStart, aCount, aValues); + } +}; + +template +template +auto +nsTArray_Impl::ReplaceElementsAt(index_type aStart, size_type aCount, + const Item* aArray, size_type aArrayLen) -> elem_type* +{ + if ((__builtin_expect(!!(aStart > Length()), 0))) { + InvalidArrayIndex_CRASH(aStart, Length()); + } + + + if (!ActualAlloc::Successful(this->template EnsureCapacity( + Length() + aArrayLen - aCount, sizeof(elem_type)))) { + return nullptr; + } + DestructRange(aStart, aCount); + this->template ShiftData(aStart, aCount, aArrayLen, + sizeof(elem_type), + mozilla::AlignmentFinder::alignment); + AssignRange(aStart, aArrayLen, aArray); + return Elements() + aStart; +} + +template +void +nsTArray_Impl::RemoveElementsAt(index_type aStart, size_type aCount) +{ + do { } while (0); + do { } while (0); + + do { } while (0); + DestructRange(aStart, aCount); + this->template ShiftData(aStart, aCount, 0, + sizeof(elem_type), + mozilla::AlignmentFinder::alignment); +} + +template +template +void +nsTArray_Impl::RemoveElementsBy(Predicate aPredicate) +{ + if (base_type::mHdr == EmptyHdr()) { + return; + } + + index_type j = 0; + index_type len = Length(); + for (index_type i = 0; i < len; ++i) { + if (aPredicate(Elements()[i])) { + elem_traits::Destruct(Elements() + i); + } else { + if (j < i) { + copy_type::MoveNonOverlappingRegion(Elements() + j, Elements() + i, + 1, sizeof(elem_type)); + } + ++j; + } + } + base_type::mHdr->mLength = j; +} + +template +template +auto +nsTArray_Impl::InsertElementsAt(index_type aIndex, size_type aCount, + const Item& aItem) -> elem_type* +{ + if (!base_type::template InsertSlotsAt(aIndex, aCount, + sizeof(elem_type), + mozilla::AlignmentFinder::alignment)) { + return nullptr; + } + + + elem_type* iter = Elements() + aIndex; + elem_type* iend = iter + aCount; + for (; iter != iend; ++iter) { + elem_traits::Construct(iter, aItem); + } + + return Elements() + aIndex; +} + +template +template +auto +nsTArray_Impl::InsertElementAt(index_type aIndex) -> elem_type* +{ + if ((__builtin_expect(!!(aIndex > Length()), 0))) { + InvalidArrayIndex_CRASH(aIndex, Length()); + } + + if (!ActualAlloc::Successful(this->template EnsureCapacity( + Length() + 1, sizeof(elem_type)))) { + return nullptr; + } + this->template ShiftData(aIndex, 0, 1, sizeof(elem_type), + mozilla::AlignmentFinder::alignment); + elem_type* elem = Elements() + aIndex; + elem_traits::Construct(elem); + return elem; +} + +template +template +auto +nsTArray_Impl::InsertElementAt(index_type aIndex, Item&& aItem) -> elem_type* +{ + if ((__builtin_expect(!!(aIndex > Length()), 0))) { + InvalidArrayIndex_CRASH(aIndex, Length()); + } + + if (!ActualAlloc::Successful(this->template EnsureCapacity( + Length() + 1, sizeof(elem_type)))) { + return nullptr; + } + this->template ShiftData(aIndex, 0, 1, sizeof(elem_type), + mozilla::AlignmentFinder::alignment); + elem_type* elem = Elements() + aIndex; + elem_traits::Construct(elem, mozilla::Forward(aItem)); + return elem; +} + +template +template +auto +nsTArray_Impl::AppendElements(const Item* aArray, size_type aArrayLen) -> elem_type* +{ + if (!ActualAlloc::Successful(this->template EnsureCapacity( + Length() + aArrayLen, sizeof(elem_type)))) { + return nullptr; + } + index_type len = Length(); + AssignRange(len, aArrayLen, aArray); + this->IncrementLength(aArrayLen); + return Elements() + len; +} + +template +template +auto +nsTArray_Impl::AppendElements(nsTArray_Impl&& aArray) -> elem_type* +{ + do { } while (0); + if (Length() == 0) { + SwapElements(aArray); + return Elements(); + } + + index_type len = Length(); + index_type otherLen = aArray.Length(); + if (!Alloc::Successful(this->template EnsureCapacity( + len + otherLen, sizeof(elem_type)))) { + return nullptr; + } + copy_type::MoveNonOverlappingRegion(Elements() + len, aArray.Elements(), otherLen, + sizeof(elem_type)); + this->IncrementLength(otherLen); + aArray.template ShiftData(0, otherLen, 0, sizeof(elem_type), + mozilla::AlignmentFinder::alignment); + return Elements() + len; +} + +template +template +auto +nsTArray_Impl::AppendElement(Item&& aItem) -> elem_type* +{ + if (!ActualAlloc::Successful(this->template EnsureCapacity( + Length() + 1, sizeof(elem_type)))) { + return nullptr; + } + elem_type* elem = Elements() + Length(); + elem_traits::Construct(elem, mozilla::Forward(aItem)); + this->IncrementLength(1); + return elem; +} + +template +inline void +ImplCycleCollectionUnlink(nsTArray_Impl& aField) +{ + aField.Clear(); +} + +template +inline void +ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, + nsTArray_Impl& aField, + const char* aName, + uint32_t aFlags = 0) +{ + aFlags |= CycleCollectionEdgeNameArrayFlag; + size_t length = aField.Length(); + for (size_t i = 0; i < length; ++i) { + ImplCycleCollectionTraverse(aCallback, aField[i], aName, aFlags); + } +} + + + + + +template +class nsTArray : public nsTArray_Impl +{ +public: + typedef nsTArray_Impl base_type; + typedef nsTArray self_type; + typedef typename base_type::size_type size_type; + + nsTArray() {} + explicit nsTArray(size_type aCapacity) : base_type(aCapacity) {} + explicit nsTArray(const nsTArray& aOther) : base_type(aOther) {} + nsTArray(nsTArray&& aOther) : base_type(mozilla::Move(aOther)) {} + nsTArray(std::initializer_list aIL) : base_type(aIL) {} + + template + explicit nsTArray(const nsTArray_Impl& aOther) + : base_type(aOther) + { + } + template + nsTArray(nsTArray_Impl&& aOther) + : base_type(mozilla::Move(aOther)) + { + } + + self_type& operator=(const self_type& aOther) + { + base_type::operator=(aOther); + return *this; + } + template + self_type& operator=(const nsTArray_Impl& aOther) + { + base_type::operator=(aOther); + return *this; + } + self_type& operator=(self_type&& aOther) + { + base_type::operator=(mozilla::Move(aOther)); + return *this; + } + template + self_type& operator=(nsTArray_Impl&& aOther) + { + base_type::operator=(mozilla::Move(aOther)); + return *this; + } + + using base_type::AppendElement; + using base_type::AppendElements; + using base_type::EnsureLengthAtLeast; + using base_type::InsertElementAt; + using base_type::InsertElementsAt; + using base_type::InsertElementSorted; + using base_type::ReplaceElementsAt; + using base_type::SetCapacity; + using base_type::SetLength; +}; + + + + +template +class FallibleTArray : public nsTArray_Impl +{ +public: + typedef nsTArray_Impl base_type; + typedef FallibleTArray self_type; + typedef typename base_type::size_type size_type; + + FallibleTArray() {} + explicit FallibleTArray(size_type aCapacity) : base_type(aCapacity) {} + explicit FallibleTArray(const FallibleTArray& aOther) : base_type(aOther) {} + FallibleTArray(FallibleTArray&& aOther) + : base_type(mozilla::Move(aOther)) + { + } + + template + explicit FallibleTArray(const nsTArray_Impl& aOther) + : base_type(aOther) + { + } + template + explicit FallibleTArray(nsTArray_Impl&& aOther) + : base_type(mozilla::Move(aOther)) + { + } + + self_type& operator=(const self_type& aOther) + { + base_type::operator=(aOther); + return *this; + } + template + self_type& operator=(const nsTArray_Impl& aOther) + { + base_type::operator=(aOther); + return *this; + } + self_type& operator=(self_type&& aOther) + { + base_type::operator=(mozilla::Move(aOther)); + return *this; + } + template + self_type& operator=(nsTArray_Impl&& aOther) + { + base_type::operator=(mozilla::Move(aOther)); + return *this; + } +}; + + + + + +template +class AutoTArray : public nsTArray +{ + static_assert(N != 0, "AutoTArray should be specialized"); +public: + typedef AutoTArray self_type; + typedef nsTArray base_type; + typedef typename base_type::Header Header; + typedef typename base_type::elem_type elem_type; + + AutoTArray() + { + Init(); + } + + AutoTArray(const self_type& aOther) + { + Init(); + this->AppendElements(aOther); + } + + explicit AutoTArray(const base_type& aOther) + { + Init(); + this->AppendElements(aOther); + } + + explicit AutoTArray(base_type&& aOther) + { + Init(); + this->SwapElements(aOther); + } + + template + explicit AutoTArray(nsTArray_Impl&& aOther) + { + Init(); + this->SwapElements(aOther); + } + + AutoTArray(std::initializer_list aIL) + { + Init(); + this->AppendElements(aIL.begin(), aIL.size()); + } + + self_type& operator=(const self_type& aOther) + { + base_type::operator=(aOther); + return *this; + } + + template + self_type& operator=(const nsTArray_Impl& aOther) + { + base_type::operator=(aOther); + return *this; + } + +private: + + + template + friend class nsTArray_base; + + void Init() + { + static_assert(mozilla::AlignmentFinder::alignment <= 8, + "can't handle alignments greater than 8, " + "see nsTArray_base::UsesAutoArrayBuffer()"); + + Header** phdr = base_type::PtrToHdr(); + *phdr = reinterpret_cast(&mAutoBuf); + (*phdr)->mLength = 0; + (*phdr)->mCapacity = N; + (*phdr)->mIsAutoArray = 1; + + do { } while (0); + + + } + + + + + + union + { + char mAutoBuf[sizeof(nsTArrayHeader) + N * sizeof(elem_type)]; + + mozilla::AlignedElem<(mozilla::AlignmentFinder

    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 Dz|AwJ literal 842576 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%0AK6GzSc6ij$6``&|Tl1P=8)DFK@+?#;w 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

    v>#o&)^@S0BM}S&<&bzU3_lf| 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%0D+eFm#5K?(|L1Z9uzAK&f+jht5eX?c} zQ15-YWE;r*<8&Y#=b^Bf_bHl$5999O0x)t{hB_`-{pvm(!?nS8Koo5Dt>=`NP5dg( z;kW$f&qem1KVq%WkW|Y7BhH6~Ex7@Y2GN_q!7;pD21$i5gb0_>Hh*_`^HXaF(3Vf@ z5Mt+@ptJ=KzF@-%uvDbgoU|vTK=T!NKokoEKs-I7E$9(Kb%t!Yk!lgbZ?q$I#T7zb zVAw(C+ZUGY4*dmMG{+lppT|c7RscB;i0%66}tJ0Wu)bl6^#`F%Tslerrmc zlC0b;HNw&rE0k+p50VmL@Oqq`2ys^hJowWjT`o_Q1#w>$v?r>-=dlB4{ebqc4z?lg zF?)K@?20V6{t6^$622z_l9pXq4lx5tX!4uyARg_?3>j&=t4VO^X-b-yCgPPF*19p0 zxF&4MA1zbk7#e$&UOsy#a~1ZAfDlu@9_WeuJwo@F%{MDshVXL>7P8Y6-xOg_F;3G( z`O-CCwXqHrB5BiOQc(6MyKS3@0MhP+VJ@I(&YxZde(YIP+QDmN32!4sE|By*WO%_g z;@pkm!$L|Nruz;o7C+Y}72?HKa?riLn-{!ILPVr94w0~OJp0Tr=?gFqaX%cHU2U7V ziO*^a-32wKCLVZuaN$g?+V4L8S+I4pfIVx!iM%9Lr-`W_gwp+!JwfGcbFztoB|$z^_vW25^Um4c;WH3cO%cdU&I`Zro$G}J)&Bdw zad1mGG(@f%S>;wQw=6HNOaFc`)A8nZg#yPRy4W~9n1DvH9+dPB-=fRC*s;XHfKeV!s0B zD!axoC|!jeM6FdweoZBz$g&W{L$W1D?M&OaiTqhvVI_=mM{x+sgzHq(@Vm!s|a zUbHQ(-yq_HZpT^?FKq)zm<(z~^Jmpd)H2E-R_+@?r0v(<&OI z3xvL(&R%4Q~nuZrSxFW0{+|z7t*tC*G1)WwPLLuEfhJ6X9KTH(+Tfcc7W6+ zJnqs;`wP01kudwi(4W6n>p|M0#ne*c9ba~PNyd}hOYy8J8&!IB*4zQGd-SzC3}$G@ z_^ljJhhr)w4$x!n;a#fQ4Gqw3lb6=cHOvh$rO7+R>*v5>JPJV2vtK+GckbkU{4$LG ztl*@nd?ZPkMAM=;ZNur}JGJhd)yx~GQuk$Rd*_GIW(rQI-QpMIqdhWwWQ4yN+Mvgn zAtrdxQ<{6VrXaf2O4qsn_-oI*BVx!F(a3Jl7|d5d!DbY_+9H{Ji5=$wXh@Ez_DFAg z!bu`A?y9W62m^J+Moxy4w_q65>dYBZ41_PKElKkxB?w>kmcsnAH1s<%(|lbrBc zpat{0Vuxk`bw!tZ6ck>6${zh#bvq~Gxn`c`%i9klrVKi+SU|oB8K7Je7_?3xGiis@ zd86O@+y9%Zlwl3(kPyvbi(`)B4pATHFr$j^wF`sv4#YEz>>jN%G{ersW2{8EbmP$U z+U^t_u-~-&j;PbMxSw`Z*P|9ZN|?$e-bQ!b*27YNoWn6)rxy)oh>N~1BID{)?8Ktl z^ETyl_E75=qb%Cb1Q516P+*8;-Vc#&FNj%j0U=ZICGTS693BS*5caKKgxoN~o*bYeqU}YczQhN08K^tvu33n%)27?i zeok6*c`k1I!hhcj@wM}T&6WY;O6%o*{W`_t&Kbp558}a0(-#u%ugDE0hy zqL|U6MCG`V{0y_MHqQFx7n)`2q56G6Y-a99j!UVnjMeBMSgvT zX_=B!m5qXwzC+ZlA21X+YUgkaW&SpNA&gISrg_FYU;}LE6qLhpXfHDSZ*T)E&0fxe z{uFVC!BZ>D(|w2umD4|NF#>v}B#`&&uN9}}y~8@&foc>9l7UDz4v-6pUU;KVszU{& zTx@hTvM&Dg537@Nw99<=kjqO-18=Gl9_1$=*Un6w)+M;$q)o_0*zs>-5Q3Jck;F~J z5i3^fyIo9j2}$5k(kwMW=ZK(DkXiVbvJJz8O0{j3WNz&dJkqF-wUlEbzWcM!LIWx2A_W}Xo;xI@&F^>o?Wp+Q4-dqpm|(Dg z+OanQ_0J=F&8pr8m#Ydl&2N|nZ2lKvvSf?9YFB@?RQZq41w z)aHHGyg95Xmd$MBTaS>HF3S}Cbr?Or10T>U$NO}R?^XcJ5LUqEgs8lRS?Hx5Z?hg_ zZW^{POrKV#AM@}ekR^%TDgDp%G$9w1rhocwLErQ+Na~-Qh@#!UptvFrN8VO4(?ja6#*902dH;M-Aanu@VpFvwSte!Dti0Z(8qX zWH_VuCsqw4^@)uL&FY6YNfJw?ks;0kwHHwWAXvRe=#GJkiVF6F`CVynR?8!EFWf#I z&~G3<+^lyGcJ+aJ8KAlT-X`ZX^|OnpUz!sjo$U{>ftLVrC_Rhfo%GHE+M`FL(jp!* z?z{)}Z7EBS1k0}WSQ<`?mL~t_r1j52f~7-GU@-ZOkezcxIaGZp8nFC}fb!1(DD}1O zOWuWJl5DAKGHEpz1=;-o==^#4&0ppVZjU+Iy}wR5q&OTycrukWIwBfAeJvy@d^dzI zaT-8OXg~RR_H2T`-l~iS-0EunHO#Zi3!Tpj{2$buZ%@>AvIB*j72NX2C1ZHRNwd$x z0ygS$d$3i98&cGNb>;K}ba5y1=kZg)(B3{(m;-C1E}t`?=I|TtF=&=@;ZZz5@{r(9 zzI=0kSsET(j*Z;!2S3d@E~7q+WrPZQi$xu7#eSb-$-a^YnT)hwx+=%!;ZL<}Ba7b0(?$2jo%=wsDjNdZou_fcRA!I zo&0O{zK+@xR0z_CRIiK4e5XA-i~Z2pXC~l`7i6x9jk}v9n^Xh#P%zIjYoYQ6Ek-1 z>fOKktdQVFpkg0`%-miJ2^fO6M^lUVh5P~;ISxEh)Z)=-2T8x3(&He#LUcNyy>TwJ zFsp?@>Zhz3OzS+jb?8pt!giF|NCxjJeAQKK*#(LX?`xa(5CtNarDGlfC+Fra&$Ae$bB$UuW9(nSR>#JC_^#2yQJ z90XTD{5CGUjUWDKQ$nKgLMVYwF?AYX>4qTNvWNB!FB#q+ju~2|o&JqNf|4hABpZ0H z;m>n2{~n-gaq+6 zp2CmflV1i&jRGV_)8xm-ykK9KmmcWffc`iCPvA#_K~iv3~jYM;mNMg=sy^u(0hrlw6blAD{Mr zh{B^7fPrKom^4leE9IFX^qGZDiDO*`=$I5o2aZl+7Mh=+}{~{zu<|+|MmKIUO+6y zNFgl1<5ko*?+KI8FG{%b{Mr?S#R1q%%=C=`TM1R;%^Y~W_D;a6WBl;$I*km%KMeQ~ zRU?BN$ZYzr66V@MZF+IObK4nW#J+KIXZ`WoPf(+R2avPRYf5GFU*(gURN$cwlkGQy zGpu=XCd-au2O1ubO9|K?7l#*HSs{)_$>i_$mwn|Vl6>tuj5%=QN}Ld zYmcFs`wj)O19Sqq3*GNl%s>By`#@oi#8YHN0-V75au-RDbG-$E?@%H{-7>S+Q*UheBh^&)f)|VIk68+tyQchX3{4|GYZ?@gpm{D~KvUab8>F3jthhIn;xX-erruc3`fs?=k+=A7sZ0$-H~{$7vSUPK<*+iU%dyM zzEely*nkxv#fa)4xX}=Z0_oK9voD&5sO4=DUl&x*(CMoVW1Qx9oaT!BQQp6X0w2}Oia z^78V0m)(EqLZWkEb-C`JdJsj7mItz|JZe?wA7$)+4=l2=#9U|Du#mkG zZ!qgdQid;A+Fz*w!?>gbWEY61x|Oc{s~+Pk;>jcC^LtW0-wP}iz$b-z;t57_ZK9)5 zC1}HtP-hrC9z%l*p{CVl4l<)^ps}(*L0+y_ehpmq?_ejS{nP`=5(Y)`2_~B>Wuo)X zqld?#AgRDdIRo#-U4+5|gw!ILrG)eEfe(j&7h4^0@Cu2#19GX@K>=Hjuv`GvQ%mK+ zDj;=4h!BhieRHnGNzg#0Ai?WbLx=wgG($d`QnocXvqyLAF!dIWx)42G2=Vhrf;wSy z!slT>2SOC=;dzPJjNvWsPMlVDdu( z%zc2L3VpKT$o=;PBeF(Pq zuTgQnF>ZXnIkwc>cv)pEJOS{wgJUi}?J3Q5W8|$t()onKR5Zy$s3x$(u+cp8G!mVK zws8FitcF!V!`81y@>3v%rRWp_JdZ2!0qs4f8n2ZHlKldJ3Bk?$e1r3>eZQ7=0t7EW zSb&Pw4fDKzy)ck4fnq=c66U2@j`)H}^ys~?AXUhPp&-dNnBMOLV|-U7QkWPawc)z zm5=+sPO2*1Q|Hj-W=JF{JabVc^mtCS@KKpjVmb%KUA13?Dm0Q=Ac8mN9L)!fQ^=b=MZE{1o9aDBgpw?Zwae6#Rsav1tUbR+D3 zM_a_ga7k`dgClzdVH%CYnV8UcZV27PBJ5?n$8UHQ9CF;)^S+=Q)9r|tw;dn;PWI=+ zhn$*CT;gd{8RL^bnn_Q0K%yeD?*%2NUnKnuLIX13On&dz(L{QdRAxermdg*nA@LYM za~}`y{!kiVz>a(&6uf-(M^7HX1rGPNdt2PKV{TT7#N$sWY7-J^f{k5OL7~{Iv*0-0AnR zUEIi?;OFH4@9ce0W`Hn<-)+8VFv59@UjkFN6-OqN>$!|IQ4<1#w@vho;# zSKP@u1peJ{t;2>SiLag5g^*rvIE@utYaMI}7)7=$c%@|T|0u|df9G9R4#wjvUk9E) zo7Pz1mF2#V5YE%yWsdmR5uJ~bO?MZhAW8(a=kNCyZ21YlcS7Sg1Q2kbl5e0}@sK3IB%AWMIGoln8M+=^G=@;wEsn#soI^lt}sZAnq+rg0MQgyIeI?&mSvDOq69 zWylkgU{3x3 z7d?{MxPAAow=yWGXRD{yUfJUnt0p7)^))jg32BPD)EZ@Ow+FM*Omm+j6n}_)o?9LChF*jMll6M@gBoIYZ+MXQrWmxe??Gw*f~n^o0a82> zy+2603FG7Pvu@cxIi5Mo9$Zb;DAEOEA|EhWSH?cZ>xJC5ZxOelEMbVw(lBXLPh<^K z0Xa4+gx~mXl706+Gkow;>H%ZwM=-V)O&Ma{LWYn`^cjExh+_}rgpa#lKukJ-onC9F z3$^l<9E}dJheq=e^lg_L0{nr4j2rJ+D-wdKBXfJYO?lCe@TZ<=iRA{Q7WGg>r>xsy zh5$1(oS#4GJ%MikzoqKB<#HuR7j8YbU_R$CJfJavknm;pcPqb1u{B<5!X0vq*L?-T~F_&gbqdY^d;P5IhHLPz{X#vwblbt@yw z{ID+B?!V-j$TDDuU`MVxh);`Q7x5YHOE+ThA|n}H>a-!6Q-&U3XR{n;kQB)}q6LEq z^K+pgZcmoI)7>23f(ZU4Wt!YLOyV;jx#f4U$O8R9A?$iE+kWjqirhIF;21h}Y5?>+ zCACU<^~gfYw?{CKjQ!T%gq$d#qQC_OzlyY6glRV;itkRA4bReuz;ddPrALxzMk7*~ zf)l9~rZBRN=&2fgrY{xOb#`GWr%EwET^!51Htdc4{l*Ly~gCAhgVDkiWf zL_vu`1v`|yzKSGI#bm#9`I6;&mxUYJLM6|c8|enQd+E*_+wM~04RV{ykjJuFo@QQ^ zQ$j?vr%r|>mdQ-#boYt{?Fb^@`Z5}1k?cs*3cYuGmP$yEx-Mgz(B0OnMsV`XhQn!1 z3YwGKnSCAQ$u4>Q;%5nuQmFvi;_J*wH}UHySuUFZ4deqssgD5AL(Nyit#cuJ@veBu)l%&uAp;;I0 zL|FVHYEE^2F>!4o9H}}AXp+~ru|-nDkHb;05;E|20{M>g-a_8TngTvXBzFrr5mG41!&L+WSOr%a(h)+!Y}J! z#E&A>NEf{X%MT{xLSM>U`ySkbF|t76ddi$E>z5W(A#5}njw63L5H`ctGO~6E?gv28$4sWIA*-a z(CPSd0!(CxA;g;#FNrkjnrz0K5*BSIx^{I+!)YISkznftsqazIXmhqu#W1VwFO=F5 z9cTIy;A*=xGx^9r3xW)hJ~zbH-0`a*P#FF)VLI<%a=Bx3;fb|J*V(}i2&|fc)13%I zx6QS6oonMzq2D66aDJxOgZPz}q$B?Qu(?!~Iq;{O#B{94W&7-G;r56#bfckI;M-$?FpZkuE22=U3u5GCIbW{$hW z)>{H*sHb4%*G2a2K=1R8Rci~L(2_rWx{vG(*|uZUhWYeuhz1f=Ggu}lrJh=XvT)x& z>Mvaj`vflvG}m__1z6`zH?Gce*gBYNNiitSeFgBPSLeWo=%gf zEc5(5kg12CXpaOgg_lu$#(e&Zdyll<%>!fyyn;OcD(sDaA?L>z5l%(l3_4|V%GgxVjJwQG?#N@g%DH*0kp5ePz+vr>R3;wfiFJ7)w zAL{$2LSu0+5Nb40f*J1J67Wa9&u3%K%1ov$YLw!7HF|ER3L;C>!2ZkR)=I&1bsPG? zcMy}6vtkc$0n+0bd}#AWox3tEgP;EyQq62{PfG<=BQ)yafSaj4M5{>3QlB<4%B;$8 za|;Z*`xWt{Y*UZb7Qgz+V|#r4mMQ7E;n~QsuaW~xAFa3c_8$k`HN3VSL&Vhq32O_| zG)^bKZP?BKWJcD{Hmwqq-$|qF&6YC+ayPP1(B^7Cz z{|#2a%OlyF`=u_X>z!pTUu3?Fq+nXs)Wh94H%WVGquM>QFz3>2{4lK_s%E#O7?)Cs zFW%GGR+M@f4|zmuKNraKC*s}Sc1+lGqI(|h7*F{ewY&`Gcac-^mP`|%)c$1E7g++L z-};*(-PG6Bo}RBQqxa|93}5d|*ry&@1x4Rm=;w7~F$YIt31zFxAP_5ubyn0SB&uwS z`i5^jIepTEm@|~skc}E<8 z;{o6IjInPmChcOlq1{G;V|JpYwC+`@BJZz|GQZJD~7UhwVudxQ(%)Pi2+ z#Hv5o=?OQM?T+uUXuK2MBXr3<+*gVW;WTdq9<4{Vgegwoe?r!(p30G z(eSHH=TKEsmwxsMT1I67!z#WrS&k>$M=nSu4ELPbS|7_IT=6ceyXC_f$Kjtft%;)h z()#46K2@-Tkj@^7W6yz)^sBPyl^Vv2i_~1nHS#Z)?pqq~ryHiWzGzRh?6)_u{`=C1y7-bw{BMY?@wK(*zo{8L;}3 zzPob@zrW0Fxiq#k*_v~RkB!cnex2*RIE`%CTjAPPYZhy!{mpaJe)jbFeOgB4+#<&Z z`94&{iWIiBxb%vTEbPO`V`>^ll~vEcb=WImGnrtW@nf@^!sbP6dDe(^>r*}vANpw8 zM`FqzEyAo!H18aK1wR{pE2Aa^yMi6)=XI9us0oyTVB4O)-DC-Zr}UWNFb(V|D>e$F zXl`}#S(J5>H{SXQ49N@ofuig5T)qe0QJVV7n2QY}sLK!H-5AO`HRO^hwqC@FJR1q$ zd_f9D4*rCVdS2QVGUFg&SOScobIb3gC}W>Ezab>!^0PfLpUg_=EipY$I>@EZIL}Dx zhm8#_`2=yI{0(WPSKGvot-JCw_MzfzIZG7=i`-;BShkhvCeTkx$GLEh{}4a?0b!4U zV%0ZU`OB;MHzU8?O)DjTb7_W=ZT!hDuc#SakMoYU{xuM%llR2`YhnJiHtl!K zo(p6!pwxQ4q1Lk-+4>P*T|hgQ@^!G}#4m}2b1ykrHnvf$NGiA}>emHe&1ShgZ-G`GBy z%m>epHaL?+f@06h zj(nD!+_tYiQ^jfJ%ao5!b9lcg=gX>P3r!cI$_QPj@l_{1K<}q9Z+|N9mQ>5;N+Qx9 zX}V5X>Uzs^wTY=aqlnxsXU8naGqhIx{)0KLjF>GV@5xWF*3qfHs|u8xJ#f)?%APzv$WeT1Q#y~ZWE)d*@Di{w13CgZLx+U)A%B6` zPjqF6i3ZNA6edpO)`{;KV>2fu$a>x`q~~fbFtN1^rJtxX$=>qu@$rWREBEs#&UdN_ zOAT`1cT!JC3QoNi=rKF<5-pfD(hwN<`n-7&wNnU1_zhplX$j24FpZN%1y*f;c20)r z{Z53_$vO63W;!9AeXV4@)0P`sZ*4+pS3;XaU$VShx2wQk_$W@W*I4?+5j!K5F)Q7+ z+qX3}(tQfaMgQ1RC;Gdm1B4767vvW9GWKC%eAjeZ2@nG`@j|T{jgFKB8y9RWYlo;N z(@wEWcp^9FsX|Uuo3CD-L!#rqZ%+4Oy1^Uq#-k43UArVh({1H!{lr!+eKpr^v31V9I#l>45XMl zl@H@Cw9^PB1PiHkrb*6=)K$IFXAD34iH`OxqnM#GnMS)&(#Zh>mSg3?FXNg&JsbR9 zbMao%9St02MM8J)|M$|Ic)dNYQ$|}JW0;|%(K7>^ENqcxMkx?C)s!fKcEsn$7&g^V zOlb|8_&z6;E9k(p)s2!H#vde6te8;zN(NH655$t&inDTCXNw714$Q{uY(9tq6nkEKoFS@ zuz5s$DBHUO2)BrcpFG;yA(%4;7;3Lu1!ENBsR~=uK^w7GT4NyO=|+~16s0@AQYBnk z8$V<`G2TJ1wRO;O&;9()uO%zbn$(RJ` zZ~qx)pP8i6TjAoQQ`5}TWG3Gnx;JjzTCFU8ZImrBn?8E8Mj~a_OQs$2)SkIx}|s7<;tA?L{(Sm?dlc72gawbkWo4910GTo zzX5Gs`9!tFOI3Zoh>6OsQYYdO-n~zD1bw3Ne#iY4Fc0J$Y1>(}Y=}0Ua7Re-%YpYB zimXh)G?8JlU~T3Z4`jbe749J;z1A^(yah7sIfVeMQYGO{H`BVw2*!%6&f<^V3pv|0 zKg2{HGb_k4x%4K4QYnEB^2CLM-GTafWs-@#k0W&k;SNZ0=-!yU>5`9Hk}XkqP)b$T z%0|(F<0ABd8N#z!QQ^~lt=)C8X+uALz)cfrY=QmN7~<)-O6I)J+U3r!6^E-aDB#ExA{G?Dnqjd7t_gMA(VXhv*$EN@~X1 z)UktVzm8h67n~nGg|ZZ&b7`i-+cU}b`%ZkPf8q!8L>Y(oh@ul+UHg(gd&5z-qhqI9T_A1rf_3K*G26>BnbtQWGV|iXS?#51$}sJC zIFD%byf1&~AD^yQ((}mqgH?tZW#a?!3OA4dliA=)>34075%6UzTl;?d7_IuyzM_Wt$C}4k@(u7vuA{d z$kleFl}Ky&nM-N&Wa+x;5oWs~aDNEMzkAaloLN!G8RRXgyS(&HCde1R*m7BSg$!%d z`mG=dwuu=@>@SyJY3=e!X!MPG*4WqMbL{&qQ}>a?QQw!IE3D$>F{Ovx+MBSQ_Cr@BV3kDq2d>DH+>3e>gsmvu-}Pd!ODS_dm2osTd~7crCdj^_3A(+Nq35Fk0v!S-PZMC#{e_a} z>ey@5z*+vd7O5kxU_-GsQdQ%V^+VVOHIjBivr}Wa^L;9D7DeA-KN#MY<-=t~v-9~7RSsT8=l^=_u zU+mUFr17{JAAzd~+jS#mC>sxsSW@<7Dco^Tb#>o|8dC%i)3ZG4HZ`H{rLhUNY7Vv6 zvl6#6hX-n$8tTR(U&p!(c}<)ZD-(e(q}xMCGt7%{YSCFiW4aI7B=>~2W-)}}`P zisEeTA|@!;BsH4W2PXzRrTDjnZI(O5e!u^9Po+5{ZH0;o5%&*GpWEr45Dmt$`kVXe zUqz+cNICHxd4fGX0+mj%Ce@P@&2G2Z{Li zWcsgv2~D||0!2AhbcOvVp7_EiwwK%FG$qo)CoM7_wTfpyvXwJ<%0#UD{My-N-|3=< z*-pCS}#?3?JGJi7i5Y0A-%13Q{_El!5HB;QJ3GUa%Dc!2CpJE`WIB& zg)(@C#8VQ#V$E^_Y-!F~rFdLp3WNr;ats`nw9|fE%7XH-)xk)}5GWLBt}2fW#+HV| z?iN0epN~^aK5VeA`q*5+Nt0J8!-_^&L}D|UOc%*50TkbY-}%?;79!%nw#%9L%u);G zDqM>N(&-|=6dcN>Y`T1GL7d7R3LqV$lAQCiWQyIKh7}AMkp#Qrhh5@vVlh8Ar{SSy zMoKp%cxAhev$^_%nvdIl)M3=j_7!M}{2jtnR}}W5zci!`9X%JZwFqua+KkZ6%xz4a zn8vsT4O7%d8g^`#2~$FBq~&dlb4iclOxKya3XObOgQC5dQQ~jqHj4^3gtro7+`iIo z#z0uF(J@;>v9BN~A7l!sK%+3pe1-{>^Bii)Qa)yc=;vZS*lR6MXNa!IY+UL543Ir zrovx*D|bQO^hxFel8R>I42&y+Q3>VRhg2~HTXMdo7g-+(Y@x%nnQKa|D?aDiKiQ_8 zG3aLUjl%hxgIE1+Z%=psIS$iUYFNImyJi$Cv|Mgn}cdUnvLVc7;al<`hQ z92efc2TGf0ig+5|v5_d#D2kX5wz8Y_bil8j-ZsC7njYvZ@%{OwVLGeC;pAOKSwC<)^YzFZCh8KLLV~qBBWB>24(P4RaJX z7&5;>{dXu^1p@BG-4=aiU~)HQLg&AOdnN47yQOk7ZkBqMU?WT&wCEP19=(;XY7~zy z4?6Y`7qP>v|J?sX!6VRw*t-VswA6A!Ui*Q_u*H!f?|O+-{|u}@c%xR{!8Qukvg9v6Q$%6?m#=EEM3Hl*e*T#NL+0KwxH-c?VS=E%AFC{>i!#GNGMO=h{p3W=xAfv+3gd=ga!l zwW({3E$@+-WaUu>@!zwmkWmwES2v3qJ!EXVv{rOmbik(@v`sBxRR`V)vi|cGry`75 zoQpNj6%P&q`=vuz1xu-UfG;XU;Cqw1W-Du29k$ zGK1D;{8-+B*kDpHLlOGlOWhr4%;`Bs|s=?UY|V&3uPa>-#uxYVYezYZWdFZw4e1`dW|T;qR=3Tc?RD*$5oY{e-e)~)-Rq9Apwjz=S#CuI zU9N^1#1ihfO%)x+?-na^R*&SG2UcpObf4}O{ItdYZ>Q6XEvQ2sOpf~JN>)U2uS(5= zY5T1%DdEh)S@yomV&^&z5K^o8CCyv`w3yj-E#r_Zy3DM8__1&W>hYr1TRqOzn8@Up zf~|*J4|jDps5Oe~H>Y4>#L0`N#BPH)te?4sEIB!Up6-HIEgVsPB1>?SpvAPb?Q1m){|Hkn=xO_0%i zj}eRfg4ihDHIF za<0>+Yf{1To7_hqtyx}?Bbuk(i+twtu8 zZ{v}v=A>g#CdcYI{U zM?%qyGT)YSBk0b=%ya9NNGrr=`W+%?*Ll3G!|r)w#D=nE_sV{B^y-3u{0=ZvUu7t% z!%`h~X9Weh&KdnUubsy7na=&>^SXlgxjy81-iq6_7+E@r?5Vnn`GkUOIHDIDwmur1 z7gclpT5H#I=tjTIFSy!%2QrtBFs_we4}f6#p!0C$suT!RvJAqA9}7swmjMUT4cR~g z5mzo_Y;4Z9zb0X|luEnKIr+T4HMq_r)PQb~nUZy}sUd!!-o=QRaYDiYi(+M*)4lsp zSEo1Flv#XJtO#iQ>X!pLQ&Q)PsSLKR6a2iFWi%pRCSpsFWtN0?5H}^rnys}0fv3-H z{_NAA#gnXWpy)IOaG+bMFUkmAvlBgCwYYRM<7W?q21;CR>e>|5P3!*Um7dy4Z51si zdPKWcj#{_%Q*D z_s2OWVBxAbSgU`oM$NE9(ni8X`6PDJCfob@@k9bhtkwnuVA%zNgDPZK?wJ?waR`ToEI0VT0RM?0?Iul*b@&U-&v{VSm=7L@8 z90MBF2P54~JgyA~jN9^TMs0vXaY5hr21qr!9dBpWup7aKZm@%s_>~*3aHQEBfjRli z!=0+ZAX=jOWAmL$BNXj(C4+Z?nqRkeW~s$B5awweVAe^TCQxSZ#Ey{8j|^H}Q80jU z>`reUrkjAQ740(8dJQ-DGD>(%)^Hx^5TwO|_Badlo>y@RFzGV!y-OALT@XdX_LPw$ zf|iJJ4b#!$759U1dcs^rJW@^&)Bu|(XJ*B z$hLsW#s;*nTFvNrx{DfyEFNxj(@z2%*GWbgGlju%rFbjO9vzb6a<@u>n^AEcY;ImP zQW)=MlU|qY?vHn+Hl<%w>PSP}#>pp~>(h*;*Fj*=cxn{KtYy!sHOV6DnPk$xm z43>V2Y_#XL|R;jqYb18xuDH+u#$P@0SE6S&qSlJSnt{{-(f?O<9LbJlp;~FGXqE zCoxL(p_@a~(qiWdEXN`w*}u1)GyaVu2xiz8n;HUNZbd1inEq6@8u9RTVbl@V;qAfa zAU_?6+qJtviuSUbn3NpIcI~8^v+B(U?HASiDl6S*P{iWT(HO5cI1?z&x?8$TP_($G zqzZEJ=S)i0(+bFl8aq^NJm|g+?g>c7b27|kY8A(2(C_5`s46y{nAsBfB*{ZpjQo4p zJKF}kWSVz7!Gl!Rf~|^~dEXdD3gsRE8yy3|L#<+p;e4DV?YT$ht@N{Lg4=R@2Nk&AH{oohGZFNfoej=t(j*Qrua^x1u5Krq*IpQUszyVD|`#} z%eeEB@GJsr-c7YuCu`Vvu+Z(CIs&iIFgFQZ9^*$c^ zK(Q4dZ)YBodI140k~d7B;zrBmIo`*ucH}#BElHuCf2`N@!|-BUAR%f`)r5N29(o!2&_BBAI(%P!rw=8LtWN#bIDY?&S@ z*`waBXKnVts{Q$<#BgtpRFf5r$L0WrLGSlYG4zF1X3y2wbi$E}nD-%8VdPx-ksHfW z0*rU5%ufFRtF@w@FQb^<*HkTdJ;L$Ud_!mjeMRvePMv&A3N4ow(1d?H&u}V>CNoXh z6*diH;}XEXOJzgeBW$V|W09#`NN}Zwq5ZvZk)Acvhq}Fmj4jGv6|2~tlVB9=& zr4a7*=2%jn(?rY-1*3wLlrn-n!ryFZ=jx7^%Lim#SA-C%kd>$Yxo6IqLfrF%7U?Pu zVyd#nG376gKbjWkqw~2;nI$hS8uSQXjc{#oK0lggRGm<)IMdG`+i>@Ck*;AJCUlxT zU=^*X$Lb+jWFkf>L){~MCA?7}#5aY+w6vE=S|Z%{!Ny}n->~T#5=?ov_X1T9W>&uw z-{{9%&G!MCBkJM?(%}r-CuB`?w)6h1N*^RT=MS^@J+{o!`( zYJZaUtxw^zG}SFVX^|8eS$h|A&s&+b4`xNQP5Dv@v_v}XpXn!TkW>;I=pWX*hvV00azE@vtm{7Of#5ZM(yKRLy0UMi9t z*(0Rbt+YtHTzV;*=jpVqASvc?2z2A$Bgbj3nxBk+%pr;GS>U46#0`ef62qKZ(eqmT zWgGYCtOd@}I(M$N3Ey7QYbrjgNjAUiozU$oCTXG0bH`;OpthFCmv*{Y{Jy8VAmtx% z4aGjR8A{%L&&7NO+7AsiTYh+5%_iZyeYVQWTHb)1idQSaXfJOIKWp)+R%k^GZ{-H> zG!m(S=qf&uHP=xyds$PJY7_jR8O(khqc+?)*^e`qPWE-+^~s!g#Oje+^AF+ET_#5c zsc)+QbxGF$r{0}I(fMy)|I9jt zdD+fbxv4$}!y!fam~2T#w5zh#fNa@Kd}f!KX6%+#f_iJ}g36i&i?Hgej?5S~MGnpZ zG3t&FHR5dHMyw$DXI0cwi^km6yQ|nB9gWHS*--B~uZZM4rFGmkr{QRuQwV78-?5gx zIjog^23Vp3C|-L&WI7m(G72)b`bQ5NA}^-+SP{lKi?a!b~f?9(qmsIF13!Dj6T(NMhccB zv3;XpO*1&npJCg6fhF5!-JomoY$yI46-;@TK&C_9Tc3VbcP{i)fdYWXUkDM}QT1n7T#u-7AC+@EvRmHhCVk>K2`~Zhrww zAWRj0tSYF|wjXHUyeTI^_hoB|M2}jY9$aRhOxg6NAxVPD`jI7z)bh09MD#`5`MvQh zmVTgSdItheE3gPs>5kF=U8LOb5uyfI6*ECvla^EG757j|I`WZ&ThV=1e6mA`Fl{l@ zJ@#SN8}Qx8o%fT&VTl*U(MyZ5k%`td217W0^L9+TRZ8%sr*Vb=OMa&L0%AsBATHgo z6pj)HLKtV~Z{MY0BA+EMf7~~?Zzh_&H>_9eWxoA@DQP=fT6$m?;pdJKG9huar4LWb z)x-xQ#wws%77dToD1%=4D_)XY1vV3o*SQB49-y#si|*n1doA`EzgeXY+S6Y^8Bl|j z87j{Pgxx9==1&`tQCA%JVQ$m@JI@?N^m+f%0(8ep13%$w<*4!dK2)s8LfUfP-oEgJ zyNNDQ40CV=TRcT+c?E7;D{EFz&ZmtL$7|Uh%f0dc&31rPZ3Z%7uH(&sYb(3p)1c?E zk#k7X3)(QcGg+rA&e?gopeI3m?AD6U{>^+CbW86*p)wMQze@E>b0$V;ideX#MH#p7m#IdYDBEYAc-ea1VUqRI%+bpq=v? zy=!-i52D8}G-)zM>I>)+QpmK#uY<1^+Xc>>+KiM^pDtd_fESTXXxgt_G8I;Js>eq= zCVQ~P_yQRsXYX9+pPE9DULlPjQ`!KY7hNDrMBVuoJ!)fZ^08)z=%S!H11G`IFLgA` zmB|R{Y%1`?zr`9cydXc5WhL8(R}c-0xKvOs;#!lH!Z39=V;2qq9v(mUU-m=6C=w1Z zkTW&*ft1w{Z<*-Vo1mNmeooF4nj0AoV7KFO_MD(5qT4`z1*@|Rg73D7$2aXKLd3wX ziqyT*qmJ{Eo!7J(YY%p|9!2MW^sh&V2;q_{pT?G|T->{X9pwGrnD^46q-h8*9C$k+ z55@`g@ez}4P{nD=JSnvG3Pa6lJ^{-!oeJCQ_YPrC(Ew*nDeLiE_H|OS$qKt9u%YX? z7fXD*(4e~L$F4CG;3+16GUOKkwy9{s=(R8!^!69HmDKaE0%(*3;>z(`hLi7Szfg|^ zO)CPo6H%M~#1C_bz3ONZT9r2dWM(PoCK@ET#y3>>SEKWYJf`~^31 zLH;H{pydm`K&pJsa$;#E3L=ehP^M3Myw`a9E^+Vo`=Nu6)F;k!1PNiVK9hRsUH_J_ zK793a{iw#x=`Jch^Dx9R3K3F(40ij?o2&7t5Ou6P4G;j=ATiJ&koXeTcX^HL!k75& zMfGCCWxgcPJE4yg*E3f>D2g?v+RVeVc?%HA%h4GB0L|h^nv8dsroH?}s~io$+X!HR#_TwvC>9%5Xx3tu|E(XKG^}B$0CrbDA9oBDJ&n=MnQRy&j{~qv2 zA;{ESwwI#q>ES<}ffcq3j&-&?qvyQlbop^@e6SS#7Dd@DnvAGh7uLU*A zn(l&hSmUDn*x`BiBAz#!iRZcWcpcw$guoNY7sBS5&t@RmEbZMa(g;j0f_+NJSuZ}P zhu1P?F6vtN{*3#9xg9UfM%w)87c5UBE=Z)i7c7&77AV5|BD~;$v)i_)He- zU%T%A_b+6a20`s}?{E(^<)?MSOQ=pjusCF_TO757lx^) zT9bg#6-FXK#clE*>v z_r}rP^?5`UUgzrz(9`f)=NIBGu}Ca5mtF~jN3=6C)iQiWOH7U%JL92I_6-V%};=9i68n(XLutf93xix&r{Dp)i1Yc$0g;mgJ zGryVUU=^Ov2&RnSzr!0E*5NJ~M8tU&B81Y%`FW7@t}Gf1m)ARd_DlwP5S0yY^mDg? z@8CO7pt(gY{8$~zMs`pk+mB^!8jCoo{}$J>#4Dn}UcegM1Y#%ejT!~>JhIZ~hwI`c zBoSr0y}N`+6yY*&yseM*cUghcDHsgGb!B8L3A}PL2fd+OIlMinqNns(|7p0B)mic{>cuTg!N~?i9SfLq4Jev zwYS6ol>hg>KDIB4ybovTALoYw4~M5=ErbgwjBw8%(U|WYToz6-zW3o4au%sXJzn_j z&PLct(ao5&YV(5(F?1+jO7*^8^pa1<`*3x0Ywq_c}{$`5LW z0N#99TwdxPpVkM@6C+KjBafw#mq|@$pZ(*H7$1%T=^Ps@k`pEU_gN}E0K|R-)|l+q z1}ts1!BOJ+| zJ6io8whQt1all?R#lWdnfj90RD2f``)4rT<+?^wkpUEm6bN^Pi86CH`_S ztkdiRw?YW6#7FTo3iGydaE!s7@H@{%>}L)0s2e}dUmxF+G#F`3k@^5^_AUQXzz!N8 z+A{q9ZRv;T{5r&J;2~%B_&*E8|MlqdiGC-p-w%W@^~y3=>W4Sl1cA}s=12wZrXK#w z;tVMWE;vf`{uScKyYt_LOTdUIY|+N11eE(CAUa%*v)ieIi5_?nkFMGcv#h-9#Q9wb zui}7$d3bRja$yw?M6J4zxc2({tD5@9-ft=EF(<2mCrMz`pbRx`Bk??BIsN-gViKf* z!)OIhnBQTngz|=RpB=KJM^vvxwF}hgQh|-hkP~t(oLBeX-voujMFwlW25C_dTa8mh z;tW7ONrkOUjj%xFb(nT;ecr7At=Y?KVYPpqs-OWh(&lmAF66Mid_*^veefpSmj2Ht z`RcDH`RZ==-hX?NXR(*F1HKJ1z67JAPsx|)P6sC`KjOTV50Krua;)7yAAGy?4Csv? z!2!|V-&v(^8!yemDJ_ThuglX7tN$^GanEyTOWz%NL4sv(_d7-9OO`Yc(!aucK|FbK zcz%YZ+Gc=GD*el+-ywHUCiB7JvS`3e{vQt_c$XAuwUPF=OC7F0&~}lsDeo z@=1t`CWDV>JBbnt13TNFjy`{{CfC^kj=)O?Ehkc&W^SIHHERloZ#9Cr6&Bh#aoq!1pH-@7n>Lh=cNOLXOIUGgt7gXXSbX2``m(x(~kSw zOeJn3Fg>WG0>r_&BE-V)-yaDhfGzw6In^)@Ux5%HP&W)b&a~1;%&(D`uq+^*O=$*m z9e9Q!zq*;<=gV{bHirA6`2>iAjbvh%L2k;>(LZ>5`^Tu(ooXj;pkdwqxkeTG&$0&| z7c?*?2_iCm(iA0e(s0NOf&KuY6F9U&zb(|ktpEHU)`##>Rak>Gu95Q?b4Ad4ra5uK zZ1pOCVO6jkEc||SDgiIT!}rYmUzJN*k;L}>^O)tSHwMt{- zIKpkxwd*aUvcAbAzhNjm4fbowv5@AF)=$)`0<0?%%rP(WhDx)M)F5t12sLpzXeAY) zWH`Em@ysGclHoWX9Bd?)>nl+7?p?@9_-B7bs`Lc1;D#IheOnsHy|32VoPHcy?uo#8XQtj7wDlNg{qw(@P#B~q31Hc62pkI*s@7fc<5X4sr z0|6pIKQz_6d2uXTsiQUYug^%#6#ovnWpnS&T>ST&^4IwIk7BZ>X$qUbGQT~ytctAw zPoL~kcxhT<^*|4r^RqoY`qk-i_%D6hWT1-BPvZ0FVAQ%xC}IIw2pV7!?c10r)pY|3=?{ zMV}7);!ze-@<5Q!|AKi@75<+r1&{1652j!bhM+1pAgm&c&AlRFhXH?G)~lG`?>YqC z>U@B%xwn7<)%TzOo&R`>Xk2XH(hD?aDUX@4NX`lyAu&wK$_$LZd+AfSgz+G36lGiz zxc=97DJ$UseLE2}kgqr#nR@W}Ov7Mf%gUdT{7eEYmii{hk5tkbdxf1)W7W|YRoRjk zP%b7?08aU_dRkXs^PC_H<3#4dEBj4A;s`Ol;z-C5e42o~8{XYhcP0A%{%BvwIAAt^ zI3%0=QEL|N-xS0t22}l4ozYZ@MXkRA%ry;^8OBivr6FC?->0nHDu5-P89O$00n@c( zQg-ZTqHuLkh5?9(Fq~+&&{!jmHZUc*`(@Ns1Gga_c3v;h2Hy)!`vcgT*L9^v&pARj zpv)Ew?=<33uOiAFSU%Hoxii& zwmSia*7J!3f{)tLD*xeSgcw6UgLDA|itC2vQo>AS)9cdWoW!k&#qQD(6Y(FYAJRxa zk2r4q2D?CSMbi_c;p4OO^Yu|S9-WsoSS9B;9s-=847Opng1$ptdj#H5mKRe^K-ecJ z*054FfpY8z3bBsUA$yKr-YAvezNNAWV9^@WbyjboVk9bI&EG~0VE{xC_D-+sja;c! z)5ebL+!mj?pu7R?t)C3TEg%4yBxfTZ^MCy%EsbxQU<)zVP=OFq5$WROfz3 zX7kWaVWy<*ToQD)Z^12~C|13@I3Ey3%(fz?%H2@9c|ca+=1<3* zC|!m>L){_k%0)eJ#SmcLI%)CxRqsp~vdhs=;&7G5fhMR5W@2PIUIs4Dp>W}=NPUQG zPW7zdE2y;>wt-D8@RDHOag&I|X0qn(6}#qgTJw(jsB zI<6;(@@`vdT|M=?cA*~MH8ZHWF9kbp9V4F14Lei5!(b%%HZ{&Sxh^E7CE?d_m66x% zgHH=%Awlb%X-kd<4c`23+KEl+S@;aoIq~xaf&q#B14Fccs=L3MJ)HM*qFSrNl>llp z7=WIC$dz9qnkItJ65WjWd;#>R+qD*EMH&(23;wU*YkspO59Xszjhj>!glTb~%WdM2 zSYpsAUcj?Idejc>EX&LeIODK?E`c${WCI$H`bVV{r${A?AIG|{zbyRGT^IB0cut>v z?AuSkNN+L9VG?9|3G>2-TEVuA^;;+;{VDPmoaIxPBx1Ph`N^)}K^9IYu~z7*D?hUk zS0u#jPV(f?oi>mts+TC31;~m#=mknwjou6)EnuCdCb~&KAsW2}US~HFr35tSuw$Fp z;_f|PXkUM;{(7(X@_qPOegS9a?OQF-;J*?jy-Nr~=A6}BIM#%_F>bmn!-W+QT@9;u zA3EIrON-T>g_U`>gtrnrie0tDUf?62)D2+mGvvJd@zPExNELVzVr885r8H;@4rnq+ zDKAxXnI9j+E0qieMjd{VS}ehq#LY}5nCGSu7KbvtX3&`D4nS>A1`|K_w(|?n5)l*Q zAX{tE5Eh+YvVJ?_tPnXT(Qxp$N7Hmr9x7lRwOw?oktr5y+Twi%!vk@}{}s zX;tIbEk~#i#5Q6m zS0sdCXJNARnMgrDR~I-&jp0Q~-GK7D1o6P{fV4@lP^&}B@Z|_TS2qk(EJht)ZuF(? zB_V#{gos3JxIl|uDlO^tSr|gz$MiEy(heYvj~(dPklx8oZ0e!!9!y5`S`J0;MFG#c z#oN7wAB)M1y5H=wC-~?dt(|${7De$Ei3@5PPz>oB&g!6mQ5b?P;r2!DmkTwb9^c}{ zw?=O0YrcWA@D(T$DS&ERM-n6ElMt&jxKgYmdrq~m1bLEVu$mLr!QhbnfO`JccL0sP zQ|?-&8j%;Xq{nLEgEX++1XOhC(1guZJuz>pZJW51SeJ<5uAPFtjpJZE>l8zzF|SDQZ_VMPT^{p6A65;vh)t_z$rH=$x+!J`s;X z5n?Zo96Nt(eh^OM`phu3{2?Y3Mjp5kk0uGGEmB3s@4Zfp-iv2 z$o+|C`wA><=n&l>d z)1M7!?uP(RC)Yg*eDEGJm{{=pDK;BM_61=7fkbsM0ZXsi+!EZ{x0I>9q5Oqt$$>i9wAKN>}E4}*iy}^iW5NDnTxCVW* zHu`ojj_tRu9w+ksM^U|I7kZs;nehx!QCdDef z^IA&mjr{Al7kZ_6SqeqP&JF9~BXF^KNXgX)`F;T3WKL*}2V?HVqqD1BJ|iJMLXypV z(OW`5hKuinR#vWSomS2T{|hXSR;v-aqauUdZ%^a$BrVv>!fc5K*$%7@#S*NnKIy}0 zzjm37E;0+Ni`~MeOCVGM>xaX-dYIq{&kFm*hN+RA}Q57>2VO zwI#|Qd+sB5^(3iitPmpFxCi~_9mT?4eu5M3@@5eA9fXp&lxm8tT-8`a{7|B69$2B+ zHp@xe%fJ}XUg?9bVY&5vy`y7fys6NV*t+=#SRba4s1ro>5V6d#<0z)}@`nU5COOrw z0E>)0O!DH8Ko1wk=s@Rn#XthMV=AsRthElVK7r;iWqek%IFNbDf-3mx9{_`yS9M$usGD9Z{lNSv&ahAU!tDo;;)XrQ9>JoSc6G2n38WT zt!@CXNF8(S=wPQh+Qn9OSo2<9=S%JJ^arjl1t09$$YHGv0uJ|LS~FW*{|CVe#eRt5 zq2Mx?kiQzUu^E+(XpeBxozC)w4@j*VaiW|1& zd8dI}X-Q?Vr#Pj!Qymo7n-}BGX6sGw=vGS1!+DWdz6)j(|J$EH_IX8 zD9sH%9FuW{$h{g8-eHlMWl|UW^3+=1FAoj^pv$a0v_8dP6)kd=w{6QYY-WUoIh_2l zy`Xu34*>LzKE3EGc78VWCD5;mhGQgIhWRg|9vlx&UkwR&=bNRqFbr%8Shhz;?Vhz0=aA~i8yr65CD`*}|Uu7l{AcJN6dC(h~V(&J-(r%T(x+qrCpZMlbOK7 zn*!J)Y!1BCGN^aJC8RXd4jEc~8sJvQt@%x7@xj^6YONjgoQbPeust@<`jCy;IK5I+uLX8%+=DeL5~Heq+ZA2j0fCKm=mTtYm;k>$e(o2)6t z=ou8>4A;X(JGO^erA>1UvcvNdnID-Syu6{$Uta%W3k<*Vhf%uTh#Sc2DdG}S25cUb zx!nZs$Hc5Ls$ZUB)*&?x6Vkzq7&ufi45(n&=5E2S08`w)e!5_-o|_uG6oV`cWT(k2 zqQ709tJVca{dlZXUFsoTTZ0Sg>_M(W$i+%~3KiZDiFO2ew1h12>Tv&um)JvxMjn>4 z98`M>Z7tK?OEpL*n~Anau+`!#)-Ey>v4=yJB4HxryX_#s`hG%f^HN@9mRT%Wt7boz zCtQF7OtP`1mwWFi#u`-p>B?efYG~gYhEKjAw_<972VS@(L{{D!&&JXzGT!t)km;qh z@Z4U&_snHf#BGsWl<)=zJ?i_g?DM?ppLNYXg$`=6|F>OOYuda4bq_g>Iip_0&h|8z z1HR5|&ykI6pN;wKtRO`(I(B??zzvxU^nr!4Ubd@D#Z+PwlbvcS_H0w`>owLZi>Byz zX5yzea$XbwfI7ag^v9@g#01||iMrd~%x_DTTFb2YQIQWOWgnHkuz7}WGkjWghKv>; znu|Nar#k0KXS29vG1nNtqO)~st5jUAD$cBPiZgGQF$rM>OG%R`rAMmloFw%JI;N?QsA z#5=odfZQ_T%J3qbqbo+DQArH)_eg}uI{IZ@j#tkfTuzV=+1Z1PrV=mku7cU)$AujK126AIQ=j`tYCrnaLH@CqevHxLp(T7nhhrZ3_d z5;Eq3+RAukx?_MuN_C({q>9pEX13Woho{3w5f>or@EtVHX&PgGd5AM5nCDE1O~$T= zTmAeMI#IXn=3mz`AM*HTsvOwm_Qm1=U7C}>jUv%~Xm70Oz{>Ro z@i>mpq5W;jaJ?`ss}@{Sbm!%XeFlVB;?JR?cORzFwgDs6cu0`Y$_Hpr`9KOW_e>qo zk!SwK%&MA<7IPwxRSU&E+rFG%)D^Rl=m&UY8Tc+7aZ^RGxgJv$u=6q5nl;szpdeXV znSm8GXd@u@*}}b|W-)HMfkY(Qw=O{01*l8rnXe8_&p37mHv?k8rC4~w;>qWSx|ol} z@}E4XhlOuOx~d`xSKVe2wB#u(3KT{x)~;4#d;u8Eprc3M3=cid@5oFN9g#*`lr2xz zzUNu6w8z`;P(%y&95GIi?ViRLMzfSVmQP%>9H{EMj_;R2f{GrDkJU2IBsBw42g3JK zgH)Av%uP!(7jVt96tQmS-=yq(Ct{s=nusV~ngMOvi*mo9SRrb+P0dH`4LHshkPQ6B zlI`~RnMqwpF@is5moGB?1PLjUA+_&dA;_1Aj6V<@w>f}L{N~)1{(M7X;cWCwIvuC> zlc2`A>dx(9l}m>bKk;X7Lq!)^sd(RxKKv$;2j>1|Aj2)`PFrkGdj}TMvRz2#wgivc zxlPcWewarX6U@TwX_v3%-E)HglYjeZluwkhim#fAGuCgNRV>jW8QU-mn4A5O0%{tr zo=e-}!uzki@oPUL4VFa_NsGfrQftxxJQxTy#!6u_8(LOqP1va~>7CncS=plM;woqP z`b@Jdlcwtw*q7!_%`#eMTtF2iomj(b;eL7za`voVRUlwe~i~#SSj3_)eXa&rz2`9whc%xrTYn1-A zVJ-jH2jEZri&Hrr+hO2Fcs7+1F(hALhtZ#sL;96Hi+n`0|QB9JV26oUE-0TR^zJfaKYIMLTP1x!gvKcBdJ|5)C z5}R(R6w&3*++4*iBzu^Rnv=tF%p6ZJnjt<#G68V8j)Ghsemip)K*g4C$LO@$_3*pY z%VuVQZiB)`+e^<-Fs;8mLyQC!LcaL4q`p2sJt-y<+4|pOK99k6g5V@1-UJRs680(F z_GCIubKi7{I^ZO}7~2JZfv-Sx(&g4(QJc41ifbWc>smilTPtwhy;DqlbHf7DVJ&2#2BPo6ev;Ksm6z|9I$}RpCVAJr zPV8`;U=*ZH)X7Fxx}@ysttjTSb3JQ%mRbfQn6ea|I=TbU0W!_@Il#2`xd_g;ZMXs>ShyS=T1A-<^v>V?(r#W*Bh$>@(W-Kv9j7OOI!|T|6VMiANb!oB> zW?vjYJ>PBB#(bBJ?;J3LRSQzqwCO($R1FITlA2B|4EW^UT2h$_JUPe_)s|XoKE)5- z!U#Z^CXFc{L0}&EBTD7U5to*97y~~e_uLMR0RHUkMN;&6Y|IFoc`plf7|d}9DSR^^ zwDdME>6$<=tVr*48D6RTmKUFHd%~oEku|CFY7+@xX8cfOWYARw*gFHlsX&P32v}ST z{X#&WthSXRDoQ@@$m~Nq(DmGZdrUtf_{H+5%9N+j2?mT@cC)?Zj#J-dmF3RrU*vn8L=Fs(m9; z>pb24!!HQ-(>IK$WR~|Q0?5-Rd(Sa&4}3zJo z1pUPgzf><6wU~P?TgSSWGEj@1RN0Se;+~^_KM3)5E-uLS}gg@x8STq z-9o+GC?9sHe|n~|6~MXP8@%KdH%(8T-!_ZeB(mHp0VCc8wNN7$#h?TYbjrUb_>=ODc%Q5O~sE!(J(AkWM;!IkgGn;&cju zJ@$EOftD@27S;+iB)WxsLQvZjHqXWW#F$aQ$n}l=))g)xoBl{k-D5zG?3-5MNA}T` zD%##$9JMHyj}5L+<3sbVq-#Rhm}zNBHY)6$i)c^CdJ(4@=OZFTGtX2yW2O~h!S)O| zQo|)?a{4tcxd?Splr1#O26E7e55sIf0$k;B1>1tLrjvxX2&eQeMv<`@n=0d3$(x%r z`p0HYU!f~Yg&oZ+VXEw|7C)GmKQ%>YKN2u?_zrW}=pH@VVfG02$1BlHE{7e$RNsj+ zZqMkOfdK+%9cFVdwWVAEAonft-j_gV)_ri~=z7gB&c+pm&gZ|c_ovydqJ>0BY3=5n%yLJ+rbO89KXgD29D z=LSH{^H3!4J%N^gX+IYBg(|C7+ehC|O7GLT=#Z_R1b$;skgmHb^Y{t+1&0D^Nj0hH z=JoUO&qFW|p5Me)sJnSxx&)hv0j-n&;--Rh{?1f>>fxfmiSu^#efXbm^|(e^j`y3N zolRgb@ci5Ke|+5=ai;*X=d(zUtr!<(Mh^gg>slZtM9dC6u(35kAd%Qr#~ z&$4QoZLUt6IEPByZGOWp*%Tj?g?^%;L&hz>SnO@|BBLaUQruf+OvzlDr0~anMR6yvx8D?C99GN_1Ln6@_KoN2k;8&d-yjjuXE)VI znqXs?U6b(Z!O?~LA1WUE6%JUjhS*1iAik;lRKw(*?dD;Rc^x@OR`s^s1n_s+h;1jH z%cqO4JR09l&sj@|rV-JxIsak+g;(mhVWc#9HxLJZCG-V8!M=|U4zVNwz7%5-4{N8H z$B&PF+BjG0itz&Hp)WsL=pGxzTMB`zL~d{-T0C;dvtuBY^C6igYrqI zm~6w&4RgEw`}tL=UP`CVy@>jT?N88eIm zaEY^2z%eOZlR+?}Yet~)z8U5zswEnFT&{=Qs=d8y+k8xPI9}pAlkVB~$5rF|v}HBw z&V9gP?gS#uNuYf3352!smRa|GSCImSR5+<8fAU(oZsAOz5p4gkGqiPqE%lzOcUl!a zp>3X#?W6cJcvtPzoBOE!D|C%stfH^F@BxF7Z%T#avZqA_-|`RP_rA}^WXDN0oqBB_ z*sm4%OCeMGJJI^7*JL#FTG}`%*}f^>IlNM?tG_NJ2R&JQ+r@J_CO`cme79&YiE4?&-ebW-~JP$m3VZ)fO+?kk+#_H@6lUxj8bfq<1aK2_Aa zSMKshYEkRa?g5iFkIi~_l76BSCh50;fhuU!BxH)XKcr5kGq~vl7J+DiV9?_{e2ihe zn-`$XeO=ZjuRTXzLmU5Y-K?fMzJzM7>;p@9GqQtIoU>Zj$>bfK zUQ6^@1a@R^ncsQFreRMX^!SUD)0v4yKpZ&`^3x$u7jUM-Xyrhw`UPxC^4Q`ghQvR~ z;{=dE&r89k=!TEYx|w@$1T98^R#PY3a;QJ<6dTs+B)ddSKYKpV?tC*^8OMy>bRP@I z-$X}}gPftDd*iw5ihn&s=u^(!TaxOjs1OZljkWiZ3cK$@jwHE&y$Z;h|E@qq&VsVeyKv_gQc3G9q$uKXo6mJV9VpX zdOKHb?MORpcU6Be(qnabIbeT{Ptur8HCkm< z-Zzocn4H=hlCoRf&%M`(&(UJOG*MlgDSGeS{V-w&D_=UC?p`KM9EXAVb~0D7@oXi- zNA-Elxefy&H@Yqq5EA?+h4`PGT^3?h97@ZG;3i^ub7B$S?Ls=knBXx&mKjSN;-}5@ zr|@gCq(LgVX}S�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