| // Check if ObjC classes with non-POD C++ ivars are specially marked in the metadata. |
| |
| // { dg-do run { target *-*-darwin* } } |
| // { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } |
| // { dg-skip-if "Headers incompatible with 10.4 APIs" { *-*-darwin1[1-9]* *-*-darwin2* } { "-fnext-runtime" } { "" } } |
| // { dg-additional-options "-fobjc-call-cxx-cdtors -mmacosx-version-min=10.4 -framework Foundation" } |
| // This test has no equivalent or meaning for m64/ABI V2 |
| // { dg-xfail-run-if "No Test Avail" { *-*-darwin* && lp64 } { "-fnext-runtime" } { "" } } |
| |
| #include <stdlib.h> |
| #include "../objc-obj-c++-shared/F-NSObject.h" |
| #include <objc/objc-runtime.h> |
| |
| //extern "C" { int printf(const char *,...); } |
| #define CHECK_IF(expr) if(!(expr)) abort() |
| |
| #ifndef CLS_HAS_CXX_STRUCTORS |
| #define CLS_HAS_CXX_STRUCTORS 0x2000L |
| #endif |
| |
| struct cxx_struct { |
| int a, b; |
| cxx_struct (void) { a = b = 55; } |
| }; |
| |
| @interface Foo: NSObject { |
| int c; |
| cxx_struct s; |
| } |
| @end |
| |
| @interface Bar: Foo { |
| float f; |
| } |
| @end |
| |
| @implementation Foo |
| @end |
| |
| @implementation Bar |
| @end |
| |
| int main (void) |
| { |
| #ifndef __LP64__ |
| Class cls; |
| |
| cls = objc_getClass("Foo"); |
| // printf((const char *)"Foo info %lx\n",cls->info); |
| CHECK_IF((cls->info & CLS_HAS_CXX_STRUCTORS) != 0); |
| cls = objc_getClass("Bar"); |
| // printf((const char *)"Bar info %lx\n",cls->info); |
| CHECK_IF((cls->info & CLS_HAS_CXX_STRUCTORS) == 0); |
| |
| #else |
| /* No test needed or available. */ |
| abort (); |
| #endif |
| return 0; |
| } |