/*** * D compatible types that correspond to various basic types in associated * C and C++ compilers. * * Copyright: Copyright Sean Kelly 2005 - 2009. * License: Distributed under the * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). * (See accompanying file LICENSE) * Authors: Sean Kelly * Source: $(DRUNTIMESRC core/stdc/_config.d) * Standards: ISO/IEC 9899:1999 (E) */ /* NOTE: This file has been patched from the original DMD distribution to * work with the GDC compiler. */ module core.stdc.config; version (StdDdoc) { private { version (Posix) enum isPosix = true; else enum isPosix = false; static if (isPosix && (void*).sizeof > int.sizeof) { alias ddoc_long = long; alias ddoc_ulong = ulong; } else { alias ddoc_long = int; alias ddoc_ulong = uint; } struct ddoc_complex(T) { T re; T im; } } /*** * Used for a signed integer type that corresponds in size to the associated * C compiler's `long` type. */ alias c_long = ddoc_long; /*** * Used for an unsigned integer type that corresponds in size to the associated * C compiler's `unsigned long` type. */ alias c_ulong = ddoc_ulong; /*** * Used for a signed integer type that corresponds in size and mangling to the associated * C++ compiler's `long` type. */ alias cpp_long = c_long; /*** * Used for an unsigned integer type that corresponds in size and mangling to the associated * C++ compiler's `unsigned long` type. */ alias cpp_ulong = c_ulong; /*** * Used for a signed integer type that corresponds in size and mangling to the associated * C++ compiler's `long long` type. */ alias cpp_longlong = long; /*** * Used for an unsigned integer type that corresponds in size and mangling to the associated * C++ compiler's `unsigned long long` type. */ alias cpp_ulonglong = ulong; /*** * Used for a floating point type that corresponds in size and mangling to the associated * C++ compiler's `long double` type. */ alias c_long_double = real; /*** * Used for an unsigned integer type that corresponds in size and mangling to the associated * C++ compiler's `size_t` type. */ alias cpp_size_t = size_t; /*** * Used for a signed integer type that corresponds in size and mangling to the associated * C++ compiler's `ptrdiff_t` type. */ alias cpp_ptrdiff_t = ptrdiff_t; /*** * Used for a complex floating point type that corresponds in size and ABI to the associated * C compiler's `_Complex float` type. */ alias c_complex_float = ddoc_complex!float; /*** * Used for a complex floating point type that corresponds in size and ABI to the associated * C compiler's `_Complex double` type. */ alias c_complex_double = ddoc_complex!double; /*** * Used for a complex floating point type that corresponds in size and ABI to the associated * C compiler's `_Complex long double` type. */ alias c_complex_real = ddoc_complex!real; } else { version (OSX) version = Darwin; else version (iOS) version = Darwin; else version (TVOS) version = Darwin; else version (WatchOS) version = Darwin; version (GNU) { import gcc.builtins; alias __builtin_clong c_long; alias __builtin_culong c_ulong; enum __c_long : __builtin_clong; enum __c_ulong : __builtin_culong; alias __c_long cpp_long; alias __c_ulong cpp_ulong; enum __c_longlong : __builtin_clonglong; enum __c_ulonglong : __builtin_culonglong; alias __c_longlong cpp_longlong; alias __c_ulonglong cpp_ulonglong; } else version (Windows) { enum __c_long : int; enum __c_ulong : uint; alias int c_long; alias uint c_ulong; alias __c_long cpp_long; alias __c_ulong cpp_ulong; alias long cpp_longlong; alias ulong cpp_ulonglong; } else version (Posix) { static if ( (void*).sizeof > int.sizeof ) { enum __c_longlong : long; enum __c_ulonglong : ulong; alias long c_long; alias ulong c_ulong; alias long cpp_long; alias ulong cpp_ulong; alias __c_longlong cpp_longlong; alias __c_ulonglong cpp_ulonglong; } else { enum __c_long : int; enum __c_ulong : uint; alias int c_long; alias uint c_ulong; alias __c_long cpp_long; alias __c_ulong cpp_ulong; alias long cpp_longlong; alias ulong cpp_ulonglong; } } version (GNU) alias c_long_double = real; else version (LDC) alias c_long_double = real; // 64-bit real for MSVC targets else version (SDC) { version (X86) alias c_long_double = real; else version (X86_64) alias c_long_double = real; } else version (CRuntime_Microsoft) { /* long double is 64 bits, not 80 bits, but is mangled differently * than double. To distinguish double from long double, create a wrapper to represent * long double, then recognize that wrapper specially in the compiler * to generate the correct name mangling and correct function call/return * ABI conformance. */ enum __c_long_double : double; alias __c_long_double c_long_double; } else version (DigitalMars) { version (X86) { alias real c_long_double; } else version (X86_64) { version (linux) alias real c_long_double; else version (FreeBSD) alias real c_long_double; else version (OpenBSD) alias real c_long_double; else version (NetBSD) alias real c_long_double; else version (DragonFlyBSD) alias real c_long_double; else version (Solaris) alias real c_long_double; else version (Darwin) alias real c_long_double; } } static assert(is(c_long_double), "c_long_double needs to be declared for this platform/architecture."); version (Darwin) { alias cpp_size_t = cpp_ulong; version (D_LP64) alias cpp_ptrdiff_t = cpp_long; else alias cpp_ptrdiff_t = ptrdiff_t; } else { alias cpp_size_t = size_t; alias cpp_ptrdiff_t = ptrdiff_t; } // ABI layout of native complex types. private struct _Complex(T) { T re; T im; } enum __c_complex_float : _Complex!float; enum __c_complex_double : _Complex!double; enum __c_complex_real : _Complex!c_long_double; alias c_complex_float = __c_complex_float; alias c_complex_double = __c_complex_double; alias c_complex_real = __c_complex_real; }