kext11.C   [plain text]


/* APPLE LOCAL file kext ptmf casts --bowdidge */
/* In gcc-4.0 and beyond, kexts are not permitted to cast
   pointer-to-member- functions into pointer-to-functions.  
   These casts should be flagged as a hard error if
   -fapple-kext is an option for the compile.  -fpermissive shouldn't permit
   this, either.  This checks for OSMemberFunctionCast in the error message
   because the error advises developers to use that function to replace
   these casts.

   Radar 4025923, gcc-4.0 should ban kexts from doing ptmf to ptf
   conversions without OSMemberFunctionCast
*/
/* { dg-do compile { target powerpc*-apple-darwin* } } */
/* { dg-options "-S -static -fapple-kext -fpermissive -fno-exceptions" } */

typedef int(*INT_FUNC_INT)(int);
class Superclass {
public:
  /* In 3.3, this would get the foo function for the class of "this".  In 4.0, it
     gets the foo function for Superclass. */
  virtual int init(void) {_myFunc = (INT_FUNC_INT)&Superclass::foo;}; /* { dg-error "OSMemberFunctionCast" } */
  INT_FUNC_INT _myFunc;
  virtual int foo(int i) { return 2;};
};

class Subclass : public Superclass  { 
public:
  virtual int foo(int) { return 1;};
};

main(int argc, char **argv) {
  Superclass sup;
  Subclass sub;
  sup.init();
  sup.foo(1);
  sub.init();
  sub.foo(1);
}