specialization fails for generic declared inside of class / if specialize happens in method of that class

  • FPC 3.3.1 9d6b66c9 and also FPC 3.2.3
  • Windows 10 64 bit

The below gives Error: Parameters or result types cannot contain local type definitions. Use a separate type definition in a type block. if the generic is

  • declared nested in a class
  • specialized in a function of the nested class (or the generic within the nested class)

The error also happens if the specialization is within a local type block.

The same specialization can be done in local var blocks of methods outside the wrapper.


program p1;{$Mode objfpc}
type

  TFoo = class
    procedure       Foo2;
  end;

  generic TGen<T2: TObject> = class
    procedure       Foo2;
  end;

  TWrap1 = class
  public type
    generic TTest4<T2: TObject> = class
      procedure       Foo2;
    end;

  public
    procedure         P1;
  end;

var
  gTest4:  TWrap1.specialize TTest4<TObject>;

{ TFoo }

procedure TFoo.Foo2;
var
  v2:  TWrap1.specialize TTest4<TObject>;
begin
end;

procedure TGen.Foo2;
var
  v2:  TWrap1.specialize TTest4<TObject>;
begin
end;

// TWRAP1

procedure TWrap1.TTest4.Foo2;
var     // V2: project1.lpr(50,32) Error: Parameters or result types cannot contain local type definitions. Use a separate type definition in a type block.
  v2:  TWrap1.specialize TTest4<TObject>;
type
  x2 =  TWrap1.specialize TTest4<TObject>;
begin
end;

procedure TWrap1.P1;
var        // V2: project1.lpr(50,32) Error: Parameters or result types cannot contain local type definitions. Use a separate type definition in a type block.
  v2:  TWrap1.specialize TTest4<TObject>;
type
  x2 =  TWrap1.specialize TTest4<TObject>;
begin
end;

begin
end.