Add a test that demonstrates an incorrect return value when calling into rust with non-c-like-enums.
This commit is contained in:
parent
cd5ad993d0
commit
f1b52b34f2
3 changed files with 65 additions and 0 deletions
|
@ -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,18 @@
|
|||
#![crate_type = "lib"]
|
||||
#![crate_name = "nonclike"]
|
||||
|
||||
#[repr(C,u8)]
|
||||
pub enum T {
|
||||
A(u64),
|
||||
B,
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn t_add(a: T, b: T) -> u64 {
|
||||
match (a,b) {
|
||||
(T::A(a), T::A(b)) => a + b,
|
||||
(T::A(a), T::B) => a,
|
||||
(T::B, T::A(b)) => b,
|
||||
_ => 0,
|
||||
}
|
||||
}
|
40
src/test/run-make-fulldeps/arguments-non-c-like-enum/test.c
Normal file
40
src/test/run-make-fulldeps/arguments-non-c-like-enum/test.c
Normal file
|
@ -0,0 +1,40 @@
|
|||
#include <stdint.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <stdio.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 uint64_t t_add(T a, T b);
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
(void)argc; (void)argv;
|
||||
|
||||
T x = { .tag = A, .a = { ._0 = 1 } };
|
||||
T y = { .tag = A, .a = { ._0 = 10 } };
|
||||
|
||||
uint64_t r = t_add(x, y);
|
||||
|
||||
assert(11 == r);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue