From 505bff7a282203ff50af5bce9db2c932610b4021 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Sat, 23 Oct 2010 19:40:26 +0000 Subject: [PATCH] tests for Darwin CFStrings gcc/testsuite: Based on the CFString implementation in FSF apple/trunk branch. * gcc.dg/darwin-cfstring-1.c: New. * gcc.dg/darwin-cfstring-2.c: New. * gcc.dg/torture/darwin-cfstring-3.c: New. * g++.dg/other/darwin-cfstring1.C: New. * g++.dg/torture/darwin-cfstring-3.C: New. From-SVN: r165889 --- gcc/testsuite/ChangeLog | 10 +++++++ gcc/testsuite/g++.dg/other/darwin-cfstring1.C | 25 ++++++++++++++++ .../g++.dg/torture/darwin-cfstring-3.C | 30 +++++++++++++++++++ gcc/testsuite/gcc.dg/darwin-cfstring-1.c | 28 +++++++++++++++++ gcc/testsuite/gcc.dg/darwin-cfstring-2.c | 12 ++++++++ .../gcc.dg/torture/darwin-cfstring-3.c | 30 +++++++++++++++++++ 6 files changed, 135 insertions(+) create mode 100644 gcc/testsuite/g++.dg/other/darwin-cfstring1.C create mode 100644 gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C create mode 100644 gcc/testsuite/gcc.dg/darwin-cfstring-1.c create mode 100644 gcc/testsuite/gcc.dg/darwin-cfstring-2.c create mode 100644 gcc/testsuite/gcc.dg/torture/darwin-cfstring-3.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 137f96562d7f..cfebd35ba5aa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2010-10-23 Iain Sandoe + + Based on the CFString implementation in FSF apple/trunk branch. + + * gcc.dg/darwin-cfstring-1.c: New. + * gcc.dg/darwin-cfstring-2.c: New. + * gcc.dg/torture/darwin-cfstring-3.c: New. + * g++.dg/other/darwin-cfstring1.C: New. + * g++.dg/torture/darwin-cfstring-3.C: New. + 2010-10-23 Nicola Pero * objc.dg/demangle-1.m: New test. diff --git a/gcc/testsuite/g++.dg/other/darwin-cfstring1.C b/gcc/testsuite/g++.dg/other/darwin-cfstring1.C new file mode 100644 index 000000000000..b30ba9bef918 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/darwin-cfstring1.C @@ -0,0 +1,25 @@ +/* Test whether the __builtin__CFStringMakeConstantString + "function" fails gracefully when handed a non-constant + argument. This will only work on MacOS X 10.1.2 and later. */ +/* Developed by Ziemowit Laski . */ + +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-options "-mconstant-cfstrings" } */ + +#include + +#ifdef __CONSTANT_CFSTRINGS__ +#undef CFSTR +#define CFSTR(STR) ((CFStringRef) __builtin___CFStringMakeConstantString (STR)) +#endif + +extern int cond; +extern const char *func(void); + +int main(void) { + CFStringRef s1 = CFSTR("Str1"); + CFStringRef s2 = CFSTR(cond? "Str2": "Str3"); /* { dg-error "CFString literal expression is not a string constant" } */ + CFStringRef s3 = CFSTR(func()); /* { dg-error "CFString literal expression is not a string constant" } */ + + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C b/gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C new file mode 100644 index 000000000000..2d755ec8dd0e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C @@ -0,0 +1,30 @@ +/* Test whether the __builtin__CFStringMakeConstantString + "function" generates compile-time objects with the correct layout. */ +/* Developed by Ziemowit Laski . */ + +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-options "-mconstant-cfstrings" } */ + +typedef const struct __CFString *CFStringRef; + +#ifdef __CONSTANT_CFSTRINGS__ +#define CFSTR(STR) ((CFStringRef) __builtin___CFStringMakeConstantString (STR)) +#else +#error __CONSTANT_CFSTRINGS__ not defined +#endif + +extern int cond; +extern const char *func(void); + +CFStringRef s0 = CFSTR("Hello" "there"); + +void foo(void) { + const CFStringRef s1 = CFSTR("Str1"); + + s0 = s1; +} + +/* { dg-final { scan-assembler "\\.long\[ \\t\]+___CFConstantStringClassReference\n\[ \\t\]*\\.long\[ \\t\]+1992\n\[ \\t\]*\\.long\[ \\t\]+LC.*\n\[ \\t\]*\\.long\[ \\t\]+4\n" { target { *-*-darwin* && { ! lp64 } } } } } */ +/* { dg-final { scan-assembler "\\.long\[ \\t\]+___CFConstantStringClassReference\n\[ \\t\]*\\.long\[ \\t\]+1992\n\[ \\t\]*\\.long\[ \\t\]+LC.*\n\[ \\t\]*\\.long\[ \\t\]+10\n" { target { *-*-darwin* && { ! lp64 } } } } } */ +/* { dg-final { scan-assembler ".quad\t___CFConstantStringClassReference\n\t.long\t1992\n\t.space 4\n\t.quad\t.*\n\t.quad\t4\n" { target { *-*-darwin* && { lp64 } } } } } */ +/* { dg-final { scan-assembler ".quad\t___CFConstantStringClassReference\n\t.long\t1992\n\t.space 4\n\t.quad\t.*\n\t.quad\t10\n" { target { *-*-darwin* && { lp64 } } } } } */ diff --git a/gcc/testsuite/gcc.dg/darwin-cfstring-1.c b/gcc/testsuite/gcc.dg/darwin-cfstring-1.c new file mode 100644 index 000000000000..b9565e721a31 --- /dev/null +++ b/gcc/testsuite/gcc.dg/darwin-cfstring-1.c @@ -0,0 +1,28 @@ +/* Test whether the __builtin__CFStringMakeConstantString + "function" fails gracefully when handed a non-constant + argument. This will only work on MacOS X 10.1.2 and later. */ +/* Developed by Ziemowit Laski . */ + +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-options "-mconstant-cfstrings" } */ + +typedef const struct __CFString *CFStringRef; + +#ifdef __CONSTANT_CFSTRINGS__ +#define CFSTR(STR) ((CFStringRef) __builtin___CFStringMakeConstantString (STR)) +#else +#error __CONSTANT_CFSTRINGS__ not defined +#endif + +extern int cond; +extern const char *func(void); + +const CFStringRef s0 = CFSTR("Hello" "there"); + +int main(void) { + CFStringRef s1 = CFSTR("Str1"); + CFStringRef s2 = CFSTR(cond? "Str2": "Str3"); /* { dg-error "CFString literal expression is not a string constant" } */ + CFStringRef s3 = CFSTR(func()); /* { dg-error "CFString literal expression is not a string constant" } */ + + return 0; +} diff --git a/gcc/testsuite/gcc.dg/darwin-cfstring-2.c b/gcc/testsuite/gcc.dg/darwin-cfstring-2.c new file mode 100644 index 000000000000..1c724b25cfe0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/darwin-cfstring-2.c @@ -0,0 +1,12 @@ +/* Test whether the __builtin__CFStringMakeConstantString + "function" fails gracefully when used without the + -mconstant-cfstrings flag. */ +/* Developed by Ziemowit Laski . */ + +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-options "-mno-constant-cfstrings" } */ + +typedef const struct __CFString *CFStringRef; + +const CFStringRef S = ((CFStringRef)__builtin___CFStringMakeConstantString("Testing")); +/* { dg-error "built-in" "built-in function .* requires .* flag" { target *-*-* } 11 } */ diff --git a/gcc/testsuite/gcc.dg/torture/darwin-cfstring-3.c b/gcc/testsuite/gcc.dg/torture/darwin-cfstring-3.c new file mode 100644 index 000000000000..2d755ec8dd0e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/darwin-cfstring-3.c @@ -0,0 +1,30 @@ +/* Test whether the __builtin__CFStringMakeConstantString + "function" generates compile-time objects with the correct layout. */ +/* Developed by Ziemowit Laski . */ + +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-options "-mconstant-cfstrings" } */ + +typedef const struct __CFString *CFStringRef; + +#ifdef __CONSTANT_CFSTRINGS__ +#define CFSTR(STR) ((CFStringRef) __builtin___CFStringMakeConstantString (STR)) +#else +#error __CONSTANT_CFSTRINGS__ not defined +#endif + +extern int cond; +extern const char *func(void); + +CFStringRef s0 = CFSTR("Hello" "there"); + +void foo(void) { + const CFStringRef s1 = CFSTR("Str1"); + + s0 = s1; +} + +/* { dg-final { scan-assembler "\\.long\[ \\t\]+___CFConstantStringClassReference\n\[ \\t\]*\\.long\[ \\t\]+1992\n\[ \\t\]*\\.long\[ \\t\]+LC.*\n\[ \\t\]*\\.long\[ \\t\]+4\n" { target { *-*-darwin* && { ! lp64 } } } } } */ +/* { dg-final { scan-assembler "\\.long\[ \\t\]+___CFConstantStringClassReference\n\[ \\t\]*\\.long\[ \\t\]+1992\n\[ \\t\]*\\.long\[ \\t\]+LC.*\n\[ \\t\]*\\.long\[ \\t\]+10\n" { target { *-*-darwin* && { ! lp64 } } } } } */ +/* { dg-final { scan-assembler ".quad\t___CFConstantStringClassReference\n\t.long\t1992\n\t.space 4\n\t.quad\t.*\n\t.quad\t4\n" { target { *-*-darwin* && { lp64 } } } } } */ +/* { dg-final { scan-assembler ".quad\t___CFConstantStringClassReference\n\t.long\t1992\n\t.space 4\n\t.quad\t.*\n\t.quad\t10\n" { target { *-*-darwin* && { lp64 } } } } } */