[Ada] Spurious error on freezing of tagged types in SPARK
Commit Message
SPARK RM 7.7(8) mandates that the freezing point of a tagged type must
occur within the so-called early call region of all its primitives.
This check may lead to spurious errors due to generated constructs being
considered in the search for the start of the early call region.
Tested on x86_64-pc-linux-gnu, committed on trunk
gcc/ada/
* sem_elab.adb (Is_Suitable_Construct): Fix for generated
constructs.
@@ -7346,7 +7346,7 @@ package body Sem_Elab is
-- is a byproduct of the parser. Such a null statement should be
-- excluded from the early call region because it carries the
-- source location of the "end" keyword, and may lead to confusing
- -- diagnistics.
+ -- diagnostics.
if Nkind (N) = N_Null_Statement
and then not Comes_From_Source (N)
@@ -7354,6 +7354,16 @@ package body Sem_Elab is
and then Nkind (Context) = N_Handled_Sequence_Of_Statements
then
return False;
+
+ -- Similarly, internally-generated objects and types may have
+ -- out-of-order source locations that confuse diagnostics, e.g.
+ -- source locations in the body for objects/types generated in
+ -- the spec.
+
+ elsif Nkind (N) in N_Full_Type_Declaration | N_Object_Declaration
+ and then not Comes_From_Source (N)
+ then
+ return False;
end if;
-- Otherwise only constructs which correspond to pure Ada