From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from rock.gnat.com (rock.gnat.com [IPv6:2620:20:4000:0:a9e:1ff:fe9b:1d1]) by sourceware.org (Postfix) with ESMTP id 2B261384A881 for ; Tue, 15 Dec 2020 11:42:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 2B261384A881 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=derodat@adacore.com Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id D90DC5615E; Tue, 15 Dec 2020 06:42:41 -0500 (EST) X-Virus-Scanned: Debian amavisd-new at gnat.com 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 dc22GDPFZ1YY; Tue, 15 Dec 2020 06:42:41 -0500 (EST) 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 B895756156; Tue, 15 Dec 2020 06:42:41 -0500 (EST) Received: by tron.gnat.com (Postfix, from userid 4862) id B71D68F; Tue, 15 Dec 2020 06:42:41 -0500 (EST) Date: Tue, 15 Dec 2020 06:42:41 -0500 From: Pierre-Marie de Rodat To: gcc-patches@gcc.gnu.org Cc: Justin Squirek Subject: [Ada] Postcondition checks performed before finalization Message-ID: <20201215114241.GA35267@adacore.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="cNdxnHkX5QqsyA0e" Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Spam-Status: No, score=-5.5 required=5.0 tests=BAYES_00, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP 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-List-Received-Date: Tue, 15 Dec 2020 11:42:45 -0000 --cNdxnHkX5QqsyA0e Content-Type: text/plain; charset=us-ascii Content-Disposition: inline This patch fixes an issue in the compiler whereby postconditions were incorrectly checked prior to the execution of finalization. Tested on x86_64-pc-linux-gnu, committed on trunk gcc/ada/ * contracts.adb, contracts.ads (Build_Postconditions_Procedure): Add declarations for Postcond_Enabled, Result_Object_For_Postcondition, and Return_Success_For_Postcond, and place all postconditions within an if statement to control their execution for interactions when cleanup actions get generated. (Get_Postcond_Enabled): Created to fetch object declared to handle new expansion of postconditions. (Get_Result_Object_For_Postcond): Created to fetch object declared to handle new expansion of postconditions. (Get_Return_Success_For_Postcond): Created to fetch object declared to handle new expansion of postconditions. * einfo.adb, einfo.ads: Modify flag Stores_Attribute_Old_Prefix to apply to constants, variables, and types. * exp_ch6.adb (Add_Return): Add assignment to Return_Success_For_Postcond. (Expand_Non_Function_Return): Add assignment to Return_Success_For_Postcond (Expand_Simple_Function_Return): Add assignment to Result_Object_For_Postcond and Return_Success_For_Postcond. * exp_ch7.adb (Build_Finalization_Master): Mark finalization masters which finalize types created store 'Old objects as storing 'Old objects. (Build_Finalizer): Created to generated a unified and special expansion for finalization when postconditions are present. (Build_Finalizer_Helper): Renamed Build_Finalizer and added parameter to facilitate the creation of separate finalization routines for 'Old objects and general objects. (Create_Finalizer): Add condition for the insertion of the finalizer spec to avoid malformed trees. (Expand_Cleanup_Actions): Move _postconditions and related declarations to the new declarative section. Fix the loop to properly stop at the subprogram declaration for the postconditions procedure and exclude its body from being moved to the new list of declarations to avoid freezing issues. * exp_prag.adb (Expand_Attributes): Mark temporary created to store 'Old objects as storing a 'Old attribute. * sem_ch6.adb (Find_What_Applies_To): Remove strange exception to postconditions when traversing the scope stack. * sem_prag.adb (Find_Related_Declaration_Or_Body): Use the newly created Enclosing_HSS function to find the HSS for a potentially nested statement. * sem_util.adb, sem_util.ads (Declare_Indirect_Temp): Mark types created to store 'Old objects as storing 'Old attributes. (Enclosing_HSS): Created to find the enclosing handled sequence of statements for a given statement. * snames.ads-tmpl: Add multiple names to aid in the expansion of finalization and to control the evaluation of postconditions. Including _finalization_controller, a new routine to centralize finalization actions and postcondition evaluation. --cNdxnHkX5QqsyA0e Content-Type: application/gzip Content-Disposition: attachment; filename="patch.diff.gz" Content-Transfer-Encoding: base64 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 --cNdxnHkX5QqsyA0e--