[gnu.g++.bug] Compiler hangs

delta@CSL36H.NCSU.EDU (Thomas Hildebrandt) (12/07/89)

	I believe that a correctly functioning compiler always terminates, so
that when it does not do so, one may immediately conclude that he has
uncovered a bug.  Since the code which causes the bug appears to be
erroneous, and correct code compiles successfully, the bug can be considered
rather trivial, and therefore be assigned a low priority.
	The G++ version is 1.34, the environment is a VAX 3600 running DEC's
version of UNIX (Ultrix, or whatever they call it), I can find the version
number for you, but the error appears to be of the machine-independent
variety.  (I'm sure you also hope so.)  I have isolated the function which
causes the error.  Code follows.
				Thomas H. Hildebrandt
				delta@csl.ncsu.edu
				H: (919)851-9528
				W: (919)737-7610
				FAX(919)737-3027


#include "dict.h"
#include "misc.h"

typedef FILE* FILE_;
declare(dict,FILE_);

dict(FILE_) Filenames;

void close_files(void) // G++.1.34 compiler hangs in this function.
{
 Filenames.map(fclose);
}

// misc.hpp
#ifndef MISCH
#define MISCH


#include <stdio.h>

FILE* get_file(string Filename, string Control);


#endif
// DICT.H

#ifndef DICTH
#define DICTH
#include "define.h"
#include "generic.h"

struct item
{
 string name;
 void* value_;
 item* next_;
};

typedef void (*PVFVP)(void*);

class dictionary
{
 item* list_;

public:
    dictionary(void){list_ = NULL;}
    ~dictionary(void);
 void insert(string Name, void* Value_);
 // Insert Value_ into dictionary, indexed by Name.
 void* find(string Name);
 // Search dictionary for entry Name and return its value.
 void remove(string Name);
 // Find the entry indexed by Name and delete it.
 void map(PVFVP);
 // Map the function to all dictionary entries.
};

#define dict(type) name2(type,dict)

#define dictdeclare(type) \
typedef void (*PVFtype)(type); \
struct dict(type):dictionary\
{\
 void insert(string Name, type Value_) { dictionary::insert(Name, Value_); }\
 type find(string Name) { return (type) dictionary::find(Name); }\
 void remove(string Name) {dictionary::remove(Name);}\
 void map(PVFtype fcn_) {dictionary::map((PVFVP) fcn_); } \
};

#endif


// P.S.  Have fun.