From b25cab6a1a582365b53be0f595f11f2e0b0f2c2d Mon Sep 17 00:00:00 2001 From: Sun Serega Date: Sun, 20 Mar 2022 18:01:03 +0200 Subject: [PATCH] cleanup --- TestSuite/errors/err0503_where_enum-class.pas | 14 ++++++++++++++ TestSuite/errors/err0504_generic-lock.pas | 11 +++++++++++ TestSuite/errors/err0505_where_record-class.pas | 13 +++++++++++++ .../TreeConversion/syntax_tree_visitor.cs | 2 +- TreeConverter/TreeRealization/generics.cs | 6 +----- 5 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 TestSuite/errors/err0503_where_enum-class.pas create mode 100644 TestSuite/errors/err0504_generic-lock.pas create mode 100644 TestSuite/errors/err0505_where_record-class.pas diff --git a/TestSuite/errors/err0503_where_enum-class.pas b/TestSuite/errors/err0503_where_enum-class.pas new file mode 100644 index 000000000..6e1584d0b --- /dev/null +++ b/TestSuite/errors/err0503_where_enum-class.pas @@ -0,0 +1,14 @@ +//!Невозможно инстанцировать, так как тип T не является ссылочным (классом) +## +procedure p0(o: T); where T: class; +begin + Writeln(o.GetType); +end; + +procedure p1(o: T); where T: System.Enum; +begin + p0(o); +end; + +var o: (ME_1, ME_2) := ME_2; +p0(o); \ No newline at end of file diff --git a/TestSuite/errors/err0504_generic-lock.pas b/TestSuite/errors/err0504_generic-lock.pas new file mode 100644 index 000000000..e7cbbfd0f --- /dev/null +++ b/TestSuite/errors/err0504_generic-lock.pas @@ -0,0 +1,11 @@ +//!Выражение должно возвращать ссылочный тип, как того требует оператор lock +## +procedure p1(o: T); +begin + lock o do + begin + Writeln(o); + end; +end; + +p1(0); \ No newline at end of file diff --git a/TestSuite/errors/err0505_where_record-class.pas b/TestSuite/errors/err0505_where_record-class.pas new file mode 100644 index 000000000..ca305bd36 --- /dev/null +++ b/TestSuite/errors/err0505_where_record-class.pas @@ -0,0 +1,13 @@ +//!Невозможно инстанцировать, так как тип T не является ссылочным (классом) +## +procedure p0(o: T); where T: class; +begin + Writeln(o.GetType); +end; + +procedure p1(o: T); where T: record; +begin + p0(o); +end; + +p1(0); \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 1ba2220d9..5ce6f1591 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -20118,7 +20118,7 @@ namespace PascalABCCompiler.TreeConverter //Нужно ли это??? if (lock_object.type.semantic_node_type == semantic_node_type.delegated_method) try_convert_typed_expression_to_function_call(ref lock_object); - if (lock_object.type == null || lock_object.type.is_value_type) + if (/*lock_object.type == null ||*/ !lock_object.type.is_class) AddError(get_location(node.lock_object), "EXPRESSION_IN_LOCK_STATEMENT_RETURNED_NOT_A_REFERENCE_TYPE", lock_object.type); CheckToEmbeddedStatementCannotBeADeclaration(node.stmt); statement_node stmt = convert_strong(node.stmt); diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 08a1d5c1b..a2135c2ed 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -164,7 +164,7 @@ namespace PascalABCCompiler.TreeRealization return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_DERIVED_FROM_{1}", tn.PrintableName, base_type.name); } } - if (gpe.is_class && !tn.is_class && !(tn.is_generic_parameter && tn.base_type != null && tn.base_type.is_class)) + if (gpe.is_class && !tn.is_class) { return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_REFERENCE_TYPE", tn.PrintableName); } @@ -172,10 +172,6 @@ namespace PascalABCCompiler.TreeRealization { return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_VALUE_TYPE", tn.PrintableName); } - if (gpe.base_class != null && gpe.base_class != SystemLibrary.SystemLibrary.object_type && tn.is_value && !gpe.base_class.is_value && gpe.base_class != SystemLibrary.SystemLibrary.value_type && gpe.base_class != SystemLibrary.SystemLibrary.enum_base_type) - { - return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_REFERENCE_TYPE", tn.PrintableName); - } foreach (type_node interf in gpe.implementing_interfaces) { type_node di = generic_convertions.determine_type(interf, tparams, method_param_types);