[Ada] Inline_Always applied to a subprogram body without previous spec

Submitted by Arnaud Charlet on June 14, 2010, 10:50 a.m.


Message ID 20100614105033.GA5126@adacore.com
State New
Headers show

Commit Message

Arnaud Charlet June 14, 2010, 10:50 a.m.
When a pragma Inline_Always is applied to a subprogram body, the compiler
generates a spec to simplify subsequent inlinings of calls. The spec is
created by copying the analyzed spec of the body. There is no need for a
conformance spec between spec and body, and a conformance check may lead
to spurious conformance errors due to constant folding of static aggregates
in default expressions for formals.

The following must compile quietly:

procedure Inline is
   type R is record
      X, Y : Integer;
   end record;

   function Fun (It : R := (10, 20)) return Integer
      return It.X + It.Y;
   pragma Inline_Always (Fun);


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

2010-06-14  Ed Schonberg  <schonberg@adacore.com>

	* sem_ch6.adb (Analyze_Subprogram_Body): Do not check conformance when
	the spec has been generated for a body without spec that carries an
	Inline_Always pragma.

Patch hide | download patch | download mbox

Index: sem_ch6.adb
--- sem_ch6.adb	(revision 160720)
+++ sem_ch6.adb	(working copy)
@@ -2086,6 +2086,15 @@  package body Sem_Ch6 is
                Conformant := True;
+            --  Conversely, the spec may have been generated for specless body
+            --  with an inline pragma.
+            elsif Comes_From_Source (N)
+              and then not Comes_From_Source (Spec_Id)
+              and then Has_Pragma_Inline (Spec_Id)
+            then
+               Conformant := True;
                  (Body_Id, Spec_Id,