mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-23 00:50:28 +02:00
* allow "array of const" parameters again for objcclass/objcprotocol methods
after merge of r13618 from trunk * also allow "varargs" for objclass/objcprotocol methods * set the cdecl calling convention for objcclass/objcprotocol methods in handle_calling_convention() rather than in a separate routine in pdecobj (and do the same for cppclass methods) * check that array of const parameters and varargs are only used with external objc-methods (can only be done after the class is parsed, because earlier on it's not known yet whether or not it is external) git-svn-id: branches/objc@13624 -
This commit is contained in:
parent
ed38015758
commit
744d20d086
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -8220,6 +8220,7 @@ tests/test/tobjc1.pp svneol=native#text/plain
|
||||
tests/test/tobjc10.pp svneol=native#text/plain
|
||||
tests/test/tobjc11.pp svneol=native#text/plain
|
||||
tests/test/tobjc12.pp svneol=native#text/plain
|
||||
tests/test/tobjc13.pp svneol=native#text/plain
|
||||
tests/test/tobjc2.pp svneol=native#text/plain
|
||||
tests/test/tobjc3.pp svneol=native#text/plain
|
||||
tests/test/tobjc4.pp svneol=native#text/plain
|
||||
|
@ -430,10 +430,6 @@ implementation
|
||||
begin
|
||||
if is_objc_class_or_protocol(pd._class) then
|
||||
begin
|
||||
{ none of the explicit calling conventions should be allowed }
|
||||
if (po_hascallingconvention in pd.procoptions) then
|
||||
internalerror(2009032501);
|
||||
pd.proccalloption:=pocall_cdecl;
|
||||
include(pd.procoptions,po_objc);
|
||||
end;
|
||||
end;
|
||||
@ -443,7 +439,6 @@ implementation
|
||||
begin
|
||||
if is_cppclass(pd._class) then
|
||||
begin
|
||||
pd.proccalloption:=pocall_cppdecl;
|
||||
pd.setmangledname(target_info.Cprefix+pd.cplusplusmangledname);
|
||||
end;
|
||||
end;
|
||||
|
@ -310,7 +310,8 @@ implementation
|
||||
if is_open_string(vardef) then
|
||||
MessagePos(fileinfo,parser_w_cdecl_no_openstring);
|
||||
if not(po_external in pd.procoptions) and
|
||||
(pd.typ<>procvardef) then
|
||||
(pd.typ<>procvardef) and
|
||||
not is_objc_class_or_protocol(tprocdef(pd)._class) then
|
||||
if is_array_of_const(vardef) then
|
||||
MessagePos(fileinfo,parser_e_varargs_need_cdecl_and_external)
|
||||
else
|
||||
@ -2376,7 +2377,19 @@ const
|
||||
procedure handle_calling_convention(pd:tabstractprocdef);
|
||||
begin
|
||||
{ set the default calling convention if none provided }
|
||||
if not(po_hascallingconvention in pd.procoptions) then
|
||||
if (pd.typ=procdef) and
|
||||
(is_objc_class_or_protocol(tprocdef(pd)._class) or
|
||||
is_cppclass(tprocdef(pd)._class)) then
|
||||
begin
|
||||
{ none of the explicit calling conventions should be allowed }
|
||||
if (po_hascallingconvention in pd.procoptions) then
|
||||
internalerror(2009032501);
|
||||
if is_cppclass(tprocdef(pd)._class) then
|
||||
pd.proccalloption:=pocall_cppdecl
|
||||
else
|
||||
pd.proccalloption:=pocall_cdecl;
|
||||
end
|
||||
else if not(po_hascallingconvention in pd.procoptions) then
|
||||
pd.proccalloption:=current_settings.defproccall
|
||||
else
|
||||
begin
|
||||
@ -2423,7 +2436,10 @@ const
|
||||
{ if external is available, then cdecl must also be available,
|
||||
procvars don't need external }
|
||||
if not((po_external in pd.procoptions) or
|
||||
(pd.typ=procvardef)) and
|
||||
(pd.typ=procvardef) or
|
||||
{ for objcclasses this is checked later, because the entire
|
||||
class may be external. }
|
||||
is_objc_class_or_protocol(tprocdef(pd)._class)) and
|
||||
not(pd.proccalloption in [pocall_cdecl,pocall_cppdecl,pocall_mwpascal]) then
|
||||
Message(parser_e_varargs_need_cdecl_and_external);
|
||||
end
|
||||
|
@ -4381,16 +4381,33 @@ implementation
|
||||
procedure check_and_finish_msg(data: tobject; arg: pointer);
|
||||
var
|
||||
def: tdef absolute data;
|
||||
pd: tprocdef absolute data;
|
||||
i: longint;
|
||||
begin
|
||||
if (def.typ = procdef) then
|
||||
if (def.typ=procdef) then
|
||||
begin
|
||||
{ we have to wait until now to set the mangled name because it
|
||||
depends on the (possibly external) class name, which is defined
|
||||
at the very end. }
|
||||
if (po_msgstr in tprocdef(def).procoptions) then
|
||||
tprocdef(def).setmangledname(tprocdef(def).objcmangledname)
|
||||
if (po_msgstr in pd.procoptions) then
|
||||
pd.setmangledname(pd.objcmangledname)
|
||||
else
|
||||
MessagePos(tprocdef(def).fileinfo,parser_e_objc_requires_msgstr)
|
||||
MessagePos(pd.fileinfo,parser_e_objc_requires_msgstr);
|
||||
if not(oo_is_external in pd._class.objectoptions) then
|
||||
begin
|
||||
if (po_varargs in pd.procoptions) then
|
||||
MessagePos(pd.fileinfo,parser_e_varargs_need_cdecl_and_external)
|
||||
else
|
||||
begin
|
||||
{ check for "array of const" parameters }
|
||||
for i:=0 to pd.parast.symlist.count-1 do
|
||||
begin
|
||||
if (tsym(pd.parast.symlist[i]).typ=paravarsym) and
|
||||
is_array_of_const(tparavarsym(pd.parast.symlist[i]).vardef) then
|
||||
MessagePos(pd.fileinfo,parser_e_varargs_need_cdecl_and_external);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
15
tests/test/tobjc13.pp
Normal file
15
tests/test/tobjc13.pp
Normal file
@ -0,0 +1,15 @@
|
||||
{ %target=darwin }
|
||||
{ %cpu=powerpc,i386 }
|
||||
{ %norun }
|
||||
|
||||
{$mode objfpc}
|
||||
{$modeswitch objectivec1}
|
||||
|
||||
type
|
||||
ta = objcclass(NSObject)
|
||||
procedure test(l: longint; a: array of const); message 'class';
|
||||
procedure test2(l: longint); varargs; message 'class';
|
||||
end; external name 'NSObject';
|
||||
|
||||
begin
|
||||
end.
|
Loading…
Reference in New Issue
Block a user