The frontend does not report an error on aspect clases defined in the
public part of a nested package that reference names defined in the
private part.
After this patch the error is reported on the following sources:
pragma Ada_2012;
with Ada.Text_IO;
use Ada.Text_IO;
procedure Small is
package Pack is
type T is tagged private
with Constant_Indexing => F; -- Error
private
function F
(Obj : T; S : String; Pos : Positive) return Character;
type T is tagged null record;
end Pack;
package body Pack is
function F
(Obj : T; S : String; Pos : Positive) return Character is
begin
return S (Pos);
end F;
end Pack;
use Pack;
V : T;
begin
Put (V ("abcd", 1));
Put (V ("abcd", 2));
New_Line;
end;
Command: gcc -c small.adb
Output:
small.adb:7:14: aspect must be fully defined before "T" is frozen
small.adb:7:35: "F" is undefined
Tested on x86_64-pc-linux-gnu, committed on trunk
2017-09-12 Javier Miranda <[email protected]>
* sem_ch3.adb (Analyze_Declarations): In nested
package declarations that have a private part enable missing check
of the RM rule 13.1.1(11/3): usage names in aspect definitions are
resolved at the end of the immediately enclosing declaration list.
Index: sem_ch3.adb
===================================================================
--- sem_ch3.adb (revision 251998)
+++ sem_ch3.adb (working copy)
@@ -2676,14 +2676,11 @@
and then not Is_Child_Unit (Current_Scope)
and then No (Generic_Parent (Parent (L)))
then
- -- This is needed in all cases to catch visibility errors in
- -- aspect expressions, but several large user tests are now
- -- rejected. Pending notification we restrict this call to
- -- ASIS mode.
+ -- ARM rule 13.1.1(11/3): usage names in aspect definitions are
+ -- resolved at the end of the immediately enclosing declaration
+ -- list (AI05-0183-1).
- if ASIS_Mode then
- Resolve_Aspects;
- end if;
+ Resolve_Aspects;
elsif L /= Visible_Declarations (Parent (L))
or else No (Private_Declarations (Parent (L)))