Skip to content

Commit b0cbc4e

Browse files
Kevin Millikincommit-bot@chromium.org
Kevin Millikin
authored andcommitted
Fix a bug in top-level type inference dependency tracking
When there was a top-level type inference dependency from a declared field to an overridden getter or setter, the dependency was not recorded in the field. This caused initializing formals to sometimes fail to infer the field type, because they did not see that it needed to be inferred. Fixes #32866 Change-Id: If75658d087c099787f74af5f5c6db2ee6837febe Reviewed-on: https://dart-review.googlesource.com/62800 Commit-Queue: Kevin Millikin <[email protected]> Reviewed-by: Dmitry Stefantsov <[email protected]>
1 parent 29924c4 commit b0cbc4e

7 files changed

+114
-0
lines changed

pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,6 +1112,9 @@ class InterfaceResolver {
11121112
procedure._field.initializer != null) {
11131113
node = new FieldInitializerInferenceNode(
11141114
_typeInferenceEngine, procedure._field, library);
1115+
}
1116+
1117+
if (node != null && procedure is SyntheticAccessor) {
11151118
ShadowField.setInferenceNode(procedure._field, node);
11161119
}
11171120
}

pkg/front_end/testcases/bug32866.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
// Regression test that top-level inference correctly handles dependencies from
6+
// top-level field -> initializing formal -> field that overrides a getter.
7+
8+
abstract class B {
9+
String get f;
10+
}
11+
12+
class A implements B {
13+
final f;
14+
A(this.f);
15+
}
16+
17+
var a = new A("foo");
18+
main() => print(a);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
library;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class B extends core::Object {
6+
synthetic constructor •() → void
7+
: super core::Object::•()
8+
;
9+
abstract get f() → core::String;
10+
}
11+
class A extends core::Object implements self::B {
12+
final field dynamic f;
13+
constructor •(dynamic f) → void
14+
: self::A::f = f, super core::Object::•()
15+
;
16+
}
17+
static field dynamic a = new self::A::•("foo");
18+
static method main() → dynamic
19+
return core::print(self::a);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
library;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class B extends core::Object {
6+
synthetic constructor •() → void
7+
: super core::Object::•()
8+
;
9+
abstract get f() → core::String;
10+
}
11+
class A extends core::Object implements self::B {
12+
final field dynamic f;
13+
constructor •(dynamic f) → void
14+
: self::A::f = f, super core::Object::•()
15+
;
16+
}
17+
static field dynamic a = new self::A::•("foo");
18+
static method main() → dynamic
19+
return core::print(self::a);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
library;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class B extends core::Object {
6+
synthetic constructor •() → void
7+
;
8+
abstract get f() → core::String;
9+
}
10+
class A extends core::Object implements self::B {
11+
final field dynamic f;
12+
constructor •(dynamic f) → void
13+
;
14+
}
15+
static field dynamic a;
16+
static method main() → dynamic
17+
;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
library;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class B extends core::Object {
6+
synthetic constructor •() → void
7+
: super core::Object::•()
8+
;
9+
abstract get f() → core::String;
10+
}
11+
class A extends core::Object implements self::B {
12+
final field core::String f;
13+
constructor •(core::String f) → void
14+
: self::A::f = f, super core::Object::•()
15+
;
16+
}
17+
static field self::A a = new self::A::•("foo");
18+
static method main() → dynamic
19+
return core::print(self::a);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
library;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class B extends core::Object {
6+
synthetic constructor •() → void
7+
: super core::Object::•()
8+
;
9+
abstract get f() → core::String;
10+
}
11+
class A extends core::Object implements self::B {
12+
final field core::String f;
13+
constructor •(core::String f) → void
14+
: self::A::f = f, super core::Object::•()
15+
;
16+
}
17+
static field self::A a = new self::A::•("foo");
18+
static method main() → dynamic
19+
return core::print(self::a);

0 commit comments

Comments
 (0)