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

// XFAIL: FROZEN-CXX03-HEADERS-FIXME

#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}}
  }
}
