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:
Emilio Cobos Álvarez
2021-01-14 21:33:29 +01:00
parent 4ba7d1f083
commit f922f68531
13 changed files with 169 additions and 30 deletions
+11 -1
View File
@@ -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"
+7 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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);
+11 -1
View File
@@ -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);
+4 -1
View File
@@ -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>,
) { }