|
|
1.1 ! root 1: /*ident "@(#)ctrans:src/error.c 1.6" */ ! 2: /************************************************************************** ! 3: ! 4: C++ source for cfront, the C++ compiler front-end ! 5: written in the computer science research center of Bell Labs ! 6: ! 7: Copyright (c) 1984 AT&T, Inc. All Rights Reserved ! 8: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC. ! 9: ! 10: error.c : ! 11: ! 12: write error messages ! 13: ! 14: Until scan_started != 0 no context can be assumed ! 15: ! 16: ***************************************************************************/ ! 17: ! 18: #ifdef __cplusplus ! 19: #include <stdlib.h> ! 20: #endif ! 21: ! 22: #include "cfront.h" ! 23: #include "size.h" ! 24: #include "template.h" ! 25: ! 26: int error_count; ! 27: static int no_of_warnings; ! 28: char scan_started; ! 29: ! 30: #define ERRTRACE 20 ! 31: ! 32: static char* abbrev_tbl[] = { ! 33: " argument", ! 34: " base", ! 35: " class", ! 36: " declaration", ! 37: " expression", ! 38: " function", ! 39: " global", ! 40: "H", ! 41: " initialize", ! 42: "J", ! 43: " constructor", // 'K' ! ! 44: " list", ! 45: " member", ! 46: " name", ! 47: " object", ! 48: " pointer", ! 49: " qualifie", ! 50: " reference", ! 51: " statement", ! 52: " type", ! 53: " undefined", ! 54: " variable", ! 55: " with", ! 56: " expected", // 'X' ! 57: " template", // 'Y'??? ! 58: " parameter", // 'Z'??? ! 59: }; ! 60: ! 61: ea* ea0; ! 62: ! 63: void error_init() ! 64: { ! 65: static char errbuf[BUFSIZ]; ! 66: setbuf(stderr,errbuf); ! 67: ea0 = new ea; ! 68: } ! 69: ! 70: #define INTERNAL 127 ! 71: ! 72: void ext(int n) ! 73: { ! 74: int useit=n; // to avoid n not used warning during build ! 75: // for testing only ! 76: // if (n == INTERNAL) ! 77: // abort(); ! 78: exit(error_count?error_count:1); ! 79: } ! 80: ! 81: /* static */ ! 82: void print_loc() ! 83: { ! 84: loc* sl = (Cstmt) ? &Cstmt->where : 0; ! 85: loc* dl = (Cdcl && (Cdcl->base==NAME || Cdcl->base==TNAME)) ? &Cdcl->where : 0; ! 86: if (sl && dl && sl->file==dl->file) { // Cstmt and Cdcl in same file ! 87: if (sl->line<=dl->line) { ! 88: if (curloc.file==dl->file && curloc.line<dl->line) ! 89: // hack to compensate for YACC's ! 90: // bad manners in the use of line numbers ! 91: sl->put(out_file); ! 92: else ! 93: dl->put(out_file); ! 94: } ! 95: else ! 96: sl->put(out_file); ! 97: } ! 98: else if (sl && sl->file==curr_file) // Cstmt in current file ! 99: sl->put(out_file); ! 100: else if (dl && dl->file==curr_file) // Cdcl in current file ! 101: dl->put(out_file); ! 102: else ! 103: curloc.put(out_file); ! 104: } ! 105: ! 106: static void print_context() ! 107: { ! 108: putc('\n',out_file); ! 109: } ! 110: ! 111: static char in_error = 0; ! 112: static loc dummy_loc; ! 113: ! 114: void yyerror(char* s) ! 115: { ! 116: error(s); ! 117: } ! 118: ! 119: int error(const char* s) ! 120: { ! 121: return error(0,s); ! 122: } ! 123: ! 124: int error(int t, const char* s) ! 125: { ! 126: return error(t,&dummy_loc,s,*ea0,*ea0,*ea0,*ea0); ! 127: } ! 128: ! 129: int error(const char* s, const ea& a0, const ea& a1, const ea& a2, const ea& a3) ! 130: { ! 131: return error(0,&dummy_loc,s,a0,a1,a2,a3); ! 132: } ! 133: ! 134: int error(loc* lc, const char* s, const ea& a0, const ea& a1, const ea& a2, const ea& a3) ! 135: { ! 136: return error(0,lc,s,a0,a1,a2,a3); ! 137: } ! 138: ! 139: int error(int t, const char* s, const ea& a0, const ea& a1, const ea& a2, const ea& a3) ! 140: { ! 141: return error(t,&dummy_loc,s,a0,a1,a2,a3); ! 142: } ! 143: ! 144: int suppress_error; ! 145: ! 146: int error(int t, loc* lc, const char* s, const ea& a0, const ea& a1, const ea& a2, const ea& a3) ! 147: /* ! 148: "int" not "void" because of "pch" in lex.c ! 149: ! 150: legal error types are: ! 151: 'w' warning (not counted in error count) ! 152: 'd' debug ! 153: 'D' debug -- no prefix ! 154: 's' "not implemented" message ! 155: 'l' "compiler limit exceeded" message ! 156: 0 error ! 157: 'i' internal error (causes abort) ! 158: 't' error while printing error message ! 159: */ ! 160: { ! 161: if (suppress_error) return 0; ! 162: ! 163: if (in_error++) ! 164: if (t == 't') ! 165: t = 'i'; ! 166: else if (4 < in_error) { ! 167: fprintf(stderr,"\nOops!, error while handling error\n"); ! 168: ext(13); ! 169: } ! 170: ! 171: FILE * of = out_file; ! 172: out_file = stderr; ! 173: ! 174: if (!scan_started || t=='t') ! 175: putch('\n'); ! 176: else if (lc != &dummy_loc) { ! 177: if(t != 'D' && t != 'c') lc->put(out_file); ! 178: } else { ! 179: if(t != 'D' && t != 'c') print_loc(); ! 180: } ! 181: ! 182: switch (t) { ! 183: case 'C': ! 184: case 'c': ! 185: break; ! 186: case 0: ! 187: case 'e': ! 188: putstring("error: "); ! 189: break; ! 190: case 'd': ! 191: putstring("DEBUG: "); ! 192: case 'D': ! 193: break; ! 194: case 'w': ! 195: no_of_warnings++; ! 196: putstring("warning: "); ! 197: break; ! 198: case 'l': ! 199: putstring("compiler limit exceeded: "); ! 200: break; ! 201: case 's': ! 202: putstring("sorry, not implemented: "); ! 203: break; ! 204: case 'i': ! 205: if (error_count++) { ! 206: fprintf(out_file,"sorry, cannot recover from earlier errors\n"); ! 207: ext(INTERNAL); ! 208: } ! 209: else ! 210: fprintf(out_file,"internal %s error: ",prog_name); ! 211: } ! 212: ! 213: ea argv[4]; ! 214: ea* a = argv; ! 215: argv[0] = a0; ! 216: argv[1] = a1; ! 217: argv[2] = a2; ! 218: argv[3] = a3; ! 219: ! 220: int c; ! 221: ! 222: while (c = *s++) { ! 223: if ('A'<=c && c<='Z') ! 224: putstring(abbrev_tbl[c-'A']); ! 225: else if (c == '%') { ! 226: switch (c = *s++) { ! 227: case 'k': // TOK assumed passed as an int ! 228: { TOK x = TOK(a->i); ! 229: if (0<x && x<=MAXTOK && keys[x]) ! 230: fprintf(out_file," %s",keys[x]); ! 231: else ! 232: fprintf(out_file," token(%d)",x); ! 233: break; ! 234: } ! 235: case 't': // Ptype ! 236: { Ptype tt = Ptype(a->p); ! 237: if (tt == 0) break; ! 238: ! 239: putch(' '); ! 240: ! 241: int nt = ntok; ! 242: emode = 1; ! 243: tt->dcl_print(0); ! 244: emode = 0; ! 245: ntok = nt; ! 246: break; ! 247: } ! 248: case 'n': // Pname ! 249: { Pname nn = Pname(a->p); ! 250: if (nn && nn->string) { ! 251: // suppress generated class names: ! 252: if (nn->string[0]=='_' ! 253: && nn->string[1]=='_' ! 254: && nn->string[2]=='C') break; ! 255: emode = 1; ! 256: putch(' '); ! 257: nn->print(); ! 258: emode = 0; ! 259: } ! 260: else ! 261: putstring(" ?"); ! 262: break; ! 263: } ! 264: case 'p': // pointer ! 265: { char* f = sizeof(char*)==sizeof(int)?" %d":" %ld"; ! 266: fprintf(out_file,f,a->p); ! 267: break; ! 268: } ! 269: case 'c': // char assumed passed as an int ! 270: putch(a->i); ! 271: break; ! 272: ! 273: case 'd': // int ! 274: fprintf(out_file," %d",a->i); ! 275: break; ! 276: ! 277: case 'o': // int ! 278: fprintf(out_file," %o",a->i); ! 279: break; ! 280: ! 281: case 's': // char* ! 282: char *s = ((char *)a->p); ! 283: if ( s ) putst((char*)a->p); ! 284: break; ! 285: } ! 286: a++; ! 287: } ! 288: else ! 289: putch(c); ! 290: } ! 291: ! 292: /* ! 293: switch (t) { ! 294: case 'd': ! 295: case 't': ! 296: case 'w': ! 297: putch('\n'); ! 298: break; ! 299: default: ! 300: */ ! 301: if (t != 'c' && t != 'e' && t != 'C') ! 302: print_context(); ! 303: /* ! 304: } ! 305: */ ! 306: ! 307: templ_inst::head->print_error_loc(); ! 308: fflush(stderr); ! 309: if (!scan_started && t!='d' && t!='w') ext(4); ! 310: ! 311: // now we may want to carry on ! 312: out_file = of; ! 313: switch (t) { ! 314: case 't': ! 315: if (--in_error) return 0; ! 316: case 'i': ! 317: ext(INTERNAL); ! 318: case 0: ! 319: case 'e': ! 320: case 'l': ! 321: case 's': ! 322: if (MAXERR<++error_count) { ! 323: fprintf(stderr,"Sorry, too many errors\n"); ! 324: ext(7); ! 325: } ! 326: } ! 327: ! 328: in_error = 0; ! 329: return 0; ! 330: } ! 331: ! 332: ! 333: ! 334: #ifdef DBG ! 335: #define OPEREP(v) ((v)>MAXTOK || (v)<=0 ? 0 : keys[v]) ! 336: void ! 337: display_type( Ptype t ) ! 338: { ! 339: if ( t ) { putc(' ',stderr); ! 340: FILE * of = out_file; ! 341: out_file = stderr; ! 342: extern int ntok; int nt = ntok; ! 343: emode=1; (t)->dcl_print(0); emode=0; ! 344: //fprintf(stderr," <node %d",t->node::id); ! 345: if(!t->allocated)fprintf(stderr," UNALLOCATED!"); ! 346: //putc('>',stderr); ! 347: ntok = nt; ! 348: out_file = of; ! 349: } else fprintf(stderr," <null type>"); ! 350: } ! 351: #define INDENT(in) { for ( int i = in; i > 0; --i ) fprintf(stderr," "); } ! 352: static indent = 0; ! 353: ! 354: void ! 355: display_expr( Pexpr ptr, char* label, int oneline ) ! 356: { ! 357: INDENT(indent); ! 358: if ( label ) fprintf(stderr, "%s:", label); ! 359: if ( ptr == 0 ) { ! 360: fprintf(stderr, "NULL EXPR\n" ); ! 361: return; ! 362: } ! 363: fprintf(stderr,"%d",ptr->node::id); ! 364: if(!ptr->allocated)fprintf(stderr," UNALLOCATED!"); ! 365: putc(':',stderr); ! 366: char* s = OPEREP(ptr->base); ! 367: if ( s == 0 ) ! 368: fprintf(stderr, "token(%d)", ptr->base ); ! 369: else ! 370: fprintf(stderr,"%s",s); ! 371: if ( ptr->displayed ) { // recursion!!! ! 372: if ( ptr->base == NAME ) ! 373: fprintf(stderr," '%s'",Pname(ptr)->string); ! 374: fprintf(stderr," RECURSION!!!\n"); ! 375: ptr->displayed = 0; ! 376: return; ! 377: } ! 378: ptr->displayed = 1; ! 379: switch ( ptr->base ) { ! 380: case QUEST: ! 381: display_type(ptr->tp); ! 382: putc('\n',stderr); ! 383: if ( !oneline ) { ! 384: ++indent; ! 385: display_expr( ptr->cond, "cond" ); ! 386: display_expr( ptr->e1, "e1" ); ! 387: display_expr( ptr->e2, "e2" ); ! 388: --indent; ! 389: } ! 390: break; ! 391: case REF: case DOT: ! 392: display_type(ptr->tp); ! 393: putc('\n',stderr); ! 394: if ( !oneline ) { ! 395: ++indent; ! 396: display_expr( ptr->e1, "e1" ); ! 397: display_expr( ptr->mem, "mem" ); ! 398: --indent; ! 399: } ! 400: break; ! 401: case MDOT: ! 402: display_type(ptr->tp); ! 403: fprintf(stderr," string2:'%s'\n",ptr->string2?ptr->string2:""); ! 404: if ( !oneline ) { ! 405: ++indent; ! 406: display_expr( ptr->mem, "mem" ); ! 407: --indent; ! 408: } ! 409: break; ! 410: case ICALL: ! 411: fprintf(stderr," fn=='%s'",ptr->il->fct_name->string); ! 412: display_type(ptr->tp); ! 413: putc('\n',stderr); ! 414: if ( !oneline ) { ! 415: ++indent; ! 416: for ( int i = 0; i < ptr->il->i_slots; ++i ) { ! 417: ia *aa = &ptr->il->i_args[i]; ! 418: INDENT(indent); ! 419: fprintf(stderr,"arg:'%s'",aa->local&&aa->local->string?aa->local->string:""); ! 420: display_type(aa->tp); ! 421: putc('\n',stderr); ! 422: ++indent; ! 423: display_expr( aa->arg, "actual" ); ! 424: --indent; ! 425: } ! 426: display_expr( ptr->e1, "e1" ); ! 427: display_expr( ptr->e2, "e2" ); ! 428: --indent; ! 429: } ! 430: break; ! 431: case SIZEOF: ! 432: if ( ptr->tp2 ) { ! 433: putc('(',stderr); ! 434: display_type(ptr->tp2); ! 435: putc(')',stderr); ! 436: } ! 437: display_type(ptr->tp); ! 438: putc('\n',stderr); ! 439: if ( !oneline ) { ! 440: if ( ptr->e1 ) { ! 441: ++indent; ! 442: display_expr(ptr->e1,"e1"); ! 443: --indent; ! 444: } ! 445: if ( ptr->e2 ) { ! 446: ++indent; ! 447: display_expr(ptr->e2,"e2"); ! 448: --indent; ! 449: } ! 450: } ! 451: break; ! 452: case ZERO: ! 453: display_type(ptr->tp); ! 454: putc('\n',stderr); ! 455: break; ! 456: case NAME: case TNAME: case STRING: ! 457: case ICON: case ID: ! 458: case FCON: case CCON: ! 459: case IVAL: ! 460: fprintf(stderr," '%s'",(ptr->string)?ptr->string:"<0>"); ! 461: display_type(ptr->tp); ! 462: if(ptr->string2)fprintf(stderr," string2=='%s'",ptr->string2); ! 463: if ( ptr->permanent ) fprintf(stderr, " (permanent)"); ! 464: if ( ptr->base == IVAL ) fprintf(stderr, " i1==%d", ptr->i1); ! 465: putc('\n',stderr); ! 466: if ( !oneline && (ptr->base == NAME || ptr->base == TNAME) ) { ! 467: Pname n = Pname(ptr); ! 468: ++indent; ! 469: INDENT(indent); ! 470: fprintf(stderr, "n_sto==%d", n->n_sto ); ! 471: fprintf(stderr, " n_stclass==%d",n->n_stclass); ! 472: fprintf(stderr, " n_scope==%d",n->n_scope); ! 473: fprintf(stderr, " n_protected==%d\n", n->n_protect ); ! 474: INDENT(indent); ! 475: fprintf(stderr, "n_oper=='%s'", (s=OPEREP(n->base))?s:"0"); ! 476: fprintf(stderr, " n_val==%d", n->n_val ); ! 477: fprintf(stderr, " n_xref==%d",n->n_xref); ! 478: fprintf(stderr, " lex_level==%d\n", n->lex_level ); ! 479: INDENT(indent); ! 480: fprintf(stderr, "n_used==%d",n->n_used); ! 481: fprintf(stderr, " n_assigned_to==%d",n->n_assigned_to); ! 482: fprintf(stderr, " n_addr_taken==%d\n",n->n_addr_taken ); ! 483: INDENT(indent); ! 484: fprintf(stderr, "n_union==%d", n->n_union); ! 485: fprintf(stderr, " n_list=='%s'", n->n_list?n->n_list->string:"<0>" ); ! 486: fprintf(stderr, " n_qualifier=='%s'", n->n_qualifier?n->n_qualifier->string:"<0>" ); ! 487: if ( n->n_initializer ) { ! 488: fprintf(stderr, " n_initializer:\n" ); ! 489: ++indent; ! 490: display_expr( n->n_initializer ); ! 491: --indent; ! 492: } else fprintf(stderr, " n_initializer==<0>\n"); ! 493: --indent; ! 494: } ! 495: break; ! 496: case BLOCK: ! 497: ((Pstmt)ptr)->where.put(stderr); putc(' ',stderr); ! 498: putc('\n',stderr); ! 499: break; ! 500: default: ! 501: display_type(ptr->tp); ! 502: putc('\n',stderr); ! 503: if ( !oneline && ptr->base > 0 ! 504: && (ptr->base<165 || ptr->base==MEMPTR) ) { ! 505: ++indent; ! 506: display_expr( ptr->e1, "e1" ); ! 507: display_expr( ptr->e2, "e2" ); ! 508: --indent; ! 509: } ! 510: break; ! 511: } ! 512: ptr->displayed = 0; ! 513: return; ! 514: } ! 515: void ! 516: display_stmt( Pstmt ptr, char* label, int oneline ) ! 517: { ! 518: INDENT(indent); ! 519: if ( label ) fprintf(stderr, "%s:", label); ! 520: if ( ptr == 0 ) { ! 521: fprintf(stderr, "NULL STMT\n" ); ! 522: return; ! 523: } ! 524: fprintf(stderr,"%d",ptr->node::id); ! 525: if(!ptr->allocated)fprintf(stderr," UNALLOCATED!"); ! 526: putc(':',stderr); ! 527: char* s = OPEREP(ptr->base); ! 528: if ( s == 0 ) ! 529: fprintf(stderr, "token(%d)", ptr->base ); ! 530: else ! 531: fprintf(stderr,"%s",s); ! 532: if ( ptr->displayed ) { // recursion!!! ! 533: if ( ptr->base == NAME ) ! 534: fprintf(stderr," '%s'",Pname(ptr)->string); ! 535: fprintf(stderr," RECURSION!!!\n"); ! 536: ptr->displayed = 0; ! 537: return; ! 538: } ! 539: putc(' ',stderr); ! 540: ptr->where.put(stderr); ! 541: if ( oneline ) { putc('\n',stderr); return; } ! 542: ptr->displayed = 1; ! 543: switch ( ptr->base ) { ! 544: case BLOCK: ! 545: fprintf(stderr," .. "); ! 546: ptr->where2.put(stderr); ! 547: putc('\n',stderr); ! 548: ++indent; ! 549: { for( Pstmt st = ptr->s; st; st = st->s_list ) ! 550: display_stmt( ptr->s, "s" ); ! 551: } ! 552: --indent; ! 553: break; ! 554: case IF: ! 555: putc('\n',stderr); ! 556: ++indent; ! 557: display_expr(ptr->e,"cond"); ! 558: display_stmt(ptr->s,"if-clause"); ! 559: --indent; ! 560: if ( ptr->else_stmt ) { ! 561: INDENT(indent); ! 562: fprintf(stderr,"else\n"); ! 563: ++indent; ! 564: display_stmt(ptr->else_stmt,"else-clause"); ! 565: --indent; ! 566: } ! 567: break; ! 568: case DO: ! 569: putc('\n',stderr); ! 570: ++indent; ! 571: display_stmt(ptr->s,"do-stmt"); ! 572: display_expr(ptr->e,"cond"); ! 573: --indent; ! 574: break; ! 575: case WHILE: ! 576: putc('\n',stderr); ! 577: ++indent; ! 578: display_expr(ptr->e,"cond"); ! 579: display_stmt(ptr->s,"while-stmt"); ! 580: --indent; ! 581: break; ! 582: case FOR: ! 583: putc('\n',stderr); ! 584: ++indent; ! 585: display_stmt(ptr->for_init,"init"); ! 586: display_expr(ptr->e,"cond"); ! 587: display_expr(ptr->e2,"incr"); ! 588: display_stmt(ptr->s,"stmt"); ! 589: --indent; ! 590: break; ! 591: case RETURN: ! 592: putc('\n',stderr); ! 593: ++indent; ! 594: display_expr(ptr->e,"e"); ! 595: --indent; ! 596: break; ! 597: case SM: ! 598: putc('\n',stderr); ! 599: ++indent; ! 600: display_expr(ptr->e,"e"); ! 601: --indent; ! 602: break; ! 603: default: ! 604: putc('\n',stderr); ! 605: break; ! 606: } ! 607: ptr->displayed = 0; ! 608: return; ! 609: } ! 610: ! 611: void ! 612: display_namelist( Plist nl, char* s, int verbose ) ! 613: { ! 614: error('d',"namelist: %s",s?s:""); ! 615: ++indent; ! 616: for ( Plist l = nl; l; l = l->l ) { ! 617: Pname n = l->f; ! 618: INDENT(indent); ! 619: fprintf(stderr," %d",n); ! 620: error('D'," %n %k n_key %d",n,n?n->tp->base:0,n?n->n_key:0); ! 621: if ( verbose ) { ! 622: ++indent; ! 623: display_expr(n); ! 624: --indent; ! 625: } ! 626: } ! 627: --indent; ! 628: } ! 629: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.