Thread View: gnu.gcc.bug
1 messages
1 total messages
Started by Jon Dart
Thu, 12 Nov 1992 19:07
template bug in gcc 2.3.1 (core dump)
Author: Jon Dart
Date: Thu, 12 Nov 1992 19:07
Date: Thu, 12 Nov 1992 19:07
259 lines
7555 bytes
7555 bytes
The following code core-dumps g++ version 2.3.1, running on a SPARCstation 2
under Sun OS 4.1.1. I believe the code is correct and should compile.
The messages output are:
array.hh: In function `int main (int, char **)':
array.hh:56: inconsistent return types for method `Array' in class `Array<int ,i
nt>'
array.hh:56: inconsistent return types for method `Array' in class `Array<int ,i
nt>'
/usr/local/bin/gcc: Internal compiler error: program cc1plus got fatal signal 11
Apparently it does not recognize the constructor as a constructor.
------------ code follows -------------
#ifndef _SUPPORT_BOOLEAN_H
#define _SUPPORT_BOOLEAN_H
class Boolean
{
public:
inline Boolean ();
// default constructor (result is False)
inline Boolean (const long);
inline operator long () const;
// Convert between Boolean and long
private:
long Bit;
};
extern const Boolean& True;
extern const Boolean& False;
inline Boolean::Boolean ()
: Bit (0)
{}
inline Boolean::Boolean (const long That)
: Bit (That != 0)
{}
inline Boolean::operator long () const
{
return Bit;
}
#endif
#include <stddef.h>
#include <assert.h>
#include "boolean.hh"
template <class Contents, class Index >
class Array
{
public:
// Defines a simple, resizable-length array. Copy and
// assignment operators create duplicate copies of array
// elements; i.e. there is no data-sharing across array
// instances.
Array( const Index initial_size );
virtual ~Array();
Array( const Array & );
Array & operator = (const Array & );
Boolean operator == (const Array &) const;
Boolean operator != (const Array &) const;
// These functions assume that Contents has a meaningful ==
// operator
virtual Contents &operator [] (const Index &) const;
// Note: we return a reference so that Array[k] = stuff works.
// An out-of-range index calls constraint_error, below
int size() const
{
return data_size;
}
virtual void resize( const Index new_size );
// The default behavior is to allocate a new array each
// time this is called. This is not suitable if one wants
// to frequently expand the array by small increments.
// That's why it's virtual: so you can do something different.
Array &operator += (const Contents &Data );
Array &operator += (const Array &Data );
friend Array operator + (const Array&, const Contents &);
friend Array operator + (const Contents &, const Array&);
friend Array operator + (const Array&, const Array&);
virtual void constraint_error(const Index index, const Index size);
// Called when an index exceeds the bounds of the array.
// The base version causes an assertion failure (may be
// disabled by compiling with -DNDEBUG).
protected:
Contents *data;
Index data_size;
};
template <class Contents, class Index>
Array<Contents,Index>::Array( const Index initial_size )
{
data_size = initial_size;
data = new Contents [initial_size];
}
template <class Contents, class Index>
Array<Contents,Index>::~Array()
{
delete [] data;
}
template <class Contents, class Index>
Array<Contents,Index>::Array( const Array<Contents,Index> &arr)
{
data_size = arr.data_size;
data = new Contents [arr.length()];
for (Index i = 0; i < data_size; i++)
data[i] = arr.data[i];
}
template <class Contents, class Index>
Array <Contents,Index>& Array<Contents,Index>::operator = (const Array<Contents,Index> &arr)
{
if (this != &arr)
{
data_size = arr.data_size;
data = new Contents [arr.length()];
for (Index i = 0; i < data_size; i++)
data[i] = arr.data[i];
}
return *this;
}
template <class Contents, class Index>
Boolean Array<Contents,Index>::operator == (const Array<Contents,Index> & arr) const
{
if (arr.data_size != data_size)
return False;
for (Index i = 0; i<data_size;i++)
if (arr.data[i] != data[i])
return False;
return True;
}
template <class Contents, class Index>
Boolean Array<Contents,Index>::operator != (const Array<Contents,Index> & arr) const
{
if (arr.data_size != data_size)
return True;
for (Index i = 0; i<data_size;i++)
if (arr.data[i] != data[i])
return True;
return False;
}
template <class Contents, class Index>
Contents& Array<Contents,Index>::operator [](const Index &index) const
{
#ifndef NDEBUG
if (index < 0 || index >= data_size)
{
constraint_error(index,data_size);
}
#endif
return data[index];
}
template <class Contents, class Index>
Array<Contents,Index> &Array<Contents,Index>::operator += (const Contents &Data )
{
// not very efficient
Index old_data_size = data_size;
resize(data_size + 1);
data[old_size] = Data;
return *this;
}
template <class Contents, class Index>
Array<Contents,Index> &Array<Contents,Index>::operator += (const Array <Contents,Index>&Data )
{
Index old_size = data_size;
resize(data_size + Data.size);
for (Index i = old_size; i < data_size; i++)
data[i] = Data.data[i-old_size];
return *this;
}
template <class Contents, class Index>
void Array<Contents,Index>::resize( const Index new_size )
{
Contents * new_data = new Contents[new_size];
assert(new_data);
for (Index i = 0; i<data_size; i++)
new_data[i] = data[i];
delete [] data;
data = new_data;
data_size = new_size;
}
template <class Contents, class Index>
Array<Contents,Index> operator + (const Array<Contents,Index>& arr, const Contents &c)
{
Array<Contents,Index> ret_val(arr.length() + 1);
for (Index i=0;i<arr.length();i++)
ret_val.data[i] = arr.data[i];
ret_val.data[arr.length()] = c;
return ret_val;
}
template <class Contents, class Index>
Array<Contents,Index> operator + (const Contents &c, const Array<Contents,Index>&arr)
{
Array<Contents,Index> ret_val(arr.length() + 1);
for (Index i=0;i<arr.length();i++)
ret_val.data[i] = arr.data[i];
ret_val.data[arr.length()] = c;
return ret_val;
}
template <class Contents, class Index>
Array<Contents,Index> operator + (const Array<Contents,Index>&arr1,
const Array<Contents,Index>&arr2)
{
Array<Contents,Index> ret_val(arr1.length() + arr2.length());
for (Index i=0;i<arr1.length();i++)
ret_val.data[i] = arr2.data[i];
const Index start = arr1.length();
for (i=start;i<start + arr2.length();i++)
ret_val.data[i] = arr2.data[i-start];
return ret_val;
}
template <class Contents, class Index>
void Array<Contents,Index>::constraint_error(const Index index,
const Index limit)
{
assert(index >= 0 && index < limit);
}
#include "array.hh"
#include <iostream.h>
main(int argc, char**argv)
{
Array<int,int> stuff( 10 );
for (int i=0;i<stuff.size();i++)
{
stuff[i] = i*i - 8*i + 5;
cout << "stuff[" << i << "] = " << stuff[i] << endl;
}
}
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