From patchwork Tue Aug 20 09:51:26 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: 1149999 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-507356-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="iBhOYM9w"; 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 46CR3J4s2bz9sBF for ; Tue, 20 Aug 2019 19:54:36 +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=VZ6x2CSii6NCvWrEjyX1W6YayYt8nSzC86mnQyupQF29ezjM2w qwoeDTCDCppLZkGldu8CYl/drlYN2ojsfRmmN+mJgrjGUuh4GPKHmROxFwGmRrLs aiDUTqKm5wDJhUI8t3//LCW9oYkU7eFX9RQzxrRStcqDJPqsXywHI2aLI= 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=bsd/ZqjD5VdI10IlmV/6uCoSwLg=; b=iBhOYM9wYJYx+tGq4D0Q GjeOURn5y6j/zkX/wlWjPWe5pBNhSzxsG2A8kJBqR6MIhGCdydm1A0OI7BkkhUOj 054tsXQkk5IgRRQdNaYXdOb9f+zXPt4bv1ZHk/NcsN8Zqw1ptLYVq8Pnu52ctkQ1 qz2kd2cyhZ6lK0P2mC4h7uw= Received: (qmail 123410 invoked by alias); 20 Aug 2019 09:51:41 -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 122318 invoked by uid 89); 20 Aug 2019 09:51:32 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-10.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, SPF_NEUTRAL autolearn=ham version=3.3.1 spammy= X-HELO: eggs.gnu.org Received: from eggs.gnu.org (HELO eggs.gnu.org) (209.51.188.92) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 20 Aug 2019 09:51:29 +0000 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i00nX-0005L6-6y for gcc-patches@gcc.gnu.org; Tue, 20 Aug 2019 05:51:28 -0400 Received: from rock.gnat.com ([205.232.38.15]:45507) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i00nX-0005Kq-1v for gcc-patches@gcc.gnu.org; Tue, 20 Aug 2019 05:51:27 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 7BBE5560BD; Tue, 20 Aug 2019 05:51:26 -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 fi1DajeoQoAo; Tue, 20 Aug 2019 05:51:26 -0400 (EDT) Received: from tron.gnat.com (tron.gnat.com [205.232.38.10]) by rock.gnat.com (Postfix) with ESMTP id 68867560BC; Tue, 20 Aug 2019 05:51:26 -0400 (EDT) Received: by tron.gnat.com (Postfix, from userid 4862) id 679DF63E; Tue, 20 Aug 2019 05:51:26 -0400 (EDT) Date: Tue, 20 Aug 2019 05:51:26 -0400 From: Pierre-Marie de Rodat To: gcc-patches@gcc.gnu.org Cc: Gary Dismukes Subject: [Ada] Illegal limited function call accepted in a type conversion Message-ID: <20190820095125.GA75518@adacore.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 205.232.38.15 X-IsSubscribed: yes It's illegal to call a function with a result of an immutably limited type inside a type conversion that's used in one of the special contexts that allow such a function call by itself (see RM 7.5 (2.1-2.10)), such as in the initialization expression of an object declaration. The compiler was recursively applying OK_For_Limited_Init_In_05 to the expression inside of a rewritten type conversion, rather than directly to the Original_Node itself (which is what was cased on to get to the type conversion case alternative), which allowed such illegal initialization, and that's corrected by this fix. However, when the expression is not a rewriting of a user-written conversion, the recursive call to OK_For_Limited_Init_In_05 must be applied to the Expression of the conversion. Tested on x86_64-pc-linux-gnu, committed on trunk 2019-08-20 Gary Dismukes gcc/ada/ * sem_ch3.adb (OK_For_Limited_Init_In_05): In the case of type conversions, apply the recursive call to the Original_Node of the expression Exp rather than the Expression of the Original_Node, in the case where Exp has been rewritten; otherwise, when Original_Node is the same as Exp, apply the recursive call to the Expression. (Check_Initialization): Revise condition for special check on type conversions of limited function calls to test Original_Node (avoiding spurious errors on expanded unchecked conversions applied to build-in-place dispatching calls). gcc/testsuite/ * gnat.dg/type_conv2.adb, gnat.dg/type_conv2.ads: New testcase. --- gcc/ada/sem_ch3.adb +++ gcc/ada/sem_ch3.adb @@ -11870,10 +11870,14 @@ package body Sem_Ch3 is else -- Specialize error message according to kind of illegal - -- initial expression. + -- initial expression. We check the Original_Node to cover + -- cases where the initialization expression of an object + -- declaration generated by the compiler has been rewritten + -- (such as for dispatching calls). - if Nkind (Exp) = N_Type_Conversion - and then Nkind (Expression (Exp)) = N_Function_Call + if Nkind (Original_Node (Exp)) = N_Type_Conversion + and then + Nkind (Expression (Original_Node (Exp))) = N_Function_Call then -- No error for internally-generated object declarations, -- which can come from build-in-place assignment statements. @@ -19648,8 +19652,20 @@ package body Sem_Ch3 is => return not Comes_From_Source (Exp) and then - OK_For_Limited_Init_In_05 - (Typ, Expression (Original_Node (Exp))); + -- If the conversion has been rewritten, check Original_Node + + ((Original_Node (Exp) /= Exp + and then + OK_For_Limited_Init_In_05 (Typ, Original_Node (Exp))) + + -- Otherwise, check the expression of the compiler-generated + -- conversion (which is a conversion that we want to ignore + -- for purposes of the limited-initialization restrictions). + + or else + (Original_Node (Exp) = Exp + and then + OK_For_Limited_Init_In_05 (Typ, Expression (Exp)))); when N_Explicit_Dereference | N_Indexed_Component --- /dev/null new file mode 100644 +++ gcc/testsuite/gnat.dg/type_conv2.adb @@ -0,0 +1,16 @@ +-- { dg-do compile } + +package body Type_Conv2 is + + function Wrap (X : Integer) return Root'Class is + begin + return Der_I'(X => X); + end Wrap; + + procedure Proc_Static is + D : constant Der_I := Der_I (Wrap (0)); -- { dg-error "initialization of limited object requires aggregate or function call" } + begin + null; + end Proc_Static; + +end Type_Conv2; --- /dev/null new file mode 100644 +++ gcc/testsuite/gnat.dg/type_conv2.ads @@ -0,0 +1,13 @@ +package Type_Conv2 is + + type Root is abstract tagged limited null record; + + type Der_I is new Root with record + X : Integer; + end record; + + function Wrap (X : Integer) return Root'Class; + + procedure Proc_Static; + +end Type_Conv2;