From 210023fa81a74a3e641c0a6a8b38da9b155d9c8d Mon Sep 17 00:00:00 2001 From: ASDAlexander77 Date: Mon, 20 Jul 2026 21:51:48 +0100 Subject: [PATCH] Extend interface extends coverage to 3-target extends clauses Adds a cross-module test pair for `interface Combined extends A, B, C` to stress the vtable-offset accumulation and extends-dedup guard from PR #268 (which only had 2-target diamond coverage) at N=3. Verified via live debug trace that the fix generalizes correctly; full extends-interface test family (12 tests) passes. Co-Authored-By: Claude Sonnet 5 --- tslang/test/tester/CMakeLists.txt | 2 + ...ructural_typed_extends_interface_triple.ts | 38 +++++++++++++++++++ ...ructural_typed_extends_interface_triple.ts | 21 ++++++++++ 3 files changed, 61 insertions(+) create mode 100644 tslang/test/tester/tests/export_object_literal_structural_typed_extends_interface_triple.ts create mode 100644 tslang/test/tester/tests/import_object_literal_structural_typed_extends_interface_triple.ts diff --git a/tslang/test/tester/CMakeLists.txt b/tslang/test/tester/CMakeLists.txt index 157a2cf3..8fa42a21 100644 --- a/tslang/test/tester/CMakeLists.txt +++ b/tslang/test/tester/CMakeLists.txt @@ -868,6 +868,7 @@ add_test(NAME test-compile-shared-export-import-object-literal-structural-typed- add_test(NAME test-compile-shared-export-import-object-literal-structural-typed-extends-interface COMMAND test-runner -shared -gctors-as-method "${PROJECT_SOURCE_DIR}/test/tester/tests/import_object_literal_structural_typed_extends_interface.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_object_literal_structural_typed_extends_interface.ts") add_test(NAME test-compile-shared-export-import-object-literal-structural-typed-extends-interface-multilevel COMMAND test-runner -shared -gctors-as-method "${PROJECT_SOURCE_DIR}/test/tester/tests/import_object_literal_structural_typed_extends_interface_multilevel.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_object_literal_structural_typed_extends_interface_multilevel.ts") add_test(NAME test-compile-shared-export-import-object-literal-structural-typed-extends-interface-diamond COMMAND test-runner -shared -gctors-as-method "${PROJECT_SOURCE_DIR}/test/tester/tests/import_object_literal_structural_typed_extends_interface_diamond.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_object_literal_structural_typed_extends_interface_diamond.ts") +add_test(NAME test-compile-shared-export-import-object-literal-structural-typed-extends-interface-triple COMMAND test-runner -shared -gctors-as-method "${PROJECT_SOURCE_DIR}/test/tester/tests/import_object_literal_structural_typed_extends_interface_triple.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_object_literal_structural_typed_extends_interface_triple.ts") add_test(NAME test-compile-shared-export-import-vars COMMAND test-runner -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_vars.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_vars.ts") add_test(NAME test-compile-shared-export-import-vars-2 COMMAND test-runner -shared -gctors-as-method "${PROJECT_SOURCE_DIR}/test/tester/tests/import_vars2.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_vars2.ts") add_test(NAME test-compile-shared-export-import-enum COMMAND test-runner -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_enum.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_enum.ts") @@ -892,6 +893,7 @@ add_test(NAME test-jit-shared-export-import-object-literal-structural-typed-inte add_test(NAME test-jit-shared-export-import-object-literal-structural-typed-extends-interface COMMAND test-runner -jit -shared -gctors-as-method "${PROJECT_SOURCE_DIR}/test/tester/tests/import_object_literal_structural_typed_extends_interface.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_object_literal_structural_typed_extends_interface.ts") add_test(NAME test-jit-shared-export-import-object-literal-structural-typed-extends-interface-multilevel COMMAND test-runner -jit -shared -gctors-as-method "${PROJECT_SOURCE_DIR}/test/tester/tests/import_object_literal_structural_typed_extends_interface_multilevel.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_object_literal_structural_typed_extends_interface_multilevel.ts") add_test(NAME test-jit-shared-export-import-object-literal-structural-typed-extends-interface-diamond COMMAND test-runner -jit -shared -gctors-as-method "${PROJECT_SOURCE_DIR}/test/tester/tests/import_object_literal_structural_typed_extends_interface_diamond.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_object_literal_structural_typed_extends_interface_diamond.ts") +add_test(NAME test-jit-shared-export-import-object-literal-structural-typed-extends-interface-triple COMMAND test-runner -jit -shared -gctors-as-method "${PROJECT_SOURCE_DIR}/test/tester/tests/import_object_literal_structural_typed_extends_interface_triple.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_object_literal_structural_typed_extends_interface_triple.ts") add_test(NAME test-jit-shared-export-import-vars COMMAND test-runner -jit -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_vars.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_vars.ts") add_test(NAME test-jit-shared-export-import-vars-2 COMMAND test-runner -jit -shared -gctors-as-method "${PROJECT_SOURCE_DIR}/test/tester/tests/import_vars2.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_vars2.ts") add_test(NAME test-jit-shared-export-import-enum COMMAND test-runner -jit -shared "${PROJECT_SOURCE_DIR}/test/tester/tests/import_enum.ts" "${PROJECT_SOURCE_DIR}/test/tester/tests/export_enum.ts") diff --git a/tslang/test/tester/tests/export_object_literal_structural_typed_extends_interface_triple.ts b/tslang/test/tester/tests/export_object_literal_structural_typed_extends_interface_triple.ts new file mode 100644 index 00000000..5f8a6d03 --- /dev/null +++ b/tslang/test/tester/tests/export_object_literal_structural_typed_extends_interface_triple.ts @@ -0,0 +1,38 @@ +namespace M3 { + export interface A { + a: number; + addA(n: number): void; + } + export interface B { + b: number; + addB(n: number): void; + } + export interface C { + c: number; + addC(n: number): void; + } + export interface Combined extends A, B, C { + combined: number; + addCombined(n: number): void; + } + + export var rawCombined: { + a: number; + addA(n: number): void; + b: number; + addB(n: number): void; + c: number; + addC(n: number): void; + combined: number; + addCombined(n: number): void; + } = { + a: 1.0, + addA(n: number) { this.a = this.a + n; }, + b: 2.0, + addB(n: number) { this.b = this.b + n; }, + c: 3.0, + addC(n: number) { this.c = this.c + n; }, + combined: 4.0, + addCombined(n: number) { this.combined = this.combined + n; }, + }; +} diff --git a/tslang/test/tester/tests/import_object_literal_structural_typed_extends_interface_triple.ts b/tslang/test/tester/tests/import_object_literal_structural_typed_extends_interface_triple.ts new file mode 100644 index 00000000..aad925a2 --- /dev/null +++ b/tslang/test/tester/tests/import_object_literal_structural_typed_extends_interface_triple.ts @@ -0,0 +1,21 @@ +import './export_object_literal_structural_typed_extends_interface_triple' + +let combined: M3.Combined = M3.rawCombined; + +combined.addA(10); +assert(combined.a == 11); +print(combined.a); + +combined.addB(20); +assert(combined.b == 22); +print(combined.b); + +combined.addC(30); +assert(combined.c == 33); +print(combined.c); + +combined.addCombined(40); +assert(combined.combined == 44); +print(combined.combined); + +print("done.");