mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 13:06:18 +02:00
+ support TP7-compatible @proc^ (as in FillChar(@proc^,...))
git-svn-id: trunk@39343 -
This commit is contained in:
parent
5de8f0cf69
commit
e813a11e85
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -11551,6 +11551,8 @@ tests/tbs/tb0644.pp svneol=native#text/pascal
|
|||||||
tests/tbs/tb0645a.pp svneol=native#text/pascal
|
tests/tbs/tb0645a.pp svneol=native#text/pascal
|
||||||
tests/tbs/tb0645b.pp svneol=native#text/pascal
|
tests/tbs/tb0645b.pp svneol=native#text/pascal
|
||||||
tests/tbs/tb0645c.pp svneol=native#text/pascal
|
tests/tbs/tb0645c.pp svneol=native#text/pascal
|
||||||
|
tests/tbs/tb0646a.pp svneol=native#text/pascal
|
||||||
|
tests/tbs/tb0646b.pp svneol=native#text/pascal
|
||||||
tests/tbs/tb205.pp svneol=native#text/plain
|
tests/tbs/tb205.pp svneol=native#text/plain
|
||||||
tests/tbs/tb610.pp svneol=native#text/pascal
|
tests/tbs/tb610.pp svneol=native#text/pascal
|
||||||
tests/tbs/tb613.pp svneol=native#text/plain
|
tests/tbs/tb613.pp svneol=native#text/plain
|
||||||
|
@ -2767,7 +2767,7 @@ implementation
|
|||||||
wasgenericdummy,
|
wasgenericdummy,
|
||||||
allowspecialize,
|
allowspecialize,
|
||||||
isspecialize,
|
isspecialize,
|
||||||
unit_found : boolean;
|
unit_found, tmpgetaddr: boolean;
|
||||||
dummypos,
|
dummypos,
|
||||||
tokenpos: tfileposinfo;
|
tokenpos: tfileposinfo;
|
||||||
spezcontext : tspecializationcontext;
|
spezcontext : tspecializationcontext;
|
||||||
@ -3182,8 +3182,13 @@ implementation
|
|||||||
callflags:=[]
|
callflags:=[]
|
||||||
else
|
else
|
||||||
callflags:=[cnf_unit_specified];
|
callflags:=[cnf_unit_specified];
|
||||||
do_proc_call(srsym,srsymtable,nil,
|
{ TP7 uglyness: @proc^ is parsed as (@proc)^,
|
||||||
(getaddr and not(token in [_CARET,_POINT,_LECKKLAMMER])),
|
but @notproc^ is parsed as @(notproc^) }
|
||||||
|
if m_tp_procvar in current_settings.modeswitches then
|
||||||
|
tmpgetaddr:=getaddr and not(token in [_POINT,_LECKKLAMMER])
|
||||||
|
else
|
||||||
|
tmpgetaddr:=getaddr and not(token in [_CARET,_POINT,_LECKKLAMMER]);
|
||||||
|
do_proc_call(srsym,srsymtable,nil,tmpgetaddr,
|
||||||
again,p1,callflags,spezcontext);
|
again,p1,callflags,spezcontext);
|
||||||
spezcontext:=nil;
|
spezcontext:=nil;
|
||||||
end;
|
end;
|
||||||
@ -3416,6 +3421,11 @@ implementation
|
|||||||
sub_expr if necessary }
|
sub_expr if necessary }
|
||||||
dopostfix:=not could_be_generic(idstr);
|
dopostfix:=not could_be_generic(idstr);
|
||||||
end;
|
end;
|
||||||
|
{ TP7 uglyness: @proc^ is parsed as (@proc)^, but @notproc^ is parsed
|
||||||
|
as @(notproc^) }
|
||||||
|
if (m_tp_procvar in current_settings.modeswitches) and (token=_CARET) and
|
||||||
|
getaddr and (p1.nodetype=loadn) and (tloadnode(p1).symtableentry.typ=procsym) then
|
||||||
|
dopostfix:=false;
|
||||||
{ maybe an additional parameter instead of misusing hadspezialize? }
|
{ maybe an additional parameter instead of misusing hadspezialize? }
|
||||||
if dopostfix and not (ef_had_specialize in flags) then
|
if dopostfix and not (ef_had_specialize in flags) then
|
||||||
updatefpos:=postfixoperators(p1,again,getaddr);
|
updatefpos:=postfixoperators(p1,again,getaddr);
|
||||||
@ -3770,7 +3780,15 @@ implementation
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
p1:=factor(true,[]);
|
p1:=factor(true,[]);
|
||||||
if token in postfixoperator_tokens then
|
if (token in postfixoperator_tokens) and
|
||||||
|
{ TP7 uglyness: @proc^ is parsed as (@proc)^, but @notproc^
|
||||||
|
is parsed as @(notproc^) }
|
||||||
|
not
|
||||||
|
(
|
||||||
|
(m_tp_procvar in current_settings.modeswitches) and
|
||||||
|
(token=_CARET) and (p1.nodetype=loadn) and (tloadnode(p1).symtableentry.typ=procsym)
|
||||||
|
)
|
||||||
|
then
|
||||||
begin
|
begin
|
||||||
again:=true;
|
again:=true;
|
||||||
postfixoperators(p1,again,getaddr);
|
postfixoperators(p1,again,getaddr);
|
||||||
@ -3786,6 +3804,11 @@ implementation
|
|||||||
if assigned(getprocvardef) and
|
if assigned(getprocvardef) and
|
||||||
(taddrnode(p1).left.nodetype = loadn) then
|
(taddrnode(p1).left.nodetype = loadn) then
|
||||||
taddrnode(p1).getprocvardef:=getprocvardef;
|
taddrnode(p1).getprocvardef:=getprocvardef;
|
||||||
|
if (token in postfixoperator_tokens) then
|
||||||
|
begin
|
||||||
|
again:=true;
|
||||||
|
postfixoperators(p1,again,getaddr);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
_LKLAMMER :
|
_LKLAMMER :
|
||||||
|
27
tests/tbs/tb0646a.pp
Normal file
27
tests/tbs/tb0646a.pp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
program tb0646a;
|
||||||
|
|
||||||
|
{$MODE TP}
|
||||||
|
|
||||||
|
procedure TestProc;
|
||||||
|
begin
|
||||||
|
Writeln('Hello');
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
arr1,
|
||||||
|
arr2,
|
||||||
|
arr3: array [1..10] of Byte;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Move(TestProc, arr1, 10);
|
||||||
|
Move((@TestProc)^, arr2, 10);
|
||||||
|
Move(@TestProc^, arr3, 10);
|
||||||
|
if (CompareByte(arr1, arr2, 10) <> 0) or
|
||||||
|
(CompareByte(arr2, arr3, 10) <> 0) then
|
||||||
|
begin
|
||||||
|
Writeln('Error!');
|
||||||
|
Halt(1);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Writeln('Ok!');
|
||||||
|
end.
|
27
tests/tbs/tb0646b.pp
Normal file
27
tests/tbs/tb0646b.pp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
program tb0646b;
|
||||||
|
|
||||||
|
{$MODE DELPHI}
|
||||||
|
|
||||||
|
procedure TestProc;
|
||||||
|
begin
|
||||||
|
Writeln('Hello');
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
arr1,
|
||||||
|
arr2,
|
||||||
|
arr3: array [1..10] of Byte;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Move(TestProc, arr1, 10);
|
||||||
|
Move((@TestProc)^, arr2, 10);
|
||||||
|
Move(@TestProc^, arr3, 10);
|
||||||
|
if (CompareByte(arr1, arr2, 10) <> 0) or
|
||||||
|
(CompareByte(arr2, arr3, 10) <> 0) then
|
||||||
|
begin
|
||||||
|
Writeln('Error!');
|
||||||
|
Halt(1);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Writeln('Ok!');
|
||||||
|
end.
|
Loading…
Reference in New Issue
Block a user