From patchwork Tue Dec 1 19:35:14 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 551011 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 6247E140216 for ; Wed, 2 Dec 2015 06:35:28 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=rYWgc6zN; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:reply-to:mime-version:content-type; q=dns; s=default; b=cBBekoS0Qx3EleZl/67kiYoDP+afkr+DdbISHMRow5S mVM2vkNZ2ZM5Wv26huXhto47jXKD43sw/umIXvisNbl4QyIahjbrUUmnxbk/vtF3 pZOc5O76qR+rvYZH2Q8A5Vu1Ts6vgS697zjv9UDbgLZEPcB4NGeX5W3dT5PfKEDA = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:reply-to:mime-version:content-type; s=default; bh=+XBtGupCJc1PAY2N+Zy+PcOtKTg=; b=rYWgc6zNOCArhnD5x 6v/QYDG/AB7n3sy9kvkPYdQs5tnrtUcODzxD7ctv3kuhXWkbwBFh5xGMBrQknp8G DHrNjrjHs/xCUpAFdrDyLN2PSzzAV+LDelxxJv8H6NaIWNzHwAoOoN3MvCTHOaza 933LCjD4v13N78iZipuOdJw5x8= Received: (qmail 108097 invoked by alias); 1 Dec 2015 19:35:20 -0000 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 Received: (qmail 108085 invoked by uid 89); 1 Dec 2015 19:35:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, NO_DNS_FOR_FROM, T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mga11.intel.com Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 01 Dec 2015 19:35:19 +0000 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga102.fm.intel.com with ESMTP; 01 Dec 2015 11:35:15 -0800 X-ExtLoop1: 1 Received: from gnu-6.sc.intel.com ([172.25.70.52]) by orsmga002.jf.intel.com with ESMTP; 01 Dec 2015 11:35:14 -0800 Received: by gnu-6.sc.intel.com (Postfix, from userid 1000) id 8916B200DAC; Tue, 1 Dec 2015 11:35:14 -0800 (PST) Date: Tue, 1 Dec 2015 11:35:14 -0800 From: "H.J. Lu" To: gcc-patches@gcc.gnu.org Subject: [PATCH] PR c/68637: Rebuid array with the updated function pointer type Message-ID: <20151201193514.GA4445@intel.com> Reply-To: "H.J. Lu" MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.23 (2015-06-09) When we apply function attribute to array of function pointer, we need to rebuild array with the updated function pointer type. gcc/ PR c/68637 * attribs.c (decl_attributes): Rebuid array with the updated * function pointer type. gcc/testsuite/ PR c/68637 * gcc.target/i386/pr68637.c: New test. --- gcc/attribs.c | 18 +++++++++++++++++- gcc/testsuite/gcc.target/i386/pr68637.c | 10 ++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr68637.c diff --git a/gcc/attribs.c b/gcc/attribs.c index affb21d..0be5ebf 100644 --- a/gcc/attribs.c +++ b/gcc/attribs.c @@ -494,9 +494,18 @@ decl_attributes (tree *node, tree attributes, int flags) flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE; } + tree array_type = (TREE_CODE (*anode) == ARRAY_TYPE + ? *anode + : NULL_TREE); + if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE && TREE_CODE (*anode) != METHOD_TYPE) { + /* We need to rebuid array with the updated function pointer + type later. */ + if (array_type) + *anode = TREE_TYPE (*anode); + if (TREE_CODE (*anode) == POINTER_TYPE && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE)) @@ -617,7 +626,14 @@ decl_attributes (tree *node, tree attributes, int flags) if (fn_ptr_quals) fn_ptr_tmp = build_qualified_type (fn_ptr_tmp, fn_ptr_quals); if (DECL_P (*node)) - TREE_TYPE (*node) = fn_ptr_tmp; + { + if (array_type) + TREE_TYPE (*node) + = build_array_type (fn_ptr_tmp, + TYPE_DOMAIN (array_type)); + else + TREE_TYPE (*node) = fn_ptr_tmp; + } else { gcc_assert (TREE_CODE (*node) == POINTER_TYPE); diff --git a/gcc/testsuite/gcc.target/i386/pr68637.c b/gcc/testsuite/gcc.target/i386/pr68637.c new file mode 100644 index 0000000..c6fc6ba --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr68637.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target ia32 } } */ +/* { dg-options "-O2 -Werror " } */ + +extern void (*bar[10]) (int, int) __attribute__ ((regparm (2))); + +void +xxx (int i) +{ + bar[i] (1, 2); +}