[fpc-pascal] private type and type compatibility

Michael Van Canneyt michael at freepascal.org
Wed Oct 30 11:38:57 CET 2013



On Wed, 30 Oct 2013, Sven Barth wrote:

> Am 30.10.2013 10:36, schrieb Michael Van Canneyt:
>> 
>> 
>> On Wed, 30 Oct 2013, Sven Barth wrote:
>> 
>>> Am 30.10.2013 08:47, schrieb Xiangrong Fang:
>>>       Hi All,
>>>
>>>       I have the following class:
>>>
>>>       type
>>>         generic TVector<T> = class
>>>         private type
>>>           TDataType = array of T;
>>>         private
>>>           FData: TDataType;
>>>           ... ...
>>>         public
>>>           ... ...
>>>           function Slice(APos: Integer = -1; ACount: Integer = -1): 
>>> TDataType;
>>>         end;
>>> 
>>> The Slice() method return a portion of the data as a dynamic array.
>>> 
>>> My question is, as I define TDataType as PRIVATE type, why it is still 
>>> usable outside of the class?  In the main program
>>> I did:
>>> 
>>> type
>>>   TIntVector = specialize TVector<Integer>;
>>> var
>>>   iv: TIntVector;
>>>   ia: array of Integer;
>>> begin
>>>   iv := TIntVector.Create;
>>>   ... ...
>>>   ia := iv.Slice;
>>> end.
>>> 
>>> This will assign a TDataType (is it TVector$TDataType or 
>>> TIntVector$TDataType? I don't know) to an "array of Integer".
>>> Why this assignment works?
>>> 
>>> i.e. how does the type system work?!
>>> 
>>> It's a bit annoying that the usage private/protected types in 
>>> public/published functions is allowed... (this is however Delphi
>>> compatible) Maybe this should be adjusted for non-Delphi modes for 
>>> language consistency... (maybe at least as a warning which
>>> could be elevated to an error if someone wants)
>> 
>> I think it is an error. You declare something as private, and then you use 
>> it in a public function ? If that is not a visibility clash, I don't know 
>> what is :)
> I agree, but the question is should we declare this as a bug in the language 
> and thus fix it which might lead to adjustments of legacy (2.6.x) code or use 
> a warning. I personally would do the former (and better sooner than later).

Me too. It is a bug, and should be treated as such.

Micihael.



More information about the fpc-pascal mailing list