[Ada] Incorrect error on inline protected function
authorBob Duff <duff@adacore.com>
Wed, 14 Aug 2019 09:52:24 +0000 (09:52 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 14 Aug 2019 09:52:24 +0000 (09:52 +0000)
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.

2019-08-14  Bob Duff  <duff@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.

From-SVN: r274467

gcc/ada/ChangeLog
gcc/ada/inline.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/inline19.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/inline19.ads [new file with mode: 0644]

index 4e7daba7635015e650f60a7ad40de51f67a77425..4063f93efd59d01b2b7388fad83fbee8f791ab8b 100644 (file)
@@ -1,3 +1,10 @@
+2019-08-14  Bob Duff  <duff@adacore.com>
+
+       * 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.
+
 2019-08-14  Bob Duff  <duff@adacore.com>
 
        * sem_prag.adb (Process_Compile_Time_Warning_Or_Error): Defer
index 05830e1a629fe8067bc21ebf60ea2eba05bae76d..5dbd9a14bd574aaf265eb9fcd2ef024dd94e73ac 100644 (file)
@@ -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))
index cff4e5ed0a94518e2e20c31ac0be5a9b19825f84..857505281f912dba9baad478cf8a3a3656471e43 100644 (file)
@@ -1,3 +1,7 @@
+2019-08-14  Bob Duff  <duff@adacore.com>
+
+       * gnat.dg/inline19.adb, gnat.dg/inline19.ads: New testcase.
+
 2019-08-14  Gary Dismukes  <dismukes@adacore.com>
 
        * gnat.dg/equal11.adb, gnat.dg/equal11_interface.ads,
diff --git a/gcc/testsuite/gnat.dg/inline19.adb b/gcc/testsuite/gnat.dg/inline19.adb
new file mode 100644 (file)
index 0000000..01be738
--- /dev/null
@@ -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;
diff --git a/gcc/testsuite/gnat.dg/inline19.ads b/gcc/testsuite/gnat.dg/inline19.ads
new file mode 100644 (file)
index 0000000..7a2d35c
--- /dev/null
@@ -0,0 +1,8 @@
+package Inline19 is
+
+   protected P is
+      function F return String;
+      pragma Inline (F);
+   end P;
+
+end Inline19;