mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 05:09:19 +02:00
* give an error when declaring a class as conforming to a forward-declared
interface: the compiler does not/cannot check whether the class implements all required methods in that case, and it moreover leads to crashes (mantis #24184). Older versions of Delphi did allow this (and don't check whether the interface methods are implemented either), but that's simply a (similar) bug in Delphi that has been fixed in XE at least * fixed compilation of webtbs/tw2727 after this fix git-svn-id: trunk@24177 -
This commit is contained in:
parent
747342ebb2
commit
3a03586ca9
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -12213,6 +12213,7 @@ tests/webtbf/tw24013a.pp svneol=native#text/plain
|
|||||||
tests/webtbf/tw24013b.pp svneol=native#text/plain
|
tests/webtbf/tw24013b.pp svneol=native#text/plain
|
||||||
tests/webtbf/tw2403.pp svneol=native#text/plain
|
tests/webtbf/tw2403.pp svneol=native#text/plain
|
||||||
tests/webtbf/tw2414.pp svneol=native#text/plain
|
tests/webtbf/tw2414.pp svneol=native#text/plain
|
||||||
|
tests/webtbf/tw24184.pp svneol=native#text/plain
|
||||||
tests/webtbf/tw2478.pp svneol=native#text/plain
|
tests/webtbf/tw2478.pp svneol=native#text/plain
|
||||||
tests/webtbf/tw2562.pp svneol=native#text/plain
|
tests/webtbf/tw2562.pp svneol=native#text/plain
|
||||||
tests/webtbf/tw2657.pp svneol=native#text/plain
|
tests/webtbf/tw2657.pp svneol=native#text/plain
|
||||||
|
@ -316,6 +316,11 @@ implementation
|
|||||||
Message1(type_e_interface_type_expected,intfdef.typename);
|
Message1(type_e_interface_type_expected,intfdef.typename);
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
if ([oo_is_forward,oo_is_formal] * intfdef.objectoptions <> []) then
|
||||||
|
begin
|
||||||
|
Message1(parser_e_forward_intf_declaration_must_be_resolved,intfdef.objrealname^);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
if current_objectdef.find_implemented_interface(intfdef)<>nil then
|
if current_objectdef.find_implemented_interface(intfdef)<>nil then
|
||||||
Message1(sym_e_duplicate_id,intfdef.objname^)
|
Message1(sym_e_duplicate_id,intfdef.objname^)
|
||||||
else
|
else
|
||||||
|
16
tests/webtbf/tw24184.pp
Normal file
16
tests/webtbf/tw24184.pp
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{ %fail }
|
||||||
|
{$mode objfpc}
|
||||||
|
|
||||||
|
type
|
||||||
|
ti = interface;
|
||||||
|
|
||||||
|
tc = class(tinterfacedobject, ti)
|
||||||
|
end;
|
||||||
|
|
||||||
|
ti = interface
|
||||||
|
procedure test;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
end.
|
||||||
|
|
@ -6,18 +6,21 @@
|
|||||||
|
|
||||||
|
|
||||||
type
|
type
|
||||||
IPersistenceCapable = interface;
|
|
||||||
|
|
||||||
TPersistenceCapable = class(TInterfacedObject, IPersistenceCapable)
|
|
||||||
function nonsense:boolean;
|
|
||||||
end;
|
|
||||||
|
|
||||||
IPersistenceCapable = interface
|
IPersistenceCapable = interface
|
||||||
['{A7F3DA50-93BF-4EAF-B40C-8F5020E5D890}']
|
['{A7F3DA50-93BF-4EAF-B40C-8F5020E5D890}']
|
||||||
function GetSelf: TObject;
|
function GetSelf: TObject;
|
||||||
property Self: TObject read GetSelf;
|
property Self: TObject read GetSelf;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
TPersistenceCapable = class(TInterfacedObject, IPersistenceCapable)
|
||||||
|
function GetSelf: TObject;
|
||||||
|
function nonsense:boolean;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TPersistenceCapable.GetSelf: TObject;
|
||||||
|
begin
|
||||||
|
result:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
function TPersistenceCapable.nonsense:boolean;
|
function TPersistenceCapable.nonsense:boolean;
|
||||||
{this works fine if it isn't a method....}
|
{this works fine if it isn't a method....}
|
||||||
|
Loading…
Reference in New Issue
Block a user