Changeset 131
- Timestamp:
- 12/26/06 21:16:22 (2 years ago)
- Files:
-
- trunk/gcc/gcc/algol60/lang.c (modified) (1 diff)
- trunk/gcc/gcc/algol60/parser.y (modified) (12 diffs)
- trunk/gcc/gcc/testsuite/algol60.dg/compile/goto2.a60 (added)
- trunk/gcc/gcc/testsuite/algol60.dg/compile/goto3.a60 (added)
- trunk/gcc/gcc/testsuite/algol60.dg/compile/goto4.a60 (added)
- trunk/gcc/gcc/testsuite/algol60.dg/fail/labels1.a60 (moved) (moved from trunk/gcc/gcc/testsuite/algol60.dg/compile/labels1.a60) (1 diff)
- trunk/gcc/gcc/testsuite/algol60.dg/fail/labels2.a60 (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/gcc/gcc/algol60/lang.c
r104 r131 250 250 251 251 // toplev 'begin'-'end' block is the body of `main' 252 statement_t * stmt0 = slist_front (container_stmts (as_container (ast)));252 //statement_t * stmt0 = slist_front (container_stmts (as_container (ast))); 253 253 254 254 al60l_bind_state_t * state = new_bind_state (); 255 255 bind_state_push_function (state, resultdecl, decl); 256 256 { 257 tree bind = stmt_build_generic ( stmt0, state);257 tree bind = stmt_build_generic (ast, state); 258 258 259 259 // add fallback return to the body trunk/gcc/gcc/algol60/parser.y
r130 r131 33 33 slist_t * blockstack; 34 34 container_t * block; 35 container_t * program_block; 35 36 estring_t * tmp; 36 37 } parser_rep_t; … … 236 237 { 237 238 log_printf (parser->log, ll_debug, "Program -> LabelList Block SEPSEMICOLON EOFTOK"); 238 private_dump_log_labels (parser, $2);239 private_add_labels_to_symtab (parser, parser->block, $2, $3);240 239 container_add_stmt (parser->block, $3); 241 parser->result = as_statement (private_close_block (parser)); 240 if (!slist_empty ($2)) 241 log_printfc (parser->log, ll_error, cr_csr (parser, &@3), 242 "labels not allowed at program block."); 243 private_close_block (parser); // toplev 244 private_close_block (parser); // dummy 245 parser->result = as_statement (parser->program_block); 242 246 YYACCEPT; 243 247 } … … 292 296 Block: 293 297 KWBEGIN 294 { private_open_block (parser, new_stmt_block (NULL));} 298 { 299 container_t * c = new_stmt_block (cr_csr (parser, &@1)); 300 container_set_parent (c, parser->block); 301 private_open_block (parser, c); 302 if (parser->program_block == NULL) 303 { 304 log_printf (parser->log, ll_debug, " %p is program block", c); 305 parser->program_block = c; 306 } 307 } 295 308 BlockDeclarationsList StatementList 296 309 KWEND … … 418 431 419 432 OptOwn: 420 /*eps */ { $$ = 0; }433 /*epsilon*/ { $$ = 0; } 421 434 | 422 435 KWOWN { $$ = 1; @$ = @1; } 423 436 424 437 OptIntrinsicType: 425 /* epsilon*/438 /*epsilon*/ 426 439 { 427 440 log_printf (parser->log, ll_debug, "OptIntrinsicType -> epsilon"); … … 498 511 499 512 OptBoundsPairList: 500 /* epsilon*/513 /*epsilon*/ 501 514 { 502 515 log_printf (parser->log, ll_debug, "OptBoundsPairList -> epsilon"); … … 857 870 858 871 BasicStatement: 859 /* eps*/872 /*epsilon*/ 860 873 { 861 874 log_printf (parser->log, ll_debug, "BasicStatement -> LabelList"); … … 965 978 966 979 OptElseClause: 967 /* eps*/980 /*epsilon*/ 968 981 { 969 982 $$ = NULL; … … 1046 1059 guard_ptr (buf, 1, ret->blockstack = new_slist ()); 1047 1060 guard_ptr (buf, 1, ret->tmp = new_estring ()); 1061 ret->program_block = NULL; 1048 1062 return (void*)ret; 1049 1063 } … … 1124 1138 1125 1139 static void 1126 private_add_labels_to_symtab (parser_rep_t * parser ATTRIBUTE_UNUSED,1127 container_t * cont ,1140 private_add_labels_to_symtab (parser_rep_t * parser, 1141 container_t * context, 1128 1142 slist_t * slist, statement_t * target) 1129 1143 { 1144 // Algol has an interesting quirk: labels are local to the nearest 1145 // enclosing *block* (as opposed to mere compound statement). So we 1146 // must actually look up nearest block with declarations. 1147 // 1148 // Strictly speaking, when there are no declarations at program 1149 // block, then it's actually program compound statement, and no 1150 // labels may be defined at that level. However we will put all 1151 // labels to the program block, if no other block is closer. 1152 1153 while (context != parser->program_block 1154 && slist_empty (container_symtab (context))) 1155 context = container_parent (context); 1156 1130 1157 slist_it_t * it = slist_iter (slist); 1131 1158 for (; slist_it_has (it); slist_it_next (it)) … … 1133 1160 label_t * lbl = slist_it_get (it); 1134 1161 symbol_t * sym = new_symbol (lbl); 1135 container_add_symbol (cont, sym, sek_ordinary); 1136 symbol_set_stmt (sym, target); 1137 symbol_set_type (sym, type_label ()); 1138 stmt_add_label (target, sym); 1162 if (container_add_symbol (context, sym, sek_ordinary) != 0) 1163 { 1164 cursor_t * csr = stmt_cursor (target); 1165 log_printfc (parser->log, ll_error, csr, 1166 "duplicate label `%s'.", estr_cstr (label_id (lbl))); 1167 delete_symbol (sym); 1168 } 1169 else 1170 { 1171 symbol_set_stmt (sym, target); 1172 symbol_set_type (sym, type_label ()); 1173 stmt_add_label (target, sym); 1174 } 1139 1175 } 1140 1176 delete_slist_it (it); … … 1146 1182 assert (cont != NULL); 1147 1183 slist_pushfront (parser->blockstack, parser->block); 1184 log_printf (parser->log, ll_debug, "open %p", cont); 1148 1185 parser->block = cont; 1149 1186 } … … 1155 1192 container_t * cont = parser->block; 1156 1193 parser->block = slist_popfront (parser->blockstack); 1194 log_printf (parser->log, ll_debug, "close %p", cont); 1157 1195 return cont; 1158 1196 } trunk/gcc/gcc/testsuite/algol60.dg/fail/labels1.a60
r87 r131 1 1 'comment' { dg-do compile } ; 2 2 label1: 3 label2: 4 'begin' 3 'begin' 'comment' { dg-error "label" } ; 5 4 label3: ; 6 5 label4: label5:
