Annotation of researchv10no/cmd/cfront/ocfront/error.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.