🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by John Rauser Wed, 27 Jan 1993 03:22
Bug in g++-2.3.3
#1441
Author: John Rauser
Date: Wed, 27 Jan 1993 03:22
161 lines
4206 bytes
Hiya...

There seems to be a big squishy bug in g++-2.3.3:

Script started on Tue Jan 26 15:21:23 1993

3:21pm ~>g++ -v
Reading specs from /usr/gnu/lib/gcc-lib/sparc/2.3.3/specs
gcc version 2.3.3
3:21pm ~>exit
exit

script done on Tue Jan 26 15:21:43 1993


I was playing around, trying to learn how to use templates and I
decided to implement a stack.  So, I wrote a stack template that
had a constructor which took as an argument, an integer that was to
be the maximum size of the stack.  When I tried to compile it, I got
the following: (source listings follow at the end of the file)

3:17pm ~>g++ -Wall old-stack.cxx
old-stack.cxx: In function `int  main ()':
old-stack.cxx:13: inconsistent return types for method `stack' in class `stack<int>'
old-stack.cxx:13: inconsistent return types for method `stack' in class `stack<float>'
old-stack.cxx: In method `stack<float>::~stack ()':
old-stack.cxx:19: Internal compiler error.
old-stack.cxx:19: Please report this to `bug-g++@prep.ai.mit.edu'.


Determined, I tried various tricks to try and make the damn thing
compile... I found that if I changed the constructor so that it didn't
take any arguments, it compiled fine.  Still determined to get it to
work the way _I_ wanted (with arguments to the constructor), I tried to
put the body of the constructor inline in the class declaration, (I
tried to just use the inline directive, but that resulted in the same
error) and it compiled fine.  Now I had what I wanted... after much
hair-pulling.  

3:17pm ~>g++ -Wall stack.cxx
3:17pm ~>
Use "exit" to leave tcsh.
3:17pm ~>exit
exit


Hope this helps you folks out....

John Rauser
jrauser@staff.tc.umn.edu
jrauser@mermaid.micro.umn.edu
jmr@ddt.biochem.umn.edu
mf12003@sc.msc.edu

***************************************************************
************* Listing of stack.cxx       **********************
************* This is the one that works **********************
***************************************************************

#include<stdio.h>
#include<iostream.h>

template <class T> class stack {
 public:
  stack (int maxsize) 
    {
      data = new T[maxsize];  //This code not inline makes g++ puke.
      top = 0;
    }
 ~stack ();
  T		push (T item);
  T		pop ();
 private:
  int top;
  T* data;
};

template <class T> stack<T>::~stack () 
{
  delete data;
}

template <class T> T stack<T>::push (T item) 
{
   data[top++] = item;
   return item;
}

template <class T> T stack<T>::pop () 
{
  return data[--top];
}

int main () 
{
  stack<int> s1(20);
  stack<float> s2(20);

  s1.push (10);
  printf ("%d\n",s1.pop());

  s2.push (10.43);
  printf ("%f\n",s2.pop());

}
   


**************************************************************
********* Listing of old-stack.cxx ***************************
********* This one doesn't work    ***************************
**************************************************************
#include<stdio.h>
#include<iostream.h>

template <class T> class stack {
 public:
  stack (int maxsize);
 ~stack ();
  T		push (T item);
  T		pop ();
 private:
  int top;
  T* data;
};

template <class T> stack<T>::stack (int maxsize)
{
  data = new T[maxsize];
  top = 0;
}

template <class T> stack<T>::~stack () 
{
  delete data;
}

template <class T> T stack<T>::push (T item) 
{
   data[top++] = item;
   return item;
}

template <class T> T stack<T>::pop () 
{
  return data[--top];
}

int main () 
{
  stack<int> s1(20);
  stack<float> s2(20);

  s1.push (10);
  printf ("%d\n",s1.pop());

  s2.push (10.43);
  printf ("%f\n",s2.pop());

}
   
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads