Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ty: Simplify Box<T> to *T #451

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/bindgen/ir/ty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,7 @@ impl Type {
generic.simplify_standard_types();

match path.name() {
"Box" => Some(Type::Ptr(Box::new(generic))),
Copy link
Contributor Author

@edsrzf edsrzf Jan 12, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm happy to add a FIXME comment and file an issue for unsized types, similar to the comment below, if this is otherwise acceptable.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, sounds sensible, but please add a comment pointing to the documentation.

// FIXME(#223): This is not quite correct.
"Option" if generic.is_repr_ptr() => Some(generic),
"NonNull" => Some(Type::Ptr(Box::new(generic))),
Expand Down
19 changes: 19 additions & 0 deletions tests/expectations/both/box.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

typedef struct Opaque Opaque;

typedef struct Foo_u64 {
float *a;
uint64_t *b;
Opaque *c;
uint64_t **d;
float **e;
Opaque **f;
uint64_t *g;
int32_t *h;
} Foo_u64;

void root(int32_t *arg, Foo_u64 *foo, Opaque **d);
27 changes: 27 additions & 0 deletions tests/expectations/both/box.compat.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

typedef struct Opaque Opaque;

typedef struct Foo_u64 {
float *a;
uint64_t *b;
Opaque *c;
uint64_t **d;
float **e;
Opaque **f;
uint64_t *g;
int32_t *h;
} Foo_u64;

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

void root(int32_t *arg, Foo_u64 *foo, Opaque **d);

#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
19 changes: 19 additions & 0 deletions tests/expectations/box.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

typedef struct Opaque Opaque;

typedef struct {
float *a;
uint64_t *b;
Opaque *c;
uint64_t **d;
float **e;
Opaque **f;
uint64_t *g;
int32_t *h;
} Foo_u64;

void root(int32_t *arg, Foo_u64 *foo, Opaque **d);
27 changes: 27 additions & 0 deletions tests/expectations/box.compat.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

typedef struct Opaque Opaque;

typedef struct {
float *a;
uint64_t *b;
Opaque *c;
uint64_t **d;
float **e;
Opaque **f;
uint64_t *g;
int32_t *h;
} Foo_u64;

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

void root(int32_t *arg, Foo_u64 *foo, Opaque **d);

#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
24 changes: 24 additions & 0 deletions tests/expectations/box.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include <cstdarg>
#include <cstdint>
#include <cstdlib>
#include <new>

struct Opaque;

template<typename T>
struct Foo {
float *a;
T *b;
Opaque *c;
T **d;
float **e;
Opaque **f;
T *g;
int32_t *h;
};

extern "C" {

void root(int32_t *arg, Foo<uint64_t> *foo, Opaque **d);

} // extern "C"
19 changes: 19 additions & 0 deletions tests/expectations/tag/box.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

struct Opaque;

struct Foo_u64 {
float *a;
uint64_t *b;
struct Opaque *c;
uint64_t **d;
float **e;
struct Opaque **f;
uint64_t *g;
int32_t *h;
};

void root(int32_t *arg, struct Foo_u64 *foo, struct Opaque **d);
27 changes: 27 additions & 0 deletions tests/expectations/tag/box.compat.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

struct Opaque;

struct Foo_u64 {
float *a;
uint64_t *b;
struct Opaque *c;
uint64_t **d;
float **e;
struct Opaque **f;
uint64_t *g;
int32_t *h;
};

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

void root(int32_t *arg, struct Foo_u64 *foo, struct Opaque **d);

#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
16 changes: 16 additions & 0 deletions tests/rust/box.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
struct Opaque;

#[repr(C)]
pub struct Foo<T> {
a: Box<f32>,
b: Box<T>,
c: Box<Opaque>,
d: Box<Box<T>>,
e: Box<Box<f32>>,
f: Box<Box<Opaque>>,
g: Option<Box<T>>,
h: Option<Box<i32>>,
}

#[no_mangle]
pub extern "C" fn root(arg: Box<i32>, foo: *mut Foo<u64>, d: Box<Box<Opaque>>) {}