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