15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
86edc12c8SAsiri Rathnayake 
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11
106edc12c8SAsiri Rathnayake 
115a83710eSEric Fiselier #include <string>
125a83710eSEric Fiselier #include <cassert>
135a83710eSEric Fiselier 
14289f1ce5SMarshall Clow #include "test_macros.h"
15289f1ce5SMarshall Clow 
167dad0bd6SMarshall Clow #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
177dad0bd6SMarshall Clow     typedef std::u8string u8string;
187dad0bd6SMarshall Clow #else
197dad0bd6SMarshall Clow     typedef std::string   u8string;
207dad0bd6SMarshall Clow #endif
217dad0bd6SMarshall Clow 
main(int,char **)22ef2cdfe3SLouis Dionne int main(int, char**) {
235a83710eSEric Fiselier     {
245a83710eSEric Fiselier         using namespace std::literals::string_literals;
255a83710eSEric Fiselier 
26ef2cdfe3SLouis Dionne         ASSERT_SAME_TYPE(decltype(  "Hi"s), std::string);
27ef2cdfe3SLouis Dionne         ASSERT_SAME_TYPE(decltype(u8"Hi"s), u8string);
28*f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
29ef2cdfe3SLouis Dionne         ASSERT_SAME_TYPE(decltype( L"Hi"s), std::wstring);
30*f4c1258dSLouis Dionne #endif
31ef2cdfe3SLouis Dionne         ASSERT_SAME_TYPE(decltype( u"Hi"s), std::u16string);
32ef2cdfe3SLouis Dionne         ASSERT_SAME_TYPE(decltype( U"Hi"s), std::u32string);
335a83710eSEric Fiselier 
345a83710eSEric Fiselier         std::string foo;
35*f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
365a83710eSEric Fiselier         std::wstring Lfoo;
37*f4c1258dSLouis Dionne #endif
387dad0bd6SMarshall Clow         u8string u8foo;
395a83710eSEric Fiselier         std::u16string ufoo;
405a83710eSEric Fiselier         std::u32string Ufoo;
415a83710eSEric Fiselier 
425a83710eSEric Fiselier         foo   =   ""s;     assert(  foo.size() == 0);
437dad0bd6SMarshall Clow         u8foo = u8""s;     assert(u8foo.size() == 0);
44*f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
455a83710eSEric Fiselier         Lfoo  =  L""s;     assert( Lfoo.size() == 0);
46*f4c1258dSLouis Dionne #endif
475a83710eSEric Fiselier         ufoo  =  u""s;     assert( ufoo.size() == 0);
485a83710eSEric Fiselier         Ufoo  =  U""s;     assert( Ufoo.size() == 0);
495a83710eSEric Fiselier 
505a83710eSEric Fiselier         foo   =   " "s;    assert(  foo.size() == 1);
517dad0bd6SMarshall Clow         u8foo = u8" "s;    assert(u8foo.size() == 1);
52*f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
535a83710eSEric Fiselier         Lfoo  =  L" "s;    assert( Lfoo.size() == 1);
54*f4c1258dSLouis Dionne #endif
555a83710eSEric Fiselier         ufoo  =  u" "s;    assert( ufoo.size() == 1);
565a83710eSEric Fiselier         Ufoo  =  U" "s;    assert( Ufoo.size() == 1);
575a83710eSEric Fiselier 
585a83710eSEric Fiselier         foo   =   "ABC"s;     assert(  foo ==   "ABC");   assert(  foo == std::string   (  "ABC"));
597dad0bd6SMarshall Clow         u8foo = u8"ABC"s;     assert(u8foo == u8"ABC");   assert(u8foo == u8string      (u8"ABC"));
60*f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
615a83710eSEric Fiselier         Lfoo  =  L"ABC"s;     assert( Lfoo ==  L"ABC");   assert( Lfoo == std::wstring  ( L"ABC"));
62*f4c1258dSLouis Dionne #endif
635a83710eSEric Fiselier         ufoo  =  u"ABC"s;     assert( ufoo ==  u"ABC");   assert( ufoo == std::u16string( u"ABC"));
645a83710eSEric Fiselier         Ufoo  =  U"ABC"s;     assert( Ufoo ==  U"ABC");   assert( Ufoo == std::u32string( U"ABC"));
65ef2cdfe3SLouis Dionne     }
66ef2cdfe3SLouis Dionne     {
67ef2cdfe3SLouis Dionne         using namespace std::literals;
68ef2cdfe3SLouis Dionne         std::string foo = ""s;
69ef2cdfe3SLouis Dionne         assert(foo == std::string());
70ef2cdfe3SLouis Dionne     }
71ef2cdfe3SLouis Dionne     {
72ef2cdfe3SLouis Dionne         using namespace std;
73ef2cdfe3SLouis Dionne         std::string foo = ""s;
74ef2cdfe3SLouis Dionne         assert(foo == std::string());
75ef2cdfe3SLouis Dionne     }
762df59c50SJF Bastien 
772df59c50SJF Bastien     return 0;
785a83710eSEric Fiselier }
79