ir: Avoid generating bogus pointer arguments.
Now that we track nullability in the pointer type it's easy to do it. Fixes #223
This commit is contained in:
@@ -5,16 +5,26 @@
|
||||
|
||||
typedef struct Opaque Opaque;
|
||||
|
||||
typedef struct Option_____Opaque Option_____Opaque;
|
||||
|
||||
typedef struct Option_______c_void Option_______c_void;
|
||||
|
||||
typedef struct Foo {
|
||||
const struct Opaque *x;
|
||||
struct Opaque *y;
|
||||
void (*z)(void);
|
||||
struct Option_______c_void *zz;
|
||||
} Foo;
|
||||
|
||||
typedef union Bar {
|
||||
const struct Opaque *x;
|
||||
struct Opaque *y;
|
||||
void (*z)(void);
|
||||
struct Option_______c_void *zz;
|
||||
} Bar;
|
||||
|
||||
void root(const struct Opaque *a, struct Opaque *b, struct Foo c, union Bar d);
|
||||
void root(const struct Opaque *a,
|
||||
struct Opaque *b,
|
||||
struct Foo c,
|
||||
union Bar d,
|
||||
struct Option_____Opaque *e);
|
||||
|
||||
@@ -5,23 +5,33 @@
|
||||
|
||||
typedef struct Opaque Opaque;
|
||||
|
||||
typedef struct Option_____Opaque Option_____Opaque;
|
||||
|
||||
typedef struct Option_______c_void Option_______c_void;
|
||||
|
||||
typedef struct Foo {
|
||||
const struct Opaque *x;
|
||||
struct Opaque *y;
|
||||
void (*z)(void);
|
||||
struct Option_______c_void *zz;
|
||||
} Foo;
|
||||
|
||||
typedef union Bar {
|
||||
const struct Opaque *x;
|
||||
struct Opaque *y;
|
||||
void (*z)(void);
|
||||
struct Option_______c_void *zz;
|
||||
} Bar;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
void root(const struct Opaque *a, struct Opaque *b, struct Foo c, union Bar d);
|
||||
void root(const struct Opaque *a,
|
||||
struct Opaque *b,
|
||||
struct Foo c,
|
||||
union Bar d,
|
||||
struct Option_____Opaque *e);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
||||
@@ -5,16 +5,22 @@
|
||||
|
||||
typedef struct Opaque Opaque;
|
||||
|
||||
typedef struct Option_____Opaque Option_____Opaque;
|
||||
|
||||
typedef struct Option_______c_void Option_______c_void;
|
||||
|
||||
typedef struct {
|
||||
const Opaque *x;
|
||||
Opaque *y;
|
||||
void (*z)(void);
|
||||
Option_______c_void *zz;
|
||||
} Foo;
|
||||
|
||||
typedef union {
|
||||
const Opaque *x;
|
||||
Opaque *y;
|
||||
void (*z)(void);
|
||||
Option_______c_void *zz;
|
||||
} Bar;
|
||||
|
||||
void root(const Opaque *a, Opaque *b, Foo c, Bar d);
|
||||
void root(const Opaque *a, Opaque *b, Foo c, Bar d, Option_____Opaque *e);
|
||||
|
||||
@@ -5,23 +5,29 @@
|
||||
|
||||
typedef struct Opaque Opaque;
|
||||
|
||||
typedef struct Option_____Opaque Option_____Opaque;
|
||||
|
||||
typedef struct Option_______c_void Option_______c_void;
|
||||
|
||||
typedef struct {
|
||||
const Opaque *x;
|
||||
Opaque *y;
|
||||
void (*z)(void);
|
||||
Option_______c_void *zz;
|
||||
} Foo;
|
||||
|
||||
typedef union {
|
||||
const Opaque *x;
|
||||
Opaque *y;
|
||||
void (*z)(void);
|
||||
Option_______c_void *zz;
|
||||
} Bar;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
void root(const Opaque *a, Opaque *b, Foo c, Bar d);
|
||||
void root(const Opaque *a, Opaque *b, Foo c, Bar d, Option_____Opaque *e);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
||||
@@ -6,20 +6,25 @@
|
||||
|
||||
struct Opaque;
|
||||
|
||||
template<typename T = void>
|
||||
struct Option;
|
||||
|
||||
struct Foo {
|
||||
const Opaque *x;
|
||||
Opaque *y;
|
||||
void (*z)();
|
||||
Option<void(*)()> *zz;
|
||||
};
|
||||
|
||||
union Bar {
|
||||
const Opaque *x;
|
||||
Opaque *y;
|
||||
void (*z)();
|
||||
Option<void(*)()> *zz;
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
|
||||
void root(const Opaque *a, Opaque *b, Foo c, Bar d);
|
||||
void root(const Opaque *a, Opaque *b, Foo c, Bar d, Option<Opaque*> *e);
|
||||
|
||||
} // extern "C"
|
||||
|
||||
@@ -9,14 +9,22 @@ cdef extern from *:
|
||||
ctypedef struct Opaque:
|
||||
pass
|
||||
|
||||
ctypedef struct Option_____Opaque:
|
||||
pass
|
||||
|
||||
ctypedef struct Option_______c_void:
|
||||
pass
|
||||
|
||||
ctypedef struct Foo:
|
||||
const Opaque *x;
|
||||
Opaque *y;
|
||||
void (*z)();
|
||||
Option_______c_void *zz;
|
||||
|
||||
ctypedef union Bar:
|
||||
const Opaque *x;
|
||||
Opaque *y;
|
||||
void (*z)();
|
||||
Option_______c_void *zz;
|
||||
|
||||
void root(const Opaque *a, Opaque *b, Foo c, Bar d);
|
||||
void root(const Opaque *a, Opaque *b, Foo c, Bar d, Option_____Opaque *e);
|
||||
|
||||
@@ -5,16 +5,26 @@
|
||||
|
||||
struct Opaque;
|
||||
|
||||
struct Option_____Opaque;
|
||||
|
||||
struct Option_______c_void;
|
||||
|
||||
struct Foo {
|
||||
const struct Opaque *x;
|
||||
struct Opaque *y;
|
||||
void (*z)(void);
|
||||
struct Option_______c_void *zz;
|
||||
};
|
||||
|
||||
union Bar {
|
||||
const struct Opaque *x;
|
||||
struct Opaque *y;
|
||||
void (*z)(void);
|
||||
struct Option_______c_void *zz;
|
||||
};
|
||||
|
||||
void root(const struct Opaque *a, struct Opaque *b, struct Foo c, union Bar d);
|
||||
void root(const struct Opaque *a,
|
||||
struct Opaque *b,
|
||||
struct Foo c,
|
||||
union Bar d,
|
||||
struct Option_____Opaque *e);
|
||||
|
||||
@@ -5,23 +5,33 @@
|
||||
|
||||
struct Opaque;
|
||||
|
||||
struct Option_____Opaque;
|
||||
|
||||
struct Option_______c_void;
|
||||
|
||||
struct Foo {
|
||||
const struct Opaque *x;
|
||||
struct Opaque *y;
|
||||
void (*z)(void);
|
||||
struct Option_______c_void *zz;
|
||||
};
|
||||
|
||||
union Bar {
|
||||
const struct Opaque *x;
|
||||
struct Opaque *y;
|
||||
void (*z)(void);
|
||||
struct Option_______c_void *zz;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
void root(const struct Opaque *a, struct Opaque *b, struct Foo c, union Bar d);
|
||||
void root(const struct Opaque *a,
|
||||
struct Opaque *b,
|
||||
struct Foo c,
|
||||
union Bar d,
|
||||
struct Option_____Opaque *e);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
||||
@@ -9,14 +9,22 @@ cdef extern from *:
|
||||
cdef struct Opaque:
|
||||
pass
|
||||
|
||||
cdef struct Option_____Opaque:
|
||||
pass
|
||||
|
||||
cdef struct Option_______c_void:
|
||||
pass
|
||||
|
||||
cdef struct Foo:
|
||||
const Opaque *x;
|
||||
Opaque *y;
|
||||
void (*z)();
|
||||
Option_______c_void *zz;
|
||||
|
||||
cdef union Bar:
|
||||
const Opaque *x;
|
||||
Opaque *y;
|
||||
void (*z)();
|
||||
Option_______c_void *zz;
|
||||
|
||||
void root(const Opaque *a, Opaque *b, Foo c, Bar d);
|
||||
void root(const Opaque *a, Opaque *b, Foo c, Bar d, Option_____Opaque *e);
|
||||
|
||||
@@ -6,6 +6,7 @@ struct Foo {
|
||||
x: Option<&Opaque>,
|
||||
y: Option<&mut Opaque>,
|
||||
z: Option<fn () -> ()>,
|
||||
zz: *mut Option<fn () -> ()>,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
@@ -13,6 +14,7 @@ union Bar {
|
||||
x: Option<&Opaque>,
|
||||
y: Option<&mut Opaque>,
|
||||
z: Option<fn () -> ()>,
|
||||
zz: *mut Option<fn () -> ()>,
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@@ -20,5 +22,6 @@ pub extern "C" fn root(
|
||||
a: Option<&Opaque>,
|
||||
b: Option<&mut Opaque>,
|
||||
c: Foo,
|
||||
d: Bar
|
||||
d: Bar,
|
||||
e: *mut Option<*mut Opaque>,
|
||||
) { }
|
||||
|
||||
Reference in New Issue
Block a user