Commit 812398e4 by Iain Sandoe Committed by Janis Johnson

re PR objc/35165 (Massive failures of objc on i686-apple-darwin9)

2010-03-25  Iain Sandoe  <iain.sandoe@sandoe-acoustics.co.uk>

	PR objc/35165
	PR testsuite/43512
	* objc-obj-c++-shared: New directory.
	* objc-obj-c++-shared/Object1-implementation.h: New file.
	* objc-obj-c++-shared/Object1.h: New file.
	* objc-obj-c++-shared/Protocol1.h: New file.
	* objc-obj-c++-shared/next-abi.h: New file.
	* objc-obj-c++-shared/next-mapping.h: New file.
	* objc/execute/next_mapping.h: Delete.
	* objc.dg/special/special.exp: For all targets run the tests with
	-fgnu-runtime, for darwin targets also run the tests with 
	-fnext-runtime.
	* objc.dg/dg.exp: Ditto.
	* obj-c++.dg/dg.exp: Ditto.
	* objc/execute/forward-1.m: Use shared wrapper headers (Object1.h,
	Protocol1.h) and next-mapping.h as required.  Amend testcase to
	include use of updated NeXT interface.
	* objc/execute/formal_protocol-5.m: Ditto.
	* objc/execute/protocol-isEqual-2.m: Ditto.
	* objc/execute/protocol-isEqual-4.m: Ditto.	
	* objc/execute/class-11.m: Use shared wrapper headers (Object1.h,
	Protocol1.h) and next-mapping.h as required.
	* objc/execute/object_is_class.m: Ditto.
	* objc/execute/enumeration-1.m: Ditto.
	* objc/execute/class-13.m: Ditto.
	* objc/execute/formal_protocol-2.m: Ditto.
	* objc/execute/formal_protocol-4.m: Ditto.
	* objc/execute/class-1.m: Ditto.
	* objc/execute/bycopy-1.m: Ditto.
	* objc/execute/formal_protocol-6.m: Ditto.
	* objc/execute/bycopy-3.m: Ditto.
	* objc/execute/class-3.m: Ditto.
	* objc/execute/bf-11.m: Ditto.
	* objc/execute/class-5.m: Ditto.
	* objc/execute/bf-13.m: Ditto.
	* objc/execute/class-7.m: Ditto.
	* objc/execute/bf-15.m: Ditto.
	* objc/execute/class-9.m: Ditto.
	* objc/execute/bf-17.m: Ditto.
	* objc/execute/bf-19.m: Ditto.
	* objc/execute/IMP.m: Ditto.
	* objc/execute/exceptions/catchall-1.m: Ditto.
	* objc/execute/exceptions/trivial.m: Ditto.
	* objc/execute/exceptions/finally-1.m: Ditto.
	* objc/execute/exceptions/local-variables-1.m: Ditto.
	* objc/execute/exceptions/foward-1.m: Ditto.
	* objc/execute/bf-2.m: Ditto.
	* objc/execute/string1.m: Ditto.
	* objc/execute/bf-4.m: Ditto.
	* objc/execute/informal_protocol.m: Ditto.
	* objc/execute/string3.m: Ditto.
	* objc/execute/bf-6.m: Ditto.
	* objc/execute/bf-8.m: Ditto.
	* objc/execute/class-tests-1.h: Ditto.
	* objc/execute/protocol-isEqual-1.m: Ditto.
	* objc/execute/protocol-isEqual-3.m: Ditto.
	* objc/execute/_cmd.m: Ditto.
	* objc/execute/function-message-1.m: Ditto.
	* objc/execute/bf-20.m: Ditto.
	* objc/execute/bf-common.h: Ditto.
	* objc/execute/np-2.m: Ditto.
	* objc/execute/class-10.m: Ditto.
	* objc/execute/class-12.m: Ditto.
	* objc/execute/enumeration-2.m: Ditto.
	* objc/execute/class-14.m: Ditto.
	* objc/execute/encode-1.m: Ditto.
	* objc/execute/formal_protocol-1.m: Ditto.
	* objc/execute/formal_protocol-3.m: Ditto.
	* objc/execute/accessing_ivars.m: Ditto.
	* objc/execute/bycopy-2.m: Ditto.
	* objc/execute/class-2.m: Ditto.
	* objc/execute/bf-10.m: Ditto.
	* objc/execute/formal_protocol-7.m: Ditto.
	* objc/execute/root_methods.m: Ditto.
	* objc/execute/class-4.m: Ditto.
	* objc/execute/bf-12.m: Ditto.
	* objc/execute/class-6.m: Ditto.
	* objc/execute/bf-14.m: Ditto.
	* objc/execute/nested-func-1.m: Ditto.
	* objc/execute/class-8.m: Ditto.
	* objc/execute/private.m: Ditto.
	* objc/execute/bf-16.m: Ditto.
	* objc/execute/bf-18.m: Ditto.
	* objc/execute/load-3.m: Ditto.
	* objc/execute/compatibility_alias.m: Ditto.
	* objc/execute/bf-1.m: Ditto.
	* objc/execute/no_clash.m: Ditto.
	* objc/execute/bf-3.m: Ditto.
	* objc/execute/string2.m: Ditto.
	* objc/execute/bf-5.m: Ditto.
	* objc/execute/string4.m: Ditto.
	* objc/execute/bf-7.m: Ditto.
	* objc/execute/object_is_meta_class.m: Ditto.
	* objc/execute/bf-9.m: Ditto.
	* objc/execute/bf-21.m: Ditto.
	* objc/execute/cascading-1.m: Ditto.
	* objc/execute/trivial.m: Ditto.
	* objc/execute/np-1.m: Ditto.
	* objc/compile/trivial.m: Ditto.
	* objc/execute/class_self-2.m: Include <stdlib.h>.
	* objc/execute/forward-1.x: Do not XFAIL for 32bit powerpc-darwin.
	* objc.dg/desig-init-1.m: Use shared wrapper headers (Object1.h,
	Protocol1.h) and next-mapping.h as required. XFAIL run if NeXT 
	and 64bit. Use new NeXT interface as required.
	* objc.dg/special/unclaimed-category-1.m: Ditto.
	* objc.dg/special/unclaimed-category-1.h: Ditto.
	* objc.dg/special/unclaimed-category-1a.m: Ditto.
	* objc.dg/func-ptr-1.m: Ditto.
	* objc.dg/stret-1.m: Ditto.	
	* objc.dg/encode-2.m: Ditto.
	* objc.dg/category-1.m: Ditto.
	* objc.dg/encode-3.m: Ditto.
	* objc.dg/call-super-3.m: Ditto.
	* objc.dg/method-3.m: Ditto.
	* objc.dg/func-ptr-2.m: Ditto.
	* objc.dg/lookup-1.m: Ditto.
	* objc.dg/encode-4.m: Ditto.
	* objc.dg/fix-and-continue-1.m: Ditto.
	* objc.dg/proto-lossage-3.m: Ditto.
	* objc.dg/method-13.m: Ditto.
	* objc.dg/proto-qual-1.m: Ditto.
	* objc.dg/zero-link-3.m: Ditto.
	* objc.dg/bitfield-1.m: Ditto.
	* objc.dg/va-meth-1.m: Ditto.
	* objc.dg/super-class-3.m: Ditto.
	* objc.dg/call-super-1.m: Ditto.
	* objc.dg/type-size-2.m: Ditto.
	* objc.dg/method-10.m: Ditto.
	* objc.dg/defs.m: Ditto.	
	* objc.dg/const-str-3.m: Ditto.
	* objc.dg/try-catch-6.m: Use shared wrapper headers (Object1.h,
	Protocol1.h) and next-mapping.h as required. Use new NeXT 
	interface as required.
	* objc.dg/super-class-4.m: Ditto.
	* objc.dg/comp-types-8.m: Ditto.
	* objc.dg/call-super-2.m: Ditto.
	* objc.dg/objc-fast-4.m: Ditto.
	* objc.dg/method-6.m: Ditto.
	* objc.dg/const-str-3.m: Ditto.
	* objc.dg/const-str-7.m: Ditto.
	* objc.dg/method-15.m: Ditto.
	* objc.dg/method-19.m: Ditto.
	* objc.dg/sync-1.m: Ditto.
	* objc.dg/layout-1.m: Ditto.
	* objc.dg/bitfield-3.m: Ditto.
	* objc.dg/try-catch-3.m: Ditto.
	* objc.dg/try-catch-7.m: Ditto.
	* objc.dg/comp-types-10.m: Ditto.
	* objc.dg/selector-2.: Ditto.
	* objc.dg/method-7.m: Ditto.
	* objc.dg/typedef-alias-1.m: Ditto.
	* objc.dg/proto-lossage-2.m: Ditto.
	* objc.dg/comp-types-11.m: Ditto.
	* objc.dg/sizeof-1.m: Ditto.
	* objc.dg/method-17.m: Ditto.
	* objc.dg/bitfield-5.m: Ditto.
	* objc.dg/try-catch-1.m: Ditto.
	* objc.dg/encode-5.m: Ditto.
	* objc.dg/fix-and-continue-2.m: Ditto.
	* objc.dg/method-9.m: Ditto.
	* objc.dg/isa-field-1.m: Ditto.
	* objc.dg/local-decl-2.m: Ditto.	
	* objc.dg/objc-gc-4.m: Ditto.
	* objc.dg/type-stream-1.m: Skip for NeXT runtime.
	* objc.dg/gnu-runtime-3.m: Ditto.
	* objc.dg/encode-7.m: Ditto.
	* objc.dg/encode-8.m: Ditto.
	* objc.dg/selector-3.m: Ditto.
	* objc.dg/gnu-runtime-1.m: Ditto.
	* objc.dg/const-str-12.m: Ditto.
	* objc.dg/gnu-runtime-2.m: Ditto.	
	* objc.dg/no-extra-load.m: Skip for gnu-runtime.
	* objc.dg/selector-1.m: Ditto.
	* objc.dg/stubify-2.m: Ditto.
	* objc.dg/zero-link-1.m: Ditto.
	* objc.dg/stret-2.m: Ditto.
	* objc.dg/zero-link-2.m: Ditto.
	* objc.dg/next-runtime-1.m: Ditto.
	* objc.dg/symtab-1.m: Ditto.
	* objc.dg/stubify-1.m: Ditto.
	* objc.dg/bitfield-2.m: Ditto.	
	* objc.dg/try-catch-10.m: Apply to both runtimes.
	* objc.dg/const-str-1.m: Ditto.
	* objc.dg/image-info.m: Ditto.
	* objc.dg/encode-9.m: Ditto.	
	* objc.dg/pragma-1.m: Apply test to all targets.
	* objc.dg/const-str-4.m: Ditto.
	* objc.dg/const-str-8.m: Ditto.
	* objc.dg/super-class-2.m: Ditto.
	* objc.dg/try-catch-5.m: Ditto.
	* objc.dg/const-str-10.m: Use shared wrapper headers (Object1.h,
	Protocol1.h) and next-mapping.h as required. Use new NeXT 
	interface as required.  Skip for gnu-runtime.  Test for .quad
	at m64.
	* objc.dg/const-str-11.m: Ditto.
	* objc.dg/const-str-9.m: Ditto.	
	* objc.dg/method-4.m: Skip for 64Bit NeXT.
	* objc.dg/encode-1.m: Remove redundant -lobjc.
	* objc.dg/try-catch-9.m: Tidy space.
	* obj-c++.dg/method-19.mm: Use shared wrapper headers (Object1.h,
	Protocol1.h) and next-mapping.h as required. XFAIL run if NeXT 
	and 64bit. Use new NeXT interface as required.
	* obj-c++.dg/template-4.mm: Ditto.
	* obj-c++.dg/defs.mm: Ditto.
	* obj-c++.dg/basic.mm: Ditto.
	* obj-c++.dg/encode-4.mm: Ditto.
	* obj-c++.dg/method-17.mm: Ditto.
	* obj-c++.dg/proto-lossage-3.mm: Ditto.
	* obj-c++.dg/cxx-class-1.mm: Ditto.
	* obj-c++.dg/method-10.mm: Ditto.
	* obj-c++.dg/va-meth-1.mm: Ditto.
	* obj-c++.dg/encode-5.mm: Ditto.
	* obj-c++.dg/lookup-2.mm: Ditto.
	* obj-c++.dg/template-3.mm: Ditto.
	* obj-c++.dg/proto-qual-1.mm: Ditto.
	* obj-c++.dg/qual-types-1.m: Ditto.
	* obj-c++.dg/cxx-scope-1.mm: Ditto.
	* obj-c++.dg/template-1.mm: Ditto.
	* obj-c++.dg/encode-6.mm: Ditto.
	* obj-c++.dg/bitfield-2.mm:  Use shared wrapper headers (Object1.h,
	Protocol1.h) and next-mapping.h as required. Use new NeXT 
	interface as required.
	* obj-c++.dg/except-1.mm: Ditto.
	* obj-c++.dg/const-str-7.mm: Ditto.
	* obj-c++.dg/ivar-list-semi.mm: Ditto.
	* obj-c++.dg/cxx-scope-2.mm: Ditto.
	* obj-c++.dg/selector-2.mm: Ditto.
	* obj-c++.dg/isa-field-1.mm: Ditto.
	* obj-c++.dg/try-catch-1.mm: Ditto.
	* obj-c++.dg/local-decl-1.mm: Ditto.
	* obj-c++.dg/try-catch-9.mm: Ditto.
	* obj-c++.dg/no-extra-load.mm: Ditto.
	* obj-c++.dg/selector-5.mm: Ditto.
	* obj-c++.dg/method-12.mm: Ditto.
	* obj-c++.dg/try-catch-11.mm: Ditto.
	* obj-c++.dg/comp-types-11.mm: Ditto.
	* obj-c++.dg/bitfield-3.mm: Ditto.
	* obj-c++.dg/method-6.mm: Ditto.
	* obj-c++.dg/super-class-2.mm: Ditto.
	* obj-c++.dg/method-21.mm: Ditto.
	* obj-c++.dg/const-str-8.mm: Ditto.
	* obj-c++.dg/try-catch-7.mm: Ditto.
	* obj-c++.dg/method-15.mm: Ditto.
	* obj-c++.dg/layout-1.mm: Ditto.
	* obj-c++.dg/cxx-ivars-1.mm: Ditto.
	* obj-c++.dg/const-str-3.mm: Ditto.
	* obj-c++.dg/try-catch-2.mm: Ditto.
	* obj-c++.dg/objc-gc-3.mm: Ditto.
	* obj-c++.dg/fix-and-continue-2.mm: Ditto.
	* obj-c++.dg/bitfield-1.mm: Ditto.
	* obj-c++.dg/selector-6.mm: Ditto.
	* obj-c++.dg/method-13.mm: Ditto.
	* obj-c++.dg/comp-types-12.mm: Ditto.
	* obj-c++.dg/bitfield-4.mm: Ditto.
	* obj-c++.dg/try-catch-8.mm: Ditto.
	* obj-c++.dg/method-2.mm: Ditto.
	* obj-c++.dg/cxx-ivars-2.mm: Ditto.
	* obj-c++.dg/typedef-alias-1.mm: Ditto.
	* obj-c++.dg/const-str-4.mm: Ditto.
	* obj-c++.dg/proto-lossage-2.mm: Ditto.
	* obj-c++.dg/try-catch-3.mm: Ditto.
	* obj-c++.dg/comp-types-9.mm: Ditto.
	* obj-c++.dg/gnu-runtime-2.mm: Skip if NeXT runtime.
	* obj-c++.dg/gnu-runtime-3.mm: Ditto.
	* obj-c++.dg/gnu-runtime-1.mm: Ditto.
	* objc.dg/zero-link-2.m: Skip if gnu runtime. Use shared wrapper 
	headers (Object1.h, Protocol1.h) and next-mapping.h as required. 
	Use new NeXT interface as required.
	* obj-c++.dg/const-str-10.mm: Ditto.
	* obj-c++.dg/const-str-11.mm: Ditto.
	* obj-c++.dg/const-str-9.mm: Ditto.
	* obj-c++.dg/method-11.mm: Ditto.
	* obj-c++.dg/cxx-ivars-3.mm: Skip if gnu runtime. Use shared wrapper 
	headers (Object1.h, Protocol1.h) and next-mapping.h as required. 
	Use new NeXT interface as required. XFAIL run if NeXT and 64bit.
	* obj-c++.dg/encode-8.mm: Remove redundant -lobjc.
	* obj-c++.dg/const-str-1.mm: Run for NeXT as well as gnu.

From-SVN: r157731
parent 58f5f6b4
// A basic sanity check for Objective-C++. // A basic sanity check for Objective-C++.
// { dg-do run } // { dg-do run }
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <iostream> #include <iostream>
@interface Greeter : Object @interface Greeter : Object
...@@ -19,3 +19,4 @@ main () ...@@ -19,3 +19,4 @@ main ()
Greeter *obj = [Greeter new]; Greeter *obj = [Greeter new];
[obj greet: "Hello from Objective-C\n"]; [obj greet: "Hello from Objective-C\n"];
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
/* Leave blank lines here to keep warnings on the same lines. */ /* Leave blank lines here to keep warnings on the same lines. */
#include "../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h> #include <objc/objc.h>
#include <objc/Object.h>
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */ /* { dg-do run } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort(); #define CHECK_IF(expr) if(!(expr)) abort();
...@@ -76,3 +76,4 @@ int main(void) { ...@@ -76,3 +76,4 @@ int main(void) {
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Check if bitfield ivars are correctly @encode'd when /* Check if bitfield ivars are correctly @encode'd when
the NeXT runtime is used. */ the NeXT runtime is used. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-fnext-runtime -fsigned-char" } */ /* { dg-options "-fsigned-char" } */
/* { dg-do run { target *-*-darwin* } } */ /* { dg-do run { target *-*-darwin* } } */
typedef struct objc_object { struct objc_class *class_pointer; } *id; typedef struct objc_object { struct objc_class *class_pointer; } *id;
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
layout of bitfields. */ layout of bitfields. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-options "-lobjc -Wpadded" } */ /* { dg-options "-Wpadded" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
......
/* Yet another mysterious gimplifier crasher. */ /* Yet another mysterious gimplifier crasher. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-xfail-if "PR23716" { *-*-* } { "*" } { "" } } */ /* { dg-xfail-if "PR23716" { ! *-*-darwin* } { "*" } { "" } } */
/* { dg-prune-output ".*internal compiler error.*" } */ /* { dg-prune-output ".*internal compiler error.*" } */
/* { dg-options "-O3" } */ /* { dg-options "-O3" } */
......
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@protocol Foo @protocol Foo
- (id)meth1; - (id)meth1;
......
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Derived: Object @interface Derived: Object
@end @end
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* Another gimplifier ICE... */ /* Another gimplifier ICE... */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface MyView: Object { @interface MyView: Object {
int _frame; int _frame;
......
/* Test errors for constant strings. */ /* Test errors for constant strings. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fgnu-runtime" } */
#ifdef __cplusplus #ifdef __cplusplus
extern void baz(...); extern void baz(...);
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
constant string classes get derived. */ constant string classes get derived. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */ /* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime" } */
/* { dg-do compile { target *-*-darwin* } } */ /* { dg-do compile { target *-*-darwin* } } */
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface NSString: Object @interface NSString: Object
@end @end
...@@ -20,7 +20,11 @@ ...@@ -20,7 +20,11 @@
@interface NSConstantString : NSSimpleCString @interface NSConstantString : NSSimpleCString
@end @end
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
Class _NSConstantStringClassReference;
#else
extern struct objc_class _NSConstantStringClassReference; extern struct objc_class _NSConstantStringClassReference;
#endif
const NSConstantString *appKey = @"MyApp"; const NSConstantString *appKey = @"MyApp";
......
...@@ -2,10 +2,11 @@ ...@@ -2,10 +2,11 @@
constant string classes get derived. */ constant string classes get derived. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */ /* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime -fconstant-string-class=XStr" } */
/* { dg-do compile { target *-*-darwin* } } */ /* { dg-do compile { target *-*-darwin* } } */
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
/* { dg-options "-fconstant-string-class=XStr" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface XString: Object { @interface XString: Object {
@protected @protected
...@@ -19,7 +20,11 @@ ...@@ -19,7 +20,11 @@
} }
@end @end
#ifndef NEXT_OBJC_USE_NEW_INTERFACE
extern struct objc_class _XStrClassReference; extern struct objc_class _XStrClassReference;
#else
extern Class _XStrClassReference;
#endif
const XStr *appKey = @"MyApp"; const XStr *appKey = @"MyApp";
......
...@@ -2,14 +2,18 @@ ...@@ -2,14 +2,18 @@
runtime. */ runtime. */
/* Developed by Markus Hitter <mah@jump-ing.de>. */ /* Developed by Markus Hitter <mah@jump-ing.de>. */
/* { dg-options "-fnext-runtime -fconstant-string-class=Foo -lobjc" } */ /* { dg-options "-fconstant-string-class=Foo" } */
/* { dg-do run { target *-*-darwin* } } */ /* { dg-do run { target *-*-darwin* } } */
#import "../objc-obj-c++-shared/Object1.h"
#import "../objc-obj-c++-shared/next-mapping.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <memory.h> #include <memory.h>
#include <objc/objc.h> #include <objc/objc.h>
#include <objc/Object.h> #ifndef __NEXT_RUNTIME__
#include <objc/objc-api.h>
#endif
@interface Foo: Object { @interface Foo: Object {
char *cString; char *cString;
...@@ -18,7 +22,11 @@ ...@@ -18,7 +22,11 @@
- (char *)customString; - (char *)customString;
@end @end
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
struct fudge_objc_class _FooClassReference;
#else
struct objc_class _FooClassReference; struct objc_class _FooClassReference;
#endif
@implementation Foo : Object @implementation Foo : Object
- (char *)customString { - (char *)customString {
...@@ -38,7 +46,7 @@ int main () { ...@@ -38,7 +46,7 @@ int main () {
constant string object. Can't be moved to +initialize since _that_ constant string object. Can't be moved to +initialize since _that_
is already a message. */ is already a message. */
memcpy(&_FooClassReference, objc_getClass("Foo"), sizeof(_FooClassReference)); memcpy(&_FooClassReference, objc_get_class("Foo"), sizeof(_FooClassReference));
if (strcmp ([string customString], "bla")) { if (strcmp ([string customString], "bla")) {
abort (); abort ();
} }
...@@ -46,3 +54,4 @@ int main () { ...@@ -46,3 +54,4 @@ int main () {
printf([@"This is a working constant string object\n" customString]); printf([@"This is a working constant string object\n" customString]);
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Ensure that the preprocessor handles ObjC string constants gracefully. */ /* Ensure that the preprocessor handles ObjC string constants gracefully. */
/* Author: Ziemowit Laski <zlaski@apple.com> */ /* Author: Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime -fconstant-string-class=MyString -lobjc" } */ /* { dg-options "-fconstant-string-class=MyString" } */
/* { dg-do run { target *-*-darwin* } } */ /* { dg-do run { target *-*-darwin* } } */
#include <stdlib.h> #include <stdlib.h>
......
...@@ -2,17 +2,15 @@ ...@@ -2,17 +2,15 @@
scopes. */ scopes. */
/* Developed by Andrew Pinski <pinskia@physics.uc.edu> */ /* Developed by Andrew Pinski <pinskia@physics.uc.edu> */
/* { dg-options "-fconstant-string-class=Foo" } */
/* { dg-do run } */
/* { dg-options "-fnext-runtime -fconstant-string-class=Foo -lobjc" } */ #include "../objc-obj-c++-shared/Object1.h"
/* { dg-do run { target *-*-darwin* } } */ #include "../objc-obj-c++-shared/next-mapping.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <memory.h> #include <memory.h>
#include <objc/objc.h> #include <objc/objc.h>
#include <objc/Object.h>
@interface Foo: Object { @interface Foo: Object {
char *cString; char *cString;
...@@ -21,8 +19,11 @@ ...@@ -21,8 +19,11 @@
- (char *)customString; - (char *)customString;
@end @end
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
struct fudge_objc_class _FooClassReference;
#else
struct objc_class _FooClassReference; struct objc_class _FooClassReference;
#endif
@implementation Foo : Object @implementation Foo : Object
- (char *)customString { - (char *)customString {
...@@ -36,11 +37,10 @@ int main () { ...@@ -36,11 +37,10 @@ int main () {
{ {
Foo *string2 = @"bla"; Foo *string2 = @"bla";
if(string != string2) if(string != string2)
abort(); abort();
printf("Strings are being uniqued properly\n"); printf("Strings are being uniqued properly\n");
} }
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Test for assigning compile-time constant-string objects to static variables. */ /* Test for assigning compile-time constant-string objects to static variables. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */ /* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime -fconstant-string-class=Foo -lobjc" } */ /* { dg-options "-fconstant-string-class=Foo" } */
/* { dg-do run { target *-*-darwin* } } */ /* { dg-do run { target *-*-darwin* } } */
#include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#include <objc/Object.h>
@interface Foo: Object { @interface Foo: Object {
char *cString; char *cString;
...@@ -14,7 +13,11 @@ ...@@ -14,7 +13,11 @@
} }
@end @end
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
Class _FooClassReference;
#else
struct objc_class _FooClassReference; struct objc_class _FooClassReference;
#endif
@implementation Foo : Object @implementation Foo : Object
- (char *)customString { - (char *)customString {
...@@ -37,3 +40,5 @@ int main () { ...@@ -37,3 +40,5 @@ int main () {
PrefsSynchronize(); PrefsSynchronize();
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Test if ObjC constant strings get placed in the correct section. */ /* Test if ObjC constant strings get placed in the correct section. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */ /* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime" } */ /* { dg-do compile } */
/* { dg-do compile { target *-*-darwin* } } */ /* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
/* { dg-skip-if "" { *-*-darwin* } { "-m64" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface NSConstantString: Object { @interface NSConstantString: Object {
char *cString; char *cString;
...@@ -13,7 +12,11 @@ ...@@ -13,7 +12,11 @@
} }
@end @end
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
Class _NSConstantStringClassReference;
#else
extern struct objc_class _NSConstantStringClassReference; extern struct objc_class _NSConstantStringClassReference;
#endif
const NSConstantString *appKey = @"MyApp"; const NSConstantString *appKey = @"MyApp";
......
/* Test that Objective-C++ is able to chew through a simple C++ class hierarchy. /* Test that Objective-C++ is able to chew through a simple C++ class hierarchy.
This was broken in earlier ObjC++ incarnations. */ This was broken in earlier ObjC++ incarnations. */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
struct foo struct foo
{ {
foo(void *a) {}; foo(void *a) {};
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
// { dg-do run } // { dg-do run }
// { dg-options "-fno-objc-call-cxx-cdtors" } // { dg-options "-fno-objc-call-cxx-cdtors" }
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
...@@ -40,3 +40,4 @@ int main (void) ...@@ -40,3 +40,4 @@ int main (void)
[obj manipulate_ivars]; [obj manipulate_ivars];
[obj free]; [obj free];
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
// { dg-do run { xfail { "*-*-*" } } } PR27247/PR23681 // { dg-do run { xfail { "*-*-*" } } } PR27247/PR23681
// { dg-options "-fobjc-call-cxx-cdtors" } // { dg-options "-fobjc-call-cxx-cdtors" }
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
...@@ -74,3 +74,4 @@ int main (void) ...@@ -74,3 +74,4 @@ int main (void)
[foo free]; [foo free];
CHECK_IF(!ctor1_called && !ctor2_called && dtor1_called); CHECK_IF(!ctor1_called && !ctor2_called && dtor1_called);
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
// Check if ObjC classes with non-POD C++ ivars are specially marked in the metadata. // Check if ObjC classes with non-POD C++ ivars are specially marked in the metadata.
// { dg-do run { target *-*-darwin* } } // { dg-do run { target *-*-darwin* } }
// { dg-options "-fobjc-call-cxx-cdtors -fnext-runtime" } // { dg-options "-fobjc-call-cxx-cdtors" }
// { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } }
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include "../objc-obj-c++-shared/Object1.h"
#include "../objc-obj-c++-shared/next-mapping.h"
#include <objc/objc-runtime.h>
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
...@@ -37,10 +40,16 @@ int main (void) ...@@ -37,10 +40,16 @@ int main (void)
{ {
Class cls; Class cls;
cls = objc_getClass("Foo"); cls = objc_get_class("Foo");
#if NEXT_OBJC_USE_NEW_INTERFACE
CHECK_IF(class_isMetaClass(cls) & CLS_HAS_CXX_STRUCTORS);
cls = objc_getClass("Bar");
CHECK_IF(!(class_isMetaClass(cls) & CLS_HAS_CXX_STRUCTORS));
#else
CHECK_IF(cls->info & CLS_HAS_CXX_STRUCTORS); CHECK_IF(cls->info & CLS_HAS_CXX_STRUCTORS);
cls = objc_getClass("Bar"); cls = objc_getClass("Bar");
CHECK_IF(!(cls->info & CLS_HAS_CXX_STRUCTORS)); CHECK_IF(!(cls->info & CLS_HAS_CXX_STRUCTORS));
#endif
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
/* Author: Ziemowit Laski <zlaski@apple.com> */ /* Author: Ziemowit Laski <zlaski@apple.com> */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
@class Derived; @class Derived;
...@@ -51,3 +51,4 @@ int main(void) { ...@@ -51,3 +51,4 @@ int main(void) {
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <iostream> #include <iostream>
#include <string> #include <string>
......
/* Check @defs() in Objective-C++ */ /* Check @defs() in Objective-C++ */
/* Contributed by Devang Patel <dpatel@apple.com> */ /* Contributed by Devang Patel <dpatel@apple.com> */
/* { dg-options "" } */
/* { dg-options "-lobjc" } */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#include <objc/objc.h> #include <objc/objc.h>
#include <objc/Object.h>
extern "C" void abort(void); extern "C" void abort(void);
...@@ -41,3 +40,4 @@ int main() ...@@ -41,3 +40,4 @@ int main()
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -31,7 +31,12 @@ dg-init ...@@ -31,7 +31,12 @@ dg-init
set tests [lsort [find $srcdir/$subdir *.mm]] set tests [lsort [find $srcdir/$subdir *.mm]]
# Main loop. # Main loop.
dg-runtest $tests "" $DEFAULT_OBJCXXFLAGS dg-runtest $tests "-fgnu-runtime" $DEFAULT_OBJCXXFLAGS
# darwin targets can also run code with the NeXT runtime.
if [istarget "*-*-darwin*" ] {
dg-runtest $tests "-fnext-runtime" $DEFAULT_OBJCXXFLAGS
}
# All done. # All done.
dg-finish dg-finish
...@@ -15,20 +15,16 @@ ...@@ -15,20 +15,16 @@
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include "../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h> #include "../objc-obj-c++-shared/next-mapping.h"
#include <objc/Object.h>
#ifdef __NEXT_RUNTIME__ #ifdef __NEXT_RUNTIME__
#define METHOD Method #define METHOD Method
#define OBJC_GETCLASS objc_getClass
#define CLASS_GETINSTANCEMETHOD class_getInstanceMethod
#else #else
#include <objc/objc-api.h> #include <objc/objc-api.h>
#define METHOD Method_t #define METHOD Method_t
#define OBJC_GETCLASS objc_get_class #define method_get_types(M) (M)->method_types
#define CLASS_GETINSTANCEMETHOD class_get_instance_method
#endif #endif
#include <stdio.h> #include <stdio.h>
...@@ -78,27 +74,28 @@ unsigned offs1, offs2, offs3, offs4, offs5, offs6, offs7; ...@@ -78,27 +74,28 @@ unsigned offs1, offs2, offs3, offs4, offs5, offs6, offs7;
int main(void) { int main(void) {
Foo *foo = [[Foo alloc] init]; Foo *foo = [[Foo alloc] init];
Class fooClass = OBJC_GETCLASS("Foo"); Class fooClass = objc_get_class("Foo");
METHOD meth; METHOD meth;
const char *string; const char *string;
meth = CLASS_GETINSTANCEMETHOD(fooClass, @selector(setRect:withInt:)); meth = class_get_instance_method(fooClass, @selector(setRect:withInt:));
offs2 = 9999; offs2 = 9999;
sscanf(meth->method_types, "@%u@%u:%u{_XXRect={?=ff}{?=ff}}%ui%u", &offs1, &offs2, &offs3, sscanf(method_get_types(meth), "@%u@%u:%u{_XXRect={?=ff}{?=ff}}%ui%u", &offs1, &offs2, &offs3,
&offs4, &offs5); &offs4, &offs5);
CHECK_IF(!offs2); CHECK_IF(!offs2);
[foo setRect:my_rect withInt:123]; [foo setRect:my_rect withInt:123];
meth = CLASS_GETINSTANCEMETHOD(fooClass, @selector(char:float:double:long:)); meth = class_get_instance_method(fooClass, @selector(char:float:double:long:));
offs2 = 9999; offs2 = 9999;
if (sizeof (long) == 8) if (sizeof (long) == 8)
string = "v%u@%u:%uc%uf%ud%uq%u"; string = "v%u@%u:%uc%uf%ud%uq%u";
else else
string = "v%u@%u:%uc%uf%ud%ul%u"; string = "v%u@%u:%uc%uf%ud%ul%u";
sscanf(meth->method_types, string, &offs1, &offs2, &offs3, sscanf(method_get_types(meth), string, &offs1, &offs2, &offs3,
&offs4, &offs5, &offs6, &offs7); &offs4, &offs5, &offs6, &offs7);
CHECK_IF(!offs2); CHECK_IF(!offs2);
[foo char:'c' float:2.3 double:3.5 long:2345L]; [foo char:'c' float:2.3 double:3.5 long:2345L];
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Method encoding tests for stand-alone @protocol declarations. */ /* Method encoding tests for stand-alone @protocol declarations. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Protocol.h> #include "../objc-obj-c++-shared/Object1.h"
#include "../objc-obj-c++-shared/next-mapping.h"
#include "../objc-obj-c++-shared/Protocol1.h"
#ifdef __cplusplus #ifdef __cplusplus
#define ProtoBool bool #define ProtoBool bool
#else #else
#define ProtoBool _Bool #define ProtoBool _Bool
#endif #endif
#ifndef __NEXT_RUNTIME__ #ifdef __NEXT_RUNTIME__
#define METHOD Method
#else
#include <objc/objc-api.h> #include <objc/objc-api.h>
#define METHOD Method_t
#define method_get_types(M) (M)->method_types
#endif #endif
#include <stdio.h> #include <stdio.h>
...@@ -37,6 +43,7 @@ typedef struct _XXRect { XXPoint origin; XXSize size; struct _XXRect *next; } XX ...@@ -37,6 +43,7 @@ typedef struct _XXRect { XXPoint origin; XXSize size; struct _XXRect *next; } XX
Protocol *proto = @protocol(Proto); Protocol *proto = @protocol(Proto);
struct objc_method_description *meth; struct objc_method_description *meth;
unsigned totsize, offs0, offs1, offs2, offs3, offs4, offs5, offs6, offs7; unsigned totsize, offs0, offs1, offs2, offs3, offs4, offs5, offs6, offs7;
static void scan_initial(const char *pattern) { static void scan_initial(const char *pattern) {
...@@ -71,3 +78,4 @@ int main(void) { ...@@ -71,3 +78,4 @@ int main(void) {
CHECK_IF(totsize == offs2 + sizeof(ObjCBool **)); CHECK_IF(totsize == offs2 + sizeof(ObjCBool **));
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Encoding tests for ObjC class layouts. */ /* Encoding tests for ObjC class layouts. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-lobjc" } */ /* { dg-options "" } */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#ifdef __NEXT_RUNTIME__ #include "../objc-obj-c++-shared/next-mapping.h"
#include <objc/objc-class.h> #ifndef __NEXT_RUNTIME__
#define OBJC_GETCLASS objc_getClass
#else
#include <objc/objc-api.h> #include <objc/objc-api.h>
#define OBJC_GETCLASS objc_get_class
#endif #endif
#include <stdlib.h> #include <stdlib.h>
...@@ -50,25 +47,43 @@ struct Nested { ...@@ -50,25 +47,43 @@ struct Nested {
@implementation Int2 @implementation Int2
@end @end
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
Ivar *ivar;
#else
struct objc_ivar *ivar; struct objc_ivar *ivar;
#endif
static void check_ivar(const char *name, const char *type) { static void check_ivar(const char *name, const char *type) {
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
CHECK_IF(!strcmp(ivar_getName(*ivar), name));
CHECK_IF(!strcmp(ivar_getTypeEncoding(*ivar), type));
#else
CHECK_IF(!strcmp(ivar->ivar_name, name)); CHECK_IF(!strcmp(ivar->ivar_name, name));
CHECK_IF(!strcmp(ivar->ivar_type, type)); CHECK_IF(!strcmp(ivar->ivar_type, type));
#endif
ivar++; ivar++;
} }
int main(void) { int main(void) {
ivar = ((Class)OBJC_GETCLASS("Int1"))->ivars->ivar_list; #ifdef NEXT_OBJC_USE_NEW_INTERFACE
ivar = class_copyIvarList ((Class)objc_get_class("Int1"), NULL);
#else
ivar = ((Class)objc_get_class("Int1"))->ivars->ivar_list;
#endif
check_ivar("a", "c"); check_ivar("a", "c");
check_ivar("b", "c"); check_ivar("b", "c");
check_ivar("int2", "@\"Int2\""); check_ivar("int2", "@\"Int2\"");
check_ivar("nested", check_ivar("nested",
"{Nested=\"a\"f\"b\"f\"next\"@\"Int1\"\"innermost\"{Innermost=\"a\"C\"b\"C\"encl\"^{Nested}}}"); "{Nested=\"a\"f\"b\"f\"next\"@\"Int1\"\"innermost\"{Innermost=\"a\"C\"b\"C\"encl\"^{Nested}}}");
ivar = ((Class)OBJC_GETCLASS("Int2"))->ivars->ivar_list; #ifdef NEXT_OBJC_USE_NEW_INTERFACE
ivar = class_copyIvarList ((Class)objc_get_class("Int2"), NULL);
#else
ivar = ((Class)objc_get_class("Int2"))->ivars->ivar_list;
#endif
check_ivar("innermost", "^{Innermost=CC^{Nested}}"); check_ivar("innermost", "^{Innermost=CC^{Nested}}");
check_ivar("base", "@\"Int1\""); check_ivar("base", "@\"Int1\"");
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -9,20 +9,18 @@ ...@@ -9,20 +9,18 @@
/* Contributed by Alexander Malmberg <alexander@malmberg.org> */ /* Contributed by Alexander Malmberg <alexander@malmberg.org> */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include "../objc-obj-c++-shared/next-mapping.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
#ifdef __NEXT_RUNTIME__ #ifdef __NEXT_RUNTIME__
#define METHOD Method #define METHOD Method
#define OBJC_GETCLASS objc_getClass
#define CLASS_GETINSTANCEMETHOD class_getInstanceMethod
#else #else
#include <objc/objc-api.h> #include <objc/objc-api.h>
#define METHOD Method_t #define METHOD Method_t
#define OBJC_GETCLASS objc_get_class #define method_get_types(M) (M)->method_types
#define CLASS_GETINSTANCEMETHOD class_get_instance_method
#endif #endif
@interface Test : Object @interface Test : Object
...@@ -49,7 +47,7 @@ int offs1, offs2, offs3, offs4, offs5, offs6; ...@@ -49,7 +47,7 @@ int offs1, offs2, offs3, offs4, offs5, offs6;
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
Class testClass = OBJC_GETCLASS("Test"); Class testClass = objc_get_class("Test");
METHOD meth; METHOD meth;
cc[0] = [Test new]; cc[0] = [Test new];
...@@ -60,16 +58,16 @@ int main(int argc, char **argv) ...@@ -60,16 +58,16 @@ int main(int argc, char **argv)
[*c test2: bb with: bb + 5]; [*c test2: bb with: bb + 5];
CHECK_IF (bb[3] == 5); CHECK_IF (bb[3] == 5);
meth = CLASS_GETINSTANCEMETHOD(testClass, @selector(test2:with:)); meth = class_get_instance_method(testClass, @selector(test2:with:));
offs1 = offs2 = offs3 = offs4 = offs5 = offs6 = -1; offs1 = offs2 = offs3 = offs4 = offs5 = offs6 = -1;
sscanf(meth->method_types, "v%d@%d:%d[%di]%d^i%d", &offs1, &offs2, &offs3, sscanf(method_get_types(meth), "v%d@%d:%d[%di]%d^i%d", &offs1, &offs2, &offs3,
&offs4, &offs5, &offs6); &offs4, &offs5, &offs6);
CHECK_IF (!offs2 && offs4 == 5 && offs3 > 0); CHECK_IF (!offs2 && offs4 == 5 && offs3 > 0);
CHECK_IF (offs5 == 2 * offs3 && offs6 == 3 * offs3 && offs1 == 4 * offs3); CHECK_IF (offs5 == 2 * offs3 && offs6 == 3 * offs3 && offs1 == 4 * offs3);
meth = CLASS_GETINSTANCEMETHOD(testClass, @selector(test3:)); meth = class_get_instance_method(testClass, @selector(test3:));
offs1 = offs2 = offs3 = offs4 = offs5 = offs6 = -1; offs1 = offs2 = offs3 = offs4 = offs5 = offs6 = -1;
sscanf(meth->method_types, "v%d@%d:%d[%d[%d{Test=#f}]]%d", &offs1, &offs2, &offs3, sscanf(method_get_types(meth), "v%d@%d:%d[%d[%d{Test=#f}]]%d", &offs1, &offs2, &offs3,
&offs4, &offs5, &offs6); &offs4, &offs5, &offs6);
CHECK_IF (!offs2 && offs4 == 3 && offs5 == 4 && offs3 > 0); CHECK_IF (!offs2 && offs4 == 3 && offs5 == 4 && offs3 > 0);
CHECK_IF (offs6 == 2 * offs3 && offs1 == 3 * offs3); CHECK_IF (offs6 == 2 * offs3 && offs1 == 3 * offs3);
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
should be encoded as '*'). */ should be encoded as '*'). */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run { xfail { "*-*-*" } } } PR27249 */ /* { dg-do run { xfail { "*-*-*" } } } PR27249 */
/* { dg-options "-lobjc" } */
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
......
...@@ -8,14 +8,7 @@ ...@@ -8,14 +8,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "../objc-obj-c++-shared/Object1.h"
@interface Object {
Class isa;
}
+ alloc;
- - init;
@end
// ObjectiveC class header // ObjectiveC class header
@interface ObjCclass : Object { @interface ObjCclass : Object {
...@@ -69,3 +62,5 @@ void CPPclass::function1() ...@@ -69,3 +62,5 @@ void CPPclass::function1()
/* Shouldn't be here because we threw. */ /* Shouldn't be here because we threw. */
abort (); abort ();
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
/* { dg-do assemble { target *-*-darwin* } } */ /* { dg-do assemble { target *-*-darwin* } } */
/* { dg-options "-mfix-and-continue" } */ /* { dg-options "-mfix-and-continue" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Foo: Object @interface Foo: Object
+ (Object *)indexableFileTypes; + (Object *)indexableFileTypes;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
the system runtime used). */ the system runtime used). */
/* Author: Ziemowit Laski <zlaski@apple.com> */ /* Author: Ziemowit Laski <zlaski@apple.com> */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fgnu-runtime" } */ /* { dg-skip-if "" { *-*-* } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include <objc/Object.h>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
regardless of runtime used on target system. */ regardless of runtime used on target system. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fgnu-runtime" } */ /* { dg-skip-if "" { *-*-* } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include <objc/Object.h>
#include <string.h> #include <string.h>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
the system runtime used). */ the system runtime used). */
/* Author: Ziemowit Laski <zlaski@apple.com> */ /* Author: Ziemowit Laski <zlaski@apple.com> */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-options "-fgnu-runtime" } */ /* { dg-skip-if "" { *-*-* } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include <objc/Object.h>
#include <stdlib.h> #include <stdlib.h>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-xfail-if "PR23613" { "*-*-*" } { "*" } { "" } } */ /* { dg-xfail-if "PR23613" { "*-*-*" } { "*" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Object (Test) @interface Object (Test)
- (Class) test1: (id)object; - (Class) test1: (id)object;
...@@ -42,3 +42,4 @@ Class test3(id object) { ...@@ -42,3 +42,4 @@ Class test3(id object) {
Class cls = object->isa; Class cls = object->isa;
return cls; return cls;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Allow for an optional semicolon following the ivar block. */ /* Allow for an optional semicolon following the ivar block. */
/* Contributed by: Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by: Ziemowit Laski <zlaski@apple.com>. */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Tink : Object { @interface Tink : Object {
@private @private
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-Wpadded -Wpacked -Wabi" } */ /* { dg-options "-Wpadded -Wpacked -Wabi" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Derived1: Object @interface Derived1: Object
{ } { }
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Sprite: Object { @interface Sprite: Object {
int sprite, spree; int sprite, spree;
......
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-if "PR23614" { "*-*-*" } { "*" } { "" } } */ /* { dg-xfail-if "PR23614" { "*-*-*" } { "*" } { "" } } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
class MyWidget { class MyWidget {
...@@ -55,3 +55,5 @@ int main(void) { ...@@ -55,3 +55,5 @@ int main(void) {
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Test for sending messages to aliased classes (and instances thereof). */ /* Test for sending messages to aliased classes (and instances thereof). */
/* Author: Ziemowit Laski <zlaski@apple.com>. */ /* Author: Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-lobjc" } */ /* { dg-options "" } */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
...@@ -43,3 +43,4 @@ int main(void) { ...@@ -43,3 +43,4 @@ int main(void) {
CHECK_IF([(Int1Alias *)int2typedef instanceMeth] == 1697); CHECK_IF([(Int1Alias *)int2typedef instanceMeth] == 1697);
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Check if class references (generated for the NeXT runtime) are appropriately /* Check if class references (generated for the NeXT runtime) are appropriately
folded. This test is safe to run on all targets. */ folded. This test is safe to run on all targets. */
/* Author: Ziemowit Laski <zlaski@apple.com>. */ /* Author: Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-fnext-runtime" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
typedef Object ObjectTypedef1; typedef Object ObjectTypedef1;
typedef ObjectTypedef1 ObjectTypedef2; typedef ObjectTypedef1 ObjectTypedef2;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
/* { dg-options "-Wstrict-selector-match" } */ /* { dg-options "-Wstrict-selector-match" } */
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Protocol.h> #include "../objc-obj-c++-shared/Protocol1.h"
@interface Base @interface Base
- (unsigned)port; - (unsigned)port;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* { dg-options "-Wstrict-selector-match" } */ /* { dg-options "-Wstrict-selector-match" } */
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Class1 @interface Class1
- (void)setWindow:(Object *)wdw; - (void)setWindow:(Object *)wdw;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
/* { dg-options "-Wstrict-selector-match" } */ /* { dg-options "-Wstrict-selector-match" } */
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@protocol MyObject @protocol MyObject
- (id)initWithData:(Object *)data; - (id)initWithData:(Object *)data;
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
message sends (so that proper C/C++ argument conversions may message sends (so that proper C/C++ argument conversions may
take place). */ take place). */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
...@@ -30,3 +30,4 @@ int main(void) ...@@ -30,3 +30,4 @@ int main(void)
[foo brokenType: (int)d floatingPoint: d]; [foo brokenType: (int)d floatingPoint: d];
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -3,15 +3,12 @@ ...@@ -3,15 +3,12 @@
root classes must be considered. */ root classes must be considered. */
/* Author: Ziemowit Laski <zlaski@apple.com>. */ /* Author: Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include "../objc-obj-c++-shared/next-mapping.h"
#include <objc/objc.h> #include <objc/objc.h>
#ifdef __NEXT_RUNTIME__ #ifndef __NEXT_RUNTIME__
#include <objc/objc-runtime.h>
#define OBJC_GETCLASS objc_getClass
#else
#include <objc/objc-api.h> #include <objc/objc-api.h>
#define OBJC_GETCLASS objc_get_class
#endif #endif
#include <stdlib.h> #include <stdlib.h>
...@@ -59,7 +56,7 @@ ...@@ -59,7 +56,7 @@
int main(void) int main(void)
{ {
Class obj = OBJC_GETCLASS("Derived"); Class obj = objc_get_class("Derived");
/* None of the following should elicit compiler-time warnings. */ /* None of the following should elicit compiler-time warnings. */
...@@ -78,3 +75,4 @@ int main(void) ...@@ -78,3 +75,4 @@ int main(void)
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@class NSString; @class NSString;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-Wreturn-type -Wextra" } */ /* { dg-options "-Wreturn-type -Wextra" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Foo: Object @interface Foo: Object
- (id) meth1; - (id) meth1;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@class NotKnown; @class NotKnown;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// { dg-do compile } // { dg-do compile }
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <iostream> #include <iostream>
@interface Greeter : Object @interface Greeter : Object
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
/* { dg-do compile { target *-*-darwin* } } */ /* { dg-do compile { target *-*-darwin* } } */
/* { dg-options "-fobjc-gc" } */ /* { dg-options "-fobjc-gc" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@class MyWindow; @class MyWindow;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
provide a suitable method. */ provide a suitable method. */
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@protocol Zot @protocol Zot
-(void) zot; -(void) zot;
......
...@@ -2,9 +2,10 @@ ...@@ -2,9 +2,10 @@
a protocol with no instance/class methods respectively. a protocol with no instance/class methods respectively.
Problem report and original fix by richard@brainstorm.co.uk. */ Problem report and original fix by richard@brainstorm.co.uk. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include "../objc-obj-c++-shared/Protocol1.h"
#include <objc/objc.h> #include <objc/objc.h>
#include <objc/Object.h> #include <objc/Object.h>
#include <objc/Protocol.h>
@protocol NoInstanceMethods @protocol NoInstanceMethods
+ + testMethod; + + testMethod;
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
/* Author: Ziemowit Laski <zlaski@apple.com> */ /* Author: Ziemowit Laski <zlaski@apple.com> */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Protocol.h> #include "../objc-obj-c++-shared/Protocol1.h"
#ifndef __NEXT_RUNTIME__ #ifndef __NEXT_RUNTIME__
#include <objc/objc-api.h> #include <objc/objc-api.h>
#endif #endif
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
/* Author: Ziemowit Laski <zlaski@apple.com>. */ /* Author: Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
...@@ -66,3 +66,4 @@ int main (void) { ...@@ -66,3 +66,4 @@ int main (void) {
CHECK_IF(FooHolder::counter == 0); CHECK_IF(FooHolder::counter == 0);
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* { dg-options "-Wselector" } */ /* { dg-options "-Wselector" } */
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Foo @interface Foo
@end @end
......
/* { dg-options "" } */ /* { dg-options "" } */
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
int main() int main()
{ {
......
/* { dg-options "" } */ /* { dg-options "" } */
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
int main() int main()
{ {
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@class MyWpModule; @class MyWpModule;
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
/* Author: Ziemowit Laski <zlaski@apple.com>. */ /* Author: Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
...@@ -47,3 +47,4 @@ int main (void) { ...@@ -47,3 +47,4 @@ int main (void) {
CHECK_IF(count == 0); CHECK_IF(count == 0);
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
...@@ -78,3 +78,4 @@ int main(void) { ...@@ -78,3 +78,4 @@ int main(void) {
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Author: Ziemowit Laski <zlaski@apple.com>. */ /* Author: Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-skip-if "" { *-*-darwin* } { "-m64" } { "" } } */ /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include "../objc-obj-c++-shared/Object1.h"
#include <objc/Object.h> #include "../objc-obj-c++-shared/next-mapping.h"
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#ifdef __NEXT_RUNTIME__ #ifndef __NEXT_RUNTIME__
/* The following ain't pretty, but does allow us to have just one copy
of next_mapping.h. */
#include "../objc/execute/next_mapping.h"
#else
#include <objc/NXConstStr.h> #include <objc/NXConstStr.h>
#endif #endif
...@@ -80,3 +76,4 @@ int main(void) { ...@@ -80,3 +76,4 @@ int main(void) {
CHECK_IF(abc(a1, a2) * t.k == 35); CHECK_IF(abc(a1, a2) * t.k == 35);
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
/* { dg-options "-fobjc-exceptions" } */ /* { dg-options "-fobjc-exceptions" } */
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdio.h> #include <stdio.h>
#include <setjmp.h> #include <setjmp.h>
......
/* Ensure that @try/@catch blocks do not mess with types of /* Ensure that @try/@catch blocks do not mess with types of
local objects (other than their volatile bits). */ local objects (other than their volatile bits). */
/* { dg-options "-fobjc-exceptions -fnext-runtime" } */ /* { dg-options "-fobjc-exceptions" } */
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@protocol Proto1 @protocol Proto1
- (int)meth1; - (int)meth1;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
/* { dg-xfail-if "PR23616" { "*-*-*" } { "*" } { "" } } */ /* { dg-xfail-if "PR23616" { "*-*-*" } { "*" } { "" } } */
/* { dg-options "-fobjc-exceptions" } */ /* { dg-options "-fobjc-exceptions" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -77,3 +77,4 @@ int main (void) { ...@@ -77,3 +77,4 @@ int main (void) {
test((Object *)-1); test((Object *)-1);
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fobjc-exceptions" } */ /* { dg-options "-fobjc-exceptions" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
const char *foo(void) const char *foo(void)
{ {
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fobjc-exceptions" } */ /* { dg-options "-fobjc-exceptions" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
int main (int argc, const char * argv[]) { int main (int argc, const char * argv[]) {
Object * pool = [Object new]; Object * pool = [Object new];
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fobjc-exceptions" } */ /* { dg-options "-fobjc-exceptions" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Derived: Object @interface Derived: Object
- (id) meth; - (id) meth;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
/* { dg-prune-output ".*internal compiler error.*" } */ /* { dg-prune-output ".*internal compiler error.*" } */
/* { dg-options "-fobjc-exceptions -O2" } */ /* { dg-options "-fobjc-exceptions -O2" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
...@@ -65,3 +65,4 @@ int main(void) { ...@@ -65,3 +65,4 @@ int main(void) {
foo(15, &gf1); foo(15, &gf1);
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Typedefs of ObjC types should work without any bogus warnings. */ /* Typedefs of ObjC types should work without any bogus warnings. */
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
typedef Object MyObject; typedef Object MyObject;
......
/* Based on objc/execute/va_method.m, by Nicola Pero */ /* Based on objc/execute/va_method.m, by Nicola Pero */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -72,3 +72,4 @@ int main (void) ...@@ -72,3 +72,4 @@ int main (void)
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* This provides a minimal implementation of the Object root class.
* It is split from the definition so that it can be placed
* at the end of source files that require it. This reduces
* clutter in .s and other internmediate code while debugging.
*/
#ifndef _OBJC_OBJECT1_IMPLEMENTATION_H_
#define _OBJC_OBJECT1_IMPLEMENTATION_H_
#ifdef DO_NEXT_M64_OBJECT_IMPLEMENTATION
@implementation Object
+ + initialize {
return self;
}
- init {
return self;
}
+ class {
return object_getClass(self);
}
+ new {
return [[self alloc] init];
}
+ free {
return nil;
}
- free {
return object_dispose(self);
}
+ alloc {
return class_createInstance(self, 0);
}
- class {
return isa;
}
- superclass {
return class_getSuperclass([self class]);
}
- (const char *) name {
return class_getName([self class]);
}
-(BOOL)conformsTo:(Protocol *)protocol {
Class cls;
for (cls = [self class]; cls; cls = [cls superclass]) {
if (class_conformsToProtocol(cls, protocol)) return YES;
}
return NO;
}
@end
#endif /* NEEDS_OBJECT_IMPLEMENTATION */
#endif /* _OBJC_OBJECT1_IMPLEMENTATION_H_ */
\ No newline at end of file
/* Object definition taken from <objc/Object.h> */#ifndef _OBJC_OBJECT1_H_ #define _OBJC_OBJECT1_H_ #undef DO_NEXT_M64_OBJECT_IMPLEMENTATION #ifndef __NEXT_RUNTIME__ # include <objc/Object.h> #else # include "next-abi.h" # ifndef NEXT_OBJC_USE_NEW_INTERFACE/* We are on a next system, or version, that is happy to compile V0 ABI */ # include <objc/Object.h> # else # if (NEXT_OBJC_ABI_VERSION==0)/* We are on a system that has V0 ABI implementation in libobjc.dylib. * However, we need to use the new accessors and pretend that the * structures are opaque to avoid 'deprecated' warnings */ # include <objc/Object.h> # else/* We are on a system that includes a V2 ABI Object in libobjc.dylib. */ # ifdef __OBJC2__/* ... and we have a V2 ABI compiler .. */ # include <objc/Object.h> # else/* We can't access the Object definition in libobjc.dylib because * we can't yet generate OBJC2 code. * * So we'll roll our own Object - purely for the sake of compile * checks - the code is unlikely to run... */ # ifndef _OBJC_OBJECT_H_ # define _OBJC_OBJECT_H_ #include <stdarg.h> #import <objc/objc-runtime.h> /* This is a cut-down Object with only the methods currently required by the testsuite declared. For those executables that require an implementation (to link) this can be provided in a given test by placing: #include "path/to/objc-c++shared/Object1-implementation.h" at the end of the source for the test. */ @interface Object { Class isa; /* A pointer to the instance's class structure */ } + initialize; - init; + new; + free; - free; + alloc; //- copy; //+ allocFromZone:(void *)zone; //- copyFromZone:(void *)zone; //- (void *)zone; + class; //+ superclass; //+ (const char *) name; - class; - superclass; - (const char *) name; //- self; //- (unsigned int) hash; //-(BOOL) isEqual:anObject; /* Testing inheritance relationships */ //- (BOOL) isKindOf: aClassObject; //- (BOOL) isMemberOf: aClassObject; //- (BOOL) isKindOfClassNamed: (const char *)aClassName; //- (BOOL) isMemberOfClassNamed: (const char *)aClassName; /* Testing class functionality */ //+ (BOOL) instancesRespondTo:(SEL)aSelector; //- (BOOL) respondsTo:(SEL)aSelector; /* Testing protocol conformance */ - (BOOL) conformsTo: (Protocol *)aProtocolObject; //+ (BOOL) conformsTo: (Protocol *)aProtocolObject; /* Obtaining method descriptors from protocols */ //- (struct objc_method_description *) descriptionForMethod:(SEL)aSel; //+ (struct objc_method_description *) descriptionForInstanceMethod:(SEL)aSel; /* Obtaining method handles */ //- (IMP) methodFor:(SEL)aSelector; //+ (IMP) instanceMethodFor:(SEL)aSelector; /* Sending messages determined at run time */ //- perform:(SEL)aSelector; //- perform:(SEL)aSelector with:anObject; //- perform:(SEL)aSelector with:object1 with:object2; /* Posing */ //+ poseAs: aClassObject; /* Enforcing intentions */ //- subclassResponsibility:(SEL)aSelector; //- notImplemented:(SEL)aSelector; /* Error handling */ //- doesNotRecognize:(SEL)aSelector; //- error:(const char *)aString, ...; /* Debugging */ //- (void) printForDebugger:(void *)stream; /* Archiving */ //- awake; //- write:(void *)stream; //- read:(void *)stream; //+ (int) version; //+ setVersion: (int) aVersion; /* Forwarding */ //- forward: (SEL)sel : (marg_list)args; //- performv: (SEL)sel : (marg_list)args; @end #define DO_NEXT_M64_OBJECT_IMPLEMENTATION # endif /* _OBJC_OBJECT_H_ */ # endif /* __OBJC2__ */ # endif /* ABI=0 */ # endif /* NEXT_OBJC_USE_NEW_INTERFACE */ # endif /* __NEXT_RUNTIME__ */ #endif /* _OBJC_OBJECT1_H_ */
\ No newline at end of file
/*
* Temporary work-around to avoid the need for method attributes in
* the NeXT Runtime Protocol header.
*/
#ifndef _OBJC_PROTOCOL1_H_
#define _OBJC_PROTOCOL1_H_
# ifndef __NEXT_RUNTIME__
# include <objc/Protocol.h>
# else
# include "next-abi.h"
# ifndef NEXT_OBJC_USE_NEW_INTERFACE
/* We are on a NeXT version without method __attributes__ */
# import <objc/Protocol.h>
# else
/* We make our own interface without the deprecation messages
* This is essentially <objc/Protocol.h> without the OBJC2
* flags.
*
*/
# ifndef _OBJC_PROTOCOL_H_
# define _OBJC_PROTOCOL_H_
# import "Object1.h"
@interface Protocol : Object
{
@private
char *protocol_name ;
struct objc_protocol_list *protocol_list ;
struct objc_method_description_list *instance_methods ;
struct objc_method_description_list *class_methods ;
}
/* Obtaining attributes intrinsic to the protocol */
#if (NEXT_OBJC_ABI_VERSION==0)
- (const char *)name ; /* Not avail in v2, deprecated in prior */
/* Testing protocol conformance */
- (BOOL) conformsTo: (Protocol *)aProtocolObject ; /* Not avail in v2 */
#endif
/* Looking up information specific to a protocol */
/* Deprecated, but available */
- (struct objc_method_description *) descriptionForInstanceMethod:(SEL)aSel ;
- (struct objc_method_description *) descriptionForClassMethod:(SEL)aSel ;
@end
# endif /* __NEXT_RUNTIME__ */
# endif /* _OBJC_PROTOCOL_H_ */
# endif /* NEXT_OBJC_ABI_VERSION */
#endif /* _OBJC_PROTOCOL1_H_ */
#ifndef _OBJC_NEXT_ABI_H_
#define _OBJC_NEXT_ABI_H_
/* Produce a define that allows us to figure out what facilities are
available for this gcc and OS combination.
*/
/* By default we do nothing - therefore ifdef NEXT_OBJC_USE_NEW_INTERFACE
* is reliable for detecting
* (a) versions of the compiler that are transitional to the new next ABI
* (b) versions of the target that require the new ABI.
*
* This applies for versions of OSX >= 10.5 (darwin9).
*
* A compiler capable of producing ObjC V2 ABI should define __OBJC2__
*/
#undef NEXT_OBJC_ABI_VERSION
#undef NEXT_OBJC_USE_NEW_INTERFACE
#ifdef __NEXT_RUNTIME__
# if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 || __OBJC2__)
/* We have to use an updated interface for 32bit NeXT to avoid
* 'deprecated' warnings.
* For 64bit NeXT the ABI is different (and the interfaces 'deprecated'
* for 32bit have been removed).
*/
# define NEXT_OBJC_USE_NEW_INTERFACE 1
# if __OBJC2__ || __LP64__
/* We have OBJC v2 ABI compiler,
(or, at least, the available NeXT runtime requires one) */
# define NEXT_OBJC_ABI_VERSION 2
# else
/* We leave it open to define ABI 1 if and when we implement those
* extensions.
*/
# define NEXT_OBJC_ABI_VERSION 0
# endif
# endif
#endif
#endif /* _OBJC_NEXT_ABI_H_ */
...@@ -2,9 +2,10 @@ ...@@ -2,9 +2,10 @@
being "promoted" to ints). */ being "promoted" to ints). */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include "../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h> #include <objc/objc.h>
#include <objc/Object.h>
extern void abort(void); extern void abort(void);
...@@ -78,3 +79,5 @@ int main(void) { ...@@ -78,3 +79,5 @@ int main(void) {
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Check if bitfield ivars are correctly @encode'd when /* Check if bitfield ivars are correctly @encode'd when
the NeXT runtime is used. */ the NeXT runtime is used. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-fnext-runtime -fsigned-char" } */ /* { dg-options "-fsigned-char" } */
/* { dg-do run { target *-*-darwin* } } */ /* { dg-do run { target *-*-darwin* } } */
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
typedef struct objc_object { struct objc_class *class_pointer; } *id; typedef struct objc_object { struct objc_class *class_pointer; } *id;
......
/* Check if the @defs() construct preserves the correct /* Check if the @defs() construct preserves the correct
layout of bitfields. */ layout of bitfields. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-lobjc -Wpadded" } */ /* { dg-options "-Wpadded" } */
/* { dg-do run } */ /* { dg-do run } */
#include <objc/objc.h> #include "../objc-obj-c++-shared/Object1.h"
#include <objc/Object.h>
extern void abort(void); extern void abort(void);
extern int strcmp(const char *str1, const char *str2); extern int strcmp(const char *str1, const char *str2);
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
/* { dg-options "-Wpadded" } */ /* { dg-options "-Wpadded" } */
/* { dg-do run } */ /* { dg-do run } */
#include "../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h> #include <objc/objc.h>
#include <objc/Object.h>
#include <stdlib.h> #include <stdlib.h>
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
......
/* Check if objc_super stack variables are created correctly (and /* Check if objc_super stack variables are created correctly (and
not clobbered by other values). */ not clobbered by other values). */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-std=c99 -lobjc" } */ /* { dg-options "-std=c99" } */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/objc.h> #include "../objc-obj-c++-shared/Object1.h"
#include <objc/Object.h>
extern void abort(void); extern void abort(void);
...@@ -74,3 +74,5 @@ int main(void) { ...@@ -74,3 +74,5 @@ int main(void) {
[v free]; [v free];
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Check if casting 'self' or 'super' affects message lookup in the /* Check if casting 'self' or 'super' affects message lookup in the correct way. */
correct way. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do compile } */ /* { dg-do compile } */
#include "../objc-obj-c++-shared/Object1.h"
#include "../objc-obj-c++-shared/next-mapping.h"
#include <stddef.h> #include <stddef.h>
#include <objc/objc.h>
#include <objc/Object.h>
#ifdef __NEXT_RUNTIME__
#define OBJC_GETCLASS objc_getClass
#else
#define OBJC_GETCLASS objc_get_class
#endif
@protocol Func @protocol Func
+ (int) class_func0; + (int) class_func0;
...@@ -70,11 +63,11 @@ ...@@ -70,11 +63,11 @@
} }
+ (int) class_func6 + (int) class_func6
{ {
return (size_t)[OBJC_GETCLASS("Object") class_func1]; /* { dg-warning ".Object. may not respond to .\\+class_func1." } */ return (size_t)[objc_get_class("Object") class_func1]; /* { dg-warning ".Object. may not respond to .\\+class_func1." } */
} }
+ (int) class_func7 + (int) class_func7
{ {
return [OBJC_GETCLASS("Derived") class_func1]; return [objc_get_class("Derived") class_func1];
} }
- (int) instance_func1 - (int) instance_func1
{ {
...@@ -100,11 +93,11 @@ ...@@ -100,11 +93,11 @@
} }
- (int) instance_func6 - (int) instance_func6
{ {
return (size_t)[OBJC_GETCLASS("Object") class_func1]; /* { dg-warning ".Object. may not respond to .\\+class_func1." } */ return (size_t)[objc_get_class("Object") class_func1]; /* { dg-warning ".Object. may not respond to .\\+class_func1." } */
} }
- (int) instance_func7 - (int) instance_func7
{ {
return [OBJC_GETCLASS("Derived") class_func1]; return [objc_get_class("Derived") class_func1];
} }
@end @end
...@@ -129,7 +122,7 @@ ...@@ -129,7 +122,7 @@
int i = (size_t)[self instance_func0]; /* { dg-warning ".Derived. may not respond to .\\-instance_func0." } */ int i = (size_t)[self instance_func0]; /* { dg-warning ".Derived. may not respond to .\\-instance_func0." } */
i += [(Derived <Func> *)self categ_instance_func2]; i += [(Derived <Func> *)self categ_instance_func2];
i += (size_t)[(Object <Func> *)self categ_instance_func2]; /* { dg-warning ".Object. may not respond to .\\-categ_instance_func2." } */ i += (size_t)[(Object <Func> *)self categ_instance_func2]; /* { dg-warning ".Object. may not respond to .\\-categ_instance_func2." } */
/* { dg-warning ".\\-categ_instance_func2. not found in protocol" "" { target *-*-* } 131 } */ /* { dg-warning ".\\-categ_instance_func2. not found in protocol" "" { target *-*-* } 124 } */
i += (size_t)[(id <Func>)self categ_instance_func2]; /* { dg-warning ".\\-categ_instance_func2. not found in protocol" } */ i += (size_t)[(id <Func>)self categ_instance_func2]; /* { dg-warning ".\\-categ_instance_func2. not found in protocol" } */
i += [(id)self categ_instance_func2]; i += [(id)self categ_instance_func2];
return i + (size_t)[super instance_func0]; /* { dg-warning ".Object. may not respond to .\\-instance_func0." } */ return i + (size_t)[super instance_func0]; /* { dg-warning ".Object. may not respond to .\\-instance_func0." } */
......
/* Check if sending messages to super does not interfere with sending messages /* Check if sending messages to super does not interfere with sending messages
to classes. */ to classes. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "" } */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-options "-lobjc" } */ /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
extern void abort(void); extern void abort(void);
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
...@@ -52,3 +53,5 @@ int main(void) { ...@@ -52,3 +53,5 @@ int main(void) {
CHECK_IF([derived instance_func1] == 234 + 345); CHECK_IF([derived instance_func1] == 234 + 345);
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Test class methods inside categories. */ /* Test class methods inside categories. */
/* Author: Ziemowit Laski <zlaski@apple.com>. */ /* Author: Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-lobjc" } */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "need OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
extern int strcmp(const char *s1, const char *s2);
extern void abort(void);
#ifdef __NEXT_RUNTIME__ #ifdef __NEXT_RUNTIME__
#define SUPERCLASS superclass #define SUPERCLASS superclass
...@@ -11,8 +14,6 @@ ...@@ -11,8 +14,6 @@
#define SUPERCLASS superClass #define SUPERCLASS superClass
#endif #endif
extern int strcmp(const char *s1, const char *s2);
extern void abort(void);
#define CHECK_IF(expr) if(!(expr)) abort() #define CHECK_IF(expr) if(!(expr)) abort()
@interface MyObject: Object @interface MyObject: Object
...@@ -36,8 +37,15 @@ int main (int argc, const char * argv[]) ...@@ -36,8 +37,15 @@ int main (int argc, const char * argv[])
Class w1 = [MyObject whatever1]; Class w1 = [MyObject whatever1];
Class w2 = [MyObject whatever2]; Class w2 = [MyObject whatever2];
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
CHECK_IF(!strcmp( object_getClassName( w1 ), "Object"));
CHECK_IF(!strcmp( object_getClassName( w2 ), "Object"));
#else
CHECK_IF(!strcmp(w1->name, "Object")); CHECK_IF(!strcmp(w1->name, "Object"));
CHECK_IF(!strcmp(w2->name, "Object")); CHECK_IF(!strcmp(w2->name, "Object"));
#endif
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@protocol Foo @protocol Foo
- (id)meth1; - (id)meth1;
......
/* { dg-do compile } */ /* { dg-do compile } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface Derived: Object @interface Derived: Object
@end @end
......
/* { dg-do compile } */ /* { dg-do compile } */
/* Another gimplifier ICE... */ /* Another gimplifier ICE... */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface MyView: Object { @interface MyView: Object {
int _frame; int _frame;
......
/* Test errors for constant strings. */ /* Test errors for constant strings. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fgnu-runtime" } */
#ifdef __cplusplus #ifdef __cplusplus
extern void baz(...); extern void baz(...);
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
constant string classes get derived. */ constant string classes get derived. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */ /* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime" } */ /* { dg-do compile { target { *-*-darwin* } } } */
/* { dg-do compile { target *-*-darwin* } } */ /* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface NSString: Object @interface NSString: Object
@end @end
...@@ -20,9 +20,14 @@ ...@@ -20,9 +20,14 @@
@interface NSConstantString : NSSimpleCString @interface NSConstantString : NSSimpleCString
@end @end
#ifndef NEXT_OBJC_USE_NEW_INTERFACE
extern struct objc_class _NSConstantStringClassReference; extern struct objc_class _NSConstantStringClassReference;
#else
extern Class _NSConstantStringClassReference;
#endif
const NSConstantString *appKey = @"MyApp"; const NSConstantString *appKey = @"MyApp";
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */ /* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */
/* { dg-final { scan-assembler ".long\t__NSConstantStringClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" } } */ /* { dg-final { scan-assembler ".long\t__NSConstantStringClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t__NSConstantStringClassReference\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */
...@@ -2,10 +2,11 @@ ...@@ -2,10 +2,11 @@
constant string classes get derived. */ constant string classes get derived. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */ /* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime -fconstant-string-class=XStr" } */
/* { dg-do compile { target *-*-darwin* } } */ /* { dg-do compile { target *-*-darwin* } } */
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
/* { dg-options "-fconstant-string-class=XStr" } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface XString: Object { @interface XString: Object {
@protected @protected
...@@ -19,9 +20,14 @@ ...@@ -19,9 +20,14 @@
} }
@end @end
#ifndef NEXT_OBJC_USE_NEW_INTERFACE
extern struct objc_class _XStrClassReference; extern struct objc_class _XStrClassReference;
#else
extern Class _XStrClassReference;
#endif
const XStr *appKey = @"MyApp"; const XStr *appKey = @"MyApp";
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */ /* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */
/* { dg-final { scan-assembler ".long\t__XStrClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" } } */ /* { dg-final { scan-assembler ".long\t__XStrClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t__XStrClassReference\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-options "-Wall -funit-at-a-time -fgnu-runtime" } */ /* { dg-options "-Wall -funit-at-a-time" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* PR objc/27438, make sure that the decl produced by the front-end /* PR objc/27438, make sure that the decl produced by the front-end
does not cause a warning to be produced. */ does not cause a warning to be produced. */
/* { dg-skip-if "" { *-*-* } { "-fnext-runtime" } { "" } } */
@interface NXConstantString @interface NXConstantString
{ {
......
/* Test the -fconstant-string-class=Foo option under the NeXT /* Test the -fconstant-string-class=Foo option under the NeXT runtime. */
runtime. */
/* Developed by Markus Hitter <mah@jump-ing.de>. */ /* Developed by Markus Hitter <mah@jump-ing.de>. */
/* { dg-do run } */
/* { dg-options "-fconstant-string-class=Foo" } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* { dg-options "-fnext-runtime -fconstant-string-class=Foo -lobjc" } */ #import "../objc-obj-c++-shared/Object1.h"
/* { dg-do run { target *-*-darwin* } } */ #import "../objc-obj-c++-shared/next-mapping.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <memory.h> #include <memory.h>
#include <objc/objc.h>
#include <objc/Object.h>
@interface Foo: Object { @interface Foo: Object {
char *cString; char *cString;
...@@ -18,7 +17,11 @@ ...@@ -18,7 +17,11 @@
- (char *)customString; - (char *)customString;
@end @end
#ifdef NEXT_OBJC_USE_NEW_INTERFACE
struct fudge_objc_class _FooClassReference;
#else
struct objc_class _FooClassReference; struct objc_class _FooClassReference;
#endif
@implementation Foo : Object @implementation Foo : Object
- (char *)customString { - (char *)customString {
...@@ -38,7 +41,7 @@ int main () { ...@@ -38,7 +41,7 @@ int main () {
constant string object. Can't be moved to +initialize since _that_ constant string object. Can't be moved to +initialize since _that_
is already a message. */ is already a message. */
memcpy(&_FooClassReference, objc_getClass("Foo"), sizeof(_FooClassReference)); memcpy(&_FooClassReference, objc_get_class("Foo"), sizeof(_FooClassReference));
if (strcmp ([string customString], "bla")) { if (strcmp ([string customString], "bla")) {
abort (); abort ();
} }
...@@ -46,3 +49,5 @@ int main () { ...@@ -46,3 +49,5 @@ int main () {
printf([@"This is a working constant string object\n" customString]); printf([@"This is a working constant string object\n" customString]);
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Ensure that the preprocessor handles ObjC string constants gracefully. */ /* Ensure that the preprocessor handles ObjC string constants gracefully. */
/* Author: Ziemowit Laski <zlaski@apple.com> */ /* Author: Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime -fconstant-string-class=MyString -lobjc" } */ /* { dg-options "-fconstant-string-class=MyString " } */
/* { dg-do run { target *-*-darwin* } } */ /* { dg-do run } */
extern void abort(void); extern void abort(void);
......
/* Test to make sure that the const objc strings are the same across /* Test to make sure that the const objc strings are the same across scopes. */
scopes. */
/* Developed by Andrew Pinski <pinskia@physics.uc.edu> */ /* Developed by Andrew Pinski <pinskia@physics.uc.edu> */
/* { dg-options "-fconstant-string-class=Foo " } */
/* { dg-do run } */
#include "../objc-obj-c++-shared/Object1.h"
/* { dg-options "-fnext-runtime -fconstant-string-class=Foo -lobjc" } */
/* { dg-do run { target *-*-darwin* } } */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <memory.h> #include <memory.h>
#include <objc/objc.h>
#include <objc/Object.h>
@interface Foo: Object { @interface Foo: Object {
char *cString; char *cString;
...@@ -21,8 +15,11 @@ ...@@ -21,8 +15,11 @@
- (char *)customString; - (char *)customString;
@end @end
#ifndef NEXT_OBJC_USE_NEW_INTERFACE
struct objc_class _FooClassReference; struct objc_class _FooClassReference;
#else
Class _FooClassReference;
#endif
@implementation Foo : Object @implementation Foo : Object
- (char *)customString { - (char *)customString {
...@@ -30,13 +27,11 @@ struct objc_class _FooClassReference; ...@@ -30,13 +27,11 @@ struct objc_class _FooClassReference;
} }
@end @end
int main () { int main () {
Foo *string = @"bla"; Foo *string = @"bla";
{ {
Foo *string2 = @"bla"; Foo *string2 = @"bla";
if(string != string2) if(string != string2)
abort(); abort();
printf("Strings are being uniqued properly\n"); printf("Strings are being uniqued properly\n");
...@@ -44,3 +39,4 @@ int main () { ...@@ -44,3 +39,4 @@ int main () {
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Test for assigning compile-time constant-string objects to static variables. */ /* Test for assigning compile-time constant-string objects to static variables. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */ /* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fconstant-string-class=Foo" } */
/* { dg-do run } */
/* { dg-options "-fnext-runtime -fconstant-string-class=Foo -lobjc" } */ #include "../objc-obj-c++-shared/Object1.h"
/* { dg-do run { target *-*-darwin* } } */
#include <stdlib.h> #include <stdlib.h>
#include <objc/Object.h>
@interface Foo: Object { @interface Foo: Object {
char *cString; char *cString;
...@@ -14,7 +12,11 @@ ...@@ -14,7 +12,11 @@
} }
@end @end
#ifndef NEXT_OBJC_USE_NEW_INTERFACE
struct objc_class _FooClassReference; struct objc_class _FooClassReference;
#else
Class _FooClassReference;
#endif
@implementation Foo : Object @implementation Foo : Object
- (char *)customString { - (char *)customString {
...@@ -37,3 +39,5 @@ int main () { ...@@ -37,3 +39,5 @@ int main () {
PrefsSynchronize(); PrefsSynchronize();
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Test if ObjC constant strings get placed in the correct section. */ /* Test if ObjC constant strings get placed in the correct section. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */ /* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime" } */ /* { dg-do compile } */
/* { dg-do compile { target *-*-darwin* } } */ /* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
#include <objc/Object.h> #include "../objc-obj-c++-shared/Object1.h"
@interface NSConstantString: Object { @interface NSConstantString: Object {
char *cString; char *cString;
...@@ -12,9 +12,14 @@ ...@@ -12,9 +12,14 @@
} }
@end @end
#ifndef NEXT_OBJC_USE_NEW_INTERFACE
extern struct objc_class _NSConstantStringClassReference; extern struct objc_class _NSConstantStringClassReference;
#else
Class _NSConstantStringClassReference;
#endif
static const NSConstantString *appKey = @"MyApp"; static const NSConstantString *appKey = @"MyApp";
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */ /* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */
/* { dg-final { scan-assembler ".long\t__NSConstantStringClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" } } */ /* { dg-final { scan-assembler ".long\t__NSConstantStringClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t__NSConstantStringClassReference\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */
/* Check if the @defs() construct preserves the correct /* Check if the @defs() construct preserves the correct
offsets of ivars. */ offsets of ivars. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ /* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-lobjc" } */ /* { dg-options "" } */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include <objc/objc.h> #include "../objc-obj-c++-shared/Object1.h"
#include <objc/Object.h> //#include <objc/objc.h>
extern void abort(void); extern void abort(void);
...@@ -65,3 +66,5 @@ int main(void) { ...@@ -65,3 +66,5 @@ int main(void) {
return 0; return 0;
} }
#include "../objc-obj-c++-shared/Object1-implementation.h"
/* Test Objective-C capability for handling GNU/C99 designated /* Test Objective-C capability for handling GNU/C99 designated initializers, and distinguishing them
initializers, and distinguishing them from message sends. */ from message sends. Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-std=gnu99" } */ /* { dg-options "-std=gnu99" } */
/* { dg-do run } */ /* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include "../objc-obj-c++-shared/Object1.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <objc/objc.h>
#include <objc/Object.h>
@interface Cls : Object @interface Cls : Object
+ (int) meth1; + (int) meth1;
...@@ -47,3 +47,5 @@ int main(void) { ...@@ -47,3 +47,5 @@ int main(void) {
/* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 0 } */ /* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 0 } */
/* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 0 } */ /* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 0 } */
/* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 0 } */ /* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 0 } */
#include "../objc-obj-c++-shared/Object1-implementation.h"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment