1//===----------------------------------------------------------------------===//
2//
3// 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
6//
7//===----------------------------------------------------------------------===//
8
9// <cstring>
10
11#include <cstring>
12#include <cassert>
13#include <type_traits>
14
15#include "test_macros.h"
16
17#ifndef NULL
18# error NULL not defined
19#endif
20
21int main(int, char**) {
22 // Functions we get directly from the C library (just check the signature)
23 {
24 std::size_t s = 0;
25 void* vp = 0;
26 const void* vpc = 0;
27 char* cp = 0;
28 const char* cpc = 0;
29 ASSERT_SAME_TYPE(void*, decltype(std::memcpy(vp, vpc, s)));
30 ASSERT_SAME_TYPE(void*, decltype(std::memmove(vp, vpc, s)));
31 ASSERT_SAME_TYPE(char*, decltype(std::strcpy(cp, cpc)));
32 ASSERT_SAME_TYPE(char*, decltype(std::strncpy(cp, cpc, s)));
33 ASSERT_SAME_TYPE(char*, decltype(std::strcat(cp, cpc)));
34 ASSERT_SAME_TYPE(char*, decltype(std::strncat(cp, cpc, s)));
35 ASSERT_SAME_TYPE(int, decltype(std::memcmp(vpc, vpc, s)));
36 ASSERT_SAME_TYPE(int, decltype(std::strcmp(cpc, cpc)));
37 ASSERT_SAME_TYPE(int, decltype(std::strncmp(cpc, cpc, s)));
38 ASSERT_SAME_TYPE(int, decltype(std::strcoll(cpc, cpc)));
39 ASSERT_SAME_TYPE(std::size_t, decltype(std::strxfrm(cp, cpc, s)));
40 ASSERT_SAME_TYPE(std::size_t, decltype(std::strcspn(cpc, cpc)));
41 ASSERT_SAME_TYPE(std::size_t, decltype(std::strspn(cpc, cpc)));
42 ASSERT_SAME_TYPE(char*, decltype(std::strtok(cp, cpc)));
43 ASSERT_SAME_TYPE(void*, decltype(std::memset(vp, 0, s)));
44 ASSERT_SAME_TYPE(char*, decltype(std::strerror(0)));
45 ASSERT_SAME_TYPE(std::size_t, decltype(std::strlen(cpc)));
46 }
47
48 // Functions we (may) reimplement
49 {
50 // const char* strchr(const char*, int)
51 char storage[] = "hello world";
52 const char* s = storage;
53 ASSERT_SAME_TYPE(const char*, decltype(std::strchr(s, 'l')));
54 const char* res = std::strchr(s: s, c: 'l');
55 assert(res == &s[2]);
56 }
57 {
58 // char* strchr(char*, int)
59 char storage[] = "hello world";
60 char* s = storage;
61 ASSERT_SAME_TYPE(char*, decltype(std::strchr(s, 'l')));
62 char* res = std::strchr(s: s, c: 'l');
63 assert(res == &s[2]);
64 }
65
66 {
67 // const char* strpbrk(const char*, const char*)
68 char storage[] = "hello world";
69 const char* s = storage;
70 ASSERT_SAME_TYPE(const char*, decltype(std::strpbrk(s, "el")));
71 const char* res = std::strpbrk(s: s, accept: "el");
72 assert(res == &s[1]);
73 }
74 {
75 // char* strpbrk(char*, const char*)
76 char storage[] = "hello world";
77 char* s = storage;
78 ASSERT_SAME_TYPE(char*, decltype(std::strpbrk(s, "el")));
79 char* res = std::strpbrk(s: s, accept: "el");
80 assert(res == &s[1]);
81 }
82
83 {
84 // const char* strrchr(const char*, int)
85 char storage[] = "hello world";
86 const char* s = storage;
87 ASSERT_SAME_TYPE(const char*, decltype(std::strrchr(s, 'l')));
88 const char* res = std::strrchr(s: s, c: 'l');
89 assert(res == &s[9]);
90 }
91 {
92 // char* strrchr(char*, int)
93 char storage[] = "hello world";
94 char* s = storage;
95 ASSERT_SAME_TYPE(char*, decltype(std::strrchr(s, 'l')));
96 char* res = std::strrchr(s: s, c: 'l');
97 assert(res == &s[9]);
98 }
99
100 {
101 // const void* memchr(const void*, int, size_t)
102 char storage[] = "hello world";
103 std::size_t count = 11;
104 const void* s = storage;
105 ASSERT_SAME_TYPE(const void*, decltype(std::memchr(s, 'l', count)));
106 const void* res = std::memchr(s: s, c: 'l', n: count);
107 assert(res == &storage[2]);
108 }
109 {
110 // void* memchr(void*, int, size_t)
111 char storage[] = "hello world";
112 std::size_t count = 11;
113 void* s = storage;
114 ASSERT_SAME_TYPE(void*, decltype(std::memchr(s, 'l', count)));
115 void* res = std::memchr(s: s, c: 'l', n: count);
116 assert(res == &storage[2]);
117 }
118
119 {
120 // const char* strstr(const char*, const char*)
121 char storage[] = "hello world";
122 const char* s = storage;
123 ASSERT_SAME_TYPE(const char*, decltype(std::strstr(s, "wor")));
124 const char* res = std::strstr(haystack: s, needle: "wor");
125 assert(res == &storage[6]);
126 }
127 {
128 // char* strstr(char*, const char*)
129 char storage[] = "hello world";
130 char* s = storage;
131 ASSERT_SAME_TYPE(char*, decltype(std::strstr(s, "wor")));
132 char* res = std::strstr(haystack: s, needle: "wor");
133 assert(res == &storage[6]);
134 }
135
136 return 0;
137}
138

source code of libcxx/test/std/strings/c.strings/cstring.pass.cpp