procedure limfunction  is 
    package pkg is 
        type T is limited private;
        function init(x, y: integer) return T;
    private
        type T is record a, b: integer; end record;
    end pkg;

    package body pkg is 
        function init(x, y: integer) return T is 
        begin
            -- Extended return allows limited private constant assignment
            return result: T do
                result := (a => x, b => y);
            end return;
            -- return result: T := (a => x, b => y);  -- Shorter version
        end init;
    end pkg;

    use pkg;

    theT1: constant T := init(1,2);

begin
    null;
end  limfunction;