OSDN Git Service

2010-04-30 Iain Sandoe <iains@gcc.gnu.org>
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 May 2010 00:32:13 +0000 (00:32 +0000)
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 May 2010 00:32:13 +0000 (00:32 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158958 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/objc/ChangeLog
gcc/objc/objc-act.c
gcc/testsuite/ChangeLog
gcc/testsuite/obj-c++.dg/encode-2.mm
gcc/testsuite/obj-c++.dg/encode-3.mm
gcc/testsuite/objc.dg/encode-10.m [new file with mode: 0644]
gcc/testsuite/objc.dg/encode-11.m [new file with mode: 0644]

index d734681..2f1343b 100644 (file)
@@ -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.
index b802ecd..465376d 100644 (file)
@@ -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, '?');
 
index 0fa5ee7..4ef7a6f 100644 (file)
@@ -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.
index 2f1e2f0..cfa9bc7 100644 (file)
@@ -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}" } }  */
index c121790..05193ae 100644 (file)
@@ -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 (file)
index 0000000..bdfdb82
--- /dev/null
@@ -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 (file)
index 0000000..2e5fc84
--- /dev/null
@@ -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;
+}