Annotation of researchv10no/cmd/cfront/optcfront/cfront.h, revision 1.1

1.1     ! root        1: /*ident        "@(#)ctrans:src/cfront.h        1.14" */
        !             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:        When reading cfront code please remember that C++ was not available
        !            11:        when it was originally written. Out of necessity cfront is written
        !            12:        in a style that takes advantage of only few of C++'s features.
        !            13: 
        !            14:        WARNING: This program relies on non-initialized class members being ZERO.
        !            15:        This will be true as long as they are allocated using the "new" operator
        !            16:        from alloc.c
        !            17: 
        !            18: cfront.h:
        !            19: 
        !            20:        Here is all the class definitions for cfront, and most of the externs
        !            21: 
        !            22: ***********************************************************************/
        !            23: 
        !            24: #ifndef _CFRONT_H
        !            25: #define _CFRONT_H
        !            26: 
        !            27: #include "token.h"
        !            28: #include "typedef.h"
        !            29: 
        !            30: #ifndef GRAM
        !            31: extern char* prog_name;                // compiler name and version
        !            32: extern int inline_restr;       // inline expansion restrictions 
        !            33: #endif
        !            34: 
        !            35: extern TOK     tlex();
        !            36: extern Pname   syn();
        !            37: 
        !            38: extern void    ext(int);
        !            39: 
        !            40: extern char*   make_name(TOK);
        !            41: extern void    make_dummy();
        !            42: extern Pname   dummy_fct;
        !            43: extern Pname    really_dominate(Pname, Pname, bit);
        !            44: extern int      exact1(Pname, Ptype);
        !            45: extern char*   strdup(const char*);
        !            46: 
        !            47: extern int friend_check(Pclass start,Pclass stop, Pfct f);
        !            48: 
        !            49: struct loc             // a source file location
        !            50: {
        !            51:        short   file;   // index into file_name[], or zero
        !            52:        short   line;
        !            53: #ifndef GRAM
        !            54:        void    put(FILE*);
        !            55:        void    putline();
        !            56: #endif
        !            57: };
        !            58: 
        !            59: extern Loc curloc;
        !            60: extern int curr_file;
        !            61: extern char* src_file_name;
        !            62: extern loc noloc; // dummy null location
        !            63: extern bit binary_val;
        !            64: extern bit stmtno;
        !            65: 
        !            66: struct ea {    // fudge portable printf-like formatting for error()
        !            67:        union {
        !            68:                void* p;
        !            69:                long i;
        !            70:        };
        !            71: 
        !            72:        ea(const void* pp) { p = pp; }
        !            73:        ea(long ii)   { i = ii; }
        !            74:        ea() {}
        !            75: };
        !            76: 
        !            77: extern ea* ea0;
        !            78: 
        !            79: overload error;
        !            80: int error(const char*);
        !            81: int error(const char*, const ea&, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
        !            82: int error(int, const char*);
        !            83: int error(int, const char*, const ea&, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
        !            84: int error(loc*, const char*, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
        !            85: int error(int, loc*, const char*, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
        !            86: extern char emode;
        !            87: 
        !            88: extern int error_count;
        !            89: extern int vtbl_opt;
        !            90: extern int debug_opt;
        !            91: extern int warning_opt;
        !            92: extern int ansi_opt;
        !            93: extern int strict_opt;
        !            94: extern FILE* out_file;
        !            95: extern FILE* in_file;
        !            96: extern char scan_started;
        !            97: 
        !            98: extern int bl_level;
        !            99: extern Ptable ktbl;            // keywords and typedef names
        !           100: extern Ptable gtbl;            // global names
        !           101: extern Ptable ptbl;            
        !           102: extern Ptable lcl_tbl;
        !           103: extern char* oper_name(TOK);
        !           104: extern Pname def_name;
        !           105: extern Pname pdef_name;
        !           106: extern Pclass ccl;
        !           107: extern Pbase defa_type;
        !           108: extern Pbase moe_type;
        !           109: extern Pbase mptr_type;
        !           110: 
        !           111: #ifndef GRAM
        !           112: extern Pstmt Cstmt;            // current statement, or 0
        !           113: extern Pname Cdcl;             // name currently being declared, or 0
        !           114: 
        !           115: extern Pbase any_type;
        !           116: extern int largest_int;
        !           117: #endif
        !           118: 
        !           119: extern Pbase int_type;
        !           120: extern Pbase char_type;
        !           121: extern Pbase short_type;
        !           122: extern Pbase long_type;
        !           123: extern Pbase uint_type;
        !           124: extern Pbase float_type;
        !           125: extern Pbase double_type;
        !           126: extern Pbase ldouble_type;
        !           127: extern Pbase void_type;
        !           128: 
        !           129: #ifndef GRAM
        !           130: extern Pbase uchar_type;
        !           131: extern Pbase ushort_type;
        !           132: extern Pbase ulong_type;
        !           133: extern Ptype Pchar_type;
        !           134: extern Ptype Pint_type;
        !           135: extern Ptype Pvptr_type;
        !           136: extern Ptype Pfctvec_type;
        !           137: extern Ptype Pvoid_type;
        !           138: extern Pbase zero_type;
        !           139: extern Ptype size_t_type;
        !           140: 
        !           141: extern int byte_offset;
        !           142: extern int bit_offset;
        !           143: extern int max_align;
        !           144: extern int const_save;
        !           145: extern int const_ptr;
        !           146: extern int cm_const_save;
        !           147: extern bit const_problem;
        !           148: #endif
        !           149: 
        !           150: extern Pexpr dummy;    /* the empty expression */
        !           151: extern Pexpr zero;
        !           152: extern Pexpr one;
        !           153: extern Pname sta_name; /* qualifier for unary :: */
        !           154: 
        !           155: #define DEL(p) if (p && (p->permanent==0)) p->del()
        !           156: #define PERM(p) p->permanent=1
        !           157: #define UNPERM(p) p->permanent=0
        !           158: 
        !           159: struct node {
        !           160:        TOK     base;
        !           161:        bit     permanent;
        !           162:         bit     baseclass; // base classes have NAME in their base ...
        !           163: #ifdef DBG
        !           164:        bit     displayed;      // avoid infinite recursion in display functions
        !           165:        bit     allocated;      // set when not on free list
        !           166:        long    id;
        !           167: #endif
        !           168: };
        !           169: #ifdef DBG
        !           170: extern long node_id;
        !           171: extern int Adebug;
        !           172: #define DBID() { node::id = ++::node_id; node::allocated=1; displayed=0; \
        !           173:        if(Adebug>=1)fprintf(stderr,"\n*** allocated %d base %d\n",id,base); }
        !           174: #else
        !           175: #define DBID() /**/
        !           176: #endif
        !           177: 
        !           178: struct table : node {
        !           179: /*     a table is a node only to give it a "base" for debugging */
        !           180:        bit     init_stat;      /* ==0 if block(s) of table not simplified,
        !           181:                                   ==1 if simplified but had no initializers,
        !           182:                                   ==2 if simplified and had initializers.
        !           183:                                */
        !           184:        short   size;
        !           185:        short   hashsize;
        !           186:        short   free_slot;      /* next free slot in entries */
        !           187:        Pname*  entries;
        !           188:        short*  hashtbl;
        !           189:        Pstmt   real_block;     /* the last block the user wrote,
        !           190:                                   not one of the ones cfront created
        !           191:                                */
        !           192:        Ptable  next;           /* table for enclosing scope */
        !           193:        Pname   t_name;         /* name of the table */
        !           194: 
        !           195:        static Ptable table_free;
        !           196:        void* operator new(size_t);
        !           197:        void operator delete(void*,size_t);
        !           198: 
        !           199:        table(short, Ptable, Pname);
        !           200:        ~table();
        !           201: 
        !           202:        Pname   look(char*, TOK);
        !           203:        Pname   insert(Pname, TOK);
        !           204: #ifndef GRAM
        !           205:        void    grow(int);
        !           206:        void    set_name(Pname n)       { t_name = n; };
        !           207:        Pname   get_mem(int);
        !           208:        int     max()                   { return free_slot-1; };
        !           209:        void    dcl_print(TOK,TOK);
        !           210: #endif
        !           211:        void    del();
        !           212: };
        !           213: 
        !           214: #ifndef GRAM
        !           215: extern bit Nold;
        !           216: extern bit vec_const, fct_const;
        !           217: #endif
        !           218: 
        !           219: extern void restore();
        !           220: extern void set_scope(Pname);
        !           221: extern Plist modified_tn;
        !           222: 
        !           223: // local class
        !           224: extern Plist local_tn;
        !           225: extern Plist local_blk;
        !           226: extern Plist local_class;
        !           227: extern void local_hide( Pname ); 
        !           228: extern char *make_local_name(Pclass, int=0);
        !           229: 
        !           230: // nested type
        !           231: extern Plist nested_tn;
        !           232: extern Plist nested_type;
        !           233: extern Pname curr_scope; 
        !           234: extern Pname curr_fct; 
        !           235: extern void nested_hide(Pname); 
        !           236: extern int is_empty(Pclass,bit=0);
        !           237: 
        !           238: extern Pbase start_cl(TOK, Pname, Pbcl);
        !           239: extern void end_cl();
        !           240: extern Pbase end_enum(Pname, nlist*);
        !           241: 
        !           242: /************ types : basic types, aggregates, declarators ************/
        !           243: 
        !           244: #ifndef GRAM
        !           245: extern bit new_type;
        !           246: extern Pname cl_obj_vec;
        !           247: extern Pname eobj;
        !           248: #endif
        !           249: 
        !           250: 
        !           251: #define DEFINED 01     /* definition fed through ?::dcl() */
        !           252: #define SIMPLIFIED 02  /* in ?::simpl() */
        !           253: #define DEF_SEEN 04    /* definition seen, but not processed */
        !           254: #define REF_SEEN 010   /* reference seen (classdef) */
        !           255:                        /*   used for class members in norm.c */
        !           256: #define IN_ERROR 010
        !           257: 
        !           258: struct type : node {
        !           259:        bit     defined;        /* flags DEF_SEEN, DEFINED, SIMPLIFIED, IN_ERROR
        !           260:                                        not used systematically yet
        !           261:                                */
        !           262:        bit     lex_level;
        !           263:        Pclass  in_class;       // nested type
        !           264:        Pname   in_fct;         // local type
        !           265:        char    *lcl;
        !           266:        char    *nested_sig;
        !           267:        char    *signature(char*);
        !           268:        Ptype   tlist;
        !           269:        bit     check(Ptype, TOK);
        !           270: 
        !           271:        // encapsulate casts
        !           272:        inline Pclass classtype(); 
        !           273:        inline Penum enumtype(); 
        !           274:        inline Ptype bname_type();
        !           275:        inline Pname bname();
        !           276: #ifndef GRAM
        !           277:        void    print();
        !           278:        void    dcl_print(Pname);
        !           279:        void    base_print();
        !           280: 
        !           281:        Pname   is_cl_obj();    /* sets cl_obj_vec */
        !           282:        Pptr    is_ref();
        !           283:        Pptr    is_ptr();
        !           284:        Pptr    is_ptr_or_ref();
        !           285:        bit     is_unsigned();
        !           286:        void    dcl(Ptable);
        !           287:        int     tsizeof(int = 0);
        !           288:        bit     tconst();
        !           289:        TOK     set_const(bit);
        !           290:        int     align();
        !           291:        TOK     kind(TOK,TOK);
        !           292:        TOK     integral(TOK oo)        { return kind(oo,'I'); };
        !           293:        TOK     numeric(TOK oo)         { return kind(oo,'N'); };
        !           294:        TOK     num_ptr(TOK oo)         { return kind(oo,'P'); };
        !           295:        bit     vec_type();
        !           296:        Ptype   deref();
        !           297:        inline Pptr     addrof();
        !           298:        Pfct    memptr();
        !           299: #endif
        !           300:        void    del();
        !           301: };
        !           302: 
        !           303: struct enumdef : type {        /* ENUM */
        !           304:        bit     e_body;
        !           305:        short   no_of_enumerators;
        !           306:        unsigned char strlen;   // strlen(string)
        !           307:        char*   string;         // name of enum
        !           308:        Pname   mem;
        !           309:        Pbase   e_type;         // type representing the enum
        !           310:                enumdef(Pname n)        { base=ENUM; mem=n; };
        !           311: #ifndef GRAM
        !           312:        void    print();
        !           313:        void    dcl_print(Pname);
        !           314:        void    dcl(Pname, Ptable);
        !           315:        void    simpl();
        !           316: #endif
        !           317: };
        !           318: 
        !           319: struct velem {
        !           320:        Pname   n;
        !           321:        int     offset;
        !           322: };
        !           323: 
        !           324: struct virt : node {
        !           325:        Pvirt   next;
        !           326:        int     n_init;
        !           327:        velem*  virt_init;      // vector of vtbl initializers (zero-terminated)
        !           328:        Pclass  vclass;         // for class vclass
        !           329:        char*   string;
        !           330:        bit     is_vbase;       // vtable for virtual base
        !           331:        bit     printed;
        !           332:        virt(Pclass cl, velem* v, char* s, bit flag, int ni) {base = XVIRT; vclass=cl; virt_init=v; string=s; is_vbase=flag; next=0; n_init = ni;}
        !           333: };
        !           334: 
        !           335: enum { C_VPTR=1, C_XREF=2, C_ASS=4, C_VBASE=8 };
        !           336: 
        !           337: // An enumeration of the types of classes for Objectstore
        !           338: enum class_type_enum { vanilla_class,   // A regular class
        !           339:                        template_class,
        !           340:                        instantiated_template_class,
        !           341:                        uninstantiated_template_class,
        !           342:                        relationship_class,
        !           343:                        defining_class 
        !           344: };
        !           345: class type_extension;
        !           346: 
        !           347: struct classdef : type {       /* CLASS */
        !           348:         class_type_enum  class_base; // An extension of "base" to further define
        !           349:                                 // the real subtype of the class
        !           350:        bit     c_body;         /* print definition only once */
        !           351:        TOK     csu;            /* CLASS, STRUCT, UNION, or ANON */
        !           352:        bit     obj_align;
        !           353:        bit     c_xref;
        !           354:                // 1 set:       has vptr(s) 
        !           355:                // 2 set:       X(X&) exists
        !           356:                // 4 set:       operator=(X&) exists
        !           357:                // 8 set:       has vbaseptr(s)
        !           358:                
        !           359:        bit     virt_count;     // number of virtual functions
        !           360:                                // starting at max base class virt_count in
        !           361:        bit     virt_merge;     // set when no virtual functions, but
        !           362:                                // need to merge virtual base classes
        !           363:        bit     c_abstract;     // abstract class: don't instantiate
        !           364:        bit     has_vvtab;      // set if class has vtable from virtual base
        !           365:        unsigned char strlen;   // strlen(string)
        !           366:        Pbcl    baselist;       // list of base classes
        !           367:        char*   string;         /* name of class */
        !           368:        Pname   mem_list;
        !           369:        Ptable  memtbl;
        !           370:        int     obj_size;
        !           371:        int     real_size;      /* obj_size - alignment waste */
        !           372:        Plist   friend_list;
        !           373:        Pname   pubdef;
        !           374:        Plist   tn_list;        // list of member names hiding type names
        !           375:        Plist   nest_list;      // list of nested types
        !           376:        Ptype   this_type;
        !           377:        Pvirt   virt_list;      // vtbl initializers
        !           378:        Pname   c_ctor;         // constuctor:
        !           379:                                // possibly overloaded, possibly inherited
        !           380:        Pname   c_dtor;         // destructor
        !           381:        Pname   c_itor;         /* constructor X(X&) */
        !           382:        Pname   conv;           /* operator T() chain */
        !           383:        struct toknode *c_funqf, *c_funqr; // token Q for parsing function defs after class def
        !           384: 
        !           385:        classdef(TOK);
        !           386:        ~classdef();
        !           387:        TOK     is_simple()     { return (csu==CLASS)?0:csu; };
        !           388: #ifndef GRAM
        !           389:        void    print();
        !           390:        void    dcl_print(Pname);
        !           391:        void    simpl();
        !           392: 
        !           393:        void    print_members();
        !           394:        void    dcl(Pname, Ptable);
        !           395: 
        !           396: //     bit     has_friend(Pname);
        !           397:        bit     has_friend(Pclass);
        !           398:        bit     has_friend(Pfct);
        !           399: 
        !           400:        bit     has_base(Pclass cl);
        !           401:        bit     baseof(Pname);
        !           402:        bit     baseof(Pclass);
        !           403:        Pclass  is_base(char*);
        !           404: 
        !           405:        Pname   has_oper(TOK);
        !           406:        Pname   has_ctor()      { return c_ctor; }
        !           407:        Pname   has_dtor()      { return c_dtor; }
        !           408:        Pname   has_itor()      { return c_itor; }
        !           409:        Pname   has_ictor();
        !           410:        Pname   make_itor(int);
        !           411:        Pexpr   find_name(char*, Pclass, int=0);
        !           412:        int     do_virtuals(Pvirt, char*, int, bit);
        !           413:        int     all_virt(Pclass, char*, int, bit);
        !           414:        void    add_vtbl(velem*, char*, bit, int);
        !           415:        void    print_all_vtbls(Pclass);
        !           416:        void    print_vtbl(Pvirt);
        !           417:        void    really_print(Pvirt);
        !           418:        int     check_dup(Pclass, TOK);
        !           419:        int     has_allocated_base(Pclass);
        !           420:        char    *has_allocated_base(char*);
        !           421:        int     get_offset(char*);
        !           422:        Pbcl    get_base(char*);
        !           423:        Pexpr   get_vptr_exp(char*);
        !           424:        Pexpr   find_in_base(char*, Pclass);
        !           425:         void    modify_inst_names(char *s); // Adjust ctor names for instantiation
        !           426:         bit     parametrized_class();
        !           427:         bit    same_class(Pclass p);
        !           428: #endif
        !           429: };
        !           430: 
        !           431: #ifndef GRAM
        !           432: 
        !           433: class clist {
        !           434:        Pclass cl;
        !           435:        clist* next;
        !           436: public:
        !           437:        clist(Pclass c, clist* n) { cl=c; next=n; }
        !           438:        int onlist(Pclass);
        !           439:        void clear();
        !           440: };
        !           441:        
        !           442: extern clist * vcllist;
        !           443: 
        !           444: struct vl {
        !           445:        struct vl* next;
        !           446:        Pvirt vt;
        !           447:        classdef* cl;
        !           448: 
        !           449:        vl(classdef* c, Pvirt v, struct vl* n)
        !           450:                { cl = c; vt = v; next = n; }
        !           451: };
        !           452: 
        !           453: extern vl* vlist;
        !           454: 
        !           455: extern int nin;
        !           456: extern int Nvis;
        !           457: extern int Noffset;
        !           458: extern TOK Nvirt;
        !           459: extern Pexpr Nptr;
        !           460: extern Pbcl Nvbc_alloc;
        !           461: extern char *Nalloc_base;
        !           462: extern Pexpr rptr(Ptype,Pexpr,int);
        !           463: extern Pexpr vbase_args(Pfct, Pname);
        !           464: extern Pexpr cdvec(Pname,Pexpr,Pclass,Pname,int,Pexpr,Pexpr=0);
        !           465: 
        !           466: extern Pexpr find(char*, Pclass, int);
        !           467: extern Pexpr find_name(Pname, Pclass, Ptable, int, Pname);
        !           468: extern Pname find_virtual(Pclass,Pname);
        !           469: extern Pname vfct(Pclass, char*);
        !           470: extern int Vcheckerror;
        !           471: extern int ignore_const;       
        !           472: 
        !           473: extern int mex;
        !           474: extern Pclass mec;
        !           475: extern Pclass tcl;
        !           476: #endif
        !           477: 
        !           478: struct basetype : type
        !           479:        /*      ZTYPE CHAR SHORT INT LONG FLOAT DOUBLE
        !           480:                FIELD EOBJ COBJ TYPE ANY
        !           481:        */
        !           482:        /*      used for gathering all the attributes
        !           483:                for a list of declarators
        !           484: 
        !           485:                ZTYPE is the (generic) type of ZERO
        !           486:                ANY is the generic type of an undeclared name
        !           487:        */
        !           488: {
        !           489:        bit     b_unsigned;
        !           490:        bit     b_signed;
        !           491:        bit     b_volatile;
        !           492:        bit     b_const;
        !           493:        bit     b_typedef;
        !           494:        bit     b_inline;
        !           495:        bit     b_virtual;
        !           496:        bit     b_short;
        !           497:        bit     b_long;
        !           498:        bit     b_bits;         /* number of bits in field */
        !           499:        bit     b_offset;       // bit offset of field
        !           500:        TOK     b_sto;          /* AUTO STATIC EXTERN REGISTER 0 */
        !           501:        Pname   b_name;         /* name of non-basic type */
        !           502:        Ptable  b_table;        /* memtbl for b_name, or 0 */
        !           503:        Pname   b_xname;        /* extra name */
        !           504:        union {
        !           505:        Ptype   b_fieldtype;
        !           506:        char*   b_linkage;
        !           507:        };
        !           508: 
        !           509:        basetype(TOK, Pname);
        !           510: 
        !           511:        Pbase   type_adj(TOK);
        !           512:        Pbase   base_adj(Pbase);
        !           513:        Pbase   name_adj(Pname);
        !           514:        Pname   aggr();
        !           515:        Pbase   check(Pname);
        !           516: #ifndef GRAM
        !           517:        void    dcl_print();
        !           518:        Pbase   arit_conv(Pbase);
        !           519:         bit     parametrized_class();
        !           520: #endif
        !           521:        int     discriminator(int); // union discriminator fcn 
        !           522: };
        !           523: 
        !           524: enum Linkage { linkage_default, linkage_C, linkage_Cplusplus };
        !           525: extern Linkage linkage;
        !           526: void set_linkage(char*);
        !           527: 
        !           528: struct fct : type              // FCT
        !           529: {
        !           530:        TOK     nargs;
        !           531:        TOK     nargs_known;    // 0 if unknown, 1 if known, or ELLIPSIS
        !           532:        bit     last_stmt;
        !           533:        bit     f_vdef;         // 1 if this is the first virtual definition
        !           534:                                // of this function
        !           535:        bit     f_inline;       // 1 if inline, 2 if being expanded, else 0
        !           536:        bit     f_const;        // one if member function that may be called for
        !           537:                                // a const object, else 0
        !           538:        bit     f_static;       // 1 if static member function, else 0
        !           539:        short   f_virtual;      // index in virtual table, or 0 meaning non-virtual
        !           540:        short   f_imeasure;     // some measure of the size of an inline function
        !           541:        Ptype   returns;
        !           542:        Pname   argtype;
        !           543:        Ptype   s_returns;
        !           544:        Pname   f_this;
        !           545:        Pclass  memof;          // member of class memof
        !           546:        Pblock  body;
        !           547:        Pname   f_init;         // base and member initializers
        !           548:        Pexpr   f_expr;         // body expanded into an expression
        !           549:        Pexpr   last_expanded;
        !           550:        Pname   f_result;       // extra second argument of type X&
        !           551:        Pname   f_args;         // argument list including args added by cfront
        !           552:        Linkage f_linkage;
        !           553:        char*   f_signature;    // character encoding of function type
        !           554:        Plist local_class;      // list of local classes
        !           555:        static Pfct fct_free;
        !           556:        void*   operator new(size_t);
        !           557:        void    operator delete(void*,size_t);
        !           558: 
        !           559:        fct(Ptype, Pname, TOK);
        !           560:        void    argdcl(Pname,Pname);
        !           561: #ifndef GRAM
        !           562:        Ptype   normalize(Ptype);
        !           563:        void    dcl_print();
        !           564:        void    dcl(Pname);
        !           565:        Pexpr   base_init(Pclass, Pexpr, Ptable, int);
        !           566:        Pexpr   mem_init(Pname, Pexpr, Ptable);
        !           567:        void    init_bases(Pclass, Pexpr);
        !           568:        bit     declared() { return nargs_known; };
        !           569:        void    simpl();
        !           570:        int     ctor_simpl(Pclass, Pexpr);
        !           571:        Pstmt   dtor_simpl(Pclass, Pexpr);
        !           572:        Pexpr   expand(Pname,Ptable,Pexpr);
        !           573:        void    sign();
        !           574: #endif
        !           575:        int     discriminator(int); // union discriminator fcn 
        !           576: };
        !           577: 
        !           578: struct name_list : node {
        !           579:        Pname   f;
        !           580:        Plist   l;
        !           581:         name_list(Pname ff, Plist ll) { base = XNLIST; f=ff; l=ll; };
        !           582: };
        !           583: 
        !           584: #ifndef GRAM
        !           585: struct gen : type {            // OVERLOAD
        !           586:        Plist   fct_list;
        !           587: 
        !           588:        gen() { base = OVERLOAD; }
        !           589:        Pname   add(Pname);
        !           590:        Pname   find(Pfct, bit);
        !           591:        Pname   match(Pname, Pfct, bit);
        !           592: };
        !           593: #endif
        !           594: 
        !           595: struct pvtyp : type {
        !           596:        Ptype typ;
        !           597: };
        !           598: 
        !           599: struct vec : pvtyp             // VEC
        !           600:                                // typ [ dim ]
        !           601: {
        !           602:        Pexpr   dim;
        !           603:        int     size;   
        !           604: 
        !           605:        static Pvec vec_free;
        !           606:        void*   operator new(size_t);
        !           607:        void    operator delete(void*,size_t);
        !           608: 
        !           609:        vec(Ptype t, Pexpr e) { base=VEC; typ=t; dim=e; DBID(); }
        !           610: #ifndef GRAM
        !           611:        Ptype   normalize(Ptype);
        !           612: #endif
        !           613: };
        !           614: 
        !           615: struct ptr : pvtyp             // PTR, RPTR i.e. reference
        !           616: {
        !           617:        Pclass  memof;          // pointer to member of memof: memof::*
        !           618:        bit     rdo;            // "*const"
        !           619: 
        !           620:        static Pptr ptr_free;
        !           621:        void*   operator new(size_t);
        !           622:        void    operator delete(void*,size_t);
        !           623: 
        !           624:        ptr(TOK b, Ptype t) { base=b; typ=t; DBID(); }
        !           625: #ifndef GRAM
        !           626:        Ptype   normalize(Ptype);
        !           627: #endif
        !           628: };
        !           629: 
        !           630: #ifndef GRAM
        !           631: inline Pptr type::addrof() { return new ptr(PTR,this); }
        !           632: 
        !           633: extern bit vrp_equiv;
        !           634: #endif
        !           635: 
        !           636: 
        !           637: /****************************** constants ********************************/
        !           638: 
        !           639:                /* STRING ZERO ICON FCON CCON ID */
        !           640:                /* IVAL FVAL LVAL */
        !           641: 
        !           642: /***************************** expressions ********************************/
        !           643: 
        !           644: #ifndef GRAM
        !           645: extern Pexpr next_elem();
        !           646: extern void new_list(Pexpr);
        !           647: extern void list_check(Pname, Ptype, Pexpr, Ptable=0);
        !           648: extern Pexpr ref_init(Pptr,Pexpr,Ptable);
        !           649: extern Pexpr class_init(Pexpr,Ptype,Pexpr,Ptable);
        !           650: extern Pexpr check_cond(Pexpr, TOK, Ptable);
        !           651: extern Pexpr ptof(Pfct,Pexpr,Ptable);
        !           652: extern void dosimpl(Pexpr, Pname);
        !           653: extern int ref_initializer;
        !           654: extern int ntok;
        !           655: 
        !           656: extern void ptbl_init(int);
        !           657: extern void ptbl_add_pair(char*,char*);
        !           658: extern char *ptbl_lookup(char*);
        !           659: extern char *st_name(char*);
        !           660: #endif
        !           661: 
        !           662: struct expr : node     /* PLUS, MINUS, etc. */
        !           663:        /* IMPORTANT:   all expressions are of sizeof(expr) */
        !           664:        /*      DEREF           =>      *e1 (e2==0) OR e1[e2]
        !           665:                UMINUS          =>      -e2
        !           666:                INCR (e1==0)    =>      ++e2
        !           667:                INCR (e2==0)    =>      e1++
        !           668:                CM              =>      e1 , e2
        !           669:                ILIST           =>      LC e1 RC   (an initializer list)
        !           670:                a Pexpr may denote a name
        !           671:        */
        !           672: {
        !           673:        union {
        !           674:                Ptype   tp;
        !           675:                char    *string4;
        !           676:        };
        !           677:        union {
        !           678:                Pexpr   e1;
        !           679:                long    i1;
        !           680:                char*   string;
        !           681:        };
        !           682:        union {
        !           683:                Pexpr   e2;
        !           684:                int     i2;
        !           685:                char*   string2;
        !           686:                Pexpr   n_initializer;
        !           687:                Ptype   tpdef;  // local and nested typedef info
        !           688:        };
        !           689:        union {                 /* used by the derived classes */
        !           690:                Ptype   tp2;    
        !           691:                Pname   fct_name;
        !           692:                Pexpr   cond;
        !           693:                Pexpr   mem;
        !           694:                Ptype   as_type;
        !           695:                Ptable  n_table;
        !           696:                Pin     il;
        !           697:                Pname   query_this; 
        !           698:        };
        !           699: 
        !           700:        static Pexpr expr_free;
        !           701:        void* operator new(size_t);
        !           702:        void operator delete(void*,size_t);
        !           703:        expr(TOK, Pexpr, Pexpr);
        !           704:        void    del();
        !           705: #ifndef GRAM
        !           706:        void    print();
        !           707:         Pexpr   typ0(Ptable);
        !           708:        Pexpr   typ(Ptable);
        !           709:        long    eval();
        !           710:        unsigned long ueval(long,long);
        !           711:        int     lval(TOK);
        !           712:        Ptype   call_fct(Ptable);
        !           713:        Pexpr   address();
        !           714:        Pexpr   contents();
        !           715:        void    simpl();
        !           716:        Pexpr   expand();
        !           717:        bit     not_simple();
        !           718:        Pexpr   try_to_overload(Ptable);
        !           719:        Pexpr   docast(Ptable);
        !           720:        Pexpr   dovalue(Ptable);
        !           721:        Pexpr   donew(Ptable);
        !           722:        void    simpl_new();
        !           723:        void    simpl_delete();
        !           724: #endif
        !           725:        int     discriminator(int); // union discriminator fcn 
        !           726: };
        !           727: 
        !           728: struct texpr : expr {          // CAST NEW VALUE (also ICALL)
        !           729:        texpr(TOK bb, Ptype tt, Pexpr ee) : expr (bb,ee,0) { tp2=tt; }
        !           730: };
        !           731: 
        !           732: struct cast : expr {           // CAST
        !           733:        cast(Ptype tt, Pexpr ee) : expr (CAST,ee,0) { tp=tp2=tt; }
        !           734: };
        !           735: 
        !           736: struct ival : expr {           // IVAL
        !           737:        ival(long ii) : expr (IVAL,0,0) { i1 = ii;}
        !           738: };
        !           739: 
        !           740: struct call : expr {           // CALL
        !           741:        call(Pexpr aa, Pexpr bb) : expr (CALL,aa,bb) { }
        !           742: #ifndef GRAM
        !           743:        void    simpl();
        !           744:        Pexpr   expand(Ptable);
        !           745: #endif
        !           746: };
        !           747: 
        !           748: struct qexpr : expr {          // QUEST        cond ? e1 : e2
        !           749:        qexpr(Pexpr ee, Pexpr ee1, Pexpr ee2) : expr (QUEST,ee1,ee2) { cond=ee; }
        !           750: };
        !           751: 
        !           752: struct ref : expr {            // REF DOT      e1->mem OR e1.mem
        !           753:        ref(TOK ba, Pexpr a, Pexpr b) : expr (ba,a,0) { mem=b; }
        !           754: };
        !           755: 
        !           756: struct mdot : expr {           // MDOT         a.b
        !           757:        mdot(char* a, Pexpr b) : expr (MDOT,0,0) { string2=a; mem=b; }
        !           758: };
        !           759: 
        !           760: struct text_expr : expr        {       // TEXT (vtbl_name)
        !           761:        text_expr(char* a, char* b) : expr (TEXT,0,0)
        !           762:        { string=a; string2=b; }
        !           763: };
        !           764: char* vtbl_name(char*,char*);
        !           765: /************************* names (are expressions) ****************************/
        !           766: 
        !           767: struct basecl : node { // NAME         => base class
        !           768:                        // VIRTUAL      => virtual base class
        !           769:        TOK     ppp;            // private / public / protected
        !           770:        bit     allocated;      // allocated virtual base
        !           771:         bit     promoted;       // non-explicit, promoted virtual base
        !           772:        Pclass  bclass;
        !           773:        Pexpr   init;           // base class initializers for ctors
        !           774:        int     ptr_offset;     // pointer's relative position in derived class
        !           775:        int     obj_offset;     // object's relative position in derived class
        !           776:        Pname*  virt_init;      // vector of vtbl table initializers
        !           777:        basecl* next;
        !           778: 
        !           779:         basecl(Pclass cl, basecl* n) { baseclass=1; bclass=cl; next=n; promoted=0; init=0;}
        !           780: };
        !           781: 
        !           782: enum template_formal_types { 
        !           783:        template_type_formal =1 , template_expr_formal,
        !           784:         template_stmt_tree_formal, template_expr_tree_formal,
        !           785:         template_actual_arg_dummy // used during the parse
        !           786: };
        !           787: extern TOK ppbase;
        !           788: 
        !           789: struct name : expr {   // NAME TNAME and the keywords in the ktbl
        !           790:        TOK     n_oper;         // name of operator or 0
        !           791:        TOK     n_sto;          // EXTERN STATIC AUTO REGISTER ENUM 0
        !           792:        TOK     n_stclass;      // STATIC AUTO REGISTER 0
        !           793:        TOK     n_scope;        // EXTERN STATIC FCT ARG PUBLIC 0 
        !           794:        TOK     n_key;  /* for names in table: class */
        !           795:        bit     n_evaluated;    // 0 or n_val holds the value
        !           796:        bit     n_xref;         // argument of type X(X&)
        !           797:        unsigned char   lex_level;
        !           798:        TOK     n_protect;      // PROTECTED (<=>n_scope==0) or 0
        !           799:        bit     n_dcl_printed;  // 1: declaration printed
        !           800:                                // 2: definition printed
        !           801:                                // 0: declaration not printed
        !           802: 
        !           803:         // if this is set it implies that n_template_arg == template_type_formal
        !           804:        char    n_template_arg; // One of template_formal_types for template arguments
        !           805:         bit     n_template_formal_must_be_class ;
        !           806:         bit     n_redefined ;   // set only for PT function names where an explict
        !           807:                                 // definition was provided.
        !           808:         char    *n_anon;       // nested anonymous unions
        !           809:        short   n_union;        // 0, or union index
        !           810:        short   n_addr_taken;
        !           811:        short   n_used;
        !           812:        short   n_assigned_to;
        !           813:        Loc     where;
        !           814:        int     n_offset;       // byte offset in frame or struct
        !           815:        Pname   n_list;
        !           816:        Pname   n_tbl_list;
        !           817:        char    *n_gen_fct_name; // used to be punned with n_tbl_list.
        !           818:         char    *n_template_arg_string ; // the mangled string name
        !           819:        union {
        !           820:        /* 
        !           821:         * n_qualifier: name of containing class
        !           822:         * n_realscope: for labels (always entered in function table) 
        !           823:          *             the table for the actual scope in which label occurred.
        !           824:         * syn_class: lex table only
        !           825:         */
        !           826:                Pname   n_qualifier;    
        !           827:                 Ptable  n_realscope;    
        !           828:                int     syn_class; 
        !           829:         };
        !           830: 
        !           831:        /* n_val: the value of n_initializer; also the argument 
        !           832:         * number for inline arguments (when base == ANAME) */
        !           833:        long    n_val;          
        !           834:        static Pname name_free;
        !           835:        void* operator new(size_t);
        !           836:        void operator delete(void*,size_t);
        !           837:        name(char* =0);
        !           838: 
        !           839: 
        !           840:        Pname   normalize(Pbase, Pblock, bit);
        !           841:        Pname   tdef();
        !           842:        Pname   tname(TOK);
        !           843:        void    hide();
        !           844:        void    unhide()        { n_key=0; n_list=0; };
        !           845: #ifndef GRAM
        !           846:        Pname   dcl(Ptable,TOK);
        !           847:        int     no_of_names();
        !           848:        void    use()           { n_used++; };
        !           849:        void    assign();
        !           850:        void    take_addr();
        !           851:        void    check_oper(Pname);
        !           852:        void    simpl();
        !           853:        void    print();
        !           854:        void    dcl_print(TOK);
        !           855:        void    field_align();
        !           856:        Pname   dofct(Ptable,TOK);
        !           857: #endif
        !           858:        void    del();
        !           859:        inline Pfct fct_type();  
        !           860:        int     discriminator(int); // union discriminator fcn 
        !           861: };
        !           862: 
        !           863: extern int friend_in_class;
        !           864: extern int in_class_dcl;
        !           865: 
        !           866: // from parser
        !           867: extern int in_class_decl;
        !           868: extern int parsing_class_members;
        !           869: extern int in_mem_fct;
        !           870: extern int in_arg_list;
        !           871: extern Ptype in_typedef;
        !           872: extern int     defer_check;     // redefinition typedef check delay
        !           873: extern int     declTag;         // !1: inline, virtual mod permitted
        !           874: extern Pname in_tag;
        !           875: extern Pname statStat;
        !           876: extern int DECL_TYPE;
        !           877: 
        !           878: /******************** statements *********************************/
        !           879: 
        !           880: struct stmt : node {   /* BREAK CONTINUE DEFAULT */
        !           881: /*     IMPORTANT: all statement nodes have sizeof(stmt) */
        !           882:        Pstmt   s;
        !           883:        Pstmt   s_list;
        !           884:        Loc     where;
        !           885:        union {
        !           886:                Pname   d; // goto/block -- destination
        !           887:                Pexpr   e2; // for iteration
        !           888:                Pstmt   has_default; // switch statement default
        !           889:                int     case_value; 
        !           890:                Ptype   ret_tp; // pair
        !           891:        };
        !           892:        union {
        !           893:                Pexpr   e;
        !           894:                bit     own_tbl;
        !           895:                Pstmt   s2;
        !           896:        };
        !           897:        Ptable  memtbl;
        !           898:        union {
        !           899:                Pstmt   for_init;
        !           900:                Pstmt   else_stmt;
        !           901:                Pstmt   case_list;
        !           902:                Loc     where2; // location of } at end of block
        !           903:        };
        !           904: 
        !           905:        static Pstmt stmt_free;
        !           906:        void* operator new(size_t);
        !           907:        void operator delete(void*,size_t);
        !           908:        stmt(TOK, loc, Pstmt);
        !           909:        void    del();
        !           910: #ifndef GRAM
        !           911:        void    print();
        !           912:        void    dcl();
        !           913:         void    dcl1(Pstmt&);
        !           914:        void    reached();
        !           915:        Pstmt   simpl();
        !           916:        Pstmt   expand();
        !           917:        Pstmt   copy();
        !           918: #endif
        !           919:        int     discriminator(int); // union discriminator fcn 
        !           920: };
        !           921: 
        !           922: #ifndef GRAM
        !           923: extern char* Neval;
        !           924: extern Ptable scope;
        !           925: extern Ptable expand_tbl;
        !           926: extern Pname expand_fn;
        !           927: #endif
        !           928: 
        !           929: struct estmt : stmt    /* SM WHILE DO SWITCH RETURN CASE */
        !           930:        /*      SM (e!=0)       =>      e;
        !           931:                in particular assignments and function calls
        !           932:                SM (e==0)       =>      ;       (the null statement)
        !           933:                CASE            =>      case e : s ;
        !           934:                SM_PARAM        => e is the template_statement_tree_formal name
        !           935:        */
        !           936: {
        !           937:        estmt(TOK t, loc ll, Pexpr ee, Pstmt ss) : stmt (t,ll,ss) { e=ee; }
        !           938: };
        !           939: 
        !           940: struct ifstmt : stmt   /* IF */
        !           941:        // else_stme==0 =>      if (e) s
        !           942:        // else_stmt!=0 =>      if (e) s else else_stmt
        !           943: {
        !           944:        ifstmt(loc ll, Pexpr ee, Pstmt ss1, Pstmt ss2)
        !           945:                : stmt (IF,ll,ss1) { e=ee; else_stmt=ss2; };
        !           946: };
        !           947: 
        !           948: struct lstmt : stmt    /* LABEL GOTO */
        !           949:        /*
        !           950:                d : s
        !           951:                goto d
        !           952:        */
        !           953: {
        !           954:        lstmt(TOK bb, loc ll, Pname nn, Pstmt ss) : stmt (bb,ll,ss) { d=nn; }
        !           955: };
        !           956: 
        !           957: struct forstmt : stmt {        // FOR
        !           958:        forstmt(loc ll, Pstmt fss, Pexpr ee1, Pexpr ee2, Pstmt ss)
        !           959:                : stmt (FOR,ll,ss) { for_init=fss; e=ee1; e2=ee2; }
        !           960: };
        !           961: 
        !           962: struct block : stmt {  // BLOCK        { d s }
        !           963:        block(loc ll, Pname nn, Pstmt ss, loc rr = noloc ) : stmt (BLOCK,ll,ss)
        !           964:                { d=nn; where2=rr; }
        !           965: #ifndef GRAM
        !           966:        void    dcl(Ptable);
        !           967:        Pstmt   simpl();
        !           968: #endif
        !           969: };
        !           970: 
        !           971: #ifndef GRAM
        !           972: struct pair : public stmt {    // PAIR
        !           973:        pair(loc ll, Pstmt a, Pstmt b) : stmt (PAIR,ll,a) { s2 = b; }
        !           974: };
        !           975: #endif
        !           976: 
        !           977: struct nlist {
        !           978:        Pname   head;
        !           979:        Pname   tail;
        !           980:                nlist(Pname);
        !           981:        void    add(Pname n)    { tail->n_list = n; tail = n; };
        !           982:        void    add_list(Pname);
        !           983: };
        !           984: 
        !           985: extern Pname name_unlist(nlist*);
        !           986: 
        !           987: struct slist {
        !           988:        Pstmt   head;
        !           989:        Pstmt   tail;
        !           990:                slist(Pstmt s)  { /*Nl++;*/ head = tail = s; };
        !           991:        void    add(Pstmt s)    { tail->s_list = s; tail = s; };
        !           992: };
        !           993: 
        !           994: extern Pstmt stmt_unlist(slist*);
        !           995: 
        !           996: struct elist {
        !           997:        Pexpr   head;
        !           998:        Pexpr   tail;
        !           999:                elist(Pexpr e)  { /*Nl++;*/ head = tail = e; };
        !          1000:        void    add(Pexpr e)    { tail->e2 = e; tail = e; };
        !          1001: };
        !          1002: 
        !          1003: extern Pexpr expr_unlist(elist*);
        !          1004: 
        !          1005: #ifndef GRAM 
        !          1006: extern class dcl_context * cc;
        !          1007: 
        !          1008: struct dcl_context {
        !          1009:        Pname   c_this; /* current fct's "this" */
        !          1010:        Ptype   tot;    /* type of "this" or 0 */
        !          1011:        Pname   not;    /* name of "this"'s class or 0 */
        !          1012:        Pclass  cot;    /* the definition of "this"'s class */
        !          1013:        Ptable  ftbl;   /* current fct's symbol table */
        !          1014:        Pname   nof;    /* current fct's name */
        !          1015: 
        !          1016:        void    stack()         { cc++; *cc = *(cc-1); };
        !          1017:        void    unstack()       { cc--; };
        !          1018: };
        !          1019: 
        !          1020: #define MAXCONT        20
        !          1021: extern dcl_context ccvec[MAXCONT];
        !          1022: #endif 
        !          1023: 
        !          1024: extern void yyerror(char*);
        !          1025: 
        !          1026: 
        !          1027: #ifndef GRAM
        !          1028: extern char* line_format;
        !          1029: 
        !          1030: extern Plist stat_mem_list;
        !          1031: extern Plist isf_list;
        !          1032: extern Pstmt st_ilist;
        !          1033: extern Pstmt st_dlist;
        !          1034: extern Ptable sti_tbl;
        !          1035: extern Ptable std_tbl;
        !          1036: extern int need_sti( Pexpr e, Ptable tbl = 0, bit is_static_ok = 0 ); 
        !          1037: Pexpr try_to_coerce(Ptype, Pexpr, char*, Ptable);
        !          1038: extern bit can_coerce(Ptype, Ptype);
        !          1039: extern Ptype np_promote(TOK, TOK, TOK, Ptype, Ptype, TOK);
        !          1040: extern bit enum_promote;
        !          1041: extern int suppress_error;
        !          1042: extern void delete_local();
        !          1043: 
        !          1044: extern int over_call(Pname, Pexpr);
        !          1045: extern Pname overFound;
        !          1046: extern Pname Nover;
        !          1047: extern Pname Ncoerce;
        !          1048: extern Nover_coerce;
        !          1049: struct ia : node {
        !          1050:        Pname   local;  // local variable for argument
        !          1051:        Pexpr   arg;    // actual arguments for call
        !          1052:        Ptype   tp;     // type of formal argument
        !          1053:         ia() { base = XIA; };
        !          1054: };
        !          1055: 
        !          1056: struct iline : node {
        !          1057:        Pname   fct_name;       /* fct called */
        !          1058:        Pin     i_next;
        !          1059:        Ptable  i_table;
        !          1060:        int     i_slots;        // no of arg slots pointer to by i_args
        !          1061:        ia*     i_args;
        !          1062:         iline() { base = XILINE; };
        !          1063: };
        !          1064: 
        !          1065: extern Pexpr curr_expr;
        !          1066: extern Pin curr_icall;
        !          1067: #define FUDGE111 11111
        !          1068: #define VTOK 22222
        !          1069: #define ITOR 77
        !          1070: 
        !          1071: extern Pstmt curr_loop;
        !          1072: extern Pblock curr_block;
        !          1073: extern Pstmt curr_switch;
        !          1074: extern loc last_line;  // last #line + number of '\n's output since
        !          1075: extern int last_ll;    // 0 or line of current stmt/dcl being printed
        !          1076: extern FILE* out_file; // output file descriptor
        !          1077: extern bit Cast;
        !          1078: extern loc no_where;
        !          1079: 
        !          1080: extern no_of_undcl;
        !          1081: extern no_of_badcall;
        !          1082: extern Pname undcl, badcall;
        !          1083: 
        !          1084: extern long str_to_long(const char*);
        !          1085: extern int c_strlen(const char* s);
        !          1086: #endif
        !          1087: 
        !          1088: #ifndef GRAM
        !          1089: extern Pname vec_new_fct;
        !          1090: extern Pname new_fct;
        !          1091: extern Pname del_fct;
        !          1092: extern Pname vec_del_fct;
        !          1093: 
        !          1094: extern int Nstd; // standard coercion used (derived* =>base* or int=>long or ...)
        !          1095: 
        !          1096: extern int stcount;    // number of names generated using make_name()
        !          1097: 
        !          1098: Pexpr replace_temp(Pexpr,Pexpr);
        !          1099: void make_res(Pfct);
        !          1100: 
        !          1101: extern int Pchecked;
        !          1102: Pexpr ptr_init(Pptr,Pexpr,Ptable);
        !          1103: Pexpr call_ctor(Ptable, Pexpr p, Pexpr ctor, Pexpr args, int d = REF, Pexpr vb_args = 0);
        !          1104: Pexpr call_dtor(Pexpr p, Pexpr dtor, Pexpr arg = 0, int d = DOT, Pexpr vb_args = 0);
        !          1105: void check_visibility(Pname, Pname, Pclass, Ptable, Pname);
        !          1106: 
        !          1107: int make_assignment(Pname);
        !          1108: 
        !          1109: extern Pname make_tmp(char, Ptype, Ptable);
        !          1110: Pexpr init_tmp(Pname, Pexpr, Ptable);
        !          1111: 
        !          1112: extern int is_unique_base(Pclass, char*, int, int = 0);
        !          1113: extern Pexpr rptr(Ptype, Pexpr, int);
        !          1114: 
        !          1115: extern int read_align(char*);
        !          1116: extern void new_init();
        !          1117: 
        !          1118: extern void Eprint(Pexpr);
        !          1119: extern Pexpr cast_cptr(Pclass ccl, Pexpr ee, Ptable tbl, int real_cast);
        !          1120: extern Pexpr mptr_assign(Pexpr,Pexpr);
        !          1121: extern Pclass Mptr;
        !          1122: 
        !          1123: #endif
        !          1124: 
        !          1125: extern bit fake_sizeof;        // suppress error message for ``int v[];''
        !          1126: 
        !          1127: extern TOK lalex();
        !          1128: 
        !          1129: // encapsulate casts
        !          1130: inline Pname type::bname() { return Pbase(this)->b_name; }
        !          1131: inline Ptype type::bname_type() { return Pbase(this)->b_name->tp; }
        !          1132: inline Pclass type::classtype() { 
        !          1133:     return (base==COBJ)?Pclass(Pbase(this)->b_name->tp)
        !          1134:        : (error('i',"T::classtype(): %k cobjX",base),0); 
        !          1135: }
        !          1136: 
        !          1137: inline Penum type::enumtype() { 
        !          1138:     return (base==EOBJ)?Penum(Pbase(this)->b_name->tp)
        !          1139:        : (error('i',"T::enumtype(): %k eobjX",base),0); 
        !          1140: }
        !          1141: 
        !          1142: inline Pfct name::fct_type() { 
        !          1143:     return (tp->base==FCT) ? Pfct(tp)
        !          1144:        : (error('i',"N::fct_type():%n is %k notF",this,tp->base),0); 
        !          1145: }
        !          1146: 
        !          1147: 
        !          1148: #ifdef DBG
        !          1149: extern void display_expr( Pexpr, char* = 0, int = 0 );
        !          1150: extern void display_stmt( Pstmt, char* = 0, int = 0 );
        !          1151: extern void display_type( Ptype );
        !          1152: extern void display_namelist( Plist, char* = 0, int = 0 );
        !          1153: 
        !          1154: extern fprintf(const FILE*, const char* ...);
        !          1155: extern void process_debug_flags( char* );
        !          1156: #define DB(a) if(scan_started){a;}
        !          1157: extern int Adebug; // allocation (ctor/del) debugging
        !          1158: extern int Ddebug; // dcl debugging
        !          1159: extern int Edebug; // expr debugging
        !          1160: extern int Ldebug; // lex/lalex debugging
        !          1161: extern int Mdebug; // trace function matching
        !          1162: extern int Ndebug; // norm debugging
        !          1163: extern int Pdebug; // print debugging
        !          1164: extern int Rdebug; // run() debugging
        !          1165: extern int Sdebug; // simpl debugging
        !          1166: extern int Tdebug; // typ debugging
        !          1167: #define Ydebug yydebug
        !          1168: extern int Ydebug; // yacc debugging
        !          1169: 
        !          1170: #else
        !          1171: 
        !          1172: #define DB(a) /**/
        !          1173: 
        !          1174: #endif
        !          1175: 
        !          1176: #endif
        !          1177: /* end */

unix.superglobalmegacorp.com

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