From patchwork Thu Jul 11 08:03:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre-Marie de Rodat X-Patchwork-Id: 1130686 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-504891-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=adacore.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="c9HF3HVA"; dkim-atps=neutral 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 45kpX34HQqz9sNF for ; Thu, 11 Jul 2019 18:05:39 +1000 (AEST) 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:cc:subject:message-id:mime-version:content-type; q=dns; s=default; b=dFo7qheKzxTMeXJJchSXRzsYTOoqMK6oaagRS6tPTK6YBlPrHH RnD5aNBrP+h9PeWiozP/XE3Cc0wKBSs/zVKYj4a7ORqxa2xjELZykQ7+cghZn8Ay dXlA4c9XXxRRaa0bgGVkpO98Ya+HUMchoKj7zJxEuCGfUIfBLIJLCLWxQ= 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:cc:subject:message-id:mime-version:content-type; s= default; bh=CSibR19pnlyIKVSevzO98Ile/3k=; b=c9HF3HVAnQ+TrnxZQX9R qow2HGWp5mCrC2Edz1taEufl0aQKVMQEFMO+loFi2mJzJLL6O3c0IjND4YV1cTrd 97wncSRc2/JiS3UCmPWpBuzQwpeaa6DA64/rSAoDwY9Z8v2dYOWyYJFVT8cBSlGs GcImcll+HEMvPvO+hv/mqbY= Received: (qmail 87776 invoked by alias); 11 Jul 2019 08:03:52 -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 87687 invoked by uid 89); 11 Jul 2019 08:03:51 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-11.9 required=5.0 tests=BAYES_00, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: rock.gnat.com Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 11 Jul 2019 08:03:49 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 24401561FB; Thu, 11 Jul 2019 04:03:45 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id MLsfvlVUczxQ; Thu, 11 Jul 2019 04:03:45 -0400 (EDT) Received: from tron.gnat.com (tron.gnat.com [IPv6:2620:20:4000:0:46a8:42ff:fe0e:e294]) by rock.gnat.com (Postfix) with ESMTP id 12BDB56019; Thu, 11 Jul 2019 04:03:45 -0400 (EDT) Received: by tron.gnat.com (Postfix, from userid 4862) id 115F56F7; Thu, 11 Jul 2019 04:03:45 -0400 (EDT) Date: Thu, 11 Jul 2019 04:03:45 -0400 From: Pierre-Marie de Rodat To: gcc-patches@gcc.gnu.org Cc: Justin Squirek Subject: [Ada] Pragma Unreferenced triggers undefined reference Message-ID: <20190711080344.GA95197@adacore.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-IsSubscribed: yes This patch corrects the generation of protected body declarations so that instances of pragma Unreferenced applied to formals don't falsly trigger undefined references. Tested on x86_64-pc-linux-gnu, committed on trunk 2019-07-11 Justin Squirek gcc/ada/ * exp_ch9.adb (Build_Private_Protected_Declaration): Add exception for the moving of pragmas to internally generated specs for pragma Unreferenced. gcc/testsuite/ * gnat.dg/unreferenced2.adb: New testcase. --- gcc/ada/exp_ch9.adb +++ gcc/ada/exp_ch9.adb @@ -3493,6 +3493,8 @@ package body Exp_Ch9 is procedure Move_Pragmas (From : Node_Id; To : Node_Id); -- Find all suitable source pragmas at the top of subprogram body From's -- declarations and insert them after arbitrary node To. + -- + -- Very similar to Move_Pragmas in sem_ch6 ??? --------------------- -- Analyze_Pragmas -- @@ -3544,7 +3546,14 @@ package body Exp_Ch9 is Next_Decl := Next (Decl); - if Nkind (Decl) = N_Pragma then + -- We add an exception here for Unreferenced pragmas since the + -- internally generated spec gets analyzed within + -- Build_Private_Protected_Declaration and will lead to spurious + -- warnings due to the way references are checked. + + if Nkind (Decl) = N_Pragma + and then Pragma_Name_Unmapped (Decl) /= Name_Unreferenced + then Remove (Decl); Insert_After (Insert_Nod, Decl); Insert_Nod := Decl; --- /dev/null new file mode 100644 +++ gcc/testsuite/gnat.dg/unreferenced2.adb @@ -0,0 +1,34 @@ +-- { dg-do compile } +-- { dg-options "-gnatf" } + +procedure Unreferenced2 is + + protected Example is + procedure Callme; + end Example; + + procedure Other (X : Boolean) is + begin + null; + end; + + protected body Example is + + procedure Internal (X : Boolean) is + pragma Unreferenced (X); + Y : Integer; + begin + Y := 3; + end Internal; + + procedure Callme is + begin + Internal (X => True); + end Callme; + + end Example; + +begin + Example.Callme; + Other (True); +end Unreferenced2;