// RUN: %clang_cc1 -std=c++1z -fsyntax-only -verify %s
// RUN: %clang_cc1 -std=c++03 -fsyntax-only -verify %s
// RUN: %clang_cc1 -std=c++03 -faligned-allocation -fsyntax-only -verify %s
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -fsized-deallocation %s

#if !__has_builtin(__builtin_operator_new) || !__has_builtin(__builtin_operator_delete)
#error builtins should always be available
#endif

#if __has_builtin(__builtin_operator_new) != 201802L || \
    __has_builtin(__builtin_operator_delete) != 201802L
#error builtin should report updated value
#endif

typedef __SIZE_TYPE__ size_t;
namespace std {
  struct nothrow_t {};
#if __cplusplus >= 201103L
enum class align_val_t : size_t {};
#else
  enum align_val_t {
  // We can't force an underlying type when targeting windows.
# ifndef _WIN32
    __zero = 0, __max = (size_t)-1
# endif
  };
#endif
}
std::nothrow_t nothrow;

void *operator new(size_t); // expected-note 1+ {{candidate function}}
void operator delete(void *); // expected-note 1+ {{candidate function}}

// Declare the reserved placement operators.
void *operator new(size_t, void*) throw(); // expected-note 1+ {{candidate function}}
void operator delete(void *, void *)throw(); // expected-note 1+ {{candidate function}}
void *operator new[](size_t, void*) throw();
void operator delete[](void*, void*) throw();

// Declare the replaceable global allocation operators.
void *operator new(size_t, const std::nothrow_t &) throw(); // expected-note 1+ {{candidate function}}
void *operator new[](size_t, const std::nothrow_t &) throw();
void operator delete(void *, const std::nothrow_t &)throw(); // expected-note 1+ {{candidate function}}
void operator delete[](void *, const std::nothrow_t &) throw();

// aligned allocation and deallocation functions.
void* operator new  ( size_t count, std::align_val_t al); // expected-note 1+ {{candidate function}}
void operator delete(void *, std::align_val_t); // expected-note 1+ {{candidate}}
#ifndef __cpp_aligned_new
// expected-note@-3 1+ {{non-usual 'operator new' declared here}}
// expected-note@-3 1+ {{non-usual 'operator delete' declared here}}
#endif
void *operator new[](size_t count, std::align_val_t al);
void operator delete[](void*, std::align_val_t);

void operator delete(void *, size_t); // expected-note 1+ {{candidate}}
#ifndef __cpp_sized_deallocation
// expected-note@-2 1+ {{non-usual 'operator delete' declared here}}
#endif
void operator delete[](void*, size_t);

// Declare some other placemenet operators.
void *operator new(size_t, void*, bool) throw(); // expected-note 1+ {{candidate function}}
void *operator new[](size_t, void*, bool) throw();

void *NP = 0;

void test_typo_in_args() {
  __builtin_operator_new(DNE);          // expected-error {{undeclared identifier 'DNE'}}
  __builtin_operator_new(DNE, DNE2);    // expected-error {{undeclared identifier 'DNE'}} expected-error {{'DNE2'}}
  __builtin_operator_delete(DNE);       // expected-error {{'DNE'}}
  __builtin_operator_delete(DNE, DNE2); // expected-error {{'DNE'}} expected-error {{'DNE2'}}
}

void test_arg_types() {
  __builtin_operator_new(NP);                      // expected-error {{no matching function for call to 'operator new'}}
  __builtin_operator_new(NP, std::align_val_t(0)); // expected-error {{no matching function for call to 'operator new'}}
}
void test_return_type() {
  int w = __builtin_operator_new(42);        // expected-error {{cannot initialize a variable of type 'int' with an rvalue of type 'void *'}}
  int y = __builtin_operator_delete(NP);     // expected-error {{cannot initialize a variable of type 'int' with an rvalue of type 'void'}}
}

void test_aligned_new() {
#ifdef __cpp_aligned_new
  void *p = __builtin_operator_new(42, std::align_val_t(2));
  __builtin_operator_delete(p, std::align_val_t(2));
#else
  // FIXME: We've manually declared the aligned new/delete overloads,
  // but LangOpts::AlignedAllocation is false. Should our overloads be considered
  // usual allocation/deallocation functions?
  void *p = __builtin_operator_new(42, std::align_val_t(2)); // expected-error {{call to '__builtin_operator_new' selects non-usual allocation function}}
  __builtin_operator_delete(p, std::align_val_t(2));         // expected-error {{call to '__builtin_operator_delete' selects non-usual deallocation function}}
#endif
}

void test_sized_delete() {
#ifdef __cpp_sized_deallocation
  __builtin_operator_delete(NP, 4);
#else
  __builtin_operator_delete(NP, 4); // expected-error {{call to '__builtin_operator_delete' selects non-usual deallocation function}}
#endif
}

void *operator new(size_t, bool);   // expected-note 1+ {{candidate}}
// expected-note@-1 {{non-usual 'operator new' declared here}}
void operator delete(void *, bool); // expected-note 1+ {{candidate}}
// expected-note@-1 {{non-usual 'operator delete' declared here}}

void test_non_usual() {
  __builtin_operator_new(42, true);     // expected-error {{call to '__builtin_operator_new' selects non-usual allocation function}}
  __builtin_operator_delete(NP, false); // expected-error {{call to '__builtin_operator_delete' selects non-usual deallocation function}}
}

template <int ID>
struct Tag {};
struct ConvertsToTypes {
  operator std::align_val_t() const;
  operator Tag<0>() const;
};

void *operator new(size_t, Tag<0>);   // expected-note 0+ {{candidate}}
void operator delete(void *, Tag<0>); // expected-note 0+ {{candidate}}

void test_ambiguous() {
#ifdef __cpp_aligned_new
  ConvertsToTypes cvt;
  __builtin_operator_new(42, cvt);    // expected-error {{call to 'operator new' is ambiguous}}
  __builtin_operator_delete(NP, cvt); // expected-error {{call to 'operator delete' is ambiguous}}
#endif
}

void test_no_args() {
  __builtin_operator_new();    // expected-error {{no matching function for call to 'operator new'}}
  __builtin_operator_delete(); // expected-error {{no matching function for call to 'operator delete'}}
}

void test_no_matching_fn() {
  Tag<1> tag;
  __builtin_operator_new(42, tag);    // expected-error {{no matching function for call to 'operator new'}}
  __builtin_operator_delete(NP, tag); // expected-error {{no matching function for call to 'operator delete'}}
}

template <class Tp, class Up, class RetT>
void test_dependent_call(Tp new_arg, Up delete_arg, RetT) {
  RetT ret = __builtin_operator_new(new_arg);
  __builtin_operator_delete(delete_arg);
}
template void test_dependent_call(int, int*, void*);

void test_const_attribute() {
  __builtin_operator_new(42); // expected-warning {{ignoring return value of function declared with const attribute}}
#ifdef __cpp_aligned_new
  __builtin_operator_new(42, std::align_val_t(8)); // expected-warning {{ignoring return value of function declared with const attribute}}
#endif
}
