From patchwork Wed Nov 25 13:27:24 2020 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: 1406077 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=adacore.com Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Ch1tj0smNz9sVT for ; Thu, 26 Nov 2020 00:28:45 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 94D7D395BC24; Wed, 25 Nov 2020 13:27:41 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from rock.gnat.com (rock.gnat.com [205.232.38.15]) by sourceware.org (Postfix) with ESMTP id D0603395B81A for ; Wed, 25 Nov 2020 13:27:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D0603395B81A 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 DA0AE116DD0; Wed, 25 Nov 2020 08:27:24 -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 9glrqgUbwGEF; Wed, 25 Nov 2020 08:27:24 -0500 (EST) Received: from tron.gnat.com (tron.gnat.com [205.232.38.10]) by rock.gnat.com (Postfix) with ESMTP id B5808116DF1; Wed, 25 Nov 2020 08:27:24 -0500 (EST) Received: by tron.gnat.com (Postfix, from userid 4862) id B45BBD9; Wed, 25 Nov 2020 08:27:24 -0500 (EST) Date: Wed, 25 Nov 2020 08:27:24 -0500 From: Pierre-Marie de Rodat To: gcc-patches@gcc.gnu.org Subject: [Ada] Spurious error on instance with predicated actual Message-ID: <20201125132724.GA116044@adacore.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, 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: , Cc: Ed Schonberg Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" This patch removes an error on an instantiation when the actual is a scalar type with a dynamic predicate, and its bounds are compatible with those of the corresponding formal parameter. Section 4.9.1 of the RM specifies that subtypes S1 and S2 can be statically compatible even if S1 is not static, as long as all predicates of S2 also apply to S1. In particular this applies when S2 has no predicates, as is usually the case for generic formals. Tested on x86_64-pc-linux-gnu, committed on trunk gcc/ada/ * sem_eval.adb (Subtypes_Statically_Compatible): Scalar types with compatible static bounds are statically compatible if predicates are compatible, even if they are not static subtypes. Same for private types without discriminants. diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb --- a/gcc/ada/sem_eval.adb +++ b/gcc/ada/sem_eval.adb @@ -6311,11 +6311,13 @@ package body Sem_Eval is if Subtypes_Statically_Match (T1, T2) then return True; - -- If either subtype is nonstatic then they're not compatible + -- A scalar subtype S1 is compatible with S2 if their bounds + -- are static and compatible, even if S1 has dynamic predicates + -- and is thus non-static. Predicate compatibility has been + -- checked above. - elsif not Is_OK_Static_Subtype (T1) - or else - not Is_OK_Static_Subtype (T2) + elsif not Is_Static_Range (Scalar_Range (T1)) + or else not Is_Static_Range (Scalar_Range (T2)) then return False; @@ -6363,6 +6365,14 @@ package body Sem_Eval is and then not (Can_Never_Be_Null (T2) and then not Can_Never_Be_Null (T1)); + -- Private types without discriminants can be handled specially. + -- Predicate matching has been checked above. + + elsif Is_Private_Type (T1) + and then not Has_Discriminants (T1) + then + return not Has_Discriminants (T2); + -- All other cases else