| /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */ |
| |
| /* { dg-do run } */ |
| /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ |
| /* { dg-options "-fconstant-string-class=MyTestString" } */ |
| /* { dg-options "-mno-constant-cfstrings -fconstant-string-class=MyTestString" { target *-*-darwin* } } */ |
| |
| #include "../../objc-obj-c++-shared/objc-test-suite-types.h" |
| |
| #include <stdlib.h> /* For abort() */ |
| |
| @interface MyTestString |
| { |
| void *dummy_class_ptr; |
| char *string; |
| unsigned int len; |
| } |
| + initialize; |
| /* All strings should contain the C string 'test'. Call -check to |
| test that this is true. */ |
| - (void) check; |
| @end |
| |
| @implementation MyTestString |
| + initialize {return self;} |
| - (void) check |
| { |
| if (len != 4 || string[0] != 't' || string[1] != 'e' |
| || string[2] != 's' || string[3] != 't' || string[4] != '\0') |
| abort (); |
| } |
| @end |
| |
| TNS_STRING_REF_T _MyTestStringClassReference; /* Only used by NeXT. */ |
| |
| int main (void) |
| { |
| MyTestString *test_valid1 = @"test"; |
| MyTestString *test_valid2 = @"te" @"st"; |
| MyTestString *test_valid3 = @"te" @"s" @"t"; |
| MyTestString *test_valid4 = @ "t" @ "e" @ "s" @ "t"; |
| MyTestString *test_valid5 = @ "t" "e" "s" "t"; |
| MyTestString *test_valid6 = @ "t" "e" "s" @ "t"; |
| |
| [test_valid1 check]; |
| [test_valid2 check]; |
| [test_valid3 check]; |
| [test_valid4 check]; |
| [test_valid5 check]; |
| [test_valid6 check]; |
| |
| return 0; |
| } |
| |
| #ifdef __NEXT_RUNTIME__ |
| #include <string.h> |
| /* The MyTestString metaclass will need to be initialized before we can |
| send messages to strings. */ |
| |
| void testsuite_mytest_string_init (void) __attribute__((constructor)); |
| void testsuite_mytest_string_init (void) { |
| memcpy (&_MyTestStringClassReference, |
| objc_getClass ("MyTestString"), |
| sizeof (_MyTestStringClassReference)); |
| } |
| #endif |