Commit 516057d3 by Ed Schonberg Committed by Pierre-Marie de Rodat

[Ada] Error message on invalid conversion involving limited views

A type conversion may be illegal if the expression in the conversion has a
limited view of a type. This patch expands the error report to indicate the
presence of a limited view, and when the context is a package body it suggests
the addition of a regular with-clause to make the full view available.

Compiling client.adb must yield:

   client.adb:6:16: invalid conversion, not compatible with limited view
      of type "Map_Type" defined at maps.ads:2
   client.adb:6:16: add with_clause for "Maps" to current unit

----
package Maps is
  type Map_Type is null record;
end;
----
limited with Maps;
package Payloads is
  function Get_Map return access Maps.Map_Type;
end;
----
with Maps;
package Maps2 is
  type New_Map_Type is new Maps.Map_Type;
end;
----
with Maps2;
package Client is
  procedure Foo (Map : Maps2.New_Map_Type) is null;
  procedure Bar;
end;
----
with Payloads;
package body Client is
  procedure Bar is
  begin
     Foo (Maps2.New_Map_Type (Payloads.Get_Map.all));
  end;
end;

2018-05-21  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* sem_res.adb (Valid_Conversion): Improve error message on an illegal
	type conversion whose expression has a limited view of a type.

From-SVN: r260466
parent def6e435
2018-04-04 Ed Schonberg <schonberg@adacore.com>
* sem_res.adb (Valid_Conversion): Improve error message on an illegal
type conversion whose expression has a limited view of a type.
2018-05-21 Ed Schonberg <schonberg@adacore.com> 2018-05-21 Ed Schonberg <schonberg@adacore.com>
* exp_ch5.adb (Build_Formal_Container_Iteration): If source has * exp_ch5.adb (Build_Formal_Container_Iteration): If source has
......
...@@ -13011,8 +13011,33 @@ package body Sem_Res is ...@@ -13011,8 +13011,33 @@ package body Sem_Res is
-- Here we have a real conversion error -- Here we have a real conversion error
else else
Conversion_Error_NE
("invalid conversion, not compatible with }", N, Opnd_Type); -- Check for missing regular with_clause when only a limited view
-- of target is available.
if From_Limited_With (Opnd_Type)
and then In_Package_Body
then
Conversion_Error_NE
("invalid conversion, not compatible with limited view of }",
N, Opnd_Type);
Conversion_Error_NE ("\add with_clause for& to current unit!", N,
Scope (Opnd_Type));
elsif Is_Access_Type (Opnd_Type)
and then From_Limited_With (Designated_Type (Opnd_Type))
and then In_Package_Body
then
Conversion_Error_NE
("invalid conversion, not compatible with }", N, Opnd_Type);
Conversion_Error_NE ("\add with_clause for& to current unit!", N,
Scope (Designated_Type (Opnd_Type)));
else
Conversion_Error_NE
("invalid conversion, not compatible with }", N, Opnd_Type);
end if;
return False; return False;
end if; end if;
end Valid_Conversion; end Valid_Conversion;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment