//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// Test the set of C++11 features that Clang provides as an extension in C++03 mode.
// The language features we expect are:
//
// 1. rvalue references (and perfect forwarding)
// 2. variadic templates
// 3. alias templates
// 4. defaulted and deleted functions.
// 5. default values for non-type template parameters.
//
// Some features we don't get and can't be used in extended C++03 mode:
//
// 1. noexcept and constexpr
// 2. Two closing '>' without a space.

#ifdef __clang__
#pragma clang diagnostic ignored "-Wc++11-extensions"
#endif

#include <type_traits>
#include <cassert>

// Equals delete and default are allowed in minimal C++03 mode.
namespace test_eq_delete_and_default {
void t1() = delete;
struct T2 {
  T2() = default;
  T2(T2 const&) = delete;
};
}

namespace alias_templates {
template <class T>
using X = T;
static_assert((std::is_same<X<int>, int>::value), "");
}

namespace variadics_templates {
template <class ...Args>
int t1(Args...) {
  return sizeof...(Args);
}
void test() {
  assert(t1() == 0);
  assert(t1(42) == 1);
  assert(t1(1, 2, 3) == 3);
}
}

namespace rvalue_references_move_semantics {
struct T {
  T() : moved(0) {}
  T(T const& other) : moved(other.moved) {}
  T(T&& other) : moved(other.moved) { ++moved; other.moved = -1; }
  int moved;
};
void f(T o, int expect_moved) { assert(o.moved == expect_moved); }
void test() {
  {
    T t;
    assert(t.moved == 0);
    T t2(static_cast<T&&>(t));
    assert(t2.moved == 1);
    assert(t.moved == -1);
  }
  {
    T t;
    f(t, 0);
    f(static_cast<T&&>(t), 1);
  }
}
}

namespace rvalue_references_perfect_forwarding {
template <class Expect, class T>
void f(T&&) {
  static_assert((std::is_same<Expect, T&&>::value), "");
}
void test() {
  int x = 42;
  f<int&>(x);
  f<int&&>(42);
  f<int&&>(static_cast<int&&>(x));
}
}

namespace default_values_for_nttp {
template <int I = 42>
void f() { assert(I == 42); }
void test() {
  f();
}
}

namespace reference_qualified_functions {
struct T {
  T() : lvalue_called(0), rvalue_called(0) {}
  void foo() const & { lvalue_called++; }
  void foo() && { rvalue_called++; }
  mutable int lvalue_called;
  int rvalue_called;
};

void test() {
  {
    T t;
    t.foo();
    assert(t.lvalue_called == 1);
    assert(t.rvalue_called == 0);
  }
  {
    T t;
    static_cast<T&&>(t).foo();
    assert(t.lvalue_called == 0);
    assert(t.rvalue_called == 1);
  }
}
}

int main(int, char**) {
  variadics_templates::test();
  rvalue_references_move_semantics::test();
  rvalue_references_perfect_forwarding::test();
  default_values_for_nttp::test();
  reference_qualified_functions::test();
  return 0;
}
