AIX system headers need stdint.h and inttypes.h to be re-enterable

Summary:
AIX system headers need stdint.h and inttypes.h to be re-enterable when macro _STD_TYPES_T is defined so that limit macro definitions such as UINT32_MAX can be found. This patch attempts to allow that on AIX.

Reviewers: hubert.reinterpretcast, jasonliu, mclow.lists, EricWF

Reviewed by: hubert.reinterpretcast, mclow.lists

Subscribers: jfb, jsji, christof, cfe-commits, libcxx-commits, llvm-commits

Tags: #LLVM, #clang, #libc++

Differential Revision: https://reviews.llvm.org/D59253

llvm-svn: 363939
This commit is contained in:
Xing Xue 2019-06-20 15:36:32 +00:00
parent 345473c791
commit ab4bcd844a
5 changed files with 288 additions and 0 deletions

View File

@ -7,7 +7,12 @@
\*===----------------------------------------------------------------------===*/
#ifndef __CLANG_INTTYPES_H
// AIX system headers need inttypes.h to be re-enterable while _STD_TYPES_T
// is defined until an inclusion of it without _STD_TYPES_T occurs, in which
// case the header guard macro is defined.
#if !defined(_AIX) || !defined(_STD_TYPES_T)
#define __CLANG_INTTYPES_H
#endif
#if defined(_MSC_VER) && _MSC_VER < 1800
#error MSVC does not have inttypes.h prior to Visual Studio 2013

View File

@ -7,7 +7,12 @@
\*===----------------------------------------------------------------------===*/
#ifndef __CLANG_STDINT_H
// AIX system headers need stdint.h to be re-enterable while _STD_TYPES_T
// is defined until an inclusion of it without _STD_TYPES_T occurs, in which
// case the header guard macro is defined.
#if !defined(_AIX) || !defined(_STD_TYPES_T) || !defined(__STDC_HOSTED__)
#define __CLANG_STDINT_H
#endif
/* If we're hosted, fall back to the system's stdint.h, which might have
* additional definitions.

View File

@ -8,7 +8,12 @@
//===----------------------------------------------------------------------===//
#ifndef _LIBCPP_INTTYPES_H
// AIX system headers need inttypes.h to be re-enterable while _STD_TYPES_T
// is defined until an inclusion of it without _STD_TYPES_T occurs, in which
// case the header guard macro is defined.
#if !defined(_AIX) || !defined(_STD_TYPES_T)
#define _LIBCPP_INTTYPES_H
#endif // _STD_TYPES_T
/*
inttypes.h synopsis

View File

@ -8,7 +8,12 @@
//===----------------------------------------------------------------------===//
#ifndef _LIBCPP_STDINT_H
// AIX system headers need stdint.h to be re-enterable while _STD_TYPES_T
// is defined until an inclusion of it without _STD_TYPES_T occurs, in which
// case the header guard macro is defined.
#if !defined(_AIX) || !defined(_STD_TYPES_T)
#define _LIBCPP_STDINT_H
#endif // _STD_TYPES_T
/*
stdint.h synopsis

View File

@ -0,0 +1,268 @@
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
// AIX system headers need stdint.h to be re-enterable when macro _STD_TYPES_T
// is defined. This test case tests that after including sys/types.h which
// defines macro _STD_TYPES_T, includes stdint.h, and then undefines
// _STD_TYPES_T, stdint.h can be entered to get to macros like UINT32_MAX.
//
// REQUIRES: aix
// RUN: %compile -c
// RUN: %compile -c -D_XOPEN_SOURCE=700
// test <stdint.h>
//
// Test that limits macros are available when <stdint.h> is included with
// or without macro _XOPEN_SOURCE=700.
#include <sys/types.h>
#include <stdint.h>
#ifndef INT8_MIN
#error INT8_MIN not defined
#endif
#ifndef INT16_MIN
#error INT16_MIN not defined
#endif
#ifndef INT32_MIN
#error INT32_MIN not defined
#endif
#ifndef INT64_MIN
#error INT64_MIN not defined
#endif
#ifndef INT8_MAX
#error INT8_MAX not defined
#endif
#ifndef INT16_MAX
#error INT16_MAX not defined
#endif
#ifndef INT32_MAX
#error INT32_MAX not defined
#endif
#ifndef INT64_MAX
#error INT64_MAX not defined
#endif
#ifndef UINT8_MAX
#error UINT8_MAX not defined
#endif
#ifndef UINT16_MAX
#error UINT16_MAX not defined
#endif
#ifndef UINT32_MAX
#error UINT32_MAX not defined
#endif
#ifndef UINT64_MAX
#error UINT64_MAX not defined
#endif
#ifndef INT_LEAST8_MIN
#error INT_LEAST8_MIN not defined
#endif
#ifndef INT_LEAST16_MIN
#error INT_LEAST16_MIN not defined
#endif
#ifndef INT_LEAST32_MIN
#error INT_LEAST32_MIN not defined
#endif
#ifndef INT_LEAST64_MIN
#error INT_LEAST64_MIN not defined
#endif
#ifndef INT_LEAST8_MAX
#error INT_LEAST8_MAX not defined
#endif
#ifndef INT_LEAST16_MAX
#error INT_LEAST16_MAX not defined
#endif
#ifndef INT_LEAST32_MAX
#error INT_LEAST32_MAX not defined
#endif
#ifndef INT_LEAST64_MAX
#error INT_LEAST64_MAX not defined
#endif
#ifndef UINT_LEAST8_MAX
#error UINT_LEAST8_MAX not defined
#endif
#ifndef UINT_LEAST16_MAX
#error UINT_LEAST16_MAX not defined
#endif
#ifndef UINT_LEAST32_MAX
#error UINT_LEAST32_MAX not defined
#endif
#ifndef UINT_LEAST64_MAX
#error UINT_LEAST64_MAX not defined
#endif
#ifndef INT_FAST8_MIN
#error INT_FAST8_MIN not defined
#endif
#ifndef INT_FAST16_MIN
#error INT_FAST16_MIN not defined
#endif
#ifndef INT_FAST32_MIN
#error INT_FAST32_MIN not defined
#endif
#ifndef INT_FAST64_MIN
#error INT_FAST64_MIN not defined
#endif
#ifndef INT_FAST8_MAX
#error INT_FAST8_MAX not defined
#endif
#ifndef INT_FAST16_MAX
#error INT_FAST16_MAX not defined
#endif
#ifndef INT_FAST32_MAX
#error INT_FAST32_MAX not defined
#endif
#ifndef INT_FAST64_MAX
#error INT_FAST64_MAX not defined
#endif
#ifndef UINT_FAST8_MAX
#error UINT_FAST8_MAX not defined
#endif
#ifndef UINT_FAST16_MAX
#error UINT_FAST16_MAX not defined
#endif
#ifndef UINT_FAST32_MAX
#error UINT_FAST32_MAX not defined
#endif
#ifndef UINT_FAST64_MAX
#error UINT_FAST64_MAX not defined
#endif
#ifndef INTPTR_MIN
#error INTPTR_MIN not defined
#endif
#ifndef INTPTR_MAX
#error INTPTR_MAX not defined
#endif
#ifndef UINTPTR_MAX
#error UINTPTR_MAX not defined
#endif
#ifndef INTMAX_MIN
#error INTMAX_MIN not defined
#endif
#ifndef INTMAX_MAX
#error INTMAX_MAX not defined
#endif
#ifndef UINTMAX_MAX
#error UINTMAX_MAX not defined
#endif
#ifndef PTRDIFF_MIN
#error PTRDIFF_MIN not defined
#endif
#ifndef PTRDIFF_MAX
#error PTRDIFF_MAX not defined
#endif
#ifndef SIG_ATOMIC_MIN
#error SIG_ATOMIC_MIN not defined
#endif
#ifndef SIG_ATOMIC_MAX
#error SIG_ATOMIC_MAX not defined
#endif
#ifndef SIZE_MAX
#error SIZE_MAX not defined
#endif
#ifndef WCHAR_MIN
#error WCHAR_MIN not defined
#endif
#ifndef WCHAR_MAX
#error WCHAR_MAX not defined
#endif
#ifndef WINT_MIN
#error WINT_MIN not defined
#endif
#ifndef WINT_MAX
#error WINT_MAX not defined
#endif
#ifndef INT8_C
#error INT8_C not defined
#endif
#ifndef INT16_C
#error INT16_C not defined
#endif
#ifndef INT32_C
#error INT32_C not defined
#endif
#ifndef INT64_C
#error INT64_C not defined
#endif
#ifndef UINT8_C
#error UINT8_C not defined
#endif
#ifndef UINT16_C
#error UINT16_C not defined
#endif
#ifndef UINT32_C
#error UINT32_C not defined
#endif
#ifndef UINT64_C
#error UINT64_C not defined
#endif
#ifndef INTMAX_C
#error INTMAX_C not defined
#endif
#ifndef UINTMAX_C
#error UINTMAX_C not defined
#endif