+2018-12-11 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_util.adb (Get_Actual_Subtype): Function can return type
+ mark.
+ (Get_Cursor_Type): Improve recovery and error message on a
+ misplaced First aspect for an iterable type.
+
2018-12-11 Hristian Kirtchev <kirtchev@adacore.com>
* checks.adb: Add with and use clauses for Sem_Mech.
else
Decl := Build_Actual_Subtype (Typ, N);
+
+ -- The call may yield a declaration, or just return the entity
+
+ if Decl = Typ then
+ return Typ;
+ end if;
+
Atyp := Defining_Identifier (Decl);
-- If Build_Actual_Subtype generated a new declaration then use it
if First_Op = Any_Id then
Error_Msg_N ("aspect Iterable must specify First operation", Aspect);
return Any_Type;
+
+ elsif not Analyzed (First_Op) then
+ Analyze (First_Op);
end if;
Cursor := Any_Type;
if Cursor = Any_Type then
Error_Msg_N
- ("No legal primitive operation First for Iterable type", Aspect);
+ ("primitive operation for Iterable type must appear "
+ & "in the same list of declarations as the type", Aspect);
end if;
return Cursor;
+2018-12-11 Ed Schonberg <schonberg@adacore.com>
+
+ * gnat.dg/iter4.adb: New testcase.
+
2018-12-11 Hristian Kirtchev <kirtchev@adacore.com>
* gnat.dg/valid4.adb, gnat.dg/valid4_pkg.adb,
--- /dev/null
+-- { dg-do compile }
+
+procedure Iter4 is
+ package Root is
+ type Result is tagged record
+ B : Boolean;
+ end record;
+
+ type T is tagged record
+ I : Integer;
+ end record
+ with Iterable => (First => Pkg.First, -- { dg-error "primitive operation for Iterable type must appear in the same list of declarations as the type" }
+ Next => Pkg.Next,
+ Has_Element => Pkg.Has_Element,
+ Element => Pkg.Element);
+
+ package Pkg is
+ function First (Dummy : T) return Natural is (0);
+ function Next (Dummy : T; Cursor : Natural) return Natural is
+ (Cursor + 1);
+ function Has_Element (Value : T; Cursor : Natural) return Boolean is
+ (Cursor <= Value.I);
+ function Element (Dummy : T; Cursor : Natural) return Result is
+ ((B => Cursor mod 2 = 0));
+ end Pkg;
+ end Root;
+
+ package Derived is
+ type T is new Root.T with record
+ C : Character;
+ end record;
+ end Derived;
+
+begin
+ null;
+end;