From patchwork Wed Feb 3 11:31:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Tom Greenslade \\(thomgree\\)" X-Patchwork-Id: 1435220 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=XFIdTL/G; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DVzzl2SGmz9sWr for ; Wed, 3 Feb 2021 22:32:02 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 68EDC398E42F; Wed, 3 Feb 2021 11:31:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 68EDC398E42F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1612351919; bh=5FnOXLCCeJnUEC/lsV92osJvbYPQA/iLQAS0jjJSzpM=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=XFIdTL/GUvbwhmCTkLbaJ96WSDX4Lva8nIpH1r4lsbKNFajO7o2U/QHgAOd2mFSch bUaWLHdhkTlY9N5w8PCE1QJjiM1r04cZJ0bBD4Ei+IH7zgAhbqP3f/AcBwh1CsPpVj 5H/KwjvT4zYuOkhTYE4YZ3jgrkqdvFowjYtqp4ig= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from alln-iport-8.cisco.com (alln-iport-8.cisco.com [173.37.142.95]) by sourceware.org (Postfix) with ESMTPS id 91C12398E42C for ; Wed, 3 Feb 2021 11:31:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 91C12398E42C X-IPAS-Result: A0CzDwBEiBpgkI0NJK1igQmDIlF9WjIxCgGHfQOODIEImBQVgj4DVAsBAQENAQEjCgIEAQGESgKBfAIlOBMCAwEBAQMCAwEBAQEFAQEBAgEGBBQBAQEBAQGGOAEMhiETBgEBOBEBPkImAQQbgx4BglUDLgEOpSsCiiV0gQEzgwUBAQaBMwGDZhiCEgMGgTiCd4ZUhBobggCBEUOCIXOBBIFZA4FgMIMbgiyBWGwIgQ0qAheBNX+PepcwkUYKgnqJNpJugy+fcZQxggiJIpZJAgICAgQFAg4BAQaBbSGBWXAVOw0GglZQFwINji0OCYNOhRSFRHQCNQIGCgEBAwl8iggBgRABAQ IronPort-PHdr: 9a23:vme6Fx+7MvGP/f9uRHGN82YQeigqvan1NQcJ650hzqhDabmn44+7ZRyN6v5mylDPQMPc8f0Xw+bVsqW1X2sG7N7BtX0Za5VDWlcDjtlehA0vBsOJSCiZZP7nZiA3BoJOAVli+XzoPkNeXsn4ehvVuHLhpTIXEw/0YAxyIOm9E4XOjsOxgua1/ZCbYwhBiDenJ71oKxDjpgTKvc5Qioxneas= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.79,398,1602547200"; d="scan'208";a="660664521" Received: from alln-core-8.cisco.com ([173.36.13.141]) by alln-iport-8.cisco.com with ESMTP/TLS/DHE-RSA-SEED-SHA; 03 Feb 2021 11:31:55 +0000 Received: from XCH-RCD-003.cisco.com (xch-rcd-003.cisco.com [173.37.102.13]) by alln-core-8.cisco.com (8.15.2/8.15.2) with ESMTPS id 113BVtOD029009 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=FAIL) for ; Wed, 3 Feb 2021 11:31:55 GMT Received: from xfe-aln-003.cisco.com (173.37.135.123) by XCH-RCD-003.cisco.com (173.37.102.13) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 3 Feb 2021 05:31:55 -0600 Received: from xhs-rcd-003.cisco.com (173.37.227.248) by xfe-aln-003.cisco.com (173.37.135.123) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.792.3; Wed, 3 Feb 2021 05:31:54 -0600 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (72.163.14.9) by xhs-rcd-003.cisco.com (173.37.227.248) with Microsoft SMTP Server (TLS) id 15.0.1497.2 via Frontend Transport; Wed, 3 Feb 2021 05:31:54 -0600 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=R4/P8fpkf/TdtwI5Pxsk+kb/ck9hMfy+7VHL3eSSJzmE7mTI2AIHrw1FAFStlET8dFO0wGHSzLGMWtGXIgVmADj77S9QhohU2ww+UDhe2y1KbjycsvYcH6zwMpjAxfL3mi84mQLex1QnJM6aWyUwjbqs0rop3+bgTZoQJ1Z4rbuRfpWeKmj93B57i15thxdEh+E8BDU8ezDPTYeIVtM0fInF2oMpkvd1ESFiw4lNp9HvmVO/ZCgytqg6qYhKEBwA6svIE+xow8nU8+oVDOTRoMb6TQCVBq5DWXCZHmJwspoaC1SgQh91D1eGklGAKRe3ZVLo/JcXuQi9hR7in4CP+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5FnOXLCCeJnUEC/lsV92osJvbYPQA/iLQAS0jjJSzpM=; b=Ul19Pl/AJstqrT6qu2Ibibb327PkgCRieP4se2F6e2pYoD4/WhzjeCSjhC6ZSgkakZ99p5D27mH0+fNC2BGfOMDF8Gtx8SqIPPb9ez76hx0of129IOJIeToEyv/YN4usTADz2UuJDQmTYpEbfRezxJaWMcPifQPul0WuaBHXIu1Enq2mgUVHDmu7HOlLO3+48MDwX6TTKJdn8f1SY+CO869BX5OMZ3VPnH4A0AQ/yYoImmhiMqutiBsz7TyIAF5ghaVihB/Pd8gwa11hEdYVxiIz2SV33xWl0QkH9/hfMlI2xtyoNYv3a4qXYI3yox2C/3QKGP4VYyoavcIrdU9K7Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cisco.com; dmarc=pass action=none header.from=cisco.com; dkim=pass header.d=cisco.com; arc=none Received: from SN6PR11MB3022.namprd11.prod.outlook.com (2603:10b6:805:d8::22) by SA2PR11MB4793.namprd11.prod.outlook.com (2603:10b6:806:fa::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3805.17; Wed, 3 Feb 2021 11:31:54 +0000 Received: from SN6PR11MB3022.namprd11.prod.outlook.com ([fe80::a4b7:9d80:a84:c0d1]) by SN6PR11MB3022.namprd11.prod.outlook.com ([fe80::a4b7:9d80:a84:c0d1%4]) with mapi id 15.20.3805.028; Wed, 3 Feb 2021 11:31:53 +0000 To: "gcc-patches@gcc.gnu.org" Subject: [PATCH v2] c++: fix string literal member initializer bug [PR90926] Thread-Topic: [PATCH v2] c++: fix string literal member initializer bug [PR90926] Thread-Index: Adb6ICnzrQu0WHD1RYmf6Nu8VsYd/g== Date: Wed, 3 Feb 2021 11:31:53 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [173.38.220.55] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 9b41cc94-a543-4a26-0472-08d8c8374e8b x-ms-traffictypediagnostic: SA2PR11MB4793: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:8882; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: PAh6qyPSIekwDn/Eu2qD8qP++1AQQC7+Prqy7/ArAjquXg9EnSVkj85uS2/OQHN8xHrb3B5j2RDNTf3zLNY7ObBXScDiH2+S09nVFNpgl2uo4u7yR/oF6d1yMAlo9ZXG2Nuuz/Gokgu50ruWM/AlmwZUKnxmkbLAbrinYzJJhsG1FtK/mPQfU5WNe3H0zozfWjEhRlFVYPXJlo0iMJ0i8Bb3pajX5WsNtFpgRqc9dv+1rjR9M5BfEjlUQ0o2BFFODiD+hw/h4K8TrVNpBuC0swdIN999ij2CBvnChP6jvyRYqzSUT1qzWU/DD97WrmkE1ZZFAmCkg/RXBPoDmv0gJjDTXkzz/8/kCYmcvq4IVGb0mVT39LOTV13aj/KAxwNJTYEStAUNEXJjZL5XQnySrQqVFblVA3DPGg9jrE/uWqB+bDcUYKbxcRVkzGZUrXw9C9HcnOz/o9F2u2IO95MaTD25cxIP8wsclrvDZYPFhSoAc9PookUzKPC1iMA/Cx2ijDrBdn6c1nytlu3yjjzsLrp1j7wIbhFFm79yYqCo0NOuJXMXwYhdp7FSx9owIzl2rC+gLfobSetvlHTGEKNyAuK6BZzeZOUmlxjhnNT+Y7I= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SN6PR11MB3022.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(366004)(136003)(346002)(396003)(39860400002)(376002)(316002)(8936002)(7696005)(5660300002)(66556008)(64756008)(55016002)(33656002)(83380400001)(76116006)(71200400001)(186003)(2906002)(26005)(86362001)(966005)(478600001)(6916009)(66476007)(9686003)(6506007)(52536014)(66446008)(66946007)(8676002); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: cBa5p5AUufZ5N1VLhsq3YyHhEA6jR2SGafxJ/fZINdRO8AVanvpeV5dVugwd0RQ5UvgMRj0HY8QGBLUYrnyp842ovy46hYwQSmet7fcl9WArkN+/dlXf/Kpatv0B3/q6Himces/1B3V4htLP2P1ucEeAcc2gFHWWzXwAFgHOAQ2zWS7l3OyEMxKuDvc3WB6BOWJ7WHio5Ts4GVJAXR9Nl7LzoEVd1z9zWUPOHkXl6aZaXbkA4U2Wo5Txsmd60CWdtfjzAYEhxHojqrQt6m4DLpyw33mwXxS0c6tC/S0EHXLNq57o9dCABxUlJlSVzE+3fV5zFzoYYmFIYqItFgXWVXvM1HBd8DRt0xqUk0tvkOjCVu0AJbmucPhs3ZqZwxUeGLksEFTBurB8gqdpGa3NXpGfrKvbdIAt68PQCGj9FKE25b0fCyZNA07IazDvvVafiDb0NzE8wHqxHdpWGlXIvzXJpr6iML6dePTK4t14a27THpHuNb0/5+r+2VVlObNfyy6I4YHMmZ9pgJIQs+XOxKogFI5ay7zzhyeUB4hRbQp2IYGLg/bd7mqAiWXMdedxhWUlK/FCVwcYYwBa1kmTrg6+TDDttrPUpAejuV1Qpdghz/4fKsecka20ujJ8NW+Y5/oxRfVHvBidWuHeJHI9DX3bsFl0lStI4Gtieu+40XrddVNaXyXLKXjs5qrzInp+NPliPBEYdnn81F6mPSAnxTAyzvHmaUYAue9PxvLtzQEaxYcm1fdv3S+9cawpwp+MTndLlA7d71HZWv+3VBQCNuqCBgN+deFLA1ruQyTOmaryZWNlYygToB+NaqTLJO5QBmbTS8H0lTFTd/CwGCsqSeU7u8d/r4s+/6/Dw+dLsUQ1fMabq1ktenSLfX6iC/mQKp/o6QP8eYfBIiZZCbV7l96GRgn3ljqETUbeaSFBhGDCnIyer+7Ds7QaNOm/fAQ3BQKisNfuRudkUvpSzVqi9iTbPKmmgn4eZoPf8p0cGgbV7c5z70PuQEmroaZlSbwWoZIeG57g7Tuhd5cxu2fqYQe4DsU2l3LywSRKWPPJc4pCaO+rMLhYyuRMEVVsuqOd x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN6PR11MB3022.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9b41cc94-a543-4a26-0472-08d8c8374e8b X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Feb 2021 11:31:53.8465 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 5ae1af62-9505-4097-a69a-c1553ef7840e X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: b9+VgnjhfBhE7kN3Yd1HgEP9owaSGSPzbtxQGbpQwkY+ArwFpc9/SA8EqAFyde4HBku68MrPCLFN2Pj2kTVd9w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR11MB4793 X-OriginatorOrg: cisco.com X-Outbound-SMTP-Client: 173.37.102.13, xch-rcd-003.cisco.com X-Outbound-Node: alln-core-8.cisco.com X-Spam-Status: No, score=-20.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "Tom Greenslade \(thomgree\) via Gcc-patches" From: "Tom Greenslade \\(thomgree\\)" Reply-To: "Tom Greenslade \(thomgree\)" Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Update of https://gcc.gnu.org/pipermail/gcc-patches/2020-December/562259.html build_aggr_conv did not correctly handle string literal member initializers. Extended can_convert_array to handle this case. For the additional check of compatibility of character types, factored out code from digest_init_r into a new function. Testcase added for this. Bootstrapped/regtested on x86_64-pc-linux-gnu. gcc/cp/ChangeLog: PR c++/90926 * call.c (can_convert_array): Extend to handle all valid aggregate initializers of an array; including by string literals, not just by brace-init-list. (build_aggr_conv): Call can_convert_array more often, not just in brace-init-list case. * typeck2.c (character_array_from_string_literal): New function. (digest_init_r): call character_array_from_string_literal * cp-tree.h: (character_array_from_string_literal): Declare. * g++.dg/cpp1y/nsdmi-aggr12.C: New test. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 87a7af12796..b917c67204f 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -895,28 +895,40 @@ strip_standard_conversion (conversion *conv) return conv; } -/* Subroutine of build_aggr_conv: check whether CTOR, a braced-init-list, - is a valid aggregate initializer for array type ATYPE. */ +/* Subroutine of build_aggr_conv: check whether FROM is a valid aggregate + initializer for array type ATYPE. */ static bool -can_convert_array (tree atype, tree ctor, int flags, tsubst_flags_t complain) +can_convert_array (tree atype, tree from, int flags, tsubst_flags_t complain) { - unsigned i; tree elttype = TREE_TYPE (atype); - for (i = 0; i < CONSTRUCTOR_NELTS (ctor); ++i) + unsigned i; + + if (TREE_CODE (from) == CONSTRUCTOR) { - tree val = CONSTRUCTOR_ELT (ctor, i)->value; - bool ok; - if (TREE_CODE (elttype) == ARRAY_TYPE - && TREE_CODE (val) == CONSTRUCTOR) - ok = can_convert_array (elttype, val, flags, complain); - else - ok = can_convert_arg (elttype, TREE_TYPE (val), val, flags, - complain); - if (!ok) - return false; + for (i = 0; i < CONSTRUCTOR_NELTS (from); ++i) + { + tree val = CONSTRUCTOR_ELT (from, i)->value; + bool ok; + if (TREE_CODE (elttype) == ARRAY_TYPE) + ok = can_convert_array (elttype, val, flags, complain); + else + ok = can_convert_arg (elttype, TREE_TYPE (val), val, flags, + complain); + if (!ok) + return false; + } + return true; } - return true; + + if (char_type_p (TYPE_MAIN_VARIANT (elttype)) + && TREE_CODE (tree_strip_any_location_wrapper (from)) == STRING_CST) + { + return character_array_from_string_literal(atype, from); + } + + /* No other valid way to aggregate initialize an array. */ + return false; } /* Helper for build_aggr_conv. Return true if FIELD is in PSET, or if @@ -973,8 +985,7 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) tree ftype = TREE_TYPE (idx); bool ok; - if (TREE_CODE (ftype) == ARRAY_TYPE - && TREE_CODE (val) == CONSTRUCTOR) + if (TREE_CODE (ftype) == ARRAY_TYPE) ok = can_convert_array (ftype, val, flags, complain); else ok = can_convert_arg (ftype, TREE_TYPE (val), val, flags, @@ -1021,9 +1032,8 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) val = empty_ctor; } - if (TREE_CODE (ftype) == ARRAY_TYPE - && TREE_CODE (val) == CONSTRUCTOR) - ok = can_convert_array (ftype, val, flags, complain); + if (TREE_CODE (ftype) == ARRAY_TYPE) + ok = can_convert_array (ftype, val, flags, complain); else ok = can_convert_arg (ftype, TREE_TYPE (val), val, flags, complain); diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index f31319904eb..8bbbbdfc581 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7946,6 +7946,7 @@ extern tree split_nonconstant_init (tree, tree); extern bool check_narrowing (tree, tree, tsubst_flags_t, bool = false); extern bool ordinary_char_type_p (tree); +extern bool character_array_from_string_literal (tree, tree); extern tree digest_init (tree, tree, tsubst_flags_t); extern tree digest_init_flags (tree, tree, int, tsubst_flags_t); extern tree digest_nsdmi_init (tree, tree, tsubst_flags_t); diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 9ba2897390a..8fbabeb46d9 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1003,6 +1003,28 @@ ordinary_char_type_p (tree type) || type == unsigned_char_type_node); } +/* Checks if character types are compatible. */ + +bool +character_array_from_string_literal(tree type, tree init) +{ + tree to_char_type = TYPE_MAIN_VARIANT (TREE_TYPE (type)); + tree from_char_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (init))); + + if (to_char_type == from_char_type) + return true; + /* The array element type does not match the initializing string + literal element type; this is only allowed when both types are + ordinary character type. There are no string literals of + signed or unsigned char type in the language, but we can get + them internally from converting braced-init-lists to + STRING_CST. */ + if (ordinary_char_type_p (to_char_type) + && ordinary_char_type_p (from_char_type)) + return true; + return false; +} + /* Process the initializer INIT for a variable of type TYPE, emitting diagnostics for invalid initializers and converting the initializer as appropriate. @@ -1070,30 +1092,13 @@ digest_init_r (tree type, tree init, int nested, int flags, if (char_type_p (typ1) && TREE_CODE (stripped_init) == STRING_CST) { - tree char_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (init))); - bool incompat_string_cst = false; - - if (typ1 != char_type) - { - /* The array element type does not match the initializing string - literal element type; this is only allowed when both types are - ordinary character type. There are no string literals of - signed or unsigned char type in the language, but we can get - them internally from converting braced-init-lists to - STRING_CST. */ - if (ordinary_char_type_p (typ1) - && ordinary_char_type_p (char_type)) - /* OK */; - else - incompat_string_cst = true; - } - - if (incompat_string_cst) + if (!character_array_from_string_literal (type, init)) { if (complain & tf_error) error_at (loc, "cannot initialize array of %qT from " - "a string literal with type array of %qT", - typ1, char_type); + "a string literal with type array of %qT", + typ1, + TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (init)))); return error_mark_node; } diff --git a/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr12.C b/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr12.C new file mode 100644 index 00000000000..fcc1f50dd81 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr12.C @@ -0,0 +1,36 @@ +// PR c++/90926 +// { dg-do run { target c++14 } } + +#include + +struct A +{ + char str[4] = "foo"; + char str_array[2][4] = {"bar", "baz"}; +}; + +struct B +{ + char16_t str[10]; +}; + +int called = 0; +void f(A) { called = 1;}; +void f(B) { called = 2;}; + +int +main () +{ + A a; + a.str[0] = 'g'; + a.str_array[0][0] = 'g'; + a = {}; + + if (__builtin_strcmp (a.str, "foo") != 0) + __builtin_abort(); + if (__builtin_strcmp (a.str_array[0], "bar") != 0) + __builtin_abort(); + + f({"foo"}); assert(called == 1); + f({u"foo"}); assert(called == 2); +}