// Copyright (c) 2011, 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.

/// @assertion A variable declaration of one of the forms
/// var v;, var v = e;, const v = e;, final v; or final v = e;
/// always induces an implicit getter function with signature
///   get v
/// @description For all types of forms checks that return type of getter is
/// dynamic by expecting no static warnings.
/// @author ilya

import "../../Utils/expect.dart";

//--library static variables
var x1;
var x2 = null;
const x3 = null;
//final x4; //can not be
final x5 = null;

class C {
  //--instance variables
  var y1;
  var y2 = null;
  //const y3 = null; //can not be
  final y4;
  final y5 = null;
  
  //--class static variables
  static var z1;
  static var z2 = null;
  static const z3 = null;
  //static final z4; //can not be
  static final z5 = null;

  C() : y4 = null;
}

main() {
  Expect.throws(() => x1.nonexistent());
  Expect.throws(() => x2.nonexistent());
  Expect.throws(() => x3.nonexistent());
  Expect.throws(() => x5.nonexistent());

  C c = new C();
  
  Expect.throws(() => c.y1.nonexistent());
  Expect.throws(() => c.y2.nonexistent());
  Expect.throws(() => c.y4.nonexistent());
  Expect.throws(() => c.y5.nonexistent());
  
  Expect.throws(() => C.z1.nonexistent());
  Expect.throws(() => C.z2.nonexistent());
  Expect.throws(() => C.z3.nonexistent());
  Expect.throws(() => C.z5.nonexistent());
}
