+2019-08-20 Gary Dismukes <dismukes@adacore.com>
+
+ * sem_ch3.adb (OK_For_Limited_Init_In_05): In the case of type
+ conversions, apply the recursive call to the Original_Node of
+ the expression Exp rather than the Expression of the
+ Original_Node, in the case where Exp has been rewritten;
+ otherwise, when Original_Node is the same as Exp, apply the
+ recursive call to the Expression.
+ (Check_Initialization): Revise condition for special check on
+ type conversions of limited function calls to test Original_Node
+ (avoiding spurious errors on expanded unchecked conversions
+ applied to build-in-place dispatching calls).
+
2019-08-20 Patrick Bernardi <bernardi@adacore.com>
* exp_aggr.adb (Expand_Record_Aggregate): Always convert a
else
-- Specialize error message according to kind of illegal
- -- initial expression.
+ -- initial expression. We check the Original_Node to cover
+ -- cases where the initialization expression of an object
+ -- declaration generated by the compiler has been rewritten
+ -- (such as for dispatching calls).
- if Nkind (Exp) = N_Type_Conversion
- and then Nkind (Expression (Exp)) = N_Function_Call
+ if Nkind (Original_Node (Exp)) = N_Type_Conversion
+ and then
+ Nkind (Expression (Original_Node (Exp))) = N_Function_Call
then
-- No error for internally-generated object declarations,
-- which can come from build-in-place assignment statements.
=>
return not Comes_From_Source (Exp)
and then
- OK_For_Limited_Init_In_05
- (Typ, Expression (Original_Node (Exp)));
+ -- If the conversion has been rewritten, check Original_Node
+
+ ((Original_Node (Exp) /= Exp
+ and then
+ OK_For_Limited_Init_In_05 (Typ, Original_Node (Exp)))
+
+ -- Otherwise, check the expression of the compiler-generated
+ -- conversion (which is a conversion that we want to ignore
+ -- for purposes of the limited-initialization restrictions).
+
+ or else
+ (Original_Node (Exp) = Exp
+ and then
+ OK_For_Limited_Init_In_05 (Typ, Expression (Exp))));
when N_Explicit_Dereference
| N_Indexed_Component
--- /dev/null
+-- { dg-do compile }
+
+package body Type_Conv2 is
+
+ function Wrap (X : Integer) return Root'Class is
+ begin
+ return Der_I'(X => X);
+ end Wrap;
+
+ procedure Proc_Static is
+ D : constant Der_I := Der_I (Wrap (0)); -- { dg-error "initialization of limited object requires aggregate or function call" }
+ begin
+ null;
+ end Proc_Static;
+
+end Type_Conv2;