Commit dba246bf by Bob Duff Committed by Pierre-Marie de Rodat

[Ada] Incorrect error on inline protected function

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
parent 2d1439c7
2019-08-14 Bob Duff <duff@adacore.com> 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 * sem_prag.adb (Process_Compile_Time_Warning_Or_Error): Defer
processing to the back end in all cases where the pragma's processing to the back end in all cases where the pragma's
condition is not known at compile time during the front end condition is not known at compile time during the front end
......
...@@ -2041,6 +2041,8 @@ package body Inline is ...@@ -2041,6 +2041,8 @@ package body Inline is
Original_Body : Node_Id; Original_Body : Node_Id;
Body_To_Analyze : Node_Id; Body_To_Analyze : Node_Id;
-- Start of processing for Build_Body_To_Inline
begin begin
pragma Assert (Current_Scope = Spec_Id); pragma Assert (Current_Scope = Spec_Id);
...@@ -2448,6 +2450,18 @@ package body Inline is ...@@ -2448,6 +2450,18 @@ package body Inline is
elsif Present (Body_To_Inline (Decl)) then elsif Present (Body_To_Inline (Decl)) then
return; 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 -- Check excluded declarations
elsif Present (Declarations (N)) elsif Present (Declarations (N))
......
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> 2019-08-14 Gary Dismukes <dismukes@adacore.com>
* gnat.dg/equal11.adb, gnat.dg/equal11_interface.ads, * gnat.dg/equal11.adb, gnat.dg/equal11_interface.ads,
......
-- { 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;
package Inline19 is
protected P is
function F return String;
pragma Inline (F);
end P;
end Inline19;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment