mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Add a test that demonstrates a segfault when calling into rust with non-c-like-enum.
This commit is contained in:
parent
8498c5f5b0
commit
cd5ad993d0
@ -0,0 +1,7 @@
|
|||||||
|
-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)
|
@ -0,0 +1,13 @@
|
|||||||
|
#![crate_type = "lib"]
|
||||||
|
#![crate_name = "nonclike"]
|
||||||
|
|
||||||
|
#[repr(C,u8)]
|
||||||
|
pub enum T {
|
||||||
|
A(u64),
|
||||||
|
B,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn t_new(a: u64) -> T {
|
||||||
|
T::A(a)
|
||||||
|
}
|
35
src/test/run-make-fulldeps/return-non-c-like-enum/test.c
Normal file
35
src/test/run-make-fulldeps/return-non-c-like-enum/test.c
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
/* This symbol is defined by the Rust staticlib built from
|
||||||
|
* nonclike.rs. */
|
||||||
|
extern T t_new(uint64_t v);
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
(void)argc; (void)argv;
|
||||||
|
|
||||||
|
T t = t_new(10);
|
||||||
|
assert(A == t.tag);
|
||||||
|
assert(10 == t.a._0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user