diff --git a/pkg/dart2wasm/lib/code_generator.dart b/pkg/dart2wasm/lib/code_generator.dart index 5a7176dfb6e..3c5087d1470 100644 --- a/pkg/dart2wasm/lib/code_generator.dart +++ b/pkg/dart2wasm/lib/code_generator.dart @@ -379,10 +379,18 @@ abstract class AstCodeGenerator canSafelyOmitImplicitChecks: !translator.needToCheckTypesFor(member)); } + void setupParametersForCheckedEntry(Member member) { + assert(member.isInstanceMember); + assert(translator.needToCheckTypesFor(member)); + setupParameters(member.checkedEntryReference, + canSafelyOmitImplicitChecks: false); + } + void setupParametersForUncheckedEntry(Member member) { assert(member.isInstanceMember); assert(translator.needToCheckTypesFor(member)); - setupParameters(member.reference, canSafelyOmitImplicitChecks: true); + setupParameters(member.uncheckedEntryReference, + canSafelyOmitImplicitChecks: true); } void setupContexts(Member member) { @@ -3299,7 +3307,7 @@ class SynchronousProcedureCodeGenerator extends AstCodeGenerator { final function = member.function; final signature = translator.signatureForDirectCall(member.bodyReference); if (checked) { - setupParametersForNormalEntry(member); + setupParametersForCheckedEntry(member); } else { setupParametersForUncheckedEntry(member); } diff --git a/tests/language/regress/regress60148_test.dart b/tests/language/regress/regress60148_test.dart new file mode 100644 index 00000000000..24ea8efd8b6 --- /dev/null +++ b/tests/language/regress/regress60148_test.dart @@ -0,0 +1,27 @@ +// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; + +import 'package:expect/expect.dart'; + +main() async { + final l = >[B(), C()]; + Expect.equals('B.foo(1, first=1)', l[0].foo(1)); + Expect.equals('C.foo(2, second=true)', l[1].foo(2)); + Expect.equals('B.foo(3, first=2)', B().foo(3, first: 2)); + Expect.equals('C.foo(4, second=false)', C().foo(4, second: false)); +} + +abstract class A { + String foo(T a); +} + +class B extends A { + String foo(T a, {int first = 1}) => 'B.foo($a, first=$first)'; +} + +class C extends A { + String foo(T a, {bool second = true}) => 'C.foo($a, second=$second)'; +}