Thread View: gnu.g++.bug
1 messages
1 total messages
Started by "Douglas C. Schmidt"
Thu, 24 Nov 1988 07:05
Program gets fatal signal on sparc for g++ 1.27
Author: "Douglas C. Schmidt"
Date: Thu, 24 Nov 1988 07:05
Date: Thu, 24 Nov 1988 07:05
670 lines
16545 bytes
16545 bytes
Hi,
The following program gets a fatal signal on the sun4. ( Sorry it's
so long ). Here's the diagnostic:
----------------------------------------
g++ version 1.27.0
/usr/public/lib/g++/gcc-cpp+ -v -I/cd/ua/schmidt/include/ -undef
-D__GNU__ -D__GNUG__ -Dsparc -Dsun -Dunix foo.cc /tmp/cca15290.cpp GNU
CPP version 1.27.0
/usr/public/lib/g++/gcc-c++ /tmp/cca15290.cpp -quiet -dumpbase foo.cc
-finline-functions -fmemoize-lookups -fsave-memoized -fchar-charconst
-noreg -version -o /tmp/cca15290.s
In function listSLList::remove_front ():
foo.cc:624: initializer unused
foo.cc:630: initializer unused
In function void listSLList::del_front ():
foo.cc:642: Segmentation violation
/usr/public/g++: Program c++ got fatal signal 11.
----------------------------------------
Doug
----------------------------------------
#include <stddef.h>
struct intSLListNode
{
intSLListNode* tl;
int hd;
intSLListNode();
intSLListNode(int& h, intSLListNode* t = 0);
~intSLListNode();
};
inline intSLListNode::intSLListNode() {}
inline intSLListNode::intSLListNode(int& h, intSLListNode* t = 0)
{
hd = h;
tl = t;
}
inline intSLListNode::~intSLListNode() {}
typedef intSLListNode* intSLListNodePtr;
class intSLListTrav;
class intSLList
{
friend class intSLListTrav;
protected:
intSLListNode* last;
public:
intSLList();
intSLList(intSLList& a);
~intSLList();
intSLList& operator = (intSLList& a);
int null();
int empty();
int valid();
const void* operator void* ();
int operator ! ();
int length();
void clear();
void prepend(int& item);
void append(int& item);
int& front();
int& rear();
int remove_front();
void del_front();
void error(const char* msg);
};
class intSLListTrav
{
friend class intSLList;
protected:
intSLList* L;
intSLListNode* current;
public:
intSLListTrav(intSLList& l);
~intSLListTrav();
int null();
int valid();
const void* operator void* ();
int operator ! ();
void advance();
int& get();
void reset();
void reset(intSLList& l);
void insert_after(int&item);
};
class intSLStack : private intSLList
{
public:
intSLList::null();
intSLList::empty();
intSLList::clear();
intSLList::length();
intSLList::operator ! ();
intSLList::operator void*();
intSLList::error(const char* msg);
intSLStack();
intSLStack(intSLStack& a);
~intSLStack();
intSLStack& operator = (intSLStack& a);
void push(int& item);
int pop();
int& top();
void del_top();
};
class intSLQueue: private intSLList
{
public:
intSLList::null();
intSLList::empty();
intSLList::clear();
intSLList::length();
intSLList::operator ! ();
intSLList::operator void*();
intSLList::error(const char* msg);
intSLList::front();
intSLList::rear();
intSLList::del_front();
intSLQueue();
intSLQueue(intSLQueue& a);
~intSLQueue();
intSLQueue& operator = (intSLQueue& a);
void enq(int& item);
int deq();
};
extern void default_intSLList_error_handler(char*);
extern one_arg_error_handler_t intSLList_error_handler;
extern one_arg_error_handler_t
set_intSLList_error_handler(one_arg_error_handler_t f);
inline intSLList::~intSLList()
{
clear();
}
inline intSLList::intSLList()
{
last = 0;
}
inline int intSLList::null()
{
return last == 0;
}
inline int intSLList::empty()
{
return last == 0;
}
inline int intSLList::valid()
{
return last != 0;
}
inline const void* intSLList::operator void* ()
{
return (last == 0)? 0 : this;
}
inline int intSLList::operator ! ()
{
return last == 0;
}
inline int intSLList::length()
{
if (last == 0)
return 0;
else
{
int l = 1;
for (intSLListNode* p = last->tl; p != last; p = p->tl) ++l;
return l;
}
}
inline intSLListTrav::intSLListTrav(intSLList& a)
{
L = &a;
if (a.last == 0)
current = 0;
else
current = a.last->tl;
}
inline void intSLListTrav::reset()
{
if (L->last == 0) current = 0; else current = L->last->tl;
}
inline void intSLListTrav::reset(intSLList& a)
{
L = &a;
if (a.last == 0)
current = 0;
else
current = a.last->tl;
}
inline intSLListTrav::~intSLListTrav() {}
inline int intSLListTrav::null()
{
return current == 0;
}
inline int intSLListTrav::valid()
{
return current != 0;
}
inline const void* intSLListTrav::operator void* ()
{
return (current == 0)? 0 : this;
}
inline int intSLListTrav::operator ! ()
{
return (current == 0);
}
inline void intSLListTrav::advance()
{
if (current != 0)
{
current = (current == L->last)? 0 : current->tl;
}
}
inline int& intSLListTrav::get()
{
if (current == 0)
(*intSLList_error_handler)("get from null traverser");
return current->hd;
}
inline int& intSLList::front()
{
if (last == 0)
error("front: empty list");
return last->tl->hd;
}
inline int& intSLList::rear()
{
if (last == 0)
error("rear: empty list");
return last->hd;
}
inline intSLStack::intSLStack() {}
inline intSLStack::intSLStack(intSLStack& a) : (a) {}
inline intSLStack::~intSLStack() {}
inline intSLStack& intSLStack::operator = (intSLStack& a)
{
intSLList::operator = (a); return *this;
}
inline void intSLStack::push(int& item)
{
intSLList::prepend(item);
}
inline void intSLStack::del_top()
{
intSLList::del_front();
}
inline int& intSLStack::top()
{
return intSLList::front();
}
inline int intSLStack::pop()
{
return intSLList::remove_front();
}
inline intSLQueue::intSLQueue() {}
inline intSLQueue::intSLQueue(intSLQueue& a) : (a) {}
inline intSLQueue::~intSLQueue() {}
inline intSLQueue& intSLQueue::operator = (intSLQueue& a)
{
intSLList::operator = (a); return *this;
}
inline void intSLQueue::enq(int& item)
{
intSLList::append(item);
}
inline int intSLQueue::deq()
{
return intSLList::remove_front();
}
struct list {
int project;
intSLList component_list;
};
struct listSLListNode
{
listSLListNode* tl;
list hd;
listSLListNode();
listSLListNode(list& h, listSLListNode* t = 0);
~listSLListNode();
};
inline listSLListNode::listSLListNode() {}
inline listSLListNode::listSLListNode(list& h, listSLListNode* t = 0)
{
hd = h;
tl = t;
}
inline listSLListNode::~listSLListNode() {}
typedef listSLListNode* listSLListNodePtr;
class listSLListTrav;
class listSLList
{
friend class listSLListTrav;
protected:
listSLListNode* last;
public:
listSLList();
listSLList(listSLList& a);
~listSLList();
listSLList& operator = (listSLList& a);
int null();
int empty();
int valid();
const void* operator void* ();
int operator ! ();
int length();
void clear();
void prepend(list& item);
void append(list& item);
list& front();
list& rear();
list remove_front();
void del_front();
void error(const char* msg);
};
class listSLListTrav
{
friend class listSLList;
protected:
listSLList* L;
listSLListNode* current;
public:
listSLListTrav(listSLList& l);
~listSLListTrav();
int null();
int valid();
const void* operator void* ();
int operator ! ();
void advance();
list& get();
void reset();
void reset(listSLList& l);
void insert_after(list&item);
};
class listSLStack : private listSLList
{
public:
listSLList::null();
listSLList::empty();
listSLList::clear();
listSLList::length();
listSLList::operator ! ();
listSLList::operator void*();
listSLList::error(const char* msg);
listSLStack();
listSLStack(listSLStack& a);
~listSLStack();
listSLStack& operator = (listSLStack& a);
void push(list& item);
list pop();
list& top();
void del_top();
};
class listSLQueue: private listSLList
{
public:
listSLList::null();
listSLList::empty();
listSLList::clear();
listSLList::length();
listSLList::operator ! ();
listSLList::operator void*();
listSLList::error(const char* msg);
listSLList::front();
listSLList::rear();
listSLList::del_front();
listSLQueue();
listSLQueue(listSLQueue& a);
~listSLQueue();
listSLQueue& operator = (listSLQueue& a);
void enq(list& item);
list deq();
};
extern void default_listSLList_error_handler(char*);
extern one_arg_error_handler_t listSLList_error_handler;
extern one_arg_error_handler_t
set_listSLList_error_handler(one_arg_error_handler_t f);
inline listSLList::~listSLList()
{
clear();
}
inline listSLList::listSLList()
{
last = 0;
}
inline int listSLList::null()
{
return last == 0;
}
inline int listSLList::empty()
{
return last == 0;
}
inline int listSLList::valid()
{
return last != 0;
}
inline const void* listSLList::operator void* ()
{
return (last == 0)? 0 : this;
}
inline int listSLList::operator ! ()
{
return last == 0;
}
inline int listSLList::length()
{
if (last == 0)
return 0;
else
{
int l = 1;
for (listSLListNode* p = last->tl; p != last; p = p->tl) ++l;
return l;
}
}
inline listSLListTrav::listSLListTrav(listSLList& a)
{
L = &a;
if (a.last == 0)
current = 0;
else
current = a.last->tl;
}
inline void listSLListTrav::reset()
{
if (L->last == 0) current = 0; else current = L->last->tl;
}
inline void listSLListTrav::reset(listSLList& a)
{
L = &a;
if (a.last == 0)
current = 0;
else
current = a.last->tl;
}
inline listSLListTrav::~listSLListTrav() {}
inline int listSLListTrav::null()
{
return current == 0;
}
inline int listSLListTrav::valid()
{
return current != 0;
}
inline const void* listSLListTrav::operator void* ()
{
return (current == 0)? 0 : this;
}
inline int listSLListTrav::operator ! ()
{
return (current == 0);
}
inline void listSLListTrav::advance()
{
if (current != 0)
{
current = (current == L->last)? 0 : current->tl;
}
}
inline list& listSLListTrav::get()
{
if (current == 0)
(*listSLList_error_handler)("get from null traverser");
return current->hd;
}
inline list& listSLList::front()
{
if (last == 0)
error("front: empty list");
return last->tl->hd;
}
inline list& listSLList::rear()
{
if (last == 0)
error("rear: empty list");
return last->hd;
}
inline listSLStack::listSLStack() {}
inline listSLStack::listSLStack(listSLStack& a) : (a) {}
inline listSLStack::~listSLStack() {}
inline listSLStack& listSLStack::operator = (listSLStack& a)
{
listSLList::operator = (a); return *this;
}
inline void listSLStack::push(list& item)
{
listSLList::prepend(item);
}
inline void listSLStack::del_top()
{
listSLList::del_front();
}
inline list& listSLStack::top()
{
return listSLList::front();
}
inline list listSLStack::pop()
{
return listSLList::remove_front();
}
inline listSLQueue::listSLQueue() {}
inline listSLQueue::listSLQueue(listSLQueue& a) : (a) {}
inline listSLQueue::~listSLQueue() {}
inline listSLQueue& listSLQueue::operator = (listSLQueue& a)
{
listSLList::operator = (a); return *this;
}
inline void listSLQueue::enq(list& item)
{
listSLList::append(item);
}
inline list listSLQueue::deq()
{
return listSLList::remove_front();
}
// error handling
void default_listSLList_error_handler(char* msg)
{
exit(1);
}
one_arg_error_handler_t listSLList_error_handler = default_listSLList_error_handler;
one_arg_error_handler_t set_listSLList_error_handler(one_arg_error_handler_t f)
{
one_arg_error_handler_t old = listSLList_error_handler;
listSLList_error_handler = f;
return old;
}
void listSLList::error(const char* msg)
{
(*listSLList_error_handler)(msg);
}
listSLList::listSLList(listSLList& a)
{
if (a.last == 0)
last = 0;
else
{
listSLListNode* p = a.last->tl;
listSLListNode* h = new listSLListNode(p->hd);
last = h;
p = p->tl;
for (;;)
{
listSLListNode* n = new listSLListNode(p->hd);
last->tl = n;
last = n;
if (p == a.last)
{
last->tl = h;
return;
}
else
p = p->tl;
}
}
}
listSLList& listSLList::operator = (listSLList& a)
{
if (last == a.last)
return *this;
else
{
clear();
if (a.last != 0)
{
listSLListNode* p = a.last->tl;
listSLListNode* h = new listSLListNode(p->hd);
last = h;
p = p->tl;
for (;;)
{
listSLListNode* n = new listSLListNode(p->hd);
last->tl = n;
last = n;
if (p == a.last)
{
last->tl = h;
return *this;
}
else
p = p->tl;
}
}
}
}
void listSLList::clear()
{
if (last == 0)
return;
listSLListNode* p = last->tl;
last->tl = 0;
last = 0;
while (p != 0)
{
listSLListNode* nxt = p->tl;
delete(p);
p = nxt;
}
}
void listSLList::prepend(list& item)
{
listSLListNode* t = new listSLListNode(item);
if (last == 0)
t->tl = last = t;
else
{
t->tl = last->tl;
last->tl = t;
}
}
void listSLList::append(list& item)
{
listSLListNode* t = new listSLListNode(item);
if (last == 0)
t->tl = last = t;
else
{
t->tl = last->tl;
last = last->tl = t;
}
}
void listSLListTrav::insert_after(list& item)
{
listSLListNode* t = new listSLListNode(item);
if (L->last == 0)
t->tl = L->last = current = t;
else if (current == 0)
{
t->tl = L->last->tl;
L->last = t;
}
else if (L->last == current)
{
t->tl = current->tl;
current->tl = L->last = t;
}
else
{
t->tl = current->tl;
current->tl = t;
}
}
list listSLList::remove_front()
{
if (last == 0)
error("remove_front of empty list");
listSLListNode* t = last->tl;
list res = t->hd;
if (t == last)
last = 0;
else
last->tl = t->tl;
delete t;
return res;
}
void listSLList::del_front()
{
if (last == 0)
error("del_front of empty list");
listSLListNode* t = last->tl;
if (t == last)
last = 0;
else
last->tl = t->tl;
delete t;
}
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