Home | History | Annotate | Download | only in jni
      1 // { dg-do run  }
      2 // PRMS Id: 6000
      3 // Bug: g++ gets confused trying to build up a reference to a cast.
      4 
      5 class String {
      6 protected:
      7   char *cp;
      8 public:
      9   String(char *incp);
     10   String(const String &constStringRef);
     11   virtual void virtualFn1(void) const {;}
     12 };
     13 
     14 String::String(char *incp)
     15 {
     16   cp = incp;
     17 }
     18 
     19 String::String(const String &constStringRef)
     20 {
     21 // Right here, do an 'info args', and look at the virtual function table
     22 // pointer: typically junk! Calling the function through that table could
     23 // do anything, since we're really leaping off into the void. This example
     24 // goes down with 'SIGBUS', but I've seen 'SIGSEGV' too, and 'SIGILL' is
     25 // possible.
     26 
     27   cp = constStringRef.cp;
     28   constStringRef.virtualFn1();
     29 }
     30 
     31 void foofun(String string)
     32 {
     33   ;
     34 }
     35 
     36 class Class1 {
     37 public:
     38   Class1(const String & constStringRef);
     39 };
     40 
     41 Class1 :: Class1 (const String & constStringRef)
     42 {
     43 // If instead of calling the function 'foofun()' here, we just assign
     44 // 'constStringRef' to a local variable, then the vptr is typically == 0!
     45 
     46   foofun(String(constStringRef));
     47 }
     48 
     49 int main(void)
     50 {
     51   Class1 *class1 = new Class1((char*) "Hi!");
     52 }
     53