> On Nov 27, 2018, at 5:35 PM, Sven Barth via fpc-pascal 
> <fpc-pascal@lists.freepascal.org> wrote:
> 
> 1) kSomeDays is a typed const so I get a load node instead of tsetconstnode, 
> which I need to need to know in order to make the name string. See the TODO’s 
> in tgenericparamdef.create.
> 
> type
>         TDay = (Mon, Tue, Wed);
>         TDays = set of TDay;
> const
>         kSomeDays:TDays = [Mon, Wed];
> 
> 
> var
>         d: specialize TMyRecord_Set<integer,kSomeDays>; // this doesn’t work
>         d: specialize TMyRecord_Set<integer,[Mon,Wed]>; // this works because 
> I get a set node
> 
> The difference between typed and untyped constants are available everywhere 
> else in the language as well, so I have no qualms (at least for now?) to 
> error out on them. 

You mean reject them? The default behavior is to get a type_e_type_id_expected 
error. They can be included easily but I don’t know how to get the set from the 
load node (I think it needs further parsing).

> 
> For sets I believe that this should work however (see here:  
> https://freepascal.org/docs-html/current/ref/refse9.html#x21-200002.1 ):
> 
> === code begin ===
> const
>   kSomeDays = [Mon, Wed];
> === code end ===

Yes, sets work because I get a setnode which I can operate on.

> 
> Did you try with the generic and the specialization in different units and 
> changing only one of the two? Though you might want to check whether 
> tstoreddef.ppuload (or wherever tdef.genericparas is initialized after a unit 
> load) correctly instantiated the tconstsym instances instead of ttypesym 
> ones. It might already work correctly, but better safe than sorry. 😅

That seems to work. Here is my test:

========================================

program gc_ppu;
uses
        gc_types_unit;

var
        a: TShortIntList;
begin
        a.dothis('hello’);
        GlobalShortIntList.dothis('world');
end.

========================================

unit gc_types_unit;
interface

type
        generic TList<T, const U:integer> = record
                const ID = U;
                public
                        list: array[0..U-1] of T;
                        procedure dothis (msg:string);
        end;

const
        kShortListLength = 128;
type
        TShortIntList = specialize TList<Shortint,kShortListLength>;

var
        GlobalShortIntList: TShortIntList;

implementation

procedure TList.dothis (msg:string);
begin
        writeln('message:',msg, ' high:', high(ID), ' constsize:', sizeof(ID), 
' structsize:', sizeof(self));
end;

end.


Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to