File: attributes-4.c

package info (click to toggle)
gcc-arm-none-eabi 15%3A12.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 959,712 kB
  • sloc: cpp: 3,275,382; ansic: 2,061,766; ada: 840,956; f90: 208,513; makefile: 76,132; asm: 73,433; xml: 50,448; exp: 34,146; sh: 32,436; objc: 15,637; fortran: 14,012; python: 11,991; pascal: 6,787; awk: 4,779; perl: 3,054; yacc: 338; ml: 285; lex: 201; haskell: 122
file content (51 lines) | stat: -rw-r--r-- 2,263 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/* PR c/88363 - alloc_align attribute doesn't accept enumerated arguments
   Verify that attribute positional arguments can refer to all C integer
   types except _Bool in both C and C++.
   { dg-do compile }
   { dg-options "-Wall" }
   { dg-options "-Wall -Wno-c++-compat" { target c } } */

#define ATTR(...) __attribute__ ((__VA_ARGS__))

#if __cplusplus == 199711L
typedef __CHAR16_TYPE__ char16_t;
typedef __CHAR32_TYPE__ char32_t;
#elif !__cplusplus
typedef _Bool           bool;
typedef __CHAR16_TYPE__ char16_t;
typedef __CHAR32_TYPE__ char32_t;
typedef __WCHAR_TYPE__  wchar_t;
#endif

enum A { A0 };

ATTR (alloc_align (1)) void* falloc_align_char (char);
ATTR (alloc_align (1)) void* falloc_align_char16 (char16_t);
ATTR (alloc_align (1)) void* falloc_align_char32 (char32_t);
ATTR (alloc_align (1)) void* falloc_align_wchar (wchar_t);
/* Using an enum might make sense in an API that limits the alignments
   it accepts to just the set of the defined enumerators.   */
ATTR (alloc_align (1)) void* falloc_align_enum (enum A);
#ifdef __SIZEOF_INT128__
ATTR (alloc_align (1)) void* falloc_align_int128 (__int128_t);
#endif


ATTR (alloc_align (1)) void* falloc_size_char (char);
ATTR (alloc_size (1)) void* falloc_size_char16 (char16_t);
ATTR (alloc_size (1)) void* falloc_size_char32 (char32_t);
ATTR (alloc_size (1)) void* falloc_size_wchar (wchar_t);
ATTR (alloc_size (1)) void* falloc_size_enum (enum A);
#ifdef __SIZEOF_INT128__
ATTR (alloc_align (1)) void* falloc_size_int128 (__int128_t);
#endif


typedef struct { int i; } S;

/* Using bool is most likely a bug and so diagnosed even though
   it could be accepted.  None of the other types makes sense.  */
ATTR (alloc_align (1)) void* falloc_align_bool (bool);      /* { dg-warning "attribute argument value .1. refers to parameter type .\(_Bool|bool\)" } */
ATTR (alloc_align (1)) void* falloc_align_float (float);    /* { dg-warning "attribute argument value .1. refers to parameter type .float" } */
ATTR (alloc_align (1)) void* falloc_align_voidp (void*);    /* { dg-warning "attribute argument value .1. refers to parameter type .void ?\\\*" } */
ATTR (alloc_align (1)) void* falloc_align_struct (S);       /* { dg-warning "attribute argument value .1. refers to parameter type .S" } */