// This file is @generated by then_compile_test.rb. Do not edit directly.

#include <folly/futures/test/ThenCompileTest.h>

using namespace folly;

TEST(Basic, thenVariants) {
  SomeClass anObject;

  {Future<B> f = someFuture<A>().then(&aFunction<Future<B>, Try<A>&&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<Future<B>, Try<A>&&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<Future<B>, Try<A>&&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<Future<B>, Try<A>&&>());}
  {Future<B> f = someFuture<A>().then([&](Try<A>&&){return someFuture<B>();});}
  {Future<B> f = someFuture<A>().then(&aFunction<Future<B>, Try<A> const&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<Future<B>, Try<A> const&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<Future<B>, Try<A> const&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<Future<B>, Try<A> const&>());}
  {Future<B> f = someFuture<A>().then([&](Try<A> const&){return someFuture<B>();});}
  {Future<B> f = someFuture<A>().then(&aFunction<Future<B>, Try<A>>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<Future<B>, Try<A>>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<Future<B>, Try<A>>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<Future<B>, Try<A>>());}
  {Future<B> f = someFuture<A>().then([&](Try<A>){return someFuture<B>();});}
  {Future<B> f = someFuture<A>().then(&aFunction<Future<B>, Try<A>&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<Future<B>, Try<A>&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<Future<B>, Try<A>&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<Future<B>, Try<A>&>());}
  {Future<B> f = someFuture<A>().then([&](Try<A>&){return someFuture<B>();});}
  {Future<B> f = someFuture<A>().then(&aFunction<Future<B>, A&&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<Future<B>, A&&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<Future<B>, A&&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<Future<B>, A&&>());}
  {Future<B> f = someFuture<A>().then([&](A&&){return someFuture<B>();});}
  {Future<B> f = someFuture<A>().then(&aFunction<Future<B>, A const&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<Future<B>, A const&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<Future<B>, A const&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<Future<B>, A const&>());}
  {Future<B> f = someFuture<A>().then([&](A const&){return someFuture<B>();});}
  {Future<B> f = someFuture<A>().then(&aFunction<Future<B>, A>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<Future<B>, A>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<Future<B>, A>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<Future<B>, A>());}
  {Future<B> f = someFuture<A>().then([&](A){return someFuture<B>();});}
  {Future<B> f = someFuture<A>().then(&aFunction<Future<B>, A&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<Future<B>, A&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<Future<B>, A&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<Future<B>, A&>());}
  {Future<B> f = someFuture<A>().then([&](A&){return someFuture<B>();});}
  {Future<B> f = someFuture<A>().then([&](){return someFuture<B>();});}
  {Future<B> f = someFuture<A>().then(&aFunction<B, Try<A>&&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<B, Try<A>&&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<B, Try<A>&&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<B, Try<A>&&>());}
  {Future<B> f = someFuture<A>().then([&](Try<A>&&){return B();});}
  {Future<B> f = someFuture<A>().then(&aFunction<B, Try<A> const&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<B, Try<A> const&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<B, Try<A> const&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<B, Try<A> const&>());}
  {Future<B> f = someFuture<A>().then([&](Try<A> const&){return B();});}
  {Future<B> f = someFuture<A>().then(&aFunction<B, Try<A>>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<B, Try<A>>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<B, Try<A>>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<B, Try<A>>());}
  {Future<B> f = someFuture<A>().then([&](Try<A>){return B();});}
  {Future<B> f = someFuture<A>().then(&aFunction<B, Try<A>&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<B, Try<A>&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<B, Try<A>&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<B, Try<A>&>());}
  {Future<B> f = someFuture<A>().then([&](Try<A>&){return B();});}
  {Future<B> f = someFuture<A>().then(&aFunction<B, A&&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<B, A&&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<B, A&&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<B, A&&>());}
  {Future<B> f = someFuture<A>().then([&](A&&){return B();});}
  {Future<B> f = someFuture<A>().then(&aFunction<B, A const&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<B, A const&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<B, A const&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<B, A const&>());}
  {Future<B> f = someFuture<A>().then([&](A const&){return B();});}
  {Future<B> f = someFuture<A>().then(&aFunction<B, A>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<B, A>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<B, A>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<B, A>());}
  {Future<B> f = someFuture<A>().then([&](A){return B();});}
  {Future<B> f = someFuture<A>().then(&aFunction<B, A&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aStaticMethod<B, A&>);}
  {Future<B> f = someFuture<A>().then(&SomeClass::aMethod<B, A&>, &anObject);}
  {Future<B> f = someFuture<A>().then(aStdFunction<B, A&>());}
  {Future<B> f = someFuture<A>().then([&](A&){return B();});}
  {Future<B> f = someFuture<A>().then([&](){return B();});}
}
