3c5767ccd3
If a type variable T is used in an `is` or `as` expression (e.g. `42 is T` or `42 as T`) or is part of a subtype check, then any types which may be substituted for T via instantiation must also be treated as participating in a type check. This CL ensures that the RTI need computation includes type arguments for those substituted types and that those types are included in the list of implicit checks. Additionally, in order for this to work, this CL fixes a bug in which the impact transformer was failing to register generic instantiations occurring in (partial) constants. Fixes: https://github.com/dart-lang/sdk/issues/45046 Change-Id: I98ae0eca0adcbbb26cdd664318da0da578b289b5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/190460 Reviewed-by: Stephen Adams <sra@google.com> Commit-Queue: Mayank Patke <fishythefish@google.com>
60 lines
1.7 KiB
Dart
60 lines
1.7 KiB
Dart
// 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.
|
|
|
|
// @dart = 2.7
|
|
|
|
import 'package:expect/expect.dart';
|
|
|
|
class Class1 {
|
|
/*member: Class1.method1:*/
|
|
num method1<T>(num n) => null;
|
|
|
|
/*member: Class1.method2:*/
|
|
num method2<T>(int n) => null;
|
|
|
|
/*member: Class1.method3:*/
|
|
int method3<T>(num n) => null;
|
|
}
|
|
|
|
class Class2 {
|
|
/*spec.member: Class2.method4:direct,explicit=[method4.T*],needsArgs,needsInst=[<num*>,<num*>,<num*>,<num*>]*/
|
|
num method4<T>(T n) => null;
|
|
}
|
|
|
|
class Class3 {
|
|
/*member: Class3.method5:*/
|
|
T method5<T>(num n) => null;
|
|
}
|
|
|
|
class Class4 {
|
|
/*spec.member: Class4.method6:direct,explicit=[method6.T*],needsArgs*/
|
|
num method6<T>(num n, T t) => null;
|
|
}
|
|
|
|
/*spec.member: method7:direct,explicit=[method7.T*],needsArgs,needsInst=[<num*>,<num*>,<num*>,<num*>]*/
|
|
num method7<T>(T n) => null;
|
|
|
|
/*member: method8:*/
|
|
T method8<T>(num n) => null;
|
|
|
|
/*spec.member: method9:direct,explicit=[method9.T*],needsArgs*/
|
|
num method9<T>(num n, T t) => null;
|
|
|
|
@pragma('dart2js:noInline')
|
|
test(o) => o is num Function(num);
|
|
|
|
forceInstantiation(num Function(num) f) => f;
|
|
|
|
main() {
|
|
Expect.isFalse(test(new Class1().method1));
|
|
Expect.isFalse(test(new Class1().method2));
|
|
Expect.isFalse(test(new Class1().method3));
|
|
Expect.isTrue(test(forceInstantiation(new Class2().method4)));
|
|
Expect.isTrue(test(forceInstantiation(new Class3().method5)));
|
|
Expect.isFalse(test(new Class4().method6));
|
|
Expect.isTrue(test(forceInstantiation(method7)));
|
|
Expect.isTrue(test(forceInstantiation(method8)));
|
|
Expect.isFalse(test(method9));
|
|
}
|