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 
128ec49997SLouis Dionne #include <string>
138ec49997SLouis Dionne #include "test_traits.h"
148ec49997SLouis Dionne 
158ec49997SLouis Dionne struct NotTrivial {
NotTrivialNotTrivial168ec49997SLouis Dionne     NotTrivial() : value(3) {}
178ec49997SLouis Dionne     int value;
188ec49997SLouis Dionne };
198ec49997SLouis Dionne 
208ec49997SLouis Dionne struct NotStandardLayout {
218ec49997SLouis Dionne public:
NotStandardLayoutNotStandardLayout228ec49997SLouis Dionne     NotStandardLayout() : one(1), two(2) {}
sumNotStandardLayout238ec49997SLouis Dionne     int sum() const { return one + two; } // silences "unused field 'two' warning"
248ec49997SLouis Dionne     int one;
258ec49997SLouis Dionne private:
268ec49997SLouis Dionne     int two;
278ec49997SLouis Dionne };
288ec49997SLouis Dionne 
f()298ec49997SLouis Dionne void f() {
308ec49997SLouis Dionne     {
318ec49997SLouis Dionne         // array
328ec49997SLouis Dionne         typedef char C[3];
338ec49997SLouis Dionne         static_assert(std::is_array<C>::value, "");
348ec49997SLouis Dionne         std::basic_string<C, test_traits<C> > s;
35*76476efdSMuhammad Usman Shahid         // expected-error-re@string:* {{{{(static_assert|static assertion)}} failed{{.*}}Character type of basic_string must not be an array}}
368ec49997SLouis Dionne     }
378ec49997SLouis Dionne 
388ec49997SLouis Dionne     {
398ec49997SLouis Dionne         // not trivial
408ec49997SLouis Dionne         static_assert(!std::is_trivial<NotTrivial>::value, "");
418ec49997SLouis Dionne         std::basic_string<NotTrivial, test_traits<NotTrivial> > s;
42*76476efdSMuhammad Usman Shahid         // expected-error-re@string:* {{{{(static_assert|static assertion)}} failed{{.*}}Character type of basic_string must be trivial}}
438ec49997SLouis Dionne     }
448ec49997SLouis Dionne 
458ec49997SLouis Dionne     {
468ec49997SLouis Dionne         // not standard layout
478ec49997SLouis Dionne         static_assert(!std::is_standard_layout<NotStandardLayout>::value, "");
488ec49997SLouis Dionne         std::basic_string<NotStandardLayout, test_traits<NotStandardLayout> > s;
49*76476efdSMuhammad Usman Shahid         // expected-error-re@string:* {{{{(static_assert|static assertion)}} failed{{.*}}Character type of basic_string must be standard-layout}}
508ec49997SLouis Dionne     }
518ec49997SLouis Dionne }
52