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// test <stdlib.h>
10
11// mblen was added in Android API 26.
12// TODO: Switch from UNSUPPORTED to XFAIL once the Android CI Docker sysroot is
13// updated.
14// UNSUPPORTED: LIBCXX-ANDROID-FIXME && target={{.+}}-android{{(eabi)?(21|22|23|24|25)}}
15
16#include <stdlib.h>
17#include <cassert>
18#include <type_traits>
19#include <utility>
20
21#include "test_macros.h"
22
23#ifdef abs
24#error abs is defined
25#endif
26
27#ifdef labs
28#error labs is defined
29#endif
30
31#ifdef llabs
32#error llabs is defined
33#endif
34
35#ifdef div
36#error div is defined
37#endif
38
39#ifdef ldiv
40#error ldiv is defined
41#endif
42
43#ifdef lldiv
44#error lldiv is defined
45#endif
46
47#ifndef EXIT_FAILURE
48#error EXIT_FAILURE not defined
49#endif
50
51#ifndef EXIT_SUCCESS
52#error EXIT_SUCCESS not defined
53#endif
54
55#ifndef MB_CUR_MAX
56#error MB_CUR_MAX not defined
57#endif
58
59#ifndef NULL
60#error NULL not defined
61#endif
62
63#ifndef RAND_MAX
64#error RAND_MAX not defined
65#endif
66
67template <class T, class = decltype(::abs(std::declval<T>()))>
68std::true_type has_abs_imp(int);
69template <class T>
70std::false_type has_abs_imp(...);
71
72template <class T>
73struct has_abs : decltype(has_abs_imp<T>(0)) {};
74
75void test_abs() {
76 TEST_DIAGNOSTIC_PUSH
77 TEST_CLANG_DIAGNOSTIC_IGNORED("-Wabsolute-value")
78 ASSERT_SAME_TYPE(float, decltype(abs((float)0)));
79 ASSERT_SAME_TYPE(double, decltype(abs((double)0)));
80 ASSERT_SAME_TYPE(long double, decltype(abs((long double)0)));
81 ASSERT_SAME_TYPE(int, decltype(abs((int)0)));
82 ASSERT_SAME_TYPE(long, decltype(abs((long)0)));
83 ASSERT_SAME_TYPE(long long, decltype(abs((long long)0)));
84 ASSERT_SAME_TYPE(int, decltype(abs((unsigned char)0)));
85 ASSERT_SAME_TYPE(int, decltype(abs((unsigned short)0)));
86 ASSERT_SAME_TYPE(int, decltype(abs((signed char)0)));
87 ASSERT_SAME_TYPE(int, decltype(abs((short)0)));
88 ASSERT_SAME_TYPE(int, decltype(abs((unsigned char)0)));
89 ASSERT_SAME_TYPE(int, decltype(abs((char)0)));
90
91 static_assert(!has_abs<unsigned>::value, "");
92 static_assert(!has_abs<unsigned long>::value, "");
93 static_assert(!has_abs<unsigned long long>::value, "");
94 static_assert(!has_abs<size_t>::value, "");
95
96 TEST_DIAGNOSTIC_POP
97
98 assert(abs(-1.) == 1);
99}
100
101int main(int, char**) {
102 size_t s = 0; ((void)s);
103 div_t d; ((void)d);
104 ldiv_t ld; ((void)ld);
105 lldiv_t lld; ((void)lld);
106 char** endptr = 0;
107 ASSERT_SAME_TYPE(double, decltype(atof("")));
108 ASSERT_SAME_TYPE(int, decltype(atoi("")));
109 ASSERT_SAME_TYPE(long, decltype(atol("")));
110 ASSERT_SAME_TYPE(long long, decltype(atoll("")));
111 ASSERT_SAME_TYPE(char*, decltype(getenv("")));
112 ASSERT_SAME_TYPE(double, decltype(strtod("", endptr)));
113 ASSERT_SAME_TYPE(float, decltype(strtof("", endptr)));
114 ASSERT_SAME_TYPE(long double, decltype(strtold("", endptr)));
115 ASSERT_SAME_TYPE(long, decltype(strtol("", endptr,0)));
116 ASSERT_SAME_TYPE(long long, decltype(strtoll("", endptr,0)));
117 ASSERT_SAME_TYPE(unsigned long, decltype(strtoul("", endptr,0)));
118 ASSERT_SAME_TYPE(unsigned long long, decltype(strtoull("", endptr,0)));
119 ASSERT_SAME_TYPE(int, decltype(rand()));
120 ASSERT_SAME_TYPE(void, decltype(srand(0)));
121
122 // aligned_alloc tested in stdlib_h.aligned_alloc.compile.pass.cpp
123
124 void* pv = 0;
125 void (*handler)() = 0;
126 int (*comp)(void const*, void const*) = 0;
127 ASSERT_SAME_TYPE(void*, decltype(calloc(0,0)));
128 ASSERT_SAME_TYPE(void, decltype(free(0)));
129 ASSERT_SAME_TYPE(void*, decltype(malloc(0)));
130 ASSERT_SAME_TYPE(void*, decltype(realloc(0,0)));
131 ASSERT_SAME_TYPE(void, decltype(abort()));
132 ASSERT_SAME_TYPE(int, decltype(atexit(handler)));
133 ASSERT_SAME_TYPE(void, decltype(exit(0)));
134 ASSERT_SAME_TYPE(void, decltype(_Exit(0)));
135 ASSERT_SAME_TYPE(char*, decltype(getenv("")));
136 ASSERT_SAME_TYPE(int, decltype(system("")));
137 ASSERT_SAME_TYPE(void*, decltype(bsearch(pv,pv,0,0,comp)));
138 ASSERT_SAME_TYPE(void, decltype(qsort(pv,0,0,comp)));
139 ASSERT_SAME_TYPE(int, decltype(abs(0)));
140 ASSERT_SAME_TYPE(long, decltype(labs((long)0)));
141 ASSERT_SAME_TYPE(long long, decltype(llabs((long long)0)));
142 ASSERT_SAME_TYPE(div_t, decltype(div(0,0)));
143 ASSERT_SAME_TYPE(ldiv_t, decltype(ldiv(0L,0L)));
144 ASSERT_SAME_TYPE(lldiv_t, decltype(lldiv(0LL,0LL)));
145#ifndef TEST_HAS_NO_WIDE_CHARACTERS
146 wchar_t* pw = 0;
147 const wchar_t* pwc = 0;
148 char* pc = 0;
149 ASSERT_SAME_TYPE(int, decltype(mblen("",0)));
150 ASSERT_SAME_TYPE(int, decltype(mbtowc(pw,"",0)));
151 ASSERT_SAME_TYPE(int, decltype(wctomb(pc,L' ')));
152 ASSERT_SAME_TYPE(size_t, decltype(mbstowcs(pw,"",0)));
153 ASSERT_SAME_TYPE(size_t, decltype(wcstombs(pc,pwc,0)));
154#endif
155
156 test_abs();
157
158 return 0;
159}
160

Provided by KDAB

Privacy Policy
Learn to use CMake with our Intro Training
Find out more

source code of libcxx/test/std/depr/depr.c.headers/stdlib_h.pass.cpp