Message ID | 20201226175129.9621-5-luc.vanoostenryck@gmail.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | support __packed struct | expand |
On 26/12/2020 17:51, Luc Van Oostenryck wrote: > Currently, type attributes are not handled correctly. > > Add some testcases for them. > > Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> > --- > validation/type-attribute-align.c | 20 ++++++++++++++++++ > validation/type-attribute-as.c | 34 +++++++++++++++++++++++++++++++ > validation/type-attribute-mod.c | 22 ++++++++++++++++++++ > validation/type-attribute-qual.c | 12 +++++++++++ > 4 files changed, 88 insertions(+) > create mode 100644 validation/type-attribute-align.c > create mode 100644 validation/type-attribute-as.c > create mode 100644 validation/type-attribute-mod.c > create mode 100644 validation/type-attribute-qual.c > > diff --git a/validation/type-attribute-align.c b/validation/type-attribute-align.c > new file mode 100644 > index 000000000000..d9358bff8327 > --- /dev/null > +++ b/validation/type-attribute-align.c > @@ -0,0 +1,20 @@ > +#define __aligned(N) __attribute__((aligned(N))) > +#define alignof(X) __alignof__(X) > + > +struct s { > + short a, b, c; > +} __aligned(2*sizeof(short)); > + > +static int fs(void) { return sizeof(struct s); } > +static int fa(void) { return alignof(struct s); } > + > +void main(void) > +{ > + _Static_assert( sizeof(struct s) == 4 * sizeof(short), "size"); > + _Static_assert(alignof(struct s) == 2 * sizeof(short), "alignment"); > +} > + > +/* > + * check-name: type-attribute-align > + * check-known-to-fail > + */ > diff --git a/validation/type-attribute-as.c b/validation/type-attribute-as.c > new file mode 100644 > index 000000000000..b40b4e7dddf5 > --- /dev/null > +++ b/validation/type-attribute-as.c > @@ -0,0 +1,34 @@ > +#define __as __attribute__((address_space(__as))) > + > +struct s { > + int i; > +} __as; > + > + > +extern void use0(void *); > +extern void use1(void __as *); > + > +void main(void) > +{ > + struct s s; > + int i; > + > + use0(&s); // KO > + use0(&i); // OK > + use1(&s); // OK > + use1(&i); // KO > +} > + > +/* > + * check-name: type-attribute-as > + * check-known-to-fail > + * > + * check-error-start > +type-attribute-as.c:16:15: warning: incorrect type in argument 1 (different address spaces) > +type-attribute-as.c:16:15: expected void * > +type-attribute-as.c:16:15: got struct s __as * > +type-attribute-as.c:19:15: warning: incorrect type in argument 1 (different address spaces) > +type-attribute-as.c:19:15: expected void __as * > +type-attribute-as.c:19:15: got int * > + * check-error-end > + */ > diff --git a/validation/type-attribute-mod.c b/validation/type-attribute-mod.c > new file mode 100644 > index 000000000000..0e7b166a4aec > --- /dev/null > +++ b/validation/type-attribute-mod.c > @@ -0,0 +1,22 @@ > +#define __noderef __attribute__((noderef)) > + > +struct s { > + int i; > +} __noderef; > + > + > +void main(void) > +{ > + struct s s; > + > + s.i = 0; > +} > + > +/* > + * check-name: type-attribute-mod > + * check-known-to-fail > + * > + * check-error-start > +type-attribute-mod.c:12:9: warning: dereference of noderef expression > + * check-error-end > + */ > diff --git a/validation/type-attribute-qual.c b/validation/type-attribute-qual.c > new file mode 100644 > index 000000000000..ab19a605bda1 > --- /dev/null > +++ b/validation/type-attribute-qual.c > @@ -0,0 +1,12 @@ > +static const struct s { > + int x; > +} map[2]; > + > +static void foo(struct s *p, int v) > +{ > + p->x += v; > +} Hmm, I don't understand what this is testing! :( ATB, Ramsay Jones > + > +/* > + * check-name: type-attribute-qual > + */ >
On Mon, Dec 28, 2020 at 04:13:54PM +0000, Ramsay Jones wrote: > On 26/12/2020 17:51, Luc Van Oostenryck wrote: > > diff --git a/validation/type-attribute-qual.c b/validation/type-attribute-qual.c > > new file mode 100644 > > index 000000000000..ab19a605bda1 > > --- /dev/null > > +++ b/validation/type-attribute-qual.c > > @@ -0,0 +1,12 @@ > > +static const struct s { > > + int x; > > +} map[2]; > > + > > +static void foo(struct s *p, int v) > > +{ > > + p->x += v; > > +} > > Hmm, I don't understand what this is testing! :( The declaration of map also contains the definition of 'struct s'. The test, by tryin to modify something of type 'struct s', allows to verify that the 'const' applies only to 'map' and not to 'struct s'. I'll add a comment. -- Luc
diff --git a/validation/type-attribute-align.c b/validation/type-attribute-align.c new file mode 100644 index 000000000000..d9358bff8327 --- /dev/null +++ b/validation/type-attribute-align.c @@ -0,0 +1,20 @@ +#define __aligned(N) __attribute__((aligned(N))) +#define alignof(X) __alignof__(X) + +struct s { + short a, b, c; +} __aligned(2*sizeof(short)); + +static int fs(void) { return sizeof(struct s); } +static int fa(void) { return alignof(struct s); } + +void main(void) +{ + _Static_assert( sizeof(struct s) == 4 * sizeof(short), "size"); + _Static_assert(alignof(struct s) == 2 * sizeof(short), "alignment"); +} + +/* + * check-name: type-attribute-align + * check-known-to-fail + */ diff --git a/validation/type-attribute-as.c b/validation/type-attribute-as.c new file mode 100644 index 000000000000..b40b4e7dddf5 --- /dev/null +++ b/validation/type-attribute-as.c @@ -0,0 +1,34 @@ +#define __as __attribute__((address_space(__as))) + +struct s { + int i; +} __as; + + +extern void use0(void *); +extern void use1(void __as *); + +void main(void) +{ + struct s s; + int i; + + use0(&s); // KO + use0(&i); // OK + use1(&s); // OK + use1(&i); // KO +} + +/* + * check-name: type-attribute-as + * check-known-to-fail + * + * check-error-start +type-attribute-as.c:16:15: warning: incorrect type in argument 1 (different address spaces) +type-attribute-as.c:16:15: expected void * +type-attribute-as.c:16:15: got struct s __as * +type-attribute-as.c:19:15: warning: incorrect type in argument 1 (different address spaces) +type-attribute-as.c:19:15: expected void __as * +type-attribute-as.c:19:15: got int * + * check-error-end + */ diff --git a/validation/type-attribute-mod.c b/validation/type-attribute-mod.c new file mode 100644 index 000000000000..0e7b166a4aec --- /dev/null +++ b/validation/type-attribute-mod.c @@ -0,0 +1,22 @@ +#define __noderef __attribute__((noderef)) + +struct s { + int i; +} __noderef; + + +void main(void) +{ + struct s s; + + s.i = 0; +} + +/* + * check-name: type-attribute-mod + * check-known-to-fail + * + * check-error-start +type-attribute-mod.c:12:9: warning: dereference of noderef expression + * check-error-end + */ diff --git a/validation/type-attribute-qual.c b/validation/type-attribute-qual.c new file mode 100644 index 000000000000..ab19a605bda1 --- /dev/null +++ b/validation/type-attribute-qual.c @@ -0,0 +1,12 @@ +static const struct s { + int x; +} map[2]; + +static void foo(struct s *p, int v) +{ + p->x += v; +} + +/* + * check-name: type-attribute-qual + */
Currently, type attributes are not handled correctly. Add some testcases for them. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> --- validation/type-attribute-align.c | 20 ++++++++++++++++++ validation/type-attribute-as.c | 34 +++++++++++++++++++++++++++++++ validation/type-attribute-mod.c | 22 ++++++++++++++++++++ validation/type-attribute-qual.c | 12 +++++++++++ 4 files changed, 88 insertions(+) create mode 100644 validation/type-attribute-align.c create mode 100644 validation/type-attribute-as.c create mode 100644 validation/type-attribute-mod.c create mode 100644 validation/type-attribute-qual.c