mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 14:43:51 +02:00
* fixed missing reference counting in case a refcounted type was implicitly
type casted to a non-refcounted type, e.g. dynarray to pointer in Delphi mode (mantis #13820) git-svn-id: trunk@13195 -
This commit is contained in:
parent
17a7903e60
commit
966ebbf157
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -8873,6 +8873,7 @@ tests/webtbs/tw1375.pp svneol=native#text/plain
|
|||||||
tests/webtbs/tw1376.pp svneol=native#text/plain
|
tests/webtbs/tw1376.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw13763.pp svneol=native#text/plain
|
tests/webtbs/tw13763.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw13815.pp svneol=native#text/plain
|
tests/webtbs/tw13815.pp svneol=native#text/plain
|
||||||
|
tests/webtbs/tw13820.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw1398.pp svneol=native#text/plain
|
tests/webtbs/tw1398.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw1401.pp svneol=native#text/plain
|
tests/webtbs/tw1401.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw1407.pp svneol=native#text/plain
|
tests/webtbs/tw1407.pp svneol=native#text/plain
|
||||||
|
@ -88,10 +88,14 @@ interface
|
|||||||
}
|
}
|
||||||
function is_signed(def : tdef) : boolean;
|
function is_signed(def : tdef) : boolean;
|
||||||
|
|
||||||
{# Returns true whether def_from's range is comprised in def_to's if both are
|
{# Returns whether def_from's range is comprised in def_to's if both are
|
||||||
orddefs, false otherwise }
|
orddefs, false otherwise }
|
||||||
function is_in_limit(def_from,def_to : tdef) : boolean;
|
function is_in_limit(def_from,def_to : tdef) : boolean;
|
||||||
|
|
||||||
|
{# Returns whether def is reference counted }
|
||||||
|
function is_refcounted_type(def: tdef) : boolean;
|
||||||
|
|
||||||
|
|
||||||
{ function is_in_limit_value(val_from:TConstExprInt;def_from,def_to : tdef) : boolean;}
|
{ function is_in_limit_value(val_from:TConstExprInt;def_from,def_to : tdef) : boolean;}
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
@ -492,6 +496,15 @@ implementation
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function is_refcounted_type(def: tdef): boolean;
|
||||||
|
begin
|
||||||
|
result:=
|
||||||
|
def.needs_inittable and
|
||||||
|
not is_class(def);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ true, if p points to an open array def }
|
{ true, if p points to an open array def }
|
||||||
function is_open_string(p : tdef) : boolean;
|
function is_open_string(p : tdef) : boolean;
|
||||||
begin
|
begin
|
||||||
|
@ -1667,7 +1667,14 @@ implementation
|
|||||||
{ Only leave when there is no conversion to do.
|
{ Only leave when there is no conversion to do.
|
||||||
We can still need to call a conversion routine,
|
We can still need to call a conversion routine,
|
||||||
like the routine to convert a stringconstnode }
|
like the routine to convert a stringconstnode }
|
||||||
if convtype in [tc_equal,tc_not_possible] then
|
if (convtype in [tc_equal,tc_not_possible]) and
|
||||||
|
{ some conversions, like dynarray to pointer in Delphi
|
||||||
|
mode, must not be removed, because then we get memory
|
||||||
|
leaks due to missing temp finalization }
|
||||||
|
(not is_refcounted_type(left.resultdef) or
|
||||||
|
{ different kinds of refcounted types may need calls
|
||||||
|
to different kinds of refcounting helpers }
|
||||||
|
(resultdef=left.resultdef)) then
|
||||||
begin
|
begin
|
||||||
left.resultdef:=resultdef;
|
left.resultdef:=resultdef;
|
||||||
if (nf_explicit in flags) and (left.nodetype = addrn) then
|
if (nf_explicit in flags) and (left.nodetype = addrn) then
|
||||||
|
12
tests/webtbs/tw13820.pp
Normal file
12
tests/webtbs/tw13820.pp
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{ %opt=-gh }
|
||||||
|
|
||||||
|
program copytest;
|
||||||
|
|
||||||
|
var
|
||||||
|
S, D : array of Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
HaltOnNotReleased := true;
|
||||||
|
SetLength(S,4000);
|
||||||
|
D := Copy(Copy(S));
|
||||||
|
end.
|
Loading…
Reference in New Issue
Block a user