This commit is contained in:
Ivan Bondarev 2023-12-28 14:17:25 +01:00
parent 5f379b9b46
commit 9fd8c001ce
4 changed files with 52 additions and 0 deletions

13
TestSuite/abstract5.pas Normal file
View file

@ -0,0 +1,13 @@
{$reference PresentationFramework.dll}
{$apptype windows}
uses System.Windows.Controls;
type
//Ошибка: Класс MyTextBox абстрактный и не может иметь атрибут sealed, потому что метод CreateRenderScope не реализован
MyTextBox = sealed class(RichTextBox)
end;
begin
new MyTextBox();
end.

View file

@ -0,0 +1,16 @@
unit u_abstract3;
type
t1 = abstract class
// обязательно видимость private
private function f1: byte; abstract;
end;
t2 = class(t1)
private function f1: byte; override := 0;
end;
// обязательно ещё 1 промежуточный тип между t2 и t4
t3 = class(t2) end;
end.

View file

@ -0,0 +1,11 @@
uses u_abstract3;
type
// обязательно t3 - тип из другого модуля
//Ошибка: Абстрактный класс не может иметь атрибут sealed
t4 = sealed class(t3) end;
begin
new t4;
end.

View file

@ -2745,7 +2745,19 @@ namespace PascalABCCompiler.TreeConverter
private void check_implement_abstract_function(common_type_node cnode, function_node meth, type_node interf)
{
//if (meth.field_access_level == SemanticTree.field_access_level.fal_private)
// return;
List<SymbolInfo> sil = cnode.find_in_type(meth.name, cnode.Scope);
if (meth.field_access_level == SemanticTree.field_access_level.fal_private)
{
var base_type = cnode.base_type;
while (base_type != null && base_type.IsAbstract)
{
base_type = base_type.base_type;
}
if (base_type != null && !base_type.IsAbstract && base_type != SystemLibrary.SystemLibrary.object_type)
return;
}
function_node fn = null;
if (sil != null)
{