Thread View: gnu.g++.bug
1 messages
1 total messages
Started by u90jl
Tue, 26 Jan 1993 02:01
Internal error: <built-in>:0: crosses initialization of `__FUNCTION__'
Author: u90jl
Date: Tue, 26 Jan 1993 02:01
Date: Tue, 26 Jan 1993 02:01
828 lines
23170 bytes
23170 bytes
I'm on a SparcStation SLC, SunOS4.1.1 running GCC 2.3.3.
First, a trivial point. The option `-x c++-cpp-output' isn't documented
in the info that comes with gcc-2.3.3. Perhaps it should be?
Second, a compiler bug:
$ gcc -v -x c++-cpp-output -Wall -c -o region.o region.pp
Produces:
gcc version 2.3.3
/mclab/u90jl/gnu/lib/gcc-lib/sparc-sun-sunos4.1.1/2.3.3/cc1plus region.pp -quiet -Wall -version -o /usr/tmp/cca00645.s
GNU C++ version 2.3.3 (sparc) compiled by GNU C version 2.3.3.
region.cpp: In function `static class Region::RegionNode* Region::ROP_subtract (class Region::RegionPair*, class Region::RegionPair*, class Region::RegionNode*, int &, int &)':
region.cpp:1750: label `A_and_B' used but not defined
<built-in>:0: crosses initialization of `__PRETTY_FUNCTION__'
<built-in>:0: crosses initialization of `__FUNCTION__'
region.cpp:1825: Internal compiler error.
region.cpp:1825: Please report this to `bug-g++@prep.ai.mit.edu'.
If I correct the reference to the label `A_and_B', by changing it to
`A_not_B', the compiler does not crash.
Preprocessed source follows (blank lines removed).
--
Jamie Lokier
-------------------------------------------------------------------------------
# 1 "region.cpp"
#pragma implementation "Point.h"
#pragma implementation "Rectangle.h"
#pragma implementation "Region.h"
#pragma implementation "RegionIterator.h"
# 1 "config.h" 1
# 126 "config.h"
# 199 "config.h"
# 218 "config.h"
# 29 "region.cpp" 2
# 1 "Point.h" 1
#pragma interface
class Point {
public:
int x, y;
inline Point() {}
inline Point(const Point& A) : x(A.x), y(A.y) {}
inline Point(int xnew, int ynew) : x(xnew), y(ynew) {}
inline Point& operator = (const Point A) { x=A.x; y=A.y; return *this; }
inline Point operator + (Point B) const { return Point(x+B.x, y+B.y); }
inline Point operator - (Point B) const { return Point(x-B.x, y-B.y); }
inline Point& operator += (Point B) { x+=B.x; y+=B.y; return *this; }
inline Point& operator -= (Point B) { x-=B.x; y-=B.y; return *this; }
inline int operator <= (Point B) const { return (x<=B.x) && (y<=B.y); }
inline int operator < (Point B) const { return (x<B.x) && (y<B.y); }
inline int operator == (Point B) const { return (x==B.x) && (y==B.y); }
inline int operator != (Point B) const { return (x!=B.x) || (y!=B.y); }
};
# 33 "region.cpp" 2
# 1 "Rectangle.h" 1
#pragma interface
class Rectangle {
public:
Point topLeft, bottomRight;
inline Rectangle() {}
inline Rectangle(const Rectangle& A)
: topLeft(A.topLeft), bottomRight(A.bottomRight) {}
inline Rectangle(Point tl, Point br)
: topLeft(tl), bottomRight(br) {};
inline Rectangle(int left, int top, int right, int bottom)
: topLeft(left, top), bottomRight(right, bottom) {}
inline Rectangle& operator = (const Rectangle& A)
{ topLeft=A.topLeft; bottomRight=A.bottomRight; return *this; }
inline int contains(Point A) const
{ return topLeft <= A && A < bottomRight; }
inline void translate(Point A) { topLeft+=A; bottomRight+=A; }
};
# 37 "region.cpp" 2
# 1 "Region.h" 1
#pragma interface
# 1 "/mclab/u90jl/gnu/lib/g++-include/stdlib.h" 1 3
# 1 "/mclab/u90jl/gnu/lib/g++-include/stddef.h" 1 3
extern "C" {
# 1 "/mclab/u90jl/gnu/lib/gcc-lib/sparc-sun-sunos4.1.1/2.3.3/include/stddef.h" 1 3
# 43 "/mclab/u90jl/gnu/lib/gcc-lib/sparc-sun-sunos4.1.1/2.3.3/include/stddef.h" 3
typedef int ptrdiff_t;
typedef int size_t;
typedef __wchar_t wchar_t;
# 179 "/mclab/u90jl/gnu/lib/gcc-lib/sparc-sun-sunos4.1.1/2.3.3/include/stddef.h" 3
# 7 "/mclab/u90jl/gnu/lib/g++-include/stddef.h" 2 3
}
# 6 "/mclab/u90jl/gnu/lib/g++-include/stdlib.h" 2 3
extern "C" {
int abs(int);
void volatile abort(void);
double atof(const char*);
int atoi(const char*);
long atol(const char*);
int atexit(auto void (*p) (void));
int bsearch (const void *, const void *, size_t,
size_t, auto int (*ptf)(const void*, const void*));
void* calloc(size_t, size_t);
void cfree(void*);
void volatile exit(int);
char* fcvt(double, int, int*, int*);
void free(void*);
char* getenv(const char*);
int getopt(int, char * const *, const char*);
int getpw(int, char*);
char* gcvt(double, int, char*);
char* ecvt(double, int, int*, int*);
extern char** environ;
long labs(long);
void* malloc(size_t);
size_t malloc_usable_size(void*);
int putenv(const char*);
extern char* optarg;
extern int opterr;
extern int optind;
void qsort(void*, size_t, size_t, auto int (*ptf)(void*,void*));
int rand(void);
void* realloc(void*, size_t);
int setkey(const char*);
int srand(unsigned int);
double strtod(const char*, char**);
long strtol(const char*, char**, int);
unsigned long stroul(const char**, int);
int system(const char*);
long random(void);
void srandom(int);
char* setstate(char*);
char* initstate(unsigned, char*, int);
double drand48(void);
void lcong48(short*);
long jrand48(short*);
long lrand48(void);
long mrand48(void);
long nrand48(short*);
short* seed48(short*);
void srand48(long);
char* ctermid(char*);
char* cuserid(char*);
char* tempnam(const char*, const char*);
char* tmpnam(char*);
}
# 29 "Region.h" 2
class RegionIterator;
class Region {
class RegionPair;
class RegionRow;
class RegionNode;
class Initialiser;
class RegionPair {
friend Region;
friend RegionIterator;
friend Region::Initialiser;
enum { BlockSize = 20 };
static RegionPair *freeList;
public:
static void allocateBlock(RegionPair *);
private:
static void *operator new (size_t)
{
register Region::RegionPair *nodE=freeList;
if (!(freeList=nodE->tail))
allocateBlock(nodE);
return (nodE);
}
static void operator delete (void *node)
{
((Region::RegionPair *)node)->tail=freeList;
freeList=(Region::RegionPair *)node;
}
static RegionPair *peek()
{
return freeList;
}
RegionPair *tail;
int left, right;
};
class RegionRow {
friend Region;
friend RegionIterator;
enum { BlockSize = 20 };
static RegionRow *freeList;
static RegionRow *allocateBlock();
static void *operator new (size_t)
{
if (!freeList)
return allocateBlock();
register Region::RegionRow *nodE=freeList;
freeList=nodE->tail; return (nodE);
}
static void operator delete (void *node)
{
((Region::RegionRow *)node)->tail=freeList;
freeList=(Region::RegionRow *)node;
}
union {
RegionPair *pair;
RegionRow *tail;
};
unsigned int ref;
int right;
};
class RegionNode {
friend Region;
friend RegionIterator;
friend Region::Initialiser;
enum { BlockSize = 20 };
static RegionNode *freeList;
public:
static void allocateBlock(RegionNode *);
private:
void *operator new (size_t)
{
register Region::RegionNode *nodE=freeList;
if (!(freeList=nodE->tail))
allocateBlock(nodE);
return (nodE);
}
void operator delete (void *node)
{
((Region::RegionNode *)node)->tail=freeList;
freeList=(Region::RegionNode *)node;
}
static RegionNode *peek()
{
return freeList;
}
RegionNode *tail;
RegionRow *row;
int y;
};
class Initialiser {
public:
Initialiser()
{
Region::RegionPair::allocateBlock(0);
Region::RegionNode::allocateBlock(0);
}
static Initialiser initialiser;
};
friend RegionIterator;
Rectangle rect;
enum { EmptyRegion, SimpleRegion, ComplexRegion } type;
class RegionNode *node;
typedef RegionNode *(*__RegionOp)(RegionPair *, RegionPair *,
RegionNode *, int&, int&);
static RegionNode *ROP_merge(RegionPair *, RegionPair *,
RegionNode *, int &, int &);
static RegionNode *ROP_intersect(RegionPair *, RegionPair *,
RegionNode *, int&, int&);
static RegionNode *ROP_subtract(RegionPair *, RegionPair *,
RegionNode *, int&, int&);
static RegionNode *ROP_xor(RegionPair *, RegionPair *,
RegionNode *, int&, int&);
static RegionNode *make_complex_node(const Rectangle&);
static void free_complex_node(RegionNode *node);
static void simplify_result(Region&, RegionNode *);
static RegionNode *region_op(char, char, char, __RegionOp,
RegionNode *, int,
RegionNode *, int, Rectangle&);
static void copy(const Region&, Region&);
static void free_nodes(Region&);
public:
Region();
Region(Point, Point);
Region(const Rectangle&);
Region(int, int, int, int);
Region(const Region&);
~Region();
Region& operator = (const Rectangle&);
Region& operator = (const Region&);
static void merge(const Rectangle&, const Rectangle&, Region&);
static void merge(const Region&, const Rectangle&, Region&);
static void merge(const Region&, const Region&, Region&);
static void intersect(const Rectangle&, const Rectangle&, Region&);
static void intersect(const Region&, const Rectangle&, Region&);
static void intersect(const Region&, const Region&, Region&);
static void subtract(const Rectangle&, const Rectangle&, Region&);
static void subtract(const Rectangle&, const Region&, Region&);
static void subtract(const Region&, const Rectangle&, Region&);
static void subtract(const Region&, const Region&, Region&);
static void xor(const Rectangle&, const Rectangle&, Region&);
static void xor(const Region&, const Rectangle&, Region&);
static void xor(const Region&, const Region&, Region&);
Region& operator |= (const Rectangle&);
Region& operator |= (const Region&);
Region& operator &= (const Rectangle&);
Region& operator &= (const Region&);
Region& operator -= (const Rectangle&);
Region& operator -= (const Region&);
Region& operator ^= (const Rectangle&);
Region& operator ^= (const Region&);
int isEmpty() const;
int contains(Point) const;
void clear();
void translate(Point);
};
inline Region::Region()
: type(EmptyRegion)
{
}
inline Region::Region(Point tl, Point br)
: type(SimpleRegion), rect(tl, br)
{
}
inline Region::Region(const Rectangle& A)
: type(SimpleRegion), rect(A)
{
}
inline Region::Region(int left, int top, int right, int bottom)
: type(SimpleRegion), rect(left, top, right, bottom)
{
}
inline Region::Region(const Region& A)
{
copy(A, *this);
}
inline Region::~Region()
{
free_nodes(*this);
}
inline Region& Region::operator = (const Rectangle& A)
{
free_nodes(*this);
rect=A;
type=SimpleRegion;
return *this;
}
inline Region& Region::operator = (const Region& A)
{
if (this != &A) {
free_nodes(*this);
copy(A, *this);
}
return *this;
}
inline Region operator | (const Rectangle& A, const Rectangle& B) return result
{
Region::merge(A, B, result); return;
}
inline Region operator | (const Rectangle& A, const Region& B) return result
{
Region::merge(B, A, result); return;
}
inline Region operator | (const Region& A, const Rectangle& B) return result
{
Region::merge(A, B, result); return;
}
inline Region operator | (const Region& A, const Region& B) return result
{
Region::merge(A, B, result); return;
}
inline Region operator & (const Rectangle& A, const Rectangle& B) return result
{
Region::intersect(A, B, result); return;
}
inline Region operator & (const Rectangle& A, const Region& B) return result
{
Region::intersect(B, A, result); return;
}
inline Region operator & (const Region& A, const Rectangle& B) return result
{
Region::intersect(A, B, result); return;
}
inline Region operator & (const Region& A, const Region& B) return result
{
Region::intersect(A, B, result); return;
}
inline Region operator - (const Rectangle& A, const Rectangle& B) return result
{
Region::subtract(A, B, result); return;
}
inline Region operator - (const Rectangle& A, const Region& B) return result
{
Region::subtract(A, B, result); return;
}
inline Region operator - (const Region& A, const Rectangle& B) return result
{
Region::subtract(A, B, result); return;
}
inline Region operator - (const Region& A, const Region& B) return result
{
Region::subtract(A, B, result); return;
}
inline Region operator ^ (const Rectangle& A, const Rectangle& B) return result
{
Region::xor(A, B, result); return;
}
inline Region operator ^ (const Rectangle& A, const Region& B) return result
{
Region::xor(B, A, result); return;
}
inline Region operator ^ (const Region& A, const Rectangle& B) return result
{
Region::xor(A, B, result); return;
}
inline Region operator ^ (const Region& A, const Region& B) return result
{
Region::xor(A, B, result); return;
}
# 552 "Region.h"
inline Region& Region::operator |= (const Rectangle& B)
{
Region::merge(*this, B, *this);
return *this;
}
inline Region& Region::operator |= (const Region& B)
{
Region::merge(*this, B, *this);
return *this;
}
inline Region& Region::operator &= (const Rectangle& B)
{
Region::intersect(*this, B, *this);
return *this;
}
inline Region& Region::operator &= (const Region& B)
{
Region::intersect(*this, B, *this);
return *this;
}
inline Region& Region::operator -= (const Rectangle& B)
{
return *this;
}
inline Region& Region::operator -= (const Region& B)
{
return *this;
}
inline Region& Region::operator ^= (const Rectangle& B)
{
return *this;
}
inline Region& Region::operator ^= (const Region& B)
{
return *this;
}
inline void merge(const Rectangle& A, const Rectangle& B, Region& C)
{
Region::merge(A, B, C);
}
inline void merge(const Rectangle& A, const Region& B, Region& C)
{
Region::merge(B, A, C);
}
inline void merge(const Region& A, const Rectangle& B, Region& C)
{
Region::merge(A, B, C);
}
inline void merge(const Region& A, const Region& B, Region& C)
{
Region::merge(A, B, C);
}
inline void intersect(const Rectangle& A, const Rectangle& B, Region& C)
{
Region::intersect(A, B, C);
}
inline void intersect(const Rectangle& A, const Region& B, Region& C)
{
Region::intersect(B, A, C);
}
inline void intersect(const Region& A, const Rectangle& B, Region& C)
{
Region::intersect(A, B, C);
}
inline void intersect(const Region& A, const Region& B, Region& C)
{
Region::intersect(A, B, C);
}
inline void subtract(const Rectangle& A, const Rectangle& B, Region& C)
{
Region::subtract(A, B, C);
}
inline void subtract(const Rectangle& A, const Region& B, Region& C)
{
Region::subtract(A, B, C);
}
inline void subtract(const Region& A, const Rectangle& B, Region& C)
{
Region::subtract(A, B, C);
}
inline void subtract(const Region& A, const Region& B, Region& C)
{
Region::subtract(A, B, C);
}
inline void xor(const Rectangle& A, const Rectangle& B, Region& C)
{
Region::xor(A, B, C);
}
inline void xor(const Rectangle& A, const Region& B, Region& C)
{
Region::xor(B, A, C);
}
inline void xor(const Region& A, const Rectangle& B, Region& C)
{
Region::xor(A, B, C);
}
inline void xor(const Region& A, const Region& B, Region& C)
{
Region::xor(A, B, C);
}
inline int Region::isEmpty() const
{
return type == EmptyRegion;
}
inline void Region::clear()
{
free_nodes(*this);
type=EmptyRegion;
}
inline void Region::translate(Point)
{
}
# 41 "region.cpp" 2
# 1 "RegionIterator.h" 1
#pragma interface
class RegionIterator {
Region::RegionNode *node;
Region::RegionPair *pair;
public:
RegionIterator() {}
int first(const Region&);
int next();
Point topLeft, bottomRight;
};
# 109 "RegionIterator.h"
inline int RegionIterator::next()
{
if (!pair) {
if (!node)
return 0;
if (!node->row) {
topLeft.y=node->y;
node=node->tail;
bottomRight.y=node->y;
} else {
topLeft.y=bottomRight.y;
bottomRight.y=node->y;
}
pair=node->row->pair;
node=node->tail;
}
topLeft.x=pair->left;
bottomRight.x=pair->right;
pair=pair->tail;
return 1;
}
# 45 "region.cpp" 2
# 1 "misc.h" 1
#pragma interface
typedef unsigned char Byte;
typedef Byte *BytePointer;
typedef BytePointer *BytePointerPointer;
volatile void _botchFunction(const char *,
const char *, unsigned int);
volatile void _fatalFunction(const char *,
const char *, unsigned int);
volatile void _allocationError();
volatile void printError(const char *, ...);
volatile void abortProgram();
# 49 "region.cpp" 2
# 1 "/mclab/u90jl/gnu/lib/g++-include/values.h" 1 3
# 57 "/mclab/u90jl/gnu/lib/g++-include/values.h" 3
# 166 "/mclab/u90jl/gnu/lib/g++-include/values.h" 3
# 56 "region.cpp" 2
# 1566 "region.cpp"
Region::RegionNode *
Region::ROP_subtract(RegionPair *PA, RegionPair *PB,
RegionNode *nd, int& left, int& right)
{
register RegionPair *pa=PA;
register RegionPair *pb=PB;
register RegionPair *pd;
register RegionPair *ppd;
RegionPair *first_pd;
if (pa->left >= pb->left) {
first_pd=RegionPair::peek();
pd=0;
if (nd && nd->row) {
ppd=nd->row->pair;
goto B_not_A_with_comparison;
}
goto B_not_A;
}
first_pd=pd=new RegionPair;
pd->left=pa->left;
if (nd && nd->row) {
ppd=nd->row->pair;
if (pd->left == ppd->left)
goto A_not_B_with_comparison;
}
A_not_B:
for (;;) {
if (pa->right <= pb->left) {
pd->right=pa->right;
if (pa=pa->tail) {
if (pa->left < pb->left) {
pd=new RegionPair;
pd->left=pa->left;
continue;
}
goto B_not_A;
}
goto not_ending;
}
pd->right=pb->left;
if (pa->right > pb->right) {
pd=new RegionPair;
pd->left=pb->right;
if (pb=pb->tail) {
continue;
}
pd->right=pa->right;
pa=pa->tail;
goto ending;
}
if (pa=pa->tail) {
goto B_not_A;
}
goto not_ending;
}
B_not_A:
for (;;) {
if (pb->right <= pa->left) {
if (pb=pb->tail) {
if (pb->left <= pa->left) {
continue;
}
pd=new RegionPair;
pd->left=pa->left;
goto A_not_B;
}
goto ending;
}
if (pb->right >= pa->right) {
if (pa=pa->tail) {
continue;
}
goto not_ending;
}
pd=new RegionPair;
pd->left=pb->right;
if (pb=pb->tail) {
goto A_not_B;
}
pd->right=pa->right;
pa=pa->tail;
goto ending;
}
ending:
while (pa) {
pd=new RegionPair;
pd->left=pa->left;
pd->right=pa->right;
pa=pa->tail;
}
not_ending:
finally:
if (pd) {
pd->tail=0;
((nd=new RegionNode)->row=new RegionRow)->ref=0;
nd->row->right=pd->right;
if (pd->right > right)
right=pd->right;
nd->row->pair=pd=first_pd;
if (pd->left < left)
left=pd->left;
return nd;
}
(nd=new RegionNode)->row=0;
return nd;
ending_with_comparison:
while (pa) {
pd=new RegionPair;
if (!ppd
|| (pd->left=pa->left) != ppd->left
|| (pd->right=pa->right) != ppd->right) {
pd->left=pa->left;
pd->right=pa->right;
pa=pa->tail;
goto ending;
}
ppd=ppd->tail;
pa=pa->tail;
}
not_ending_with_comparison:
if (ppd)
goto finally;
RegionPair::freeList=first_pd;
return nd;
A_not_B_with_comparison:
for (;;) {
if (pa->right <= pb->left) {
if ((pd->right=pa->right) != ppd->right) {
if (pa=pa->tail) {
if (pa->left < pb->left) {
pd=new RegionPair;
pd->left=pa->left;
goto A_not_B;
}
goto B_not_A;
}
goto not_ending;
}
ppd=ppd->tail;
if (pa=pa->tail) {
if (pa->left < pb->left) {
pd=new RegionPair;
if (!ppd) {
pd->left=pa->left;
goto A_not_B;
}
if ((pd->left=pa->left) != ppd->left)
goto A_not_B;
continue;
}
goto B_not_A_with_comparison;
}
goto not_ending_with_comparison;
}
if ((pd->right=pb->left) != ppd->right) {
if (pa->right > pb->right) {
pd=new RegionPair;
pd->left=pb->right;
if (pb=pb->tail) {
continue;
}
pd->right=pa->right;
pa=pa->tail;
goto ending;
}
if (pa=pa->tail) {
goto B_not_A;
}
goto not_ending;
}
ppd=ppd->tail;
if (pa->right > pb->right) {
pd=new RegionPair;
if (!ppd) {
pd->left=pb->right;
if (pb=pb->tail) {
goto A_not_B;
}
pd->right=pa->right;
pa=pa->tail;
goto ending;
}
if ((pd->left=pb->right) != ppd->left) {
if (pb=pb->tail) {
goto A_and_B;
}
pd->right=pa->right;
pa=pa->tail;
goto ending;
}
if (pb=pb->tail) {
continue;
}
if ((pd->right=pa->right) != ppd->right) {
pa=pa->tail;
goto ending;
}
ppd=ppd->tail;
pa=pa->tail;
goto ending_with_comparison;
}
if (pa=pa->tail) {
goto B_not_A_with_comparison;
}
goto not_ending_with_comparison;
}
B_not_A_with_comparison:
for (;;) {
if (pb->right <= pa->left) {
if (pb=pb->tail) {
if (pb->left <= pa->left) {
continue;
}
pd=new RegionPair;
if (!ppd) {
pd->left=pa->left;
goto A_not_B;
}
if ((pd->left=pa->left) != ppd->left)
goto A_not_B;
goto A_not_B_with_comparison;
}
goto ending_with_comparison;
}
if (pb->right >= pa->right) {
if (pa=pa->tail) {
continue;
}
goto not_ending_with_comparison;
}
pd=new RegionPair;
if (!ppd) {
pd->left=pb->right;
if (pb=pb->tail) {
goto A_not_B;
}
pd->right=pa->right;
pa=pa->tail;
goto ending;
}
if ((pd->left=pb->right) != ppd->left) {
if (pb=pb->tail) {
goto A_not_B;
}
pd->right=pa->right;
pa=pa->tail;
goto ending;
}
if (pb=pb->tail) {
goto A_not_B_with_comparison;
}
if ((pd->right=pa->right) != ppd->right) {
pa=pa->tail;
goto ending;
}
ppd=ppd->tail;
pa=pa->tail;
goto ending_with_comparison;
}
}
# 3160 "region.cpp"
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