1 /* PR middle-end/94527 - Add an attribute that marks a function as freeing
2    an object
3    Verify that attribute malloc with one or two arguments is accepted where
4    intended and rejected where it's invalid.
5    { dg-options "-Wall -ftrack-macro-expansion=0" } */
6 
7 #define A(...) __attribute__ ((malloc (__VA_ARGS__)))
8 
9 A (0) void* alloc_zero (int);           // { dg-error "'malloc' attribute argument 1 does not name a function" }
10 
11 A ("") void* alloc_string (int);        // { dg-error "'malloc' attribute argument 1 does not name a function" }
12 
13 int var;
14 A (var) void* alloc_var (int);          // { dg-error "'malloc' attribute argument 1 does not name a function" }
15 
16 typedef struct Type { int i; } Type;
17 A (Type) void* alloc_type (int);        // { dg-error "expected expression|identifier" }
18 
19 A (unknown) void* alloc_unknown (int);  // { dg-error "'unknown' undeclared" }
20 
21 void fv_ ();                            // { dg-message "declared here" }
22 A (fv_) void* alloc_fv_ (int);          // { dg-error "'malloc' attribute argument 1 must take a pointer type as its first argument" }
23 
24 void fvi (int);                         // { dg-message "declared here" }
25 A (fvi) void* alloc_fvi (int);          // { dg-error "'malloc' attribute argument 1 must take a pointer type as its first argument; have 'int'" }
26 
27 void fvv (void);                        // { dg-message "declared here" }
28 A (fvv) void* alloc_fvv (int);          // { dg-error "'malloc' attribute argument 1 must take a pointer type as its first argument; have 'void'" }
29 
30 void fvi_ (int, ...);                   // { dg-message "declared here" }
31 A (fvi_) void* alloc_fvi_ (int);        // { dg-error "'malloc' attribute argument 1 must take a pointer type as its first argument; have 'int'" }
32 
33 void fvi_vp (Type, void*);              // { dg-message "declared here" }
34 A (fvi_vp) void* alloc_fvi_vp (int);    // { dg-error "'malloc' attribute argument 1 must take a pointer type as its first argument; have 'Type'" }
35 
36 
37 void fpv (void*);
38 A (fpv) void* alloc_fpv (int);
39 
40 void fpv_i (void*, int);
41 A (fpv_i) void* alloc_fpv_i (int);
42 
43 void fpv_pv (void*, void*);
44 A (fpv_i) void* alloc_fpv_pv (int);
45 
46 
47 void gpc (char*);
48 void hpi (int*);
49 A (fpv) A (gpc) A (hpi) Type* alloc_fpv_gpv (int);
50 
51 
52 /* Verify that the attribute can be applied to <stdio.h> functions.  */
53 typedef struct FILE FILE;
54 typedef __SIZE_TYPE__ size_t;
55 
56 int   fclose (FILE*);
57 FILE* fdopen (int);
58 FILE* fopen (const char*, const char*);
59 FILE* freopen (const char*, const char*, FILE*);
60 int   pclose (FILE*);
61 FILE* popen (const char*, const char*);
62 FILE* tmpfile (void);
63 
64 A (fclose) A (freopen, 3) A (pclose)
65   FILE* fdopen (int);
66 A (fclose) A (freopen, 3) A (pclose)
67   FILE* fopen (const char*, const char*);
68 A (fclose) A (freopen, 3) A (pclose)
69   FILE* fmemopen(void *, size_t, const char *);
70 A (fclose) A (freopen, 3) A (pclose)
71   FILE* freopen (const char*, const char*, FILE*);
72 A (fclose) A (freopen, 3) A (pclose)
73   FILE* popen (const char*, const char*);
74 A (fclose) A (freopen, 3) A (pclose)
75   FILE* tmpfile (void);
76