133d722a9Sopenharmony_ci#![allow(
233d722a9Sopenharmony_ci    clippy::boxed_local,
333d722a9Sopenharmony_ci    clippy::derive_partial_eq_without_eq,
433d722a9Sopenharmony_ci    clippy::just_underscores_and_digits,
533d722a9Sopenharmony_ci    clippy::missing_safety_doc,
633d722a9Sopenharmony_ci    clippy::must_use_candidate,
733d722a9Sopenharmony_ci    clippy::needless_lifetimes,
833d722a9Sopenharmony_ci    clippy::needless_pass_by_value,
933d722a9Sopenharmony_ci    clippy::ptr_arg,
1033d722a9Sopenharmony_ci    clippy::trivially_copy_pass_by_ref,
1133d722a9Sopenharmony_ci    clippy::unnecessary_wraps,
1233d722a9Sopenharmony_ci    clippy::unused_self
1333d722a9Sopenharmony_ci)]
1433d722a9Sopenharmony_ci
1533d722a9Sopenharmony_cipub mod cast;
1633d722a9Sopenharmony_cipub mod module;
1733d722a9Sopenharmony_ci
1833d722a9Sopenharmony_ciuse cxx::{type_id, CxxString, CxxVector, ExternType, SharedPtr, UniquePtr};
1933d722a9Sopenharmony_ciuse std::fmt::{self, Display};
2033d722a9Sopenharmony_ciuse std::mem::MaybeUninit;
2133d722a9Sopenharmony_ciuse std::os::raw::c_char;
2233d722a9Sopenharmony_ci
2333d722a9Sopenharmony_ci#[cxx::bridge(namespace = "tests")]
2433d722a9Sopenharmony_cipub mod ffi {
2533d722a9Sopenharmony_ci    #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
2633d722a9Sopenharmony_ci    struct Shared {
2733d722a9Sopenharmony_ci        z: usize,
2833d722a9Sopenharmony_ci    }
2933d722a9Sopenharmony_ci
3033d722a9Sopenharmony_ci    #[derive(PartialEq, PartialOrd)]
3133d722a9Sopenharmony_ci    struct SharedString {
3233d722a9Sopenharmony_ci        msg: String,
3333d722a9Sopenharmony_ci    }
3433d722a9Sopenharmony_ci
3533d722a9Sopenharmony_ci    #[derive(Debug, Hash, PartialOrd, Ord)]
3633d722a9Sopenharmony_ci    enum Enum {
3733d722a9Sopenharmony_ci        AVal,
3833d722a9Sopenharmony_ci        BVal = 2020,
3933d722a9Sopenharmony_ci        #[cxx_name = "CVal"]
4033d722a9Sopenharmony_ci        LastVal,
4133d722a9Sopenharmony_ci    }
4233d722a9Sopenharmony_ci
4333d722a9Sopenharmony_ci    #[namespace = "A"]
4433d722a9Sopenharmony_ci    #[derive(Copy, Clone, Default)]
4533d722a9Sopenharmony_ci    struct AShared {
4633d722a9Sopenharmony_ci        #[cxx_name = "type"]
4733d722a9Sopenharmony_ci        z: usize,
4833d722a9Sopenharmony_ci    }
4933d722a9Sopenharmony_ci
5033d722a9Sopenharmony_ci    #[namespace = "A"]
5133d722a9Sopenharmony_ci    enum AEnum {
5233d722a9Sopenharmony_ci        AAVal,
5333d722a9Sopenharmony_ci        ABVal = 2020,
5433d722a9Sopenharmony_ci        ACVal,
5533d722a9Sopenharmony_ci    }
5633d722a9Sopenharmony_ci
5733d722a9Sopenharmony_ci    #[namespace = "A::B"]
5833d722a9Sopenharmony_ci    enum ABEnum {
5933d722a9Sopenharmony_ci        ABAVal,
6033d722a9Sopenharmony_ci        ABBVal = 2020,
6133d722a9Sopenharmony_ci        ABCVal,
6233d722a9Sopenharmony_ci    }
6333d722a9Sopenharmony_ci
6433d722a9Sopenharmony_ci    #[namespace = "A::B"]
6533d722a9Sopenharmony_ci    #[derive(Clone)]
6633d722a9Sopenharmony_ci    struct ABShared {
6733d722a9Sopenharmony_ci        z: usize,
6833d722a9Sopenharmony_ci    }
6933d722a9Sopenharmony_ci
7033d722a9Sopenharmony_ci    #[namespace = "first"]
7133d722a9Sopenharmony_ci    struct First {
7233d722a9Sopenharmony_ci        second: Box<Second>,
7333d722a9Sopenharmony_ci    }
7433d722a9Sopenharmony_ci
7533d722a9Sopenharmony_ci    #[namespace = "second"]
7633d722a9Sopenharmony_ci    #[derive(Hash)]
7733d722a9Sopenharmony_ci    struct Second {
7833d722a9Sopenharmony_ci        i: i32,
7933d722a9Sopenharmony_ci        e: COwnedEnum,
8033d722a9Sopenharmony_ci    }
8133d722a9Sopenharmony_ci
8233d722a9Sopenharmony_ci    pub struct Array {
8333d722a9Sopenharmony_ci        a: [i32; 4],
8433d722a9Sopenharmony_ci        b: Buffer,
8533d722a9Sopenharmony_ci    }
8633d722a9Sopenharmony_ci
8733d722a9Sopenharmony_ci    #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
8833d722a9Sopenharmony_ci    pub struct StructWithLifetime<'a> {
8933d722a9Sopenharmony_ci        s: &'a str,
9033d722a9Sopenharmony_ci    }
9133d722a9Sopenharmony_ci
9233d722a9Sopenharmony_ci    unsafe extern "C++" {
9333d722a9Sopenharmony_ci        include!("tests/ffi/tests.h");
9433d722a9Sopenharmony_ci
9533d722a9Sopenharmony_ci        type C;
9633d722a9Sopenharmony_ci
9733d722a9Sopenharmony_ci        fn c_return_primitive() -> usize;
9833d722a9Sopenharmony_ci        fn c_return_shared() -> Shared;
9933d722a9Sopenharmony_ci        fn c_return_box() -> Box<R>;
10033d722a9Sopenharmony_ci        fn c_return_unique_ptr() -> UniquePtr<C>;
10133d722a9Sopenharmony_ci        fn c_return_shared_ptr() -> SharedPtr<C>;
10233d722a9Sopenharmony_ci        fn c_return_ref(shared: &Shared) -> &usize;
10333d722a9Sopenharmony_ci        fn c_return_mut(shared: &mut Shared) -> &mut usize;
10433d722a9Sopenharmony_ci        fn c_return_str(shared: &Shared) -> &str;
10533d722a9Sopenharmony_ci        fn c_return_slice_char(shared: &Shared) -> &[c_char];
10633d722a9Sopenharmony_ci        fn c_return_mutsliceu8(slice: &mut [u8]) -> &mut [u8];
10733d722a9Sopenharmony_ci        fn c_return_rust_string() -> String;
10833d722a9Sopenharmony_ci        fn c_return_rust_string_lossy() -> String;
10933d722a9Sopenharmony_ci        fn c_return_unique_ptr_string() -> UniquePtr<CxxString>;
11033d722a9Sopenharmony_ci        fn c_return_unique_ptr_vector_u8() -> UniquePtr<CxxVector<u8>>;
11133d722a9Sopenharmony_ci        fn c_return_unique_ptr_vector_f64() -> UniquePtr<CxxVector<f64>>;
11233d722a9Sopenharmony_ci        fn c_return_unique_ptr_vector_string() -> UniquePtr<CxxVector<CxxString>>;
11333d722a9Sopenharmony_ci        fn c_return_unique_ptr_vector_shared() -> UniquePtr<CxxVector<Shared>>;
11433d722a9Sopenharmony_ci        fn c_return_unique_ptr_vector_opaque() -> UniquePtr<CxxVector<C>>;
11533d722a9Sopenharmony_ci        fn c_return_ref_vector(c: &C) -> &CxxVector<u8>;
11633d722a9Sopenharmony_ci        fn c_return_mut_vector(c: Pin<&mut C>) -> Pin<&mut CxxVector<u8>>;
11733d722a9Sopenharmony_ci        fn c_return_rust_vec_u8() -> Vec<u8>;
11833d722a9Sopenharmony_ci        fn c_return_ref_rust_vec(c: &C) -> &Vec<u8>;
11933d722a9Sopenharmony_ci        fn c_return_mut_rust_vec(c: Pin<&mut C>) -> &mut Vec<u8>;
12033d722a9Sopenharmony_ci        fn c_return_rust_vec_string() -> Vec<String>;
12133d722a9Sopenharmony_ci        fn c_return_rust_vec_bool() -> Vec<bool>;
12233d722a9Sopenharmony_ci        fn c_return_identity(_: usize) -> usize;
12333d722a9Sopenharmony_ci        fn c_return_sum(_: usize, _: usize) -> usize;
12433d722a9Sopenharmony_ci        fn c_return_enum(n: u16) -> Enum;
12533d722a9Sopenharmony_ci        fn c_return_ns_ref(shared: &AShared) -> &usize;
12633d722a9Sopenharmony_ci        fn c_return_nested_ns_ref(shared: &ABShared) -> &usize;
12733d722a9Sopenharmony_ci        fn c_return_ns_enum(n: u16) -> AEnum;
12833d722a9Sopenharmony_ci        fn c_return_nested_ns_enum(n: u16) -> ABEnum;
12933d722a9Sopenharmony_ci        fn c_return_const_ptr(n: usize) -> *const C;
13033d722a9Sopenharmony_ci        fn c_return_mut_ptr(n: usize) -> *mut C;
13133d722a9Sopenharmony_ci
13233d722a9Sopenharmony_ci        fn c_take_primitive(n: usize);
13333d722a9Sopenharmony_ci        fn c_take_shared(shared: Shared);
13433d722a9Sopenharmony_ci        fn c_take_box(r: Box<R>);
13533d722a9Sopenharmony_ci        fn c_take_ref_r(r: &R);
13633d722a9Sopenharmony_ci        fn c_take_ref_c(c: &C);
13733d722a9Sopenharmony_ci        fn c_take_str(s: &str);
13833d722a9Sopenharmony_ci        fn c_take_slice_char(s: &[c_char]);
13933d722a9Sopenharmony_ci        fn c_take_slice_shared(s: &[Shared]);
14033d722a9Sopenharmony_ci        fn c_take_slice_shared_sort(s: &mut [Shared]);
14133d722a9Sopenharmony_ci        fn c_take_slice_r(s: &[R]);
14233d722a9Sopenharmony_ci        fn c_take_slice_r_sort(s: &mut [R]);
14333d722a9Sopenharmony_ci        fn c_take_rust_string(s: String);
14433d722a9Sopenharmony_ci        fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
14533d722a9Sopenharmony_ci        fn c_take_unique_ptr_vector_u8(v: UniquePtr<CxxVector<u8>>);
14633d722a9Sopenharmony_ci        fn c_take_unique_ptr_vector_f64(v: UniquePtr<CxxVector<f64>>);
14733d722a9Sopenharmony_ci        fn c_take_unique_ptr_vector_string(v: UniquePtr<CxxVector<CxxString>>);
14833d722a9Sopenharmony_ci        fn c_take_unique_ptr_vector_shared(v: UniquePtr<CxxVector<Shared>>);
14933d722a9Sopenharmony_ci        fn c_take_ref_vector(v: &CxxVector<u8>);
15033d722a9Sopenharmony_ci        fn c_take_rust_vec(v: Vec<u8>);
15133d722a9Sopenharmony_ci        fn c_take_rust_vec_shared(v: Vec<Shared>);
15233d722a9Sopenharmony_ci        fn c_take_rust_vec_string(v: Vec<String>);
15333d722a9Sopenharmony_ci        fn c_take_rust_vec_index(v: Vec<u8>);
15433d722a9Sopenharmony_ci        fn c_take_rust_vec_shared_index(v: Vec<Shared>);
15533d722a9Sopenharmony_ci        fn c_take_rust_vec_shared_push(v: Vec<Shared>);
15633d722a9Sopenharmony_ci        fn c_take_rust_vec_shared_truncate(v: Vec<Shared>);
15733d722a9Sopenharmony_ci        fn c_take_rust_vec_shared_clear(v: Vec<Shared>);
15833d722a9Sopenharmony_ci        fn c_take_rust_vec_shared_forward_iterator(v: Vec<Shared>);
15933d722a9Sopenharmony_ci        fn c_take_rust_vec_shared_sort(v: Vec<Shared>);
16033d722a9Sopenharmony_ci        fn c_take_ref_rust_vec(v: &Vec<u8>);
16133d722a9Sopenharmony_ci        fn c_take_ref_rust_vec_string(v: &Vec<String>);
16233d722a9Sopenharmony_ci        fn c_take_ref_rust_vec_index(v: &Vec<u8>);
16333d722a9Sopenharmony_ci        fn c_take_ref_rust_vec_copy(v: &Vec<u8>);
16433d722a9Sopenharmony_ci        fn c_take_ref_shared_string(s: &SharedString) -> &SharedString;
16533d722a9Sopenharmony_ci        fn c_take_callback(callback: fn(String) -> usize);
16633d722a9Sopenharmony_ci        fn c_take_callback_ref(callback: fn(&String));
16733d722a9Sopenharmony_ci        #[cxx_name = "c_take_callback_ref"]
16833d722a9Sopenharmony_ci        fn c_take_callback_ref_lifetime<'a>(callback: fn(&'a String));
16933d722a9Sopenharmony_ci        fn c_take_callback_mut(callback: fn(&mut String));
17033d722a9Sopenharmony_ci        fn c_take_enum(e: Enum);
17133d722a9Sopenharmony_ci        fn c_take_ns_enum(e: AEnum);
17233d722a9Sopenharmony_ci        fn c_take_nested_ns_enum(e: ABEnum);
17333d722a9Sopenharmony_ci        fn c_take_ns_shared(shared: AShared);
17433d722a9Sopenharmony_ci        fn c_take_nested_ns_shared(shared: ABShared);
17533d722a9Sopenharmony_ci        fn c_take_rust_vec_ns_shared(v: Vec<AShared>);
17633d722a9Sopenharmony_ci        fn c_take_rust_vec_nested_ns_shared(v: Vec<ABShared>);
17733d722a9Sopenharmony_ci        unsafe fn c_take_const_ptr(c: *const C) -> usize;
17833d722a9Sopenharmony_ci        unsafe fn c_take_mut_ptr(c: *mut C) -> usize;
17933d722a9Sopenharmony_ci
18033d722a9Sopenharmony_ci        fn c_try_return_void() -> Result<()>;
18133d722a9Sopenharmony_ci        fn c_try_return_primitive() -> Result<usize>;
18233d722a9Sopenharmony_ci        fn c_fail_return_primitive() -> Result<usize>;
18333d722a9Sopenharmony_ci        fn c_try_return_box() -> Result<Box<R>>;
18433d722a9Sopenharmony_ci        fn c_try_return_ref(s: &String) -> Result<&String>;
18533d722a9Sopenharmony_ci        fn c_try_return_str(s: &str) -> Result<&str>;
18633d722a9Sopenharmony_ci        fn c_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>;
18733d722a9Sopenharmony_ci        fn c_try_return_mutsliceu8(s: &mut [u8]) -> Result<&mut [u8]>;
18833d722a9Sopenharmony_ci        fn c_try_return_rust_string() -> Result<String>;
18933d722a9Sopenharmony_ci        fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
19033d722a9Sopenharmony_ci        fn c_try_return_rust_vec() -> Result<Vec<u8>>;
19133d722a9Sopenharmony_ci        fn c_try_return_rust_vec_string() -> Result<Vec<String>>;
19233d722a9Sopenharmony_ci        fn c_try_return_ref_rust_vec(c: &C) -> Result<&Vec<u8>>;
19333d722a9Sopenharmony_ci
19433d722a9Sopenharmony_ci        fn get(self: &C) -> usize;
19533d722a9Sopenharmony_ci        fn set(self: Pin<&mut C>, n: usize) -> usize;
19633d722a9Sopenharmony_ci        fn get2(&self) -> usize;
19733d722a9Sopenharmony_ci        fn getRef(self: &C) -> &usize;
19833d722a9Sopenharmony_ci        fn getMut(self: Pin<&mut C>) -> &mut usize;
19933d722a9Sopenharmony_ci        fn set_succeed(self: Pin<&mut C>, n: usize) -> Result<usize>;
20033d722a9Sopenharmony_ci        fn get_fail(self: Pin<&mut C>) -> Result<usize>;
20133d722a9Sopenharmony_ci        fn c_method_on_shared(self: &Shared) -> usize;
20233d722a9Sopenharmony_ci        fn c_method_ref_on_shared(self: &Shared) -> &usize;
20333d722a9Sopenharmony_ci        fn c_method_mut_on_shared(self: &mut Shared) -> &mut usize;
20433d722a9Sopenharmony_ci        fn c_set_array(self: &mut Array, value: i32);
20533d722a9Sopenharmony_ci
20633d722a9Sopenharmony_ci        fn c_get_use_count(weak: &WeakPtr<C>) -> usize;
20733d722a9Sopenharmony_ci
20833d722a9Sopenharmony_ci        #[rust_name = "i32_overloaded_method"]
20933d722a9Sopenharmony_ci        fn cOverloadedMethod(&self, x: i32) -> String;
21033d722a9Sopenharmony_ci        #[rust_name = "str_overloaded_method"]
21133d722a9Sopenharmony_ci        fn cOverloadedMethod(&self, x: &str) -> String;
21233d722a9Sopenharmony_ci        #[rust_name = "i32_overloaded_function"]
21333d722a9Sopenharmony_ci        fn cOverloadedFunction(x: i32) -> String;
21433d722a9Sopenharmony_ci        #[rust_name = "str_overloaded_function"]
21533d722a9Sopenharmony_ci        fn cOverloadedFunction(x: &str) -> String;
21633d722a9Sopenharmony_ci
21733d722a9Sopenharmony_ci        #[namespace = "other"]
21833d722a9Sopenharmony_ci        fn ns_c_take_ns_shared(shared: AShared);
21933d722a9Sopenharmony_ci    }
22033d722a9Sopenharmony_ci
22133d722a9Sopenharmony_ci    extern "C++" {
22233d722a9Sopenharmony_ci        include!("tests/ffi/module.rs.h");
22333d722a9Sopenharmony_ci
22433d722a9Sopenharmony_ci        type COwnedEnum;
22533d722a9Sopenharmony_ci        type Job = crate::module::ffi::Job;
22633d722a9Sopenharmony_ci    }
22733d722a9Sopenharmony_ci
22833d722a9Sopenharmony_ci    extern "Rust" {
22933d722a9Sopenharmony_ci        #[derive(ExternType)]
23033d722a9Sopenharmony_ci        type Reference<'a>;
23133d722a9Sopenharmony_ci    }
23233d722a9Sopenharmony_ci
23333d722a9Sopenharmony_ci    unsafe extern "C++" {
23433d722a9Sopenharmony_ci        type Borrow<'a>;
23533d722a9Sopenharmony_ci
23633d722a9Sopenharmony_ci        fn c_return_borrow<'a>(s: &'a CxxString) -> UniquePtr<Borrow<'a>>;
23733d722a9Sopenharmony_ci
23833d722a9Sopenharmony_ci        #[rust_name = "c_return_borrow_elided"]
23933d722a9Sopenharmony_ci        fn c_return_borrow(s: &CxxString) -> UniquePtr<Borrow>;
24033d722a9Sopenharmony_ci
24133d722a9Sopenharmony_ci        fn const_member(self: &Borrow);
24233d722a9Sopenharmony_ci        fn nonconst_member(self: Pin<&mut Borrow>);
24333d722a9Sopenharmony_ci    }
24433d722a9Sopenharmony_ci
24533d722a9Sopenharmony_ci    #[repr(u32)]
24633d722a9Sopenharmony_ci    #[derive(Hash)]
24733d722a9Sopenharmony_ci    enum COwnedEnum {
24833d722a9Sopenharmony_ci        #[cxx_name = "CVAL1"]
24933d722a9Sopenharmony_ci        CVal1,
25033d722a9Sopenharmony_ci        #[cxx_name = "CVAL2"]
25133d722a9Sopenharmony_ci        CVal2,
25233d722a9Sopenharmony_ci    }
25333d722a9Sopenharmony_ci
25433d722a9Sopenharmony_ci    extern "C++" {
25533d722a9Sopenharmony_ci        type Buffer = crate::Buffer;
25633d722a9Sopenharmony_ci    }
25733d722a9Sopenharmony_ci
25833d722a9Sopenharmony_ci    extern "Rust" {
25933d722a9Sopenharmony_ci        type R;
26033d722a9Sopenharmony_ci
26133d722a9Sopenharmony_ci        fn r_return_primitive() -> usize;
26233d722a9Sopenharmony_ci        fn r_return_shared() -> Shared;
26333d722a9Sopenharmony_ci        fn r_return_box() -> Box<R>;
26433d722a9Sopenharmony_ci        fn r_return_unique_ptr() -> UniquePtr<C>;
26533d722a9Sopenharmony_ci        fn r_return_shared_ptr() -> SharedPtr<C>;
26633d722a9Sopenharmony_ci        fn r_return_ref(shared: &Shared) -> &usize;
26733d722a9Sopenharmony_ci        fn r_return_mut(shared: &mut Shared) -> &mut usize;
26833d722a9Sopenharmony_ci        fn r_return_str(shared: &Shared) -> &str;
26933d722a9Sopenharmony_ci        fn r_return_sliceu8(shared: &Shared) -> &[u8];
27033d722a9Sopenharmony_ci        fn r_return_mutsliceu8(slice: &mut [u8]) -> &mut [u8];
27133d722a9Sopenharmony_ci        fn r_return_rust_string() -> String;
27233d722a9Sopenharmony_ci        fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
27333d722a9Sopenharmony_ci        fn r_return_rust_vec() -> Vec<u8>;
27433d722a9Sopenharmony_ci        fn r_return_rust_vec_string() -> Vec<String>;
27533d722a9Sopenharmony_ci        fn r_return_rust_vec_extern_struct() -> Vec<Job>;
27633d722a9Sopenharmony_ci        fn r_return_ref_rust_vec(shared: &Shared) -> &Vec<u8>;
27733d722a9Sopenharmony_ci        fn r_return_mut_rust_vec(shared: &mut Shared) -> &mut Vec<u8>;
27833d722a9Sopenharmony_ci        fn r_return_identity(_: usize) -> usize;
27933d722a9Sopenharmony_ci        fn r_return_sum(_: usize, _: usize) -> usize;
28033d722a9Sopenharmony_ci        fn r_return_enum(n: u32) -> Enum;
28133d722a9Sopenharmony_ci
28233d722a9Sopenharmony_ci        fn r_take_primitive(n: usize);
28333d722a9Sopenharmony_ci        fn r_take_shared(shared: Shared);
28433d722a9Sopenharmony_ci        fn r_take_box(r: Box<R>);
28533d722a9Sopenharmony_ci        fn r_take_unique_ptr(c: UniquePtr<C>);
28633d722a9Sopenharmony_ci        fn r_take_shared_ptr(c: SharedPtr<C>);
28733d722a9Sopenharmony_ci        fn r_take_ref_r(r: &R);
28833d722a9Sopenharmony_ci        fn r_take_ref_c(c: &C);
28933d722a9Sopenharmony_ci        fn r_take_str(s: &str);
29033d722a9Sopenharmony_ci        fn r_take_slice_char(s: &[c_char]);
29133d722a9Sopenharmony_ci        fn r_take_rust_string(s: String);
29233d722a9Sopenharmony_ci        fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
29333d722a9Sopenharmony_ci        fn r_take_ref_vector(v: &CxxVector<u8>);
29433d722a9Sopenharmony_ci        fn r_take_ref_empty_vector(v: &CxxVector<u64>);
29533d722a9Sopenharmony_ci        fn r_take_rust_vec(v: Vec<u8>);
29633d722a9Sopenharmony_ci        fn r_take_rust_vec_string(v: Vec<String>);
29733d722a9Sopenharmony_ci        fn r_take_ref_rust_vec(v: &Vec<u8>);
29833d722a9Sopenharmony_ci        fn r_take_ref_rust_vec_string(v: &Vec<String>);
29933d722a9Sopenharmony_ci        fn r_take_enum(e: Enum);
30033d722a9Sopenharmony_ci
30133d722a9Sopenharmony_ci        fn r_try_return_void() -> Result<()>;
30233d722a9Sopenharmony_ci        fn r_try_return_primitive() -> Result<usize>;
30333d722a9Sopenharmony_ci        fn r_try_return_box() -> Result<Box<R>>;
30433d722a9Sopenharmony_ci        fn r_fail_return_primitive() -> Result<usize>;
30533d722a9Sopenharmony_ci        fn r_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>;
30633d722a9Sopenharmony_ci        fn r_try_return_mutsliceu8(s: &mut [u8]) -> Result<&mut [u8]>;
30733d722a9Sopenharmony_ci
30833d722a9Sopenharmony_ci        fn get(self: &R) -> usize;
30933d722a9Sopenharmony_ci        fn set(self: &mut R, n: usize) -> usize;
31033d722a9Sopenharmony_ci        fn r_method_on_shared(self: &Shared) -> String;
31133d722a9Sopenharmony_ci        fn r_get_array_sum(self: &Array) -> i32;
31233d722a9Sopenharmony_ci
31333d722a9Sopenharmony_ci        #[cxx_name = "rAliasedFunction"]
31433d722a9Sopenharmony_ci        fn r_aliased_function(x: i32) -> String;
31533d722a9Sopenharmony_ci    }
31633d722a9Sopenharmony_ci
31733d722a9Sopenharmony_ci    struct Dag0 {
31833d722a9Sopenharmony_ci        i: i32,
31933d722a9Sopenharmony_ci    }
32033d722a9Sopenharmony_ci
32133d722a9Sopenharmony_ci    struct Dag1 {
32233d722a9Sopenharmony_ci        dag2: Dag2,
32333d722a9Sopenharmony_ci        vec: Vec<Dag3>,
32433d722a9Sopenharmony_ci    }
32533d722a9Sopenharmony_ci
32633d722a9Sopenharmony_ci    struct Dag2 {
32733d722a9Sopenharmony_ci        dag4: Dag4,
32833d722a9Sopenharmony_ci    }
32933d722a9Sopenharmony_ci
33033d722a9Sopenharmony_ci    struct Dag3 {
33133d722a9Sopenharmony_ci        dag1: Dag1,
33233d722a9Sopenharmony_ci    }
33333d722a9Sopenharmony_ci
33433d722a9Sopenharmony_ci    struct Dag4 {
33533d722a9Sopenharmony_ci        dag0: Dag0,
33633d722a9Sopenharmony_ci    }
33733d722a9Sopenharmony_ci
33833d722a9Sopenharmony_ci    impl Box<Shared> {}
33933d722a9Sopenharmony_ci    impl CxxVector<SharedString> {}
34033d722a9Sopenharmony_ci}
34133d722a9Sopenharmony_ci
34233d722a9Sopenharmony_cimod other {
34333d722a9Sopenharmony_ci    use cxx::kind::{Opaque, Trivial};
34433d722a9Sopenharmony_ci    use cxx::{type_id, CxxString, ExternType};
34533d722a9Sopenharmony_ci
34633d722a9Sopenharmony_ci    #[repr(C)]
34733d722a9Sopenharmony_ci    pub struct D {
34833d722a9Sopenharmony_ci        pub d: u64,
34933d722a9Sopenharmony_ci    }
35033d722a9Sopenharmony_ci
35133d722a9Sopenharmony_ci    #[repr(C)]
35233d722a9Sopenharmony_ci    pub struct E {
35333d722a9Sopenharmony_ci        e: u64,
35433d722a9Sopenharmony_ci        e_str: CxxString,
35533d722a9Sopenharmony_ci    }
35633d722a9Sopenharmony_ci
35733d722a9Sopenharmony_ci    pub mod f {
35833d722a9Sopenharmony_ci        use cxx::kind::Opaque;
35933d722a9Sopenharmony_ci        use cxx::{type_id, CxxString, ExternType};
36033d722a9Sopenharmony_ci
36133d722a9Sopenharmony_ci        #[repr(C)]
36233d722a9Sopenharmony_ci        pub struct F {
36333d722a9Sopenharmony_ci            e: u64,
36433d722a9Sopenharmony_ci            e_str: CxxString,
36533d722a9Sopenharmony_ci        }
36633d722a9Sopenharmony_ci
36733d722a9Sopenharmony_ci        unsafe impl ExternType for F {
36833d722a9Sopenharmony_ci            type Id = type_id!("F::F");
36933d722a9Sopenharmony_ci            type Kind = Opaque;
37033d722a9Sopenharmony_ci        }
37133d722a9Sopenharmony_ci    }
37233d722a9Sopenharmony_ci
37333d722a9Sopenharmony_ci    #[repr(C)]
37433d722a9Sopenharmony_ci    pub struct G {
37533d722a9Sopenharmony_ci        pub g: u64,
37633d722a9Sopenharmony_ci    }
37733d722a9Sopenharmony_ci
37833d722a9Sopenharmony_ci    unsafe impl ExternType for G {
37933d722a9Sopenharmony_ci        type Id = type_id!("G::G");
38033d722a9Sopenharmony_ci        type Kind = Trivial;
38133d722a9Sopenharmony_ci    }
38233d722a9Sopenharmony_ci
38333d722a9Sopenharmony_ci    unsafe impl ExternType for D {
38433d722a9Sopenharmony_ci        type Id = type_id!("tests::D");
38533d722a9Sopenharmony_ci        type Kind = Trivial;
38633d722a9Sopenharmony_ci    }
38733d722a9Sopenharmony_ci
38833d722a9Sopenharmony_ci    unsafe impl ExternType for E {
38933d722a9Sopenharmony_ci        type Id = type_id!("tests::E");
39033d722a9Sopenharmony_ci        type Kind = Opaque;
39133d722a9Sopenharmony_ci    }
39233d722a9Sopenharmony_ci}
39333d722a9Sopenharmony_ci
39433d722a9Sopenharmony_ci#[derive(PartialEq, Debug)]
39533d722a9Sopenharmony_cipub struct R(pub usize);
39633d722a9Sopenharmony_ci
39733d722a9Sopenharmony_ciimpl R {
39833d722a9Sopenharmony_ci    fn get(&self) -> usize {
39933d722a9Sopenharmony_ci        self.0
40033d722a9Sopenharmony_ci    }
40133d722a9Sopenharmony_ci
40233d722a9Sopenharmony_ci    fn set(&mut self, n: usize) -> usize {
40333d722a9Sopenharmony_ci        self.0 = n;
40433d722a9Sopenharmony_ci        n
40533d722a9Sopenharmony_ci    }
40633d722a9Sopenharmony_ci}
40733d722a9Sopenharmony_ci
40833d722a9Sopenharmony_cipub struct Reference<'a>(&'a String);
40933d722a9Sopenharmony_ci
41033d722a9Sopenharmony_ciimpl ffi::Shared {
41133d722a9Sopenharmony_ci    fn r_method_on_shared(&self) -> String {
41233d722a9Sopenharmony_ci        "2020".to_owned()
41333d722a9Sopenharmony_ci    }
41433d722a9Sopenharmony_ci}
41533d722a9Sopenharmony_ci
41633d722a9Sopenharmony_ciimpl ffi::Array {
41733d722a9Sopenharmony_ci    pub fn r_get_array_sum(&self) -> i32 {
41833d722a9Sopenharmony_ci        self.a.iter().sum()
41933d722a9Sopenharmony_ci    }
42033d722a9Sopenharmony_ci}
42133d722a9Sopenharmony_ci
42233d722a9Sopenharmony_ci#[derive(Default)]
42333d722a9Sopenharmony_ci#[repr(C)]
42433d722a9Sopenharmony_cipub struct Buffer([c_char; 12]);
42533d722a9Sopenharmony_ci
42633d722a9Sopenharmony_ciunsafe impl ExternType for Buffer {
42733d722a9Sopenharmony_ci    type Id = type_id!("tests::Buffer");
42833d722a9Sopenharmony_ci    type Kind = cxx::kind::Trivial;
42933d722a9Sopenharmony_ci}
43033d722a9Sopenharmony_ci
43133d722a9Sopenharmony_ci#[derive(Debug)]
43233d722a9Sopenharmony_cistruct Error;
43333d722a9Sopenharmony_ci
43433d722a9Sopenharmony_ciimpl std::error::Error for Error {}
43533d722a9Sopenharmony_ci
43633d722a9Sopenharmony_ciimpl Display for Error {
43733d722a9Sopenharmony_ci    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
43833d722a9Sopenharmony_ci        f.write_str("rust error")
43933d722a9Sopenharmony_ci    }
44033d722a9Sopenharmony_ci}
44133d722a9Sopenharmony_ci
44233d722a9Sopenharmony_cifn r_return_primitive() -> usize {
44333d722a9Sopenharmony_ci    2020
44433d722a9Sopenharmony_ci}
44533d722a9Sopenharmony_ci
44633d722a9Sopenharmony_cifn r_return_shared() -> ffi::Shared {
44733d722a9Sopenharmony_ci    ffi::Shared { z: 2020 }
44833d722a9Sopenharmony_ci}
44933d722a9Sopenharmony_ci
45033d722a9Sopenharmony_cifn r_return_box() -> Box<R> {
45133d722a9Sopenharmony_ci    Box::new(R(2020))
45233d722a9Sopenharmony_ci}
45333d722a9Sopenharmony_ci
45433d722a9Sopenharmony_cifn r_return_unique_ptr() -> UniquePtr<ffi::C> {
45533d722a9Sopenharmony_ci    extern "C" {
45633d722a9Sopenharmony_ci        fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
45733d722a9Sopenharmony_ci    }
45833d722a9Sopenharmony_ci    unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
45933d722a9Sopenharmony_ci}
46033d722a9Sopenharmony_ci
46133d722a9Sopenharmony_cifn r_return_shared_ptr() -> SharedPtr<ffi::C> {
46233d722a9Sopenharmony_ci    extern "C" {
46333d722a9Sopenharmony_ci        fn cxx_test_suite_get_shared_ptr(repr: *mut SharedPtr<ffi::C>);
46433d722a9Sopenharmony_ci    }
46533d722a9Sopenharmony_ci    let mut shared_ptr = MaybeUninit::<SharedPtr<ffi::C>>::uninit();
46633d722a9Sopenharmony_ci    let repr = shared_ptr.as_mut_ptr();
46733d722a9Sopenharmony_ci    unsafe {
46833d722a9Sopenharmony_ci        cxx_test_suite_get_shared_ptr(repr);
46933d722a9Sopenharmony_ci        shared_ptr.assume_init()
47033d722a9Sopenharmony_ci    }
47133d722a9Sopenharmony_ci}
47233d722a9Sopenharmony_ci
47333d722a9Sopenharmony_cifn r_return_ref(shared: &ffi::Shared) -> &usize {
47433d722a9Sopenharmony_ci    &shared.z
47533d722a9Sopenharmony_ci}
47633d722a9Sopenharmony_ci
47733d722a9Sopenharmony_cifn r_return_mut(shared: &mut ffi::Shared) -> &mut usize {
47833d722a9Sopenharmony_ci    &mut shared.z
47933d722a9Sopenharmony_ci}
48033d722a9Sopenharmony_ci
48133d722a9Sopenharmony_cifn r_return_str(shared: &ffi::Shared) -> &str {
48233d722a9Sopenharmony_ci    let _ = shared;
48333d722a9Sopenharmony_ci    "2020"
48433d722a9Sopenharmony_ci}
48533d722a9Sopenharmony_ci
48633d722a9Sopenharmony_cifn r_return_sliceu8(shared: &ffi::Shared) -> &[u8] {
48733d722a9Sopenharmony_ci    let _ = shared;
48833d722a9Sopenharmony_ci    b"2020"
48933d722a9Sopenharmony_ci}
49033d722a9Sopenharmony_ci
49133d722a9Sopenharmony_cifn r_return_mutsliceu8(slice: &mut [u8]) -> &mut [u8] {
49233d722a9Sopenharmony_ci    slice
49333d722a9Sopenharmony_ci}
49433d722a9Sopenharmony_ci
49533d722a9Sopenharmony_cifn r_return_rust_string() -> String {
49633d722a9Sopenharmony_ci    "2020".to_owned()
49733d722a9Sopenharmony_ci}
49833d722a9Sopenharmony_ci
49933d722a9Sopenharmony_cifn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
50033d722a9Sopenharmony_ci    extern "C" {
50133d722a9Sopenharmony_ci        fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
50233d722a9Sopenharmony_ci    }
50333d722a9Sopenharmony_ci    unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
50433d722a9Sopenharmony_ci}
50533d722a9Sopenharmony_ci
50633d722a9Sopenharmony_cifn r_return_rust_vec() -> Vec<u8> {
50733d722a9Sopenharmony_ci    Vec::new()
50833d722a9Sopenharmony_ci}
50933d722a9Sopenharmony_ci
51033d722a9Sopenharmony_cifn r_return_rust_vec_string() -> Vec<String> {
51133d722a9Sopenharmony_ci    Vec::new()
51233d722a9Sopenharmony_ci}
51333d722a9Sopenharmony_ci
51433d722a9Sopenharmony_cifn r_return_rust_vec_extern_struct() -> Vec<ffi::Job> {
51533d722a9Sopenharmony_ci    Vec::new()
51633d722a9Sopenharmony_ci}
51733d722a9Sopenharmony_ci
51833d722a9Sopenharmony_cifn r_return_ref_rust_vec(shared: &ffi::Shared) -> &Vec<u8> {
51933d722a9Sopenharmony_ci    let _ = shared;
52033d722a9Sopenharmony_ci    unimplemented!()
52133d722a9Sopenharmony_ci}
52233d722a9Sopenharmony_ci
52333d722a9Sopenharmony_cifn r_return_mut_rust_vec(shared: &mut ffi::Shared) -> &mut Vec<u8> {
52433d722a9Sopenharmony_ci    let _ = shared;
52533d722a9Sopenharmony_ci    unimplemented!()
52633d722a9Sopenharmony_ci}
52733d722a9Sopenharmony_ci
52833d722a9Sopenharmony_cifn r_return_identity(n: usize) -> usize {
52933d722a9Sopenharmony_ci    n
53033d722a9Sopenharmony_ci}
53133d722a9Sopenharmony_ci
53233d722a9Sopenharmony_cifn r_return_sum(n1: usize, n2: usize) -> usize {
53333d722a9Sopenharmony_ci    n1 + n2
53433d722a9Sopenharmony_ci}
53533d722a9Sopenharmony_ci
53633d722a9Sopenharmony_cifn r_return_enum(n: u32) -> ffi::Enum {
53733d722a9Sopenharmony_ci    if n == 0 {
53833d722a9Sopenharmony_ci        ffi::Enum::AVal
53933d722a9Sopenharmony_ci    } else if n <= 2020 {
54033d722a9Sopenharmony_ci        ffi::Enum::BVal
54133d722a9Sopenharmony_ci    } else {
54233d722a9Sopenharmony_ci        ffi::Enum::LastVal
54333d722a9Sopenharmony_ci    }
54433d722a9Sopenharmony_ci}
54533d722a9Sopenharmony_ci
54633d722a9Sopenharmony_cifn r_take_primitive(n: usize) {
54733d722a9Sopenharmony_ci    assert_eq!(n, 2020);
54833d722a9Sopenharmony_ci}
54933d722a9Sopenharmony_ci
55033d722a9Sopenharmony_cifn r_take_shared(shared: ffi::Shared) {
55133d722a9Sopenharmony_ci    assert_eq!(shared.z, 2020);
55233d722a9Sopenharmony_ci}
55333d722a9Sopenharmony_ci
55433d722a9Sopenharmony_cifn r_take_box(r: Box<R>) {
55533d722a9Sopenharmony_ci    let _ = r;
55633d722a9Sopenharmony_ci}
55733d722a9Sopenharmony_ci
55833d722a9Sopenharmony_cifn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
55933d722a9Sopenharmony_ci    let _ = c;
56033d722a9Sopenharmony_ci}
56133d722a9Sopenharmony_ci
56233d722a9Sopenharmony_cifn r_take_shared_ptr(c: SharedPtr<ffi::C>) {
56333d722a9Sopenharmony_ci    let _ = c;
56433d722a9Sopenharmony_ci}
56533d722a9Sopenharmony_ci
56633d722a9Sopenharmony_cifn r_take_ref_r(r: &R) {
56733d722a9Sopenharmony_ci    let _ = r;
56833d722a9Sopenharmony_ci}
56933d722a9Sopenharmony_ci
57033d722a9Sopenharmony_cifn r_take_ref_c(c: &ffi::C) {
57133d722a9Sopenharmony_ci    let _ = c;
57233d722a9Sopenharmony_ci}
57333d722a9Sopenharmony_ci
57433d722a9Sopenharmony_cifn r_take_str(s: &str) {
57533d722a9Sopenharmony_ci    assert_eq!(s, "2020");
57633d722a9Sopenharmony_ci}
57733d722a9Sopenharmony_ci
57833d722a9Sopenharmony_cifn r_take_rust_string(s: String) {
57933d722a9Sopenharmony_ci    assert_eq!(s, "2020");
58033d722a9Sopenharmony_ci}
58133d722a9Sopenharmony_ci
58233d722a9Sopenharmony_cifn r_take_slice_char(s: &[c_char]) {
58333d722a9Sopenharmony_ci    assert_eq!(s.len(), 5);
58433d722a9Sopenharmony_ci    let s = cast::c_char_to_unsigned(s);
58533d722a9Sopenharmony_ci    assert_eq!(std::str::from_utf8(s).unwrap(), "2020\0");
58633d722a9Sopenharmony_ci}
58733d722a9Sopenharmony_ci
58833d722a9Sopenharmony_cifn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
58933d722a9Sopenharmony_ci    assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
59033d722a9Sopenharmony_ci}
59133d722a9Sopenharmony_ci
59233d722a9Sopenharmony_cifn r_take_ref_vector(v: &CxxVector<u8>) {
59333d722a9Sopenharmony_ci    let slice = v.as_slice();
59433d722a9Sopenharmony_ci    assert_eq!(slice, [20, 2, 0]);
59533d722a9Sopenharmony_ci}
59633d722a9Sopenharmony_ci
59733d722a9Sopenharmony_cifn r_take_ref_empty_vector(v: &CxxVector<u64>) {
59833d722a9Sopenharmony_ci    assert!(v.as_slice().is_empty());
59933d722a9Sopenharmony_ci    assert!(v.is_empty());
60033d722a9Sopenharmony_ci}
60133d722a9Sopenharmony_ci
60233d722a9Sopenharmony_cifn r_take_rust_vec(v: Vec<u8>) {
60333d722a9Sopenharmony_ci    let _ = v;
60433d722a9Sopenharmony_ci}
60533d722a9Sopenharmony_ci
60633d722a9Sopenharmony_cifn r_take_rust_vec_string(v: Vec<String>) {
60733d722a9Sopenharmony_ci    let _ = v;
60833d722a9Sopenharmony_ci}
60933d722a9Sopenharmony_ci
61033d722a9Sopenharmony_cifn r_take_ref_rust_vec(v: &Vec<u8>) {
61133d722a9Sopenharmony_ci    let _ = v;
61233d722a9Sopenharmony_ci}
61333d722a9Sopenharmony_ci
61433d722a9Sopenharmony_cifn r_take_ref_rust_vec_string(v: &Vec<String>) {
61533d722a9Sopenharmony_ci    let _ = v;
61633d722a9Sopenharmony_ci}
61733d722a9Sopenharmony_ci
61833d722a9Sopenharmony_cifn r_take_enum(e: ffi::Enum) {
61933d722a9Sopenharmony_ci    let _ = e;
62033d722a9Sopenharmony_ci}
62133d722a9Sopenharmony_ci
62233d722a9Sopenharmony_cifn r_try_return_void() -> Result<(), Error> {
62333d722a9Sopenharmony_ci    Ok(())
62433d722a9Sopenharmony_ci}
62533d722a9Sopenharmony_ci
62633d722a9Sopenharmony_cifn r_try_return_primitive() -> Result<usize, Error> {
62733d722a9Sopenharmony_ci    Ok(2020)
62833d722a9Sopenharmony_ci}
62933d722a9Sopenharmony_ci
63033d722a9Sopenharmony_cifn r_try_return_box() -> Result<Box<R>, Error> {
63133d722a9Sopenharmony_ci    Ok(Box::new(R(2020)))
63233d722a9Sopenharmony_ci}
63333d722a9Sopenharmony_ci
63433d722a9Sopenharmony_cifn r_fail_return_primitive() -> Result<usize, Error> {
63533d722a9Sopenharmony_ci    Err(Error)
63633d722a9Sopenharmony_ci}
63733d722a9Sopenharmony_ci
63833d722a9Sopenharmony_cifn r_try_return_sliceu8(slice: &[u8]) -> Result<&[u8], Error> {
63933d722a9Sopenharmony_ci    Ok(slice)
64033d722a9Sopenharmony_ci}
64133d722a9Sopenharmony_ci
64233d722a9Sopenharmony_cifn r_try_return_mutsliceu8(slice: &mut [u8]) -> Result<&mut [u8], Error> {
64333d722a9Sopenharmony_ci    Ok(slice)
64433d722a9Sopenharmony_ci}
64533d722a9Sopenharmony_ci
64633d722a9Sopenharmony_cifn r_aliased_function(x: i32) -> String {
64733d722a9Sopenharmony_ci    x.to_string()
64833d722a9Sopenharmony_ci}
649