fpc/tests/test/trtti19.pp
marco 037583ef4e --- Merging r40654 into '.':
U    compiler/msg/errore.msg
--- Recording mergeinfo for merge of r40654 into '.':
 U   .
--- Merging r40656 into '.':
U    compiler/pdecvar.pas
A    tests/tbf/tb0266a.pp
A    tests/tbf/tb0266b.pp
--- Recording mergeinfo for merge of r40656 into '.':
 G   .
--- Merging r41308 into '.':
U    tests/webtbs/tw35027.pp
--- Recording mergeinfo for merge of r41308 into '.':
 G   .
--- Merging r41829 into '.':
U    compiler/htypechk.pas
U    compiler/ncal.pas
A    tests/tbs/tb0656.pp
--- Recording mergeinfo for merge of r41829 into '.':
 G   .
--- Merging r42511 into '.':
U    packages/rtl-objpas/src/inc/rtti.pp
U    rtl/objpas/typinfo.pp
U    tests/test/trtti19.pp
--- Recording mergeinfo for merge of r42511 into '.':
 G   .

# revisions: 40654,40656,41308,41829,42511

git-svn-id: branches/fixes_3_2@43410 -
2019-11-07 10:04:13 +00:00

86 lines
2.1 KiB
ObjectPascal

program trtti19;
{$mode objfpc}
uses
TypInfo;
type
TTestProc = procedure(var arg1; out arg2; constref arg3);
TTestMethod = procedure(var arg1; out arg2; constref arg3) of object;
PParamFlags = ^TParamFlags;
PPPTypeInfo = ^PPTypeInfo;
var
ti: PTypeInfo;
td: PTypeData;
procparam: PProcedureParam;
pb: PByte;
i: SizeInt;
begin
// writeln(SizeOf(TparamFlags));
ti := PTypeInfo(TypeInfo(TTestProc));
td := GetTypeData(ti);
if td^.ProcSig.ParamCount <> 3 then
Halt(1);
procparam := td^.ProcSig.GetParam(0);
if Assigned(procparam^.ParamType) then
Halt(2);
if procparam^.ParamFlags * [pfVar] <> [pfVar] then
Halt(3);
procparam := td^.ProcSig.GetParam(1);
if Assigned(procparam^.ParamType) then
Halt(4);
if procparam^.ParamFlags * [pfOut] <> [pfOut] then
Halt(5);
procparam := td^.ProcSig.GetParam(2);
if Assigned(procparam^.ParamType) then
Halt(6);
if procparam^.ParamFlags * [pfConstRef] <> [pfConstRef] then
Halt(7);
ti := PTypeInfo(TypeInfo(TTestMethod));
td := GetTypeData(ti);
if td^.ParamCount <> 4 then
Halt(8);
pb := @td^.ParamList[0];
pb := AlignTParamFlags(pb);
if PParamFlags(pb)^ * [pfHidden, pfSelf] <> [pfHidden, pfSelf] then
Halt(9);
pb := pb + SizeOf(TParamFlags);
pb := pb + SizeOf(Byte) + pb^;
pb := pb + SizeOf(Byte) + pb^;
pb := AlignTParamFlags(pb);
if PParamFlags(pb)^ * [pfVar] <> [pfVar] then
Halt(10);
pb := pb + SizeOf(TParamFlags);
pb := pb + SizeOf(Byte) + pb^;
pb := pb + SizeOf(Byte) + pb^;
pb := AlignTParamFlags(pb);
if PParamFlags(pb)^ * [pfOut] <> [pfOut] then
Halt(11);
pb := pb + SizeOf(TParamFlags);
pb := pb + SizeOf(Byte) + pb^;
pb := pb + SizeOf(Byte) + pb^;
pb := AlignTParamFlags(pb);
if PParamFlags(pb)^ * [pfConstRef] <> [pfConstRef] then
Halt(12);
pb := pb + SizeOf(TParamFlags);
pb := pb + SizeOf(Byte) + pb^;
pb := pb + SizeOf(Byte) + pb^;
pb := AlignPTypeInfo(pb + SizeOf(TCallConv));
for i := 1 to td^.ParamCount - 1 do begin
if PPPTypeInfo(pb)[i] <> Nil then begin
Writeln(PPPTypeInfo(pb)[i]^^.Name);
Halt(12 + i);
end;
end;
Writeln('ok');
end.