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

// Tests that methods with names "get", "set" and "operator" don't
// cause fatal problems.

// With return type.
class A {
  int get() {return 1;}
  int set() {return 2;}
  int operator() {return 3;}
}

// Without return types.
class B {
  get() {return 1;}
  set() {return 2;}
  operator() {return 3;}
}

main() {
  {
    A a = new A();
    Expect.equals(1, a.get());
    Expect.equals(2, a.set());
    Expect.equals(3, a.operator());
  }
  {
    B b = new B();
    Expect.equals(1, b.get());
    Expect.equals(2, b.set());
    Expect.equals(3, b.operator());
  }
}
