// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s -fblocks

void tovoid(void*);

void tovoid_test(int (^f)(int, int)) {
  tovoid(f);
}

void reference_lvalue_test(int& (^f)()) {
  f() = 10;
}

// PR 7165
namespace test1 {
  void g(void (^)());
  struct Foo {
    void foo();   
    void test() {
      (void) ^{ foo(); };
    }
  };
}

namespace test2 {
  int repeat(int value, int (^block)(int), unsigned n) {
    while (n--) value = block(value);
    return value;
  }

  class Power {
    int base;

  public:
    Power(int base) : base(base) {}
    int calculate(unsigned n) {
      return repeat(1, ^(int v) { return v * base; }, n);
    }
  };

  int test() {
    return Power(2).calculate(10);
  }
}

// rdar: // 8382559
namespace radar8382559 {
  void func(bool& outHasProperty);

  int test3() {
    __attribute__((__blocks__(byref))) bool hasProperty = false;
    bool has = true;

    bool (^b)() = ^ {
     func(hasProperty);
     if (hasProperty)
       hasProperty = 0;
     if (has)
       hasProperty = 1;
     return hasProperty;
     };
    func(hasProperty);
    func(has);
    b();
    if (hasProperty)
      hasProperty = 1;
    if (has)
      has = 2;
    return hasProperty = 1;
  }
}

// Move __block variables to the heap when possible.
class MoveOnly {
public:
  MoveOnly();
  MoveOnly(const MoveOnly&) = delete;
  MoveOnly(MoveOnly&&);
};

void move_block() {
  __block MoveOnly mo;
}

// Don't crash after failing to build a block due to a capture of an
// invalid declaration.
namespace test5 {
  struct B { // expected-note 2 {{candidate constructor}}
    void *p;
    B(int); // expected-note {{candidate constructor}}
  };

  void use_block(void (^)());
  void use_block_2(void (^)(), const B &a);

  void test() {
    B x; // expected-error {{no matching constructor for initialization}}
    use_block(^{
        int y;
        use_block_2(^{ (void) y; }, x);
      });
  }
}


// rdar://16356628
//
// Ensure that we can end function bodies while parsing an
// expression that requires an explicitly-tracked cleanup object
// (i.e. a block literal).

// The nested function body in this test case is a template
// instantiation.  The template function has to be constexpr because
// we'll otherwise delay its instantiation to the end of the
// translation unit.
namespace test6a {
  template <class T> constexpr int func() { return 0; }
  void run(void (^)(), int);

  void test() {
    int aCapturedVar = 0;
    run(^{ (void) aCapturedVar; }, func<int>());
  }
}

// The nested function body in this test case is a method of a local
// class.
namespace test6b {
  void run(void (^)(), void (^)());
  void test() {
    int aCapturedVar = 0;
    run(^{ (void) aCapturedVar; },
        ^{ struct A { static void foo() {} };
            A::foo(); });
  }
}

// The nested function body in this test case is a lambda invocation
// function.
namespace test6c {
  void run(void (^)(), void (^)());
  void test() {
    int aCapturedVar = 0;
    run(^{ (void) aCapturedVar; },
        ^{ struct A { static void foo() {} };
            A::foo(); });
  }
}
