🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by John Ngai 21371 Tue, 26 Jan 1993 02:09
G++ Version 2.3.3 Bug Report
#1420
Author: John Ngai 21371
Date: Tue, 26 Jan 1993 02:09
250 lines
6498 bytes
Hello:

I like to report a bug I find in using G++-2.3.3, which involves templates.

Here are my source files:
(1) PointerTable.t -- A template definition file.

-----------------------------------------------------------------------------
#ifndef	POINTER_TABLE_T
#include	<stdio.h>

#undef		DFT_HASH_SIZE
#define		DFT_HASH_SIZE	137

/*
  The following defines the generic PointerTable Class for use in all
  subsequent applications. In this case, the stored elements, are always
  pointers to other C++ items. Key is an integral type which admits a 
  hashing function calculation using the operator %. 
*/

template<class Key, class Item> 
class PointerTable
{
  private:

	struct Slot
	{
		Key		key;
		Item	*item;
		Slot	*next;
	};

	int		current_index;
	Slot	*current_slot;
	int		table_size;					// hash table size
	int		population;
	Slot	**head;

	// Compute the internal hash index given key.
	inline int	hash_index(Key key) { return(key % table_size); }

  public:

	inline int size() { return population; }

	// Returns item given key, NULL is not in table.
	Item *search(Key key);

	// Returns table size after inserting item (if not already there).
	int	 insert(Key key, Item *item);

	// Removes item given key, returns removed item, NULL otherwise.
	Item *remove(Key key);

	// The next two methods are for complete table traversal.
	Item *first(); 		// returns first item, NULL if table is empty
	Item *next();		// returns next item in table; NULL when table empty

	// Initialize search table with a hash table size = init_size.
	PointerTable(int init_size); // = DFT_HASH_SIZE);

	// WARNING: Destruction May cause stored pointers to become inaccessible!
	~PointerTable();
};


template<class Key, class Item>
Item *PointerTable<Key, Item>::
search(Key key)
{
	int		index = hash_index(key);
	Slot	*slot = head[index];

	while(slot)
	{	
		if(slot->key==key) break;
		slot = slot->next;
	}

	if(slot) return(slot->item);
	else	return(NULL);
}

template<class Key, class Item>
int	PointerTable<Key, Item>::
insert(Key key, Item *item)
{
	int		index = hash_index(key);
	Slot	*slot = head[index];

	while(slot)
	{	
		if(slot->key==key) break;
		slot = slot->next;
	}
	
	if(slot==NULL)	// a new item, better insert
	{
		slot = new Slot;
		slot->key = key;
		slot->item	= item;
		slot->next = head[index];
		head[index] = slot;
		population++;
	}
	else if(slot->item!=item)
		printf("PointerTable::insert: "
			   "Inserting different items with same key?");

	return(population);
}

template<class Key, class Item>
Item *PointerTable<Key, Item>::
remove(Key key)
{
	int		index = hash_index(key);
	Slot	*prev_slot = NULL, *slot = head[index];
	Item	*item;

	while(slot)
	{	
		if(slot->key==key)
		{
			if(prev_slot)
			{
				prev_slot->next = slot->next;
			}
			else	head[index] = slot->next;
			item = slot->item;
			delete slot;
			population--;
			return(item);
		}			
		prev_slot = slot;
		slot = slot->next;
	}

	// Come here with key NOT found.
	return(NULL);
}

/* 
  For complete traversal of table.
*/
template<class Key, class Item>
Item *PointerTable<Key, Item>::
first()
{
	current_index = table_size;
	current_slot = NULL;
	return(next());
}

template<class Key, class Item>
Item *PointerTable<Key, Item>::
next()
{
	Item	*item;

	while(current_slot==NULL)
	{
		if(current_index==0) return(NULL);		// no more
		current_slot = head[--current_index];
	}

	// Come here with slot found.
	item = current_slot->item;
	current_slot = current_slot->next;
	return(item);
}

template<class Key, class Item>
PointerTable<Key, Item>::
PointerTable(int init_size)
{
	table_size = init_size;
	head = new Slot *[table_size];
}


template<class Key, class Item>
PointerTable<Key, Item>::
~PointerTable()
{
	int		i;
	Slot	*slot;

	for(i=0; i<table_size; i++)
	{
		current_slot = head[i];
		while(current_slot)
		{
			slot = current_slot;
			current_slot = current_slot->next;
			delete slot;
		}
	}
}

#define	POINTER_TABLE_T
#endif
-----------------------------------------------------------------------------

(2) test.c --- A simple test program to use the PointerTable template.

-----------------------------------------------------------------------------
// Let us include the template definition header file.
#include	"PointerTable.t"

// Some random data definition.
struct XXX
{
	int    yyy;
};

main()
{
	PointerTable<int, XXX>	table;
}
-----------------------------------------------------------------------------


Here is the output generated by g++2.3.3 when compiling "test.c" on a
machine called nova:

-----------------------------------------------------------------------------
nova:508 $ g++ -v test.c
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-sunos4.1.2/2.3.3/specs
gcc version 2.3.3
 /usr/local/lib/gcc-lib/sparc-sun-sunos4.1.2/2.3.3/cpp -lang-c++ -v -undef -D__GNUC__=2 -D__GNUG__=2
 -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ -D__sparc -D__sun -D__unix test
.c /usr/tmp/cca08754.i
GNU CPP version 2.3.3 (sparc)
 /usr/local/lib/gcc-lib/sparc-sun-sunos4.1.2/2.3.3/cc1plus /usr/tmp/cca08754.i -quiet -dumpbase test
.cc -version -o /usr/tmp/cca08754.s
GNU C++ version 2.3.3 (sparc) compiled by GNU C version 2.3.3.
PointerTable.t: In function `int  main ()':
PointerTable.t:57: inconsistent return types for method `PointerTable' in class `PointerTable<int ,X
XX>'
PointerTable.t:57: too few arguments for constructor `PointerTable'
PointerTable.t:57: in base initialization for class `PointerTable<int ,XXX>'
PointerTable.t: In method `PointerTable<int ,XXX>::~PointerTable ()':
PointerTable.t:172: Internal compiler error.
PointerTable.t:172: Please report this to `bug-g++@prep.ai.mit.edu'.
nova:509 $
-----------------------------------------------------------------------------

Hope this helps. Thanks. -- John
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