From patchwork Tue Jun 8 12:21:54 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iain Sandoe X-Patchwork-Id: 54965 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 0E662B6EFF for ; Tue, 8 Jun 2010 22:22:30 +1000 (EST) Received: (qmail 32410 invoked by alias); 8 Jun 2010 12:22:28 -0000 Received: (qmail 32402 invoked by uid 22791); 8 Jun 2010 12:22:26 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, TW_BJ X-Spam-Check-By: sourceware.org Received: from c2beaomr10.btconnect.com (HELO c2beaomr10.btconnect.com) (213.123.26.188) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 08 Jun 2010 12:22:18 +0000 Received: from thor.office (host81-138-1-83.in-addr.btopenworld.com [81.138.1.83]) by c2beaomr10.btconnect.com with ESMTP id ERB30643; Tue, 8 Jun 2010 13:21:58 +0100 (BST) X-Mirapoint-IP-Reputation: reputation=Fair-1, source=Queried, refid=0001.0A0B0302.4C0E35E6.00D4, actions=tag Message-Id: <86B92522-4BD6-4C4B-954A-FEF26BD92C5B@sandoe-acoustics.co.uk> From: IainS To: GCC Patches Mime-Version: 1.0 (Apple Message framework v936) Subject: [Patch][4.5] ObjC/C++ back-port of fix for PR32052 Date: Tue, 8 Jun 2010 13:21:54 +0100 Cc: Richard Guenther , Mike Stump X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org tested on i686-apple-darwin9, i6868-pc-linux-gnu. OK for 4.5? Iain gcc/objc/ChangeLog: Backport from mainline: PR objc++/32052 * objc-act.c (encode_aggregate_within): Encode structure tags with template args for ObjC++. gcc/testsuite/ChangeLog: Backport from mainline: 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. * objc.dg/encode-10.m: New. * objc.dg/encode-11.m: New. Index: gcc/objc/objc-act.c =================================================================== --- gcc/objc/objc-act.c (revision 160426) +++ gcc/objc/objc-act.c (working copy) @@ -8120,15 +8120,21 @@ encode_aggregate_within (tree type, int curtype, i /* Encode the struct/union tag name, or '?' if a tag was not provided. Typedef aliases do not qualify. */ +#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 -#ifdef OBJCPLUS /* 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: gcc/testsuite/objc.dg/encode-10.m =================================================================== --- gcc/testsuite/objc.dg/encode-10.m (revision 0) +++ gcc/testsuite/objc.dg/encode-10.m (revision 0) @@ -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}" } } */ Index: gcc/testsuite/objc.dg/encode-11.m =================================================================== --- gcc/testsuite/objc.dg/encode-11.m (revision 0) +++ gcc/testsuite/objc.dg/encode-11.m (revision 0) @@ -0,0 +1,43 @@ +/* { dg-do run } */ + +extern void abort (void); +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)) + abort (); + + if (strcmp (enc, "{Vec=[10d][5d]fi}")) + abort (); + + if (strcmp (enc2, "{?=fd{Vec=[10d][5d]fi}i" L "q}")) + abort (); + + return 0; +} Index: gcc/testsuite/obj-c++.dg/encode-2.mm =================================================================== --- gcc/testsuite/obj-c++.dg/encode-2.mm (revision 160426) +++ gcc/testsuite/obj-c++.dg/encode-2.mm (working copy) @@ -6,9 +6,21 @@ struct Vec { int z; }; +typedef struct { + Vec dvec; + Vec fvec; + float fscalar; + double dscalar; + Vec chVec; + int iscalar; +} anonymous; + Vec dd; + const char *enc = @encode(Vec); const char *enc2 = @encode(Vec); +const char *enc3 = @encode(anonymous); -/* { dg-final { scan-assembler "{Vec=ffi}" { xfail "*-*-*" } } } PR32052 */ -/* { dg-final { scan-assembler "{Vec=ddi}" { xfail "*-*-*" } } } PR32052 */ +/* { dg-final { scan-assembler "{Vec=ffi}" } } */ +/* { dg-final { scan-assembler "{Vec=ddi}" } } */ +/* { dg-final { scan-assembler "{?={Vec=ddi}{Vec=ffi}fd{Vec=cci}i}" } } */ Index: gcc/testsuite/obj-c++.dg/encode-3.mm =================================================================== --- gcc/testsuite/obj-c++.dg/encode-3.mm (revision 160426) +++ gcc/testsuite/obj-c++.dg/encode-3.mm (working copy) @@ -1,18 +1,30 @@ -/* { dg-do run { xfail { "*-*-*" } } } PR32052 */ +/* { dg-do run } */ -#include -#include +extern "C" { +extern void abort (void); +extern int strcmp (const char *, const char *); +} template struct Vec { - T x, y; - long z; - long long zz; + T x, y; + long z; + long long zz; }; -Vec dd; +typedef struct { + float fscalar; + double dv[10]; + int iscalar; + long z; + long long zz; + Vec cv; +} anonymous; + +//Vec dd; const char *enc = @encode(Vec); const char *enc2 = @encode(Vec); +const char *enc3 = @encode(anonymous); #ifdef __LP64__ #define L "q" @@ -32,5 +44,8 @@ int main(void) { if (strcmp (enc2, "{Vec=dd" L "q}")) abort(); + if (strcmp (enc3, "{?=f[10d]i" L "q{Vec=rcrc" L "q}}")) + abort(); + return 0; }