[Ada] Spurious error on private subtype of derived access type
This patch fixes a spurious type error on a dynamic predicate on a
subtype of a private type whose full view is a derived access type.
Prior to it, the base type of the subtype would appear to be the parent
type of the derived type instead of the derived type itself, leading to
problems downstream.
The following package must now compile quietly:
with S;
package T is
type B_Pointer is private;
Null_B_Pointer : constant B_Pointer;
function OK (B : B_Pointer) return Boolean is (B /= Null_B_Pointer);
subtype Valid_B_Pointer is B_Pointer
with Dynamic_Predicate => OK (Valid_B_Pointer);
private
type B_Pointer is new S.A_Pointer;
Null_B_Pointer : constant B_Pointer := B_Pointer (S.Null_A_Pointer);
end;
package S is
type A_Type is new Integer;
type A_Pointer is access A_Type;
Null_A_Pointer : constant A_Pointer := null;
end;
Moreover, it also plugs a loophole in the compiler whereby an
instantiation of a generic with a formal subprogram declaration nested
in an enclosing generic package would be done even if there was a
mismatch between an original and a derived types involved in the
instantiation.
The compiler must now gives the following error:
p.adb:11:43: no visible subprogram matches the specification for "Action"
on
with Q;
with R;
with G;
procedure P is
package My_G is new G (Q.T);
procedure Proc (Value : R.T) is null;
procedure Iter is new My_G.Iteration_G (Proc);
begin
null;
end;
with R;
package Q is
type T is new R.T;
end Q;
package R is
type T is private;
private
type T is access Integer;
end R;
generic
type Value_T is private;
package G is
generic
with procedure Action (Value : Value_T);
procedure Iteration_G;
end G;
package body G is
procedure Iteration_G is null;
end G;
2019-07-22 Eric Botcazou <ebotcazou@adacore.com>
gcc/ada/
* sem_ch3.adb (Complete_Private_Subtype): Rework the setting of
the Etype of the full view for full base types that cannot
contain any discriminant. Remove code and comment about it in
the main path.
From-SVN: r273681