From d2aa5da8d0ec360d1bb114516582583817dded0e Mon Sep 17 00:00:00 2001 From: Ghaith Hachem Date: Wed, 5 Feb 2025 11:06:27 +0000 Subject: [PATCH] rework the inheritance chain, not yet complete, added lit test --- .../src/.inheritance.rs.pending-snap | 9 ++ compiler/plc_lowering/src/inheritance.rs | 127 +++++------------- src/codegen/tests/.oop_tests.rs.pending-snap | 1 + .../lit/single/methods/fb_with_super_class.st | 22 +++ 4 files changed, 69 insertions(+), 90 deletions(-) create mode 100644 compiler/plc_lowering/src/.inheritance.rs.pending-snap create mode 100644 src/codegen/tests/.oop_tests.rs.pending-snap create mode 100644 tests/lit/single/methods/fb_with_super_class.st diff --git a/compiler/plc_lowering/src/.inheritance.rs.pending-snap b/compiler/plc_lowering/src/.inheritance.rs.pending-snap new file mode 100644 index 0000000000..5a56521d75 --- /dev/null +++ b/compiler/plc_lowering/src/.inheritance.rs.pending-snap @@ -0,0 +1,9 @@ +{"run_id":"c3488716-4666-45cf-ab21-84a8a6e2ad84","line":1643,"new":{"module_name":"plc_lowering__inheritance__resolve_bases_tests","snapshot_name":"base_types_resolved","metadata":{"source":"compiler/plc_lowering/src/inheritance.rs","assertion_line":1643,"expression":"annotations.get(&left)"},"snapshot":"None"},"old":{"module_name":"plc_lowering__inheritance__resolve_bases_tests","metadata":{},"snapshot":"Some(\n Variable {\n resulting_type: \"INT\",\n qualified_name: \"fb.x\",\n constant: false,\n argument_type: ByVal(\n Local,\n ),\n auto_deref: None,\n },\n)"}} +{"run_id":"c3488716-4666-45cf-ab21-84a8a6e2ad84","line":464,"new":{"module_name":"plc_lowering__inheritance__units_tests","snapshot_name":"write_to_grandparent_variable_in_initializer","metadata":{"source":"compiler/plc_lowering/src/inheritance.rs","assertion_line":464,"expression":"unit"},"snapshot":"Implementation {\n name: \"child\",\n type_name: \"child\",\n linkage: Internal,\n pou_type: FunctionBlock,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"z\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: None,\n },\n right: LiteralInteger {\n value: 420,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 11,\n column: 16,\n offset: 289,\n }..TextLocation {\n line: 11,\n column: 25,\n offset: 298,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 10,\n column: 27,\n offset: 252,\n }..TextLocation {\n line: 10,\n column: 32,\n offset: 257,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"},"old":{"module_name":"plc_lowering__inheritance__units_tests","metadata":{},"snapshot":""}} +{"run_id":"c3488716-4666-45cf-ab21-84a8a6e2ad84","line":1427,"new":{"module_name":"plc_lowering__inheritance__units_tests","snapshot_name":"pointer_deref_in_grandparent","metadata":{"source":"compiler/plc_lowering/src/inheritance.rs","assertion_line":1427,"expression":"unit"},"snapshot":"Implementation {\n name: \"main\",\n type_name: \"main\",\n linkage: Internal,\n pou_type: Function,\n statements: [\n CallStatement {\n operator: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__init_child\",\n },\n ),\n base: None,\n },\n parameters: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"fb\",\n },\n ),\n base: None,\n },\n ),\n },\n Assignment {\n left: ReferenceExpr {\n kind: Deref,\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"c\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"fb\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 10,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Deref,\n base: Some(\n ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"fb\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 20,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Deref,\n base: Some(\n ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"a\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"fb\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 30,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 23,\n column: 20,\n offset: 627,\n }..TextLocation {\n line: 25,\n column: 32,\n offset: 705,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 19,\n column: 25,\n offset: 527,\n }..TextLocation {\n line: 19,\n column: 29,\n offset: 531,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"},"old":{"module_name":"plc_lowering__inheritance__units_tests","metadata":{},"snapshot":"Implementation {\n name: \"main\",\n type_name: \"main\",\n linkage: Internal,\n pou_type: Function,\n statements: [\n CallStatement {\n operator: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__init_child\",\n },\n ),\n base: None,\n },\n parameters: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"fb\",\n },\n ),\n base: None,\n },\n ),\n },\n Assignment {\n left: ReferenceExpr {\n kind: Deref,\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"c\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"fb\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 10,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Deref,\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"fb\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 20,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Deref,\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"a\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"fb\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 30,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 23,\n column: 20,\n offset: 627,\n }..TextLocation {\n line: 25,\n column: 32,\n offset: 705,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 19,\n column: 25,\n offset: 527,\n }..TextLocation {\n line: 19,\n column: 29,\n offset: 531,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"}} +{"run_id":"c3488716-4666-45cf-ab21-84a8a6e2ad84","line":277,"new":{"module_name":"plc_lowering__inheritance__units_tests","snapshot_name":"write_to_parent_variable_qualified_access","metadata":{"source":"compiler/plc_lowering/src/inheritance.rs","assertion_line":277,"expression":"unit"},"snapshot":"Implementation {\n name: \"foo\",\n type_name: \"foo\",\n linkage: Internal,\n pou_type: FunctionBlock,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"myFb\",\n },\n ),\n base: None,\n },\n ),\n },\n right: LiteralInteger {\n value: 1,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: None,\n },\n right: LiteralInteger {\n value: 2,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 16,\n column: 16,\n offset: 359,\n }..TextLocation {\n line: 17,\n column: 23,\n offset: 417,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 11,\n column: 27,\n offset: 250,\n }..TextLocation {\n line: 11,\n column: 30,\n offset: 253,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"},"old":{"module_name":"plc_lowering__inheritance__units_tests","metadata":{},"snapshot":"Implementation {\n name: \"foo\",\n type_name: \"foo\",\n linkage: Internal,\n pou_type: FunctionBlock,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"myFb\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 1,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: None,\n },\n right: LiteralInteger {\n value: 2,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 16,\n column: 16,\n offset: 359,\n }..TextLocation {\n line: 17,\n column: 23,\n offset: 395,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 11,\n column: 27,\n offset: 250,\n }..TextLocation {\n line: 11,\n column: 30,\n offset: 253,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"}} +{"run_id":"c3488716-4666-45cf-ab21-84a8a6e2ad84","line":817,"new":{"module_name":"plc_lowering__inheritance__units_tests","snapshot_name":"multi_level_reference_handling","metadata":{"source":"compiler/plc_lowering/src/inheritance.rs","assertion_line":817,"expression":"unit"},"snapshot":"Implementation {\n name: \"foo\",\n type_name: \"foo\",\n linkage: Internal,\n pou_type: FunctionBlock,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"myFb\",\n },\n ),\n base: None,\n },\n ),\n },\n right: LiteralInteger {\n value: 1,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 21,\n column: 16,\n offset: 470,\n }..TextLocation {\n line: 21,\n column: 28,\n offset: 482,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 17,\n column: 27,\n offset: 377,\n }..TextLocation {\n line: 17,\n column: 30,\n offset: 380,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"},"old":{"module_name":"plc_lowering__inheritance__units_tests","metadata":{},"snapshot":"Implementation {\n name: \"foo\",\n type_name: \"foo\",\n linkage: Internal,\n pou_type: FunctionBlock,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"myFb\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 1,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 21,\n column: 16,\n offset: 470,\n }..TextLocation {\n line: 21,\n column: 28,\n offset: 482,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 17,\n column: 27,\n offset: 377,\n }..TextLocation {\n line: 17,\n column: 30,\n offset: 380,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"}} +{"run_id":"c3488716-4666-45cf-ab21-84a8a6e2ad84","line":379,"new":{"module_name":"plc_lowering__inheritance__units_tests","snapshot_name":"write_to_parent_variable_in_instance","metadata":{"source":"compiler/plc_lowering/src/inheritance.rs","assertion_line":379,"expression":"unit"},"snapshot":"Implementation {\n name: \"bar\",\n type_name: \"bar\",\n linkage: Internal,\n pou_type: FunctionBlock,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"s\",\n },\n ),\n base: None,\n },\n right: LiteralString {\n value: \"world\",\n is_wide: false,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 8,\n column: 16,\n offset: 187,\n }..TextLocation {\n line: 8,\n column: 29,\n offset: 200,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 7,\n column: 27,\n offset: 155,\n }..TextLocation {\n line: 7,\n column: 30,\n offset: 158,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"},"old":{"module_name":"plc_lowering__inheritance__units_tests","metadata":{},"snapshot":"Implementation {\n name: \"bar\",\n type_name: \"bar\",\n linkage: Internal,\n pou_type: FunctionBlock,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"s\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n right: LiteralString {\n value: \"world\",\n is_wide: false,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 8,\n column: 16,\n offset: 187,\n }..TextLocation {\n line: 8,\n column: 29,\n offset: 200,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 7,\n column: 27,\n offset: 155,\n }..TextLocation {\n line: 7,\n column: 30,\n offset: 158,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"}} +{"run_id":"c3488716-4666-45cf-ab21-84a8a6e2ad84","line":1247,"new":{"module_name":"plc_lowering__inheritance__units_tests","snapshot_name":"complex_array_access","metadata":{"source":"compiler/plc_lowering/src/inheritance.rs","assertion_line":1247,"expression":"unit"},"snapshot":"Implementation {\n name: \"main\",\n type_name: \"main\",\n linkage: Internal,\n pou_type: Function,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n BinaryExpression {\n operator: Minus,\n left: BinaryExpression {\n operator: Plus,\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: None,\n },\n right: ReferenceExpr {\n kind: Index(\n BinaryExpression {\n operator: Multiplication,\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: None,\n },\n right: LiteralInteger {\n value: 2,\n },\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"z\",\n },\n ),\n base: None,\n },\n ),\n },\n },\n right: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"a\",\n },\n ),\n base: None,\n },\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"y\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 0,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 20,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 25,\n column: 16,\n offset: 668,\n }..TextLocation {\n line: 25,\n column: 47,\n offset: 699,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 21,\n column: 21,\n offset: 567,\n }..TextLocation {\n line: 21,\n column: 25,\n offset: 571,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"},"old":{"module_name":"plc_lowering__inheritance__units_tests","metadata":{},"snapshot":"Implementation {\n name: \"main\",\n type_name: \"main\",\n linkage: Internal,\n pou_type: Function,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n BinaryExpression {\n operator: Minus,\n left: BinaryExpression {\n operator: Plus,\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: None, // <- missing base\n },\n right: ReferenceExpr {\n kind: Index(\n BinaryExpression {\n operator: Multiplication,\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: None, // <- same here\n },\n right: LiteralInteger {\n value: 2,\n },\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"z\", // <: and here\n },\n ),\n base: None,\n },\n ),\n },\n },\n right: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"a\",\n },\n ),\n base: None,\n },\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"y\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 0,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 20,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 25,\n column: 16,\n offset: 668,\n }..TextLocation {\n line: 25,\n column: 47,\n offset: 699,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 21,\n column: 21,\n offset: 567,\n }..TextLocation {\n line: 21,\n column: 25,\n offset: 571,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"}} +{"run_id":"c3488716-4666-45cf-ab21-84a8a6e2ad84","line":500,"new":{"module_name":"plc_lowering__inheritance__units_tests","snapshot_name":"array_access_in_nested_function_blocks_with_base_references","metadata":{"source":"compiler/plc_lowering/src/inheritance.rs","assertion_line":500,"expression":"unit"},"snapshot":"Implementation {\n name: \"child\",\n type_name: \"child\",\n linkage: Internal,\n pou_type: FunctionBlock,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 0,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: None,\n },\n ),\n },\n right: LiteralInteger {\n value: 42,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 2,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"y\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: None,\n },\n ),\n },\n right: LiteralInteger {\n value: 5,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 3,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"z\",\n },\n ),\n base: None,\n },\n ),\n },\n right: BinaryExpression {\n operator: Plus,\n left: ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 1,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: None,\n },\n ),\n },\n right: ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 2,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"y\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: None,\n },\n ),\n },\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"a\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: None,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: None,\n },\n ),\n },\n right: LiteralInteger {\n value: 5,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: None,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"y\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: None,\n },\n ),\n },\n right: LiteralInteger {\n value: 6,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n BinaryExpression {\n operator: Plus,\n left: ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"a\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: None,\n },\n right: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: None,\n },\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"z\",\n },\n ),\n base: None,\n },\n ),\n },\n right: LiteralInteger {\n value: 10,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 19,\n column: 20,\n offset: 598,\n }..TextLocation {\n line: 24,\n column: 33,\n offset: 938,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 15,\n column: 31,\n offset: 456,\n }..TextLocation {\n line: 15,\n column: 36,\n offset: 461,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"},"old":{"module_name":"plc_lowering__inheritance__units_tests","metadata":{},"snapshot":"Implementation {\n name: \"child\",\n type_name: \"child\",\n linkage: Internal,\n pou_type: FunctionBlock,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 0,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 42,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 2,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"y\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 5,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 3,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"z\",\n },\n ),\n base: None,\n },\n ),\n },\n right: BinaryExpression {\n operator: Plus,\n left: ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 1,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n right: ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 2,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"y\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"a\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 5,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n right: LiteralInteger {\n value: 6,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n BinaryExpression {\n operator: Plus,\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"a\",\n },\n ),\n base: None,\n },\n right: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: None,\n },\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"z\",\n },\n ),\n base: None,\n },\n ),\n },\n right: LiteralInteger {\n value: 10,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 19,\n column: 20,\n offset: 598,\n }..TextLocation {\n line: 24,\n column: 33,\n offset: 938,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 15,\n column: 31,\n offset: 456,\n }..TextLocation {\n line: 15,\n column: 36,\n offset: 461,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"}} +{"run_id":"c3488716-4666-45cf-ab21-84a8a6e2ad84","line":936,"new":{"module_name":"plc_lowering__inheritance__units_tests","snapshot_name":"array_of_objects","metadata":{"source":"compiler/plc_lowering/src/inheritance.rs","assertion_line":936,"expression":"unit"},"snapshot":"Implementation {\n name: \"main\",\n type_name: \"main\",\n linkage: Internal,\n pou_type: Function,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"a\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 0,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 10,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 0,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"y\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 0,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 20,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 1,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 30,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 1,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 1,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 40,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 2,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"z\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Index(\n LiteralInteger {\n value: 2,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 50,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 25,\n column: 16,\n offset: 668,\n }..TextLocation {\n line: 29,\n column: 34,\n offset: 820,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 21,\n column: 21,\n offset: 567,\n }..TextLocation {\n line: 21,\n column: 25,\n offset: 571,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"},"old":{"module_name":"plc_lowering__inheritance__units_tests","metadata":{},"snapshot":"Implementation {\n name: \"main\",\n type_name: \"main\",\n linkage: Internal,\n pou_type: Function,\n statements: [\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"a\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 0,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 10,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 0,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"y\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 0,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 20,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"b\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 1,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 30,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 1,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"x\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"__BASE\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 1,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 40,\n },\n },\n Assignment {\n left: ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 2,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"z\",\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n LiteralInteger {\n value: 2,\n },\n ),\n base: Some(\n ReferenceExpr {\n kind: Member(\n Identifier {\n name: \"arr\",\n },\n ),\n base: None,\n },\n ),\n },\n ),\n },\n ),\n },\n right: LiteralInteger {\n value: 50,\n },\n },\n ],\n location: SourceLocation {\n span: Range(\n TextLocation {\n line: 25,\n column: 16,\n offset: 668,\n }..TextLocation {\n line: 29,\n column: 34,\n offset: 820,\n },\n ),\n },\n name_location: SourceLocation {\n span: Range(\n TextLocation {\n line: 21,\n column: 21,\n offset: 567,\n }..TextLocation {\n line: 21,\n column: 25,\n offset: 571,\n },\n ),\n },\n overriding: false,\n generic: false,\n access: None,\n}"}} diff --git a/compiler/plc_lowering/src/inheritance.rs b/compiler/plc_lowering/src/inheritance.rs index f4f3297b29..be405516c5 100644 --- a/compiler/plc_lowering/src/inheritance.rs +++ b/compiler/plc_lowering/src/inheritance.rs @@ -4,7 +4,7 @@ use plc::{ }; use plc_ast::{ ast::{ - AstFactory, AstNode, CompilationUnit, DataTypeDeclaration, LinkageType, Pou, PouType, + AstFactory, AstNode, AstStatement, CompilationUnit, DataTypeDeclaration, LinkageType, Pou, PouType, ReferenceAccess, ReferenceExpr, Variable, VariableBlock, VariableBlockType, }, mut_visitor::{AstVisitorMut, WalkerMut}, @@ -78,103 +78,47 @@ impl InheritanceLowerer { self.ctx = old_ctx; } - fn update_inheritance_chain(&self, mut node: AstNode) -> AstNode { - let Some(index) = self.index.as_ref() else { - // TODO: this will skip visiting initializer nodes + fn update_inheritance_chain(&self, node: AstNode, base_type: &str) -> AstNode { + if self.index.is_none() || self.annotations.is_none() { return node; - }; - let annotations = self.annotations.as_ref().expect("Annotations not set"); + } // disect the qualified name // a.b.c -> am i a direct member of b? // b => am I a direct member of a? // a => am I a direct member of local container? - let Some(ReferenceExpr { base, access }) = try_from_mut!(node, ReferenceExpr) else { - return node; - }; - - let base = std::mem::take(base); - let (base, ty) = if let Some(base) = base { - let ty = annotations.get_type(&base, index); - - (Some(Box::new(self.update_inheritance_chain(*base))), ty) - } else { - (base, self.ctx.pou.as_ref().and_then(|it| index.get_type(it).ok())) - }; - - let access = match access { - ReferenceAccess::Member(ast_node) => self.update_inheritance_chain(*std::mem::take(ast_node)), - ReferenceAccess::Cast(ast_node) => { - // FIXME: we need to walk this :/ can't do it here because we cannot borrow self as mutable multiple times - let location = ast_node.get_location(); - let base = base.expect("Cast statement must have base"); - return AstFactory::create_cast_statement( - *base, - std::mem::take(ast_node), - &location, - self.provider().next_id(), - ); - } - ReferenceAccess::Index(ast_node) => { - // FIXME: we also need to walk this - let location = ast_node.get_location(); - return AstFactory::create_index_reference( - std::mem::take(ast_node), - base.map(|it| *it), - self.provider().next_id(), - location, - ); - } - ReferenceAccess::Deref => { - let base = *base.expect("Deref must have base"); - let location = base.get_location(); - return AstFactory::create_deref_reference(base, self.provider().next_id(), location); - } - ReferenceAccess::Address => { - let base = *base.expect("Deref must have base"); - let location = base.get_location(); - return AstFactory::create_address_of_reference(base, self.provider().next_id(), location); - } - }; - - let Some(qualified_name) = annotations.get_qualified_name(&access) else { + let annotations = self.annotations.as_ref().expect("Annotations exist"); + let Some(qualified_name) = annotations.get_qualified_name(&node) else { // this is likely an index into an array/pointer dereference. just return as is - return AstFactory::create_member_reference(access, base.map(|it| *it), self.provider().next_id()); + return node; }; let segment = qualified_name.split('.').next().expect("Must have a name"); - if ty.is_some_and(|it| it.get_name() == segment) { - return AstFactory::create_member_reference( - access, - base.map(|it| *it), - self.provider().next_id(), - ); + if base_type == segment { + return node; } - let inheritance_chain = index.find_ancestors(ty.map(|it| it.get_name()).unwrap_or_default(), segment); + let index = self.index.as_ref().expect("Index exists"); + let inheritance_chain = index.find_ancestors(base_type, segment); if inheritance_chain.len() <= 1 { - return AstFactory::create_member_reference( - access, - base.map(|it| *it), - self.provider().next_id(), - ); + return node; } // add a `__BASE` qualifier for each element in the inheritance chain, exluding `self` - let base = inheritance_chain.iter().skip(1).fold(base, |base, _| { + let base = inheritance_chain.iter().skip(1).fold(None, |base, _| { Some(Box::new(AstFactory::create_member_reference( AstFactory::create_identifier( "__BASE", SourceLocation::internal(), self.provider().next_id(), ), - base.map(|it| *it), + base.map(|it: Box| *it), self.provider().next_id(), ))) }); - AstFactory::create_member_reference(access, base.map(|it| *it), self.provider().next_id()) + AstFactory::create_member_reference(node, base.map(|it| *it), self.provider().next_id()) } } @@ -234,27 +178,30 @@ impl AstVisitorMut for InheritanceLowerer { } fn visit_reference_expr(&mut self, node: &mut AstNode) { + if self.index.is_none() || self.annotations.is_none() { + return; + } + // Find the base type of the expression before walking the node + let base_type_name = + if let AstStatement::ReferenceExpr(ReferenceExpr { base: Some(base), .. }) = node.get_stmt() { + let index = self.index.as_ref().expect("Index exists"); + let annotations = self.annotations.as_ref().expect("Annotations exist"); + annotations.get_type(&base, index).map(|it| it.get_name().to_string()) + } else { + self.ctx.base_type_name.clone() + }; + // First walk the statement itself so we make sure any base is correctly added + let stmt = try_from_mut!(node, ReferenceExpr).expect("ReferenceExpr"); + stmt.walk(self); // If the reference is to a member of the base class, we need to add a reference to the // base class - *node = self.update_inheritance_chain(std::mem::take(node)); - - let Some(ReferenceExpr { base, access }) = try_from_mut!(node, ReferenceExpr) else { - unreachable!() + if let ReferenceExpr { base: _, access: ReferenceAccess::Member(access) } = stmt { + if let Some(base_type_name) = base_type_name { + let mut owned_access = + self.update_inheritance_chain(*std::mem::take(access), &base_type_name); + std::mem::swap(access.as_mut(), &mut owned_access); + } }; - - match access { - ReferenceAccess::Member(ast_node) - | ReferenceAccess::Index(ast_node) - | ReferenceAccess::Cast(ast_node) => { - ast_node.walk(self); - }, - ReferenceAccess::Deref - | ReferenceAccess::Address => (), - } - - if let Some(base) = base { - base.walk(self) - } } } @@ -319,7 +266,7 @@ mod units_tests { myFb : fb2; x : INT; END_VAR - myFb.x := 1; + myFb.x := 1; //myFb.__BASE.x := 1; x := 2; // this should not have any bases added END_FUNCTION_BLOCK " diff --git a/src/codegen/tests/.oop_tests.rs.pending-snap b/src/codegen/tests/.oop_tests.rs.pending-snap new file mode 100644 index 0000000000..9b4827b984 --- /dev/null +++ b/src/codegen/tests/.oop_tests.rs.pending-snap @@ -0,0 +1 @@ +{"run_id":"c3488716-4666-45cf-ab21-84a8a6e2ad84","line":19,"new":{"module_name":"rusty__codegen__tests__oop_tests","snapshot_name":"members_from_base_class_are_available_in_subclasses","metadata":{"source":"src/codegen/tests/oop_tests.rs","assertion_line":19,"expression":"result"},"snapshot":"; ModuleID = ''\nsource_filename = \"\"\n\n%foo = type { i16, [81 x i8], [11 x [81 x i8]] }\n%bar = type {}\n\n@__foo__init = unnamed_addr constant %foo zeroinitializer\n@__bar__init = unnamed_addr constant %bar zeroinitializer\n\ndefine void @foo(%foo* %0) {\nentry:\n %a = getelementptr inbounds %foo, %foo* %0, i32 0, i32 0\n %b = getelementptr inbounds %foo, %foo* %0, i32 0, i32 1\n %c = getelementptr inbounds %foo, %foo* %0, i32 0, i32 2\n ret void\n}\n\ndefine void @bar(%bar* %0) {\nentry:\n ret void\n}\n; ModuleID = '__initializers'\nsource_filename = \"__initializers\"\n\n%foo = type { i16, [81 x i8], [11 x [81 x i8]] }\n%bar = type {}\n\n@__foo__init = external global %foo\n@__bar__init = external global %bar\n\ndefine void @__init_foo(%foo* %0) {\nentry:\n %self = alloca %foo*, align 8\n store %foo* %0, %foo** %self, align 8\n ret void\n}\n\ndeclare void @foo(%foo*)\n\ndefine void @__init_bar(%bar* %0) {\nentry:\n %self = alloca %bar*, align 8\n store %bar* %0, %bar** %self, align 8\n ret void\n}\n\ndeclare void @bar(%bar*)\n; ModuleID = '__init___testproject'\nsource_filename = \"__init___testproject\"\n\n@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* @__init___testproject, i8* null }]\n\ndefine void @__init___testproject() {\nentry:\n ret void\n}"},"old":{"module_name":"rusty__codegen__tests__oop_tests","metadata":{},"snapshot":""}} diff --git a/tests/lit/single/methods/fb_with_super_class.st b/tests/lit/single/methods/fb_with_super_class.st new file mode 100644 index 0000000000..0c89d804a6 --- /dev/null +++ b/tests/lit/single/methods/fb_with_super_class.st @@ -0,0 +1,22 @@ +// RUN: (%COMPILE %s && %RUN) | %CHECK %s +FUNCTION_BLOCK foo +VAR + s : STRING; +END_VAR +METHOD baz + s := 'hello'; +END_METHOD +END_FUNCTION_BLOCK + +FUNCTION_BLOCK bar EXTENDS foo + s := 'world'; +END_FUNCTION_BLOCK + +FUNCTION main: DINT +VAR + s: STRING; + fb: bar; +END_VAR + fb.baz(); // CHECK: hello + fb(); // CHECK: world +END_FUNCTION