| // RUN: %clang_cc1 -verify -fsyntax-only %s |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| typedef struct { |
| void *ptr; |
| size_t n; |
| } span; |
| span returns_span (void) __attribute((malloc_span)); // no-warning |
| |
| typedef struct { |
| size_t n; |
| void *ptr; |
| } span2; |
| span2 returns_span2 (void) __attribute((malloc_span)); // no-warning |
| |
| typedef struct { |
| void *ptr; |
| void *ptr2; |
| } span3; |
| span3 returns_span3 (void) __attribute((malloc_span)); // no-warning |
| |
| typedef struct { |
| void *ptr; |
| int n; |
| } span4; |
| span4 returns_span4 (void) __attribute((malloc_span)); // no-warning |
| |
| typedef struct incomplete_span incomplete_span; |
| // expected-warning@+2 {{attribute only applies to functions that return span-like structures}} |
| // expected-note@+1 {{returned type is incomplete}} |
| incomplete_span returns_incomplete_span (void) __attribute((malloc_span)); |
| |
| // expected-warning@+2 {{attribute only applies to functions that return span-like structures}} |
| // expected-note@+1 {{returned type is not a struct type}} |
| int *returns_int_ptr (void) __attribute((malloc_span)); |
| |
| typedef struct { |
| void *ptr; |
| size_t n; |
| size_t n2; |
| } too_long_span; |
| // expected-warning@+2 {{attribute only applies to functions that return span-like structures}} |
| // expected-note@+1 {{returned struct has 3 fields, expected 2}} |
| too_long_span returns_too_long_span (void) __attribute((malloc_span)); |
| |
| // Function pointers are not allowed. |
| typedef struct { |
| int (*func_ptr)(void); |
| size_t n; |
| } func_span; |
| // expected-warning@+2 {{attribute only applies to functions that return span-like structures}} |
| // expected-note@+1 {{returned struct fields are not a supported combination}} |
| func_span returns_func_span (void) __attribute((malloc_span)); |
| |
| // Integer should not be an enum. |
| enum some_enum { some_value, other_value }; |
| typedef struct { |
| void *ptr; |
| enum some_enum field; |
| } enum_span; |
| // expected-warning@+2 {{attribute only applies to functions that return span-like structures}} |
| // expected-note@+1 {{2nd field is expected to be an integer}} |
| enum_span returns_enum_span (void) __attribute((malloc_span)); |
| |
| // Bit integers are also not supported. |
| typedef struct { |
| void *ptr; |
| _BitInt(16) n; |
| } bit_span; |
| // expected-warning@+2 {{attribute only applies to functions that return span-like structures}} |
| // expected-note@+1 {{2nd field is expected to be an integer}} |
| bit_span returns_bit_span (void) __attribute((malloc_span)); |
| |
| // Integer must be at least as big as int. |
| typedef struct { |
| void *ptr; |
| short n; |
| } short_span; |
| // expected-warning@+2 {{attribute only applies to functions that return span-like structures}} |
| // expected-note@+1 {{2nd field of span-like type is not a wide enough integer (minimum width: 32)}} |
| short_span returns_short_span (void) __attribute((malloc_span)); |