aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Sandoe <iains@gcc.gnu.org>2010-05-01 00:32:13 +0000
committerMike Stump <mrs@gcc.gnu.org>2010-05-01 00:32:13 +0000
commit619dea2d5c764e83340099eea2f33296e148b4da (patch)
tree862aeb59dc18687953e343e21d22bb8d5451fde4
parent6482762d8114f68c7bc26dc0e253c22088e2c249 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/objc/objc-act.c14
-rw-r--r--gcc/testsuite/ChangeLog11
-rw-r--r--gcc/testsuite/obj-c++.dg/encode-2.mm16
-rw-r--r--gcc/testsuite/obj-c++.dg/encode-3.mm35
-rw-r--r--gcc/testsuite/objc.dg/encode-10.m19
-rw-r--r--gcc/testsuite/objc.dg/encode-11.m43
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;
+}