fcl-passrc: resolver: pass inlinespec as param

git-svn-id: trunk@43303 -
This commit is contained in:
Mattias Gaertner 2019-10-22 12:16:29 +00:00
parent 54f16d68be
commit b6631e3857
3 changed files with 74 additions and 1 deletions

View File

@ -11450,7 +11450,8 @@ begin
and ((C=TPrimitiveExpr)
or (C=TNilExpr)
or (C=TBoolConstExpr)
or (C=TProcedureExpr)) then
or (C=TProcedureExpr))
or (C=TInlineSpecializeExpr) then
// ok
else if C=TUnaryExpr then
AccessExpr(TUnaryExpr(Expr).Operand,Access)

View File

@ -156,6 +156,8 @@ type
procedure TestGenProc_Infer_ProcT;
procedure TestGenProc_Infer_Mismatch;
procedure TestGenProc_Infer_ArrayOfT;
procedure TestGenProc_Infer_PassAsArgDelphi;
procedure TestGenProc_Infer_PassAsArgObjFPC;
// ToDo procedure TestGenProc_Infer_ProcType;
// generic methods
@ -2342,6 +2344,43 @@ begin
ParseProgram;
end;
procedure TTestResolveGenerics.TestGenProc_Infer_PassAsArgDelphi;
begin
StartProgram(false);
Add([
'{$mode delphi}',
'function Run<T>(a: T): T;',
'var b: T;',
'begin',
' Run(Run<word>(3));',
' Run(Run(4));',
'end;',
'begin',
' Run(Run<word>(5));',
' Run(Run(6));',
'']);
ParseProgram;
end;
procedure TTestResolveGenerics.TestGenProc_Infer_PassAsArgObjFPC;
begin
StartProgram(false);
Add([
'{$mode objfpc}',
'{$ModeSwitch implicitfunctionspecialization}',
'generic function Run<T>(a: T): T;',
'var b: T;',
'begin',
' Run(specialize Run<word>(3));',
' Run(Run(4));',
'end;',
'begin',
' Run(specialize Run<word>(5));',
' Run(Run(6));',
'']);
ParseProgram;
end;
procedure TTestResolveGenerics.TestGenMethod_VirtualFail;
begin
StartProgram(false);

View File

@ -54,6 +54,7 @@ type
procedure TestGenProc_Infer_OverloadForward;
procedure TestGenProc_TypeInfo;
procedure TestGenProc_Infer_Widen;
procedure TestGenProc_Infer_PassAsArg;
// ToDo: FuncName:=
// generic methods
@ -1107,6 +1108,38 @@ begin
'']));
end;
procedure TTestGenerics.TestGenProc_Infer_PassAsArg;
begin
StartProgram(false);
Add([
'{$mode delphi}',
'function Run<T>(a: T): T;',
'var b: T;',
'begin',
' Run(Run<word>(3));',
' Run(Run(word(4)));',
'end;',
'begin',
' Run(Run<word>(5));',
' Run(Run(word(6)));',
'']);
ConvertProgram;
CheckSource('TestGenProc_Infer_PassAsArg',
LinesToStr([ // statements
'this.Run$s0 = function (a) {',
' var Result = 0;',
' var b = 0;',
' $mod.Run$s0($mod.Run$s0(3));',
' $mod.Run$s0($mod.Run$s0(4));',
' return Result;',
'};',
'']),
LinesToStr([ // $mod.$main
'$mod.Run$s0($mod.Run$s0(5));',
'$mod.Run$s0($mod.Run$s0(6));',
'']));
end;
procedure TTestGenerics.TestGenMethod_ObjFPC;
begin
StartProgram(false);