🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.gcc.bug
Article #1462

gcc 2.3.1 bug with pointer to function in c++

#1462
From: Seth C. Goldstein
Date: Sat, 21 Nov 1992 05:55
201 lines
7131 bytes
Machine:	sparc
Version:	gcc version 2.3.1
OS:		SunOS Release 4.1.2
problem:	Assertion fails for type definition.

gcc-2.3.1 -DCM5 -gstabs -I. -I/usr/cm5/local/include -I/usr/cm5/include  -Dpe_obj -DPE_CODE -o bin-cm5/threads.o -c threads.C
threads.h: In method `void  Portal<int>::put (int)':
In file included from threads.C:25:
threads.h:148: warning: type specifier omitted for parameter
cp-class.c:4011: failed assertion `TREE_CODE (TREE_VALUE (rhs)) == FUNCTION_DECL'
gcc-2.3.1: Internal compiler error: program cc1plus got fatal signal 6


threads.h (upto through 148) is:

/*                                  tab:4
 *
 * threads.h - macros and class definitions for c+f
 *
 * Copyright (c) 1992 by Seth Copen Goldstein and 
 * Regents of the University of California
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  Copyright holder(s) make no
 * representation about the suitability of this software for
 * any purpose. It is provided "as is" without express or
 * implied warranty.
 *
 * Author:          Seth Copen Goldstein
 * Version:         26
 * Creation Date:   Thu Nov 19 21:49:42 1992
 * Filename:        threads.h
 * History:
 */

#ifndef _THREADS_H_
#define _THREADS_H_

#include "cm5.h"

#ifdef DEBUG
extern "C" void doDebugPrint(char *s, ...);

# define trace(x)       //printf("%3d: %-20.20s: %x\n", MYPROC, x, this)
# define debugMsg(x)    doDebugPrint x
#else
# define trace(x)
# define debugMsg(x)    
#endif

#define on(x)                   if (MYPROC == x)
#define portalFor(p,i)          Portal<int> p(this, &i)
#define forkReturn(v)           {result.put(v);return;}

#define suspend(x)                                                            \
        if (counter)                                                          \
        {                                                                     \
            restart = x;                                                      \
            return;                                                           \
        }                                                                     \
     case x:

#define startFrame()                                                          \
        switch (restart)                                                      \
        {                                                                     \
        case 0:

#define endFrame()                                                            \
            break;                                                            \
        default:                                                              \
            printf("entered %x with %d.  unknown.\n", this, restart);         \
        }
                                                                              
class Frame;

typedef int Codeptr;
typedef void (Frame::*Codeblock)(void);

class Frame
{
protected:
    
    // every function that can suspend inherits from this class and get
    // the next three instance variables. 
    
    Codeblock   cb;
    Frame       *next;
    Codeptr     restart;
    int         counter;        // only one counter per frame for this
                                // implemenation
    
    // the ready que and other globals every Frame uses
    
    static Frame *readyQ;
    static volatile int notDone;
    static Frame *currentFrame;
    static Processor nextProcessor;
    
public:
    inline                  Frame(void);
    inline                  Frame(Codeblock function, int count);
    inline                  Frame(Codeblock function);
    
    inline void             incrCount(void);
    inline void             post(void);
    inline void             run(void);
    inline void             enQ(void);
    inline void             Frame::forceEnQ(void);
    inline int              Frame::isIdle(void);
    inline void             Frame::becomeIdle(void);
    
    static Frame *          deQ(void);
    static void             printQ(void);
    static void             terminate(void);
    static void             initialize(void);
};

//  How many counters do you really need for a frame?
//  right now, I am going to try for one per frame and see how it
//  works.  If this is changed change the portal class.

#define PINLINE

template <class T>
class Portal
{
    Frame *frame;               // frame that *value resides in
    T *value;                   // the address that this portal is for
    Processor proc;             // the processor that frame resides on
    
public:
    Portal(){}
    inline Portal(Frame *f, T *v)
    {
        frame = f;
        value = v;
        proc = MYPROC;
    }
    
    inline Portal(Processor p, Frame *f, T *v)
    {
        frame = f;
        value = v;
        proc = p;
    }

    inline Frame *getFrame(void)    { return frame; }
    inline T *getDest(void)         { return value; }
    inline Processor getProc(void)  { return proc; }

    inline void         put(T v)
    {
        trace("put");
        if (proc == MYPROC)
        {
            *value = v;
            frame->post();
        }
        else
        {
            void (*foo)(Frame *, T *, Y) = &RemotePost;
            
            debugMsg(("posting to %d!%x(%x) with %d\n", proc, frame,
                      value, v));
            am_rpc3(proc, foo, frame, value, v);
        }
    }

    static void         remotepost(Frame *f,
                                   int *adr,
                                   T v);
};

//									tab:4
//
// threads.C - basic runtime sytstem for c+f
//
// Copyright (c) 1992 by Seth Copen Goldstein and 
// Regents of the University of California
//
// Permission to use, copy, modify, and distribute this
// software and its documentation for any purpose and without
// fee is hereby granted, provided that the above copyright
// notice appear in all copies.  Copyright holder(s) make no
// representation about the suitability of this software for
// any purpose. It is provided "as is" without express or
// implied warranty.
//
// Author: 			Seth Copen Goldstein
// Version:			29
// Creation Date:	Thu Nov 19 21:47:56 1992
// Filename:		threads.C
// History:
//
static char _version_string_[] = "\nVersion:1:threads.C\0\n";

#include <stdio.h>
#include "threads.h"
////////////////////////////////////// EOF
Technical Details
Message-ID: <9211212155.AA20927@boing.CS.Berkeley.EDU>
Path: arc1-ca.pugleaf.net!sparky!uunet!cs.utexas.edu!sdd.hp.com!saimiri.primate.wisc.edu!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!cs.berkeley.edu!sethg

Show Full Headers
Complete Article Headers
Newsgroups: gnu.gcc.bug
Path: arc1-ca.pugleaf.net!sparky!uunet!cs.utexas.edu!sdd.hp.com!saimiri.primate.wisc.edu!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!cs.berkeley.edu!sethg
From: sethg@cs.berkeley.edu (Seth C. Goldstein)
Subject: gcc 2.3.1 bug with pointer to function in c++
Message-ID: <9211212155.AA20927@boing.CS.Berkeley.EDU>
Sender: gnulists@ai.mit.edu
Organization: GNUs Not Usenet
Distribution: gnu
Date: Sat, 21 Nov 1992 05:55:58 GMT
Approved: bug-gcc@prep.ai.mit.edu
Lines: 202