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

// <string>
//   ... manipulating sequences of any non-array trivial standard-layout types.

#include <string>
#include "test_traits.h"

struct NotTrivial {
  NotTrivial() : value(3) {}
  int value;
};

struct NotStandardLayout {
public:
  NotStandardLayout() : one(1), two(2) {}
  int sum() const { return one + two; } // silences "unused field 'two' warning"
  int one;

private:
  int two;
};

void f() {
  {
    // array
    typedef char C[3];
    static_assert(std::is_array<C>::value, "");
    std::basic_string<C, test_traits<C> > s;
    // expected-error-re@string:* {{static assertion failed{{.*}}Character type of basic_string must not be an array}}
  }

  {
    // not trivial
    static_assert(!std::is_trivial<NotTrivial>::value, "");
    std::basic_string<NotTrivial, test_traits<NotTrivial> > s;
    // expected-error-re@string:* {{static assertion failed{{.*}}Character type of basic_string must be trivial}}
  }

  {
    // not standard layout
    static_assert(!std::is_standard_layout<NotStandardLayout>::value, "");
    std::basic_string<NotStandardLayout, test_traits<NotStandardLayout> > s;
    // expected-error-re@string:* {{static assertion failed{{.*}}Character type of basic_string must be standard-layout}}
  }
}
