blob: dd2a59a76153e4d2d787d6374b04d5ea729ae870 [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:16 +00001//===----------------------------------------------------------------------===//
2//
Chandler Carruth57b08b02019-01-19 10:56:40 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnant3e519522010-05-11 19:42:16 +00006//
7//===----------------------------------------------------------------------===//
8
9// <string>
10
11// const charT& back() const;
12// charT& back();
13
Howard Hinnant145afa12013-08-23 20:10:18 +000014#ifdef _LIBCPP_DEBUG
Howard Hinnantfc88dbd2013-08-23 17:37:05 +000015#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
16#endif
17
Howard Hinnant3e519522010-05-11 19:42:16 +000018#include <string>
19#include <cassert>
20
Marshall Clowe34f6f62013-11-26 20:58:02 +000021#include "min_allocator.h"
Howard Hinnanteec72182013-06-28 16:59:19 +000022
Howard Hinnant3e519522010-05-11 19:42:16 +000023template <class S>
24void
25test(S s)
26{
27 const S& cs = s;
Marshall Clow9ea0e472019-03-19 03:30:07 +000028 ASSERT_SAME_TYPE(decltype( s.back()), typename S::reference);
29 ASSERT_SAME_TYPE(decltype(cs.back()), typename S::const_reference);
30 LIBCPP_ASSERT_NOEXCEPT( s.back());
31 LIBCPP_ASSERT_NOEXCEPT( cs.back());
Howard Hinnant3e519522010-05-11 19:42:16 +000032 assert(&cs.back() == &cs[cs.size()-1]);
33 assert(&s.back() == &s[cs.size()-1]);
34 s.back() = typename S::value_type('z');
35 assert(s.back() == typename S::value_type('z'));
36}
37
JF Bastien2df59c52019-02-04 20:31:13 +000038int main(int, char**)
Howard Hinnant3e519522010-05-11 19:42:16 +000039{
Howard Hinnanteec72182013-06-28 16:59:19 +000040 {
Howard Hinnant3e519522010-05-11 19:42:16 +000041 typedef std::string S;
42 test(S("1"));
43 test(S("1234567890123456789012345678901234567890"));
Howard Hinnanteec72182013-06-28 16:59:19 +000044 }
Eric Fiselierf2f2a632016-06-14 21:31:42 +000045#if TEST_STD_VER >= 11
Howard Hinnanteec72182013-06-28 16:59:19 +000046 {
47 typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
48 test(S("1"));
49 test(S("1234567890123456789012345678901234567890"));
50 }
51#endif
Howard Hinnant145afa12013-08-23 20:10:18 +000052#ifdef _LIBCPP_DEBUG
Howard Hinnantfc88dbd2013-08-23 17:37:05 +000053 {
54 std::string s;
55 char c = s.back();
56 assert(false);
57 }
58#endif
JF Bastien2df59c52019-02-04 20:31:13 +000059
60 return 0;
Howard Hinnant3e519522010-05-11 19:42:16 +000061}