mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 16:19:28 +02:00
fcl-passrc: specialize varargs of t
git-svn-id: trunk@45526 -
This commit is contained in:
parent
651f5cb8a1
commit
73a2b46263
@ -17524,9 +17524,6 @@ var
|
|||||||
i: Integer;
|
i: Integer;
|
||||||
GenScope: TPasGenericScope;
|
GenScope: TPasGenericScope;
|
||||||
begin
|
begin
|
||||||
if GenEl.VarArgsType<>nil then
|
|
||||||
RaiseNotYetImplemented(20200524214316,GenEl,'specialize varargs of type');
|
|
||||||
|
|
||||||
if GenEl.GenericTemplateTypes<>nil then
|
if GenEl.GenericTemplateTypes<>nil then
|
||||||
begin
|
begin
|
||||||
GenScope:=TPasGenericScope(PushScope(SpecEl,TPasProcTypeScope));
|
GenScope:=TPasGenericScope(PushScope(SpecEl,TPasProcTypeScope));
|
||||||
@ -17548,6 +17545,8 @@ begin
|
|||||||
{$IFDEF CheckPasTreeRefCount},'TPasProcedureType.Args'{$ENDIF});
|
{$IFDEF CheckPasTreeRefCount},'TPasProcedureType.Args'{$ENDIF});
|
||||||
for i:=0 to SpecEl.Args.Count-1 do
|
for i:=0 to SpecEl.Args.Count-1 do
|
||||||
FinishArgument(TPasArgument(SpecEl.Args[i]));
|
FinishArgument(TPasArgument(SpecEl.Args[i]));
|
||||||
|
// varargs
|
||||||
|
SpecializeElType(GenEl,SpecEl,GenEl.VarArgsType,SpecEl.VarArgsType);
|
||||||
|
|
||||||
// calling convention and proc type modifiers
|
// calling convention and proc type modifiers
|
||||||
SpecEl.CallingConvention:=GenEl.CallingConvention;
|
SpecEl.CallingConvention:=GenEl.CallingConvention;
|
||||||
|
@ -95,6 +95,7 @@ type
|
|||||||
|
|
||||||
// generic external class
|
// generic external class
|
||||||
procedure TestGen_ExtClass_Array;
|
procedure TestGen_ExtClass_Array;
|
||||||
|
procedure TestGen_ExtClass_VarargsOfType;
|
||||||
|
|
||||||
// generic interface
|
// generic interface
|
||||||
procedure TestGen_ClassInterface;
|
procedure TestGen_ClassInterface;
|
||||||
@ -1561,6 +1562,33 @@ begin
|
|||||||
ParseProgram;
|
ParseProgram;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolveGenerics.TestGen_ExtClass_VarargsOfType;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add([
|
||||||
|
'{$mode objfpc}',
|
||||||
|
'{$modeswitch externalclass}',
|
||||||
|
'type',
|
||||||
|
' TJSObject = class external name ''Object''',
|
||||||
|
' end;',
|
||||||
|
' generic TGJSSet<T> = class external name ''Set''',
|
||||||
|
' constructor new(aElement1: T); varargs of T; overload;',
|
||||||
|
' function bind(thisArg: TJSObject): T; varargs of T;',
|
||||||
|
' end;',
|
||||||
|
' TJSWordSet = specialize TGJSSet<word>;',
|
||||||
|
'var',
|
||||||
|
' s: TJSWordSet;',
|
||||||
|
' w: word;',
|
||||||
|
'begin',
|
||||||
|
' s:=TJSWordSet.new(3);',
|
||||||
|
' s:=TJSWordSet.new(3,5);',
|
||||||
|
' w:=s.bind(nil);',
|
||||||
|
' w:=s.bind(nil,6);',
|
||||||
|
' w:=s.bind(nil,7,8);',
|
||||||
|
'']);
|
||||||
|
ParseProgram;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolveGenerics.TestGen_ClassInterface;
|
procedure TTestResolveGenerics.TestGen_ClassInterface;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
|
@ -36,6 +36,7 @@ type
|
|||||||
// ToDo: rename local const T
|
// ToDo: rename local const T
|
||||||
Procedure TestGen_Class_TypeCastSpecializesWarn;
|
Procedure TestGen_Class_TypeCastSpecializesWarn;
|
||||||
Procedure TestGen_Class_TypeCastSpecializesJSValueNoWarn;
|
Procedure TestGen_Class_TypeCastSpecializesJSValueNoWarn;
|
||||||
|
procedure TestGen_Class_VarArgsOfType;
|
||||||
|
|
||||||
// generic external class
|
// generic external class
|
||||||
procedure TestGen_ExtClass_Array;
|
procedure TestGen_ExtClass_Array;
|
||||||
@ -728,6 +729,45 @@ begin
|
|||||||
CheckResolverUnexpectedHints();
|
CheckResolverUnexpectedHints();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestGenerics.TestGen_Class_VarArgsOfType;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add([
|
||||||
|
'{$mode objfpc}',
|
||||||
|
'{$modeswitch externalclass}',
|
||||||
|
'type',
|
||||||
|
' TJSObject = class external name ''Object''',
|
||||||
|
' end;',
|
||||||
|
' generic TGJSSet<T> = class external name ''Set''',
|
||||||
|
' constructor new(aElement1: T); varargs of T; overload;',
|
||||||
|
' function bind(thisArg: TJSObject): T; varargs of T;',
|
||||||
|
' end;',
|
||||||
|
' TJSWordSet = specialize TGJSSet<word>;',
|
||||||
|
'var',
|
||||||
|
' s: TJSWordSet;',
|
||||||
|
' w: word;',
|
||||||
|
'begin',
|
||||||
|
' s:=TJSWordSet.new(3);',
|
||||||
|
' s:=TJSWordSet.new(3,5);',
|
||||||
|
' w:=s.bind(nil);',
|
||||||
|
' w:=s.bind(nil,6);',
|
||||||
|
' w:=s.bind(nil,7,8);',
|
||||||
|
'']);
|
||||||
|
ConvertProgram;
|
||||||
|
CheckSource('TestGen_Class_VarArgsOfType',
|
||||||
|
LinesToStr([ // statements
|
||||||
|
'this.s = null;',
|
||||||
|
'this.w = 0;',
|
||||||
|
'']),
|
||||||
|
LinesToStr([ // $mod.$main
|
||||||
|
'$mod.s = new Set(3);',
|
||||||
|
'$mod.s = new Set(3, 5);',
|
||||||
|
'$mod.w = $mod.s.bind(null);',
|
||||||
|
'$mod.w = $mod.s.bind(null, 6);',
|
||||||
|
'$mod.w = $mod.s.bind(null, 7, 8);',
|
||||||
|
'']));
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestGenerics.TestGen_ExtClass_Array;
|
procedure TTestGenerics.TestGen_ExtClass_Array;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
|
@ -874,10 +874,6 @@ type
|
|||||||
Procedure TestAsync_ProcType;
|
Procedure TestAsync_ProcType;
|
||||||
Procedure TestAsync_ProcTypeAsyncModMismatchFail;
|
Procedure TestAsync_ProcTypeAsyncModMismatchFail;
|
||||||
Procedure TestAsync_Inherited;
|
Procedure TestAsync_Inherited;
|
||||||
// ToDo: inherited;
|
|
||||||
// ToDo: inherited asyncproc;
|
|
||||||
// ToDo: await(inherited asyncproc);
|
|
||||||
// ToDo: i:=await(inherited asyncfunc)
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function LinesToStr(Args: array of const): string;
|
function LinesToStr(Args: array of const): string;
|
||||||
|
Loading…
Reference in New Issue
Block a user