Hi All!

After a multi-day debugging binge, I found the problem described in my previous email.

Quick summary:

Common Library has a unit which defines a generic class that itself is derived from a class from another unit of the same library.

Application Library has many units which specialize the generic class.

Compiling the Application LIbrary causes a "File not found" error giving the name of a valid file (the one declaring the generic) but in an incorrect directory, There is no indication of where the failure (file:line no) occurs. There is no sign of the file where the error message says it is (that part is correct, but why it happens is not).

A long series of tests determined that the error occurs in all files that specialize the generic class. I had not touched the file declaring the generic class in years.

The bug in my code was in the Common Library unit that declared the class from which the generic class was derived. FPC 3.0.0 did not detect the following error in the class declaration:

class function Load( TextIO : TTextIO; aParent : TPersists = nil ) : TPersists; virtual; overload; // Calls read afterwards

procedure Load( TextIO : TTextIO ); overload; // Loads without creating *<<< this was newly added and caused the p**roblem. fpc did not object!

*This module is many years old. I know now that the class function could have been replaced by a constructor, but that would require refactoring many working programs.

I added the procedure recently to simplify a lot of application code (which it did). It had been working without the error for a few days. I don't know what I did to trigger the failure, but once I did it would not go away (that in itself is problematic, I would have expected the failure right after I introduced the bug).

The first instance of the error occurred using Lazarus 1.7/fpc 3.0.0 on Raspbian. During the bug hunt, I copied the code to my laptop where it occurred using Lazarus 1.6RC2/fpc 3.0.0 on Linux Mint 17.3.

When I changed the code to:

class function Load( TextIO : TTextIO; aParent : TPersists = nil ) : TPersists; virtual; // Calls read afterwards

    procedure LoadExisting( TextIO : TTextIO );  // Loads without creating

and refactored, the errors disappeared and the recursion tests worked.

I believe this is a Compiler bug so I will post a bug report for fpc over the weekend.

Comments will be appreciated.

Don Ziesig


--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to