This fixes a problem with B test ND11001. There were actually three
problems reported
a) Bad use of Default_Component_Value, but this had already been
previously fixed.
b) Bad use of Invariant'Class, fixed as part of this patch
c) Failure to detect bad aspect on null body. This was actually
an issue of not detecting this after a previous error (i.e. a
B test splitting issue), but as part of this patch, this error
is now properly caught even if there are previous errors, which
avoids the need to split the test.
The following shows the three reported cases properly caught
and diagnosed (compiled with -gnatq -gnatld7 -gnatj55):
1. procedure BadAsp is
2. package P1 is
3. type Arr is private with
|
>>> aspect Default_Component_Value can only
apply to an array of scalar components
4. Default_Component_Value => 1;
5. private
6. type Arr is array (1 .. 10) of Integer;
7. end;
8.
9. package P2 is
10. type Rec is private with
11. Type_Invariant'Class => True;
|
>>> Type_Invariant'Class cannot be specified
for "Rec", can only be specified for a
tagged type
12. private
13. type Rec is null record;
14. end;
15.
16. package p3 is
17. type Priv is tagged null record;
18. procedure Prim1 (A : in out Priv);
19. end;
20.
21. package body P3 is
22. procedure Prim1 (A : in out Priv) is null
23. with Post'Class => True;
|
>>> aspect specification must appear in
subprogram declaration
24. end;
25.
26. begin
27. null;
28. end;
Tested on x86_64-pc-linux-gnu, committed on trunk
2014-07-31 Robert Dewar <[email protected]>
* freeze.adb (Freeze_Entity): Check for error of
Type_Invariant'Class applied to a untagged type.
* sem_ch6.adb (Analyze_Null_Procedure): Unconditionally rewrite
as null body, so that we perform error checks even if expansion
is off.
Index: freeze.adb
===================================================================
--- freeze.adb (revision 213289)
+++ freeze.adb (working copy)
@@ -4537,6 +4537,24 @@
return No_List;
end if;
+ -- Check for error of Type_Invariant'Class applied to a untagged type
+ -- (check delayed to freeze time when full type is available).
+
+ declare
+ Prag : constant Node_Id := Get_Pragma (E, Pragma_Invariant);
+ begin
+ if Present (Prag)
+ and then Class_Present (Prag)
+ and then not Is_Tagged_Type (E)
+ then
+ Error_Msg_NE
+ ("Type_Invariant''Class cannot be specified for &",
+ Prag, E);
+ Error_Msg_N
+ ("\can only be specified for a tagged type", Prag);
+ end if;
+ end;
+
-- Deal with special cases of freezing for subtype
if E /= Base_Type (E) then
Index: sem_ch6.adb
===================================================================
--- sem_ch6.adb (revision 213300)
+++ sem_ch6.adb (working copy)
@@ -1391,19 +1391,14 @@
end if;
else
- -- The null procedure is a completion
+ -- The null procedure is a completion. We unconditionally rewrite
+ -- this as a null body (even if expansion is not active), because
+ -- there are various error checks that are applied on this body
+ -- when it is analyzed (e.g. correct aspect placement).
Is_Completion := True;
-
- if Expander_Active then
- Rewrite (N, Null_Body);
- Analyze (N);
-
- else
- Designator := Analyze_Subprogram_Specification (Spec);
- Set_Has_Completion (Designator);
- Set_Has_Completion (Prev);
- end if;
+ Rewrite (N, Null_Body);
+ Analyze (N);
end if;
end Analyze_Null_Procedure;