xref: /llvm-project/libcxx/test/std/strings/string.view/char.bad.verify.cpp (revision b9a2658a3e8bd13b0f9e7a8a440832a95b377216)
1b82dcb62SLouis Dionne //===----------------------------------------------------------------------===//
2b82dcb62SLouis Dionne //
3b82dcb62SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b82dcb62SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5b82dcb62SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b82dcb62SLouis Dionne //
7b82dcb62SLouis Dionne //===----------------------------------------------------------------------===//
8b82dcb62SLouis Dionne 
9b82dcb62SLouis Dionne // UNSUPPORTED: !stdlib=libc++ && (c++03 || c++11 || c++14)
10b82dcb62SLouis Dionne 
11*b9a2658aSNikolas Klauser // XFAIL: FROZEN-CXX03-HEADERS-FIXME
12*b9a2658aSNikolas Klauser 
13b82dcb62SLouis Dionne // <string_view>
14b82dcb62SLouis Dionne //   ... manipulating sequences of any non-array trivial standard-layout types.
15b82dcb62SLouis Dionne 
16b82dcb62SLouis Dionne #include <string>
17b82dcb62SLouis Dionne #include "../basic.string/test_traits.h"
18b82dcb62SLouis Dionne 
19b82dcb62SLouis Dionne struct NotTrivial {
20b82dcb62SLouis Dionne   NotTrivial() : value(3) {}
21b82dcb62SLouis Dionne   int value;
22b82dcb62SLouis Dionne };
23b82dcb62SLouis Dionne 
24b82dcb62SLouis Dionne struct NotStandardLayout {
25b82dcb62SLouis Dionne public:
26b82dcb62SLouis Dionne   NotStandardLayout() : one(1), two(2) {}
27b82dcb62SLouis Dionne   int sum() const { return one + two; } // silences "unused field 'two' warning"
28b82dcb62SLouis Dionne   int one;
29a40bada9SBrendan Emery 
30b82dcb62SLouis Dionne private:
31b82dcb62SLouis Dionne   int two;
32b82dcb62SLouis Dionne };
33b82dcb62SLouis Dionne 
34a40bada9SBrendan Emery int main(int, char**) {
35b82dcb62SLouis Dionne   {
36b82dcb62SLouis Dionne     //  array
37b82dcb62SLouis Dionne     typedef char C[3];
38b82dcb62SLouis Dionne     static_assert(std::is_array<C>::value, "");
39b82dcb62SLouis Dionne     std::basic_string_view<C, test_traits<C> > sv;
409bb9ec38SLouis Dionne     //  expected-error-re@string_view:* {{static assertion failed{{.*}}Character type of basic_string_view must not be an array}}
41b82dcb62SLouis Dionne   }
42b82dcb62SLouis Dionne 
43b82dcb62SLouis Dionne   {
44b82dcb62SLouis Dionne     //  not trivial
45b82dcb62SLouis Dionne     static_assert(!std::is_trivial<NotTrivial>::value, "");
46b82dcb62SLouis Dionne     std::basic_string_view<NotTrivial, test_traits<NotTrivial> > sv;
479bb9ec38SLouis Dionne     //  expected-error-re@string_view:* {{static assertion failed{{.*}}Character type of basic_string_view must be trivial}}
48b82dcb62SLouis Dionne   }
49b82dcb62SLouis Dionne 
50b82dcb62SLouis Dionne   {
51b82dcb62SLouis Dionne     //  not standard layout
52b82dcb62SLouis Dionne     static_assert(!std::is_standard_layout<NotStandardLayout>::value, "");
53b82dcb62SLouis Dionne     std::basic_string_view<NotStandardLayout, test_traits<NotStandardLayout> > sv;
549bb9ec38SLouis Dionne     //  expected-error-re@string_view:* {{static assertion failed{{.*}}Character type of basic_string_view must be standard-layout}}
55b82dcb62SLouis Dionne   }
56b82dcb62SLouis Dionne 
57b82dcb62SLouis Dionne   return 0;
58b82dcb62SLouis Dionne }
59