Browse Source

fcl-passrc: resolver: pass inlinespec as param

git-svn-id: trunk@43303 -
Mattias Gaertner 5 years ago
parent
commit
b6631e3857

+ 2 - 1
packages/fcl-passrc/src/pasresolver.pp

@@ -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)

+ 39 - 0
packages/fcl-passrc/tests/tcresolvegenerics.pas

@@ -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);

+ 33 - 0
packages/pastojs/tests/tcgenerics.pas

@@ -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);