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 Dionnevoid 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