Ada2012 Expression functions behave like default expressions in regards to
freezing rules: their declaration does not freeze, only a use of them (in a
call) freezes.
The following must compile quietly in Ada2012 mode:

---
with Interfaces; use Interfaces;
package Images is
   type RGBQUAD is record
      rgbBlue     : Unsigned_8;
      rgbGreen    : Unsigned_8;
      rgbRed      : Unsigned_8;
      rgbReserved : Unsigned_8;
   end record;

   type Color_Type is new Unsigned_32;

   type Image_Types is (Grey, RGB, RGBa);

   subtype Colornr_Range is Integer range 0 .. 255;
   type Color_Data_Header is array (Colornr_Range) of RGBQUAD;
   type Color_Data_Header_Ptr is access all Color_Data_Header;

   subtype Image_Byte is Unsigned_8;
   type Image_Data is array (Positive range <>,
                             Positive range <>) of Unsigned_8;
   for Image_Data'Alignment use 4;
   type Image_Data_Ptr is access all Image_Data;

   type Line_Type is
      record
         X_From, Y_From, X_Upto, Y_Upto : Integer;
         Color : Color_Type;
      end record;
   type Line_Array is array (Positive range <>) of Line_Type;
   subtype Linenr_Range is Integer range 1 .. 256;

   type Visual_Itec_Common_Header is
   record
      SequenceNr : Integer;
      Xaxis_Mirror : Boolean;
      Yaxis_Mirror : Boolean;
      Lines : Line_Array (Linenr_Range);
   end record;
   type Visual_Itec_Common_Header_Ptr is
     access constant Visual_Itec_Common_Header;

   type Image_Read_Properties is
     (Image_Width, Image_Height, Image_VerticalPitch, Image_BitsPerPixel,
      Image_XPelsPerMeter, Image_YPelsPerMeter);
   type Image_Write_Properties is (Image_XPelsPerMeter, Image_YPelsPerMeter);

   type Image_Header is private;

   type Image_Type (Height, Width, VerticalPitch : Positive) is
   limited record
      Header : Image_Header;
      Data : Image_Data (1 .. Height, 1 .. VerticalPitch);
   end record;
   type Image_Object is access all Image_Type;
   pragma No_Strict_Aliasing (Image_Object);
   Null_Image : constant Image_Object;

   type Image_Objects is array (Integer range <>) of Image_Object;

   procedure Set_Default_PixelsPerMeter (X, Y : Integer);
private
   type Image_Header is
      record
         ImageNr : Integer;
         Common : aliased Visual_Itec_Common_Header;
         Color_Data : aliased Color_Data_Header;
      end record;
   Null_Image : constant Image_Object := null;

   function Get_Color (Image : Image_Object;
                       Colornr : Colornr_Range) return RGBQUAD is
        (Image.Header.Color_Data (Colornr));
end Images;
---
package body Images is
   XPelsPerMeter : Integer := 5000;
   YPelsPerMeter : Integer := 5000;

   procedure Set_Default_PixelsPerMeter (X, Y : Integer) is
   begin
      XPelsPerMeter := X;
      YPelsPerMeter := Y;
   end Set_Default_PixelsPerMeter;
end Images;

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

2011-09-06  Ed Schonberg  <schonb...@adacore.com>

        * sem_res.adb (Resolve): An expression that is the body of an
        expression function does not freeze.

Index: sem_res.adb
===================================================================
--- sem_res.adb (revision 178565)
+++ sem_res.adb (working copy)
@@ -2810,8 +2810,17 @@
          --  default expression mode (the Freeze_Expression routine tests this
          --  flag and only freezes static types if it is set).
 
-         Freeze_Expression (N);
+         --  AI05-177 (Ada2012): Expression functions do not freeze. Only
+         --  their use (in an expanded call) freezes.
 
+         if Ekind (Current_Scope) /= E_Function
+           or else
+             Nkind (Original_Node (Unit_Declaration_Node (Current_Scope))) /=
+                                                        N_Expression_Function
+         then
+            Freeze_Expression (N);
+         end if;
+
          --  Now we can do the expansion
 
          Expand (N);

Reply via email to