mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 11:16:09 +00:00

An issue I often see in codebases compiled for unusual platforms is that header search paths are specified manually and are subtly wrong. For example, people will manually add `-isystem <some-toolchain>/usr/include`, which ends up messing up the layering of header search paths required by libc++ (because the C Standard Library now appears *before* libc++ in the search paths). Without this patch, this will end up causing compilation errors that are pretty inscrutable. This patch aims to improve the user experience by diagnosing this issue explicitly. In all cases I can think of, I would expect that a compilation error occur if these header search paths are not layered properly. This should only provide an explicit diagnostic instead of failing due to seemingly unrelated compilation errors. Differential Revision: https://reviews.llvm.org/D131441
154 lines
5.6 KiB
C++
154 lines
5.6 KiB
C++
// -*- C++ -*-
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP_CSTDLIB
|
|
#define _LIBCPP_CSTDLIB
|
|
|
|
/*
|
|
cstdlib synopsis
|
|
|
|
Macros:
|
|
|
|
EXIT_FAILURE
|
|
EXIT_SUCCESS
|
|
MB_CUR_MAX
|
|
NULL
|
|
RAND_MAX
|
|
|
|
namespace std
|
|
{
|
|
|
|
Types:
|
|
|
|
size_t
|
|
div_t
|
|
ldiv_t
|
|
lldiv_t // C99
|
|
|
|
double atof (const char* nptr);
|
|
int atoi (const char* nptr);
|
|
long atol (const char* nptr);
|
|
long long atoll(const char* nptr); // C99
|
|
double strtod (const char* restrict nptr, char** restrict endptr);
|
|
float strtof (const char* restrict nptr, char** restrict endptr); // C99
|
|
long double strtold (const char* restrict nptr, char** restrict endptr); // C99
|
|
long strtol (const char* restrict nptr, char** restrict endptr, int base);
|
|
long long strtoll (const char* restrict nptr, char** restrict endptr, int base); // C99
|
|
unsigned long strtoul (const char* restrict nptr, char** restrict endptr, int base);
|
|
unsigned long long strtoull(const char* restrict nptr, char** restrict endptr, int base); // C99
|
|
int rand(void);
|
|
void srand(unsigned int seed);
|
|
void* calloc(size_t nmemb, size_t size);
|
|
void free(void* ptr);
|
|
void* malloc(size_t size);
|
|
void* realloc(void* ptr, size_t size);
|
|
void abort(void);
|
|
int atexit(void (*func)(void));
|
|
void exit(int status);
|
|
void _Exit(int status);
|
|
char* getenv(const char* name);
|
|
int system(const char* string);
|
|
void* bsearch(const void* key, const void* base, size_t nmemb, size_t size,
|
|
int (*compar)(const void *, const void *));
|
|
void qsort(void* base, size_t nmemb, size_t size,
|
|
int (*compar)(const void *, const void *));
|
|
int abs( int j);
|
|
long abs( long j);
|
|
long long abs(long long j); // C++0X
|
|
long labs( long j);
|
|
long long llabs(long long j); // C99
|
|
div_t div( int numer, int denom);
|
|
ldiv_t div( long numer, long denom);
|
|
lldiv_t div(long long numer, long long denom); // C++0X
|
|
ldiv_t ldiv( long numer, long denom);
|
|
lldiv_t lldiv(long long numer, long long denom); // C99
|
|
int mblen(const char* s, size_t n);
|
|
int mbtowc(wchar_t* restrict pwc, const char* restrict s, size_t n);
|
|
int wctomb(char* s, wchar_t wchar);
|
|
size_t mbstowcs(wchar_t* restrict pwcs, const char* restrict s, size_t n);
|
|
size_t wcstombs(char* restrict s, const wchar_t* restrict pwcs, size_t n);
|
|
int at_quick_exit(void (*func)(void)) // C++11
|
|
void quick_exit(int status); // C++11
|
|
void *aligned_alloc(size_t alignment, size_t size); // C11
|
|
|
|
} // std
|
|
|
|
*/
|
|
|
|
#include <__assert> // all public C++ headers provide the assertion handler
|
|
#include <__config>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#ifndef _LIBCPP_STDLIB_H
|
|
# error <cstdlib> tried including <stdlib.h> but didn't find libc++'s <stdlib.h> header. \
|
|
This usually means that your header search paths are not configured properly. \
|
|
The header search paths should contain the C++ Standard Library headers before \
|
|
any C Standard Library, and you are probably using compiler flags that make that \
|
|
not be the case.
|
|
#endif
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
# pragma GCC system_header
|
|
#endif
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
using ::size_t _LIBCPP_USING_IF_EXISTS;
|
|
using ::div_t _LIBCPP_USING_IF_EXISTS;
|
|
using ::ldiv_t _LIBCPP_USING_IF_EXISTS;
|
|
using ::lldiv_t _LIBCPP_USING_IF_EXISTS;
|
|
using ::atof _LIBCPP_USING_IF_EXISTS;
|
|
using ::atoi _LIBCPP_USING_IF_EXISTS;
|
|
using ::atol _LIBCPP_USING_IF_EXISTS;
|
|
using ::atoll _LIBCPP_USING_IF_EXISTS;
|
|
using ::strtod _LIBCPP_USING_IF_EXISTS;
|
|
using ::strtof _LIBCPP_USING_IF_EXISTS;
|
|
using ::strtold _LIBCPP_USING_IF_EXISTS;
|
|
using ::strtol _LIBCPP_USING_IF_EXISTS;
|
|
using ::strtoll _LIBCPP_USING_IF_EXISTS;
|
|
using ::strtoul _LIBCPP_USING_IF_EXISTS;
|
|
using ::strtoull _LIBCPP_USING_IF_EXISTS;
|
|
using ::rand _LIBCPP_USING_IF_EXISTS;
|
|
using ::srand _LIBCPP_USING_IF_EXISTS;
|
|
using ::calloc _LIBCPP_USING_IF_EXISTS;
|
|
using ::free _LIBCPP_USING_IF_EXISTS;
|
|
using ::malloc _LIBCPP_USING_IF_EXISTS;
|
|
using ::realloc _LIBCPP_USING_IF_EXISTS;
|
|
using ::abort _LIBCPP_USING_IF_EXISTS;
|
|
using ::atexit _LIBCPP_USING_IF_EXISTS;
|
|
using ::exit _LIBCPP_USING_IF_EXISTS;
|
|
using ::_Exit _LIBCPP_USING_IF_EXISTS;
|
|
using ::getenv _LIBCPP_USING_IF_EXISTS;
|
|
using ::system _LIBCPP_USING_IF_EXISTS;
|
|
using ::bsearch _LIBCPP_USING_IF_EXISTS;
|
|
using ::qsort _LIBCPP_USING_IF_EXISTS;
|
|
using ::abs _LIBCPP_USING_IF_EXISTS;
|
|
using ::labs _LIBCPP_USING_IF_EXISTS;
|
|
using ::llabs _LIBCPP_USING_IF_EXISTS;
|
|
using ::div _LIBCPP_USING_IF_EXISTS;
|
|
using ::ldiv _LIBCPP_USING_IF_EXISTS;
|
|
using ::lldiv _LIBCPP_USING_IF_EXISTS;
|
|
using ::mblen _LIBCPP_USING_IF_EXISTS;
|
|
using ::mbtowc _LIBCPP_USING_IF_EXISTS;
|
|
using ::wctomb _LIBCPP_USING_IF_EXISTS;
|
|
using ::mbstowcs _LIBCPP_USING_IF_EXISTS;
|
|
using ::wcstombs _LIBCPP_USING_IF_EXISTS;
|
|
#if !defined(_LIBCPP_CXX03_LANG)
|
|
using ::at_quick_exit _LIBCPP_USING_IF_EXISTS;
|
|
using ::quick_exit _LIBCPP_USING_IF_EXISTS;
|
|
#endif
|
|
#if _LIBCPP_STD_VER > 14
|
|
using ::aligned_alloc _LIBCPP_USING_IF_EXISTS;
|
|
#endif
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
#endif // _LIBCPP_CSTDLIB
|