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 67 template <class T, class = decltype(::abs(std::declval<T>()))> 68 std::true_type has_abs_imp(int); 69 template <class T> 70 std::false_type has_abs_imp(...); 71 72 template <class T> 73 struct has_abs : decltype(has_abs_imp<T>(0)) {}; 74 75 void 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 101 int 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