// 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.

class Class {
  Class next;
}

main() {
  assert1(null);
  assert2(null);
  assert3(null);
  assert4(null);
  assert5(null);
  assert6(null);
  assert7(null);
  assert8(null);
}

assert1(Class c) {
  assert(/*Class*/ c /*invoke: bool*/ != null);
  /*Class*/ c.next;
}

assert2(Class c) {
  assert(/*Class*/ c /*invoke: bool*/ == null);
  /*Class*/ c.next;
}

assert3(Class c) {
  bool b;
  assert(/*Class*/ c /*invoke: bool*/ != null);
  if (/*bool*/ b) return;
  /*Class*/ c.next;
}

assert4(Class c) {
  bool b;
  assert(/*Class*/ c /*invoke: bool*/ == null);
  if (/*bool*/ b) return;
  /*Class*/ c.next;
}

assert5(dynamic c) {
  assert(/*dynamic*/ c is Class);
  /*dynamic*/ c.next;
}

assert6(dynamic c) {
  assert(/*dynamic*/ c is! Class);
  /*dynamic*/ c.next;
}

assert7(dynamic c) {
  bool b;
  assert(/*dynamic*/ c is Class);
  if (/*bool*/ b) return;
  /*dynamic*/ c.next;
}

assert8(dynamic c) {
  bool b;
  assert(/*dynamic*/ c is! Class);
  if (/*bool*/ b) return;
  /*dynamic*/ c.next;
}
