-- { dg-do compile } with Ada.Tags.Generic_Dispatching_Constructor; use Ada.Tags; package body abstract1 is function New_T (Stream : not null access Root_Stream_Type'Class) return T'Class is function Construct is new Generic_Dispatching_Constructor (T, Root_Stream_Type'Class, Input); E : constant String := String'Input (Stream); I : constant Tag := Internal_Tag (E); begin return Construct (I, Stream); end New_T; function Input (Stream : not null access Root_Stream_Type'Class) return IT is begin return O : IT do Integer'Read (Stream, O.I); end return; end Input; function Input (Stream : not null access Root_Stream_Type'Class) return FT is begin return O : FT do Float'Read (Stream, O.F); end return; end Input; end abstract1;