1 /* $NetBSD: parse_type_name.c,v 1.12 2023/08/26 10:43:53 rillig Exp $ */ 2 # 3 "parse_type_name.c" 3 4 /* 5 * Test parsing of the grammar rule 'type_name', which among others appears 6 * in the expression 'sizeof(type_name)'. 7 */ 8 9 /* lint1-extra-flags: -X 351 */ 10 11 void sink(unsigned long); 12 13 void 14 cover_type_name(void) 15 { 16 /* cover 'abstract_declaration' */ 17 sink(sizeof(int)); 18 } 19 20 void 21 cover_abstract_declaration(void) 22 { 23 /* cover 'qualifier_list' */ 24 /* missing type-specifier, even in traditional C */ 25 /* lint doesn't care since this is caught by the compiler */ 26 sink(sizeof(const)); 27 28 /* cover 'specifier_qualifier_list' */ 29 sink(sizeof(double)); 30 31 /* cover 'qualifier_list abstract_declarator' */ 32 /* XXX: This is nonsense, lint should not accept it. */ 33 sink(sizeof(const[3])); 34 35 /* cover 'specifier_qualifier_list abstract_declarator' */ 36 sink(sizeof(const int[3])); 37 sink(sizeof(int const[3])); 38 } 39 40 void 41 cover_abstract_declarator(void) 42 { 43 /* cover 'pointer' */ 44 sink(sizeof(int ***)); 45 46 /* cover 'direct_abstract_declarator' */ 47 sink(sizeof(int[3])); 48 49 /* cover 'pointer direct_abstract_declarator' */ 50 sink(sizeof(int **[3])); 51 52 /* cover 'T_TYPEOF cast_expression' */ 53 /* expect+1: error: cannot take size/alignment of function type 'function(int) returning int' [144] */ 54 sink(sizeof(int(typeof(12345)))); 55 } 56 57 void 58 cover_direct_abstract_declarator(void) 59 { 60 /* cover 'T_LPAREN abstract_declarator T_RPAREN' */ 61 sink(sizeof(int (*))); 62 63 /* cover 'T_LBRACK T_RBRACK' */ 64 sink(sizeof(int[])); 65 66 /* cover 'T_LBRACK array_size T_RBRACK' */ 67 sink(sizeof(int[3])); 68 69 /* cover 'type_attribute direct_abstract_declarator' */ 70 sink(sizeof(int *__attribute__(())[3])); 71 72 /* cover 'direct_abstract_declarator T_LBRACK T_RBRACK' */ 73 /* expect+1: error: null dimension [17] */ 74 sink(sizeof(int[3][])); 75 76 /* cover 'direct_abstract_declarator T_LBRACK T_ASTERISK T_RBRACK' */ 77 /* expect+1: error: null dimension [17] */ 78 sink(sizeof(int[3][ *])); 79 80 /* cover 'direct_abstract_declarator T_LBRACK array_size T_RBRACK' */ 81 sink(sizeof(int[3][5][8])); 82 83 /* cover 'abstract_decl_param_list asm_or_symbolrename_opt' */ 84 /* expect+1: error: cannot take size/alignment of function type 'function(double) returning int' [144] */ 85 sink(sizeof(int(double))); 86 /* expect+1: error: cannot take size/alignment of function type 'function(double) returning int' [144] */ 87 sink(sizeof(int(double) __asm("anything"))); 88 /* expect+1: error: cannot take size/alignment of function type 'function(double) returning int' [144] */ 89 sink(sizeof(int(double) __symbolrename(alias))); 90 91 /* cover 'direct_abstract_declarator abstract_decl_param_list asm_or_symbolrename_opt' */ 92 sink(sizeof(int (*)(double))); 93 sink(sizeof(int (*)(double) __asm("anything"))); 94 sink(sizeof(int (*)(double)__symbolrename(alias))); 95 96 /* cover 'direct_abstract_declarator type_attribute_list' */ 97 sink(sizeof(int (*) __attribute__(()))); 98 sink(sizeof(int (*) __attribute__(()) __attribute__(()))); 99 } 100 101 void 102 cover_abstract_decl_param_list(void) 103 { 104 /* cover 'abstract_decl_lparen T_RPAREN type_attribute_opt' */ 105 sink(sizeof(void (*)())); 106 sink(sizeof(void (*)() __attribute__(()))); 107 /* 108 * XXX: The grammar allows only a single type_attribute_opt. 109 * All following __attribute__ come from direct_abstract_declarator. 110 */ 111 sink(sizeof(void (*)() __attribute__(()) __attribute__(()))); 112 113 /* cover 'abstract_decl_lparen vararg_parameter_type_list T_RPAREN type_attribute_opt' */ 114 sink(sizeof(void (*)(void) __attribute__(()))); 115 /* 116 * XXX: The grammar allows only a single type_attribute_opt. 117 * All following __attribute__ come from direct_abstract_declarator. 118 */ 119 sink(sizeof(void (*)(void) __attribute__(()) __attribute__(()))); 120 121 /* cover 'abstract_decl_lparen error T_RPAREN type_attribute_opt' */ 122 /* expect+1: error: syntax error 'goto' [249] */ 123 sink(sizeof(void (*)(goto))); 124 /* expect+1: error: syntax error 'goto' [249] */ 125 sink(sizeof(void (*)(goto) __attribute__(()))); 126 /* 127 * XXX: The grammar allows only a single type_attribute_opt. 128 * All following __attribute__ come from direct_abstract_declarator. 129 */ 130 /* expect+1: error: syntax error 'goto' [249] */ 131 sink(sizeof(void (*)(goto) __attribute__(()) __attribute__(()))); 132 } 133 134 void 135 cover_vararg_parameter_type_list(void) 136 { 137 /* cover 'parameter_type_list' */ 138 sink(sizeof(void (*)(double))); 139 140 /* cover 'parameter_type_list T_COMMA T_ELLIPSIS' */ 141 sink(sizeof(void (*)(double, ...))); 142 143 /* cover 'T_ELLIPSIS' */ 144 /* expect+1: warning: C90 to C17 require formal parameter before '...' [84] */ 145 sink(sizeof(void (*)(...))); 146 } 147 148 void 149 cover_parameter_type_list(void) 150 { 151 /* cover 'parameter_declaration' */ 152 sink(sizeof(void (*)(double))); 153 154 /* cover 'parameter_type_list T_COMMA parameter_declaration' */ 155 sink(sizeof(void (*)(double, double, double, char *))); 156 } 157 158 void 159 cover_parameter_declaration(void) 160 { 161 /* cover 'declmods' */ 162 /* GCC 11 warns: type defaults to 'int' in type name */ 163 sink(sizeof(void (*)(int, const))); 164 165 /* cover 'declaration_specifiers' */ 166 sink(sizeof(void (*)(int, double))); 167 168 /* cover 'declmods notype_param_declarator' */ 169 /* GCC 11 warns: type defaults to 'int' in declaration of 'x' */ 170 sink(sizeof(void (*)(int, const x))); 171 172 /* cover 'begin_type_declaration_specifiers end_type type_param_declarator' */ 173 sink(sizeof(void (*)(int, double x))); 174 175 /* cover 'begin_type_declmods end_type abstract_declarator' */ 176 /* GCC 11 warns: type defaults to 'int' in type name */ 177 sink(sizeof(void (*)(int, const *))); 178 179 /* cover 'begin_type_declaration_specifiers end_type abstract_declarator' */ 180 sink(sizeof(void (*)(int, double *))); 181 } 182