home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #1 / NN_1993_1.iso / spool / gnu / gcc / bug / 3131 < prev    next >
Encoding:
Text File  |  1993-01-08  |  3.2 KB  |  146 lines

  1. Newsgroups: gnu.gcc.bug
  2. Path: sparky!uunet!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!garwein.hai.siemens.co.AT!was%oberon
  3. From: was%oberon@garwein.hai.siemens.co.AT (Wolfgang Anton Sommerer)
  4. Subject: bugs in gcc-2.3.3
  5. Message-ID: <9301071004.AA18966@oberon.hai.siemens-austria>
  6. Sender: gnulists@ai.mit.edu
  7. Organization: GNUs Not Usenet
  8. Distribution: gnu
  9. Date: Thu, 7 Jan 1993 12:04:20 GMT
  10. Approved: bug-gcc@prep.ai.mit.edu
  11. Lines: 133
  12.  
  13. I have to report two bugs which occured while installing InterViews3.1
  14. and libg++-2.3. Hardware configuration is a SUN4/60 running SunOS4.1.1.
  15.  
  16.  
  17. 1.) Bug in handling of multpile inheritance
  18.  
  19. This bug actually occured when running the doc Apllication of InterViews3.1.
  20. It resulted in a segmentation violation with the following phenomenon.
  21.  
  22.     The line 
  23.     
  24.         x->request(y);
  25.         
  26.     resulted in a call to
  27.     
  28.         x->event(y);
  29.     
  30. I was able to isolate the problem and reproduce it in a samll example program.
  31.  
  32. **** file : a.h ******
  33.  
  34. class Z {
  35. public:
  36.     virtual void z();
  37. };
  38.  
  39. class A : public Z {
  40. public:
  41.     virtual void a1();
  42.     virtual void a2();
  43. };
  44.  
  45. class B : public Z {
  46. public:
  47.     virtual void b1();
  48.     virtual void b2();
  49.     virtual void b3();
  50. };
  51.  
  52. class C : public A, public B {
  53.     virtual void a1();
  54.     virtual void a2();
  55.     virtual void b1();
  56.     virtual void b2();
  57. };
  58.  
  59. **** file : a.C ******
  60.  
  61. #include "a.h"
  62. #include "iostream.h"
  63.  
  64. void Z::z()  { }
  65.  
  66. void A::a1() { cout << " A::a1() called" << endl; }
  67. void A::a2() { cout << " A::a2() called" << endl; }
  68.  
  69. void B::b1() { cout << " B::b1() called" << endl; }
  70. void B::b2() { cout << " B::b2() called" << endl; }
  71. void B::b3() { cout << " B::b3() called" << endl; }
  72.  
  73. void C::a1() { cout << " C::a1() called" << endl; }
  74. void C::a2() { cout << " C::a2() called" << endl; }
  75. void C::b1() { cout << " C::b1() called" << endl; }
  76. void C::b2() { cout << " C::b2() called" << endl; }
  77.  
  78.  
  79. **** file : main.C *****
  80.  
  81. main()
  82. {
  83. C c;
  84.  
  85. A& c1 = c;
  86. B& c2 = c;
  87.  
  88.     c1.a2();
  89.     c1.a1();
  90.     c2.b1();
  91.     c2.b2();
  92.     c2.b3();
  93. }
  94.  
  95.  
  96. **** result of running the program ****
  97.  
  98. C::b2() called            <--- should be C::a2()
  99. C::b1() called            <--- should be C::a1()
  100. C::b1() called
  101. C::b2() called
  102. B::b3() called
  103.  
  104. The reason for this behaviour is a wrong vtable generated in file 
  105. main.C (or a.C if #pragma interface and #pragma implementation is used).
  106.  
  107. _vt$C entries do not point to class A methods. They rather point to the
  108. class B mehtods which reside at the same slot index. Changing the vtable 
  109. in the assembler code manually did at least result in the expected behaviour 
  110. of the program.
  111.  
  112. This workaround also fixed the problem at hand in the InterViews applicaiton.
  113. But there the bug occurs many times, so manually changing the assembeler code
  114. is impossible.
  115.  
  116.  
  117.  
  118. 2.) Bug when compiling libg++-2.3
  119.  
  120. Compiling iostream.cc will generate a symbol named __vt$istream$3ios.
  121. Compiling another file which includes iostream.h will generate 
  122. a symbol __vt$7istream$3ios. So when linking the two files you'll get an
  123. undefined symbol (__vt$7istream$3ios).
  124.  
  125. I solved the problem by putting a forward declaration of class istream into
  126. streambuf.h.
  127.  
  128. I changed line 39 from :
  129.     class ostream; class streambuf; class backupbuf;
  130. to:
  131.     class istream; class ostream; class streambuf; class backupbuf;
  132.  
  133. This works fine !
  134.  
  135.  
  136.  
  137. If there exists a patch for the first problem please let me know.
  138.  
  139. Regards,
  140.  
  141. Wolfgang Sommerer
  142.  
  143.  
  144.  
  145.  
  146.