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 41074383E809 for ; Tue, 9 Jun 2020 08:10:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 41074383E809 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 D1973117A88; Tue, 9 Jun 2020 04:10:06 -0400 (EDT) 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 eFo+NBnWJyJ6; Tue, 9 Jun 2020 04:10:06 -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 B8794117A77; Tue, 9 Jun 2020 04:10:06 -0400 (EDT) Received: by tron.gnat.com (Postfix, from userid 4862) id B58F1107; Tue, 9 Jun 2020 04:10:06 -0400 (EDT) Date: Tue, 9 Jun 2020 04:10:06 -0400 From: Pierre-Marie de Rodat To: gcc-patches@gcc.gnu.org Cc: Ed Schonberg Subject: [Ada] Ada2020 AI12-0282: Shared variable control aspects in generics Message-ID: <20200609081006.GA73794@adacore.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="xHFwDpU9dbj6ez1V" Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Spam-Status: No, score=-3.2 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, 09 Jun 2020 08:10:10 -0000 --xHFwDpU9dbj6ez1V Content-Type: text/plain; charset=us-ascii Content-Disposition: inline This patch refines the checks and the corresponding error messsages on the legality of instantiations where some formal objects and their corresponding actuals may carry Atomic, Atonic_Components, Volatile, Volatile_Components, Independent, or Independent_Components aspect specifications. The legality rules require exact match between formal and actual for the first four aspects, but not for the last two. For Atomic_Components and Volatile_Components we also check whether the actual is of an array type with the corresponding: aspect on its component type. Tested on x86_64-pc-linux-gnu, committed on trunk 2020-06-09 Ed Schonberg gcc/ada/ * sem_ch12.adb (Check_Shared_Variable_Control_Aspects): Require exact match between formal and actual for aspects Atomic, Atomic_Component, Volatile, and Volatile_Components. --xHFwDpU9dbj6ez1V Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="patch.diff" --- gcc/ada/sem_ch12.adb +++ gcc/ada/sem_ch12.adb @@ -12398,21 +12398,15 @@ package body Sem_Ch12 is procedure Check_Shared_Variable_Control_Aspects is begin if Ada_Version >= Ada_2020 then - if Is_Atomic (A_Gen_T) and then not Is_Atomic (Act_T) then + if Is_Atomic (A_Gen_T) /= Is_Atomic (Act_T) then Error_Msg_NE - ("actual for& must be an atomic type", Actual, A_Gen_T); + ("actual for& has different Atomic aspect", Actual, A_Gen_T); end if; - if Is_Volatile (A_Gen_T) and then not Is_Volatile (Act_T) then + if Is_Volatile (A_Gen_T) /= Is_Volatile (Act_T) then Error_Msg_NE - ("actual for& must be a Volatile type", Actual, A_Gen_T); - end if; - - if - Is_Independent (A_Gen_T) and then not Is_Independent (Act_T) - then - Error_Msg_NE - ("actual for& must be an Independent type", Actual, A_Gen_T); + ("actual for& has different Volatile aspect", + Actual, A_Gen_T); end if; -- We assume that an array type whose atomic component type @@ -12420,43 +12414,51 @@ package body Sem_Ch12 is -- aspect Has_Atomic_Components. This is a reasonable inference -- from the intent of AI12-0282, and makes it legal to use an -- actual that does not have the identical aspect as the formal. + -- Ditto for volatile components. - if Has_Atomic_Components (A_Gen_T) - and then not Has_Atomic_Components (Act_T) - then - if Is_Array_Type (Act_T) - and then Is_Atomic (Component_Type (Act_T)) - then - null; + declare + Actual_Atomic_Comp : constant Boolean := + Has_Atomic_Components (Act_T) + or else (Is_Array_Type (Act_T) + and then Is_Atomic (Component_Type (Act_T))); + begin + if Has_Atomic_Components (A_Gen_T) /= Actual_Atomic_Comp then + Error_Msg_NE + ("formal and actual for& must agree on atomic components", + Actual, A_Gen_T); + end if; + end; - else + declare + Actual_Volatile_Comp : constant Boolean := + Has_Volatile_Components (Act_T) + or else (Is_Array_Type (Act_T) + and then Is_Volatile (Component_Type (Act_T))); + begin + if Has_Volatile_Components (A_Gen_T) /= Actual_Volatile_Comp + then Error_Msg_NE - ("actual for& must have atomic components", + ("actual for& must have volatile components", Actual, A_Gen_T); end if; - end if; + end; - if Has_Independent_Components (A_Gen_T) - and then not Has_Independent_Components (Act_T) + -- The following two aspects do not require exact matching, + -- but only one-way agreement. See RM C.6. + + if Is_Independent (A_Gen_T) and then not Is_Independent (Act_T) then Error_Msg_NE - ("actual for& must have independent components", - Actual, A_Gen_T); + ("actual for& must have Independent aspect specified", + Actual, A_Gen_T); end if; - if Has_Volatile_Components (A_Gen_T) - and then not Has_Volatile_Components (Act_T) + if Has_Independent_Components (A_Gen_T) + and then not Has_Independent_Components (Act_T) then - if Is_Array_Type (Act_T) - and then Is_Volatile (Component_Type (Act_T)) - then - null; - - else - Error_Msg_NE - ("actual for& must have volatile components", - Actual, A_Gen_T); - end if; + Error_Msg_NE + ("actual for& must have Independent_Components specified", + Actual, A_Gen_T); end if; end if; end Check_Shared_Variable_Control_Aspects; --xHFwDpU9dbj6ez1V--