|
@@ -0,0 +1,52 @@
|
|
|
+{ Source provided for Free Pascal Bug Report 3778 }
|
|
|
+{ Submitted by "David Fuchs" on 2005-03-13 }
|
|
|
+{ e-mail: [email protected] }
|
|
|
+
|
|
|
+{$mode objfpc}
|
|
|
+
|
|
|
+type
|
|
|
+ a_class=class
|
|
|
+ procedure a_method;
|
|
|
+ function a_virtual_method:a_class; virtual;
|
|
|
+ end;
|
|
|
+ a_container=class
|
|
|
+ a_field:a_class;
|
|
|
+ end;
|
|
|
+
|
|
|
+var
|
|
|
+ already_called: boolean;
|
|
|
+ glob: a_class;
|
|
|
+ container_array: array[0..255] of a_container;
|
|
|
+ error : boolean;
|
|
|
+
|
|
|
+function a_function:byte;
|
|
|
+begin
|
|
|
+ if already_called then
|
|
|
+ begin
|
|
|
+ writeln('This can not possibly happen!');
|
|
|
+ error:=true;
|
|
|
+ end;
|
|
|
+ a_function:=255;
|
|
|
+ already_called:=true;
|
|
|
+end;
|
|
|
+
|
|
|
+function a_class.a_virtual_method:a_class;
|
|
|
+begin
|
|
|
+ a_virtual_method:=self;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure a_class.a_method;
|
|
|
+begin
|
|
|
+ {this statement somehow compiles into TWO calls to a_function!}
|
|
|
+ glob:=container_array[a_function].a_field.a_virtual_method;
|
|
|
+end;
|
|
|
+
|
|
|
+begin
|
|
|
+ already_called:=false;
|
|
|
+ glob:=a_class.create;
|
|
|
+ container_array[255]:=a_container.create;
|
|
|
+ container_array[255].a_field:=glob;
|
|
|
+ glob.a_method;
|
|
|
+ if error then
|
|
|
+ halt(1);
|
|
|
+end.
|