From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by sourceware.org (Postfix) with ESMTPS id 82B2A3858284 for ; Fri, 3 Mar 2023 00:03:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 82B2A3858284 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=oracle.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 322K42HX013550; Fri, 3 Mar 2023 00:03:07 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-id : content-transfer-encoding : mime-version; s=corp-2022-7-12; bh=ElMhEMz6HlJ2jLRPE2yawVLoAYlixQONPIUqNY6/U5Y=; b=xKLLm2BxWt0GDjcresYdqrgTgs3cCwKRo1448Y1mcx6Unb0skbG90F1/fC8r3Of+sbq9 KSuSV28l/lbRVqLTK3sOUa7TTjgbmght6BUH+rmoEWxU+6jaW1U+SX8b97IifTnK4Lp6 8GmKxiJ5QIRdy4ryt4KEQbQuZlxv6ilRqMCZhcVaAjcCzcCHAkYN8hYXqCc/bcdxAuht JwuOJ/q6GjUEiw8qW3z2ymcUCo640+JvqMQTrXIVR2O9Z7WS9RV71A2a6xnkB05t+46G bPDLHMxf7XIDxq4Tq4uPTV513wa/0KgL14fOgoG2EyowNBKl63UkKn2noq7ypibM5o6Z Ng== Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3nyb6en6mq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 03 Mar 2023 00:03:07 +0000 Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 322MeAVQ033144; Fri, 3 Mar 2023 00:03:06 GMT Received: from nam12-dm6-obe.outbound.protection.outlook.com (mail-dm6nam12lp2169.outbound.protection.outlook.com [104.47.59.169]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3ny8sasp7n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 03 Mar 2023 00:03:06 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fzMImOK2KwFB6wBPigrHsWO5p67TlbdigJzq5rzP5bkp1975CKOtHIZ4nIHLkrDNr67A0w8bMlmnY3991YpWOFJjsN8D6b/DPiumi3KmAO93r5kpT7ywSYn1/JxY86OCQSAaCaTkUUzg35GRnkByrR1NRWPUqOfW9GtNZj96jX2wkc+Szd6LHOJAvkWz8T3FeEwIGukMcpY8MkfnorhkNyxW8pW76LXLPYQQOom7X/8ZRe+zuel9oJQLt9tmkeKt4iHg7dk7R0Qhp0SqJaQx/50tAd2Y0PfAUn8MFVAlZYGD1MSBdlc1LZqfHVwrX2Sy+V+e+BbPmMeg5pHuunJ4yg== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ElMhEMz6HlJ2jLRPE2yawVLoAYlixQONPIUqNY6/U5Y=; b=kV/QcburkDRCsLUCIB1dBY90yIHrU9nSBuA1c5ytsoGHxzFamsIgjqgZDoTS9i1wWNq5+dRPqCvxv5t1/fEOF02XlZwlHzMCLwRKHOU7ysrEY6Zy7xGIPCfPAAMP+4JQDLTW2eNKGD+rD43XcxKZrNwhoaz2K4JUQ0eus3btuanQRubzH0pLtxCiIGwiekNXF6vXg1y3pFtxRhtNaiqFp4HJ2y2QsqVe9ZQCpyMTflDY/H5XjTkB2vRxbg/eWLVEbEDqAum7Z5/a/GCKyykG89R0ZzL8f0avY/nSIfTYcee2F0sT09wavyTbKsR0wX6h0WuVKrxEjGwKTCidKj/t/g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ElMhEMz6HlJ2jLRPE2yawVLoAYlixQONPIUqNY6/U5Y=; b=nw337EbaJHfTNpCPbBQuxsyYRIbXp9ABHXVgvP/UnK2/xOZ93Z+4tJyyTwHvtPjLtKN9egfCQnoT/fNLAAZtNY2NPYSRxLHefeWIzvvlhFr7ms9BIf5T6Dbu2kmu0DUblfMby3laXgelkGqD5BIcqe5VMZLoD3sT6dfjMr/OdEs= Received: from CH2PR10MB4344.namprd10.prod.outlook.com (2603:10b6:610:af::19) by DS7PR10MB5280.namprd10.prod.outlook.com (2603:10b6:5:3a7::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6156.19; Fri, 3 Mar 2023 00:03:04 +0000 Received: from CH2PR10MB4344.namprd10.prod.outlook.com ([fe80::7030:ed2e:20d0:cd5b]) by CH2PR10MB4344.namprd10.prod.outlook.com ([fe80::7030:ed2e:20d0:cd5b%6]) with mapi id 15.20.6156.018; Fri, 3 Mar 2023 00:03:04 +0000 From: Qing Zhao To: Joseph Myers , Richard Biener CC: "siddhesh@gotplt.org" , "keescook@chromium.org" , "gcc-patches@gcc.gnu.org" Subject: Re: [v4][PATCH 1/2] Handle component_ref to a structre/union field including C99 FAM [PR101832] Thread-Topic: [v4][PATCH 1/2] Handle component_ref to a structre/union field including C99 FAM [PR101832] Thread-Index: AQHZSH697Ixa1oBBJk+QPQNZSvEShq7oNg6A Date: Fri, 3 Mar 2023 00:03:04 +0000 Message-ID: References: <20230224183505.4112295-1-qing.zhao@oracle.com> <20230224183505.4112295-2-qing.zhao@oracle.com> In-Reply-To: <20230224183505.4112295-2-qing.zhao@oracle.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: Apple Mail (2.3696.120.41.1.2) x-ms-publictraffictype: Email x-ms-traffictypediagnostic: CH2PR10MB4344:EE_|DS7PR10MB5280:EE_ x-ms-office365-filtering-correlation-id: d5c9bb8e-3d5e-4446-1607-08db1b7aa91f x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: fto4ZOQdEgmQAlCfVA5ISoB3PWcVtehArcPgbE3Hb4nRHqmb2L7i8oOLiti9NbFDAV51SnylLA2keLAUzqegCHhJZ5u7sYfmAsf8gB3HJE1koJdt2v0JY+DLkadf20pBhYpLxuao2/FNjN838rtEuSFjuU0FEyTzMp/U5tLeEv4Uu8qm08nDxiR4N5Z6m4P+htjNtxmbGNQgylXjZLtlVM1Ga2GX9qHAbul2qgLQdm98so2ADhU0Kg4mNnEp+PPqT1jZ18nVrAjwCU96o8IY7uRVhfOA+PlSB107OzPEIfSu8e0/k8FthxaDPokZGfY5lIOCxaKJ3aDSoNeDM5axO405Rl7mftXvOIAcH+/+d9p9jQC/z5ADhfZAt95pGHAMe4g/PWINDLaFUFlr88UdpkBIamfs851v1T6jGi2xZqSysCOptdPUTN5nRm/NOJd8zpY5gbpTP703VJxVzJ7dw7uNPrUBamGKTJAS7axNooFVmeSDqmXQ5N/sIG7gH0UKcIazGZKrJr3UOdzP3AqOi3yQc1kqDAQO28MeL/SsrryCxnRCxXoDp1k02SNbBqbtBMNVBnRuAxtv3KmgqtYejqZR4uEmMkCAxvjjDDy0mZ7QosmFvIKX3aKf/Svs99FQWS68Rxt33rOjpX8lxH1ND2V81P0jjGv5FGZVxM/4uDeNxRfrBLMlSS9IETvKE6gqM86lZOHiwPR3rDoXaz97xl1Hbg0hSxxXDYlkJ5y9R0k= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR10MB4344.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230025)(376002)(396003)(346002)(136003)(39860400002)(366004)(451199018)(36756003)(53546011)(6486002)(6512007)(2616005)(186003)(6506007)(26005)(41300700001)(316002)(54906003)(91956017)(110136005)(4326008)(66556008)(66476007)(30864003)(66446008)(66946007)(64756008)(2906002)(8676002)(76116006)(8936002)(71200400001)(5660300002)(122000001)(478600001)(33656002)(44832011)(38070700005)(38100700002)(86362001)(83380400001)(84970400001)(45980500001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?cG/0VzpMrMRz65Cpk+KR/aZGmY/vUF1idzSYOpO/yD/MRpafnAlfctOmtyBA?= =?us-ascii?Q?SgWhs67YLpeoXZz7I6ADRWNLMwFh7YMNMYsdoMXrMWvaqNL/2D+gXBmHSCR5?= =?us-ascii?Q?eqBaQr1qVd9T8OGGmRm28b9xeBwcIWh7kKFrz/sxe+xHUy17XJmEYEbqN0sJ?= =?us-ascii?Q?s5Ww78G2/nqVX2GrWYSPVvC0ITlI58Qox05hI6lBjKRGTcZmyVqhg3yMnulY?= =?us-ascii?Q?Om7XednakHRkIWyewGXv3OeT7R0za/QbGbkzXu3qk9F6Lil/WDU/wi4pKj9W?= =?us-ascii?Q?giB9iXXFdDKNrgjlxG30XrjVhqXiEPlRjmS57RL2KXJbyUz836/93D77CIf/?= =?us-ascii?Q?McTMdqIj9nv9RcnVlmeVw6VAt2GNQ17blq+JxRvSFklIJc5KzgKQ7YBa+jxr?= =?us-ascii?Q?shxQ77M1K2z7EHtip2YMpQDqfiGSIWvTmymOnl5BQMgVBvQgZrqzI4aWU9Dt?= =?us-ascii?Q?ikyPg5PEXJljCgjd9K9Irf1zob+OuVv+Zp7VNAEI8FdL5xPJnseeGGb+1gXs?= =?us-ascii?Q?HhKH9u+52JrN/WP9dLSAYyz7TX4h6gvfV/z3KxKCg0dFi4gOEn2NiPil3gdz?= =?us-ascii?Q?Jxk6WK/5KiBrbz6n4fcGzxB+QMG2DFRO1SoEbpwyn568HXChWnem/hoxkTtO?= =?us-ascii?Q?6OSh9TlHUMZ5c4/zWiAgOFDsPjbPZZEfH6UYoB11AeUa0KYaLfL3GxiMcrZv?= =?us-ascii?Q?FdZXFeRpUVf8mh7zxVV9Uhgraw7t2JzMjcAwUshqKHBS4SsGB1UfosTRt9et?= =?us-ascii?Q?Ukw0mXWjwQTMJaHxOGCU9n86NGsiGxDvjOwv7QVhdj98L3tvkkOb8g3jrzWL?= =?us-ascii?Q?eY5ZBU0IbjevBG6JTbKvYwh63tPciZHUXofguCuxSzgrGAZokJIzJBpURD0N?= =?us-ascii?Q?rp/6FlcH+i3e00jPCQ4GprBVoVjtuxmH8HGUikt+NVg8uT0mlrheUQ3p9O6F?= =?us-ascii?Q?LbOxOoJkFEGnrHoHcaxQJcBdM92iBKWQat2202vyITVVwv2gwSIVmbg8YuwK?= =?us-ascii?Q?Tq88zBiWx9Ls1naiH+4prO+hsgFb9xTw+uviP/m4g5+sBlDr/o2bLngmoPGz?= =?us-ascii?Q?Xu6f1eVjKnl5ShS83HwXetPylihTURsQYd+1nha6fY9DC2aGOfd3FXGF4iPv?= =?us-ascii?Q?kEXnRIu9QK1czDZPQjZALdi+3LQqagMQ8XF4SAwrJYsdZfMZZxrUX9ZgbI+E?= =?us-ascii?Q?B6Bfmwwg2VmJi3N6DCZzMT2nOW6KsyJkAk9ZJiwvjn5nzkW5xCcdBT3Ao34E?= =?us-ascii?Q?/RnqVru3I+DgGTBTAX3BPd4aA3t+Ja388wSiGyDbc1+l5MsoJu2AwxlQ+H9S?= =?us-ascii?Q?3sfF2/Z4DRHHkFcYEA0QKkYc//Haq/4Mxh0nXSFa95wLcwuwzLvvYzCPCU7f?= =?us-ascii?Q?+hUbsBKuxF02p9HuvEOsB+1MmyxkgTmgAGjw3oWvzn7Kk0fQnaIRZrKSd/Vz?= =?us-ascii?Q?0RPklWOuipMN4Lj3+C78LC8I4MVtMMyE+2tyEHnEe5Y9b+9JBQAFEJkgP11x?= =?us-ascii?Q?x85HPPVy9ndRAShAd6pEEbe26VFZzCPcwI2qJofK3bi9No6pGojCO46CBJ1M?= =?us-ascii?Q?CQIMxyQRf/WNWqi7B4eONBe8wxh91oceax+HCkv1BmN6njR35R896kkYMOxd?= =?us-ascii?Q?tA=3D=3D?= Content-Type: text/plain; charset="us-ascii" Content-ID: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: W7UAhAoDRs9RMdAD6LpfJiau1rumGiLNXHD6QgWyYjExwdCDrNtDToBD+I9asYSEaYSoVvUCHuFP1kIUTtUAYIgQC56oB1F+qvt50XN3piWdcv030IdnA4RHUlHRhlS5Nwf/0j7RMBm3Qw90IRPHl/ytv2G2l29SPfiZlriRgnWpffHb520auzKkNREh6oNI9t6e1pSVtkY31jEgMoU1YNoYy3c+kk0wbMPEgKhdhtxne5xXg7gknxcaHWJ4N2LxV51rOtbt1HqxbwRpv2Oakcd9A3kBVI8Q83FVK5G9HvfwAhk7W/3v2Xy8T7ETaoGvhpUNQs92jS0n+BbLWOaDJzy9NLh+CjYIJNzgJdkf+iPLB/wzm7+5rBzBus35SWZmtk1pRNhA4jE1h1AVFfGkqU2yHnLuL+HsQ38FvTAbLYJi7kDBm+xXKsMimzKOByPzDreaXTWBRI/jJZAf9v/4/AW45b8ZMxTI644XGyzwwAfu5fK2CdWjSgGyc3D/LkYQf3hwXvNKg5IxJri9cFz/SOOLOk0yBuM44ne+7nTbt8apGbFfwEX1V1lAajYYlPPh7MPRPmPAVWPBQQYI/Eaitrbe23Pg2jKojLkSCdZDz5AgdcsrXRmOU/5v/dEOmsFMG+aVf2ogmT9h984SJkBqEU5NGM0SVV/lWqCtDEUwqd9eMstnDo8Gg+HJbh7lMs+iyLPJZ3NYQxzMhE0OigqbaAqEmmRWHq/rA90owguQLyJhsxPzSC4CFkP6zH3Mjn85mNI0dvvNi4f7P6QIY0qfA0TOs0HrrcOzYSn+jefEG+MBVvNktJv1dM1b6Q/L5uY7B4LLPjUfBp/TVfTUR/ELWXw4EgHe8zUdejnnC2AsYiN7ytOM5RsL9K310js382lZ X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: CH2PR10MB4344.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d5c9bb8e-3d5e-4446-1607-08db1b7aa91f X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Mar 2023 00:03:04.0091 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: GPtO7s6o9VOk13uHdH3DHCS+FMXwhWhAwQ6OTmk/OnGttXUPCaf0VwL4CPor4w+UoQ5vSsYgSDTOX2jnbxyFCg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR10MB5280 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-03-02_15,2023-03-02_02,2023-02-09_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 malwarescore=0 spamscore=0 mlxscore=0 phishscore=0 suspectscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2212070000 definitions=main-2303020207 X-Proofpoint-ORIG-GUID: lPxP9_qWt1a1BF2mwq2b51QyehY0ZZFJ X-Proofpoint-GUID: lPxP9_qWt1a1BF2mwq2b51QyehY0ZZFJ X-Spam-Status: No, score=-10.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_STOCKGEN,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Ping. Qing > On Feb 24, 2023, at 1:35 PM, Qing Zhao wrote: >=20 > GCC extension accepts the case when a struct with a C99 flexible array me= mber > is embedded into another struct or union (possibly recursively). > __builtin_object_size should treat such struct as flexible size. >=20 > gcc/c/ChangeLog: >=20 > PR tree-optimization/101832 > * c-decl.cc (finish_struct): Set TYPE_INCLUDE_FLEXARRAY for > struct/union type. >=20 > gcc/cp/ChangeLog: >=20 > PR tree-optimization/101832 > * module.cc (trees_out::core_bools): Stream out new bit > type_include_flexarray. > (trees_in::core_bools): Stream in new bit type_include_flexarray. >=20 > gcc/ChangeLog: >=20 > PR tree-optimization/101832 > * print-tree.cc (print_node): Print new bit type_include_flexarray. > * tree-core.h (struct tree_type_common): New bit > type_include_flexarray. > * tree-object-size.cc (addr_object_size): Handle structure/union type > when it has flexible size. > * tree-streamer-in.cc (unpack_ts_type_common_value_fields): Stream > in new bit type_include_flexarray. > * tree-streamer-out.cc (pack_ts_type_common_value_fields): Stream > out new bit type_include_flexarray. > * tree.h (TYPE_INCLUDE_FLEXARRAY): New macro > TYPE_INCLUDE_FLEXARRAY. >=20 > gcc/testsuite/ChangeLog: >=20 > PR tree-optimization/101832 > * gcc.dg/builtin-object-size-pr101832.c: New test. > --- > gcc/c/c-decl.cc | 12 ++ > gcc/cp/module.cc | 2 + > gcc/print-tree.cc | 5 + > .../gcc.dg/builtin-object-size-pr101832.c | 134 ++++++++++++++++++ > gcc/tree-core.h | 4 +- > gcc/tree-object-size.cc | 79 +++++++---- > gcc/tree-streamer-in.cc | 1 + > gcc/tree-streamer-out.cc | 1 + > gcc/tree.h | 6 + > 9 files changed, 215 insertions(+), 29 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/builtin-object-size-pr101832.c >=20 > diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc > index 08078eadeb8..f589a2f5192 100644 > --- a/gcc/c/c-decl.cc > +++ b/gcc/c/c-decl.cc > @@ -9284,6 +9284,18 @@ finish_struct (location_t loc, tree t, tree fieldl= ist, tree attributes, > /* Set DECL_NOT_FLEXARRAY flag for FIELD_DECL x. */ > DECL_NOT_FLEXARRAY (x) =3D !is_flexible_array_member_p (is_last_fie= ld, x); >=20 > + /* Set TYPE_INCLUDE_FLEXARRAY for the context of x, t > + * when x is an array. */ > + if (TREE_CODE (TREE_TYPE (x)) =3D=3D ARRAY_TYPE) > + TYPE_INCLUDE_FLEXARRAY (t) =3D flexible_array_member_type_p (TREE_TYPE = (x)) ; > + /* Recursively set TYPE_INCLUDE_FLEXARRAY for the context of x, t > + when x is the last field. */ > + else if ((TREE_CODE (TREE_TYPE (x)) =3D=3D RECORD_TYPE > + || TREE_CODE (TREE_TYPE (x)) =3D=3D UNION_TYPE) > + && TYPE_INCLUDE_FLEXARRAY (TREE_TYPE (x)) > + && is_last_field) > + TYPE_INCLUDE_FLEXARRAY (t) =3D true; > + > if (DECL_NAME (x) > || RECORD_OR_UNION_TYPE_P (TREE_TYPE (x))) > saw_named_field =3D true; > diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc > index ac2fe66b080..c750361b704 100644 > --- a/gcc/cp/module.cc > +++ b/gcc/cp/module.cc > @@ -5371,6 +5371,7 @@ trees_out::core_bools (tree t) > WB (t->type_common.lang_flag_5); > WB (t->type_common.lang_flag_6); > WB (t->type_common.typeless_storage); > + WB (t->type_common.type_include_flexarray); > } >=20 > if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) > @@ -5551,6 +5552,7 @@ trees_in::core_bools (tree t) > RB (t->type_common.lang_flag_5); > RB (t->type_common.lang_flag_6); > RB (t->type_common.typeless_storage); > + RB (t->type_common.type_include_flexarray); > } >=20 > if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) > diff --git a/gcc/print-tree.cc b/gcc/print-tree.cc > index 1f3afcbbc86..efacdb7686f 100644 > --- a/gcc/print-tree.cc > +++ b/gcc/print-tree.cc > @@ -631,6 +631,11 @@ print_node (FILE *file, const char *prefix, tree nod= e, int indent, > && TYPE_CXX_ODR_P (node)) > fputs (" cxx-odr-p", file); >=20 > + if ((code =3D=3D RECORD_TYPE > + || code =3D=3D UNION_TYPE) > + && TYPE_INCLUDE_FLEXARRAY (node)) > + fputs (" include-flexarray", file); > + > /* The transparent-union flag is used for different things in > different nodes. */ > if ((code =3D=3D UNION_TYPE || code =3D=3D RECORD_TYPE) > diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-pr101832.c b/gcc/te= stsuite/gcc.dg/builtin-object-size-pr101832.c > new file mode 100644 > index 00000000000..60078e11634 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/builtin-object-size-pr101832.c > @@ -0,0 +1,134 @@ > +/* PR 101832:=20 > + GCC extension accepts the case when a struct with a C99 flexible arra= y > + member is embedded into another struct (possibly recursively). > + __builtin_object_size will treat such struct as flexible size. > + However, when a structure with non-C99 flexible array member, i.e, tr= ailing > + [0], [1], or [4], is embedded into anther struct, the stucture will n= ot > + be treated as flexible size. */=20 > +/* { dg-do run } */ > +/* { dg-options "-O2" } */ > + > +#include "builtin-object-size-common.h" > + > +#define expect(p, _v) do { \ > + size_t v =3D _v; \ > + if (p =3D=3D v) \ > + __builtin_printf ("ok: %s =3D=3D %zd\n", #p, p); \ > + else {\ > + __builtin_printf ("WAT: %s =3D=3D %zd (expected %zd)\n", #p, p, v); = \ > + FAIL (); \ > + } \ > +} while (0); > + > + > +struct A { > + int n; > + char data[]; > +}; > + > +struct B { > + int m; > + struct A a; > +}; > + > +struct C { > + int q; > + struct B b; > +}; > + > +struct A0 { > + int n; > + char data[0]; > +}; > + > +struct B0 { > + int m; > + struct A0 a; > +}; > + > +struct C0 { > + int q; > + struct B0 b; > +}; > + > +struct A1 { > + int n; > + char data[1]; > +}; > + > +struct B1 { > + int m; > + struct A1 a; > +}; > + > +struct C1 { > + int q; > + struct B1 b; > +}; > + > +struct An { > + int n; > + char data[8]; > +}; > + > +struct Bn { > + int m; > + struct An a; > +}; > + > +struct Cn { > + int q; > + struct Bn b; > +}; > + > +volatile void *magic1, *magic2; > + > +int main (int argc, char *argv[]) > +{ > + struct B *outer; > + struct C *outest; > + > + /* Make sure optimization can't find some other object size. */ > + outer =3D (void *)magic1; > + outest =3D (void *)magic2; > + > + expect (__builtin_object_size (&outer->a, 1), -1); > + expect (__builtin_object_size (&outest->b, 1), -1); > + expect (__builtin_object_size (&outest->b.a, 1), -1); > + > + struct B0 *outer0; > + struct C0 *outest0; > + > + /* Make sure optimization can't find some other object size. */ > + outer0 =3D (void *)magic1; > + outest0 =3D (void *)magic2; > + > + expect (__builtin_object_size (&outer0->a, 1), sizeof (outer0->a)); > + expect (__builtin_object_size (&outest0->b, 1), sizeof (outest0->b)); > + expect (__builtin_object_size (&outest0->b.a, 1), sizeof (outest0->b.a= )); > + > + struct B1 *outer1; > + struct C1 *outest1; > + > + /* Make sure optimization can't find some other object size. */ > + outer1 =3D (void *)magic1; > + outest1 =3D (void *)magic2; > + > + expect (__builtin_object_size (&outer1->a, 1), sizeof (outer1->a)); > + expect (__builtin_object_size (&outest1->b, 1), sizeof (outest1->b)); > + expect (__builtin_object_size (&outest1->b.a, 1), sizeof (outest1->b.a= )); > + > + struct Bn *outern; > + struct Cn *outestn; > + > + /* Make sure optimization can't find some other object size. */ > + outern =3D (void *)magic1; > + outestn =3D (void *)magic2; > + > + expect (__builtin_object_size (&outern->a, 1), sizeof (outern->a)); > + expect (__builtin_object_size (&outestn->b, 1), sizeof (outestn->b)); > + expect (__builtin_object_size (&outestn->b.a, 1), sizeof (outestn->b.a= )); > + > + DONE (); > + return 0; > +} > diff --git a/gcc/tree-core.h b/gcc/tree-core.h > index acd8deea34e..705d5702b9c 100644 > --- a/gcc/tree-core.h > +++ b/gcc/tree-core.h > @@ -1718,7 +1718,9 @@ struct GTY(()) tree_type_common { > unsigned empty_flag : 1; > unsigned indivisible_p : 1; > unsigned no_named_args_stdarg_p : 1; > - unsigned spare : 15; > + /* TYPE_INCLUDE_FLEXARRAY flag for RECORD_TYPE and UNION_TYPE. */ > + unsigned int type_include_flexarray : 1; > + unsigned spare : 14; >=20 > alias_set_type alias_set; > tree pointer_to; > diff --git a/gcc/tree-object-size.cc b/gcc/tree-object-size.cc > index 9a936a91983..22b3c72ea6e 100644 > --- a/gcc/tree-object-size.cc > +++ b/gcc/tree-object-size.cc > @@ -633,45 +633,68 @@ addr_object_size (struct object_size_info *osi, con= st_tree ptr, > v =3D NULL_TREE; > break; > case COMPONENT_REF: > - if (TREE_CODE (TREE_TYPE (v)) !=3D ARRAY_TYPE) > + /* When the ref is not to an array, a record or a union, it > + will not have flexible size, compute the object size > + directly. */ > + if ((TREE_CODE (TREE_TYPE (v)) !=3D ARRAY_TYPE) > + && (TREE_CODE (TREE_TYPE (v)) !=3D RECORD_TYPE) > + && (TREE_CODE (TREE_TYPE (v)) !=3D UNION_TYPE)) > { > v =3D NULL_TREE; > break; > } > - is_flexible_array_mem_ref =3D array_ref_flexible_size_p (v); > - while (v !=3D pt_var && TREE_CODE (v) =3D=3D COMPONENT_REF) > - if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) > - !=3D UNION_TYPE > - && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) > - !=3D QUAL_UNION_TYPE) > - break; > - else > - v =3D TREE_OPERAND (v, 0); > - if (TREE_CODE (v) =3D=3D COMPONENT_REF > - && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) > - =3D=3D RECORD_TYPE) > + if (TREE_CODE (TREE_TYPE (v)) =3D=3D RECORD_TYPE > + || TREE_CODE (TREE_TYPE (v)) =3D=3D UNION_TYPE) > + /* if the record or union does not include a flexible array > + recursively, compute the object size directly. */ > { > - /* compute object size only if v is not a > - flexible array member. */ > - if (!is_flexible_array_mem_ref) > + if (!TYPE_INCLUDE_FLEXARRAY (TREE_TYPE (v))) > { > v =3D NULL_TREE; > break; > } > - v =3D TREE_OPERAND (v, 0); > + else > + v =3D TREE_OPERAND (v, 0); > } > - while (v !=3D pt_var && TREE_CODE (v) =3D=3D COMPONENT_REF) > - if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) > - !=3D UNION_TYPE > - && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) > - !=3D QUAL_UNION_TYPE) > - break; > - else > - v =3D TREE_OPERAND (v, 0); > - if (v !=3D pt_var) > - v =3D NULL_TREE; > else > - v =3D pt_var; > + { > + /* Now the ref is to an array type. */ > + is_flexible_array_mem_ref > + =3D array_ref_flexible_size_p (v); > + while (v !=3D pt_var && TREE_CODE (v) =3D=3D COMPONENT_REF) > + if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) > + !=3D UNION_TYPE > + && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) > + !=3D QUAL_UNION_TYPE) > + break; > + else > + v =3D TREE_OPERAND (v, 0); > + if (TREE_CODE (v) =3D=3D COMPONENT_REF > + && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) > + =3D=3D RECORD_TYPE) > + { > + /* compute object size only if v is not a > + flexible array member. */ > + if (!is_flexible_array_mem_ref) > + { > + v =3D NULL_TREE; > + break; > + } > + v =3D TREE_OPERAND (v, 0); > + } > + while (v !=3D pt_var && TREE_CODE (v) =3D=3D COMPONENT_REF) > + if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) > + !=3D UNION_TYPE > + && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) > + !=3D QUAL_UNION_TYPE) > + break; > + else > + v =3D TREE_OPERAND (v, 0); > + if (v !=3D pt_var) > + v =3D NULL_TREE; > + else > + v =3D pt_var; > + } > break; > default: > v =3D pt_var; > diff --git a/gcc/tree-streamer-in.cc b/gcc/tree-streamer-in.cc > index d4dc30f048f..c19ede0631d 100644 > --- a/gcc/tree-streamer-in.cc > +++ b/gcc/tree-streamer-in.cc > @@ -390,6 +390,7 @@ unpack_ts_type_common_value_fields (struct bitpack_d = *bp, tree expr) > TYPE_TRANSPARENT_AGGR (expr) =3D (unsigned) bp_unpack_value (bp, 1)= ; > TYPE_FINAL_P (expr) =3D (unsigned) bp_unpack_value (bp, 1); > TYPE_CXX_ODR_P (expr) =3D (unsigned) bp_unpack_value (bp, 1); > + TYPE_INCLUDE_FLEXARRAY (expr) =3D (unsigned) bp_unpack_value (bp, = 1); > } > else if (TREE_CODE (expr) =3D=3D ARRAY_TYPE) > TYPE_NONALIASED_COMPONENT (expr) =3D (unsigned) bp_unpack_value (bp, = 1); > diff --git a/gcc/tree-streamer-out.cc b/gcc/tree-streamer-out.cc > index d107229da5c..73e4b4e547c 100644 > --- a/gcc/tree-streamer-out.cc > +++ b/gcc/tree-streamer-out.cc > @@ -357,6 +357,7 @@ pack_ts_type_common_value_fields (struct bitpack_d *b= p, tree expr) > bp_pack_value (bp, flag_wpa && TYPE_CANONICAL (expr) > ? TYPE_CXX_ODR_P (TYPE_CANONICAL (expr)) > : TYPE_CXX_ODR_P (expr), 1); > + bp_pack_value (bp, TYPE_INCLUDE_FLEXARRAY (expr), 1); > } > else if (TREE_CODE (expr) =3D=3D ARRAY_TYPE) > bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1); > diff --git a/gcc/tree.h b/gcc/tree.h > index 92ac0e6a214..ab1cdc3dc85 100644 > --- a/gcc/tree.h > +++ b/gcc/tree.h > @@ -778,6 +778,12 @@ extern void omp_clause_range_check_failed (const_tre= e, const char *, int, > #define TYPE_NO_NAMED_ARGS_STDARG_P(NODE) \ > (TYPE_CHECK (NODE)->type_common.no_named_args_stdarg_p) >=20 > +/* True if this RECORD_TYPE or UNION_TYPE includes a flexible array memb= er > + at the last field recursively. */ > +#define TYPE_INCLUDE_FLEXARRAY(NODE) \ > + (TYPE_CHECK (NODE)->type_common.type_include_flexarray) > + > + > /* In an IDENTIFIER_NODE, this means that assemble_name was called with > this string as an argument. */ > #define TREE_SYMBOL_REFERENCED(NODE) \ > --=20 > 2.31.1 >=20