mirror of
https://github.com/dart-lang/sdk
synced 2024-09-15 22:19:49 +00:00
Add tests of instantiate to bound in method bodies
Change-Id: Ife92207a5c58e7220a5607b2d798fe40bd779f4e Reviewed-on: https://dart-review.googlesource.com/34041 Commit-Queue: Dmitry Stefantsov <dmitryas@google.com> Reviewed-by: Paul Berry <paulberry@google.com>
This commit is contained in:
parent
10058a3600
commit
3371183b24
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound provides missing type arguments to
|
||||||
|
// raw interface types found in bodies of methods in cases where those types
|
||||||
|
// refer to classes imported from compiled dill files.
|
||||||
|
|
||||||
|
import 'dart:collection';
|
||||||
|
|
||||||
|
class A {
|
||||||
|
foo() {
|
||||||
|
LinkedListEntry bar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
LinkedListEntry bar;
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
import "dart:collection" as col;
|
||||||
|
|
||||||
|
class A extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method foo() → dynamic {
|
||||||
|
col::LinkedListEntry<col::LinkedListEntry<dynamic>> bar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {
|
||||||
|
col::LinkedListEntry<col::LinkedListEntry<dynamic>> bar;
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound provides type arguments to raw
|
||||||
|
// interface types that are themselves used as type arguments of literal lists
|
||||||
|
// found in method bodies.
|
||||||
|
|
||||||
|
class A<T extends num> {}
|
||||||
|
|
||||||
|
class B {
|
||||||
|
foo() {
|
||||||
|
var a = <A>[];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
var a = <A>[];
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
|
||||||
|
class A<T extends core::num> extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
class B extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method foo() → dynamic {
|
||||||
|
core::List<self::A<core::num>> a = <self::A<core::num>>[];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {
|
||||||
|
core::List<self::A<core::num>> a = <self::A<core::num>>[];
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound leaves interface types that have
|
||||||
|
// their type arguments defined by the programmer intact in cases when those
|
||||||
|
// interface types are used as type arguments of literal lists that are found in
|
||||||
|
// method bodies.
|
||||||
|
|
||||||
|
class A<T> {}
|
||||||
|
|
||||||
|
class B<U> {
|
||||||
|
fun() {
|
||||||
|
List<A<U>> foo = <A<U>>[];
|
||||||
|
List<A<num>> bar = <A<num>>[];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {}
|
|
@ -0,0 +1,19 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
|
||||||
|
class A<T extends core::Object> extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
class B<U extends core::Object> extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method fun() → dynamic {
|
||||||
|
core::List<self::A<self::B::U>> foo = <self::A<self::B::U>>[];
|
||||||
|
core::List<self::A<core::num>> bar = <self::A<core::num>>[];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {}
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound provides type arguments to raw
|
||||||
|
// interface types that are themselves used as type arguments of literal maps
|
||||||
|
// found in method bodies.
|
||||||
|
|
||||||
|
class A<T extends num> {}
|
||||||
|
|
||||||
|
class B {
|
||||||
|
foo() {
|
||||||
|
var a = <A, A>{};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
var a = <A, A>{};
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
|
||||||
|
class A<T extends core::num> extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
class B extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method foo() → dynamic {
|
||||||
|
core::Map<self::A<core::num>, self::A<core::num>> a = <self::A<core::num>, self::A<core::num>>{};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {
|
||||||
|
core::Map<self::A<core::num>, self::A<core::num>> a = <self::A<core::num>, self::A<core::num>>{};
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound provides `dynamic` as the type
|
||||||
|
// argument for those positions in type argument lists of interface types that
|
||||||
|
// have the bound omitted in the corresponding type parameter, regardless of
|
||||||
|
// whether the classes that are referred to by the interface types are imported
|
||||||
|
// from compiled dill libraries or are defined within the source files being
|
||||||
|
// compiled. Only those interface types are considered in this test case that
|
||||||
|
// are found in type annotations in method bodies.
|
||||||
|
|
||||||
|
import 'dart:collection';
|
||||||
|
|
||||||
|
class A<T> {}
|
||||||
|
|
||||||
|
class C {
|
||||||
|
fun() {
|
||||||
|
A a;
|
||||||
|
DoubleLinkedQueue c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
A a;
|
||||||
|
DoubleLinkedQueue c;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
import "dart:collection" as col;
|
||||||
|
|
||||||
|
class A<T extends core::Object> extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
class C extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method fun() → dynamic {
|
||||||
|
self::A<dynamic> a;
|
||||||
|
col::DoubleLinkedQueue<dynamic> c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {
|
||||||
|
self::A<dynamic> a;
|
||||||
|
col::DoubleLinkedQueue<dynamic> c;
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound produces correct super-bounded
|
||||||
|
// types from raw interface types that refer to F-bounded classes and are found
|
||||||
|
// in method bodies.
|
||||||
|
|
||||||
|
class A<T extends A<T>> {}
|
||||||
|
|
||||||
|
class B {
|
||||||
|
foo() {
|
||||||
|
A a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
A a;
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
|
||||||
|
class A<T extends self::A<self::A::T>> extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
class B extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method foo() → dynamic {
|
||||||
|
self::A<self::A<dynamic>> a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {
|
||||||
|
self::A<self::A<dynamic>> a;
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound provides type arguments to raw
|
||||||
|
// typedef types that are themselves used as type arguments of literal lists and
|
||||||
|
// are found in method bodies.
|
||||||
|
|
||||||
|
typedef A<T extends num>(T p);
|
||||||
|
|
||||||
|
class B {
|
||||||
|
foo() {
|
||||||
|
var a = <A>[];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
var a = <A>[];
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
|
||||||
|
typedef A<T extends core::num> = (T) → dynamic;
|
||||||
|
class B extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method foo() → dynamic {
|
||||||
|
core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {
|
||||||
|
core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound leaves typedef types that have
|
||||||
|
// their arguments defined by the programmer intact in cases when those typedef
|
||||||
|
// types are used as type arguments of literal lists and are found in method
|
||||||
|
// bodies.
|
||||||
|
|
||||||
|
typedef A<T>(T p);
|
||||||
|
|
||||||
|
class B<U> {
|
||||||
|
fun() {
|
||||||
|
List<A<U>> foo = <A<U>>[];
|
||||||
|
List<A<num>> bar = <A<num>>[];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
List<A<num>> bar = <A<num>>[];
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
|
||||||
|
typedef A<T extends core::Object> = (T) → dynamic;
|
||||||
|
class B<U extends core::Object> extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method fun() → dynamic {
|
||||||
|
core::List<(self::B::U) → dynamic> foo = <(self::B::U) → dynamic>[];
|
||||||
|
core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {
|
||||||
|
core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound provides type arguments to raw
|
||||||
|
// typedef types that are themselves used as type arguments in literal maps
|
||||||
|
// found in method bodies.
|
||||||
|
|
||||||
|
typedef A<T extends num>(T p);
|
||||||
|
|
||||||
|
class B {
|
||||||
|
foo() {
|
||||||
|
var a = <A, A>{};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
var a = <A, A>{};
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
|
||||||
|
typedef A<T extends core::num> = (T) → dynamic;
|
||||||
|
class B extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method foo() → dynamic {
|
||||||
|
core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → dynamic>{};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {
|
||||||
|
core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → dynamic>{};
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound provides `dynamic` as the type
|
||||||
|
// argument for those positions in type argument lists of typedef types that
|
||||||
|
// have the bound omitted in the corresponding type parameters. Only those
|
||||||
|
// typedef types are considered in the test that are found in method bodies.
|
||||||
|
|
||||||
|
typedef A<T>(T p);
|
||||||
|
|
||||||
|
class C {
|
||||||
|
foo() {
|
||||||
|
A a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
A a;
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
|
||||||
|
typedef A<T extends core::Object> = (T) → dynamic;
|
||||||
|
class C extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method foo() → dynamic {
|
||||||
|
(dynamic) → dynamic a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {
|
||||||
|
(dynamic) → dynamic a;
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright (c) 2018, 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.
|
||||||
|
|
||||||
|
// This test checks that instantiate to bound produces correct super-bounded
|
||||||
|
// types from raw typedef types that refer to F-bounded typedefs and are found
|
||||||
|
// in method bodies.
|
||||||
|
|
||||||
|
typedef A<T>(T p);
|
||||||
|
|
||||||
|
typedef B<U extends A<U>>(U p);
|
||||||
|
|
||||||
|
class C {
|
||||||
|
foo() {
|
||||||
|
B b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
B b;
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
library;
|
||||||
|
import self as self;
|
||||||
|
import "dart:core" as core;
|
||||||
|
|
||||||
|
typedef A<T extends core::Object> = (T) → dynamic;
|
||||||
|
typedef B<U extends (U) → dynamic> = (U) → dynamic;
|
||||||
|
class C extends core::Object {
|
||||||
|
default constructor •() → void
|
||||||
|
: super core::Object::•()
|
||||||
|
;
|
||||||
|
method foo() → dynamic {
|
||||||
|
((core::Null) → dynamic) → dynamic b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static method main() → dynamic {
|
||||||
|
((core::Null) → dynamic) → dynamic b;
|
||||||
|
}
|
|
@ -111,6 +111,7 @@ inference_new/infer_field_getter_setter_mismatch: TypeCheckError
|
||||||
inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
|
inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
|
||||||
|
|
||||||
instantiate_to_bound/typedef_super_bounded_type: Fail
|
instantiate_to_bound/typedef_super_bounded_type: Fail
|
||||||
|
instantiate_to_bound/body_typedef_super_bounded_type: Fail
|
||||||
|
|
||||||
rasta/abstract_constructor: Fail
|
rasta/abstract_constructor: Fail
|
||||||
rasta/bad_constructor_redirection: Fail
|
rasta/bad_constructor_redirection: Fail
|
||||||
|
|
Loading…
Reference in a new issue