diff options
Diffstat (limited to 'tests/run-make/return-non-c-like-enum')
-rw-r--r-- | tests/run-make/return-non-c-like-enum/Makefile | 8 | ||||
-rw-r--r-- | tests/run-make/return-non-c-like-enum/nonclike.rs | 21 | ||||
-rw-r--r-- | tests/run-make/return-non-c-like-enum/test.c | 63 |
3 files changed, 92 insertions, 0 deletions
diff --git a/tests/run-make/return-non-c-like-enum/Makefile b/tests/run-make/return-non-c-like-enum/Makefile new file mode 100644 index 000000000..0c8d8bf3a --- /dev/null +++ b/tests/run-make/return-non-c-like-enum/Makefile @@ -0,0 +1,8 @@ +# ignore-cross-compile +include ../tools.mk + +all: + $(RUSTC) --crate-type=staticlib nonclike.rs + $(CC) test.c $(call STATICLIB,nonclike) $(call OUT_EXE,test) \ + $(EXTRACFLAGS) $(EXTRACXXFLAGS) + $(call RUN,test) diff --git a/tests/run-make/return-non-c-like-enum/nonclike.rs b/tests/run-make/return-non-c-like-enum/nonclike.rs new file mode 100644 index 000000000..de529cf64 --- /dev/null +++ b/tests/run-make/return-non-c-like-enum/nonclike.rs @@ -0,0 +1,21 @@ +#[repr(C, u8)] +pub enum TT { + AA(u64, u64), + BB, +} + +#[no_mangle] +pub extern "C" fn tt_new(a: u64, b: u64) -> TT { + TT::AA(a, b) +} + +#[repr(C,u8)] +pub enum T { + A(u64), + B, +} + +#[no_mangle] +pub extern "C" fn t_new(a: u64) -> T { + T::A(a) +} diff --git a/tests/run-make/return-non-c-like-enum/test.c b/tests/run-make/return-non-c-like-enum/test.c new file mode 100644 index 000000000..afadd3c10 --- /dev/null +++ b/tests/run-make/return-non-c-like-enum/test.c @@ -0,0 +1,63 @@ +#include <stdint.h> +#include <assert.h> + +/* This is the code generated by cbindgen 0.12.1 for the `enum TT` + * type in nonclike.rs . */ +enum TT_Tag { + AA, + BB, +}; +typedef uint8_t TT_Tag; + +typedef struct { + uint64_t _0; + uint64_t _1; +} AA_Body; + +typedef struct { + TT_Tag tag; + union { + AA_Body aa; + }; +} TT; + +/* This is the code generated by cbindgen 0.12.1 for the `enum T` type + * in nonclike.rs . */ +enum T_Tag { + A, + B, +}; +typedef uint8_t T_Tag; + +typedef struct { + uint64_t _0; +} A_Body; + +typedef struct { + T_Tag tag; + union { + A_Body a; + }; +} T; + +/* These symbols are defined by the Rust staticlib built from + * nonclike.rs. */ +extern TT tt_new(uint64_t a, uint64_t b); +extern T t_new(uint64_t v); + +int main(int argc, char *argv[]) { + (void)argc; (void)argv; + + /* This example works. */ + TT tt = tt_new(10, 20); + assert(AA == tt.tag); + assert(10 == tt.aa._0); + assert(20 == tt.aa._1); + + /* This one used to segfault (see issue #68190). */ + T t = t_new(10); + assert(A == t.tag); + assert(10 == t.a._0); + + return 0; +} |