1 1.2 cgd %{ 2 1.533 rillig /* $NetBSD: cgram.y,v 1.533 2025/09/14 11:14:00 rillig Exp $ */ 3 1.2 cgd 4 1.1 cgd /* 5 1.9 cgd * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. 6 1.1 cgd * Copyright (c) 1994, 1995 Jochen Pohl 7 1.1 cgd * All Rights Reserved. 8 1.1 cgd * 9 1.1 cgd * Redistribution and use in source and binary forms, with or without 10 1.1 cgd * modification, are permitted provided that the following conditions 11 1.1 cgd * are met: 12 1.1 cgd * 1. Redistributions of source code must retain the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer. 14 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 cgd * notice, this list of conditions and the following disclaimer in the 16 1.1 cgd * documentation and/or other materials provided with the distribution. 17 1.1 cgd * 3. All advertising materials mentioning features or use of this software 18 1.1 cgd * must display the following acknowledgement: 19 1.460 rillig * This product includes software developed by Jochen Pohl for 20 1.1 cgd * The NetBSD Project. 21 1.1 cgd * 4. The name of the author may not be used to endorse or promote products 22 1.1 cgd * derived from this software without specific prior written permission. 23 1.1 cgd * 24 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 25 1.1 cgd * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 26 1.1 cgd * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27 1.1 cgd * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 28 1.1 cgd * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 29 1.1 cgd * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 30 1.1 cgd * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31 1.1 cgd * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32 1.1 cgd * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 33 1.1 cgd * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 1.1 cgd */ 35 1.1 cgd 36 1.13 christos #include <sys/cdefs.h> 37 1.416 rillig #if defined(__RCSID) 38 1.533 rillig __RCSID("$NetBSD: cgram.y,v 1.533 2025/09/14 11:14:00 rillig Exp $"); 39 1.1 cgd #endif 40 1.1 cgd 41 1.108 rillig #include <limits.h> 42 1.1 cgd #include <stdlib.h> 43 1.12 cjs #include <string.h> 44 1.1 cgd 45 1.1 cgd #include "lint1.h" 46 1.1 cgd 47 1.41 christos extern char *yytext; 48 1.132 rillig 49 1.1 cgd /* 50 1.148 rillig * Contains the level of current declaration, used for symbol table entries. 51 1.148 rillig * 0 is the top-level, > 0 is inside a function body. 52 1.1 cgd */ 53 1.477 rillig int block_level; 54 1.1 cgd 55 1.1 cgd /* 56 1.171 rillig * level for memory allocation. Normally the same as block_level. 57 1.468 rillig * An exception is the declaration of parameters in prototypes. Memory 58 1.1 cgd * for these can't be freed after the declaration, but symbols must 59 1.1 cgd * be removed from the symbol table after the declaration. 60 1.1 cgd */ 61 1.477 rillig size_t mem_block_level; 62 1.1 cgd 63 1.15 christos /* 64 1.15 christos * Save the no-warns state and restore it to avoid the problem where 65 1.15 christos * if (expr) { stmt } / * NOLINT * / stmt; 66 1.15 christos */ 67 1.419 rillig #define LWARN_NOTHING_SAVED (-3) 68 1.419 rillig static int saved_lwarn = LWARN_NOTHING_SAVED; 69 1.15 christos 70 1.477 rillig static void cgram_declare(sym_t *, bool, sbuf_t *); 71 1.477 rillig static void read_until_rparen(void); 72 1.500 rillig static balanced_token_sequence read_balanced_token_sequence(void); 73 1.477 rillig static sym_t *symbolrename(sym_t *, sbuf_t *); 74 1.75 christos 75 1.1 cgd 76 1.418 rillig /* ARGSUSED */ 77 1.148 rillig static void 78 1.418 rillig clear_warning_flags_loc(const char *file, size_t line) 79 1.15 christos { 80 1.354 rillig debug_step("%s:%zu: clearing flags", file, line); 81 1.493 rillig reset_suppressions(); 82 1.419 rillig saved_lwarn = LWARN_NOTHING_SAVED; 83 1.15 christos } 84 1.15 christos 85 1.418 rillig /* ARGSUSED */ 86 1.148 rillig static void 87 1.418 rillig save_warning_flags_loc(const char *file, size_t line) 88 1.15 christos { 89 1.354 rillig debug_step("%s:%zu: saving flags %d", file, line, lwarn); 90 1.419 rillig saved_lwarn = lwarn; 91 1.15 christos } 92 1.15 christos 93 1.418 rillig /* ARGSUSED */ 94 1.148 rillig static void 95 1.418 rillig restore_warning_flags_loc(const char *file, size_t line) 96 1.15 christos { 97 1.419 rillig if (saved_lwarn != LWARN_NOTHING_SAVED) { 98 1.419 rillig lwarn = saved_lwarn; 99 1.354 rillig debug_step("%s:%zu: restoring flags %d", file, line, lwarn); 100 1.15 christos } else 101 1.418 rillig clear_warning_flags_loc(file, line); 102 1.15 christos } 103 1.73 christos 104 1.418 rillig #define clear_warning_flags() clear_warning_flags_loc(__FILE__, __LINE__) 105 1.418 rillig #define save_warning_flags() save_warning_flags_loc(__FILE__, __LINE__) 106 1.418 rillig #define restore_warning_flags() restore_warning_flags_loc(__FILE__, __LINE__) 107 1.187 rillig 108 1.421 rillig static bool 109 1.421 rillig is_either(const char *s, const char *a, const char *b) 110 1.421 rillig { 111 1.421 rillig return strcmp(s, a) == 0 || strcmp(s, b) == 0; 112 1.421 rillig } 113 1.421 rillig 114 1.500 rillig static void 115 1.500 rillig attribute_list_add(attribute_list *list, attribute attr) 116 1.500 rillig { 117 1.500 rillig if (list->len >= list->cap) { 118 1.500 rillig attribute *old_attrs = list->attrs; 119 1.500 rillig list->cap = 16 + 2 * list->cap; 120 1.500 rillig list->attrs = block_zero_alloc( 121 1.503 rillig list->cap * sizeof(*list->attrs), "attribute[]"); 122 1.503 rillig if (list->len > 0) 123 1.503 rillig memcpy(list->attrs, old_attrs, 124 1.503 rillig list->len * sizeof(*list->attrs)); 125 1.500 rillig } 126 1.500 rillig list->attrs[list->len++] = attr; 127 1.500 rillig } 128 1.500 rillig 129 1.500 rillig static void 130 1.500 rillig attribute_list_add_all(attribute_list *dst, attribute_list src) 131 1.500 rillig { 132 1.500 rillig for (size_t i = 0, n = src.len; i < n; i++) 133 1.500 rillig attribute_list_add(dst, src.attrs[i]); 134 1.500 rillig } 135 1.500 rillig 136 1.500 rillig static attribute 137 1.500 rillig new_attribute(const sbuf_t *prefix, const sbuf_t *name, 138 1.500 rillig const balanced_token_sequence *arg) 139 1.500 rillig { 140 1.500 rillig attribute attr = { .name = xstrdup(name->sb_name) }; 141 1.500 rillig if (prefix != NULL) 142 1.500 rillig attr.prefix = xstrdup(prefix->sb_name); 143 1.500 rillig if (arg != NULL) { 144 1.500 rillig attr.arg = block_zero_alloc(sizeof(*attr.arg), 145 1.500 rillig "balanced_token_sequence"); 146 1.500 rillig *attr.arg = *arg; 147 1.500 rillig } 148 1.500 rillig return attr; 149 1.500 rillig } 150 1.500 rillig 151 1.450 rillig #if YYDEBUG && YYBYACC 152 1.352 rillig #define YYSTYPE_TOSTRING cgram_to_string 153 1.352 rillig #endif 154 1.352 rillig 155 1.1 cgd %} 156 1.1 cgd 157 1.509 rillig %expect 110 158 1.40 christos 159 1.1 cgd %union { 160 1.1 cgd val_t *y_val; 161 1.297 rillig sbuf_t *y_name; 162 1.1 cgd sym_t *y_sym; 163 1.474 rillig bool y_inc; 164 1.1 cgd op_t y_op; 165 1.1 cgd scl_t y_scl; 166 1.1 cgd tspec_t y_tspec; 167 1.461 rillig type_qualifiers y_type_qualifiers; 168 1.510 rillig type_attributes y_type_attributes; 169 1.456 rillig function_specifier y_function_specifier; 170 1.490 rillig parameter_list y_parameter_list; 171 1.487 rillig function_call *y_arguments; 172 1.1 cgd type_t *y_type; 173 1.1 cgd tnode_t *y_tnode; 174 1.35 christos range_t y_range; 175 1.485 rillig buffer *y_string; 176 1.243 rillig qual_ptr *y_qual_ptr; 177 1.219 rillig bool y_seen_statement; 178 1.253 rillig struct generic_association *y_generic; 179 1.490 rillig array_size y_array_size; 180 1.370 rillig bool y_in_system_header; 181 1.478 rillig designation y_designation; 182 1.496 rillig named_constant y_named_constant; 183 1.500 rillig attribute y_attribute; 184 1.500 rillig attribute_list y_attribute_list; 185 1.500 rillig balanced_token_sequence y_tokens; 186 1.1 cgd }; 187 1.1 cgd 188 1.450 rillig /* for Bison: 189 1.450 rillig %printer { 190 1.450 rillig if (is_integer($$->v_tspec)) 191 1.475 rillig fprintf(yyo, "%lld", (long long)$$->u.integer); 192 1.450 rillig else 193 1.450 rillig fprintf(yyo, "%Lg", $$->u.floating); 194 1.450 rillig } <y_val> 195 1.452 rillig %printer { fprintf(yyo, "'%s'", $$ != NULL ? $$->sb_name : "<null>"); } <y_name> 196 1.467 rillig %printer { 197 1.530 rillig if ($$ == NULL) 198 1.530 rillig fprintf(yyo, "<null_symbol>"); 199 1.530 rillig else { 200 1.530 rillig bool indented = debug_push_indented(true); 201 1.530 rillig debug_sym("", $$, ""); 202 1.530 rillig debug_pop_indented(indented); 203 1.530 rillig } 204 1.467 rillig } <y_sym> 205 1.474 rillig %printer { fprintf(yyo, "%s", $$ ? "++" : "--"); } <y_inc> 206 1.450 rillig %printer { fprintf(yyo, "%s", op_name($$)); } <y_op> 207 1.450 rillig %printer { fprintf(yyo, "%s", scl_name($$)); } <y_scl> 208 1.450 rillig %printer { fprintf(yyo, "%s", tspec_name($$)); } <y_tspec> 209 1.461 rillig %printer { fprintf(yyo, "%s", type_qualifiers_string($$)); } <y_type_qualifiers> 210 1.510 rillig %printer { fprintf(yyo, "%s", type_attributes_string($$)); } <y_type_attributes> 211 1.456 rillig %printer { 212 1.456 rillig fprintf(yyo, "%s", function_specifier_name($$)); 213 1.456 rillig } <y_function_specifier> 214 1.488 rillig %printer { 215 1.488 rillig size_t n = 0; 216 1.488 rillig for (const sym_t *p = $$.first; p != NULL; p = p->s_next) 217 1.488 rillig n++; 218 1.488 rillig fprintf(yyo, "%zu parameter%s", n, n != 1 ? "s" : ""); 219 1.488 rillig } <y_parameter_list> 220 1.519 rillig %printer { 221 1.519 rillig fprintf(yyo, "function_call("); 222 1.519 rillig for (size_t i = 0; i < $$->args_len; i++) 223 1.519 rillig fprintf(yyo, "%s%s", i > 0 ? ", " : "", 224 1.533 rillig expr_type_name($$->args[i])); 225 1.519 rillig fprintf(yyo, ")"); 226 1.519 rillig } <y_arguments> 227 1.450 rillig %printer { fprintf(yyo, "%s", type_name($$)); } <y_type> 228 1.450 rillig %printer { 229 1.452 rillig if ($$ == NULL) 230 1.452 rillig fprintf(yyo, "<null>"); 231 1.452 rillig else 232 1.452 rillig fprintf(yyo, "%s '%s'", 233 1.452 rillig op_name($$->tn_op), type_name($$->tn_type)); 234 1.450 rillig } <y_tnode> 235 1.450 rillig %printer { fprintf(yyo, "%zu to %zu", $$.lo, $$.hi); } <y_range> 236 1.486 rillig %printer { fprintf(yyo, "length %zu", $$->len); } <y_string> 237 1.450 rillig %printer { 238 1.461 rillig fprintf(yyo, "%s *", type_qualifiers_string($$->qualifiers)); 239 1.450 rillig } <y_qual_ptr> 240 1.450 rillig %printer { fprintf(yyo, "%s", $$ ? "yes" : "no"); } <y_seen_statement> 241 1.450 rillig %printer { fprintf(yyo, "%s", type_name($$->ga_arg)); } <y_generic> 242 1.450 rillig %printer { fprintf(yyo, "%d", $$.dim); } <y_array_size> 243 1.450 rillig %printer { fprintf(yyo, "%s", $$ ? "yes" : "no"); } <y_in_system_header> 244 1.488 rillig %printer { 245 1.488 rillig if ($$.dn_len == 0) 246 1.488 rillig fprintf(yyo, "(empty)"); 247 1.488 rillig for (size_t i = 0; i < $$.dn_len; i++) { 248 1.488 rillig const designator *dr = $$.dn_items + i; 249 1.488 rillig if (dr->dr_kind == DK_MEMBER) 250 1.488 rillig fprintf(yyo, ".%s", dr->dr_member->s_name); 251 1.488 rillig else if (dr->dr_kind == DK_SUBSCRIPT) 252 1.488 rillig fprintf(yyo, "[%zu]", dr->dr_subscript); 253 1.488 rillig else 254 1.488 rillig fprintf(yyo, "<scalar>"); 255 1.488 rillig } 256 1.488 rillig } <y_designation> 257 1.496 rillig %printer { fprintf(yyo, "%s", named_constant_name($$)); } <y_named_constant> 258 1.450 rillig */ 259 1.450 rillig 260 1.126 rillig %token T_LBRACE T_RBRACE T_LBRACK T_RBRACK T_LPAREN T_RPAREN 261 1.230 rillig %token T_POINT T_ARROW 262 1.310 rillig %token T_COMPLEMENT T_LOGNOT 263 1.474 rillig %token <y_inc> T_INCDEC 264 1.1 cgd %token T_SIZEOF 265 1.94 christos %token T_BUILTIN_OFFSETOF 266 1.58 christos %token T_TYPEOF 267 1.58 christos %token T_EXTENSION 268 1.199 christos %token T_ALIGNAS 269 1.44 christos %token T_ALIGNOF 270 1.189 rillig %token T_ASTERISK 271 1.150 rillig %token <y_op> T_MULTIPLICATIVE 272 1.150 rillig %token <y_op> T_ADDITIVE 273 1.150 rillig %token <y_op> T_SHIFT 274 1.150 rillig %token <y_op> T_RELATIONAL 275 1.150 rillig %token <y_op> T_EQUALITY 276 1.189 rillig %token T_AMPER 277 1.191 rillig %token T_BITXOR 278 1.189 rillig %token T_BITOR 279 1.189 rillig %token T_LOGAND 280 1.189 rillig %token T_LOGOR 281 1.1 cgd %token T_QUEST 282 1.1 cgd %token T_COLON 283 1.189 rillig %token T_ASSIGN 284 1.150 rillig %token <y_op> T_OPASSIGN 285 1.1 cgd %token T_COMMA 286 1.1 cgd %token T_SEMI 287 1.147 rillig %token T_ELLIPSIS 288 1.500 rillig %token T_DCOLON 289 1.41 christos %token T_REAL 290 1.41 christos %token T_IMAG 291 1.81 christos %token T_GENERIC 292 1.1 cgd 293 1.1 cgd /* storage classes (extern, static, auto, register and typedef) */ 294 1.1 cgd %token <y_scl> T_SCLASS 295 1.456 rillig %token <y_function_specifier> T_FUNCTION_SPECIFIER 296 1.1 cgd 297 1.152 rillig /* 298 1.152 rillig * predefined type keywords (char, int, short, long, unsigned, signed, 299 1.326 rillig * float, double, void); see T_TYPENAME for types from typedef 300 1.152 rillig */ 301 1.1 cgd %token <y_tspec> T_TYPE 302 1.1 cgd 303 1.461 rillig %token <y_type_qualifiers> T_QUAL 304 1.461 rillig %token <y_type_qualifiers> T_ATOMIC 305 1.1 cgd 306 1.1 cgd /* struct or union */ 307 1.152 rillig %token <y_tspec> T_STRUCT_OR_UNION 308 1.1 cgd 309 1.1 cgd /* remaining keywords */ 310 1.153 rillig %token T_ASM 311 1.153 rillig %token T_BREAK 312 1.1 cgd %token T_CASE 313 1.153 rillig %token T_CONTINUE 314 1.1 cgd %token T_DEFAULT 315 1.153 rillig %token T_DO 316 1.1 cgd %token T_ELSE 317 1.153 rillig %token T_ENUM 318 1.1 cgd %token T_FOR 319 1.1 cgd %token T_GOTO 320 1.153 rillig %token T_IF 321 1.153 rillig %token T_PACKED 322 1.1 cgd %token T_RETURN 323 1.532 rillig %token T_STATIC_ASSERT 324 1.153 rillig %token T_SWITCH 325 1.11 cgd %token T_SYMBOLRENAME 326 1.153 rillig %token T_WHILE 327 1.266 rillig 328 1.266 rillig %token T_ATTRIBUTE 329 1.1 cgd 330 1.312 rillig %left T_THEN 331 1.312 rillig %left T_ELSE 332 1.1 cgd %right T_QUEST T_COLON 333 1.1 cgd %left T_LOGOR 334 1.1 cgd %left T_LOGAND 335 1.150 rillig %left T_BITOR 336 1.191 rillig %left T_BITXOR 337 1.145 rillig %left T_AMPER 338 1.150 rillig %left T_EQUALITY 339 1.150 rillig %left T_RELATIONAL 340 1.150 rillig %left T_SHIFT 341 1.150 rillig %left T_ADDITIVE 342 1.150 rillig %left T_ASTERISK T_MULTIPLICATIVE 343 1.1 cgd 344 1.297 rillig %token <y_name> T_NAME 345 1.297 rillig %token <y_name> T_TYPENAME 346 1.1 cgd %token <y_val> T_CON 347 1.496 rillig %token <y_named_constant> T_NAMED_CONSTANT 348 1.121 rillig %token <y_string> T_STRING 349 1.1 cgd 350 1.448 rillig /* No type for program. */ 351 1.320 rillig %type <y_sym> identifier_sym 352 1.320 rillig %type <y_name> identifier 353 1.320 rillig %type <y_string> string 354 1.307 rillig %type <y_tnode> primary_expression 355 1.478 rillig %type <y_designation> member_designator 356 1.320 rillig %type <y_tnode> generic_selection 357 1.320 rillig %type <y_generic> generic_assoc_list 358 1.320 rillig %type <y_generic> generic_association 359 1.307 rillig %type <y_tnode> postfix_expression 360 1.320 rillig %type <y_tnode> gcc_statement_expr_list 361 1.320 rillig %type <y_tnode> gcc_statement_expr_item 362 1.320 rillig %type <y_op> point_or_arrow 363 1.487 rillig %type <y_arguments> argument_expression_list 364 1.499 rillig %type <y_scl> storage_class_specifiers 365 1.308 rillig %type <y_tnode> unary_expression 366 1.316 rillig %type <y_tnode> cast_expression 367 1.448 rillig %type <y_tnode> expression_opt 368 1.325 rillig %type <y_tnode> conditional_expression 369 1.325 rillig %type <y_tnode> assignment_expression 370 1.322 rillig %type <y_tnode> expression 371 1.454 rillig %type <y_tnode> constant_expression 372 1.448 rillig /* No type for declaration_or_error. */ 373 1.448 rillig /* No type for declaration. */ 374 1.448 rillig /* No type for begin_type_declaration_specifiers. */ 375 1.448 rillig /* No type for begin_type_declmods. */ 376 1.448 rillig /* No type for begin_type_specifier_qualifier_list. */ 377 1.448 rillig /* No type for begin_type_specifier_qualifier_list_postfix. */ 378 1.320 rillig %type <y_type> begin_type_typespec 379 1.448 rillig /* No type for begin_type_qualifier_list. */ 380 1.448 rillig /* No type for declmod. */ 381 1.510 rillig %type <y_type_attributes> type_attribute_list_opt 382 1.510 rillig %type <y_type_attributes> type_attribute_list 383 1.510 rillig %type <y_type_attributes> type_attribute 384 1.448 rillig /* No type for begin_type. */ 385 1.448 rillig /* No type for end_type. */ 386 1.498 rillig /* No type for notype_init_declarator_list. */ 387 1.498 rillig /* No type for type_init_declarator_list. */ 388 1.497 rillig /* No type for notype_init_declarator. */ 389 1.497 rillig /* No type for type_init_declarator. */ 390 1.499 rillig %type <y_scl> storage_class_specifier 391 1.501 rillig %type <y_type> type_type_specifier 392 1.300 rillig %type <y_type> notype_type_specifier 393 1.300 rillig %type <y_type> struct_or_union_specifier 394 1.300 rillig %type <y_tspec> struct_or_union 395 1.454 rillig %type <y_sym> braced_member_declaration_list 396 1.454 rillig %type <y_sym> member_declaration_list_with_rbrace 397 1.454 rillig %type <y_sym> member_declaration_list 398 1.454 rillig %type <y_sym> member_declaration 399 1.498 rillig %type <y_sym> notype_member_declarator_list 400 1.498 rillig %type <y_sym> type_member_declarator_list 401 1.454 rillig %type <y_sym> notype_member_declarator 402 1.454 rillig %type <y_sym> type_member_declarator 403 1.320 rillig %type <y_type> enum_specifier 404 1.448 rillig /* No type for enum. */ 405 1.306 rillig %type <y_sym> enum_declaration 406 1.306 rillig %type <y_sym> enums_with_opt_comma 407 1.259 rillig %type <y_sym> enumerator_list 408 1.1 cgd %type <y_sym> enumerator 409 1.497 rillig %type <y_type> atomic_type_specifier 410 1.497 rillig /* No type for atomic. */ 411 1.461 rillig %type <y_type_qualifiers> type_qualifier 412 1.324 rillig %type <y_sym> notype_declarator 413 1.324 rillig %type <y_sym> type_declarator 414 1.324 rillig %type <y_sym> notype_direct_declarator 415 1.324 rillig %type <y_sym> type_direct_declarator 416 1.497 rillig %type <y_qual_ptr> pointer 417 1.497 rillig %type <y_type_qualifiers> type_qualifier_list_opt 418 1.497 rillig %type <y_type_qualifiers> type_qualifier_list 419 1.497 rillig %type <y_sym> parameter_declaration 420 1.324 rillig %type <y_sym> type_param_declarator 421 1.324 rillig %type <y_sym> notype_param_declarator 422 1.324 rillig %type <y_sym> direct_param_declarator 423 1.324 rillig %type <y_sym> direct_notype_param_declarator 424 1.466 rillig %type <y_parameter_list> param_list 425 1.364 rillig %type <y_array_size> array_size_opt 426 1.1 cgd %type <y_sym> identifier_list 427 1.320 rillig %type <y_type> type_name 428 1.320 rillig %type <y_sym> abstract_declaration 429 1.466 rillig %type <y_parameter_list> abstract_decl_param_list 430 1.448 rillig /* No type for abstract_decl_lparen. */ 431 1.466 rillig %type <y_parameter_list> vararg_parameter_type_list 432 1.466 rillig %type <y_parameter_list> parameter_type_list 433 1.497 rillig %type <y_sym> abstract_declarator 434 1.497 rillig %type <y_sym> direct_abstract_declarator 435 1.448 rillig /* No type for braced_initializer. */ 436 1.448 rillig /* No type for initializer. */ 437 1.448 rillig /* No type for initializer_list. */ 438 1.448 rillig /* No type for designation. */ 439 1.448 rillig /* No type for designator_list. */ 440 1.448 rillig /* No type for designator. */ 441 1.448 rillig /* No type for static_assert_declaration. */ 442 1.320 rillig %type <y_range> range 443 1.448 rillig /* No type for init_lbrace. */ 444 1.448 rillig /* No type for init_rbrace. */ 445 1.500 rillig %type <y_attribute_list> attribute_specifier_sequence 446 1.500 rillig %type <y_attribute_list> attribute_specifier 447 1.500 rillig %type <y_attribute_list> attribute_list 448 1.500 rillig %type <y_attribute> attribute 449 1.500 rillig %type <y_tokens> attribute_argument_clause 450 1.297 rillig %type <y_name> asm_or_symbolrename_opt 451 1.448 rillig /* No type for statement. */ 452 1.476 rillig /* No type for no_attr_statement. */ 453 1.448 rillig /* No type for non_expr_statement. */ 454 1.476 rillig /* No type for no_attr_non_expr_statement. */ 455 1.497 rillig /* No type for label. */ 456 1.448 rillig /* No type for labeled_statement. */ 457 1.448 rillig /* No type for compound_statement. */ 458 1.448 rillig /* No type for compound_statement_lbrace. */ 459 1.448 rillig /* No type for compound_statement_rbrace. */ 460 1.185 rillig %type <y_seen_statement> block_item_list 461 1.185 rillig %type <y_seen_statement> block_item 462 1.448 rillig /* No type for expression_statement. */ 463 1.448 rillig /* No type for selection_statement. */ 464 1.448 rillig /* No type for if_without_else. */ 465 1.448 rillig /* No type for if_expr. */ 466 1.448 rillig /* No type for switch_expr. */ 467 1.448 rillig /* No type for iteration_statement. */ 468 1.448 rillig /* No type for while_expr. */ 469 1.448 rillig /* No type for do_statement. */ 470 1.448 rillig /* No type for do. */ 471 1.448 rillig /* No type for for_start. */ 472 1.448 rillig /* No type for for_exprs. */ 473 1.448 rillig /* No type for jump_statement. */ 474 1.448 rillig /* No type for goto. */ 475 1.448 rillig /* No type for asm_statement. */ 476 1.448 rillig /* No type for read_until_rparen. */ 477 1.448 rillig /* No type for translation_unit. */ 478 1.448 rillig /* No type for external_declaration. */ 479 1.448 rillig /* No type for top_level_declaration. */ 480 1.448 rillig /* No type for function_definition. */ 481 1.324 rillig %type <y_sym> func_declarator 482 1.448 rillig /* No type for arg_declaration_list_opt. */ 483 1.448 rillig /* No type for arg_declaration_list. */ 484 1.448 rillig /* No type for arg_declaration. */ 485 1.510 rillig %type <y_type_attributes> gcc_attribute_specifier_list_opt 486 1.510 rillig %type <y_type_attributes> gcc_attribute_specifier_list 487 1.510 rillig %type <y_type_attributes> gcc_attribute_specifier 488 1.510 rillig %type <y_type_attributes> gcc_attribute_list 489 1.510 rillig %type <y_type_attributes> gcc_attribute 490 1.370 rillig %type <y_in_system_header> sys 491 1.1 cgd 492 1.1 cgd %% 493 1.1 cgd 494 1.1 cgd program: 495 1.455 rillig /* empty */ { 496 1.410 rillig /* TODO: Make this an error in C99 mode as well. */ 497 1.489 rillig if (!allow_trad && !allow_c99) 498 1.1 cgd /* empty translation unit */ 499 1.1 cgd error(272); 500 1.489 rillig else if (allow_c90) 501 1.1 cgd /* empty translation unit */ 502 1.1 cgd warning(272); 503 1.455 rillig } 504 1.455 rillig | translation_unit 505 1.455 rillig ; 506 1.1 cgd 507 1.319 rillig identifier_sym: /* helper for struct/union/enum */ 508 1.455 rillig identifier { 509 1.319 rillig $$ = getsym($1); 510 1.455 rillig } 511 1.455 rillig ; 512 1.319 rillig 513 1.321 rillig /* K&R ???, C90 ???, C99 6.4.2.1, C11 ??? */ 514 1.319 rillig identifier: 515 1.455 rillig T_NAME { 516 1.357 rillig debug_step("cgram: name '%s'", $1->sb_name); 517 1.319 rillig $$ = $1; 518 1.455 rillig } 519 1.455 rillig | T_TYPENAME { 520 1.357 rillig debug_step("cgram: typename '%s'", $1->sb_name); 521 1.319 rillig $$ = $1; 522 1.455 rillig } 523 1.455 rillig ; 524 1.319 rillig 525 1.319 rillig /* see C99 6.4.5, string literals are joined by 5.1.1.2 */ 526 1.319 rillig string: 527 1.455 rillig T_STRING 528 1.455 rillig | string T_STRING { 529 1.489 rillig if (!allow_c90) 530 1.523 rillig /* concatenated strings require C90 or later */ 531 1.319 rillig warning(219); 532 1.319 rillig $$ = cat_strings($1, $2); 533 1.455 rillig } 534 1.455 rillig ; 535 1.319 rillig 536 1.497 rillig /* K&R 7.1, C90 ???, C99 6.5.1, C11 6.5.1, C23 6.5.2 */ 537 1.319 rillig primary_expression: 538 1.455 rillig T_NAME { 539 1.402 rillig bool sys_name, sys_next; 540 1.369 rillig sys_name = in_system_header; 541 1.319 rillig if (yychar < 0) 542 1.319 rillig yychar = yylex(); 543 1.369 rillig sys_next = in_system_header; 544 1.369 rillig in_system_header = sys_name; 545 1.375 rillig $$ = build_name(getsym($1), yychar == T_LPAREN); 546 1.369 rillig in_system_header = sys_next; 547 1.455 rillig } 548 1.455 rillig | T_CON { 549 1.330 rillig $$ = build_constant(gettyp($1->v_tspec), $1); 550 1.455 rillig } 551 1.496 rillig | T_NAMED_CONSTANT { 552 1.496 rillig if ($1 == NC_NULLPTR) { 553 1.496 rillig tnode_t *zero = expr_alloc_tnode(); 554 1.496 rillig zero->tn_op = CON; 555 1.496 rillig zero->tn_type = gettyp(INT); 556 1.496 rillig zero->u.value.v_tspec = INT; 557 1.496 rillig 558 1.496 rillig type_t *void_ptr = block_derive_type(gettyp(VOID), PTR); 559 1.496 rillig $$ = convert(CVT, 0, void_ptr, zero); 560 1.496 rillig $$->tn_sys = zero->tn_sys; 561 1.496 rillig } else { 562 1.496 rillig tnode_t *nc = expr_alloc_tnode(); 563 1.496 rillig nc->tn_op = CON; 564 1.496 rillig nc->tn_type = gettyp(BOOL); 565 1.496 rillig nc->u.value.v_tspec = BOOL; 566 1.496 rillig nc->u.value.u.integer = $1 == NC_TRUE ? 1 : 0; 567 1.496 rillig $$ = nc; 568 1.496 rillig } 569 1.496 rillig } 570 1.455 rillig | string { 571 1.330 rillig $$ = build_string($1); 572 1.455 rillig } 573 1.455 rillig | T_LPAREN expression T_RPAREN { 574 1.319 rillig if ($2 != NULL) 575 1.319 rillig $2->tn_parenthesized = true; 576 1.319 rillig $$ = $2; 577 1.455 rillig } 578 1.455 rillig | generic_selection 579 1.319 rillig /* GCC primary-expression, see c_parser_postfix_expression */ 580 1.478 rillig | T_BUILTIN_OFFSETOF T_LPAREN type_name T_COMMA { 581 1.484 rillig set_sym_kind(SK_MEMBER); 582 1.478 rillig } member_designator T_RPAREN { 583 1.478 rillig $$ = build_offsetof($3, $6); 584 1.478 rillig } 585 1.478 rillig ; 586 1.478 rillig 587 1.478 rillig /* K&R ---, C90 ---, C99 7.17p3, C11 7.19p3, C23 7.21p4 */ 588 1.478 rillig member_designator: 589 1.478 rillig identifier { 590 1.478 rillig $$ = (designation) { .dn_len = 0 }; 591 1.480 rillig designation_push(&$$, DK_MEMBER, getsym($1), 0); 592 1.478 rillig } 593 1.478 rillig | member_designator T_LBRACK range T_RBRACK { 594 1.478 rillig $$ = $1; 595 1.480 rillig designation_push(&$$, DK_SUBSCRIPT, NULL, $3.lo); 596 1.478 rillig } 597 1.478 rillig | member_designator T_POINT { 598 1.484 rillig set_sym_kind(SK_MEMBER); 599 1.478 rillig } identifier { 600 1.478 rillig $$ = $1; 601 1.480 rillig designation_push(&$$, DK_MEMBER, getsym($4), 0); 602 1.455 rillig } 603 1.455 rillig ; 604 1.319 rillig 605 1.497 rillig /* K&R ---, C90 ---, C99 ---, C11 6.5.1.1, C23 6.5.2.1 */ 606 1.319 rillig generic_selection: 607 1.455 rillig T_GENERIC T_LPAREN assignment_expression T_COMMA 608 1.319 rillig generic_assoc_list T_RPAREN { 609 1.361 rillig /* generic selection requires C11 or later */ 610 1.361 rillig c11ism(345); 611 1.319 rillig $$ = build_generic_selection($3, $5); 612 1.455 rillig } 613 1.455 rillig ; 614 1.319 rillig 615 1.497 rillig /* K&R ---, C90 ---, C99 ---, C11 6.5.1.1, C23 6.5.2.1 */ 616 1.319 rillig generic_assoc_list: 617 1.455 rillig generic_association 618 1.455 rillig | generic_assoc_list T_COMMA generic_association { 619 1.319 rillig $3->ga_prev = $1; 620 1.319 rillig $$ = $3; 621 1.455 rillig } 622 1.455 rillig ; 623 1.319 rillig 624 1.497 rillig /* K&R ---, C90 ---, C99 ---, C11 6.5.1.1, C23 6.5.2.1 */ 625 1.319 rillig generic_association: 626 1.455 rillig type_name T_COLON assignment_expression { 627 1.463 rillig $$ = block_zero_alloc(sizeof(*$$), "generic"); 628 1.319 rillig $$->ga_arg = $1; 629 1.319 rillig $$->ga_result = $3; 630 1.455 rillig } 631 1.455 rillig | T_DEFAULT T_COLON assignment_expression { 632 1.463 rillig $$ = block_zero_alloc(sizeof(*$$), "generic"); 633 1.319 rillig $$->ga_arg = NULL; 634 1.319 rillig $$->ga_result = $3; 635 1.455 rillig } 636 1.455 rillig ; 637 1.1 cgd 638 1.497 rillig /* K&R 7.1, C90 ???, C99 6.5.2, C11 6.5.2, C23 6.5.3.1 */ 639 1.319 rillig postfix_expression: 640 1.455 rillig primary_expression 641 1.455 rillig | postfix_expression T_LBRACK sys expression T_RBRACK { 642 1.370 rillig $$ = build_unary(INDIR, $3, build_binary($1, PLUS, $3, $4)); 643 1.455 rillig } 644 1.455 rillig | postfix_expression T_LPAREN sys T_RPAREN { 645 1.487 rillig function_call *call = 646 1.487 rillig expr_zero_alloc(sizeof(*call), "function_call"); 647 1.487 rillig $$ = build_function_call($1, $3, call); 648 1.455 rillig } 649 1.455 rillig | postfix_expression T_LPAREN sys argument_expression_list T_RPAREN { 650 1.370 rillig $$ = build_function_call($1, $3, $4); 651 1.455 rillig } 652 1.455 rillig | postfix_expression point_or_arrow sys T_NAME { 653 1.370 rillig $$ = build_member_access($1, $2, $3, $4); 654 1.455 rillig } 655 1.455 rillig | postfix_expression T_INCDEC sys { 656 1.474 rillig $$ = build_unary($2 ? INCAFT : DECAFT, $3, $1); 657 1.455 rillig } 658 1.497 rillig /* Rule 'compound_literal' from C99 6.5.2.5. */ 659 1.497 rillig | T_LPAREN type_name T_RPAREN { 660 1.319 rillig sym_t *tmp = mktempsym($2); 661 1.319 rillig begin_initialization(tmp); 662 1.319 rillig cgram_declare(tmp, true, NULL); 663 1.455 rillig } braced_initializer { 664 1.408 rillig if (!allow_c99) 665 1.385 rillig /* compound literals are a C99/GCC extension */ 666 1.319 rillig gnuism(319); 667 1.433 rillig $$ = build_name(current_initsym(), false); 668 1.319 rillig end_initialization(); 669 1.455 rillig } 670 1.499 rillig /* Rule 'compound_literal' with storage classes from C23 6.5.3.6. */ 671 1.499 rillig | T_LPAREN storage_class_specifiers type_name T_RPAREN { 672 1.499 rillig sym_t *tmp = mktempsym($3); 673 1.499 rillig tmp->s_scl = $2; 674 1.499 rillig begin_initialization(tmp); 675 1.499 rillig cgram_declare(tmp, true, NULL); 676 1.499 rillig } braced_initializer { 677 1.499 rillig if (!allow_c99) 678 1.499 rillig /* compound literals are a C99/GCC extension */ 679 1.499 rillig gnuism(319); 680 1.499 rillig $$ = build_name(current_initsym(), false); 681 1.499 rillig end_initialization(); 682 1.499 rillig } 683 1.455 rillig | T_LPAREN compound_statement_lbrace { 684 1.381 rillig begin_statement_expr(); 685 1.455 rillig } gcc_statement_expr_list { 686 1.381 rillig do_statement_expr($4); 687 1.455 rillig } compound_statement_rbrace T_RPAREN { 688 1.380 rillig $$ = end_statement_expr(); 689 1.455 rillig } 690 1.455 rillig ; 691 1.1 cgd 692 1.193 rillig /* 693 1.319 rillig * The inner part of a GCC statement-expression of the form ({ ... }). 694 1.193 rillig * 695 1.319 rillig * https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html 696 1.193 rillig */ 697 1.319 rillig gcc_statement_expr_list: 698 1.455 rillig gcc_statement_expr_item 699 1.455 rillig | gcc_statement_expr_list gcc_statement_expr_item { 700 1.319 rillig $$ = $2; 701 1.455 rillig } 702 1.455 rillig ; 703 1.319 rillig 704 1.319 rillig gcc_statement_expr_item: 705 1.455 rillig declaration_or_error { 706 1.319 rillig clear_warning_flags(); 707 1.319 rillig $$ = NULL; 708 1.455 rillig } 709 1.455 rillig | non_expr_statement { 710 1.383 rillig $$ = expr_alloc_tnode(); 711 1.319 rillig $$->tn_type = gettyp(VOID); 712 1.455 rillig } 713 1.455 rillig | T_SEMI { 714 1.445 rillig $$ = expr_alloc_tnode(); 715 1.445 rillig $$->tn_type = gettyp(VOID); 716 1.455 rillig } 717 1.455 rillig | expression T_SEMI { 718 1.319 rillig if ($1 == NULL) { /* in case of syntax errors */ 719 1.383 rillig $$ = expr_alloc_tnode(); 720 1.319 rillig $$->tn_type = gettyp(VOID); 721 1.319 rillig } else { 722 1.319 rillig /* XXX: do that only on the last name */ 723 1.319 rillig if ($1->tn_op == NAME) 724 1.491 rillig $1->u.sym->s_used = true; 725 1.515 rillig expr($1, true, false, false, false, 726 1.515 rillig "statement expression"); 727 1.458 rillig suppress_fallthrough = false; 728 1.334 rillig $$ = $1; 729 1.319 rillig } 730 1.455 rillig } 731 1.455 rillig ; 732 1.319 rillig 733 1.319 rillig point_or_arrow: /* helper for 'postfix_expression' */ 734 1.455 rillig T_POINT { 735 1.484 rillig set_sym_kind(SK_MEMBER); 736 1.319 rillig $$ = POINT; 737 1.455 rillig } 738 1.455 rillig | T_ARROW { 739 1.484 rillig set_sym_kind(SK_MEMBER); 740 1.319 rillig $$ = ARROW; 741 1.455 rillig } 742 1.455 rillig ; 743 1.319 rillig 744 1.497 rillig /* K&R 7.1, C90 ???, C99 6.5.2, C11 6.5.2, C23 6.5.3.1 */ 745 1.319 rillig argument_expression_list: 746 1.455 rillig assignment_expression { 747 1.487 rillig $$ = expr_zero_alloc(sizeof(*$$), "function_call"); 748 1.487 rillig add_function_argument($$, $1); 749 1.455 rillig } 750 1.455 rillig | argument_expression_list T_COMMA assignment_expression { 751 1.492 rillig $$ = $1; 752 1.487 rillig add_function_argument($1, $3); 753 1.455 rillig } 754 1.455 rillig ; 755 1.319 rillig 756 1.497 rillig 757 1.497 rillig /* C23 6.5.3.6 */ 758 1.497 rillig /* The rule 'compound_literal' is inlined into 'postfix_expression'. */ 759 1.497 rillig 760 1.499 rillig /* C23 6.5.3.6 */ 761 1.499 rillig storage_class_specifiers: 762 1.499 rillig storage_class_specifier 763 1.499 rillig | storage_class_specifiers storage_class_specifier { 764 1.499 rillig // TODO C23: maybe merge multiple storage class specifiers 765 1.499 rillig $$ = $1; 766 1.499 rillig } 767 1.499 rillig ; 768 1.497 rillig 769 1.497 rillig /* K&R 7.2, C90 ???, C99 6.5.3, C11 6.5.3, C23 6.5.4 */ 770 1.319 rillig unary_expression: 771 1.455 rillig postfix_expression 772 1.455 rillig | T_INCDEC sys unary_expression { 773 1.474 rillig $$ = build_unary($1 ? INCBEF : DECBEF, $2, $3); 774 1.455 rillig } 775 1.455 rillig | T_AMPER sys cast_expression { 776 1.370 rillig $$ = build_unary(ADDR, $2, $3); 777 1.455 rillig } 778 1.455 rillig | T_ASTERISK sys cast_expression { 779 1.370 rillig $$ = build_unary(INDIR, $2, $3); 780 1.455 rillig } 781 1.455 rillig | T_ADDITIVE sys cast_expression { 782 1.489 rillig if (!allow_c90 && $1 == PLUS) 783 1.523 rillig /* unary '+' requires C90 or later */ 784 1.319 rillig warning(100); 785 1.370 rillig $$ = build_unary($1 == PLUS ? UPLUS : UMINUS, $2, $3); 786 1.455 rillig } 787 1.455 rillig | T_COMPLEMENT sys cast_expression { 788 1.370 rillig $$ = build_unary(COMPL, $2, $3); 789 1.455 rillig } 790 1.455 rillig | T_LOGNOT sys cast_expression { 791 1.370 rillig $$ = build_unary(NOT, $2, $3); 792 1.455 rillig } 793 1.455 rillig | T_REAL sys cast_expression { /* GCC c_parser_unary_expression */ 794 1.370 rillig $$ = build_unary(REAL, $2, $3); 795 1.455 rillig } 796 1.455 rillig | T_IMAG sys cast_expression { /* GCC c_parser_unary_expression */ 797 1.370 rillig $$ = build_unary(IMAG, $2, $3); 798 1.455 rillig } 799 1.455 rillig | T_EXTENSION cast_expression { /* GCC c_parser_unary_expression */ 800 1.319 rillig $$ = $2; 801 1.455 rillig } 802 1.455 rillig | T_SIZEOF unary_expression { 803 1.319 rillig $$ = $2 == NULL ? NULL : build_sizeof($2->tn_type); 804 1.319 rillig if ($$ != NULL) 805 1.338 rillig check_expr_misc($2, 806 1.338 rillig false, false, false, false, false, true); 807 1.455 rillig } 808 1.455 rillig | T_SIZEOF T_LPAREN type_name T_RPAREN { 809 1.319 rillig $$ = build_sizeof($3); 810 1.455 rillig } 811 1.455 rillig | T_ALIGNOF unary_expression { 812 1.415 rillig /* non type argument to alignof is a GCC extension */ 813 1.415 rillig gnuism(349); 814 1.411 rillig lint_assert($2 != NULL); 815 1.411 rillig $$ = build_alignof($2->tn_type); 816 1.455 rillig } 817 1.497 rillig /* K&R ---, C90 ---, C99 ---, C11 6.5.3, C23 6.5.4.4 */ 818 1.455 rillig | T_ALIGNOF T_LPAREN type_name T_RPAREN { 819 1.334 rillig /* TODO: c11ism */ 820 1.319 rillig $$ = build_alignof($3); 821 1.455 rillig } 822 1.455 rillig ; 823 1.319 rillig 824 1.497 rillig /* C23 6.5.4 */ 825 1.319 rillig /* The rule 'unary_operator' is inlined into unary_expression. */ 826 1.319 rillig 827 1.497 rillig /* K&R 7.2, C90 ???, C99 6.5.4, C11 6.5.4, C23 6.5.5 */ 828 1.319 rillig cast_expression: 829 1.455 rillig unary_expression 830 1.479 rillig | T_LPAREN type_name T_RPAREN sys cast_expression { 831 1.479 rillig $$ = cast($5, $4, $2); 832 1.455 rillig } 833 1.455 rillig ; 834 1.319 rillig 835 1.322 rillig expression_opt: 836 1.455 rillig /* empty */ { 837 1.319 rillig $$ = NULL; 838 1.455 rillig } 839 1.455 rillig | expression 840 1.455 rillig ; 841 1.319 rillig 842 1.325 rillig /* 'conditional_expression' also implements 'multiplicative_expression'. */ 843 1.325 rillig /* 'conditional_expression' also implements 'additive_expression'. */ 844 1.325 rillig /* 'conditional_expression' also implements 'shift_expression'. */ 845 1.325 rillig /* 'conditional_expression' also implements 'relational_expression'. */ 846 1.325 rillig /* 'conditional_expression' also implements 'equality_expression'. */ 847 1.325 rillig /* 'conditional_expression' also implements 'AND_expression'. */ 848 1.325 rillig /* 'conditional_expression' also implements 'exclusive_OR_expression'. */ 849 1.325 rillig /* 'conditional_expression' also implements 'inclusive_OR_expression'. */ 850 1.325 rillig /* 'conditional_expression' also implements 'logical_AND_expression'. */ 851 1.325 rillig /* 'conditional_expression' also implements 'logical_OR_expression'. */ 852 1.497 rillig /* K&R ???, C90 ???, C99 6.5.5 to 6.5.15, C11 6.5.5 to 6.5.15, C23 6.5.6 to 6.5.16 */ 853 1.325 rillig conditional_expression: 854 1.455 rillig cast_expression 855 1.455 rillig | conditional_expression T_ASTERISK sys conditional_expression { 856 1.370 rillig $$ = build_binary($1, MULT, $3, $4); 857 1.455 rillig } 858 1.455 rillig | conditional_expression T_MULTIPLICATIVE sys conditional_expression { 859 1.370 rillig $$ = build_binary($1, $2, $3, $4); 860 1.455 rillig } 861 1.455 rillig | conditional_expression T_ADDITIVE sys conditional_expression { 862 1.370 rillig $$ = build_binary($1, $2, $3, $4); 863 1.455 rillig } 864 1.455 rillig | conditional_expression T_SHIFT sys conditional_expression { 865 1.370 rillig $$ = build_binary($1, $2, $3, $4); 866 1.455 rillig } 867 1.455 rillig | conditional_expression T_RELATIONAL sys conditional_expression { 868 1.370 rillig $$ = build_binary($1, $2, $3, $4); 869 1.455 rillig } 870 1.455 rillig | conditional_expression T_EQUALITY sys conditional_expression { 871 1.370 rillig $$ = build_binary($1, $2, $3, $4); 872 1.455 rillig } 873 1.455 rillig | conditional_expression T_AMPER sys conditional_expression { 874 1.370 rillig $$ = build_binary($1, BITAND, $3, $4); 875 1.455 rillig } 876 1.455 rillig | conditional_expression T_BITXOR sys conditional_expression { 877 1.370 rillig $$ = build_binary($1, BITXOR, $3, $4); 878 1.455 rillig } 879 1.455 rillig | conditional_expression T_BITOR sys conditional_expression { 880 1.370 rillig $$ = build_binary($1, BITOR, $3, $4); 881 1.455 rillig } 882 1.455 rillig | conditional_expression T_LOGAND sys conditional_expression { 883 1.370 rillig $$ = build_binary($1, LOGAND, $3, $4); 884 1.455 rillig } 885 1.455 rillig | conditional_expression T_LOGOR sys conditional_expression { 886 1.370 rillig $$ = build_binary($1, LOGOR, $3, $4); 887 1.455 rillig } 888 1.455 rillig | conditional_expression T_QUEST sys 889 1.370 rillig expression T_COLON sys conditional_expression { 890 1.370 rillig $$ = build_binary($1, QUEST, $3, 891 1.370 rillig build_binary($4, COLON, $6, $7)); 892 1.455 rillig } 893 1.455 rillig ; 894 1.325 rillig 895 1.497 rillig /* K&R ???, C90 ???, C99 6.5.16, C11 6.5.16, C23 6.5.17.1 */ 896 1.325 rillig assignment_expression: 897 1.455 rillig conditional_expression 898 1.455 rillig | unary_expression T_ASSIGN sys assignment_expression { 899 1.370 rillig $$ = build_binary($1, ASSIGN, $3, $4); 900 1.455 rillig } 901 1.455 rillig | unary_expression T_OPASSIGN sys assignment_expression { 902 1.370 rillig $$ = build_binary($1, $2, $3, $4); 903 1.455 rillig } 904 1.455 rillig ; 905 1.325 rillig 906 1.497 rillig /* C23 6.5.17.1 */ 907 1.497 rillig /* The rule 'assignment_operator' is inlined into 'assignment_expression'. */ 908 1.497 rillig 909 1.497 rillig /* K&R ???, C90 ???, C99 6.5.17, C11 6.5.17, C23 6.5.18 */ 910 1.325 rillig expression: 911 1.455 rillig assignment_expression 912 1.455 rillig | expression T_COMMA sys assignment_expression { 913 1.370 rillig $$ = build_binary($1, COMMA, $3, $4); 914 1.455 rillig } 915 1.455 rillig ; 916 1.1 cgd 917 1.454 rillig /* K&R ???, C90 ???, C99 6.6, C11 ???, C23 6.6 */ 918 1.454 rillig constant_expression: 919 1.455 rillig conditional_expression 920 1.455 rillig ; 921 1.1 cgd 922 1.326 rillig declaration_or_error: 923 1.455 rillig declaration 924 1.455 rillig | error T_SEMI 925 1.455 rillig ; 926 1.326 rillig 927 1.497 rillig /* K&R ???, C90 ???, C99 6.7, C11 ???, C23 6.7.1 */ 928 1.454 rillig declaration: 929 1.455 rillig begin_type_declmods end_type T_SEMI { 930 1.489 rillig if (dcs->d_scl == TYPEDEF) 931 1.1 cgd /* typedef declares no type name */ 932 1.1 cgd warning(72); 933 1.489 rillig else 934 1.1 cgd /* empty declaration */ 935 1.1 cgd warning(2); 936 1.455 rillig } 937 1.498 rillig | begin_type_declmods end_type notype_init_declarator_list T_SEMI { 938 1.489 rillig if (dcs->d_scl == TYPEDEF) 939 1.401 rillig /* syntax error '%s' */ 940 1.401 rillig error(249, "missing base type for typedef"); 941 1.489 rillig else 942 1.424 rillig /* old-style declaration; add 'int' */ 943 1.401 rillig error(1); 944 1.455 rillig } 945 1.455 rillig | begin_type_declaration_specifiers end_type T_SEMI { 946 1.489 rillig if (dcs->d_scl == TYPEDEF) 947 1.1 cgd /* typedef declares no type name */ 948 1.1 cgd warning(72); 949 1.489 rillig else if (!dcs->d_nonempty_decl) 950 1.1 cgd /* empty declaration */ 951 1.1 cgd warning(2); 952 1.455 rillig } 953 1.455 rillig | begin_type_declaration_specifiers end_type 954 1.498 rillig type_init_declarator_list T_SEMI 955 1.455 rillig | static_assert_declaration 956 1.455 rillig ; 957 1.1 cgd 958 1.497 rillig /* TODO: Implement 'declaration_specifiers' from C23 6.7.1. */ 959 1.497 rillig 960 1.497 rillig begin_type_declaration_specifiers: /* see C99 6.7, C23 6.7.1 */ 961 1.455 rillig begin_type_typespec { 962 1.422 rillig dcs_add_type($1); 963 1.455 rillig } 964 1.501 rillig | begin_type_declmods type_type_specifier { 965 1.422 rillig dcs_add_type($2); 966 1.455 rillig } 967 1.510 rillig | type_attribute begin_type_declaration_specifiers { 968 1.527 rillig dcs_add_type_attributes($1); 969 1.510 rillig } 970 1.455 rillig | begin_type_declaration_specifiers declmod 971 1.455 rillig | begin_type_declaration_specifiers notype_type_specifier { 972 1.422 rillig dcs_add_type($2); 973 1.455 rillig } 974 1.455 rillig ; 975 1.1 cgd 976 1.319 rillig begin_type_declmods: /* see C99 6.7 */ 977 1.455 rillig begin_type type_qualifier { 978 1.461 rillig dcs_add_qualifiers($2); 979 1.455 rillig } 980 1.455 rillig | begin_type T_SCLASS { 981 1.422 rillig dcs_add_storage_class($2); 982 1.455 rillig } 983 1.456 rillig | begin_type T_FUNCTION_SPECIFIER { 984 1.456 rillig dcs_add_function_specifier($2); 985 1.456 rillig } 986 1.455 rillig | begin_type_declmods declmod 987 1.455 rillig ; 988 1.1 cgd 989 1.333 rillig begin_type_specifier_qualifier_list: /* see C11 6.7.2.1 */ 990 1.455 rillig begin_type_specifier_qualifier_list_postfix 991 1.455 rillig | type_attribute_list begin_type_specifier_qualifier_list_postfix 992 1.455 rillig ; 993 1.344 rillig 994 1.344 rillig begin_type_specifier_qualifier_list_postfix: 995 1.455 rillig begin_type_typespec { 996 1.422 rillig dcs_add_type($1); 997 1.455 rillig } 998 1.501 rillig | begin_type_qualifier_list type_type_specifier { 999 1.422 rillig dcs_add_type($2); 1000 1.455 rillig } 1001 1.455 rillig | begin_type_specifier_qualifier_list_postfix type_qualifier { 1002 1.461 rillig dcs_add_qualifiers($2); 1003 1.455 rillig } 1004 1.455 rillig | begin_type_specifier_qualifier_list_postfix notype_type_specifier { 1005 1.422 rillig dcs_add_type($2); 1006 1.455 rillig } 1007 1.455 rillig | begin_type_specifier_qualifier_list_postfix type_attribute 1008 1.455 rillig ; 1009 1.299 rillig 1010 1.306 rillig begin_type_typespec: 1011 1.455 rillig begin_type notype_type_specifier { 1012 1.306 rillig $$ = $2; 1013 1.455 rillig } 1014 1.455 rillig | begin_type T_TYPENAME { 1015 1.406 rillig $$ = getsym($2)->s_type; 1016 1.455 rillig } 1017 1.455 rillig ; 1018 1.302 rillig 1019 1.333 rillig begin_type_qualifier_list: 1020 1.455 rillig begin_type type_qualifier { 1021 1.461 rillig dcs_add_qualifiers($2); 1022 1.455 rillig } 1023 1.455 rillig | begin_type_qualifier_list type_qualifier { 1024 1.461 rillig dcs_add_qualifiers($2); 1025 1.455 rillig } 1026 1.455 rillig ; 1027 1.319 rillig 1028 1.319 rillig declmod: 1029 1.455 rillig type_qualifier { 1030 1.461 rillig dcs_add_qualifiers($1); 1031 1.455 rillig } 1032 1.455 rillig | T_SCLASS { 1033 1.422 rillig dcs_add_storage_class($1); 1034 1.455 rillig } 1035 1.456 rillig | T_FUNCTION_SPECIFIER { 1036 1.456 rillig dcs_add_function_specifier($1); 1037 1.456 rillig } 1038 1.514 rillig | type_attribute_list { 1039 1.526 rillig dcs_add_type_attributes($1); 1040 1.514 rillig } 1041 1.455 rillig ; 1042 1.319 rillig 1043 1.398 rillig type_attribute_list_opt: 1044 1.510 rillig /* empty */ { 1045 1.510 rillig $$ = (type_attributes){ .used = false }; 1046 1.510 rillig } 1047 1.455 rillig | type_attribute_list 1048 1.455 rillig ; 1049 1.398 rillig 1050 1.302 rillig type_attribute_list: 1051 1.455 rillig type_attribute 1052 1.510 rillig | type_attribute_list type_attribute { 1053 1.526 rillig $$ = merge_type_attributes($1, $2); 1054 1.510 rillig } 1055 1.455 rillig ; 1056 1.302 rillig 1057 1.302 rillig type_attribute: /* See C11 6.7 declaration-specifiers */ 1058 1.455 rillig gcc_attribute_specifier 1059 1.501 rillig | T_ALIGNAS T_LPAREN type_type_specifier T_RPAREN { /* C11 6.7.5 */ 1060 1.494 rillig dcs_add_alignas(build_sizeof($3)); 1061 1.526 rillig $$ = no_type_attributes(); 1062 1.494 rillig } 1063 1.494 rillig | T_ALIGNAS T_LPAREN constant_expression T_RPAREN { /* C11 6.7.5 */ 1064 1.494 rillig dcs_add_alignas($3); 1065 1.526 rillig $$ = no_type_attributes(); 1066 1.494 rillig } 1067 1.455 rillig | T_PACKED { 1068 1.422 rillig dcs_add_packed(); 1069 1.526 rillig $$ = no_type_attributes(); 1070 1.455 rillig } 1071 1.455 rillig ; 1072 1.302 rillig 1073 1.319 rillig begin_type: 1074 1.455 rillig /* empty */ { 1075 1.422 rillig dcs_begin_type(); 1076 1.455 rillig } 1077 1.504 rillig | attribute_specifier_sequence { 1078 1.504 rillig dcs_begin_type(); 1079 1.506 rillig dcs->d_used = attributes_contain(&$1, "maybe_unused"); 1080 1.514 rillig dcs->d_noreturn = attributes_contain(&$1, "noreturn"); 1081 1.504 rillig } 1082 1.455 rillig ; 1083 1.319 rillig 1084 1.319 rillig end_type: 1085 1.455 rillig /* empty */ { 1086 1.422 rillig dcs_end_type(); 1087 1.455 rillig } 1088 1.455 rillig ; 1089 1.319 rillig 1090 1.497 rillig /* TODO: Implement 'declaration_specifier' from C23 6.7.1. */ 1091 1.497 rillig 1092 1.497 rillig /* 1093 1.497 rillig * For an explanation of 'type' and 'notype' prefixes in the following rules, 1094 1.497 rillig * see https://www.gnu.org/software/bison/manual/bison.html#Semantic-Tokens. 1095 1.497 rillig */ 1096 1.497 rillig 1097 1.497 rillig /* C23 6.7.1 */ 1098 1.497 rillig /* The rule 'init_declarator_list' is split into the 'notype' and 'type' variants. */ 1099 1.497 rillig 1100 1.498 rillig notype_init_declarator_list: 1101 1.497 rillig notype_init_declarator 1102 1.498 rillig | notype_init_declarator_list T_COMMA type_init_declarator 1103 1.497 rillig ; 1104 1.497 rillig 1105 1.498 rillig type_init_declarator_list: 1106 1.497 rillig type_init_declarator 1107 1.498 rillig | type_init_declarator_list T_COMMA type_init_declarator 1108 1.497 rillig ; 1109 1.497 rillig 1110 1.497 rillig /* C23 6.7.1 */ 1111 1.497 rillig /* The rule 'init_declarator' is split into the 'notype' and 'type' variants. */ 1112 1.497 rillig 1113 1.497 rillig notype_init_declarator: 1114 1.497 rillig notype_declarator asm_or_symbolrename_opt { 1115 1.497 rillig cgram_declare($1, false, $2); 1116 1.497 rillig check_size($1); 1117 1.497 rillig } 1118 1.497 rillig | notype_declarator asm_or_symbolrename_opt { 1119 1.497 rillig begin_initialization($1); 1120 1.497 rillig cgram_declare($1, true, $2); 1121 1.497 rillig } T_ASSIGN initializer { 1122 1.497 rillig check_size($1); 1123 1.497 rillig end_initialization(); 1124 1.497 rillig } 1125 1.497 rillig ; 1126 1.497 rillig 1127 1.497 rillig type_init_declarator: 1128 1.497 rillig type_declarator asm_or_symbolrename_opt { 1129 1.497 rillig cgram_declare($1, false, $2); 1130 1.497 rillig check_size($1); 1131 1.497 rillig } 1132 1.497 rillig | type_declarator asm_or_symbolrename_opt { 1133 1.497 rillig begin_initialization($1); 1134 1.497 rillig cgram_declare($1, true, $2); 1135 1.497 rillig } T_ASSIGN initializer { 1136 1.507 rillig if ($1->s_type->t_tspec != AUTO_TYPE) 1137 1.507 rillig check_size($1); 1138 1.497 rillig end_initialization(); 1139 1.497 rillig } 1140 1.497 rillig ; 1141 1.497 rillig 1142 1.497 rillig 1143 1.497 rillig /* TODO: Implement 'attribute_declaration' from C23 6.7.1. */ 1144 1.497 rillig 1145 1.499 rillig /* K&R ???, C90 ???, C99 ???, C11 ???, C23 6.7.2 */ 1146 1.499 rillig storage_class_specifier: 1147 1.499 rillig T_SCLASS 1148 1.499 rillig ; 1149 1.497 rillig 1150 1.497 rillig /* C99 6.7.2, C23 6.7.3.1 */ 1151 1.501 rillig /* The rule 'type_specifier' is split into the 'notype' and 'type' variants. */ 1152 1.501 rillig 1153 1.501 rillig type_type_specifier: 1154 1.455 rillig notype_type_specifier 1155 1.455 rillig | T_TYPENAME { 1156 1.1 cgd $$ = getsym($1)->s_type; 1157 1.455 rillig } 1158 1.455 rillig ; 1159 1.1 cgd 1160 1.319 rillig notype_type_specifier: /* see C99 6.7.2 */ 1161 1.455 rillig T_TYPE { 1162 1.1 cgd $$ = gettyp($1); 1163 1.455 rillig } 1164 1.455 rillig | T_TYPEOF T_LPAREN expression T_RPAREN { /* GCC extension */ 1165 1.427 rillig $$ = $3 != NULL ? block_dup_type($3->tn_type) : gettyp(INT); 1166 1.394 rillig $$->t_typeof = true; 1167 1.455 rillig } 1168 1.455 rillig | atomic_type_specifier 1169 1.455 rillig | struct_or_union_specifier { 1170 1.202 rillig end_declaration_level(); 1171 1.1 cgd $$ = $1; 1172 1.455 rillig } 1173 1.455 rillig | enum_specifier { 1174 1.202 rillig end_declaration_level(); 1175 1.1 cgd $$ = $1; 1176 1.455 rillig } 1177 1.455 rillig ; 1178 1.1 cgd 1179 1.497 rillig /* K&R ---, C90 ---, C99 6.7.2.1, C11 ???, C23 6.7.3.2 */ 1180 1.454 rillig struct_or_union_specifier: 1181 1.455 rillig struct_or_union identifier_sym { 1182 1.1 cgd /* 1183 1.1 cgd * STDC requires that "struct a;" always introduces 1184 1.1 cgd * a new tag if "a" is not declared at current level 1185 1.1 cgd * 1186 1.110 rillig * yychar is valid because otherwise the parser would not 1187 1.110 rillig * have been able to decide if it must shift or reduce 1188 1.1 cgd */ 1189 1.423 rillig $$ = make_tag_type($2, $1, false, yychar == T_SEMI); 1190 1.455 rillig } 1191 1.455 rillig | struct_or_union identifier_sym { 1192 1.439 rillig dcs->d_tag_type = make_tag_type($2, $1, true, false); 1193 1.455 rillig } braced_member_declaration_list { 1194 1.437 rillig $$ = complete_struct_or_union($4); 1195 1.455 rillig } 1196 1.455 rillig | struct_or_union { 1197 1.439 rillig dcs->d_tag_type = make_tag_type(NULL, $1, true, false); 1198 1.455 rillig } braced_member_declaration_list { 1199 1.437 rillig $$ = complete_struct_or_union($3); 1200 1.455 rillig } 1201 1.455 rillig | struct_or_union error { 1202 1.484 rillig set_sym_kind(SK_VCFT); 1203 1.1 cgd $$ = gettyp(INT); 1204 1.455 rillig } 1205 1.455 rillig ; 1206 1.1 cgd 1207 1.497 rillig /* K&R ---, C90 ---, C99 6.7.2.1, C11 ???, C23 6.7.3.2 */ 1208 1.454 rillig struct_or_union: 1209 1.455 rillig T_STRUCT_OR_UNION { 1210 1.484 rillig set_sym_kind(SK_TAG); 1211 1.443 rillig begin_declaration_level($1 == STRUCT ? DLK_STRUCT : DLK_UNION); 1212 1.444 rillig dcs->d_sou_size_in_bits = 0; 1213 1.495 rillig dcs->d_sou_align = 1; 1214 1.306 rillig $$ = $1; 1215 1.455 rillig } 1216 1.455 rillig | struct_or_union type_attribute 1217 1.455 rillig ; 1218 1.306 rillig 1219 1.454 rillig braced_member_declaration_list: /* see C99 6.7.2.1 */ 1220 1.455 rillig T_LBRACE { 1221 1.484 rillig set_sym_kind(SK_VCFT); 1222 1.482 rillig } member_declaration_list_with_rbrace { 1223 1.482 rillig $$ = $3; 1224 1.455 rillig } 1225 1.455 rillig ; 1226 1.306 rillig 1227 1.454 rillig member_declaration_list_with_rbrace: /* see C99 6.7.2.1 */ 1228 1.455 rillig member_declaration_list T_RBRACE 1229 1.455 rillig | T_RBRACE { 1230 1.488 rillig /* XXX: Allowed since C23. */ 1231 1.306 rillig $$ = NULL; 1232 1.455 rillig } 1233 1.455 rillig ; 1234 1.1 cgd 1235 1.497 rillig /* K&R ???, C90 ???, C99 6.7.2.1, C11 6.7.2.1, C23 6.7.3.2 */ 1236 1.454 rillig /* Was named struct_declaration_list until C11. */ 1237 1.454 rillig member_declaration_list: 1238 1.455 rillig member_declaration 1239 1.455 rillig | member_declaration_list member_declaration { 1240 1.441 rillig $$ = concat_symbols($1, $2); 1241 1.455 rillig } 1242 1.455 rillig ; 1243 1.1 cgd 1244 1.501 rillig /* K&R ???, C90 ???, C99 6.7.2.1, C11 6.7.2.1, C23 6.7.3.2 */ 1245 1.454 rillig /* Was named struct_declaration until C11. */ 1246 1.454 rillig member_declaration: 1247 1.455 rillig begin_type_qualifier_list end_type { 1248 1.334 rillig /* ^^ There is no check for the missing type-specifier. */ 1249 1.1 cgd /* too late, i know, but getsym() compensates it */ 1250 1.484 rillig set_sym_kind(SK_MEMBER); 1251 1.498 rillig } notype_member_declarator_list T_SEMI { 1252 1.484 rillig set_sym_kind(SK_VCFT); 1253 1.306 rillig $$ = $4; 1254 1.455 rillig } 1255 1.455 rillig | begin_type_specifier_qualifier_list end_type { 1256 1.484 rillig set_sym_kind(SK_MEMBER); 1257 1.498 rillig } type_member_declarator_list T_SEMI { 1258 1.484 rillig set_sym_kind(SK_VCFT); 1259 1.306 rillig $$ = $4; 1260 1.455 rillig } 1261 1.531 rillig | begin_type_qualifier_list end_type type_attribute_list_opt T_SEMI { 1262 1.288 rillig /* syntax error '%s' */ 1263 1.288 rillig error(249, "member without type"); 1264 1.288 rillig $$ = NULL; 1265 1.455 rillig } 1266 1.508 rillig | begin_type_specifier_qualifier_list end_type T_SEMI { 1267 1.484 rillig set_sym_kind(SK_VCFT); 1268 1.397 rillig if (!allow_c11 && !allow_gcc) 1269 1.385 rillig /* anonymous struct/union members is a C11 feature */ 1270 1.73 christos warning(49); 1271 1.442 rillig if (is_struct_or_union(dcs->d_type->t_tspec)) 1272 1.442 rillig $$ = declare_unnamed_member(); 1273 1.442 rillig else { 1274 1.228 rillig /* syntax error '%s' */ 1275 1.228 rillig error(249, "unnamed member"); 1276 1.232 rillig $$ = NULL; 1277 1.228 rillig } 1278 1.455 rillig } 1279 1.455 rillig | static_assert_declaration { 1280 1.367 rillig $$ = NULL; 1281 1.455 rillig } 1282 1.455 rillig | error T_SEMI { 1283 1.484 rillig set_sym_kind(SK_VCFT); 1284 1.1 cgd $$ = NULL; 1285 1.455 rillig } 1286 1.455 rillig ; 1287 1.1 cgd 1288 1.497 rillig /* TODO: Implement 'specifier_qualifier_list' from C23 6.7.3.2. */ 1289 1.497 rillig 1290 1.497 rillig /* TODO: Implement 'type_specifier_qualifier' from C23 6.7.3.2. */ 1291 1.497 rillig 1292 1.497 rillig /* C23 6.7.3.2 */ 1293 1.497 rillig /* The rule 'member_declarator_list' is split into the 'type' and 'notype' variants. */ 1294 1.501 rillig /* Was named struct_declarator_list until C11. */ 1295 1.497 rillig 1296 1.498 rillig notype_member_declarator_list: 1297 1.455 rillig notype_member_declarator { 1298 1.438 rillig $$ = declare_member($1); 1299 1.455 rillig } 1300 1.498 rillig | notype_member_declarator_list { 1301 1.484 rillig set_sym_kind(SK_MEMBER); 1302 1.455 rillig } T_COMMA type_member_declarator { 1303 1.441 rillig $$ = concat_symbols($1, declare_member($4)); 1304 1.455 rillig } 1305 1.455 rillig ; 1306 1.1 cgd 1307 1.498 rillig type_member_declarator_list: 1308 1.455 rillig type_member_declarator { 1309 1.438 rillig $$ = declare_member($1); 1310 1.455 rillig } 1311 1.498 rillig | type_member_declarator_list { 1312 1.484 rillig set_sym_kind(SK_MEMBER); 1313 1.455 rillig } T_COMMA type_member_declarator { 1314 1.441 rillig $$ = concat_symbols($1, declare_member($4)); 1315 1.455 rillig } 1316 1.455 rillig ; 1317 1.1 cgd 1318 1.497 rillig /* C23 6.7.3.2 */ 1319 1.497 rillig /* The rule 'member_declarator' is split into the 'type' and 'notype' variants. */ 1320 1.501 rillig /* Was named struct_declarator until C11. */ 1321 1.497 rillig 1322 1.454 rillig notype_member_declarator: 1323 1.455 rillig notype_declarator 1324 1.454 rillig /* C99 6.7.2.1 */ 1325 1.455 rillig | notype_declarator T_COLON constant_expression { 1326 1.423 rillig $$ = set_bit_field_width($1, to_int_constant($3, true)); 1327 1.455 rillig } 1328 1.454 rillig /* C99 6.7.2.1 */ 1329 1.455 rillig | { 1330 1.484 rillig set_sym_kind(SK_VCFT); 1331 1.455 rillig } T_COLON constant_expression { 1332 1.423 rillig $$ = set_bit_field_width(NULL, to_int_constant($3, true)); 1333 1.455 rillig } 1334 1.455 rillig ; 1335 1.1 cgd 1336 1.454 rillig type_member_declarator: 1337 1.455 rillig type_declarator 1338 1.465 rillig | type_declarator T_COLON constant_expression type_attribute_list_opt { 1339 1.423 rillig $$ = set_bit_field_width($1, to_int_constant($3, true)); 1340 1.455 rillig } 1341 1.455 rillig | { 1342 1.484 rillig set_sym_kind(SK_VCFT); 1343 1.465 rillig } T_COLON constant_expression type_attribute_list_opt { 1344 1.423 rillig $$ = set_bit_field_width(NULL, to_int_constant($3, true)); 1345 1.455 rillig } 1346 1.455 rillig ; 1347 1.1 cgd 1348 1.497 rillig /* K&R ---, C90 6.5.2.2, C99 6.7.2.2, C11 6.7.2.2, C23 6.7.3.5 */ 1349 1.454 rillig enum_specifier: 1350 1.455 rillig enum gcc_attribute_specifier_list_opt identifier_sym { 1351 1.423 rillig $$ = make_tag_type($3, ENUM, false, false); 1352 1.455 rillig } 1353 1.455 rillig | enum gcc_attribute_specifier_list_opt identifier_sym { 1354 1.439 rillig dcs->d_tag_type = make_tag_type($3, ENUM, true, false); 1355 1.455 rillig } enum_declaration /*gcc_attribute_specifier_list_opt*/ { 1356 1.437 rillig $$ = complete_enum($5); 1357 1.455 rillig } 1358 1.455 rillig | enum gcc_attribute_specifier_list_opt { 1359 1.439 rillig dcs->d_tag_type = make_tag_type(NULL, ENUM, true, false); 1360 1.455 rillig } enum_declaration /*gcc_attribute_specifier_list_opt*/ { 1361 1.437 rillig $$ = complete_enum($4); 1362 1.455 rillig } 1363 1.455 rillig | enum error { 1364 1.484 rillig set_sym_kind(SK_VCFT); 1365 1.1 cgd $$ = gettyp(INT); 1366 1.455 rillig } 1367 1.455 rillig ; 1368 1.1 cgd 1369 1.319 rillig enum: /* helper for C99 6.7.2.2 */ 1370 1.455 rillig T_ENUM { 1371 1.484 rillig set_sym_kind(SK_TAG); 1372 1.443 rillig begin_declaration_level(DLK_ENUM); 1373 1.455 rillig } 1374 1.455 rillig ; 1375 1.1 cgd 1376 1.319 rillig enum_declaration: /* helper for C99 6.7.2.2 */ 1377 1.455 rillig T_LBRACE { 1378 1.484 rillig set_sym_kind(SK_VCFT); 1379 1.306 rillig enumval = 0; 1380 1.482 rillig } enums_with_opt_comma T_RBRACE { 1381 1.482 rillig $$ = $3; 1382 1.455 rillig } 1383 1.455 rillig ; 1384 1.259 rillig 1385 1.319 rillig enums_with_opt_comma: /* helper for C99 6.7.2.2 */ 1386 1.455 rillig enumerator_list 1387 1.455 rillig | enumerator_list T_COMMA { 1388 1.489 rillig if (!allow_c99 && !allow_trad) 1389 1.453 rillig /* trailing ',' in enum declaration requires C99 ... */ 1390 1.1 cgd error(54); 1391 1.489 rillig else 1392 1.453 rillig /* trailing ',' in enum declaration requires C99 ... */ 1393 1.319 rillig c99ism(54); 1394 1.319 rillig $$ = $1; 1395 1.455 rillig } 1396 1.455 rillig ; 1397 1.319 rillig 1398 1.497 rillig /* C99 6.7.2.2, C23 6.7.3.3 */ 1399 1.497 rillig enumerator_list: 1400 1.455 rillig enumerator 1401 1.455 rillig | enumerator_list T_COMMA enumerator { 1402 1.441 rillig $$ = concat_symbols($1, $3); 1403 1.455 rillig } 1404 1.455 rillig | error { 1405 1.319 rillig $$ = NULL; 1406 1.455 rillig } 1407 1.455 rillig ; 1408 1.319 rillig 1409 1.497 rillig /* C99 6.7.2.2, C23 6.7.3.3 */ 1410 1.497 rillig enumerator: 1411 1.455 rillig identifier_sym gcc_attribute_specifier_list_opt { 1412 1.319 rillig $$ = enumeration_constant($1, enumval, true); 1413 1.455 rillig } 1414 1.455 rillig | identifier_sym gcc_attribute_specifier_list_opt 1415 1.454 rillig T_ASSIGN constant_expression { 1416 1.342 rillig $$ = enumeration_constant($1, to_int_constant($4, true), 1417 1.338 rillig false); 1418 1.455 rillig } 1419 1.455 rillig ; 1420 1.319 rillig 1421 1.497 rillig /* TODO: Implement 'enum_type_specifier' from C23 6.7.3.3. */ 1422 1.497 rillig 1423 1.497 rillig /* K&R ---, C90 ---, C99 ---, C11 6.7.2.4, C23 6.7.3.5 */ 1424 1.497 rillig atomic_type_specifier: 1425 1.497 rillig atomic T_LPAREN type_name T_RPAREN { 1426 1.497 rillig $$ = $3; 1427 1.455 rillig } 1428 1.455 rillig ; 1429 1.431 rillig 1430 1.431 rillig atomic: /* helper */ 1431 1.455 rillig T_ATOMIC { 1432 1.430 rillig /* TODO: First fix c11ism, then use it here. */ 1433 1.431 rillig if (!allow_c11) 1434 1.430 rillig /* '_Atomic' requires C11 or later */ 1435 1.430 rillig error(350); 1436 1.455 rillig } 1437 1.455 rillig ; 1438 1.319 rillig 1439 1.497 rillig /* TODO: Implement 'typeof_specifier' from C23 6.7.3.6. */ 1440 1.319 rillig 1441 1.497 rillig /* TODO: Implement 'typeof_specifier_argument' from C23 6.7.3.6. */ 1442 1.1 cgd 1443 1.497 rillig /* C99 6.7.3, C23 6.7.4.1 */ 1444 1.497 rillig type_qualifier: 1445 1.497 rillig T_QUAL 1446 1.497 rillig | atomic { 1447 1.497 rillig $$ = (type_qualifiers){ .tq_atomic = true }; 1448 1.455 rillig } 1449 1.455 rillig ; 1450 1.428 rillig 1451 1.497 rillig /* TODO: Implement 'function_specifier' from C23 6.7.5. */ 1452 1.256 rillig 1453 1.497 rillig /* TODO: Implement 'alignment_specifier' from C23 6.7.6. */ 1454 1.1 cgd 1455 1.497 rillig /* C23 6.7.7.1 */ 1456 1.497 rillig /* The rule 'declarator' is split into the 'notype' and 'type' variants. */ 1457 1.1 cgd 1458 1.324 rillig notype_declarator: 1459 1.455 rillig notype_direct_declarator 1460 1.455 rillig | pointer notype_direct_declarator { 1461 1.306 rillig $$ = add_pointer($2, $1); 1462 1.455 rillig } 1463 1.455 rillig ; 1464 1.1 cgd 1465 1.324 rillig type_declarator: 1466 1.455 rillig type_direct_declarator 1467 1.455 rillig | pointer type_direct_declarator { 1468 1.306 rillig $$ = add_pointer($2, $1); 1469 1.455 rillig } 1470 1.455 rillig ; 1471 1.239 rillig 1472 1.497 rillig /* C23 6.7.7.1 */ 1473 1.497 rillig /* The rule 'direct_declarator' is split into the 'notype' and 'type' variants. */ 1474 1.497 rillig 1475 1.324 rillig notype_direct_declarator: 1476 1.455 rillig type_attribute_list_opt T_NAME { 1477 1.398 rillig $$ = declarator_name(getsym($2)); 1478 1.455 rillig } 1479 1.455 rillig | type_attribute_list_opt T_LPAREN type_declarator T_RPAREN { 1480 1.398 rillig $$ = $3; 1481 1.455 rillig } 1482 1.455 rillig | notype_direct_declarator T_LBRACK array_size_opt T_RBRACK { 1483 1.364 rillig $$ = add_array($1, $3.has_dim, $3.dim); 1484 1.455 rillig } 1485 1.455 rillig | notype_direct_declarator param_list asm_or_symbolrename_opt { 1486 1.111 rillig $$ = add_function(symbolrename($1, $3), $2); 1487 1.202 rillig end_declaration_level(); 1488 1.171 rillig block_level--; 1489 1.455 rillig } 1490 1.455 rillig | notype_direct_declarator type_attribute 1491 1.455 rillig ; 1492 1.1 cgd 1493 1.324 rillig type_direct_declarator: 1494 1.455 rillig type_attribute_list_opt identifier { 1495 1.526 rillig /* TODO: dcs_add_type_attributes($1); */ 1496 1.399 rillig $$ = declarator_name(getsym($2)); 1497 1.455 rillig } 1498 1.455 rillig | type_attribute_list_opt T_LPAREN type_declarator T_RPAREN { 1499 1.526 rillig /* TODO: dcs_add_type_attributes($1); */ 1500 1.399 rillig $$ = $3; 1501 1.455 rillig } 1502 1.455 rillig | type_direct_declarator T_LBRACK array_size_opt T_RBRACK { 1503 1.364 rillig $$ = add_array($1, $3.has_dim, $3.dim); 1504 1.455 rillig } 1505 1.455 rillig | type_direct_declarator param_list asm_or_symbolrename_opt { 1506 1.111 rillig $$ = add_function(symbolrename($1, $3), $2); 1507 1.202 rillig end_declaration_level(); 1508 1.171 rillig block_level--; 1509 1.510 rillig if ($2.used) 1510 1.510 rillig $$->s_used = true; 1511 1.526 rillig /* TODO: handle $2.noreturn */ 1512 1.510 rillig } 1513 1.510 rillig | type_direct_declarator type_attribute { 1514 1.510 rillig $$ = $1; 1515 1.510 rillig if ($2.used) 1516 1.510 rillig $$->s_used = true; 1517 1.528 rillig /* TODO: handle $2.noreturn */ 1518 1.528 rillig if ($2.bit_width > 0) { 1519 1.528 rillig tspec_t t = $$->s_type->t_tspec; 1520 1.528 rillig lint_assert(t == INT || t == UINT); 1521 1.528 rillig type_t *tp = block_dup_type($$->s_type); 1522 1.528 rillig tp->t_tspec = 1523 1.528 rillig #ifdef INT128_SIZE 1524 1.529 rillig $2.bit_width == 128 ? (t == INT ? INT128 : UINT128) : 1525 1.528 rillig #endif 1526 1.529 rillig t == INT ? LLONG : ULLONG; 1527 1.528 rillig $$->s_type = tp; 1528 1.528 rillig } 1529 1.455 rillig } 1530 1.455 rillig ; 1531 1.1 cgd 1532 1.497 rillig 1533 1.497 rillig /* TODO: Implement 'array_declarator' from C23 6.7.7.1. */ 1534 1.497 rillig 1535 1.497 rillig /* TODO: Implement 'function_declarator' from C23 6.7.7.1. */ 1536 1.497 rillig 1537 1.497 rillig /* C99 6.7.5, C23 6.7.7.1 */ 1538 1.497 rillig pointer: 1539 1.497 rillig T_ASTERISK type_qualifier_list_opt { 1540 1.497 rillig $$ = xcalloc(1, sizeof(*$$)); 1541 1.497 rillig add_type_qualifiers(&$$->qualifiers, $2); 1542 1.497 rillig } 1543 1.497 rillig | T_ASTERISK type_qualifier_list_opt pointer { 1544 1.497 rillig $$ = xcalloc(1, sizeof(*$$)); 1545 1.497 rillig add_type_qualifiers(&$$->qualifiers, $2); 1546 1.497 rillig $$ = append_qualified_pointer($$, $3); 1547 1.497 rillig } 1548 1.497 rillig ; 1549 1.497 rillig 1550 1.497 rillig /* see C99 6.7.5, C23 6.7.7.1 */ 1551 1.497 rillig type_qualifier_list_opt: 1552 1.497 rillig /* empty */ { 1553 1.497 rillig $$ = (type_qualifiers){ .tq_const = false }; 1554 1.497 rillig } 1555 1.497 rillig | type_qualifier_list 1556 1.497 rillig ; 1557 1.497 rillig 1558 1.497 rillig /* C99 6.7.5 */ 1559 1.497 rillig type_qualifier_list: 1560 1.497 rillig type_qualifier 1561 1.497 rillig | type_qualifier_list type_qualifier { 1562 1.497 rillig $$ = $1; 1563 1.497 rillig add_type_qualifiers(&$$, $2); 1564 1.497 rillig } 1565 1.497 rillig ; 1566 1.497 rillig 1567 1.497 rillig /* TODO: Implement 'parameter_type_list' from C23 6.7.7.1. */ 1568 1.497 rillig 1569 1.497 rillig /* TODO: Implement 'parameter_list' from C23 6.7.7.1. */ 1570 1.497 rillig 1571 1.497 rillig /* C23 6.7.7.1 */ 1572 1.497 rillig /* XXX: C99 6.7.5 defines the same name, but it looks completely different. */ 1573 1.497 rillig parameter_declaration: 1574 1.497 rillig begin_type_declmods end_type { 1575 1.497 rillig /* ^^ There is no check for the missing type-specifier. */ 1576 1.497 rillig $$ = declare_parameter(abstract_name(), false); 1577 1.497 rillig } 1578 1.497 rillig | begin_type_declaration_specifiers end_type { 1579 1.497 rillig $$ = declare_parameter(abstract_name(), false); 1580 1.497 rillig } 1581 1.497 rillig | begin_type_declmods end_type notype_param_declarator { 1582 1.497 rillig /* ^^ There is no check for the missing type-specifier. */ 1583 1.497 rillig $$ = declare_parameter($3, false); 1584 1.497 rillig } 1585 1.497 rillig /* 1586 1.497 rillig * type_param_declarator is needed because of following conflict: 1587 1.497 rillig * "typedef int a; f(int (a));" could be parsed as 1588 1.497 rillig * "function with argument a of type int", or 1589 1.497 rillig * "function with an unnamed (abstract) argument of type function". 1590 1.497 rillig * This grammar realizes the second case. 1591 1.497 rillig */ 1592 1.497 rillig | begin_type_declaration_specifiers end_type type_param_declarator { 1593 1.497 rillig $$ = declare_parameter($3, false); 1594 1.497 rillig } 1595 1.497 rillig | begin_type_declmods end_type abstract_declarator { 1596 1.497 rillig /* ^^ There is no check for the missing type-specifier. */ 1597 1.497 rillig $$ = declare_parameter($3, false); 1598 1.497 rillig } 1599 1.497 rillig | begin_type_declaration_specifiers end_type abstract_declarator { 1600 1.497 rillig $$ = declare_parameter($3, false); 1601 1.497 rillig } 1602 1.497 rillig ; 1603 1.497 rillig 1604 1.1 cgd /* 1605 1.338 rillig * The two distinct rules type_param_declarator and notype_param_declarator 1606 1.468 rillig * avoid a conflict in parameter lists. A typename enclosed in parentheses is 1607 1.338 rillig * always treated as a typename, not an argument name. For example, after 1608 1.257 rillig * "typedef double a;", the declaration "f(int (a));" is interpreted as 1609 1.257 rillig * "f(int (double));", not "f(int a);". 1610 1.1 cgd */ 1611 1.324 rillig type_param_declarator: 1612 1.455 rillig direct_param_declarator 1613 1.455 rillig | pointer direct_param_declarator { 1614 1.111 rillig $$ = add_pointer($2, $1); 1615 1.455 rillig } 1616 1.455 rillig ; 1617 1.1 cgd 1618 1.324 rillig notype_param_declarator: 1619 1.455 rillig direct_notype_param_declarator 1620 1.455 rillig | pointer direct_notype_param_declarator { 1621 1.319 rillig $$ = add_pointer($2, $1); 1622 1.455 rillig } 1623 1.455 rillig ; 1624 1.257 rillig 1625 1.324 rillig direct_param_declarator: 1626 1.455 rillig identifier type_attribute_list { 1627 1.306 rillig $$ = declarator_name(getsym($1)); 1628 1.510 rillig if ($2.used) 1629 1.510 rillig dcs_set_used(); 1630 1.526 rillig /* TODO: dcs_add_type_attributes($2); */ 1631 1.455 rillig } 1632 1.455 rillig | identifier { 1633 1.111 rillig $$ = declarator_name(getsym($1)); 1634 1.455 rillig } 1635 1.455 rillig | T_LPAREN notype_param_declarator T_RPAREN { 1636 1.1 cgd $$ = $2; 1637 1.455 rillig } 1638 1.455 rillig | direct_param_declarator T_LBRACK array_size_opt T_RBRACK 1639 1.421 rillig gcc_attribute_specifier_list_opt { 1640 1.364 rillig $$ = add_array($1, $3.has_dim, $3.dim); 1641 1.510 rillig if ($5.used) 1642 1.510 rillig dcs_set_used(); 1643 1.526 rillig /* TODO: dcs_add_type_attributes($5); */ 1644 1.455 rillig } 1645 1.455 rillig | direct_param_declarator param_list asm_or_symbolrename_opt { 1646 1.111 rillig $$ = add_function(symbolrename($1, $3), $2); 1647 1.202 rillig end_declaration_level(); 1648 1.171 rillig block_level--; 1649 1.510 rillig if ($2.used) 1650 1.510 rillig dcs_set_used(); 1651 1.526 rillig /* TODO: handle $2.noreturn */ 1652 1.455 rillig } 1653 1.455 rillig ; 1654 1.1 cgd 1655 1.324 rillig direct_notype_param_declarator: 1656 1.455 rillig identifier { 1657 1.111 rillig $$ = declarator_name(getsym($1)); 1658 1.455 rillig } 1659 1.455 rillig | T_LPAREN notype_param_declarator T_RPAREN { 1660 1.1 cgd $$ = $2; 1661 1.455 rillig } 1662 1.455 rillig | direct_notype_param_declarator T_LBRACK array_size_opt T_RBRACK { 1663 1.364 rillig $$ = add_array($1, $3.has_dim, $3.dim); 1664 1.455 rillig } 1665 1.455 rillig | direct_notype_param_declarator param_list asm_or_symbolrename_opt { 1666 1.111 rillig $$ = add_function(symbolrename($1, $3), $2); 1667 1.202 rillig end_declaration_level(); 1668 1.171 rillig block_level--; 1669 1.455 rillig } 1670 1.455 rillig ; 1671 1.1 cgd 1672 1.319 rillig param_list: 1673 1.455 rillig T_LPAREN { 1674 1.319 rillig block_level++; 1675 1.443 rillig begin_declaration_level(DLK_PROTO_PARAMS); 1676 1.482 rillig } identifier_list T_RPAREN { 1677 1.517 rillig $$ = (parameter_list){ .first = $3, .identifier = true }; 1678 1.455 rillig } 1679 1.482 rillig | abstract_decl_param_list 1680 1.455 rillig ; 1681 1.1 cgd 1682 1.364 rillig array_size_opt: 1683 1.455 rillig /* empty */ { 1684 1.364 rillig $$.has_dim = false; 1685 1.364 rillig $$.dim = 0; 1686 1.455 rillig } 1687 1.455 rillig | T_ASTERISK { 1688 1.364 rillig /* since C99; variable length array of unspecified size */ 1689 1.364 rillig $$.has_dim = false; /* TODO: maybe change to true */ 1690 1.364 rillig $$.dim = 0; /* just as a placeholder */ 1691 1.455 rillig } 1692 1.481 rillig | type_qualifier_list_opt T_SCLASS constant_expression { 1693 1.319 rillig /* C11 6.7.6.3p7 */ 1694 1.319 rillig if ($2 != STATIC) 1695 1.319 rillig yyerror("Bad attribute"); 1696 1.473 rillig /* static array size requires C11 or later */ 1697 1.319 rillig c11ism(343); 1698 1.481 rillig $$.has_dim = true; 1699 1.481 rillig $$.dim = $3 == NULL ? 0 : to_int_constant($3, false); 1700 1.455 rillig } 1701 1.455 rillig | type_qualifier { 1702 1.376 rillig /* C11 6.7.6.2 */ 1703 1.461 rillig if (!$1.tq_restrict) 1704 1.373 christos yyerror("Bad attribute"); 1705 1.481 rillig $$.has_dim = true; 1706 1.481 rillig $$.dim = 0; 1707 1.481 rillig } 1708 1.481 rillig | constant_expression { 1709 1.481 rillig $$.has_dim = true; 1710 1.481 rillig $$.dim = $1 == NULL ? 0 : to_int_constant($1, false); 1711 1.455 rillig } 1712 1.455 rillig ; 1713 1.1 cgd 1714 1.319 rillig identifier_list: /* C99 6.7.5 */ 1715 1.455 rillig T_NAME { 1716 1.441 rillig $$ = old_style_function_parameter_name(getsym($1)); 1717 1.455 rillig } 1718 1.455 rillig | identifier_list T_COMMA T_NAME { 1719 1.441 rillig $$ = concat_symbols($1, 1720 1.441 rillig old_style_function_parameter_name(getsym($3))); 1721 1.455 rillig } 1722 1.455 rillig | identifier_list error 1723 1.455 rillig ; 1724 1.245 rillig 1725 1.497 rillig /* C99 6.7.6, C23 6.7.8 */ 1726 1.319 rillig /* XXX: C99 requires an additional specifier-qualifier-list. */ 1727 1.497 rillig type_name: 1728 1.455 rillig { 1729 1.443 rillig begin_declaration_level(DLK_ABSTRACT); 1730 1.455 rillig } abstract_declaration { 1731 1.319 rillig end_declaration_level(); 1732 1.319 rillig $$ = $2->s_type; 1733 1.455 rillig } 1734 1.455 rillig ; 1735 1.1 cgd 1736 1.340 rillig abstract_declaration: /* specific to lint */ 1737 1.455 rillig begin_type_qualifier_list end_type { 1738 1.438 rillig $$ = declare_abstract_type(abstract_name()); 1739 1.455 rillig } 1740 1.455 rillig | begin_type_specifier_qualifier_list end_type { 1741 1.438 rillig $$ = declare_abstract_type(abstract_name()); 1742 1.455 rillig } 1743 1.455 rillig | begin_type_qualifier_list end_type abstract_declarator { 1744 1.438 rillig $$ = declare_abstract_type($3); 1745 1.455 rillig } 1746 1.455 rillig | begin_type_specifier_qualifier_list end_type abstract_declarator { 1747 1.438 rillig $$ = declare_abstract_type($3); 1748 1.455 rillig } 1749 1.455 rillig ; 1750 1.345 rillig 1751 1.340 rillig abstract_decl_param_list: /* specific to lint */ 1752 1.509 rillig abstract_decl_lparen T_RPAREN type_attribute_list_opt { 1753 1.510 rillig $$ = (parameter_list){ .used = $3.used }; 1754 1.455 rillig } 1755 1.455 rillig | abstract_decl_lparen vararg_parameter_type_list T_RPAREN 1756 1.509 rillig type_attribute_list_opt { 1757 1.1 cgd $$ = $2; 1758 1.466 rillig $$.prototype = true; 1759 1.510 rillig $$.used = $4.used; 1760 1.514 rillig $$.noreturn = $4.noreturn; 1761 1.455 rillig } 1762 1.509 rillig | abstract_decl_lparen error T_RPAREN type_attribute_list_opt { 1763 1.510 rillig $$ = (parameter_list){ .used = $4.used }; 1764 1.455 rillig } 1765 1.455 rillig ; 1766 1.1 cgd 1767 1.340 rillig abstract_decl_lparen: /* specific to lint */ 1768 1.455 rillig T_LPAREN { 1769 1.171 rillig block_level++; 1770 1.443 rillig begin_declaration_level(DLK_PROTO_PARAMS); 1771 1.455 rillig } 1772 1.455 rillig ; 1773 1.1 cgd 1774 1.340 rillig vararg_parameter_type_list: /* specific to lint */ 1775 1.455 rillig parameter_type_list 1776 1.455 rillig | parameter_type_list T_COMMA T_ELLIPSIS { 1777 1.1 cgd $$ = $1; 1778 1.466 rillig $$.vararg = true; 1779 1.455 rillig } 1780 1.455 rillig | T_ELLIPSIS { 1781 1.410 rillig /* TODO: C99 6.7.5 makes this an error as well. */ 1782 1.489 rillig if (!allow_trad && !allow_c99) 1783 1.472 rillig /* C90 to C17 require formal parameter before '...' */ 1784 1.1 cgd error(84); 1785 1.489 rillig else if (allow_c90) 1786 1.472 rillig /* C90 to C17 require formal parameter before '...' */ 1787 1.1 cgd warning(84); 1788 1.490 rillig $$ = (parameter_list){ .vararg = true }; 1789 1.455 rillig } 1790 1.455 rillig ; 1791 1.1 cgd 1792 1.319 rillig /* XXX: C99 6.7.5 defines the same name, but it looks different. */ 1793 1.1 cgd parameter_type_list: 1794 1.466 rillig parameter_declaration { 1795 1.490 rillig $$ = (parameter_list){ .first = $1 }; 1796 1.466 rillig } 1797 1.455 rillig | parameter_type_list T_COMMA parameter_declaration { 1798 1.466 rillig $$ = $1; 1799 1.466 rillig $$.first = concat_symbols($1.first, $3); 1800 1.455 rillig } 1801 1.455 rillig ; 1802 1.1 cgd 1803 1.497 rillig /* K&R 8.7, C90 ???, C99 6.7.6, C11 6.7.7, C23 6.7.8 */ 1804 1.497 rillig /* In K&R, abstract-declarator could be empty and was still simpler. */ 1805 1.497 rillig abstract_declarator: 1806 1.497 rillig pointer { 1807 1.497 rillig $$ = add_pointer(abstract_name(), $1); 1808 1.497 rillig } 1809 1.497 rillig | direct_abstract_declarator 1810 1.497 rillig | pointer direct_abstract_declarator { 1811 1.497 rillig $$ = add_pointer($2, $1); 1812 1.497 rillig } 1813 1.497 rillig | type_attribute_list direct_abstract_declarator { 1814 1.497 rillig $$ = $2; 1815 1.497 rillig } 1816 1.497 rillig | pointer type_attribute_list direct_abstract_declarator { 1817 1.497 rillig $$ = add_pointer($3, $1); 1818 1.455 rillig } 1819 1.497 rillig ; 1820 1.497 rillig 1821 1.497 rillig /* K&R ---, C90 ???, C99 6.7.6, C11 6.7.7, C23 6.7.8 */ 1822 1.497 rillig direct_abstract_declarator: 1823 1.497 rillig /* TODO: sort rules according to C99 */ 1824 1.497 rillig T_LPAREN abstract_declarator T_RPAREN { 1825 1.497 rillig $$ = $2; 1826 1.455 rillig } 1827 1.497 rillig | T_LBRACK array_size_opt T_RBRACK { 1828 1.497 rillig $$ = add_array(abstract_name(), $2.has_dim, $2.dim); 1829 1.455 rillig } 1830 1.497 rillig | direct_abstract_declarator T_LBRACK array_size_opt T_RBRACK { 1831 1.497 rillig $$ = add_array($1, $3.has_dim, $3.dim); 1832 1.455 rillig } 1833 1.497 rillig | abstract_decl_param_list asm_or_symbolrename_opt { 1834 1.497 rillig sym_t *name = abstract_enclosing_name(); 1835 1.497 rillig $$ = add_function(symbolrename(name, $2), $1); 1836 1.497 rillig end_declaration_level(); 1837 1.497 rillig block_level--; 1838 1.455 rillig } 1839 1.497 rillig | direct_abstract_declarator abstract_decl_param_list 1840 1.497 rillig asm_or_symbolrename_opt { 1841 1.497 rillig $$ = add_function(symbolrename($1, $3), $2); 1842 1.497 rillig end_declaration_level(); 1843 1.497 rillig block_level--; 1844 1.455 rillig } 1845 1.497 rillig | direct_abstract_declarator type_attribute_list 1846 1.455 rillig ; 1847 1.1 cgd 1848 1.497 rillig /* TODO: Implement 'array_abstract_declarator' from C23 6.7.8. */ 1849 1.497 rillig 1850 1.497 rillig /* TODO: Implement 'function_abstract_declarator' from C23 6.7.8. */ 1851 1.497 rillig 1852 1.497 rillig /* TODO: Implement 'typedef_name' from C23 6.7.9. */ 1853 1.497 rillig 1854 1.497 rillig /* C23 6.7.11 */ 1855 1.497 rillig /* K&R ---, C90 ---, C99 6.7.8, C11 6.7.9, C23 6.7.10 */ 1856 1.446 rillig braced_initializer: 1857 1.455 rillig init_lbrace init_rbrace { 1858 1.446 rillig /* empty initializer braces require C23 or later */ 1859 1.446 rillig c23ism(353); 1860 1.446 rillig } 1861 1.483 rillig | init_lbrace initializer_list init_rbrace 1862 1.483 rillig | init_lbrace initializer_list T_COMMA init_rbrace 1863 1.455 rillig ; 1864 1.446 rillig 1865 1.497 rillig /* C99 6.7.8, C23 6.7.11 */ 1866 1.497 rillig initializer: 1867 1.455 rillig assignment_expression { 1868 1.207 rillig init_expr($1); 1869 1.455 rillig } 1870 1.455 rillig | init_lbrace init_rbrace { 1871 1.178 rillig /* XXX: Empty braces are not covered by C99 6.7.8. */ 1872 1.455 rillig } 1873 1.483 rillig | init_lbrace initializer_list init_rbrace 1874 1.483 rillig | init_lbrace initializer_list T_COMMA init_rbrace 1875 1.455 rillig /* XXX: What is this error handling for? */ 1876 1.455 rillig | error 1877 1.455 rillig ; 1878 1.1 cgd 1879 1.497 rillig /* C99 6.7.8, C23 6.7.11 */ 1880 1.497 rillig initializer_list: 1881 1.483 rillig initializer 1882 1.483 rillig | designation initializer 1883 1.483 rillig | initializer_list T_COMMA initializer 1884 1.483 rillig | initializer_list T_COMMA designation initializer 1885 1.455 rillig ; 1886 1.1 cgd 1887 1.497 rillig /* C99 6.7.8, C23 6.7.11 */ 1888 1.497 rillig designation: 1889 1.483 rillig { 1890 1.482 rillig begin_designation(); 1891 1.482 rillig } designator_list T_ASSIGN 1892 1.455 rillig | identifier T_COLON { 1893 1.239 rillig /* GCC style struct or union member name in initializer */ 1894 1.239 rillig gnuism(315); 1895 1.377 rillig begin_designation(); 1896 1.239 rillig add_designator_member($1); 1897 1.455 rillig } 1898 1.455 rillig ; 1899 1.239 rillig 1900 1.497 rillig /* C99 6.7.8, C23 6.7.11 */ 1901 1.497 rillig designator_list: 1902 1.455 rillig designator 1903 1.455 rillig | designator_list designator 1904 1.455 rillig ; 1905 1.35 christos 1906 1.497 rillig /* C99 6.7.8, C23 6.7.11 */ 1907 1.497 rillig designator: 1908 1.455 rillig T_LBRACK range T_RBRACK { 1909 1.408 rillig if (!allow_c99) 1910 1.385 rillig /* array initializer with designators is a C99 ... */ 1911 1.34 yamt warning(321); 1912 1.408 rillig add_designator_subscript($2); 1913 1.455 rillig } 1914 1.455 rillig | T_POINT identifier { 1915 1.408 rillig if (!allow_c99) 1916 1.127 rillig /* struct or union member name in initializer is ... */ 1917 1.26 christos warning(313); 1918 1.205 rillig add_designator_member($2); 1919 1.455 rillig } 1920 1.455 rillig ; 1921 1.71 christos 1922 1.497 rillig /* C23 6.7.12 */ 1923 1.365 christos static_assert_declaration: 1924 1.470 rillig T_STATIC_ASSERT T_LPAREN constant_expression T_COMMA T_STRING 1925 1.470 rillig T_RPAREN T_SEMI { 1926 1.470 rillig /* '_Static_assert' requires C11 or later */ 1927 1.470 rillig c11ism(354); 1928 1.470 rillig } 1929 1.470 rillig | T_STATIC_ASSERT T_LPAREN constant_expression T_RPAREN T_SEMI { 1930 1.470 rillig /* '_Static_assert' without message requires C23 or later */ 1931 1.470 rillig c23ism(355); 1932 1.470 rillig } 1933 1.455 rillig ; 1934 1.365 christos 1935 1.239 rillig range: 1936 1.455 rillig constant_expression { 1937 1.239 rillig $$.lo = to_int_constant($1, true); 1938 1.239 rillig $$.hi = $$.lo; 1939 1.455 rillig } 1940 1.455 rillig | constant_expression T_ELLIPSIS constant_expression { 1941 1.239 rillig $$.lo = to_int_constant($1, true); 1942 1.239 rillig $$.hi = to_int_constant($3, true); 1943 1.251 rillig /* initialization with '[a...b]' is a GCC extension */ 1944 1.239 rillig gnuism(340); 1945 1.455 rillig } 1946 1.455 rillig ; 1947 1.26 christos 1948 1.319 rillig init_lbrace: /* helper */ 1949 1.455 rillig T_LBRACE { 1950 1.114 rillig init_lbrace(); 1951 1.455 rillig } 1952 1.455 rillig ; 1953 1.1 cgd 1954 1.319 rillig init_rbrace: /* helper */ 1955 1.455 rillig T_RBRACE { 1956 1.114 rillig init_rbrace(); 1957 1.455 rillig } 1958 1.455 rillig ; 1959 1.1 cgd 1960 1.500 rillig /* C23 6.7.13.2 */ 1961 1.500 rillig attribute_specifier_sequence: 1962 1.500 rillig attribute_specifier { 1963 1.500 rillig $$ = (attribute_list) { NULL, 0, 0 }; 1964 1.500 rillig attribute_list_add_all(&$$, $1); 1965 1.500 rillig } 1966 1.500 rillig | attribute_specifier_sequence attribute_specifier { 1967 1.500 rillig $$ = $1; 1968 1.500 rillig attribute_list_add_all(&$$, $2); 1969 1.500 rillig } 1970 1.500 rillig ; 1971 1.497 rillig 1972 1.500 rillig /* C23 6.7.13.2 */ 1973 1.500 rillig attribute_specifier: 1974 1.500 rillig T_LBRACK T_LBRACK attribute_list T_RBRACK T_RBRACK { 1975 1.500 rillig $$ = $3; 1976 1.500 rillig } 1977 1.500 rillig ; 1978 1.497 rillig 1979 1.500 rillig /* C23 6.7.13.2 */ 1980 1.500 rillig attribute_list: 1981 1.500 rillig /* empty */ { 1982 1.500 rillig $$ = (attribute_list) { NULL, 0, 0 }; 1983 1.500 rillig } 1984 1.500 rillig | attribute { 1985 1.500 rillig $$ = (attribute_list) { NULL, 0, 0 }; 1986 1.500 rillig attribute_list_add(&$$, $1); 1987 1.500 rillig } 1988 1.500 rillig | attribute_list T_COMMA 1989 1.500 rillig | attribute_list T_COMMA attribute { 1990 1.500 rillig $$ = $1; 1991 1.500 rillig attribute_list_add(&$$, $3); 1992 1.500 rillig } 1993 1.500 rillig ; 1994 1.497 rillig 1995 1.500 rillig /* C23 6.7.13.2 */ 1996 1.500 rillig attribute: 1997 1.500 rillig identifier { 1998 1.500 rillig $$ = new_attribute(NULL, $1, NULL); 1999 1.500 rillig } 2000 1.500 rillig | identifier T_DCOLON identifier { 2001 1.500 rillig $$ = new_attribute($1, $3, NULL); 2002 1.500 rillig } 2003 1.500 rillig | identifier attribute_argument_clause { 2004 1.500 rillig $$ = new_attribute(NULL, $1, &$2); 2005 1.500 rillig } 2006 1.500 rillig | identifier T_DCOLON identifier attribute_argument_clause { 2007 1.500 rillig $$ = new_attribute($1, $3, &$4); 2008 1.500 rillig } 2009 1.500 rillig ; 2010 1.497 rillig 2011 1.500 rillig /* The rule 'attribute_token' is inlined into 'attribute'. */ 2012 1.500 rillig /* The rule 'standard_attribute' is inlined into 'attribute_token'. */ 2013 1.500 rillig /* The rule 'attribute_prefixed_token' is inlined into 'attribute_token'. */ 2014 1.500 rillig /* The rule 'attribute_prefix' is inlined into 'attribute_token'. */ 2015 1.497 rillig 2016 1.500 rillig /* C23 6.7.13.2 */ 2017 1.500 rillig attribute_argument_clause: 2018 1.500 rillig T_LPAREN { 2019 1.500 rillig $$ = read_balanced_token_sequence(); 2020 1.500 rillig } 2021 1.500 rillig ; 2022 1.497 rillig 2023 1.500 rillig /* The rule 'balanced_token_sequence' is inlined into 'attribute_argument_clause'. */ 2024 1.500 rillig /* The rule 'balanced_token' is inlined into 'balanced_token_sequence'. */ 2025 1.497 rillig 2026 1.319 rillig asm_or_symbolrename_opt: /* GCC extensions */ 2027 1.455 rillig /* empty */ { 2028 1.319 rillig $$ = NULL; 2029 1.455 rillig } 2030 1.455 rillig | T_ASM T_LPAREN T_STRING T_RPAREN gcc_attribute_specifier_list_opt { 2031 1.319 rillig freeyyv(&$3, T_STRING); 2032 1.319 rillig $$ = NULL; 2033 1.455 rillig } 2034 1.455 rillig | T_SYMBOLRENAME T_LPAREN T_NAME T_RPAREN 2035 1.421 rillig gcc_attribute_specifier_list_opt { 2036 1.319 rillig $$ = $3; 2037 1.455 rillig } 2038 1.455 rillig ; 2039 1.1 cgd 2040 1.497 rillig /* K&R ???, C90 ???, C99 6.8, C11 ???, C23 6.8.1 */ 2041 1.454 rillig statement: 2042 1.455 rillig expression_statement 2043 1.455 rillig | non_expr_statement 2044 1.455 rillig ; 2045 1.256 rillig 2046 1.476 rillig /* Helper to avoid shift/reduce conflict in 'label: __attribute__ ;'. */ 2047 1.476 rillig no_attr_statement: 2048 1.476 rillig expression_statement 2049 1.476 rillig | no_attr_non_expr_statement 2050 1.476 rillig ; 2051 1.476 rillig 2052 1.319 rillig non_expr_statement: /* helper for C99 6.8 */ 2053 1.455 rillig gcc_attribute_specifier /* ((__fallthrough__)) */ T_SEMI 2054 1.476 rillig | no_attr_non_expr_statement 2055 1.476 rillig ; 2056 1.476 rillig 2057 1.476 rillig /* Helper to avoid shift/reduce conflict in 'label: __attribute__ ;'. */ 2058 1.476 rillig no_attr_non_expr_statement: 2059 1.476 rillig labeled_statement 2060 1.455 rillig | compound_statement 2061 1.455 rillig | selection_statement 2062 1.455 rillig | iteration_statement 2063 1.455 rillig | jump_statement { 2064 1.458 rillig suppress_fallthrough = false; 2065 1.455 rillig } 2066 1.455 rillig | asm_statement 2067 1.455 rillig ; 2068 1.32 christos 2069 1.497 rillig /* TODO: Implement 'unlabeled_statement' from C23 6.8.1. */ 2070 1.497 rillig 2071 1.497 rillig /* TODO: Implement 'primary_block' from C23 6.8.1. */ 2072 1.497 rillig 2073 1.497 rillig /* TODO: Implement 'secondary_block' from C23 6.8.1. */ 2074 1.1 cgd 2075 1.497 rillig /* C23 6.8.2 */ 2076 1.1 cgd label: 2077 1.455 rillig T_NAME T_COLON { 2078 1.484 rillig set_sym_kind(SK_LABEL); 2079 1.125 rillig named_label(getsym($1)); 2080 1.455 rillig } 2081 1.455 rillig | T_CASE constant_expression T_COLON { 2082 1.125 rillig case_label($2); 2083 1.458 rillig suppress_fallthrough = true; 2084 1.455 rillig } 2085 1.455 rillig | T_CASE constant_expression T_ELLIPSIS constant_expression T_COLON { 2086 1.40 christos /* XXX: We don't fill all cases */ 2087 1.125 rillig case_label($2); 2088 1.458 rillig suppress_fallthrough = true; 2089 1.455 rillig } 2090 1.455 rillig | T_DEFAULT T_COLON { 2091 1.125 rillig default_label(); 2092 1.458 rillig suppress_fallthrough = true; 2093 1.455 rillig } 2094 1.455 rillig ; 2095 1.1 cgd 2096 1.497 rillig /* C99 6.8.1, C23 6.8.2 */ 2097 1.497 rillig labeled_statement: 2098 1.497 rillig label gcc_attribute_specifier_list_opt no_attr_statement 2099 1.497 rillig ; 2100 1.497 rillig 2101 1.497 rillig /* C99 6.8.2, C23 6.8.3 */ 2102 1.497 rillig compound_statement: 2103 1.455 rillig compound_statement_lbrace compound_statement_rbrace 2104 1.455 rillig | compound_statement_lbrace block_item_list compound_statement_rbrace 2105 1.455 rillig ; 2106 1.1 cgd 2107 1.133 rillig compound_statement_lbrace: 2108 1.455 rillig T_LBRACE { 2109 1.171 rillig block_level++; 2110 1.171 rillig mem_block_level++; 2111 1.462 rillig debug_step("%s: mem_block_level = %zu", 2112 1.462 rillig "compound_statement_lbrace", mem_block_level); 2113 1.443 rillig begin_declaration_level(DLK_AUTO); 2114 1.455 rillig } 2115 1.455 rillig ; 2116 1.1 cgd 2117 1.133 rillig compound_statement_rbrace: 2118 1.455 rillig T_RBRACE { 2119 1.202 rillig end_declaration_level(); 2120 1.464 rillig if (!in_statement_expr()) 2121 1.464 rillig level_free_all(mem_block_level); /* leak */ 2122 1.171 rillig mem_block_level--; 2123 1.462 rillig debug_step("%s: mem_block_level = %zu", 2124 1.462 rillig "compound_statement_rbrace", mem_block_level); 2125 1.171 rillig block_level--; 2126 1.458 rillig suppress_fallthrough = false; 2127 1.455 rillig } 2128 1.455 rillig ; 2129 1.1 cgd 2130 1.497 rillig /* C99 6.8.2, C23 6.8.3 */ 2131 1.497 rillig block_item_list: 2132 1.455 rillig block_item 2133 1.455 rillig | block_item_list block_item { 2134 1.408 rillig if ($1 && !$2) 2135 1.185 rillig /* declarations after statements is a C99 feature */ 2136 1.185 rillig c99ism(327); 2137 1.234 rillig $$ = $1 || $2; 2138 1.455 rillig } 2139 1.455 rillig ; 2140 1.185 rillig 2141 1.497 rillig /* C99 6.8.2, C23 6.8.3 */ 2142 1.497 rillig block_item: 2143 1.455 rillig declaration_or_error { 2144 1.300 rillig $$ = false; 2145 1.187 rillig restore_warning_flags(); 2146 1.455 rillig } 2147 1.455 rillig | statement { 2148 1.300 rillig $$ = true; 2149 1.187 rillig restore_warning_flags(); 2150 1.455 rillig } 2151 1.455 rillig ; 2152 1.1 cgd 2153 1.497 rillig /* C99 6.8.3, C23 6.8.4 */ 2154 1.497 rillig expression_statement: 2155 1.455 rillig expression T_SEMI { 2156 1.515 rillig /* 2157 1.515 rillig * Even though a "call statement" is not a formally defined 2158 1.515 rillig * term in the C standards, it occurs so often that it's 2159 1.515 rillig * helpful to have a distinguishable term for it. 2160 1.515 rillig */ 2161 1.515 rillig expr($1, false, false, false, false, 2162 1.515 rillig $1 != NULL && $1->tn_op == CALL ? "call" : "expression"); 2163 1.458 rillig suppress_fallthrough = false; 2164 1.514 rillig if ($1 != NULL && $1->tn_op == CALL 2165 1.514 rillig && $1->u.call->func->tn_type->t_subt->t_noreturn) 2166 1.514 rillig stmt_call_noreturn(); 2167 1.455 rillig } 2168 1.455 rillig | T_SEMI { 2169 1.515 rillig check_statement_reachable("empty"); 2170 1.458 rillig suppress_fallthrough = false; 2171 1.455 rillig } 2172 1.500 rillig | attribute_specifier_sequence expression T_SEMI { 2173 1.500 rillig debug_attribute_list(&$1); 2174 1.515 rillig /* 2175 1.515 rillig * Even though a "call statement" is not a formally defined 2176 1.515 rillig * term in the C standards, it occurs so often that it's 2177 1.515 rillig * helpful to have a distinguishable term for it. 2178 1.515 rillig */ 2179 1.515 rillig expr($2, false, false, false, false, 2180 1.515 rillig $2 != NULL && $2->tn_op == CALL ? "call" : "expression"); 2181 1.500 rillig suppress_fallthrough = false; 2182 1.500 rillig } 2183 1.505 rillig | attribute_specifier_sequence T_SEMI { 2184 1.515 rillig bool is_fallthrough = attributes_contain(&$1, "fallthrough"); 2185 1.505 rillig debug_attribute_list(&$1); 2186 1.515 rillig check_statement_reachable( 2187 1.515 rillig is_fallthrough ? "fallthrough" : "empty"); 2188 1.515 rillig suppress_fallthrough = is_fallthrough; 2189 1.505 rillig } 2190 1.455 rillig ; 2191 1.1 cgd 2192 1.497 rillig /* C99 6.8.4, C23 6.8.5.1 */ 2193 1.497 rillig selection_statement: 2194 1.455 rillig if_without_else %prec T_THEN { 2195 1.187 rillig save_warning_flags(); 2196 1.438 rillig stmt_if_then_stmt(); 2197 1.438 rillig stmt_if_else_stmt(false); 2198 1.455 rillig } 2199 1.455 rillig | if_without_else T_ELSE { 2200 1.187 rillig save_warning_flags(); 2201 1.438 rillig stmt_if_then_stmt(); 2202 1.455 rillig } statement { 2203 1.512 rillig restore_warning_flags(); 2204 1.438 rillig stmt_if_else_stmt(true); 2205 1.455 rillig } 2206 1.455 rillig | if_without_else T_ELSE error { 2207 1.187 rillig clear_warning_flags(); 2208 1.438 rillig stmt_if_else_stmt(false); 2209 1.455 rillig } 2210 1.455 rillig | switch_expr statement { 2211 1.187 rillig clear_warning_flags(); 2212 1.438 rillig stmt_switch_expr_stmt(); 2213 1.455 rillig } 2214 1.455 rillig | switch_expr error { 2215 1.187 rillig clear_warning_flags(); 2216 1.438 rillig stmt_switch_expr_stmt(); 2217 1.455 rillig } 2218 1.455 rillig ; 2219 1.1 cgd 2220 1.270 rillig if_without_else: /* see C99 6.8.4 */ 2221 1.455 rillig if_expr statement 2222 1.455 rillig | if_expr error 2223 1.455 rillig ; 2224 1.1 cgd 2225 1.270 rillig if_expr: /* see C99 6.8.4 */ 2226 1.455 rillig T_IF T_LPAREN expression T_RPAREN { 2227 1.438 rillig stmt_if_expr($3); 2228 1.187 rillig clear_warning_flags(); 2229 1.455 rillig } 2230 1.455 rillig ; 2231 1.1 cgd 2232 1.270 rillig switch_expr: /* see C99 6.8.4 */ 2233 1.455 rillig T_SWITCH T_LPAREN expression T_RPAREN { 2234 1.438 rillig stmt_switch_expr($3); 2235 1.187 rillig clear_warning_flags(); 2236 1.455 rillig } 2237 1.455 rillig ; 2238 1.1 cgd 2239 1.497 rillig /* C99 6.8.5, C23 6.8.6.1 */ 2240 1.497 rillig iteration_statement: 2241 1.455 rillig while_expr statement { 2242 1.187 rillig clear_warning_flags(); 2243 1.438 rillig stmt_while_expr_stmt(); 2244 1.455 rillig } 2245 1.455 rillig | while_expr error { 2246 1.187 rillig clear_warning_flags(); 2247 1.438 rillig stmt_while_expr_stmt(); 2248 1.455 rillig } 2249 1.482 rillig | do_statement T_WHILE T_LPAREN expression T_RPAREN T_SEMI { 2250 1.482 rillig stmt_do_while_expr($4); 2251 1.458 rillig suppress_fallthrough = false; 2252 1.455 rillig } 2253 1.455 rillig | do error { 2254 1.187 rillig clear_warning_flags(); 2255 1.438 rillig stmt_do_while_expr(NULL); 2256 1.455 rillig } 2257 1.455 rillig | for_exprs statement { 2258 1.306 rillig clear_warning_flags(); 2259 1.438 rillig stmt_for_exprs_stmt(); 2260 1.306 rillig end_declaration_level(); 2261 1.306 rillig block_level--; 2262 1.455 rillig } 2263 1.455 rillig | for_exprs error { 2264 1.187 rillig clear_warning_flags(); 2265 1.438 rillig stmt_for_exprs_stmt(); 2266 1.202 rillig end_declaration_level(); 2267 1.171 rillig block_level--; 2268 1.455 rillig } 2269 1.455 rillig ; 2270 1.1 cgd 2271 1.319 rillig while_expr: /* see C99 6.8.5 */ 2272 1.455 rillig T_WHILE T_LPAREN expression T_RPAREN { 2273 1.438 rillig stmt_while_expr($3); 2274 1.306 rillig clear_warning_flags(); 2275 1.455 rillig } 2276 1.455 rillig ; 2277 1.1 cgd 2278 1.319 rillig do_statement: /* see C99 6.8.5 */ 2279 1.455 rillig do statement { 2280 1.319 rillig clear_warning_flags(); 2281 1.455 rillig } 2282 1.455 rillig ; 2283 1.319 rillig 2284 1.270 rillig do: /* see C99 6.8.5 */ 2285 1.455 rillig T_DO { 2286 1.438 rillig stmt_do(); 2287 1.455 rillig } 2288 1.455 rillig ; 2289 1.1 cgd 2290 1.270 rillig for_start: /* see C99 6.8.5 */ 2291 1.455 rillig T_FOR T_LPAREN { 2292 1.443 rillig begin_declaration_level(DLK_AUTO); 2293 1.171 rillig block_level++; 2294 1.455 rillig } 2295 1.455 rillig ; 2296 1.254 rillig 2297 1.270 rillig for_exprs: /* see C99 6.8.5 */ 2298 1.455 rillig for_start 2299 1.322 rillig begin_type_declaration_specifiers end_type 2300 1.498 rillig notype_init_declarator_list T_SEMI 2301 1.388 rillig expression_opt T_SEMI 2302 1.388 rillig expression_opt T_RPAREN { 2303 1.127 rillig /* variable declaration in for loop */ 2304 1.43 christos c99ism(325); 2305 1.438 rillig stmt_for_exprs(NULL, $6, $8); 2306 1.187 rillig clear_warning_flags(); 2307 1.457 rillig } 2308 1.455 rillig | for_start 2309 1.388 rillig expression_opt T_SEMI 2310 1.388 rillig expression_opt T_SEMI 2311 1.388 rillig expression_opt T_RPAREN { 2312 1.438 rillig stmt_for_exprs($2, $4, $6); 2313 1.187 rillig clear_warning_flags(); 2314 1.455 rillig } 2315 1.455 rillig ; 2316 1.1 cgd 2317 1.497 rillig /* C99 6.8.6, C23 6.8.7.1 */ 2318 1.497 rillig jump_statement: 2319 1.455 rillig goto identifier T_SEMI { 2320 1.438 rillig stmt_goto(getsym($2)); 2321 1.455 rillig } 2322 1.455 rillig | goto error T_SEMI { 2323 1.484 rillig set_sym_kind(SK_VCFT); 2324 1.455 rillig } 2325 1.455 rillig | T_CONTINUE T_SEMI { 2326 1.438 rillig stmt_continue(); 2327 1.455 rillig } 2328 1.455 rillig | T_BREAK T_SEMI { 2329 1.438 rillig stmt_break(); 2330 1.455 rillig } 2331 1.455 rillig | T_RETURN sys T_SEMI { 2332 1.438 rillig stmt_return($2, NULL); 2333 1.455 rillig } 2334 1.455 rillig | T_RETURN sys expression T_SEMI { 2335 1.438 rillig stmt_return($2, $3); 2336 1.455 rillig } 2337 1.455 rillig ; 2338 1.319 rillig 2339 1.319 rillig goto: /* see C99 6.8.6 */ 2340 1.455 rillig T_GOTO { 2341 1.484 rillig set_sym_kind(SK_LABEL); 2342 1.455 rillig } 2343 1.455 rillig ; 2344 1.319 rillig 2345 1.319 rillig asm_statement: /* GCC extension */ 2346 1.455 rillig T_ASM T_LPAREN read_until_rparen T_SEMI { 2347 1.422 rillig dcs_set_asm(); 2348 1.455 rillig } 2349 1.455 rillig | T_ASM type_qualifier T_LPAREN read_until_rparen T_SEMI { 2350 1.422 rillig dcs_set_asm(); 2351 1.455 rillig } 2352 1.455 rillig | T_ASM error 2353 1.455 rillig ; 2354 1.319 rillig 2355 1.319 rillig read_until_rparen: /* helper for 'asm_statement' */ 2356 1.455 rillig /* empty */ { 2357 1.331 rillig read_until_rparen(); 2358 1.455 rillig } 2359 1.455 rillig ; 2360 1.308 rillig 2361 1.497 rillig /* C99 6.9, C23 6.9.1 */ 2362 1.497 rillig translation_unit: 2363 1.455 rillig external_declaration 2364 1.455 rillig | translation_unit external_declaration 2365 1.455 rillig ; 2366 1.319 rillig 2367 1.497 rillig /* C99 6.9, C23 6.9.1 */ 2368 1.497 rillig external_declaration: 2369 1.455 rillig function_definition { 2370 1.319 rillig global_clean_up_decl(false); 2371 1.319 rillig clear_warning_flags(); 2372 1.455 rillig } 2373 1.455 rillig | top_level_declaration { 2374 1.319 rillig global_clean_up_decl(false); 2375 1.319 rillig clear_warning_flags(); 2376 1.455 rillig } 2377 1.455 rillig | asm_statement /* GCC extension */ 2378 1.455 rillig | T_SEMI { /* GCC extension */ 2379 1.410 rillig /* 2380 1.410 rillig * TODO: Only allow this in GCC mode, not in plain C99. 2381 1.410 rillig * This is one of the top 10 warnings in the NetBSD build. 2382 1.410 rillig */ 2383 1.489 rillig if (!allow_trad && !allow_c99) 2384 1.335 rillig /* empty declaration */ 2385 1.335 rillig error(0); 2386 1.489 rillig else if (allow_c90) 2387 1.335 rillig /* empty declaration */ 2388 1.335 rillig warning(0); 2389 1.455 rillig } 2390 1.455 rillig ; 2391 1.1 cgd 2392 1.226 rillig /* 2393 1.319 rillig * On the top level, lint allows several forms of declarations that it doesn't 2394 1.319 rillig * allow in functions. For example, a single ';' is an empty declaration and 2395 1.319 rillig * is supported by some compilers, but in a function it would be an empty 2396 1.319 rillig * statement, not a declaration. This makes a difference in C90 mode, where 2397 1.319 rillig * a statement must not be followed by a declaration. 2398 1.226 rillig * 2399 1.319 rillig * See 'declaration' for all other declarations. 2400 1.226 rillig */ 2401 1.319 rillig top_level_declaration: /* C99 6.9 calls this 'declaration' */ 2402 1.498 rillig begin_type end_type notype_init_declarator_list T_SEMI { 2403 1.410 rillig /* TODO: Make this an error in C99 mode as well. */ 2404 1.489 rillig if (!allow_trad && !allow_c99) 2405 1.424 rillig /* old-style declaration; add 'int' */ 2406 1.319 rillig error(1); 2407 1.489 rillig else if (allow_c90) 2408 1.424 rillig /* old-style declaration; add 'int' */ 2409 1.319 rillig warning(1); 2410 1.455 rillig } 2411 1.455 rillig | declaration 2412 1.455 rillig | error T_SEMI { 2413 1.319 rillig global_clean_up(); 2414 1.455 rillig } 2415 1.455 rillig | error T_RBRACE { 2416 1.319 rillig global_clean_up(); 2417 1.455 rillig } 2418 1.455 rillig ; 2419 1.226 rillig 2420 1.497 rillig /* C99 6.9.1, C23 6.9.2 */ 2421 1.497 rillig function_definition: 2422 1.455 rillig func_declarator { 2423 1.319 rillig if ($1->s_type->t_tspec != FUNC) { 2424 1.319 rillig /* syntax error '%s' */ 2425 1.319 rillig error(249, yytext); 2426 1.319 rillig YYERROR; 2427 1.319 rillig } 2428 1.319 rillig if ($1->s_type->t_typedef) { 2429 1.319 rillig /* ()-less function definition */ 2430 1.319 rillig error(64); 2431 1.319 rillig YYERROR; 2432 1.319 rillig } 2433 1.447 rillig check_extern_declaration($1); 2434 1.432 rillig begin_function($1); 2435 1.319 rillig block_level++; 2436 1.468 rillig begin_declaration_level(DLK_OLD_STYLE_PARAMS); 2437 1.319 rillig if (lwarn == LWARN_NONE) 2438 1.319 rillig $1->s_used = true; 2439 1.455 rillig } arg_declaration_list_opt { 2440 1.319 rillig end_declaration_level(); 2441 1.319 rillig block_level--; 2442 1.319 rillig check_func_lint_directives(); 2443 1.468 rillig check_func_old_style_parameters(); 2444 1.319 rillig begin_control_statement(CS_FUNCTION_BODY); 2445 1.455 rillig } compound_statement { 2446 1.432 rillig end_function(); 2447 1.319 rillig end_control_statement(CS_FUNCTION_BODY); 2448 1.455 rillig } 2449 1.455 rillig ; 2450 1.1 cgd 2451 1.324 rillig func_declarator: 2452 1.455 rillig begin_type end_type notype_declarator { 2453 1.489 rillig if (!allow_trad) 2454 1.424 rillig /* old-style declaration; add 'int' */ 2455 1.402 rillig error(1); 2456 1.319 rillig $$ = $3; 2457 1.455 rillig } 2458 1.455 rillig | begin_type_declmods end_type notype_declarator { 2459 1.489 rillig if (!allow_trad) 2460 1.424 rillig /* old-style declaration; add 'int' */ 2461 1.402 rillig error(1); 2462 1.319 rillig $$ = $3; 2463 1.455 rillig } 2464 1.455 rillig | begin_type_declaration_specifiers end_type type_declarator { 2465 1.319 rillig $$ = $3; 2466 1.455 rillig } 2467 1.455 rillig ; 2468 1.1 cgd 2469 1.319 rillig arg_declaration_list_opt: /* C99 6.9.1p13 example 1 */ 2470 1.455 rillig /* empty */ 2471 1.455 rillig | arg_declaration_list 2472 1.455 rillig ; 2473 1.1 cgd 2474 1.319 rillig arg_declaration_list: /* C99 6.9.1p13 example 1 */ 2475 1.455 rillig arg_declaration 2476 1.455 rillig | arg_declaration_list arg_declaration 2477 1.319 rillig /* XXX or better "arg_declaration error" ? */ 2478 1.455 rillig | error 2479 1.455 rillig ; 2480 1.301 rillig 2481 1.319 rillig /* 2482 1.319 rillig * "arg_declaration" is separated from "declaration" because it 2483 1.319 rillig * needs other error handling. 2484 1.319 rillig */ 2485 1.319 rillig arg_declaration: 2486 1.455 rillig begin_type_declmods end_type T_SEMI { 2487 1.319 rillig /* empty declaration */ 2488 1.319 rillig warning(2); 2489 1.455 rillig } 2490 1.498 rillig | begin_type_declmods end_type notype_init_declarator_list T_SEMI 2491 1.455 rillig | begin_type_declaration_specifiers end_type T_SEMI { 2492 1.489 rillig if (!dcs->d_nonempty_decl) 2493 1.319 rillig /* empty declaration */ 2494 1.319 rillig warning(2); 2495 1.489 rillig else 2496 1.468 rillig /* '%s' declared in parameter declaration list */ 2497 1.319 rillig warning(3, type_name(dcs->d_type)); 2498 1.455 rillig } 2499 1.455 rillig | begin_type_declaration_specifiers end_type 2500 1.498 rillig type_init_declarator_list T_SEMI { 2501 1.489 rillig if (dcs->d_nonempty_decl) 2502 1.468 rillig /* '%s' declared in parameter declaration list */ 2503 1.319 rillig warning(3, type_name(dcs->d_type)); 2504 1.455 rillig } 2505 1.455 rillig | begin_type_declmods error 2506 1.455 rillig | begin_type_declaration_specifiers error 2507 1.455 rillig ; 2508 1.254 rillig 2509 1.421 rillig /* https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html */ 2510 1.421 rillig gcc_attribute_specifier_list_opt: 2511 1.510 rillig /* empty */ { 2512 1.526 rillig $$ = no_type_attributes(); 2513 1.510 rillig } 2514 1.455 rillig | gcc_attribute_specifier_list 2515 1.455 rillig ; 2516 1.339 rillig 2517 1.421 rillig gcc_attribute_specifier_list: 2518 1.455 rillig gcc_attribute_specifier 2519 1.510 rillig | gcc_attribute_specifier_list gcc_attribute_specifier { 2520 1.530 rillig $$ = merge_type_attributes($1, $2); 2521 1.510 rillig } 2522 1.455 rillig ; 2523 1.339 rillig 2524 1.421 rillig gcc_attribute_specifier: 2525 1.455 rillig T_ATTRIBUTE T_LPAREN T_LPAREN { 2526 1.434 rillig in_gcc_attribute = true; 2527 1.455 rillig } gcc_attribute_list { 2528 1.434 rillig in_gcc_attribute = false; 2529 1.510 rillig } T_RPAREN T_RPAREN { 2530 1.510 rillig $$ = $5; 2531 1.510 rillig } 2532 1.455 rillig ; 2533 1.339 rillig 2534 1.421 rillig gcc_attribute_list: 2535 1.455 rillig gcc_attribute 2536 1.510 rillig | gcc_attribute_list T_COMMA gcc_attribute { 2537 1.526 rillig $$ = merge_type_attributes($1, $3); 2538 1.510 rillig } 2539 1.455 rillig ; 2540 1.260 rillig 2541 1.421 rillig gcc_attribute: 2542 1.510 rillig /* empty */ { 2543 1.526 rillig $$ = no_type_attributes(); 2544 1.510 rillig } 2545 1.455 rillig | T_NAME { 2546 1.526 rillig $$ = no_type_attributes(); 2547 1.421 rillig const char *name = $1->sb_name; 2548 1.421 rillig if (is_either(name, "packed", "__packed__")) 2549 1.422 rillig dcs_add_packed(); 2550 1.421 rillig else if (is_either(name, "used", "__used__") || 2551 1.511 rillig is_either(name, "constructor", "__constructor__") || 2552 1.421 rillig is_either(name, "unused", "__unused__")) 2553 1.510 rillig $$.used = true; 2554 1.434 rillig else if (is_either(name, "fallthrough", "__fallthrough__")) 2555 1.459 rillig suppress_fallthrough = true; 2556 1.514 rillig else if (is_either(name, "noreturn", "__noreturn__")) 2557 1.514 rillig $$.noreturn = true; 2558 1.421 rillig } 2559 1.510 rillig | T_NAME T_LPAREN T_RPAREN { 2560 1.510 rillig $$ = (type_attributes){ .used = false }; 2561 1.510 rillig } 2562 1.494 rillig | T_NAME T_LPAREN argument_expression_list T_RPAREN { 2563 1.494 rillig const char *name = $1->sb_name; 2564 1.494 rillig if (is_either(name, "aligned", "__aligned__") 2565 1.494 rillig && $3->args_len == 1) 2566 1.494 rillig dcs_add_alignas($3->args[0]); 2567 1.526 rillig $$ = no_type_attributes(); 2568 1.518 rillig if (is_either(name, "mode", "__mode__") 2569 1.518 rillig && $3->args_len == 1 2570 1.518 rillig && $3->args[0]->tn_op == NAME) { 2571 1.518 rillig const char *arg_name = $3->args[0]->u.sym->s_name; 2572 1.518 rillig if (strcmp(arg_name, "TI") == 0) 2573 1.518 rillig $$.bit_width = 128; 2574 1.518 rillig if (strcmp(arg_name, "DI") == 0) 2575 1.518 rillig $$.bit_width = 64; 2576 1.518 rillig } 2577 1.494 rillig } 2578 1.455 rillig | type_qualifier { 2579 1.461 rillig if (!$1.tq_const) 2580 1.260 rillig yyerror("Bad attribute"); 2581 1.526 rillig $$ = no_type_attributes(); 2582 1.455 rillig } 2583 1.455 rillig ; 2584 1.260 rillig 2585 1.497 rillig /* The rule 'function_body' from C23 6.9.2 is inlined into 'function_definition'. */ 2586 1.497 rillig 2587 1.370 rillig sys: 2588 1.455 rillig /* empty */ { 2589 1.370 rillig $$ = in_system_header; 2590 1.455 rillig } 2591 1.455 rillig ; 2592 1.370 rillig 2593 1.1 cgd %% 2594 1.1 cgd 2595 1.1 cgd /* ARGSUSED */ 2596 1.1 cgd int 2597 1.42 dholland yyerror(const char *msg) 2598 1.1 cgd { 2599 1.127 rillig /* syntax error '%s' */ 2600 1.41 christos error(249, yytext); 2601 1.1 cgd if (++sytxerr >= 5) 2602 1.1 cgd norecover(); 2603 1.112 rillig return 0; 2604 1.1 cgd } 2605 1.1 cgd 2606 1.450 rillig #if YYDEBUG && YYBYACC 2607 1.352 rillig static const char * 2608 1.500 rillig cgram_to_string(int tok, YYSTYPE val) 2609 1.352 rillig { 2610 1.352 rillig 2611 1.500 rillig switch (tok) { 2612 1.352 rillig case T_INCDEC: 2613 1.474 rillig return val.y_inc ? "++" : "--"; 2614 1.352 rillig case T_MULTIPLICATIVE: 2615 1.352 rillig case T_ADDITIVE: 2616 1.352 rillig case T_SHIFT: 2617 1.352 rillig case T_RELATIONAL: 2618 1.352 rillig case T_EQUALITY: 2619 1.352 rillig case T_OPASSIGN: 2620 1.451 rillig return op_name(val.y_op); 2621 1.352 rillig case T_SCLASS: 2622 1.352 rillig return scl_name(val.y_scl); 2623 1.352 rillig case T_TYPE: 2624 1.352 rillig case T_STRUCT_OR_UNION: 2625 1.352 rillig return tspec_name(val.y_tspec); 2626 1.352 rillig case T_QUAL: 2627 1.461 rillig return type_qualifiers_string(val.y_type_qualifiers); 2628 1.456 rillig case T_FUNCTION_SPECIFIER: 2629 1.456 rillig return function_specifier_name(val.y_function_specifier); 2630 1.352 rillig case T_NAME: 2631 1.352 rillig return val.y_name->sb_name; 2632 1.352 rillig default: 2633 1.352 rillig return "<none>"; 2634 1.352 rillig } 2635 1.352 rillig } 2636 1.352 rillig #endif 2637 1.352 rillig 2638 1.1 cgd static void 2639 1.436 rillig cgram_declare(sym_t *decl, bool has_initializer, sbuf_t *renaming) 2640 1.1 cgd { 2641 1.436 rillig declare(decl, has_initializer, renaming); 2642 1.174 rillig if (renaming != NULL) 2643 1.174 rillig freeyyv(&renaming, T_NAME); 2644 1.6 jpo } 2645 1.6 jpo 2646 1.6 jpo /* 2647 1.475 rillig * Discard all input tokens up to and including the next unmatched right 2648 1.475 rillig * parenthesis. 2649 1.6 jpo */ 2650 1.22 thorpej static void 2651 1.331 rillig read_until_rparen(void) 2652 1.6 jpo { 2653 1.477 rillig int level; 2654 1.6 jpo 2655 1.6 jpo if (yychar < 0) 2656 1.6 jpo yychar = yylex(); 2657 1.6 jpo freeyyv(&yylval, yychar); 2658 1.6 jpo 2659 1.6 jpo level = 1; 2660 1.426 rillig while (yychar > 0) { 2661 1.426 rillig if (yychar == T_LPAREN) 2662 1.6 jpo level++; 2663 1.426 rillig if (yychar == T_RPAREN && --level == 0) 2664 1.6 jpo break; 2665 1.6 jpo freeyyv(&yylval, yychar = yylex()); 2666 1.6 jpo } 2667 1.6 jpo 2668 1.6 jpo yyclearin; 2669 1.1 cgd } 2670 1.75 christos 2671 1.500 rillig static balanced_token_sequence 2672 1.500 rillig read_balanced_token_sequence(void) 2673 1.500 rillig { 2674 1.500 rillig lint_assert(yychar < 0); 2675 1.502 rillig balanced_token_sequence seq = lex_balanced(); 2676 1.500 rillig yyclearin; 2677 1.500 rillig return seq; 2678 1.500 rillig } 2679 1.500 rillig 2680 1.477 rillig static sym_t * 2681 1.75 christos symbolrename(sym_t *s, sbuf_t *sb) 2682 1.75 christos { 2683 1.219 rillig if (sb != NULL) 2684 1.75 christos s->s_rename = sb->sb_name; 2685 1.75 christos return s; 2686 1.75 christos } 2687