blob: f80cda79eabe4872ca9487e4773bdf0deeb72363 [file] [log] [blame]
David Tolnaya95b2342020-04-09 23:26:05 -07001#![allow(
2 clippy::boxed_local,
3 clippy::ptr_arg,
4 clippy::trivially_copy_pass_by_ref
5)]
David Tolnay265f6a02020-03-18 20:13:55 -07006
Adrian Taylor121cca42020-10-10 15:32:00 -07007pub mod extra;
David Tolnay362c9f92020-10-10 16:29:58 -07008pub mod module;
David Tolnaya62cca22020-05-07 21:52:16 -07009
David Tolnay5df0a712020-09-24 15:58:28 -040010use cxx::{CxxString, CxxVector, UniquePtr};
David Tolnayb6c5ea72020-03-16 13:36:28 -070011use std::fmt::{self, Display};
David Tolnayad5b8af2020-01-26 16:59:13 -080012
Adrian Taylor121cca42020-10-10 15:32:00 -070013mod other {
14 use cxx::kind::{Opaque, Trivial};
15 use cxx::{type_id, CxxString, ExternType};
16
Adrian Taylord75f7e22020-10-12 15:54:54 -070017 // Trivial.
Adrian Taylor121cca42020-10-10 15:32:00 -070018 #[repr(C)]
19 pub struct D {
Adrian Taylord75f7e22020-10-12 15:54:54 -070020 pub d: u64,
Adrian Taylor121cca42020-10-10 15:32:00 -070021 }
22
Adrian Taylord75f7e22020-10-12 15:54:54 -070023 // Opaque, and has realistic complexity.
Adrian Taylor121cca42020-10-10 15:32:00 -070024 #[repr(C)]
25 pub struct E {
Adrian Taylor121cca42020-10-10 15:32:00 -070026 e_str: CxxString,
Adrian Taylord75f7e22020-10-12 15:54:54 -070027 e: u64,
28 }
29
30 // Opaque, but simple enough that bad code can try to create it.
31 #[repr(C)]
32 pub struct F {
33 pub f: u64,
Adrian Taylor121cca42020-10-10 15:32:00 -070034 }
35
36 unsafe impl ExternType for D {
37 type Id = type_id!("tests::D");
38 type Kind = Trivial;
39 }
40
41 unsafe impl ExternType for E {
42 type Id = type_id!("tests::E");
43 type Kind = Opaque;
44 }
Adrian Taylord75f7e22020-10-12 15:54:54 -070045
46 unsafe impl ExternType for F {
47 type Id = type_id!("tests::F");
48 type Kind = Opaque;
49 }
Adrian Taylor121cca42020-10-10 15:32:00 -070050}
51
David Tolnay97c72102020-01-25 16:49:00 -080052#[cxx::bridge(namespace = tests)]
53pub mod ffi {
Stephen Crane9e48d5b2020-08-21 12:17:02 -070054 #[derive(Clone)]
David Tolnayad5b8af2020-01-26 16:59:13 -080055 struct Shared {
56 z: usize,
57 }
58
Joel Galensonc03402a2020-04-23 17:31:09 -070059 enum Enum {
60 AVal,
61 BVal = 2020,
62 CVal,
63 }
64
David Tolnay97c72102020-01-25 16:49:00 -080065 extern "C" {
David Tolnayd41eef52020-10-07 16:33:55 -070066 include!("tests/ffi/tests.h");
David Tolnayad5b8af2020-01-26 16:59:13 -080067
68 type C;
69
70 fn c_return_primitive() -> usize;
71 fn c_return_shared() -> Shared;
David Tolnaybe13d8a2020-03-06 15:45:39 -080072 fn c_return_box() -> Box<R>;
David Tolnayad5b8af2020-01-26 16:59:13 -080073 fn c_return_unique_ptr() -> UniquePtr<C>;
74 fn c_return_ref(shared: &Shared) -> &usize;
David Tolnay18d93b62020-08-27 00:55:48 -070075 fn c_return_mut(shared: &mut Shared) -> &mut usize;
David Tolnayad5b8af2020-01-26 16:59:13 -080076 fn c_return_str(shared: &Shared) -> &str;
Adrian Taylorf5dd5522020-04-13 16:50:14 -070077 fn c_return_sliceu8(shared: &Shared) -> &[u8];
David Tolnayad5b8af2020-01-26 16:59:13 -080078 fn c_return_rust_string() -> String;
79 fn c_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnaye1dcdf72020-04-24 17:40:55 -070080 fn c_return_unique_ptr_vector_u8() -> UniquePtr<CxxVector<u8>>;
81 fn c_return_unique_ptr_vector_f64() -> UniquePtr<CxxVector<f64>>;
David Tolnay47e239d2020-08-28 00:32:04 -070082 fn c_return_unique_ptr_vector_string() -> UniquePtr<CxxVector<CxxString>>;
David Tolnaye1dcdf72020-04-24 17:40:55 -070083 fn c_return_unique_ptr_vector_shared() -> UniquePtr<CxxVector<Shared>>;
David Tolnay1bcc9fe2020-04-25 13:51:07 -070084 fn c_return_unique_ptr_vector_opaque() -> UniquePtr<CxxVector<C>>;
David Tolnayde5340e2020-04-25 14:03:21 -070085 fn c_return_ref_vector(c: &C) -> &CxxVector<u8>;
David Tolnay18d93b62020-08-27 00:55:48 -070086 fn c_return_mut_vector(c: &mut C) -> &mut CxxVector<u8>;
David Tolnayb41e74c2020-04-25 15:06:18 -070087 fn c_return_rust_vec() -> Vec<u8>;
David Tolnay77989692020-04-25 15:57:47 -070088 fn c_return_ref_rust_vec(c: &C) -> &Vec<u8>;
David Tolnay18d93b62020-08-27 00:55:48 -070089 fn c_return_mut_rust_vec(c: &mut C) -> &mut Vec<u8>;
David Tolnay33f56ad2020-08-27 17:06:35 -070090 fn c_return_rust_vec_string() -> Vec<String>;
Joel Galensonba676072020-04-27 15:55:45 -070091 fn c_return_identity(_: usize) -> usize;
92 fn c_return_sum(_: usize, _: usize) -> usize;
David Tolnayf6a89f22020-05-10 23:39:27 -070093 fn c_return_enum(n: u16) -> Enum;
David Tolnayad5b8af2020-01-26 16:59:13 -080094
95 fn c_take_primitive(n: usize);
96 fn c_take_shared(shared: Shared);
97 fn c_take_box(r: Box<R>);
David Tolnaya7d00e82020-03-06 15:50:14 -080098 fn c_take_ref_r(r: &R);
David Tolnayad5b8af2020-01-26 16:59:13 -080099 fn c_take_ref_c(c: &C);
100 fn c_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700101 fn c_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -0800102 fn c_take_rust_string(s: String);
103 fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay9b304202020-04-25 13:54:55 -0700104 fn c_take_unique_ptr_vector_u8(v: UniquePtr<CxxVector<u8>>);
105 fn c_take_unique_ptr_vector_f64(v: UniquePtr<CxxVector<f64>>);
David Tolnay47e239d2020-08-28 00:32:04 -0700106 fn c_take_unique_ptr_vector_string(v: UniquePtr<CxxVector<CxxString>>);
David Tolnay9b304202020-04-25 13:54:55 -0700107 fn c_take_unique_ptr_vector_shared(v: UniquePtr<CxxVector<Shared>>);
David Tolnay2244d1f2020-04-25 13:58:18 -0700108 fn c_take_ref_vector(v: &CxxVector<u8>);
David Tolnayd2ce8a92020-04-25 16:16:45 -0700109 fn c_take_rust_vec(v: Vec<u8>);
110 fn c_take_rust_vec_shared(v: Vec<Shared>);
David Tolnay33f56ad2020-08-27 17:06:35 -0700111 fn c_take_rust_vec_string(v: Vec<String>);
Stephen Crane9e48d5b2020-08-21 12:17:02 -0700112 fn c_take_rust_vec_index(v: Vec<u8>);
113 fn c_take_rust_vec_shared_index(v: Vec<Shared>);
myronahnda9be502020-04-29 05:47:23 +0700114 fn c_take_rust_vec_shared_forward_iterator(v: Vec<Shared>);
David Tolnayd2ce8a92020-04-25 16:16:45 -0700115 fn c_take_ref_rust_vec(v: &Vec<u8>);
David Tolnay33f56ad2020-08-27 17:06:35 -0700116 fn c_take_ref_rust_vec_string(v: &Vec<String>);
Stephen Crane9e48d5b2020-08-21 12:17:02 -0700117 fn c_take_ref_rust_vec_index(v: &Vec<u8>);
myronahnda9be502020-04-29 05:47:23 +0700118 fn c_take_ref_rust_vec_copy(v: &Vec<u8>);
David Tolnay0c8c0f22020-07-21 17:57:46 -0700119 /*
120 // https://github.com/dtolnay/cxx/issues/232
David Tolnay75dca2e2020-03-25 20:17:52 -0700121 fn c_take_callback(callback: fn(String) -> usize);
David Tolnay0c8c0f22020-07-21 17:57:46 -0700122 */
Joel Galensonc03402a2020-04-23 17:31:09 -0700123 fn c_take_enum(e: Enum);
David Tolnayebef4a22020-03-17 15:33:47 -0700124
125 fn c_try_return_void() -> Result<()>;
126 fn c_try_return_primitive() -> Result<usize>;
127 fn c_fail_return_primitive() -> Result<usize>;
David Tolnay99642622020-03-25 13:07:35 -0700128 fn c_try_return_box() -> Result<Box<R>>;
129 fn c_try_return_ref(s: &String) -> Result<&String>;
130 fn c_try_return_str(s: &str) -> Result<&str>;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700131 fn c_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>;
David Tolnay99642622020-03-25 13:07:35 -0700132 fn c_try_return_rust_string() -> Result<String>;
133 fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
David Tolnay8b9d1762020-04-25 16:05:46 -0700134 fn c_try_return_rust_vec() -> Result<Vec<u8>>;
David Tolnay33f56ad2020-08-27 17:06:35 -0700135 fn c_try_return_rust_vec_string() -> Result<Vec<String>>;
David Tolnay77989692020-04-25 15:57:47 -0700136 fn c_try_return_ref_rust_vec(c: &C) -> Result<&Vec<u8>>;
Joel Galenson3d4f6122020-04-07 15:54:05 -0700137
138 fn get(self: &C) -> usize;
139 fn set(self: &mut C, n: usize) -> usize;
Joel Galensone1e969d2020-04-21 12:50:20 -0700140 fn get2(&self) -> usize;
141 fn set2(&mut self, n: usize) -> usize;
myronahne3b78ea2020-05-23 01:08:13 +0700142 fn set_succeed(&mut self, n: usize) -> Result<usize>;
143 fn get_fail(&mut self) -> Result<usize>;
David Tolnay3bbcdbb2020-10-09 19:29:44 -0700144
145 #[rust_name = "i32_overloaded_method"]
146 fn cOverloadedMethod(&self, x: i32) -> String;
147 #[rust_name = "str_overloaded_method"]
148 fn cOverloadedMethod(&self, x: &str) -> String;
149 #[rust_name = "i32_overloaded_function"]
150 fn cOverloadedFunction(x: i32) -> String;
151 #[rust_name = "str_overloaded_function"]
152 fn cOverloadedFunction(x: &str) -> String;
David Tolnay97c72102020-01-25 16:49:00 -0800153 }
David Tolnayad5b8af2020-01-26 16:59:13 -0800154
Joel Galenson0f654ff2020-05-04 20:04:21 -0700155 extern "C" {
156 type COwnedEnum;
157 }
158
David Tolnayf6a89f22020-05-10 23:39:27 -0700159 #[repr(u32)]
Joel Galenson0f654ff2020-05-04 20:04:21 -0700160 enum COwnedEnum {
161 CVal1,
162 CVal2,
163 }
164
David Tolnayad5b8af2020-01-26 16:59:13 -0800165 extern "Rust" {
166 type R;
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700167 type R2;
David Tolnayad5b8af2020-01-26 16:59:13 -0800168
169 fn r_return_primitive() -> usize;
170 fn r_return_shared() -> Shared;
David Tolnay5cd8d612020-03-06 15:56:30 -0800171 fn r_return_box() -> Box<R>;
David Tolnay4b3a66e2020-03-06 16:14:00 -0800172 fn r_return_unique_ptr() -> UniquePtr<C>;
David Tolnayad5b8af2020-01-26 16:59:13 -0800173 fn r_return_ref(shared: &Shared) -> &usize;
David Tolnay18d93b62020-08-27 00:55:48 -0700174 fn r_return_mut(shared: &mut Shared) -> &mut usize;
David Tolnayad5b8af2020-01-26 16:59:13 -0800175 fn r_return_str(shared: &Shared) -> &str;
176 fn r_return_rust_string() -> String;
David Tolnay85db24862020-03-06 16:24:41 -0800177 fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnay83c69e92020-04-25 16:59:39 -0700178 fn r_return_rust_vec() -> Vec<u8>;
David Tolnay33f56ad2020-08-27 17:06:35 -0700179 fn r_return_rust_vec_string() -> Vec<String>;
David Tolnay83c69e92020-04-25 16:59:39 -0700180 fn r_return_ref_rust_vec(shared: &Shared) -> &Vec<u8>;
David Tolnay18d93b62020-08-27 00:55:48 -0700181 fn r_return_mut_rust_vec(shared: &mut Shared) -> &mut Vec<u8>;
Joel Galensonba676072020-04-27 15:55:45 -0700182 fn r_return_identity(_: usize) -> usize;
183 fn r_return_sum(_: usize, _: usize) -> usize;
Joel Galensonc03402a2020-04-23 17:31:09 -0700184 fn r_return_enum(n: u32) -> Enum;
David Tolnayad5b8af2020-01-26 16:59:13 -0800185
186 fn r_take_primitive(n: usize);
187 fn r_take_shared(shared: Shared);
188 fn r_take_box(r: Box<R>);
189 fn r_take_unique_ptr(c: UniquePtr<C>);
190 fn r_take_ref_r(r: &R);
191 fn r_take_ref_c(c: &C);
192 fn r_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700193 fn r_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -0800194 fn r_take_rust_string(s: String);
195 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay5df0a712020-09-24 15:58:28 -0400196 fn r_take_ref_vector(v: &CxxVector<u8>);
David Tolnay80631e92020-09-24 16:07:30 -0400197 fn r_take_ref_empty_vector(v: &CxxVector<u64>);
David Tolnay83c69e92020-04-25 16:59:39 -0700198 fn r_take_rust_vec(v: Vec<u8>);
David Tolnay33f56ad2020-08-27 17:06:35 -0700199 fn r_take_rust_vec_string(v: Vec<String>);
David Tolnay83c69e92020-04-25 16:59:39 -0700200 fn r_take_ref_rust_vec(v: &Vec<u8>);
David Tolnay33f56ad2020-08-27 17:06:35 -0700201 fn r_take_ref_rust_vec_string(v: &Vec<String>);
Joel Galensonc03402a2020-04-23 17:31:09 -0700202 fn r_take_enum(e: Enum);
David Tolnayb6c5ea72020-03-16 13:36:28 -0700203
David Tolnaycecada62020-03-17 01:45:58 -0700204 fn r_try_return_void() -> Result<()>;
David Tolnayb6c5ea72020-03-16 13:36:28 -0700205 fn r_try_return_primitive() -> Result<usize>;
David Tolnay22602b42020-09-21 18:04:05 -0400206 fn r_try_return_box() -> Result<Box<R>>;
David Tolnayb6c5ea72020-03-16 13:36:28 -0700207 fn r_fail_return_primitive() -> Result<usize>;
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700208
209 fn r_return_r2(n: usize) -> Box<R2>;
210 fn get(self: &R2) -> usize;
211 fn set(self: &mut R2, n: usize) -> usize;
David Tolnay3bbcdbb2020-10-09 19:29:44 -0700212
213 #[cxx_name = "rAliasedFunction"]
214 fn r_aliased_function(x: i32) -> String;
David Tolnayad5b8af2020-01-26 16:59:13 -0800215 }
216}
217
David Tolnaybe13d8a2020-03-06 15:45:39 -0800218pub type R = usize;
David Tolnayad5b8af2020-01-26 16:59:13 -0800219
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700220pub struct R2(usize);
221
222impl R2 {
223 fn get(&self) -> usize {
224 self.0
225 }
226
227 fn set(&mut self, n: usize) -> usize {
228 self.0 = n;
229 n
230 }
231}
232
David Tolnayb6c5ea72020-03-16 13:36:28 -0700233#[derive(Debug)]
234struct Error;
235
236impl std::error::Error for Error {}
237
238impl Display for Error {
239 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
240 f.write_str("rust error")
241 }
242}
243
David Tolnayad5b8af2020-01-26 16:59:13 -0800244fn r_return_primitive() -> usize {
245 2020
246}
247
248fn r_return_shared() -> ffi::Shared {
249 ffi::Shared { z: 2020 }
250}
251
David Tolnay5cd8d612020-03-06 15:56:30 -0800252fn r_return_box() -> Box<R> {
253 Box::new(2020)
254}
255
David Tolnay4b3a66e2020-03-06 16:14:00 -0800256fn r_return_unique_ptr() -> UniquePtr<ffi::C> {
257 extern "C" {
258 fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
259 }
260 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
261}
262
David Tolnayad5b8af2020-01-26 16:59:13 -0800263fn r_return_ref(shared: &ffi::Shared) -> &usize {
264 &shared.z
265}
266
David Tolnay18d93b62020-08-27 00:55:48 -0700267fn r_return_mut(shared: &mut ffi::Shared) -> &mut usize {
268 &mut shared.z
269}
270
David Tolnayad5b8af2020-01-26 16:59:13 -0800271fn r_return_str(shared: &ffi::Shared) -> &str {
272 let _ = shared;
273 "2020"
274}
275
276fn r_return_rust_string() -> String {
277 "2020".to_owned()
278}
279
David Tolnay85db24862020-03-06 16:24:41 -0800280fn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
281 extern "C" {
282 fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
283 }
284 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
285}
286
David Tolnay83c69e92020-04-25 16:59:39 -0700287fn r_return_rust_vec() -> Vec<u8> {
288 Vec::new()
289}
290
David Tolnay33f56ad2020-08-27 17:06:35 -0700291fn r_return_rust_vec_string() -> Vec<String> {
292 Vec::new()
293}
294
David Tolnay83c69e92020-04-25 16:59:39 -0700295fn r_return_ref_rust_vec(shared: &ffi::Shared) -> &Vec<u8> {
296 let _ = shared;
297 unimplemented!()
298}
299
David Tolnay18d93b62020-08-27 00:55:48 -0700300fn r_return_mut_rust_vec(shared: &mut ffi::Shared) -> &mut Vec<u8> {
301 let _ = shared;
302 unimplemented!()
303}
304
Joel Galensonba676072020-04-27 15:55:45 -0700305fn r_return_identity(n: usize) -> usize {
306 n
307}
308
309fn r_return_sum(n1: usize, n2: usize) -> usize {
310 n1 + n2
311}
312
Joel Galensonc03402a2020-04-23 17:31:09 -0700313fn r_return_enum(n: u32) -> ffi::Enum {
David Tolnay884d91f2020-05-05 10:17:23 -0700314 if n == 0 {
Joel Galensonc03402a2020-04-23 17:31:09 -0700315 ffi::Enum::AVal
316 } else if n <= 2020 {
317 ffi::Enum::BVal
318 } else {
319 ffi::Enum::CVal
320 }
321}
322
David Tolnayad5b8af2020-01-26 16:59:13 -0800323fn r_take_primitive(n: usize) {
David Tolnayf306da42020-02-22 19:55:43 -0800324 assert_eq!(n, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800325}
326
327fn r_take_shared(shared: ffi::Shared) {
David Tolnayf306da42020-02-22 19:55:43 -0800328 assert_eq!(shared.z, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800329}
330
331fn r_take_box(r: Box<R>) {
332 let _ = r;
333}
334
335fn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
336 let _ = c;
337}
338
339fn r_take_ref_r(r: &R) {
340 let _ = r;
341}
342
343fn r_take_ref_c(c: &ffi::C) {
344 let _ = c;
345}
346
347fn r_take_str(s: &str) {
David Tolnayf306da42020-02-22 19:55:43 -0800348 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800349}
350
351fn r_take_rust_string(s: String) {
David Tolnayf306da42020-02-22 19:55:43 -0800352 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800353}
354
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700355fn r_take_sliceu8(s: &[u8]) {
356 assert_eq!(s.len(), 5);
David Tolnayefe81052020-04-14 16:28:24 -0700357 assert_eq!(std::str::from_utf8(s).unwrap(), "2020\0");
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700358}
359
David Tolnayad5b8af2020-01-26 16:59:13 -0800360fn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
David Tolnayf306da42020-02-22 19:55:43 -0800361 assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
David Tolnay97c72102020-01-25 16:49:00 -0800362}
David Tolnayb6c5ea72020-03-16 13:36:28 -0700363
David Tolnay5df0a712020-09-24 15:58:28 -0400364fn r_take_ref_vector(v: &CxxVector<u8>) {
365 let slice = v.as_slice();
366 assert_eq!(slice, [20, 2, 0]);
367}
368
David Tolnay80631e92020-09-24 16:07:30 -0400369fn r_take_ref_empty_vector(v: &CxxVector<u64>) {
370 assert!(v.as_slice().is_empty());
371 assert!(v.is_empty());
372}
373
David Tolnay83c69e92020-04-25 16:59:39 -0700374fn r_take_rust_vec(v: Vec<u8>) {
375 let _ = v;
376}
377
David Tolnay33f56ad2020-08-27 17:06:35 -0700378fn r_take_rust_vec_string(v: Vec<String>) {
379 let _ = v;
380}
381
David Tolnay83c69e92020-04-25 16:59:39 -0700382fn r_take_ref_rust_vec(v: &Vec<u8>) {
383 let _ = v;
384}
385
David Tolnay33f56ad2020-08-27 17:06:35 -0700386fn r_take_ref_rust_vec_string(v: &Vec<String>) {
387 let _ = v;
388}
389
Joel Galensonc03402a2020-04-23 17:31:09 -0700390fn r_take_enum(e: ffi::Enum) {
391 let _ = e;
392}
393
David Tolnaycecada62020-03-17 01:45:58 -0700394fn r_try_return_void() -> Result<(), Error> {
395 Ok(())
396}
397
David Tolnayb6c5ea72020-03-16 13:36:28 -0700398fn r_try_return_primitive() -> Result<usize, Error> {
399 Ok(2020)
400}
401
David Tolnay22602b42020-09-21 18:04:05 -0400402fn r_try_return_box() -> Result<Box<R>, Error> {
403 Ok(Box::new(2020))
404}
405
David Tolnayb6c5ea72020-03-16 13:36:28 -0700406fn r_fail_return_primitive() -> Result<usize, Error> {
407 Err(Error)
408}
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700409
410fn r_return_r2(n: usize) -> Box<R2> {
411 Box::new(R2(n))
412}
David Tolnay3bbcdbb2020-10-09 19:29:44 -0700413
414fn r_aliased_function(x: i32) -> String {
415 x.to_string()
416}