]> git.draconx.ca Git - cdecl99.git/blob - src/parse-decl.c
Avoid a couple warnings reported by gcc.
[cdecl99.git] / src / parse-decl.c
1 /*
2  * Parse and validate C declarations.
3  * Copyright © 2011-2012, 2020-2021 Nick Bowler
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18
19 #include <config.h>
20 #include <stdio.h>
21 #include <assert.h>
22 #include <stdbool.h>
23
24 #include "cdecl.h"
25 #include "cdecl-internal.h"
26 #include "parse.h"
27 #include "scan.h"
28
29 /*
30  * Verify the declaration specifiers of a declaration.  If top is true, treat
31  * this as a top-level declaration.  Otherwise, treat this as a function
32  * parameter (which carries additional constraints).
33  */
34 static bool valid_declspecs(struct cdecl *decl, bool top)
35 {
36         struct cdecl_declspec *specs = decl->specifiers;
37         struct cdecl_declarator *d   = decl->declarators;
38         bool abstract = cdecl_is_abstract(d);
39         unsigned num_storage = 0;
40         unsigned long typemap;
41
42         typemap = cdecl__build_typemap(specs);
43         if (typemap == -1)
44                 return false;
45
46         for (struct cdecl_declspec *c = specs; c; c = c->next) {
47                 switch (cdecl_spec_kind(c)) {
48                 case CDECL_SPEC_TYPE:
49                         if (c->type == CDECL_TYPE_VOID &&
50                             (d->type == CDECL_DECL_IDENT
51                              || d->type == CDECL_DECL_ARRAY)) {
52                                 fprintf(stderr, "invalid declaration of type void\n");
53                                 return false;
54                         }
55                         continue;
56                 case CDECL_SPEC_STOR:
57                         if (top && abstract) {
58                                 fprintf(stderr, "type names cannot have storage-class specifiers\n");
59                                 return false;
60                         }
61
62                         if (!top && c->type != CDECL_STOR_REGISTER) {
63                                 fprintf(stderr, "function parameters may only have register storage\n");
64                                 return false;
65                         }
66
67                         if (++num_storage > 1) {
68                                 fprintf(stderr, "too many storage-class specifiers\n");
69                                 return false;
70                         }
71                         break;
72                 case CDECL_SPEC_QUAL:
73                         /*
74                          * Restrict qualifiers are only valid in the
75                          * pointer qualifier list, which isn't checked here.
76                          */
77                         if (c->type == CDECL_QUAL_RESTRICT) {
78                                 fprintf(stderr, "only pointer types can be restrict-qualified.\n");
79                                 return false;
80                         }
81                         break;
82                 case CDECL_SPEC_FUNC:
83                         if (abstract) {
84                                 fprintf(stderr, "type names cannot have function specifiers\n");
85                                 return false;
86                         }
87
88                         if (!top || d->type != CDECL_DECL_FUNCTION) {
89                                 fprintf(stderr, "only function declarations may have function specifiers.\n");
90                                 return false;
91                         }
92                         break;
93                 default:
94                         assert(0);
95                 }
96         }
97
98         return true;
99 }
100
101 /*
102  * The C grammar leaves ambiguous some cases where parentheses represent a
103  * function declarator or just parentheses.  The language uses additional
104  * context (whether or not a typedef is in scope, etc.) to resolve these
105  * ambiguities, but we don't have access to that kind of information.
106  *
107  * The cdecl99 parser uses an unambiguous grammar which treats almost
108  * everything as a function, and thus considers things like 'int (x)' to
109  * be a function type with a single parameter of type 'x' (a typedef name),
110  * returning int.  This can result in very complicated types for simple
111  * declarations.  Ideally, cdecl99 should try and find the "simplest"
112  * explanation for a given declaration.
113  *
114  * Whether or not it achieves the simplest explanation, we apply a simple rule:
115  * if a declarator could be interpreted as something other than a function,
116  * do that.
117  *
118  * Since cdecl99 supports things like [*] in any context (in C, such constructs
119  * are only valid in function parameter lists), we don't treat them specially
120  * here.
121  */
122
123 static struct cdecl_declarator *reduce_function(struct cdecl *param)
124 {
125         struct cdecl_declspec   *spec = param->specifiers;
126         struct cdecl_declarator *decl = param->declarators;
127         struct cdecl_declarator *last;
128
129         for (last = decl; last && last->type != CDECL_DECL_NULL;)
130                 last = last->child;
131
132         if (!last)
133                 return NULL;
134
135         last->type = CDECL_DECL_IDENT;
136         last->u.ident = spec->ident;
137         free(param);
138         free(spec);
139
140         return decl;
141 }
142
143 static bool function_is_reducible(struct cdecl_declarator *d)
144 {
145         if (d->type != CDECL_DECL_FUNCTION)
146                 return false;
147         if (d->child->type != CDECL_DECL_NULL)
148                 return false; /* e.g., int (*)(x) */
149
150         if (!d->u.function.parameters)
151                 return false; /* e.g., int f() */
152         if (d->u.function.parameters->next)
153                 return false; /* e.g., int (x, y) */
154         if (d->u.function.variadic)
155                 return false; /* e.g., int (x, ...) */
156
157         if (d->u.function.parameters->specifiers->type != CDECL_TYPE_IDENT)
158                 return false; /* e.g. int (int) */
159         if (d->u.function.parameters->specifiers->next)
160                 return false; /* e.g. int (size_t const) */
161         if (d->u.function.parameters->declarators->type == CDECL_DECL_POINTER)
162                 return false; /* e.g. int (x *) */
163
164         return true;
165 }
166
167 static int
168 simplify_functions(struct cdecl_declarator **p, struct cdecl_declarator *d)
169 {
170         struct cdecl_declarator *new;
171
172         if (!function_is_reducible(d))
173                 return 0;
174
175         new = reduce_function(d->u.function.parameters);
176         if (!new)
177                 return 0; /* e.g. int (foo bar) */
178         *p = new;
179         free(d->child);
180         free(d);
181
182         return 1;
183 }
184
185 /*
186  * The parser's bias towards considering things as functions whenever possible
187  * makes nested parentheses tricky.  (x) is considered to be part of a function
188  * declarator until simplify_functions converts it.  The problem is that
189  * (((x))) is not valid as part of a function declarator, but it *is* valid
190  * as an identifier enclosed 3 times in parentheses.  This is complicated by
191  * the fact that things like (((int))) are not valid anywhere.
192  *
193  * To avoid ambiguities, the parser actually emits a "function" declarator for
194  * every pair of parentheses.  The ones that can't reasonably be functions
195  * consist of a single "parameter" with no declaration specifiers (note that
196  * every valid function parameter will have at least one type specifier).
197  *
198  * This pass is to remove these fake functions from the parse tree.  We take
199  * care to avoid turning invalid things like ((int)) into valid things like
200  * (int) by observing that the only valid function declarators that appear
201  * in these "fake" parentheses are those that have a non-null child declarator
202  * (for instance, int ((*)(int)) *or* those that will be eliminated by the
203  * simplify_functions pass.
204  */
205
206 static int
207 reduce_parentheses(struct cdecl_declarator **p, struct cdecl_declarator *d)
208 {
209         struct cdecl *param;
210
211         if (d->type != CDECL_DECL_FUNCTION)
212                 return 0;
213
214         param = d->u.function.parameters;
215         if (param && param->specifiers == NULL) {
216                 struct cdecl_declarator *decl;
217
218                 assert(!param->next);
219
220                 decl = param->declarators;
221                 if (decl->type == CDECL_DECL_NULL) {
222                         free(decl);
223                         free(param);
224                         d->u.function.parameters = NULL;
225                         return 0;
226                 }
227
228                 if (d->child->type != CDECL_DECL_NULL) {
229                         fprintf(stderr, "invalid function parameter\n");
230                         return -1;
231                 }
232
233                 free(d->child);
234                 free(param);
235                 free(d);
236                 *p = decl;
237
238                 /*
239                  * We may have replaced d with another fake function which
240                  * also needs to be eliminated.
241                  */
242                 if (reduce_parentheses(p, decl) < 0)
243                         return -1;
244
245                 /*
246                  * If the remaining declarator is a function, make sure it's
247                  * valid by checking its reducibility.
248                  */
249                 decl = *p;
250                 if (decl->type == CDECL_DECL_FUNCTION
251                     && decl->child->type == CDECL_DECL_NULL
252                     && !function_is_reducible(decl)) {
253                         fprintf(stderr, "too many parentheses in function\n");
254                         return -1;
255                 }
256
257                 return 1;
258         }
259
260         return 0;
261 }
262
263 /*
264  * Function parameters and return types have a few restrictions that are
265  * really easy to check in comparison to the above absurdity.
266  */
267 static int
268 check_parameters(struct cdecl_declarator **p, struct cdecl_declarator *d)
269 {
270         struct cdecl_declspec *spec;
271         struct cdecl *param;
272
273         if (d->type != CDECL_DECL_FUNCTION)
274                 return 0;
275
276         for (param = d->u.function.parameters; param; param = param->next) {
277                 if (!valid_declspecs(param, false))
278                         return -1;
279
280                 /* Check for "void" function parameters as a special case. */
281                 for (spec = param->specifiers; spec; spec = spec->next) {
282                         if (param->declarators->type != CDECL_DECL_NULL)
283                                 continue;
284                         if (spec->type != CDECL_TYPE_VOID)
285                                 continue;
286
287                         if (spec != param->specifiers || spec->next != NULL) {
288                                 fprintf(stderr, "void parameter must not have extra specifiers\n");
289                                 return -1;
290                         } else if (d->u.function.parameters->next) {
291                                 fprintf(stderr, "a void parameter must stand alone\n");
292                                 return -1;
293                         } else if (d->u.function.variadic) {
294                                 fprintf(stderr, "variadic functions cannot have a void parameter\n");
295                                 return -1;
296                         }
297                 }
298         }
299
300         return 0;
301 }
302
303 /*
304  * Functions cannot return arrays or functions.  Since the parse tree is
305  * "inside-out", we need to look for functions as the child declarator.
306  */
307 static int
308 check_rettypes(struct cdecl_declarator **p, struct cdecl_declarator *d)
309 {
310         if (!d->child || d->child->type != CDECL_DECL_FUNCTION)
311                 return 0;
312
313         switch (d->type) {
314         case CDECL_DECL_FUNCTION:
315                 fprintf(stderr, "functions cannot return functions\n");
316                 return -1;
317         case CDECL_DECL_ARRAY:
318                 fprintf(stderr, "functions cannot return arrays\n");
319                 return -1;
320         }
321
322         return 0;
323 }
324
325 static int
326 check_arrays(struct cdecl_declarator **p, struct cdecl_declarator *d)
327 {
328         if (!d->child || d->child->type != CDECL_DECL_ARRAY)
329                 return 0;
330
331         switch (d->type) {
332         case CDECL_DECL_FUNCTION:
333                 fprintf(stderr, "array members cannot be functions\n");
334                 return -1;
335         }
336
337         return 0;
338 }
339
340 static int
341 normalize_specs(struct cdecl_declarator **p, struct cdecl_declarator *d)
342 {
343         struct cdecl_function *func;
344         struct cdecl_pointer *ptr;
345
346         switch (d->type) {
347         case CDECL_DECL_POINTER:
348                 ptr = &d->u.pointer;
349                 ptr->qualifiers = cdecl__normalize_specs(ptr->qualifiers);
350                 break;
351         case CDECL_DECL_FUNCTION:
352                 func = &d->u.function;
353                 for (struct cdecl *i = func->parameters; i; i = i->next)
354                         i->specifiers = cdecl__normalize_specs(i->specifiers);
355                 break;
356         }
357
358         return 0;
359 }
360
361 static int
362 check_qualifiers(struct cdecl_declarator **p, struct cdecl_declarator *d)
363 {
364         struct cdecl_declspec *spec;
365         struct cdecl_pointer *ptr;
366
367         if (!d->child || d->child->type != CDECL_DECL_POINTER)
368                 return 0;
369
370         ptr = &d->child->u.pointer;
371         for (spec = ptr->qualifiers; spec; spec = spec->next) {
372                 if (spec->type == CDECL_QUAL_RESTRICT
373                     && d->type == CDECL_DECL_FUNCTION) {
374                         fprintf(stderr, "function pointers cannot be restrict-qualified\n");
375                         return -1;
376                 }
377         }
378
379         return 0;
380 }
381
382 /*
383  * Traverse the parse tree, calling a function on every declarator in a
384  * depth-first preorder traversal.  The function is given a pointer to the
385  * declarator as well as to the pointer which was used to reach that
386  * declarator: this can be used to rewrite entire subtrees.
387  */
388 static bool forall_declarators(struct cdecl *decl,
389         int f(struct cdecl_declarator **, struct cdecl_declarator *))
390 {
391         struct cdecl_declarator *d, **p;
392
393         for (p = &decl->declarators, d = *p; d; p = &d->child, d = *p) {
394                 switch (f(p, d)) {
395                 case 0:
396                         break;
397                 case 1:
398                         d = *p;
399                         break;
400                 case -1:
401                         return false;
402                 default:
403                         assert(0);
404                 }
405
406                 if (d->type == CDECL_DECL_FUNCTION) {
407                         struct cdecl *i;
408
409                         for (i = d->u.function.parameters; i; i = i->next) {
410                                 if (!forall_declarators(i, f))
411                                         return false;
412                         }
413                 }
414         }
415
416         return true;
417 }
418
419 struct cdecl *cdecl_parse_decl(const char *declstr)
420 {
421         struct cdecl_declspec *norm_specs;
422         YY_BUFFER_STATE state;
423         yyscan_t scanner;
424         struct cdecl *decl;
425         int rc;
426
427         cdecl__init_i18n();
428
429         rc = cdecl__yylex_init(&scanner);
430         if (rc != 0)
431                 return NULL;
432
433         state = cdecl__yy_scan_string(declstr, scanner);
434         rc = cdecl__yyparse(scanner, &decl);
435         cdecl__yy_delete_buffer(state, scanner);
436         cdecl__yylex_destroy(scanner);
437
438         if (rc != 0)
439                 return NULL;
440
441         /*
442          * Since the top-level specifiers are shared between each top-level
443          * declarator, we need to normalize them once and then propagate the
444          * new specifier list.
445          */
446         norm_specs = cdecl__normalize_specs(decl->specifiers);
447         for (struct cdecl *i = decl; i; i = i->next) {
448                 i->specifiers = norm_specs;
449         }
450
451         /* Now perform checks and simplifications on each declarator. */
452         for (struct cdecl *i = decl; i; i = i->next) {
453                 if (!forall_declarators(i, reduce_parentheses))
454                         goto err;
455                 if (!forall_declarators(i, simplify_functions))
456                         goto err;
457                 if (!forall_declarators(i, check_parameters))
458                         goto err;
459                 if (!forall_declarators(i, check_rettypes))
460                         goto err;
461                 if (!forall_declarators(i, check_arrays))
462                         goto err;
463                 if (!forall_declarators(i, normalize_specs))
464                         goto err;
465                 if (!forall_declarators(i, check_qualifiers))
466                         goto err;
467
468                 if (!valid_declspecs(i, true))
469                         goto err;
470
471                 if (cdecl_is_abstract(i->declarators)
472                     && (i != decl || i->next)) {
473                         fprintf(stderr, "mixing type names and declarations is not allowed\n");
474                         goto err;
475                 }
476         }
477
478         return decl;
479 err:
480         cdecl__free(decl);
481         return NULL;
482 }
483
484 struct cdecl *cdecl_parse_english(const char *english)
485 {
486         YY_BUFFER_STATE state;
487         yyscan_t scanner;
488         struct cdecl *decl;
489         int rc;
490
491         cdecl__init_i18n();
492
493         rc = cdecl__yylex_init_extra(true, &scanner);
494         if (rc != 0)
495                 return NULL;
496
497         state = cdecl__yy_scan_string(english, scanner);
498         rc = cdecl__yyparse(scanner, &decl);
499         cdecl__yy_delete_buffer(state, scanner);
500         cdecl__yylex_destroy(scanner);
501
502         if (rc != 0)
503                 return NULL;
504
505         for (struct cdecl *i = decl; i; i = i->next) {
506                 i->specifiers = cdecl__normalize_specs(i->specifiers);
507
508                 if (!forall_declarators(i, check_parameters))
509                         goto err;
510                 if (!forall_declarators(i, check_rettypes))
511                         goto err;
512                 if (!forall_declarators(i, check_arrays))
513                         goto err;
514                 if (!forall_declarators(i, normalize_specs))
515                         goto err;
516                 if (!forall_declarators(i, check_qualifiers))
517                         goto err;
518
519                 if (!valid_declspecs(i, true))
520                         goto err;
521         }
522
523         return decl;
524 err:
525         cdecl__free(decl);
526         return NULL;
527 }
528
529 void cdecl_free(struct cdecl *decl)
530 {
531         cdecl__free(decl);
532 }