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