[gnu.g++.bug] bug in operator delete

grunwald%flute.cs.uiuc.edu@A.CS.UIUC.EDU (Dirk Grunwald) (03/23/89)

This appears in g++ 1.34.1 for an Encore and also a Sun-3/60 w/SunOS4.0.1.

I have a class (Message) that declares

    void operator delete(void *);

and class Task uses this when deleting items. However, g++ gives me a
message " `this' has no member function named delete". Other classes with
`operator delete' work with no problems.

When I run c++ using gdb, I find that this message is from cplus-class.c,
line 2512:
      if (field == NULL_TREE)
	{
	  error ("`this' has no member named `%s'", err_name);

If this is indeed a bug, I'd appreciate a patch if one is available.

# 1 "../Src/Task.cc"
# 1 "/usr/local/include/Awe2/assert.h"
# 1 "/usr/local/include/Awe2/Generic.h"
# 51 "/usr/local/include/Awe2/Generic.h"
# 28 "/usr/local/include/Awe2/assert.h"
extern void _assert(const char *, const char *, const int);
extern void _assert2(const char *, const char *, const int, const char *);
# 1 "../Src/Task.cc"
# 1 "/usr/local/include/Awe2/SimulationMultiplexor.h"
# 1 "/usr/local/include/Awe2/CpuMultiplexor.h"
# 1 "/usr/local/include/Awe2/Config.h"
const static int MaxCpuMultiplexors = 1;
const static int DefaultSpinBarrierLoops = 0;
const static int DefaultBarrierLoops = 0;
# 10 "/usr/local/include/Awe2/CpuMultiplexor.h"
# 1 "/usr/local/include/Awe2/HardwareContext.h"
# 1 "/usr/local/Gnu/lib/g++-include/stream.h"
# 1 "/usr/local/Gnu/lib/g++-include/File.h"
# 1 "/usr/local/Gnu/lib/g++-include/builtin.h"
overload clearbit;
overload dec;
overload even;
overload gcd;
overload hex;
overload lcm;
overload lg;
overload oct;
overload odd;
overload setbit;
overload sign;
overload sqr;
overload testbit;
# 1 "/usr/local/Gnu/lib/g++-include/std.h"
overload abs; 
extern void      _exit  (int) asm ("_" "_exit") ;
extern void      abort  () asm ("_" "abort") ;
extern int       abs  (int) asm ("_" "abs") ;
extern int       access  (const char*, int) asm ("_" "access") ;
extern int       acct  (const char*) asm ("_" "acct") ;
extern unsigned  alarm  (unsigned) asm ("_" "alarm") ;
extern void*     alloca  (int) asm ("_" "alloca") ;
extern double    atof  (const char*) asm ("_" "atof") ;
extern int       atoi  (const char*) asm ("_" "atoi") ;
extern long      atol  (const char*) asm ("_" "atol") ;
extern int       bcmp  (const void*, const void*, int) asm ("_" "bcmp") ;
extern void      bcopy  (const void*, void*, int) asm ("_" "bcopy") ;
extern void*     brk  (void*) asm ("_" "brk") ;
extern void      bzero  (void*, int) asm ("_" "bzero") ;
extern void*     calloc  (unsigned, unsigned) asm ("_" "calloc") ;
extern void      cfree  (void*) asm ("_" "cfree") ;
extern int       chdir  (const char*) asm ("_" "chdir") ;
extern int       chmod  (const char*, int) asm ("_" "chmod") ;
extern int       chown  (const char*, int, int) asm ("_" "chown") ;
extern long      clock  () asm ("_" "clock") ;
extern int       close  (int) asm ("_" "close") ;
extern int       creat  (const char*, int) asm ("_" "creat") ;
extern char*     crypt  (const char*, const char*) asm ("_" "crypt") ;
extern char*     ctermid  (char*) asm ("_" "ctermid") ;
extern char*     cuserid  (char*) asm ("_" "cuserid") ;
extern double    drand48  () asm ("_" "drand48") ;
extern int       dup  (int) asm ("_" "dup") ;
extern int       dup2  (int, int) asm ("_" "dup2") ;
extern int       dysize  (int) asm ("_" "dysize") ;
extern char*     ecvt  (double, int, int*, int*) asm ("_" "ecvt") ;
extern char*     encrypt  (char*, int) asm ("_" "encrypt") ;
extern double    erand  (short*) asm ("_" "erand") ;
extern int       execl  (const char*, const char *, ...) asm ("_" "execl") ;
extern int       execle  (const char*, const char *, ...) asm ("_" "execle") ;
extern int       execlp  (const char*, const char*, ...) asm ("_" "execlp") ;
extern int       exect  (const char*,  const char**,  char**) asm ("_" "exect") ;
extern int       execv  (const char*,  const char**) asm ("_" "execv") ;
extern int       execve  (const char*, const char**, char**) asm ("_" "execve") ;
extern int       execvp  (const char*,  const char**) asm ("_" "execvp") ;
extern void      exit  (int) asm ("_" "exit") ;
extern int       fchmod  (int, int) asm ("_" "fchmod") ;
extern int       fchown  (int, int, int) asm ("_" "fchown") ;
extern int       fcntl  (int, int, int) asm ("_" "fcntl") ;
extern char*     fcvt  (double, int, int*, int*) asm ("_" "fcvt") ;
extern int       ffs  (int) asm ("_" "ffs") ;
extern int       flock  (int, int) asm ("_" "flock") ;
extern int       fork  () asm ("_" "fork") ;
extern void      free  (void*) asm ("_" "free") ;
extern int       fsync  (int) asm ("_" "fsync") ;
extern long      ftok  (const char*, int) asm ("_" "ftok") ;
extern int       ftruncate  (int, unsigned long) asm ("_" "ftruncate") ;
extern char*     gcvt  (double, int, char*) asm ("_" "gcvt") ;
extern char*     getcwd  (char*, int) asm ("_" "getcwd") ;
extern int       getdomainname  (char*, int) asm ("_" "getdomainname") ;
extern int       getdtablesize  () asm ("_" "getdtablesize") ;
extern int       getegid  () asm ("_" "getegid") ;
extern char*     getenv  (const char*) asm ("_" "getenv") ;
extern int       geteuid  () asm ("_" "geteuid") ;
extern int       getgid  () asm ("_" "getgid") ;
extern int       getgroups  (int, int*) asm ("_" "getgroups") ;
extern long      gethostid  () asm ("_" "gethostid") ;
extern int       gethostname  (char*, int) asm ("_" "gethostname") ;
extern char*     getlogin  () asm ("_" "getlogin") ;
extern int       getopt  (int, char**, char*) asm ("_" "getopt") ;
extern int       getpagesize  () asm ("_" "getpagesize") ;
extern char*     getpass  (const char*) asm ("_" "getpass") ;
extern int       getpgrp  () asm ("_" "getpgrp") ;
extern int       getpid  () asm ("_" "getpid") ;
extern int       getppid  () asm ("_" "getppid") ;
extern int       getpriority  (int, int) asm ("_" "getpriority") ;
extern int       getpw  (int, char*) asm ("_" "getpw") ;
extern unsigned  getuid  () asm ("_" "getuid") ;
extern char*     getwd  (const char*) asm ("_" "getwd") ;
extern char*     index  (const char*, int) asm ("_" "index") ;
extern char*     initstate  (unsigned, char*, int) asm ("_" "initstate") ;
extern int       ioctl  (int, int, char*) asm ("_" "ioctl") ;
extern int       isatty  (int) asm ("_" "isatty") ;
extern long      jrand48  (short*) asm ("_" "jrand48") ;
extern int       kill  (int, int) asm ("_" "kill") ;
extern int       killpg  (int, int) asm ("_" "killpg") ;
extern void      lcong48  (short*) asm ("_" "lcong48") ;
extern int       link  (const char*, const char*) asm ("_" "link") ;
extern int       lock  (int, int, long) asm ("_" "lock") ;
extern long      lrand48  () asm ("_" "lrand48") ;
extern long      lseek  (int, long, int) asm ("_" "lseek") ;
extern void*     malloc  (unsigned) asm ("_" "malloc") ;
extern void*     memalign  (unsigned, unsigned) asm ("_" "memalign") ;
extern void*     memccpy  (void*, const void*, int, int) asm ("_" "memccpy") ;
extern void*     memchr  (const void*, int, int) asm ("_" "memchr") ;
extern int       memcmp  (const void*, const void*, int) asm ("_" "memcmp") ;
extern void*     memcpy  (void*, const void*, int) asm ("_" "memcpy") ;
extern void*     memset  (void*, int, int) asm ("_" "memset") ;
extern int       mkdir  (const char*, int) asm ("_" "mkdir") ;
extern int       mknod  (const char*, int, int) asm ("_" "mknod") ;
extern int       mkstemp  (char*) asm ("_" "mkstemp") ;
extern char*     mktemp  (char*) asm ("_" "mktemp") ;
extern long      mrand48  () asm ("_" "mrand48") ;
extern int       nice  (int) asm ("_" "nice") ;
extern long      nrand48  (short*) asm ("_" "nrand48") ;
extern int       open  (const char*, int, ...) asm ("_" "open") ;
extern void      pause  () asm ("_" "pause") ;
extern void      perror  (const char*) asm ("_" "perror") ;
extern int       pipe   (int*) asm ("_" "pipe") ;
extern void      profil  (char*, int, int, int) asm ("_" "profil") ;
extern int       psignal  (unsigned, char*) asm ("_" "psignal") ;
extern int       ptrace  (int, int, int, int) asm ("_" "ptrace") ;
extern int       putenv  (const char*) asm ("_" "putenv") ;
extern int       rand  () asm ("_" "rand") ;
extern long      random  () asm ("_" "random") ;
extern int       read  (int, void*, unsigned) asm ("_" "read") ;
extern int       readlink  (const char*, char*, int) asm ("_" "readlink") ;
extern void*     realloc  (void*, unsigned) asm ("_" "realloc") ;
extern int       rename  (const char*, const char*) asm ("_" "rename") ;
extern char*     rindex  (const char*, int) asm ("_" "rindex") ;
extern int       rmdir  (const char*) asm ("_" "rmdir") ;               
extern void*     sbrk  (int) asm ("_" "sbrk") ;              
extern short*    seed48  (short*) asm ("_" "seed48") ;
extern int       send  (int, char*, int, int) asm ("_" "send") ;
extern int       setgid  (int) asm ("_" "setgid") ;
extern int       sethostname  (char*, int) asm ("_" "sethostname") ;
extern int       setkey  (const char*) asm ("_" "setkey") ;
extern int       setpgrp  (int, int) asm ("_" "setpgrp") ;
extern int       setpriority  (int, int, int) asm ("_" "setpriority") ;
extern int       setregid  (int, int) asm ("_" "setregid") ;
extern int       setreuid  (int, int) asm ("_" "setreuid") ;
extern char*     setstate  (char*) asm ("_" "setstate") ;
extern int       setuid  (int) asm ("_" "setuid") ;
extern int       sigblock  (int) asm ("_" "sigblock") ;
extern int       siginterrupt  (int, int) asm ("_" "siginterrupt") ;
extern int       sigpause  (int) asm ("_" "sigpause") ;
extern int       sigsetmask  (int) asm ("_" "sigsetmask") ;
extern unsigned  sleep  (unsigned) asm ("_" "sleep") ;
extern int       srand  (int) asm ("_" "srand") ;
extern void      srand48  (long) asm ("_" "srand48") ;
extern void      srandom  (int) asm ("_" "srandom") ;
extern int       stime  (long*) asm ("_" "stime") ;
extern char*     strcat  (char*, const char*) asm ("_" "strcat") ;
extern char*     strchr  (const char*, int) asm ("_" "strchr") ;
extern int       strcmp  (const char*, const char*) asm ("_" "strcmp") ;
extern char*     strcpy  (char*, const char*) asm ("_" "strcpy") ;
extern int       strcspn  (const char*, const char*) asm ("_" "strcspn") ;
extern char*     strdup  (const char*) asm ("_" "strdup") ;
extern int       strlen  (const char*) asm ("_" "strlen") ;
extern char*     strncat  (char*, const char*, int) asm ("_" "strncat") ;
extern int       strncmp  (const char*, const char*, int) asm ("_" "strncmp") ;
extern char*     strncpy  (char*, const char*, int) asm ("_" "strncpy") ;
extern char*     strpbrk  (const char*, const char*) asm ("_" "strpbrk") ;
extern char*     strrchr  (const char*, int) asm ("_" "strrchr") ;
extern int       strspn  (const char*, const char*) asm ("_" "strspn") ;
extern double    strtod  (const char*, char**) asm ("_" "strtod") ;
extern char*     strtok  (char*, const char*) asm ("_" "strtok") ;
extern long      strtol  (const char*, char**, int) asm ("_" "strtol") ;
extern void      swab  (void*, void*, int) asm ("_" "swab") ;
extern int       symlink  (const char*, const char*) asm ("_" "symlink") ;
extern int       syscall  (int, ...) asm ("_" "syscall") ;
extern int       system  (const char*) asm ("_" "system") ;
extern char*     tempnam  (char*, char*) asm ("_" "tempnam") ;
extern int       tgetent  (char*, char*) asm ("_" "tgetent") ;
extern int       tgetnum  (char*) asm ("_" "tgetnum") ;
extern int       tgetflag  (char*) asm ("_" "tgetflag") ;
extern char*     tgetstr  (char *, char **) asm ("_" "tgetstr") ;
extern char*     tgoto  (char*, int, int) asm ("_" "tgoto") ;
extern long      time  (long*) asm ("_" "time") ;
extern char*     tmpnam  (char*) asm ("_" "tmpnam") ;
extern int       truncate  (const char*, unsigned long) asm ("_" "truncate") ;
extern char*     ttyname  (int) asm ("_" "ttyname") ;
extern int       ttyslot  () asm ("_" "ttyslot") ;
extern unsigned  ualarm  (unsigned, unsigned) asm ("_" "ualarm") ;
extern long      ulimit  (int, long) asm ("_" "ulimit") ;
extern int       umask  (int) asm ("_" "umask") ;
extern int       unlink  (const char*) asm ("_" "unlink") ;
extern unsigned  usleep  (unsigned) asm ("_" "usleep") ;
extern int       vadvise  (int) asm ("_" "vadvise") ;
extern void*     valloc  (unsigned) asm ("_" "valloc") ;
extern int       vfork  () asm ("_" "vfork") ;
extern int       vhangup  () asm ("_" "vhangup") ;
extern int       wait  (int*) asm ("_" "wait") ;
extern int       write  (int, const void*, unsigned) asm ("_" "write") ;
extern char**   environ;
extern int      errno;
extern char*    sys_errlist[];
extern int      sys_nerr;                  
extern char*    optarg;
extern int      opterr;
extern int      optind;
# 48 "/usr/local/Gnu/lib/g++-include/builtin.h"
# 1 "/usr/local/Gnu/lib/g++-include/stddef.h"
enum bool   
{           
  FALSE = 0,
  TRUE  = 1              
};
typedef void (*one_arg_error_handler_t)(const char*);
typedef void (*two_arg_error_handler_t)(const char*, const char*);
# 49 "/usr/local/Gnu/lib/g++-include/builtin.h"
# 1 "/usr/local/Gnu/lib/g++-include/math.h"
overload acos;
overload acosh;
overload asin;
overload asinh;
overload atan2;
overload atanh;
overload ceil;
overload cos;
overload cosh;
overload exp;
overload floor;
overload gamma;
overload hypot;
overload log;
overload log10;
overload pow;
overload sin;
overload sinh;
overload sqrt;
overload tan;
overload tanh;
extern double  acos  (double) asm ("_" "acos") ;
extern double  acosh  (double) asm ("_" "acosh") ;
extern double  asin  (double) asm ("_" "asin") ;
extern double  asinh  (double) asm ("_" "asinh") ;
extern double  atan  (double) asm ("_" "atan") ;
extern double  atan2  (double, double) asm ("_" "atan2") ;
extern double  atanh  (double) asm ("_" "atanh") ;
extern double  cbrt  (double) asm ("_" "cbrt") ;
extern double  ceil  (double) asm ("_" "ceil") ;
extern double  copysign  (double,double) asm ("_" "copysign") ;
extern double  cos  (double) asm ("_" "cos") ;
extern double  cosh  (double) asm ("_" "cosh") ;
extern double  drem  (double,double) asm ("_" "drem") ;
extern double  erf  (double) asm ("_" "erf") ;
extern double  erfc  (double) asm ("_" "erfc") ;
extern double  exp  (double) asm ("_" "exp") ;
extern double  expm1  (double) asm ("_" "expm1") ;
extern double  fabs  (double) asm ("_" "fabs") ;
extern double  finite  (double) asm ("_" "finite") ;
extern double  floor  (double) asm ("_" "floor") ;
extern double  frexp  (double, int*) asm ("_" "frexp") ;
extern double  gamma  (double) asm ("_" "gamma") ;
extern double  hypot  (double,double) asm ("_" "hypot") ;
extern double  infnan  (int) asm ("_" "infnan") ;
extern int     isinf  (double) asm ("_" "isinf") ;
extern int     isnan  (double) asm ("_" "isnan") ;
extern double  j0  (double) asm ("_" "j0") ;
extern double  j1  (double) asm ("_" "j1") ;
extern double  jn  (int, double) asm ("_" "jn") ;
extern double  ldexp  (double, int) asm ("_" "ldexp") ;
extern double  lgamma  (double) asm ("_" "lgamma") ;
extern double  log  (double) asm ("_" "log") ;
extern double  log10  (double) asm ("_" "log10") ;
extern double  log1p  (double) asm ("_" "log1p") ;
extern double  logb  (double) asm ("_" "logb") ;
extern double  modf  (double, double*) asm ("_" "modf") ;
extern double  pow  (double, double) asm ("_" "pow") ;
extern double  rint  (double) asm ("_" "rint") ;
extern double  scalb  (double, int) asm ("_" "scalb") ;
extern double  sin  (double) asm ("_" "sin") ;
extern double  sinh  (double) asm ("_" "sinh") ;
extern double  sqrt  (double) asm ("_" "sqrt") ;
extern double  tan  (double) asm ("_" "tan") ;
extern double  tanh  (double) asm ("_" "tanh") ;
extern double  y0  (double) asm ("_" "y0") ;
extern double  y1  (double) asm ("_" "y1") ;
extern double  yn  (int, double) asm ("_" "yn") ;
struct exception
{
  int type;
  char* name;
  double arg1, arg2, retval;
};
int matherr(exception*);
# 1 "/usr/local/Gnu/lib/g++-include/values.h"
# 92 "/usr/local/Gnu/lib/g++-include/values.h"
# 126 "/usr/local/Gnu/lib/g++-include/math.h"
# 50 "/usr/local/Gnu/lib/g++-include/builtin.h"
long         abs(long);
double       abs(double);
void         clearbit(long&, long);
void         setbit(long&, long);
int          testbit(long, long);
int          even(long);
long         gcd(long, long);
long         lg(long); 
long         lcm(long, long);
int          odd(long);
double       pow(double, long);
long         pow(long, long);
int          sign(long);
int          sign(double);
long         sqr(long);
double       sqr(double);
long         sqrt(long);
double       start_timer();
double       return_elapsed_time(double);
char*        itoa(long x, int base = 10, int width = 0);
char*        hex(long x, int width = 0);
char*        oct(long x, int width = 0);
char*        dec(long x, int width = 0);
char*        form(const char* fmt ...);
unsigned int hashpjw(const char*);
unsigned int multiplicativehash(int);
unsigned int foldhash(double);
extern void default_one_arg_error_handler(const char*);
extern void default_two_arg_error_handler(const char*, const char*);
extern two_arg_error_handler_t lib_error_handler;
extern two_arg_error_handler_t 
       set_lib_error_handler(two_arg_error_handler_t f);
inline double abs(double _arg) 
{
  return (_arg < 0.0)? -_arg : _arg;
}
inline long abs(long _arg) 
{
  return (_arg < 0)? -_arg : _arg;
}
inline int sign(long _arg)
{
  return (_arg == 0) ? 0 : ( (_arg > 0) ? 1 : -1 );
}
inline int sign(double _arg)
{
  return (_arg == 0.0) ? 0 : ( (_arg > 0.0) ? 1 : -1 );
}
inline long sqr(long _arg)
{
  return _arg * _arg;
}
inline double sqr(double _arg)
{
  return _arg * _arg;
}
inline int even(long _arg)
{
  return !(_arg & 1);
}
inline int odd(long _arg)
{
  return (_arg & 1);
}
inline long lcm(long _x, long _y)
{
  return _x / gcd(_x, _y) * _y;
}
inline void setbit(long& _x, long _b)
{
  _x |= (1 << _b);
}
inline void clearbit(long& _x, long _b)
{
  _x &= ~(1 << _b);
}
inline int testbit(long _x, long _b)
{
  return ((_x & (1 << _b)) != 0);
}
# 27 "/usr/local/Gnu/lib/g++-include/File.h"
# 1 "/usr/local/Gnu/lib/g++-include/stdio.h"
extern  struct  _iobuf {
    int      _cnt;
    char*    _ptr;
    char*    _base;
    int     _bufsiz;
    short   _flag;
    char    _file;
} _iob[];
extern int    _doprnt(const char*, void*,     struct _iobuf *);
extern int    _doscan(    struct _iobuf *, const char*, void*);
extern int    _filbuf(    struct _iobuf *);
extern int    _flsbuf(unsigned,     struct _iobuf *);
extern int    fclose(    struct _iobuf *);
extern     struct _iobuf *  fdopen(int, const char*);
extern int    fflush(    struct _iobuf *);
extern int    fgetc(    struct _iobuf *);
extern char*  fgets(char*, int,     struct _iobuf  *);
extern     struct _iobuf *  fopen(const char*, const char*);
extern int    fprintf(    struct _iobuf *, const char* ...);
extern int    fputc(int,     struct _iobuf *);
extern int    fputs(const char*,     struct _iobuf *);
extern int    fread(void*, int, int,     struct _iobuf *);
extern     struct _iobuf *  freopen(const char*, const char*,     struct _iobuf *);
extern int    fscanf(    struct _iobuf *, const char* ...);
extern int    fseek(    struct _iobuf *, long, int);
extern long   ftell(    struct _iobuf  *);
extern int    fwrite(const void*, int, int,     struct _iobuf *);
extern char*  gets(char*);
extern int    getw(    struct _iobuf *);
extern int    pclose(    struct _iobuf *);
extern     struct _iobuf *  popen(const char*, const char*);
extern int    printf(const char* ...);
extern void   puts(const char*);
extern int    putw(int,     struct _iobuf *);
extern int    scanf(const char* ...);
extern void   setbuf(    struct _iobuf *, char*);
extern void   setbuffer(    struct _iobuf *, char*, int);
extern void   setlinebuf(    struct _iobuf *);
extern void   setvbuf(    struct _iobuf *, char*, int, int);
extern int    sscanf(char*, const char* ...);
extern     struct _iobuf *  tmpfile();
extern int    ungetc(int,     struct _iobuf *);
extern int    vfprintf(    struct _iobuf *, const char*, void* ap);
extern int    vprintf(const char*, void* ap);
extern int    vsprintf(char*, const char*, void* ap);
extern int    sprintf(char*, const char* ...);
# 28 "/usr/local/Gnu/lib/g++-include/File.h"
# 1 "/usr/local/Gnu/lib/g++-include/stddef.h"
# 59 "/usr/local/Gnu/lib/g++-include/stddef.h"
# 29 "/usr/local/Gnu/lib/g++-include/File.h"
enum io_mode                     
{
  io_readonly   = 0,            
  io_writeonly  = 1,
  io_readwrite  = 2, 
  io_appendonly = 3,
  io_append     = 4,             
};
enum access_mode                 
{
  a_createonly  = 0,             
  a_create      = 1,             
  a_useonly     = 2,             
  a_use         = 3,             
};
enum state_value                 
{ 
  _good         = 0,             
  _eof          = 1,             
  _fail         = 2,             
  _bad          = 4              
};
class File
{
protected:
      struct _iobuf *         fp;               
  char*         nm;               
  char          rw;               
  state_value   state;            
  long          stat;             
  void          initialize();
  void          reinitialize(const char*);
public:
                File();
                File(const char* filename, io_mode m, access_mode a);
                File(const char* filename, const char* m);   
                File(int filedesc, io_mode m);
                File(    struct _iobuf * fileptr);
                File(int sz, char* buf, io_mode m);
                ~File();
  File&         open(const char* filename, io_mode m, access_mode a);
  File&         open(const char* filename, const char* m);
  File&         open(int  filedesc, io_mode m);
  File&         open(    struct _iobuf * fileptr);
  File&         close();
  File&         remove();
  int           filedesc();
  const char*   name();
  void          setname(const char* newname);
  int           iocount();
  int           rdstate();
  int           eof();
  int           fail();
  int           bad();
  int           good();
  int           readable();
  int           writable();
  int           is_open();
  void*         operator void*();
  void          error();
  void          clear(state_value f = 0);  
  File&         failif(int cond);
  void          check_state();
  File&         get(char& c);
  File&         put(char  c);
  File&         unget(char c);
  File&         putback(char c);  
  File&         put(const char* s);
  File&         get    (char* s, int n, char terminator = '\n');
  File&         getline(char* s, int n, char terminator = '\n');
  File&         read(void* x, int sz, int n);
  File&         write(void* x, int sz, int n);
  File&         seek(long pos, int seek_mode=0);  
  long          tell();
  File&         flush();
  File&         setbuf(int buffer_kind);  
  File&         setbuf(int size, char* buf);
  File&         raw();
};
extern void  verbose_File_error_handler(char*);
extern void  quiet_File_error_handler(char*);
extern void  fatal_File_error_handler(char*);
extern one_arg_error_handler_t File_error_handler;
extern one_arg_error_handler_t set_File_error_handler(one_arg_error_handler_t);
inline int File::filedesc()
{ 
  return   ((fp)->_file) ;
}
inline const char* File::name()
{ 
  return nm; 
}
inline int File::iocount()
{ 
  return stat; 
}
inline int File::readable()
{ 
  if (fp != 0) { if (    (((fp)->_flag&   00020 )!=0) ) state |= _eof; if (  (((fp)->_flag&   00040 )!=0) ) state |= _bad;}
  return (state == _good && (rw & 01));
}
inline int File::writable()
{ 
  if (fp != 0 &&   (((fp)->_flag&   00040 )!=0) ) state |= _bad;
  return ((state & (_fail|_bad)) == 0 && (rw & 02));
}
inline int File::is_open()
{ 
  return (fp != 0);
}
inline void File::clear(state_value flag = 0)
{ 
  state = flag;
}
inline File& File::raw()
{ 
  return File::setbuf(   00004 ); 
}
inline void File::check_state()  
{
  if (fp != 0)
  {
    if (    (((fp)->_flag&   00020 )!=0) )
      state |= _eof;
    else
      state &= ~_eof;
    if (  (((fp)->_flag&   00040 )!=0) )
      state |= _bad;
  }
}
inline File& File::failif(int cond)
{ 
  if (cond) state |= _fail;  return *this; 
}
inline File& File::get(char& c)
{ 
  if (readable())
  {
    int ch = (--(fp)->_cnt>=0?(int)(*(unsigned char*)(fp)->_ptr++):_filbuf(fp)) ;
    c = ch;
    failif (ch ==       (-1) );
  }
  return *this;
}
inline File& File::put(char  c) 
{ 
  return failif (!writable() ||  (--( fp)->_cnt>=0? ((int)((unsigned char)((*( fp)->_ptr++=(unsigned)(c))))):_flsbuf((unsigned)(c), fp))  ==       (-1) );
}
inline File& File::unget(char c)
{ 
  return failif(!is_open() || !(rw & 01) || ungetc(c, fp) ==       (-1) );
} 
inline File& File::putback(char c)
{ 
  return failif (!is_open() || !(rw & 01) || ungetc(c, fp) ==       (-1) );
}
inline File& File::read(void* x, int sz, int n)
{ 
  return failif (!readable() || (stat = fread(x, sz, n, fp)) != n);
} 
inline File& File::write(void* x, int sz, int n) 
{ 
  return failif (!writable() || (stat = fwrite(x, sz, n, fp)) != n);
}
inline File& File::flush()
{ 
  return failif(!is_open() || fflush(fp) ==       (-1) );
}
inline File& File::seek(long pos, int seek_mode = 0)
{ 
  return failif (!is_open() || fseek(fp, pos, seek_mode) < 0); 
}
inline long File::tell()
{ 
  failif (!is_open() || (stat = ftell(fp) < 0));
  return stat;
}
inline int File::rdstate()
{ 
  check_state();  return state;  
}                                
inline void* File::operator void*()
{ 
  check_state();  return (state & (_bad|_fail))? 0 : this ; 
}
inline int File::eof()
{ 
  check_state(); return state & _eof; 
}
inline int File::fail()
{ 
  check_state(); return state & _fail; 
}
inline int File::bad()
{ 
  check_state(); return state & _bad; 
}
inline int File::good()
{ 
  check_state(); return rdstate() == _good; 
}
# 27 "/usr/local/Gnu/lib/g++-include/stream.h"
class whitespace                 
{                                
  char filler;                     
};
class ostream: File
{
public:
           File::open;      File::close;
           File::remove;    File::filedesc;  File::is_open;
           File::raw;       File::put;       File::check_state;
           File::iocount;   File::error;     File::name;
           File::setname;   File::rdstate;   File::flush;
           File::eof;       File::fail;      File::bad;
           File::good;      File::clear;     File::failif;
           File::setbuf;    File::writable;  File::readable;
           ostream();
           ostream(const char* filename, io_mode m, access_mode a);
           ostream(const char* filename, const char* m);
           ostream(int filedesc, io_mode m = io_writeonly);
           ostream(    struct _iobuf * fileptr);
           ostream(int sz, char* buf);
           ~ostream();
  void*    operator void*();
  ostream& form(const char* fmt, ...);           
  ostream& operator << (char   c);
  ostream& operator << (short  n);
  ostream& operator << (unsigned short n);
  ostream& operator << (int    n);
  ostream& operator << (unsigned int n);
  ostream& operator << (long   n);
  ostream& operator << (unsigned long n);
  ostream& operator << (float  n);
  ostream& operator << (double n);
  ostream& operator << (const char* s);
};
class istream: File
{
protected:
  ostream* tied_to;         
  void     _flush();
public:
           File::open;      File::close;     File::get;
           File::remove;    File::filedesc;  File::is_open;
           File::raw;       File::unget;     File::getline;
           File::iocount;   File::error;     File::name;
           File::setname;   File::rdstate;   File::putback;
           File::eof;       File::fail;      File::bad;
           File::good;      File::clear;     File::failif;
           File::setbuf;    File::writable;  File::readable;
           File::check_state;
           istream();
           istream(const char* filename, io_mode m, access_mode a);
           istream(const char* filename, const char* m);
           istream(int filedesc, io_mode m = io_readonly);
           istream(    struct _iobuf * fileptr);
           istream(int sz, char* buf);
           ~istream();
  void*    operator void*();
  ostream* tie(ostream* s);
  istream& scan(const char* fmt, ...);
  istream& operator >> (char&   c);
  istream& operator >> (short&  n);
  istream& operator >> (unsigned short& n);
  istream& operator >> (int&    n);
  istream& operator >> (unsigned int& n);
  istream& operator >> (long&   n);
  istream& operator >> (unsigned long& n);
  istream& operator >> (float&  n);
  istream& operator >> (double& n);
  istream& operator >> (char*   s);
  istream& operator >> (whitespace& w);
};
void eatwhite(istream& s);
extern istream  cin;              
extern ostream  cout;             
extern ostream  cerr;             
extern whitespace WS;             
inline void* ostream::operator void*()
{ 
  check_state(); return (state & (_bad|_fail))? 0 : this ; 
}
inline ostream& ostream::operator<<(char   c)
{ 
  put(c);  return *this;
}
inline void*    istream::operator void*()
{ 
  check_state(); return (state & (_bad|_fail))? 0 : this ; 
}
inline void istream::_flush()
{
  if (tied_to) tied_to->flush();
}
inline istream& istream::operator>>(char&   c)
{ 
  _flush();  get(c);  return *this;
}
# 10 "/usr/local/include/Awe2/HardwareContext.h"
# 1 "/usr/local/include/Awe2/assert.h"
# 42 "/usr/local/include/Awe2/assert.h"
# 11 "/usr/local/include/Awe2/HardwareContext.h"
extern const long MagicStackMarker;
extern const void * UNINITIALIZED;
typedef enum {stackGrowsUp, stackGrowsDown} StackGrowthDirection;
extern StackGrowthDirection StackGrows;
typedef void (*voidFuncP)();
class HardwareContext;
class SimulationMultiplexor;
class HardwareContext {
    void** saved_fp;	 
    void** saved_sp;	 
    void** stackBase;	 
    void** stackEnd;	 
    unsigned stackMax;	 
    unsigned stackSize;	 
    void **stackMallocAt;
    long *stackCheck;	 
    unsigned checkStackLimits;
    friend class Thread;
    friend class CpuMultiplexor;
    friend class SimulationMultiplexor;
    void switchContext(HardwareContext *to);
    void magicSwitchTo(HardwareContext *to);
    void **getSp();
    void **mallocAt();
    void buildReturnFrame(void * returnThis, voidFuncP returnAddress);
    void stackOverflow();
    HardwareContext(int checked, unsigned stackSize);
public:
    HardwareContext();
    long maxStackDepth();
    void checkStack(int overage = 0);
    void classPrintOn(ostream& strm);
};
inline
HardwareContext::HardwareContext()
{
    int NotReached = 0;
    { if (( NotReached )) ; else _assert( "NotReached", "/usr/local/include/Awe2/HardwareContext.h",73); } ;
}
inline void **
HardwareContext::mallocAt()
{
    return( stackMallocAt );
}
inline ostream&
operator<<(ostream& strm, const HardwareContext& ob)
{
    ob.classPrintOn(strm);
    return strm;
}
inline long
HardwareContext::maxStackDepth()
{
    return( long(stackMax) );
}
inline void
HardwareContext::checkStack(int overage)
{
    unsigned depth = stackBase - getSp() + overage;
    if (stackMax < depth) {
	stackMax = depth;
    }
    if ( stackMax >= stackSize || *stackCheck != MagicStackMarker ) {
	stackOverflow();
    }
}
# 11 "/usr/local/include/Awe2/CpuMultiplexor.h"
# 1 "/usr/local/include/Awe2/CpuMuxExceptions.h"
# 1 "/usr/local/include/Awe2/ExceptionClass.h"
class ExceptionClass {
public:
    ExceptionClass();
    virtual void handleException();
};
inline ExceptionClass::ExceptionClass()
{
}
# 10 "/usr/local/include/Awe2/CpuMuxExceptions.h"
class ReserveByException;
class ExceptionReserve : public ExceptionClass {
    ReserveByException *toReserve;
public:
    ExceptionReserve();
    ReserveByException *reserve();
    void reserve(ReserveByException *);
    virtual void handleException();
};
inline
ExceptionReserve::ExceptionReserve()
{
}
inline ReserveByException *
ExceptionReserve::reserve()
{
    return(toReserve);
}
inline void
ExceptionReserve::reserve(ReserveByException *r)
{
    toReserve = r;
}
class Thread;
class ExceptionTerminate : public ExceptionClass {
    void **stackOfDeadThread;
public:
    ExceptionTerminate();
    void terminate(void **);
    virtual void handleException();
};
inline
ExceptionTerminate::ExceptionTerminate()
{
}
inline void
ExceptionTerminate::terminate(void **r)
{
    stackOfDeadThread = r;
}
class ExceptionReschedule : public ExceptionClass {
    int newCpu;
public:
    ExceptionReschedule();
    void cpu(int = -1);
    virtual void handleException();
};
inline
ExceptionReschedule::ExceptionReschedule()
{
}
inline void
ExceptionReschedule::cpu(int c)
{
    newCpu = c;
}
class ExceptionIveSuspended : public ExceptionClass {
public:
    ExceptionIveSuspended();
    virtual void handleException();
};
inline
ExceptionIveSuspended::ExceptionIveSuspended()
{
}
class ExceptionEnrollDismissCpu : public ExceptionClass {
    int enrollOrDismiss;
public:
    void enroll();
    void dismiss();
    virtual void handleException();
};
inline void
ExceptionEnrollDismissCpu::enroll()
{
    enrollOrDismiss = 1;
}
inline void
ExceptionEnrollDismissCpu::dismiss()
{
    enrollOrDismiss = 0;
}
# 12 "/usr/local/include/Awe2/CpuMultiplexor.h"
# 1 "/usr/local/include/Awe2/SpinLock.h"
# 1 "/usr/local/include/Awe2/assert.h"
# 42 "/usr/local/include/Awe2/assert.h"
# 16 "/usr/local/include/Awe2/SpinLock.h"
# 1 "/usr/local/include/Awe2/Config.h"
# 21 "/usr/local/include/Awe2/Config.h"
# 17 "/usr/local/include/Awe2/SpinLock.h"
static const char SpinLockFree = '\x00';
static const char SpinLockHeld = '\xff';
class SpinLock {
	int state;	 
	int pCount;
public:
	inline SpinLock();
	inline ~SpinLock();
	void reserve();
	void release();
	int count();
};
inline
SpinLock::SpinLock()
{
	state = SpinLockFree;
	pCount = 0;
}
inline
SpinLock::~SpinLock()
{
	{ if ((state == SpinLockFree)) ; else _assert( "state == SpinLockFree", "/usr/local/include/Awe2/SpinLock.h",43); } ;
}
  inline void
  SpinLock::reserve()
  {
    { if ((state == SpinLockFree)) ; else _assert( "state == SpinLockFree", "/usr/local/include/Awe2/SpinLock.h",50); } ;
    state = ~SpinLockFree;
  }
inline void
SpinLock::release()
{
	{ if ((state != SpinLockFree)) ; else _assert( "state != SpinLockFree", "/usr/local/include/Awe2/SpinLock.h",58); } ;
	state = SpinLockFree;
}
inline int
SpinLock::count()
{
	return pCount;
}
# 13 "/usr/local/include/Awe2/CpuMultiplexor.h"
# 1 "/usr/local/include/Awe2/ThreadContainer.h"
# 1 "/usr/local/include/Awe2/Awesime.h"
# 1 "/usr/local/Gnu/lib/g++-include/stream.h"
# 160 "/usr/local/Gnu/lib/g++-include/stream.h"
# 24 "/usr/local/include/Awe2/Awesime.h"
# 1 "/usr/local/Gnu/lib/g++-include/std.h"
# 225 "/usr/local/Gnu/lib/g++-include/std.h"
# 27 "/usr/local/include/Awe2/Awesime.h"
# 53 "/usr/local/include/Awe2/Awesime.h"
class Awesime;
typedef Awesime *AwesimePtr;
typedef void *VoidPtr;
extern const int SubClassResponsibility;
class Awesime {
protected:
    int debugFlag;
public :
    inline Awesime(bool xdebug = 0) {
	debugFlag = xdebug;
    }
    inline ~Awesime(){};
    virtual bool debug();
    virtual bool debug(bool x);
    virtual void classResetInternalState();
    virtual void classReportState(ostream&);
    virtual void classPrintOn(ostream& s);
    virtual const char* classIsA();
    virtual AwesimePtr classCopy();
    virtual AwesimePtr classDeepCopy();
    virtual void subClassResponsibility(char *name = "");
};
inline ostream&
operator<<(ostream& strm, const Awesime& ob)
{
    ob.classPrintOn(strm);
    return strm;
}
# 10 "/usr/local/include/Awe2/ThreadContainer.h"
class Thread;
class ThreadContainer : public Awesime {
    public :
    inline ThreadContainer(bool xdebug = 0) : (xdebug) {}
    virtual void add( Thread* );
    virtual void add( double when, Thread* );
    virtual void add( int when, Thread* );
    virtual Thread* remove();
    virtual Thread* remove(Thread* toRemove);
    virtual bool isEmpty();
    virtual unsigned size();
};
# 19 "/usr/local/include/Awe2/CpuMultiplexor.h"
class Thread;
class ReserveByException;
class AwesimeHeap;
class SpinLock;
class SpinFetchAndOp;
class CpuMultiplexor;
extern int CpuMultiplexors;
extern CpuMultiplexor *ThisCpu;
extern int CpuMuxDebugFlag;
extern SpinLock CpuCerrLock;
class CpuMultiplexor {
protected:
    Thread *currentThread;
    HardwareContext systemContext;
    ThreadContainer *myCurrentEvents;
    SpinLock *myCurrentEventsLock;
    int *myCurrentEventsCounter;
    SpinFetchAndOp *globalCurrentEventsCounter;
    int iYam;	 
    int pid;	 
    int oldGeneration;  
    char nameSpace[128];
    char *pNameTemplate;
    char *pName;
    int *terminated;
    int enabled;
    Thread *remove();
    void allocateLocalEventStructures(int,int);
    virtual void allocateEventStructures(int,int);
    virtual void deallocateEventStructures();
    void addUnlocked(Thread *);
    void addToAnother(int, Thread *);
    friend class ExceptionReserve;
    friend class ExceptionTerminate;
    friend class ExceptionReschedule;
    friend class ExceptionIveSuspended;
    friend class ExceptionEnrollDismissCpu;
    ExceptionClass *raisedBy;
    ExceptionReserve reserveException;
    ExceptionTerminate terminateException;
    ExceptionReschedule rescheduleException;
    ExceptionIveSuspended iveSuspendedException;
    ExceptionEnrollDismissCpu enrollDismissCpuException;
public:
    void raise(ExceptionClass *);
    void reserveByException( ReserveByException * );
    void threadTerminateException( void ** );
    void flick();
public:
    CpuMultiplexor(int debug = 0);
    virtual ~CpuMultiplexor();
    virtual void fireItUp(int Cpus = 1, unsigned shared = (4196 * 500));
    virtual void warmThePot(int);
    virtual void stirItAround();
    virtual void coolItDown();
    virtual void terminateAll();
    virtual void enrollCpu();
    virtual void dismissCpu();
    virtual void add(Thread *);
    Thread * CurrentThread();
    void debug(int newdebug);
    int debug();
    char *name();
    int cpuId();
};
inline int CpuMultiplexor::cpuId()
{
    return( iYam );
}
inline char *
CpuMultiplexor::name()
{
    return(pName);
}
inline Thread *
CpuMultiplexor::CurrentThread()
{
    return( currentThread );
}
inline void
CpuMultiplexor::addUnlocked(Thread *who)
{
    myCurrentEvents -> add( who );
}
# 1 "/usr/local/include/Awe2/Thread.h"
# 1 "/usr/local/include/Awe2/Awesime.h"
# 92 "/usr/local/include/Awe2/Awesime.h"
# 10 "/usr/local/include/Awe2/Thread.h"
# 1 "/usr/local/include/Awe2/HardwareContext.h"
# 108 "/usr/local/include/Awe2/HardwareContext.h"
# 11 "/usr/local/include/Awe2/Thread.h"
# 1 "/usr/local/include/Awe2/ThreadContainer.h"
# 31 "/usr/local/include/Awe2/ThreadContainer.h"
# 12 "/usr/local/include/Awe2/Thread.h"
# 1 "/usr/local/Gnu/lib/g++-include/stream.h"
# 160 "/usr/local/Gnu/lib/g++-include/stream.h"
# 13 "/usr/local/include/Awe2/Thread.h"
enum ThreadState { SUSPENDED, RUNNING, RUNNABLE, ZOMBIED, TERMINATED };
typedef int ThreadPriority;
class CpuMultiplexor;
class SimulationMultiplexor;
class Thread : public Awesime {
    friend class CpuMultiplexor;
    friend class SimulationMultiplexor;
    HardwareContext pContext;
    ThreadState threadState;
    ThreadPriority threadPriority;
    short cpuAffinity;
    ThreadContainer suspendedOn;
    void startOff();
    void makeTerminated();
    char* threadName;
protected:
    void name(char *);
    void state(ThreadState s);
    void makeRunnable();
    virtual void main();
public:
    Thread(char* name ="", unsigned stacksize = 1010,
	   ThreadPriority priority = 0,
	   int debug = 0, int checkStack = 1);
    virtual ~Thread();
    const HardwareContext * context();
    char* name();
    ThreadState state();
    long maxStackDepth();
    void checkStack();
    void priority(ThreadPriority newPriority);
    ThreadPriority priority();
    virtual void classPrintOn(ostream& strm);
};
inline char*
Thread::name()
{
    return threadName;
}
inline void
Thread::name(char *name)
{
    threadName = name;
}
inline void
Thread::state(ThreadState s)
{
    threadState = s;
}
inline ThreadState
Thread::state()
{
    return threadState;
}
inline long
Thread::maxStackDepth()
{
    return( pContext.maxStackDepth() );
}
inline void
Thread::checkStack()
{
    pContext.checkStack();
}
inline ThreadPriority
Thread::priority()
{
    return(threadPriority);
};
inline void
Thread::priority(ThreadPriority newPriority)
{
    threadPriority = newPriority;
}
# 169 "/usr/local/include/Awe2/CpuMultiplexor.h"
inline void
CpuMultiplexor::reserveByException( ReserveByException *sem )
{
    reserveException.reserve(sem);
    raise( &reserveException );
}
inline void
CpuMultiplexor::threadTerminateException( void **killMe )
{
    terminateException.terminate( killMe );
    raise( &terminateException );
}
inline void
CpuMultiplexor::flick()
{
    rescheduleException.cpu(-1);
    currentThread -> cpuAffinity = -1;
    raise( &rescheduleException ); 
}
inline Thread *
CurrentThread()
{
    return( ThisCpu -> CurrentThread() );
}
inline void
CheckCurrentStack()
{
    CurrentThread() -> checkStack();
}
extern ThreadContainer *AllocateHardwareCurrentEventsStructure();
# 10 "/usr/local/include/Awe2/SimulationMultiplexor.h"
# 1 "/usr/local/include/Awe2/HardwareContext.h"
# 108 "/usr/local/include/Awe2/HardwareContext.h"
# 11 "/usr/local/include/Awe2/SimulationMultiplexor.h"
extern double CurrentSimulatedTime;
extern const double NullTime;
class SpinBarrier;
class TimeSchedulerPQ;
class SimulationMultiplexor : public CpuMultiplexor {
protected:
    TimeSchedulerPQ *myPendingEvents;
    SpinLock *myPendingEventsLock;
    SpinBarrier *cpuBarrier;
    virtual int advanceTime();
    virtual void allocateLocalEventStructures(int,int);
    virtual void allocateEventStructures(int,int);
    virtual void deallocateEventStructures();
public:
    SimulationMultiplexor(int debug = 0, int barrierMaxLoops = 0);
    ~SimulationMultiplexor();
    virtual void warmThePot(int);
    virtual void stirItAround();
    virtual void coolItDown();
    virtual void addAt(Thread *, double);
    virtual void addWithDelay(Thread *, double);
    virtual void hold( double time );
    virtual void await( double time );
};
extern SimulationMultiplexor *ThisSimulationMultiplexor;
inline double simulatedClock() {
    return( CurrentSimulatedTime );
}
inline void await(double till)
{
    if ( till > CurrentSimulatedTime ) {
	ThisSimulationMultiplexor -> await(till);
    }
}
inline void hold(double holdFor)
{
    ThisSimulationMultiplexor -> await( CurrentSimulatedTime + holdFor );
}
# 2 "../Src/Task.cc"
# 1 "../Src/Task.h"
# 1 "/usr/local/include/Awe2/Thread.h"
# 123 "/usr/local/include/Awe2/Thread.h"
# 4 "../Src/Task.h"
# 1 "../Src/Globals.h"
# 1 "/usr/local/include/Awe2/Awesime.h"
# 92 "/usr/local/include/Awe2/Awesime.h"
# 4 "../Src/Globals.h"
# 1 "/usr/local/include/Awe2/SpinLock.h"
# 68 "/usr/local/include/Awe2/SpinLock.h"
# 5 "../Src/Globals.h"
class Node;
class Link;
class Thread;
class LowerBoundedFifo;
class Statistic;
class Facility;
class Barrier;
class Message;
class ostream;
class istream;
static const int MaxDiameter = 7;
static const int MaxNodes = (1 << MaxDiameter);
extern int GlobalNodes;
extern int GlobalDiameter;
extern Barrier *EveryBodyReady;
extern SpinLock DebugFileLock;
extern ostream *DebugFile;
extern SpinLock OutputLock;
extern ostream *Output;
extern SpinLock ErrorLock;
extern ostream *Error;
extern SpinLock SummaryLock;
extern ostream *Summary;
extern bool Debug;
extern bool DebugCpu;
extern Node *GlobalNode[ MaxNodes ];
extern Facility *GlobalWire[ MaxNodes ][ MaxDiameter ];
extern int GlobalWireFlaws;
extern bool GlobalBiDirectionalLinks;
extern char *NodeKind;
extern char *LinkKind;
extern int ServersPerNode;
extern int MallocDebugLevel;
static const int NOTREACHED = 0;
static const int NOTIMPLEMENTED = 0;
# 5 "../Src/Task.h"
# 1 "/usr/local/include/Awe2/Event.h"
# 1 "/usr/local/include/Awe2/ReserveByException.h"
# 1 "/usr/local/include/Awe2/Awesime.h"
# 92 "/usr/local/include/Awe2/Awesime.h"
# 10 "/usr/local/include/Awe2/ReserveByException.h"
class ExceptionReserve;
class Thread;
class ReserveByException : public Awesime {
    friend class ExceptionReserve;
private:
    virtual bool reserveByException(Thread *byWho);
public:
    ReserveByException(bool debug = FALSE);
};
inline
ReserveByException::ReserveByException(bool debug) : (debug)
{
}
# 15 "/usr/local/include/Awe2/Event.h"
# 1 "/usr/local/include/Awe2/FifoScheduler.h"
# 1 "/usr/local/include/Awe2/ThreadContainer.h"
# 31 "/usr/local/include/Awe2/ThreadContainer.h"
# 10 "/usr/local/include/Awe2/FifoScheduler.h"
# 1 "/usr/local/include/Awe2/AwesimeFifo.h"
# 1 "/usr/local/include/Awe2/GenericFifo.h"
# 1 "/usr/local/include/Awe2/Awesime.h"
# 92 "/usr/local/include/Awe2/Awesime.h"
# 16 "/usr/local/include/Awe2/GenericFifo.h"
# 1 "/usr/local/include/Awe2/Generic.h"
# 51 "/usr/local/include/Awe2/Generic.h"
# 17 "/usr/local/include/Awe2/GenericFifo.h"
typedef AwesimePtr  AwesimeFifoItem  ;
typedef unsigned short  AwesimeFifoIndex  ;
class AwesimeFifo  : public Awesime  {
    AwesimeFifoItem   *list;
    AwesimeFifoIndex   allocatedSize;
    AwesimeFifoIndex   listHead;
    AwesimeFifoIndex   listTail;
    char *pValid;
    unsigned int listElements;
    inline AwesimeFifoIndex   advance(AwesimeFifoIndex   i) {
	return( ((i+1) >= allocatedSize) ? (0) : (i+1) );
    }
public:
    inline AwesimeFifo (int defaultLength = 0, bool xdebug = 0) : (xdebug) {
	listHead = listTail = 0;
	listElements = 0;
	allocatedSize = 0;
	list = 0;
	pValid = 0;
	if (defaultLength > 0) {
	    reSize(defaultLength);
	}
    }
    virtual ~AwesimeFifo ();
    void reSize(int howMany);
    virtual void add(AwesimeFifoItem   *t);
    virtual bool remove(AwesimeFifoItem   *item);
    virtual bool removeIfFound(AwesimeFifoItem  * item);
    virtual bool doStart( AwesimeFifoIndex   &index,
			 AwesimeFifoItem  * item);
    virtual bool doDelete(AwesimeFifoIndex   &index);
    virtual bool doNext( AwesimeFifoIndex   &index,
			AwesimeFifoItem  * item);
    virtual void doDone();
    inline bool valid(AwesimeFifoIndex   index) {
	return ( pValid[index] );
    }
    inline AwesimeFifoItem   & item(AwesimeFifoIndex   i) {
	return( list[i] );
    }
    inline AwesimeFifoIndex   maxIndex() {
	return(allocatedSize);
    }
    virtual bool isEmpty();
    virtual unsigned int size();
    virtual void classPrintOn(ostream& s);
    virtual const char* classIsA();
};
# 13 "/usr/local/include/Awe2/AwesimeFifo.h"
# 11 "/usr/local/include/Awe2/FifoScheduler.h"
class Thread;
class FifoScheduler : public ThreadContainer {
    AwesimeFifo fifo;
public:
    FifoScheduler(int defaultLength = 0, bool xdebug = 0);
    virtual void add(Thread *t);
    virtual void add(double when, Thread *t);
    virtual Thread* remove();
    virtual Thread* remove(Thread*);
    virtual bool isEmpty();
    virtual unsigned size();
    virtual void classPrintOn(ostream& s);
};
# 16 "/usr/local/include/Awe2/Event.h"
# 1 "/usr/local/include/Awe2/SpinLock.h"
# 68 "/usr/local/include/Awe2/SpinLock.h"
# 17 "/usr/local/include/Awe2/Event.h"
class Event : public ReserveByException {
    SpinLock lock;
    short garcon;
    short generation;
    short pLoops;
    FifoScheduler pPileOfThreads;
    void releaseAll();
private:
    virtual bool reserveByException(Thread *byWho);
public:
    Event(int loops = 0);
    virtual ~Event();
    int size();
    void waitFor();
    void trigger();
    virtual void classPrintOn(ostream&);
};
inline
Event::Event(int l)
{
    garcon = 0;
    generation = 0;
    pLoops = l;
}
# 6 "../Src/Task.h"
# 1 "/usr/local/include/Awe2/Semaphore.h"
# 1 "/usr/local/include/Awe2/ReserveByException.h"
# 31 "/usr/local/include/Awe2/ReserveByException.h"
# 25 "/usr/local/include/Awe2/Semaphore.h"
# 1 "/usr/local/include/Awe2/SpinLock.h"
# 68 "/usr/local/include/Awe2/SpinLock.h"
# 26 "/usr/local/include/Awe2/Semaphore.h"
# 1 "/usr/local/include/Awe2/ThreadContainer.h"
# 31 "/usr/local/include/Awe2/ThreadContainer.h"
# 27 "/usr/local/include/Awe2/Semaphore.h"
class Semaphore : public ReserveByException {
protected:
    SpinLock lock;
    ThreadContainer *pScheduler;
    int pCount;
private:
    virtual bool reserveByException( Thread *byWho );
public :
    Semaphore(int count = 1,
	      ThreadContainer *scheduler = 0,
	      bool debug = FALSE);
    virtual ~Semaphore();
    virtual void reserve();
    virtual void release();
    virtual bool reserveNoBlock();
    virtual unsigned size();
    virtual int count();
    virtual int count(int count);
    virtual void incrCount(int increment);
    bool isEmpty();
    virtual void classPrintOn(ostream&);
};
inline bool
Semaphore::isEmpty()
{
    return( size() == 0);
}
# 7 "../Src/Task.h"
class Task;
class RecordFifo;
class Task;
extern int GlobalTotalTasks;
extern Task **GlobalTask;
class Task : public Thread {
protected:
    char nameStr[64];
    double born;
    protected: int pid ; void id(int);public: int id() ;
    protected: Task * pparent ; void parent(Task *);public: Task * parent() ;
    protected: int plevel ; void level(int);public: int level() ;
    protected: Message * pmessages ; void messages(Message *);public: Message * messages() ;
    protected: Task * pnodeChain ;public: Task * nodeChain(); void nodeChain(Task *) ;
    protected: int pnodeNumber ;public: int nodeNumber(); void nodeNumber(int) ;
protected:
    Semaphore messagesLock;
    int waitingFor;
    Event messagesEvent;
    RecordFifo *record;
    Node *node;
    int pDebug;
    char pNameStr[32];
    virtual Message *recv( int what );
    virtual void send( int toPid, int what, int size );
public:
    Task(int node, int id, Task *parent, int level, bool debug);
    virtual void main();
    virtual void delivery( Message * );
};
inline int Task::id(){ return( pid  );} inline void Task::id(int x){ pid  = x;} ;
inline Task * Task::parent(){ return( pparent  );} inline void Task::parent(Task * x){ pparent  = x;} ;
inline int Task::level(){ return( plevel  );} inline void Task::level(int x){ plevel  = x;} ;
inline Message * Task::messages(){ return( pmessages  );} inline void Task::messages(Message * x){ pmessages  = x;} ;
inline Task * Task::nodeChain(){ return( pnodeChain  );} inline void Task::nodeChain(Task * x){ pnodeChain  = x;} ;
inline int Task::nodeNumber(){ return( pnodeNumber  );} inline void Task::nodeNumber(int x){ pnodeNumber  = x;} ;
# 3 "../Src/Task.cc"
# 1 "../Src/Node.h"
# 1 "../Src/Globals.h"
# 102 "../Src/Globals.h"
# 4 "../Src/Node.h"
# 1 "/usr/local/include/Awe2/SpinLock.h"
# 68 "/usr/local/include/Awe2/SpinLock.h"
# 5 "../Src/Node.h"
class Task;
class ForkRequest;
class Node {
protected:
    Facility *cpu;
    virtual double workload();
protected:
    LowerBoundedFifo *messages;
protected:
    Link *links[ MaxDiameter ];
    bool routeExists[ MaxNodes ];
    protected: int punroutable ;public: int unroutable(); void unroutable(int) ;
protected:
private:
    char pNameStr[32];
    protected: char * pname ; void name(char *);public: char * name() ;
    protected: int pnodeNumber ; void nodeNumber(int);public: int nodeNumber() ;
protected:
    SpinLock tasksLock;
    protected: int pnumberOfTasks ; void numberOfTasks(int);public: int numberOfTasks() ;
    protected: Task * ptasks ; void tasks(Task *);public: Task * tasks() ;
protected:
    virtual void createLinks();
    virtual int selectNode();
    virtual bool findRoute(int, int, int);
public:
    Node(int node);
    ~Node();
    Link *link(int);
    virtual void enroll( Task * );
    virtual void fork( ForkRequest * );
    virtual void compute(Task *, double);
    virtual void dismiss( Task * );
    virtual void send( Message*);
    virtual void enqueue( Message*);
    virtual void recv( Message*);
    virtual Message *shipOut();
    virtual bool checkConnectivity();
};
inline int Node::numberOfTasks(){ return( pnumberOfTasks  );} inline void Node::numberOfTasks(int x){ pnumberOfTasks  = x;} ;
inline char * Node::name(){ return( pname  );} inline void Node::name(char * x){ pname  = x;} 
inline int Node::nodeNumber(){ return( pnodeNumber  );} inline void Node::nodeNumber(int x){ pnodeNumber  = x;} 
inline Task * Node::tasks(){ return( ptasks  );} inline void Node::tasks(Task * x){ ptasks  = x;} 
inline int Node::unroutable(){ return( punroutable  );} inline void Node::unroutable(int x){ punroutable  = x;} ;
inline Link *
Node::link(int n)
{
    return(links[n]);
}
static int NodeBounds(int node)
{
    { if (( node > -1 && node < GlobalNodes )) ; else _assert( "node > -1 && node < GlobalNodes", "../Src/Node.h",82); } ;
}
# 4 "../Src/Task.cc"
# 1 "../Src/Globals.h"
# 102 "../Src/Globals.h"
# 5 "../Src/Task.cc"
# 1 "../Src/RecordFifo.h"
# 1 "/usr/local/include/Awe2/LockedFifo.h"
# 1 "/usr/local/include/Awe2/Semaphore.h"
# 70 "/usr/local/include/Awe2/Semaphore.h"
# 10 "/usr/local/include/Awe2/LockedFifo.h"
# 1 "/usr/local/include/Awe2/AwesimeFifo.h"
# 15 "/usr/local/include/Awe2/AwesimeFifo.h"
# 11 "/usr/local/include/Awe2/LockedFifo.h"
class LockedFifo : public AwesimeFifo {
protected:
    Semaphore fifoLock;
public:
    inline LockedFifo(int defaultLength = 0)
	: (defaultLength), fifoLock(1) {
	}
    virtual void add(AwesimeFifoItem *t);
    virtual bool remove(AwesimeFifoItem *item);
    virtual bool removeIfFound(AwesimeFifoItem* item);
    virtual bool doStart( AwesimeFifoIndex& index, AwesimeFifoItem* item);
    virtual void doDone();
    virtual unsigned int size();
    virtual void classPrintOn(ostream& s);
};
# 4 "../Src/RecordFifo.h"
# 1 "../Src/WorkRecord.h"
# 1 "/usr/local/include/Awe2/Awesime.h"
# 92 "/usr/local/include/Awe2/Awesime.h"
# 4 "../Src/WorkRecord.h"
enum WorkKind {
    WorkTime,
    WorkBorn,
    WorkCompute,
    WorkFork,
    WorkJoin,
    WorkSend,
    WorkRecv,
    WorkDie
    };
class WorkRecord : public Awesime {
    WorkKind pKind;
    union {
	double howLong;
	int who;
	WorkRecord *next;  
    } un;
    int messageNumber;
    int messageSize;
public:
    WorkRecord(WorkKind kind);
    WorkRecord(WorkKind kind, double howLong);
    WorkRecord(WorkKind kind, int who);
    WorkRecord(WorkKind kind, int who, int msg);
    WorkRecord(WorkKind kind, int who, int msg, int size);
    WorkRecord *operator new(long);
    void operator delete(void *);
    WorkRecord *next();
    void next(WorkRecord *);
    WorkKind kind();
    void kind(WorkKind);
    double howLong();
    int who();
    int what();
    int size();
    virtual void classPrintOn(ostream& s);
};
inline WorkRecord *
WorkRecord::next()
{
    return(un.next);
}
inline void
WorkRecord::next(WorkRecord * n)
{
    un.next = n;
}
inline WorkKind
WorkRecord::kind()
{
    return(pKind);
}
inline void
WorkRecord::kind(WorkKind n)
{
    pKind = n;
}
inline double
WorkRecord::howLong()
{
     return( un.howLong );
}
inline int
WorkRecord::who()
{
     return( un.who );
}
inline int
WorkRecord::what()
{
     return( messageNumber );
}
inline int
WorkRecord::size()
{
     return( messageSize );
}
# 5 "../Src/RecordFifo.h"
class RecordFifo : public LockedFifo {
    bool buildRecord;
    double lastRecord;
    WorkKind lastAction;
    double lastComputeTime;
    double lastComputeStart;
    bool pendingCompute;
    void preRecord();
public:
    RecordFifo( bool build = TRUE );
    void born( int );
    void fork( int );
    void join( int );
    void send( int, int msg, int size);
    void recv( int, int msg);
    void compute( double );
    void die ();
};
# 6 "../Src/Task.cc"
# 1 "../Src/WorkRecord.h"
# 101 "../Src/WorkRecord.h"
# 7 "../Src/Task.cc"
# 1 "../Src/ReadCompact.h"
extern int GlobalTotalTasks;
extern int GlobalTotalMessages;
class RecordFifo;
extern RecordFifo **GlobalRecords;
void ReadCompact(     struct _iobuf  * );
# 8 "../Src/Task.cc"
# 1 "../Src/ForkRequest.h"
# 1 "../Src/Globals.h"
# 102 "../Src/Globals.h"
# 4 "../Src/ForkRequest.h"
class Task;
class ForkRequest;
class ForkRequest {
protected:
    protected: int pwho ; void who(int);public: int who() ;
    protected: Task * pparent ; void parent(Task *);public: Task * parent() ;
    protected: int plevel ; void level(int);public: int level() ;
    protected: int pdebug ; void debug(int);public: int debug() ;
    protected: ForkRequest * pnext ;public: ForkRequest * next(); void next(ForkRequest *) ;
protected:
    void allocate();
public:
    ForkRequest(int who, Task *parent, int level, int debug );
    ~ForkRequest();
};
inline int ForkRequest::who(){ return( pwho  );} inline void ForkRequest::who(int x){ pwho  = x;} ;
inline Task * ForkRequest::parent(){ return( pparent  );} inline void ForkRequest::parent(Task * x){ pparent  = x;} ;
inline int ForkRequest::level(){ return( plevel  );} inline void ForkRequest::level(int x){ plevel  = x;} ;
inline int ForkRequest::debug(){ return( pdebug  );} inline void ForkRequest::debug(int x){ pdebug  = x;} ;
inline ForkRequest * ForkRequest::next(){ return( pnext  );} inline void ForkRequest::next(ForkRequest * x){ pnext  = x;} 
# 9 "../Src/Task.cc"
# 1 "../Src/Message.h"
# 1 "/usr/local/include/Awe2/Awesime.h"
# 92 "/usr/local/include/Awe2/Awesime.h"
# 4 "../Src/Message.h"
# 1 "../Src/Globals.h"
# 102 "../Src/Globals.h"
# 5 "../Src/Message.h"
class Task;
class Load;
typedef enum {MessageSingle, MessageBroadcast} MessageCategory;
class Message {
    protected: int ptoNode ;public: int toNode(); void toNode(int) ;
    protected: int pfromNode ; void fromNode(int);public: int fromNode() ;
    protected: int ptoPid ; void toPid(int);public: int toPid() ;
    protected: Task * ptoTask ; void toTask(Task *);public: Task * toTask() ;
    protected: int pfromPid ; void fromPid(int);public: int fromPid() ;
    protected: MessageCategory pcategory ; void category(MessageCategory);public: MessageCategory category() ;
    protected: int pstage ; void stage(int);public: int stage() ;
    protected: char * pbody ; void body(char *);public: char * body() ;
    protected: int psize ; void size(int);public: int size() ;
    protected: int pid ; void id(int);public: int id() ;
    protected: double ptimeSent ;public: double timeSent(); void timeSent(double) ;
    protected: Load * pload ;public: Load * load(); void load(Load *) ;
    protected: Message * pnext ;public: Message * next(); void next(Message *) ;
    protected: double pwhen ;public: double when(); void when(double) ;
    protected: int pcheck ; void check(int);public: int check() ;
public:
    Message();
    Message(int fromPid, int fromNode, int id,
	    int toPid, int toNode, Task *toTask,
	    char *body, int size );
    Message *operator new(long);
    void operator delete(void *);
    void classPrintOn(ostream&);
};
inline ostream&
operator<<(ostream& strm, const Message& ob)
{
    ob.classPrintOn(strm);
    return strm;
}
inline int Message::toNode(){ return( ptoNode  );} inline void Message::toNode(int x){ ptoNode  = x;} 
inline int Message::fromNode(){ return( pfromNode  );} inline void Message::fromNode(int x){ pfromNode  = x;} 
inline int Message::id(){ return( pid  );} inline void Message::id(int x){ pid  = x;} 
inline Task * Message::toTask(){ return( ptoTask  );} inline void Message::toTask(Task * x){ ptoTask  = x;} 
inline int Message::toPid(){ return( ptoPid  );} inline void Message::toPid(int x){ ptoPid  = x;} 
inline int Message::fromPid(){ return( pfromPid  );} inline void Message::fromPid(int x){ pfromPid  = x;} 
inline MessageCategory Message::category(){ return( pcategory  );} inline void Message::category(MessageCategory x){ pcategory  = x;} 
inline int Message::stage(){ return( pstage  );} inline void Message::stage(int x){ pstage  = x;} 
inline char* Message::body(){ return( pbody  );} inline void Message::body(char* x){ pbody  = x;} 
inline int Message::size(){ return( psize  );} inline void Message::size(int x){ psize  = x;} 
inline double Message::timeSent(){ return( ptimeSent  );} inline void Message::timeSent(double x){ ptimeSent  = x;} 
inline Load * Message::load(){ return( pload  );} inline void Message::load(Load * x){ pload  = x;} 
inline Message * Message::next(){ return( pnext  );} inline void Message::next(Message * x){ pnext  = x;} 
inline double Message::when(){ return( pwhen  );} inline void Message::when(double x){ pwhen  = x;} 
inline int Message::check(){ return( pcheck  );} inline void Message::check(int x){ pcheck  = x;} 
# 10 "../Src/Task.cc"
Task **GlobalTask;
int GlobalTotalTasks;
RecordFifo **GlobalRecords;
Task::Task(int xnode, int xid, Task *xparent, int xlevel, bool xdebug)
    : ("Task", 5000, 0, 0, 1), messagesEvent(0)
{
    nodeNumber(xnode);
    id(xid);
    parent(xparent);
    level(xlevel);
    pDebug = xdebug;
    { if (( id() >= 0 && id () <= GlobalTotalTasks )) ; else _assert( "id() >= 0 && id () <= GlobalTotalTasks", "../Src/Task.cc",40); } ;
    GlobalTask[ id() ] = this;
    record = GlobalRecords[ id() ];
    sprintf(pNameStr, "[Task-%d]	", id() );
    name(pNameStr);
    node = GlobalNode[ nodeNumber() ];
    nodeChain(0);
    node -> enroll( this );
    messages(0);
    waitingFor = -1;
    if ( Debug && DebugFile ) { DebugFileLock.reserve() ;
    (*DebugFile) << name() << "I am born\n";
    DebugFile -> flush(); DebugFileLock.release();} ;
}
void
Task::main()
{
    for(;;) {
	WorkRecord *rec;
	bool gotOne = record -> remove( (AwesimeFifoItem *) &rec );
	if (!gotOne) {
	    if ( Debug && DebugFile ) { DebugFileLock.reserve() ;
	    (*DebugFile) << name() << "Nothing to do!\n";
	    DebugFile -> flush(); DebugFileLock.release();} ;
	    return;
	}
	if ( Debug && DebugFile ) { DebugFileLock.reserve() ;
	(*DebugFile) << name() << "Process " << *rec;
	DebugFile -> flush(); DebugFileLock.release();} ;
	switch (rec -> kind()) {
	case WorkBorn: 
	    break;
	case WorkCompute: 
	    node -> compute( this, rec -> howLong() );
	    break;
	case WorkFork:
	    node -> fork( new ForkRequest( rec -> who(), this,
					  level() + 1, pDebug) );
	    break;
	case WorkSend:
	    send( rec -> who(), rec -> what(), rec -> size() );
	    break;
	case WorkRecv:
	{
	    Message *msg = recv( rec -> what() );
	    delete(msg);
	}
	    break;
	case WorkJoin: 
	    break;
	case WorkDie: 
	    node -> dismiss( this );
	    if ( Debug && DebugFile ) { DebugFileLock.reserve() ;
	    (*DebugFile) << name() << "Die at " << simulatedClock() << "\n";
	    DebugFile -> flush(); DebugFileLock.release();} ;
	    if ( Output ) { OutputLock.reserve() ;
	    (*Output) << name() << "Die at " << simulatedClock() << "\n";
	    Output -> flush(); OutputLock.release();} ;
	    return;
	case WorkTime:
	default:
	    break;
	}
	delete rec;
    }
}
void
Task::delivery( Message *newMsg )
{
    if ( Debug && DebugFile ) { DebugFileLock.reserve() ;
    (*DebugFile) << name() << "Deliver message " << *newMsg <<"\n";
    DebugFile -> flush(); DebugFileLock.release();} ;
    messagesLock.reserve();
    newMsg -> next( messages() );
    messages( newMsg );
    if ( newMsg -> id() == waitingFor ) {
	messagesEvent.trigger();
    }
    messagesLock.release();
}
Message *
Task::recv( int what )
{
    if ( Debug && DebugFile ) { DebugFileLock.reserve() ;
    (*DebugFile) << name() << "Wait for message #" << what <<"\n";
    DebugFile -> flush(); DebugFileLock.release();} ;
    for(;;) {
	messagesLock.reserve();
	Message *msg = messages();
	Message *follow = 0;
	while ( msg && msg -> id() != what ) {
	    { if (( msg -> toNode() != -1 )) ; else _assert( "msg -> toNode() != -1", "../Src/Task.cc",157); } ;
	    { if (( follow == 0 || follow -> next() == msg )) ; else _assert( "follow == 0 || follow -> next() == msg", "../Src/Task.cc",158); } ;
	    follow = msg;
	    msg = msg -> next();
	}
	if ( msg && msg -> id() == what ) {
	    Message *nxt = msg -> next();
	    { if (( nxt == 0 || nxt -> toNode() != -1 )) ; else _assert( "nxt == 0 || nxt -> toNode() != -1", "../Src/Task.cc",165); } ;
	    if ( follow == 0 ) {			 
		messages( nxt );
	    }
	    else {
		{ if (( follow -> next() == msg )) ; else _assert( "follow -> next() == msg", "../Src/Task.cc",170); } ;
		follow -> next( nxt );	 
	    }
	    messagesLock.release();
	    msg -> next(0);
	    return( msg );
	}
	waitingFor = what;
	messagesLock.release();
	if ( Debug && DebugFile ) { DebugFileLock.reserve() ;
	(*DebugFile) << name() << "Didn't find it, wait for new messages\n";
	DebugFile -> flush(); DebugFileLock.release();} ;
	messagesEvent.waitFor();  
    }
    return( 0 );
}
void
Task::send(int toPid, int what, int size)
{
    Task *task = GlobalTask[ toPid ];
    Message *msg = new Message(id(), nodeNumber(), what,
			       toPid, 0, task,
			       0, size);
    GlobalNode[ nodeNumber() ] -> send( msg );
}

mdt@YAHI.STANFORD.EDU (Michael Tiemann) (04/02/89)

   This appears in g++ 1.34.1 for an Encore and also a Sun-3/60 w/SunOS4.0.1.
   
   I have a class (Message) that declares
   
       void operator delete(void *);
   
   and class Task uses this when deleting items. However, g++ gives me a
   message " `this' has no member function named delete". Other classes with
   `operator delete' work with no problems.
   
   When I run c++ using gdb, I find that this message is from cplus-class.c,
   line 2512:
	 if (field == NULL_TREE)
	   {
	     error ("`this' has no member named `%s'", err_name);
   
   If this is indeed a bug, I'd appreciate a patch if one is available.
   
Here's what is happening: GNU C++ thinks that operator delete is like
a member function.  Hence, when you call it, it takes a this pointer
in addition to the pointer which is being deleted.  When called from a
destructor, the address being deleted and the this pointer are the
same.  When called from other than a member function, they may be
different.  In the case you have here, GNU C++ is trying to call

	this->Task::operator delete (msg);

which is not at all what you want.  You can fix this is one of three ways:

	(1) msg->operator delete (msg);
	(2) define a destructor for class Message
	(3) fix GNU C++:

Change this code in cplus-method.c:

      rval = build_method_call (xarg1,
				get_identifier ("op$delete_expr"),
				build_tree_list (NULL_TREE, xarg2), 1, 1);
      /* This happens when the user mis-declares `operator delete'.  */

to this:

      rval = build_method_call (xarg2,
				get_identifier ("op$delete_expr"),
				build_tree_list (NULL_TREE, xarg2), 1, 1);
      /* This happens when the user mis-declares `operator delete'.  */

I guess that since operator delete is really a static member function
(and hence does not take a this parameter, the right fix is to modify
GNU C++ as I have shown for the time being, and I will fix it right
for 1.34.2.

Michael