+2016-04-18 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * sem_ch3.adb (Analyze_Object_Declaration): Do not consider
+ internally generated expressions when trying to determine whether
+ a formal parameter of a tagged type subject to Extensions_Visible
+ False is used to initialize an object.
+ * sem_ch4.adb (Analyze_Type_Conversion): Do not consider
+ internally generated expressions when trying to determine whether
+ a formal parameter of a tagged type subject to Extensions_Visible
+ False is used in a type conversion.
+
2016-04-18 Hristian Kirtchev <kirtchev@adacore.com>
* sem_res.adb (Is_Protected_Operation_Call):
-- A formal parameter of a specific tagged type whose related
-- subprogram is subject to pragma Extensions_Visible with value
-- "False" cannot be implicitly converted to a class-wide type by
- -- means of an initialization expression (SPARK RM 6.1.7(3)).
+ -- means of an initialization expression (SPARK RM 6.1.7(3)). Do
+ -- not consider internally generated expressions.
- if Is_Class_Wide_Type (T) and then Is_EVF_Expression (E) then
+ if Is_Class_Wide_Type (T)
+ and then Comes_From_Source (E)
+ and then Is_EVF_Expression (E)
+ then
Error_Msg_N
("formal parameter with Extensions_Visible False cannot be "
& "implicitly converted to class-wide type", E);
-- A formal parameter of a specific tagged type whose related subprogram
-- is subject to pragma Extensions_Visible with value "False" cannot
- -- appear in a class-wide conversion (SPARK RM 6.1.7(3)).
+ -- appear in a class-wide conversion (SPARK RM 6.1.7(3)). Do not check
+ -- internally generated expressions.
- if Is_Class_Wide_Type (Typ) and then Is_EVF_Expression (Expr) then
+ if Is_Class_Wide_Type (Typ)
+ and then Comes_From_Source (Expr)
+ and then Is_EVF_Expression (Expr)
+ then
Error_Msg_N
("formal parameter with Extensions_Visible False cannot be "
& "converted to class-wide type", Expr);
-- Boolean, then we know that the other operand cannot resolve to
-- Boolean (since we got no interpretations), but in that case we
-- pretty much know that the other operand should be Boolean, so
- -- resolve it that way (generating an error)
+ -- resolve it that way (generating an error).
elsif Nkind_In (N, N_Op_And, N_Op_Or, N_Op_Xor) then
if Etype (L) = Standard_Boolean then