diff --git a/TestSuite/abstract5.pas b/TestSuite/abstract5.pas new file mode 100644 index 000000000..78da4cc68 --- /dev/null +++ b/TestSuite/abstract5.pas @@ -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. \ No newline at end of file diff --git a/TestSuite/units/u_abstract3.pas b/TestSuite/units/u_abstract3.pas new file mode 100644 index 000000000..8751190c4 --- /dev/null +++ b/TestSuite/units/u_abstract3.pas @@ -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. \ No newline at end of file diff --git a/TestSuite/usesunits/use_abstract3.pas b/TestSuite/usesunits/use_abstract3.pas new file mode 100644 index 000000000..abe728f4c --- /dev/null +++ b/TestSuite/usesunits/use_abstract3.pas @@ -0,0 +1,11 @@ +uses u_abstract3; + +type + + // обязательно t3 - тип из другого модуля + //Ошибка: Абстрактный класс не может иметь атрибут sealed + t4 = sealed class(t3) end; + +begin + new t4; +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/compilation_context.cs b/TreeConverter/TreeConversion/compilation_context.cs index f378c06e5..5887f9d5c 100644 --- a/TreeConverter/TreeConversion/compilation_context.cs +++ b/TreeConverter/TreeConversion/compilation_context.cs @@ -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 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) {