Skip abstract methods in member lookup for inference.

Change-Id: Ic07e1f6f038ebf6a9767c65777c0d6898131b632
Reviewed-on: https://dart-review.googlesource.com/19000
Reviewed-by: Sigmund Cherem <sigmund@google.com>
This commit is contained in:
Johnni Winther 2017-11-09 08:15:09 +00:00
parent 6a31d08d59
commit 67d6c7095b
4 changed files with 26 additions and 1 deletions

View file

@ -1747,6 +1747,7 @@ abstract class KernelClosedWorldMixin implements ClosedWorldBase {
cls, selector.name,
setter: selector.isSetter);
if (member != null &&
!member.isAbstract &&
(!selector.memberName.isPrivate ||
member.library == selector.library)) {
return member == element;

View file

@ -98,6 +98,9 @@ Future<CompiledData> computeData(
}
void processMember(MemberEntity member) {
if (member.isAbstract) {
return;
}
if (skipUnprocessedMembers &&
!closedWorld.processedMembers.contains(member)) {
return;
@ -455,6 +458,7 @@ Future<bool> compareData(
bool skipUnprocessedMembers: false,
bool skipFailedCompilations: false,
bool verbose: false}) async {
print('--from ast----------------------------------------------------------');
CompiledData data1 = await computeData(
entryPoint, memorySourceFiles, computeAstData,
options: options,
@ -462,6 +466,7 @@ Future<bool> compareData(
skipUnprocessedMembers: skipUnprocessedMembers,
skipFailedCompilations: skipFailedCompilations);
if (data1 == null) return false;
print('--from kernel-------------------------------------------------------');
CompiledData data2 = await computeData(
entryPoint, memorySourceFiles, computeIrData,
options: [Flags.useKernel]..addAll(options),

View file

@ -0,0 +1,20 @@
// Copyright (c) 2017, 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.
/*element: main:[null]*/
main() {
abstractEquals();
}
////////////////////////////////////////////////////////////////////////////////
// Call abstract method implemented by superclass.
////////////////////////////////////////////////////////////////////////////////
/*element: Class1.:[exact=Class1]*/
class Class1 {
operator ==(_);
}
/*element: abstractEquals:[exact=JSBool]*/
abstractEquals() => new Class1() /*invoke: [exact=Class1]*/ == new Class1();

View file

@ -280,7 +280,6 @@ abstract class Class8 {
/*invoke: [subclass=Class8]*/ method8();
}
/*element: Class8.method8:[empty]*/
method8();
}