Commit 619dea2d by Iain Sandoe Committed by Mike Stump

[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
parent 6482762d
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> 2010-04-30 Steven Bosscher <steven@gcc.gnu.org>
* objc-act.c: Do not include varray.h. * objc-act.c: Do not include varray.h.
......
...@@ -8129,15 +8129,21 @@ encode_aggregate_within (tree type, int curtype, int format, int left, ...@@ -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 /* Encode the struct/union tag name, or '?' if a tag was
not provided. Typedef aliases do not qualify. */ not provided. Typedef aliases do not qualify. */
if (name && TREE_CODE (name) == IDENTIFIER_NODE
#ifdef OBJCPLUS #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? */ /* Did this struct have a tag? */
&& !TYPE_WAS_ANONYMOUS (type) && !TYPE_WAS_ANONYMOUS (type))
#endif 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, obstack_grow (&util_obstack,
IDENTIFIER_POINTER (name), IDENTIFIER_POINTER (name),
strlen (IDENTIFIER_POINTER (name))); strlen (IDENTIFIER_POINTER (name)));
#endif
else else
obstack_1grow (&util_obstack, '?'); obstack_1grow (&util_obstack, '?');
......
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> 2010-04-30 DJ Delorie <dj@redhat.com>
* gcc.c-torture/execute/20100430-1.c: New test. * gcc.c-torture/execute/20100430-1.c: New test.
......
...@@ -6,9 +6,21 @@ struct Vec { ...@@ -6,9 +6,21 @@ struct Vec {
int z; int z;
}; };
typedef struct {
Vec<double> dvec;
Vec<float> fvec;
float fscalar;
double dscalar;
Vec<char> chVec;
int iscalar;
} anonymous;
Vec<double> dd; Vec<double> dd;
const char *enc = @encode(Vec<float>); const char *enc = @encode(Vec<float>);
const char *enc2 = @encode(Vec<double>); 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<float>=ffi}" } } */
/* { dg-final { scan-assembler "{Vec<double>=ddi}" { xfail "*-*-*" } } } PR32052 */ /* { dg-final { scan-assembler "{Vec<double>=ddi}" } } */
/* { dg-final { scan-assembler "{?={Vec<double>=ddi}{Vec<float>=ffi}fd{Vec<char>=cci}i}" } } */
/* { dg-do run { xfail { "*-*-*" } } } PR32052 */ /* { dg-do run } */
#include <stdlib.h> extern "C" {
#include <string.h> extern void _exit(int);
extern int strcmp(const char *, const char *);
}
template <class T> template <class T>
struct Vec { struct Vec {
T x, y; T x, y;
long z; long z;
long long zz; 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 *enc = @encode(Vec<float>);
const char *enc2 = @encode(Vec<double>); const char *enc2 = @encode(Vec<double>);
const char *enc3 = @encode(anonymous);
#ifdef __LP64__ #ifdef __LP64__
#define L "q" #define L "q"
...@@ -24,13 +36,16 @@ int main(void) { ...@@ -24,13 +36,16 @@ int main(void) {
const char *encode = @encode(long); const char *encode = @encode(long);
if (strcmp (encode, L)) if (strcmp (encode, L))
abort(); _exit(-(__LINE__));
if (strcmp (enc, "{Vec<float>=ff" L "q}")) if (strcmp (enc, "{Vec<float>=ff" L "q}"))
abort(); _exit(-(__LINE__));
if (strcmp (enc2, "{Vec<double>=dd" L "q}")) 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; return 0;
} }
/* { 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}" } } */
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment