fpc/tests/webtbs/tw18222.pp
paul 54b5172286 compiler: fix compiler crash (bug #0018222)
- don't use source pointeddef for copied tpointerdef,tclassrefdef if pointteddef is a forward def because in this case when forward def will be resolved copied def will point to garbage
  - put copied def into list of defs awaiting resolve if it was copied from forward def
  + test

git-svn-id: trunk@16575 -
2010-12-17 07:50:47 +00:00

129 lines
3.0 KiB
ObjectPascal

{ %norun }
program tw18222;
{$mode objfpc}{$H-}
uses sysutils;
type
TFoo = class
public
FooValue: Integer;
end;
PFoo = ^TFoo;
PFooTyped = type PFoo;
PPFoo = ^PFoo;
TFooClass = Class of TFoo;
PFooClass = ^TFooClass;
PPFooClass = ^PFooClass;
TMyAnsiString = AnsiString;
TMyOwnAnsiString = type AnsiString;
procedure FooFunc(
ArgAnsiString1: AnsiString; var ArgAnsiString2: AnsiString; const ArgAnsiString3: AnsiString;
ArgPAnsiString1: PAnsiString; var ArgPAnsiString2: PAnsiString; const ArgPAnsiString3: PAnsiString;
ArgChar1: Char; var ArgChar2: Char; const ArgChar3: Char;
ArgPChar1: PChar; var ArgPChar2: PChar; const ArgPChar3: PChar;
ArgQW1, ArgQW2: QWord;
Foo1, Foo1n: TFoo; var Foo2, Foo2n: TFoo;
pFoo1, pFoo1n: PFoo; var pFoo2, pFoo2n: PFoo;
FooClass1, FooClass1n: TFooClass; var FooClass2, FooClass2n: TFooClass;
pFooClass1, pFooClass1n: PFooClass; var pFooClass2, pFooClass2n: PFooClass
);
var
TestInt: Integer;
TesTShortString: String[10];
TestAnsiString: AnsiString;
TestMyAnsiString: TMyAnsiString;
TestMyOwnAnsiString: TMyOwnAnsiString;
TestPChar: PChar;
TestQW1: QWord;
TestQW2: QWord;
TestPPFoo: PPFoo;
//TestPFooTyped: PFooTyped;
TestPPFooClass: PPFooClass;
function SubFoo(var AVal1: Integer; AVal2: Integer) : Integer;
begin
AVal1 := 2 * AVal2;
Result := AVal2;
inc(AVal2); // First BreakBoint
end;
begin
TestInt := 3;
TesTShortString := IntToStr(TestInt) + ':';
TestAnsiString := TesTShortString + ' Foo';
TestMyAnsiString := TesTShortString + ' FooMy';
TestMyOwnAnsiString := TesTShortString + ' FooMyOwn';
TestPChar := @TestAnsiString[2];
TestQw1 := ArgQw1 + 1; dec(TestQW1);
TestQw2 := ArgQw2 + 1; dec(TestQW2);
TestPPFoo := @pFoo1;
TestPPFooClass := @pFooClass1;
SubFoo(TestInt, 5);
// access all values, so the will not be optimized away
writeln(TestPChar);
// params
writeln(ArgAnsiString1, ArgAnsiString2, ArgAnsiString3, ArgChar1, ArgChar2, ArgChar3); // breakpoint 2
writeln(ArgQw1, ArgQw1, TestQW1, TestQW2);
if (Foo1 is FooClass1) and (Foo2 is FooClass2) and (Foo1n = Foo2n) and (FooClass1 = FooClass2) then
writeln(Foo1.FooValue + foo2.FooValue);
end;
var
a1, a2, a3: ansistring;
a2p: PAnsiString;
c1, c2, c3: Char;
c2p: PChar;
f1, f2, fn: TFoo;
f1p, fnp: PFoo;
fc, fcn: TFooclass;
fcp, fcnp: PFooClass;
begin
a1 := 'abc'; a2 := 'def'; a3 := 'ghi';
a2p := @a2;
c1 := 'X'; c2 := 'Y'; c2 := 'Z';
c2p := @c2;
f1 := TFoo.Create;
f2 := TFoo.Create;
fn := nil;
f1p := @f1;
fnp := @fn;
fc := TFoo;
fcn := nil;
fcp := @fc;
fcnp := @fcp;
FooFunc(
a1, a2, a3,
@a1, a2p, @a3,
c1, c2, c3,
@c1, c2p, @c3,
//ArgQW1, ArgQW2: QWord;
139784704, 139784871,
//Foo1, Foo1n: TFoo; var Foo2, Foo2n: TFoo
f1, nil, f2, fn,
f1p, nil, f1p, fnp,
//FooClass1, FooClass1n: TFooclass; var FooClass2, FooClass2n: TFoo
TFoo, nil, fc, fcn,
fcp, nil, fcp, fcnp
);
FreeAndNil(f1);
FreeAndNil(f2);
end.