[Ada] Spurious error message on visibiliy change in aspect expression

Message ID 20181009150910.GA123269@adacore.com
State New
Headers show
  • [Ada] Spurious error message on visibiliy change in aspect expression
Related show

Commit Message

Pierre-Marie de Rodat Oct. 9, 2018, 3:09 p.m.
This patch removes an improper error message on a visibility change in
an aspect expression between the freeze point and the end of the
declaration list, when the expression involves a call to a instance of
Unchecked_Conversion and the enclosing package declaration has a package
body with multiple subprogram bodies.

The following must compile quietly:

package body Par.Rep is
   procedure Nothing is begin null; end;
   procedure Rien is begin null; end;
with Par.Loc;
package Par.Rep is
   type Rec is record
      X, Y : Integer;
   end record
      with Volatile;

   Thing2 : Unsigned_32 := 15;
   Thing3 : Rec
    with Volatile, Address => To_Address (Par.Loc.Flash_Base);
    procedure Nothing;
pragma Restrictions (No_Elaboration_Code);
with interfaces;  use interfaces;
pragma unreferenced (interfaces);
with Tp;       use Tp;
pragma unreferenced (Tp);
package Par is
end Par;
with Ada.Unchecked_Conversion;
with System;
with Interfaces; use Interfaces;
package Tp is
subtype system_address is unsigned_32;
   function to_address is new
      ada.unchecked_conversion (system_address, system.address);
   function To_32 is new
      ada.unchecked_conversion (System.Address, System_Address);
with TP; use TP;
package Par.Loc is
FLASH_BASE        : constant system_address := 16#0800_0000#;

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

2018-10-09  Ed Schonberg  <schonberg@adacore.com>


	* sem_ch6.adb (Fully_Conformant_Expressions): Handle properly
	the conformance check on an aspect expression that includes a
	call to an instance of Unchecked_Conversion, or more generally a
	call to an intrinsic operation.


--- gcc/ada/sem_ch6.adb
+++ gcc/ada/sem_ch6.adb
@@ -8932,7 +8932,17 @@  package body Sem_Ch6 is
               or else
                 (Chars (Entity (E1)) = Chars (Entity (E2))
                   and then Ekind (Entity (E1)) = E_Loop_Parameter
-                  and then Ekind (Entity (E2)) = E_Loop_Parameter);
+                  and then Ekind (Entity (E2)) = E_Loop_Parameter)
+              --  A call to an instantiation of Unchecked_Conversion is
+              --  rewritten with the name of the generated function
+              --  created for the instance, and this must be special-cased.
+              or else
+                 (Ekind (Entity (E1)) = E_Function
+                   and then Is_Intrinsic_Subprogram (Entity (E1))
+                   and then Is_Generic_Instance (Entity (E1))
+                   and then Entity (E2) = Alias (Entity (E1)));
          elsif Nkind (E1) = N_Expanded_Name
            and then Nkind (E2) = N_Expanded_Name