eichin@ATHENA.MIT.EDU (Mark W. Eichin) (11/30/89)
// The following code under all options should print 111 222 333.
// Under g++ 1.36.1 sun4-os4, I get f7fffe08 111 222.
// If I punt the body of bam::bam (so that it doesn't actually use
// builtin_saveregs, ie. va_start) it works fine. Also, if I change
// bar::bar from taking a loseme& to a loseme (copy instead of ref)
// it also works.
// THE TRICKY PART: this goes right into the expand_builtin code that
// I reported earlier as not working at all (expr.c, line 3511, is the
// start of an infinite loop.) And in fact, this is derived from a
// case which triggered the loop... so the error reported above occurs
// in code generated from a *GCC* 1.36 expand_builtin (ie. I took out
// the part that was obviously broken.)
// SO: can anyone tell me either (1) is there a patch to 1.36.1 that
// will solve the original looping problem (2) does this problem go
// away under 1.36.2 (3) what exactly was that loop *trying* to do, so
// maybe I can fix it?
// Mark Eichin <eichin@athena.mit.edu>
class loseme {
public:
void *a;
void *b;
void *c;
loseme(void*aa,void*bb,void*cc) { a=aa; b=bb; c=cc; };
};
class foo {
public:
foo(loseme);
};
foo::foo(loseme lm) {
printf("%x %x %x\n",lm.a,lm.b,lm.c);
};
class bar:public foo {
public:
bar(loseme&);
};
bar::bar(loseme& lm):(lm) { }
#include <stdarg.h>
class bam:public bar {
public:
bam(loseme,...);
};
bam::bam(loseme lm, ...):(lm) {
va_list ap;
va_start(ap,lm);
va_end(ap);
}
int main(int,char**) {
bam(loseme((void*)0x111,(void*)0x222,(void*)0x333));
}
// end of code
Mark Eichin <eichin@athena.mit.edu>