|
|
1.1 root 1: &&&&
2: Return-Path: <[email protected]>
3: Received: from indirect.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
4: id AA08711; Tue, 16 May 89 09:31:32 EDT
5: Received: by indirect.odi.com (4.0/SMI-4.0/ODI-C2)
6: id AA17362; Tue, 16 May 89 09:31:48 EDT
7: Message-Id: <[email protected]>
8: To: c++-bugs
9: Subject: void return types and void * types as printed into C
10: Date: Tue, 16 May 89 09:31:47 EDT
11: From: Benson I. Margulies <[email protected]>
12:
13: Pretty much all C compilers these days support void. Sun's certainly does.
14: The mapping of void to char in cfront makes some debuggers print junk.
15: &&&&
16: &&&&
17: Return-Path: <[email protected]>
18: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
19: id AA08826; Tue, 16 May 89 10:33:10 EDT
20: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
21: id AA02086; Tue, 16 May 89 10:33:14 EDT
22: Date: Tue, 16 May 89 10:33:14 EDT
23: From: [email protected]
24: Message-Id: <[email protected]>
25: To: c++-bugs
26: Subject: lexer is confused during :: processing
27:
28:
29: The following is a bug report that will be forwarded to AT&T. It is in a
30: template form designed by AT&T to help them speed up the disposition of bug
31: reports; you may feel inclined to dispute this claim.
32:
33:
34:
35:
36:
37: who: [email protected]
38: file:
39: date: 5/12/89
40: state: not fixed
41: sum:
42:
43: A reference at top level to a member of the form x::y provokes an error
44: message if y also happens to be the name of a class with a constructor.
45:
46:
47: release filed under: beta 6
48: MR:
49: priority:
50: category:
51: teststate:
52: name of changed files:
53: release agent:
54: related MRs:
55: description of bug with output now and expected output:
56:
57:
58: Output:
59:
60: CC -I/usr1/sam/2.0/test/ +e0 -F /tmp/lalex-bug.C -c > /dev/null
61: "/usr1/sam/2.0/test/lalex-bug.C", line 23: error: foo redefined: both a class name with constructor and an identifier
62: "/usr1/sam/2.0/test/lalex-bug.C", line 25: error: foo1 redefined: both a class name with constructor and an identifier
63:
64: Compilation exited abnormally with code 1 at Mon May 15 19:06:18
65:
66:
67:
68: Expected Output:
69:
70: The test should compile without any error messages.
71:
72:
73: description of analysis and changes:
74:
75: The problem appears to be localized to the lexer's ability to deal with names
76: of the form x::y at the top level, when y also happens to be the name of a
77: class. It does does not account for the fact that y is in the scope of x and
78: is consequently not a top level definition.
79:
80:
81:
82: Example below if available-
83: */
84:
85: /* test exhibiting bug goes below */
86:
87: class foo {
88: foo() ;
89: } ;
90:
91: class foo1 {
92: foo1() ;
93: } ;
94:
95: class bar {
96: public:
97: static int foo1 ;
98: void foo() ;
99: } ;
100:
101: class bar1 {
102: public:
103: void foo() {} ; // No problem with foo being an inline
104: } ;
105:
106:
107:
108: void bar::foo() {} // Redefinition error for foo
109:
110: int bar::foo1 = 0 ; // Similar redefinition error
111:
112: main () {
113: bar::foo1 = 5 ; // This is ok
114: }
115: &&&&
116: &&&&
117: Return-Path: <[email protected]>
118: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
119: id AA08913; Tue, 16 May 89 10:43:55 EDT
120: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
121: id AA02104; Tue, 16 May 89 10:44:00 EDT
122: Date: Tue, 16 May 89 10:44:00 EDT
123: From: [email protected]
124: Message-Id: <[email protected]>
125: To: c++-bugs
126: Subject: typedef enum foo{} ; core dumps
127:
128:
129: This is a bug report that will be submitted to AT&T. It has been fixed at ODI.
130:
131:
132:
133: /*ident "@(#)ctrans:bug.header 1.1" */
134: /*
135: who: [email protected]
136: file:
137: date: 5/15/89
138: state: not fixed
139: sum:
140:
141: An enumeration typedef of the form:
142:
143: typedef bool {true, false} bool ;
144:
145: provokes a core dump.
146:
147:
148: release filed under: beta 6
149: MR:
150: priority:
151: category:
152: teststate:
153: name of changed files:
154: release agent:
155: related MRs:
156: description of bug with output now and expected output:
157:
158: The core dump is due to a null pointer being dereferenced at line 454 in the
159: function:
160: bit type::check(Ptype t, TOK oper)
161:
162: The backtrace is:
163:
164: #0 0x41b42 in check__4typeFP4typeUc (__0this=(Ptype) 0x76594, __0t=(Ptype) 0x765d8, __0oper=0) (typ.c line 454)
165: #1 0x2b820 in hide__4nameFv (__0this=(Pname) 0x6db6a) (norm.c line 579)
166: #2 0x2b1bc in aggr__8basetypeFv (__0this=(Pbase) 0x76594) (norm.c line 415)
167: #3 0x447cc in yyparse__Fv () (gram.y line 652)
168: #4 0x43b86 in syn__Fv () (gram.y line 253)
169: #5 0x294e4 in run__Fv () (main.c line 83)
170: #6 0x2a264 in main (__0argc=1, __0argv=(char **) 0xefffe68) (main.c line 477)
171:
172:
173: OUTPUT:
174:
175: CC temp.C:
176: "temp.C", line 2: internal <<C++ Translator 2.0 Beta 6 04/12/89>> error: bus error (or something nasty like that)
177: 1 error
178:
179:
180: The test should have compiled without any errors.
181:
182: description of analysis and changes:
183:
184: The error appears to be due to check for EOBJ in the following code fragment:
185:
186: b1 = t1->base;
187: switch (b1) {
188: case TYPE:
189: if (Pbase(t1)->b_const) cnst1++;
190: t1 = Pbase(t1)->b_name->tp;
191: goto top;
192: * case EOBJ:
193: * t1 = Penum(Pbase(t1)->b_name->tp)->e_type;
194: * goto top;
195: }
196:
197: b2 = t2->base;
198: switch (b2) {
199: case TYPE:
200: if (Pbase(t2)->b_const) cnst2++;
201: t2 = Pbase(t2)->b_name->tp;
202: goto top;
203: * case EOBJ:
204: * t2 = Penum(Pbase(t2)->b_name->tp)->e_type;
205: * goto top;
206: }
207:
208: The "goto top" statement bypasses the check for null pointers that guards the
209: enclosing while loop.
210:
211: There seem to be two possible fixes:
212:
213: 1) Change the goto top into a continue, so that the while expression is
214: evaluated. This provokes a redefinition error message, which may be the
215: correct thing to do, but the Reference manual is unclear on this point. The
216: Evolution of C++:1985 to 1989 paper seems to favor the notion of separate name
217: spaces for structure tags, and possibly for enum tags. The second fix is in
218: keeping with this trend.
219:
220:
221: 2) The second alternative is to permit such a declaration. The EOBJ case
222: blocks the processing of EOBJ types later in the body of the same function, at
223: the enum_check label. Removing the lines marked with asterisks, permits
224: control to reach the enum_check code, and consequently permit such
225: declarations.
226:
227: Example below if available-
228: */
229:
230: /* test exhibiting bug goes below */
231:
232:
233:
234: typedef enum bool {true, false} bool ;
235: &&&&
236: &&&&
237: Return-Path: <[email protected]>
238: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
239: id AA09075; Tue, 16 May 89 11:22:14 EDT
240: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
241: id AA02122; Tue, 16 May 89 11:22:18 EDT
242: Date: Tue, 16 May 89 11:22:18 EDT
243: From: [email protected]
244: Message-Id: <[email protected]>
245: To: c++-bugs
246: Subject: BD in patch step
247:
248:
249: Another candidate for AT&T.
250:
251:
252: /*ident "@(#)ctrans:bug.header 1.1" */
253: /*
254: who: [email protected]
255: file:
256: date: ?/?/89
257: state: not fixed
258: sum:
259:
260:
261: The patch step, ie. the step following the link step to ensure that constructors
262: are run on static varaibles, takes a very long time when the a.out file
263: contains debug symbols. "patching" cfront takes approximately 4 minutes on a
264: Sun 3/60.
265:
266: The enclosed fix speeds up the "patch step", it reduces the time taken to
267: patch "cfront" to approximately 5 seconds.
268:
269: release filed under: beta 6
270: MR:
271: priority:
272: category:
273: teststate:
274: name of changed files:
275: release agent:
276: related MRs:
277: description of bug with output now and expected output:
278:
279:
280:
281: compile (with the -g option) and link cfront or any substantial C++ program
282: and observe the time taken by the patch step.
283:
284:
285: description of analysis and changes:
286:
287:
288:
289: The excessive time was due to the random i/o being done to obtain the string
290: for every symbol in a.out file. The enclosed fix uses a faster test that
291: eliminates the random i/o associated with debug symbols.
292:
293:
294:
295: The diff for BSDpatch.c is enclosed below:
296:
297:
298: diff patch.c /odi/C++/install/att_2_0b6/Patch/BSDpatch.c
299: 106,110d104
300: <
301: <
302: < /* a symbol table entry, ignore it */
303: < if (sym.n_type & (unsigned char) N_STAB) continue ;
304: <
305:
306:
307:
308: Example below if available-
309:
310:
311: Use cfront as a candidate.
312:
313:
314: */
315:
316: /* test exhibiting bug goes below */
317:
318:
319: &&&&
320: &&&&
321: Return-Path: <[email protected]>
322: Received: from valens.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
323: id AA10875; Tue, 16 May 89 17:21:34 EDT
324: Received: by valens.odi.com (4.0/SMI-4.0/ODI-C2)
325: id AA03492; Tue, 16 May 89 17:21:52 EDT
326: Date: Tue, 16 May 89 17:21:52 EDT
327: From: [email protected]
328: Message-Id: <[email protected]>
329: To: c++-bugs
330: Subject: Overloading the new operator
331:
332: If you provide an overloaded "operator new" with extra arguments, and
333: do not provide an "operator new" with no extra arguments, you get an
334: incomprehensible error message, whose line number is the last line of
335: the constructor function. I don't think it should be an error at all.
336:
337: &&&&
338: &&&&
339: Return-Path: <[email protected]>
340: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
341: id AA13763; Wed, 17 May 89 17:55:45 EDT
342: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
343: id AA04487; Wed, 17 May 89 17:55:51 EDT
344: Date: Wed, 17 May 89 17:55:51 EDT
345: From: [email protected]
346: Message-Id: <[email protected]>
347: To: c++-bugs
348: Subject: data members of the form "struct x {} x;" are broken
349:
350:
351: /*ident "@(#)ctrans:bug.header 1.1" */
352: /*
353: who: [email protected]
354: file:
355: date: 5/17/89
356: state: not fixed
357: sum:
358:
359: Data members of the form:
360:
361: struct x {} x ;
362:
363: are incorrectly translated. They are omitted completely from the C struct
364: generated as a translation of the enclosing class.
365:
366: release filed under: beta 6
367: MR:
368: priority:
369: category:
370: teststate:
371: name of changed files:
372: release agent:
373: related MRs:
374: description of bug with output now and expected output:
375:
376:
377: Consider a class declaration of the form:
378:
379: class s {
380: class x1 {
381: int i ;
382: } x1; // Does not emit this field in the generated c struct
383: };
384:
385: Class s is translated by cfront into:
386:
387: #line 1 "2.0/test/struct-bug.c"
388: struct s { /* sizeof s == 4 */
389: };
390:
391: Note the missing reference to the field x1.
392:
393: The correct translation after applying the enclosed fix is:
394:
395: #line 1 "struct-bug.c"
396: struct s { /* sizeof s == 4 */
397:
398: #line 4 "struct-bug.c"
399: struct x1 x1__1s ;
400: };
401:
402:
403:
404: description of analysis and changes:
405:
406: The problem is that the type name x1, hides the member name x1, in the member
407: table for the class "s". The function classdef::print_members does not allow
408: for such hiding. The fix provided below accounts for this hiding.
409:
410: 1374,1378c1371,1372
411: < // Sam: A class or an enum type declared within a class can hide a
412: < // member with the same name, so make sure that it gets printed by
413: < // traversing the n_tbl_list to get at these names.
414: < for (Pname nn=memtbl->get_mem(i=1); nn; nn=memtbl->get_mem(++i))
415: < do if (nn->base==NAME
416: ---
417: > for (Pname nn=memtbl->get_mem(i=1); nn; nn=memtbl->get_mem(++i)) {
418: > if (nn->base==NAME
419: 1389,1392c1383,1384
420: < }
421: < while ((nn->base == NAME) &&
422: < ((nn->tp->base!=CLASS) || (nn->tp->base!=ENUM)) &&
423: < (nn = nn->n_tbl_list)) ;
424: ---
425: > }
426: > }
427:
428:
429:
430:
431: Example below if available-
432: */
433:
434: /* test exhibiting bug goes below */
435:
436:
437: class s {
438: class x1 {
439: int i ;
440: } x1; // Does not emit this field in the generated c struct
441: };
442:
443: s v ;
444: &&&&
445: &&&&
446: Return-Path: <[email protected]>
447: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
448: id AA15049; Thu, 18 May 89 10:44:36 EDT
449: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
450: id AA04745; Thu, 18 May 89 10:44:41 EDT
451: Date: Thu, 18 May 89 10:44:41 EDT
452: From: [email protected]
453: Message-Id: <[email protected]>
454: To: c++-bugs
455: Subject: linkage specification is incorrectly processed
456:
457:
458:
459:
460:
461: /*ident "@(#)ctrans:bug.header 1.1" */
462: /*
463: who: [email protected]
464: file:
465: date: 5/18/89
466: state: not fixed
467: sum:
468:
469: The linkage specification sometimes produces unwarranted error messages.
470:
471: release filed under: beta 6
472: MR:
473: priority:
474: category:
475: teststate:
476: name of changed files:
477: release agent:
478: related MRs:
479: description of bug with output now and expected output:
480:
481: Compiling the program below provokes an error message when it shouldn't
482:
483: CC 2.0/test/linkage-bug.C:
484: "2.0/test/linkage-bug.C", line 6: error: inconsistent linkage specifications for malloc()
485: 1 error
486:
487:
488: description of analysis and changes:
489:
490:
491: The test to determine whether two linkages are consistent is incorrect in the
492: function
493:
494: Pname name::dofct(Ptable tbl, TOK scope)
495:
496: The fix is provided below as output from diff:
497:
498: file: dcl3.c
499: 1667,1669c1667
500: < if (linkage && nf->f_signature &&
501: < *nf->f_signature // the signature is not ""
502: < )
503: ---
504: > if (linkage && nf->f_signature)
505:
506:
507: Example below if available-
508: */
509:
510: /* test exhibiting bug goes below */
511:
512:
513:
514: extern "C" char *malloc(unsigned);
515:
516: extern "C" {
517: char *malloc(unsigned);
518:
519: } ;
520: &&&&
521: &&&&
522: Return-Path: <[email protected]>
523: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
524: id AA17783; Fri, 19 May 89 10:45:39 EDT
525: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
526: id AA05539; Fri, 19 May 89 10:45:47 EDT
527: Date: Fri, 19 May 89 10:45:47 EDT
528: From: [email protected]
529: Message-Id: <[email protected]>
530: To: c++-bugs
531: Cc: benson
532: Subject: A missing ";" after a function declaration provokes a core dump
533:
534:
535:
536: /*ident "@(#)ctrans:bug.header 1.1" */
537: /*
538: who: [email protected]
539: file:
540: date: 5/19/89
541: state: not fixed
542: sum:
543:
544: A missing semi colon after a function declaration causes a core dump.
545:
546: release filed under: beta 6
547: MR:
548: priority:
549: category:
550: teststate:
551: name of changed files:
552: release agent:
553: related MRs:
554: description of bug with output now and expected output:
555:
556: A missing semi after a function declaration is detected as an error, but the
557: cfront core dumps trying to issue the error message since the format effector
558: used for the error message is a %t(for type) rather than a %k for token.
559:
560: Erroneous Output
561: ----------------
562:
563: CC 2.0/test/syntax-bug.c:
564: "2.0/test/syntax-bug.c", line 2: error: syntax error: unexpected "2.0/test/syntax-bug.c", line 2: "2.0/test/syntax-bug.c", line 2: internal <<C++ Translator 2.0 Beta 6 04/12/89>> error: bus error (or something nasty like that)
565: 1 error
566:
567:
568: Correct Output
569: -------------
570:
571: CC syntax-bug.c:
572: "syntax-bug.c", line 2: error: syntax error: unexpected char
573: "syntax-bug.c", line 2: error: syntax error
574:
575:
576: description of analysis and changes:
577:
578: Fixing the call to error in the production (in file gram.y)
579:
580: arg_list : arg_lp arg_type_list ellipsis_opt RP TYPE
581:
582: to use the %k format effector fixes the problem.
583:
584:
585: Example below if available-
586: */
587:
588: /* test exhibiting bug goes below */
589:
590:
591:
592: int foo(int i)
593:
594: char i ;
595: &&&&
596: &&&&
597: Return-Path: <[email protected]>
598: Received: from valens.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
599: id AA06592; Wed, 24 May 89 17:49:46 EDT
600: Received: by valens.odi.com (4.0/SMI-4.0/ODI-C2)
601: id AA01476; Wed, 24 May 89 17:49:36 EDT
602: Date: Wed, 24 May 89 17:49:36 EDT
603: From: [email protected]
604: Message-Id: <[email protected]>
605: To: c++bugs
606: Subject: socketpair
607: Reply-To: [email protected]
608:
609: The BSD system call "socketpair" is not defined in any of the
610: include files.
611:
612: &&&&
613: &&&&
614: Return-Path: <[email protected]>
615: Received: from valens.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
616: id AA08331; Thu, 25 May 89 11:12:25 EDT
617: Received: by valens.odi.com (4.0/SMI-4.0/ODI-C2)
618: id AA02117; Thu, 25 May 89 11:12:17 EDT
619: Date: Thu, 25 May 89 11:12:17 EDT
620: From: [email protected]
621: Message-Id: <[email protected]>
622: To: c++bugs
623: Subject: more standard declarations
624: Reply-To: [email protected]
625:
626: C++'s libc.h does declare mktemp, but does not have a declaration
627: for mkstemp. These are both library routines from the "(3)" part
628: of the documentation.
629: &&&&
630: &&&&
631: Return-Path: <[email protected]>
632: Received: from moon.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
633: id AA04276; Tue, 20 Jun 89 12:34:12 EDT
634: Received: by moon.odi.com (4.0/SMI-4.0/ODI-C2)
635: id AA00792; Tue, 20 Jun 89 12:34:12 EDT
636: Date: Tue, 20 Jun 89 12:34:12 EDT
637: From: [email protected]
638: Message-Id: <[email protected]>
639: To: c++-bugs
640: Subject: anonymous union bug
641:
642:
643:
644: /*ident "@(#)ctrans:bug.header 1.1" */
645: /*
646:
647: who: Rick Tompkins, Object Design, Inc.
648:
649: file: print2.c:658
650:
651: default:
652: // encode with lexicallevel UNLESS ``special''
653: // e.g. __builtin
654: if (string[0]!='_' || string[1]!='_') {
655: if (i)
656: 658: fprintf(out_file,"__%d__O%d.",lex_level-1,i,i);
657: else
658: fprintf(out_file,"__%d",lex_level);
659: }
660: }
661: break;
662:
663:
664: date: 6/20/89
665:
666: state: not fixed
667:
668: sum: Anonymous unions within functions result in undefined unions.
669:
670: release filed under: beta 6
671:
672: MR:
673: priority:
674: category:
675: teststate:
676: name of changed files:
677: release agent:
678: related MRs:
679:
680: description of bug with output now and expected output:
681:
682: Anonymous unions within functions result in undefined unions.
683: This is due to the inconsistency in outputing the lexical level
684: of such a union when generating its C name. In an expression the
685: union name generated for a anonymous union at the function level
686: has the lexical level part while the corresponding declaration
687: does not.
688:
689: EXAMPLE:
690:
691: main ()
692: {
693:
694: union {
695: char u_c;
696: int u_i;
697: float u_f;
698: };
699:
700: u_c = 'a'; /* These result in an undefined union name. */
701: u_i = 9;
702: u_f = 3.5;
703:
704: }
705:
706:
707: OUTPUT:
708:
709: #line 1 "e.out.C"
710:
711: /* <<C++ Translator 2.0 Beta 6 04/12/89 ODI version 1.2.1.18 of 89/06/06 16:24:40 by benson. Compiled by tompkins at 89-06-08 14:48:22 in /usr1/tompkins/C++_2.0_bugs/src>> */
712: /* < e.out.C > */
713:
714: #line 3 "e.out.C"
715: char *_vec_new ();
716:
717: #line 3 "e.out.C"
718: char _vec_delete ();
719: typedef int (*__vptp)();
720: struct __mptr {short d; short i; __vptp f; };
721:
722: #line 3 "e.out.C"
723:
724: #line 6 "e.out.C"
725: union __C1 { /* sizeof __C1 == 4 */
726:
727: #line 7 "e.out.C"
728: char u_c ;
729: int u_i ;
730: float u_f ;
731: };
732:
733: #line 3 "e.out.C"
734: int main (){ _main();
735: #line 4 "e.out.C"
736: {
737: #line 6 "e.out.C"
738:
739: #line 10 "e.out.C"
740: union __C1 __O1 ; /* Declaration of generated union. */
741:
742: #line 12 "e.out.C"
743: __1__O1.u_c = 'a' ; /* Use of generated union has different name.*/
744: __1__O1.u_i = 9 ;
745: __1__O1.u_f = 3.5 ;
746: }
747: }
748: #line 18 "e.out.C"
749:
750: /* the end */
751:
752: ERRORS:
753:
754: moon:tompkins(34)> /usr/local/bin/CC -g -o e.out e.out.C
755: e.out.C:
756: cc -o e.out -g e.out..c -l/usr/local/lib/libC.1.2.a
757: "e.out.C", line 12: __1__O1 undefined
758:
759:
760: description of analysis and changes:
761:
762: The simplest change is to delete the lexical level part of the
763: generated union name. And of course, the extra "i" argument to
764: fprintf can be deleted as well. Given that any generated union
765: name is guaranteed to be unique within a file, the lexical level
766: isn't needed.
767:
768:
769: print2.c:658> fprintf(out_file,"__O%d.",,i);
770:
771:
772: Example below if available-
773: */
774:
775: /* test exhibiting bug goes below */
776:
777:
778: &&&&
779: &&&&
780: Return-Path: <[email protected]>
781: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
782: id AA14961; Wed, 28 Jun 89 19:35:57 EDT
783: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
784: id AA07403; Wed, 28 Jun 89 19:35:58 EDT
785: Date: Wed, 28 Jun 89 19:35:58 EDT
786: From: [email protected]
787: Message-Id: <[email protected]>
788: To: c++-bugs
789: Subject: name hiding lossage in real 2.0
790:
791:
792:
793: Rather than fixing the bugs associated with conflicting type and member names,
794: 2.0 has made things worse. You now have to ensure that even formal parmeter
795: member names don't conflict with an existing type.
796:
797: Thus the following example that compiled under 2.0 beta, fails in the real 2.0
798: Changing the name of the formal for y::foo permits compilation to proceed.
799:
800:
801:
802: class x{ public: x() ;} ;
803:
804: class y {
805: foo (int x ) ;
806: gotcha() ;
807: } ;
808:
809: y::gotcha() {
810: new x() ; // Syntax error in real 2.0, ok in beta 2.0
811: }
812: &&&&
813: &&&&
814: Return-Path: <benson>
815: Received: by odi.com (4.0/SMI-4.0/ODI-4)
816: id AA28498; Sun, 2 Jul 89 08:02:50 EDT
817: Date: Sun, 2 Jul 89 08:02:50 EDT
818: From: Benson Margulies <benson>
819: Message-Id: <[email protected]>
820: To: c++bugs
821: Subject: exit.c shadows important functionality of sun's exit(3)
822:
823: exit(3) has various responsabilities other than calling _exit.
824: The copy of exit in libC.a busts profiling, in that the call
825: to _mcount is lost. It probably also busts sun's on_exit
826: stuff, and possibly other things.
827: &&&&
828: &&&&
829: Return-Path: <benson>
830: Received: by odi.com (4.0/SMI-4.0/ODI-4)
831: id AA02052; Mon, 3 Jul 89 20:07:23 EDT
832: Message-Id: <[email protected]>
833: To: [email protected]
834: Cc: c++-bugs
835: Subject: Re: stdargs.h
836: In-Reply-To: Your message of Mon, 03 Jul 89 17:22:21 -0400.
837: <[email protected]>
838: Date: Mon, 03 Jul 89 20:07:22 EDT
839: From: Benson I. Margulies <benson>
840:
841:
842: The file /odi/C++/install/bugs/include/stdargs.h is missing an #endif.
843:
844: (The att2.0 version of the file is also broken.)
845:
846: stdargs.h is full of non-working code. stdarg.h is correct.
847: stdargs.h should be deleted.
848:
849: &&&&
850: &&&&
851: Return-Path: <[email protected]>
852: Received: from moon.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
853: id AA07601; Wed, 12 Jul 89 15:54:48 EDT
854: Received: by moon.odi.com (4.0/SMI-4.0/ODI-C2)
855: id AA03177; Wed, 12 Jul 89 15:55:19 EDT
856: Date: Wed, 12 Jul 89 15:55:19 EDT
857: From: [email protected]
858: Message-Id: <[email protected]>
859: To: c++-bugs
860: Subject: [aml: trivial spelling bug]
861:
862: Return-Path: <aml>
863: Date: Wed, 12 Jul 89 15:32:51 EDT
864: From: Al Leisinger <aml>
865: To: rick
866: Subject: trivial spelling bug
867:
868: Cfront error message:
869: warning: negative retured from function returning unsigned
870: ^^^^^^^
871: returned ??
872: I know it's trivial but why not report it ?
873:
874: &&&&
875: &&&&
876: Return-Path: <[email protected]>
877: Received: from valens.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
878: id AA09657; Wed, 12 Jul 89 18:50:48 EDT
879: Received: by valens.odi.com (4.0/SMI-4.0/ODI-C2)
880: id AA16557; Wed, 12 Jul 89 18:51:05 EDT
881: Date: Wed, 12 Jul 89 18:51:05 EDT
882: From: [email protected]
883: Message-Id: <[email protected]>
884: To: c++bugs
885: Subject: mman.h
886: Reply-To: [email protected]
887:
888: mman.h has been changed from the beta release to the 2.0 release. It
889: now no longer provides a declaration for the "mprotect" system call.
890:
891: &&&&
892: &&&&
893: Return-Path: <[email protected]>
894: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
895: id AA02846; Fri, 14 Jul 89 08:35:48 EDT
896: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
897: id AA00287; Fri, 14 Jul 89 08:36:10 EDT
898: Message-Id: <[email protected]>
899: To: sam, c++bugs
900: Subject: void versus ansi mode
901: Date: Fri, 14 Jul 89 08:36:06 EDT
902: From: Benson I. Margulies <[email protected]>
903:
904: Cfront translates void types to char types, in apparent support
905: of really ancient K&R c compilers. This is supposedly turned off
906: by +a1. However,
907:
908: (1) the code in print2.c that conditions on ansi_opt fails to
909: print the string "void" when ansi mode is turned on. It just prints
910: nothing.
911:
912: (2) the code in simpl.c referred to by print2.c dosen't even check
913: ansi mode, it just emits a cast.
914:
915: I've changed print2 and simple to leave void be when running on a sun,
916: since the sun compiler is quite content with void. I also fixed it to
917: print "void" when in ansi mode.
918: &&&&
919: &&&&
920: Return-Path: <[email protected]>
921: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
922: id AA03158; Fri, 14 Jul 89 11:44:01 EDT
923: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
924: id AA00819; Fri, 14 Jul 89 11:44:00 EDT
925: Date: Fri, 14 Jul 89 11:44:00 EDT
926: From: [email protected]
927: Message-Id: <[email protected]>
928: To: c++-bugs
929: Subject: problem with reference initialization
930:
931:
932:
933: A reference initialized by a function returning a reference generates bad c
934: code which provokes an error message from cc of the form:
935:
936: "/usr1/sam/2.0/test/cast.C", line 3: unacceptable operand of &
937:
938:
939: for the example provided below:
940:
941:
942: int &foo () ;
943: int &i = foo() ;
944:
945:
946:
947: &&&&
948: &&&&
949: Return-Path: <[email protected]>
950: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
951: id AA17585; Wed, 19 Jul 89 07:46:52 EDT
952: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
953: id AA01219; Wed, 19 Jul 89 07:47:19 EDT
954: Message-Id: <[email protected]>
955: To: c++bugs
956: Subject: confusion over placement options
957: Date: Wed, 19 Jul 89 07:47:17 EDT
958: From: Benson I. Margulies <[email protected]>
959:
960: Please explain the following message:
961:
962: "foo.C", line 7: error: argument 2 of type void * expected for T::operator new()
963:
964: #include <sys/types.h>
965: #include <malloc.h>
966:
967: void * operator new (size_t, void *);
968:
969: class T {
970: public:
971: char * s;
972: void * operator new (size_t, void *);
973: T(int x, void * v) {
974: s = new (v)(char[x]);
975: };
976: };
977:
978: void * T::operator new (size_t s, void * v)
979: {
980: return (void *)malloc(s);
981: }
982:
983: T* Q()
984: {
985: int z = 1;
986: void * v = 0;
987: T* t = new (v)T(z, v);
988: return t;
989: }
990: &&&&
991: &&&&
992: Return-Path: <[email protected]>
993: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
994: id AA17849; Wed, 19 Jul 89 09:58:24 EDT
995: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
996: id AA01533; Wed, 19 Jul 89 09:58:52 EDT
997: Message-Id: <[email protected]>
998: To: c++bugs
999: Subject: don't put names on typedef param list params
1000: Date: Wed, 19 Jul 89 09:58:49 EDT
1001: From: Benson I. Margulies <[email protected]>
1002:
1003:
1004: The followings gets an entirely spurious error.
1005:
1006: class node {
1007: };
1008:
1009: typedef (* gruz) (node * node);
1010:
1011: class bn : public node {
1012: int y;
1013: };
1014:
1015: &&&&
1016: &&&&
1017: Return-Path: <[email protected]>
1018: Received: from pigpen.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1019: id AA18574; Wed, 19 Jul 89 12:39:44 EDT
1020: Received: by pigpen.odi.com (4.0/SMI-4.0/ODI-C2)
1021: id AA11032; Wed, 19 Jul 89 12:40:26 EDT
1022: Date: Wed, 19 Jul 89 12:40:26 EDT
1023: From: [email protected]
1024: Message-Id: <[email protected]>
1025: To: C++-bugs
1026: Subject: static members of nested classes
1027:
1028: Static members of nested class definitions don't work. The
1029: following code:
1030:
1031: main()
1032: {
1033: class T {
1034: public:
1035: static int count;
1036: };
1037:
1038: T::count++; // "int T::count;" also causes failure
1039: }
1040:
1041: results in a link error:
1042:
1043: ld: Undefined symbol
1044: T__main__Fv__L1::count
1045:
1046: Now, the C++ 2.0 reference manual says that
1047: (1) The declaration of a static member in its class declaration is
1048: NOT a definition.
1049: (2) Static members of a class declared local to some function ...
1050: cannot be initialized [and must therefore accept the default
1051: "all zeros" initialization].
1052:
1053: The current behavior, though, is worse than that: static members of a
1054: nested class cannot be referred to at all, because they are declared
1055: but never defined.
1056: &&&&
1057: &&&&
1058: Return-Path: <[email protected]>
1059: Received: from valens.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1060: id AA18753; Wed, 19 Jul 89 15:12:40 EDT
1061: Received: by valens.odi.com (4.0/SMI-4.0/ODI-C2)
1062: id AA24717; Wed, 19 Jul 89 15:13:09 EDT
1063: Date: Wed, 19 Jul 89 15:13:09 EDT
1064: From: [email protected]
1065: Message-Id: <[email protected]>
1066: To: [email protected]
1067: Cc: C++-bugs
1068: In-Reply-To: [email protected]'s message of Wed, 19 Jul 89 12:40:26 EDT <[email protected]>
1069: Subject: static members of nested classes
1070: Reply-To: [email protected]
1071:
1072: Date: Wed, 19 Jul 89 12:40:26 EDT
1073: From: [email protected]
1074:
1075: The current behavior, though, is worse than that: static members of a
1076: nested class cannot be referred to at all, because they are declared
1077: but never defined.
1078:
1079: You know, it's conceivable that this works properly with the C
1080: compiler that they use at AT&T, because C compilers are inconsistent
1081: about how they handle this. Harbison & Steele goes into great detail
1082: about the four different sets of behavior that they've seen in various
1083: C compilers.
1084:
1085: However, that's not much of an excuse, because if that's why the bug
1086: exists, then it's only because they are depending on non-ANSI-like
1087: behavior.
1088:
1089: &&&&
1090: &&&&
1091: Return-Path: <[email protected]>
1092: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1093: id AA26387; Fri, 21 Jul 89 08:57:51 EDT
1094: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
1095: id AA06686; Fri, 21 Jul 89 08:58:23 EDT
1096: Date: Fri, 21 Jul 89 08:58:23 EDT
1097: From: [email protected]
1098: Message-Id: <[email protected]>
1099: To: c++bugs
1100: Subject: malloc.h
1101:
1102: malloc.h is broken.
1103:
1104: First of all, the correct prototype for mallinfo on a sun is to
1105: take no arguments.
1106:
1107: Second of all, the attempt to deal with the identically named
1108: structure and function fails, since the function of no args
1109: gets C++ linkage.
1110:
1111: I kludged around it by removing the declaration from the extern "C",
1112: and surrounding the cc/malloc.h include with
1113:
1114: #pragma linkage C
1115: #pragma linkage
1116: &&&&
1117: &&&&
1118: Return-Path: <[email protected]>
1119: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1120: id AA06715; Thu, 27 Jul 89 11:51:19 EDT
1121: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
1122: id AA00607; Thu, 27 Jul 89 11:51:57 EDT
1123: Message-Id: <[email protected]>
1124: To: c++bugs
1125: Subject: local typedefs and references are broken
1126: Date: Thu, 27 Jul 89 11:51:54 EDT
1127: From: Benson I. Margulies <[email protected]>
1128:
1129:
1130: the following emits a reference to type "z" in the C code
1131: for the declaration of ZZ.
1132:
1133: int qq();
1134:
1135: int q(int a) {
1136: typedef int z;
1137: z Z;
1138: z& ZZ = Z;
1139:
1140: int b;
1141:
1142: Z = qq();
1143:
1144: b= (int)(a + ZZ);
1145:
1146: return b;
1147: }
1148: &&&&
1149: &&&&
1150: Return-Path: <[email protected]>
1151: Received: from pigpen.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1152: id AA07632; Thu, 27 Jul 89 18:22:56 EDT
1153: Received: by pigpen.odi.com (4.0/SMI-4.0/ODI-C2)
1154: id AA14970; Thu, 27 Jul 89 18:23:52 EDT
1155: Date: Thu, 27 Jul 89 18:23:52 EDT
1156: From: [email protected]
1157: Message-Id: <[email protected]>
1158: To: c++-bugs
1159: Subject: global ref variable init broken?
1160:
1161: The following file:
1162:
1163: int theint;
1164:
1165: int& intref(){return theint;};
1166: int& bar = intref();
1167:
1168: main()
1169: {
1170: }
1171:
1172: gives the message (from cc):
1173:
1174: "foo.C", line 4: unacceptable operand of &
1175:
1176: while
1177:
1178: int theint;
1179:
1180: int& intref(){return theint;};
1181: int bar = intref();
1182:
1183: main()
1184: {
1185: }
1186:
1187: and
1188:
1189: int theint;
1190:
1191: int& intref(){return theint;};
1192:
1193: main()
1194: {
1195: int& bar = intref();
1196: }
1197:
1198: both compile correctly.
1199: &&&&
1200: &&&&
1201: Return-Path: <[email protected]>
1202: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1203: id AA11374; Fri, 28 Jul 89 18:22:27 EDT
1204: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
1205: id AA11900; Fri, 28 Jul 89 18:22:37 EDT
1206: Date: Fri, 28 Jul 89 18:22:37 EDT
1207: From: [email protected]
1208: Message-Id: <[email protected]>
1209: To: [email protected]
1210: In-Reply-To: [email protected]'s message of Fri, 28 Jul 89 15:13:15 EDT <[email protected]>
1211: Subject: initialization of local static variables
1212: Cc: c++bugs
1213:
1214: Date: Fri, 28 Jul 89 15:13:15 EDT
1215: From: [email protected]
1216:
1217: Are you aware of problems with the handling of static local variables?
1218: I created a static path object (which encapsulates a linked list)
1219: inside a function:
1220:
1221: person::person(string n, person* f, person* m)
1222: : name(n), age(-1), father(NULL), mother(NULL)
1223: {
1224: // Without cast to person*, cfront complains about "&this".
1225: set_father(f);
1226: set_mother(m);
1227: if (father)
1228: father->children.insert((person*) this);
1229: if (mother)
1230: mother->children.insert((person*) this);
1231:
1232: static path f_index = arrow(person, father);
1233: children.add_index(f_index);
1234: }
1235:
1236: The first time person::person runs, f_index is created, and temporary
1237: path_step objects (used to initialize permanent path_steps comprising
1238: the path) get deleted. I verified this by watching ~path_step run. On
1239: the second invocation of person::person, the path isn't created, but
1240: dtors are called anyway, sometimes with a zero address, sometimes not.
1241:
1242: If the f_index declaration is moved outside the function, so that it
1243: is static global, the program runs.
1244:
1245: I don't need a fix for this - I'm just wondering if I am
1246: misunderstanding something about when dtors should be run, or whether
1247: I'm running into a known bug.
1248:
1249:
1250: Jack
1251:
1252:
1253: (The code above is from /odi/aggs/src/person.C)
1254:
1255:
1256: The code generation for local static variables initialized with an expression
1257: that requires the use of compiler temporaries is busted. The constructor code
1258: for initializing the temporaries is run conditionally, since local static
1259: variables must be initialized just once, when control first passes through the
1260: declaration. Unfortunately, the destructor is run unconditionally in the
1261: generated code, each time control passes through the block containing the
1262: local static declaration.
1263:
1264: You may wish to avoid the use of local static variables with non-trivial
1265: initializations for now.
1266: &&&&
1267: &&&&
1268: Return-Path: <[email protected]>
1269: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1270: id AA20107; Wed, 2 Aug 89 13:11:40 EDT
1271: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
1272: id AA00545; Wed, 2 Aug 89 13:12:25 EDT
1273: Date: Wed, 2 Aug 89 13:12:25 EDT
1274: From: [email protected]
1275: Message-Id: <[email protected]>
1276: To: c++bugs
1277: Subject: complex initializations bungled for consts.
1278:
1279: when a complex expr initialization of a const is evaluated to an integer,
1280: dcl.c DEL's the variable init but neither zero's it nor skips the code
1281: that looks at it. Depending on accidents of storage, this can cause
1282: the compiler to core-dump shortly thereafter trying to run need_sti
1283: over it.
1284: &&&&
1285: &&&&
1286: Return-Path: <[email protected]>
1287: Received: from valens.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1288: id AA28108; Fri, 25 Aug 89 10:42:08 EDT
1289: Received: by valens.odi.com (4.0/SMI-4.0/ODI-C2)
1290: id AA04592; Fri, 25 Aug 89 10:42:08 EDT
1291: Date: Fri, 25 Aug 89 10:42:08 EDT
1292: From: [email protected]
1293: Message-Id: <[email protected]>
1294: To: c++-bugs
1295: Subject: Computed pointer-to-function values
1296: Reply-To: [email protected]
1297:
1298: In the following program, the last line, but only the last line, gets
1299: an error, namely "illegal indirection", whatever that means. I don't
1300: understand how the last line could not be legal C++ code.
1301:
1302: int
1303: twice(int x) {
1304: return x + x;
1305: }
1306:
1307: main() {
1308: int dummy;
1309: int (*fn)(int);
1310: int (*fn2)(int);
1311: int (*fn3)(int);
1312:
1313: fn = twice;
1314: fn2 = twice;
1315:
1316: dummy = (*fn)(30);
1317:
1318: dummy = fn(30);
1319:
1320: dummy = (fn)(3);
1321:
1322: fn3 = (dummy > 30 ? fn : fn2);
1323:
1324: dummy = (dummy > 30 ? fn : fn2)(30); /* line 22: illegal indirection */
1325:
1326: }
1327: &&&&
1328: &&&&
1329: Return-Path: <[email protected]>
1330: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1331: id AA28339; Fri, 25 Aug 89 11:30:08 EDT
1332: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
1333: id AA06818; Fri, 25 Aug 89 11:30:13 EDT
1334: Date: Fri, 25 Aug 89 11:30:13 EDT
1335: From: [email protected]
1336: Message-Id: <[email protected]>
1337: To: c++bugs, sam, stryker, tompkins
1338: Subject: Installation in /usr2/odi/c++/versions/odi2/src/
1339:
1340: Installation version odi2_34 in /usr2/odi/c++/versions/odi2/src/ at 89:7:25:11:26:44.
1341:
1342: Version odi2_34(1.34) from /usr1/benson/work/cfront/
1343:
1344: cfront croaked for
1345:
1346: class x : public y {
1347: public:
1348: x (a, b, c) : y(z(a), Cast(b)) {};
1349:
1350: because it tried to detect the entry to the initialization list
1351: only by seeing ) :, and to exit it at any ). So the close of the z(a)
1352: turned off the global that indicated that the current state was within
1353: a base init list, and then got confused by the cast. The fix is to use
1354: grammar actions to control the state.
1355:
1356:
1357: gram.y:
1358: revision 1.12
1359: date: 89/08/25 11:23:09; author: benson; state: Exp; lines added/del: 21/7
1360: set must_be_expr for base_init processing and for nothing else.
1361: Don't leave in_arg_list on in the base_init list.
1362:
1363: lalex.c:
1364: revision 1.6
1365: date: 89/08/25 11:22:33; author: benson; state: Exp; lines added/del: 20/18
1366: Remove code to try to set the must_be_expr code by detecting
1367: ) : and const : in the token stream. Depend on the grammar.
1368:
1369: &&&&
1370: &&&&
1371: Return-Path: <[email protected]>
1372: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1373: id AA04677; Tue, 29 Aug 89 12:31:06 EDT
1374: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
1375: id AA02179; Tue, 29 Aug 89 12:31:03 EDT
1376: Date: Tue, 29 Aug 89 12:31:03 EDT
1377: From: [email protected]
1378: Message-Id: <[email protected]>
1379: To: c++-bugs
1380: Subject: missing error message
1381:
1382:
1383:
1384:
1385: The following example is in error, since the class "b" has effectively been
1386: defined twice in the global scope. Cfront fails to detect this error, and
1387: generates a bad translation that evokes complaints from the C compiler.
1388:
1389: Removing the member x::mb does result in an appropriate error message !
1390:
1391:
1392:
1393: class a {
1394: class b {
1395: int mb ;
1396: double r ;
1397: } cb ;
1398: } ;
1399:
1400:
1401:
1402: class x {
1403: int ma ; /* provokes the bug ? */
1404:
1405: class b {
1406: int mb ;
1407: } cb ;
1408: } ;
1409: &&&&
1410: &&&&
1411: Return-Path: <[email protected]>
1412: Received: from valens.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1413: id AA02798; Fri, 8 Sep 89 17:48:28 EDT
1414: Received: by valens.odi.com (4.0/SMI-4.0/ODI-C2)
1415: id AA05949; Fri, 8 Sep 89 17:51:07 EDT
1416: Date: Fri, 8 Sep 89 17:51:07 EDT
1417: From: [email protected]
1418: Message-Id: <[email protected]>
1419: To: c++-bugs
1420: Subject: base type expected for init_fn
1421: Reply-To: [email protected]
1422:
1423: Compiling the file /usr2/odi/storage/client/bug.C, I get the weird
1424: error message "base type expected for init_fn". Look at this file,
1425: and search for #define bug. If you remove this line, the file compiles.
1426: This is extremely strange since the thing that "bug" controls has
1427: nothing to do with the part of the code that causes the error message.
1428:
1429: valens:dlw(89)> pwd
1430: /usr2/odi/storage/client
1431: valens:dlw(90)> CC -v bug.C -o bug.o
1432: CC $Revision: 1.8 $ of $Date: 89/08/22 13:25:28 $ by $Author: tompkins $
1433: /lib/cpp -B -C -Dc_plusplus=1 -D__cplusplus=1 -DBSD -I/usr2/odi/C++/install/odi2/include bug.C > /usr/tmp/CC.5939/cpptmp
1434: /usr2/odi/C++/install/odi2/cfront +v +fbug.C </usr/tmp/CC.5939/cpptmp > /usr/tmp/CC.5939/bug.i
1435: <<C++ Translator 2.00 06/30/89 ODI version 1.42 of 89/09/07 15:05:58 by benson. Compiled by benson at 89-09-07 15:43:00 in /usr2/odi/C++/versions/odi2/src>>
1436: "bug.C", line 2916: error: base type expected for init_fn
1437: 1 error
1438: &&&&
1439: &&&&
1440: Return-Path: <[email protected]>
1441: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1442: id AA15018; Wed, 13 Sep 89 10:25:59 EDT
1443: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
1444: id AA02436; Wed, 13 Sep 89 10:25:57 EDT
1445: Date: Wed, 13 Sep 89 10:25:57 EDT
1446: From: [email protected]
1447: Message-Id: <[email protected]>
1448: To: c++-bugs
1449: Subject: typedefs nested within a class definition
1450:
1451:
1452: Definition of a typedef nested within a class with the same name as a class
1453: definition, is not detected as an error, and may provoke subsequent confusing
1454: error messages, since the class definition is effectively blocked.
1455:
1456: An example:
1457:
1458:
1459: class t {double d ;} ;
1460:
1461: class c {
1462: typedef int t ; // Bug: this should be flagged as an error, but isn't.
1463: } ;
1464:
1465:
1466: // It appears that "t" is an int from this point forth !
1467: t i = 0 ;
1468: &&&&
1469: &&&&
1470: Return-Path: <[email protected]>
1471: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1472: id AA18635; Thu, 14 Sep 89 17:03:45 EDT
1473: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
1474: id AA04200; Thu, 14 Sep 89 17:03:42 EDT
1475: Date: Thu, 14 Sep 89 17:03:42 EDT
1476: From: [email protected]
1477: Message-Id: <[email protected]>
1478: To: jack
1479: Cc: c++-bugs
1480: Subject: pure virtual operator functions are broken
1481:
1482:
1483: Compiling the following example:
1484:
1485: class c
1486: {
1487: virtual operator int() = 0 ;
1488: };
1489:
1490:
1491: provokes the internal error message:
1492:
1493: "/usr1/sam/2.0/test/z.C", line 5: internal /usr2/odi/C++/install/odi2/cfront error: signature of 0
1494:
1495:
1496: Cfront appears to be one field short; it uses name::n_initializer
1497: both to hold the type of the operator, however, the remarkable
1498: abstract class declaration syntax uses this field to store what looks
1499: like an initializer, thereby overwriting the operator type
1500: information.
1501:
1502: Just deserts for the abstract class kludge !
1503:
1504:
1505: Will save this one for the bugfest.
1506: &&&&
1507: &&&&
1508: Return-Path: <[email protected]>
1509: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1510: id AA14391; Tue, 19 Sep 89 18:21:56 EDT
1511: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
1512: id AA11736; Tue, 19 Sep 89 18:21:54 EDT
1513: Date: Tue, 19 Sep 89 18:21:54 EDT
1514: From: [email protected]
1515: Message-Id: <[email protected]>
1516: To: c++-bugs, dlw
1517: Subject: name hiding lossage
1518:
1519:
1520:
1521: odi2_51 fixes the pernicious name hiding bug, where a formal argument name
1522: in a function member declaration would hide the name of an outer class
1523: definition, as in the example below:
1524:
1525:
1526:
1527: class x ;
1528:
1529: class c {
1530: foo(int x) ;
1531:
1532: bar(x *v) ; // invalid error message, x should be visible here
1533: } ;
1534:
1535: "hide.C", line 6: error: argument type expected for bar()
1536: &&&&
1537: &&&&
1538: Return-Path: <[email protected]>
1539: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1540: id AA28358; Tue, 26 Sep 89 10:08:38 EDT
1541: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
1542: id AA03843; Tue, 26 Sep 89 10:08:37 EDT
1543: Date: Tue, 26 Sep 89 10:08:37 EDT
1544: From: [email protected]
1545: Message-Id: <[email protected]>
1546: To: c++bugs
1547: Subject: static member functions treated like ordinary member functions
1548:
1549:
1550: class foo {
1551: public:
1552: static int x (int y) { return y; };
1553: int (*xx) (int);
1554: foo () { xx = x;};
1555: };
1556:
1557: foo FOO;
1558:
1559: compiling this gets:
1560:
1561: "bug.C", line 6: warning: address of bound function (try using ``foo ::*'' for po
1562: inter type and ``&foo ::x '' for address)
1563:
1564: which is wrong. Since x is a static function, it ought to be usuable
1565: like any other function.
1566: &&&&
1567: &&&&
1568: Return-Path: <[email protected]>
1569: Received: from pigpen.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1570: id AA14840; Wed, 4 Oct 89 13:19:17 EDT
1571: Received: by pigpen.odi.com (4.0/SMI-4.0/ODI-C2)
1572: id AA13854; Wed, 4 Oct 89 13:19:14 EDT
1573: Date: Wed, 4 Oct 89 13:19:14 EDT
1574: From: [email protected]
1575: Message-Id: <[email protected]>
1576: To: c++-bugs
1577: Subject: members of const objects not const
1578:
1579: The following incorrectly compiles without error. This bug is
1580: documented in the 2.0 release notes, page A-9.
1581:
1582: class embedded { public:
1583: int value;
1584: void update() {value++;};
1585: };
1586:
1587: class C { public:
1588: embedded strct;
1589: };
1590:
1591: main()
1592: {
1593: const C p;
1594: p.strct.update();
1595: p.strct.value = 23;
1596: }
1597: &&&&
1598: &&&&
1599: Return-Path: <[email protected]>
1600: Received: from mojo.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1601: id AA14856; Wed, 4 Oct 89 13:42:12 EDT
1602: Received: by mojo.odi.com (4.0/SMI-4.0/ODI-C2)
1603: id AA18996; Wed, 4 Oct 89 13:42:10 EDT
1604: Date: Wed, 4 Oct 89 13:42:10 EDT
1605: From: [email protected]
1606: Message-Id: <[email protected]>
1607: To: c++-bugs
1608: Subject: Can't Type Cast New Placement Arguments
1609:
1610:
1611: Compiling the following 3 lines provokes syntax errors for line 3.
1612:
1613: typedef unsigned int size_t;
1614: extern void * operator new(size_t,size_t,size_t);
1615: char *fund_01_xc_01 = new(size_t(1),size_t(2)) char('a');
1616: &&&&
1617: &&&&
1618: Return-Path: <[email protected]>
1619: Received: from pigpen.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1620: id AA15538; Wed, 4 Oct 89 16:49:48 EDT
1621: Received: by pigpen.odi.com (4.0/SMI-4.0/ODI-C2)
1622: id AA14895; Wed, 4 Oct 89 16:49:43 EDT
1623: Date: Wed, 4 Oct 89 16:49:43 EDT
1624: From: [email protected]
1625: Message-Id: <[email protected]>
1626: To: c++-bugs
1627: Subject: coercion ops order-dependent
1628:
1629: class test { public:
1630: void dummy() {};
1631: operator const test*() { return this; }; // the order of these ops ...
1632: operator test*() { return this; }; // ... is significant (??)
1633: };
1634:
1635: main()
1636: {
1637: test t;
1638: ((test*)t) -> dummy(); // both of these casts use operator test*()
1639: ((const test*)t) -> dummy(); // rather than operator const test*()
1640: };
1641:
1642: // however, if the ops appear in the opposite order in the class defn,
1643: // then they are called correctly --
1644: // BUT it is only a warning (not an error) that a const test* is used
1645: // as the this for the non-const member function dummy()
1646: &&&&
1647: &&&&
1648: Return-Path: <[email protected]>
1649: Received: from pigpen.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1650: id AA18054; Thu, 5 Oct 89 16:36:38 EDT
1651: Received: by pigpen.odi.com (4.0/SMI-4.0/ODI-C2)
1652: id AA16379; Thu, 5 Oct 89 16:36:35 EDT
1653: Date: Thu, 5 Oct 89 16:36:35 EDT
1654: From: [email protected]
1655: Message-Id: <[email protected]>
1656: To: c++-bugs
1657: Subject: CAST is not a permitted struct/union operation
1658:
1659: /* The following code goes through CC ok, but gets errors from cc:
1660:
1661: line 31: CAST is not a permitted struct/union operation
1662: line 31: operands of = have incompatible types
1663: */
1664:
1665: template<class vtype>
1666: class vpointer { public:
1667: int foo;
1668: vpointer(){};
1669: vpointer(vpointer<vtype>& v) {foo = v.foo;};
1670: int operator==(vpointer<vtype> const&v) const { return (foo == v.foo); };
1671: };
1672:
1673: template<class t>
1674: class attribute { public:
1675: t rep;
1676: operator t() {return rep;};
1677: attribute(){}; // if these constructors are removed
1678: attribute(attribute& v) {rep = v.rep;}; // then the 2nd error dissappears
1679: };
1680:
1681: class c { public:
1682: attribute<vpointer<int> > foo;
1683: };
1684:
1685: main()
1686: {
1687: c a, b;
1688:
1689: if (a.foo == b.foo);
1690: }
1691: &&&&
1692: &&&&
1693: Return-Path: <[email protected]>
1694: Received: from pigpen.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1695: id AA18060; Thu, 5 Oct 89 16:40:22 EDT
1696: Received: by pigpen.odi.com (4.0/SMI-4.0/ODI-C2)
1697: id AA16396; Thu, 5 Oct 89 16:40:19 EDT
1698: Date: Thu, 5 Oct 89 16:40:19 EDT
1699: From: [email protected]
1700: Message-Id: <[email protected]>
1701: To: c++-bugs
1702: Subject: CAST still not permitted
1703:
1704: /* whoops -- I just realized that the templates were a red herring;
1705: the same error occurs without templates: */
1706:
1707: /* The following code goes through CC ok, but gets errors from cc:
1708:
1709: line 29: CAST is not a permitted struct/union operation
1710: line 29: operands of = have incompatible types
1711: */
1712:
1713: class vpointer { public:
1714: int foo;
1715: vpointer(){};
1716: vpointer(vpointer& v) {foo = v.foo;};
1717: int operator==(vpointer const&v) const { return (foo == v.foo); };
1718: };
1719:
1720: class attribute { public:
1721: vpointer rep;
1722: operator vpointer() {return rep;};
1723: attribute(){}; // if these constructors are removed
1724: attribute(attribute& v) {rep = v.rep;}; // then the 2nd error dissappears
1725: };
1726:
1727: class c { public:
1728: attribute foo;
1729: };
1730:
1731: main()
1732: {
1733: c a, b;
1734:
1735: if (a.foo == b.foo);
1736: }
1737:
1738: &&&&
1739: &&&&
1740: Return-Path: <[email protected]>
1741: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1742: id AA19948; Fri, 6 Oct 89 14:34:59 EDT
1743: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
1744: id AA00311; Fri, 6 Oct 89 14:34:57 EDT
1745: Date: Fri, 6 Oct 89 14:34:57 EDT
1746: From: [email protected]
1747: Message-Id: <[email protected]>
1748: To: c++-bugs
1749: Subject: compile time checking of pure virtual functions is suspect
1750:
1751:
1752: The following compiles without error, even though it should according
1753: to section 10.3.
1754:
1755:
1756: class b1 {
1757:
1758: virtual foo() ;
1759: } ;
1760:
1761:
1762: class b2 {
1763: virtual foo() = 0 ;
1764: } ;
1765:
1766:
1767: class d : public b1, public b2 {
1768: } ;
1769:
1770:
1771: Note that modifying the derivation order so that b2 precedes b1 in the
1772: definition of the class "d", results in an appropriate error message,
1773: reproduced at the end of this message. According to section 10.1
1774: order of derivation is not supposed to be significant except for
1775: default initialization, cleanup, and storage layout.
1776:
1777:
1778:
1779:
1780:
1781: CC -I/usr1/sam/2.0/test/ -I /odi/include +e0 -F /tmp/x.C -c > /dev/null
1782: "/usr1/sam/2.0/test/x.C", line 12: error: cannot inherit pure virtual function b2::foo()
1783:
1784: Compilation finished at Fri Oct 6 14:27:23
1785: &&&&
1786: &&&&
1787: Return-Path: <[email protected]>
1788: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1789: id AA26627; Tue, 10 Oct 89 11:56:10 EDT
1790: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
1791: id AA02816; Tue, 10 Oct 89 11:56:09 EDT
1792: Date: Tue, 10 Oct 89 11:56:09 EDT
1793: From: [email protected]
1794: Message-Id: <[email protected]>
1795: To: c++-bugs
1796: Cc: bob
1797: Subject: pure virtual destructors
1798:
1799:
1800:
1801: Pure virtual destructors appear to be broken in two ways:
1802:
1803: a) The derived class buit from the abstract class is not checked to
1804: ensure that it defines a virtual destructor.
1805:
1806: b) Section 10.3 of the PRM states that a pure virtual function must be
1807: defined if it is called explicitly. In the example below, the
1808: destructor is called "explicitly" by the compiler as part of the code
1809: generated for the destructors of the derived type. I think it
1810: is just the documentation that is remiss here.
1811:
1812:
1813: The moral of the story seems to be that if you have defined a pure
1814: virtual destructor you must define a body for it. The hack (= 0)
1815: syntax prevents you from defining the body at the same time that you
1816: define it "pure", so you must do it outside the class declaration.
1817:
1818:
1819:
1820: class base {
1821: protected:
1822: int a;
1823:
1824: public:
1825: base( int anA);
1826: virtual ~base() = 0;
1827: };
1828:
1829: class derived : public base {
1830: protected:
1831: int b;
1832:
1833: public:
1834: derived( int anA, int aB);
1835: virtual ~derived(); // commenting out this line doesn't provoke an error
1836: // message
1837: };
1838:
1839: base::base( int anA) {
1840: }
1841:
1842: derived::derived( int anA, int aB) : base( anA) {
1843: }
1844:
1845: derived::~derived() {
1846: }
1847:
1848: base::~base(){}
1849:
1850: main(){}
1851: &&&&
1852: &&&&
1853: Return-Path: <[email protected]>
1854: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1855: id AA27198; Tue, 10 Oct 89 16:29:51 EDT
1856: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
1857: id AA02918; Tue, 10 Oct 89 16:29:47 EDT
1858: Date: Tue, 10 Oct 89 16:29:47 EDT
1859: From: [email protected]
1860: Message-Id: <[email protected]>
1861: To: c++-bugs
1862: Subject: default arguments
1863:
1864:
1865: It would seem that the default arguments for a virtual function
1866: should have the same initialization expression in the base and derived
1867: types. Otherwise, since the evaluation of the default argument is
1868: performed at the point of call, the expression used for the default
1869: initialization may not correspond to the virtual function that is
1870: actually run for the object !
1871:
1872:
1873: This may be a language bug rather than a cfront bug, since I can't
1874: find any such strictures on default arguments in the PRM.
1875:
1876:
1877: class b {
1878: public:
1879: virtual foo(int i = 5) ;
1880: } ;
1881:
1882:
1883: class d : public b {
1884: public:
1885: virtual foo(int i = 6) ; // different initialization
1886: } ;
1887:
1888: foo(d *dp) {
1889: b *bp = d ;
1890:
1891: bp->foo() ; // uses i = 5, even though the "most derived type" of
1892: // bp * is a d, and d::foo is the function that would
1893: // actually be invoked.
1894: dp->foo() ; // uses i = 6
1895: }
1896: &&&&
1897: &&&&
1898: Return-Path: <[email protected]>
1899: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1900: id AA27291; Tue, 10 Oct 89 16:56:56 EDT
1901: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
1902: id AA03101; Tue, 10 Oct 89 16:56:54 EDT
1903: Date: Tue, 10 Oct 89 16:56:54 EDT
1904: From: [email protected]
1905: Message-Id: <[email protected]>
1906: To: c++-bugs
1907: Subject: incorrect error message
1908:
1909:
1910:
1911: A missing destructor member declaration, derived::~derived in this
1912: case results in a very misleading error message.
1913:
1914:
1915: class base {
1916: public:
1917: base();
1918: virtual ~base() ;
1919: };
1920:
1921:
1922: class derived : public base {
1923: public:
1924: derived();
1925: };
1926:
1927: derived::~derived() {
1928: }
1929:
1930: CC -I/usr1/sam/2.0/test/ -I /odi/include +e0 -F /tmp/vd.C -c > /dev/null
1931: "/usr1/sam/2.0/test/vd.C", line 13: error: two definitions of derived::~derived()
1932:
1933: Compilation finished at Tue Oct 10 16:52:59
1934: &&&&
1935: &&&&
1936: Return-Path: <[email protected]>
1937: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1938: id AA27460; Tue, 10 Oct 89 18:54:22 EDT
1939: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
1940: id AA03209; Tue, 10 Oct 89 18:54:21 EDT
1941: Date: Tue, 10 Oct 89 18:54:21 EDT
1942: From: [email protected]
1943: Message-Id: <[email protected]>
1944: To: c++-bugs
1945: Subject: more name visibility lossage (how bankrupt can a symbol table be)
1946:
1947:
1948:
1949: Members defined in a base class but accessed from within a derived class
1950: provoke syntax errors when the member name is shadowed by a global
1951: type name.
1952:
1953:
1954: Note that it is ok to access a a member in the immediate class even if
1955: it is shadowed as above.
1956:
1957:
1958:
1959: typedef unsigned char t ;
1960: typedef unsigned char t1 ;
1961:
1962: class b {
1963: public:
1964: int t ;
1965: } ;
1966:
1967: class d : public b {
1968: int t1 ;
1969: foo() {
1970: t1 = 0 ; // t1 is ok since it is local
1971: t = 0 ; // incorrect error by cfront here
1972: }
1973: bar() ;
1974: } ;
1975:
1976:
1977: d::bar() { t = 0 ; } // incorrect error by cfront here
1978: &&&&
1979: &&&&
1980: Return-Path: <[email protected]>
1981: Received: from pigpen.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
1982: id AA28825; Wed, 11 Oct 89 09:12:07 EDT
1983: Received: by pigpen.odi.com (4.0/SMI-4.0/ODI-C2)
1984: id AA19362; Wed, 11 Oct 89 09:12:05 EDT
1985: Date: Wed, 11 Oct 89 09:12:05 EDT
1986: From: [email protected]
1987: Message-Id: <[email protected]>
1988: To: [email protected], [email protected]
1989: Subject: Re: default arguments
1990:
1991: Date: Tue, 10 Oct 89 16:29:47 EDT
1992: From: [email protected]
1993:
1994: It would seem that the default arguments for a virtual function
1995: should have the same initialization expression in the base and derived
1996: types. Otherwise, since the evaluation of the default argument is
1997: performed at the point of call, the expression used for the default
1998: initialization may not correspond to the virtual function that is
1999: actually run for the object !
2000:
2001: This may be a language bug rather than a cfront bug, since I can't
2002: find any such strictures on default arguments in the PRM.
2003:
2004: class b {
2005: public:
2006: virtual foo(int i = 5) ;
2007: } ;
2008:
2009: class d : public b {
2010: public:
2011: virtual foo(int i = 6) ; // different initialization
2012: } ;
2013:
2014: foo(d *dp) {
2015: b *bp = d ;
2016:
2017: bp->foo() ; // uses i = 5, even though the "most derived type" of
2018: // bp * is a d, and d::foo is the function that would
2019: // actually be invoked.
2020: dp->foo() ; // uses i = 6
2021: }
2022:
2023: I am not even completely convinced that this is a language bug (on the
2024: other hand I am hesitant to call it exactly a feature either -- it's
2025: firmly in that grey area in between). Since default arg selection
2026: happens at compile time, of course it cannot use the actual type of
2027: the object, it can only use the declared type. But what's so wrong
2028: with that? Sure, it might be confusing to some users, but that seems
2029: like a scant motivation for labelling it a "bug", since it might
2030: actually be useful in some cases:
2031:
2032: class person { public:
2033: virtual void hire(char* job_title, int starting_salary = MINIMUM_WAGE);
2034: };
2035:
2036: class college_graduate : public person { public:
2037: virtual void hire(char* job_title, int starting_salary = 30000);
2038: };
2039:
2040: main() {
2041: college_graduate *g = new college_graduate;
2042: person *p = g;
2043:
2044: p->hire("box packer"); /* minimum wage, who cares if she went to college */
2045: g->hire("CEO"); /* for a job like this, she better be a grad,
2046: * and she should get paid accoringly */
2047: }
2048:
2049: I'm not sure if this is a convincing argument that this isn't a bug;
2050: but on the other hand, I don't see a strong argument that it is a bug
2051: either. Users just have to get their heads around a slightly
2052: complicated rule: for virtual functions, the function body chosen
2053: depends on the actual type of the object, but the default args depend
2054: on its declared type.
2055:
2056: $.02
2057: -Gordon
2058: &&&&
2059: &&&&
2060: Return-Path: <[email protected]>
2061: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
2062: id AA02033; Thu, 12 Oct 89 14:13:37 EDT
2063: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
2064: id AA23840; Thu, 12 Oct 89 14:13:35 EDT
2065: Date: Thu, 12 Oct 89 14:13:35 EDT
2066: From: [email protected]
2067: Message-Id: <[email protected]>
2068: To: c++bugs
2069: Subject: multiple uses of constr
2070:
2071:
2072: consider:
2073:
2074: class foo {} ;
2075:
2076: typedef foo * FOO;
2077: typedef FOO const FOOc;
2078: typedef FOOc const FOOcc;
2079:
2080: if c++ was like ansi C, the last typedef would be invalid.
2081: Instead, it is permitted, but a FOOcc cannot be passed as a FOOc.
2082: The code in type::check adds 1 to cnst1 or cnst2 for each const that it
2083: sees, and then makes various arithmetic comparisons.
2084:
2085: Whatever this means, it can't be true that two const's is more const
2086: than one const. Either type::check should use |=, or the grammar should
2087: catch and yell about the last typedef above.
2088: &&&&
2089: &&&&
2090: Return-Path: <[email protected]>
2091: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
2092: id AA17710; Thu, 19 Oct 89 15:06:19 EDT
2093: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
2094: id AA01604; Thu, 19 Oct 89 15:06:17 EDT
2095: Date: Thu, 19 Oct 89 15:06:17 EDT
2096: From: [email protected]
2097: Message-Id: <[email protected]>
2098: To: c++bugs
2099: Subject: warnings? ! ^!%#%
2100:
2101: Consider this program:
2102:
2103: class C {
2104: int x;
2105: int y;
2106: };
2107:
2108: class D : public C {
2109: public:
2110: D (D &);
2111: D();
2112: int r;
2113: int s;
2114: };
2115:
2116: void x (C &);
2117:
2118: D makec(D&);
2119:
2120: void y ()
2121: {
2122: D q;
2123: int z;
2124:
2125: /* Warning */
2126: x(makec(q));
2127:
2128: /* No Warning */
2129: x((z = 0, makec(q)));
2130: }
2131:
2132: In both cases, the code generates has no temporary.
2133:
2134: (to be precise, the code generated has a temporary passed in as a
2135: result argument, but no copies are made. that temporary is passed
2136: directly to the function X.)
2137:
2138: In call_fct, a G_CM and a temp are built if f_result is non-0,
2139: and that is non-0 because there is a D(D&) constructor. (see
2140: make_res). In the second case, the presence of the comma hides
2141: the so-called temporary from the sight of the code in call_fct
2142: that produces the warning.
2143:
2144: Since the generated code is AOK, its hard to be too upset about this.
2145: but it sure is mystifying.
2146: &&&&
2147: &&&&
2148: Return-Path: <[email protected]>
2149: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
2150: id AA26697; Mon, 23 Oct 89 19:38:29 EDT
2151: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
2152: id AA11165; Mon, 23 Oct 89 19:38:26 EDT
2153: Date: Mon, 23 Oct 89 19:38:26 EDT
2154: From: [email protected]
2155: Message-Id: <[email protected]>
2156: To: c++-bugs
2157: Subject: coercions within the operands of a conditional operator are broken
2158:
2159:
2160:
2161: The first operand of a condition operator is not coerced to the result
2162: type, the second operator matches the result type, as in the example below.
2163:
2164: class b0 {
2165: int i ;
2166: } ;
2167:
2168:
2169: class b {
2170: int i ;
2171: virtual f() ;
2172: } ;
2173:
2174: class d : public b0, public b {
2175: public:
2176: int i ;
2177: d (int i) ;
2178: virtual f() ;
2179: } ;
2180:
2181:
2182: int f() ;
2183:
2184: b *lose(d *dp, b* bp)
2185: {
2186: bp = (f() ? dp : bp) ; // incorrect code, no coercion of dp
2187:
2188: return (f() ? dp : bp) ; // same bug
2189: }
2190: &&&&
2191: &&&&
2192: Return-Path: <[email protected]>
2193: Received: from mojo.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
2194: id AA01763; Wed, 25 Oct 89 13:25:14 EDT
2195: Received: by mojo.odi.com (4.0/SMI-4.0/ODI-C2)
2196: id AA04012; Wed, 25 Oct 89 13:25:11 EDT
2197: Date: Wed, 25 Oct 89 13:25:11 EDT
2198: From: [email protected]
2199: Message-Id: <[email protected]>
2200: To: c++-bugs
2201: Subject: You can't new a pointer to member function
2202:
2203:
2204: Compiling the following program
2205:
2206: /* This may look like C code, but it is really -*- C++ -*- */
2207:
2208: struct MF_01_tk_01 {
2209: char char_00, char_01, char_02, char_03;
2210: char fun_00();
2211: };
2212: struct MF_01_tk_02 : public MF_01_tk_01 {
2213: char fun_01();
2214: };
2215:
2216: void *MF_new_01()
2217: {
2218: typedef char (MF_01_tk_01::*MFp)();
2219: return (void *)(new MFp(MF_01_tk_02::fun_00));
2220: }
2221:
2222: produces the not immediately comprehensible error messages
2223:
2224: "MF_new_01.C", line 15: syntax error at or near symbol {
2225: "MF_new_01.C", line 14: syntax error at or near symbol }
2226: "MF_new_01.C", line 17: syntax error
2227:
2228: from cc (not CC).
2229: &&&&
2230: &&&&
2231: Return-Path: <[email protected]>
2232: Received: from moon.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
2233: id AA04140; Thu, 26 Oct 89 11:08:45 EDT
2234: Received: by moon.odi.com (4.0/SMI-4.0/ODI-C2)
2235: id AA16204; Thu, 26 Oct 89 11:08:42 EDT
2236: Date: Thu, 26 Oct 89 11:08:42 EDT
2237: From: [email protected]
2238: Message-Id: <[email protected]>
2239: To: c++-bugs
2240: Subject: bit field packing
2241:
2242:
2243:
2244: cfront incorrectly estimates the size of classes containing
2245: bit fields. Consequently, when casting a derived class pointer
2246: to a pointer to one of its base classes which contains a bit field,
2247: the wrong offset may be added to the derived class pointer.
2248:
2249: The field basecl::obj_offset is getting the wrong value as
2250: cfront assumes each bit fields to be aligned on a byte
2251: boundary.
2252:
2253: The places to look.
2254:
2255: Allocating base class objects: probably the culprit, but given
2256: cfront's method of code reuse (cut and paste) the other places
2257: probably need to be checked.
2258:
2259: dcl4.c:1349: l->obj_offset = boff;
2260:
2261: Allocating virtual base classes
2262:
2263: dcl4.c:1764: if (b->obj_offset = has_allocated_base(bcl)) continue;
2264:
2265: dcl4.c:1771: b->obj_offset = byte_offset; // offset in this
2266:
2267:
2268: Generating destructors for both non-virtual and virtual base
2269: classes.
2270:
2271: simpl.c:555: x->obj_offset = l->obj_offset;
2272:
2273: simpl.c:562: b->obj_offset = l->obj_offset;
2274:
2275:
2276: Test Code
2277: ---------
2278:
2279:
2280: #include <iostream.h>
2281:
2282: typedef unsigned int uint ;
2283:
2284:
2285: class A {
2286: public:
2287: char c;
2288: A () { c = 0; }
2289: };
2290:
2291: class bit_fields_1 {
2292:
2293: public:
2294: uint file_index : 10;
2295: uint line_no : 22;
2296:
2297: bit_fields_1 () { file_index = 0; line_no = 0; };
2298:
2299: };
2300:
2301:
2302: class bit_fields_2 {
2303:
2304: public:
2305: uint file_index : 10,
2306: line_no : 22;
2307:
2308: bit_fields_2 () { file_index = 0; line_no = 0; };
2309:
2310: };
2311:
2312:
2313: class B {
2314: public:
2315: int v;
2316:
2317: B () { v = 0xaaaa; };
2318:
2319: };
2320:
2321: class D1 : public A, public bit_fields_1, public B {
2322: };
2323:
2324: class D2 : public A, public bit_fields_2, public B {
2325: };
2326:
2327:
2328: int works_as_B (B *b)
2329: {
2330:
2331: if (b->v == 5)
2332: return 1;
2333: else
2334: return 0;
2335:
2336: }
2337:
2338:
2339: int main ()
2340: {
2341:
2342: int passed = 1;
2343:
2344: D1 d1;
2345: if ( ! works_as_B(&d1)) {
2346: cout << "FAILED: d1 doesn't work as B" << endl;
2347: cout << "\tsizeof(D1) = " << sizeof(D1) << endl;
2348: passed = 0;
2349: }
2350:
2351: D2 d2;
2352: if ( ! works_as_B(&d2)) {
2353: cout << "FAILED: d2 doesn't work as B" << endl;
2354: cout << "\tsizeof(D2) = " << sizeof(D2) << endl;
2355: passed = 0;
2356: }
2357:
2358: if (passed)
2359: cout << "PASSED" << endl;
2360:
2361: }
2362:
2363:
2364:
2365: -Rick
2366: &&&&
2367: &&&&
2368: Return-Path: <[email protected]>
2369: Received: from pigpen.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
2370: id AA03326; Tue, 31 Oct 89 15:28:12 EST
2371: Received: by pigpen.odi.com (4.0/SMI-4.0/ODI-C2)
2372: id AA01538; Tue, 31 Oct 89 15:28:08 EST
2373: Date: Tue, 31 Oct 89 15:28:08 EST
2374: From: [email protected]
2375: Message-Id: <[email protected]>
2376: To: c++-bugs
2377: Subject: bad template ref member inits not caught
2378:
2379: The following file appropriately fails to compile:
2380:
2381: struct A {
2382: int& i;
2383: A() : i() {};
2384: };
2385:
2386: generating the errors:
2387:
2388: "t.C", line 1: error: empty initializer for reference A::i
2389: "t.C", line 1: error: reference member A::i needs initializer
2390:
2391: But if you hide the ref member inside a template parameter,
2392: cfront dies with a core dump:
2393:
2394: template<class T>
2395: struct A {
2396: T i;
2397: A() : i() {};
2398: };
2399:
2400: static A<int&> a;
2401: &&&&
2402: &&&&
2403: Return-Path: <[email protected]>
2404: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
2405: id AA02618; Wed, 1 Nov 89 13:44:45 EST
2406: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
2407: id AA04946; Wed, 1 Nov 89 13:44:37 EST
2408: Date: Wed, 1 Nov 89 13:44:37 EST
2409: From: [email protected]
2410: Message-Id: <[email protected]>
2411: To: [email protected]
2412: Cc: c++-bugs
2413: In-Reply-To: [email protected]'s message of Tue, 31 Oct 89 15:28:08 EST <[email protected]>
2414: Subject: bad template ref member inits not caught(actually bad typedefed ref member inits not caught)
2415:
2416: Date: Tue, 31 Oct 89 15:28:08 EST
2417: From: [email protected]
2418:
2419: The following file appropriately fails to compile:
2420:
2421: struct A {
2422: int& i;
2423: A() : i() {};
2424: };
2425:
2426: generating the errors:
2427:
2428: "t.C", line 1: error: empty initializer for reference A::i
2429: "t.C", line 1: error: reference member A::i needs initializer
2430:
2431: But if you hide the ref member inside a template parameter,
2432: cfront dies with a core dump:
2433:
2434: template<class T>
2435: struct A {
2436: T i;
2437: A() : i() {};
2438: };
2439:
2440: static A<int&> a;
2441:
2442: The problem is template independent. The case below will blow up in
2443: the same way, a fix is on the way.
2444:
2445: typedef int & x ;
2446: struct A {
2447: x i;
2448: A() : i() {};
2449: };
2450:
2451: &&&&
2452: &&&&
2453: Return-Path: <[email protected]>
2454: Received: from cass.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
2455: id AA13420; Mon, 6 Nov 89 10:35:39 EST
2456: Received: by cass.odi.com (4.0/SMI-4.0/ODI-C2)
2457: id AA04499; Mon, 6 Nov 89 10:35:37 EST
2458: Date: Mon, 6 Nov 89 10:35:37 EST
2459: From: [email protected]
2460: Message-Id: <[email protected]>
2461: To: c++bugs
2462: Subject: how to confuse const checking
2463:
2464: The following program:
2465:
2466: /* -*- Mode:C++ -*- */
2467:
2468: int gruz (char *, char *);
2469: int gruz (char const *, char const *);
2470:
2471: void plugh (char const * x, char * y)
2472: {
2473: gruz(x,y);
2474: }
2475:
2476: gets the following error:
2477:
2478: CC foo.C:
2479: "foo.C", line 8: error: two exact matches for gruz(): int (const char *, const c
2480: har *) and int (char *, char *)
2481: 1 error
2482: &&&&
2483: &&&&
2484: Return-Path: <[email protected]>
2485: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
2486: id AA13457; Mon, 6 Nov 89 10:46:49 EST
2487: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
2488: id AA09132; Mon, 6 Nov 89 10:46:47 EST
2489: Date: Mon, 6 Nov 89 10:46:47 EST
2490: From: [email protected]
2491: Message-Id: <[email protected]>
2492: To: [email protected]
2493: Cc: c++bugs
2494: In-Reply-To: [email protected]'s message of Mon, 6 Nov 89 10:35:37 EST <[email protected]>
2495: Subject: how to confuse const checking
2496:
2497: Date: Mon, 6 Nov 89 10:35:37 EST
2498: From: [email protected]
2499:
2500: The following program:
2501:
2502: /* -*- Mode:C++ -*- */
2503:
2504: int gruz (char *, char *);
2505: int gruz (char const *, char const *);
2506:
2507: void plugh (char const * x, char * y)
2508: {
2509: gruz(x,y);
2510: }
2511:
2512: gets the following error:
2513:
2514: CC foo.C:
2515: "foo.C", line 8: error: two exact matches for gruz(): int (const char *, const c
2516: har *) and int (char *, char *)
2517: 1 error
2518:
2519:
2520: Unfortunately, according to Section 13 of the PRM this error message
2521: is legitimate.
2522: &&&&
2523: &&&&
2524: Return-Path: <[email protected]>
2525: Received: from joplin.odi.com by odi.com (4.0/SMI-4.0/ODI-4)
2526: id AA13519; Mon, 6 Nov 89 11:01:50 EST
2527: Received: by joplin.odi.com (4.0/SMI-4.0/ODI-C2)
2528: id AA09163; Mon, 6 Nov 89 11:01:47 EST
2529: Date: Mon, 6 Nov 89 11:01:47 EST
2530: From: [email protected]
2531: Message-Id: <[email protected]>
2532: To: [email protected]
2533: Cc: c++bugs
2534: In-Reply-To: [email protected]'s message of Mon, 6 Nov 89 10:35:37 EST <[email protected]>
2535: Subject: how to confuse const checking
2536:
2537:
2538: Upon further reflection there is a bug here. It shouldn't have been
2539: possible to define the second gruz, ie. the following abbreviated
2540: test should fail, but doesn't.
2541: ---------
2542:
2543: int gruz (char *, char *);
2544: int gruz (const char *, const char *);
2545:
2546: ----------
2547:
2548:
2549: Date: Mon, 6 Nov 89 10:35:37 EST
2550: From: [email protected]
2551:
2552: The following program:
2553:
2554: /* -*- Mode:C++ -*- */
2555:
2556: int gruz (char *, char *);
2557: int gruz (char const *, char const *);
2558:
2559: void plugh (char const * x, char * y)
2560: {
2561: gruz(x,y);
2562: }
2563:
2564: gets the following error:
2565:
2566: CC foo.C:
2567: "foo.C", line 8: error: two exact matches for gruz(): int (const char *, const c
2568: har *) and int (char *, char *)
2569: 1 error
2570:
2571:
2572: Unfortunately, according to Section 13 of the PRM this error message
2573: is legitimate.
2574: &&&&
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.