This patch removes an infinite loop in the compiler, when an Ada 2012 iterator
is attempted over an object without proper iterable aspects, and the code is
compiled in SPARK mode.
Compiling iter.adb must yield:
iter.adb:12:21: cannot iterate over "R"
iter.adb:12:21: to iterate directly over the elements of a container,
write "of Obj"
---
procedure Iter is
pragma SPARK_Mode (On);
type R is record
X, Y, Z : Integer;
end record;
Obj : R;
function Sum (X : R) return Integer is
Result : Integer := 0;
begin
return Result : Integer := 0 Do
for Val in Obj loop
Result := Result + Val;
end loop;
end return;
end;
begin
if Sum (Obj) /= 0 then
null;
end if;
end;
Tested on x86_64-pc-linux-gnu, committed on trunk
2014-11-07 Ed Schonberg <[email protected]>
* sem_ch5.adb (Analyze_Iterator_Specification): return if name
in iterator does not have any usable aspect for iteration.
Index: sem_ch5.adb
===================================================================
--- sem_ch5.adb (revision 217215)
+++ sem_ch5.adb (working copy)
@@ -2063,6 +2063,10 @@
Error_Msg_NE
("\to iterate directly over the elements of a container, "
& "write `of &`", Name (N), Original_Node (Name (N)));
+
+ -- No point in continuing analysis of iterator spec.
+
+ return;
end if;
end if;