blob: b40c5a9ab21fcd10b8db9aa55d5c66f8a7a92648 [file] [log] [blame]
// 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 verifies that NoSuchMethodError thrown from null checks
// corresponding to devirtualized calls in AOT mode have detailed messages
// (dartbug.com/32863).
import "package:expect/expect.dart";
class A {
void foo() {
Expect.fail('A.foo should not be reachable');
}
dynamic get bar {
Expect.fail('A.bar should not be reachable');
}
set bazz(int x) {
Expect.fail('A.bazz should not be reachable');
}
}
A myNull;
double doubleNull;
int intNull;
main(List<String> args) {
// Make sure value of `myNull` is not a compile-time null and
// devirtualization happens.
if (args.length > 42) {
myNull = new A();
doubleNull = 3.14;
intNull = 2;
}
Expect.throws(
() => myNull.foo(),
(e) =>
e is NoSuchMethodError &&
e.toString().startsWith(
'NoSuchMethodError: The method \'foo\' was called on null.'));
Expect.throws(
() => myNull.foo,
(e) =>
e is NoSuchMethodError &&
e.toString().startsWith(
'NoSuchMethodError: The getter \'foo\' was called on null.'));
Expect.throws(
() => myNull.bar,
(e) =>
e is NoSuchMethodError &&
e.toString().startsWith(
'NoSuchMethodError: The getter \'bar\' was called on null.'));
Expect.throws(
() => myNull.bar(),
(e) =>
e is NoSuchMethodError &&
e.toString().startsWith(
'NoSuchMethodError: The method \'bar\' was called on null.'));
Expect.throws(() {
myNull.bazz = 3;
},
(e) =>
e is NoSuchMethodError &&
e.toString().startsWith(
'NoSuchMethodError: The setter \'bazz=\' was called on null.'));
Expect.throws(
() => doubleNull + 2.17,
(e) =>
e is NoSuchMethodError &&
e.toString().startsWith(
'NoSuchMethodError: The method \'+\' was called on null.'));
Expect.throws(
() => 9.81 - doubleNull,
(e) =>
e is NoSuchMethodError &&
// If '-' is specialized.
(e.toString().startsWith(
'NoSuchMethodError: The method \'-\' was called on null.') ||
// If '-' is not specialized, it calls toDouble() internally.
e.toString().startsWith(
'NoSuchMethodError: The method \'toDouble\' was called on null.')));
Expect.throws(
() => intNull * 7,
(e) =>
e is NoSuchMethodError &&
e.toString().startsWith(
'NoSuchMethodError: The method \'*\' was called on null.'));
}