This patch fixes a bug where if a protected function has a pragma
Inline, and has no local variables, and the body consists of a single
extended_return_statement, and the result type is an indefinite
composite subtype, and inlining is enabled, the compiler gives an error,
even though the program is legal.

Tested on x86_64-pc-linux-gnu, committed on trunk

2019-08-14  Bob Duff  <d...@adacore.com>

gcc/ada/

        * inline.adb (Check_And_Split_Unconstrained_Function): Ignore
        protected functions to get rid of spurious error. The
        transformation done by this procedure triggers legality errors
        in the generated code in this case.

gcc/testsuite/

        * gnat.dg/inline19.adb, gnat.dg/inline19.ads: New testcase.
--- gcc/ada/inline.adb
+++ gcc/ada/inline.adb
@@ -2041,6 +2041,8 @@ package body Inline is
          Original_Body   : Node_Id;
          Body_To_Analyze : Node_Id;
 
+      --  Start of processing for Build_Body_To_Inline
+
       begin
          pragma Assert (Current_Scope = Spec_Id);
 
@@ -2448,6 +2450,18 @@ package body Inline is
       elsif Present (Body_To_Inline (Decl)) then
          return;
 
+      --  Do not generate a body to inline for protected functions, because the
+      --  transformation generates a call to a protected procedure, causing
+      --  spurious errors. We don't inline protected operations anyway, so
+      --  this is no loss. We might as well ignore intrinsics and foreign
+      --  conventions as well -- just allow Ada conventions.
+
+      elsif not (Convention (Spec_Id) = Convention_Ada
+        or else Convention (Spec_Id) = Convention_Ada_Pass_By_Copy
+        or else Convention (Spec_Id) = Convention_Ada_Pass_By_Reference)
+      then
+         return;
+
       --  Check excluded declarations
 
       elsif Present (Declarations (N))

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/inline19.adb
@@ -0,0 +1,17 @@
+--  { dg-do compile }
+--  { dg-options "-O2" }
+
+package body Inline19 is
+
+   S : String := "Hello";
+
+   protected body P is
+      function F return String is
+      begin
+         return Result : constant String := S do
+            null;
+         end return;
+      end F;
+   end P;
+
+end Inline19;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/inline19.ads
@@ -0,0 +1,8 @@
+package Inline19 is
+
+   protected P is
+      function F return String;
+      pragma Inline (F);
+   end P;
+
+end Inline19;

Reply via email to