From 3fe40ecfb923b334667df32d8860a3fe4e8dfea8 Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Fri, 19 Aug 2022 11:44:28 +0800 Subject: [PATCH 1/3] fix: override keywords --- src/program.ts | 23 +- .../compiler/class-overloading-cast.debug.wat | 194 +++++++++++++--- .../class-overloading-cast.release.wat | 214 +++++++++++++----- tests/compiler/class-overloading-cast.ts | 13 +- 4 files changed, 356 insertions(+), 88 deletions(-) diff --git a/src/program.ts b/src/program.ts index 5d47d44b88..c82fd1de63 100644 --- a/src/program.ts +++ b/src/program.ts @@ -1467,11 +1467,13 @@ export class Program extends DiagnosticEmitter { // TODO: make this work with interfaaces as well var thisInstanceMembers = thisPrototype.instanceMembers; if (thisInstanceMembers) { + let thisMembers = Map_values(thisInstanceMembers); + let isOverrided = thisMembers.map(member => !member.is(CommonFlags.OVERRIDE)); do { let baseInstanceMembers = basePrototype.instanceMembers; if (baseInstanceMembers) { - for (let _values = Map_values(thisInstanceMembers), j = 0, l = _values.length; j < l; ++j) { - let thisMember = _values[j]; + for (let j = 0, l = thisMembers.length; j < l; ++j) { + let thisMember = thisMembers[j]; if ( !thisMember.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.PRIVATE) && baseInstanceMembers.has(thisMember.name) @@ -1549,11 +1551,8 @@ export class Program extends DiagnosticEmitter { } } } - if (thisMember.is(CommonFlags.OVERRIDE) && !baseInstanceMembers.has(thisMember.name)) { - this.error( - DiagnosticCode.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0, - thisMember.identifierNode.range, basePrototype.name - ); + if (!isOverrided[j] && baseInstanceMembers.has(thisMember.name)) { + isOverrided[j] = true; } } } @@ -1561,6 +1560,16 @@ export class Program extends DiagnosticEmitter { if (!nextPrototype) break; basePrototype = nextPrototype; } while (true); + // check override + for (let j = 0, l = thisMembers.length; j < l; ++j) { + if (!isOverrided[j]) { + this.error( + DiagnosticCode.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0, + thisMembers[j].identifierNode.range, + basePrototype.name + ); + } + } } } diff --git a/tests/compiler/class-overloading-cast.debug.wat b/tests/compiler/class-overloading-cast.debug.wat index 383e81f270..8fb4f92482 100644 --- a/tests/compiler/class-overloading-cast.debug.wat +++ b/tests/compiler/class-overloading-cast.debug.wat @@ -10,6 +10,7 @@ (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) + (type $i32_f32_=>_i32 (func (param i32 f32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -30,10 +31,10 @@ (global $class-overloading-cast/v3 (mut i32) (i32.const 0)) (global $~lib/native/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $class-overloading-cast/c (mut i32) (i32.const 0)) - (global $~lib/rt/__rtti_base i32 (i32.const 592)) - (global $~lib/memory/__data_end i32 (i32.const 676)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17060)) - (global $~lib/memory/__heap_base i32 (i32.const 17060)) + (global $~lib/rt/__rtti_base i32 (i32.const 624)) + (global $~lib/memory/__data_end i32 (i32.const 732)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17116)) + (global $~lib/memory/__heap_base i32 (i32.const 17116)) (global $~started (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") @@ -48,7 +49,8 @@ (data (i32.const 444) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00B\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 476) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\002\00\00\00c\00l\00a\00s\00s\00-\00o\00v\00e\00r\00l\00o\00a\00d\00i\00n\00g\00-\00c\00a\00s\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 556) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 592) "\n\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\04\00\00\00 \00\00\00\00\00\00\00 \00\00\00\04\00\00\00 \00\00\00\07\00\00\00 \00\00\00\00\00\00\00 \00\00\00\t\00\00\00 \00\00\00\00\00\00\00") + (data (i32.const 588) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00D\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 624) "\0d\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\04\00\00\00 \00\00\00\00\00\00\00 \00\00\00\04\00\00\00 \00\00\00\07\00\00\00 \00\00\00\00\00\00\00 \00\00\00\t\00\00\00 \00\00\00\00\00\00\00 \00\00\00\0b\00\00\00 \00\00\00\0c\00\00\00 \00\00\00\00\00\00\00") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "memory" (memory $0)) @@ -2292,6 +2294,9 @@ (func $class-overloading-cast/A<~lib/string/String>#foo (param $0 i32) (param $1 i32) (result i32) i32.const 432 ) + (func $class-overloading-cast/D#bar (param $0 i32) (param $1 f32) (result i32) + i32.const 608 + ) (func $class-overloading-cast/B#foo (param $0 i32) (param $1 i32) (result i32) i32.const 464 ) @@ -2417,29 +2422,38 @@ ) (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) block $invalid - block $class-overloading-cast/A<~lib/string/String> - block $class-overloading-cast/C - block $class-overloading-cast/A - block $class-overloading-cast/B - block $class-overloading-cast/B - block $class-overloading-cast/A - block $class-overloading-cast/B - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer + block $class-overloading-cast/A + block $class-overloading-cast/B + block $class-overloading-cast/D + block $class-overloading-cast/A<~lib/string/String> + block $class-overloading-cast/C + block $class-overloading-cast/A + block $class-overloading-cast/B + block $class-overloading-cast/B + block $class-overloading-cast/A + block $class-overloading-cast/B + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $class-overloading-cast/B $class-overloading-cast/A $class-overloading-cast/B $class-overloading-cast/B $class-overloading-cast/A $class-overloading-cast/C $class-overloading-cast/A<~lib/string/String> $class-overloading-cast/D $class-overloading-cast/B $class-overloading-cast/A $invalid + end + return + end + return + end local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $class-overloading-cast/B $class-overloading-cast/A $class-overloading-cast/B $class-overloading-cast/B $class-overloading-cast/A $class-overloading-cast/C $class-overloading-cast/A<~lib/string/String> $invalid + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return end return end return end - local.get $0 - local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit return end return @@ -2472,8 +2486,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17088 i32.const 17136 + i32.const 17184 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2543,7 +2557,7 @@ if i32.const 0 i32.const 496 - i32.const 17 + i32.const 26 i32.const 1 call $~lib/builtins/abort unreachable @@ -2572,7 +2586,7 @@ if i32.const 0 i32.const 496 - i32.const 18 + i32.const 27 i32.const 1 call $~lib/builtins/abort unreachable @@ -2601,7 +2615,7 @@ if i32.const 0 i32.const 496 - i32.const 19 + i32.const 28 i32.const 1 call $~lib/builtins/abort unreachable @@ -2638,7 +2652,7 @@ if i32.const 0 i32.const 496 - i32.const 23 + i32.const 32 i32.const 1 call $~lib/builtins/abort unreachable @@ -2672,7 +2686,37 @@ if i32.const 0 i32.const 496 - i32.const 24 + i32.const 33 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + call $class-overloading-cast/D#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + f32.const 2.5 + call $class-overloading-cast/D#bar + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 608 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 496 + i32.const 35 i32.const 1 call $~lib/builtins/abort unreachable @@ -2898,4 +2942,98 @@ global.set $~lib/memory/__stack_pointer local.get $1 ) + (func $class-overloading-cast/A#constructor (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 12 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + local.get $0 + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $class-overloading-cast/B#constructor (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 11 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $0 + call $class-overloading-cast/A#constructor + local.tee $0 + i32.store + local.get $0 + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $class-overloading-cast/D#constructor (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 10 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $0 + call $class-overloading-cast/B#constructor + local.tee $0 + i32.store + local.get $0 + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) ) diff --git a/tests/compiler/class-overloading-cast.release.wat b/tests/compiler/class-overloading-cast.release.wat index 966d1dbded..5c904f7276 100644 --- a/tests/compiler/class-overloading-cast.release.wat +++ b/tests/compiler/class-overloading-cast.release.wat @@ -22,7 +22,7 @@ (global $class-overloading-cast/v2 (mut i32) (i32.const 0)) (global $class-overloading-cast/v3 (mut i32) (i32.const 0)) (global $class-overloading-cast/c (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18084)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18140)) (global $~started (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 1036) "<") @@ -43,8 +43,10 @@ (data (i32.const 1512) "\01\00\00\002\00\00\00c\00l\00a\00s\00s\00-\00o\00v\00e\00r\00l\00o\00a\00d\00i\00n\00g\00-\00c\00a\00s\00t\00.\00t\00s") (data (i32.const 1580) "\1c") (data (i32.const 1592) "\01\00\00\00\02\00\00\00a") - (data (i32.const 1616) "\n\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 1644) " \00\00\00\04\00\00\00 \00\00\00\00\00\00\00 \00\00\00\04\00\00\00 \00\00\00\07\00\00\00 \00\00\00\00\00\00\00 \00\00\00\t\00\00\00 ") + (data (i32.const 1612) "\1c") + (data (i32.const 1624) "\01\00\00\00\02\00\00\00D") + (data (i32.const 1648) "\0d\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1676) " \00\00\00\04\00\00\00 \00\00\00\00\00\00\00 \00\00\00\04\00\00\00 \00\00\00\07\00\00\00 \00\00\00\00\00\00\00 \00\00\00\t\00\00\00 \00\00\00\00\00\00\00 \00\00\00\0b\00\00\00 \00\00\00\0c\00\00\00 ") (export "memory" (memory $0)) (export "_start" (func $~start)) (func $~lib/rt/itcms/visitRoots @@ -647,10 +649,10 @@ if unreachable end - i32.const 18096 + i32.const 18144 i32.const 0 i32.store - i32.const 19664 + i32.const 19712 i32.const 0 i32.store loop $for-loop|0 @@ -661,7 +663,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 18096 + i32.const 18144 i32.add i32.const 0 i32.store offset=4 @@ -679,7 +681,7 @@ i32.add i32.const 2 i32.shl - i32.const 18096 + i32.const 18144 i32.add i32.const 0 i32.store offset=96 @@ -697,13 +699,13 @@ br $for-loop|0 end end - i32.const 18096 - i32.const 19668 + i32.const 18144 + i32.const 19716 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18096 + i32.const 18144 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -788,7 +790,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18084 + i32.const 18140 i32.lt_u if local.get $0 @@ -888,7 +890,7 @@ unreachable end local.get $0 - i32.const 18084 + i32.const 18140 i32.lt_u if local.get $0 @@ -911,7 +913,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 18084 + i32.const 18140 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1382,33 +1384,42 @@ ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid - block $class-overloading-cast/A<~lib/string/String> - block $class-overloading-cast/C - block $class-overloading-cast/A - block $class-overloading-cast/B - block $class-overloading-cast/B - block $class-overloading-cast/A - block $class-overloading-cast/B - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer + block $class-overloading-cast/A + block $class-overloading-cast/B + block $class-overloading-cast/D + block $class-overloading-cast/A<~lib/string/String> + block $class-overloading-cast/C + block $class-overloading-cast/A + block $class-overloading-cast/B + block $class-overloading-cast/B + block $class-overloading-cast/A + block $class-overloading-cast/B + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $class-overloading-cast/B $class-overloading-cast/A $class-overloading-cast/B $class-overloading-cast/B $class-overloading-cast/A $class-overloading-cast/C $class-overloading-cast/A<~lib/string/String> $class-overloading-cast/D $class-overloading-cast/B $class-overloading-cast/A $invalid + end + return + end + return + end local.get $0 - i32.const 8 - i32.sub i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $class-overloading-cast/B $class-overloading-cast/A $class-overloading-cast/B $class-overloading-cast/B $class-overloading-cast/A $class-overloading-cast/C $class-overloading-cast/A<~lib/string/String> $invalid + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + return end return end return end - local.get $0 - i32.load - local.tee $0 - if - local.get $0 - call $byn-split-outlined-A$~lib/rt/itcms/__visit - end return end return @@ -1439,13 +1450,14 @@ (func $start:class-overloading-cast (local $0 i32) (local $1 i32) + (local $2 i32) global.get $~lib/memory/__stack_pointer i32.const 16 i32.sub global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1700 + i32.const 1756 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1458,7 +1470,7 @@ memory.size i32.const 16 i32.shl - i32.const 18084 + i32.const 18140 i32.sub i32.const 1 i32.shr_u @@ -1492,7 +1504,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1700 + i32.const 1756 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1520,7 +1532,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1700 + i32.const 1756 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1548,7 +1560,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1700 + i32.const 1756 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1566,7 +1578,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1700 + i32.const 1756 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1636,7 +1648,7 @@ if i32.const 0 i32.const 1520 - i32.const 17 + i32.const 26 i32.const 1 call $~lib/builtins/abort unreachable @@ -1658,7 +1670,7 @@ if i32.const 0 i32.const 1520 - i32.const 18 + i32.const 27 i32.const 1 call $~lib/builtins/abort unreachable @@ -1694,7 +1706,7 @@ if i32.const 0 i32.const 1520 - i32.const 19 + i32.const 28 i32.const 1 call $~lib/builtins/abort unreachable @@ -1704,7 +1716,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1700 + i32.const 1756 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1722,7 +1734,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1700 + i32.const 1756 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1775,7 +1787,7 @@ if i32.const 0 i32.const 1520 - i32.const 23 + i32.const 32 i32.const 1 call $~lib/builtins/abort unreachable @@ -1806,7 +1818,105 @@ if i32.const 0 i32.const 1520 - i32.const 24 + i32.const 33 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1756 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i32.const 0 + i32.store + local.get $0 + i32.const 10 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.tee $2 + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1756 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 11 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1756 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 12 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1632 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1632 + i32.store offset=4 + i32.const 1632 + i32.const 1632 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1520 + i32.const 35 i32.const 1 call $~lib/builtins/abort unreachable @@ -1817,8 +1927,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 18112 i32.const 18160 + i32.const 18208 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1830,11 +1940,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1700 + i32.const 1756 i32.lt_s if - i32.const 18112 i32.const 18160 + i32.const 18208 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1901,7 +2011,7 @@ if i32.const 0 local.get $1 - i32.const 18084 + i32.const 18140 i32.lt_u local.get $1 i32.load offset=8 @@ -1952,7 +2062,7 @@ i32.const 1 else local.get $0 - i32.const 1616 + i32.const 1648 i32.load i32.gt_u if @@ -1966,7 +2076,7 @@ local.get $0 i32.const 3 i32.shl - i32.const 1620 + i32.const 1652 i32.add i32.load i32.const 32 diff --git a/tests/compiler/class-overloading-cast.ts b/tests/compiler/class-overloading-cast.ts index 38b07f5c67..75b70c52fb 100644 --- a/tests/compiler/class-overloading-cast.ts +++ b/tests/compiler/class-overloading-cast.ts @@ -2,6 +2,9 @@ class A { foo(a: T): string { return "A"; } + bar(a: T): string { + return "A"; + } } class B extends A { override foo(a: T): string { @@ -9,7 +12,13 @@ class B extends A { } } -class C extends A{} +class C extends A {} + +class D extends B { + override bar(a: f32): string { + return "D"; + } +} let v = new B(); let v2 = new B(); @@ -22,3 +31,5 @@ let c = new C(); assert(c.foo("a") == "A"); assert((>c).foo("a") == "A"); + +assert(new D().bar(2.5) == "D"); From 078befacf0b81f654badda53521951ec9ca3e237 Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Sun, 21 Aug 2022 09:30:34 +0800 Subject: [PATCH 2/3] resolve conflict --- tests/compiler/class-overloading-cast.debug.wat | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/compiler/class-overloading-cast.debug.wat b/tests/compiler/class-overloading-cast.debug.wat index 4b51b591b2..67c84be6c1 100644 --- a/tests/compiler/class-overloading-cast.debug.wat +++ b/tests/compiler/class-overloading-cast.debug.wat @@ -2294,14 +2294,10 @@ (func $class-overloading-cast/A<~lib/string/String>#foo (param $this i32) (param $a i32) (result i32) i32.const 432 ) -<<<<<<< HEAD - (func $class-overloading-cast/D#bar (param $0 i32) (param $1 f32) (result i32) + (func $class-overloading-cast/D#bar (param $this i32) (param $a f32) (result i32) i32.const 608 ) - (func $class-overloading-cast/B#foo (param $0 i32) (param $1 i32) (result i32) -======= (func $class-overloading-cast/B#foo (param $this i32) (param $a i32) (result i32) ->>>>>>> main i32.const 464 ) (func $class-overloading-cast/B#foo (param $this i32) (param $a f64) (result i32) From dbda9f0e9fbbd4df8c0ab691fa2e945d127284bf Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Sat, 3 Sep 2022 12:32:08 +0800 Subject: [PATCH 3/3] refactory override check --- src/program.ts | 49 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/src/program.ts b/src/program.ts index 8c11a51b63..152c61010c 100644 --- a/src/program.ts +++ b/src/program.ts @@ -1348,6 +1348,41 @@ export class Program extends DiagnosticEmitter { } } + // check override + for (let i = 0, k = queuedExtends.length; i < k; i++) { + let prototype = queuedExtends[i]; + let instanesMembers = prototype.instanceMembers; + if (instanesMembers) { + let members = Map_values(instanesMembers); + for (let j = 0, k = members.length; j < k; j++) { + let member = members[j]; + let declaration = member.declaration; + if (declaration.is(CommonFlags.OVERRIDE)) { + let basePrototype = prototype.basePrototype; + let hasOverride = false; + while (basePrototype) { + let instanceMembers = basePrototype.instanceMembers; + if (instanceMembers) { + if (instanceMembers.has(member.name)) { + hasOverride = true; + break; + } + } + basePrototype = basePrototype.basePrototype; + } + if (!hasOverride) { + let basePrototype = assert(prototype.basePrototype); + this.error( + DiagnosticCode.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0, + declaration.name.range, + basePrototype.name + ); + } + } + } + } + } + // resolve prototypes of implemented interfaces for (let i = 0, k = queuedImplements.length; i < k; ++i) { let thisPrototype = queuedImplements[i]; @@ -1450,7 +1485,6 @@ export class Program extends DiagnosticEmitter { var thisInstanceMembers = thisPrototype.instanceMembers; if (thisInstanceMembers) { let thisMembers = Map_values(thisInstanceMembers); - let isOverrided = thisMembers.map(member => !member.is(CommonFlags.OVERRIDE)); do { let baseInstanceMembers = basePrototype.instanceMembers; if (baseInstanceMembers) { @@ -1533,25 +1567,12 @@ export class Program extends DiagnosticEmitter { } } } - if (!isOverrided[j] && baseInstanceMembers.has(thisMember.name)) { - isOverrided[j] = true; - } } } let nextPrototype = basePrototype.basePrototype; if (!nextPrototype) break; basePrototype = nextPrototype; } while (true); - // check override - for (let j = 0, l = thisMembers.length; j < l; ++j) { - if (!isOverrided[j]) { - this.error( - DiagnosticCode.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0, - thisMembers[j].identifierNode.range, - basePrototype.name - ); - } - } } }