diff options
author | Iain Sandoe <iains@gcc.gnu.org> | 2010-05-01 00:32:13 +0000 |
---|---|---|
committer | Mike Stump <mrs@gcc.gnu.org> | 2010-05-01 00:32:13 +0000 |
commit | 619dea2d5c764e83340099eea2f33296e148b4da (patch) | |
tree | 862aeb59dc18687953e343e21d22bb8d5451fde4 | |
parent | 6482762d8114f68c7bc26dc0e253c22088e2c249 (diff) | |
download | gcc-619dea2d5c764e83340099eea2f33296e148b4da.zip gcc-619dea2d5c764e83340099eea2f33296e148b4da.tar.gz gcc-619dea2d5c764e83340099eea2f33296e148b4da.tar.bz2 |
[multiple changes]
2010-04-30 Iain Sandoe <iains@gcc.gnu.org>
PR objc++/32052
* objc-act.c (encode_aggregate_within): Encode structure tags
with template args for ObjC++.
2010-04-30 Iain Sandoe <iains@gcc.gnu.org>
PR objc++/32052
* obj-c++.dg/encode-2.mm: Remove XFAIL. Add test for anonymous
structure and nested declarations.
* obj-c++.dg/encode-3.mm: Remove XFAIL. Add test for anonymous
structure and nested declarations. Reduce header clutter and
use _exit() rather than abort().
* objc.dg/encode-10.m: New.
* objc.dg/encode-11.m: New.
From-SVN: r158958
-rw-r--r-- | gcc/objc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/objc/objc-act.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/testsuite/obj-c++.dg/encode-2.mm | 16 | ||||
-rw-r--r-- | gcc/testsuite/obj-c++.dg/encode-3.mm | 35 | ||||
-rw-r--r-- | gcc/testsuite/objc.dg/encode-10.m | 19 | ||||
-rw-r--r-- | gcc/testsuite/objc.dg/encode-11.m | 43 |
7 files changed, 128 insertions, 16 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index d734681..2f1343b 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,9 @@ +2010-04-30 Iain Sandoe <iains@gcc.gnu.org> + + PR objc++/32052 + * objc-act.c (encode_aggregate_within): Encode structure tags + with template args for ObjC++. + 2010-04-30 Steven Bosscher <steven@gcc.gnu.org> * objc-act.c: Do not include varray.h. diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index b802ecd..465376d 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -8129,15 +8129,21 @@ encode_aggregate_within (tree type, int curtype, int format, int left, /* Encode the struct/union tag name, or '?' if a tag was not provided. Typedef aliases do not qualify. */ - if (name && TREE_CODE (name) == IDENTIFIER_NODE #ifdef OBJCPLUS + /* For compatibility with the NeXT runtime, ObjC++ encodes template + args as a composite struct tag name. */ + if (name && TREE_CODE (name) == IDENTIFIER_NODE /* Did this struct have a tag? */ - && !TYPE_WAS_ANONYMOUS (type) -#endif - ) + && !TYPE_WAS_ANONYMOUS (type)) + obstack_grow (&util_obstack, + decl_as_string (type, TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME), + strlen (decl_as_string (type, TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME))); +#else + if (name && TREE_CODE (name) == IDENTIFIER_NODE) obstack_grow (&util_obstack, IDENTIFIER_POINTER (name), strlen (IDENTIFIER_POINTER (name))); +#endif else obstack_1grow (&util_obstack, '?'); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0fa5ee7..4ef7a6f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2010-04-30 Iain Sandoe <iains@gcc.gnu.org> + + PR objc++/32052 + * obj-c++.dg/encode-2.mm: Remove XFAIL. Add test for anonymous + structure and nested declarations. + * obj-c++.dg/encode-3.mm: Remove XFAIL. Add test for anonymous + structure and nested declarations. Reduce header clutter and + use _exit() rather than abort(). + * objc.dg/encode-10.m: New. + * objc.dg/encode-11.m: New. + 2010-04-30 DJ Delorie <dj@redhat.com> * gcc.c-torture/execute/20100430-1.c: New test. diff --git a/gcc/testsuite/obj-c++.dg/encode-2.mm b/gcc/testsuite/obj-c++.dg/encode-2.mm index 2f1e2f0..cfa9bc7 100644 --- a/gcc/testsuite/obj-c++.dg/encode-2.mm +++ b/gcc/testsuite/obj-c++.dg/encode-2.mm @@ -6,9 +6,21 @@ struct Vec { int z; }; +typedef struct { + Vec<double> dvec; + Vec<float> fvec; + float fscalar; + double dscalar; + Vec<char> chVec; + int iscalar; +} anonymous; + Vec<double> dd; + const char *enc = @encode(Vec<float>); const char *enc2 = @encode(Vec<double>); +const char *enc3 = @encode(anonymous); -/* { dg-final { scan-assembler "{Vec<float>=ffi}" { xfail "*-*-*" } } } PR32052 */ -/* { dg-final { scan-assembler "{Vec<double>=ddi}" { xfail "*-*-*" } } } PR32052 */ +/* { dg-final { scan-assembler "{Vec<float>=ffi}" } } */ +/* { dg-final { scan-assembler "{Vec<double>=ddi}" } } */ +/* { dg-final { scan-assembler "{?={Vec<double>=ddi}{Vec<float>=ffi}fd{Vec<char>=cci}i}" } } */ diff --git a/gcc/testsuite/obj-c++.dg/encode-3.mm b/gcc/testsuite/obj-c++.dg/encode-3.mm index c121790..05193ae 100644 --- a/gcc/testsuite/obj-c++.dg/encode-3.mm +++ b/gcc/testsuite/obj-c++.dg/encode-3.mm @@ -1,18 +1,30 @@ -/* { dg-do run { xfail { "*-*-*" } } } PR32052 */ +/* { dg-do run } */ -#include <stdlib.h> -#include <string.h> +extern "C" { +extern void _exit(int); +extern int strcmp(const char *, const char *); +} template <class T> struct Vec { - T x, y; - long z; - long long zz; + T x, y; + long z; + long long zz; }; -Vec<double> dd; +typedef struct { + float fscalar; + double dv[10]; + int iscalar; + long z; + long long zz; + Vec<const char> cv; +} anonymous; + +//Vec<double> dd; const char *enc = @encode(Vec<float>); const char *enc2 = @encode(Vec<double>); +const char *enc3 = @encode(anonymous); #ifdef __LP64__ #define L "q" @@ -24,13 +36,16 @@ int main(void) { const char *encode = @encode(long); if (strcmp (encode, L)) - abort(); + _exit(-(__LINE__)); if (strcmp (enc, "{Vec<float>=ff" L "q}")) - abort(); + _exit(-(__LINE__)); if (strcmp (enc2, "{Vec<double>=dd" L "q}")) - abort(); + _exit(-(__LINE__)); + + if (strcmp (enc3, "{?=f[10d]i" L "q{Vec<const char>=rcrc" L "q}}")) + _exit(-(__LINE__)); return 0; } diff --git a/gcc/testsuite/objc.dg/encode-10.m b/gcc/testsuite/objc.dg/encode-10.m new file mode 100644 index 0000000..bdfdb82 --- /dev/null +++ b/gcc/testsuite/objc.dg/encode-10.m @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +typedef struct Vec { + double x, y; + int z; +} xyz_t ; + +typedef struct { + float fscalar; + double dscalar; + xyz_t dv; + int iscalar; +} anonymous; + +const char *enc = @encode(xyz_t); +const char *enc2 = @encode(anonymous); + +/* { dg-final { scan-assembler "{Vec=ddi}" } } */ +/* { dg-final { scan-assembler "{?=fd{Vec=ddi}i}" } } */ diff --git a/gcc/testsuite/objc.dg/encode-11.m b/gcc/testsuite/objc.dg/encode-11.m new file mode 100644 index 0000000..2e5fc84 --- /dev/null +++ b/gcc/testsuite/objc.dg/encode-11.m @@ -0,0 +1,43 @@ +/* { dg-do run } */ + +extern void _exit(int); +extern int strcmp(const char *, const char *); + +typedef struct Vec { + double xv[10], yv[5]; + float fscal; + int z; +} xyz_t ; + +typedef struct { + float fscalar; + double dscalar; + xyz_t dv; + int iscalar; + long ln; + long long lln; +} anonymous; + +const char *enc = @encode(xyz_t); +const char *enc2 = @encode(anonymous); + +#ifdef __LP64__ +#define L "q" +#else +#define L "l" +#endif + +int main(void) { + const char *encode = @encode(long); + + if (strcmp (encode, L)) + _exit(-(__LINE__)); + + if (strcmp (enc, "{Vec=[10d][5d]fi}")) + _exit(-(__LINE__)); + + if (strcmp (enc2, "{?=fd{Vec=[10d][5d]fi}i" L "q}")) + _exit(-(__LINE__)); + + return 0; +} |