xref: /llvm-project/libcxx/test/std/strings/basic.string/char.bad.verify.cpp (revision b9a2658a3e8bd13b0f9e7a8a440832a95b377216)
18ec49997SLouis Dionne //===----------------------------------------------------------------------===//
28ec49997SLouis Dionne //
38ec49997SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48ec49997SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
58ec49997SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68ec49997SLouis Dionne //
78ec49997SLouis Dionne //===----------------------------------------------------------------------===//
88ec49997SLouis Dionne 
98ec49997SLouis Dionne // <string>
108ec49997SLouis Dionne //   ... manipulating sequences of any non-array trivial standard-layout types.
118ec49997SLouis Dionne 
12*b9a2658aSNikolas Klauser // XFAIL: FROZEN-CXX03-HEADERS-FIXME
13*b9a2658aSNikolas Klauser 
148ec49997SLouis Dionne #include <string>
158ec49997SLouis Dionne #include "test_traits.h"
168ec49997SLouis Dionne 
178ec49997SLouis Dionne struct NotTrivial {
188ec49997SLouis Dionne   NotTrivial() : value(3) {}
198ec49997SLouis Dionne   int value;
208ec49997SLouis Dionne };
218ec49997SLouis Dionne 
228ec49997SLouis Dionne struct NotStandardLayout {
238ec49997SLouis Dionne public:
248ec49997SLouis Dionne   NotStandardLayout() : one(1), two(2) {}
258ec49997SLouis Dionne   int sum() const { return one + two; } // silences "unused field 'two' warning"
268ec49997SLouis Dionne   int one;
27a40bada9SBrendan Emery 
288ec49997SLouis Dionne private:
298ec49997SLouis Dionne   int two;
308ec49997SLouis Dionne };
318ec49997SLouis Dionne 
328ec49997SLouis Dionne void f() {
338ec49997SLouis Dionne   {
348ec49997SLouis Dionne     // array
358ec49997SLouis Dionne     typedef char C[3];
368ec49997SLouis Dionne     static_assert(std::is_array<C>::value, "");
378ec49997SLouis Dionne     std::basic_string<C, test_traits<C> > s;
389bb9ec38SLouis Dionne     // expected-error-re@string:* {{static assertion failed{{.*}}Character type of basic_string must not be an array}}
398ec49997SLouis Dionne   }
408ec49997SLouis Dionne 
418ec49997SLouis Dionne   {
428ec49997SLouis Dionne     // not trivial
438ec49997SLouis Dionne     static_assert(!std::is_trivial<NotTrivial>::value, "");
448ec49997SLouis Dionne     std::basic_string<NotTrivial, test_traits<NotTrivial> > s;
459bb9ec38SLouis Dionne     // expected-error-re@string:* {{static assertion failed{{.*}}Character type of basic_string must be trivial}}
468ec49997SLouis Dionne   }
478ec49997SLouis Dionne 
488ec49997SLouis Dionne   {
498ec49997SLouis Dionne     // not standard layout
508ec49997SLouis Dionne     static_assert(!std::is_standard_layout<NotStandardLayout>::value, "");
518ec49997SLouis Dionne     std::basic_string<NotStandardLayout, test_traits<NotStandardLayout> > s;
529bb9ec38SLouis Dionne     // expected-error-re@string:* {{static assertion failed{{.*}}Character type of basic_string must be standard-layout}}
538ec49997SLouis Dionne   }
548ec49997SLouis Dionne }
55