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>
* 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
processing to the back end in all cases where the pragma's
condition is not known at compile time during the front end
......
......@@ -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))
......
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,
......
-- { 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