diff --git a/TestSuite/errors/err0512_recursive_inh.pas b/TestSuite/errors/err0512_recursive_inh.pas new file mode 100644 index 000000000..c91c2d5d3 --- /dev/null +++ b/TestSuite/errors/err0512_recursive_inh.pas @@ -0,0 +1,11 @@ +//!Type 't1' inherits from itself +type + t1 = partial class + + end; + t2 = class(t1) end; + t1 = partial class(t2) + + end; + +begin end. \ No newline at end of file diff --git a/TestSuite/recursive_where.pas b/TestSuite/recursive_where.pas new file mode 100644 index 000000000..bd7c5e504 --- /dev/null +++ b/TestSuite/recursive_where.pas @@ -0,0 +1,32 @@ +// issue#2725 + +type + i0 = interface end; + + base_i = interface + where TSelf: base_i; + function fi(a: TSelf): TSelf; + end; + + base_c = abstract class + where TSelf: base_c; + function fc(a: TSelf): TSelf; abstract; + end; + + class1 = class(i0, base_i) + public function fi(a: class1) := a; + end; + class2 = class(base_c, base_i) + public function fi(a: class2) := self; + public function fc(a: class2): class2; override := self; + end; + + record1 = record(i0, base_i) + public function fi(a: record1) := self; + end; + + interface1 = interface(i0, base_i) + + end; + +begin end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 7dd0a71f0..e9ed59d8d 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -3983,7 +3983,7 @@ namespace PascalABCCompiler.TreeConverter else AddError(get_location(_class_definition), converted_type.AbstractReason.Explanation, converted_type.name, converted_type.AbstractReason.ObjName); } - return; + break; case PascalABCCompiler.SyntaxTree.class_keyword.Record: if (context.CurrentScope is SymbolTable.BlockScope) @@ -4032,7 +4032,7 @@ namespace PascalABCCompiler.TreeConverter }*/ context.leave_record(); return_value(converted_type); - return; + break; //ssyy owns case PascalABCCompiler.SyntaxTree.class_keyword.Interface: if (converted_type.is_value || !converted_type.IsInterface) @@ -4070,7 +4070,7 @@ namespace PascalABCCompiler.TreeConverter } //hard_node_test_and_visit(_class_definition.body); context.leave_block(); - return; + break; //\ssyy owns default: throw new NotSupportedError(get_location(_class_definition));