diff options
| -rw-r--r-- | validation/attr-visible.c | 13 | ||||
| -rw-r--r-- | validation/attr-visible2.c | 10 | ||||
| -rw-r--r-- | validation/bitwise-function-pointer.c | 17 | ||||
| -rw-r--r-- | validation/function-attribute-inner.c | 10 | ||||
| -rw-r--r-- | validation/function-attribute-omitted.c | 14 | ||||
| -rw-r--r-- | validation/function-attribute-pointer.c | 34 | ||||
| -rw-r--r-- | validation/function-attribute-void-ptr.c | 14 | ||||
| -rw-r--r-- | validation/function-attribute.c | 15 | ||||
| -rw-r--r-- | validation/pure-function.c | 17 |
9 files changed, 134 insertions, 10 deletions
diff --git a/validation/attr-visible.c b/validation/attr-visible.c new file mode 100644 index 00000000..38ee8575 --- /dev/null +++ b/validation/attr-visible.c @@ -0,0 +1,13 @@ +#define __visible __attribute__((externally_visible)) + +__visible void foo(void) +{ +} + +int flag __visible; + +/* + * check-name: attr-visible + * check-command: sparse -Wdecl $file + * check-known-to-fail + */ diff --git a/validation/attr-visible2.c b/validation/attr-visible2.c new file mode 100644 index 00000000..62949b47 --- /dev/null +++ b/validation/attr-visible2.c @@ -0,0 +1,10 @@ +#define __visible __attribute__((externally_visible)) + +int flag __visible; +int arr[2] __visible; + +/* + * check-name: attr-visible-after + * check-command: sparse -Wdecl $file + * check-known-to-fail + */ diff --git a/validation/bitwise-function-pointer.c b/validation/bitwise-function-pointer.c new file mode 100644 index 00000000..544f2fc0 --- /dev/null +++ b/validation/bitwise-function-pointer.c @@ -0,0 +1,17 @@ +#define __bitwise __attribute__((bitwise)) + +typedef unsigned int __bitwise t; + +unsigned int fun(void); + +static t (*ptr)(void) = fun; + +/* + * check-name: bitwise-function-pointer + * + * check-error-start +bitwise-function-pointer.c:7:25: warning: incorrect type in initializer (different base types) +bitwise-function-pointer.c:7:25: expected restricted t ( *static [toplevel] ptr )( ... ) +bitwise-function-pointer.c:7:25: got unsigned int ( * )( ... ) + * check-error-end + */ diff --git a/validation/function-attribute-inner.c b/validation/function-attribute-inner.c new file mode 100644 index 00000000..178c7c01 --- /dev/null +++ b/validation/function-attribute-inner.c @@ -0,0 +1,10 @@ +#define __noreturn __attribute__((__noreturn__)) + +void __noreturn fun(void); + +_Static_assert([void (__noreturn *)(void)] == [typeof(&fun)], ""); + +/* + * check-name: function-attribute-inner + * check-known-to-fail + */ diff --git a/validation/function-attribute-omitted.c b/validation/function-attribute-omitted.c new file mode 100644 index 00000000..43b301d8 --- /dev/null +++ b/validation/function-attribute-omitted.c @@ -0,0 +1,14 @@ +#define __pure __attribute__((pure)) +#define __noreturn __attribute__((noreturn)) + + +int __pure p(int i); +int p(int i) { return i; } + +void __noreturn n(void); +void n(void) { while (1) ; } + +/* + * check-name: function-attribute-omitted + * check-known-to-fail + */ diff --git a/validation/function-attribute-pointer.c b/validation/function-attribute-pointer.c new file mode 100644 index 00000000..27f43bfb --- /dev/null +++ b/validation/function-attribute-pointer.c @@ -0,0 +1,34 @@ +#define __noreturn __attribute__((__noreturn__)) + +void set_die(void (*)(void)); +void set_die_nr(__noreturn void (*)(void)); + +void die(void); +void __noreturn die_nr(void); + +static void foo(void) +{ + set_die(die); + set_die(die_nr); + set_die_nr(die_nr); + set_die_nr(die); + + void (*fptr0)(void) = die; + void (*fptr1)(void) = die_nr; + __noreturn void (*fptr3)(void) = die_nr; + __noreturn void (*fptr2)(void) = die; +} + +/* + * check-name: function-attribute-pointer + * check-known-to-fail + * + * check-error-start +function-attribute-pointer.c:14:20: warning: incorrect type in argument 1 (different modifiers) +function-attribute-pointer.c:14:20: expected void ( [noreturn] * )( ... ) +function-attribute-pointer.c:14:20: got void ( * )( ... ) +function-attribute-pointer.c:19:42: warning: incorrect type in initializer (different modifiers) +function-attribute-pointer.c:19:42: expected void ( [noreturn] *fptr2 )( ... ) +function-attribute-pointer.c:19:42: got void ( * )( ... ) + * check-error-end + */ diff --git a/validation/function-attribute-void-ptr.c b/validation/function-attribute-void-ptr.c new file mode 100644 index 00000000..0092b63c --- /dev/null +++ b/validation/function-attribute-void-ptr.c @@ -0,0 +1,14 @@ +#define __noreturn __attribute__((__noreturn__)) + +void fun(void *); +void __noreturn die(void); + +static void foo(void) +{ + void *ptr = die; + fun(die); +} + +/* + * check-name: function-attribute-void-ptr + */ diff --git a/validation/function-attribute.c b/validation/function-attribute.c index 0f2c7592..2be180c4 100644 --- a/validation/function-attribute.c +++ b/validation/function-attribute.c @@ -1,17 +1,20 @@ #define __pure __attribute__((pure)) -struct s { - int x; -}; -static __pure struct s *grab(struct s *ptr) +static __pure int funi(int val) +{ + return val; +} + +static __pure int *funp(int *ptr) { return ptr; } -static void foo(struct s *ptr) +static void foo(int val, int *ptr) { - struct s *ptr = grab(ptr); + int nbr = funi(val); + int *res = funp(ptr); } /* diff --git a/validation/pure-function.c b/validation/pure-function.c index 04bb85e4..9692cc84 100644 --- a/validation/pure-function.c +++ b/validation/pure-function.c @@ -1,16 +1,25 @@ -static __attribute__((__pure__)) int pure1(void) +static __attribute__((__pure__)) int pure_int(int v) { - int i = 0; + int i = v; return i; } -static __attribute__((__pure__)) void *pure2(void) +static __attribute__((__pure__)) void *pure_ptr(void *p) { - void *i = (void *)0; + void *i = p; return i; } +static void foo(int v, void *p) +{ + int val = pure_int(v); + void *ptr = pure_ptr(p); + + (void)val; + (void)ptr; +} + /* * check-name: Pure function attribute */ |
