1// { dg-do assemble  }
2// { dg-options "" }
3// This test case caused the compiler to abort at one point in time.
4// prms-id: 811
5
6class ostream; class streambuf;
7
8typedef long streamoff, streampos;
9
10struct _ios_fields {
11    streambuf *_strbuf;
12    ostream* _tie;
13    int _width;
14    unsigned long _flags;
15    char _fill;
16    unsigned char _state;
17    unsigned short _precision;
18};
19
20
21enum state_value { _good = 0, _eof = 1,  _fail = 2, _bad  = 4 };
22enum open_mode { input=1, output=2, append=8 };
23
24
25class ios : public _ios_fields {
26  public:
27    enum io_state { goodbit=0, eofbit=1, failbit=2, badbit=4 };
28    enum open_mode {
29	in=1,
30	out=2,
31	ate=4,
32	app=8,
33	trunc=16,
34	nocreate=32,
35	noreplace=64 };
36    enum seek_dir { beg, cur, end};
37    enum { skipws=01, left=02, right=04, internal=010,
38	   dec=020, oct=040, hex=0100,
39	   showbase=0200, showpoint=0400, uppercase=01000, showpos=02000,
40	   scientific=04000, fixed=0100000, unitbuf=020000, stdio=040000,
41	   dont_close=0x80000000
42	   };
43
44    ostream* tie() const { return _tie; }
45    ostream* tie(ostream* val) { ostream* save=_tie; _tie=val; return save; }
46
47
48    char fill() const { return _fill; }
49    char fill(char newf) { char oldf = _fill; _fill = newf; return oldf; }
50    unsigned long flags() const { return _flags; }
51    unsigned long flags(unsigned long new_val) {
52	unsigned long old_val = _flags; _flags = new_val; return old_val; }
53    unsigned short precision() const { return _precision; }
54    unsigned short precision(int newp) {
55	unsigned short oldp = _precision; _precision = (unsigned short)newp;
56	return oldp; }
57    unsigned long setf(unsigned long val) {
58	unsigned long oldbits = _flags;
59	_flags |= val; return oldbits; }
60    unsigned long setf(unsigned long val, unsigned long mask) {
61	unsigned long oldbits = _flags;
62	_flags = (_flags & ~mask) | (val & mask); return oldbits; }
63    unsigned long unsetf(unsigned long mask) {
64	unsigned long oldbits = _flags & mask;
65	_flags &= ~mask; return oldbits; }
66    int width() const { return _width; }
67    int width(long val) { long save = _width; _width = val; return save; }
68
69    static const unsigned long basefield;
70    static const unsigned long adjustfield;
71    static const unsigned long floatfield;
72
73    streambuf* rdbuf() const { return _strbuf; }
74    void clear(int state = 0) { _state = state; }
75    int good() const { return _state == 0; }
76    int eof() const { return _state & ios::eofbit; }
77    int fail() const { return _state & (ios::badbit|ios::failbit); }
78    int bad() const { return _state & ios::badbit; }
79    int rdstate() const { return _state; }
80    void set(int flag) { _state |= flag; }
81    operator void*() const { return fail() ? (void*)0 : (void*)this; }
82    int operator!() const { return fail(); }
83
84
85    void unset(state_value flag) { _state &= ~flag; }
86    void close();
87    int is_open();
88    int readable();
89    int writable();
90
91
92  protected:
93    ios(streambuf*sb) { _strbuf=sb; _state=0; _width=0; _fill=' ';
94			_flags=ios::skipws; _precision=6; }
95};
96
97
98
99
100typedef ios::seek_dir _seek_dir;
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123//# 168 "/usr/latest/lib/g++-include/streambuf.h" 3
124
125
126struct __streambuf {
127
128    int _flags;
129    char* _gptr;
130    char* _egptr;
131    char* _eback;
132    char* _pbase;
133    char* _pptr;
134    char* _epptr;
135    char* _base;
136    char* _ebuf;
137    struct streambuf *_chain;
138
139
140
141
142};
143
144struct streambuf : private __streambuf {
145    friend class ios;
146    friend class istream;
147    friend class ostream;
148  protected:
149    static streambuf* _list_all;
150    streambuf*& xchain() { return _chain; }
151    void _un_link();
152    void _link_in();
153    char* gptr() const { return _gptr; }
154    char* pptr() const { return _pptr; }
155    char* egptr() const { return _egptr; }
156    char* epptr() const { return _epptr; }
157    char* pbase() const { return _pbase; }
158    char* eback() const { return _eback; }
159    char* ebuf() const { return _ebuf; }
160    char* base() const { return _base; }
161    void xput_char(char c) { *_pptr++ = c; }
162    int xflags() { return _flags; }
163    int xflags(int f) { int fl = _flags; _flags = f; return fl; }
164    void xsetflags(int f) { _flags |= f; }
165    void gbump(int n) { _gptr += n; }
166    void pbump(int n) { _pptr += n; }
167    void setb(char* b, char* eb, int a=0);
168    void setp(char* p, char* ep) { _pbase=_pptr=p; _epptr=ep; }
169    void setg(char* eb, char* g, char *eg) { _eback=eb; _gptr=g; _egptr=eg; }
170  public:
171    static int flush_all();
172    static void flush_all_linebuffered();
173    virtual int underflow();
174    virtual int overflow(int c = (-1) );
175    virtual int doallocate();
176    virtual streampos seekoff(streamoff, _seek_dir, int mode=ios::in|ios::out);
177    virtual streampos seekpos(streampos pos, int mode = ios::in|ios::out);
178    int sputbackc(char c);
179    int sungetc();
180    streambuf();
181    virtual ~streambuf();
182    int unbuffered() { return _flags & 2  ? 1 : 0; }
183    int linebuffered() { return _flags & 0x4000  ? 1 : 0; }
184    void unbuffered(int i)
185	{ if (i) _flags |= 2 ; else _flags &= ~2 ; }
186    void linebuffered(int i)
187	{ if (i) _flags |= 0x4000 ; else _flags &= ~0x4000 ; }
188    int allocate() {
189	if (base() || unbuffered()) return 0;
190	else return doallocate(); }
191    virtual int sync();
192    virtual int pbackfail(int c);
193    virtual int ungetfail();
194    virtual streambuf* setbuf(char* p, int len);
195    int in_avail() { return _egptr - _gptr; }
196    int out_waiting() { return _pptr - _pbase; }
197    virtual int sputn(const char* s, int n);
198    virtual int sgetn(char* s, int n);
199    long sgetline(char* buf, int  n, char delim, int putback_delim);
200    int sbumpc() {
201	if (_gptr >= _egptr && underflow() == (-1) ) return (-1) ;
202	else return *(unsigned char*)_gptr++; }
203    int sgetc() {
204	if (_gptr >= _egptr && underflow() == (-1) ) return (-1) ;
205	else return *(unsigned char*)_gptr; }
206    int snextc() {
207	if (++_gptr >= _egptr && underflow() == (-1) ) return (-1) ;
208	else return *(unsigned char*)_gptr; }
209    int sputc(int c) {
210	if (_pptr >= _epptr) return overflow(c);
211	return *_pptr++ = c, (unsigned char)c; }
212    int vscan(char const *fmt0, char*  ap);
213    int vform(char const *fmt0, char*  ap);
214
215
216
217
218
219
220};
221
222struct __file_fields {
223    char _fake;
224    char _shortbuf[1];
225    short _fileno;
226    int _blksize;
227    char* _save_gptr;
228    char* _save_egptr;
229    long   _offset;
230};
231
232class filebuf : public streambuf {
233    struct __file_fields _fb;
234    void init();
235  public:
236    filebuf();
237    filebuf(int fd);
238    filebuf(int fd, char* p, int len);
239    ~filebuf();
240    filebuf* attach(int fd);
241    filebuf* open(const char *filename, const char *mode);
242    filebuf* open(const char *filename, int mode, int prot = 0664);
243    virtual int underflow();
244    virtual int overflow(int c = (-1) );
245    int is_open() { return _fb._fileno >= 0; }
246    int fd() { return is_open() ? _fb._fileno : (-1) ; }
247    filebuf* close();
248    virtual int doallocate();
249    virtual streampos seekoff(streamoff, _seek_dir, int mode=ios::in|ios::out);
250    int sputn(const char* s, int n);
251    int sgetn(char* s, int n);
252    virtual int sync();
253  protected:
254    virtual int pbackfail(int c);
255    int is_reading() { return eback() != egptr(); }
256    char* cur_ptr() { return is_reading() ?  gptr() : pptr(); }
257
258    char* file_ptr() { return _fb._save_gptr ? _fb._save_egptr : egptr(); }
259    int do_flush();
260
261    virtual int sys_read(char* buf, int  size);
262    virtual long   sys_seek(long  , _seek_dir);
263    virtual long sys_write(const void*, long);
264    virtual int sys_stat(void*);
265    virtual int sys_close();
266};
267
268
269inline int ios::readable() { return rdbuf()->_flags & 4 ; }
270inline int ios::writable() { return rdbuf()->_flags & 8 ; }
271inline int ios::is_open() {return rdbuf()->_flags & 4 +8 ;}
272
273
274
275
276//# 25 "/usr/latest/lib/g++-include/iostream.h" 2 3
277
278
279class istream; class ostream;
280typedef istream& (*__imanip)(istream&);
281typedef ostream& (*__omanip)(ostream&);
282
283extern istream& ws(istream& ins);
284extern ostream& flush(ostream& outs);
285extern ostream& endl(ostream& outs);
286extern ostream& ends(ostream& outs);
287
288class ostream : public ios
289{
290    void do_osfx();
291  public:
292    ostream();
293    ostream(streambuf* sb, ostream* tied=__null );
294    ~ostream();
295
296    int opfx() { if (!good()) return 0; if (_tie) _tie->flush(); return 1; }
297    void osfx() { if (flags() & (ios::unitbuf|ios::stdio))
298		      do_osfx(); }
299    streambuf* ostreambuf() const { return _strbuf; }
300    ostream& flush();
301    ostream& put(char c);
302    ostream& write(const char *s, int n);
303    ostream& write(const unsigned char *s, int n) { return write((char*)s, n);}
304    ostream& write(const void *s, int n) { return write((char*)s, n);}
305    ostream& seekp(streampos);
306    ostream& seekp(streamoff, _seek_dir);
307    streampos tellp();
308    ostream& form(const char *format ...);
309    ostream& vform(const char *format, char*  args);
310};
311
312extern ostream& operator<<(ostream&, char c);
313inline ostream& operator<<(ostream& os, unsigned char c)
314{ return os << (char)c; }
315
316extern ostream& operator<<(ostream&, const char *s);
317inline ostream& operator<<(ostream& os, const unsigned char *s)
318{ return os << (const char*)s; }
319
320
321extern ostream& operator<<(ostream&, void *p);
322extern ostream& operator<<(ostream&, int n);
323extern ostream& operator<<(ostream&, long n);
324extern ostream& operator<<(ostream&, unsigned int n);
325extern ostream& operator<<(ostream&, unsigned long n);
326inline ostream& operator<<(ostream& os, short n) {return os << (int)n;}
327inline ostream& operator<<(ostream& os, unsigned short n)
328{return os << (unsigned int)n;}
329extern ostream& operator<<(ostream&, float n);
330extern ostream& operator<<(ostream&, double n);
331inline ostream& operator<<(ostream& os, __omanip func) { return (*func)(os); }
332extern ostream& operator<<(ostream&, streambuf*);
333
334class istream : public ios
335{
336    int  _gcount;
337  public:
338    istream();
339    istream(streambuf* sb, ostream*tied=__null );
340    ~istream();
341    streambuf* istreambuf() const { return _strbuf; }
342    istream& get(char& c);
343    istream& get(unsigned char& c);
344    istream& read(char *ptr, int n);
345    istream& read(unsigned char *ptr, int n) { return read((char*)ptr, n); }
346    istream& read(void *ptr, int n) { return read((char*)ptr, n); }
347
348    istream& getline(char* ptr, int len, char delim = '\n');
349    istream& get(char* ptr, int len, char delim = '\n');
350    istream& gets(char **s, char delim = '\n');
351    int ipfx(int need) {
352	if (!good()) { set(ios::failbit); return 0; }
353	if (_tie && (need == 0 || rdbuf()->in_avail() < need)) _tie->flush();
354	if (!need && (flags() & ios::skipws) && !ws(*this)) return 0;
355	return 1;
356    }
357    int ipfx0() {
358	if (!good()) { set(ios::failbit); return 0; }
359	if (_tie) _tie->flush();
360	if ((flags() & ios::skipws) && !ws(*this)) return 0;
361	return 1;
362    }
363    int ipfx1() {
364	if (!good()) { set(ios::failbit); return 0; }
365	if (_tie && rdbuf()->in_avail() == 0) _tie->flush();
366	return 1;
367    }
368    int get() { if (!ipfx1()) return (-1) ;
369		int ch = _strbuf->sbumpc();
370		if (ch == (-1) ) set(ios::eofbit);
371		return ch; }
372    int peek() { if (!ipfx1()) return (-1) ;
373		int ch = _strbuf->sgetc();
374		if (ch == (-1) ) set(ios::eofbit);
375		return ch; }
376    int  gcount() { return _gcount; }
377    istream& ignore(int n=1, int delim = (-1) );
378    istream& seekg(streampos);
379    istream& seekg(streamoff, _seek_dir);
380    streampos tellg();
381    istream& putback(char ch) {
382	if (good() && _strbuf->sputbackc(ch) == (-1) ) clear(ios::badbit);
383	return *this;}
384    istream& unget() {
385	if (good() && _strbuf->sungetc() == (-1) ) clear(ios::badbit);
386	return *this;}
387
388    istream& unget(char ch) { return putback(ch); }
389    int skip(int i);
390
391};
392
393extern istream& operator>>(istream&, char*);
394inline istream& operator>>(istream& is, unsigned char* p)
395{ return is >> (char*)p; }
396
397extern istream& operator>>(istream&, char& c);
398extern istream& operator>>(istream&, unsigned char& c);
399
400extern istream& operator>>(istream&, int&);
401extern istream& operator>>(istream&, long&);
402extern istream& operator>>(istream&, short&);
403extern istream& operator>>(istream&, unsigned int&);
404extern istream& operator>>(istream&, unsigned long&);
405extern istream& operator>>(istream&, unsigned short&);
406extern istream& operator>>(istream&, float&);
407extern istream& operator>>(istream&, double&);
408inline istream& operator>>(istream& is, __imanip func) { return (*func)(is); }
409
410inline ostream& ostream::put(char c) { _strbuf->sputc(c); return *this; }
411
412class iostream : public ios {
413    int  _gcount;
414  public:
415    iostream();
416    iostream(streambuf* sb, ostream*tied=__null );
417    operator istream&() { return *(istream*)this; }
418    operator ostream&() { return *(ostream*)this; }
419    ~iostream();
420
421    istream& get(char& c) { return ((istream*)this)->get(c); }
422    istream& get(unsigned char& c) { return ((istream*)this)->get(c); }
423    istream& read(char *ptr, int n) { return ((istream*)this)->read(ptr, n); }
424    istream& read(unsigned char *ptr, int n)
425	{ return ((istream*)this)->read((char*)ptr, n); }
426    istream& read(void *ptr, int n)
427	{ return ((istream*)this)->read((char*)ptr, n); }
428    istream& getline(char* ptr, int len, char delim = '\n')
429	{ return ((istream*)this)->getline(ptr, len, delim); }
430    istream& get(char* ptr, int len, char delim = '\n')
431	{ return ((istream*)this)->get(ptr, len, delim); }
432    istream& gets(char **s, char delim = '\n')
433	{ return ((istream*)this)->gets(s, delim); }
434    istream& ignore(int n=1, int delim = (-1) )
435	{ return ((istream*)this)->ignore(n, delim); }
436    int ipfx(int need) { return ((istream*)this)->ipfx(need); }
437    int ipfx0()  { return ((istream*)this)->ipfx0(); }
438    int ipfx1()  { return ((istream*)this)->ipfx1(); }
439    int get() { return _strbuf->sbumpc(); }
440    int peek() { return ipfx1() ? _strbuf->sgetc() : (-1) ; }
441    int  gcount() { return _gcount; }
442    istream& putback(char ch) { return ((istream*)this)->putback(ch); }
443    istream& unget() { return ((istream*)this)->unget(); }
444    istream& seekg(streampos pos) { return ((istream*)this)->seekg(pos); }
445    istream& seekg(streamoff off, _seek_dir dir)
446	{ return ((istream*)this)->seekg(off, dir); }
447    streampos tellg() { return ((istream*)this)->tellg(); }
448
449    istream& unget(char ch) { return putback(ch); }
450
451
452
453    int opfx() { return ((ostream*)this)->opfx(); }
454    void osfx() { ((ostream*)this)->osfx(); }
455    ostream& flush() { return ((ostream*)this)->flush(); }
456    ostream& put(char c) { return ((ostream*)this)->put(c); }
457    ostream& write(const char *s, int n)
458	{ return ((ostream*)this)->write(s, n); }
459    ostream& write(const unsigned char *s, int n)
460	{ return ((ostream*)this)->write((char*)s, n); }
461    ostream& write(const void *s, int n)
462	{ return ((ostream*)this)->write((char*)s, n); }
463    ostream& form(const char *format ...);
464    ostream& vform(const char *format, char*  args)
465	{ return ((ostream*)this)->vform(format, args); }
466    ostream& seekp(streampos pos) { return ((ostream*)this)->seekp(pos); }
467    ostream& seekp(streamoff off, _seek_dir dir)
468	{ return ((ostream*)this)->seekp(off, dir); }
469    streampos tellp() { return ((ostream*)this)->tellp(); }
470};
471
472extern istream cin;
473extern ostream cout, cerr, clog;
474
475struct Iostream_init { } ;
476
477inline ios& dec(ios& i)
478{ i.setf(ios::dec, ios::dec|ios::hex|ios::oct); return i; }
479inline ios& hex(ios& i)
480{ i.setf(ios::hex, ios::dec|ios::hex|ios::oct); return i; }
481inline ios& oct(ios& i)
482{ i.setf(ios::oct, ios::dec|ios::hex|ios::oct); return i; }
483
484
485//# 7 "/usr/latest/lib/g++-include/stream.h" 2 3
486
487
488extern char* form(const char*, ...);
489
490extern char* dec(long, int=0);
491extern char* dec(int, int=0);
492extern char* dec(unsigned long, int=0);
493extern char* dec(unsigned int, int=0);
494
495extern char* hex(long, int=0);
496extern char* hex(int, int=0);
497extern char* hex(unsigned long, int=0);
498extern char* hex(unsigned int, int=0);
499
500extern char* oct(long, int=0);
501extern char* oct(int, int=0);
502extern char* oct(unsigned long, int=0);
503extern char* oct(unsigned int, int=0);
504
505inline istream& WS(istream& str) { return ws(str); }
506
507
508//# 9 "test.C" 2
509
510
511class Y {
512public:
513    Y() {}
514  virtual const char *stringify() = 0;
515    virtual char *stringify2() const = 0; // { dg-error "overriding" }
516};
517
518class X: public Y {
519public:
520    X(): Y() {}
521    const char *stringify();		// { dg-error "candidate" }
522    const char *stringify2() const;  // { dg-error "candidate|conflicting return type" }
523};
524
525char *
526X::stringify() const  // { dg-error "does not match" }
527{
528    return "stringify";
529}
530
531const char *
532X::stringify2()   // { dg-error "does not match" }
533{
534    return "stringify2";
535}
536
537main()
538{
539    X x;
540    Y& y = x;
541
542    cout << "x\n";
543    cout << x.stringify() << '\n';
544    cout << x.stringify2() << '\n';
545
546    cout << "y\n";
547    cout << y.stringify() << '\n';
548    cout << y.stringify2() << '\n';
549}
550