Merge upstream LLVM to 223068.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index dbc8e83..50c1fa2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -40,9 +40,13 @@
option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
-option(LIBCXX_ENABLE_CXX0X "Enable -std=c++0x and use of c++0x language features if the compiler supports it." ON)
+option(LIBCXX_ENABLE_CXX1Y "Enable -std=c++1y and use of c++1y language features if the compiler supports it." OFF)
option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
option(LIBCXX_INSTALL_SUPPORT_HEADERS "Install libc++ support headers." ON)
+if (LIBCXX_BUILT_STANDALONE)
+ set(LLVM_USE_SANITIZER "" CACHE STRING
+ "Define the sanitizer used to build the library and tests")
+endif()
set(CXXABIS none libcxxabi libcxxrt libstdc++ libsupc++)
if (NOT LIBCXX_CXX_ABI)
@@ -80,101 +84,15 @@
)
set(LIBCXX_TARGET_TRIPLE ${LIBCXX_TARGET_TRIPLE} CACHE STRING "Target triple.")
-#===============================================================================
-# Add an ABI library if appropriate
-#===============================================================================
-#
-# _setup_abi: Set up the build to use an ABI library
-#
-# Parameters:
-# abidefines: A list of defines needed to compile libc++ with the ABI library
-# abilibs : A list of libraries to link against
-# abifiles : A list of files (which may be relative paths) to copy into the
-# libc++ build tree for the build. These files will also be
-# installed alongside the libc++ headers.
-# abidirs : A list of relative paths to create under an include directory
-# in the libc++ build directory.
-#
-macro(setup_abi_lib abipathvar abidefines abilibs abifiles abidirs)
- list(APPEND LIBCXX_CXX_FEATURE_FLAGS ${abidefines})
- set(${abipathvar} "${${abipathvar}}"
- CACHE PATH
- "Paths to C++ ABI header directories separated by ';'." FORCE
- )
- set(LIBCXX_CXX_ABI_LIBRARIES ${abilibs})
- set(LIBCXX_ABILIB_FILES ${abifiles})
-
- file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include")
- foreach(_d ${abidirs})
- file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/${_d}")
- endforeach()
-
- foreach(fpath ${LIBCXX_ABILIB_FILES})
- set(found FALSE)
- foreach(incpath ${${abipathvar}})
- if (EXISTS "${incpath}/${fpath}")
- set(found TRUE)
- get_filename_component(dstdir ${fpath} PATH)
- get_filename_component(ifile ${fpath} NAME)
- file(COPY "${incpath}/${fpath}"
- DESTINATION "${CMAKE_BINARY_DIR}/include/${dstdir}"
- )
- list(APPEND abilib_headers "${CMAKE_BINARY_DIR}/include/${fpath}")
- endif()
- endforeach()
- if (NOT found)
- message(FATAL_ERROR "Failed to find ${fpath}")
- endif()
- endforeach()
-
- add_custom_target(LIBCXX_CXX_ABI_DEPS DEPENDS ${abilib_headers})
- include_directories("${CMAKE_BINARY_DIR}/include")
-
- install(FILES ${abilib_headers}
- DESTINATION include/c++/v1
- PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
- )
-endmacro()
-
-if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++" OR
- "${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libsupc++")
- set(_LIBSUPCXX_INCLUDE_FILES
- cxxabi.h bits/c++config.h bits/os_defines.h bits/cpu_defines.h
- bits/cxxabi_tweaks.h bits/cxxabi_forced.h
- )
- if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++")
- set(_LIBSUPCXX_DEFINES "-DLIBSTDCXX")
- set(_LIBSUPCXX_LIBNAME stdc++)
- else()
- set(_LIBSUPCXX_DEFINES "")
- set(_LIBSUPCXX_LIBNAME supc++)
- endif()
- setup_abi_lib("LIBCXX_LIBSUPCXX_INCLUDE_PATHS"
- "-D__GLIBCXX__ ${_LIBSUPCXX_DEFINES}"
- "${_LIBSUPCXX_LIBNAME}" "${_LIBSUPCXX_INCLUDE_FILES}" "bits"
- )
-elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxabi")
- if (LIBCXX_CXX_ABI_INTREE)
- # Link against just-built "cxxabi" target.
- set(CXXABI_LIBNAME cxxabi)
- else()
- # Assume c++abi is installed in the system, rely on -lc++abi link flag.
- set(CXXABI_LIBNAME "c++abi")
- endif()
- setup_abi_lib("LIBCXX_LIBCXXABI_INCLUDE_PATHS" ""
- ${CXXABI_LIBNAME} "cxxabi.h" ""
- )
-elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt")
- setup_abi_lib("LIBCXX_LIBCXXRT_INCLUDE_PATHS" "-DLIBCXXRT"
- "cxxrt" "cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h" ""
- )
-elseif (NOT "${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "none")
- message(FATAL_ERROR
- "Currently libstdc++, libsupc++, libcxxabi, libcxxrt and none are "
- "supported for c++ abi."
- )
-endif ()
+# Declare libc++ configuration variables.
+# They are intended for use as follows:
+# LIBCXX_CXX_FLAGS: General flags for both the compiler and linker.
+# LIBCXX_COMPILE_FLAGS: Compile only flags.
+# LIBCXX_LINK_FLAGS: Linker only flags.
+set(LIBCXX_CXX_FLAGS "")
+set(LIBCXX_COMPILE_FLAGS "")
+set(LIBCXX_LINK_FLAGS "")
# Configure compiler.
# @LOCALMOD-START Use a custom compiler config because cmake try_compile always
@@ -186,6 +104,8 @@
include(config-ix)
endif()
# @LOCALMOD-END
+# Configure ABI library
+include(HandleLibCXXABI)
#===============================================================================
# Setup Compiler Flags
@@ -199,12 +119,27 @@
# headers.
else()
if (LIBCXX_HAS_NOSTDINCXX_FLAG)
- list(APPEND LIBCXX_CXX_REQUIRED_FLAGS -nostdinc++)
+ list(APPEND LIBCXX_COMPILE_FLAGS -nostdinc++)
string(REPLACE "-stdlib=libc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+ string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
- if (LIBCXX_ENABLE_CXX0X AND LIBCXX_HAS_STDCXX0X_FLAG)
- list(APPEND LIBCXX_CXX_REQUIRED_FLAGS -std=c++0x)
+ # If c++1y has been enabled then attempt to use it. Fail if it is no supported
+ # by the compiler. Otherwise choose c++11 and ensure the compiler supports it.
+ if (LIBCXX_ENABLE_CXX1Y)
+ if (LIBCXX_HAS_STDCXX1Y_FLAG)
+ set(LIBCXX_STD_VERSION c++1y)
+ else()
+ message(FATAL_ERROR "c++1y was enabled but the compiler does not support it.")
+ endif()
+ else()
+ if (LIBCXX_HAS_STDCXX11_FLAG)
+ set(LIBCXX_STD_VERSION c++11)
+ else()
+ message(FATAL_ERROR "c++11 is required by libc++ but is not supported by the compiler")
+ endif()
endif()
+ # LIBCXX_STD_VERSION should always be set at this point.
+ list(APPEND LIBCXX_CXX_FLAGS "-std=${LIBCXX_STD_VERSION}")
endif()
macro(append_if list condition var)
@@ -215,23 +150,23 @@
# Get warning flags
if (NOT MSVC)
- append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WALL_FLAG -Wall)
- list(APPEND LIBCXX_CXX_REQUIRED_FLAGS -Werror=return-type)
+ append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_WALL_FLAG -Wall)
+ list(APPEND LIBCXX_COMPILE_FLAGS -Werror=return-type)
endif()
-append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_W_FLAG -W)
-append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_UNUSED_PARAMETER_FLAG -Wno-unused-parameter)
-append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings)
-append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_LONG_LONG_FLAG -Wno-long-long)
+append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_W_FLAG -W)
+append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_WNO_UNUSED_PARAMETER_FLAG -Wno-unused-parameter)
+append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings)
+append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_WNO_LONG_LONG_FLAG -Wno-long-long)
if (LIBCXX_ENABLE_WERROR)
- append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WERROR_FLAG -Werror)
- append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WX_FLAG -WX)
+ append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_WERROR_FLAG -Werror)
+ append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_WX_FLAG -WX)
else()
- append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_ERROR_FLAG -Wno-error)
- append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_NO_WX_FLAG -WX-)
+ append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_WNO_ERROR_FLAG -Wno-error)
+ append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_NO_WX_FLAG -WX-)
endif()
if (LIBCXX_ENABLE_PEDANTIC)
- append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_PEDANTIC_FLAG -pedantic)
+ append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_PEDANTIC_FLAG -pedantic)
endif()
# Get feature flags.
@@ -239,39 +174,39 @@
if (LIBCXX_ENABLE_EXCEPTIONS)
# Catches C++ exceptions only and tells the compiler to assume that extern C
# functions never throw a C++ exception.
- append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_EHSC_FLAG -EHsc)
+ append_if(LIBCXX_CXX_FLAGS LIBCXX_HAS_EHSC_FLAG -EHsc)
else()
- list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_LIBCPP_NO_EXCEPTIONS)
- append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_NO_EHS_FLAG -EHs-)
- append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_NO_EHA_FLAG -EHa-)
- append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_FNO_EXCEPTIONS_FLAG -fno-exceptions)
+ list(APPEND LIBCXX_CXX_FLAGS -D_LIBCPP_NO_EXCEPTIONS)
+ append_if(LIBCXX_CXX_FLAGS LIBCXX_HAS_NO_EHS_FLAG -EHs-)
+ append_if(LIBCXX_CXX_FLAGS LIBCXX_HAS_NO_EHA_FLAG -EHa-)
+ append_if(LIBCXX_CXX_FLAGS LIBCXX_HAS_FNO_EXCEPTIONS_FLAG -fno-exceptions)
endif()
# RTTI
if (NOT LIBCXX_ENABLE_RTTI)
- list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_LIBCPP_NO_RTTI)
- append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_NO_GR_FLAG -GR-)
- append_if(LIBCXX_CXX_FEATURE_FLAGS LIBCXX_HAS_FNO_RTTI_FLAG -fno-rtti)
+ list(APPEND LIBCXX_CXX_FLAGS -D_LIBCPP_NO_RTTI)
+ append_if(LIBCXX_CXX_FLAGS LIBCXX_HAS_NO_GR_FLAG -GR-)
+ append_if(LIBCXX_CXX_FLAGS LIBCXX_HAS_FNO_RTTI_FLAG -fno-rtti)
endif()
# Assert
string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
if (LIBCXX_ENABLE_ASSERTIONS)
# MSVC doesn't like _DEBUG on release builds. See PR 4379.
if (NOT MSVC)
- list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_DEBUG)
+ list(APPEND LIBCXX_COMPILE_FLAGS -D_DEBUG)
endif()
# On Release builds cmake automatically defines NDEBUG, so we
# explicitly undefine it:
if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
- list(APPEND LIBCXX_CXX_FEATURE_FLAGS -UNDEBUG)
+ list(APPEND LIBCXX_COMPILE_FLAGS -UNDEBUG)
endif()
else()
if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
- list(APPEND LIBCXX_CXX_FEATURE_FLAGS -DNDEBUG)
+ list(APPEND LIBCXX_COMPILE_FLAGS -DNDEBUG)
endif()
endif()
# Static library
if (NOT LIBCXX_ENABLE_SHARED)
- list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_LIBCPP_BUILD_STATIC)
+ list(APPEND LIBCXX_COMPILE_FLAGS -D_LIBCPP_BUILD_STATIC)
endif()
# This is the _ONLY_ place where add_definitions is called.
@@ -279,14 +214,42 @@
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()
-string(REPLACE ";" " " LIBCXX_CXX_REQUIRED_FLAGS "${LIBCXX_CXX_REQUIRED_FLAGS}")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXX_CXX_REQUIRED_FLAGS}")
+# Configure for sanitizers. If LIBCXX_BUILT_STANDALONE then we have to do
+# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
+if (LIBCXX_BUILT_STANDALONE)
+ # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
+ # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
+ if (LLVM_USE_SANITIZER AND NOT MSVC)
+ append_if(LIBCXX_CXX_FLAGS LIBCXX_HAS_FNO_OMIT_FRAME_POINTER_FLAG
+ "-fno-omit-frame-pointer")
+ if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
+ NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
+ append_if(LIBCXX_CXX_FLAGS LIBCXX_HAS_GLINE_TABLES_ONLY_FLAG
+ "-gline-tables-only")
+ endif()
+ if (LLVM_USE_SANITIZER STREQUAL "Address")
+ list(APPEND LIBCXX_CXX_FLAGS "-fsanitize=address")
+ elseif (LLVM_USE_SANITIZER MATCHES "Memory(WithOrigins)?")
+ list(APPEND LIBCXX_CXX_FLAGS "-fsanitize=memory")
+ if (LLVM_USE_SANITIZER STREQUAL "MemoryWithOrigins")
+ list(APPEND LIBCXX_CXX_FLAGS "-fsanitize-memory-track-origins")
+ endif()
+ elseif (LLVM_USE_SANITIZER STREQUAL "Undefined")
+ list(APPEND LIBCXX_CXX_FLAGS
+ "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover")
+ elseif (LLVM_USE_SANITIZER STREQUAL "Thread")
+ list(APPEND LIBCXX_CXX_FLAGS "-fsanitize=thread")
+ else()
+ message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${LLVM_USE_SANITIZER}")
+ endif()
+ elseif(MSVC)
+ message(WARNING "LLVM_USE_SANITIZER is not supported with MSVC")
+ endif()
+endif()
-string(REPLACE ";" " " LIBCXX_CXX_WARNING_FLAGS "${LIBCXX_CXX_WARNING_FLAGS}")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXX_CXX_WARNING_FLAGS}")
-
-string(REPLACE ";" " " LIBCXX_CXX_FEATURE_FLAGS "${LIBCXX_CXX_FEATURE_FLAGS}")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXX_CXX_FEATURE_FLAGS}")
+string(REPLACE ";" " " LIBCXX_CXX_FLAGS "${LIBCXX_CXX_FLAGS}")
+# @LOCALMOD reverse the order, so that we can override -std=...
+set(CMAKE_CXX_FLAGS "${LIBCXX_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
#===============================================================================
# Setup Source Code
diff --git a/CREDITS.TXT b/CREDITS.TXT
index 368b526..7a28ada 100644
--- a/CREDITS.TXT
+++ b/CREDITS.TXT
@@ -33,6 +33,10 @@
E: marshall@idio.com
D: C++14 support, patches and bug fixes.
+N: Eric Fiselier
+E: eric@efcs.ca
+D: LFTS support, patches and bug fixes.
+
N: Bill Fisher
E: william.w.fisher@gmail.com
D: Regex bug fixes.
diff --git a/cmake/Modules/HandleLibCXXABI.cmake b/cmake/Modules/HandleLibCXXABI.cmake
new file mode 100644
index 0000000..4d2a869
--- /dev/null
+++ b/cmake/Modules/HandleLibCXXABI.cmake
@@ -0,0 +1,98 @@
+
+#===============================================================================
+# Add an ABI library if appropriate
+#===============================================================================
+
+#
+# _setup_abi: Set up the build to use an ABI library
+#
+# Parameters:
+# abidefines: A list of defines needed to compile libc++ with the ABI library
+# abilib : The ABI library to link against.
+# abifiles : A list of files (which may be relative paths) to copy into the
+# libc++ build tree for the build. These files will also be
+# installed alongside the libc++ headers.
+# abidirs : A list of relative paths to create under an include directory
+# in the libc++ build directory.
+#
+macro(setup_abi_lib abipathvar abidefines abilib abifiles abidirs)
+ list(APPEND LIBCXX_COMPILE_FLAGS ${abidefines})
+ set(${abipathvar} "${${abipathvar}}"
+ CACHE PATH
+ "Paths to C++ ABI header directories separated by ';'." FORCE
+ )
+
+ set(LIBCXX_CXX_ABI_LIBRARY ${abilib})
+
+ set(LIBCXX_ABILIB_FILES ${abifiles})
+
+ file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include")
+ foreach(_d ${abidirs})
+ file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/${_d}")
+ endforeach()
+
+ foreach(fpath ${LIBCXX_ABILIB_FILES})
+ set(found FALSE)
+ foreach(incpath ${${abipathvar}})
+ if (EXISTS "${incpath}/${fpath}")
+ set(found TRUE)
+ get_filename_component(dstdir ${fpath} PATH)
+ get_filename_component(ifile ${fpath} NAME)
+ file(COPY "${incpath}/${fpath}"
+ DESTINATION "${CMAKE_BINARY_DIR}/include/${dstdir}"
+ )
+ install(FILES "${CMAKE_BINARY_DIR}/include/${fpath}"
+ DESTINATION include/c++/v1/${dstdir}
+ PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
+ )
+ list(APPEND abilib_headers "${CMAKE_BINARY_DIR}/include/${fpath}")
+ endif()
+ endforeach()
+ if (NOT found)
+ message(FATAL_ERROR "Failed to find ${fpath}")
+ endif()
+ endforeach()
+
+ add_custom_target(LIBCXX_CXX_ABI_DEPS DEPENDS ${abilib_headers})
+ include_directories("${CMAKE_BINARY_DIR}/include")
+
+endmacro()
+
+if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++" OR
+ "${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libsupc++")
+ set(_LIBSUPCXX_INCLUDE_FILES
+ cxxabi.h bits/c++config.h bits/os_defines.h bits/cpu_defines.h
+ bits/cxxabi_tweaks.h bits/cxxabi_forced.h
+ )
+ if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++")
+ set(_LIBSUPCXX_DEFINES "-DLIBSTDCXX")
+ set(_LIBSUPCXX_LIBNAME stdc++)
+ else()
+ set(_LIBSUPCXX_DEFINES "")
+ set(_LIBSUPCXX_LIBNAME supc++)
+ endif()
+ setup_abi_lib("LIBCXX_LIBSUPCXX_INCLUDE_PATHS"
+ "-D__GLIBCXX__ ${_LIBSUPCXX_DEFINES}"
+ "${_LIBSUPCXX_LIBNAME}" "${_LIBSUPCXX_INCLUDE_FILES}" "bits"
+ )
+elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxabi")
+ if (LIBCXX_CXX_ABI_INTREE)
+ # Link against just-built "cxxabi" target.
+ set(CXXABI_LIBNAME cxxabi)
+ else()
+ # Assume c++abi is installed in the system, rely on -lc++abi link flag.
+ set(CXXABI_LIBNAME "c++abi")
+ endif()
+ setup_abi_lib("LIBCXX_LIBCXXABI_INCLUDE_PATHS" ""
+ ${CXXABI_LIBNAME} "cxxabi.h" ""
+ )
+elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt")
+ setup_abi_lib("LIBCXX_LIBCXXRT_INCLUDE_PATHS" "-DLIBCXXRT"
+ "cxxrt" "cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h" ""
+ )
+elseif (NOT "${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "none")
+ message(FATAL_ERROR
+ "Currently libstdc++, libsupc++, libcxxabi, libcxxrt and none are "
+ "supported for c++ abi."
+ )
+endif ()
\ No newline at end of file
diff --git a/cmake/config-ix-pnacl.cmake b/cmake/config-ix-pnacl.cmake
index e8d6025..829cfcc 100644
--- a/cmake/config-ix-pnacl.cmake
+++ b/cmake/config-ix-pnacl.cmake
@@ -7,6 +7,7 @@
# https://code.google.com/p/nativeclient/issues/detail?id=3661
set(LIBCXX_HAS_STDCXX0X_FLAG 1)
+set(LIBCXX_HAS_STDCXX11_FLAG 1)
set(LIBCXX_HAS_FPIC_FLAG 0) # Not quite true, but untested in PNaCl.
set(LIBCXX_HAS_NODEFAULTLIBS_FLAG 1)
set(LIBCXX_HAS_NOSTDINCXX_FLAG 1)
diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake
index e8adafd..428d737 100644
--- a/cmake/config-ix.cmake
+++ b/cmake/config-ix.cmake
@@ -2,26 +2,29 @@
include(CheckCXXCompilerFlag)
# Check compiler flags
-check_cxx_compiler_flag(-std=c++0x LIBCXX_HAS_STDCXX0X_FLAG)
-check_cxx_compiler_flag(-fPIC LIBCXX_HAS_FPIC_FLAG)
-check_cxx_compiler_flag(-nodefaultlibs LIBCXX_HAS_NODEFAULTLIBS_FLAG)
-check_cxx_compiler_flag(-nostdinc++ LIBCXX_HAS_NOSTDINCXX_FLAG)
-check_cxx_compiler_flag(-Wall LIBCXX_HAS_WALL_FLAG)
-check_cxx_compiler_flag(-W LIBCXX_HAS_W_FLAG)
-check_cxx_compiler_flag(-Wno-unused-parameter LIBCXX_HAS_WNO_UNUSED_PARAMETER_FLAG)
-check_cxx_compiler_flag(-Wwrite-strings LIBCXX_HAS_WWRITE_STRINGS_FLAG)
-check_cxx_compiler_flag(-Wno-long-long LIBCXX_HAS_WNO_LONG_LONG_FLAG)
-check_cxx_compiler_flag(-pedantic LIBCXX_HAS_PEDANTIC_FLAG)
-check_cxx_compiler_flag(-Werror LIBCXX_HAS_WERROR_FLAG)
-check_cxx_compiler_flag(-Wno-error LIBCXX_HAS_WNO_ERROR_FLAG)
-check_cxx_compiler_flag(-fno-exceptions LIBCXX_HAS_FNO_EXCEPTIONS_FLAG)
-check_cxx_compiler_flag(-fno-rtti LIBCXX_HAS_FNO_RTTI_FLAG)
-check_cxx_compiler_flag(/WX LIBCXX_HAS_WX_FLAG)
-check_cxx_compiler_flag(/WX- LIBCXX_HAS_NO_WX_FLAG)
-check_cxx_compiler_flag(/EHsc LIBCXX_HAS_EHSC_FLAG)
-check_cxx_compiler_flag(/EHs- LIBCXX_HAS_NO_EHS_FLAG)
-check_cxx_compiler_flag(/EHa- LIBCXX_HAS_NO_EHA_FLAG)
-check_cxx_compiler_flag(/GR- LIBCXX_HAS_NO_GR_FLAG)
+check_cxx_compiler_flag(-std=c++11 LIBCXX_HAS_STDCXX11_FLAG)
+check_cxx_compiler_flag(-std=c++1y LIBCXX_HAS_STDCXX1Y_FLAG)
+check_cxx_compiler_flag(-fPIC LIBCXX_HAS_FPIC_FLAG)
+check_cxx_compiler_flag(-fno-omit-frame-pointer LIBCXX_HAS_FNO_OMIT_FRAME_POINTER_FLAG)
+check_cxx_compiler_flag(-nodefaultlibs LIBCXX_HAS_NODEFAULTLIBS_FLAG)
+check_cxx_compiler_flag(-nostdinc++ LIBCXX_HAS_NOSTDINCXX_FLAG)
+check_cxx_compiler_flag(-Wall LIBCXX_HAS_WALL_FLAG)
+check_cxx_compiler_flag(-W LIBCXX_HAS_W_FLAG)
+check_cxx_compiler_flag(-Wno-unused-parameter LIBCXX_HAS_WNO_UNUSED_PARAMETER_FLAG)
+check_cxx_compiler_flag(-Wwrite-strings LIBCXX_HAS_WWRITE_STRINGS_FLAG)
+check_cxx_compiler_flag(-Wno-long-long LIBCXX_HAS_WNO_LONG_LONG_FLAG)
+check_cxx_compiler_flag(-pedantic LIBCXX_HAS_PEDANTIC_FLAG)
+check_cxx_compiler_flag(-Werror LIBCXX_HAS_WERROR_FLAG)
+check_cxx_compiler_flag(-Wno-error LIBCXX_HAS_WNO_ERROR_FLAG)
+check_cxx_compiler_flag(-fno-exceptions LIBCXX_HAS_FNO_EXCEPTIONS_FLAG)
+check_cxx_compiler_flag(-fno-rtti LIBCXX_HAS_FNO_RTTI_FLAG)
+check_cxx_compiler_flag(-gline-tables-only LIBCXX_HAS_GLINE_TABLES_ONLY_FLAG)
+check_cxx_compiler_flag(/WX LIBCXX_HAS_WX_FLAG)
+check_cxx_compiler_flag(/WX- LIBCXX_HAS_NO_WX_FLAG)
+check_cxx_compiler_flag(/EHsc LIBCXX_HAS_EHSC_FLAG)
+check_cxx_compiler_flag(/EHs- LIBCXX_HAS_NO_EHS_FLAG)
+check_cxx_compiler_flag(/EHa- LIBCXX_HAS_NO_EHA_FLAG)
+check_cxx_compiler_flag(/GR- LIBCXX_HAS_NO_GR_FLAG)
# Check libraries
check_library_exists(pthread pthread_create "" LIBCXX_HAS_PTHREAD_LIB)
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index bbf7ea4..df2cd34 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -1,13 +1,22 @@
if (NOT LIBCXX_INSTALL_SUPPORT_HEADERS)
set(LIBCXX_SUPPORT_HEADER_PATTERN PATTERN "support" EXCLUDE)
endif()
-
-install(DIRECTORY .
- DESTINATION include/c++/v1
- FILES_MATCHING
+set(LIBCXX_HEADER_PATTERN
PATTERN "*"
PATTERN "CMakeLists.txt" EXCLUDE
PATTERN ".svn" EXCLUDE
${LIBCXX_SUPPORT_HEADER_PATTERN}
+ )
+
+file(COPY .
+ DESTINATION "${CMAKE_BINARY_DIR}/include/c++/v1"
+ FILES_MATCHING
+ ${LIBCXX_HEADER_PATTERN}
+ )
+
+install(DIRECTORY .
+ DESTINATION include/c++/v1
+ FILES_MATCHING
+ ${LIBCXX_HEADER_PATTERN}
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)
diff --git a/include/__config b/include/__config
index ce235af..6f57df5 100644
--- a/include/__config
+++ b/include/__config
@@ -19,6 +19,11 @@
#define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
#endif
+#if !_WIN32
+#include <unistd.h>
+#include <errno.h> // for ELAST on FreeBSD
+#endif
+
#define _LIBCPP_VERSION 1101
#define _LIBCPP_ABI_VERSION 1
@@ -106,6 +111,13 @@
# endif
#endif // __sun__
+#if defined(__native_client__)
+ // NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access,
+ // including accesses to the special files under /dev. C++11's
+ // std::random_device is instead exposed through a NaCl syscall.
+# define _LIBCPP_USING_NACL_RANDOM
+#endif // defined(__native_client__)
+
#if !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
# include <endian.h>
# if __BYTE_ORDER == __LITTLE_ENDIAN
@@ -221,13 +233,9 @@
#endif
#if __cplusplus < 201103L
-#ifdef __linux__
-#define _LIBCPP_HAS_NO_UNICODE_CHARS
-#else
typedef __char16_t char16_t;
typedef __char32_t char32_t;
#endif
-#endif
#if !(__has_feature(cxx_exceptions))
#define _LIBCPP_NO_EXCEPTIONS
@@ -608,7 +616,7 @@
#endif
#ifndef _LIBCPP_EXTERN_TEMPLATE
-#define _LIBCPP_EXTERN_TEMPLATE(...)
+#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
#endif
#ifndef _LIBCPP_EXTERN_TEMPLATE2
@@ -635,6 +643,25 @@
#define _LIBCPP_WCTYPE_IS_MASK
#endif
+#if defined(ELAST)
+#define _LIBCPP_ELAST ELAST
+#elif defined(__linux__)
+#define _LIBCPP_ELAST 4095
+// @LOCALMOD-START
+#elif defined(__native_client__)
+// NaCl doesn't have ELAST or __ELASTERROR
+// @LOCALMOD-END
+#elif defined(_NEWLIB_VERSION)
+#define _LIBCPP_ELAST __ELASTERROR
+#elif defined(__APPLE__)
+// Not _LIBCPP_ELAST needed on Apple
+#elif defined(__sun__)
+#define _LIBCPP_ELAST ESTALE
+#else
+// Warn here so that the person doing the libcxx port has an easier time:
+#warning This platform's ELAST hasn't been ported yet
+#endif
+
#ifndef _LIBCPP_TRIVIAL_PAIR_COPY_CTOR
# define _LIBCPP_TRIVIAL_PAIR_COPY_CTOR 1
#endif
@@ -678,8 +705,8 @@
// g++ and cl.exe have RTTI on by default and define a macro when it is.
// g++ only defines the macro in 4.3.2 and onwards.
#if !defined(_LIBCPP_NO_RTTI)
-# if defined(__GNUG__) && (__GNUC__ >= 4 && \
- (__GNUC_MINOR__ >= 3 || __GNUC_PATCHLEVEL__ >= 2)) && !defined(__GXX_RTTI)
+# if defined(__GNUG__) && ((__GNUC__ >= 5) || (__GNUC__ == 4 && \
+ (__GNUC_MINOR__ >= 3 || __GNUC_PATCHLEVEL__ >= 2))) && !defined(__GXX_RTTI)
# define _LIBCPP_NO_RTTI
# elif (defined(_MSC_VER) && !defined(__clang__)) && !defined(_CPPRTTI)
# define _LIBCPP_NO_RTTI
diff --git a/include/__locale b/include/__locale
index c0a04a1..03f1b52 100644
--- a/include/__locale
+++ b/include/__locale
@@ -29,8 +29,17 @@
# if __ANDROID_API__ <= 20
# include <support/android/locale_bionic.h>
# endif
+#elif defined(__sun__)
+# include <support/solaris/xlocale.h>
+// @LOCALMOD-START
+#elif defined(_NEWLIB_VERSION)
+// FIXME: replace all the uses of _NEWLIB_VERSION with __NEWLIB__ preceded by an
+// include of <sys/cdefs.h> once https://sourceware.org/ml/newlib-cvs/2014-q3/msg00038.html
+// has had a chance to bake for a bit.
+#include <support/newlib/xlocale.h>
+// @LOCALMOD-END
#elif (defined(__GLIBC__) || defined(__APPLE__) || defined(__FreeBSD__) \
- || defined(__sun__) || defined(__EMSCRIPTEN__) || defined(__IBMCPP__))
+ || defined(__EMSCRIPTEN__) || defined(__IBMCPP__))
# include <xlocale.h>
#endif // __GLIBC__ || __APPLE__ || __FreeBSD__ || __sun__ || __EMSCRIPTEN__ || __IBMCPP__
@@ -38,66 +47,6 @@
#pragma GCC system_header
#endif
-// @LOCALMOD-START Newlib doesn't have the following C extensions for
-// locales. This probably shouldn't rely on
-// _NEWLIB_VERSION: lack of locale_t support could
-// instead be detected at configuration time.
-#if defined(_NEWLIB_VERSION)
-typedef void *locale_t;
-extern "C" locale_t duplocale(locale_t);
-extern "C" void freelocale(locale_t);
-extern "C" locale_t newlocale(int, const char *, locale_t);
-extern "C" locale_t uselocale(locale_t);
-#define LC_COLLATE_MASK (1 << LC_COLLATE)
-#define LC_CTYPE_MASK (1 << LC_CTYPE)
-#define LC_MESSAGES_MASK (1 << LC_MESSAGES)
-#define LC_MONETARY_MASK (1 << LC_MONETARY)
-#define LC_NUMERIC_MASK (1 << LC_NUMERIC)
-#define LC_TIME_MASK (1 << LC_TIME)
-#define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | \
- LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK)
-#define isxdigit_l(a, L) (((void) L), isxdigit(a))
-#define iswxdigit_l(a, L) (((void) L), iswxdigit(a))
-#define isdigit_l(a, L) (((void) L), isdigit(a))
-#define iswdigit_l(a, L) (((void) L), iswdigit(a))
-#define iswcntrl_l(a, L) (((void) L), iswcntrl(a))
-#define iswcntrl_l(a, L) (((void) L), iswcntrl(a))
-#define isalpha_l(a, L) (((void) L), isalpha(a))
-#define iswalpha_l(a, L) (((void) L), iswalpha(a))
-#define ispunct_l(a, L) (((void) L), ispunct(a))
-#define iswpunct_l(a, L) (((void) L), iswpunct(a))
-#define isblank_l(a, L) (((void) L), isblank(a))
-#define iswblank_l(a, L) (((void) L), iswblank(a))
-#define isspace_l(a, L) (((void) L), isspace(a))
-#define iswspace_l(a, L) (((void) L), iswspace(a))
-#define isprint_l(a, L) (((void) L), isprint(a))
-#define iswprint_l(a, L) (((void) L), iswprint(a))
-#define islower_l(a, L) (((void) L), islower(a))
-#define iswlower_l(a, L) (((void) L), iswlower(a))
-#define isupper_l(a, L) (((void) L), isupper(a))
-#define iswupper_l(a, L) (((void) L), iswupper(a))
-#define tolower_l(a, L) (((void) L), tolower(a))
-#define towlower_l(a, L) (((void) L), towlower(a))
-#define toupper_l(a, L) (((void) L), toupper(a))
-#define towupper_l(a, L) (((void) L), towupper(a))
-#define strftime_l(a, b, c, d, L) (((void) L), strftime(a, b, c, d))
-#define strtoll_l(a, b, c, L) (((void) L), strtoll(a, b, c))
-#define strtoull_l(a, b, c, L) (((void) L), strtoull(a, b, c))
-#define strtold_l(a, b, L) (((void) L), strtold(a, b))
-#define strcoll_l(a, b, L) (((void) L), strcoll(a, b))
-#define wstrcoll_l(a, b, L) (((void) L), wstrcoll(a, b))
-#define cscoll_l(a, b, L) (((void) L), cscoll(a, b))
-#define wcscoll_l(a, b, L) (((void) L), wcscoll(a, b))
-#define strxfrm_l(a, b, c, L) (((void) L), strxfrm(a, b, c))
-#define wstrxfrm_l(a, b, c, L) (((void) L), wstrxfrm(a, b, c))
-#define csxfrm_l(a, b, c, L) (((void) L), csxfrm(a, b, c))
-#define wcsxfrm_l(a, b, c, L) (((void) L), wcsxfrm(a, b, c))
-#define sscanf_l(a, b, L, ...) (((void) L), sscanf(a, b, ##__VA_ARGS__))
-#define snprintf_l(a, b, L, c, ...) (((void) L), snprintf(a, b, c, ##__VA_ARGS__))
-#define asprintf_l(a, L, b, ...) (((void) L), asprintf(a, b, ##__VA_ARGS__))
-#endif
- // @LOCALMOD-END
-
_LIBCPP_BEGIN_NAMESPACE_STD
class _LIBCPP_TYPE_VIS locale;
diff --git a/include/__mutex_base b/include/__mutex_base
index 293fead..d5ece7c 100644
--- a/include/__mutex_base
+++ b/include/__mutex_base
@@ -22,6 +22,8 @@
_LIBCPP_BEGIN_NAMESPACE_STD
+#ifndef _LIBCPP_HAS_NO_THREADS
+
class _LIBCPP_TYPE_VIS mutex
{
pthread_mutex_t __m_;
@@ -315,6 +317,7 @@
void __do_timed_wait(unique_lock<mutex>& __lk,
chrono::time_point<chrono::system_clock, chrono::nanoseconds>) _NOEXCEPT;
};
+#endif // !_LIBCPP_HAS_NO_THREADS
template <class _To, class _Rep, class _Period>
inline _LIBCPP_INLINE_VISIBILITY
@@ -332,6 +335,7 @@
return __r;
}
+#ifndef _LIBCPP_HAS_NO_THREADS
template <class _Predicate>
void
condition_variable::wait(unique_lock<mutex>& __lk, _Predicate __pred)
@@ -396,6 +400,8 @@
_VSTD::move(__pred));
}
+#endif // !_LIBCPP_HAS_NO_THREADS
+
_LIBCPP_END_NAMESPACE_STD
#endif // _LIBCPP___MUTEX_BASE
diff --git a/include/__tuple b/include/__tuple
index ee5b916..bffb95c 100644
--- a/include/__tuple
+++ b/include/__tuple
@@ -245,19 +245,30 @@
// __tuple_convertible
-template <bool, class _Tp, class _Up>
+template <class, class>
struct __tuple_convertible_imp : public false_type {};
template <class _Tp0, class ..._Tp, class _Up0, class ..._Up>
-struct __tuple_convertible_imp<true, __tuple_types<_Tp0, _Tp...>, __tuple_types<_Up0, _Up...> >
+struct __tuple_convertible_imp<__tuple_types<_Tp0, _Tp...>, __tuple_types<_Up0, _Up...> >
: public integral_constant<bool,
is_convertible<_Tp0, _Up0>::value &&
- __tuple_convertible_imp<true, __tuple_types<_Tp...>, __tuple_types<_Up...> >::value> {};
+ __tuple_convertible_imp<__tuple_types<_Tp...>, __tuple_types<_Up...> >::value> {};
template <>
-struct __tuple_convertible_imp<true, __tuple_types<>, __tuple_types<> >
+struct __tuple_convertible_imp<__tuple_types<>, __tuple_types<> >
: public true_type {};
+template <bool, class, class>
+struct __tuple_convertible_apply : public false_type {};
+
+template <class _Tp, class _Up>
+struct __tuple_convertible_apply<true, _Tp, _Up>
+ : public __tuple_convertible_imp<
+ typename __make_tuple_types<_Tp>::type
+ , typename __make_tuple_types<_Up>::type
+ >
+{};
+
template <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value,
bool = __tuple_like<_Up>::value>
struct __tuple_convertible
@@ -265,26 +276,36 @@
template <class _Tp, class _Up>
struct __tuple_convertible<_Tp, _Up, true, true>
- : public __tuple_convertible_imp<tuple_size<typename remove_reference<_Tp>::type>::value ==
- tuple_size<_Up>::value,
- typename __make_tuple_types<_Tp>::type, typename __make_tuple_types<_Up>::type>
+ : public __tuple_convertible_apply<tuple_size<typename remove_reference<_Tp>::type>::value ==
+ tuple_size<_Up>::value, _Tp, _Up>
{};
// __tuple_constructible
-template <bool, class _Tp, class _Up>
+template <class, class>
struct __tuple_constructible_imp : public false_type {};
template <class _Tp0, class ..._Tp, class _Up0, class ..._Up>
-struct __tuple_constructible_imp<true, __tuple_types<_Tp0, _Tp...>, __tuple_types<_Up0, _Up...> >
+struct __tuple_constructible_imp<__tuple_types<_Tp0, _Tp...>, __tuple_types<_Up0, _Up...> >
: public integral_constant<bool,
is_constructible<_Up0, _Tp0>::value &&
- __tuple_constructible_imp<true, __tuple_types<_Tp...>, __tuple_types<_Up...> >::value> {};
+ __tuple_constructible_imp<__tuple_types<_Tp...>, __tuple_types<_Up...> >::value> {};
template <>
-struct __tuple_constructible_imp<true, __tuple_types<>, __tuple_types<> >
+struct __tuple_constructible_imp<__tuple_types<>, __tuple_types<> >
: public true_type {};
+template <bool _SameSize, class, class>
+struct __tuple_constructible_apply : public false_type {};
+
+template <class _Tp, class _Up>
+struct __tuple_constructible_apply<true, _Tp, _Up>
+ : public __tuple_constructible_imp<
+ typename __make_tuple_types<_Tp>::type
+ , typename __make_tuple_types<_Up>::type
+ >
+{};
+
template <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value,
bool = __tuple_like<_Up>::value>
struct __tuple_constructible
@@ -292,26 +313,36 @@
template <class _Tp, class _Up>
struct __tuple_constructible<_Tp, _Up, true, true>
- : public __tuple_constructible_imp<tuple_size<typename remove_reference<_Tp>::type>::value ==
- tuple_size<_Up>::value,
- typename __make_tuple_types<_Tp>::type, typename __make_tuple_types<_Up>::type>
+ : public __tuple_constructible_apply<tuple_size<typename remove_reference<_Tp>::type>::value ==
+ tuple_size<_Up>::value, _Tp, _Up>
{};
// __tuple_assignable
-template <bool, class _Tp, class _Up>
+template <class, class>
struct __tuple_assignable_imp : public false_type {};
template <class _Tp0, class ..._Tp, class _Up0, class ..._Up>
-struct __tuple_assignable_imp<true, __tuple_types<_Tp0, _Tp...>, __tuple_types<_Up0, _Up...> >
+struct __tuple_assignable_imp<__tuple_types<_Tp0, _Tp...>, __tuple_types<_Up0, _Up...> >
: public integral_constant<bool,
is_assignable<_Up0&, _Tp0>::value &&
- __tuple_assignable_imp<true, __tuple_types<_Tp...>, __tuple_types<_Up...> >::value> {};
+ __tuple_assignable_imp<__tuple_types<_Tp...>, __tuple_types<_Up...> >::value> {};
template <>
-struct __tuple_assignable_imp<true, __tuple_types<>, __tuple_types<> >
+struct __tuple_assignable_imp<__tuple_types<>, __tuple_types<> >
: public true_type {};
+template <bool, class, class>
+struct __tuple_assignable_apply : public false_type {};
+
+template <class _Tp, class _Up>
+struct __tuple_assignable_apply<true, _Tp, _Up>
+ : __tuple_assignable_imp<
+ typename __make_tuple_types<_Tp>::type
+ , typename __make_tuple_types<_Up>::type
+ >
+{};
+
template <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value,
bool = __tuple_like<_Up>::value>
struct __tuple_assignable
@@ -319,9 +350,8 @@
template <class _Tp, class _Up>
struct __tuple_assignable<_Tp, _Up, true, true>
- : public __tuple_assignable_imp<tuple_size<typename remove_reference<_Tp>::type>::value ==
- tuple_size<_Up>::value,
- typename __make_tuple_types<_Tp>::type, typename __make_tuple_types<_Up>::type>
+ : public __tuple_assignable_apply<tuple_size<typename remove_reference<_Tp>::type>::value ==
+ tuple_size<_Up>::value, _Tp, _Up>
{};
_LIBCPP_END_NAMESPACE_STD
diff --git a/include/algorithm b/include/algorithm
index 3ba104b..02cbc81 100644
--- a/include/algorithm
+++ b/include/algorithm
@@ -1140,7 +1140,7 @@
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _BinaryPredicate __pred)
{
- for (; __first1 != __last1; ++__first1, ++__first2)
+ for (; __first1 != __last1; ++__first1, (void) ++__first2)
if (!__pred(*__first1, *__first2))
break;
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
@@ -1164,7 +1164,7 @@
_InputIterator2 __first2, _InputIterator2 __last2,
_BinaryPredicate __pred)
{
- for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+ for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
if (!__pred(*__first1, *__first2))
break;
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
@@ -1189,7 +1189,7 @@
bool
equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
{
- for (; __first1 != __last1; ++__first1, ++__first2)
+ for (; __first1 != __last1; ++__first1, (void) ++__first2)
if (!__pred(*__first1, *__first2))
return false;
return true;
@@ -1213,7 +1213,7 @@
_InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
input_iterator_tag, input_iterator_tag )
{
- for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+ for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
if (!__pred(*__first1, *__first2))
return false;
return __first1 == __last1 && __first2 == __last2;
@@ -1267,7 +1267,7 @@
_ForwardIterator2 __first2, _BinaryPredicate __pred)
{
// shorten sequences as much as possible by lopping of any equal parts
- for (; __first1 != __last1; ++__first1, ++__first2)
+ for (; __first1 != __last1; ++__first1, (void) ++__first2)
if (!__pred(*__first1, *__first2))
goto __not_done;
return true;
@@ -1327,7 +1327,7 @@
forward_iterator_tag, forward_iterator_tag )
{
// shorten sequences as much as possible by lopping of any equal parts
- for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+ for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
if (!__pred(*__first1, *__first2))
goto __not_done;
return __first1 == __last1 && __first2 == __last2;
@@ -1745,7 +1745,7 @@
_OutputIterator
__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
{
- for (; __first != __last; ++__first, ++__result)
+ for (; __first != __last; ++__first, (void) ++__result)
*__result = *__first;
return __result;
}
@@ -1874,7 +1874,7 @@
_OutputIterator
__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
{
- for (; __first != __last; ++__first, ++__result)
+ for (; __first != __last; ++__first, (void) ++__result)
*__result = _VSTD::move(*__first);
return __result;
}
@@ -1950,7 +1950,7 @@
_OutputIterator
transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
{
- for (; __first != __last; ++__first, ++__result)
+ for (; __first != __last; ++__first, (void) ++__result)
*__result = __op(*__first);
return __result;
}
@@ -1961,7 +1961,7 @@
transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
_OutputIterator __result, _BinaryOperation __binary_op)
{
- for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
+ for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__result)
*__result = __binary_op(*__first1, *__first2);
return __result;
}
@@ -1998,7 +1998,7 @@
replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
const _Tp& __old_value, const _Tp& __new_value)
{
- for (; __first != __last; ++__first, ++__result)
+ for (; __first != __last; ++__first, (void) ++__result)
if (*__first == __old_value)
*__result = __new_value;
else
@@ -2014,7 +2014,7 @@
replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
_Predicate __pred, const _Tp& __new_value)
{
- for (; __first != __last; ++__first, ++__result)
+ for (; __first != __last; ++__first, (void) ++__result)
if (__pred(*__first))
*__result = __new_value;
else
@@ -2029,7 +2029,7 @@
_OutputIterator
__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
{
- for (; __n > 0; ++__first, --__n)
+ for (; __n > 0; ++__first, (void) --__n)
*__first = __value_;
return __first;
}
@@ -2103,7 +2103,7 @@
_OutputIterator
generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
{
- for (; __n > 0; ++__first, --__n)
+ for (; __n > 0; ++__first, (void) --__n)
*__first = __gen();
return __first;
}
@@ -4372,7 +4372,7 @@
if (__len1 <= __len2)
{
value_type* __p = __buff;
- for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p)
+ for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), (void) ++__i, ++__p)
::new(__p) value_type(_VSTD::move(*__i));
__merge<_Compare>(move_iterator<value_type*>(__buff),
move_iterator<value_type*>(__p),
@@ -4383,7 +4383,7 @@
else
{
value_type* __p = __buff;
- for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p)
+ for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), (void) ++__i, ++__p)
::new(__p) value_type(_VSTD::move(*__i));
typedef reverse_iterator<_BidirectionalIterator> _RBi;
typedef reverse_iterator<value_type*> _Rv;
@@ -4408,7 +4408,7 @@
if (__len2 == 0)
return;
// shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
- for (; true; ++__first, --__len1)
+ for (; true; ++__first, (void) --__len1)
{
if (__len1 == 0)
return;
@@ -5067,7 +5067,7 @@
_RandomAccessIterator __r = __result_first;
if (__r != __result_last)
{
- for (; __first != __last && __r != __result_last; ++__first, ++__r)
+ for (; __first != __last && __r != __result_last; (void) ++__first, ++__r)
*__r = *__first;
__make_heap<_Compare>(__result_first, __r, __comp);
typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first;
@@ -5589,7 +5589,7 @@
__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
{
- for (; __first2 != __last2; ++__first1, ++__first2)
+ for (; __first2 != __last2; ++__first1, (void) ++__first2)
{
if (__first1 == __last1 || __comp(*__first1, *__first2))
return true;
diff --git a/include/atomic b/include/atomic
index eaf0d28..fe85609 100644
--- a/include/atomic
+++ b/include/atomic
@@ -533,6 +533,10 @@
#pragma GCC system_header
#endif
+#ifdef _LIBCPP_HAS_NO_THREADS
+#error <atomic> is not supported on this single threaded system
+#else // !_LIBCPP_HAS_NO_THREADS
+
_LIBCPP_BEGIN_NAMESPACE_STD
#if !__has_feature(cxx_atomic) && _GNUC_VER < 407
@@ -1791,4 +1795,6 @@
_LIBCPP_END_NAMESPACE_STD
+#endif // !_LIBCPP_HAS_NO_THREADS
+
#endif // _LIBCPP_ATOMIC
diff --git a/include/chrono b/include/chrono
index 2c65eee..9229234 100644
--- a/include/chrono
+++ b/include/chrono
@@ -926,6 +926,7 @@
static time_point from_time_t(time_t __t) _NOEXCEPT;
};
+#ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK
class _LIBCPP_TYPE_VIS steady_clock
{
public:
@@ -939,6 +940,9 @@
};
typedef steady_clock high_resolution_clock;
+#else
+typedef system_clock high_resolution_clock;
+#endif
} // chrono
diff --git a/include/cmath b/include/cmath
index 4e1240e..bddae84 100644
--- a/include/cmath
+++ b/include/cmath
@@ -316,9 +316,9 @@
template <class _A1>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_signbit(_A1 __x) _NOEXCEPT
+__libcpp_signbit(_A1 __lcpp_x) _NOEXCEPT
{
- return signbit(__x);
+ return signbit(__lcpp_x);
}
#undef signbit
@@ -326,9 +326,9 @@
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
-signbit(_A1 __x) _NOEXCEPT
+signbit(_A1 __lcpp_x) _NOEXCEPT
{
- return __libcpp_signbit((typename std::__promote<_A1>::type)__x);
+ return __libcpp_signbit((typename std::__promote<_A1>::type)__lcpp_x);
}
#endif // signbit
@@ -340,9 +340,9 @@
template <class _A1>
_LIBCPP_ALWAYS_INLINE
int
-__libcpp_fpclassify(_A1 __x) _NOEXCEPT
+__libcpp_fpclassify(_A1 __lcpp_x) _NOEXCEPT
{
- return fpclassify(__x);
+ return fpclassify(__lcpp_x);
}
#undef fpclassify
@@ -350,9 +350,9 @@
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename std::enable_if<std::is_arithmetic<_A1>::value, int>::type
-fpclassify(_A1 __x) _NOEXCEPT
+fpclassify(_A1 __lcpp_x) _NOEXCEPT
{
- return __libcpp_fpclassify((typename std::__promote<_A1>::type)__x);
+ return __libcpp_fpclassify((typename std::__promote<_A1>::type)__lcpp_x);
}
#endif // fpclassify
@@ -364,9 +364,9 @@
template <class _A1>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_isfinite(_A1 __x) _NOEXCEPT
+__libcpp_isfinite(_A1 __lcpp_x) _NOEXCEPT
{
- return isfinite(__x);
+ return isfinite(__lcpp_x);
}
#undef isfinite
@@ -374,9 +374,9 @@
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
-isfinite(_A1 __x) _NOEXCEPT
+isfinite(_A1 __lcpp_x) _NOEXCEPT
{
- return __libcpp_isfinite((typename std::__promote<_A1>::type)__x);
+ return __libcpp_isfinite((typename std::__promote<_A1>::type)__lcpp_x);
}
#endif // isfinite
@@ -388,9 +388,9 @@
template <class _A1>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_isinf(_A1 __x) _NOEXCEPT
+__libcpp_isinf(_A1 __lcpp_x) _NOEXCEPT
{
- return isinf(__x);
+ return isinf(__lcpp_x);
}
#undef isinf
@@ -398,9 +398,9 @@
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
-isinf(_A1 __x) _NOEXCEPT
+isinf(_A1 __lcpp_x) _NOEXCEPT
{
- return __libcpp_isinf((typename std::__promote<_A1>::type)__x);
+ return __libcpp_isinf((typename std::__promote<_A1>::type)__lcpp_x);
}
#endif // isinf
@@ -412,9 +412,9 @@
template <class _A1>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_isnan(_A1 __x) _NOEXCEPT
+__libcpp_isnan(_A1 __lcpp_x) _NOEXCEPT
{
- return isnan(__x);
+ return isnan(__lcpp_x);
}
#undef isnan
@@ -422,9 +422,9 @@
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
-isnan(_A1 __x) _NOEXCEPT
+isnan(_A1 __lcpp_x) _NOEXCEPT
{
- return __libcpp_isnan((typename std::__promote<_A1>::type)__x);
+ return __libcpp_isnan((typename std::__promote<_A1>::type)__lcpp_x);
}
#endif // isnan
@@ -436,9 +436,9 @@
template <class _A1>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_isnormal(_A1 __x) _NOEXCEPT
+__libcpp_isnormal(_A1 __lcpp_x) _NOEXCEPT
{
- return isnormal(__x);
+ return isnormal(__lcpp_x);
}
#undef isnormal
@@ -446,9 +446,9 @@
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
-isnormal(_A1 __x) _NOEXCEPT
+isnormal(_A1 __lcpp_x) _NOEXCEPT
{
- return __libcpp_isnormal((typename std::__promote<_A1>::type)__x);
+ return __libcpp_isnormal((typename std::__promote<_A1>::type)__lcpp_x);
}
#endif // isnormal
@@ -460,9 +460,9 @@
template <class _A1, class _A2>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_isgreater(_A1 __x, _A2 __y) _NOEXCEPT
+__libcpp_isgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
- return isgreater(__x, __y);
+ return isgreater(__lcpp_x, __lcpp_y);
}
#undef isgreater
@@ -475,10 +475,10 @@
std::is_arithmetic<_A2>::value,
bool
>::type
-isgreater(_A1 __x, _A2 __y) _NOEXCEPT
+isgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_isgreater((type)__x, (type)__y);
+ return __libcpp_isgreater((type)__lcpp_x, (type)__lcpp_y);
}
#endif // isgreater
@@ -490,9 +490,9 @@
template <class _A1, class _A2>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_isgreaterequal(_A1 __x, _A2 __y) _NOEXCEPT
+__libcpp_isgreaterequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
- return isgreaterequal(__x, __y);
+ return isgreaterequal(__lcpp_x, __lcpp_y);
}
#undef isgreaterequal
@@ -505,10 +505,10 @@
std::is_arithmetic<_A2>::value,
bool
>::type
-isgreaterequal(_A1 __x, _A2 __y) _NOEXCEPT
+isgreaterequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_isgreaterequal((type)__x, (type)__y);
+ return __libcpp_isgreaterequal((type)__lcpp_x, (type)__lcpp_y);
}
#endif // isgreaterequal
@@ -520,9 +520,9 @@
template <class _A1, class _A2>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_isless(_A1 __x, _A2 __y) _NOEXCEPT
+__libcpp_isless(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
- return isless(__x, __y);
+ return isless(__lcpp_x, __lcpp_y);
}
#undef isless
@@ -535,10 +535,10 @@
std::is_arithmetic<_A2>::value,
bool
>::type
-isless(_A1 __x, _A2 __y) _NOEXCEPT
+isless(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_isless((type)__x, (type)__y);
+ return __libcpp_isless((type)__lcpp_x, (type)__lcpp_y);
}
#endif // isless
@@ -550,9 +550,9 @@
template <class _A1, class _A2>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_islessequal(_A1 __x, _A2 __y) _NOEXCEPT
+__libcpp_islessequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
- return islessequal(__x, __y);
+ return islessequal(__lcpp_x, __lcpp_y);
}
#undef islessequal
@@ -565,10 +565,10 @@
std::is_arithmetic<_A2>::value,
bool
>::type
-islessequal(_A1 __x, _A2 __y) _NOEXCEPT
+islessequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_islessequal((type)__x, (type)__y);
+ return __libcpp_islessequal((type)__lcpp_x, (type)__lcpp_y);
}
#endif // islessequal
@@ -580,9 +580,9 @@
template <class _A1, class _A2>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_islessgreater(_A1 __x, _A2 __y) _NOEXCEPT
+__libcpp_islessgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
- return islessgreater(__x, __y);
+ return islessgreater(__lcpp_x, __lcpp_y);
}
#undef islessgreater
@@ -595,10 +595,10 @@
std::is_arithmetic<_A2>::value,
bool
>::type
-islessgreater(_A1 __x, _A2 __y) _NOEXCEPT
+islessgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_islessgreater((type)__x, (type)__y);
+ return __libcpp_islessgreater((type)__lcpp_x, (type)__lcpp_y);
}
#endif // islessgreater
@@ -610,9 +610,9 @@
template <class _A1, class _A2>
_LIBCPP_ALWAYS_INLINE
bool
-__libcpp_isunordered(_A1 __x, _A2 __y) _NOEXCEPT
+__libcpp_isunordered(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
- return isunordered(__x, __y);
+ return isunordered(__lcpp_x, __lcpp_y);
}
#undef isunordered
@@ -625,10 +625,10 @@
std::is_arithmetic<_A2>::value,
bool
>::type
-isunordered(_A1 __x, _A2 __y) _NOEXCEPT
+isunordered(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_isunordered((type)__x, (type)__y);
+ return __libcpp_isunordered((type)__lcpp_x, (type)__lcpp_y);
}
#endif // isunordered
@@ -657,15 +657,15 @@
#if !defined(_AIX)
inline _LIBCPP_INLINE_VISIBILITY
float
-abs(float __x) _NOEXCEPT {return fabsf(__x);}
+abs(float __lcpp_x) _NOEXCEPT {return fabsf(__lcpp_x);}
inline _LIBCPP_INLINE_VISIBILITY
double
-abs(double __x) _NOEXCEPT {return fabs(__x);}
+abs(double __lcpp_x) _NOEXCEPT {return fabs(__lcpp_x);}
inline _LIBCPP_INLINE_VISIBILITY
long double
-abs(long double __x) _NOEXCEPT {return fabsl(__x);}
+abs(long double __lcpp_x) _NOEXCEPT {return fabsl(__lcpp_x);}
#endif // !defined(_AIX)
#ifndef __sun__
@@ -676,14 +676,14 @@
using ::acosf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float acos(float __x) _NOEXCEPT {return acosf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double acos(long double __x) _NOEXCEPT {return acosl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float acos(float __lcpp_x) _NOEXCEPT {return acosf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double acos(long double __lcpp_x) _NOEXCEPT {return acosl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-acos(_A1 __x) _NOEXCEPT {return acos((double)__x);}
+acos(_A1 __lcpp_x) _NOEXCEPT {return acos((double)__lcpp_x);}
// asin
@@ -691,14 +691,14 @@
using ::asinf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float asin(float __x) _NOEXCEPT {return asinf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double asin(long double __x) _NOEXCEPT {return asinl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float asin(float __lcpp_x) _NOEXCEPT {return asinf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double asin(long double __lcpp_x) _NOEXCEPT {return asinl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-asin(_A1 __x) _NOEXCEPT {return asin((double)__x);}
+asin(_A1 __lcpp_x) _NOEXCEPT {return asin((double)__lcpp_x);}
// atan
@@ -706,14 +706,14 @@
using ::atanf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float atan(float __x) _NOEXCEPT {return atanf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double atan(long double __x) _NOEXCEPT {return atanl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float atan(float __lcpp_x) _NOEXCEPT {return atanf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double atan(long double __lcpp_x) _NOEXCEPT {return atanl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-atan(_A1 __x) _NOEXCEPT {return atan((double)__x);}
+atan(_A1 __lcpp_x) _NOEXCEPT {return atan((double)__lcpp_x);}
// atan2
@@ -721,24 +721,24 @@
using ::atan2f;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float atan2(float __y, float __x) _NOEXCEPT {return atan2f(__y, __x);}
-inline _LIBCPP_INLINE_VISIBILITY long double atan2(long double __y, long double __x) _NOEXCEPT {return atan2l(__y, __x);}
+inline _LIBCPP_INLINE_VISIBILITY float atan2(float __lcpp_y, float __lcpp_x) _NOEXCEPT {return atan2f(__lcpp_y, __lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double atan2(long double __lcpp_y, long double __lcpp_x) _NOEXCEPT {return atan2l(__lcpp_y, __lcpp_x);}
#endif
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-atan2(_A1 __y, _A2 __x) _NOEXCEPT
+atan2(_A1 __lcpp_y, _A2 __lcpp_x) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return atan2((__result_type)__y, (__result_type)__x);
+ return atan2((__result_type)__lcpp_y, (__result_type)__lcpp_x);
}
// ceil
@@ -747,14 +747,14 @@
using ::ceilf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float ceil(float __x) _NOEXCEPT {return ceilf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double ceil(long double __x) _NOEXCEPT {return ceill(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float ceil(float __lcpp_x) _NOEXCEPT {return ceilf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double ceil(long double __lcpp_x) _NOEXCEPT {return ceill(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-ceil(_A1 __x) _NOEXCEPT {return ceil((double)__x);}
+ceil(_A1 __lcpp_x) _NOEXCEPT {return ceil((double)__lcpp_x);}
// cos
@@ -762,14 +762,14 @@
using ::cosf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float cos(float __x) _NOEXCEPT {return cosf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double cos(long double __x) _NOEXCEPT {return cosl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float cos(float __lcpp_x) _NOEXCEPT {return cosf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double cos(long double __lcpp_x) _NOEXCEPT {return cosl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-cos(_A1 __x) _NOEXCEPT {return cos((double)__x);}
+cos(_A1 __lcpp_x) _NOEXCEPT {return cos((double)__lcpp_x);}
// cosh
@@ -777,14 +777,14 @@
using ::coshf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float cosh(float __x) _NOEXCEPT {return coshf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double cosh(long double __x) _NOEXCEPT {return coshl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float cosh(float __lcpp_x) _NOEXCEPT {return coshf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double cosh(long double __lcpp_x) _NOEXCEPT {return coshl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-cosh(_A1 __x) _NOEXCEPT {return cosh((double)__x);}
+cosh(_A1 __lcpp_x) _NOEXCEPT {return cosh((double)__lcpp_x);}
#endif // __sun__
// exp
@@ -795,15 +795,15 @@
#ifndef __sun__
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float exp(float __x) _NOEXCEPT {return expf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double exp(long double __x) _NOEXCEPT {return expl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float exp(float __lcpp_x) _NOEXCEPT {return expf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double exp(long double __lcpp_x) _NOEXCEPT {return expl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-exp(_A1 __x) _NOEXCEPT {return exp((double)__x);}
+exp(_A1 __lcpp_x) _NOEXCEPT {return exp((double)__lcpp_x);}
// fabs
@@ -811,14 +811,14 @@
using ::fabsf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float fabs(float __x) _NOEXCEPT {return fabsf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double fabs(long double __x) _NOEXCEPT {return fabsl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float fabs(float __lcpp_x) _NOEXCEPT {return fabsf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double fabs(long double __lcpp_x) _NOEXCEPT {return fabsl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-fabs(_A1 __x) _NOEXCEPT {return fabs((double)__x);}
+fabs(_A1 __lcpp_x) _NOEXCEPT {return fabs((double)__lcpp_x);}
// floor
@@ -826,14 +826,14 @@
using ::floorf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float floor(float __x) _NOEXCEPT {return floorf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double floor(long double __x) _NOEXCEPT {return floorl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float floor(float __lcpp_x) _NOEXCEPT {return floorf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double floor(long double __lcpp_x) _NOEXCEPT {return floorl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-floor(_A1 __x) _NOEXCEPT {return floor((double)__x);}
+floor(_A1 __lcpp_x) _NOEXCEPT {return floor((double)__lcpp_x);}
// fmod
@@ -843,24 +843,24 @@
#ifndef __sun__
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float fmod(float __x, float __y) _NOEXCEPT {return fmodf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double fmod(long double __x, long double __y) _NOEXCEPT {return fmodl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float fmod(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return fmodf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double fmod(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return fmodl(__lcpp_x, __lcpp_y);}
#endif
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-fmod(_A1 __x, _A2 __y) _NOEXCEPT
+fmod(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return fmod((__result_type)__x, (__result_type)__y);
+ return fmod((__result_type)__lcpp_x, (__result_type)__lcpp_y);
}
@@ -870,14 +870,14 @@
using ::frexpf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float frexp(float __x, int* __e) _NOEXCEPT {return frexpf(__x, __e);}
-inline _LIBCPP_INLINE_VISIBILITY long double frexp(long double __x, int* __e) _NOEXCEPT {return frexpl(__x, __e);}
+inline _LIBCPP_INLINE_VISIBILITY float frexp(float __lcpp_x, int* __lcpp_e) _NOEXCEPT {return frexpf(__lcpp_x, __lcpp_e);}
+inline _LIBCPP_INLINE_VISIBILITY long double frexp(long double __lcpp_x, int* __lcpp_e) _NOEXCEPT {return frexpl(__lcpp_x, __lcpp_e);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-frexp(_A1 __x, int* __e) _NOEXCEPT {return frexp((double)__x, __e);}
+frexp(_A1 __lcpp_x, int* __lcpp_e) _NOEXCEPT {return frexp((double)__lcpp_x, __lcpp_e);}
// ldexp
@@ -885,14 +885,14 @@
using ::ldexpf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float ldexp(float __x, int __e) _NOEXCEPT {return ldexpf(__x, __e);}
-inline _LIBCPP_INLINE_VISIBILITY long double ldexp(long double __x, int __e) _NOEXCEPT {return ldexpl(__x, __e);}
+inline _LIBCPP_INLINE_VISIBILITY float ldexp(float __lcpp_x, int __lcpp_e) _NOEXCEPT {return ldexpf(__lcpp_x, __lcpp_e);}
+inline _LIBCPP_INLINE_VISIBILITY long double ldexp(long double __lcpp_x, int __lcpp_e) _NOEXCEPT {return ldexpl(__lcpp_x, __lcpp_e);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-ldexp(_A1 __x, int __e) _NOEXCEPT {return ldexp((double)__x, __e);}
+ldexp(_A1 __lcpp_x, int __lcpp_e) _NOEXCEPT {return ldexp((double)__lcpp_x, __lcpp_e);}
// log
@@ -902,14 +902,14 @@
#ifndef __sun__
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float log(float __x) _NOEXCEPT {return logf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double log(long double __x) _NOEXCEPT {return logl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float log(float __lcpp_x) _NOEXCEPT {return logf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double log(long double __lcpp_x) _NOEXCEPT {return logl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-log(_A1 __x) _NOEXCEPT {return log((double)__x);}
+log(_A1 __lcpp_x) _NOEXCEPT {return log((double)__lcpp_x);}
// log10
@@ -918,14 +918,14 @@
using ::log10f;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float log10(float __x) _NOEXCEPT {return log10f(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double log10(long double __x) _NOEXCEPT {return log10l(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float log10(float __lcpp_x) _NOEXCEPT {return log10f(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double log10(long double __lcpp_x) _NOEXCEPT {return log10l(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-log10(_A1 __x) _NOEXCEPT {return log10((double)__x);}
+log10(_A1 __lcpp_x) _NOEXCEPT {return log10((double)__lcpp_x);}
// modf
@@ -933,8 +933,8 @@
using ::modff;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float modf(float __x, float* __y) _NOEXCEPT {return modff(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double modf(long double __x, long double* __y) _NOEXCEPT {return modfl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float modf(float __lcpp_x, float* __lcpp_y) _NOEXCEPT {return modff(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double modf(long double __lcpp_x, long double* __lcpp_y) _NOEXCEPT {return modfl(__lcpp_x, __lcpp_y);}
#endif
// pow
@@ -946,24 +946,24 @@
#ifndef __sun__
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float pow(float __x, float __y) _NOEXCEPT {return powf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double pow(long double __x, long double __y) _NOEXCEPT {return powl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float pow(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return powf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double pow(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return powl(__lcpp_x, __lcpp_y);}
#endif
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-pow(_A1 __x, _A2 __y) _NOEXCEPT
+pow(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return pow((__result_type)__x, (__result_type)__y);
+ return pow((__result_type)__lcpp_x, (__result_type)__lcpp_y);
}
// sin
@@ -972,14 +972,14 @@
using ::sinf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float sin(float __x) _NOEXCEPT {return sinf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double sin(long double __x) _NOEXCEPT {return sinl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float sin(float __lcpp_x) _NOEXCEPT {return sinf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double sin(long double __lcpp_x) _NOEXCEPT {return sinl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-sin(_A1 __x) _NOEXCEPT {return sin((double)__x);}
+sin(_A1 __lcpp_x) _NOEXCEPT {return sin((double)__lcpp_x);}
// sinh
@@ -987,14 +987,14 @@
using ::sinhf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float sinh(float __x) _NOEXCEPT {return sinhf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double sinh(long double __x) _NOEXCEPT {return sinhl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float sinh(float __lcpp_x) _NOEXCEPT {return sinhf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double sinh(long double __lcpp_x) _NOEXCEPT {return sinhl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-sinh(_A1 __x) _NOEXCEPT {return sinh((double)__x);}
+sinh(_A1 __lcpp_x) _NOEXCEPT {return sinh((double)__lcpp_x);}
// sqrt
@@ -1004,14 +1004,14 @@
#if !(defined(_LIBCPP_MSVCRT) || defined(__sun__) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float sqrt(float __x) _NOEXCEPT {return sqrtf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double sqrt(long double __x) _NOEXCEPT {return sqrtl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float sqrt(float __lcpp_x) _NOEXCEPT {return sqrtf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double sqrt(long double __lcpp_x) _NOEXCEPT {return sqrtl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-sqrt(_A1 __x) _NOEXCEPT {return sqrt((double)__x);}
+sqrt(_A1 __lcpp_x) _NOEXCEPT {return sqrt((double)__lcpp_x);}
// tan
@@ -1020,14 +1020,14 @@
#ifndef __sun__
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float tan(float __x) _NOEXCEPT {return tanf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double tan(long double __x) _NOEXCEPT {return tanl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float tan(float __lcpp_x) _NOEXCEPT {return tanf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double tan(long double __lcpp_x) _NOEXCEPT {return tanl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-tan(_A1 __x) _NOEXCEPT {return tan((double)__x);}
+tan(_A1 __lcpp_x) _NOEXCEPT {return tan((double)__lcpp_x);}
// tanh
@@ -1035,14 +1035,14 @@
using ::tanhf;
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
-inline _LIBCPP_INLINE_VISIBILITY float tanh(float __x) _NOEXCEPT {return tanhf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double tanh(long double __x) _NOEXCEPT {return tanhl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float tanh(float __lcpp_x) _NOEXCEPT {return tanhf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double tanh(long double __lcpp_x) _NOEXCEPT {return tanhl(__lcpp_x);}
#endif
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-tanh(_A1 __x) _NOEXCEPT {return tanh((double)__x);}
+tanh(_A1 __lcpp_x) _NOEXCEPT {return tanh((double)__lcpp_x);}
// acosh
@@ -1050,13 +1050,13 @@
using ::acosh;
using ::acoshf;
-inline _LIBCPP_INLINE_VISIBILITY float acosh(float __x) _NOEXCEPT {return acoshf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double acosh(long double __x) _NOEXCEPT {return acoshl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float acosh(float __lcpp_x) _NOEXCEPT {return acoshf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double acosh(long double __lcpp_x) _NOEXCEPT {return acoshl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-acosh(_A1 __x) _NOEXCEPT {return acosh((double)__x);}
+acosh(_A1 __lcpp_x) _NOEXCEPT {return acosh((double)__lcpp_x);}
#endif
// asinh
@@ -1065,13 +1065,13 @@
using ::asinh;
using ::asinhf;
-inline _LIBCPP_INLINE_VISIBILITY float asinh(float __x) _NOEXCEPT {return asinhf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double asinh(long double __x) _NOEXCEPT {return asinhl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float asinh(float __lcpp_x) _NOEXCEPT {return asinhf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double asinh(long double __lcpp_x) _NOEXCEPT {return asinhl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-asinh(_A1 __x) _NOEXCEPT {return asinh((double)__x);}
+asinh(_A1 __lcpp_x) _NOEXCEPT {return asinh((double)__lcpp_x);}
#endif
// atanh
@@ -1080,13 +1080,13 @@
using ::atanh;
using ::atanhf;
-inline _LIBCPP_INLINE_VISIBILITY float atanh(float __x) _NOEXCEPT {return atanhf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double atanh(long double __x) _NOEXCEPT {return atanhl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float atanh(float __lcpp_x) _NOEXCEPT {return atanhf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double atanh(long double __lcpp_x) _NOEXCEPT {return atanhl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-atanh(_A1 __x) _NOEXCEPT {return atanh((double)__x);}
+atanh(_A1 __lcpp_x) _NOEXCEPT {return atanh((double)__lcpp_x);}
#endif
// cbrt
@@ -1095,13 +1095,13 @@
using ::cbrt;
using ::cbrtf;
-inline _LIBCPP_INLINE_VISIBILITY float cbrt(float __x) _NOEXCEPT {return cbrtf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double cbrt(long double __x) _NOEXCEPT {return cbrtl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float cbrt(float __lcpp_x) _NOEXCEPT {return cbrtf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double cbrt(long double __lcpp_x) _NOEXCEPT {return cbrtl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-cbrt(_A1 __x) _NOEXCEPT {return cbrt((double)__x);}
+cbrt(_A1 __lcpp_x) _NOEXCEPT {return cbrt((double)__lcpp_x);}
#endif
// copysign
@@ -1109,23 +1109,23 @@
using ::copysign;
using ::copysignf;
-inline _LIBCPP_INLINE_VISIBILITY float copysign(float __x, float __y) _NOEXCEPT {return copysignf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double copysign(long double __x, long double __y) _NOEXCEPT {return copysignl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float copysign(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return copysignf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double copysign(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return copysignl(__lcpp_x, __lcpp_y);}
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-copysign(_A1 __x, _A2 __y) _NOEXCEPT
+copysign(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return copysign((__result_type)__x, (__result_type)__y);
+ return copysign((__result_type)__lcpp_x, (__result_type)__lcpp_y);
}
#ifndef _LIBCPP_MSVCRT
@@ -1135,75 +1135,75 @@
using ::erf;
using ::erff;
-inline _LIBCPP_INLINE_VISIBILITY float erf(float __x) _NOEXCEPT {return erff(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double erf(long double __x) _NOEXCEPT {return erfl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float erf(float __lcpp_x) _NOEXCEPT {return erff(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double erf(long double __lcpp_x) _NOEXCEPT {return erfl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-erf(_A1 __x) _NOEXCEPT {return erf((double)__x);}
+erf(_A1 __lcpp_x) _NOEXCEPT {return erf((double)__lcpp_x);}
// erfc
using ::erfc;
using ::erfcf;
-inline _LIBCPP_INLINE_VISIBILITY float erfc(float __x) _NOEXCEPT {return erfcf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double erfc(long double __x) _NOEXCEPT {return erfcl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float erfc(float __lcpp_x) _NOEXCEPT {return erfcf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double erfc(long double __lcpp_x) _NOEXCEPT {return erfcl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-erfc(_A1 __x) _NOEXCEPT {return erfc((double)__x);}
+erfc(_A1 __lcpp_x) _NOEXCEPT {return erfc((double)__lcpp_x);}
// exp2
using ::exp2;
using ::exp2f;
-inline _LIBCPP_INLINE_VISIBILITY float exp2(float __x) _NOEXCEPT {return exp2f(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double exp2(long double __x) _NOEXCEPT {return exp2l(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float exp2(float __lcpp_x) _NOEXCEPT {return exp2f(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double exp2(long double __lcpp_x) _NOEXCEPT {return exp2l(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-exp2(_A1 __x) _NOEXCEPT {return exp2((double)__x);}
+exp2(_A1 __lcpp_x) _NOEXCEPT {return exp2((double)__lcpp_x);}
// expm1
using ::expm1;
using ::expm1f;
-inline _LIBCPP_INLINE_VISIBILITY float expm1(float __x) _NOEXCEPT {return expm1f(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double expm1(long double __x) _NOEXCEPT {return expm1l(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float expm1(float __lcpp_x) _NOEXCEPT {return expm1f(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double expm1(long double __lcpp_x) _NOEXCEPT {return expm1l(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-expm1(_A1 __x) _NOEXCEPT {return expm1((double)__x);}
+expm1(_A1 __lcpp_x) _NOEXCEPT {return expm1((double)__lcpp_x);}
// fdim
using ::fdim;
using ::fdimf;
-inline _LIBCPP_INLINE_VISIBILITY float fdim(float __x, float __y) _NOEXCEPT {return fdimf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double fdim(long double __x, long double __y) _NOEXCEPT {return fdiml(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float fdim(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return fdimf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double fdim(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return fdiml(__lcpp_x, __lcpp_y);}
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-fdim(_A1 __x, _A2 __y) _NOEXCEPT
+fdim(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return fdim((__result_type)__x, (__result_type)__y);
+ return fdim((__result_type)__lcpp_x, (__result_type)__lcpp_y);
}
// fma
@@ -1211,25 +1211,25 @@
using ::fmaf;
using ::fma;
-inline _LIBCPP_INLINE_VISIBILITY float fma(float __x, float __y, float __z) _NOEXCEPT {return fmaf(__x, __y, __z);}
-inline _LIBCPP_INLINE_VISIBILITY long double fma(long double __x, long double __y, long double __z) _NOEXCEPT {return fmal(__x, __y, __z);}
+inline _LIBCPP_INLINE_VISIBILITY float fma(float __lcpp_x, float __lcpp_y, float __lcpp_z) _NOEXCEPT {return fmaf(__lcpp_x, __lcpp_y, __lcpp_z);}
+inline _LIBCPP_INLINE_VISIBILITY long double fma(long double __lcpp_x, long double __lcpp_y, long double __lcpp_z) _NOEXCEPT {return fmal(__lcpp_x, __lcpp_y, __lcpp_z);}
template <class _A1, class _A2, class _A3>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value &&
is_arithmetic<_A3>::value,
- typename __promote<_A1, _A2, _A3>::type
+ __promote<_A1, _A2, _A3>
>::type
-fma(_A1 __x, _A2 __y, _A3 __z) _NOEXCEPT
+fma(_A1 __lcpp_x, _A2 __lcpp_y, _A3 __lcpp_z) _NOEXCEPT
{
typedef typename __promote<_A1, _A2, _A3>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value &&
is_same<_A3, __result_type>::value)), "");
- return fma((__result_type)__x, (__result_type)__y, (__result_type)__z);
+ return fma((__result_type)__lcpp_x, (__result_type)__lcpp_y, (__result_type)__lcpp_z);
}
// fmax
@@ -1237,23 +1237,23 @@
using ::fmax;
using ::fmaxf;
-inline _LIBCPP_INLINE_VISIBILITY float fmax(float __x, float __y) _NOEXCEPT {return fmaxf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double fmax(long double __x, long double __y) _NOEXCEPT {return fmaxl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float fmax(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return fmaxf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double fmax(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return fmaxl(__lcpp_x, __lcpp_y);}
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-fmax(_A1 __x, _A2 __y) _NOEXCEPT
+fmax(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return fmax((__result_type)__x, (__result_type)__y);
+ return fmax((__result_type)__lcpp_x, (__result_type)__lcpp_y);
}
// fmin
@@ -1261,23 +1261,23 @@
using ::fmin;
using ::fminf;
-inline _LIBCPP_INLINE_VISIBILITY float fmin(float __x, float __y) _NOEXCEPT {return fminf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double fmin(long double __x, long double __y) _NOEXCEPT {return fminl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float fmin(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return fminf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double fmin(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return fminl(__lcpp_x, __lcpp_y);}
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-fmin(_A1 __x, _A2 __y) _NOEXCEPT
+fmin(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return fmin((__result_type)__x, (__result_type)__y);
+ return fmin((__result_type)__lcpp_x, (__result_type)__lcpp_y);
}
// hypot
@@ -1285,23 +1285,23 @@
using ::hypot;
using ::hypotf;
-inline _LIBCPP_INLINE_VISIBILITY float hypot(float __x, float __y) _NOEXCEPT {return hypotf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double hypot(long double __x, long double __y) _NOEXCEPT {return hypotl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float hypot(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return hypotf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double hypot(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return hypotl(__lcpp_x, __lcpp_y);}
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-hypot(_A1 __x, _A2 __y) _NOEXCEPT
+hypot(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return hypot((__result_type)__x, (__result_type)__y);
+ return hypot((__result_type)__lcpp_x, (__result_type)__lcpp_y);
}
// ilogb
@@ -1309,27 +1309,27 @@
using ::ilogb;
using ::ilogbf;
-inline _LIBCPP_INLINE_VISIBILITY int ilogb(float __x) _NOEXCEPT {return ilogbf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY int ilogb(long double __x) _NOEXCEPT {return ilogbl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY int ilogb(float __lcpp_x) _NOEXCEPT {return ilogbf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY int ilogb(long double __lcpp_x) _NOEXCEPT {return ilogbl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, int>::type
-ilogb(_A1 __x) _NOEXCEPT {return ilogb((double)__x);}
+ilogb(_A1 __lcpp_x) _NOEXCEPT {return ilogb((double)__lcpp_x);}
// lgamma
using ::lgamma;
using ::lgammaf;
-inline _LIBCPP_INLINE_VISIBILITY float lgamma(float __x) _NOEXCEPT {return lgammaf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double lgamma(long double __x) _NOEXCEPT {return lgammal(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float lgamma(float __lcpp_x) _NOEXCEPT {return lgammaf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double lgamma(long double __lcpp_x) _NOEXCEPT {return lgammal(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-lgamma(_A1 __x) _NOEXCEPT {return lgamma((double)__x);}
+lgamma(_A1 __lcpp_x) _NOEXCEPT {return lgamma((double)__lcpp_x);}
// llrint
@@ -1337,99 +1337,99 @@
using ::llrint;
using ::llrintf;
-inline _LIBCPP_INLINE_VISIBILITY long long llrint(float __x) _NOEXCEPT {return llrintf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long long llrint(long double __x) _NOEXCEPT {return llrintl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY long long llrint(float __lcpp_x) _NOEXCEPT {return llrintf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long long llrint(long double __lcpp_x) _NOEXCEPT {return llrintl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, long long>::type
-llrint(_A1 __x) _NOEXCEPT {return llrint((double)__x);}
+llrint(_A1 __lcpp_x) _NOEXCEPT {return llrint((double)__lcpp_x);}
// llround
using ::llround;
using ::llroundf;
-inline _LIBCPP_INLINE_VISIBILITY long long llround(float __x) _NOEXCEPT {return llroundf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long long llround(long double __x) _NOEXCEPT {return llroundl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY long long llround(float __lcpp_x) _NOEXCEPT {return llroundf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long long llround(long double __lcpp_x) _NOEXCEPT {return llroundl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, long long>::type
-llround(_A1 __x) _NOEXCEPT {return llround((double)__x);}
+llround(_A1 __lcpp_x) _NOEXCEPT {return llround((double)__lcpp_x);}
// log1p
using ::log1p;
using ::log1pf;
-inline _LIBCPP_INLINE_VISIBILITY float log1p(float __x) _NOEXCEPT {return log1pf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double log1p(long double __x) _NOEXCEPT {return log1pl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float log1p(float __lcpp_x) _NOEXCEPT {return log1pf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double log1p(long double __lcpp_x) _NOEXCEPT {return log1pl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-log1p(_A1 __x) _NOEXCEPT {return log1p((double)__x);}
+log1p(_A1 __lcpp_x) _NOEXCEPT {return log1p((double)__lcpp_x);}
// log2
using ::log2;
using ::log2f;
-inline _LIBCPP_INLINE_VISIBILITY float log2(float __x) _NOEXCEPT {return log2f(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float log2(float __lcpp_x) _NOEXCEPT {return log2f(__lcpp_x);}
#if defined(_NEWLIB_VERSION) // @LOCALMOD-START Missing from newlib. Note that PNaCl represents ``long double`` as ``double``, hence the intrinsic's type.
-inline _LIBCPP_INLINE_VISIBILITY long double log2(long double __x) _NOEXCEPT {return __builtin_log2(__x);}
+inline _LIBCPP_INLINE_VISIBILITY long double log2(long double __lcpp_x) _NOEXCEPT {return __builtin_log2(__lcpp_x);}
#else
-inline _LIBCPP_INLINE_VISIBILITY long double log2(long double __x) _NOEXCEPT {return log2l(__x);}
+inline _LIBCPP_INLINE_VISIBILITY long double log2(long double __lcpp_x) _NOEXCEPT {return log2l(__lcpp_x);}
#endif // @LOCALMOD-END
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-log2(_A1 __x) _NOEXCEPT {return log2((double)__x);}
+log2(_A1 __lcpp_x) _NOEXCEPT {return log2((double)__lcpp_x);}
// logb
using ::logb;
using ::logbf;
-inline _LIBCPP_INLINE_VISIBILITY float logb(float __x) _NOEXCEPT {return logbf(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float logb(float __lcpp_x) _NOEXCEPT {return logbf(__lcpp_x);}
#if defined(_NEWLIB_VERSION) // @LOCALMOD-START Missing from newlib. Note that PNaCl represents ``long double`` as ``double``, hence the intrinsic's type.
-inline _LIBCPP_INLINE_VISIBILITY long double logb(long double __x) _NOEXCEPT {return __builtin_logb(__x);}
+inline _LIBCPP_INLINE_VISIBILITY long double logb(long double __lcpp_x) _NOEXCEPT {return __builtin_logb(__lcpp_x);}
#else
-inline _LIBCPP_INLINE_VISIBILITY long double logb(long double __x) _NOEXCEPT {return logbl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY long double logb(long double __lcpp_x) _NOEXCEPT {return logbl(__lcpp_x);}
#endif // @LOCALMOD-END
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-logb(_A1 __x) _NOEXCEPT {return logb((double)__x);}
+logb(_A1 __lcpp_x) _NOEXCEPT {return logb((double)__lcpp_x);}
// lrint
using ::lrint;
using ::lrintf;
-inline _LIBCPP_INLINE_VISIBILITY long lrint(float __x) _NOEXCEPT {return lrintf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long lrint(long double __x) _NOEXCEPT {return lrintl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY long lrint(float __lcpp_x) _NOEXCEPT {return lrintf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long lrint(long double __lcpp_x) _NOEXCEPT {return lrintl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, long>::type
-lrint(_A1 __x) _NOEXCEPT {return lrint((double)__x);}
+lrint(_A1 __lcpp_x) _NOEXCEPT {return lrint((double)__lcpp_x);}
// lround
using ::lround;
using ::lroundf;
-inline _LIBCPP_INLINE_VISIBILITY long lround(float __x) _NOEXCEPT {return lroundf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long lround(long double __x) _NOEXCEPT {return lroundl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY long lround(float __lcpp_x) _NOEXCEPT {return lroundf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long lround(long double __lcpp_x) _NOEXCEPT {return lroundl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, long>::type
-lround(_A1 __x) _NOEXCEPT {return lround((double)__x);}
+lround(_A1 __lcpp_x) _NOEXCEPT {return lround((double)__lcpp_x);}
#endif // _LIBCPP_MSVCRT
#endif // __sun__
@@ -1449,82 +1449,82 @@
using ::nearbyint;
using ::nearbyintf;
-inline _LIBCPP_INLINE_VISIBILITY float nearbyint(float __x) _NOEXCEPT {return nearbyintf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double nearbyint(long double __x) _NOEXCEPT {return nearbyintl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float nearbyint(float __lcpp_x) _NOEXCEPT {return nearbyintf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double nearbyint(long double __lcpp_x) _NOEXCEPT {return nearbyintl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-nearbyint(_A1 __x) _NOEXCEPT {return nearbyint((double)__x);}
+nearbyint(_A1 __lcpp_x) _NOEXCEPT {return nearbyint((double)__lcpp_x);}
// nextafter
using ::nextafter;
using ::nextafterf;
-inline _LIBCPP_INLINE_VISIBILITY float nextafter(float __x, float __y) _NOEXCEPT {return nextafterf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double nextafter(long double __x, long double __y) _NOEXCEPT {return nextafterl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float nextafter(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return nextafterf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double nextafter(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return nextafterl(__lcpp_x, __lcpp_y);}
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-nextafter(_A1 __x, _A2 __y) _NOEXCEPT
+nextafter(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return nextafter((__result_type)__x, (__result_type)__y);
+ return nextafter((__result_type)__lcpp_x, (__result_type)__lcpp_y);
}
// nexttoward
#if defined(_NEWLIB_VERSION) // @LOCALMOD-START Missing from newlib. Note that PNaCl represents ``long double`` as ``double``, hence the intrinsic's type.
-inline _LIBCPP_INLINE_VISIBILITY float nexttoward(float __x, long double __y) _NOEXCEPT {return __builtin_nexttoward(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double nexttoward(long double __x, long double __y) _NOEXCEPT {return __builtin_nexttoward(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float nexttoward(float __lcpp_x, long double __lcpp_y) _NOEXCEPT {return __builtin_nexttoward(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double nexttoward(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return __builtin_nexttoward(__lcpp_x, __lcpp_y);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-nexttoward(_A1 __x, long double __y) _NOEXCEPT {return __builtin_nexttoward((double)__x, __y);}
+nexttoward(_A1 __lcpp_x, long double __lcpp_y) _NOEXCEPT {return __builtin_nexttoward((double)__lcpp_x, __lcpp_y);}
#else
using ::nexttoward;
using ::nexttowardf;
-inline _LIBCPP_INLINE_VISIBILITY float nexttoward(float __x, long double __y) _NOEXCEPT {return nexttowardf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double nexttoward(long double __x, long double __y) _NOEXCEPT {return nexttowardl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float nexttoward(float __lcpp_x, long double __lcpp_y) _NOEXCEPT {return nexttowardf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double nexttoward(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return nexttowardl(__lcpp_x, __lcpp_y);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-nexttoward(_A1 __x, long double __y) _NOEXCEPT {return nexttoward((double)__x, __y);}
+nexttoward(_A1 __lcpp_x, long double __lcpp_y) _NOEXCEPT {return nexttoward((double)__lcpp_x, __lcpp_y);}
#endif // @LOCALMOD-END
// remainder
using ::remainder;
using ::remainderf;
-inline _LIBCPP_INLINE_VISIBILITY float remainder(float __x, float __y) _NOEXCEPT {return remainderf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double remainder(long double __x, long double __y) _NOEXCEPT {return remainderl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float remainder(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return remainderf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double remainder(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return remainderl(__lcpp_x, __lcpp_y);}
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-remainder(_A1 __x, _A2 __y) _NOEXCEPT
+remainder(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return remainder((__result_type)__x, (__result_type)__y);
+ return remainder((__result_type)__lcpp_x, (__result_type)__lcpp_y);
}
// remquo
@@ -1532,23 +1532,23 @@
using ::remquo;
using ::remquof;
-inline _LIBCPP_INLINE_VISIBILITY float remquo(float __x, float __y, int* __z) _NOEXCEPT {return remquof(__x, __y, __z);}
-inline _LIBCPP_INLINE_VISIBILITY long double remquo(long double __x, long double __y, int* __z) _NOEXCEPT {return remquol(__x, __y, __z);}
+inline _LIBCPP_INLINE_VISIBILITY float remquo(float __lcpp_x, float __lcpp_y, int* __lcpp_z) _NOEXCEPT {return remquof(__lcpp_x, __lcpp_y, __lcpp_z);}
+inline _LIBCPP_INLINE_VISIBILITY long double remquo(long double __lcpp_x, long double __lcpp_y, int* __lcpp_z) _NOEXCEPT {return remquol(__lcpp_x, __lcpp_y, __lcpp_z);}
template <class _A1, class _A2>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
+typename __lazy_enable_if
<
is_arithmetic<_A1>::value &&
is_arithmetic<_A2>::value,
- typename __promote<_A1, _A2>::type
+ __promote<_A1, _A2>
>::type
-remquo(_A1 __x, _A2 __y, int* __z) _NOEXCEPT
+remquo(_A1 __lcpp_x, _A2 __lcpp_y, int* __lcpp_z) _NOEXCEPT
{
typedef typename __promote<_A1, _A2>::type __result_type;
static_assert((!(is_same<_A1, __result_type>::value &&
is_same<_A2, __result_type>::value)), "");
- return remquo((__result_type)__x, (__result_type)__y, __z);
+ return remquo((__result_type)__lcpp_x, (__result_type)__lcpp_y, __lcpp_z);
}
// rint
@@ -1556,78 +1556,78 @@
using ::rint;
using ::rintf;
-inline _LIBCPP_INLINE_VISIBILITY float rint(float __x) _NOEXCEPT {return rintf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double rint(long double __x) _NOEXCEPT {return rintl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float rint(float __lcpp_x) _NOEXCEPT {return rintf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double rint(long double __lcpp_x) _NOEXCEPT {return rintl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-rint(_A1 __x) _NOEXCEPT {return rint((double)__x);}
+rint(_A1 __lcpp_x) _NOEXCEPT {return rint((double)__lcpp_x);}
// round
using ::round;
using ::roundf;
-inline _LIBCPP_INLINE_VISIBILITY float round(float __x) _NOEXCEPT {return roundf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double round(long double __x) _NOEXCEPT {return roundl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float round(float __lcpp_x) _NOEXCEPT {return roundf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double round(long double __lcpp_x) _NOEXCEPT {return roundl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-round(_A1 __x) _NOEXCEPT {return round((double)__x);}
+round(_A1 __lcpp_x) _NOEXCEPT {return round((double)__lcpp_x);}
// scalbln
using ::scalbln;
using ::scalblnf;
-inline _LIBCPP_INLINE_VISIBILITY float scalbln(float __x, long __y) _NOEXCEPT {return scalblnf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double scalbln(long double __x, long __y) _NOEXCEPT {return scalblnl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float scalbln(float __lcpp_x, long __lcpp_y) _NOEXCEPT {return scalblnf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double scalbln(long double __lcpp_x, long __lcpp_y) _NOEXCEPT {return scalblnl(__lcpp_x, __lcpp_y);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-scalbln(_A1 __x, long __y) _NOEXCEPT {return scalbln((double)__x, __y);}
+scalbln(_A1 __lcpp_x, long __lcpp_y) _NOEXCEPT {return scalbln((double)__lcpp_x, __lcpp_y);}
// scalbn
using ::scalbn;
using ::scalbnf;
-inline _LIBCPP_INLINE_VISIBILITY float scalbn(float __x, int __y) _NOEXCEPT {return scalbnf(__x, __y);}
-inline _LIBCPP_INLINE_VISIBILITY long double scalbn(long double __x, int __y) _NOEXCEPT {return scalbnl(__x, __y);}
+inline _LIBCPP_INLINE_VISIBILITY float scalbn(float __lcpp_x, int __lcpp_y) _NOEXCEPT {return scalbnf(__lcpp_x, __lcpp_y);}
+inline _LIBCPP_INLINE_VISIBILITY long double scalbn(long double __lcpp_x, int __lcpp_y) _NOEXCEPT {return scalbnl(__lcpp_x, __lcpp_y);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-scalbn(_A1 __x, int __y) _NOEXCEPT {return scalbn((double)__x, __y);}
+scalbn(_A1 __lcpp_x, int __lcpp_y) _NOEXCEPT {return scalbn((double)__lcpp_x, __lcpp_y);}
// tgamma
using ::tgamma;
using ::tgammaf;
-inline _LIBCPP_INLINE_VISIBILITY float tgamma(float __x) _NOEXCEPT {return tgammaf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double tgamma(long double __x) _NOEXCEPT {return tgammal(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float tgamma(float __lcpp_x) _NOEXCEPT {return tgammaf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double tgamma(long double __lcpp_x) _NOEXCEPT {return tgammal(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-tgamma(_A1 __x) _NOEXCEPT {return tgamma((double)__x);}
+tgamma(_A1 __lcpp_x) _NOEXCEPT {return tgamma((double)__lcpp_x);}
// trunc
using ::trunc;
using ::truncf;
-inline _LIBCPP_INLINE_VISIBILITY float trunc(float __x) _NOEXCEPT {return truncf(__x);}
-inline _LIBCPP_INLINE_VISIBILITY long double trunc(long double __x) _NOEXCEPT {return truncl(__x);}
+inline _LIBCPP_INLINE_VISIBILITY float trunc(float __lcpp_x) _NOEXCEPT {return truncf(__lcpp_x);}
+inline _LIBCPP_INLINE_VISIBILITY long double trunc(long double __lcpp_x) _NOEXCEPT {return truncl(__lcpp_x);}
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if<is_integral<_A1>::value, double>::type
-trunc(_A1 __x) _NOEXCEPT {return trunc((double)__x);}
+trunc(_A1 __lcpp_x) _NOEXCEPT {return trunc((double)__lcpp_x);}
#endif // !_LIBCPP_MSVCRT
diff --git a/include/condition_variable b/include/condition_variable
index dc67266..1af2484 100644
--- a/include/condition_variable
+++ b/include/condition_variable
@@ -115,6 +115,8 @@
#pragma GCC system_header
#endif
+#ifndef _LIBCPP_HAS_NO_THREADS
+
_LIBCPP_BEGIN_NAMESPACE_STD
class _LIBCPP_TYPE_VIS condition_variable_any
@@ -253,4 +255,6 @@
_LIBCPP_END_NAMESPACE_STD
+#endif // !_LIBCPP_HAS_NO_THREADS
+
#endif // _LIBCPP_CONDITION_VARIABLE
diff --git a/include/deque b/include/deque
index 9b256b7..5602d4a 100644
--- a/include/deque
+++ b/include/deque
@@ -1588,7 +1588,7 @@
{
iterator __i = __base::begin();
iterator __e = __base::end();
- for (; __f != __l && __i != __e; ++__f, ++__i)
+ for (; __f != __l && __i != __e; ++__f, (void) ++__i)
*__i = *__f;
if (__f != __l)
__append(__f, __l);
@@ -2160,7 +2160,7 @@
if (__n > __de)
{
__m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de);
- for (_BiIter __j = __m; __j != __l; ++__i, ++__j, ++__base::size())
+ for (_BiIter __j = __m; __j != __l; ++__i, (void) ++__j, ++__base::size())
__alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j);
__n = __de;
}
@@ -2200,7 +2200,7 @@
if (__n > __back_capacity)
__add_back_capacity(__n - __back_capacity);
// __n <= __back_capacity
- for (iterator __i = __base::end(); __f != __l; ++__i, ++__f, ++__base::size())
+ for (iterator __i = __base::end(); __f != __l; ++__i, (void) ++__f, ++__base::size())
__alloc_traits::construct(__a, _VSTD::addressof(*__i), *__f);
}
diff --git a/include/experimental/optional b/include/experimental/optional
index 41d86b4..2f0df35 100644
--- a/include/experimental/optional
+++ b/include/experimental/optional
@@ -692,4 +692,4 @@
#endif // _LIBCPP_STD_VER > 11
-#endif // _LIBCPP_ARRAY
+#endif // _LIBCPP_OPTIONAL
diff --git a/include/experimental/string_view b/include/experimental/string_view
index b0382e5..d423f39 100644
--- a/include/experimental/string_view
+++ b/include/experimental/string_view
@@ -313,8 +313,7 @@
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
void remove_prefix(size_type __n) _NOEXCEPT
{
- if (__n > __size)
- __n = __size;
+ _LIBCPP_ASSERT(n <= size(), "remove_prefix() can't remove more than size()");
__data += __n;
__size -= __n;
}
@@ -322,8 +321,7 @@
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
void remove_suffix(size_type __n) _NOEXCEPT
{
- if (__n > __size)
- __n = __size;
+ _LIBCPP_ASSERT(n <= size(), "remove_suffix() can't remove more than size()");
__size -= __n;
}
@@ -349,7 +347,8 @@
template<class _Allocator = allocator<_CharT> >
_LIBCPP_INLINE_VISIBILITY
- basic_string<_CharT, _Traits, _Allocator> to_string( const _Allocator& __a = _Allocator())
+ basic_string<_CharT, _Traits, _Allocator>
+ to_string( const _Allocator& __a = _Allocator()) const
{ return basic_string<_CharT, _Traits, _Allocator> ( begin(), end(), __a ); }
size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const
diff --git a/include/forward_list b/include/forward_list
index a83b195..651452f 100644
--- a/include/forward_list
+++ b/include/forward_list
@@ -991,7 +991,7 @@
iterator __i = before_begin();
iterator __j = _VSTD::next(__i);
iterator __e = end();
- for (; __j != __e && __f != __l; ++__i, ++__j, ++__f)
+ for (; __j != __e && __f != __l; ++__i, (void) ++__j, ++__f)
*__j = *__f;
if (__j == __e)
insert_after(__i, __f, __l);
@@ -1201,7 +1201,7 @@
try
{
#endif // _LIBCPP_NO_EXCEPTIONS
- for (++__f; __f != __l; ++__f, __last = __last->__next_)
+ for (++__f; __f != __l; ++__f, ((void)(__last = __last->__next_)))
{
__h.reset(__node_traits::allocate(__a, 1));
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f);
@@ -1430,7 +1430,7 @@
iterator __j = _VSTD::next(__i, 2);
for (; __j != __e && *__j == __v; ++__j)
;
- __deleted_nodes.splice_after(__deleted_nodes.before_begin(), *this, __i, __j);
+ __deleted_nodes.splice_after(__deleted_nodes.before_begin(), *this, __i, __j);
if (__j == __e)
break;
__i = __j;
diff --git a/include/future b/include/future
index de00f25..6fe6f8d 100644
--- a/include/future
+++ b/include/future
@@ -374,6 +374,10 @@
#pragma GCC system_header
#endif
+#ifdef _LIBCPP_HAS_NO_THREADS
+#error <future> is not supported on this single threaded system
+#else // !_LIBCPP_HAS_NO_THREADS
+
_LIBCPP_BEGIN_NAMESPACE_STD
//enum class future_errc
@@ -779,9 +783,12 @@
{
if (this->__state_ & base::__constructed)
reinterpret_cast<_Rp*>(_VSTD::addressof(this->__value_))->~_Rp();
- typename _Alloc::template rebind<__assoc_state_alloc>::other __a(__alloc_);
+ typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _A;
+ typedef allocator_traits<_A> _ATraits;
+ typedef pointer_traits<typename _ATraits::pointer> _PTraits;
+ _A __a(__alloc_);
this->~__assoc_state_alloc();
- __a.deallocate(this, 1);
+ __a.deallocate(_PTraits::pointer_to(*this), 1);
}
template <class _Rp, class _Alloc>
@@ -802,9 +809,12 @@
void
__assoc_state_alloc<_Rp&, _Alloc>::__on_zero_shared() _NOEXCEPT
{
- typename _Alloc::template rebind<__assoc_state_alloc>::other __a(__alloc_);
+ typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _A;
+ typedef allocator_traits<_A> _ATraits;
+ typedef pointer_traits<typename _ATraits::pointer> _PTraits;
+ _A __a(__alloc_);
this->~__assoc_state_alloc();
- __a.deallocate(this, 1);
+ __a.deallocate(_PTraits::pointer_to(*this), 1);
}
template <class _Alloc>
@@ -825,9 +835,12 @@
void
__assoc_sub_state_alloc<_Alloc>::__on_zero_shared() _NOEXCEPT
{
- typename _Alloc::template rebind<__assoc_sub_state_alloc>::other __a(__alloc_);
+ typedef typename __allocator_traits_rebind<_Alloc, __assoc_sub_state_alloc>::type _A;
+ typedef allocator_traits<_A> _ATraits;
+ typedef pointer_traits<typename _ATraits::pointer> _PTraits;
+ _A __a(__alloc_);
this->~__assoc_sub_state_alloc();
- __a.deallocate(this, 1);
+ __a.deallocate(_PTraits::pointer_to(*this), 1);
}
template <class _Rp, class _Fp>
@@ -1410,12 +1423,13 @@
template <class _Alloc>
promise<_Rp>::promise(allocator_arg_t, const _Alloc& __a0)
{
- typedef typename _Alloc::template rebind<__assoc_state_alloc<_Rp, _Alloc> >::other _A2;
+ typedef __assoc_state_alloc<_Rp, _Alloc> _State;
+ typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
typedef __allocator_destructor<_A2> _D2;
_A2 __a(__a0);
- unique_ptr<__assoc_state_alloc<_Rp, _Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1));
- ::new(__hold.get()) __assoc_state_alloc<_Rp, _Alloc>(__a0);
- __state_ = __hold.release();
+ unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
+ ::new(static_cast<void*>(_VSTD::addressof(*__hold.get()))) _State(__a0);
+ __state_ = _VSTD::addressof(*__hold.release());
}
template <class _Rp>
@@ -1583,12 +1597,13 @@
template <class _Alloc>
promise<_Rp&>::promise(allocator_arg_t, const _Alloc& __a0)
{
- typedef typename _Alloc::template rebind<__assoc_state_alloc<_Rp&, _Alloc> >::other _A2;
+ typedef __assoc_state_alloc<_Rp&, _Alloc> _State;
+ typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
typedef __allocator_destructor<_A2> _D2;
_A2 __a(__a0);
- unique_ptr<__assoc_state_alloc<_Rp&, _Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1));
- ::new(__hold.get()) __assoc_state_alloc<_Rp&, _Alloc>(__a0);
- __state_ = __hold.release();
+ unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
+ ::new(static_cast<void*>(_VSTD::addressof(*__hold.get()))) _State(__a0);
+ __state_ = _VSTD::addressof(*__hold.release());
}
template <class _Rp>
@@ -1719,12 +1734,13 @@
template <class _Alloc>
promise<void>::promise(allocator_arg_t, const _Alloc& __a0)
{
- typedef typename _Alloc::template rebind<__assoc_sub_state_alloc<_Alloc> >::other _A2;
+ typedef __assoc_sub_state_alloc<_Alloc> _State;
+ typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
typedef __allocator_destructor<_A2> _D2;
_A2 __a(__a0);
- unique_ptr<__assoc_sub_state_alloc<_Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1));
- ::new(__hold.get()) __assoc_sub_state_alloc<_Alloc>(__a0);
- __state_ = __hold.release();
+ unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
+ ::new(static_cast<void*>(_VSTD::addressof(*__hold.get()))) _State(__a0);
+ __state_ = _VSTD::addressof(*__hold.release());
}
template <class _Rp>
@@ -1804,10 +1820,12 @@
void
__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate()
{
- typedef typename _Alloc::template rebind<__packaged_task_func>::other _Ap;
+ typedef typename __allocator_traits_rebind<_Alloc, __packaged_task_func>::type _Ap;
+ typedef allocator_traits<_Ap> _ATraits;
+ typedef pointer_traits<typename _ATraits::pointer> _PTraits;
_Ap __a(__f_.second());
__f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(this, 1);
+ __a.deallocate(_PTraits::pointer_to(*this), 1);
}
template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
@@ -1896,7 +1914,6 @@
allocator_arg_t, const _Alloc& __a0, _Fp&& __f)
: __f_(nullptr)
{
- typedef allocator_traits<_Alloc> __alloc_traits;
typedef typename remove_reference<typename decay<_Fp>::type>::type _FR;
typedef __packaged_task_func<_FR, _Alloc, _Rp(_ArgTypes...)> _FF;
if (sizeof(_FF) <= sizeof(__buf_))
@@ -1906,18 +1923,13 @@
}
else
{
- typedef typename __alloc_traits::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind_alloc<_FF>
-#else
- rebind_alloc<_FF>::other
-#endif
- _Ap;
+ typedef typename __allocator_traits_rebind<_Alloc, _FF>::type _Ap;
_Ap __a(__a0);
typedef __allocator_destructor<_Ap> _Dp;
unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(_VSTD::forward<_Fp>(__f), _Alloc(__a));
- __f_ = __hold.release();
+ ::new (static_cast<void*>(_VSTD::addressof(*__hold.get())))
+ _FF(_VSTD::forward<_Fp>(__f), _Alloc(__a));
+ __f_ = _VSTD::addressof(*__hold.release());
}
}
@@ -2612,4 +2624,6 @@
_LIBCPP_END_NAMESPACE_STD
+#endif // !_LIBCPP_HAS_NO_THREADS
+
#endif // _LIBCPP_FUTURE
diff --git a/include/ios b/include/ios
index d95f18a..ff79998 100644
--- a/include/ios
+++ b/include/ios
@@ -216,7 +216,7 @@
#include <__locale>
#include <system_error>
-#if __has_feature(cxx_atomic)
+#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
#include <atomic> // for __xindex_
#endif
@@ -367,7 +367,7 @@
int* __index_;
size_t __event_size_;
size_t __event_cap_;
-#if __has_feature(cxx_atomic)
+#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
static atomic<int> __xindex_;
#else
static int __xindex_;
diff --git a/include/istream b/include/istream
index 14fa466..168a4d0 100644
--- a/include/istream
+++ b/include/istream
@@ -82,6 +82,13 @@
pos_type tellg();
basic_istream& seekg(pos_type);
basic_istream& seekg(off_type, ios_base::seekdir);
+protected:
+ basic_istream(const basic_istream& rhs) = delete;
+ basic_istream(basic_istream&& rhs);
+ // 27.7.2.1.2 Assign/swap:
+ basic_istream& operator=(const basic_istream& rhs) = delete;
+ basic_istream& operator=(basic_istream&& rhs);
+ void swap(basic_istream& rhs);
};
// 27.7.1.2.3 character extraction templates:
@@ -184,13 +191,22 @@
_LIBCPP_INLINE_VISIBILITY
basic_istream(basic_istream&& __rhs);
#endif
-
// 27.7.1.1.2 Assign/swap:
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
_LIBCPP_INLINE_VISIBILITY
basic_istream& operator=(basic_istream&& __rhs);
#endif
void swap(basic_istream& __rhs);
+
+#if _LIBCPP_STD_VER > 11
+#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
+ basic_istream (const basic_istream& __rhs) = delete;
+ basic_istream& operator=(const basic_istream& __rhs) = delete;
+#else
+ basic_istream (const basic_istream& __rhs); // not defined
+ basic_istream& operator=(const basic_istream& __rhs); // not defined
+#endif
+#endif
public:
// 27.7.1.1.3 Prefix/suffix:
diff --git a/include/iterator b/include/iterator
index 88e615a..bcf142a 100644
--- a/include/iterator
+++ b/include/iterator
@@ -324,6 +324,17 @@
template <class C> auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14
template <class C> auto crend(const C& c) -> decltype(std::rend(c)); // C++14
+// 24.8, container access:
+template <class C> constexpr auto size(const C& c) -> decltype(c.size()); // C++17
+template <class T, size_t N> constexpr size_t size(const T (&array)[N]) noexcept; // C++17
+template <class C> constexpr auto empty(const C& c) -> decltype(c.empty()); // C++17
+template <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept; // C++17
+template <class E> constexpr bool empty(initializer_list<E> il) noexcept; // C++17
+template <class C> constexpr auto data(C& c) -> decltype(c.data()); // C++17
+template <class C> constexpr auto data(const C& c) -> decltype(c.data()); // C++17
+template <class T, size_t N> constexpr T* data(T (&array)[N]) noexcept; // C++17
+template <class E> constexpr const E* data(initializer_list<E> il) noexcept; // C++17
+
} // std
*/
@@ -1568,6 +1579,36 @@
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
+#if _LIBCPP_STD_VER > 14
+template <class _C>
+constexpr auto size(const _C& __c) -> decltype(__c.size()) { return __c.size(); }
+
+template <class _Tp, size_t _N>
+constexpr size_t size(const _Tp (&__array)[_N]) noexcept { return _N; }
+
+template <class _C>
+constexpr auto empty(const _C& __c) -> decltype(__c.empty()) { return __c.empty(); }
+
+template <class _Tp, size_t _N>
+constexpr bool empty(const _Tp (&__array)[_N]) noexcept { return false; }
+
+template <class _Ep>
+constexpr bool empty(initializer_list<_Ep> __il) noexcept { return __il.size() == 0; }
+
+template <class _C> constexpr
+auto data(_C& __c) -> decltype(__c.data()) { return __c.data(); }
+
+template <class _C> constexpr
+auto data(const _C& __c) -> decltype(__c.data()) { return __c.data(); }
+
+template <class _Tp, size_t _N>
+constexpr _Tp* data(_Tp (&__array)[_N]) noexcept { return __array; }
+
+template <class _Ep>
+constexpr const _Ep* data(initializer_list<_Ep> __il) noexcept { return __il.begin(); }
+#endif
+
+
_LIBCPP_END_NAMESPACE_STD
#endif // _LIBCPP_ITERATOR
diff --git a/include/limits b/include/limits
index a5b1ae5..ce967ea 100644
--- a/include/limits
+++ b/include/limits
@@ -237,7 +237,7 @@
static _LIBCPP_CONSTEXPR const bool is_bounded = true;
static _LIBCPP_CONSTEXPR const bool is_modulo = !_VSTD::is_signed<_Tp>::value;
-#if __i386__ || __x86_64__ || defined(__pnacl__) // @LOCALMOD
+#if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__)
static _LIBCPP_CONSTEXPR const bool traps = true;
#else
static _LIBCPP_CONSTEXPR const bool traps = false;
diff --git a/include/locale b/include/locale
index 910daa8..0d01002 100644
--- a/include/locale
+++ b/include/locale
@@ -193,7 +193,12 @@
#include <ctime>
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
#include <support/win32/locale_win32.h>
-#elif !defined(__ANDROID__) && !defined(_NEWLIB_VERSION) // @LOCALMOD Not supported by newlib.
+#elif defined(_NEWLIB_VERSION)
+// FIXME: replace all the uses of _NEWLIB_VERSION with __NEWLIB__ preceded by an
+// include of <sys/cdefs.h> once https://sourceware.org/ml/newlib-cvs/2014-q3/msg00038.html
+// has had a chance to bake for a bit
+#include <support/newlib/xlocale.h>
+#elif !defined(__ANDROID__)
#include <nl_types.h>
#endif
@@ -229,7 +234,8 @@
// OSX has nice foo_l() functions that let you turn off use of the global
// locale. Linux, not so much. The following functions avoid the locale when
// that's possible and otherwise do the wrong thing. FIXME.
-#if defined(__linux__) || defined(__EMSCRIPTEN__) || defined(_AIX) || defined(_NEWLIB_VERSION) // @LOCALMOD
+#if defined(__linux__) || defined(__EMSCRIPTEN__) || defined(_AIX) || \
+ defined(_NEWLIB_VERSION)
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
decltype(MB_CUR_MAX_L(_VSTD::declval<locale_t>()))
@@ -450,7 +456,7 @@
size_t __n_does_match = 0; // but none of them definitely do
// Initialize all statuses to __might_match, except for "" keywords are __does_match
unsigned char* __st = __status;
- for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st)
+ for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
{
if (!__ky->empty())
*__st = __might_match;
@@ -476,7 +482,7 @@
// If the keyword doesn't match this character, then change the keyword
// to doesn't match
__st = __status;
- for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st)
+ for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
{
if (*__st == __might_match)
{
@@ -510,7 +516,7 @@
if (__n_might_match + __n_does_match > 1)
{
__st = __status;
- for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st)
+ for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
{
if (*__st == __does_match && __ky->size() != __indx+1)
{
@@ -525,7 +531,7 @@
if (__b == __e)
__err |= ios_base::eofbit;
// Return the first matching result
- for (__st = __status; __kb != __ke; ++__kb, ++__st)
+ for (__st = __status; __kb != __ke; ++__kb, (void) ++__st)
if (*__st == __does_match)
break;
if (__kb == __ke)
@@ -1851,7 +1857,7 @@
return 0;
}
int __r = __ct.narrow(__c, 0) - '0';
- for (++__b, --__n; __b != __e && __n > 0; ++__b, --__n)
+ for (++__b, (void) --__n; __b != __e && __n > 0; ++__b, (void) --__n)
{
// get next digit
__c = *__b;
@@ -2964,6 +2970,8 @@
size_t __cur_cap = static_cast<size_t>(__e-__b.get()) * sizeof(_Tp);
size_t __new_cap = __cur_cap < numeric_limits<size_t>::max() / 2 ?
2 * __cur_cap : numeric_limits<size_t>::max();
+ if (__new_cap == 0)
+ __new_cap = sizeof(_Tp);
size_t __n_off = static_cast<size_t>(__n - __b.get());
_Tp* __t = (_Tp*)realloc(__owns ? __b.get() : 0, __new_cap);
if (__t == 0)
@@ -3673,7 +3681,7 @@
typename messages<_CharT>::catalog
messages<_CharT>::do_open(const basic_string<char>& __nm, const locale&) const
{
-#if defined(_WIN32) || defined(__ANDROID__) || defined(_NEWLIB_VERSION) // @LOCALMOD Not supported by newlib.
+#if defined(_WIN32) || defined(__ANDROID__) || defined(_NEWLIB_VERSION)
return -1;
#else // _WIN32 || __ANDROID__
catalog __cat = (catalog)catopen(__nm.c_str(), NL_CAT_LOCALE);
@@ -3688,7 +3696,7 @@
messages<_CharT>::do_get(catalog __c, int __set, int __msgid,
const string_type& __dflt) const
{
-#if defined(_WIN32) || defined(__ANDROID__)|| defined(_NEWLIB_VERSION) // @LOCALMOD Not supported by newlib.
+#if defined(_WIN32) || defined(__ANDROID__) || defined(_NEWLIB_VERSION)
return __dflt;
#else // _WIN32
string __ndflt;
@@ -3710,7 +3718,7 @@
void
messages<_CharT>::do_close(catalog __c) const
{
-#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(_NEWLIB_VERSION) // @LOCALMOD Not supported by newlib.
+#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(_NEWLIB_VERSION)
if (__c != -1)
__c <<= 1;
nl_catd __cat = (nl_catd)__c;
diff --git a/include/map b/include/map
index 5534e40..5c3969a 100644
--- a/include/map
+++ b/include/map
@@ -159,7 +159,7 @@
template<typename K>
const_iterator find(const K& x) const; // C++14
template<typename K>
- size_type count(const K& x) const;
+ size_type count(const K& x) const; // C++14
size_type count(const key_type& k) const;
iterator lower_bound(const key_type& k);
@@ -353,7 +353,7 @@
template<typename K>
const_iterator find(const K& x) const; // C++14
template<typename K>
- size_type count(const K& x) const;
+ size_type count(const K& x) const; // C++14
size_type count(const key_type& k) const;
iterator lower_bound(const key_type& k);
@@ -1104,6 +1104,12 @@
_LIBCPP_INLINE_VISIBILITY
size_type count(const key_type& __k) const
{return __tree_.__count_unique(__k);}
+#if _LIBCPP_STD_VER > 11
+ template <typename _K2>
+ _LIBCPP_INLINE_VISIBILITY
+ typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
+ count(const _K2& __k) {return __tree_.__count_unique(__k);}
+#endif
_LIBCPP_INLINE_VISIBILITY
iterator lower_bound(const key_type& __k)
{return __tree_.lower_bound(__k);}
@@ -1834,6 +1840,12 @@
_LIBCPP_INLINE_VISIBILITY
size_type count(const key_type& __k) const
{return __tree_.__count_multi(__k);}
+#if _LIBCPP_STD_VER > 11
+ template <typename _K2>
+ _LIBCPP_INLINE_VISIBILITY
+ typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
+ count(const _K2& __k) {return __tree_.__count_multi(__k);}
+#endif
_LIBCPP_INLINE_VISIBILITY
iterator lower_bound(const key_type& __k)
{return __tree_.lower_bound(__k);}
diff --git a/include/memory b/include/memory
index dc9aeba..662faa0 100644
--- a/include/memory
+++ b/include/memory
@@ -610,7 +610,7 @@
#include <cassert>
#endif
-#if __has_feature(cxx_atomic)
+#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
# include <atomic>
#endif
@@ -1450,7 +1450,7 @@
template <class _Tp, class... _Args>
_LIBCPP_INLINE_VISIBILITY
static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args)
- {__construct(__has_construct<allocator_type, pointer, _Args...>(),
+ {__construct(__has_construct<allocator_type, _Tp*, _Args...>(),
__a, __p, _VSTD::forward<_Args>(__args)...);}
#else // _LIBCPP_HAS_NO_VARIADICS
template <class _Tp>
@@ -3660,7 +3660,7 @@
const void*
__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT
{
- return __t == typeid(_Dp) ? &__data_.first().second() : 0;
+ return __t == typeid(_Dp) ? _VSTD::addressof(__data_.first().second()) : 0;
}
#endif // _LIBCPP_NO_RTTI
@@ -3677,9 +3677,13 @@
void
__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT
{
- typename _Alloc::template rebind<__shared_ptr_pointer>::other __a(__data_.second());
+ typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_pointer>::type _A;
+ typedef allocator_traits<_A> _ATraits;
+ typedef pointer_traits<typename _ATraits::pointer> _PTraits;
+
+ _A __a(__data_.second());
__data_.second().~_Alloc();
- __a.deallocate(this, 1);
+ __a.deallocate(_PTraits::pointer_to(*this), 1);
}
template <class _Tp, class _Alloc>
@@ -3742,9 +3746,12 @@
void
__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT
{
- typename _Alloc::template rebind<__shared_ptr_emplace>::other __a(__data_.first());
+ typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type _A;
+ typedef allocator_traits<_A> _ATraits;
+ typedef pointer_traits<typename _ATraits::pointer> _PTraits;
+ _A __a(__data_.first());
__data_.first().~_Alloc();
- __a.deallocate(this, 1);
+ __a.deallocate(_PTraits::pointer_to(*this), 1);
}
template<class _Tp> class _LIBCPP_TYPE_VIS_ONLY enable_shared_from_this;
@@ -4090,12 +4097,13 @@
{
#endif // _LIBCPP_NO_EXCEPTIONS
typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk;
- typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2;
+ typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
typedef __allocator_destructor<_A2> _D2;
_A2 __a2(__a);
unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
- ::new(__hold2.get()) _CntrlBlk(__p, __d, __a);
- __cntrl_ = __hold2.release();
+ ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
+ _CntrlBlk(__p, __d, __a);
+ __cntrl_ = _VSTD::addressof(*__hold2.release());
__enable_weak_this(__p);
#ifndef _LIBCPP_NO_EXCEPTIONS
}
@@ -4117,12 +4125,13 @@
{
#endif // _LIBCPP_NO_EXCEPTIONS
typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk;
- typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2;
+ typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
typedef __allocator_destructor<_A2> _D2;
_A2 __a2(__a);
unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
- ::new(__hold2.get()) _CntrlBlk(__p, __d, __a);
- __cntrl_ = __hold2.release();
+ ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
+ _CntrlBlk(__p, __d, __a);
+ __cntrl_ = _VSTD::addressof(*__hold2.release());
#ifndef _LIBCPP_NO_EXCEPTIONS
}
catch (...)
@@ -4282,14 +4291,15 @@
shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args)
{
typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
- typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2;
+ typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
typedef __allocator_destructor<_A2> _D2;
_A2 __a2(__a);
unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
- ::new(__hold2.get()) _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...);
+ ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
+ _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...);
shared_ptr<_Tp> __r;
__r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = __hold2.release();
+ __r.__cntrl_ = _VSTD::addressof(*__hold2.release());
__r.__enable_weak_this(__r.__ptr_);
return __r;
}
@@ -4373,14 +4383,15 @@
shared_ptr<_Tp>::allocate_shared(const _Alloc& __a)
{
typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
- typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2;
+ typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2;
typedef __allocator_destructor<_Alloc2> _D2;
_Alloc2 __alloc2(__a);
unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(__hold2.get()) _CntrlBlk(__a);
+ ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
+ _CntrlBlk(__a);
shared_ptr<_Tp> __r;
__r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = __hold2.release();
+ __r.__cntrl_ = _VSTD::addressof(*__hold2.release());
__r.__enable_weak_this(__r.__ptr_);
return __r;
}
@@ -4391,14 +4402,15 @@
shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0)
{
typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
- typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2;
+ typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2;
typedef __allocator_destructor<_Alloc2> _D2;
_Alloc2 __alloc2(__a);
unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(__hold2.get()) _CntrlBlk(__a, __a0);
+ ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
+ _CntrlBlk(__a, __a0);
shared_ptr<_Tp> __r;
__r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = __hold2.release();
+ __r.__cntrl_ = _VSTD::addressof(*__hold2.release());
__r.__enable_weak_this(__r.__ptr_);
return __r;
}
@@ -4409,14 +4421,15 @@
shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1)
{
typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
- typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2;
+ typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2;
typedef __allocator_destructor<_Alloc2> _D2;
_Alloc2 __alloc2(__a);
unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(__hold2.get()) _CntrlBlk(__a, __a0, __a1);
+ ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
+ _CntrlBlk(__a, __a0, __a1);
shared_ptr<_Tp> __r;
__r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = __hold2.release();
+ __r.__cntrl_ = _VSTD::addressof(*__hold2.release());
__r.__enable_weak_this(__r.__ptr_);
return __r;
}
@@ -4427,14 +4440,15 @@
shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2)
{
typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
- typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2;
+ typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2;
typedef __allocator_destructor<_Alloc2> _D2;
_Alloc2 __alloc2(__a);
unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(__hold2.get()) _CntrlBlk(__a, __a0, __a1, __a2);
+ ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
+ _CntrlBlk(__a, __a0, __a1, __a2);
shared_ptr<_Tp> __r;
__r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = __hold2.release();
+ __r.__cntrl_ = _VSTD::addressof(*__hold2.release());
__r.__enable_weak_this(__r.__ptr_);
return __r;
}
@@ -5262,7 +5276,7 @@
basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p);
-#if __has_feature(cxx_atomic)
+#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
class _LIBCPP_TYPE_VIS __sp_mut
{
@@ -5388,7 +5402,7 @@
return atomic_compare_exchange_weak(__p, __v, __w);
}
-#endif // __has_feature(cxx_atomic)
+#endif // __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
//enum class
struct _LIBCPP_TYPE_VIS pointer_safety
diff --git a/include/module.modulemap b/include/module.modulemap
index a0f4254..6aeb23f 100644
--- a/include/module.modulemap
+++ b/include/module.modulemap
@@ -16,6 +16,7 @@
module atomic {
header "atomic"
export *
+ requires cplusplus11
}
module bitset {
header "bitset"
diff --git a/include/mutex b/include/mutex
index 5dfba63..9c26356 100644
--- a/include/mutex
+++ b/include/mutex
@@ -187,6 +187,8 @@
_LIBCPP_BEGIN_NAMESPACE_STD
+#ifndef _LIBCPP_HAS_NO_THREADS
+
class _LIBCPP_TYPE_VIS recursive_mutex
{
pthread_mutex_t __m_;
@@ -425,6 +427,8 @@
#endif // _LIBCPP_HAS_NO_VARIADICS
+#endif // !_LIBCPP_HAS_NO_THREADS
+
struct _LIBCPP_TYPE_VIS_ONLY once_flag;
#ifndef _LIBCPP_HAS_NO_VARIADICS
diff --git a/include/numeric b/include/numeric
index e520c8e..21c3781 100644
--- a/include/numeric
+++ b/include/numeric
@@ -91,7 +91,7 @@
_Tp
inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init)
{
- for (; __first1 != __last1; ++__first1, ++__first2)
+ for (; __first1 != __last1; ++__first1, (void) ++__first2)
__init = __init + *__first1 * *__first2;
return __init;
}
@@ -102,7 +102,7 @@
inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
_Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2)
{
- for (; __first1 != __last1; ++__first1, ++__first2)
+ for (; __first1 != __last1; ++__first1, (void) ++__first2)
__init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
return __init;
}
@@ -116,7 +116,7 @@
{
typename iterator_traits<_InputIterator>::value_type __t(*__first);
*__result = __t;
- for (++__first, ++__result; __first != __last; ++__first, ++__result)
+ for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
{
__t = __t + *__first;
*__result = __t;
@@ -135,7 +135,7 @@
{
typename iterator_traits<_InputIterator>::value_type __t(*__first);
*__result = __t;
- for (++__first, ++__result; __first != __last; ++__first, ++__result)
+ for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
{
__t = __binary_op(__t, *__first);
*__result = __t;
@@ -153,7 +153,7 @@
{
typename iterator_traits<_InputIterator>::value_type __t1(*__first);
*__result = __t1;
- for (++__first, ++__result; __first != __last; ++__first, ++__result)
+ for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
{
typename iterator_traits<_InputIterator>::value_type __t2(*__first);
*__result = __t2 - __t1;
@@ -173,7 +173,7 @@
{
typename iterator_traits<_InputIterator>::value_type __t1(*__first);
*__result = __t1;
- for (++__first, ++__result; __first != __last; ++__first, ++__result)
+ for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
{
typename iterator_traits<_InputIterator>::value_type __t2(*__first);
*__result = __binary_op(__t2, __t1);
@@ -188,7 +188,7 @@
void
iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_)
{
- for (; __first != __last; ++__first, ++__value_)
+ for (; __first != __last; ++__first, (void) ++__value_)
*__first = __value_;
}
diff --git a/include/ostream b/include/ostream
index 9d96fd8..a7af299 100644
--- a/include/ostream
+++ b/include/ostream
@@ -67,6 +67,13 @@
pos_type tellp();
basic_ostream& seekp(pos_type);
basic_ostream& seekp(off_type, ios_base::seekdir);
+protected:
+ basic_ostream(const basic_ostream& rhs) = delete;
+ basic_ostream(basic_ostream&& rhs);
+ // 27.7.3.3 Assign/swap
+ basic_ostream& operator=(basic_ostream& rhs) = delete;
+ basic_ostream& operator=(const basic_ostream&& rhs);
+ void swap(basic_ostream& rhs);
};
// 27.7.2.6.4 character inserters
@@ -162,14 +169,19 @@
#endif
// 27.7.2.3 Assign/swap
-#if _LIBCPP_STD_VER > 11
- basic_ostream& operator=(const basic_ostream&) = delete;
-#endif
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
_LIBCPP_INLINE_VISIBILITY
basic_ostream& operator=(basic_ostream&& __rhs);
#endif
void swap(basic_ostream& __rhs);
+
+#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
+ basic_ostream (const basic_ostream& __rhs) = delete;
+ basic_ostream& operator=(const basic_ostream& __rhs) = delete;
+#else
+ basic_ostream (const basic_ostream& __rhs); // not defined
+ basic_ostream& operator=(const basic_ostream& __rhs); // not defined
+#endif
public:
// 27.7.2.4 Prefix/suffix:
diff --git a/include/random b/include/random
index c0db1ab..a8d21a2 100644
--- a/include/random
+++ b/include/random
@@ -3475,9 +3475,9 @@
class _LIBCPP_TYPE_VIS random_device
{
-#if !defined(_WIN32)
+#if !(defined(_WIN32) || defined(_LIBCPP_USING_NACL_RANDOM))
int __f_;
-#endif // defined(_WIN32)
+#endif // !(defined(_WIN32) || defined(_LIBCPP_USING_NACL_RANDOM))
public:
// types
typedef unsigned result_type;
@@ -4009,6 +4009,8 @@
}
}
+// Reference: Kemp, C.D. (1986). `A modal method for generating binomial
+// variables', Commun. Statist. - Theor. Meth. 15(3), 805-813.
template<class _IntType>
template<class _URNG>
_IntType
@@ -4035,7 +4037,8 @@
if (__u < 0)
return __rd - 1;
}
- --__rd;
+ if ( __rd != 0 )
+ --__rd;
++__ru;
if (__ru <= __pr.__t_)
{
diff --git a/include/set b/include/set
index b9e776d..22d794d 100644
--- a/include/set
+++ b/include/set
@@ -663,6 +663,12 @@
_LIBCPP_INLINE_VISIBILITY
size_type count(const key_type& __k) const
{return __tree_.__count_unique(__k);}
+#if _LIBCPP_STD_VER > 11
+ template <typename _K2>
+ _LIBCPP_INLINE_VISIBILITY
+ typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
+ count(const _K2& __k) {return __tree_.__count_unique(__k);}
+#endif
_LIBCPP_INLINE_VISIBILITY
iterator lower_bound(const key_type& __k)
{return __tree_.lower_bound(__k);}
@@ -1066,6 +1072,12 @@
_LIBCPP_INLINE_VISIBILITY
size_type count(const key_type& __k) const
{return __tree_.__count_multi(__k);}
+#if _LIBCPP_STD_VER > 11
+ template <typename _K2>
+ _LIBCPP_INLINE_VISIBILITY
+ typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
+ count(const _K2& __k) {return __tree_.__count_multi(__k);}
+#endif
_LIBCPP_INLINE_VISIBILITY
iterator lower_bound(const key_type& __k)
diff --git a/include/shared_mutex b/include/shared_mutex
index 7661054..9b7f0bf 100644
--- a/include/shared_mutex
+++ b/include/shared_mutex
@@ -112,6 +112,10 @@
#pragma GCC system_header
#endif
+#ifdef _LIBCPP_HAS_NO_THREADS
+#error <shared_mutex> is not supported on this single threaded system
+#else // !_LIBCPP_HAS_NO_THREADS
+
_LIBCPP_BEGIN_NAMESPACE_STD
class _LIBCPP_TYPE_VIS shared_timed_mutex
@@ -232,7 +236,7 @@
public:
_LIBCPP_INLINE_VISIBILITY
- shared_lock() noexcept
+ shared_lock() _NOEXCEPT
: __m_(nullptr),
__owns_(false)
{}
@@ -244,7 +248,7 @@
{__m_->lock_shared();}
_LIBCPP_INLINE_VISIBILITY
- shared_lock(mutex_type& __m, defer_lock_t) noexcept
+ shared_lock(mutex_type& __m, defer_lock_t) _NOEXCEPT
: __m_(&__m),
__owns_(false)
{}
@@ -288,7 +292,7 @@
shared_lock& operator=(shared_lock const&) = delete;
_LIBCPP_INLINE_VISIBILITY
- shared_lock(shared_lock&& __u) noexcept
+ shared_lock(shared_lock&& __u) _NOEXCEPT
: __m_(__u.__m_),
__owns_(__u.__owns_)
{
@@ -297,7 +301,7 @@
}
_LIBCPP_INLINE_VISIBILITY
- shared_lock& operator=(shared_lock&& __u) noexcept
+ shared_lock& operator=(shared_lock&& __u) _NOEXCEPT
{
if (__owns_)
__m_->unlock_shared();
@@ -320,14 +324,14 @@
// Setters
_LIBCPP_INLINE_VISIBILITY
- void swap(shared_lock& __u) noexcept
+ void swap(shared_lock& __u) _NOEXCEPT
{
_VSTD::swap(__m_, __u.__m_);
_VSTD::swap(__owns_, __u.__owns_);
}
_LIBCPP_INLINE_VISIBILITY
- mutex_type* release() noexcept
+ mutex_type* release() _NOEXCEPT
{
mutex_type* __m = __m_;
__m_ = nullptr;
@@ -337,13 +341,13 @@
// Getters
_LIBCPP_INLINE_VISIBILITY
- bool owns_lock() const noexcept {return __owns_;}
+ bool owns_lock() const _NOEXCEPT {return __owns_;}
_LIBCPP_INLINE_VISIBILITY
- explicit operator bool () const noexcept {return __owns_;}
+ explicit operator bool () const _NOEXCEPT {return __owns_;}
_LIBCPP_INLINE_VISIBILITY
- mutex_type* mutex() const noexcept {return __m_;}
+ mutex_type* mutex() const _NOEXCEPT {return __m_;}
};
template <class _Mutex>
@@ -409,11 +413,13 @@
template <class _Mutex>
inline _LIBCPP_INLINE_VISIBILITY
void
-swap(shared_lock<_Mutex>& __x, shared_lock<_Mutex>& __y) noexcept
+swap(shared_lock<_Mutex>& __x, shared_lock<_Mutex>& __y) _NOEXCEPT
{__x.swap(__y);}
_LIBCPP_END_NAMESPACE_STD
+#endif // !_LIBCPP_HAS_NO_THREADS
+
#endif // _LIBCPP_STD_VER > 11
#endif // _LIBCPP_SHARED_MUTEX
diff --git a/include/sstream b/include/sstream
index f90d446..27ae78f 100644
--- a/include/sstream
+++ b/include/sstream
@@ -325,11 +325,16 @@
__p = const_cast<char_type*>(__str_.data());
if (__binp != -1)
this->setg(__p + __binp, __p + __ninp, __p + __einp);
+ else
+ this->setg(nullptr, nullptr, nullptr);
if (__bout != -1)
{
this->setp(__p + __bout, __p + __eout);
this->pbump(__nout);
}
+ else
+ this->setp(nullptr, nullptr);
+
__hm_ = __hm == -1 ? nullptr : __p + __hm;
__mode_ = __rhs.__mode_;
__p = const_cast<char_type*>(__rhs.__str_.data());
diff --git a/include/string b/include/string
index fe72e9d..fe42bbf 100644
--- a/include/string
+++ b/include/string
@@ -509,14 +509,11 @@
typedef streampos pos_type;
typedef mbstate_t state_type;
- _LIBCPP_INLINE_VISIBILITY
- static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
+ static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
{__c1 = __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
{return __c1 == __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
{return __c1 < __c2;}
static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
@@ -526,20 +523,15 @@
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
static char_type* assign(char_type* __s, size_t __n, char_type __a);
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
{return char_type(__c);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
{return int_type(__c);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
{return __c1 == __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
{return int_type(EOF);}
};
@@ -636,51 +628,37 @@
typedef streampos pos_type;
typedef mbstate_t state_type;
- _LIBCPP_INLINE_VISIBILITY
- static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
+ static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
{__c1 = __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
{return __c1 == __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
{return (unsigned char)__c1 < (unsigned char)__c2;}
- _LIBCPP_INLINE_VISIBILITY
- static int compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n)
{return memcmp(__s1, __s2, __n);}
- _LIBCPP_INLINE_VISIBILITY
- static size_t length(const char_type* __s) {return strlen(__s);}
- _LIBCPP_INLINE_VISIBILITY
- static const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
+ static inline size_t length(const char_type* __s) {return strlen(__s);}
+ static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
{return (const char_type*)memchr(__s, to_int_type(__a), __n);}
- _LIBCPP_INLINE_VISIBILITY
- static char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
+ static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
{return (char_type*)memmove(__s1, __s2, __n);}
- _LIBCPP_INLINE_VISIBILITY
- static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
+ static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
{
_LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
return (char_type*)memcpy(__s1, __s2, __n);
}
- _LIBCPP_INLINE_VISIBILITY
- static char_type* assign(char_type* __s, size_t __n, char_type __a)
+ static inline char_type* assign(char_type* __s, size_t __n, char_type __a)
{return (char_type*)memset(__s, to_int_type(__a), __n);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
{return char_type(__c);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
{return int_type((unsigned char)__c);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
{return __c1 == __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
{return int_type(EOF);}
};
@@ -695,52 +673,38 @@
typedef streampos pos_type;
typedef mbstate_t state_type;
- _LIBCPP_INLINE_VISIBILITY
- static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
+ static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
{__c1 = __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
{return __c1 == __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
{return __c1 < __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static int compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n)
{return wmemcmp(__s1, __s2, __n);}
- _LIBCPP_INLINE_VISIBILITY
- static size_t length(const char_type* __s)
+ static inline size_t length(const char_type* __s)
{return wcslen(__s);}
- _LIBCPP_INLINE_VISIBILITY
- static const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
+ static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
{return (const char_type*)wmemchr(__s, __a, __n);}
- _LIBCPP_INLINE_VISIBILITY
- static char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
+ static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
{return (char_type*)wmemmove(__s1, __s2, __n);}
- _LIBCPP_INLINE_VISIBILITY
- static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
+ static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
{
_LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
return (char_type*)wmemcpy(__s1, __s2, __n);
}
- _LIBCPP_INLINE_VISIBILITY
- static char_type* assign(char_type* __s, size_t __n, char_type __a)
+ static inline char_type* assign(char_type* __s, size_t __n, char_type __a)
{return (char_type*)wmemset(__s, __a, __n);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
{return char_type(__c);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
{return int_type(__c);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
{return __c1 == __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
{return int_type(WEOF);}
};
@@ -755,14 +719,11 @@
typedef u16streampos pos_type;
typedef mbstate_t state_type;
- _LIBCPP_INLINE_VISIBILITY
- static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
+ static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
{__c1 = __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
{return __c1 == __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
{return __c1 < __c2;}
static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
@@ -772,20 +733,15 @@
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
static char_type* assign(char_type* __s, size_t __n, char_type __a);
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
{return char_type(__c);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
{return int_type(__c);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
{return __c1 == __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
{return int_type(0xDFFF);}
};
@@ -876,14 +832,11 @@
typedef u32streampos pos_type;
typedef mbstate_t state_type;
- _LIBCPP_INLINE_VISIBILITY
- static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
+ static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
{__c1 = __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
{return __c1 == __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
{return __c1 < __c2;}
static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
@@ -893,20 +846,15 @@
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
static char_type* assign(char_type* __s, size_t __n, char_type __a);
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
{return char_type(__c);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
{return int_type(__c);}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
{return __c1 == __c2;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
+ static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
{return int_type(0xFFFFFFFF);}
};
@@ -2267,7 +2215,7 @@
__set_long_cap(__cap+1);
__set_long_size(__sz);
}
- for (; __first != __last; ++__first, ++__p)
+ for (; __first != __last; ++__first, (void) ++__p)
traits_type::assign(*__p, *__first);
traits_type::assign(*__p, value_type());
}
diff --git a/include/support/android/locale_bionic.h b/include/support/android/locale_bionic.h
index 354fcfe..3a020da 100644
--- a/include/support/android/locale_bionic.h
+++ b/include/support/android/locale_bionic.h
@@ -20,173 +20,12 @@
#include <stdlib.h>
#include <xlocale.h>
-static inline int isalnum_l(int c, locale_t) {
- return isalnum(c);
-}
-
-static inline int isalpha_l(int c, locale_t) {
- return isalpha(c);
-}
-
-static inline int isblank_l(int c, locale_t) {
- return isblank(c);
-}
-
-static inline int iscntrl_l(int c, locale_t) {
- return iscntrl(c);
-}
-
-static inline int isdigit_l(int c, locale_t) {
- return isdigit(c);
-}
-
-static inline int isgraph_l(int c, locale_t) {
- return isgraph(c);
-}
-
-static inline int islower_l(int c, locale_t) {
- return islower(c);
-}
-
-static inline int isprint_l(int c, locale_t) {
- return isprint(c);
-}
-
-static inline int ispunct_l(int c, locale_t) {
- return ispunct(c);
-}
-
-static inline int isspace_l(int c, locale_t) {
- return isspace(c);
-}
-
-static inline int isupper_l(int c, locale_t) {
- return isupper(c);
-}
-
-static inline int isxdigit_l(int c, locale_t) {
- return isxdigit(c);
-}
-
-static inline int iswalnum_l(wint_t c, locale_t) {
- return iswalnum(c);
-}
-
-static inline int iswalpha_l(wint_t c, locale_t) {
- return iswalpha(c);
-}
-
-static inline int iswblank_l(wint_t c, locale_t) {
- return iswblank(c);
-}
-
-static inline int iswcntrl_l(wint_t c, locale_t) {
- return iswcntrl(c);
-}
-
-static inline int iswdigit_l(wint_t c, locale_t) {
- return iswdigit(c);
-}
-
-static inline int iswgraph_l(wint_t c, locale_t) {
- return iswgraph(c);
-}
-
-static inline int iswlower_l(wint_t c, locale_t) {
- return iswlower(c);
-}
-
-static inline int iswprint_l(wint_t c, locale_t) {
- return iswprint(c);
-}
-
-static inline int iswpunct_l(wint_t c, locale_t) {
- return iswpunct(c);
-}
-
-static inline int iswspace_l(wint_t c, locale_t) {
- return iswspace(c);
-}
-
-static inline int iswupper_l(wint_t c, locale_t) {
- return iswupper(c);
-}
-
-static inline int iswxdigit_l(wint_t c, locale_t) {
- return iswxdigit(c);
-}
-
-static inline int toupper_l(int c, locale_t) {
- return toupper(c);
-}
-
-static inline int tolower_l(int c, locale_t) {
- return tolower(c);
-}
-
-static inline int towupper_l(int c, locale_t) {
- return towupper(c);
-}
-
-static inline int towlower_l(int c, locale_t) {
- return towlower(c);
-}
-
-static inline int strcoll_l(const char *s1, const char *s2, locale_t) {
- return strcoll(s1, s2);
-}
-
-static inline size_t strxfrm_l(char *dest, const char *src, size_t n,
- locale_t) {
- return strxfrm(dest, src, n);
-}
-
-static inline size_t strftime_l(char *s, size_t max, const char *format,
- const struct tm *tm, locale_t) {
- return strftime(s, max, format, tm);
-}
-
-static inline int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t) {
- return wcscoll(ws1, ws2);
-}
-
-static inline size_t wcsxfrm_l(wchar_t *dest, const wchar_t *src, size_t n,
- locale_t) {
- return wcsxfrm(dest, src, n);
-}
-
-static inline long double strtold_l(const char *nptr, char **endptr, locale_t) {
- return strtold(nptr, endptr);
-}
-
-static inline long long strtoll_l(const char *nptr, char **endptr, size_t base,
- locale_t) {
- return strtoll(nptr, endptr, base);
-}
-
-static inline unsigned long long strtoull_l(const char *nptr, char **endptr,
- size_t base, locale_t) {
- return strtoull(nptr, endptr, base);
-}
-
-static inline long long wcstoll_l(const wchar_t *nptr, wchar_t **endptr,
- size_t base, locale_t) {
- return wcstoll(nptr, endptr, base);
-}
-
-static inline unsigned long long wcstoull_l(const wchar_t *nptr,
- wchar_t **endptr, size_t base,
- locale_t) {
- return wcstoull(nptr, endptr, base);
-}
-
-static inline long double wcstold_l(const wchar_t *nptr, wchar_t **endptr,
- locale_t) {
- return wcstold(nptr, endptr);
-}
-
#ifdef __cplusplus
}
#endif
+
+// Share implementation with Newlib
+#include <support/xlocale/xlocale.h>
+
#endif // defined(__ANDROID__)
#endif // _LIBCPP_SUPPORT_ANDROID_LOCALE_BIONIC_H
diff --git a/include/support/newlib/xlocale.h b/include/support/newlib/xlocale.h
new file mode 100644
index 0000000..d067cf8
--- /dev/null
+++ b/include/support/newlib/xlocale.h
@@ -0,0 +1,63 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP_SUPPORT_NEWLIB_XLOCALE_H
+#define _LIBCPP_SUPPORT_NEWLIB_XLOCALE_H
+
+#if defined(_NEWLIB_VERSION)
+
+#include <cstdlib>
+#include <clocale>
+#include <cwctype>
+#include <ctype.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Patch over newlib's lack of extended locale support
+typedef void *locale_t;
+static inline locale_t duplocale(locale_t) {
+ return NULL;
+}
+
+static inline void freelocale(locale_t) {
+}
+
+static inline locale_t newlocale(int, const char *, locale_t) {
+ return NULL;
+}
+
+static inline locale_t uselocale(locale_t) {
+ return NULL;
+}
+
+#define LC_COLLATE_MASK (1 << LC_COLLATE)
+#define LC_CTYPE_MASK (1 << LC_CTYPE)
+#define LC_MESSAGES_MASK (1 << LC_MESSAGES)
+#define LC_MONETARY_MASK (1 << LC_MONETARY)
+#define LC_NUMERIC_MASK (1 << LC_NUMERIC)
+#define LC_TIME_MASK (1 << LC_TIME)
+#define LC_ALL_MASK (LC_COLLATE_MASK|\
+ LC_CTYPE_MASK|\
+ LC_MONETARY_MASK|\
+ LC_NUMERIC_MASK|\
+ LC_TIME_MASK|\
+ LC_MESSAGES_MASK)
+
+// Share implementation with Android's Bionic
+#include <support/xlocale/xlocale.h>
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // _NEWLIB_VERSION
+
+#endif
diff --git a/include/support/solaris/xlocale.h b/include/support/solaris/xlocale.h
index 875a39a..6b5b544 100644
--- a/include/support/solaris/xlocale.h
+++ b/include/support/solaris/xlocale.h
@@ -14,6 +14,8 @@
#ifndef __XLOCALE_H_INCLUDED
#define __XLOCALE_H_INCLUDED
+#include <stdlib.h>
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/include/support/win32/support.h b/include/support/win32/support.h
index bc96587..5765bab 100644
--- a/include/support/win32/support.h
+++ b/include/support/win32/support.h
@@ -31,6 +31,8 @@
#define NOMINMAX
#endif
+// The mingw headers already define these as static.
+#ifndef __MINGW32__
extern "C" {
int vasprintf(char **sptr, const char *__restrict fmt, va_list ap);
@@ -40,6 +42,7 @@
size_t wcsnrtombs(char *__restrict dst, const wchar_t **__restrict src,
size_t nwc, size_t len, mbstate_t *__restrict ps);
}
+#endif // __MINGW32__
#if defined(_LIBCPP_MSVCRT)
#define snprintf _snprintf
diff --git a/include/support/xlocale/xlocale.h b/include/support/xlocale/xlocale.h
new file mode 100644
index 0000000..99f710e
--- /dev/null
+++ b/include/support/xlocale/xlocale.h
@@ -0,0 +1,194 @@
+// -*- C++ -*-
+//===------------------- support/xlocale/xlocale.h ------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// This is a shared implementation of a shim to provide extended locale support
+// on top of libc's that don't support it (like Android's bionic, and Newlib).
+//
+// The 'illusion' only works when the specified locale is "C" or "POSIX", but
+// that's about as good as we can do without implementing full xlocale support
+// in the underlying libc.
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP_SUPPORT_XLOCALE_XLOCALE_H
+#define _LIBCPP_SUPPORT_XLOCALE_XLOCALE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static inline int isalnum_l(int c, locale_t) {
+ return isalnum(c);
+}
+
+static inline int isalpha_l(int c, locale_t) {
+ return isalpha(c);
+}
+
+static inline int isblank_l(int c, locale_t) {
+ return isblank(c);
+}
+
+static inline int iscntrl_l(int c, locale_t) {
+ return iscntrl(c);
+}
+
+static inline int isdigit_l(int c, locale_t) {
+ return isdigit(c);
+}
+
+static inline int isgraph_l(int c, locale_t) {
+ return isgraph(c);
+}
+
+static inline int islower_l(int c, locale_t) {
+ return islower(c);
+}
+
+static inline int isprint_l(int c, locale_t) {
+ return isprint(c);
+}
+
+static inline int ispunct_l(int c, locale_t) {
+ return ispunct(c);
+}
+
+static inline int isspace_l(int c, locale_t) {
+ return isspace(c);
+}
+
+static inline int isupper_l(int c, locale_t) {
+ return isupper(c);
+}
+
+static inline int isxdigit_l(int c, locale_t) {
+ return isxdigit(c);
+}
+
+static inline int iswalnum_l(wint_t c, locale_t) {
+ return iswalnum(c);
+}
+
+static inline int iswalpha_l(wint_t c, locale_t) {
+ return iswalpha(c);
+}
+
+static inline int iswblank_l(wint_t c, locale_t) {
+ return iswblank(c);
+}
+
+static inline int iswcntrl_l(wint_t c, locale_t) {
+ return iswcntrl(c);
+}
+
+static inline int iswdigit_l(wint_t c, locale_t) {
+ return iswdigit(c);
+}
+
+static inline int iswgraph_l(wint_t c, locale_t) {
+ return iswgraph(c);
+}
+
+static inline int iswlower_l(wint_t c, locale_t) {
+ return iswlower(c);
+}
+
+static inline int iswprint_l(wint_t c, locale_t) {
+ return iswprint(c);
+}
+
+static inline int iswpunct_l(wint_t c, locale_t) {
+ return iswpunct(c);
+}
+
+static inline int iswspace_l(wint_t c, locale_t) {
+ return iswspace(c);
+}
+
+static inline int iswupper_l(wint_t c, locale_t) {
+ return iswupper(c);
+}
+
+static inline int iswxdigit_l(wint_t c, locale_t) {
+ return iswxdigit(c);
+}
+
+static inline int toupper_l(int c, locale_t) {
+ return toupper(c);
+}
+
+static inline int tolower_l(int c, locale_t) {
+ return tolower(c);
+}
+
+static inline int towupper_l(int c, locale_t) {
+ return towupper(c);
+}
+
+static inline int towlower_l(int c, locale_t) {
+ return towlower(c);
+}
+
+static inline int strcoll_l(const char *s1, const char *s2, locale_t) {
+ return strcoll(s1, s2);
+}
+
+static inline size_t strxfrm_l(char *dest, const char *src, size_t n,
+ locale_t) {
+ return strxfrm(dest, src, n);
+}
+
+static inline size_t strftime_l(char *s, size_t max, const char *format,
+ const struct tm *tm, locale_t) {
+ return strftime(s, max, format, tm);
+}
+
+static inline int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t) {
+ return wcscoll(ws1, ws2);
+}
+
+static inline size_t wcsxfrm_l(wchar_t *dest, const wchar_t *src, size_t n,
+ locale_t) {
+ return wcsxfrm(dest, src, n);
+}
+
+static inline long double strtold_l(const char *nptr, char **endptr, locale_t) {
+ return strtold(nptr, endptr);
+}
+
+static inline long long strtoll_l(const char *nptr, char **endptr, int base,
+ locale_t) {
+ return strtoll(nptr, endptr, base);
+}
+
+static inline unsigned long long strtoull_l(const char *nptr, char **endptr,
+ int base, locale_t) {
+ return strtoull(nptr, endptr, base);
+}
+
+static inline long long wcstoll_l(const wchar_t *nptr, wchar_t **endptr,
+ int base, locale_t) {
+ return wcstoll(nptr, endptr, base);
+}
+
+static inline unsigned long long wcstoull_l(const wchar_t *nptr,
+ wchar_t **endptr, int base,
+ locale_t) {
+ return wcstoull(nptr, endptr, base);
+}
+
+static inline long double wcstold_l(const wchar_t *nptr, wchar_t **endptr,
+ locale_t) {
+ return wcstold(nptr, endptr);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _LIBCPP_SUPPORT_XLOCALE_XLOCALE_H
diff --git a/include/thread b/include/thread
index 1f1e4a2..808d76b 100644
--- a/include/thread
+++ b/include/thread
@@ -106,6 +106,10 @@
#define __STDCPP_THREADS__ __cplusplus
+#ifdef _LIBCPP_HAS_NO_THREADS
+#error <thread> is not supported on this single threaded system
+#else // !_LIBCPP_HAS_NO_THREADS
+
_LIBCPP_BEGIN_NAMESPACE_STD
template <class _Tp>
@@ -455,4 +459,6 @@
_LIBCPP_END_NAMESPACE_STD
+#endif // !_LIBCPP_HAS_NO_THREADS
+
#endif // _LIBCPP_THREAD
diff --git a/include/tuple b/include/tuple
index c3fdd40..5fc27f9 100644
--- a/include/tuple
+++ b/include/tuple
@@ -376,19 +376,18 @@
_LIBCPP_INLINE_VISIBILITY
void __swallow(_Tp&&...) _NOEXCEPT {}
-template <bool ...> struct __all;
+template <bool ..._Pred>
+struct __all
+ : is_same<__all<_Pred...>, __all<(_Pred, true)...>>
+{ };
-template <>
-struct __all<>
-{
- static const bool value = true;
-};
+template <class _Tp>
+struct __all_default_constructible;
-template <bool _B0, bool ... _Bp>
-struct __all<_B0, _Bp...>
-{
- static const bool value = _B0 && __all<_Bp...>::value;
-};
+template <class ..._Tp>
+struct __all_default_constructible<__tuple_types<_Tp...>>
+ : __all<is_default_constructible<_Tp>::value...>
+{ };
// __tuple_impl
@@ -512,6 +511,9 @@
typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT;
public:
+ template <bool _Dummy = true, class _Up = typename enable_if<
+ __all<(_Dummy && is_default_constructible<_Tp>::value)...>::value
+ >::type>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR tuple()
_NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
@@ -547,6 +549,12 @@
sizeof...(_Up) < sizeof...(_Tp) ?
sizeof...(_Up) :
sizeof...(_Tp)>::type
+ >::value &&
+ __all_default_constructible<
+ typename __make_tuple_types<tuple, sizeof...(_Tp),
+ sizeof...(_Up) < sizeof...(_Tp) ?
+ sizeof...(_Up) :
+ sizeof...(_Tp)>::type
>::value,
bool
>::type = false
@@ -554,7 +562,7 @@
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
tuple(_Up&&... __u)
_NOEXCEPT_((
- is_nothrow_constructible<
+ is_nothrow_constructible<base,
typename __make_tuple_indices<sizeof...(_Up)>::type,
typename __make_tuple_types<tuple, sizeof...(_Up)>::type,
typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type,
@@ -587,6 +595,12 @@
sizeof...(_Up) < sizeof...(_Tp) ?
sizeof...(_Up) :
sizeof...(_Tp)>::type
+ >::value &&
+ __all_default_constructible<
+ typename __make_tuple_types<tuple, sizeof...(_Tp),
+ sizeof...(_Up) < sizeof...(_Tp) ?
+ sizeof...(_Up) :
+ sizeof...(_Tp)>::type
>::value,
bool
>::type =false
@@ -595,7 +609,7 @@
explicit
tuple(_Up&&... __u)
_NOEXCEPT_((
- is_nothrow_constructible<
+ is_nothrow_constructible<base,
typename __make_tuple_indices<sizeof...(_Up)>::type,
typename __make_tuple_types<tuple, sizeof...(_Up)>::type,
typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type,
@@ -620,6 +634,12 @@
sizeof...(_Up) < sizeof...(_Tp) ?
sizeof...(_Up) :
sizeof...(_Tp)>::type
+ >::value &&
+ __all_default_constructible<
+ typename __make_tuple_types<tuple, sizeof...(_Tp),
+ sizeof...(_Up) < sizeof...(_Tp) ?
+ sizeof...(_Up) :
+ sizeof...(_Tp)>::type
>::value
>::type
>
diff --git a/include/type_traits b/include/type_traits
index 371a15e..f467735 100644
--- a/include/type_traits
+++ b/include/type_traits
@@ -197,7 +197,9 @@
template <class F, class... ArgTypes>
using result_of_t = typename result_of<F(ArgTypes...)>::type; // C++14
-} // std
+ template <class...>
+ using void_t = void;
+} // C++17
*/
#include <__config>
@@ -209,6 +211,11 @@
_LIBCPP_BEGIN_NAMESPACE_STD
+#ifndef _LIBCPP_HAS_NO_VARIADICS
+template <class...>
+struct __void_t { typedef void type; };
+#endif
+
template <bool _Bp, class _If, class _Then>
struct _LIBCPP_TYPE_VIS_ONLY conditional {typedef _If type;};
template <class _If, class _Then>
@@ -218,6 +225,9 @@
template <bool _Bp, class _If, class _Then> using conditional_t = typename conditional<_Bp, _If, _Then>::type;
#endif
+template <bool, class _Tp> struct _LIBCPP_TYPE_VIS_ONLY __lazy_enable_if {};
+template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY __lazy_enable_if<true, _Tp> {typedef typename _Tp::type type;};
+
template <bool, class _Tp = void> struct _LIBCPP_TYPE_VIS_ONLY enable_if {};
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY enable_if<true, _Tp> {typedef _Tp type;};
@@ -1208,43 +1218,46 @@
bool = __numeric_type<_A1>::value &&
__numeric_type<_A2>::value &&
__numeric_type<_A3>::value>
-class __promote
+class __promote_imp
{
+public:
static const bool value = false;
};
template <class _A1, class _A2, class _A3>
-class __promote<_A1, _A2, _A3, true>
+class __promote_imp<_A1, _A2, _A3, true>
{
private:
- typedef typename __promote<_A1>::type __type1;
- typedef typename __promote<_A2>::type __type2;
- typedef typename __promote<_A3>::type __type3;
+ typedef typename __promote_imp<_A1>::type __type1;
+ typedef typename __promote_imp<_A2>::type __type2;
+ typedef typename __promote_imp<_A3>::type __type3;
public:
typedef decltype(__type1() + __type2() + __type3()) type;
static const bool value = true;
};
template <class _A1, class _A2>
-class __promote<_A1, _A2, void, true>
+class __promote_imp<_A1, _A2, void, true>
{
private:
- typedef typename __promote<_A1>::type __type1;
- typedef typename __promote<_A2>::type __type2;
+ typedef typename __promote_imp<_A1>::type __type1;
+ typedef typename __promote_imp<_A2>::type __type2;
public:
typedef decltype(__type1() + __type2()) type;
static const bool value = true;
};
template <class _A1>
-class __promote<_A1, void, void, true>
+class __promote_imp<_A1, void, void, true>
{
public:
typedef typename __numeric_type<_A1>::type type;
static const bool value = true;
- static const bool __does_not_throw = _NOEXCEPT_OR_FALSE(static_cast<type>(declval<_A1>()));
};
+template <class _A1, class _A2 = void, class _A3 = void>
+class __promote : public __promote_imp<_A1, _A2, _A3> {};
+
#ifdef _LIBCPP_STORE_AS_OPTIMIZATION
// __transform
@@ -1523,7 +1536,7 @@
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_copy_assignable
: public is_assignable<typename add_lvalue_reference<_Tp>::type,
- const typename add_lvalue_reference<_Tp>::type> {};
+ typename add_lvalue_reference<typename add_const<_Tp>::type>::type> {};
// is_move_assignable
@@ -1537,11 +1550,11 @@
// is_destructible
-// if it's a reference, return true
-// if it's a function, return false
-// if it's void, return false
-// if it's an array of unknown bound, return false
-// Otherwise, return "std::declval<_Up&>().~_Up()" is well-formed
+// if it's a reference, return true
+// if it's a function, return false
+// if it's void, return false
+// if it's an array of unknown bound, return false
+// Otherwise, return "std::declval<_Up&>().~_Up()" is well-formed
// where _Up is remove_all_extents<_Tp>::type
template <class>
@@ -1549,15 +1562,15 @@
template <typename _Tp>
struct __is_destructor_wellformed {
- template <typename _Tp1>
- static char __test (
+ template <typename _Tp1>
+ static char __test (
typename __is_destructible_apply<decltype(_VSTD::declval<_Tp1&>().~_Tp1())>::type
);
- template <typename _Tp1>
- static __two __test (...);
-
- static const bool value = sizeof(__test<_Tp>(12)) == sizeof(char);
+ template <typename _Tp1>
+ static __two __test (...);
+
+ static const bool value = sizeof(__test<_Tp>(12)) == sizeof(char);
};
template <class _Tp, bool>
@@ -1698,6 +1711,14 @@
};
template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...), true, false>
+{
+ typedef _Class _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
+template <class _Rp, class _Class, class ..._Param>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const, true, false>
{
typedef _Class const _ClassType;
@@ -1706,6 +1727,14 @@
};
template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const, true, false>
+{
+ typedef _Class const _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
+template <class _Rp, class _Class, class ..._Param>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile, true, false>
{
typedef _Class volatile _ClassType;
@@ -1714,6 +1743,14 @@
};
template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile, true, false>
+{
+ typedef _Class volatile _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
+template <class _Rp, class _Class, class ..._Param>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile, true, false>
{
typedef _Class const volatile _ClassType;
@@ -1721,6 +1758,14 @@
typedef _Rp (_FnType) (_Param...);
};
+template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile, true, false>
+{
+ typedef _Class const volatile _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
#if __has_feature(cxx_reference_qualified_functions)
template <class _Rp, class _Class, class ..._Param>
@@ -1732,6 +1777,14 @@
};
template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) &, true, false>
+{
+ typedef _Class& _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
+template <class _Rp, class _Class, class ..._Param>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&, true, false>
{
typedef _Class const& _ClassType;
@@ -1740,6 +1793,14 @@
};
template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const&, true, false>
+{
+ typedef _Class const& _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
+template <class _Rp, class _Class, class ..._Param>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&, true, false>
{
typedef _Class volatile& _ClassType;
@@ -1748,6 +1809,14 @@
};
template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile&, true, false>
+{
+ typedef _Class volatile& _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
+template <class _Rp, class _Class, class ..._Param>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&, true, false>
{
typedef _Class const volatile& _ClassType;
@@ -1756,6 +1825,14 @@
};
template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile&, true, false>
+{
+ typedef _Class const volatile& _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
+template <class _Rp, class _Class, class ..._Param>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &&, true, false>
{
typedef _Class&& _ClassType;
@@ -1764,6 +1841,14 @@
};
template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) &&, true, false>
+{
+ typedef _Class&& _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
+template <class _Rp, class _Class, class ..._Param>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&&, true, false>
{
typedef _Class const&& _ClassType;
@@ -1772,6 +1857,14 @@
};
template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const&&, true, false>
+{
+ typedef _Class const&& _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
+template <class _Rp, class _Class, class ..._Param>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&&, true, false>
{
typedef _Class volatile&& _ClassType;
@@ -1780,6 +1873,14 @@
};
template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile&&, true, false>
+{
+ typedef _Class volatile&& _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
+template <class _Rp, class _Class, class ..._Param>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&&, true, false>
{
typedef _Class const volatile&& _ClassType;
@@ -1787,6 +1888,14 @@
typedef _Rp (_FnType) (_Param...);
};
+template <class _Rp, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile&&, true, false>
+{
+ typedef _Class const volatile&& _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_Param..., ...);
+};
+
#endif // __has_feature(cxx_reference_qualified_functions)
#else // _LIBCPP_HAS_NO_VARIADICS
@@ -1799,6 +1908,14 @@
typedef _Rp (_FnType) ();
};
+template <class _Rp, class _Class>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(...), true, false>
+{
+ typedef _Class _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (...);
+};
+
template <class _Rp, class _Class, class _P0>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0), true, false>
{
@@ -1807,6 +1924,14 @@
typedef _Rp (_FnType) (_P0);
};
+template <class _Rp, class _Class, class _P0>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...), true, false>
+{
+ typedef _Class _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, ...);
+};
+
template <class _Rp, class _Class, class _P0, class _P1>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1), true, false>
{
@@ -1815,6 +1940,14 @@
typedef _Rp (_FnType) (_P0, _P1);
};
+template <class _Rp, class _Class, class _P0, class _P1>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...), true, false>
+{
+ typedef _Class _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, _P1, ...);
+};
+
template <class _Rp, class _Class, class _P0, class _P1, class _P2>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2), true, false>
{
@@ -1823,6 +1956,14 @@
typedef _Rp (_FnType) (_P0, _P1, _P2);
};
+template <class _Rp, class _Class, class _P0, class _P1, class _P2>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...), true, false>
+{
+ typedef _Class _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, _P1, _P2, ...);
+};
+
template <class _Rp, class _Class>
struct __member_pointer_traits_imp<_Rp (_Class::*)() const, true, false>
{
@@ -1831,6 +1972,14 @@
typedef _Rp (_FnType) ();
};
+template <class _Rp, class _Class>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(...) const, true, false>
+{
+ typedef _Class const _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (...);
+};
+
template <class _Rp, class _Class, class _P0>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const, true, false>
{
@@ -1839,6 +1988,14 @@
typedef _Rp (_FnType) (_P0);
};
+template <class _Rp, class _Class, class _P0>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) const, true, false>
+{
+ typedef _Class const _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, ...);
+};
+
template <class _Rp, class _Class, class _P0, class _P1>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const, true, false>
{
@@ -1847,6 +2004,14 @@
typedef _Rp (_FnType) (_P0, _P1);
};
+template <class _Rp, class _Class, class _P0, class _P1>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) const, true, false>
+{
+ typedef _Class const _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, _P1, ...);
+};
+
template <class _Rp, class _Class, class _P0, class _P1, class _P2>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const, true, false>
{
@@ -1855,6 +2020,14 @@
typedef _Rp (_FnType) (_P0, _P1, _P2);
};
+template <class _Rp, class _Class, class _P0, class _P1, class _P2>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) const, true, false>
+{
+ typedef _Class const _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, _P1, _P2, ...);
+};
+
template <class _Rp, class _Class>
struct __member_pointer_traits_imp<_Rp (_Class::*)() volatile, true, false>
{
@@ -1863,6 +2036,14 @@
typedef _Rp (_FnType) ();
};
+template <class _Rp, class _Class>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(...) volatile, true, false>
+{
+ typedef _Class volatile _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (...);
+};
+
template <class _Rp, class _Class, class _P0>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) volatile, true, false>
{
@@ -1871,6 +2052,14 @@
typedef _Rp (_FnType) (_P0);
};
+template <class _Rp, class _Class, class _P0>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) volatile, true, false>
+{
+ typedef _Class volatile _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, ...);
+};
+
template <class _Rp, class _Class, class _P0, class _P1>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) volatile, true, false>
{
@@ -1879,6 +2068,14 @@
typedef _Rp (_FnType) (_P0, _P1);
};
+template <class _Rp, class _Class, class _P0, class _P1>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) volatile, true, false>
+{
+ typedef _Class volatile _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, _P1, ...);
+};
+
template <class _Rp, class _Class, class _P0, class _P1, class _P2>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) volatile, true, false>
{
@@ -1887,6 +2084,14 @@
typedef _Rp (_FnType) (_P0, _P1, _P2);
};
+template <class _Rp, class _Class, class _P0, class _P1, class _P2>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) volatile, true, false>
+{
+ typedef _Class volatile _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, _P1, _P2, ...);
+};
+
template <class _Rp, class _Class>
struct __member_pointer_traits_imp<_Rp (_Class::*)() const volatile, true, false>
{
@@ -1895,6 +2100,14 @@
typedef _Rp (_FnType) ();
};
+template <class _Rp, class _Class>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(...) const volatile, true, false>
+{
+ typedef _Class const volatile _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (...);
+};
+
template <class _Rp, class _Class, class _P0>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const volatile, true, false>
{
@@ -1903,6 +2116,14 @@
typedef _Rp (_FnType) (_P0);
};
+template <class _Rp, class _Class, class _P0>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) const volatile, true, false>
+{
+ typedef _Class const volatile _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, ...);
+};
+
template <class _Rp, class _Class, class _P0, class _P1>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const volatile, true, false>
{
@@ -1911,6 +2132,14 @@
typedef _Rp (_FnType) (_P0, _P1);
};
+template <class _Rp, class _Class, class _P0, class _P1>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) const volatile, true, false>
+{
+ typedef _Class const volatile _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, _P1, ...);
+};
+
template <class _Rp, class _Class, class _P0, class _P1, class _P2>
struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const volatile, true, false>
{
@@ -1919,6 +2148,14 @@
typedef _Rp (_FnType) (_P0, _P1, _P2);
};
+template <class _Rp, class _Class, class _P0, class _P1, class _P2>
+struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) const volatile, true, false>
+{
+ typedef _Class const volatile _ClassType;
+ typedef _Rp _ReturnType;
+ typedef _Rp (_FnType) (_P0, _P1, _P2, ...);
+};
+
#endif // _LIBCPP_HAS_NO_VARIADICS
template <class _Rp, class _Class>
@@ -2413,8 +2650,8 @@
template <class _Tp>
struct _LIBCPP_TYPE_VIS_ONLY is_copy_constructible
- : public is_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type>
- {};
+ : public is_constructible<_Tp,
+ typename add_lvalue_reference<typename add_const<_Tp>::type>::type> {};
// is_move_constructible
@@ -2618,8 +2855,7 @@
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_trivially_copy_assignable
: public is_trivially_assignable<typename add_lvalue_reference<_Tp>::type,
- const typename add_lvalue_reference<_Tp>::type>
- {};
+ typename add_lvalue_reference<typename add_const<_Tp>::type>::type> {};
// is_trivially_move_assignable
@@ -2637,7 +2873,7 @@
#if __has_feature(has_trivial_destructor) || (_GNUC_VER >= 403)
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_trivially_destructible
- : public integral_constant<bool, __has_trivial_destructor(_Tp)> {};
+ : public integral_constant<bool, is_destructible<_Tp>::value && __has_trivial_destructor(_Tp)> {};
#else
@@ -2665,29 +2901,38 @@
#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
-template <bool, class _Tp, class... _Args> struct __libcpp_is_nothrow_constructible;
+template <bool, bool, class _Tp, class... _Args> struct __libcpp_is_nothrow_constructible;
template <class _Tp, class... _Args>
-struct __libcpp_is_nothrow_constructible<true, _Tp, _Args...>
+struct __libcpp_is_nothrow_constructible</*is constructible*/true, /*is reference*/false, _Tp, _Args...>
: public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))>
{
};
-template <class _Tp, class... _Args>
-struct __libcpp_is_nothrow_constructible<false, _Tp, _Args...>
+template <class _Tp>
+void __implicit_conversion_to(_Tp) noexcept { }
+
+template <class _Tp, class _Arg>
+struct __libcpp_is_nothrow_constructible</*is constructible*/true, /*is reference*/true, _Tp, _Arg>
+ : public integral_constant<bool, noexcept(__implicit_conversion_to<_Tp>(declval<_Arg>()))>
+{
+};
+
+template <class _Tp, bool _IsReference, class... _Args>
+struct __libcpp_is_nothrow_constructible</*is constructible*/false, _IsReference, _Tp, _Args...>
: public false_type
{
};
template <class _Tp, class... _Args>
struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_constructible
- : __libcpp_is_nothrow_constructible<is_constructible<_Tp, _Args...>::value, _Tp, _Args...>
+ : __libcpp_is_nothrow_constructible<is_constructible<_Tp, _Args...>::value, is_reference<_Tp>::value, _Tp, _Args...>
{
};
template <class _Tp, size_t _Ns>
struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_constructible<_Tp[_Ns]>
- : __libcpp_is_nothrow_constructible<is_constructible<_Tp>::value, _Tp>
+ : __libcpp_is_nothrow_constructible<is_constructible<_Tp>::value, is_reference<_Tp>::value, _Tp>
{
};
@@ -2810,8 +3055,8 @@
// is_nothrow_copy_constructible
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_copy_constructible
- : public is_nothrow_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type>
- {};
+ : public is_nothrow_constructible<_Tp,
+ typename add_lvalue_reference<typename add_const<_Tp>::type>::type> {};
// is_nothrow_move_constructible
@@ -2895,8 +3140,7 @@
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_copy_assignable
: public is_nothrow_assignable<typename add_lvalue_reference<_Tp>::type,
- const typename add_lvalue_reference<_Tp>::type>
- {};
+ typename add_lvalue_reference<typename add_const<_Tp>::type>::type> {};
// is_nothrow_move_assignable
@@ -3405,24 +3649,41 @@
#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
template <class _Tp>
-struct __has_operator_addressof_imp
+struct __has_operator_addressof_member_imp
{
- template <class>
- static auto __test(__any) -> false_type;
template <class _Up>
- static auto __test(_Up* __u)
- -> typename __select_2nd<decltype(__u->operator&()), true_type>::type;
+ static auto __test(int)
+ -> typename __select_2nd<decltype(_VSTD::declval<_Up>().operator&()), true_type>::type;
+ template <class>
+ static auto __test(long) -> false_type;
- static const bool value = decltype(__test<_Tp>(nullptr))::value;
+ static const bool value = decltype(__test<_Tp>(0))::value;
+};
+
+template <class _Tp>
+struct __has_operator_addressof_free_imp
+{
+ template <class _Up>
+ static auto __test(int)
+ -> typename __select_2nd<decltype(operator&(_VSTD::declval<_Up>())), true_type>::type;
+ template <class>
+ static auto __test(long) -> false_type;
+
+ static const bool value = decltype(__test<_Tp>(0))::value;
};
template <class _Tp>
struct __has_operator_addressof
- : public integral_constant<bool, __has_operator_addressof_imp<_Tp>::value>
+ : public integral_constant<bool, __has_operator_addressof_member_imp<_Tp>::value
+ || __has_operator_addressof_free_imp<_Tp>::value>
{};
#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE
+#if _LIBCPP_STD_VER > 14
+template <class...> using void_t = void;
+#endif
+
_LIBCPP_END_NAMESPACE_STD
#endif // _LIBCPP_TYPE_TRAITS
diff --git a/include/utility b/include/utility
index 4eafda4..6f324db 100644
--- a/include/utility
+++ b/include/utility
@@ -207,7 +207,7 @@
_ForwardIterator2
swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2)
{
- for(; __first1 != __last1; ++__first1, ++__first2)
+ for(; __first1 != __last1; ++__first1, (void) ++__first2)
swap(*__first1, *__first2);
return __first2;
}
diff --git a/include/valarray b/include/valarray
index 3714350..2b94204 100644
--- a/include/valarray
+++ b/include/valarray
@@ -1220,6 +1220,7 @@
const value_type* __s = __sa.__vp_;
for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
*__t = *__s;
+ return *this;
}
template <class _Tp>
@@ -2090,6 +2091,7 @@
size_t __n = __1d_.size();
for (size_t __i = 0; __i < __n; ++__i)
__vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
+ return *this;
}
template <class _Tp>
diff --git a/include/vector b/include/vector
index 1be584d..22a6343 100644
--- a/include/vector
+++ b/include/vector
@@ -784,7 +784,6 @@
void
>::type
__construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
- void __move_construct_at_end(pointer __first, pointer __last);
void __append(size_type __n);
void __append(size_type __n, const_reference __x);
_LIBCPP_INLINE_VISIBILITY
@@ -836,7 +835,7 @@
// may not meet the AddressSanitizer alignment constraints.
// See the documentation for __sanitizer_annotate_contiguous_container for more details.
void __annotate_contiguous_container
- (const void *__beg, const void *__end, const void *__old_mid, const void *__new_mid)
+ (const void *__beg, const void *__end, const void *__old_mid, const void *__new_mid) const
{
#ifndef _LIBCPP_HAS_NO_ASAN
if (__beg && is_same<allocator_type, __default_allocator_type>::value)
@@ -844,26 +843,50 @@
#endif
}
- void __annotate_new(size_type __current_size)
+ void __annotate_new(size_type __current_size) const
{
__annotate_contiguous_container(data(), data() + capacity(),
data() + capacity(), data() + __current_size);
}
- void __annotate_delete()
+ void __annotate_delete() const
{
__annotate_contiguous_container(data(), data() + capacity(),
data() + size(), data() + capacity());
}
- void __annotate_increase(size_type __n)
+ void __annotate_increase(size_type __n) const
{
__annotate_contiguous_container(data(), data() + capacity(),
data() + size(), data() + size() + __n);
}
- void __annotate_shrink(size_type __old_size)
+ void __annotate_shrink(size_type __old_size) const
{
__annotate_contiguous_container(data(), data() + capacity(),
data() + __old_size, data() + size());
}
+#ifndef _LIBCPP_HAS_NO_ASAN
+ // The annotation for size increase should happen before the actual increase,
+ // but if an exception is thrown after that the annotation has to be undone.
+ struct __RAII_IncreaseAnnotator {
+ __RAII_IncreaseAnnotator(const vector &__v, size_type __n = 1)
+ : __commit(false), __v(__v), __n(__n) {
+ __v.__annotate_increase(__n);
+ }
+ void __done() { __commit = true; }
+ ~__RAII_IncreaseAnnotator() {
+ if (__commit) return;
+ __v.__annotate_shrink(__v.size() + __n);
+ }
+ bool __commit;
+ size_type __n;
+ const vector &__v;
+ };
+#else
+ struct __RAII_IncreaseAnnotator {
+ inline __RAII_IncreaseAnnotator(const vector &, size_type __n = 1) {}
+ inline void __done() {}
+ };
+#endif
+
};
template <class _Tp, class _Allocator>
@@ -959,12 +982,13 @@
vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
{
allocator_type& __a = this->__alloc();
- __annotate_increase(__n);
do
{
+ __RAII_IncreaseAnnotator __annotator(*this);
__alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_));
++this->__end_;
--__n;
+ __annotator.__done();
} while (__n > 0);
}
@@ -980,12 +1004,13 @@
vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
{
allocator_type& __a = this->__alloc();
- __annotate_increase(__n);
do
{
+ __RAII_IncreaseAnnotator __annotator(*this);
__alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), __x);
++this->__end_;
--__n;
+ __annotator.__done();
} while (__n > 0);
}
@@ -1001,22 +1026,9 @@
allocator_type& __a = this->__alloc();
for (; __first != __last; ++__first)
{
- __annotate_increase(1);
+ __RAII_IncreaseAnnotator __annotator(*this);
__alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), *__first);
- ++this->__end_;
- }
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::__move_construct_at_end(pointer __first, pointer __last)
-{
- allocator_type& __a = this->__alloc();
- for (; __first != __last; ++__first)
- {
- __annotate_increase(1);
- __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),
- _VSTD::move(*__first));
+ __annotator.__done();
++this->__end_;
}
}
@@ -1578,9 +1590,10 @@
{
if (this->__end_ != this->__end_cap())
{
- __annotate_increase(1);
+ __RAII_IncreaseAnnotator __annotator(*this);
__alloc_traits::construct(this->__alloc(),
_VSTD::__to_raw_pointer(this->__end_), __x);
+ __annotator.__done();
++this->__end_;
}
else
@@ -1596,10 +1609,11 @@
{
if (this->__end_ < this->__end_cap())
{
- __annotate_increase(1);
+ __RAII_IncreaseAnnotator __annotator(*this);
__alloc_traits::construct(this->__alloc(),
_VSTD::__to_raw_pointer(this->__end_),
_VSTD::move(__x));
+ __annotator.__done();
++this->__end_;
}
else
@@ -1629,10 +1643,11 @@
{
if (this->__end_ < this->__end_cap())
{
- __annotate_increase(1);
+ __RAII_IncreaseAnnotator __annotator(*this);
__alloc_traits::construct(this->__alloc(),
_VSTD::__to_raw_pointer(this->__end_),
_VSTD::forward<_Args>(__args)...);
+ __annotator.__done();
++this->__end_;
}
else
@@ -1712,7 +1727,7 @@
pointer __p = this->__begin_ + (__position - begin());
if (this->__end_ < this->__end_cap())
{
- __annotate_increase(1);
+ __RAII_IncreaseAnnotator __annotator(*this);
if (__p == this->__end_)
{
__alloc_traits::construct(this->__alloc(),
@@ -1727,6 +1742,7 @@
++__xr;
*__p = *__xr;
}
+ __annotator.__done();
}
else
{
@@ -1752,7 +1768,7 @@
pointer __p = this->__begin_ + (__position - begin());
if (this->__end_ < this->__end_cap())
{
- __annotate_increase(1);
+ __RAII_IncreaseAnnotator __annotator(*this);
if (__p == this->__end_)
{
__alloc_traits::construct(this->__alloc(),
@@ -1765,6 +1781,7 @@
__move_range(__p, this->__end_, __p + 1);
*__p = _VSTD::move(__x);
}
+ __annotator.__done();
}
else
{
@@ -1791,7 +1808,7 @@
pointer __p = this->__begin_ + (__position - begin());
if (this->__end_ < this->__end_cap())
{
- __annotate_increase(1);
+ __RAII_IncreaseAnnotator __annotator(*this);
if (__p == this->__end_)
{
__alloc_traits::construct(this->__alloc(),
@@ -1805,6 +1822,7 @@
__move_range(__p, this->__end_, __p + 1);
*__p = _VSTD::move(__tmp);
}
+ __annotator.__done();
}
else
{
@@ -1843,8 +1861,9 @@
}
if (__n > 0)
{
- __annotate_increase(__n);
+ __RAII_IncreaseAnnotator __annotator(*this, __n);
__move_range(__p, __old_last, __p + __old_n);
+ __annotator.__done();
const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
if (__p <= __xr && __xr < this->__end_)
__xr += __old_n;
@@ -1954,8 +1973,9 @@
}
if (__n > 0)
{
- __annotate_increase(__n);
+ __RAII_IncreaseAnnotator __annotator(*this, __n);
__move_range(__p, __old_last, __p + __old_n);
+ __annotator.__done();
_VSTD::copy(__first, __m, __p);
}
}
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index fc3fc9f..e83bc3e 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -11,12 +11,15 @@
list(REMOVE_ITEM LIBCXXABI_SOURCES ${PNACL_EH_SUPPORT})
endif()
list(APPEND LIBCXX_SOURCES ${LIBCXXABI_SOURCES})
- set(LIBCXX_CXX_ABI_LIBRARIES)
+ set(LIBCXX_CXX_ABI_LIBRARY)
# @LOCALMOD-END
if(WIN32)
file(GLOB LIBCXX_WIN32_SOURCES ../src/support/win32/*.cpp)
list(APPEND LIBCXX_SOURCES ${LIBCXX_WIN32_SOURCES})
+elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")
+ file(GLOB LIBCXX_SOLARIS_SOURCES ../src/support/solaris/*.c)
+ list(APPEND LIBCXX_SOURCES ${LIBCXX_SOLARIS_SOURCES})
endif()
# Add all the headers to the project for IDEs.
@@ -50,18 +53,22 @@
endif()
# Generate library list.
-set(libraries ${LIBCXX_CXX_ABI_LIBRARIES})
+set(libraries ${LIBCXX_CXX_ABI_LIBRARY})
append_if(libraries LIBCXX_HAS_PTHREAD_LIB pthread)
append_if(libraries LIBCXX_HAS_C_LIB c)
append_if(libraries LIBCXX_HAS_M_LIB m)
append_if(libraries LIBCXX_HAS_RT_LIB rt)
append_if(libraries LIBCXX_HAS_GCC_S_LIB gcc_s)
+#if LIBCXX_CXX_ABI_LIBRARY_PATH is defined we want to add it to the search path.
+if (DEFINED LIBCXX_CXX_ABI_LIBRARY_PATH)
+ target_link_libraries(cxx "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}")
+endif()
target_link_libraries(cxx ${libraries})
# Setup flags.
-# @LOCALMOD removed append_if(compile_flags LIBCXX_HAS_FPIC_FLAG -fPIC)
-append_if(link_flags LIBCXX_HAS_NODEFAULTLIBS_FLAG -nodefaultlibs)
+# @LOCALMOD removed append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_FPIC_FLAG -fPIC)
+append_if(LIBCXX_LINK_FLAGS LIBCXX_HAS_NODEFAULTLIBS_FLAG -nodefaultlibs)
# @LOCALMOD-START
if ( CMAKE_SYSTEM_NAME STREQUAL "Darwin" )
@@ -74,10 +81,10 @@
if ( False ) # @LOCALMOD-END
if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" )
- list(APPEND compile_flags "-U__STRICT_ANSI__")
- list(APPEND link_flags
+ list(APPEND LIBCXX_COMPILE_FLAGS "-U__STRICT_ANSI__")
+ list(APPEND LIBCXX_LINK_FLAGS
"-compatibility_version 1"
- "-current_version ${LIBCXX_VERSION}"
+ "-current_version 1"
"-install_name /usr/lib/libc++.1.dylib"
"-Wl,-reexport_library,/usr/lib/libc++abi.dylib"
"-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp"
@@ -97,7 +104,7 @@
set (OSX_RE_EXPORT_LINE "/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++abi${LIBCXX_LIBCPPABI_VERSION}.exp")
endif()
- list(APPEND link_flags
+ list(APPEND LIBCXX_LINK_FLAGS
"-compatibility_version 1"
"-install_name /usr/lib/libc++.1.dylib"
"-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp"
@@ -107,12 +114,13 @@
endif()
endif()
-string(REPLACE ";" " " link_flags "${link_flags}")
+string(REPLACE ";" " " LIBCXX_COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}")
+string(REPLACE ";" " " LIBCXX_LINK_FLAGS "${LIBCXX_LINK_FLAGS}")
set_target_properties(cxx
PROPERTIES
- COMPILE_FLAGS "${compile_flags}"
- LINK_FLAGS "${link_flags}"
+ COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}"
+ LINK_FLAGS "${LIBCXX_LINK_FLAGS}"
OUTPUT_NAME "c++"
VERSION "1.0"
SOVERSION "1"
diff --git a/src/algorithm.cpp b/src/algorithm.cpp
index 10c4c33..e548856 100644
--- a/src/algorithm.cpp
+++ b/src/algorithm.cpp
@@ -7,7 +7,6 @@
//
//===----------------------------------------------------------------------===//
-#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
#include "algorithm"
#include "random"
#include "mutex"
@@ -48,12 +47,16 @@
template unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&);
+#ifndef _LIBCPP_HAS_NO_THREADS
static pthread_mutex_t __rs_mut = PTHREAD_MUTEX_INITIALIZER;
+#endif
unsigned __rs_default::__c_ = 0;
__rs_default::__rs_default()
{
+#ifndef _LIBCPP_HAS_NO_THREADS
pthread_mutex_lock(&__rs_mut);
+#endif
__c_ = 1;
}
@@ -64,8 +67,12 @@
__rs_default::~__rs_default()
{
+#ifndef _LIBCPP_HAS_NO_THREADS
if (--__c_ == 0)
pthread_mutex_unlock(&__rs_mut);
+#else
+ --__c_;
+#endif
}
__rs_default::result_type
diff --git a/src/chrono.cpp b/src/chrono.cpp
index 15a6f46..4569411 100644
--- a/src/chrono.cpp
+++ b/src/chrono.cpp
@@ -46,6 +46,7 @@
return system_clock::time_point(seconds(t));
}
+#ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK
// steady_clock
const bool steady_clock::is_steady;
@@ -108,10 +109,8 @@
}
#else // __APPLE__
-// FIXME: We assume that clock_gettime(CLOCK_MONOTONIC) works on
-// non-apple systems. Instead, we should check _POSIX_TIMERS and
-// _POSIX_MONOTONIC_CLOCK and fall back to something else if those
-// don't exist.
+// FIXME: if _LIBCPP_HAS_NO_MONOTONIC_CLOCK, then clock_gettime isn't going to
+// work. It may be possible to fall back on something else, depending on the system.
// Warning: If this is not truly steady, then it is non-conforming. It is
// better for it to not exist and have the rest of libc++ use system_clock
@@ -127,6 +126,8 @@
}
#endif // __APPLE__
+#endif // !_LIBCPP_HAS_NO_MONOTONIC_CLOCK
+
}
_LIBCPP_END_NAMESPACE_STD
diff --git a/src/condition_variable.cpp b/src/condition_variable.cpp
index 061d138..5fd5fc8 100644
--- a/src/condition_variable.cpp
+++ b/src/condition_variable.cpp
@@ -7,6 +7,10 @@
//
//===----------------------------------------------------------------------===//
+#include "__config"
+
+#ifndef _LIBCPP_HAS_NO_THREADS
+
#include "condition_variable"
#include "thread"
#include "system_error"
@@ -79,3 +83,5 @@
}
_LIBCPP_END_NAMESPACE_STD
+
+#endif // !_LIBCPP_HAS_NO_THREADS
diff --git a/src/debug.cpp b/src/debug.cpp
index d0e8679..60694a3 100644
--- a/src/debug.cpp
+++ b/src/debug.cpp
@@ -35,6 +35,7 @@
namespace
{
+#ifndef _LIBCPP_HAS_NO_THREADS
typedef mutex mutex_type;
typedef lock_guard<mutex_type> WLock;
typedef lock_guard<mutex_type> RLock;
@@ -45,6 +46,7 @@
static mutex_type m;
return m;
}
+#endif // !_LIBCPP_HAS_NO_THREADS
} // unnamed namespace
@@ -108,7 +110,9 @@
void*
__libcpp_db::__find_c_from_i(void* __i) const
{
+#ifndef _LIBCPP_HAS_NO_THREADS
RLock _(mut());
+#endif
__i_node* i = __find_iterator(__i);
_LIBCPP_ASSERT(i != nullptr, "iterator not found in debug database.");
return i->__c_ != nullptr ? i->__c_->__c_ : nullptr;
@@ -117,7 +121,9 @@
void
__libcpp_db::__insert_ic(void* __i, const void* __c)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
WLock _(mut());
+#endif
if (__cbeg_ == __cend_)
return;
size_t hc = hash<const void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
@@ -138,7 +144,9 @@
__c_node*
__libcpp_db::__insert_c(void* __c)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
WLock _(mut());
+#endif
if (__csz_ + 1 > static_cast<size_t>(__cend_ - __cbeg_))
{
size_t nc = __next_prime(2*static_cast<size_t>(__cend_ - __cbeg_) + 1);
@@ -184,7 +192,9 @@
void
__libcpp_db::__erase_i(void* __i)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
WLock _(mut());
+#endif
if (__ibeg_ != __iend_)
{
size_t hi = hash<void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_);
@@ -215,7 +225,9 @@
void
__libcpp_db::__invalidate_all(void* __c)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
WLock _(mut());
+#endif
if (__cend_ != __cbeg_)
{
size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
@@ -239,17 +251,23 @@
__c_node*
__libcpp_db::__find_c_and_lock(void* __c) const
{
+#ifndef _LIBCPP_HAS_NO_THREADS
mut().lock();
+#endif
if (__cend_ == __cbeg_)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
mut().unlock();
+#endif
return nullptr;
}
size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
__c_node* p = __cbeg_[hc];
if (p == nullptr)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
mut().unlock();
+#endif
return nullptr;
}
while (p->__c_ != __c)
@@ -257,7 +275,9 @@
p = p->__next_;
if (p == nullptr)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
mut().unlock();
+#endif
return nullptr;
}
}
@@ -281,13 +301,17 @@
void
__libcpp_db::unlock() const
{
+#ifndef _LIBCPP_HAS_NO_THREADS
mut().unlock();
+#endif
}
void
__libcpp_db::__erase_c(void* __c)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
WLock _(mut());
+#endif
if (__cend_ != __cbeg_)
{
size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
@@ -322,7 +346,9 @@
void
__libcpp_db::__iterator_copy(void* __i, const void* __i0)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
WLock _(mut());
+#endif
__i_node* i = __find_iterator(__i);
__i_node* i0 = __find_iterator(__i0);
__c_node* c0 = i0 != nullptr ? i0->__c_ : nullptr;
@@ -348,7 +374,9 @@
bool
__libcpp_db::__dereferenceable(const void* __i) const
{
+#ifndef _LIBCPP_HAS_NO_THREADS
RLock _(mut());
+#endif
__i_node* i = __find_iterator(__i);
return i != nullptr && i->__c_ != nullptr && i->__c_->__dereferenceable(__i);
}
@@ -356,7 +384,9 @@
bool
__libcpp_db::__decrementable(const void* __i) const
{
+#ifndef _LIBCPP_HAS_NO_THREADS
RLock _(mut());
+#endif
__i_node* i = __find_iterator(__i);
return i != nullptr && i->__c_ != nullptr && i->__c_->__decrementable(__i);
}
@@ -364,7 +394,9 @@
bool
__libcpp_db::__addable(const void* __i, ptrdiff_t __n) const
{
+#ifndef _LIBCPP_HAS_NO_THREADS
RLock _(mut());
+#endif
__i_node* i = __find_iterator(__i);
return i != nullptr && i->__c_ != nullptr && i->__c_->__addable(__i, __n);
}
@@ -372,7 +404,9 @@
bool
__libcpp_db::__subscriptable(const void* __i, ptrdiff_t __n) const
{
+#ifndef _LIBCPP_HAS_NO_THREADS
RLock _(mut());
+#endif
__i_node* i = __find_iterator(__i);
return i != nullptr && i->__c_ != nullptr && i->__c_->__subscriptable(__i, __n);
}
@@ -380,7 +414,9 @@
bool
__libcpp_db::__less_than_comparable(const void* __i, const void* __j) const
{
+#ifndef _LIBCPP_HAS_NO_THREADS
RLock _(mut());
+#endif
__i_node* i = __find_iterator(__i);
__i_node* j = __find_iterator(__j);
__c_node* ci = i != nullptr ? i->__c_ : nullptr;
@@ -391,7 +427,9 @@
void
__libcpp_db::swap(void* c1, void* c2)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
WLock _(mut());
+#endif
size_t hc = hash<void*>()(c1) % static_cast<size_t>(__cend_ - __cbeg_);
__c_node* p1 = __cbeg_[hc];
_LIBCPP_ASSERT(p1 != nullptr, "debug mode internal logic error swap A");
@@ -420,7 +458,9 @@
void
__libcpp_db::__insert_i(void* __i)
{
+#ifndef _LIBCPP_HAS_NO_THREADS
WLock _(mut());
+#endif
__insert_iterator(__i);
}
diff --git a/src/exception.cpp b/src/exception.cpp
index 3ce6f2e..b5c46c0 100644
--- a/src/exception.cpp
+++ b/src/exception.cpp
@@ -16,7 +16,7 @@
#define __has_include(inc) 0
#endif
-#ifdef __APPLE__
+#if defined(__APPLE__) && !defined(LIBCXXRT)
#include <cxxabi.h>
using namespace __cxxabiv1;
diff --git a/src/future.cpp b/src/future.cpp
index c67dc58..0c5c2c4 100644
--- a/src/future.cpp
+++ b/src/future.cpp
@@ -7,6 +7,10 @@
//
//===----------------------------------------------------------------------===//
+#include "__config"
+
+#ifndef _LIBCPP_HAS_NO_THREADS
+
#include "future"
#include "string"
@@ -298,3 +302,5 @@
}
_LIBCPP_END_NAMESPACE_STD
+
+#endif // !_LIBCPP_HAS_NO_THREADS
diff --git a/src/ios.cpp b/src/ios.cpp
index e241394..d879beb 100644
--- a/src/ios.cpp
+++ b/src/ios.cpp
@@ -7,8 +7,7 @@
//
//===----------------------------------------------------------------------===//
-#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
-
+#include "__config"
#include "ios"
#include "streambuf"
#include "istream"
@@ -54,11 +53,9 @@
__iostream_category::message(int ev) const
{
if (ev != static_cast<int>(io_errc::stream)
-#ifdef ELAST
- && ev <= ELAST
-#elif defined(__linux__)
- && ev <= 4095
-#endif // ELAST
+#ifdef _LIBCPP_ELAST
+ && ev <= _LIBCPP_ELAST
+#endif // _LIBCPP_ELAST
)
return __do_message::message(ev);
return string("unspecified iostream_category error");
@@ -151,12 +148,22 @@
}
// xalloc
-#if __has_feature(cxx_atomic)
+#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
atomic<int> ios_base::__xindex_ = ATOMIC_VAR_INIT(0);
#else
int ios_base::__xindex_ = 0;
#endif
+template <typename _Tp>
+static size_t __ios_new_cap(size_t __req_size, size_t __current_cap)
+{ // Precondition: __req_size > __current_cap
+ const size_t mx = std::numeric_limits<size_t>::max() / sizeof(_Tp);
+ if (__req_size < mx/2)
+ return _VSTD::max(2 * __current_cap, __req_size);
+ else
+ return mx;
+}
+
int
ios_base::xalloc()
{
@@ -169,14 +176,8 @@
size_t req_size = static_cast<size_t>(index)+1;
if (req_size > __iarray_cap_)
{
- size_t newcap;
- const size_t mx = std::numeric_limits<size_t>::max();
- if (req_size < mx/2)
- newcap = _VSTD::max(2 * __iarray_cap_, req_size);
- else
- newcap = mx;
- size_t newsize = newcap * sizeof(long);
- long* iarray = static_cast<long*>(realloc(__iarray_, newsize));
+ size_t newcap = __ios_new_cap<long>(req_size, __iarray_cap_);
+ long* iarray = static_cast<long*>(realloc(__iarray_, newcap * sizeof(long)));
if (iarray == 0)
{
setstate(badbit);
@@ -185,8 +186,9 @@
return error;
}
__iarray_ = iarray;
- for (long* p = __iarray_ + __iarray_size_; __iarray_cap_ < newcap; ++__iarray_cap_, ++p)
+ for (long* p = __iarray_ + __iarray_size_; p < __iarray_ + newcap; ++p)
*p = 0;
+ __iarray_cap_ = newcap;
}
__iarray_size_ = max<size_t>(__iarray_size_, req_size);
return __iarray_[index];
@@ -198,14 +200,8 @@
size_t req_size = static_cast<size_t>(index)+1;
if (req_size > __parray_cap_)
{
- size_t newcap;
- const size_t mx = std::numeric_limits<size_t>::max();
- if (req_size < mx/2)
- newcap = _VSTD::max(2 * __parray_cap_, req_size);
- else
- newcap = mx;
- size_t newsize = newcap * sizeof(void*);
- void** parray = static_cast<void**>(realloc(__parray_, newsize));
+ size_t newcap = __ios_new_cap<void *>(req_size, __iarray_cap_);
+ void** parray = static_cast<void**>(realloc(__parray_, newcap * sizeof(void *)));
if (parray == 0)
{
setstate(badbit);
@@ -214,8 +210,9 @@
return error;
}
__parray_ = parray;
- for (void** p = __parray_ + __parray_size_; __parray_cap_ < newcap; ++__parray_cap_, ++p)
+ for (void** p = __parray_ + __parray_size_; p < __parray_ + newcap; ++p)
*p = 0;
+ __parray_cap_ = newcap;
}
__parray_size_ = max<size_t>(__parray_size_, req_size);
return __parray_[index];
@@ -229,22 +226,16 @@
size_t req_size = __event_size_ + 1;
if (req_size > __event_cap_)
{
- size_t newcap;
- const size_t mx = std::numeric_limits<size_t>::max();
- if (req_size < mx/2)
- newcap = _VSTD::max(2 * __event_cap_, req_size);
- else
- newcap = mx;
- size_t newesize = newcap * sizeof(event_callback);
- event_callback* fns = static_cast<event_callback*>(realloc(__fn_, newesize));
+ size_t newcap = __ios_new_cap<event_callback>(req_size, __event_cap_);
+ event_callback* fns = static_cast<event_callback*>(realloc(__fn_, newcap * sizeof(event_callback)));
if (fns == 0)
setstate(badbit);
__fn_ = fns;
- size_t newisize = newcap * sizeof(int);
- int* indxs = static_cast<int *>(realloc(__index_, newisize));
+ int* indxs = static_cast<int *>(realloc(__index_, newcap * sizeof(int)));
if (indxs == 0)
setstate(badbit);
__index_ = indxs;
+ __event_cap_ = newcap;
}
__fn_[__event_size_] = fn;
__index_[__event_size_] = index;
diff --git a/src/locale.cpp b/src/locale.cpp
index 7d99961..191b239 100644
--- a/src/locale.cpp
+++ b/src/locale.cpp
@@ -7,8 +7,6 @@
//
//===----------------------------------------------------------------------===//
-#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
-
// On Solaris, we need to define something to make the C99 parts of localeconv
// visible.
#ifdef __sun__
@@ -42,17 +40,6 @@
#pragma clang diagnostic ignored "-Wsign-conversion"
#endif
-// @LOCALMOD-START Newlib doesn't have the following C extensions for locales.
-#if defined(_NEWLIB_VERSION)
-extern "C" {
- locale_t duplocale(locale_t) { return NULL; }
- void freelocale(locale_t) { }
- locale_t newlocale(int, const char *, locale_t) { return NULL; }
- locale_t uselocale(locale_t) { return NULL; }
-}
-#endif
- // @LOCALMOD-END
-
_LIBCPP_BEGIN_NAMESPACE_STD
#ifdef __cloc_defined
diff --git a/src/memory.cpp b/src/memory.cpp
index 666673f..c56d031 100644
--- a/src/memory.cpp
+++ b/src/memory.cpp
@@ -9,8 +9,10 @@
#define _LIBCPP_BUILDING_MEMORY
#include "memory"
+#ifndef _LIBCPP_HAS_NO_THREADS
#include "mutex"
#include "thread"
+#endif
_LIBCPP_BEGIN_NAMESPACE_STD
@@ -119,7 +121,7 @@
#endif // _LIBCPP_NO_RTTI
-#if __has_feature(cxx_atomic)
+#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
static const std::size_t __sp_mut_count = 16;
static pthread_mutex_t mut_back_imp[__sp_mut_count] =
@@ -172,7 +174,7 @@
return muts[hash<const void*>()(p) & (__sp_mut_count-1)];
}
-#endif // __has_feature(cxx_atomic)
+#endif // __has_feature(cxx_atomic) && !_LIBCPP_HAS_NO_THREADS
void
declare_reachable(void*)
diff --git a/src/mutex.cpp b/src/mutex.cpp
index 0767897..e56271d 100644
--- a/src/mutex.cpp
+++ b/src/mutex.cpp
@@ -14,6 +14,7 @@
#include "cassert"
_LIBCPP_BEGIN_NAMESPACE_STD
+#ifndef _LIBCPP_HAS_NO_THREADS
const defer_lock_t defer_lock = {};
const try_to_lock_t try_to_lock = {};
@@ -206,18 +207,42 @@
}
}
+#endif // !_LIBCPP_HAS_NO_THREADS
+
// If dispatch_once_f ever handles C++ exceptions, and if one can get to it
// without illegal macros (unexpected macros not beginning with _UpperCase or
// __lowercase), and if it stops spinning waiting threads, then call_once should
// call into dispatch_once_f instead of here. Relevant radar this code needs to
// keep in sync with: 7741191.
+#ifndef _LIBCPP_HAS_NO_THREADS
static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
+#endif
void
__call_once(volatile unsigned long& flag, void* arg, void(*func)(void*))
{
+#if defined(_LIBCPP_HAS_NO_THREADS)
+ if (flag == 0)
+ {
+#ifndef _LIBCPP_NO_EXCEPTIONS
+ try
+ {
+#endif // _LIBCPP_NO_EXCEPTIONS
+ flag = 1;
+ func(arg);
+ flag = ~0ul;
+#ifndef _LIBCPP_NO_EXCEPTIONS
+ }
+ catch (...)
+ {
+ flag = 0ul;
+ throw;
+ }
+#endif // _LIBCPP_NO_EXCEPTIONS
+ }
+#else // !_LIBCPP_HAS_NO_THREADS
pthread_mutex_lock(&mut);
while (flag == 1)
pthread_cond_wait(&cv, &mut);
@@ -248,6 +273,8 @@
}
else
pthread_mutex_unlock(&mut);
+#endif // !_LIBCPP_HAS_NO_THREADS
+
}
_LIBCPP_END_NAMESPACE_STD
diff --git a/src/new.cpp b/src/new.cpp
index 3b7c341..a88d4cc 100644
--- a/src/new.cpp
+++ b/src/new.cpp
@@ -17,7 +17,7 @@
#define __has_include(inc) 0
#endif
-#ifdef __APPLE__
+#if defined(__APPLE__) && !defined(LIBCXXRT)
#include <cxxabi.h>
#ifndef _LIBCPPABI_VERSION
@@ -192,8 +192,6 @@
#endif // !__GLIBCXX__
-#endif //LIBCXXRT
-
bad_array_new_length::bad_array_new_length() _NOEXCEPT
{
}
@@ -203,6 +201,14 @@
}
const char*
+bad_array_new_length::what() const _NOEXCEPT
+{
+ return "bad_array_new_length";
+}
+
+#endif //LIBCXXRT
+
+const char*
bad_array_length::what() const _NOEXCEPT
{
return "bad_array_length";
@@ -216,12 +222,6 @@
{
}
-const char*
-bad_array_new_length::what() const _NOEXCEPT
-{
- return "bad_array_new_length";
-}
-
#endif // _LIBCPPABI_VERSION
#ifndef LIBSTDCXX
diff --git a/src/random.cpp b/src/random.cpp
index ab17bd1..15ed65b 100644
--- a/src/random.cpp
+++ b/src/random.cpp
@@ -11,28 +11,27 @@
// Must be defined before including stdlib.h to enable rand_s().
#define _CRT_RAND_S
#include <stdio.h>
-#endif
+#endif // defined(_WIN32)
#include "random"
#include "system_error"
-#ifdef __sun__
+#if defined(__sun__)
#define rename solaris_headers_are_broken
-#endif
+#endif // defined(__sun__)
#if !defined(_WIN32)
#include <fcntl.h>
#include <unistd.h>
-#endif // defined(_WIN32)
+#endif // !defined(_WIN32)
#include <errno.h>
-// @LOCALMOD-START
-#if defined(__native_client__)
+#if defined(_LIBCPP_USING_NACL_RANDOM)
#include <nacl/nacl_random.h>
-#endif
-// @LOCALMOD-END
+#endif // defined(_LIBCPP_USING_NACL_RANDOM)
_LIBCPP_BEGIN_NAMESPACE_STD
#if defined(_WIN32)
+
random_device::random_device(const string&)
{
}
@@ -50,33 +49,20 @@
__throw_system_error(err, "random_device rand_s failed.");
return r;
}
-#else
+
+#elif defined(_LIBCPP_USING_NACL_RANDOM)
+
random_device::random_device(const string& __token)
-// @LOCALMOD-START
-#if defined(__native_client__)
{
if (__token != "/dev/urandom")
- __throw_system_error(ENODEV, ("random device not supported " + __token).c_str());
+ __throw_system_error(ENOENT, ("random device not supported " + __token).c_str());
int error = nacl_secure_random_init();
if (error)
__throw_system_error(error, ("random device failed to open " + __token).c_str());
}
-#else
- : __f_(open(__token.c_str(), O_RDONLY))
-{
- if (__f_ < 0)
- __throw_system_error(errno, ("random_device failed to open " + __token).c_str());
-}
-#endif
-// @LOCALMOD-END
random_device::~random_device()
{
-// @LOCALMOD-START
-#if !defined(__native_client__)
- close(__f_);
-#endif
-// @LOCALMOD-END
}
unsigned
@@ -85,15 +71,35 @@
unsigned r;
size_t n = sizeof(r);
char* p = reinterpret_cast<char*>(&r);
-// @LOCALMOD-START
-#if defined(__native_client__)
size_t bytes_written;
int error = nacl_secure_random(&r, n, &bytes_written);
if (error != 0)
__throw_system_error(error, "random_device failed getting bytes");
else if (bytes_written != n)
- __throw_runtime_error("random_device failed obtaining enough bytes");
-#else
+ __throw_runtime_error("random_device failed to obtain enough bytes");
+ return r;
+}
+
+#else // !defined(_WIN32) && !defined(_LIBCPP_USING_NACL_RANDOM)
+
+random_device::random_device(const string& __token)
+ : __f_(open(__token.c_str(), O_RDONLY))
+{
+ if (__f_ < 0)
+ __throw_system_error(errno, ("random_device failed to open " + __token).c_str());
+}
+
+random_device::~random_device()
+{
+ close(__f_);
+}
+
+unsigned
+random_device::operator()()
+{
+ unsigned r;
+ size_t n = sizeof(r);
+ char* p = reinterpret_cast<char*>(&r);
while (n > 0)
{
ssize_t s = read(__f_, p, n);
@@ -108,11 +114,10 @@
n -= static_cast<size_t>(s);
p += static_cast<size_t>(s);
}
-#endif
-// @LOCALMOD-END
return r;
}
-#endif // defined(_WIN32)
+
+#endif // defined(_WIN32) || defined(_LIBCPP_USING_NACL_RANDOM)
double
random_device::entropy() const _NOEXCEPT
diff --git a/src/shared_mutex.cpp b/src/shared_mutex.cpp
index dd78a16..2b78c1f 100644
--- a/src/shared_mutex.cpp
+++ b/src/shared_mutex.cpp
@@ -7,6 +7,9 @@
//
//===----------------------------------------------------------------------===//
+#include "__config"
+#ifndef _LIBCPP_HAS_NO_THREADS
+
#define _LIBCPP_BUILDING_SHARED_MUTEX
#include "shared_mutex"
@@ -99,3 +102,5 @@
_LIBCPP_END_NAMESPACE_STD
+
+#endif // !_LIBCPP_HAS_NO_THREADS
diff --git a/src/string.cpp b/src/string.cpp
index fde5212..febc532 100644
--- a/src/string.cpp
+++ b/src/string.cpp
@@ -7,8 +7,6 @@
//
//===----------------------------------------------------------------------===//
-#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
-
#include "string"
#include "cstdlib"
#include "cwchar"
@@ -65,7 +63,7 @@
V
as_integer_helper(const string& func, const S& str, size_t* idx, int base, F f)
{
- typename S::value_type* ptr;
+ typename S::value_type* ptr = nullptr;
const typename S::value_type* const p = str.c_str();
typename remove_reference<decltype(errno)>::type errno_save = errno;
errno = 0;
@@ -182,7 +180,7 @@
V
as_float_helper(const string& func, const S& str, size_t* idx, F f )
{
- typename S::value_type* ptr;
+ typename S::value_type* ptr = nullptr;
const typename S::value_type* const p = str.c_str();
typename remove_reference<decltype(errno)>::type errno_save = errno;
errno = 0;
diff --git a/src/support/solaris/xlocale.c b/src/support/solaris/xlocale.c
index 39dd8e3..81750a8 100644
--- a/src/support/solaris/xlocale.c
+++ b/src/support/solaris/xlocale.c
@@ -17,7 +17,7 @@
#include <limits.h>
#include <assert.h>
#include <sys/localedef.h>
-#include "xlocale.h"
+#include "support/solaris/xlocale.h"
static _LC_locale_t *__C_locale;
diff --git a/src/system_error.cpp b/src/system_error.cpp
index d5cb2d4..9c8adc4 100644
--- a/src/system_error.cpp
+++ b/src/system_error.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#define _LIBCPP_BUILDING_SYSTEM_ERROR
+#include "__config"
#include "system_error"
#include "string"
#include "cstring"
@@ -65,13 +66,10 @@
string
__generic_error_category::message(int ev) const
{
-#ifdef ELAST
- if (ev > ELAST)
+#ifdef _LIBCPP_ELAST
+ if (ev > _LIBCPP_ELAST)
return string("unspecified generic_category error");
-#elif defined(__linux__)
- if (ev > 4095)
- return string("unspecified generic_category error");
-#endif // ELAST
+#endif // _LIBCPP_ELAST
return __do_message::message(ev);
}
@@ -100,26 +98,20 @@
string
__system_error_category::message(int ev) const
{
-#ifdef ELAST
- if (ev > ELAST)
+#ifdef _LIBCPP_ELAST
+ if (ev > _LIBCPP_ELAST)
return string("unspecified system_category error");
-#elif defined(__linux__)
- if (ev > 4095)
- return string("unspecified system_category error");
-#endif // ELAST
+#endif // _LIBCPP_ELAST
return __do_message::message(ev);
}
error_condition
__system_error_category::default_error_condition(int ev) const _NOEXCEPT
{
-#ifdef ELAST
- if (ev > ELAST)
+#ifdef _LIBCPP_ELAST
+ if (ev > _LIBCPP_ELAST)
return error_condition(ev, system_category());
-#elif defined(__linux__)
- if (ev > 4095)
- return error_condition(ev, system_category());
-#endif // ELAST
+#endif // _LIBCPP_ELAST
return error_condition(ev, generic_category());
}
diff --git a/src/thread.cpp b/src/thread.cpp
index 91b39d6..6a18e2c 100644
--- a/src/thread.cpp
+++ b/src/thread.cpp
@@ -7,6 +7,9 @@
//
//===----------------------------------------------------------------------===//
+#include "__config"
+#ifndef _LIBCPP_HAS_NO_THREADS
+
#include "thread"
#include "exception"
#include "vector"
@@ -225,3 +228,5 @@
}
_LIBCPP_END_NAMESPACE_STD
+
+#endif // !_LIBCPP_HAS_NO_THREADS
diff --git a/src/valarray.cpp b/src/valarray.cpp
index e4c9ed0..2d8db52 100644
--- a/src/valarray.cpp
+++ b/src/valarray.cpp
@@ -7,8 +7,6 @@
//
//===----------------------------------------------------------------------===//
-#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
-
#include "valarray"
_LIBCPP_BEGIN_NAMESPACE_STD
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 4810b2c..7236dec 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -14,7 +14,7 @@
set(LIT_EXECUTABLE "${CMAKE_SOURCE_DIR}/utils/lit/lit.py")
endif()
- set(LIT_ARGS_DEFAULT "-sv")
+ set(LIT_ARGS_DEFAULT "-sv --show-unsupported --show-xfail")
if (MSVC OR XCODE)
set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
endif()
@@ -28,7 +28,6 @@
set(LIBCXX_BINARY_DIR ${CMAKE_BINARY_DIR})
set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
pythonize_bool(LIBCXX_ENABLE_SHARED)
- pythonize_bool(LIBCXX_HAS_STDCXX0X_FLAG)
set(AUTO_GEN_COMMENT "## Autogenerated by libcxx configuration.\n# Do not edit!")
diff --git a/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp b/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp
index fe67854..0cf06bb 100644
--- a/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp
+++ b/test/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp
@@ -28,31 +28,26 @@
int ia[] = {0, 1, 2, 2, 0, 1, 2, 3};
const unsigned sa = sizeof(ia)/sizeof(ia[0]);
int ib[] = {0, 1, 2, 3, 0, 1, 2, 3};
- assert(std::mismatch(input_iterator<const int*>(ia),
- input_iterator<const int*>(ia + sa),
- input_iterator<const int*>(ib)) ==
- (std::pair<input_iterator<const int*>,
- input_iterator<const int*> >(
- input_iterator<const int*>(ia+3),
- input_iterator<const int*>(ib+3))));
+ const unsigned sb = sizeof(ib)/sizeof(ib[0]);
+
+ typedef input_iterator<const int*> II;
+ typedef random_access_iterator<const int*> RAI;
+
+ assert(std::mismatch(II(ia), II(ia + sa), II(ib))
+ == (std::pair<II, II>(II(ia+3), II(ib+3))));
+
+ assert(std::mismatch(RAI(ia), RAI(ia + sa), RAI(ib))
+ == (std::pair<RAI, RAI>(RAI(ia+3), RAI(ib+3))));
#ifdef HAS_FOUR_ITERATOR_VERSION
- assert(std::mismatch(input_iterator<const int*>(ia),
- input_iterator<const int*>(ia + sa),
- input_iterator<const int*>(ib),
- input_iterator<const int*>(ib + sa)) ==
- (std::pair<input_iterator<const int*>,
- input_iterator<const int*> >(
- input_iterator<const int*>(ia+3),
- input_iterator<const int*>(ib+3))));
+ assert(std::mismatch(II(ia), II(ia + sa), II(ib), II(ib+sb))
+ == (std::pair<II, II>(II(ia+3), II(ib+3))));
- assert(std::mismatch(input_iterator<const int*>(ia),
- input_iterator<const int*>(ia + sa),
- input_iterator<const int*>(ib),
- input_iterator<const int*>(ib + 2)) ==
- (std::pair<input_iterator<const int*>,
- input_iterator<const int*> >(
- input_iterator<const int*>(ia+2),
- input_iterator<const int*>(ib+2))));
+ assert(std::mismatch(RAI(ia), RAI(ia + sa), RAI(ib), RAI(ib+sb))
+ == (std::pair<RAI, RAI>(RAI(ia+3), RAI(ib+3))));
+
+
+ assert(std::mismatch(II(ia), II(ia + sa), II(ib), II(ib+2))
+ == (std::pair<II, II>(II(ia+2), II(ib+2))));
#endif
}
diff --git a/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp b/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp
index 202a1b7..ce0326c 100644
--- a/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp
+++ b/test/algorithms/alg.nonmodifying/mismatch/mismatch_pred.pass.cpp
@@ -20,43 +20,52 @@
#include <cassert>
#include "test_iterators.h"
+#include "counting_predicates.hpp"
#if _LIBCPP_STD_VER > 11
#define HAS_FOUR_ITERATOR_VERSION
#endif
-
int main()
{
int ia[] = {0, 1, 2, 2, 0, 1, 2, 3};
const unsigned sa = sizeof(ia)/sizeof(ia[0]);
int ib[] = {0, 1, 2, 3, 0, 1, 2, 3};
- assert(std::mismatch(input_iterator<const int*>(ia),
- input_iterator<const int*>(ia + sa),
- input_iterator<const int*>(ib),
- std::equal_to<int>()) ==
- (std::pair<input_iterator<const int*>,
- input_iterator<const int*> >(
- input_iterator<const int*>(ia+3),
- input_iterator<const int*>(ib+3))));
+ const unsigned sb = sizeof(ib)/sizeof(ib[0]);
+
+ typedef input_iterator<const int*> II;
+ typedef random_access_iterator<const int*> RAI;
+ typedef std::equal_to<int> EQ;
+
+ assert(std::mismatch(II(ia), II(ia + sa), II(ib), EQ())
+ == (std::pair<II, II>(II(ia+3), II(ib+3))));
+ assert(std::mismatch(RAI(ia), RAI(ia + sa), RAI(ib), EQ())
+ == (std::pair<RAI, RAI>(RAI(ia+3), RAI(ib+3))));
+
+ binary_counting_predicate<EQ, int> bcp((EQ()));
+ assert(std::mismatch(RAI(ia), RAI(ia + sa), RAI(ib), std::ref(bcp))
+ == (std::pair<RAI, RAI>(RAI(ia+3), RAI(ib+3))));
+ assert(bcp.count() > 0 && bcp.count() < sa);
+ bcp.reset();
+
#ifdef HAS_FOUR_ITERATOR_VERSION
- assert(std::mismatch(input_iterator<const int*>(ia),
- input_iterator<const int*>(ia + sa),
- input_iterator<const int*>(ib),
- input_iterator<const int*>(ib + sa),
- std::equal_to<int>()) ==
- (std::pair<input_iterator<const int*>,
- input_iterator<const int*> >(
- input_iterator<const int*>(ia+3),
- input_iterator<const int*>(ib+3))));
+ assert(std::mismatch(II(ia), II(ia + sa), II(ib), II(ib + sb), EQ())
+ == (std::pair<II, II>(II(ia+3), II(ib+3))));
+ assert(std::mismatch(RAI(ia), RAI(ia + sa), RAI(ib), RAI(ib + sb), EQ())
+ == (std::pair<RAI, RAI>(RAI(ia+3), RAI(ib+3))));
+
+ assert(std::mismatch(II(ia), II(ia + sa), II(ib), II(ib + sb), std::ref(bcp))
+ == (std::pair<II, II>(II(ia+3), II(ib+3))));
+ assert(bcp.count() > 0 && bcp.count() < std::min(sa, sb));
#endif
- assert(std::mismatch(ia, ia + sa, ib, std::equal_to<int>()) ==
+ assert(std::mismatch(ia, ia + sa, ib, EQ()) ==
(std::pair<int*,int*>(ia+3,ib+3)));
+
#ifdef HAS_FOUR_ITERATOR_VERSION
- assert(std::mismatch(ia, ia + sa, ib, ib + sa, std::equal_to<int>()) ==
+ assert(std::mismatch(ia, ia + sa, ib, ib + sb, EQ()) ==
(std::pair<int*,int*>(ia+3,ib+3)));
- assert(std::mismatch(ia, ia + sa, ib, ib + 2, std::equal_to<int>()) ==
+ assert(std::mismatch(ia, ia + sa, ib, ib + 2, EQ()) ==
(std::pair<int*,int*>(ia+2,ib+2)));
#endif
}
diff --git a/test/atomics/atomics.fences/atomic_signal_fence.pass.cpp b/test/atomics/atomics.fences/atomic_signal_fence.pass.cpp
index 65e1d38..aec060c 100644
--- a/test/atomics/atomics.fences/atomic_signal_fence.pass.cpp
+++ b/test/atomics/atomics.fences/atomic_signal_fence.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.fences/atomic_thread_fence.pass.cpp b/test/atomics/atomics.fences/atomic_thread_fence.pass.cpp
index 8c2abc0..4f3b0e3 100644
--- a/test/atomics/atomics.fences/atomic_thread_fence.pass.cpp
+++ b/test/atomics/atomics.fences/atomic_thread_fence.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.flag/atomic_flag_clear.pass.cpp b/test/atomics/atomics.flag/atomic_flag_clear.pass.cpp
index 12be67c..64093d6 100644
--- a/test/atomics/atomics.flag/atomic_flag_clear.pass.cpp
+++ b/test/atomics/atomics.flag/atomic_flag_clear.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp b/test/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp
index f1065dc..e1a9349 100644
--- a/test/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp
+++ b/test/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.flag/atomic_flag_test_and_set.pass.cpp b/test/atomics/atomics.flag/atomic_flag_test_and_set.pass.cpp
index e3934d8..ae82df9 100644
--- a/test/atomics/atomics.flag/atomic_flag_test_and_set.pass.cpp
+++ b/test/atomics/atomics.flag/atomic_flag_test_and_set.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.flag/atomic_flag_test_and_set_explicit.pass.cpp b/test/atomics/atomics.flag/atomic_flag_test_and_set_explicit.pass.cpp
index 83ee78d..1548506 100644
--- a/test/atomics/atomics.flag/atomic_flag_test_and_set_explicit.pass.cpp
+++ b/test/atomics/atomics.flag/atomic_flag_test_and_set_explicit.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.flag/clear.pass.cpp b/test/atomics/atomics.flag/clear.pass.cpp
index 171f038..65051af 100644
--- a/test/atomics/atomics.flag/clear.pass.cpp
+++ b/test/atomics/atomics.flag/clear.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.flag/default.pass.cpp b/test/atomics/atomics.flag/default.pass.cpp
index 5c077b0..45f5e70 100644
--- a/test/atomics/atomics.flag/default.pass.cpp
+++ b/test/atomics/atomics.flag/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.flag/init.pass.cpp b/test/atomics/atomics.flag/init.pass.cpp
index 8a67e14..c90509d 100644
--- a/test/atomics/atomics.flag/init.pass.cpp
+++ b/test/atomics/atomics.flag/init.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.flag/test_and_set.pass.cpp b/test/atomics/atomics.flag/test_and_set.pass.cpp
index 2405275..210ba20 100644
--- a/test/atomics/atomics.flag/test_and_set.pass.cpp
+++ b/test/atomics/atomics.flag/test_and_set.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.lockfree/lockfree.pass.cpp b/test/atomics/atomics.lockfree/lockfree.pass.cpp
index 467f561..a975a69 100644
--- a/test/atomics/atomics.lockfree/lockfree.pass.cpp
+++ b/test/atomics/atomics.lockfree/lockfree.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.order/kill_dependency.pass.cpp b/test/atomics/atomics.order/kill_dependency.pass.cpp
index 1beeb08..0f0bafc 100644
--- a/test/atomics/atomics.order/kill_dependency.pass.cpp
+++ b/test/atomics/atomics.order/kill_dependency.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.order/memory_order.pass.cpp b/test/atomics/atomics.order/memory_order.pass.cpp
index 8289304..e734a4c 100644
--- a/test/atomics/atomics.order/memory_order.pass.cpp
+++ b/test/atomics/atomics.order/memory_order.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.types.generic/address.pass.cpp b/test/atomics/atomics.types.generic/address.pass.cpp
index af9826f..3b9f3ce 100644
--- a/test/atomics/atomics.types.generic/address.pass.cpp
+++ b/test/atomics/atomics.types.generic/address.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... test case crashes clang.
// <atomic>
@@ -70,6 +73,8 @@
#include <type_traits>
#include <cassert>
+#include <cmpxchg_loop.h>
+
template <class A, class T>
void
do_test()
@@ -93,7 +98,7 @@
assert(obj.exchange(T(3), std::memory_order_relaxed) == T(2));
assert(obj == T(3));
T x = obj;
- assert(obj.compare_exchange_weak(x, T(2)) == true);
+ assert(cmpxchg_weak_loop(obj, x, T(2)) == true);
assert(obj == T(2));
assert(x == T(3));
assert(obj.compare_exchange_weak(x, T(1)) == false);
diff --git a/test/atomics/atomics.types.generic/bool.pass.cpp b/test/atomics/atomics.types.generic/bool.pass.cpp
index 80e5665..dd851e8 100644
--- a/test/atomics/atomics.types.generic/bool.pass.cpp
+++ b/test/atomics/atomics.types.generic/bool.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
@@ -53,6 +55,8 @@
#include <new>
#include <cassert>
+#include <cmpxchg_loop.h>
+
int main()
{
{
@@ -64,6 +68,7 @@
std::atomic_init(&obj, true);
assert(obj == true);
bool b0 = obj.is_lock_free();
+ (void)b0; // to placate scan-build
obj.store(false);
assert(obj == false);
obj.store(true, std::memory_order_release);
@@ -75,7 +80,7 @@
assert(obj.exchange(true, std::memory_order_relaxed) == false);
assert(obj == true);
bool x = obj;
- assert(obj.compare_exchange_weak(x, false) == true);
+ assert(cmpxchg_weak_loop(obj, x, false) == true);
assert(obj == false);
assert(x == true);
assert(obj.compare_exchange_weak(x, true,
@@ -84,9 +89,9 @@
assert(x == false);
obj.store(true);
x = true;
- assert(obj.compare_exchange_weak(x, false,
- std::memory_order_seq_cst,
- std::memory_order_seq_cst) == true);
+ assert(cmpxchg_weak_loop(obj, x, false,
+ std::memory_order_seq_cst,
+ std::memory_order_seq_cst) == true);
assert(obj == false);
assert(x == true);
x = true;
@@ -119,6 +124,7 @@
std::atomic_init(&obj, true);
assert(obj == true);
bool b0 = obj.is_lock_free();
+ (void)b0; // to placate scan-build
obj.store(false);
assert(obj == false);
obj.store(true, std::memory_order_release);
@@ -130,7 +136,7 @@
assert(obj.exchange(true, std::memory_order_relaxed) == false);
assert(obj == true);
bool x = obj;
- assert(obj.compare_exchange_weak(x, false) == true);
+ assert(cmpxchg_weak_loop(obj, x, false) == true);
assert(obj == false);
assert(x == true);
assert(obj.compare_exchange_weak(x, true,
@@ -139,9 +145,9 @@
assert(x == false);
obj.store(true);
x = true;
- assert(obj.compare_exchange_weak(x, false,
- std::memory_order_seq_cst,
- std::memory_order_seq_cst) == true);
+ assert(cmpxchg_weak_loop(obj, x, false,
+ std::memory_order_seq_cst,
+ std::memory_order_seq_cst) == true);
assert(obj == false);
assert(x == true);
x = true;
@@ -174,6 +180,7 @@
std::atomic_init(&obj, true);
assert(obj == true);
bool b0 = obj.is_lock_free();
+ (void)b0; // to placate scan-build
obj.store(false);
assert(obj == false);
obj.store(true, std::memory_order_release);
@@ -185,7 +192,7 @@
assert(obj.exchange(true, std::memory_order_relaxed) == false);
assert(obj == true);
bool x = obj;
- assert(obj.compare_exchange_weak(x, false) == true);
+ assert(cmpxchg_weak_loop(obj, x, false) == true);
assert(obj == false);
assert(x == true);
assert(obj.compare_exchange_weak(x, true,
@@ -194,9 +201,9 @@
assert(x == false);
obj.store(true);
x = true;
- assert(obj.compare_exchange_weak(x, false,
- std::memory_order_seq_cst,
- std::memory_order_seq_cst) == true);
+ assert(cmpxchg_weak_loop(obj, x, false,
+ std::memory_order_seq_cst,
+ std::memory_order_seq_cst) == true);
assert(obj == false);
assert(x == true);
x = true;
diff --git a/test/atomics/atomics.types.generic/cstdint_typedefs.pass.cpp b/test/atomics/atomics.types.generic/cstdint_typedefs.pass.cpp
index eac5177..a7874b9 100644
--- a/test/atomics/atomics.types.generic/cstdint_typedefs.pass.cpp
+++ b/test/atomics/atomics.types.generic/cstdint_typedefs.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.types.generic/integral.pass.cpp b/test/atomics/atomics.types.generic/integral.pass.cpp
index 26caa50..f9c7583 100644
--- a/test/atomics/atomics.types.generic/integral.pass.cpp
+++ b/test/atomics/atomics.types.generic/integral.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
@@ -88,6 +90,8 @@
#include <new>
#include <cassert>
+#include <cmpxchg_loop.h>
+
template <class A, class T>
void
do_test()
@@ -110,7 +114,7 @@
assert(obj.exchange(T(3), std::memory_order_relaxed) == T(2));
assert(obj == T(3));
T x = obj;
- assert(obj.compare_exchange_weak(x, T(2)) == true);
+ assert(cmpxchg_weak_loop(obj, x, T(2)) == true);
assert(obj == T(2));
assert(x == T(3));
assert(obj.compare_exchange_weak(x, T(1)) == false);
diff --git a/test/atomics/atomics.types.generic/integral_typedefs.pass.cpp b/test/atomics/atomics.types.generic/integral_typedefs.pass.cpp
index c622d6e..e8fae85 100644
--- a/test/atomics/atomics.types.generic/integral_typedefs.pass.cpp
+++ b/test/atomics/atomics.types.generic/integral_typedefs.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.types.generic/trivially_copyable.fail.cpp b/test/atomics/atomics.types.generic/trivially_copyable.fail.cpp
index 49ec069..f2bf4db 100644
--- a/test/atomics/atomics.types.generic/trivially_copyable.fail.cpp
+++ b/test/atomics/atomics.types.generic/trivially_copyable.fail.cpp
@@ -54,17 +54,17 @@
#include <chrono> // for nanoseconds
struct NotTriviallyCopyable {
- NotTriviallyCopyable ( int i ) : i_(i) {}
- NotTriviallyCopyable ( const NotTriviallyCopyable &rhs) : i_(rhs.i_) {}
- int i_;
- };
+ NotTriviallyCopyable ( int i ) : i_(i) {}
+ NotTriviallyCopyable ( const NotTriviallyCopyable &rhs) : i_(rhs.i_) {}
+ int i_;
+ };
template <class T>
void test ( T t ) {
- std::atomic<T> t0(t);
- }
+ std::atomic<T> t0(t);
+ }
int main()
{
- test(NotTriviallyCopyable(42));
+ test(NotTriviallyCopyable(42));
}
diff --git a/test/atomics/atomics.types.generic/trivially_copyable.pass.cpp b/test/atomics/atomics.types.generic/trivially_copyable.pass.cpp
index 8cdd087..e6e9bcc 100644
--- a/test/atomics/atomics.types.generic/trivially_copyable.pass.cpp
+++ b/test/atomics/atomics.types.generic/trivially_copyable.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
@@ -54,18 +56,18 @@
#include <chrono> // for nanoseconds
struct TriviallyCopyable {
- TriviallyCopyable ( int i ) : i_(i) {}
- int i_;
- };
+ TriviallyCopyable ( int i ) : i_(i) {}
+ int i_;
+ };
template <class T>
void test ( T t ) {
- std::atomic<T> t0(t);
- }
+ std::atomic<T> t0(t);
+ }
int main()
{
- test(TriviallyCopyable(42));
- test(std::this_thread::get_id());
- test(std::chrono::nanoseconds(2));
+ test(TriviallyCopyable(42));
+ test(std::this_thread::get_id());
+ test(std::chrono::nanoseconds(2));
}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong.pass.cpp
index fd5102b..f1cc993 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... assertion fails line 34
// <atomic>
@@ -55,7 +58,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit.pass.cpp
index f2610a3..f667ab7 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... assertion fails line 38
// <atomic>
@@ -62,7 +65,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak.pass.cpp
index a3f95a4..175c445 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... assertion fails line 34
// <atomic>
@@ -21,6 +24,8 @@
#include <type_traits>
#include <cassert>
+#include <cmpxchg_loop.h>
+
template <class T>
void
test()
@@ -30,7 +35,7 @@
A a;
T t(T(1));
std::atomic_init(&a, t);
- assert(std::atomic_compare_exchange_weak(&a, &t, T(2)) == true);
+ assert(c_cmpxchg_weak_loop(&a, &t, T(2)) == true);
assert(a == T(2));
assert(t == T(1));
assert(std::atomic_compare_exchange_weak(&a, &t, T(3)) == false);
@@ -42,7 +47,7 @@
volatile A a;
T t(T(1));
std::atomic_init(&a, t);
- assert(std::atomic_compare_exchange_weak(&a, &t, T(2)) == true);
+ assert(c_cmpxchg_weak_loop(&a, &t, T(2)) == true);
assert(a == T(2));
assert(t == T(1));
assert(std::atomic_compare_exchange_weak(&a, &t, T(3)) == false);
@@ -55,7 +60,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit.pass.cpp
index 2f3e996..46f80bf 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... assertion fails line 38
// <atomic>
@@ -24,6 +27,8 @@
#include <type_traits>
#include <cassert>
+#include <cmpxchg_loop.h>
+
template <class T>
void
test()
@@ -33,7 +38,7 @@
A a;
T t(T(1));
std::atomic_init(&a, t);
- assert(std::atomic_compare_exchange_weak_explicit(&a, &t, T(2),
+ assert(c_cmpxchg_weak_loop(&a, &t, T(2),
std::memory_order_seq_cst, std::memory_order_seq_cst) == true);
assert(a == T(2));
assert(t == T(1));
@@ -47,7 +52,7 @@
volatile A a;
T t(T(1));
std::atomic_init(&a, t);
- assert(std::atomic_compare_exchange_weak_explicit(&a, &t, T(2),
+ assert(c_cmpxchg_weak_loop(&a, &t, T(2),
std::memory_order_seq_cst, std::memory_order_seq_cst) == true);
assert(a == T(2));
assert(t == T(1));
@@ -62,7 +67,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange.pass.cpp
index 4264943..525e74a 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... fails assertion line 31
// <atomic>
@@ -40,7 +43,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit.pass.cpp
index 0f3add5..9fe4ac8 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... assertion fails line 32
// <atomic>
@@ -42,7 +45,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add.pass.cpp
index 9ce60ad..3408def 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... test crashes clang
// <atomic>
@@ -75,7 +78,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
A(const A& a) : i(a.i) {}
A(const volatile A& a) : i(a.i) {}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp
index a2a1a44..9977bd4 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... test crashes clang
// <atomic>
@@ -79,7 +82,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
A(const A& a) : i(a.i) {}
A(const volatile A& a) : i(a.i) {}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and.pass.cpp
index 01d2cc6..4c7c043 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and_explicit.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and_explicit.pass.cpp
index abfb83d..d83bbf2 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and_explicit.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and_explicit.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or.pass.cpp
index 43b6c4f..acf6d43 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or_explicit.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or_explicit.pass.cpp
index 21078bb..72685e4 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or_explicit.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or_explicit.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub.pass.cpp
index d33b81e..ed8b541 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... test crashes clang
// <atomic>
@@ -75,7 +78,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
A(const A& a) : i(a.i) {}
A(const volatile A& a) : i(a.i) {}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit.pass.cpp
index 886a65f..e6c92ea 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... test crashes clang
// <atomic>
@@ -80,7 +83,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
A(const A& a) : i(a.i) {}
A(const volatile A& a) : i(a.i) {}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor.pass.cpp
index 78120a7..fc6b97b 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor_explicit.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor_explicit.pass.cpp
index 0a0cd15..58772aa 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor_explicit.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor_explicit.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_init.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_init.pass.cpp
index f0d9a24..137b6f6 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_init.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_init.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... assertion fails line 34
// <atomic>
@@ -38,7 +41,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_is_lock_free.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_is_lock_free.pass.cpp
index 4071989..18a1605 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_is_lock_free.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_is_lock_free.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load.pass.cpp
index b239886..66918c7 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... assertion fails line 34
// <atomic>
@@ -38,7 +41,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit.pass.cpp
index 3072dd5..5f402a9 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... assertion fails line 31
// <atomic>
@@ -38,7 +41,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store.pass.cpp
index f9044bf..2b9582b 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... assertion fails line 31
// <atomic>
@@ -38,7 +41,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit.pass.cpp
index 18038ae..8fe0c7d 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit.pass.cpp
@@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+// ... assertion fails line 31
// <atomic>
@@ -38,7 +41,7 @@
{
int i;
- explicit A(int d = 0) : i(d) {}
+ explicit A(int d = 0) noexcept {i=d;}
friend bool operator==(const A& x, const A& y)
{return x.i == y.i;}
diff --git a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init.pass.cpp b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init.pass.cpp
index 6758c7b..5fed691 100644
--- a/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init.pass.cpp
+++ b/test/atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/atomics/libcpp-has-no-threads.fail.cpp b/test/atomics/libcpp-has-no-threads.fail.cpp
new file mode 100644
index 0000000..fe95e6a
--- /dev/null
+++ b/test/atomics/libcpp-has-no-threads.fail.cpp
@@ -0,0 +1,23 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <atomic>
+
+// Test that including <atomic> fails to compile when _LIBCPP_HAS_NO_THREADS
+// is defined.
+
+#ifndef _LIBCPP_HAS_NO_THREADS
+#define _LIBCPP_HAS_NO_THREADS
+#endif
+
+#include <atomic>
+
+int main()
+{
+}
diff --git a/test/atomics/libcpp-has-no-threads.pass.cpp b/test/atomics/libcpp-has-no-threads.pass.cpp
new file mode 100644
index 0000000..9c0cccb
--- /dev/null
+++ b/test/atomics/libcpp-has-no-threads.pass.cpp
@@ -0,0 +1,18 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// XFAIL: libcpp-has-no-threads
+
+#ifdef _LIBCPP_HAS_NO_THREADS
+#error This should be XFAIL'd for the purpose of detecting that the LIT feature\
+ 'libcpp-has-no-threads' is available iff _LIBCPP_HAS_NO_THREADS is defined
+#endif
+
+int main()
+{
+}
diff --git a/test/atomics/version.pass.cpp b/test/atomics/version.pass.cpp
index 85c4270..fae2736 100644
--- a/test/atomics/version.pass.cpp
+++ b/test/atomics/version.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <atomic>
diff --git a/test/containers/associative/map/map.ops/count.pass.cpp b/test/containers/associative/map/map.ops/count.pass.cpp
index 6628e3d..9668055 100644
--- a/test/containers/associative/map/map.ops/count.pass.cpp
+++ b/test/containers/associative/map/map.ops/count.pass.cpp
@@ -17,6 +17,7 @@
#include <cassert>
#include "min_allocator.h"
+#include "private_constructor.hpp"
int main()
{
@@ -96,4 +97,77 @@
}
}
#endif
+#if _LIBCPP_STD_VER > 11
+ {
+ typedef std::pair<const int, double> V;
+ typedef std::map<int, double, std::less <>> M;
+ typedef M::size_type R;
+
+ V ar[] =
+ {
+ V(5, 5),
+ V(6, 6),
+ V(7, 7),
+ V(8, 8),
+ V(9, 9),
+ V(10, 10),
+ V(11, 11),
+ V(12, 12)
+ };
+ const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
+ R r = m.count(5);
+ assert(r == 1);
+ r = m.count(6);
+ assert(r == 1);
+ r = m.count(7);
+ assert(r == 1);
+ r = m.count(8);
+ assert(r == 1);
+ r = m.count(9);
+ assert(r == 1);
+ r = m.count(10);
+ assert(r == 1);
+ r = m.count(11);
+ assert(r == 1);
+ r = m.count(12);
+ assert(r == 1);
+ r = m.count(4);
+ assert(r == 0);
+ }
+
+ {
+ typedef PrivateConstructor PC;
+ typedef std::map<PC, double, std::less<>> M;
+ typedef M::size_type R;
+
+ M m;
+ m [ PC::make(5) ] = 5;
+ m [ PC::make(6) ] = 6;
+ m [ PC::make(7) ] = 7;
+ m [ PC::make(8) ] = 8;
+ m [ PC::make(9) ] = 9;
+ m [ PC::make(10) ] = 10;
+ m [ PC::make(11) ] = 11;
+ m [ PC::make(12) ] = 12;
+
+ R r = m.count(5);
+ assert(r == 1);
+ r = m.count(6);
+ assert(r == 1);
+ r = m.count(7);
+ assert(r == 1);
+ r = m.count(8);
+ assert(r == 1);
+ r = m.count(9);
+ assert(r == 1);
+ r = m.count(10);
+ assert(r == 1);
+ r = m.count(11);
+ assert(r == 1);
+ r = m.count(12);
+ assert(r == 1);
+ r = m.count(4);
+ assert(r == 0);
+ }
+#endif
}
diff --git a/test/containers/associative/multimap/multimap.modifiers/erase_key.pass.cpp b/test/containers/associative/multimap/multimap.modifiers/erase_key.pass.cpp
index ebae10e..33821d3 100644
--- a/test/containers/associative/multimap/multimap.modifiers/erase_key.pass.cpp
+++ b/test/containers/associative/multimap/multimap.modifiers/erase_key.pass.cpp
@@ -71,6 +71,7 @@
assert(next(m.begin(), 5)->second == 2);
i = m.erase(3);
+ assert(i == 3);
assert(m.size() == 3);
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1);
@@ -135,6 +136,7 @@
assert(next(m.begin(), 5)->second == 2);
i = m.erase(3);
+ assert(i == 3);
assert(m.size() == 3);
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1);
diff --git a/test/containers/associative/multimap/multimap.ops/count.pass.cpp b/test/containers/associative/multimap/multimap.ops/count.pass.cpp
index 34c0413..2f172d1 100644
--- a/test/containers/associative/multimap/multimap.ops/count.pass.cpp
+++ b/test/containers/associative/multimap/multimap.ops/count.pass.cpp
@@ -17,6 +17,7 @@
#include <cassert>
#include "min_allocator.h"
+#include "private_constructor.hpp"
int main()
{
@@ -89,4 +90,70 @@
}
}
#endif
+
+#if _LIBCPP_STD_VER > 11
+ {
+ typedef std::multimap<int, double, std::less<>> M;
+ typedef M::size_type R;
+ V ar[] =
+ {
+ V(5, 1),
+ V(5, 2),
+ V(5, 3),
+ V(7, 1),
+ V(7, 2),
+ V(7, 3),
+ V(9, 1),
+ V(9, 2),
+ V(9, 3)
+ };
+ const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
+ R r = m.count(4);
+ assert(r == 0);
+ r = m.count(5);
+ assert(r == 3);
+ r = m.count(6);
+ assert(r == 0);
+ r = m.count(7);
+ assert(r == 3);
+ r = m.count(8);
+ assert(r == 0);
+ r = m.count(9);
+ assert(r == 3);
+ r = m.count(10);
+ assert(r == 0);
+ }
+
+ {
+ typedef PrivateConstructor PC;
+ typedef std::multimap<PC, double, std::less<>> M;
+ typedef M::size_type R;
+
+ M m;
+ m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
+ m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
+ m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
+ m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
+ m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
+ m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
+ m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
+ m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
+ m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
+
+ R r = m.count(4);
+ assert(r == 0);
+ r = m.count(5);
+ assert(r == 3);
+ r = m.count(6);
+ assert(r == 0);
+ r = m.count(7);
+ assert(r == 3);
+ r = m.count(8);
+ assert(r == 0);
+ r = m.count(9);
+ assert(r == 3);
+ r = m.count(10);
+ assert(r == 0);
+ }
+#endif
}
diff --git a/test/containers/associative/multiset/count.pass.cpp b/test/containers/associative/multiset/count.pass.cpp
index 12af167..93bd6f8 100644
--- a/test/containers/associative/multiset/count.pass.cpp
+++ b/test/containers/associative/multiset/count.pass.cpp
@@ -17,6 +17,7 @@
#include <cassert>
#include "min_allocator.h"
+#include "private_constructor.hpp"
int main()
{
@@ -90,4 +91,70 @@
}
}
#endif
+#if _LIBCPP_STD_VER > 11
+ {
+ typedef int V;
+ typedef std::multiset<int, std::less<>> M;
+ typedef M::size_type R;
+ V ar[] =
+ {
+ 5,
+ 5,
+ 5,
+ 5,
+ 7,
+ 7,
+ 7,
+ 9,
+ 9
+ };
+ const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
+ R r = m.count(4);
+ assert(r == 0);
+ r = m.count(5);
+ assert(r == 4);
+ r = m.count(6);
+ assert(r == 0);
+ r = m.count(7);
+ assert(r == 3);
+ r = m.count(8);
+ assert(r == 0);
+ r = m.count(9);
+ assert(r == 2);
+ r = m.count(10);
+ assert(r == 0);
+ }
+
+ {
+ typedef PrivateConstructor V;
+ typedef std::multiset<V, std::less<>> M;
+ typedef M::size_type R;
+
+ M m;
+ m.insert ( V::make ( 5 ));
+ m.insert ( V::make ( 5 ));
+ m.insert ( V::make ( 5 ));
+ m.insert ( V::make ( 5 ));
+ m.insert ( V::make ( 7 ));
+ m.insert ( V::make ( 7 ));
+ m.insert ( V::make ( 7 ));
+ m.insert ( V::make ( 9 ));
+ m.insert ( V::make ( 9 ));
+
+ R r = m.count(4);
+ assert(r == 0);
+ r = m.count(5);
+ assert(r == 4);
+ r = m.count(6);
+ assert(r == 0);
+ r = m.count(7);
+ assert(r == 3);
+ r = m.count(8);
+ assert(r == 0);
+ r = m.count(9);
+ assert(r == 2);
+ r = m.count(10);
+ assert(r == 0);
+ }
+#endif
}
diff --git a/test/containers/associative/set/count.pass.cpp b/test/containers/associative/set/count.pass.cpp
index a2dc177..32fe0b8 100644
--- a/test/containers/associative/set/count.pass.cpp
+++ b/test/containers/associative/set/count.pass.cpp
@@ -17,6 +17,7 @@
#include <cassert>
#include "min_allocator.h"
+#include "private_constructor.hpp"
int main()
{
@@ -92,4 +93,76 @@
assert(r == 0);
}
#endif
+#if _LIBCPP_STD_VER > 11
+ {
+ typedef int V;
+ typedef std::set<int, std::less<>> M;
+ typedef M::size_type R;
+ V ar[] =
+ {
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12
+ };
+ const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
+ R r = m.count(5);
+ assert(r == 1);
+ r = m.count(6);
+ assert(r == 1);
+ r = m.count(7);
+ assert(r == 1);
+ r = m.count(8);
+ assert(r == 1);
+ r = m.count(9);
+ assert(r == 1);
+ r = m.count(10);
+ assert(r == 1);
+ r = m.count(11);
+ assert(r == 1);
+ r = m.count(12);
+ assert(r == 1);
+ r = m.count(4);
+ assert(r == 0);
+ }
+ {
+ typedef PrivateConstructor V;
+ typedef std::set<V, std::less<>> M;
+ typedef M::size_type R;
+
+ M m;
+ m.insert ( V::make ( 5 ));
+ m.insert ( V::make ( 6 ));
+ m.insert ( V::make ( 7 ));
+ m.insert ( V::make ( 8 ));
+ m.insert ( V::make ( 9 ));
+ m.insert ( V::make ( 10 ));
+ m.insert ( V::make ( 11 ));
+ m.insert ( V::make ( 12 ));
+
+ R r = m.count(5);
+ assert(r == 1);
+ r = m.count(6);
+ assert(r == 1);
+ r = m.count(7);
+ assert(r == 1);
+ r = m.count(8);
+ assert(r == 1);
+ r = m.count(9);
+ assert(r == 1);
+ r = m.count(10);
+ assert(r == 1);
+ r = m.count(11);
+ assert(r == 1);
+ r = m.count(12);
+ assert(r == 1);
+ r = m.count(4);
+ assert(r == 0);
+ }
+#endif
+
}
diff --git a/test/containers/sequences/array/array.data/data.pass.cpp b/test/containers/sequences/array/array.data/data.pass.cpp
index ea91357..08e4fd3 100644
--- a/test/containers/sequences/array/array.data/data.pass.cpp
+++ b/test/containers/sequences/array/array.data/data.pass.cpp
@@ -30,5 +30,6 @@
typedef std::array<T, 0> C;
C c = {};
T* p = c.data();
+ (void)p; // to placate scan-build
}
}
diff --git a/test/containers/sequences/array/array.data/data_const.pass.cpp b/test/containers/sequences/array/array.data/data_const.pass.cpp
index 93acb71..8eb9762 100644
--- a/test/containers/sequences/array/array.data/data_const.pass.cpp
+++ b/test/containers/sequences/array/array.data/data_const.pass.cpp
@@ -30,5 +30,6 @@
typedef std::array<T, 0> C;
const C c = {};
const T* p = c.data();
+ (void)p; // to placate scan-build
}
}
diff --git a/test/containers/sequences/forwardlist/forwardlist.cons/assign_range.pass.cpp b/test/containers/sequences/forwardlist/forwardlist.cons/assign_range.pass.cpp
index fb3765d..0b348e6 100644
--- a/test/containers/sequences/forwardlist/forwardlist.cons/assign_range.pass.cpp
+++ b/test/containers/sequences/forwardlist/forwardlist.cons/assign_range.pass.cpp
@@ -70,7 +70,7 @@
typedef input_iterator<const T*> I;
c.assign(I(std::begin(t0)), I(std::end(t0)));
int n = 0;
- for (C::const_iterator i = c.cbegin(); i != c.cend(); ++i, ++n)
+ for (C::const_iterator i = c.cbegin(); i != c.cend(); ++i, (void) ++n)
assert(*i == 10+n);
assert(n == 4);
}
diff --git a/test/containers/sequences/forwardlist/forwardlist.ops/remove.pass.cpp b/test/containers/sequences/forwardlist/forwardlist.ops/remove.pass.cpp
index ae381e6..18d4cae 100644
--- a/test/containers/sequences/forwardlist/forwardlist.ops/remove.pass.cpp
+++ b/test/containers/sequences/forwardlist/forwardlist.ops/remove.pass.cpp
@@ -18,14 +18,14 @@
#include "min_allocator.h"
struct S {
- S(int i) : i_(new int(i)) {}
- S(const S &rhs) : i_(new int(*rhs.i_)) {}
- S& operator = (const S &rhs) { *i_ = *rhs.i_; return *this; }
- ~S () { delete i_; i_ = NULL; }
- bool operator == (const S &rhs) const { return *i_ == *rhs.i_; }
- int get () const { return *i_; }
- int *i_;
- };
+ S(int i) : i_(new int(i)) {}
+ S(const S &rhs) : i_(new int(*rhs.i_)) {}
+ S& operator = (const S &rhs) { *i_ = *rhs.i_; return *this; }
+ ~S () { delete i_; i_ = NULL; }
+ bool operator == (const S &rhs) const { return *i_ == *rhs.i_; }
+ int get () const { return *i_; }
+ int *i_;
+ };
int main()
@@ -98,10 +98,10 @@
c.remove(c.front());
C::const_iterator it = c.begin();
for(int *ip = std::begin(t2); ip != std::end(t2); ++ip, ++it) {
- assert ( it != c.end());
+ assert ( it != c.end());
assert ( *ip == it->get());
- }
- assert ( it == c.end ());
+ }
+ assert ( it == c.end ());
}
#if __cplusplus >= 201103L
{
diff --git a/test/containers/sequences/list/list.modifiers/insert_iter_iter_iter.pass.cpp b/test/containers/sequences/list/list.modifiers/insert_iter_iter_iter.pass.cpp
index 625004b..d69deac 100644
--- a/test/containers/sequences/list/list.modifiers/insert_iter_iter_iter.pass.cpp
+++ b/test/containers/sequences/list/list.modifiers/insert_iter_iter_iter.pass.cpp
@@ -12,6 +12,8 @@
// template <InputIterator Iter>
// iterator insert(const_iterator position, Iter first, Iter last);
+// UNSUPPORTED: asan, msan
+
#if _LIBCPP_DEBUG >= 1
#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
#endif
diff --git a/test/containers/sequences/list/list.modifiers/insert_iter_size_value.pass.cpp b/test/containers/sequences/list/list.modifiers/insert_iter_size_value.pass.cpp
index ce2d386..a552e1f 100644
--- a/test/containers/sequences/list/list.modifiers/insert_iter_size_value.pass.cpp
+++ b/test/containers/sequences/list/list.modifiers/insert_iter_size_value.pass.cpp
@@ -11,6 +11,8 @@
// iterator insert(const_iterator position, size_type n, const value_type& x);
+// UNSUPPORTED: asan, msan
+
#if _LIBCPP_DEBUG >= 1
#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
#endif
diff --git a/test/containers/sequences/list/list.modifiers/insert_iter_value.pass.cpp b/test/containers/sequences/list/list.modifiers/insert_iter_value.pass.cpp
index 1b097e3..093ad42 100644
--- a/test/containers/sequences/list/list.modifiers/insert_iter_value.pass.cpp
+++ b/test/containers/sequences/list/list.modifiers/insert_iter_value.pass.cpp
@@ -11,6 +11,8 @@
// iterator insert(const_iterator position, const value_type& x);
+// UNSUPPORTED: asan, msan
+
#if _LIBCPP_DEBUG >= 1
#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
#endif
diff --git a/test/containers/sequences/list/list.ops/remove.pass.cpp b/test/containers/sequences/list/list.ops/remove.pass.cpp
index 106c052..f580c94 100644
--- a/test/containers/sequences/list/list.ops/remove.pass.cpp
+++ b/test/containers/sequences/list/list.ops/remove.pass.cpp
@@ -17,14 +17,14 @@
#include "min_allocator.h"
struct S {
- S(int i) : i_(new int(i)) {}
- S(const S &rhs) : i_(new int(*rhs.i_)) {}
- S& operator = (const S &rhs) { *i_ = *rhs.i_; return *this; }
- ~S () { delete i_; i_ = NULL; }
- bool operator == (const S &rhs) const { return *i_ == *rhs.i_; }
- int get () const { return *i_; }
- int *i_;
- };
+ S(int i) : i_(new int(i)) {}
+ S(const S &rhs) : i_(new int(*rhs.i_)) {}
+ S& operator = (const S &rhs) { *i_ = *rhs.i_; return *this; }
+ ~S () { delete i_; i_ = NULL; }
+ bool operator == (const S &rhs) const { return *i_ == *rhs.i_; }
+ int get () const { return *i_; }
+ int *i_;
+ };
int main()
@@ -52,10 +52,10 @@
c.remove(c.front());
std::list<S>::const_iterator it = c.begin();
for(int *ip = a2; ip < a2+5; ++ip, ++it) {
- assert ( it != c.end());
+ assert ( it != c.end());
assert ( *ip == it->get());
- }
- assert ( it == c.end ());
+ }
+ assert ( it == c.end ());
}
#if __cplusplus >= 201103L
{
diff --git a/test/containers/sequences/vector.bool/insert_iter_iter_iter.pass.cpp b/test/containers/sequences/vector.bool/insert_iter_iter_iter.pass.cpp
index c49ef9b..e51f8b5 100644
--- a/test/containers/sequences/vector.bool/insert_iter_iter_iter.pass.cpp
+++ b/test/containers/sequences/vector.bool/insert_iter_iter_iter.pass.cpp
@@ -33,7 +33,7 @@
assert(v[j] == 0);
for (int k = 0; k < N; ++j, ++k)
assert(v[j] == a[k]);
- for (; j < 105; ++j)
+ for (; j < v.size(); ++j)
assert(v[j] == 0);
}
{
@@ -52,6 +52,43 @@
for (; j < 105; ++j)
assert(v[j] == 0);
}
+ {
+ std::vector<bool> v(100);
+ while(v.size() < v.capacity()) v.push_back(false);
+ size_t sz = v.size();
+ bool a[] = {1, 0, 0, 1, 1};
+ const unsigned N = sizeof(a)/sizeof(a[0]);
+ std::vector<bool>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const bool*>(a),
+ forward_iterator<const bool*>(a+N));
+ assert(v.size() == sz + N);
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ for (int k = 0; k < N; ++j, ++k)
+ assert(v[j] == a[k]);
+ for (; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
+ std::vector<bool> v(100);
+ while(v.size() < v.capacity()) v.push_back(false);
+ v.pop_back(); v.pop_back(); v.pop_back();
+ size_t sz = v.size();
+ bool a[] = {1, 0, 0, 1, 1};
+ const unsigned N = sizeof(a)/sizeof(a[0]);
+ std::vector<bool>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const bool*>(a),
+ forward_iterator<const bool*>(a+N));
+ assert(v.size() == sz + N);
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ for (int k = 0; k < N; ++j, ++k)
+ assert(v[j] == a[k]);
+ for (; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
#if __cplusplus >= 201103L
{
std::vector<bool, min_allocator<bool>> v(100);
@@ -66,7 +103,7 @@
assert(v[j] == 0);
for (int k = 0; k < N; ++j, ++k)
assert(v[j] == a[k]);
- for (; j < 105; ++j)
+ for (; j < v.size(); ++j)
assert(v[j] == 0);
}
{
@@ -82,7 +119,7 @@
assert(v[j] == 0);
for (int k = 0; k < N; ++j, ++k)
assert(v[j] == a[k]);
- for (; j < 105; ++j)
+ for (; j < v.size(); ++j)
assert(v[j] == 0);
}
#endif
diff --git a/test/containers/sequences/vector.bool/insert_iter_size_value.pass.cpp b/test/containers/sequences/vector.bool/insert_iter_size_value.pass.cpp
index f9cb65c..710ad48 100644
--- a/test/containers/sequences/vector.bool/insert_iter_size_value.pass.cpp
+++ b/test/containers/sequences/vector.bool/insert_iter_size_value.pass.cpp
@@ -29,7 +29,38 @@
assert(v[j] == 0);
for (; j < 15; ++j)
assert(v[j] == 1);
- for (++j; j < 105; ++j)
+ for (++j; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
+ std::vector<bool> v(100);
+ while(v.size() < v.capacity()) v.push_back(false);
+ size_t sz = v.size();
+ std::vector<bool>::iterator i = v.insert(v.cbegin() + 10, 5, 1);
+ assert(v.size() == sz + 5);
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ for (; j < 15; ++j)
+ assert(v[j] == 1);
+ for (++j; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
+ std::vector<bool> v(100);
+ while(v.size() < v.capacity()) v.push_back(false);
+ v.pop_back(); v.pop_back();
+ size_t sz = v.size();
+ std::vector<bool>::iterator i = v.insert(v.cbegin() + 10, 5, 1);
+ assert(v.size() == sz + 5);
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ for (; j < 15; ++j)
+ assert(v[j] == 1);
+ for (++j; j < v.size(); ++j)
assert(v[j] == 0);
}
#if __cplusplus >= 201103L
@@ -43,7 +74,7 @@
assert(v[j] == 0);
for (; j < 15; ++j)
assert(v[j] == 1);
- for (++j; j < 105; ++j)
+ for (++j; j < v.size(); ++j)
assert(v[j] == 0);
}
#endif
diff --git a/test/containers/sequences/vector.bool/insert_iter_value.pass.cpp b/test/containers/sequences/vector.bool/insert_iter_value.pass.cpp
index 1213985..51c4626 100644
--- a/test/containers/sequences/vector.bool/insert_iter_value.pass.cpp
+++ b/test/containers/sequences/vector.bool/insert_iter_value.pass.cpp
@@ -28,7 +28,36 @@
for (j = 0; j < 10; ++j)
assert(v[j] == 0);
assert(v[j] == 1);
- for (++j; j < 101; ++j)
+ for (++j; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
+ std::vector<bool> v(100);
+ while(v.size() < v.capacity()) v.push_back(false);
+ size_t sz = v.size();
+ std::vector<bool>::iterator i = v.insert(v.cbegin() + 10, 1);
+ assert(v.size() == sz + 1);
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ assert(v[j] == 1);
+ for (++j; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
+ std::vector<bool> v(100);
+ while(v.size() < v.capacity()) v.push_back(false);
+ v.pop_back(); v.pop_back();
+ size_t sz = v.size();
+ std::vector<bool>::iterator i = v.insert(v.cbegin() + 10, 1);
+ assert(v.size() == sz + 1);
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ assert(v[j] == 1);
+ for (++j; j < v.size(); ++j)
assert(v[j] == 0);
}
#if __cplusplus >= 201103L
@@ -41,7 +70,7 @@
for (j = 0; j < 10; ++j)
assert(v[j] == 0);
assert(v[j] == 1);
- for (++j; j < 101; ++j)
+ for (++j; j < v.size(); ++j)
assert(v[j] == 0);
}
#endif
diff --git a/test/containers/sequences/vector.bool/resize_size.pass.cpp b/test/containers/sequences/vector.bool/resize_size.pass.cpp
index 77d54e5..f75720c 100644
--- a/test/containers/sequences/vector.bool/resize_size.pass.cpp
+++ b/test/containers/sequences/vector.bool/resize_size.pass.cpp
@@ -27,6 +27,10 @@
v.resize(200);
assert(v.size() == 200);
assert(v.capacity() >= 200);
+ v.reserve(400);
+ v.resize(300); // check the case when resizing and we already have room
+ assert(v.size() == 300);
+ assert(v.capacity() >= 400);
}
#if __cplusplus >= 201103L
{
@@ -37,6 +41,10 @@
v.resize(200);
assert(v.size() == 200);
assert(v.capacity() >= 200);
+ v.reserve(400);
+ v.resize(300); // check the case when resizing and we already have room
+ assert(v.size() == 300);
+ assert(v.capacity() >= 400);
}
#endif
}
diff --git a/test/containers/sequences/vector/asan_throw.pass.cc b/test/containers/sequences/vector/asan_throw.pass.cc
new file mode 100644
index 0000000..a1dce4a
--- /dev/null
+++ b/test/containers/sequences/vector/asan_throw.pass.cc
@@ -0,0 +1,198 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test asan vector annotations with a class that throws in a CTOR.
+
+#include <vector>
+#include <cassert>
+
+#include "asan_testing.h"
+
+class X {
+public:
+ X(const X &x) { Init(x.a); }
+ X(char arg) { Init(arg); }
+ X() { Init(42); }
+ X &operator=(const X &x) {
+ Init(x.a);
+ return *this;
+ }
+ void Init(char arg) {
+ if (arg == 42)
+ throw 0;
+ if (arg == 66)
+ arg = 42;
+ a = arg;
+ }
+ char get() const { return a; }
+ void set(char arg) { a = arg; }
+
+private:
+ char a;
+};
+
+void test_push_back() {
+ std::vector<X> v;
+ v.reserve(2);
+ v.push_back(X(2));
+ assert(v.size() == 1);
+ try {
+ v.push_back(X(66));
+ assert(0);
+ } catch (int e) {
+ assert(v.size() == 1);
+ }
+ assert(v.size() == 1);
+ assert(is_contiguous_container_asan_correct(v));
+}
+
+void test_emplace_back() {
+#ifndef _LIBCPP_HAS_NO_VARIADICS
+ std::vector<X> v;
+ v.reserve(2);
+ v.push_back(X(2));
+ assert(v.size() == 1);
+ try {
+ v.emplace_back(42);
+ assert(0);
+ } catch (int e) {
+ assert(v.size() == 1);
+ }
+ assert(v.size() == 1);
+ assert(is_contiguous_container_asan_correct(v));
+#endif // _LIBCPP_HAS_NO_VARIADICS
+}
+
+void test_insert_range() {
+ std::vector<X> v;
+ v.reserve(4);
+ v.push_back(X(1));
+ v.push_back(X(2));
+ assert(v.size() == 2);
+ assert(v.capacity() >= 4);
+ try {
+ char a[2] = {21, 42};
+ v.insert(v.end(), a, a + 2);
+ assert(0);
+ } catch (int e) {
+ assert(v.size() == 3);
+ }
+ assert(v.size() == 3);
+ assert(is_contiguous_container_asan_correct(v));
+}
+
+void test_insert() {
+ std::vector<X> v;
+ v.reserve(3);
+ v.insert(v.end(), X(1));
+ v.insert(v.begin(), X(2));
+ assert(v.size() == 2);
+ try {
+ v.insert(v.end(), X(66));
+ assert(0);
+ } catch (int e) {
+ assert(v.size() == 2);
+ }
+ assert(v.size() == 2);
+ assert(is_contiguous_container_asan_correct(v));
+}
+
+void test_emplace() {
+#ifndef _LIBCPP_HAS_NO_VARIADICS
+ std::vector<X> v;
+ v.reserve(3);
+ v.insert(v.end(), X(1));
+ v.insert(v.begin(), X(2));
+ assert(v.size() == 2);
+ try {
+ v.emplace(v.end(), 42);
+ assert(0);
+ } catch (int e) {
+ assert(v.size() == 2);
+ }
+ assert(v.size() == 2);
+ assert(is_contiguous_container_asan_correct(v));
+#endif // _LIBCPP_HAS_NO_VARIADICS
+}
+
+void test_insert_range2() {
+ std::vector<X> v;
+ v.reserve(4);
+ v.insert(v.end(), X(1));
+ v.insert(v.begin(), X(2));
+ assert(v.size() == 2);
+ assert(v.capacity() >= 4);
+ try {
+ char a[2] = {10, 42};
+ v.insert(v.begin(), a, a + 2);
+ assert(0);
+ } catch (int e) {
+ assert(v.size() <= 4);
+ assert(is_contiguous_container_asan_correct(v));
+ return;
+ }
+ assert(0);
+}
+
+void test_insert_n() {
+ std::vector<X> v;
+ v.reserve(10);
+ v.insert(v.end(), X(1));
+ v.insert(v.begin(), X(2));
+ assert(v.size() == 2);
+ try {
+ v.insert(v.begin(), 1, X(66));
+ assert(0);
+ } catch (int e) {
+ assert(v.size() <= 3);
+ assert(is_contiguous_container_asan_correct(v));
+ return;
+ }
+ assert(0);
+}
+
+void test_resize() {
+ std::vector<X> v;
+ v.reserve(3);
+ v.push_back(X(0));
+ try {
+ v.resize(3);
+ assert(0);
+ } catch (int e) {
+ assert(v.size() == 1);
+ }
+ assert(v.size() == 1);
+ assert(is_contiguous_container_asan_correct(v));
+}
+
+void test_resize_param() {
+ std::vector<X> v;
+ v.reserve(3);
+ v.push_back(X(0));
+ try {
+ v.resize(3, X(66));
+ assert(0);
+ } catch (int e) {
+ assert(v.size() == 1);
+ }
+ assert(v.size() == 1);
+ assert(is_contiguous_container_asan_correct(v));
+}
+
+int main() {
+ test_push_back();
+ test_emplace_back();
+ test_insert_range();
+ test_insert();
+ test_emplace();
+ test_insert_range2();
+ test_insert_n();
+ test_resize();
+ test_resize_param();
+}
diff --git a/test/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp b/test/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp
index cf24a87..782437b 100644
--- a/test/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp
+++ b/test/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp
@@ -60,6 +60,42 @@
assert(v[j] == 0);
}
{
+ std::vector<int> v(100);
+ while(v.size() < v.capacity()) v.push_back(0); // force reallocation
+ size_t sz = v.size();
+ int a[] = {1, 2, 3, 4, 5};
+ const unsigned N = sizeof(a)/sizeof(a[0]);
+ std::vector<int>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const int*>(a),
+ forward_iterator<const int*>(a+N));
+ assert(v.size() == sz + N);
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ for (int k = 0; k < N; ++j, ++k)
+ assert(v[j] == a[k]);
+ for (; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
+ std::vector<int> v(100);
+ v.reserve(128); // force no reallocation
+ size_t sz = v.size();
+ int a[] = {1, 2, 3, 4, 5};
+ const unsigned N = sizeof(a)/sizeof(a[0]);
+ std::vector<int>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const int*>(a),
+ forward_iterator<const int*>(a+N));
+ assert(v.size() == sz + N);
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ for (int k = 0; k < N; ++j, ++k)
+ assert(v[j] == a[k]);
+ for (; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
std::vector<int, stack_allocator<int, 308> > v(100);
int a[] = {1, 2, 3, 4, 5};
const int N = sizeof(a)/sizeof(a[0]);
diff --git a/test/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp b/test/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp
index 42effc7..6997284 100644
--- a/test/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp
+++ b/test/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp
@@ -38,6 +38,38 @@
assert(v[j] == 0);
}
{
+ std::vector<int> v(100);
+ while(v.size() < v.capacity()) v.push_back(0); // force reallocation
+ size_t sz = v.size();
+ std::vector<int>::iterator i = v.insert(v.cbegin() + 10, 5, 1);
+ assert(v.size() == sz + 5);
+ assert(is_contiguous_container_asan_correct(v));
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ for (; j < 15; ++j)
+ assert(v[j] == 1);
+ for (++j; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
+ std::vector<int> v(100);
+ v.reserve(128); // force no reallocation
+ size_t sz = v.size();
+ std::vector<int>::iterator i = v.insert(v.cbegin() + 10, 5, 1);
+ assert(v.size() == sz + 5);
+ assert(is_contiguous_container_asan_correct(v));
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ for (; j < 15; ++j)
+ assert(v[j] == 1);
+ for (++j; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
std::vector<int, stack_allocator<int, 300> > v(100);
std::vector<int, stack_allocator<int, 300> >::iterator i = v.insert(v.cbegin() + 10, 5, 1);
assert(v.size() == 105);
diff --git a/test/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp b/test/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp
index feb74c0..782e752 100644
--- a/test/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp
+++ b/test/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp
@@ -37,6 +37,37 @@
assert(v[j] == 0);
}
{
+ std::vector<int> v(100);
+ while(v.size() < v.capacity()) v.push_back(0); // force reallocation
+ size_t sz = v.size();
+ std::vector<int>::iterator i = v.insert(v.cbegin() + 10, 1);
+ assert(v.size() == sz + 1);
+ assert(is_contiguous_container_asan_correct(v));
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ assert(v[j] == 1);
+ for (++j; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
+ std::vector<int> v(100);
+ while(v.size() < v.capacity()) v.push_back(0);
+ v.pop_back(); v.pop_back(); // force no reallocation
+ size_t sz = v.size();
+ std::vector<int>::iterator i = v.insert(v.cbegin() + 10, 1);
+ assert(v.size() == sz + 1);
+ assert(is_contiguous_container_asan_correct(v));
+ assert(i == v.begin() + 10);
+ int j;
+ for (j = 0; j < 10; ++j)
+ assert(v[j] == 0);
+ assert(v[j] == 1);
+ for (++j; j < v.size(); ++j)
+ assert(v[j] == 0);
+ }
+ {
std::vector<int, stack_allocator<int, 300> > v(100);
std::vector<int, stack_allocator<int, 300> >::iterator i = v.insert(v.cbegin() + 10, 1);
assert(v.size() == 101);
diff --git a/test/depr/depr.c.headers/locale_h.pass.cpp b/test/depr/depr.c.headers/locale_h.pass.cpp
index eff9b2b..6ecf5a8 100644
--- a/test/depr/depr.c.headers/locale_h.pass.cpp
+++ b/test/depr/depr.c.headers/locale_h.pass.cpp
@@ -43,6 +43,6 @@
int main()
{
lconv lc;
- static_assert((std::is_same<__typeof__(setlocale(0, "")), char*>::value), "");
- static_assert((std::is_same<__typeof__(localeconv()), lconv*>::value), "");
+ static_assert((std::is_same<decltype(setlocale(0, "")), char*>::value), "");
+ static_assert((std::is_same<decltype(localeconv()), lconv*>::value), "");
}
diff --git a/test/depr/depr.c.headers/setjmp_h.pass.cpp b/test/depr/depr.c.headers/setjmp_h.pass.cpp
index 2a8abe3..36f4253 100644
--- a/test/depr/depr.c.headers/setjmp_h.pass.cpp
+++ b/test/depr/depr.c.headers/setjmp_h.pass.cpp
@@ -15,6 +15,6 @@
int main()
{
jmp_buf jb;
- static_assert((std::is_same<__typeof__(longjmp(jb, 0)), void>::value),
- "std::is_same<__typeof__(longjmp(jb, 0)), void>::value");
+ static_assert((std::is_same<decltype(longjmp(jb, 0)), void>::value),
+ "std::is_same<decltype(longjmp(jb, 0)), void>::value");
}
diff --git a/test/depr/depr.c.headers/stdarg_h.pass.cpp b/test/depr/depr.c.headers/stdarg_h.pass.cpp
index 2c18c5d..7a60902 100644
--- a/test/depr/depr.c.headers/stdarg_h.pass.cpp
+++ b/test/depr/depr.c.headers/stdarg_h.pass.cpp
@@ -15,8 +15,10 @@
#error va_arg not defined
#endif
-#ifndef va_copy
-#error va_copy not defined
+#if __cplusplus >= 201103L
+# ifndef va_copy
+# error va_copy is not defined when c++ >= 11
+# endif
#endif
#ifndef va_end
diff --git a/test/depr/depr.c.headers/tgmath_h.pass.cpp b/test/depr/depr.c.headers/tgmath_h.pass.cpp
index c4c9e85..a2ef814 100644
--- a/test/depr/depr.c.headers/tgmath_h.pass.cpp
+++ b/test/depr/depr.c.headers/tgmath_h.pass.cpp
@@ -19,4 +19,5 @@
{
std::complex<double> cd;
double x = sin(1.0);
+ (void)x; // to placate scan-build
}
diff --git a/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp b/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp
index 78343f8..5ea4988 100644
--- a/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp
+++ b/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp
@@ -24,4 +24,5 @@
std::string s("dog");
out << i << ' ' << d << ' ' << s << std::ends;
assert(out.str() == std::string("123 4.5 dog"));
+ out.freeze(false);
}
diff --git a/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp b/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp
index 97869f6..a60c7cb 100644
--- a/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp
+++ b/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp
@@ -29,5 +29,6 @@
out << 'a';
out << char(0);
assert(out.str() == std::string("a"));
+ out.freeze(false);
}
}
diff --git a/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp b/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp
index 9a5542a..9a7160f 100644
--- a/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp
+++ b/test/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp
@@ -22,5 +22,6 @@
std::ostrstream out;
out << 123 << ' ' << 4.5 << ' ' << "dog" << std::ends;
assert(out.str() == std::string("123 4.5 dog"));
+ out.freeze(false);
}
}
diff --git a/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp b/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp
index 374f430..2ec5e7f 100644
--- a/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp
+++ b/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp
@@ -31,4 +31,5 @@
assert(i == 123);
assert(d == 4.5);
assert(strcmp(s.c_str(), "dog") == 0);
+ inout.freeze(false);
}
diff --git a/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp b/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp
index 525073c..4734338 100644
--- a/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp
+++ b/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp
@@ -29,5 +29,6 @@
out << 'a';
out << char(0);
assert(out.str() == std::string("a"));
+ out.freeze(false);
}
}
diff --git a/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp b/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp
index 4ac1c44..5c273dc 100644
--- a/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp
+++ b/test/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp
@@ -22,5 +22,6 @@
std::strstream out;
out << 123 << ' ' << 4.5 << ' ' << "dog" << std::ends;
assert(out.str() == std::string("123 4.5 dog"));
+ out.freeze(false);
}
}
diff --git a/test/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp b/test/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp
index 03e58cb..d96f0f7 100644
--- a/test/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp
+++ b/test/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp
@@ -27,5 +27,6 @@
assert(sb.pcount() == 2);
assert(sb.str() == std::string("a"));
assert(sb.pcount() == 2);
+ sb.freeze(false);
}
}
diff --git a/test/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp b/test/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp
index dce29c9..27de56f 100644
--- a/test/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp
+++ b/test/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp
@@ -23,5 +23,6 @@
assert(sb.sputc('a') == 'a');
assert(sb.sputc(0) == 0);
assert(sb.str() == std::string("a"));
+ sb.freeze(false);
}
}
diff --git a/test/experimental/string.view/string.view.modifiers/remove_prefix.pass.cpp b/test/experimental/string.view/string.view.modifiers/remove_prefix.pass.cpp
index e99514a..0a2dd6d 100644
--- a/test/experimental/string.view/string.view.modifiers/remove_prefix.pass.cpp
+++ b/test/experimental/string.view/string.view.modifiers/remove_prefix.pass.cpp
@@ -28,13 +28,11 @@
sv1.remove_prefix ( 1 );
assert ( sv1.size() == (len - 1));
assert ( sv1.data() == (s + 1));
+ sv1.remove_prefix ( len - 1 );
}
- sv1.remove_prefix ( len - 1 );
assert ( sv1.size() == 0 );
-
- SV sv2 ( s );
- sv2.remove_prefix ( len << 1 );
+ sv1.remove_prefix ( 0 );
assert ( sv1.size() == 0 );
}
}
@@ -72,7 +70,6 @@
static_assert ( test_ce ( 5, 0 ) == 5, "" );
static_assert ( test_ce ( 5, 1 ) == 4, "" );
static_assert ( test_ce ( 5, 5 ) == 0, "" );
- static_assert ( test_ce ( 5, 9 ) == 0, "" );
static_assert ( test_ce ( 9, 3 ) == 6, "" );
}
#endif
diff --git a/test/experimental/string.view/string.view.modifiers/remove_suffix.pass.cpp b/test/experimental/string.view/string.view.modifiers/remove_suffix.pass.cpp
index 5baaab0..9dd5988 100644
--- a/test/experimental/string.view/string.view.modifiers/remove_suffix.pass.cpp
+++ b/test/experimental/string.view/string.view.modifiers/remove_suffix.pass.cpp
@@ -27,13 +27,11 @@
sv1.remove_suffix ( 1 );
assert ( sv1.size() == (len - 1));
assert ( sv1.data() == s);
+ sv1.remove_suffix ( len - 1 );
}
- sv1.remove_suffix ( len - 1 );
assert ( sv1.size() == 0 );
-
- SV sv2 ( s );
- sv2.remove_suffix ( len << 1 );
+ sv1.remove_suffix ( 0 );
assert ( sv1.size() == 0 );
}
@@ -72,7 +70,6 @@
static_assert ( test_ce ( 5, 0 ) == 5, "" );
static_assert ( test_ce ( 5, 1 ) == 4, "" );
static_assert ( test_ce ( 5, 5 ) == 0, "" );
- static_assert ( test_ce ( 5, 9 ) == 0, "" );
static_assert ( test_ce ( 9, 3 ) == 6, "" );
}
#endif
diff --git a/test/experimental/string.view/string.view.ops/to_string.pass.cpp b/test/experimental/string.view/string.view.ops/to_string.pass.cpp
index e69cb95..6387ac2 100644
--- a/test/experimental/string.view/string.view.ops/to_string.pass.cpp
+++ b/test/experimental/string.view/string.view.ops/to_string.pass.cpp
@@ -24,8 +24,8 @@
void test ( const CharT *s ) {
typedef std::basic_string<CharT> String ;
{
- std::experimental::basic_string_view<CharT> sv1 ( s );
- String str1 = (String) sv1;
+ const std::experimental::basic_string_view<CharT> sv1 ( s );
+ String str1 = (String) sv1;
assert ( sv1.size() == str1.size ());
assert ( std::char_traits<CharT>::compare ( sv1.data(), str1.data(), sv1.size()) == 0 );
@@ -38,8 +38,8 @@
}
{
- std::experimental::basic_string_view<CharT> sv1;
- String str1 = (String) sv1;
+ const std::experimental::basic_string_view<CharT> sv1;
+ String str1 = (String) sv1;
assert ( sv1.size() == str1.size ());
assert ( std::char_traits<CharT>::compare ( sv1.data(), str1.data(), sv1.size()) == 0 );
diff --git a/test/input.output/iostream.format/ext.manip/get_money.pass.cpp b/test/input.output/iostream.format/ext.manip/get_money.pass.cpp
index cdd762a..1ea1d78 100644
--- a/test/input.output/iostream.format/ext.manip/get_money.pass.cpp
+++ b/test/input.output/iostream.format/ext.manip/get_money.pass.cpp
@@ -11,6 +11,8 @@
// template <class moneyT> T7 get_money(moneyT& mon, bool intl = false);
+// REQUIRES: locale.en_US.UTF-8
+
#include <iomanip>
#include <cassert>
diff --git a/test/input.output/iostream.format/ext.manip/get_time.pass.cpp b/test/input.output/iostream.format/ext.manip/get_time.pass.cpp
index 6866552..17ff642 100644
--- a/test/input.output/iostream.format/ext.manip/get_time.pass.cpp
+++ b/test/input.output/iostream.format/ext.manip/get_time.pass.cpp
@@ -43,7 +43,7 @@
std::istream is(&sb);
is.imbue(std::locale(LOCALE_en_US_UTF_8));
std::tm t = {0};
- is >> std::get_time(&t, "%c");
+ is >> std::get_time(&t, "%a %b %d %H:%M:%S %Y");
assert(t.tm_sec == 59);
assert(t.tm_min == 55);
assert(t.tm_hour == 23);
@@ -59,7 +59,7 @@
std::wistream is(&sb);
is.imbue(std::locale(LOCALE_en_US_UTF_8));
std::tm t = {0};
- is >> std::get_time(&t, L"%c");
+ is >> std::get_time(&t, L"%a %b %d %H:%M:%S %Y");
assert(t.tm_sec == 59);
assert(t.tm_min == 55);
assert(t.tm_hour == 23);
diff --git a/test/input.output/iostream.format/ext.manip/put_money.pass.cpp b/test/input.output/iostream.format/ext.manip/put_money.pass.cpp
index 8d15dd9..a00cf13 100644
--- a/test/input.output/iostream.format/ext.manip/put_money.pass.cpp
+++ b/test/input.output/iostream.format/ext.manip/put_money.pass.cpp
@@ -11,6 +11,8 @@
// template <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false);
+// REQUIRES: locale.en_US.UTF-8
+
#include <iomanip>
#include <cassert>
diff --git a/test/input.output/iostream.format/ext.manip/put_time.pass.cpp b/test/input.output/iostream.format/ext.manip/put_time.pass.cpp
index d64ca07..52a98a1 100644
--- a/test/input.output/iostream.format/ext.manip/put_time.pass.cpp
+++ b/test/input.output/iostream.format/ext.manip/put_time.pass.cpp
@@ -62,7 +62,8 @@
t.tm_mon = 11;
t.tm_year = 161;
t.tm_wday = 6;
- os << std::put_time(&t, "%c");
+ t.tm_isdst = 0;
+ os << std::put_time(&t, "%a %b %d %H:%M:%S %Y");
assert(sb.str() == "Sat Dec 31 23:55:59 2061");
}
{
@@ -77,7 +78,7 @@
t.tm_mon = 11;
t.tm_year = 161;
t.tm_wday = 6;
- os << std::put_time(&t, L"%c");
+ os << std::put_time(&t, L"%a %b %d %H:%M:%S %Y");
assert(sb.str() == L"Sat Dec 31 23:55:59 2061");
}
}
diff --git a/test/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp b/test/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp
index 59f381c..61db67c 100644
--- a/test/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp
+++ b/test/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp
@@ -53,12 +53,12 @@
testbuf<char> sb(" 123456789");
std::istream is(&sb);
assert(is.sync() == 0);
- assert(sync_called = 1);
+ assert(sync_called == 1);
}
{
testbuf<wchar_t> sb(L" 123456789");
std::wistream is(&sb);
assert(is.sync() == 0);
- assert(sync_called = 2);
+ assert(sync_called == 2);
}
}
diff --git a/test/input.output/string.streams/istringstream/istringstream.assign/move.pass.cpp b/test/input.output/string.streams/istringstream/istringstream.assign/move.pass.cpp
index 6e20640..e57ad55 100644
--- a/test/input.output/string.streams/istringstream/istringstream.assign/move.pass.cpp
+++ b/test/input.output/string.streams/istringstream/istringstream.assign/move.pass.cpp
@@ -34,6 +34,24 @@
assert(i == 456);
}
{
+ std::istringstream s1("Aaaaa Bbbbb Cccccccccc Dddddddddddddddddd");
+ std::string s;
+ s1 >> s;
+
+ std::istringstream s2 = std::move(s1);
+ s2 >> s;
+ assert(s == "Bbbbb");
+
+ std::istringstream s3;
+ s3 = std::move(s2);
+ s3 >> s;
+ assert(s == "Cccccccccc");
+
+ s1 = std::move(s3);
+ s1 >> s;
+ assert(s == "Dddddddddddddddddd");
+ }
+ {
std::wistringstream ss0(L" 123 456");
std::wistringstream ss;
ss = std::move(ss0);
@@ -46,5 +64,23 @@
ss >> i;
assert(i == 456);
}
+ {
+ std::wistringstream s1(L"Aaaaa Bbbbb Cccccccccc Dddddddddddddddddd");
+ std::wstring s;
+ s1 >> s;
+
+ std::wistringstream s2 = std::move(s1);
+ s2 >> s;
+ assert(s == L"Bbbbb");
+
+ std::wistringstream s3;
+ s3 = std::move(s2);
+ s3 >> s;
+ assert(s == L"Cccccccccc");
+
+ s1 = std::move(s3);
+ s1 >> s;
+ assert(s == L"Dddddddddddddddddd");
+ }
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}
diff --git a/test/iterators/iterator.container/data.pass.cpp b/test/iterators/iterator.container/data.pass.cpp
new file mode 100644
index 0000000..75ba950
--- /dev/null
+++ b/test/iterators/iterator.container/data.pass.cpp
@@ -0,0 +1,77 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+// template <class C> constexpr auto data(C& c) -> decltype(c.data()); // C++17
+// template <class C> constexpr auto data(const C& c) -> decltype(c.data()); // C++17
+// template <class T, size_t N> constexpr T* data(T (&array)[N]) noexcept; // C++17
+// template <class E> constexpr const E* data(initializer_list<E> il) noexcept; // C++17
+
+#if __cplusplus <= 201402L
+int main () {}
+#else
+
+
+#include <__config>
+
+#include <iterator>
+#include <cassert>
+#include <vector>
+#include <array>
+#include <initializer_list>
+
+template<typename C>
+void test_const_container( const C& c )
+{
+ assert ( std::data(c) == c.data());
+}
+
+template<typename T>
+void test_const_container( const std::initializer_list<T>& c )
+{
+ assert ( std::data(c) == c.begin());
+}
+
+template<typename C>
+void test_container( C& c )
+{
+ assert ( std::data(c) == c.data());
+}
+
+template<typename T>
+void test_container( std::initializer_list<T>& c)
+{
+ assert ( std::data(c) == c.begin());
+}
+
+template<typename T, size_t Sz>
+void test_const_array( const T (&array)[Sz] )
+{
+ assert ( std::data(array) == &array[0]);
+}
+
+int main()
+{
+ std::vector<int> v; v.push_back(1);
+ std::array<int, 1> a; a[0] = 3;
+ std::initializer_list<int> il = { 4 };
+
+ test_container ( v );
+ test_container ( a );
+ test_container ( il );
+
+ test_const_container ( v );
+ test_const_container ( a );
+ test_const_container ( il );
+
+ static constexpr int arrA [] { 1, 2, 3 };
+ test_const_array ( arrA );
+}
+
+#endif
diff --git a/test/iterators/iterator.container/empty.pass.cpp b/test/iterators/iterator.container/empty.pass.cpp
new file mode 100644
index 0000000..196a0e3
--- /dev/null
+++ b/test/iterators/iterator.container/empty.pass.cpp
@@ -0,0 +1,80 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+// template <class C> constexpr auto empty(const C& c) -> decltype(c.empty()); // C++17
+// template <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept; // C++17
+// template <class E> constexpr bool empty(initializer_list<E> il) noexcept; // C++17
+
+#if __cplusplus <= 201402L
+int main () {}
+#else
+
+
+#include <__config>
+
+#include <iterator>
+#include <cassert>
+#include <vector>
+#include <array>
+#include <list>
+#include <initializer_list>
+
+template<typename C>
+void test_const_container( const C& c )
+{
+ assert ( std::empty(c) == c.empty());
+}
+
+template<typename T>
+void test_const_container( const std::initializer_list<T>& c )
+{
+ assert ( std::empty(c) == (c.size() == 0));
+}
+
+template<typename C>
+void test_container( C& c )
+{
+ assert ( std::empty(c) == c.empty());
+}
+
+template<typename T>
+void test_container( std::initializer_list<T>& c )
+{
+ assert ( std::empty(c) == (c.size() == 0));
+}
+
+template<typename T, size_t Sz>
+void test_const_array( const T (&array)[Sz] )
+{
+ assert (!std::empty(array));
+}
+
+int main()
+{
+ std::vector<int> v; v.push_back(1);
+ std::list<int> l; l.push_back(2);
+ std::array<int, 1> a; a[0] = 3;
+ std::initializer_list<int> il = { 4 };
+
+ test_container ( v );
+ test_container ( l );
+ test_container ( a );
+ test_container ( il );
+
+ test_const_container ( v );
+ test_const_container ( l );
+ test_const_container ( a );
+ test_const_container ( il );
+
+ static constexpr int arrA [] { 1, 2, 3 };
+ test_const_array ( arrA );
+}
+
+#endif
diff --git a/test/iterators/iterator.container/size.pass.cpp b/test/iterators/iterator.container/size.pass.cpp
new file mode 100644
index 0000000..f8da9bf
--- /dev/null
+++ b/test/iterators/iterator.container/size.pass.cpp
@@ -0,0 +1,79 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+// template <class C> constexpr auto size(const C& c) -> decltype(c.size()); // C++17
+// template <class T, size_t N> constexpr size_t size(const T (&array)[N]) noexcept; // C++17
+
+#if __cplusplus <= 201402L
+int main () {}
+#else
+
+
+#include <__config>
+
+#include <iterator>
+#include <cassert>
+#include <vector>
+#include <array>
+#include <list>
+#include <initializer_list>
+
+template<typename C>
+void test_const_container( const C& c )
+{
+ assert ( std::size(c) == c.size());
+}
+
+template<typename T>
+void test_const_container( const std::initializer_list<T>& c)
+{
+ assert ( std::size(c) == c.size());
+}
+
+template<typename C>
+void test_container( C& c)
+{
+ assert ( std::size(c) == c.size());
+}
+
+template<typename T>
+void test_container( std::initializer_list<T>& c )
+{
+ assert ( std::size(c) == c.size());
+}
+
+template<typename T, size_t Sz>
+void test_const_array( const T (&array)[Sz] )
+{
+ assert ( std::size(array) == Sz );
+}
+
+int main()
+{
+ std::vector<int> v; v.push_back(1);
+ std::list<int> l; l.push_back(2);
+ std::array<int, 1> a; a[0] = 3;
+ std::initializer_list<int> il = { 4 };
+
+ test_container ( v );
+ test_container ( l );
+ test_container ( a );
+ test_container ( il );
+
+ test_const_container ( v );
+ test_const_container ( l );
+ test_const_container ( a );
+ test_const_container ( il );
+
+ static constexpr int arrA [] { 1, 2, 3 };
+ test_const_array ( arrA );
+}
+
+#endif
diff --git a/test/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp b/test/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp
index 63f847f..052d88f 100644
--- a/test/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp
+++ b/test/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp
@@ -7,7 +7,10 @@
//
//===----------------------------------------------------------------------===//
- // test operator new[]
+// test operator new[]
+// NOTE: asan and msan will not call the new handler.
+// UNSUPPORTED: asan, msan
+
#include <new>
#include <cstddef>
diff --git a/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp b/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp
index 60bc7c4..259f5b0 100644
--- a/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp
+++ b/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp
@@ -7,7 +7,10 @@
//
//===----------------------------------------------------------------------===//
- // test operator new [] (nothrow)
+// test operator new [] (nothrow)
+// NOTE: asan and msan will not call the new handler.
+// UNSUPPORTED: asan, msan
+
#include <new>
#include <cstddef>
diff --git a/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp b/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp
index 9bf6e8a..3e3a00c 100644
--- a/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp
+++ b/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp
@@ -7,7 +7,9 @@
//
//===----------------------------------------------------------------------===//
- // test operator new [] nothrow by replacing only operator new
+// test operator new [] nothrow by replacing only operator new
+
+// UNSUPPORTED: asan, msan
#include <new>
#include <cstddef>
diff --git a/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp b/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp
index 959bc45..acf972b 100644
--- a/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp
+++ b/test/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp
@@ -7,7 +7,9 @@
//
//===----------------------------------------------------------------------===//
- // test operator new[] replacement by replacing only operator new
+// test operator new[] replacement by replacing only operator new
+
+// UNSUPPORTED: asan, msan
#include <new>
#include <cstddef>
diff --git a/test/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp b/test/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp
index 4d219e3..3ba71dd 100644
--- a/test/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp
+++ b/test/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp
@@ -7,7 +7,10 @@
//
//===----------------------------------------------------------------------===//
- // test operator new
+// test operator new
+
+// asan and msan will not call the new handler.
+// UNSUPPORTED: asan, msan
#include <new>
#include <cstddef>
diff --git a/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp b/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp
index c54d14e..c76bfa0 100644
--- a/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp
+++ b/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp
@@ -7,7 +7,10 @@
//
//===----------------------------------------------------------------------===//
- // test operator new (nothrow)
+// test operator new (nothrow)
+
+// asan and msan will not call the new handler.
+// UNSUPPORTED: asan, msan
#include <new>
#include <cstddef>
diff --git a/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp b/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp
index ed3c035..f2dbb98 100644
--- a/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp
+++ b/test/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp
@@ -7,7 +7,9 @@
//
//===----------------------------------------------------------------------===//
- // test operator new nothrow by replacing only operator new
+// test operator new nothrow by replacing only operator new
+
+// UNSUPPORTED: asan, msan
#include <new>
#include <cstddef>
diff --git a/test/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp b/test/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp
index 7646097..2d411b9 100644
--- a/test/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp
+++ b/test/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp
@@ -7,7 +7,9 @@
//
//===----------------------------------------------------------------------===//
- // test operator new replacement
+// test operator new replacement
+
+// UNSUPPORTED: asan, msan
#include <new>
#include <cstddef>
diff --git a/test/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp b/test/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp
index 9b11e82..af93e78 100644
--- a/test/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp
+++ b/test/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp
@@ -13,7 +13,7 @@
#include <limits>
-#if (defined(__i386__) || defined(__x86_64__)) || defined(__pnacl__) // @LOCALMOD
+#if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__)
static const bool integral_types_trap = true;
#else
static const bool integral_types_trap = false;
diff --git a/test/language.support/support.runtime/csetjmp.pass.cpp b/test/language.support/support.runtime/csetjmp.pass.cpp
index a54f67b..dc034ce 100644
--- a/test/language.support/support.runtime/csetjmp.pass.cpp
+++ b/test/language.support/support.runtime/csetjmp.pass.cpp
@@ -19,6 +19,6 @@
int main()
{
std::jmp_buf jb;
- static_assert((std::is_same<__typeof__(std::longjmp(jb, 0)), void>::value),
- "std::is_same<__typeof__(std::longjmp(jb, 0)), void>::value");
+ static_assert((std::is_same<decltype(std::longjmp(jb, 0)), void>::value),
+ "std::is_same<decltype(std::longjmp(jb, 0)), void>::value");
}
diff --git a/test/language.support/support.runtime/cstdarg.pass.cpp b/test/language.support/support.runtime/cstdarg.pass.cpp
index 00baf80..059ad2f 100644
--- a/test/language.support/support.runtime/cstdarg.pass.cpp
+++ b/test/language.support/support.runtime/cstdarg.pass.cpp
@@ -15,8 +15,10 @@
#error va_arg not defined
#endif
-#ifndef va_copy
-#error va_copy not defined
+#if __cplusplus >= 201103L
+# ifndef va_copy
+# error va_copy is not defined when c++ >= 11
+# endif
#endif
#ifndef va_end
diff --git a/test/language.support/support.start.term/quick_exit.pass.cpp b/test/language.support/support.start.term/quick_exit.pass.cpp
index 1945a1b..bcfdbb7 100644
--- a/test/language.support/support.start.term/quick_exit.pass.cpp
+++ b/test/language.support/support.start.term/quick_exit.pass.cpp
@@ -7,17 +7,17 @@
//
//===----------------------------------------------------------------------===//
//
-// XFAIL: apple-darwin
// test quick_exit and at_quick_exit
#include <cstdlib>
-#include <type_traits>
void f() {}
int main()
{
+#ifdef _LIBCPP_HAS_QUICK_EXIT
std::at_quick_exit(f);
- quick_exit(0);
+ std::quick_exit(0);
+#endif
}
diff --git a/test/language.support/support.start.term/quick_exit_check1.fail.cpp b/test/language.support/support.start.term/quick_exit_check1.fail.cpp
new file mode 100644
index 0000000..8b97293
--- /dev/null
+++ b/test/language.support/support.start.term/quick_exit_check1.fail.cpp
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+
+// test that referencing at_quick_exit when _LIBCPP_HAS_QUICK_EXIT is not defined
+// results in a compile error.
+
+#include <cstdlib>
+
+void f() {}
+
+int main()
+{
+#ifndef _LIBCPP_HAS_QUICK_EXIT
+ std::at_quick_exit(f);
+#else
+#error
+#endif
+}
diff --git a/test/language.support/support.start.term/quick_exit_check2.fail.cpp b/test/language.support/support.start.term/quick_exit_check2.fail.cpp
new file mode 100644
index 0000000..3959141
--- /dev/null
+++ b/test/language.support/support.start.term/quick_exit_check2.fail.cpp
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+
+// test that referencing quick_exit when _LIBCPP_HAS_QUICK_EXIT is not defined
+// results in a compile error.
+
+#include <cstdlib>
+
+void f() {}
+
+int main()
+{
+#ifndef _LIBCPP_HAS_QUICK_EXIT
+ std::quick_exit(0);
+#else
+#error
+#endif
+}
diff --git a/test/language.support/support.types/nullptr_t.pass.cpp b/test/language.support/support.types/nullptr_t.pass.cpp
index 6c15fef..4d7c8b0 100644
--- a/test/language.support/support.types/nullptr_t.pass.cpp
+++ b/test/language.support/support.types/nullptr_t.pass.cpp
@@ -18,42 +18,62 @@
A(std::nullptr_t) {}
};
+template <class T>
+void test_conversions()
+{
+ {
+ T p = 0;
+ assert(p == nullptr);
+ }
+ {
+ T p = nullptr;
+ assert(p == nullptr);
+ assert(nullptr == p);
+ assert(!(p != nullptr));
+ assert(!(nullptr != p));
+ }
+}
+
+template <class T>
+void test_comparisons()
+{
+ T p = nullptr;
+ assert(p == nullptr);
+ assert(p <= nullptr);
+ assert(p >= nullptr);
+ assert(!(p != nullptr));
+ assert(!(p < nullptr));
+ assert(!(p > nullptr));
+ assert(nullptr == p);
+ assert(nullptr <= p);
+ assert(nullptr >= p);
+ assert(!(nullptr != p));
+ assert(!(nullptr < p));
+ assert(!(nullptr > p));
+}
+
+
int main()
{
static_assert(sizeof(std::nullptr_t) == sizeof(void*),
"sizeof(std::nullptr_t) == sizeof(void*)");
- A* p = 0;
- assert(p == nullptr);
- void (A::*pmf)() = 0;
-#ifdef __clang__
- // GCC 4.2 can't handle this
- assert(pmf == nullptr);
-#endif
- int A::*pmd = 0;
- assert(pmd == nullptr);
- A a1(nullptr);
- A a2(0);
- bool b = nullptr;
- assert(!b);
- assert(nullptr == nullptr);
- assert(nullptr <= nullptr);
- assert(nullptr >= nullptr);
- assert(!(nullptr != nullptr));
- assert(!(nullptr < nullptr));
- assert(!(nullptr > nullptr));
- A* a = nullptr;
- assert(a == nullptr);
- assert(a <= nullptr);
- assert(a >= nullptr);
- assert(!(a != nullptr));
- assert(!(a < nullptr));
- assert(!(a > nullptr));
- assert(nullptr == a);
- assert(nullptr <= a);
- assert(nullptr >= a);
- assert(!(nullptr != a));
- assert(!(nullptr < a));
- assert(!(nullptr > a));
- std::ptrdiff_t i = reinterpret_cast<std::ptrdiff_t>(nullptr);
- assert(i == 0);
+
+ {
+ test_conversions<std::nullptr_t>();
+ test_conversions<void*>();
+ test_conversions<A*>();
+ test_conversions<void(*)()>();
+ test_conversions<void(A::*)()>();
+ test_conversions<int A::*>();
+ }
+ {
+ test_comparisons<std::nullptr_t>();
+ test_comparisons<void*>();
+ test_comparisons<A*>();
+ test_comparisons<void(*)()>();
+ }
+ {
+ bool b = nullptr;
+ assert(!b);
+ }
}
diff --git a/test/language.support/support.types/nullptr_t_integral_cast.fail.cpp b/test/language.support/support.types/nullptr_t_integral_cast.fail.cpp
new file mode 100644
index 0000000..92bd879
--- /dev/null
+++ b/test/language.support/support.types/nullptr_t_integral_cast.fail.cpp
@@ -0,0 +1,17 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// typedef decltype(nullptr) nullptr_t;
+
+#include <cstddef>
+
+int main()
+{
+ std::ptrdiff_t i = static_cast<std::ptrdiff_t>(nullptr);
+}
diff --git a/test/language.support/support.types/nullptr_t_integral_cast.pass.cpp b/test/language.support/support.types/nullptr_t_integral_cast.pass.cpp
new file mode 100644
index 0000000..34c7a93
--- /dev/null
+++ b/test/language.support/support.types/nullptr_t_integral_cast.pass.cpp
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// NOTE: nullptr_t emulation cannot handle a reinterpret_cast to an
+// integral type
+// XFAIL: c++98, c++03
+
+// typedef decltype(nullptr) nullptr_t;
+
+
+#include <cstddef>
+#include <cassert>
+
+int main()
+{
+ std::ptrdiff_t i = reinterpret_cast<std::ptrdiff_t>(nullptr);
+ assert(i == 0);
+}
diff --git a/test/lit.cfg b/test/lit.cfg
index dc0ca5c..62a8a28 100644
--- a/test/lit.cfg
+++ b/test/lit.cfg
@@ -28,29 +28,19 @@
FOO.fail.cpp - Negative test case which is expected to fail compilation.
"""
- def __init__(self, cxx_under_test, cpp_flags, ld_flags, exec_env):
+ def __init__(self, cxx_under_test, use_verify_for_fail,
+ cpp_flags, ld_flags, exec_env,
+ # @LOCALMOD
+ exe_suffix, shell_prefix):
self.cxx_under_test = cxx_under_test
+ self.use_verify_for_fail = use_verify_for_fail
self.cpp_flags = list(cpp_flags)
self.ld_flags = list(ld_flags)
self.exec_env = dict(exec_env)
-
- def execute_command(self, command, in_dir=None):
- kwargs = {
- 'stdin' :subprocess.PIPE,
- 'stdout':subprocess.PIPE,
- 'stderr':subprocess.PIPE,
- }
- if in_dir:
- kwargs['cwd'] = in_dir
- p = subprocess.Popen(command, **kwargs)
- out,err = p.communicate()
- exitCode = p.wait()
-
- # Detect Ctrl-C in subprocess.
- if exitCode == -signal.SIGINT:
- raise KeyboardInterrupt
-
- return out, err, exitCode
+ # @LOCALMOD-START
+ self.exe_suffix = exe_suffix
+ self.shell_prefix = shell_prefix
+ # @LOCALMOD-END
def execute(self, test, lit_config):
while True:
@@ -64,6 +54,8 @@
def _execute(self, test, lit_config):
# Extract test metadata from the test file.
requires = []
+ unsupported = []
+ use_verify = False
with open(test.getSourcePath()) as f:
for ln in f:
if 'XFAIL:' in ln:
@@ -72,6 +64,11 @@
elif 'REQUIRES:' in ln:
items = ln[ln.index('REQUIRES:') + 9:].split(',')
requires.extend([s.strip() for s in items])
+ elif 'UNSUPPORTED:' in ln:
+ items = ln[ln.index('UNSUPPORTED:') + 12:].split(',')
+ unsupported.extend([s.strip() for s in items])
+ elif 'USE_VERIFY' in ln and self.use_verify_for_fail:
+ use_verify = True
elif not ln.strip().startswith("//") and ln.strip():
# Stop at the first non-empty line that is not a C++
# comment.
@@ -89,10 +86,52 @@
"Test requires the following features: %s" % (
', '.join(missing_required_features),))
- # Evaluate the test.
- return self._evaluate_test(test, lit_config)
+ unsupported_features = [f for f in unsupported
+ if f in test.config.available_features]
+ if unsupported_features:
+ return (lit.Test.UNSUPPORTED,
+ "Test is unsupported with the following features: %s" % (
+ ', '.join(unsupported_features),))
- def _evaluate_test(self, test, lit_config):
+ # Evaluate the test.
+ return self._evaluate_test(test, use_verify, lit_config)
+
+ def _build(self, exec_path, source_path, compile_only=False,
+ use_verify=False):
+ cmd = [self.cxx_under_test, '-o', exec_path,
+ source_path] + self.cpp_flags
+
+ if compile_only:
+ cmd += ['-c']
+ else:
+ cmd += self.ld_flags
+
+ if use_verify:
+ cmd += ['-Xclang', '-verify']
+
+ out, err, rc = lit.util.executeCommand(cmd)
+ return cmd, out, err, rc
+
+ def _clean(self, exec_path):
+ os.remove(exec_path)
+
+ def _run(self, exec_path, lit_config, in_dir=None):
+ cmd = []
+ if self.exec_env:
+ cmd.append('env')
+ cmd.extend('%s=%s' % (name, value)
+ for name,value in self.exec_env.items())
+ cmd.append(exec_path)
+ # @LOCALMOD-START
+ if self.shell_prefix:
+ cmd = self.shell_prefix + cmd
+ # @LOCALMOD-END
+ if lit_config.useValgrind:
+ cmd = lit_config.valgrindArgs + cmd
+ out, err, exitCode = lit.util.executeCommand(cmd, cwd=in_dir)
+ return cmd, out, err, exitCode
+
+ def _evaluate_test(self, test, use_verify, lit_config):
name = test.path_in_suite[-1]
source_path = test.getSourcePath()
source_dir = os.path.dirname(source_path)
@@ -103,15 +142,16 @@
# If this is a compile (failure) test, build it and check for failure.
if expected_compile_fail:
- cmd = [self.cxx_under_test, '-c',
- '-o', '/dev/null', source_path] + self.cpp_flags
- out, err, exitCode = self.execute_command(cmd)
- if exitCode == 1:
+ cmd, out, err, rc = self._build('/dev/null', source_path,
+ compile_only=True,
+ use_verify=use_verify)
+ expected_rc = 0 if use_verify else 1
+ if rc == expected_rc:
return lit.Test.PASS, ""
else:
report = """Command: %s\n""" % ' '.join(["'%s'" % a
for a in cmd])
- report += """Exit Code: %d\n""" % exitCode
+ report += """Exit Code: %d\n""" % rc
if out:
report += """Standard Output:\n--\n%s--""" % out
if err:
@@ -121,20 +161,18 @@
else:
# @LOCALMOD-START
exec_file = tempfile.NamedTemporaryFile(
- suffix=exe_suffix, delete=False)
+ suffix=self.exe_suffix, delete=False)
# @LOCALMOD-END
exec_path = exec_file.name
exec_file.close()
try:
- compile_cmd = [self.cxx_under_test, '-o', exec_path,
- source_path] + self.cpp_flags + self.ld_flags
- cmd = compile_cmd
- out, err, exitCode = self.execute_command(cmd)
- if exitCode != 0:
+ cmd, out, err, rc = self._build(exec_path, source_path)
+ compile_cmd = cmd
+ if rc != 0:
report = """Command: %s\n""" % ' '.join(["'%s'" % a
for a in cmd])
- report += """Exit Code: %d\n""" % exitCode
+ report += """Exit Code: %d\n""" % rc
if out:
report += """Standard Output:\n--\n%s--""" % out
if err:
@@ -142,25 +180,14 @@
report += "\n\nCompilation failed unexpectedly!"
return lit.Test.FAIL, report
- cmd = []
- if self.exec_env:
- cmd.append('env')
- cmd.extend('%s=%s' % (name, value)
- for name,value in self.exec_env.items())
- cmd.append(exec_path)
- # @LOCALMOD-START
- if shell_prefix:
- cmd = shell_prefix + cmd
- # @LOCALMOD-END
- if lit_config.useValgrind:
- cmd = lit_config.valgrindArgs + cmd
- out, err, exitCode = self.execute_command(cmd, source_dir)
- if exitCode != 0:
+ cmd, out, err, rc = self._run(exec_path, lit_config,
+ source_dir)
+ if rc != 0:
report = """Compiled With: %s\n""" % \
' '.join(["'%s'" % a for a in compile_cmd])
report += """Command: %s\n""" % \
' '.join(["'%s'" % a for a in cmd])
- report += """Exit Code: %d\n""" % exitCode
+ report += """Exit Code: %d\n""" % rc
if out:
report += """Standard Output:\n--\n%s--""" % out
if err:
@@ -169,11 +196,361 @@
return lit.Test.FAIL, report
finally:
try:
- os.remove(exec_path)
+ # Note that cleanup of exec_file happens in `_clean()`. If
+ # you override this, cleanup is your reponsibility.
+ self._clean(exec_path)
except:
pass
return lit.Test.PASS, ""
+
+class Configuration(object):
+ def __init__(self, lit_config, config):
+ self.lit_config = lit_config
+ self.config = config
+ # @LOCALMOD-START
+ self.exe_suffix = None
+ self.shell_prefix = None
+ # @LOCALMOD-END
+ self.cxx = None
+ self.src_root = None
+ self.obj_root = None
+ self.env = {}
+ self.compile_flags = ['-nostdinc++']
+ self.link_flags = ['-nodefaultlibs']
+ self.use_system_lib = False
+ self.use_clang_verify = False
+
+ if platform.system() not in ('Darwin', 'FreeBSD', 'Linux'):
+ self.lit_config.fatal("unrecognized system")
+
+ def get_lit_conf(self, name, default=None):
+ val = self.lit_config.params.get(name, None)
+ if val is None:
+ val = getattr(self.config, name, None)
+ if val is None:
+ val = default
+ return val
+
+ def get_lit_bool(self, name):
+ conf = self.get_lit_conf(name)
+ if conf is None:
+ return None
+ if conf.lower() in ('1', 'true'):
+ return True
+ if conf.lower() in ('', '0', 'false'):
+ return False
+ self.lit_config.fatal(
+ "parameter '{}' should be true or false".format(name))
+
+ def configure(self):
+ # @LOCALMOD
+ self.configure_exe_wrappers()
+ self.configure_cxx()
+ self.configure_triple()
+ self.configure_src_root()
+ self.configure_obj_root()
+ self.configure_use_system_lib()
+ self.configure_use_clang_verify()
+ self.configure_env()
+ self.configure_std_flag()
+ self.configure_compile_flags()
+ self.configure_link_flags()
+ self.configure_sanitizer()
+ self.configure_features()
+ # @LOCALMOD-START -- filter out nostdinc++ and nodefaultlibs if needed.
+ if self.use_system_lib:
+ self.compile_flags = [flag for flag in self.compile_flags
+ if flag != '-nostdinc++']
+ self.link_flags = [flag for flag in self.link_flags
+ if flag != '-nodefaultlibs']
+ # @LOCALMOD-END
+ # Print the final compile and link flags.
+ self.lit_config.note('Using compile flags: %s' % self.compile_flags)
+ self.lit_config.note('Using link flags: %s' % self.link_flags)
+ # Print as list to prevent "set([...])" from being printed.
+ self.lit_config.note('Using available_features: %s' %
+ list(self.config.available_features))
+
+ def get_test_format(self):
+ return LibcxxTestFormat(
+ self.cxx,
+ self.use_clang_verify,
+ cpp_flags=self.compile_flags,
+ ld_flags=self.link_flags,
+ exec_env=self.env,
+ # @LOCALMOD
+ exe_suffix=self.exe_suffix,
+ shell_prefix=self.shell_prefix)
+
+ # @LOCALMOD-START
+ def configure_exe_wrappers(self):
+ # Allow customizing the resulting executable's suffix
+ # as well as an wrapper around how to run the executable
+ # via a shell_prefix.
+ self.exe_suffix = self.get_lit_conf('exe_suffix', 'exe')
+ self.shell_prefix = self.get_lit_conf('shell_prefix', None)
+ if self.shell_prefix:
+ self.shell_prefix = shlex.split(self.shell_prefix)
+ # @LOCALMOD-END
+
+ def configure_cxx(self):
+ # Gather various compiler parameters.
+ self.cxx = self.get_lit_conf('cxx_under_test')
+
+ # If no specific cxx_under_test was given, attempt to infer it as
+ # clang++.
+ if self.cxx is None:
+ clangxx = lit.util.which('clang++',
+ self.config.environment['PATH'])
+ if clangxx:
+ self.cxx = clangxx
+ self.lit_config.note(
+ "inferred cxx_under_test as: %r" % self.cxx)
+ if not self.cxx:
+ self.lit_config.fatal('must specify user parameter cxx_under_test '
+ '(e.g., --param=cxx_under_test=clang++)')
+
+ def configure_src_root(self):
+ self.src_root = self.get_lit_conf(
+ 'libcxx_src_root', os.path.dirname(self.config.test_source_root))
+
+ def configure_obj_root(self):
+ self.obj_root = self.get_lit_conf('libcxx_obj_root', self.src_root)
+
+ def configure_use_system_lib(self):
+ # This test suite supports testing against either the system library or
+ # the locally built one; the former mode is useful for testing ABI
+ # compatibility between the current headers and a shipping dynamic
+ # library.
+ self.use_system_lib = self.get_lit_bool('use_system_lib')
+ if self.use_system_lib is None:
+ # Default to testing against the locally built libc++ library.
+ self.use_system_lib = False
+ self.lit_config.note(
+ "inferred use_system_lib as: %r" % self.use_system_lib)
+
+ def configure_use_clang_verify(self):
+ '''If set, run clang with -verify on failing tests.'''
+ self.use_clang_verify = self.get_lit_bool('use_clang_verify')
+ if self.use_clang_verify is None:
+ # TODO: Default this to True when using clang.
+ self.use_clang_verify = False
+ self.lit_config.note(
+ "inferred use_clang_verify as: %r" % self.use_clang_verify)
+
+ def configure_features(self):
+ additional_features = self.get_lit_conf('additional_features')
+ if additional_features:
+ for f in additional_features.split(','):
+ self.config.available_features.add(f.strip())
+
+ # Figure out which of the required locales we support
+ locales = {
+ 'Darwin': {
+ 'en_US.UTF-8': 'en_US.UTF-8',
+ 'cs_CZ.ISO8859-2': 'cs_CZ.ISO8859-2',
+ 'fr_FR.UTF-8': 'fr_FR.UTF-8',
+ 'fr_CA.ISO8859-1': 'cs_CZ.ISO8859-1',
+ 'ru_RU.UTF-8': 'ru_RU.UTF-8',
+ 'zh_CN.UTF-8': 'zh_CN.UTF-8',
+ },
+ 'FreeBSD': {
+ 'en_US.UTF-8': 'en_US.UTF-8',
+ 'cs_CZ.ISO8859-2': 'cs_CZ.ISO8859-2',
+ 'fr_FR.UTF-8': 'fr_FR.UTF-8',
+ 'fr_CA.ISO8859-1': 'fr_CA.ISO8859-1',
+ 'ru_RU.UTF-8': 'ru_RU.UTF-8',
+ 'zh_CN.UTF-8': 'zh_CN.UTF-8',
+ },
+ 'Linux': {
+ 'en_US.UTF-8': 'en_US.UTF-8',
+ 'cs_CZ.ISO8859-2': 'cs_CZ.ISO-8859-2',
+ 'fr_FR.UTF-8': 'fr_FR.UTF-8',
+ 'fr_CA.ISO8859-1': 'fr_CA.ISO-8859-1',
+ 'ru_RU.UTF-8': 'ru_RU.UTF-8',
+ 'zh_CN.UTF-8': 'zh_CN.UTF-8',
+ },
+ 'Windows': {
+ 'en_US.UTF-8': 'English_United States.1252',
+ 'cs_CZ.ISO8859-2': 'Czech_Czech Republic.1250',
+ 'fr_FR.UTF-8': 'French_France.1252',
+ 'fr_CA.ISO8859-1': 'French_Canada.1252',
+ 'ru_RU.UTF-8': 'Russian_Russia.1251',
+ 'zh_CN.UTF-8': 'Chinese_China.936',
+ },
+ }
+
+ default_locale = locale.setlocale(locale.LC_ALL)
+ for feature, loc in locales[platform.system()].items():
+ try:
+ locale.setlocale(locale.LC_ALL, loc)
+ self.config.available_features.add('locale.{0}'.format(feature))
+ except:
+ self.lit_config.warning('The locale {0} is not supported by '
+ 'your platform. Some tests will be '
+ 'unsupported.'.format(loc))
+ locale.setlocale(locale.LC_ALL, default_locale)
+
+ # Write an "available feature" that combines the triple when
+ # use_system_lib is enabled. This is so that we can easily write XFAIL
+ # markers for tests that are known to fail with versions of libc++ as
+ # were shipped with a particular triple.
+ if self.use_system_lib:
+ self.config.available_features.add(
+ 'with_system_lib=%s' % self.config.target_triple)
+
+ if 'libcpp-has-no-threads' in self.config.available_features:
+ self.compile_flags += ['-D_LIBCPP_HAS_NO_THREADS']
+
+ if 'libcpp-has-no-monotonic-clock' in self.config.available_features:
+ self.compile_flags += ['-D_LIBCPP_HAS_NO_MONOTONIC_CLOCK']
+
+ # Some linux distributions have different locale data than others.
+ # Insert the distributions name and name-version into the available
+ # features to allow tests to XFAIL on them.
+ if sys.platform.startswith('linux'):
+ name, ver, _ = platform.linux_distribution()
+ name = name.lower().strip()
+ ver = ver.lower().strip()
+ self.config.available_features.add(name)
+ self.config.available_features.add('%s-%s' % (name, ver))
+
+ def configure_compile_flags(self):
+ # Configure extra compiler flags.
+ self.compile_flags += ['-I' + self.src_root + '/include',
+ '-I' + self.src_root + '/test/support']
+ if sys.platform.startswith('linux'):
+ self.compile_flags += ['-D__STDC_FORMAT_MACROS',
+ '-D__STDC_LIMIT_MACROS',
+ '-D__STDC_CONSTANT_MACROS']
+
+ def configure_link_flags(self):
+ # Configure library search paths
+ abi_library_path = self.get_lit_conf('abi_library_path', '')
+ self.link_flags += ['-L' + self.obj_root + '/lib']
+ if not self.use_system_lib:
+ self.link_flags += ['-Wl,-rpath', '-Wl,' + self.obj_root + '/lib']
+ if abi_library_path:
+ self.link_flags += ['-L' + abi_library_path,
+ '-Wl,-rpath', '-Wl,' + abi_library_path]
+ # Configure libraries
+ self.link_flags += ['-lc++']
+ link_flags_str = self.get_lit_conf('link_flags')
+ if link_flags_str is None:
+ cxx_abi = self.get_lit_conf('cxx_abi', 'libcxxabi')
+ if cxx_abi == 'libstdc++':
+ self.link_flags += ['-lstdc++']
+ elif cxx_abi == 'libsupc++':
+ self.link_flags += ['-lsupc++']
+ elif cxx_abi == 'libcxxabi':
+ self.link_flags += ['-lc++abi']
+ elif cxx_abi == 'libcxxrt':
+ self.link_flags += ['-lcxxrt']
+ elif cxx_abi == 'none':
+ pass
+ else:
+ self.lit_config.fatal(
+ 'C++ ABI setting %s unsupported for tests' % cxx_abi)
+
+ if sys.platform == 'darwin':
+ self.link_flags += ['-lSystem']
+ elif sys.platform.startswith('linux'):
+ self.link_flags += ['-lgcc_eh', '-lc', '-lm', '-lpthread',
+ '-lrt', '-lgcc_s']
+ elif sys.platform.startswith('freebsd'):
+ self.link_flags += ['-lc', '-lm', '-pthread', '-lgcc_s']
+ else:
+ self.lit_config.fatal("unrecognized system: %r" % sys.platform)
+
+ if link_flags_str:
+ self.link_flags += shlex.split(link_flags_str)
+
+
+ def configure_std_flag(self):
+ # Try and get the std version from the command line. Fall back to
+ # default given in lit.site.cfg is not present. If default is not
+ # present then force c++11.
+ std = self.get_lit_conf('std')
+ if std is None:
+ std = 'c++11'
+ self.lit_config.note('using default std: \'-std=c++11\'')
+ self.compile_flags += ['-std={0}'.format(std)]
+ self.config.available_features.add(std)
+
+ def configure_sanitizer(self):
+ san = self.get_lit_conf('llvm_use_sanitizer', '').strip()
+ if san:
+ # Search for llvm-symbolizer along the compiler path first
+ # and then along the PATH env variable.
+ symbolizer_search_paths = os.environ.get('PATH', '')
+ cxx_path = lit.util.which(self.cxx)
+ if cxx_path is not None:
+ symbolizer_search_paths = os.path.dirname(cxx_path) + \
+ os.pathsep + symbolizer_search_paths
+ llvm_symbolizer = lit.util.which('llvm-symbolizer',
+ symbolizer_search_paths)
+ # Setup the sanitizer compile flags
+ self.compile_flags += ['-g', '-fno-omit-frame-pointer']
+ if sys.platform.startswith('linux'):
+ self.link_flags += ['-ldl']
+ if san == 'Address':
+ self.compile_flags += ['-fsanitize=address']
+ if llvm_symbolizer is not None:
+ self.env['ASAN_SYMBOLIZER_PATH'] = llvm_symbolizer
+ self.config.available_features.add('asan')
+ elif san == 'Memory' or san == 'MemoryWithOrigins':
+ self.compile_flags += ['-fsanitize=memory']
+ if san == 'MemoryWithOrigins':
+ self.compile_flags += ['-fsanitize-memory-track-origins']
+ if llvm_symbolizer is not None:
+ self.env['MSAN_SYMBOLIZER_PATH'] = llvm_symbolizer
+ self.config.available_features.add('msan')
+ elif san == 'Undefined':
+ self.compile_flags += ['-fsanitize=undefined',
+ '-fno-sanitize=vptr,function',
+ '-fno-sanitize-recover', '-O3']
+ self.config.available_features.add('ubsan')
+ elif san == 'Thread':
+ self.compile_flags += ['-fsanitize=thread']
+ self.config.available_features.add('tsan')
+ else:
+ self.lit_config.fatal('unsupported value for '
+ 'libcxx_use_san: {0}'.format(san))
+
+ def configure_triple(self):
+ # Get or infer the target triple.
+ self.config.target_triple = self.get_lit_conf('target_triple')
+ # If no target triple was given, try to infer it from the compiler
+ # under test.
+ if not self.config.target_triple:
+ target_triple = lit.util.capture(
+ [self.cxx, '-dumpmachine']).strip()
+ # Drop sub-major version components from the triple, because the
+ # current XFAIL handling expects exact matches for feature checks.
+ # Example: x86_64-apple-darwin14.0.0 -> x86_64-apple-darwin14
+ # The 5th group handles triples greater than 3 parts
+ # (ex x86_64-pc-linux-gnu).
+ target_triple = re.sub(r'([^-]+)-([^-]+)-([^.]+)([^-]*)(.*)',
+ r'\1-\2-\3\5', target_triple)
+ # linux-gnu is needed in the triple to properly identify linuxes
+ # that use GLIBC. Handle redhat and opensuse triples as special
+ # cases and append the missing `-gnu` portion.
+ if target_triple.endswith('redhat-linux') or \
+ target_triple.endswith('suse-linux'):
+ target_triple += '-gnu'
+ self.config.target_triple = target_triple
+ self.lit_config.note(
+ "inferred target_triple as: %r" % self.config.target_triple)
+
+ def configure_env(self):
+ # Configure extra linker parameters.
+ if sys.platform == 'darwin':
+ if not self.use_system_lib:
+ self.env['DYLD_LIBRARY_PATH'] = os.path.join(self.obj_root,
+ 'lib')
+
+
# name: The name of this test suite.
config.name = 'libc++'
@@ -183,182 +560,11 @@
# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)
-# Figure out which of the required locales we support
-locales = {
- 'Darwin': {
- 'en_US.UTF-8': 'en_US.UTF-8',
- 'cs_CZ.ISO8859-2': 'cs_CZ.ISO8859-2',
- 'fr_FR.UTF-8': 'fr_FR.UTF-8',
- 'fr_CA.ISO8859-1': 'cs_CZ.ISO8859-1',
- 'ru_RU.UTF-8': 'ru_RU.UTF-8',
- 'zh_CN.UTF-8': 'zh_CN.UTF-8',
- },
- 'Linux': {
- 'en_US.UTF-8': 'en_US.UTF-8',
- 'cs_CZ.ISO8859-2': 'cs_CZ.ISO-8859-2',
- 'fr_FR.UTF-8': 'fr_FR.UTF-8',
- 'fr_CA.ISO8859-1': 'fr_CA.ISO-8859-1',
- 'ru_RU.UTF-8': 'ru_RU.UTF-8',
- 'zh_CN.UTF-8': 'zh_CN.UTF-8',
- },
- 'Windows': {
- 'en_US.UTF-8': 'English_United States.1252',
- 'cs_CZ.ISO8859-2': 'Czech_Czech Republic.1250',
- 'fr_FR.UTF-8': 'French_France.1252',
- 'fr_CA.ISO8859-1': 'French_Canada.1252',
- 'ru_RU.UTF-8': 'Russian_Russia.1251',
- 'zh_CN.UTF-8': 'Chinese_China.936',
- },
-}
+cfg_variant = getattr(config, 'configuration_variant', '')
+if cfg_variant:
+ print 'Using configuration variant: %s' % cfg_variant
-for feature, loc in locales[platform.system()].items():
- try:
- locale.setlocale(locale.LC_ALL, loc)
- config.available_features.add('locale.{}'.format(feature))
- except:
- lit_config.warning('The locale {} is not supported by your platform. '
- 'Some tests will be unsupported.'.format(loc))
-
-# Gather various compiler parameters.
-cxx_under_test = lit_config.params.get('cxx_under_test', None)
-if cxx_under_test is None:
- cxx_under_test = getattr(config, 'cxx_under_test', None)
-
- # If no specific cxx_under_test was given, attempt to infer it as clang++.
- if cxx_under_test is None:
- clangxx = lit.util.which('clang++', config.environment['PATH'])
- if clangxx is not None:
- cxx_under_test = clangxx
- lit_config.note("inferred cxx_under_test as: %r" % (cxx_under_test,))
-if cxx_under_test is None:
- lit_config.fatal('must specify user parameter cxx_under_test '
- '(e.g., --param=cxx_under_test=clang++)')
-
-libcxx_src_root = lit_config.params.get('libcxx_src_root', None)
-if libcxx_src_root is None:
- libcxx_src_root = getattr(config, 'libcxx_src_root', None)
- if libcxx_src_root is None:
- libcxx_src_root = os.path.dirname(config.test_source_root)
-
-libcxx_obj_root = lit_config.params.get('libcxx_obj_root', None)
-if libcxx_obj_root is None:
- libcxx_obj_root = getattr(config, 'libcxx_obj_root', None)
- if libcxx_obj_root is None:
- libcxx_obj_root = libcxx_src_root
-
-cxx_has_stdcxx0x_flag_str = lit_config.params.get('cxx_has_stdcxx0x_flag', None)
-if cxx_has_stdcxx0x_flag_str is not None:
- if cxx_has_stdcxx0x_flag_str.lower() in ('1', 'true'):
- cxx_has_stdcxx0x_flag = True
- elif cxx_has_stdcxx0x_flag_str.lower() in ('', '0', 'false'):
- cxx_has_stdcxx0x_flag = False
- else:
- lit_config.fatal(
- 'user parameter cxx_has_stdcxx0x_flag_str should be 0 or 1')
-else:
- cxx_has_stdcxx0x_flag = getattr(config, 'cxx_has_stdcxx0x_flag', True)
-
-# This test suite supports testing against either the system library or the
-# locally built one; the former mode is useful for testing ABI compatibility
-# between the current headers and a shipping dynamic library.
-use_system_lib_str = lit_config.params.get('use_system_lib', None)
-if use_system_lib_str is not None:
- if use_system_lib_str.lower() in ('1', 'true'):
- use_system_lib = True
- elif use_system_lib_str.lower() in ('', '0', 'false'):
- use_system_lib = False
- else:
- lit_config.fatal('user parameter use_system_lib should be 0 or 1')
-else:
- # Default to testing against the locally built libc++ library.
- use_system_lib = False
- lit_config.note("inferred use_system_lib as: %r" % (use_system_lib,))
-
-link_flags = []
-link_flags_str = lit_config.params.get('link_flags', None)
-if link_flags_str is None:
- link_flags_str = getattr(config, 'link_flags', None)
- if link_flags_str is None:
- cxx_abi = getattr(config, 'cxx_abi', 'libcxxabi')
- if cxx_abi == 'libstdc++':
- link_flags += ['-lstdc++']
- elif cxx_abi == 'libsupc++':
- link_flags += ['-lsupc++']
- elif cxx_abi == 'libcxxabi':
- link_flags += ['-lc++abi']
- elif cxx_abi == 'none':
- pass
- else:
- lit_config.fatal('C++ ABI setting %s unsupported for tests' % cxx_abi)
-
- if sys.platform == 'darwin':
- link_flags += ['-lSystem']
- elif sys.platform == 'linux2':
- link_flags += [ '-lgcc_eh', '-lc', '-lm', '-lpthread',
- '-lrt', '-lgcc_s']
- else:
- lit_config.fatal("unrecognized system")
-
- lit_config.note("inferred link_flags as: %r" % (link_flags,))
-if not link_flags_str is None:
- link_flags += shlex.split(link_flags_str)
-
-# Configure extra compiler flags.
-include_paths = ['-I' + libcxx_src_root + '/include',
- '-I' + libcxx_src_root + '/test/support']
-library_paths = ['-L' + libcxx_obj_root + '/lib']
-compile_flags = []
-if cxx_has_stdcxx0x_flag:
- compile_flags += ['-std=c++0x']
-
-# Configure extra linker parameters.
-exec_env = {}
-if sys.platform == 'darwin':
- if not use_system_lib:
- exec_env['DYLD_LIBRARY_PATH'] = os.path.join(libcxx_obj_root, 'lib')
-elif sys.platform == 'linux2':
- if not use_system_lib:
- link_flags += ['-Wl,-R', libcxx_obj_root + '/lib']
- compile_flags += ['-D__STDC_FORMAT_MACROS', '-D__STDC_LIMIT_MACROS',
- '-D__STDC_CONSTANT_MACROS']
-else:
- lit_config.fatal("unrecognized system")
-
-config.test_format = LibcxxTestFormat(
- cxx_under_test,
- # @LOCALMOD-START
- cpp_flags = (([] if use_system_lib else ['-nostdinc++']) +
- compile_flags + include_paths),
- ld_flags = (([] if use_system_lib else ['-nodefaultlibs', '-lc++']) +
- library_paths + link_flags),
- # @LOCALMOD-END
- exec_env = exec_env)
-
-# Get or infer the target triple.
-config.target_triple = lit_config.params.get('target_triple', None)
-# If no target triple was given, try to infer it from the compiler under test.
-if config.target_triple is None:
- config.target_triple = lit.util.capture(
- [cxx_under_test, '-dumpmachine']).strip()
- lit_config.note("inferred target_triple as: %r" % (config.target_triple,))
-
-# @LOCALMOD-START
-# Executable suffix.
-exe_suffix = lit_config.params.get('exe_suffix', "exe")
-
-# Prefix the executable command with a shell.
-shell_prefix = lit_config.params.get('shell_prefix', None)
-if shell_prefix:
- shell_prefix = shlex.split(shell_prefix)
-# @LOCALMOD-END
-
-# Write an "available feature" that combines the triple when use_system_lib is
-# enabled. This is so that we can easily write XFAIL markers for tests that are
-# known to fail with versions of libc++ as were shipped with a particular
-# triple.
-if use_system_lib:
- # Drop sub-major version components from the triple, because the current
- # XFAIL handling expects exact matches for feature checks.
- sanitized_triple = re.sub(r"([^-]+)-([^-]+)-([^-.]+).*", r"\1-\2-\3",
- config.target_triple)
- config.available_features.add('with_system_lib=%s' % (sanitized_triple,))
+# Construct an object of the type named `<VARIANT>Configuration`.
+configuration = globals()['%sConfiguration' % cfg_variant](lit_config, config)
+configuration.configure()
+config.test_format = configuration.get_test_format()
diff --git a/test/lit.site.cfg.in b/test/lit.site.cfg.in
index 1a73dff..43fdb7d 100644
--- a/test/lit.site.cfg.in
+++ b/test/lit.site.cfg.in
@@ -1,11 +1,13 @@
@AUTO_GEN_COMMENT@
config.cxx_under_test = "@LIBCXX_COMPILER@"
-config.cxx_has_stdcxx0x_flag = @LIBCXX_HAS_STDCXX0X_FLAG@
+config.std = "@LIBCXX_STD_VERSION@"
config.libcxx_src_root = "@LIBCXX_SOURCE_DIR@"
config.libcxx_obj_root = "@LIBCXX_BINARY_DIR@"
config.python_executable = "@PYTHON_EXECUTABLE@"
config.enable_shared = @LIBCXX_ENABLE_SHARED@
config.cxx_abi = "@LIBCXX_CXX_ABI_LIBNAME@"
+config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
+config.abi_library_path = "@LIBCXX_CXX_ABI_LIBRARY_PATH@"
# Let the main config do the real work.
lit_config.load_config(config, "@LIBCXX_SOURCE_DIR@/test/lit.cfg")
diff --git a/test/localization/c.locales/clocale.pass.cpp b/test/localization/c.locales/clocale.pass.cpp
index 8774865..3b3e933 100644
--- a/test/localization/c.locales/clocale.pass.cpp
+++ b/test/localization/c.locales/clocale.pass.cpp
@@ -43,6 +43,6 @@
int main()
{
std::lconv lc;
- static_assert((std::is_same<__typeof__(std::setlocale(0, "")), char*>::value), "");
- static_assert((std::is_same<__typeof__(std::localeconv()), std::lconv*>::value), "");
+ static_assert((std::is_same<decltype(std::setlocale(0, "")), char*>::value), "");
+ static_assert((std::is_same<decltype(std::localeconv()), std::lconv*>::value), "");
}
diff --git a/test/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp b/test/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp
index d644125..69af9ac 100644
--- a/test/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp
+++ b/test/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp
@@ -18,6 +18,11 @@
// has any difference from "C" collation. But I do believe I'm picking
// up the OS's collation files.
+// TODO investigation needed.
+// Glibc seems to collate files differently from the way Apple's C library does
+// it.
+// XFAIL: linux-gnu
+
#include <locale>
#include <string>
#include <cassert>
diff --git a/test/localization/locale.categories/category.collate/locale.collate.byname/transform.pass.cpp b/test/localization/locale.categories/category.collate/locale.collate.byname/transform.pass.cpp
index 20a7d48..8971412 100644
--- a/test/localization/locale.categories/category.collate/locale.collate.byname/transform.pass.cpp
+++ b/test/localization/locale.categories/category.collate/locale.collate.byname/transform.pass.cpp
@@ -13,6 +13,8 @@
// string_type transform(const charT* low, const charT* high) const;
+// REQUIRES: locale.en_US.UTF-8
+
#include <locale>
#include <string>
#include <cassert>
diff --git a/test/localization/locale.categories/category.ctype/facet.ctype.special/facet.ctype.char.dtor/dtor.pass.cpp b/test/localization/locale.categories/category.ctype/facet.ctype.special/facet.ctype.char.dtor/dtor.pass.cpp
index 6d9e1cd..f7c957b 100644
--- a/test/localization/locale.categories/category.ctype/facet.ctype.special/facet.ctype.char.dtor/dtor.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/facet.ctype.special/facet.ctype.char.dtor/dtor.pass.cpp
@@ -13,6 +13,8 @@
// ~ctype();
+// UNSUPPORTED: asan, msan
+
#include <locale>
#include <cassert>
#include <new>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/is_1.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/is_1.pass.cpp
index 0ade80a..509e52a 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/is_1.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/is_1.pass.cpp
@@ -13,6 +13,8 @@
// bool is(mask m, charT c) const;
+// REQUIRES: locale.en_US.UTF-8
+
#include <locale>
#include <type_traits>
#include <cassert>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/is_many.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/is_many.pass.cpp
index 39f6071..a993466 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/is_many.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/is_many.pass.cpp
@@ -13,6 +13,8 @@
// const charT* do_is(const charT* low, const charT* high, mask* vec) const;
+// REQUIRES: locale.en_US.UTF-8
+
#include <locale>
#include <string>
#include <vector>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_1.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_1.pass.cpp
index 98bd6dc..904ced3 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_1.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_1.pass.cpp
@@ -8,7 +8,7 @@
//===----------------------------------------------------------------------===//
// REQUIRES: locale.en_US.UTF-8
-// REQUIRES: locale.fr_CA.UTF-8
+// REQUIRES: locale.fr_CA.ISO8859-1
// <locale>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_many.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_many.pass.cpp
index 0162a6f..6f25b9c 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_many.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_many.pass.cpp
@@ -8,7 +8,7 @@
//===----------------------------------------------------------------------===//
// REQUIRES: locale.en_US.UTF-8
-// REQUIRES: locale.fr_CA.UTF-8
+// REQUIRES: locale.fr_CA.ISO8859-1
// <locale>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/scan_is.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/scan_is.pass.cpp
index ab08794..25b2c3e 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/scan_is.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/scan_is.pass.cpp
@@ -13,6 +13,8 @@
// const charT* scan_is(mask m, const charT* low, const charT* high) const;
+// REQUIRES: locale.en_US.UTF-8
+
#include <locale>
#include <string>
#include <vector>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/scan_not.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/scan_not.pass.cpp
index 126fc5a..270ae1f 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/scan_not.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/scan_not.pass.cpp
@@ -13,6 +13,8 @@
// const charT* scan_not(mask m, const charT* low, const charT* high) const;
+// REQUIRES: locale.en_US.UTF-8
+
#include <locale>
#include <string>
#include <vector>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp
index 8f84195..f957149 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp
@@ -15,6 +15,7 @@
// XFAIL: with_system_lib=x86_64-apple-darwin11
// XFAIL: with_system_lib=x86_64-apple-darwin12
+// XFAIL: linux
#include <locale>
#include <cassert>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp
index 1f48076..9579f4d 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp
@@ -15,6 +15,7 @@
// XFAIL: with_system_lib=x86_64-apple-darwin11
// XFAIL: with_system_lib=x86_64-apple-darwin12
+// XFAIL: linux
#include <locale>
#include <string>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp
index d215791..9b09e81 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp
@@ -15,6 +15,7 @@
// XFAIL: with_system_lib=x86_64-apple-darwin11
// XFAIL: with_system_lib=x86_64-apple-darwin12
+// XFAIL: linux
#include <locale>
#include <cassert>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp
index c3c32e7..87e9b97 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp
@@ -15,6 +15,7 @@
// XFAIL: with_system_lib=x86_64-apple-darwin11
// XFAIL: with_system_lib=x86_64-apple-darwin12
+// XFAIL: linux
#include <locale>
#include <string>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp
index ed56dd3..320e08d 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp
@@ -15,6 +15,8 @@
// I doubt this test is portable
+// XFAIL: linux
+
#include <locale>
#include <cassert>
#include <limits.h>
diff --git a/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp b/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp
index c522762..b46ae32 100644
--- a/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp
+++ b/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp
@@ -15,6 +15,8 @@
// I doubt this test is portable
+// XFAIL: linux
+
#include <locale>
#include <string>
#include <vector>
diff --git a/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_en_US.pass.cpp b/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_en_US.pass.cpp
index edd9015..0f034fa 100644
--- a/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_en_US.pass.cpp
+++ b/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_en_US.pass.cpp
@@ -14,6 +14,8 @@
// iter_type get(iter_type b, iter_type e, bool intl, ios_base& iob,
// ios_base::iostate& err, long double& v) const;
+// REQUIRES: locale.en_US.UTF-8
+
#include <locale>
#include <ios>
#include <streambuf>
diff --git a/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp b/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp
index 44cec76..ec563fe 100644
--- a/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp
+++ b/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp
@@ -9,6 +9,12 @@
//
// XFAIL: apple-darwin
+// Failure related to GLIBC's use of U00A0 as mon_thousands_sep
+// and U002E as mon_decimal_point.
+// TODO: U00A0 should be investigated.
+// Possibly related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=16006
+// XFAIL: linux
+
// REQUIRES: locale.ru_RU.UTF-8
// <locale>
diff --git a/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp b/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp
index 374443a..07a33f7 100644
--- a/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp
+++ b/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp
@@ -16,6 +16,9 @@
// iter_type get(iter_type b, iter_type e, bool intl, ios_base& iob,
// ios_base::iostate& err, long double& v) const;
+// TODO For zh_CN GLIBC puts the negative sign after the currency symbol.
+// XFAIL: linux-gnu
+
#include <locale>
#include <ios>
#include <streambuf>
diff --git a/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_string_en_US.pass.cpp b/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_string_en_US.pass.cpp
index 29c5266..b9099f4 100644
--- a/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_string_en_US.pass.cpp
+++ b/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_string_en_US.pass.cpp
@@ -14,6 +14,8 @@
// iter_type get(iter_type b, iter_type e, bool intl, ios_base& iob,
// ios_base::iostate& err, string_type& v) const;
+// REQUIRES: locale.en_US.UTF-8
+
#include <locale>
#include <ios>
#include <streambuf>
diff --git a/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_en_US.pass.cpp b/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_en_US.pass.cpp
index 8614807..db193ea 100644
--- a/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_en_US.pass.cpp
+++ b/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_en_US.pass.cpp
@@ -14,6 +14,8 @@
// iter_type put(iter_type s, bool intl, ios_base& f, char_type fill,
// long double units) const;
+// REQUIRES: locale.en_US.UTF-8
+
#include <locale>
#include <ios>
#include <streambuf>
diff --git a/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp b/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp
index 1f335e4..54bfcfb 100644
--- a/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp
+++ b/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp
@@ -9,6 +9,12 @@
//
// XFAIL: apple-darwin
+// Failure related to GLIBC's use of U00A0 as mon_thousands_sep
+// and U002E as mon_decimal_point.
+// TODO: U00A0 should be investigated.
+// Possibly related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=16006
+// XFAIL: linux
+
// REQUIRES: locale.ru_RU.UTF-8
// <locale>
diff --git a/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp b/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp
index 242701e..633e188 100644
--- a/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp
+++ b/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp
@@ -16,6 +16,9 @@
// iter_type put(iter_type s, bool intl, ios_base& f, char_type fill,
// long double units) const;
+// TODO For zh_CN GLIBC puts the negative sign after the currency symbol.
+// XFAIL: linux-gnu
+
#include <locale>
#include <ios>
#include <streambuf>
diff --git a/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_string_en_US.pass.cpp b/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_string_en_US.pass.cpp
index 13c6ef7..659f948 100644
--- a/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_string_en_US.pass.cpp
+++ b/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_string_en_US.pass.cpp
@@ -14,6 +14,8 @@
// iter_type put(iter_type s, bool intl, ios_base& f, char_type fill,
// const string_type& units) const;
+// REQUIRES: locale.en_US.UTF-8
+
#include <locale>
#include <ios>
#include <streambuf>
diff --git a/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp b/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp
index 16d403d..8270377 100644
--- a/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp
+++ b/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp
@@ -7,13 +7,16 @@
//
//===----------------------------------------------------------------------===//
-// <locale>
-
// REQUIRES: locale.en_US.UTF-8
// REQUIRES: locale.fr_FR.UTF-8
// REQUIRES: locale.ru_RU.UTF-8
// REQUIRES: locale.zh_CN.UTF-8
+// Russia uses ',' for the decimal separator. GLIBC returns '.'
+// XFAIL: linux
+
+// <locale>
+
// class moneypunct_byname<charT, International>
// charT decimal_point() const;
diff --git a/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp b/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp
index b7e16c6..a878283 100644
--- a/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp
+++ b/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp
@@ -18,6 +18,12 @@
// charT thousands_sep() const;
+// Failure related to GLIBC's use of U00A0 as mon_thousands_sep
+// and U002E as mon_decimal_point.
+// TODO: U00A0 should be investigated.
+// Possibly related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=16006
+// XFAIL: linux-gnu
+
#include <locale>
#include <limits>
#include <cassert>
diff --git a/test/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp b/test/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp
index 2010dca..9359612 100644
--- a/test/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp
+++ b/test/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp
@@ -13,6 +13,9 @@
// iter_type put(iter_type s, ios_base& iob, char_type fill, long double v) const;
+// TODO GLIBC uses a different string for positive and negative NAN numbers.
+// XFAIL: linux-gnu
+
#include <locale>
#include <ios>
#include <cassert>
diff --git a/test/localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp b/test/localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp
index 77ee5b3..9a06157 100644
--- a/test/localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp
+++ b/test/localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp
@@ -12,6 +12,10 @@
// REQUIRES: locale.ru_RU.UTF-8
// REQUIRES: locale.zh_CN.UTF-8
+// GLIBC Expects "10/06/2009" for fr_FR as opposed to "10.06.2009"
+// GLIBC also failes on the zh_CN test.
+// XFAIL: linux
+
// <locale>
// class time_get_byname<charT, InputIterator>
@@ -79,6 +83,7 @@
assert(t.tm_year == 109);
assert(err == std::ios_base::eofbit);
}
+
{
const my_facet f(LOCALE_zh_CN_UTF_8, 1);
const char in[] = "2009/06/10";
diff --git a/test/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp b/test/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp
index 7d0034d..170f33a 100644
--- a/test/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp
+++ b/test/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp
@@ -12,6 +12,10 @@
// REQUIRES: locale.ru_RU.UTF-8
// REQUIRES: locale.zh_CN.UTF-8
+// GLIBC Expects "10/06/2009" for fr_FR as opposed to "10.06.2009"
+// GLIBC also failes on the zh_CN test.
+// XFAIL: linux
+
// <locale>
// class time_get_byname<charT, InputIterator>
diff --git a/test/localization/locale.categories/category.time/locale.time.get.byname/get_monthname.pass.cpp b/test/localization/locale.categories/category.time/locale.time.get.byname/get_monthname.pass.cpp
index a924cef..a442ae5 100644
--- a/test/localization/locale.categories/category.time/locale.time.get.byname/get_monthname.pass.cpp
+++ b/test/localization/locale.categories/category.time/locale.time.get.byname/get_monthname.pass.cpp
@@ -12,6 +12,12 @@
// REQUIRES: locale.ru_RU.UTF-8
// REQUIRES: locale.zh_CN.UTF-8
+// NOTE: debian and opensuse use old locale data for ru_RU.UTF-8 abreviated
+// months. This locale data was changed in glibc 2.14.
+// Debian uses glibc 2.13 as of 20/11/2014
+// OpenSuse uses glibc 2.19 with old locale data as of 20/11/2014
+// XFAIL: debian, opensuse
+
// <locale>
// class time_get_byname<charT, InputIterator>
diff --git a/test/localization/locale.categories/category.time/locale.time.get.byname/get_monthname_wide.pass.cpp b/test/localization/locale.categories/category.time/locale.time.get.byname/get_monthname_wide.pass.cpp
index 009dc49..631a500 100644
--- a/test/localization/locale.categories/category.time/locale.time.get.byname/get_monthname_wide.pass.cpp
+++ b/test/localization/locale.categories/category.time/locale.time.get.byname/get_monthname_wide.pass.cpp
@@ -12,6 +12,12 @@
// REQUIRES: locale.ru_RU.UTF-8
// REQUIRES: locale.zh_CN.UTF-8
+// NOTE: debian and opensuse use bad locale data for ru_RU.UTF-8 abreviated
+// months. This locale data was fixed in glibc 2.14.
+// Debian uses glibc 2.13 as of 20/11/2014
+// OpenSuse uses glibc 2.19 with old locale data as of 20/11/2014
+// XFAIL: debian, opensuse
+
// <locale>
// class time_get_byname<charT, InputIterator>
diff --git a/test/localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp b/test/localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp
index 536859e..72b6327 100644
--- a/test/localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp
+++ b/test/localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp
@@ -19,6 +19,9 @@
// iter_type get(iter_type s, iter_type end, ios_base& f,
// ios_base::iostate& err, tm *t, char format, char modifier = 0) const;
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <locale>
#include <cassert>
#include "test_iterators.h"
diff --git a/test/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp b/test/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp
index 36c8a8e..ae8bce2 100644
--- a/test/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp
+++ b/test/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp
@@ -19,6 +19,9 @@
// iter_type get(iter_type s, iter_type end, ios_base& f,
// ios_base::iostate& err, tm *t, char format, char modifier = 0) const;
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <locale>
#include <cassert>
#include "test_iterators.h"
diff --git a/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp b/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp
index db070be..09055ad 100644
--- a/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp
+++ b/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp
@@ -20,6 +20,9 @@
// get_weekday(iter_type s, iter_type end, ios_base& str,
// ios_base::iostate& err, tm* t) const;
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <locale>
#include <cassert>
#include "test_iterators.h"
diff --git a/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp b/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp
index ac607ba..31135a3 100644
--- a/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp
+++ b/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp
@@ -20,6 +20,9 @@
// get_weekday(iter_type s, iter_type end, ios_base& str,
// ios_base::iostate& err, tm* t) const;
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <locale>
#include <cassert>
#include "test_iterators.h"
diff --git a/test/localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp b/test/localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp
index ff3bb82..3e7538d 100644
--- a/test/localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp
+++ b/test/localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp
@@ -24,6 +24,9 @@
// ~time_put_byname();
// };
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <locale>
#include <cassert>
#include "test_iterators.h"
diff --git a/test/localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp b/test/localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp
index 577655f..427d7c5 100644
--- a/test/localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp
+++ b/test/localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp
@@ -14,6 +14,9 @@
// iter_type put(iter_type s, ios_base& str, char_type fill, const tm* t,
// char format, char modifier = 0) const;
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <locale>
#include <cassert>
#include "test_iterators.h"
diff --git a/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp b/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp
index b49eca4..d5112a9 100644
--- a/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp
+++ b/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp
@@ -16,6 +16,9 @@
// string grouping() const;
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <locale>
#include <cassert>
diff --git a/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp b/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp
index 80b440a..b1bd03f 100644
--- a/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp
+++ b/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp
@@ -16,6 +16,9 @@
// char_type thousands_sep() const;
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <locale>
#include <cassert>
diff --git a/test/localization/locale.stdcvt/codecvt_utf16.pass.cpp b/test/localization/locale.stdcvt/codecvt_utf16.pass.cpp
index 0569e4d..7e38021 100644
--- a/test/localization/locale.stdcvt/codecvt_utf16.pass.cpp
+++ b/test/localization/locale.stdcvt/codecvt_utf16.pass.cpp
@@ -17,6 +17,8 @@
// // unspecified
// };
+// UNSUPPORTED: asan, msan
+
// Not a portable test
#include <codecvt>
diff --git a/test/localization/locale.stdcvt/codecvt_utf8.pass.cpp b/test/localization/locale.stdcvt/codecvt_utf8.pass.cpp
index 4232f59..cc06e95 100644
--- a/test/localization/locale.stdcvt/codecvt_utf8.pass.cpp
+++ b/test/localization/locale.stdcvt/codecvt_utf8.pass.cpp
@@ -17,6 +17,8 @@
// // unspecified
// };
+// UNSUPPORTED: asan, msan
+
// Not a portable test
#include <codecvt>
diff --git a/test/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp b/test/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp
index 6935c3e..3649f15 100644
--- a/test/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp
+++ b/test/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp
@@ -14,6 +14,8 @@
// wbuffer_convert(streambuf *bytebuf = 0, Codecvt *pcvt = new Codecvt,
// state_type state = state_type());
+// UNSUPPORTED: asan, msan
+
#include <locale>
#include <codecvt>
#include <sstream>
diff --git a/test/localization/locales/locale/locale.cons/assign.pass.cpp b/test/localization/locales/locale/locale.cons/assign.pass.cpp
index 4aca354..75ce9b5 100644
--- a/test/localization/locales/locale/locale.cons/assign.pass.cpp
+++ b/test/localization/locales/locale/locale.cons/assign.pass.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
// REQUIRES: locale.ru_RU.UTF-8
+// UNSUPPORTED: msan, asan
// <locale>
diff --git a/test/localization/locales/locale/locale.cons/char_pointer.pass.cpp b/test/localization/locales/locale/locale.cons/char_pointer.pass.cpp
index 8b4509b..01857a4 100644
--- a/test/localization/locales/locale/locale.cons/char_pointer.pass.cpp
+++ b/test/localization/locales/locale/locale.cons/char_pointer.pass.cpp
@@ -9,6 +9,7 @@
// REQUIRES: locale.ru_RU.UTF-8
// REQUIRES: locale.zh_CN.UTF-8
+// UNSUPPORTED: msan, asan
// <locale>
diff --git a/test/localization/locales/locale/locale.cons/copy.pass.cpp b/test/localization/locales/locale/locale.cons/copy.pass.cpp
index 7dd7cf4..629c9e6 100644
--- a/test/localization/locales/locale/locale.cons/copy.pass.cpp
+++ b/test/localization/locales/locale/locale.cons/copy.pass.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
// REQUIRES: locale.fr_FR.UTF-8
+// UNSUPPORTED: msan, asan
// <locale>
diff --git a/test/localization/locales/locale/locale.cons/default.pass.cpp b/test/localization/locales/locale/locale.cons/default.pass.cpp
index 0d46a76..25db9bb 100644
--- a/test/localization/locales/locale/locale.cons/default.pass.cpp
+++ b/test/localization/locales/locale/locale.cons/default.pass.cpp
@@ -11,6 +11,8 @@
// locale() throw();
+// UNSUPPORTED: asan, msan
+
#include <locale>
#include <new>
#include <cassert>
diff --git a/test/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp b/test/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp
index 6bd1f63..eaadbb9 100644
--- a/test/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp
+++ b/test/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp
@@ -9,6 +9,7 @@
// REQUIRES: locale.en_US.UTF-8
// REQUIRES: locale.ru_RU.UTF-8
+// UNSUPPORTED: msan, asan
// <locale>
diff --git a/test/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp b/test/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp
index f7349aa..8b83bc0 100644
--- a/test/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp
+++ b/test/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
// REQUIRES: locale.ru_RU.UTF-8
+// UNSUPPORTED: msan, asan
// <locale>
diff --git a/test/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp b/test/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp
index 05d87a4..05f0619 100644
--- a/test/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp
+++ b/test/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp
@@ -9,6 +9,7 @@
// REQUIRES: locale.en_US.UTF-8
// REQUIRES: locale.ru_RU.UTF-8
+// UNSUPPORTED: msan, asan
// <locale>
diff --git a/test/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp b/test/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp
index 34718c8..66be76d 100644
--- a/test/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp
+++ b/test/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
// REQUIRES: locale.ru_RU.UTF-8
+// UNSUPPORTED: msan, asan
// <locale>
diff --git a/test/localization/locales/locale/locale.cons/string.pass.cpp b/test/localization/locales/locale/locale.cons/string.pass.cpp
index 6c80df0..32c3507 100644
--- a/test/localization/locales/locale/locale.cons/string.pass.cpp
+++ b/test/localization/locales/locale/locale.cons/string.pass.cpp
@@ -9,6 +9,7 @@
// REQUIRES: locale.ru_RU.UTF-8
// REQUIRES: locale.zh_CN.UTF-8
+// UNSUPPORTED: msan, asan
// <locale>
diff --git a/test/localization/locales/locale/locale.members/combine.pass.cpp b/test/localization/locales/locale/locale.members/combine.pass.cpp
index 8d74da0..8f189c7 100644
--- a/test/localization/locales/locale/locale.members/combine.pass.cpp
+++ b/test/localization/locales/locale/locale.members/combine.pass.cpp
@@ -11,6 +11,8 @@
// template <class Facet> locale combine(const locale& other) const;
+// UNSUPPORTED: asan, msan
+
#include <locale>
#include <new>
#include <cassert>
diff --git a/test/numerics/c.math/cmath.pass.cpp b/test/numerics/c.math/cmath.pass.cpp
index 973bea0..0b0d862 100644
--- a/test/numerics/c.math/cmath.pass.cpp
+++ b/test/numerics/c.math/cmath.pass.cpp
@@ -24,11 +24,88 @@
operator T () { return T(N); }
};
+// See PR21083
+// Ambiguous is a user-defined type that defines its own overloads of cmath
+// functions. When the std overloads are candidates too (by using or adl),
+// they should not interfere.
+struct Ambiguous : std::true_type { // ADL
+ operator float () { return 0.f; }
+ operator double () { return 0.; }
+};
+Ambiguous abs(Ambiguous){ return Ambiguous(); }
+Ambiguous acos(Ambiguous){ return Ambiguous(); }
+Ambiguous asin(Ambiguous){ return Ambiguous(); }
+Ambiguous atan(Ambiguous){ return Ambiguous(); }
+Ambiguous atan2(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous ceil(Ambiguous){ return Ambiguous(); }
+Ambiguous cos(Ambiguous){ return Ambiguous(); }
+Ambiguous cosh(Ambiguous){ return Ambiguous(); }
+Ambiguous exp(Ambiguous){ return Ambiguous(); }
+Ambiguous fabs(Ambiguous){ return Ambiguous(); }
+Ambiguous floor(Ambiguous){ return Ambiguous(); }
+Ambiguous fmod(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous frexp(Ambiguous, int*){ return Ambiguous(); }
+Ambiguous ldexp(Ambiguous, int){ return Ambiguous(); }
+Ambiguous log(Ambiguous){ return Ambiguous(); }
+Ambiguous log10(Ambiguous){ return Ambiguous(); }
+Ambiguous modf(Ambiguous, Ambiguous*){ return Ambiguous(); }
+Ambiguous pow(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous sin(Ambiguous){ return Ambiguous(); }
+Ambiguous sinh(Ambiguous){ return Ambiguous(); }
+Ambiguous sqrt(Ambiguous){ return Ambiguous(); }
+Ambiguous tan(Ambiguous){ return Ambiguous(); }
+Ambiguous tanh(Ambiguous){ return Ambiguous(); }
+Ambiguous signbit(Ambiguous){ return Ambiguous(); }
+Ambiguous fpclassify(Ambiguous){ return Ambiguous(); }
+Ambiguous isfinite(Ambiguous){ return Ambiguous(); }
+Ambiguous isnormal(Ambiguous){ return Ambiguous(); }
+Ambiguous isgreater(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous isgreaterequal(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous isless(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous islessequal(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous islessgreater(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous isunordered(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous acosh(Ambiguous){ return Ambiguous(); }
+Ambiguous asinh(Ambiguous){ return Ambiguous(); }
+Ambiguous atanh(Ambiguous){ return Ambiguous(); }
+Ambiguous cbrt(Ambiguous){ return Ambiguous(); }
+Ambiguous copysign(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous erf(Ambiguous){ return Ambiguous(); }
+Ambiguous erfc(Ambiguous){ return Ambiguous(); }
+Ambiguous exp2(Ambiguous){ return Ambiguous(); }
+Ambiguous expm1(Ambiguous){ return Ambiguous(); }
+Ambiguous fdim(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous fma(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous fmax(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous fmin(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous hypot(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous ilogb(Ambiguous){ return Ambiguous(); }
+Ambiguous lgamma(Ambiguous){ return Ambiguous(); }
+Ambiguous llrint(Ambiguous){ return Ambiguous(); }
+Ambiguous llround(Ambiguous){ return Ambiguous(); }
+Ambiguous log1p(Ambiguous){ return Ambiguous(); }
+Ambiguous log2(Ambiguous){ return Ambiguous(); }
+Ambiguous logb(Ambiguous){ return Ambiguous(); }
+Ambiguous lrint(Ambiguous){ return Ambiguous(); }
+Ambiguous lround(Ambiguous){ return Ambiguous(); }
+Ambiguous nearbyint(Ambiguous){ return Ambiguous(); }
+Ambiguous nextafter(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous nexttoward(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous remainder(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous remquo(Ambiguous, Ambiguous, int*){ return Ambiguous(); }
+Ambiguous rint(Ambiguous){ return Ambiguous(); }
+Ambiguous round(Ambiguous){ return Ambiguous(); }
+Ambiguous scalbln(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous scalbn(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous tgamma(Ambiguous){ return Ambiguous(); }
+Ambiguous trunc(Ambiguous){ return Ambiguous(); }
+
void test_abs()
{
static_assert((std::is_same<decltype(std::abs((float)0)), float>::value), "");
static_assert((std::is_same<decltype(std::abs((double)0)), double>::value), "");
static_assert((std::is_same<decltype(std::abs((long double)0)), long double>::value), "");
+ static_assert((std::is_same<decltype(abs(Ambiguous())), Ambiguous>::value), "");
assert(std::abs(-1.) == 1);
}
@@ -47,6 +124,7 @@
static_assert((std::is_same<decltype(std::acos((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::acosf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::acosl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(acos(Ambiguous())), Ambiguous>::value), "");
assert(std::acos(1) == 0);
}
@@ -65,6 +143,7 @@
static_assert((std::is_same<decltype(std::asin((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::asinf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::asinl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(asin(Ambiguous())), Ambiguous>::value), "");
assert(std::asin(0) == 0);
}
@@ -83,6 +162,7 @@
static_assert((std::is_same<decltype(std::atan((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::atanf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::atanl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(atan(Ambiguous())), Ambiguous>::value), "");
assert(std::atan(0) == 0);
}
@@ -105,6 +185,7 @@
static_assert((std::is_same<decltype(std::atan2f(0,0)), float>::value), "");
static_assert((std::is_same<decltype(std::atan2l(0,0)), long double>::value), "");
static_assert((std::is_same<decltype(std::atan2((int)0, (int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(atan2(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::atan2(0,1) == 0);
}
@@ -123,6 +204,7 @@
static_assert((std::is_same<decltype(std::ceil((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::ceilf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::ceill(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(ceil(Ambiguous())), Ambiguous>::value), "");
assert(std::ceil(0) == 0);
}
@@ -141,6 +223,7 @@
static_assert((std::is_same<decltype(std::cos((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::cosf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::cosl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(cos(Ambiguous())), Ambiguous>::value), "");
assert(std::cos(0) == 1);
}
@@ -159,6 +242,7 @@
static_assert((std::is_same<decltype(std::cosh((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::coshf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::coshl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(cosh(Ambiguous())), Ambiguous>::value), "");
assert(std::cosh(0) == 1);
}
@@ -177,6 +261,7 @@
static_assert((std::is_same<decltype(std::exp((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::expf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::expl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(exp(Ambiguous())), Ambiguous>::value), "");
assert(std::exp(0) == 1);
}
@@ -195,6 +280,7 @@
static_assert((std::is_same<decltype(std::fabs((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::fabsf(0.0f)), float>::value), "");
static_assert((std::is_same<decltype(std::fabsl(0.0L)), long double>::value), "");
+ static_assert((std::is_same<decltype(fabs(Ambiguous())), Ambiguous>::value), "");
assert(std::fabs(-1) == 1);
}
@@ -213,6 +299,7 @@
static_assert((std::is_same<decltype(std::floor((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::floorf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::floorl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(floor(Ambiguous())), Ambiguous>::value), "");
assert(std::floor(1) == 1);
}
@@ -235,6 +322,7 @@
static_assert((std::is_same<decltype(std::fmodf(0,0)), float>::value), "");
static_assert((std::is_same<decltype(std::fmodl(0,0)), long double>::value), "");
static_assert((std::is_same<decltype(std::fmod((int)0, (int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(fmod(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::fmod(1.5,1) == .5);
}
@@ -254,6 +342,7 @@
static_assert((std::is_same<decltype(std::frexp((long double)0, &ip)), long double>::value), "");
static_assert((std::is_same<decltype(std::frexpf(0, &ip)), float>::value), "");
static_assert((std::is_same<decltype(std::frexpl(0, &ip)), long double>::value), "");
+ static_assert((std::is_same<decltype(frexp(Ambiguous(), &ip)), Ambiguous>::value), "");
assert(std::frexp(0, &ip) == 0);
}
@@ -273,6 +362,7 @@
static_assert((std::is_same<decltype(std::ldexp((long double)0, ip)), long double>::value), "");
static_assert((std::is_same<decltype(std::ldexpf(0, ip)), float>::value), "");
static_assert((std::is_same<decltype(std::ldexpl(0, ip)), long double>::value), "");
+ static_assert((std::is_same<decltype(ldexp(Ambiguous(), ip)), Ambiguous>::value), "");
assert(std::ldexp(1, ip) == 2);
}
@@ -291,6 +381,7 @@
static_assert((std::is_same<decltype(std::log((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::logf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::logl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(log(Ambiguous())), Ambiguous>::value), "");
assert(std::log(1) == 0);
}
@@ -309,6 +400,7 @@
static_assert((std::is_same<decltype(std::log10((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::log10f(0)), float>::value), "");
static_assert((std::is_same<decltype(std::log10l(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(log10(Ambiguous())), Ambiguous>::value), "");
assert(std::log10(1) == 0);
}
@@ -319,6 +411,7 @@
static_assert((std::is_same<decltype(std::modf((long double)0, (long double*)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::modff(0, (float*)0)), float>::value), "");
static_assert((std::is_same<decltype(std::modfl(0, (long double*)0)), long double>::value), "");
+ static_assert((std::is_same<decltype(modf(Ambiguous(), (Ambiguous*)0)), Ambiguous>::value), "");
double i;
assert(std::modf(1., &i) == 0);
}
@@ -345,6 +438,7 @@
// static_assert((std::is_same<decltype(std::pow(Value<int>(), (int)0)), double>::value), "");
// static_assert((std::is_same<decltype(std::pow(Value<long double>(), (float)0)), long double>::value), "");
// static_assert((std::is_same<decltype(std::pow((float) 0, Value<float>())), float>::value), "");
+ static_assert((std::is_same<decltype(pow(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::pow(1,1) == 1);
// assert(std::pow(Value<int,1>(), Value<float,1>()) == 1);
// assert(std::pow(1.0f, Value<double,1>()) == 1);
@@ -367,6 +461,7 @@
static_assert((std::is_same<decltype(std::sin((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::sinf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::sinl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(sin(Ambiguous())), Ambiguous>::value), "");
assert(std::sin(0) == 0);
}
@@ -385,6 +480,7 @@
static_assert((std::is_same<decltype(std::sinh((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::sinhf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::sinhl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(sinh(Ambiguous())), Ambiguous>::value), "");
assert(std::sinh(0) == 0);
}
@@ -403,6 +499,7 @@
static_assert((std::is_same<decltype(std::sqrt((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::sqrtf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::sqrtl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(sqrt(Ambiguous())), Ambiguous>::value), "");
assert(std::sqrt(4) == 2);
}
@@ -421,6 +518,7 @@
static_assert((std::is_same<decltype(std::tan((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::tanf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::tanl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(tan(Ambiguous())), Ambiguous>::value), "");
assert(std::tan(0) == 0);
}
@@ -439,6 +537,7 @@
static_assert((std::is_same<decltype(std::tanh((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::tanhf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::tanhl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(tanh(Ambiguous())), Ambiguous>::value), "");
assert(std::tanh(0) == 0);
}
@@ -451,6 +550,7 @@
static_assert((std::is_same<decltype(std::signbit((double)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::signbit(0)), bool>::value), "");
static_assert((std::is_same<decltype(std::signbit((long double)0)), bool>::value), "");
+ static_assert((std::is_same<decltype(signbit(Ambiguous())), Ambiguous>::value), "");
assert(std::signbit(-1.0) == true);
}
@@ -463,6 +563,7 @@
static_assert((std::is_same<decltype(std::fpclassify((double)0)), int>::value), "");
static_assert((std::is_same<decltype(std::fpclassify(0)), int>::value), "");
static_assert((std::is_same<decltype(std::fpclassify((long double)0)), int>::value), "");
+ static_assert((std::is_same<decltype(fpclassify(Ambiguous())), Ambiguous>::value), "");
assert(std::fpclassify(-1.0) == FP_NORMAL);
}
@@ -475,6 +576,7 @@
static_assert((std::is_same<decltype(std::isfinite((double)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isfinite(0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isfinite((long double)0)), bool>::value), "");
+ static_assert((std::is_same<decltype(isfinite(Ambiguous())), Ambiguous>::value), "");
assert(std::isfinite(-1.0) == true);
}
@@ -487,6 +589,7 @@
static_assert((std::is_same<decltype(std::isnormal((double)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isnormal(0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isnormal((long double)0)), bool>::value), "");
+ static_assert((std::is_same<decltype(isnormal(Ambiguous())), Ambiguous>::value), "");
assert(std::isnormal(-1.0) == true);
}
@@ -505,6 +608,7 @@
static_assert((std::is_same<decltype(std::isgreater((long double)0, (float)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isgreater((long double)0, (double)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isgreater((long double)0, (long double)0)), bool>::value), "");
+ static_assert((std::is_same<decltype(isgreater(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::isgreater(-1.0, 0.F) == false);
}
@@ -523,6 +627,7 @@
static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (float)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (double)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (long double)0)), bool>::value), "");
+ static_assert((std::is_same<decltype(isgreaterequal(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::isgreaterequal(-1.0, 0.F) == false);
}
@@ -541,6 +646,7 @@
static_assert((std::is_same<decltype(std::isless((long double)0, (float)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isless((long double)0, (double)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isless((long double)0, (long double)0)), bool>::value), "");
+ static_assert((std::is_same<decltype(isless(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::isless(-1.0, 0.F) == true);
}
@@ -559,6 +665,7 @@
static_assert((std::is_same<decltype(std::islessequal((long double)0, (float)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::islessequal((long double)0, (double)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::islessequal((long double)0, (long double)0)), bool>::value), "");
+ static_assert((std::is_same<decltype(islessequal(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::islessequal(-1.0, 0.F) == true);
}
@@ -577,6 +684,7 @@
static_assert((std::is_same<decltype(std::islessgreater((long double)0, (float)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::islessgreater((long double)0, (double)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::islessgreater((long double)0, (long double)0)), bool>::value), "");
+ static_assert((std::is_same<decltype(islessgreater(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::islessgreater(-1.0, 0.F) == true);
}
@@ -595,6 +703,7 @@
static_assert((std::is_same<decltype(std::isunordered((long double)0, (float)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isunordered((long double)0, (double)0)), bool>::value), "");
static_assert((std::is_same<decltype(std::isunordered((long double)0, (long double)0)), bool>::value), "");
+ static_assert((std::is_same<decltype(isunordered(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::isunordered(-1.0, 0.F) == false);
}
@@ -613,6 +722,7 @@
static_assert((std::is_same<decltype(std::acosh((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::acoshf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::acoshl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(acosh(Ambiguous())), Ambiguous>::value), "");
assert(std::acosh(1) == 0);
}
@@ -631,6 +741,7 @@
static_assert((std::is_same<decltype(std::asinh((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::asinhf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::asinhl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(asinh(Ambiguous())), Ambiguous>::value), "");
assert(std::asinh(0) == 0);
}
@@ -649,6 +760,7 @@
static_assert((std::is_same<decltype(std::atanh((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::atanhf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::atanhl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(atanh(Ambiguous())), Ambiguous>::value), "");
assert(std::atanh(0) == 0);
}
@@ -667,6 +779,7 @@
static_assert((std::is_same<decltype(std::cbrt((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::cbrtf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::cbrtl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(cbrt(Ambiguous())), Ambiguous>::value), "");
assert(std::cbrt(1) == 1);
}
@@ -689,6 +802,7 @@
static_assert((std::is_same<decltype(std::copysignf(0,0)), float>::value), "");
static_assert((std::is_same<decltype(std::copysignl(0,0)), long double>::value), "");
static_assert((std::is_same<decltype(std::copysign((int)0, (int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(copysign(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::copysign(1,1) == 1);
}
@@ -707,6 +821,7 @@
static_assert((std::is_same<decltype(std::erf((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::erff(0)), float>::value), "");
static_assert((std::is_same<decltype(std::erfl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(erf(Ambiguous())), Ambiguous>::value), "");
assert(std::erf(0) == 0);
}
@@ -725,6 +840,7 @@
static_assert((std::is_same<decltype(std::erfc((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::erfcf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::erfcl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(erfc(Ambiguous())), Ambiguous>::value), "");
assert(std::erfc(0) == 1);
}
@@ -743,6 +859,7 @@
static_assert((std::is_same<decltype(std::exp2((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::exp2f(0)), float>::value), "");
static_assert((std::is_same<decltype(std::exp2l(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(exp2(Ambiguous())), Ambiguous>::value), "");
assert(std::exp2(1) == 2);
}
@@ -761,6 +878,7 @@
static_assert((std::is_same<decltype(std::expm1((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::expm1f(0)), float>::value), "");
static_assert((std::is_same<decltype(std::expm1l(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(expm1(Ambiguous())), Ambiguous>::value), "");
assert(std::expm1(0) == 0);
}
@@ -783,6 +901,7 @@
static_assert((std::is_same<decltype(std::fdimf(0,0)), float>::value), "");
static_assert((std::is_same<decltype(std::fdiml(0,0)), long double>::value), "");
static_assert((std::is_same<decltype(std::fdim((int)0, (int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(fdim(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::fdim(1,0) == 1);
}
@@ -820,6 +939,7 @@
static_assert((std::is_same<decltype(std::fmaf(0,0,0)), float>::value), "");
static_assert((std::is_same<decltype(std::fmal(0,0,0)), long double>::value), "");
+ static_assert((std::is_same<decltype(fma(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::fma(1,1,1) == 2);
}
@@ -842,6 +962,7 @@
static_assert((std::is_same<decltype(std::fmaxf(0,0)), float>::value), "");
static_assert((std::is_same<decltype(std::fmaxl(0,0)), long double>::value), "");
static_assert((std::is_same<decltype(std::fmax((int)0, (int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(fmax(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::fmax(1,0) == 1);
}
@@ -864,6 +985,7 @@
static_assert((std::is_same<decltype(std::fminf(0,0)), float>::value), "");
static_assert((std::is_same<decltype(std::fminl(0,0)), long double>::value), "");
static_assert((std::is_same<decltype(std::fmin((int)0, (int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(fmin(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::fmin(1,0) == 0);
}
@@ -886,6 +1008,7 @@
static_assert((std::is_same<decltype(std::hypotf(0,0)), float>::value), "");
static_assert((std::is_same<decltype(std::hypotl(0,0)), long double>::value), "");
static_assert((std::is_same<decltype(std::hypot((int)0, (int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(hypot(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::hypot(3,4) == 5);
}
@@ -904,6 +1027,7 @@
static_assert((std::is_same<decltype(std::ilogb((long double)0)), int>::value), "");
static_assert((std::is_same<decltype(std::ilogbf(0)), int>::value), "");
static_assert((std::is_same<decltype(std::ilogbl(0)), int>::value), "");
+ static_assert((std::is_same<decltype(ilogb(Ambiguous())), Ambiguous>::value), "");
assert(std::ilogb(1) == 0);
}
@@ -922,6 +1046,7 @@
static_assert((std::is_same<decltype(std::lgamma((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::lgammaf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::lgammal(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(lgamma(Ambiguous())), Ambiguous>::value), "");
assert(std::lgamma(1) == 0);
}
@@ -940,6 +1065,7 @@
static_assert((std::is_same<decltype(std::llrint((long double)0)), long long>::value), "");
static_assert((std::is_same<decltype(std::llrintf(0)), long long>::value), "");
static_assert((std::is_same<decltype(std::llrintl(0)), long long>::value), "");
+ static_assert((std::is_same<decltype(llrint(Ambiguous())), Ambiguous>::value), "");
assert(std::llrint(1) == 1LL);
}
@@ -958,6 +1084,7 @@
static_assert((std::is_same<decltype(std::llround((long double)0)), long long>::value), "");
static_assert((std::is_same<decltype(std::llroundf(0)), long long>::value), "");
static_assert((std::is_same<decltype(std::llroundl(0)), long long>::value), "");
+ static_assert((std::is_same<decltype(llround(Ambiguous())), Ambiguous>::value), "");
assert(std::llround(1) == 1LL);
}
@@ -976,6 +1103,7 @@
static_assert((std::is_same<decltype(std::log1p((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::log1pf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::log1pl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(log1p(Ambiguous())), Ambiguous>::value), "");
assert(std::log1p(0) == 0);
}
@@ -994,6 +1122,7 @@
static_assert((std::is_same<decltype(std::log2((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::log2f(0)), float>::value), "");
static_assert((std::is_same<decltype(std::log2l(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(log2(Ambiguous())), Ambiguous>::value), "");
assert(std::log2(1) == 0);
}
@@ -1012,6 +1141,7 @@
static_assert((std::is_same<decltype(std::logb((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::logbf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::logbl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(logb(Ambiguous())), Ambiguous>::value), "");
assert(std::logb(1) == 0);
}
@@ -1030,6 +1160,7 @@
static_assert((std::is_same<decltype(std::lrint((long double)0)), long>::value), "");
static_assert((std::is_same<decltype(std::lrintf(0)), long>::value), "");
static_assert((std::is_same<decltype(std::lrintl(0)), long>::value), "");
+ static_assert((std::is_same<decltype(lrint(Ambiguous())), Ambiguous>::value), "");
assert(std::lrint(1) == 1L);
}
@@ -1048,6 +1179,7 @@
static_assert((std::is_same<decltype(std::lround((long double)0)), long>::value), "");
static_assert((std::is_same<decltype(std::lroundf(0)), long>::value), "");
static_assert((std::is_same<decltype(std::lroundl(0)), long>::value), "");
+ static_assert((std::is_same<decltype(lround(Ambiguous())), Ambiguous>::value), "");
assert(std::lround(1) == 1L);
}
@@ -1073,6 +1205,7 @@
static_assert((std::is_same<decltype(std::nearbyint((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::nearbyintf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::nearbyintl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(nearbyint(Ambiguous())), Ambiguous>::value), "");
assert(std::nearbyint(1) == 1);
}
@@ -1095,6 +1228,7 @@
static_assert((std::is_same<decltype(std::nextafterf(0,0)), float>::value), "");
static_assert((std::is_same<decltype(std::nextafterl(0,0)), long double>::value), "");
static_assert((std::is_same<decltype(std::nextafter((int)0, (int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(nextafter(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::nextafter(0,1) == hexfloat<double>(0x1, 0, -1074));
}
@@ -1113,6 +1247,7 @@
static_assert((std::is_same<decltype(std::nexttoward((long double)0, (long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::nexttowardf(0, (long double)0)), float>::value), "");
static_assert((std::is_same<decltype(std::nexttowardl(0, (long double)0)), long double>::value), "");
+ static_assert((std::is_same<decltype(nexttoward(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::nexttoward(0, 1) == hexfloat<double>(0x1, 0, -1074));
}
@@ -1135,6 +1270,7 @@
static_assert((std::is_same<decltype(std::remainderf(0,0)), float>::value), "");
static_assert((std::is_same<decltype(std::remainderl(0,0)), long double>::value), "");
static_assert((std::is_same<decltype(std::remainder((int)0, (int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(remainder(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::remainder(0.5,1) == 0.5);
}
@@ -1158,6 +1294,7 @@
static_assert((std::is_same<decltype(std::remquof(0,0, &ip)), float>::value), "");
static_assert((std::is_same<decltype(std::remquol(0,0, &ip)), long double>::value), "");
static_assert((std::is_same<decltype(std::remquo((int)0, (int)0, &ip)), double>::value), "");
+ static_assert((std::is_same<decltype(remquo(Ambiguous(), Ambiguous(), &ip)), Ambiguous>::value), "");
assert(std::remquo(0.5,1, &ip) == 0.5);
}
@@ -1176,6 +1313,7 @@
static_assert((std::is_same<decltype(std::rint((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::rintf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::rintl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(rint(Ambiguous())), Ambiguous>::value), "");
assert(std::rint(1) == 1);
}
@@ -1194,6 +1332,7 @@
static_assert((std::is_same<decltype(std::round((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::roundf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::roundl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(round(Ambiguous())), Ambiguous>::value), "");
assert(std::round(1) == 1);
}
@@ -1212,6 +1351,7 @@
static_assert((std::is_same<decltype(std::scalbln((long double)0, (long)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::scalblnf(0, (long)0)), float>::value), "");
static_assert((std::is_same<decltype(std::scalblnl(0, (long)0)), long double>::value), "");
+ static_assert((std::is_same<decltype(scalbln(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::scalbln(1, 1) == 2);
}
@@ -1230,6 +1370,7 @@
static_assert((std::is_same<decltype(std::scalbn((long double)0, (int)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::scalbnf(0, (int)0)), float>::value), "");
static_assert((std::is_same<decltype(std::scalbnl(0, (int)0)), long double>::value), "");
+ static_assert((std::is_same<decltype(scalbn(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::scalbn(1, 1) == 2);
}
@@ -1248,6 +1389,7 @@
static_assert((std::is_same<decltype(std::tgamma((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::tgammaf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::tgammal(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(tgamma(Ambiguous())), Ambiguous>::value), "");
assert(std::tgamma(1) == 1);
}
@@ -1266,6 +1408,7 @@
static_assert((std::is_same<decltype(std::trunc((long double)0)), long double>::value), "");
static_assert((std::is_same<decltype(std::truncf(0)), float>::value), "");
static_assert((std::is_same<decltype(std::truncl(0)), long double>::value), "");
+ static_assert((std::is_same<decltype(trunc(Ambiguous())), Ambiguous>::value), "");
assert(std::trunc(1) == 1);
}
diff --git a/test/numerics/numarray/template.mask.array/mask.array.assign/mask_array.pass.cpp b/test/numerics/numarray/template.mask.array/mask.array.assign/mask_array.pass.cpp
index 3bab0df..29cb787 100644
--- a/test/numerics/numarray/template.mask.array/mask.array.assign/mask_array.pass.cpp
+++ b/test/numerics/numarray/template.mask.array/mask.array.assign/mask_array.pass.cpp
@@ -18,6 +18,7 @@
int main()
{
+ {
int a1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
const std::size_t N1 = sizeof(a1)/sizeof(a1[0]);
bool b1[N1] = {true, false, false, true, true, false,
@@ -48,4 +49,18 @@
assert(v1[13] == 13);
assert(v1[14] == 14);
assert(v1[15] == 15);
+ }
+ // Test return value of assignment
+ {
+ int a1[] = {0, 1, 2};
+ int a2[] = {3, 4, 5};
+ bool b1[] = {true, false, true};
+ std::valarray<int> v1(a1, 3);
+ std::valarray<int> v2(a2, 3);
+ std::valarray<bool> const vb1(b1, 3);
+ std::mask_array<int> m1 = v1[vb1];
+ std::mask_array<int> const m2 = v2[vb1];
+ std::mask_array<int> const & r = (m1 = m2);
+ assert(&r == &m1);
+ }
}
diff --git a/test/numerics/numarray/template.slice.array/slice.arr.assign/slice_array.pass.cpp b/test/numerics/numarray/template.slice.array/slice.arr.assign/slice_array.pass.cpp
index b2b111a..72275e0 100644
--- a/test/numerics/numarray/template.slice.array/slice.arr.assign/slice_array.pass.cpp
+++ b/test/numerics/numarray/template.slice.array/slice.arr.assign/slice_array.pass.cpp
@@ -18,6 +18,7 @@
int main()
{
+ {
int a1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int a2[] = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12};
std::valarray<int> v1(a1, sizeof(a1)/sizeof(a1[0]));
@@ -40,4 +41,15 @@
assert(v1[13] == -11);
assert(v1[14] == 14);
assert(v1[15] == 15);
+ }
+ // Test return value of assignment.
+ {
+ int a1[] = {0, 1, 2};
+ int a2[] = {3, 4, 3};
+ std::valarray<int> v1(a1, 3);
+ std::slice_array<int> s1 = v1[std::slice(1, 1, 1)];
+ std::slice_array<int> s2 = v1[std::slice(0, 1, 1)];
+ std::slice_array<int> const & s3 = (s1 = s2);
+ assert(&s1 == &s3);
+ }
}
diff --git a/test/numerics/rand/rand.device/ctor.pass.cpp b/test/numerics/rand/rand.device/ctor.pass.cpp
index dfa546b..2d9bc2f 100644
--- a/test/numerics/rand/rand.device/ctor.pass.cpp
+++ b/test/numerics/rand/rand.device/ctor.pass.cpp
@@ -11,39 +11,75 @@
// class random_device;
-// explicit random_device(const string& token = "/dev/urandom");
+// explicit random_device(const string& token = implementation-defined);
+
+// For the following ctors, the standard states: "The semantics and default
+// value of the token parameter are implementation-defined". Implementations
+// therefore aren't required to accept any string, but the default shouldn't
+// throw.
#include <random>
#include <cassert>
#include <unistd.h>
-int main()
-{
- try
- {
- std::random_device r("wrong file");
- assert(false);
- }
- catch (const std::system_error& e)
- {
- }
- {
- std::random_device r;
- }
- {
- int ec;
- ec = close(STDIN_FILENO);
- assert(!ec);
- ec = close(STDOUT_FILENO);
- assert(!ec);
- ec = close(STDERR_FILENO);
- assert(!ec);
- std::random_device r;
- }
- {
- std::random_device r("/dev/urandom");;
- }
- {
- std::random_device r("/dev/random");;
- }
+bool is_valid_random_device(const std::string &token) {
+#if defined(_WIN32)
+ return true;
+#elif defined(_LIBCPP_USING_NACL_RANDOM)
+ return token == "/dev/urandom";
+#else // !defined(_WIN32) && !defined(_LIBCPP_USING_NACL_RANDOM)
+ // Not an exhaustive list: they're the only tokens that are tested below.
+ return token == "/dev/urandom" || token == "/dev/random";
+#endif // defined(_WIN32) || defined(_LIBCPP_USING_NACL_RANDOM)
+}
+
+void check_random_device_valid(const std::string &token) {
+ std::random_device r(token);
+}
+
+void check_random_device_invalid(const std::string &token) {
+ try {
+ std::random_device r(token);
+ assert(false);
+ } catch (const std::system_error &e) {
+ }
+}
+
+int main() {
+ { std::random_device r; }
+
+ {
+ int ec;
+ ec = close(STDIN_FILENO);
+ assert(!ec);
+ ec = close(STDOUT_FILENO);
+ assert(!ec);
+ ec = close(STDERR_FILENO);
+ assert(!ec);
+ std::random_device r;
+ }
+
+ {
+ std::string token = "wrong file";
+ if (is_valid_random_device(token))
+ check_random_device_valid(token);
+ else
+ check_random_device_invalid(token);
+ }
+
+ {
+ std::string token = "/dev/urandom";
+ if (is_valid_random_device(token))
+ check_random_device_valid(token);
+ else
+ check_random_device_invalid(token);
+ }
+
+ {
+ std::string token = "/dev/random";
+ if (is_valid_random_device(token))
+ check_random_device_valid(token);
+ else
+ check_random_device_invalid(token);
+ }
}
diff --git a/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/eval.pass.cpp b/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/eval.pass.cpp
index 3bfd2af..85ff2ac 100644
--- a/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/eval.pass.cpp
+++ b/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/eval.pass.cpp
@@ -322,6 +322,17 @@
assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
}
{
+ const int N = 100000;
+ std::mt19937 gen1;
+ std::mt19937 gen2;
+
+ std::binomial_distribution<> dist1(5, 0.1);
+ std::binomial_distribution<unsigned> dist2(5, 0.1);
+
+ for(int i = 0; i < N; ++i)
+ assert(dist1(gen1) == dist2(gen2));
+ }
+ {
typedef std::binomial_distribution<> D;
typedef std::mt19937 G;
G g;
diff --git a/test/re/re.alg/re.alg.match/basic.pass.cpp b/test/re/re.alg/re.alg.match/basic.pass.cpp
index d63817d..4139cea 100644
--- a/test/re/re.alg/re.alg.match/basic.pass.cpp
+++ b/test/re/re.alg/re.alg.match/basic.pass.cpp
@@ -18,6 +18,9 @@
// const basic_regex<charT, traits>& e,
// regex_constants::match_flag_type flags = regex_constants::match_default);
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <regex>
#include <cassert>
diff --git a/test/re/re.alg/re.alg.match/ecma.pass.cpp b/test/re/re.alg/re.alg.match/ecma.pass.cpp
index 67df410..3854056 100644
--- a/test/re/re.alg/re.alg.match/ecma.pass.cpp
+++ b/test/re/re.alg/re.alg.match/ecma.pass.cpp
@@ -18,6 +18,9 @@
// const basic_regex<charT, traits>& e,
// regex_constants::match_flag_type flags = regex_constants::match_default);
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <regex>
#include <cassert>
diff --git a/test/re/re.alg/re.alg.match/extended.pass.cpp b/test/re/re.alg/re.alg.match/extended.pass.cpp
index 733c16e..c54825d 100644
--- a/test/re/re.alg/re.alg.match/extended.pass.cpp
+++ b/test/re/re.alg/re.alg.match/extended.pass.cpp
@@ -18,6 +18,9 @@
// const basic_regex<charT, traits>& e,
// regex_constants::match_flag_type flags = regex_constants::match_default);
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <regex>
#include <cassert>
diff --git a/test/re/re.alg/re.alg.match/lookahead_capture.pass.cpp b/test/re/re.alg/re.alg.match/lookahead_capture.pass.cpp
index 78e1e65..949739b 100644
--- a/test/re/re.alg/re.alg.match/lookahead_capture.pass.cpp
+++ b/test/re/re.alg/re.alg.match/lookahead_capture.pass.cpp
@@ -27,10 +27,10 @@
int main()
{
{
- std::regex re{"^(?=(.))a$"};
+ std::regex re("^(?=(.))a$");
assert(re.mark_count() == 1);
- std::string s{"a"};
+ std::string s("a");
std::smatch m;
assert(std::regex_match(s, m, re));
assert(m.size() == 2);
@@ -39,10 +39,10 @@
}
{
- std::regex re{"^(a)(?=(.))(b)$"};
+ std::regex re("^(a)(?=(.))(b)$");
assert(re.mark_count() == 3);
- std::string s{"ab"};
+ std::string s("ab");
std::smatch m;
assert(std::regex_match(s, m, re));
assert(m.size() == 4);
@@ -53,10 +53,10 @@
}
{
- std::regex re{"^(.)(?=(.)(?=.(.)))(...)$"};
+ std::regex re("^(.)(?=(.)(?=.(.)))(...)$");
assert(re.mark_count() == 4);
- std::string s{"abcd"};
+ std::string s("abcd");
std::smatch m;
assert(std::regex_match(s, m, re));
assert(m.size() == 5);
@@ -68,10 +68,10 @@
}
{
- std::regex re{"^(a)(?!([^b]))(.c)$"};
+ std::regex re("^(a)(?!([^b]))(.c)$");
assert(re.mark_count() == 3);
- std::string s{"abc"};
+ std::string s("abc");
std::smatch m;
assert(std::regex_match(s, m, re));
assert(m.size() == 4);
@@ -82,10 +82,10 @@
}
{
- std::regex re{"^(?!((b)))(?=(.))(?!(abc)).b$"};
+ std::regex re("^(?!((b)))(?=(.))(?!(abc)).b$");
assert(re.mark_count() == 4);
- std::string s{"ab"};
+ std::string s("ab");
std::smatch m;
assert(std::regex_match(s, m, re));
assert(m.size() == 5);
diff --git a/test/re/re.alg/re.alg.match/parse_curly_brackets.pass.cpp b/test/re/re.alg/re.alg.match/parse_curly_brackets.pass.cpp
index 6a45418..0b4c694 100644
--- a/test/re/re.alg/re.alg.match/parse_curly_brackets.pass.cpp
+++ b/test/re/re.alg/re.alg.match/parse_curly_brackets.pass.cpp
@@ -25,9 +25,9 @@
void
test1()
{
- std::string re{"\\{a\\}"};
- std::string target{"{a}"};
- std::regex regex{re};
+ std::string re("\\{a\\}");
+ std::string target("{a}");
+ std::regex regex(re);
std::smatch smatch;
assert((std::regex_match(target, smatch, regex)));
}
@@ -35,9 +35,9 @@
void
test2()
{
- std::string re{"\\{a\\}"};
- std::string target{"{a}"};
- std::regex regex{re, std::regex::extended};
+ std::string re("\\{a\\}");
+ std::string target("{a}");
+ std::regex regex(re, std::regex::extended);
std::smatch smatch;
assert((std::regex_match(target, smatch, regex)));
}
@@ -45,9 +45,9 @@
void
test3()
{
- std::string re{"\\{a\\}"};
- std::string target{"{a}"};
- std::regex regex{re, std::regex::awk};
+ std::string re("\\{a\\}");
+ std::string target("{a}");
+ std::regex regex(re, std::regex::awk);
std::smatch smatch;
assert((std::regex_match(target, smatch, regex)));
}
@@ -55,9 +55,9 @@
void
test4()
{
- std::string re{"\\{a\\}"};
- std::string target{"{a}"};
- std::regex regex{re, std::regex::egrep};
+ std::string re("\\{a\\}");
+ std::string target("{a}");
+ std::regex regex(re, std::regex::egrep);
std::smatch smatch;
assert((std::regex_match(target, smatch, regex)));
}
diff --git a/test/re/re.alg/re.alg.search/awk.pass.cpp b/test/re/re.alg/re.alg.search/awk.pass.cpp
index 74c25c1..521e98b 100644
--- a/test/re/re.alg/re.alg.search/awk.pass.cpp
+++ b/test/re/re.alg/re.alg.search/awk.pass.cpp
@@ -18,6 +18,9 @@
// const basic_regex<charT, traits>& e,
// regex_constants::match_flag_type flags = regex_constants::match_default);
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <regex>
#include <cassert>
diff --git a/test/re/re.alg/re.alg.search/backup.pass.cpp b/test/re/re.alg/re.alg.search/backup.pass.cpp
index 6bfad42..7da5860 100644
--- a/test/re/re.alg/re.alg.search/backup.pass.cpp
+++ b/test/re/re.alg/re.alg.search/backup.pass.cpp
@@ -26,10 +26,10 @@
// This regex_iterator uses regex_search(__wrap_iter<_Iter> __first, ...)
// Test for http://llvm.org/bugs/show_bug.cgi?id=16240 fixed in r185273.
{
- std::string s{"aaaa a"};
- std::regex re{"\\ba"};
- std::sregex_iterator it{s.begin(), s.end(), re};
- std::sregex_iterator end{};
+ std::string s("aaaa a");
+ std::regex re("\\ba");
+ std::sregex_iterator it(s.begin(), s.end(), re);
+ std::sregex_iterator end = std::sregex_iterator();
assert(it->position(0) == 0);
assert(it->length(0) == 1);
@@ -44,11 +44,11 @@
// This regex_iterator uses regex_search(_BidirectionalIterator __first, ...)
{
- std::string s{"aaaa a"};
- std::list<char> l{s.begin(), s.end()};
- std::regex re{"\\ba"};
- std::regex_iterator<std::list<char>::iterator> it{l.begin(), l.end(), re};
- std::regex_iterator<std::list<char>::iterator> end{};
+ std::string s("aaaa a");
+ std::list<char> l(s.begin(), s.end());
+ std::regex re("\\ba");
+ std::regex_iterator<std::list<char>::iterator> it(l.begin(), l.end(), re);
+ std::regex_iterator<std::list<char>::iterator> end = std::regex_iterator<std::list<char>::iterator>();
assert(it->position(0) == 0);
assert(it->length(0) == 1);
diff --git a/test/re/re.alg/re.alg.search/basic.pass.cpp b/test/re/re.alg/re.alg.search/basic.pass.cpp
index c8a5051..838294e 100644
--- a/test/re/re.alg/re.alg.search/basic.pass.cpp
+++ b/test/re/re.alg/re.alg.search/basic.pass.cpp
@@ -18,6 +18,9 @@
// const basic_regex<charT, traits>& e,
// regex_constants::match_flag_type flags = regex_constants::match_default);
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <regex>
#include <cassert>
diff --git a/test/re/re.alg/re.alg.search/ecma.pass.cpp b/test/re/re.alg/re.alg.search/ecma.pass.cpp
index 965c29d..2796850 100644
--- a/test/re/re.alg/re.alg.search/ecma.pass.cpp
+++ b/test/re/re.alg/re.alg.search/ecma.pass.cpp
@@ -18,6 +18,9 @@
// const basic_regex<charT, traits>& e,
// regex_constants::match_flag_type flags = regex_constants::match_default);
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <regex>
#include <cassert>
diff --git a/test/re/re.alg/re.alg.search/extended.pass.cpp b/test/re/re.alg/re.alg.search/extended.pass.cpp
index c181cff..a8a121b 100644
--- a/test/re/re.alg/re.alg.search/extended.pass.cpp
+++ b/test/re/re.alg/re.alg.search/extended.pass.cpp
@@ -18,6 +18,9 @@
// const basic_regex<charT, traits>& e,
// regex_constants::match_flag_type flags = regex_constants::match_default);
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <regex>
#include <cassert>
diff --git a/test/re/re.alg/re.alg.search/no_update_pos.pass.cpp b/test/re/re.alg/re.alg.search/no_update_pos.pass.cpp
index 63fcdaf..ef9cec5 100644
--- a/test/re/re.alg/re.alg.search/no_update_pos.pass.cpp
+++ b/test/re/re.alg/re.alg.search/no_update_pos.pass.cpp
@@ -25,9 +25,9 @@
// of the text.
const char *text = "aaa\naa";
- std::regex re{"^a"};
- std::cregex_iterator it{text, text+6, re};
- std::cregex_iterator end{};
+ std::regex re("^a");
+ std::cregex_iterator it(text, text+6, re);
+ std::cregex_iterator end = std::cregex_iterator();
assert(it->str() == "a");
assert(it->position(0) == 0);
diff --git a/test/re/re.regex/re.regex.construct/awk_oct.pass.cpp b/test/re/re.regex/re.regex.construct/awk_oct.pass.cpp
index 11fce3f..4b7e5e6 100644
--- a/test/re/re.regex/re.regex.construct/awk_oct.pass.cpp
+++ b/test/re/re.regex/re.regex.construct/awk_oct.pass.cpp
@@ -21,8 +21,8 @@
{
using std::regex_constants::awk;
- assert(std::regex_match("\4", std::regex{"\\4", awk}));
- assert(std::regex_match("\41", std::regex{"\\41", awk}));
- assert(std::regex_match("\141", std::regex{"\\141", awk}));
- assert(std::regex_match("\1411", std::regex{"\\1411", awk}));
+ assert(std::regex_match("\4", std::regex("\\4", awk)));
+ assert(std::regex_match("\41", std::regex("\\41", awk)));
+ assert(std::regex_match("\141", std::regex("\\141", awk)));
+ assert(std::regex_match("\1411", std::regex("\\1411", awk)));
}
diff --git a/test/re/re.traits/lookup_collatename.pass.cpp b/test/re/re.traits/lookup_collatename.pass.cpp
index 049246e..d495f8a 100644
--- a/test/re/re.traits/lookup_collatename.pass.cpp
+++ b/test/re/re.traits/lookup_collatename.pass.cpp
@@ -17,6 +17,9 @@
// string_type
// lookup_collatename(ForwardIterator first, ForwardIterator last) const;
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <regex>
#include <iterator>
#include <cassert>
diff --git a/test/re/re.traits/translate_nocase.pass.cpp b/test/re/re.traits/translate_nocase.pass.cpp
index 5e042ae..0692e00 100644
--- a/test/re/re.traits/translate_nocase.pass.cpp
+++ b/test/re/re.traits/translate_nocase.pass.cpp
@@ -14,9 +14,14 @@
// charT translate_nocase(charT c) const;
+// REQUIRES: locale.en_US.UTF-8
+
// XFAIL: with_system_lib=x86_64-apple-darwin11
// XFAIL: with_system_lib=x86_64-apple-darwin12
+// TODO: investigation needed
+// XFAIL: linux-gnu
+
#include <regex>
#include <cassert>
diff --git a/test/strings/basic.string/string.capacity/max_size.pass.cpp b/test/strings/basic.string/string.capacity/max_size.pass.cpp
index e6a3aa4..f426425 100644
--- a/test/strings/basic.string/string.capacity/max_size.pass.cpp
+++ b/test/strings/basic.string/string.capacity/max_size.pass.cpp
@@ -11,6 +11,13 @@
// size_type max_size() const;
+// NOTE: asan and msan will fail for one of two reasons
+// 1. If allocator_may_return_null=0 then they will fail because the allocation
+// returns null.
+// 2. If allocator_may_return_null=1 then they will fail because the allocation
+// is too large to succeed.
+// UNSUPPORTED: asan, msan
+
#include <string>
#include <cassert>
@@ -40,23 +47,11 @@
template <class S>
void
-test3(const S& s)
-{
- S s2(s);
- const size_t sz = s2.max_size() + 1;
- try { s2.resize(sz, 'x'); }
- catch ( const std::length_error & ) { return ; }
- assert ( false );
-}
-
-template <class S>
-void
test(const S& s)
{
assert(s.max_size() >= s.size());
test1(s);
test2(s);
- test3(s);
}
int main()
diff --git a/test/strings/basic.string/string.capacity/over_max_size.pass.cpp b/test/strings/basic.string/string.capacity/over_max_size.pass.cpp
new file mode 100644
index 0000000..bbadb9c
--- /dev/null
+++ b/test/strings/basic.string/string.capacity/over_max_size.pass.cpp
@@ -0,0 +1,47 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <string>
+
+// size_type max_size() const;
+
+#include <string>
+#include <cassert>
+
+#include "min_allocator.h"
+
+template <class S>
+void
+test(const S& s)
+{
+ assert(s.max_size() >= s.size());
+ S s2(s);
+ const size_t sz = s2.max_size() + 1;
+ try { s2.resize(sz, 'x'); }
+ catch ( const std::length_error & ) { return ; }
+ assert ( false );
+}
+
+int main()
+{
+ {
+ typedef std::string S;
+ test(S());
+ test(S("123"));
+ test(S("12345678901234567890123456789012345678901234567890"));
+ }
+#if __cplusplus >= 201103L
+ {
+ typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
+ test(S());
+ test(S("123"));
+ test(S("12345678901234567890123456789012345678901234567890"));
+ }
+#endif
+}
diff --git a/test/strings/c.strings/cuchar.pass.cpp b/test/strings/c.strings/cuchar.pass.cpp
index d4c15db..022c656 100644
--- a/test/strings/c.strings/cuchar.pass.cpp
+++ b/test/strings/c.strings/cuchar.pass.cpp
@@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
-// XFAIL: apple-darwin
+// XFAIL: *
// <cuchar>
diff --git a/test/strings/c.strings/version_cuchar.pass.cpp b/test/strings/c.strings/version_cuchar.pass.cpp
index fa47f0f..dcfdcc3 100644
--- a/test/strings/c.strings/version_cuchar.pass.cpp
+++ b/test/strings/c.strings/version_cuchar.pass.cpp
@@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
-// XFAIL: apple-darwin
+// XFAIL: *
// <cuchar>
diff --git a/test/support/asan_testing.h b/test/support/asan_testing.h
index c8797bd..45ad04b 100644
--- a/test/support/asan_testing.h
+++ b/test/support/asan_testing.h
@@ -19,7 +19,7 @@
template <typename T, typename Alloc>
bool is_contiguous_container_asan_correct ( const std::vector<T, Alloc> &c )
{
- if ( std::is_same<Alloc, std::allocator<T>>::value && c.data() != NULL)
+ if ( std::is_same<Alloc, std::allocator<T> >::value && c.data() != NULL)
return __sanitizer_verify_contiguous_container (
c.data(), c.data() + c.size(), c.data() + c.capacity()) != 0;
return true;
@@ -34,4 +34,4 @@
#endif
-#endif // ASAN_TESTING_H
\ No newline at end of file
+#endif // ASAN_TESTING_H
diff --git a/test/support/cmpxchg_loop.h b/test/support/cmpxchg_loop.h
new file mode 100644
index 0000000..c39e3fb
--- /dev/null
+++ b/test/support/cmpxchg_loop.h
@@ -0,0 +1,51 @@
+#include <atomic>
+
+template <class A, class T>
+bool cmpxchg_weak_loop(A& atomic, T& expected, T desired) {
+ for (int i = 0; i < 10; i++) {
+ if (atomic.compare_exchange_weak(expected, desired) == true) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+template <class A, class T>
+bool cmpxchg_weak_loop(A& atomic, T& expected, T desired,
+ std::memory_order success,
+ std::memory_order failure) {
+ for (int i = 0; i < 10; i++) {
+ if (atomic.compare_exchange_weak(expected, desired, success,
+ failure) == true) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+template <class A, class T>
+bool c_cmpxchg_weak_loop(A* atomic, T* expected, T desired) {
+ for (int i = 0; i < 10; i++) {
+ if (std::atomic_compare_exchange_weak(atomic, expected, desired) == true) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+template <class A, class T>
+bool c_cmpxchg_weak_loop(A* atomic, T* expected, T desired,
+ std::memory_order success,
+ std::memory_order failure) {
+ for (int i = 0; i < 10; i++) {
+ if (std::atomic_compare_exchange_weak_explicit(atomic, expected, desired,
+ success, failure) == true) {
+ return true;
+ }
+ }
+
+ return false;
+}
diff --git a/test/support/counting_predicates.hpp b/test/support/counting_predicates.hpp
index e825848..aab6a97 100644
--- a/test/support/counting_predicates.hpp
+++ b/test/support/counting_predicates.hpp
@@ -14,33 +14,33 @@
template <typename Predicate, typename Arg>
struct unary_counting_predicate : public std::unary_function<Arg, bool> {
public:
- unary_counting_predicate(Predicate p) : p_(p), count_(0) {}
- ~unary_counting_predicate() {}
-
- bool operator () (const Arg &a) const { ++count_; return p_(a); }
- size_t count() const { return count_; }
- void reset() { count_ = 0; }
-
+ unary_counting_predicate(Predicate p) : p_(p), count_(0) {}
+ ~unary_counting_predicate() {}
+
+ bool operator () (const Arg &a) const { ++count_; return p_(a); }
+ size_t count() const { return count_; }
+ void reset() { count_ = 0; }
+
private:
- Predicate p_;
- mutable size_t count_;
- };
+ Predicate p_;
+ mutable size_t count_;
+ };
template <typename Predicate, typename Arg1, typename Arg2=Arg1>
struct binary_counting_predicate : public std::binary_function<Arg1, Arg2, bool> {
public:
- binary_counting_predicate ( Predicate p ) : p_(p), count_(0) {}
- ~binary_counting_predicate() {}
-
- bool operator () (const Arg1 &a1, const Arg2 &a2) const { ++count_; return p_(a1, a2); }
- size_t count() const { return count_; }
- void reset() { count_ = 0; }
+ binary_counting_predicate ( Predicate p ) : p_(p), count_(0) {}
+ ~binary_counting_predicate() {}
+
+ bool operator () (const Arg1 &a1, const Arg2 &a2) const { ++count_; return p_(a1, a2); }
+ size_t count() const { return count_; }
+ void reset() { count_ = 0; }
private:
- Predicate p_;
- mutable size_t count_;
- };
+ Predicate p_;
+ mutable size_t count_;
+ };
#endif // __COUNTING_PREDICATES_H
diff --git a/test/support/min_allocator.h b/test/support/min_allocator.h
index f3f08ca..b643636 100644
--- a/test/support/min_allocator.h
+++ b/test/support/min_allocator.h
@@ -10,6 +10,34 @@
#ifndef MIN_ALLOCATOR_H
#define MIN_ALLOCATOR_H
+#include <cstddef>
+
+template <class T>
+class bare_allocator
+{
+public:
+ typedef T value_type;
+
+ bare_allocator() {}
+
+ template <class U>
+ bare_allocator(bare_allocator<U>) {}
+
+ T* allocate(std::size_t n)
+ {
+ return static_cast<T*>(::operator new(n*sizeof(T)));
+ }
+
+ void deallocate(T* p, std::size_t)
+ {
+ return ::operator delete(static_cast<void*>(p));
+ }
+
+ friend bool operator==(bare_allocator, bare_allocator) {return true;}
+ friend bool operator!=(bare_allocator x, bare_allocator y) {return !(x == y);}
+};
+
+
#if __cplusplus >= 201103L
#include <memory>
@@ -71,7 +99,7 @@
explicit min_pointer(min_pointer<void> p) : ptr_(static_cast<T*>(p.ptr_)) {}
explicit operator bool() const {return ptr_ != nullptr;}
-
+
typedef std::ptrdiff_t difference_type;
typedef T& reference;
typedef T* pointer;
diff --git a/test/support/platform_support.h b/test/support/platform_support.h
index 9ae2ae7..09bb29a 100644
--- a/test/support/platform_support.h
+++ b/test/support/platform_support.h
@@ -44,19 +44,31 @@
#include <string>
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
#include <io.h> // _mktemp
+#else
+#include <unistd.h> // close
#endif
inline
std::string
get_temp_file_name()
{
- std::string s("temp.XXXXXX");
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
- _mktemp(&s[0]);
+ char Path[MAX_PATH+1];
+ char FN[MAX_PATH+1];
+ do { } while (0 == GetTempPath(MAX_PATH+1, Path));
+ do { } while (0 == GetTempFileName(Path, "libcxx", 0, FN));
+ return FN;
#else
- mktemp(&s[0]);
+ std::string Name;
+ int FD = -1;
+ do {
+ Name = "libcxx.XXXXXX";
+ FD = mkstemp(&Name[0]);
+ assert(errno != EINVAL && "Something is wrong with the mkstemp's argument");
+ } while (FD == -1 || errno == EEXIST);
+ close(FD);
+ return Name;
#endif
- return s;
}
#endif // PLATFORM_SUPPORT_H
diff --git a/test/support/test_iterators.h b/test/support/test_iterators.h
index 5bd6df7..e09fd83 100644
--- a/test/support/test_iterators.h
+++ b/test/support/test_iterators.h
@@ -11,6 +11,13 @@
#define ITERATORS_H
#include <iterator>
+#include <cassert>
+
+#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
+#define DELETE_FUNCTION = delete
+#else
+#define DELETE_FUNCTION
+#endif
template <class It>
class output_iterator
@@ -37,6 +44,9 @@
output_iterator& operator++() {++it_; return *this;}
output_iterator operator++(int)
{output_iterator tmp(*this); ++(*this); return tmp;}
+
+ template <class T>
+ void operator,(T const &) DELETE_FUNCTION;
};
template <class It>
@@ -70,6 +80,9 @@
{return x.it_ == y.it_;}
friend bool operator!=(const input_iterator& x, const input_iterator& y)
{return !(x == y);}
+
+ template <class T>
+ void operator,(T const &) DELETE_FUNCTION;
};
template <class T, class U>
@@ -119,6 +132,9 @@
{return x.it_ == y.it_;}
friend bool operator!=(const forward_iterator& x, const forward_iterator& y)
{return !(x == y);}
+
+ template <class T>
+ void operator,(T const &) DELETE_FUNCTION;
};
template <class T, class U>
@@ -167,6 +183,9 @@
bidirectional_iterator& operator--() {--it_; return *this;}
bidirectional_iterator operator--(int)
{bidirectional_iterator tmp(*this); --(*this); return tmp;}
+
+ template <class T>
+ void operator,(T const &) DELETE_FUNCTION;
};
template <class T, class U>
@@ -226,6 +245,9 @@
{random_access_iterator tmp(*this); tmp -= n; return tmp;}
reference operator[](difference_type n) const {return it_[n];}
+
+ template <class T>
+ void operator,(T const &) DELETE_FUNCTION;
};
template <class T, class U>
@@ -302,4 +324,6 @@
template <class Iter> // everything else
inline Iter base(Iter i) { return i; }
+#undef DELETE_FUNCTION
+
#endif // ITERATORS_H
diff --git a/test/thread/futures/futures.async/async.pass.cpp b/test/thread/futures/futures.async/async.pass.cpp
index f67abe4..c8a7425 100644
--- a/test/thread/futures/futures.async/async.pass.cpp
+++ b/test/thread/futures/futures.async/async.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.errors/default_error_condition.pass.cpp b/test/thread/futures/futures.errors/default_error_condition.pass.cpp
index 35afe5a..7f28b8a 100644
--- a/test/thread/futures/futures.errors/default_error_condition.pass.cpp
+++ b/test/thread/futures/futures.errors/default_error_condition.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.errors/equivalent_error_code_int.pass.cpp b/test/thread/futures/futures.errors/equivalent_error_code_int.pass.cpp
index 1f1cf40..cd00176 100644
--- a/test/thread/futures/futures.errors/equivalent_error_code_int.pass.cpp
+++ b/test/thread/futures/futures.errors/equivalent_error_code_int.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.errors/equivalent_int_error_condition.pass.cpp b/test/thread/futures/futures.errors/equivalent_int_error_condition.pass.cpp
index 06fdce1..05ad1ec 100644
--- a/test/thread/futures/futures.errors/equivalent_int_error_condition.pass.cpp
+++ b/test/thread/futures/futures.errors/equivalent_int_error_condition.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.errors/future_category.pass.cpp b/test/thread/futures/futures.errors/future_category.pass.cpp
index 515946c..7f407a0 100644
--- a/test/thread/futures/futures.errors/future_category.pass.cpp
+++ b/test/thread/futures/futures.errors/future_category.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.errors/make_error_code.pass.cpp b/test/thread/futures/futures.errors/make_error_code.pass.cpp
index f904c46..3c14add 100644
--- a/test/thread/futures/futures.errors/make_error_code.pass.cpp
+++ b/test/thread/futures/futures.errors/make_error_code.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.errors/make_error_condition.pass.cpp b/test/thread/futures/futures.errors/make_error_condition.pass.cpp
index fd0f1c5..52972aa 100644
--- a/test/thread/futures/futures.errors/make_error_condition.pass.cpp
+++ b/test/thread/futures/futures.errors/make_error_condition.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.future_error/code.pass.cpp b/test/thread/futures/futures.future_error/code.pass.cpp
index fdbfa4e..e02af48 100644
--- a/test/thread/futures/futures.future_error/code.pass.cpp
+++ b/test/thread/futures/futures.future_error/code.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.future_error/types.pass.cpp b/test/thread/futures/futures.future_error/types.pass.cpp
index af8e219..e741dd0 100644
--- a/test/thread/futures/futures.future_error/types.pass.cpp
+++ b/test/thread/futures/futures.future_error/types.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.future_error/what.pass.cpp b/test/thread/futures/futures.future_error/what.pass.cpp
index 5e54350..1a66e4a 100644
--- a/test/thread/futures/futures.future_error/what.pass.cpp
+++ b/test/thread/futures/futures.future_error/what.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// LWG 2056 changed the values of future_errc, so if we're using new headers
// with an old library we'll get incorrect messages.
diff --git a/test/thread/futures/futures.overview/future_errc.pass.cpp b/test/thread/futures/futures.overview/future_errc.pass.cpp
index 7b3b70a..1e6fcb7 100644
--- a/test/thread/futures/futures.overview/future_errc.pass.cpp
+++ b/test/thread/futures/futures.overview/future_errc.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.overview/future_status.pass.cpp b/test/thread/futures/futures.overview/future_status.pass.cpp
index 0b6d32c..2c196aa 100644
--- a/test/thread/futures/futures.overview/future_status.pass.cpp
+++ b/test/thread/futures/futures.overview/future_status.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.overview/is_error_code_enum_future_errc.pass.cpp b/test/thread/futures/futures.overview/is_error_code_enum_future_errc.pass.cpp
index 85b7993..499de52 100644
--- a/test/thread/futures/futures.overview/is_error_code_enum_future_errc.pass.cpp
+++ b/test/thread/futures/futures.overview/is_error_code_enum_future_errc.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.overview/launch.pass.cpp b/test/thread/futures/futures.overview/launch.pass.cpp
index 5f4663c..da54f7e 100644
--- a/test/thread/futures/futures.overview/launch.pass.cpp
+++ b/test/thread/futures/futures.overview/launch.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/alloc_ctor.pass.cpp b/test/thread/futures/futures.promise/alloc_ctor.pass.cpp
index dca399f..70a4e00 100644
--- a/test/thread/futures/futures.promise/alloc_ctor.pass.cpp
+++ b/test/thread/futures/futures.promise/alloc_ctor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
@@ -18,6 +20,7 @@
#include <cassert>
#include "../test_allocator.h"
+#include "min_allocator.h"
int main()
{
@@ -46,4 +49,36 @@
assert(f.valid());
}
assert(test_alloc_base::count == 0);
+ // Test with a minimal allocator
+ {
+ std::promise<int> p(std::allocator_arg, bare_allocator<void>());
+ std::future<int> f = p.get_future();
+ assert(f.valid());
+ }
+ {
+ std::promise<int&> p(std::allocator_arg, bare_allocator<void>());
+ std::future<int&> f = p.get_future();
+ assert(f.valid());
+ }
+ {
+ std::promise<void> p(std::allocator_arg, bare_allocator<void>());
+ std::future<void> f = p.get_future();
+ assert(f.valid());
+ }
+ // Test with a minimal allocator that returns class-type pointers
+ {
+ std::promise<int> p(std::allocator_arg, min_allocator<void>());
+ std::future<int> f = p.get_future();
+ assert(f.valid());
+ }
+ {
+ std::promise<int&> p(std::allocator_arg, min_allocator<void>());
+ std::future<int&> f = p.get_future();
+ assert(f.valid());
+ }
+ {
+ std::promise<void> p(std::allocator_arg, min_allocator<void>());
+ std::future<void> f = p.get_future();
+ assert(f.valid());
+ }
}
diff --git a/test/thread/futures/futures.promise/default.pass.cpp b/test/thread/futures/futures.promise/default.pass.cpp
index 47aec02..95c9657 100644
--- a/test/thread/futures/futures.promise/default.pass.cpp
+++ b/test/thread/futures/futures.promise/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/dtor.pass.cpp b/test/thread/futures/futures.promise/dtor.pass.cpp
index cd4fafb..78912f1 100644
--- a/test/thread/futures/futures.promise/dtor.pass.cpp
+++ b/test/thread/futures/futures.promise/dtor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/get_future.pass.cpp b/test/thread/futures/futures.promise/get_future.pass.cpp
index e7e78c7..a7d084e 100644
--- a/test/thread/futures/futures.promise/get_future.pass.cpp
+++ b/test/thread/futures/futures.promise/get_future.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/move_assign.pass.cpp b/test/thread/futures/futures.promise/move_assign.pass.cpp
index c378495..c3097df 100644
--- a/test/thread/futures/futures.promise/move_assign.pass.cpp
+++ b/test/thread/futures/futures.promise/move_assign.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/move_ctor.pass.cpp b/test/thread/futures/futures.promise/move_ctor.pass.cpp
index 4bd013a..eeec4fb 100644
--- a/test/thread/futures/futures.promise/move_ctor.pass.cpp
+++ b/test/thread/futures/futures.promise/move_ctor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/set_exception.pass.cpp b/test/thread/futures/futures.promise/set_exception.pass.cpp
index 13c9aa9..51c05eb 100644
--- a/test/thread/futures/futures.promise/set_exception.pass.cpp
+++ b/test/thread/futures/futures.promise/set_exception.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp b/test/thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp
index 7f9e418..5e57692 100644
--- a/test/thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp
+++ b/test/thread/futures/futures.promise/set_exception_at_thread_exit.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/set_lvalue.pass.cpp b/test/thread/futures/futures.promise/set_lvalue.pass.cpp
index 4ee5fbb..cdc3777 100644
--- a/test/thread/futures/futures.promise/set_lvalue.pass.cpp
+++ b/test/thread/futures/futures.promise/set_lvalue.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp b/test/thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp
index eef353a..18f87c5 100644
--- a/test/thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp
+++ b/test/thread/futures/futures.promise/set_lvalue_at_thread_exit.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/set_rvalue.pass.cpp b/test/thread/futures/futures.promise/set_rvalue.pass.cpp
index 3cbacea..dab4bf7 100644
--- a/test/thread/futures/futures.promise/set_rvalue.pass.cpp
+++ b/test/thread/futures/futures.promise/set_rvalue.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/set_rvalue_at_thread_exit.pass.cpp b/test/thread/futures/futures.promise/set_rvalue_at_thread_exit.pass.cpp
index 1e3108c..8f3b768 100644
--- a/test/thread/futures/futures.promise/set_rvalue_at_thread_exit.pass.cpp
+++ b/test/thread/futures/futures.promise/set_rvalue_at_thread_exit.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp b/test/thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp
index bf8f21b..ec50cc3 100644
--- a/test/thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp
+++ b/test/thread/futures/futures.promise/set_value_at_thread_exit_const.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp b/test/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp
index ee6f62f..8c09208 100644
--- a/test/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp
+++ b/test/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/set_value_const.pass.cpp b/test/thread/futures/futures.promise/set_value_const.pass.cpp
index 94a9f92..6673f63 100644
--- a/test/thread/futures/futures.promise/set_value_const.pass.cpp
+++ b/test/thread/futures/futures.promise/set_value_const.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/set_value_void.pass.cpp b/test/thread/futures/futures.promise/set_value_void.pass.cpp
index c3b7e78..5012e0b 100644
--- a/test/thread/futures/futures.promise/set_value_void.pass.cpp
+++ b/test/thread/futures/futures.promise/set_value_void.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/swap.pass.cpp b/test/thread/futures/futures.promise/swap.pass.cpp
index 5e292b0..1ed3e64 100644
--- a/test/thread/futures/futures.promise/swap.pass.cpp
+++ b/test/thread/futures/futures.promise/swap.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.promise/uses_allocator.pass.cpp b/test/thread/futures/futures.promise/uses_allocator.pass.cpp
index 1f30682..458826e 100644
--- a/test/thread/futures/futures.promise/uses_allocator.pass.cpp
+++ b/test/thread/futures/futures.promise/uses_allocator.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/copy_assign.pass.cpp b/test/thread/futures/futures.shared_future/copy_assign.pass.cpp
index e6b86d1..b23ba19 100644
--- a/test/thread/futures/futures.shared_future/copy_assign.pass.cpp
+++ b/test/thread/futures/futures.shared_future/copy_assign.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/copy_ctor.pass.cpp b/test/thread/futures/futures.shared_future/copy_ctor.pass.cpp
index 445c189..425d1f9 100644
--- a/test/thread/futures/futures.shared_future/copy_ctor.pass.cpp
+++ b/test/thread/futures/futures.shared_future/copy_ctor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/ctor_future.pass.cpp b/test/thread/futures/futures.shared_future/ctor_future.pass.cpp
index 207473e..3a78b80 100644
--- a/test/thread/futures/futures.shared_future/ctor_future.pass.cpp
+++ b/test/thread/futures/futures.shared_future/ctor_future.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/default.pass.cpp b/test/thread/futures/futures.shared_future/default.pass.cpp
index dc056e8..92927f5 100644
--- a/test/thread/futures/futures.shared_future/default.pass.cpp
+++ b/test/thread/futures/futures.shared_future/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/dtor.pass.cpp b/test/thread/futures/futures.shared_future/dtor.pass.cpp
index a06a313..baa89cb 100644
--- a/test/thread/futures/futures.shared_future/dtor.pass.cpp
+++ b/test/thread/futures/futures.shared_future/dtor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/get.pass.cpp b/test/thread/futures/futures.shared_future/get.pass.cpp
index 16723ea..c5ee234 100644
--- a/test/thread/futures/futures.shared_future/get.pass.cpp
+++ b/test/thread/futures/futures.shared_future/get.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/move_assign.pass.cpp b/test/thread/futures/futures.shared_future/move_assign.pass.cpp
index 36e0168..6b58f41 100644
--- a/test/thread/futures/futures.shared_future/move_assign.pass.cpp
+++ b/test/thread/futures/futures.shared_future/move_assign.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/move_ctor.pass.cpp b/test/thread/futures/futures.shared_future/move_ctor.pass.cpp
index 35b8221..32b8fd7 100644
--- a/test/thread/futures/futures.shared_future/move_ctor.pass.cpp
+++ b/test/thread/futures/futures.shared_future/move_ctor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/wait.pass.cpp b/test/thread/futures/futures.shared_future/wait.pass.cpp
index b14d703..4293fca 100644
--- a/test/thread/futures/futures.shared_future/wait.pass.cpp
+++ b/test/thread/futures/futures.shared_future/wait.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/wait_for.pass.cpp b/test/thread/futures/futures.shared_future/wait_for.pass.cpp
index ae678ff..e5a4754 100644
--- a/test/thread/futures/futures.shared_future/wait_for.pass.cpp
+++ b/test/thread/futures/futures.shared_future/wait_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.shared_future/wait_until.pass.cpp b/test/thread/futures/futures.shared_future/wait_until.pass.cpp
index 1a0c9b3..258f9bf 100644
--- a/test/thread/futures/futures.shared_future/wait_until.pass.cpp
+++ b/test/thread/futures/futures.shared_future/wait_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.members/assign_move.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/assign_move.pass.cpp
index a0f711a..18786f4 100644
--- a/test/thread/futures/futures.tas/futures.task.members/assign_move.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/assign_move.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.members/ctor_default.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/ctor_default.pass.cpp
index f53b26e..7690496 100644
--- a/test/thread/futures/futures.tas/futures.task.members/ctor_default.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/ctor_default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp
index 58e9982..2eee2cb 100644
--- a/test/thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp
index e7070c5..3aac2b2 100644
--- a/test/thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
@@ -18,6 +20,7 @@
#include <cassert>
#include "../../test_allocator.h"
+#include "min_allocator.h"
class A
{
@@ -92,4 +95,30 @@
assert(f.get() == 4);
}
assert(test_alloc_base::count == 0);
+ A::n_copies = 0;
+ A::n_moves = 0;
+ {
+ std::packaged_task<double(int, char)> p(std::allocator_arg,
+ bare_allocator<void>(), A(5));
+ assert(p.valid());
+ std::future<double> f = p.get_future();
+ p(3, 'a');
+ assert(f.get() == 105.0);
+ assert(A::n_copies == 0);
+ assert(A::n_moves > 0);
+ }
+ A::n_copies = 0;
+ A::n_moves = 0;
+ {
+ std::packaged_task<double(int, char)> p(std::allocator_arg,
+ min_allocator<void>(), A(5));
+ assert(p.valid());
+ std::future<double> f = p.get_future();
+ p(3, 'a');
+ assert(f.get() == 105.0);
+ assert(A::n_copies == 0);
+ assert(A::n_moves > 0);
+ }
+ A::n_copies = 0;
+ A::n_moves = 0;
}
diff --git a/test/thread/futures/futures.tas/futures.task.members/ctor_move.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/ctor_move.pass.cpp
index c668a67..88f0722 100644
--- a/test/thread/futures/futures.tas/futures.task.members/ctor_move.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/ctor_move.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.members/dtor.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/dtor.pass.cpp
index 9b76934..e24232d 100644
--- a/test/thread/futures/futures.tas/futures.task.members/dtor.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/dtor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.members/get_future.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/get_future.pass.cpp
index d6efbf1..13b5db1 100644
--- a/test/thread/futures/futures.tas/futures.task.members/get_future.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/get_future.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.members/make_ready_at_thread_exit.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/make_ready_at_thread_exit.pass.cpp
index accbd75..61a6a4f 100644
--- a/test/thread/futures/futures.tas/futures.task.members/make_ready_at_thread_exit.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/make_ready_at_thread_exit.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.members/operator.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/operator.pass.cpp
index b77cf31..2a09353 100644
--- a/test/thread/futures/futures.tas/futures.task.members/operator.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/operator.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.members/reset.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/reset.pass.cpp
index 3ca3d14..9d38d9b 100644
--- a/test/thread/futures/futures.tas/futures.task.members/reset.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/reset.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.members/swap.pass.cpp b/test/thread/futures/futures.tas/futures.task.members/swap.pass.cpp
index 9f549aa..33763be 100644
--- a/test/thread/futures/futures.tas/futures.task.members/swap.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.members/swap.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.nonmembers/swap.pass.cpp b/test/thread/futures/futures.tas/futures.task.nonmembers/swap.pass.cpp
index ef99f61..668732b 100644
--- a/test/thread/futures/futures.tas/futures.task.nonmembers/swap.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.nonmembers/swap.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/futures.task.nonmembers/uses_allocator.pass.cpp b/test/thread/futures/futures.tas/futures.task.nonmembers/uses_allocator.pass.cpp
index 130390f..986f71e 100644
--- a/test/thread/futures/futures.tas/futures.task.nonmembers/uses_allocator.pass.cpp
+++ b/test/thread/futures/futures.tas/futures.task.nonmembers/uses_allocator.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.tas/types.pass.cpp b/test/thread/futures/futures.tas/types.pass.cpp
index c66f359..dd1724d 100644
--- a/test/thread/futures/futures.tas/types.pass.cpp
+++ b/test/thread/futures/futures.tas/types.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.unique_future/default.pass.cpp b/test/thread/futures/futures.unique_future/default.pass.cpp
index 915f118..84cb846 100644
--- a/test/thread/futures/futures.unique_future/default.pass.cpp
+++ b/test/thread/futures/futures.unique_future/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.unique_future/dtor.pass.cpp b/test/thread/futures/futures.unique_future/dtor.pass.cpp
index 1bc141b..5e9697b 100644
--- a/test/thread/futures/futures.unique_future/dtor.pass.cpp
+++ b/test/thread/futures/futures.unique_future/dtor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.unique_future/get.pass.cpp b/test/thread/futures/futures.unique_future/get.pass.cpp
index 1b0ee2b..758e38a 100644
--- a/test/thread/futures/futures.unique_future/get.pass.cpp
+++ b/test/thread/futures/futures.unique_future/get.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.unique_future/move_assign.pass.cpp b/test/thread/futures/futures.unique_future/move_assign.pass.cpp
index 79dcd7d..8d38b81 100644
--- a/test/thread/futures/futures.unique_future/move_assign.pass.cpp
+++ b/test/thread/futures/futures.unique_future/move_assign.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.unique_future/move_ctor.pass.cpp b/test/thread/futures/futures.unique_future/move_ctor.pass.cpp
index af23e4d..e12c920 100644
--- a/test/thread/futures/futures.unique_future/move_ctor.pass.cpp
+++ b/test/thread/futures/futures.unique_future/move_ctor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.unique_future/share.pass.cpp b/test/thread/futures/futures.unique_future/share.pass.cpp
index a19ce2e..794b5ce 100644
--- a/test/thread/futures/futures.unique_future/share.pass.cpp
+++ b/test/thread/futures/futures.unique_future/share.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.unique_future/wait.pass.cpp b/test/thread/futures/futures.unique_future/wait.pass.cpp
index 68c0d14..e10d37c 100644
--- a/test/thread/futures/futures.unique_future/wait.pass.cpp
+++ b/test/thread/futures/futures.unique_future/wait.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.unique_future/wait_for.pass.cpp b/test/thread/futures/futures.unique_future/wait_for.pass.cpp
index 2a81a2c..0a381d9 100644
--- a/test/thread/futures/futures.unique_future/wait_for.pass.cpp
+++ b/test/thread/futures/futures.unique_future/wait_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/futures.unique_future/wait_until.pass.cpp b/test/thread/futures/futures.unique_future/wait_until.pass.cpp
index 8ac0bc8..70d7e57 100644
--- a/test/thread/futures/futures.unique_future/wait_until.pass.cpp
+++ b/test/thread/futures/futures.unique_future/wait_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/futures/version.pass.cpp b/test/thread/futures/version.pass.cpp
index 5ac4e0f..6730a14 100644
--- a/test/thread/futures/version.pass.cpp
+++ b/test/thread/futures/version.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <future>
diff --git a/test/thread/macro.pass.cpp b/test/thread/macro.pass.cpp
index 243640d..c1b1377 100644
--- a/test/thread/macro.pass.cpp
+++ b/test/thread/macro.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.condition/cv_status.pass.cpp b/test/thread/thread.condition/cv_status.pass.cpp
index d5e0947..fe5fa05 100644
--- a/test/thread/thread.condition/cv_status.pass.cpp
+++ b/test/thread/thread.condition/cv_status.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/notify_all_at_thread_exit.pass.cpp b/test/thread/thread.condition/notify_all_at_thread_exit.pass.cpp
index e4f193a..2b8772f 100644
--- a/test/thread/thread.condition/notify_all_at_thread_exit.pass.cpp
+++ b/test/thread/thread.condition/notify_all_at_thread_exit.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/default.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/default.pass.cpp
index a912413..6f43564 100644
--- a/test/thread/thread.condition/thread.condition.condvar/default.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/destructor.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/destructor.pass.cpp
index 9828fbb..437ed96 100644
--- a/test/thread/thread.condition/thread.condition.condvar/destructor.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/destructor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/native_handle.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/native_handle.pass.cpp
index 52b73c0..bf28e01 100644
--- a/test/thread/thread.condition/thread.condition.condvar/native_handle.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/native_handle.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/notify_all.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/notify_all.pass.cpp
index 0b50e26..fd80ee9 100644
--- a/test/thread/thread.condition/thread.condition.condvar/notify_all.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/notify_all.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/notify_one.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/notify_one.pass.cpp
index c112585..6236a13 100644
--- a/test/thread/thread.condition/thread.condition.condvar/notify_one.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/notify_one.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/wait.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/wait.pass.cpp
index c4afc53..236eecc 100644
--- a/test/thread/thread.condition/thread.condition.condvar/wait.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/wait.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/wait_for.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/wait_for.pass.cpp
index 038c946..ca48eee 100644
--- a/test/thread/thread.condition/thread.condition.condvar/wait_for.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/wait_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/wait_for_pred.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/wait_for_pred.pass.cpp
index ef7a9b6..0ee40d1 100644
--- a/test/thread/thread.condition/thread.condition.condvar/wait_for_pred.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/wait_for_pred.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/wait_pred.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/wait_pred.pass.cpp
index 22b82d2..45e0b81 100644
--- a/test/thread/thread.condition/thread.condition.condvar/wait_pred.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/wait_pred.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/wait_until.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/wait_until.pass.cpp
index 476cec5..d87a188 100644
--- a/test/thread/thread.condition/thread.condition.condvar/wait_until.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/wait_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvar/wait_until_pred.pass.cpp b/test/thread/thread.condition/thread.condition.condvar/wait_until_pred.pass.cpp
index b7a4b3a..90ffb1d 100644
--- a/test/thread/thread.condition/thread.condition.condvar/wait_until_pred.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvar/wait_until_pred.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/default.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/default.pass.cpp
index 853fc1a..210060a 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/default.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/destructor.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/destructor.pass.cpp
index a14c568..6bdca7b 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/destructor.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/destructor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/notify_all.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/notify_all.pass.cpp
index 389d4bc..27ead95 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/notify_all.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/notify_all.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/notify_one.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/notify_one.pass.cpp
index 8ad0ca3..98f6c43 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/notify_one.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/notify_one.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp
index dd4879d..522c61b 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp
@@ -1,3 +1,14 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+
#include <thread>
#include <condition_variable>
#include <mutex>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/wait.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/wait.pass.cpp
index b611167..f5c8926 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/wait.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/wait.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp
index 7eb4b33..1906b58 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp
@@ -1,3 +1,14 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+
#include <thread>
#include <condition_variable>
#include <mutex>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/wait_for.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/wait_for.pass.cpp
index 89759ac..a4b4ed9 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/wait_for.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/wait_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/wait_for_pred.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/wait_for_pred.pass.cpp
index bc4b7c3..b240307 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/wait_for_pred.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/wait_for_pred.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/wait_pred.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/wait_pred.pass.cpp
index 9b4fab3..921ad69 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/wait_pred.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/wait_pred.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/wait_until.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/wait_until.pass.cpp
index 15bf809..1994ebd 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/wait_until.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/wait_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/thread.condition.condvarany/wait_until_pred.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/wait_until_pred.pass.cpp
index 1490e11..c0fea03 100644
--- a/test/thread/thread.condition/thread.condition.condvarany/wait_until_pred.pass.cpp
+++ b/test/thread/thread.condition/thread.condition.condvarany/wait_until_pred.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.condition/version.pass.cpp b/test/thread/thread.condition/version.pass.cpp
index 517c93b..12a775e 100644
--- a/test/thread/thread.condition/version.pass.cpp
+++ b/test/thread/thread.condition/version.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <condition_variable>
diff --git a/test/thread/thread.mutex/thread.lock.algorithm/lock.pass.cpp b/test/thread/thread.mutex/thread.lock.algorithm/lock.pass.cpp
index 14c79a1..f67ca21 100644
--- a/test/thread/thread.mutex/thread.lock.algorithm/lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock.algorithm/lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock.algorithm/try_lock.pass.cpp b/test/thread/thread.mutex/thread.lock.algorithm/try_lock.pass.cpp
index bdb76c6..f0c54b7 100644
--- a/test/thread/thread.mutex/thread.lock.algorithm/try_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock.algorithm/try_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.guard/adopt_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.guard/adopt_lock.pass.cpp
index 6f68884..8327100 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.guard/adopt_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.guard/adopt_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.pass.cpp
index d47222d..a15405f 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.guard/types.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.guard/types.pass.cpp
index 20aa62e..5238ed6 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.guard/types.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.guard/types.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/default.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/default.pass.cpp
index 2713680..2c1c665 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/default.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_assign.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_assign.pass.cpp
index 73936b7..8676f2c 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_assign.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_assign.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_ctor.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_ctor.pass.cpp
index cf63861..f59d2e8 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_ctor.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_ctor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex.pass.cpp
index 01bfbfd..c8a0287 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_adopt_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_adopt_lock.pass.cpp
index b4f6025..9082e57 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_adopt_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_adopt_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_defer_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_defer_lock.pass.cpp
index 3a8b61a..bbc38fc 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_defer_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_defer_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_duration.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_duration.pass.cpp
index ffe329c..9816e57 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_duration.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_duration.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_time_point.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_time_point.pass.cpp
index baf08de..5d188ab 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_time_point.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_time_point.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_try_to_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_try_to_lock.pass.cpp
index 9d06d3f..f2d4e0d 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_try_to_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_try_to_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/lock.pass.cpp
index ecac479..f150065 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock.pass.cpp
index d65fbfa..82b1ff8 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock_for.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock_for.pass.cpp
index d076e52..5867465 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock_for.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock_until.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock_until.pass.cpp
index 8efffc4..9d38983 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock_until.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/unlock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/unlock.pass.cpp
index 9e4b3c8..eb08a45 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/unlock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/unlock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/member_swap.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/member_swap.pass.cpp
index 6a7a39e..8505763 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/member_swap.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/member_swap.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/nonmember_swap.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/nonmember_swap.pass.cpp
index 03bf5e8..057dbc4 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/nonmember_swap.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/nonmember_swap.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/release.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/release.pass.cpp
index a836b35..65ddca6 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/release.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/release.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/mutex.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/mutex.pass.cpp
index 4b4f6c6..4eb75d8 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/mutex.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/mutex.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/op_bool.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/op_bool.pass.cpp
index 177a69e..d079d2d 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/op_bool.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/op_bool.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/owns_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/owns_lock.pass.cpp
index a10c588..d64b0aa 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/owns_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/owns_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.shared/types.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.shared/types.pass.cpp
index 3537357..c153b45 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.shared/types.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.shared/types.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/default.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/default.pass.cpp
index 55038c7..a49bc50 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/default.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_assign.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_assign.pass.cpp
index 2eb1c3a..4dff853 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_assign.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_assign.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_ctor.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_ctor.pass.cpp
index f36600c..aa640ee 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_ctor.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_ctor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex.pass.cpp
index 4b08aca..1f7217a 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_adopt_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_adopt_lock.pass.cpp
index ff8043b..9c3a7b6 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_adopt_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_adopt_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_defer_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_defer_lock.pass.cpp
index f475ec1..bf62231 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_defer_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_defer_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_duration.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_duration.pass.cpp
index 8370c56..33e400b 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_duration.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_duration.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_time_point.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_time_point.pass.cpp
index 8faf88f..2ead670 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_time_point.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_time_point.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_try_to_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_try_to_lock.pass.cpp
index b6c64f5..cea58c5 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_try_to_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_try_to_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/lock.pass.cpp
index c101d89..f5408df 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock.pass.cpp
index 40d9489..bd88577 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock_for.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock_for.pass.cpp
index 3e7d13a..558f079 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock_for.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock_until.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock_until.pass.cpp
index 2b435e0..24e4d10 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock_until.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/unlock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/unlock.pass.cpp
index 1318c86..bbabfc4 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/unlock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/unlock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/member_swap.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/member_swap.pass.cpp
index fd3931a..598d53a 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/member_swap.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/member_swap.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/nonmember_swap.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/nonmember_swap.pass.cpp
index d74247e..3fc8c28 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/nonmember_swap.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/nonmember_swap.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/release.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/release.pass.cpp
index 4252de1..89c28e6 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/release.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/release.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/mutex.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/mutex.pass.cpp
index 78b0c6a..bc1e3e5 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/mutex.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/mutex.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/op_bool.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/op_bool.pass.cpp
index 0d2e362..7004ac0 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/op_bool.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/op_bool.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/owns_lock.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/owns_lock.pass.cpp
index 2e2db5d..f53af35 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/owns_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/owns_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/thread.lock.unique/types.pass.cpp b/test/thread/thread.mutex/thread.lock/thread.lock.unique/types.pass.cpp
index aba22a7..f8bcb6d 100644
--- a/test/thread/thread.mutex/thread.lock/thread.lock.unique/types.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/thread.lock.unique/types.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.lock/types.pass.cpp b/test/thread/thread.mutex/thread.lock/types.pass.cpp
index 8a34bcb..64df068 100644
--- a/test/thread/thread.mutex/thread.lock/types.pass.cpp
+++ b/test/thread/thread.mutex/thread.lock/types.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/default.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/default.pass.cpp
index 704d716..4de42fb 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/default.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/lock.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/lock.pass.cpp
index 8fde818..ba2d54d 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/native_handle.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/native_handle.pass.cpp
index 59c762a..12c80f0 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/native_handle.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/native_handle.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/try_lock.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/try_lock.pass.cpp
index 6ef0160..fe8f351 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/try_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/try_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/default.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/default.pass.cpp
index bc775ed..8c5d266 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/default.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/lock.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/lock.pass.cpp
index cd48151..abebe90 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/native_handle.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/native_handle.pass.cpp
index fb95294..10626bc 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/native_handle.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/native_handle.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/try_lock.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/try_lock.pass.cpp
index f63e0ef..ff546d4 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/try_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/try_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/default.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/default.pass.cpp
index f45382d..a90b6c9 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/default.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/lock.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/lock.pass.cpp
index 153ce62..b4f9ba3 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/lock_shared.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/lock_shared.pass.cpp
index 724a7b0..ac5e206 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/lock_shared.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/lock_shared.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock.pass.cpp
index aa6f5fb..33b0696 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_for.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_for.pass.cpp
index e97b313..98cd8f9 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_for.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared.pass.cpp
index a34633e..a006e17 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared_for.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared_for.pass.cpp
index 528c69a..b2cc15e 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared_for.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared_until.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared_until.pass.cpp
index a6238e3..d1b1121 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared_until.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_until.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_until.pass.cpp
index 8670fbf..5a8e624 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_until.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <shared_mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/default.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/default.pass.cpp
index 5956540..33320a7 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/default.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/lock.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/lock.pass.cpp
index a4b41ac..fe2dd82 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock.pass.cpp
index d5a06bf..b32a266 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock_for.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock_for.pass.cpp
index 5e4d5f1..46222a7 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock_for.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock_until.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock_until.pass.cpp
index f19dec2..6c9c442 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock_until.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/default.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/default.pass.cpp
index a4c5110..56e1874 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/default.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/lock.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/lock.pass.cpp
index 32bedb3..91f747b 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock.pass.cpp
index d56e8bc..63c3cfe 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock_for.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock_for.pass.cpp
index 972fc63..3c1d6dd 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock_for.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock_until.pass.cpp b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock_until.pass.cpp
index e5e9166..066eb7b 100644
--- a/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock_until.pass.cpp
+++ b/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
diff --git a/test/thread/thread.mutex/thread.once/thread.once.callonce/call_once.pass.cpp b/test/thread/thread.mutex/thread.once/thread.once.callonce/call_once.pass.cpp
index b4f76b4..5395c85 100644
--- a/test/thread/thread.mutex/thread.once/thread.once.callonce/call_once.pass.cpp
+++ b/test/thread/thread.mutex/thread.once/thread.once.callonce/call_once.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <mutex>
@@ -133,7 +135,15 @@
class MoveOnly
{
+#if !defined(__clang__)
+ // GCC 4.8 complains about the following being private
+public:
+ MoveOnly(const MoveOnly&)
+ {
+ }
+#else
MoveOnly(const MoveOnly&);
+#endif
public:
MoveOnly() {}
MoveOnly(MoveOnly&&) {}
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.algorithm/swap.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.algorithm/swap.pass.cpp
index 9a7f8dc..476ca0c 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.algorithm/swap.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.algorithm/swap.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.assign/move.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.assign/move.pass.cpp
index 1a5f320..94a30e7 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.assign/move.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.assign/move.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
@@ -14,8 +16,6 @@
// thread& operator=(thread&& t);
#include <thread>
-#include <new>
-#include <cstdlib>
#include <cassert>
class G
@@ -29,13 +29,6 @@
G(const G& g) : alive_(g.alive_) {++n_alive;}
~G() {alive_ = 0; --n_alive;}
- void operator()()
- {
- assert(alive_ == 1);
- assert(n_alive >= 1);
- op_run = true;
- }
-
void operator()(int i, double j)
{
assert(alive_ == 1);
@@ -49,15 +42,9 @@
int G::n_alive = 0;
bool G::op_run = false;
-void f1()
-{
- std::exit(0);
-}
-
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- std::set_terminate(f1);
{
assert(G::n_alive == 0);
assert(!G::op_run);
@@ -71,12 +58,5 @@
assert(G::n_alive == 0);
assert(G::op_run);
}
- {
- std::thread t0(G(), 5, 5.5);
- std::thread::id id = t0.get_id();
- std::thread t1;
- t0 = std::move(t1);
- assert(false);
- }
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.assign/move2.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.assign/move2.pass.cpp
new file mode 100644
index 0000000..8cb2cb1
--- /dev/null
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.assign/move2.pass.cpp
@@ -0,0 +1,75 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
+
+// NOTE: std::terminate is called so the destructors are not invoked and the
+// memory is not freed. This will cause ASAN to fail.
+// XFAIL: asan
+
+// <thread>
+
+// class thread
+
+// thread& operator=(thread&& t);
+
+#include <thread>
+#include <exception>
+#include <cstdlib>
+#include <cassert>
+
+class G
+{
+ int alive_;
+public:
+ static int n_alive;
+ static bool op_run;
+
+ G() : alive_(1) {++n_alive;}
+ G(const G& g) : alive_(g.alive_) {++n_alive;}
+ ~G() {alive_ = 0; --n_alive;}
+
+ void operator()()
+ {
+ assert(alive_ == 1);
+ assert(n_alive >= 1);
+ op_run = true;
+ }
+
+ void operator()(int i, double j)
+ {
+ assert(alive_ == 1);
+ assert(n_alive >= 1);
+ assert(i == 5);
+ assert(j == 5.5);
+ op_run = true;
+ }
+};
+
+int G::n_alive = 0;
+bool G::op_run = false;
+
+void f1()
+{
+ std::exit(0);
+}
+
+int main()
+{
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ std::set_terminate(f1);
+ {
+ std::thread t0(G(), 5, 5.5);
+ std::thread::id id = t0.get_id();
+ std::thread t1;
+ t0 = std::move(t1);
+ assert(false);
+ }
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+}
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.constr/F.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.constr/F.pass.cpp
index e5568ba..0f5d5aa 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.constr/F.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.constr/F.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
@@ -13,6 +15,8 @@
// template <class F, class ...Args> thread(F&& f, Args&&... args);
+// UNSUPPORTED: asan, msan
+
#include <thread>
#include <new>
#include <cstdlib>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.constr/default.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.constr/default.pass.cpp
index cd9c2c4..64d5a93 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.constr/default.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.constr/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.constr/move.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.constr/move.pass.cpp
index 17268ab..36e0fbd 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.constr/move.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.constr/move.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.destr/dtor.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.destr/dtor.pass.cpp
index e068c04..20c8da1 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.destr/dtor.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.destr/dtor.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.id/assign.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.id/assign.pass.cpp
index b8727d0..585f7ea 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.id/assign.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.id/assign.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.id/copy.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.id/copy.pass.cpp
index 6d17dfc..e8c3801 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.id/copy.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.id/copy.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.id/default.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.id/default.pass.cpp
index b315473..0037deb 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.id/default.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.id/default.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.id/eq.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.id/eq.pass.cpp
index 2ff273c..6dd4c3e 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.id/eq.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.id/eq.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.id/lt.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.id/lt.pass.cpp
index 099781f..de52b1d 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.id/lt.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.id/lt.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.id/stream.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.id/stream.pass.cpp
index 54fc739..126965f 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.id/stream.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.id/stream.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.id/thread_id.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.id/thread_id.pass.cpp
index d407dfc..bb7f2aa 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.id/thread_id.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.id/thread_id.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <functional>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.member/detach.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.member/detach.pass.cpp
index dbb98b5..5a31232 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.member/detach.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.member/detach.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.member/get_id.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.member/get_id.pass.cpp
index 6af4f3b..a5ea55a 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.member/get_id.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.member/get_id.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.member/join.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.member/join.pass.cpp
index 32faef4..2559303 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.member/join.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.member/join.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.member/joinable.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.member/joinable.pass.cpp
index 9c90eb7..351c1cf 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.member/joinable.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.member/joinable.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.member/native_handle.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.member/native_handle.pass.cpp
index 1aae922..37c2d9c 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.member/native_handle.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.member/native_handle.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.member/swap.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.member/swap.pass.cpp
index 820091e..e8dede1 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.member/swap.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.member/swap.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/thread.thread.static/hardware_concurrency.pass.cpp b/test/thread/thread.threads/thread.thread.class/thread.thread.static/hardware_concurrency.pass.cpp
index 256edc2..4d1ffad 100644
--- a/test/thread/thread.threads/thread.thread.class/thread.thread.static/hardware_concurrency.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/thread.thread.static/hardware_concurrency.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.class/types.pass.cpp b/test/thread/thread.threads/thread.thread.class/types.pass.cpp
index e5094f7..a5bf770 100644
--- a/test/thread/thread.threads/thread.thread.class/types.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.class/types.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.this/get_id.pass.cpp b/test/thread/thread.threads/thread.thread.this/get_id.pass.cpp
index ef6615b..3b4b782 100644
--- a/test/thread/thread.threads/thread.thread.this/get_id.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.this/get_id.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.this/sleep_for.pass.cpp b/test/thread/thread.threads/thread.thread.this/sleep_for.pass.cpp
index f66b962..bffb5f3 100644
--- a/test/thread/thread.threads/thread.thread.this/sleep_for.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.this/sleep_for.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.this/sleep_until.pass.cpp b/test/thread/thread.threads/thread.thread.this/sleep_until.pass.cpp
index 2f3bb9a..9f3941b 100644
--- a/test/thread/thread.threads/thread.thread.this/sleep_until.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.this/sleep_until.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/thread.thread.this/yield.pass.cpp b/test/thread/thread.threads/thread.thread.this/yield.pass.cpp
index 52f53a6..daf5b0c 100644
--- a/test/thread/thread.threads/thread.thread.this/yield.pass.cpp
+++ b/test/thread/thread.threads/thread.thread.this/yield.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/thread/thread.threads/version.pass.cpp b/test/thread/thread.threads/version.pass.cpp
index 6d272c7..d16b0eb 100644
--- a/test/thread/thread.threads/version.pass.cpp
+++ b/test/thread/thread.threads/version.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <thread>
diff --git a/test/utilities/allocator.adaptor/allocator.adaptor.types/allocator_pointers.pass.cpp b/test/utilities/allocator.adaptor/allocator.adaptor.types/allocator_pointers.pass.cpp
index 537fb90..dbfaa97 100644
--- a/test/utilities/allocator.adaptor/allocator.adaptor.types/allocator_pointers.pass.cpp
+++ b/test/utilities/allocator.adaptor/allocator.adaptor.types/allocator_pointers.pass.cpp
@@ -103,13 +103,13 @@
int main()
{
- test_pointer<std::scoped_allocator_adaptor<std::allocator<char>>> ();
- test_pointer<std::scoped_allocator_adaptor<std::allocator<int>>> ();
- test_pointer<std::scoped_allocator_adaptor<std::allocator<Foo>>> ();
+ test_pointer<std::scoped_allocator_adaptor<std::allocator<char>>> ();
+ test_pointer<std::scoped_allocator_adaptor<std::allocator<int>>> ();
+ test_pointer<std::scoped_allocator_adaptor<std::allocator<Foo>>> ();
- test_void_pointer<std::scoped_allocator_adaptor<std::allocator<char>>> ();
- test_void_pointer<std::scoped_allocator_adaptor<std::allocator<int>>> ();
- test_void_pointer<std::scoped_allocator_adaptor<std::allocator<Foo>>> ();
+ test_void_pointer<std::scoped_allocator_adaptor<std::allocator<char>>> ();
+ test_void_pointer<std::scoped_allocator_adaptor<std::allocator<int>>> ();
+ test_void_pointer<std::scoped_allocator_adaptor<std::allocator<Foo>>> ();
}
#else
int main() {}
diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.alg/swap.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.alg/swap.pass.cpp
index 44252b4..b8995bf 100644
--- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.alg/swap.pass.cpp
+++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.alg/swap.pass.cpp
@@ -14,6 +14,8 @@
// template <MoveConstructible R, MoveConstructible ... ArgTypes>
// void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&);
+// UNSUPPORTED: asan, msan
+
#include <functional>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F.pass.cpp
index 92f99cd..3a43be7 100644
--- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F.pass.cpp
+++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F.pass.cpp
@@ -13,6 +13,8 @@
// function(nullptr_t);
+// UNSUPPORTED: asan, msan
+
#include <functional>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign.pass.cpp
index de16998..ba65cd3 100644
--- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign.pass.cpp
+++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign.pass.cpp
@@ -16,6 +16,8 @@
// && Convertible<Callable<F, ArgTypes...>::result_type
// operator=(F f);
+// UNSUPPORTED: asan, msan
+
#include <functional>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_function.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_function.pass.cpp
index f758a4d..38e65fc 100644
--- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_function.pass.cpp
+++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_function.pass.cpp
@@ -13,6 +13,8 @@
// template<class A> function(allocator_arg_t, const A&, const function&);
+// UNSUPPORTED: asan, msan
+
#include <functional>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp
index 570c27e..2180b89 100644
--- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp
+++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp
@@ -13,6 +13,8 @@
// template<class A> function(allocator_arg_t, const A&, function&&);
+// UNSUPPORTED: asan, msan
+
#include <functional>
#include <cassert>
diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp
index cf7b963..2fbd7cf 100644
--- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp
+++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp
@@ -13,6 +13,8 @@
// function(const function& f);
+// UNSUPPORTED: asan, msan
+
#include <functional>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp
index 544ec43..cfa79e2 100644
--- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp
+++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp
@@ -13,6 +13,8 @@
// function& operator=(const function& f);
+// UNSUPPORTED: asan, msan
+
#include <functional>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/nullptr_t_assign.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/nullptr_t_assign.pass.cpp
index 12a2b6e..b8c597b 100644
--- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/nullptr_t_assign.pass.cpp
+++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/nullptr_t_assign.pass.cpp
@@ -13,6 +13,8 @@
// function& operator=(nullptr_t);
+// UNSUPPORTED: asan, msan
+
#include <functional>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.mod/swap.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.mod/swap.pass.cpp
index dc56574..3c012d1 100644
--- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.mod/swap.pass.cpp
+++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.mod/swap.pass.cpp
@@ -13,6 +13,8 @@
// void swap(function& other);
+// UNSUPPORTED: asan, msan
+
#include <functional>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/function.objects/refwrap/refwrap.helpers/ref_2.pass.cpp b/test/utilities/function.objects/refwrap/refwrap.helpers/ref_2.pass.cpp
index 5a95097..4033e67 100644
--- a/test/utilities/function.objects/refwrap/refwrap.helpers/ref_2.pass.cpp
+++ b/test/utilities/function.objects/refwrap/refwrap.helpers/ref_2.pass.cpp
@@ -35,9 +35,9 @@
unary_counting_predicate<bool(*)(int), int> cp(is5);
assert(!cp(6));
assert(cp.count() == 1);
- assert(call_pred(cp));
+ assert(call_pred(cp));
assert(cp.count() == 1);
- assert(call_pred(std::ref(cp)));
+ assert(call_pred(std::ref(cp)));
assert(cp.count() == 2);
- }
+ }
}
diff --git a/test/utilities/function.objects/refwrap/type_properties.pass.cpp b/test/utilities/function.objects/refwrap/type_properties.pass.cpp
new file mode 100644
index 0000000..61e0bfa
--- /dev/null
+++ b/test/utilities/function.objects/refwrap/type_properties.pass.cpp
@@ -0,0 +1,58 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <functional>
+
+// reference_wrapper
+
+// Test that reference wrapper meets the requirements of TriviallyCopyable,
+// CopyConstructible and CopyAssignable.
+
+#include <functional>
+#include <type_traits>
+#include <string>
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+class MoveOnly
+{
+ MoveOnly(const MoveOnly&);
+ MoveOnly& operator=(const MoveOnly&);
+
+ int data_;
+public:
+ MoveOnly(int data = 1) : data_(data) {}
+ MoveOnly(MoveOnly&& x)
+ : data_(x.data_) {x.data_ = 0;}
+ MoveOnly& operator=(MoveOnly&& x)
+ {data_ = x.data_; x.data_ = 0; return *this;}
+
+ int get() const {return data_;}
+};
+#endif
+
+
+template <class T>
+void test()
+{
+ typedef std::reference_wrapper<T> Wrap;
+ static_assert(std::is_copy_constructible<Wrap>::value, "");
+ static_assert(std::is_copy_assignable<Wrap>::value, "");
+ // Extension up for standardization: See N4151.
+ static_assert(std::is_trivially_copyable<Wrap>::value, "");
+}
+
+int main()
+{
+ test<int>();
+ test<double>();
+ test<std::string>();
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ test<MoveOnly>();
+#endif
+}
diff --git a/test/utilities/memory/default.allocator/allocator.members/allocate.pass.cpp b/test/utilities/memory/default.allocator/allocator.members/allocate.pass.cpp
index f881805..a4a84e8 100644
--- a/test/utilities/memory/default.allocator/allocator.members/allocate.pass.cpp
+++ b/test/utilities/memory/default.allocator/allocator.members/allocate.pass.cpp
@@ -12,6 +12,8 @@
// allocator:
// pointer allocate(size_type n, allocator<void>::const_pointer hint=0);
+// UNSUPPORTED: asan, msan
+
#include <memory>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/memory/default.allocator/allocator.members/construct.pass.cpp b/test/utilities/memory/default.allocator/allocator.members/construct.pass.cpp
index 7e1500b..b9a1749 100644
--- a/test/utilities/memory/default.allocator/allocator.members/construct.pass.cpp
+++ b/test/utilities/memory/default.allocator/allocator.members/construct.pass.cpp
@@ -12,6 +12,8 @@
// allocator:
// template <class... Args> void construct(pointer p, Args&&... args);
+// UNSUPPORTED: asan, msan
+
#include <memory>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/memory/default.allocator/allocator_pointers.pass.cpp b/test/utilities/memory/default.allocator/allocator_pointers.pass.cpp
index b894e45..5a8f7a2 100644
--- a/test/utilities/memory/default.allocator/allocator_pointers.pass.cpp
+++ b/test/utilities/memory/default.allocator/allocator_pointers.pass.cpp
@@ -103,13 +103,13 @@
int main()
{
- test_pointer<std::allocator<char>> ();
- test_pointer<std::allocator<int>> ();
- test_pointer<std::allocator<Foo>> ();
+ test_pointer<std::allocator<char>> ();
+ test_pointer<std::allocator<int>> ();
+ test_pointer<std::allocator<Foo>> ();
- test_void_pointer<std::allocator<char>> ();
- test_void_pointer<std::allocator<int>> ();
- test_void_pointer<std::allocator<Foo>> ();
+ test_void_pointer<std::allocator<char>> ();
+ test_void_pointer<std::allocator<int>> ();
+ test_void_pointer<std::allocator<Foo>> ();
}
#else
int main() {}
diff --git a/test/utilities/memory/pointer.traits/pointer.traits.functions/pointer_to.pass.cpp b/test/utilities/memory/pointer.traits/pointer.traits.functions/pointer_to.pass.cpp
index e0e38fb..a8ad936 100644
--- a/test/utilities/memory/pointer.traits/pointer.traits.functions/pointer_to.pass.cpp
+++ b/test/utilities/memory/pointer.traits/pointer.traits.functions/pointer_to.pass.cpp
@@ -40,7 +40,7 @@
{
int i = 0;
A<int> a = std::pointer_traits<A<int> >::pointer_to(i);
- assert(a.t_ = &i);
+ assert(a.t_ == &i);
}
{
(std::pointer_traits<A<void> >::element_type)0;
diff --git a/test/utilities/memory/pointer.traits/pointer_to.pass.cpp b/test/utilities/memory/pointer.traits/pointer_to.pass.cpp
index 764a7ba..fc44d9d 100644
--- a/test/utilities/memory/pointer.traits/pointer_to.pass.cpp
+++ b/test/utilities/memory/pointer.traits/pointer_to.pass.cpp
@@ -24,7 +24,7 @@
{
int i = 0;
int* a = std::pointer_traits<int*>::pointer_to(i);
- assert(a = &i);
+ assert(a == &i);
}
{
(std::pointer_traits<void*>::element_type)0;
diff --git a/test/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.fail.cpp b/test/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.fail.cpp
index a706c40..95350a6 100644
--- a/test/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.fail.cpp
+++ b/test/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.fail.cpp
@@ -15,17 +15,20 @@
// default unique_ptr ctor should require default Deleter ctor
+// USE_VERIFY
+
#include <memory>
class Deleter
{
-
- Deleter() {}
+ // expected-error@memory:* {{base class 'Deleter' has private default constructor}}
+ // expected-note@memory:* + {{in instantiation of member function}}
+ Deleter() {} // expected-note {{implicitly declared private here}}
public:
Deleter(Deleter&) {}
- Deleter& operator=(Deleter&) {}
+ Deleter& operator=(Deleter&) { return *this; }
void operator()(void*) const {}
};
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong.pass.cpp
index 0c80324..cd79fdb 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
+// UNSUPPORTED: libcpp-has-no-threads
+//
// This test uses new symbols that were not defined in the libc++ shipped on
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong_explicit.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong_explicit.pass.cpp
index 9f93ae8..2fd9d5a 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong_explicit.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong_explicit.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
+// UNSUPPORTED: libcpp-has-no-threads
+//
// This test uses new symbols that were not defined in the libc++ shipped on
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak.pass.cpp
index 1c274d1..5c082cc 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
+// UNSUPPORTED: libcpp-has-no-threads
+//
// This test uses new symbols that were not defined in the libc++ shipped on
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak_explicit.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak_explicit.pass.cpp
index 7741223..f53f442 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak_explicit.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak_explicit.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
+// UNSUPPORTED: libcpp-has-no-threads
+//
// This test uses new symbols that were not defined in the libc++ shipped on
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange.pass.cpp
index 6e6f635..fc4c47a 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
+// UNSUPPORTED: libcpp-has-no-threads
+//
// This test uses new symbols that were not defined in the libc++ shipped on
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange_explicit.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange_explicit.pass.cpp
index f6a2085..19482dc 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange_explicit.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange_explicit.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
+// UNSUPPORTED: libcpp-has-no-threads
+//
// This test uses new symbols that were not defined in the libc++ shipped on
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_is_lock_free.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_is_lock_free.pass.cpp
index 0420734..e3ac84a 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_is_lock_free.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_is_lock_free.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-threads
// <memory>
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load.pass.cpp
index 49fd1b6..566e95a 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
+// UNSUPPORTED: libcpp-has-no-threads
+//
// This test uses new symbols that were not defined in the libc++ shipped on
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load_explicit.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load_explicit.pass.cpp
index 94d0615..b423604 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load_explicit.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load_explicit.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
+// UNSUPPORTED: libcpp-has-no-threads
+//
// This test uses new symbols that were not defined in the libc++ shipped on
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store.pass.cpp
index 83ee45f..f65f3eb 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
+// UNSUPPORTED: libcpp-has-no-threads
+//
// This test uses new symbols that were not defined in the libc++ shipped on
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store_explicit.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store_explicit.pass.cpp
index 2b3bb8b..6864200 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store_explicit.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store_explicit.pass.cpp
@@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
+// UNSUPPORTED: libcpp-has-no-threads
+//
// This test uses new symbols that were not defined in the libc++ shipped on
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/test_deleter.h b/test/utilities/memory/util.smartptr/util.smartptr.shared/test_deleter.h
index 7af7468..0263061 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared/test_deleter.h
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/test_deleter.h
@@ -19,6 +19,12 @@
#include <type_traits>
#include <cassert>
+#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
+#define DELETE_FUNCTION = delete
+#else
+#define DELETE_FUNCTION { assert(false); }
+#endif
+
struct test_deleter_base
{
static int count;
@@ -46,6 +52,8 @@
void set_state(int i) {state_ = i;}
void operator()(T* p) {assert(state_ >= 0); ++dealloc_count; delete p;}
+
+ test_deleter* operator&() const DELETE_FUNCTION;
};
template <class T>
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/auto_ptr.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/auto_ptr.pass.cpp
index 27046cf..28e49d6 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/auto_ptr.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/auto_ptr.pass.cpp
@@ -11,6 +11,8 @@
// template<class Y> explicit shared_ptr(auto_ptr<Y>&& r);
+// UNSUPPORTED: asan, msan
+
#include <memory>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/nullptr_t_deleter_allocator.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/nullptr_t_deleter_allocator.pass.cpp
index 7966e00..b67f31e 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/nullptr_t_deleter_allocator.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/nullptr_t_deleter_allocator.pass.cpp
@@ -15,6 +15,7 @@
#include <cassert>
#include "../test_deleter.h"
#include "test_allocator.h"
+#include "min_allocator.h"
struct A
{
@@ -47,4 +48,38 @@
assert(test_deleter<A>::dealloc_count == 1);
assert(test_allocator<A>::count == 0);
assert(test_allocator<A>::alloc_count == 0);
+ test_deleter<A>::dealloc_count = 0;
+ // Test an allocator with a minimal interface
+ {
+ std::shared_ptr<A> p(nullptr, test_deleter<A>(1), bare_allocator<void>());
+ assert(A::count == 0);
+ assert(p.use_count() == 1);
+ assert(p.get() == 0);
+ test_deleter<A>* d = std::get_deleter<test_deleter<A> >(p);
+ assert(test_deleter<A>::count ==1);
+ assert(test_deleter<A>::dealloc_count == 0);
+ assert(d);
+ assert(d->state() == 1);
+ }
+ assert(A::count == 0);
+ assert(test_deleter<A>::count == 0);
+ assert(test_deleter<A>::dealloc_count == 1);
+ test_deleter<A>::dealloc_count = 0;
+#if __cplusplus >= 201103L
+ // Test an allocator that returns class-type pointers
+ {
+ std::shared_ptr<A> p(nullptr, test_deleter<A>(1), min_allocator<void>());
+ assert(A::count == 0);
+ assert(p.use_count() == 1);
+ assert(p.get() == 0);
+ test_deleter<A>* d = std::get_deleter<test_deleter<A> >(p);
+ assert(test_deleter<A>::count ==1);
+ assert(test_deleter<A>::dealloc_count == 0);
+ assert(d);
+ assert(d->state() == 1);
+ }
+ assert(A::count == 0);
+ assert(test_deleter<A>::count == 0);
+ assert(test_deleter<A>::dealloc_count == 1);
+#endif
}
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/nullptr_t_deleter_throw.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/nullptr_t_deleter_throw.pass.cpp
index e8365ae..a8588cc 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/nullptr_t_deleter_throw.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/nullptr_t_deleter_throw.pass.cpp
@@ -13,6 +13,8 @@
// template<class D> shared_ptr(nullptr_t, D d);
+// UNSUPPORTED: asan, msan
+
#include <memory>
#include <cassert>
#include <new>
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_deleter_allocator.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_deleter_allocator.pass.cpp
index 23d3f10..1a9c09c 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_deleter_allocator.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_deleter_allocator.pass.cpp
@@ -15,6 +15,7 @@
#include <cassert>
#include "../test_deleter.h"
#include "test_allocator.h"
+#include "min_allocator.h"
struct A
{
@@ -27,6 +28,7 @@
int A::count = 0;
+
int main()
{
{
@@ -48,4 +50,40 @@
assert(test_deleter<A>::dealloc_count == 1);
assert(test_allocator<A>::count == 0);
assert(test_allocator<A>::alloc_count == 0);
+ test_deleter<A>::dealloc_count = 0;
+ // Test an allocator with a minimal interface
+ {
+ A* ptr = new A;
+ std::shared_ptr<A> p(ptr, test_deleter<A>(3), bare_allocator<void>());
+ assert(A::count == 1);
+ assert(p.use_count() == 1);
+ assert(p.get() == ptr);
+ test_deleter<A>* d = std::get_deleter<test_deleter<A> >(p);
+ assert(test_deleter<A>::count == 1);
+ assert(test_deleter<A>::dealloc_count == 0);
+ assert(d);
+ assert(d->state() == 3);
+ }
+ assert(A::count == 0);
+ assert(test_deleter<A>::count == 0);
+ assert(test_deleter<A>::dealloc_count == 1);
+ test_deleter<A>::dealloc_count = 0;
+#if __cplusplus >= 201103L
+ // Test an allocator that returns class-type pointers
+ {
+ A* ptr = new A;
+ std::shared_ptr<A> p(ptr, test_deleter<A>(3), min_allocator<void>());
+ assert(A::count == 1);
+ assert(p.use_count() == 1);
+ assert(p.get() == ptr);
+ test_deleter<A>* d = std::get_deleter<test_deleter<A> >(p);
+ assert(test_deleter<A>::count == 1);
+ assert(test_deleter<A>::dealloc_count == 0);
+ assert(d);
+ assert(d->state() == 3);
+ }
+ assert(A::count == 0);
+ assert(test_deleter<A>::count == 0);
+ assert(test_deleter<A>::dealloc_count == 1);
+#endif
}
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_deleter_throw.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_deleter_throw.pass.cpp
index 79aaa58..b024f7e 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_deleter_throw.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_deleter_throw.pass.cpp
@@ -13,6 +13,8 @@
// template<class Y, class D> shared_ptr(Y* p, D d);
+// UNSUPPORTED: asan, msan
+
#include <memory>
#include <cassert>
#include <new>
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_throw.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_throw.pass.cpp
index d50d91c..28fb8bf 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_throw.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/pointer_throw.pass.cpp
@@ -11,6 +11,8 @@
// template<class Y> explicit shared_ptr(Y* p);
+// UNSUPPORTED: asan, msan
+
#include <memory>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp
index b841833..dc2a6af 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp
@@ -11,6 +11,8 @@
// template <class Y, class D> explicit shared_ptr(unique_ptr<Y, D>&&r);
+// UNSUPPORTED: asan, msan
+
#include <memory>
#include <new>
#include <cstdlib>
@@ -53,6 +55,9 @@
int A::count = 0;
+void fn ( const std::shared_ptr<int> &) {}
+void fn ( const std::shared_ptr<B> &) { assert (false); }
+
int main()
{
{
@@ -89,4 +94,10 @@
}
}
assert(A::count == 0);
+
+ // LWG 2399
+ {
+ throw_next = false;
+ fn(std::unique_ptr<int>(new int));
+ }
}
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared.pass.cpp
index e019837..aa77dab 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared.pass.cpp
@@ -19,6 +19,7 @@
#include <cstdlib>
#include <cassert>
#include "test_allocator.h"
+#include "min_allocator.h"
int new_count = 0;
@@ -54,4 +55,24 @@
}
assert(A::count == 0);
assert(test_allocator<A>::alloc_count == 0);
+#if __cplusplus >= 201103L
+ {
+ int i = 67;
+ char c = 'e';
+ std::shared_ptr<A> p = std::allocate_shared<A>(min_allocator<void>(), i, c);
+ assert(A::count == 1);
+ assert(p->get_int() == 67);
+ assert(p->get_char() == 'e');
+ }
+ assert(A::count == 0);
+ {
+ int i = 68;
+ char c = 'f';
+ std::shared_ptr<A> p = std::allocate_shared<A>(bare_allocator<void>(), i, c);
+ assert(A::count == 1);
+ assert(p->get_int() == 68);
+ assert(p->get_char() == 'f');
+ }
+ assert(A::count == 0);
+#endif
}
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared_no_variadics.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared_no_variadics.pass.cpp
new file mode 100644
index 0000000..8dcd50e
--- /dev/null
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared_no_variadics.pass.cpp
@@ -0,0 +1,118 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <memory>
+
+// shared_ptr
+
+// template<class T, class A, class... Args>
+// shared_ptr<T> allocate_shared(const A& a, Args&&... args);
+
+#define _LIBCPP_HAS_NO_VARIADICS
+#include <memory>
+#include <new>
+#include <cstdlib>
+#include <cassert>
+#include "test_allocator.h"
+#include "min_allocator.h"
+
+struct Zero
+{
+ static int count;
+ Zero() {++count;}
+ Zero(Zero const &) {++count;}
+ ~Zero() {--count;}
+};
+
+int Zero::count = 0;
+
+struct One
+{
+ static int count;
+ int value;
+ explicit One(int v) : value(v) {++count;}
+ One(One const & o) : value(o.value) {++count;}
+ ~One() {--count;}
+};
+
+int One::count = 0;
+
+
+struct Two
+{
+ static int count;
+ int value;
+ Two(int v, int) : value(v) {++count;}
+ Two(Two const & o) : value(o.value) {++count;}
+ ~Two() {--count;}
+};
+
+int Two::count = 0;
+
+struct Three
+{
+ static int count;
+ int value;
+ Three(int v, int, int) : value(v) {++count;}
+ Three(Three const & o) : value(o.value) {++count;}
+ ~Three() {--count;}
+};
+
+int Three::count = 0;
+
+template <class Alloc>
+void test()
+{
+ int const bad = -1;
+ {
+ std::shared_ptr<Zero> p = std::allocate_shared<Zero>(Alloc());
+ assert(Zero::count == 1);
+ }
+ assert(Zero::count == 0);
+ {
+ int const i = 42;
+ std::shared_ptr<One> p = std::allocate_shared<One>(Alloc(), i);
+ assert(One::count == 1);
+ assert(p->value == i);
+ }
+ assert(One::count == 0);
+ {
+ int const i = 42;
+ std::shared_ptr<Two> p = std::allocate_shared<Two>(Alloc(), i, bad);
+ assert(Two::count == 1);
+ assert(p->value == i);
+ }
+ assert(Two::count == 0);
+ {
+ int const i = 42;
+ std::shared_ptr<Three> p = std::allocate_shared<Three>(Alloc(), i, bad, bad);
+ assert(Three::count == 1);
+ assert(p->value == i);
+ }
+ assert(Three::count == 0);
+}
+
+int main()
+{
+ {
+ int i = 67;
+ int const bad = -1;
+ std::shared_ptr<Two> p = std::allocate_shared<Two>(test_allocator<Two>(54), i, bad);
+ assert(test_allocator<Two>::alloc_count == 1);
+ assert(Two::count == 1);
+ assert(p->value == 67);
+ }
+ assert(Two::count == 0);
+ assert(test_allocator<Two>::alloc_count == 0);
+
+ test<bare_allocator<void> >();
+#if __cplusplus >= 201103L
+ test<min_allocator<void> >();
+#endif
+}
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.pass.cpp
index eda148c..30a4984 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.pass.cpp
@@ -13,6 +13,8 @@
// template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args);
+// UNSUPPORTED: asan, msan
+
#include <memory>
#include <new>
#include <cstdlib>
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr.pass.cpp
index 1fdf883..75bf3df 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr.pass.cpp
@@ -55,8 +55,10 @@
template <class T>
std::weak_ptr<T> source (std::shared_ptr<T> p) { return std::weak_ptr<T>(p); }
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
template <class T>
void sink (std::weak_ptr<T> &&) {}
+#endif
int main()
{
@@ -98,6 +100,7 @@
assert(B::count == 0);
assert(A::count == 0);
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
std::shared_ptr<A> ps(new A);
std::weak_ptr<A> pA = source(ps);
@@ -107,4 +110,5 @@
}
assert(B::count == 0);
assert(A::count == 0);
+#endif
}
diff --git a/test/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr_Y.pass.cpp b/test/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr_Y.pass.cpp
index 70ad11b..51a8fa5 100644
--- a/test/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr_Y.pass.cpp
+++ b/test/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr_Y.pass.cpp
@@ -55,9 +55,6 @@
template <class T>
std::weak_ptr<T> source (std::shared_ptr<T> p) { return std::weak_ptr<T>(p); }
-template <class T>
-void sink (std::weak_ptr<T> &&) {}
-
int main()
{
static_assert(( std::is_convertible<std::weak_ptr<A>, std::weak_ptr<B> >::value), "");
diff --git a/test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp b/test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp
index 7de3b0d..eb8e31c 100644
--- a/test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp
+++ b/test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp
@@ -52,7 +52,7 @@
test_make_signed< unsigned long long, signed long long >();
test_make_signed< wchar_t, std::conditional<sizeof(wchar_t) == 4, int, short>::type >();
test_make_signed< const wchar_t, std::conditional<sizeof(wchar_t) == 4, const int, const short>::type >();
- test_make_signed< const Enum, const int >();
+ test_make_signed< const Enum, std::conditional<sizeof(Enum) == sizeof(int), const int, const signed char>::type >();
test_make_signed< BigEnum, std::conditional<sizeof(long) == 4, long long, long>::type >();
#ifndef _LIBCPP_HAS_NO_INT128
test_make_signed< __int128_t, __int128_t >();
diff --git a/test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp b/test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp
index a13485a..9844401 100644
--- a/test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp
+++ b/test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp
@@ -52,7 +52,7 @@
test_make_unsigned<unsigned long long, unsigned long long> ();
test_make_unsigned<wchar_t, std::conditional<sizeof(wchar_t) == 4, unsigned int, unsigned short>::type> ();
test_make_unsigned<const wchar_t, std::conditional<sizeof(wchar_t) == 4, const unsigned int, const unsigned short>::type> ();
- test_make_unsigned<const Enum, const unsigned int> ();
+ test_make_unsigned<const Enum, std::conditional<sizeof(Enum) == sizeof(int), const unsigned int, const unsigned char>::type >();
test_make_unsigned<BigEnum,
std::conditional<sizeof(long) == 4, unsigned long long, unsigned long>::type> ();
#ifndef _LIBCPP_HAS_NO_INT128
diff --git a/test/utilities/meta/meta.unary.prop.query/alignment_of.pass.cpp b/test/utilities/meta/meta.unary.prop.query/alignment_of.pass.cpp
index 01a2f65..6ea1cac 100644
--- a/test/utilities/meta/meta.unary.prop.query/alignment_of.pass.cpp
+++ b/test/utilities/meta/meta.unary.prop.query/alignment_of.pass.cpp
@@ -39,7 +39,7 @@
test_alignment_of<int, 4>();
test_alignment_of<double, 8>();
#if (defined(__ppc__) && !defined(__ppc64__))
- test_alignment_of<bool, 4>(); // 32-bit PPC has four byte bool
+ test_alignment_of<bool, 4>(); // 32-bit PPC has four byte bool
#else
test_alignment_of<bool, 1>();
#endif
diff --git a/test/utilities/meta/meta.unary.prop.query/void_t.pass.cpp b/test/utilities/meta/meta.unary.prop.query/void_t.pass.cpp
new file mode 100644
index 0000000..1f99a74
--- /dev/null
+++ b/test/utilities/meta/meta.unary.prop.query/void_t.pass.cpp
@@ -0,0 +1,69 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// type_traits
+
+// void_t
+
+#include <type_traits>
+
+#if _LIBCPP_STD_VER <= 14
+int main () {}
+#else
+
+template <class T>
+void test1()
+{
+ static_assert( std::is_same<void, std::void_t<T>>::value, "");
+ static_assert( std::is_same<void, std::void_t<const T>>::value, "");
+ static_assert( std::is_same<void, std::void_t<volatile T>>::value, "");
+ static_assert( std::is_same<void, std::void_t<const volatile T>>::value, "");
+}
+
+template <class T, class U>
+void test2()
+{
+ static_assert( std::is_same<void, std::void_t<T, U>>::value, "");
+ static_assert( std::is_same<void, std::void_t<const T, U>>::value, "");
+ static_assert( std::is_same<void, std::void_t<volatile T, U>>::value, "");
+ static_assert( std::is_same<void, std::void_t<const volatile T, U>>::value, "");
+
+ static_assert( std::is_same<void, std::void_t<T, const U>>::value, "");
+ static_assert( std::is_same<void, std::void_t<const T, const U>>::value, "");
+ static_assert( std::is_same<void, std::void_t<volatile T, const U>>::value, "");
+ static_assert( std::is_same<void, std::void_t<const volatile T, const U>>::value, "");
+}
+
+class Class
+{
+public:
+ ~Class();
+};
+
+int main()
+{
+ static_assert( std::is_same<void, std::void_t<>>::value, "");
+
+ test1<void>();
+ test1<int>();
+ test1<double>();
+ test1<int&>();
+ test1<Class>();
+ test1<Class[]>();
+ test1<Class[5]>();
+
+ test2<void, int>();
+ test2<double, int>();
+ test2<int&, int>();
+ test2<Class&, bool>();
+ test2<void *, int&>();
+
+ static_assert( std::is_same<void, std::void_t<int, double const &, Class, volatile int[], void>>::value, "");
+}
+#endif
diff --git a/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp
index c563870..67ef3db 100644
--- a/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp
@@ -61,6 +61,18 @@
test_member_function_pointer<void (Class::*)(int) volatile>();
test_member_function_pointer<void (Class::*)(int, char) volatile>();
+ test_member_function_pointer<void (Class::*)(...)>();
+ test_member_function_pointer<void (Class::*)(int, ...)>();
+ test_member_function_pointer<void (Class::*)(int, char, ...)>();
+
+ test_member_function_pointer<void (Class::*)(...) const>();
+ test_member_function_pointer<void (Class::*)(int, ...) const>();
+ test_member_function_pointer<void (Class::*)(int, char, ...) const>();
+
+ test_member_function_pointer<void (Class::*)(...) volatile>();
+ test_member_function_pointer<void (Class::*)(int, ...) volatile>();
+ test_member_function_pointer<void (Class::*)(int, char, ...) volatile>();
+
#if __cplusplus >= 201103L
// reference qualifiers on functions are a C++11 extension
test_member_function_pointer<void (Class::*)() &&>();
@@ -74,5 +86,17 @@
test_member_function_pointer<void (Class::*)() volatile &&>();
test_member_function_pointer<void (Class::*)(int) volatile &&>();
test_member_function_pointer<void (Class::*)(int, char) volatile &&>();
+
+ test_member_function_pointer<void (Class::*)(...) &&>();
+ test_member_function_pointer<void (Class::*)(int,...) &&>();
+ test_member_function_pointer<void (Class::*)(int, char,...) &&>();
+
+ test_member_function_pointer<void (Class::*)(...) &>();
+ test_member_function_pointer<void (Class::*)(int,...) &>();
+ test_member_function_pointer<void (Class::*)(int, char,...) &>();
+
+ test_member_function_pointer<void (Class::*)(...) volatile &&>();
+ test_member_function_pointer<void (Class::*)(int,...) volatile &&>();
+ test_member_function_pointer<void (Class::*)(int, char,...) volatile &&>();
#endif
}
diff --git a/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer_no_variadics.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer_no_variadics.pass.cpp
new file mode 100644
index 0000000..e13e586
--- /dev/null
+++ b/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer_no_variadics.pass.cpp
@@ -0,0 +1,76 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// type_traits
+
+// member_function_pointer
+
+#define _LIBCPP_HAS_NO_VARIADICS
+#include <type_traits>
+
+template <class T>
+void test_member_function_pointer_imp()
+{
+ static_assert(!std::is_void<T>::value, "");
+#if _LIBCPP_STD_VER > 11
+ static_assert(!std::is_null_pointer<T>::value, "");
+#endif
+ static_assert(!std::is_integral<T>::value, "");
+ static_assert(!std::is_floating_point<T>::value, "");
+ static_assert(!std::is_array<T>::value, "");
+ static_assert(!std::is_pointer<T>::value, "");
+ static_assert(!std::is_lvalue_reference<T>::value, "");
+ static_assert(!std::is_rvalue_reference<T>::value, "");
+ static_assert(!std::is_member_object_pointer<T>::value, "");
+ static_assert( std::is_member_function_pointer<T>::value, "");
+ static_assert(!std::is_enum<T>::value, "");
+ static_assert(!std::is_union<T>::value, "");
+ static_assert(!std::is_class<T>::value, "");
+ static_assert(!std::is_function<T>::value, "");
+}
+
+template <class T>
+void test_member_function_pointer()
+{
+ test_member_function_pointer_imp<T>();
+ test_member_function_pointer_imp<const T>();
+ test_member_function_pointer_imp<volatile T>();
+ test_member_function_pointer_imp<const volatile T>();
+}
+
+class Class
+{
+};
+
+int main()
+{
+ test_member_function_pointer<void (Class::*)()>();
+ test_member_function_pointer<void (Class::*)(int)>();
+ test_member_function_pointer<void (Class::*)(int, char)>();
+
+ test_member_function_pointer<void (Class::*)() const>();
+ test_member_function_pointer<void (Class::*)(int) const>();
+ test_member_function_pointer<void (Class::*)(int, char) const>();
+
+ test_member_function_pointer<void (Class::*)() volatile>();
+ test_member_function_pointer<void (Class::*)(int) volatile>();
+ test_member_function_pointer<void (Class::*)(int, char) volatile>();
+
+ test_member_function_pointer<void (Class::*)(...)>();
+ test_member_function_pointer<void (Class::*)(int, ...)>();
+ test_member_function_pointer<void (Class::*)(int, char, ...)>();
+
+ test_member_function_pointer<void (Class::*)(...) const>();
+ test_member_function_pointer<void (Class::*)(int, ...) const>();
+ test_member_function_pointer<void (Class::*)(int, char, ...) const>();
+
+ test_member_function_pointer<void (Class::*)(...) volatile>();
+ test_member_function_pointer<void (Class::*)(int, ...) volatile>();
+ test_member_function_pointer<void (Class::*)(int, char, ...) volatile>();
+}
diff --git a/test/utilities/meta/meta.unary/meta.unary.cat/nullptr.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.cat/nullptr.pass.cpp
index d619701..691e353 100644
--- a/test/utilities/meta/meta.unary/meta.unary.cat/nullptr.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.cat/nullptr.pass.cpp
@@ -10,7 +10,7 @@
// type_traits
// nullptr_t
-// is_null_pointer
+// is_null_pointer
#include <type_traits>
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/__has_operator_addressof.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/__has_operator_addressof.pass.cpp
index de27b98..1c715e0 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/__has_operator_addressof.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/__has_operator_addressof.pass.cpp
@@ -40,6 +40,20 @@
constexpr C operator&() const;
};
+struct F {};
+constexpr F* operator&(F const &) { return nullptr; }
+
+struct G {};
+constexpr G* operator&(G &&) { return nullptr; }
+
+struct H {};
+constexpr H* operator&(H const &&) { return nullptr; }
+
+struct J
+{
+ constexpr J* operator&() const &&;
+};
+
#endif // _LIBCPP_HAS_NO_CONSTEXPR
int main()
@@ -49,5 +63,9 @@
static_assert(std::__has_operator_addressof<A>::value == false, "");
static_assert(std::__has_operator_addressof<B>::value == true, "");
static_assert(std::__has_operator_addressof<E>::value == true, "");
+ static_assert(std::__has_operator_addressof<F>::value == true, "");
+ static_assert(std::__has_operator_addressof<G>::value == true, "");
+ static_assert(std::__has_operator_addressof<H>::value == true, "");
+ static_assert(std::__has_operator_addressof<J>::value == true, "");
#endif // _LIBCPP_HAS_NO_CONSTEXPR
}
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/has_virtual_destructor.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/has_virtual_destructor.pass.cpp
index 92fd336..685d30d 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/has_virtual_destructor.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/has_virtual_destructor.pass.cpp
@@ -69,7 +69,7 @@
test_has_not_virtual_destructor<int*>();
test_has_not_virtual_destructor<const int*>();
test_has_not_virtual_destructor<char[3]>();
- test_has_not_virtual_destructor<char[3]>();
+ test_has_not_virtual_destructor<char[]>();
test_has_not_virtual_destructor<bit_zero>();
test_has_virtual_destructor<Abstract>();
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_abstract.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_abstract.pass.cpp
index cba575f..f2a8c23 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_abstract.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_abstract.pass.cpp
@@ -61,7 +61,7 @@
test_is_not_abstract<int*>();
test_is_not_abstract<const int*>();
test_is_not_abstract<char[3]>();
- test_is_not_abstract<char[3]>();
+ test_is_not_abstract<char[]>();
test_is_not_abstract<Union>();
test_is_not_abstract<Empty>();
test_is_not_abstract<bit_zero>();
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_const.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_const.pass.cpp
index 3285765..72f2ff4 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_const.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_const.pass.cpp
@@ -30,7 +30,7 @@
test_is_const<int*>();
test_is_const<const int*>();
test_is_const<char[3]>();
- test_is_const<char[3]>();
+ test_is_const<char[]>();
static_assert(!std::is_const<int&>::value, "");
static_assert(!std::is_const<const int&>::value, "");
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_assignable.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_assignable.pass.cpp
index bde44de..c43d594 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_assignable.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_assignable.pass.cpp
@@ -52,6 +52,11 @@
B& operator=(const B&);
};
+struct C
+{
+ void operator=(C&); // not const
+};
+
int main()
{
test_is_copy_assignable<int> ();
@@ -71,4 +76,5 @@
test_is_not_copy_assignable<B> ();
#endif
test_is_not_copy_assignable<void> ();
+ test_is_not_copy_assignable<C> ();
}
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_constructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_constructible.pass.cpp
index 837d0b0..f878a50 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_constructible.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_copy_constructible.pass.cpp
@@ -58,6 +58,12 @@
B(const B&);
};
+struct C
+{
+ C(C&); // not const
+ void operator=(C&); // not const
+};
+
int main()
{
test_is_copy_constructible<A>();
@@ -75,6 +81,7 @@
test_is_not_copy_constructible<char[]>();
test_is_not_copy_constructible<void>();
test_is_not_copy_constructible<Abstract>();
+ test_is_not_copy_constructible<C>();
#if __has_feature(cxx_access_control_sfinae)
test_is_not_copy_constructible<B>();
#endif
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_empty.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_empty.pass.cpp
index 584d2cc..47af3c4 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_empty.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_empty.pass.cpp
@@ -56,7 +56,7 @@
test_is_not_empty<int*>();
test_is_not_empty<const int*>();
test_is_not_empty<char[3]>();
- test_is_not_empty<char[3]>();
+ test_is_not_empty<char[]>();
test_is_not_empty<Union>();
test_is_not_empty<NotEmpty>();
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_move_assignable.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_move_assignable.pass.cpp
index 892ffd7..a89ee7d 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_move_assignable.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_move_assignable.pass.cpp
@@ -60,7 +60,6 @@
test_is_not_move_assignable<const int> ();
test_is_not_move_assignable<int[]> ();
test_is_not_move_assignable<int[3]> ();
- test_is_not_move_assignable<int[3]> ();
#endif
test_is_not_move_assignable<void> ();
}
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_assignable.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_assignable.pass.cpp
index 3bd2b3b..8fff5f8 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_assignable.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_assignable.pass.cpp
@@ -34,6 +34,11 @@
void operator=(A);
};
+struct C
+{
+ void operator=(C&); // not const
+};
+
int main()
{
test_is_nothrow_assignable<int&, int&> ();
@@ -46,4 +51,5 @@
test_is_not_nothrow_assignable<int, int> ();
test_is_not_nothrow_assignable<B, A> ();
test_is_not_nothrow_assignable<A, B> ();
+ test_is_not_nothrow_assignable<C, C&> ();
}
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_constructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_constructible.pass.cpp
index 8978ec9..fe0b567 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_constructible.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_constructible.pass.cpp
@@ -70,14 +70,34 @@
A(const A&);
};
+struct C
+{
+ C(C&); // not const
+ void operator=(C&); // not const
+};
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+struct Tuple {
+ Tuple(Empty&&) noexcept {}
+};
+#endif
+
int main()
{
test_is_nothrow_constructible<int> ();
test_is_nothrow_constructible<int, const int&> ();
test_is_nothrow_constructible<Empty> ();
test_is_nothrow_constructible<Empty, const Empty&> ();
-
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ test_is_nothrow_constructible<Tuple &&, Empty> (); // See bug #19616.
+#endif
+
test_is_not_nothrow_constructible<A, int> ();
test_is_not_nothrow_constructible<A, int, double> ();
test_is_not_nothrow_constructible<A> ();
+ test_is_not_nothrow_constructible<C> ();
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ static_assert(!std::is_constructible<Tuple&, Empty>::value, "");
+ test_is_not_nothrow_constructible<Tuple &, Empty> (); // See bug #19616.
+#endif
}
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible.pass.cpp
index 7871732..8fd5bab 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible.pass.cpp
@@ -23,7 +23,7 @@
}
template <class T>
-void test_has_not_nothrow_destructor()
+void test_is_not_nothrow_destructible()
{
static_assert(!std::is_nothrow_destructible<T>::value, "");
static_assert(!std::is_nothrow_destructible<const T>::value, "");
@@ -64,9 +64,10 @@
int main()
{
- test_has_not_nothrow_destructor<void>();
- test_has_not_nothrow_destructor<AbstractDestructor>();
- test_has_not_nothrow_destructor<NotEmpty>();
+ test_is_not_nothrow_destructible<void>();
+ test_is_not_nothrow_destructible<AbstractDestructor>();
+ test_is_not_nothrow_destructible<NotEmpty>();
+ test_is_not_nothrow_destructible<char[]>();
#if __has_feature(cxx_noexcept)
test_is_nothrow_destructible<A>();
@@ -83,7 +84,6 @@
test_is_nothrow_destructible<int*>();
test_is_nothrow_destructible<const int*>();
test_is_nothrow_destructible<char[3]>();
- test_is_nothrow_destructible<char[3]>();
test_is_nothrow_destructible<Abstract>();
#if __has_feature(cxx_noexcept)
test_is_nothrow_destructible<bit_zero>();
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_pod.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_pod.pass.cpp
index a97685c..4ec1ae9 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_pod.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_pod.pass.cpp
@@ -48,5 +48,5 @@
test_is_pod<int*>();
test_is_pod<const int*>();
test_is_pod<char[3]>();
- test_is_pod<char[3]>();
+ test_is_pod<char[]>();
}
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_polymorphic.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_polymorphic.pass.cpp
index 8f5547e..6e82cdd 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_polymorphic.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_polymorphic.pass.cpp
@@ -69,7 +69,7 @@
test_is_not_polymorphic<int*>();
test_is_not_polymorphic<const int*>();
test_is_not_polymorphic<char[3]>();
- test_is_not_polymorphic<char[3]>();
+ test_is_not_polymorphic<char[]>();
test_is_not_polymorphic<Union>();
test_is_not_polymorphic<Empty>();
test_is_not_polymorphic<bit_zero>();
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp
index 7de6566..479c252 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp
@@ -45,7 +45,7 @@
test_is_not_signed<int*>();
test_is_not_signed<const int*>();
test_is_not_signed<char[3]>();
- test_is_not_signed<char[3]>();
+ test_is_not_signed<char[]>();
test_is_not_signed<bool>();
test_is_not_signed<unsigned>();
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_trivially_assignable.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_trivially_assignable.pass.cpp
index 984824a..735d05f 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_trivially_assignable.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_trivially_assignable.pass.cpp
@@ -34,6 +34,11 @@
void operator=(A);
};
+struct C
+{
+ void operator=(C&); // not const
+};
+
int main()
{
test_is_trivially_assignable<int&, int&> ();
@@ -44,4 +49,5 @@
test_is_not_trivially_assignable<int, int> ();
test_is_not_trivially_assignable<B, A> ();
test_is_not_trivially_assignable<A, B> ();
+ test_is_not_trivially_assignable<C&, C&> ();
}
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_trivially_copyable.pass.cpp
similarity index 100%
rename from test/utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable.pass.cpp
rename to test/utilities/meta/meta.unary/meta.unary.prop/is_trivially_copyable.pass.cpp
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_trivially_destructible.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_trivially_destructible.pass.cpp
index 1b34885..b18ace4 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_trivially_destructible.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_trivially_destructible.pass.cpp
@@ -23,7 +23,7 @@
}
template <class T>
-void test_has_not_trivial_destructor()
+void test_is_not_trivially_destructible()
{
static_assert(!std::is_trivially_destructible<T>::value, "");
static_assert(!std::is_trivially_destructible<const T>::value, "");
@@ -64,10 +64,11 @@
int main()
{
- test_has_not_trivial_destructor<void>();
- test_has_not_trivial_destructor<A>();
- test_has_not_trivial_destructor<AbstractDestructor>();
- test_has_not_trivial_destructor<NotEmpty>();
+ test_is_not_trivially_destructible<void>();
+ test_is_not_trivially_destructible<A>();
+ test_is_not_trivially_destructible<AbstractDestructor>();
+ test_is_not_trivially_destructible<NotEmpty>();
+ test_is_not_trivially_destructible<char[]>();
test_is_trivially_destructible<Abstract>();
test_is_trivially_destructible<int&>();
@@ -78,6 +79,5 @@
test_is_trivially_destructible<int*>();
test_is_trivially_destructible<const int*>();
test_is_trivially_destructible<char[3]>();
- test_is_trivially_destructible<char[3]>();
test_is_trivially_destructible<bit_zero>();
}
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp
index 2cd4945..dfdb155 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp
@@ -45,7 +45,7 @@
test_is_not_unsigned<int*>();
test_is_not_unsigned<const int*>();
test_is_not_unsigned<char[3]>();
- test_is_not_unsigned<char[3]>();
+ test_is_not_unsigned<char[]>();
test_is_not_unsigned<int>();
test_is_not_unsigned<double>();
diff --git a/test/utilities/meta/meta.unary/meta.unary.prop/is_volatile.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.prop/is_volatile.pass.cpp
index 8e1fca4..f6805bc 100644
--- a/test/utilities/meta/meta.unary/meta.unary.prop/is_volatile.pass.cpp
+++ b/test/utilities/meta/meta.unary/meta.unary.prop/is_volatile.pass.cpp
@@ -30,7 +30,7 @@
test_is_volatile<int*>();
test_is_volatile<const int*>();
test_is_volatile<char[3]>();
- test_is_volatile<char[3]>();
+ test_is_volatile<char[]>();
static_assert(!std::is_volatile<int&>::value, "");
static_assert(!std::is_volatile<volatile int&>::value, "");
diff --git a/test/utilities/optional/optional.hash/hash.pass.cpp b/test/utilities/optional/optional.hash/hash.pass.cpp
index ca23d78..9e5fb55 100644
--- a/test/utilities/optional/optional.hash/hash.pass.cpp
+++ b/test/utilities/optional/optional.hash/hash.pass.cpp
@@ -20,7 +20,7 @@
int main()
{
#if _LIBCPP_STD_VER > 11
- using std::experimental::optional;
+ using std::experimental::optional;
{
typedef int T;
diff --git a/test/utilities/optional/optional.nullops/eqaul.pass.cpp b/test/utilities/optional/optional.nullops/eqaul.pass.cpp
index d137d30..54fb522 100644
--- a/test/utilities/optional/optional.nullops/eqaul.pass.cpp
+++ b/test/utilities/optional/optional.nullops/eqaul.pass.cpp
@@ -18,9 +18,9 @@
int main()
{
#if _LIBCPP_STD_VER > 11
- using std::experimental::optional;
- using std::experimental::nullopt_t;
- using std::experimental::nullopt;
+ using std::experimental::optional;
+ using std::experimental::nullopt_t;
+ using std::experimental::nullopt;
{
typedef int T;
diff --git a/test/utilities/optional/optional.nullops/less_than.pass.cpp b/test/utilities/optional/optional.nullops/less_than.pass.cpp
index 51c8e49..576a98a 100644
--- a/test/utilities/optional/optional.nullops/less_than.pass.cpp
+++ b/test/utilities/optional/optional.nullops/less_than.pass.cpp
@@ -18,9 +18,9 @@
int main()
{
#if _LIBCPP_STD_VER > 11
- using std::experimental::optional;
- using std::experimental::nullopt_t;
- using std::experimental::nullopt;
+ using std::experimental::optional;
+ using std::experimental::nullopt_t;
+ using std::experimental::nullopt;
{
typedef int T;
diff --git a/test/utilities/optional/optional.object/optional_const_void.fail.cpp b/test/utilities/optional/optional.object/optional_const_void.fail.cpp
index ccbcf2e..6999cf2 100644
--- a/test/utilities/optional/optional.object/optional_const_void.fail.cpp
+++ b/test/utilities/optional/optional.object/optional_const_void.fail.cpp
@@ -16,7 +16,7 @@
int main()
{
#if _LIBCPP_STD_VER > 11
- using std::experimental::optional;
+ using std::experimental::optional;
optional<const void> opt;
#else
diff --git a/test/utilities/time/time.clock/time.clock.steady/consistency.pass.cpp b/test/utilities/time/time.clock/time.clock.steady/consistency.pass.cpp
index bec6787..60c6461 100644
--- a/test/utilities/time/time.clock/time.clock.steady/consistency.pass.cpp
+++ b/test/utilities/time/time.clock/time.clock.steady/consistency.pass.cpp
@@ -11,6 +11,7 @@
// darwin11 and darwin12:
// XFAIL: with_system_lib=x86_64-apple-darwin11
// XFAIL: with_system_lib=x86_64-apple-darwin12
+// UNSUPPORTED: libcpp-has-no-monotonic-clock
// <chrono>
diff --git a/test/utilities/time/time.clock/time.clock.steady/now.pass.cpp b/test/utilities/time/time.clock/time.clock.steady/now.pass.cpp
index 0c6ebe6..4b86d9e 100644
--- a/test/utilities/time/time.clock/time.clock.steady/now.pass.cpp
+++ b/test/utilities/time/time.clock/time.clock.steady/now.pass.cpp
@@ -6,6 +6,8 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// UNSUPPORTED: libcpp-has-no-monotonic-clock
// <chrono>
diff --git a/test/utilities/tuple/tuple.tuple/tuple.assign/tuple_array_template_depth.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.assign/tuple_array_template_depth.pass.cpp
new file mode 100644
index 0000000..f62d2fe
--- /dev/null
+++ b/test/utilities/tuple/tuple.tuple/tuple.assign/tuple_array_template_depth.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <tuple>
+
+// template <class... Types> class tuple;
+
+// template <class Tuple, __tuple_assignable<Tuple, tuple> >
+// tuple & operator=(Tuple &&);
+
+// This test checks that we do not evaluate __make_tuple_types
+// on the array when it doesn't match the size of the tuple.
+
+#include <array>
+#include <tuple>
+
+// Use 1256 to try and blow the template instantiation depth for all compilers.
+typedef std::array<char, 1256> array_t;
+typedef std::tuple<array_t> tuple_t;
+
+int main()
+{
+ array_t arr;
+ tuple_t tup;
+ tup = arr;
+}
diff --git a/test/utilities/tuple/tuple.tuple/tuple.cnstr/UTypes.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.cnstr/UTypes.pass.cpp
index d6fbdae..3d8b194 100644
--- a/test/utilities/tuple/tuple.tuple/tuple.cnstr/UTypes.pass.cpp
+++ b/test/utilities/tuple/tuple.tuple/tuple.cnstr/UTypes.pass.cpp
@@ -16,6 +16,7 @@
#include <tuple>
#include <cassert>
+#include <type_traits>
#include "../MoveOnly.h"
@@ -30,6 +31,71 @@
#endif
+struct NoDefault { NoDefault() = delete; };
+
+// Make sure the _Up... constructor SFINAEs out when the types that
+// are not explicitly initialized are not all default constructible.
+// Otherwise, std::is_constructible would return true but instantiating
+// the constructor would fail.
+void test_default_constructible_extension_sfinae()
+{
+ {
+ typedef std::tuple<MoveOnly, NoDefault> Tuple;
+
+ static_assert(!std::is_constructible<
+ Tuple,
+ MoveOnly
+ >::value, "");
+
+ static_assert(std::is_constructible<
+ Tuple,
+ MoveOnly, NoDefault
+ >::value, "");
+ }
+ {
+ typedef std::tuple<MoveOnly, MoveOnly, NoDefault> Tuple;
+
+ static_assert(!std::is_constructible<
+ Tuple,
+ MoveOnly, MoveOnly
+ >::value, "");
+
+ static_assert(std::is_constructible<
+ Tuple,
+ MoveOnly, MoveOnly, NoDefault
+ >::value, "");
+ }
+ {
+ // Same idea as above but with a nested tuple type.
+ typedef std::tuple<MoveOnly, NoDefault> Tuple;
+ typedef std::tuple<MoveOnly, Tuple, MoveOnly, MoveOnly> NestedTuple;
+
+ static_assert(!std::is_constructible<
+ NestedTuple,
+ MoveOnly, MoveOnly, MoveOnly, MoveOnly
+ >::value, "");
+
+ static_assert(std::is_constructible<
+ NestedTuple,
+ MoveOnly, Tuple, MoveOnly, MoveOnly
+ >::value, "");
+ }
+ {
+ typedef std::tuple<MoveOnly, int> Tuple;
+ typedef std::tuple<MoveOnly, Tuple, MoveOnly, MoveOnly> NestedTuple;
+
+ static_assert(std::is_constructible<
+ NestedTuple,
+ MoveOnly, MoveOnly, MoveOnly, MoveOnly
+ >::value, "");
+
+ static_assert(std::is_constructible<
+ NestedTuple,
+ MoveOnly, Tuple, MoveOnly, MoveOnly
+ >::value, "");
+ }
+}
+
int main()
{
{
@@ -72,4 +138,7 @@
static_assert(std::get<0>(t).id_ == 3, "");
}
#endif
+ // Check that SFINAE is properly applied with the default reduced arity
+ // constructor extensions.
+ test_default_constructible_extension_sfinae();
}
diff --git a/test/utilities/tuple/tuple.tuple/tuple.cnstr/alloc_UTypes.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.cnstr/alloc_UTypes.pass.cpp
index 667c4dd..00bc5e0 100644
--- a/test/utilities/tuple/tuple.tuple/tuple.cnstr/alloc_UTypes.pass.cpp
+++ b/test/utilities/tuple/tuple.tuple/tuple.cnstr/alloc_UTypes.pass.cpp
@@ -22,6 +22,71 @@
#include "../alloc_first.h"
#include "../alloc_last.h"
+struct NoDefault { NoDefault() = delete; };
+
+// Make sure the _Up... constructor SFINAEs out when the types that
+// are not explicitly initialized are not all default constructible.
+// Otherwise, std::is_constructible would return true but instantiating
+// the constructor would fail.
+void test_default_constructible_extension_sfinae()
+{
+ {
+ typedef std::tuple<MoveOnly, NoDefault> Tuple;
+
+ static_assert(!std::is_constructible<
+ Tuple,
+ std::allocator_arg_t, A1<int>, MoveOnly
+ >::value, "");
+
+ static_assert(std::is_constructible<
+ Tuple,
+ std::allocator_arg_t, A1<int>, MoveOnly, NoDefault
+ >::value, "");
+ }
+ {
+ typedef std::tuple<MoveOnly, MoveOnly, NoDefault> Tuple;
+
+ static_assert(!std::is_constructible<
+ std::tuple<MoveOnly, MoveOnly, NoDefault>,
+ std::allocator_arg_t, A1<int>, MoveOnly, MoveOnly
+ >::value, "");
+
+ static_assert(std::is_constructible<
+ std::tuple<MoveOnly, MoveOnly, NoDefault>,
+ std::allocator_arg_t, A1<int>, MoveOnly, MoveOnly, NoDefault
+ >::value, "");
+ }
+ {
+ // Same idea as above but with a nested tuple
+ typedef std::tuple<MoveOnly, NoDefault> Tuple;
+ typedef std::tuple<MoveOnly, Tuple, MoveOnly, MoveOnly> NestedTuple;
+
+ static_assert(!std::is_constructible<
+ NestedTuple,
+ std::allocator_arg_t, A1<int>, MoveOnly, MoveOnly, MoveOnly, MoveOnly
+ >::value, "");
+
+ static_assert(std::is_constructible<
+ NestedTuple,
+ std::allocator_arg_t, A1<int>, MoveOnly, Tuple, MoveOnly, MoveOnly
+ >::value, "");
+ }
+ {
+ typedef std::tuple<MoveOnly, int> Tuple;
+ typedef std::tuple<MoveOnly, Tuple, MoveOnly, MoveOnly> NestedTuple;
+
+ static_assert(std::is_constructible<
+ NestedTuple,
+ std::allocator_arg_t, A1<int>, MoveOnly, MoveOnly, MoveOnly, MoveOnly
+ >::value, "");
+
+ static_assert(std::is_constructible<
+ NestedTuple,
+ std::allocator_arg_t, A1<int>, MoveOnly, Tuple, MoveOnly, MoveOnly
+ >::value, "");
+ }
+}
+
int main()
{
{
@@ -68,4 +133,7 @@
assert(std::get<1>(t) == MoveOnly());
assert(std::get<2>(t) == MoveOnly());
}
+ // Check that SFINAE is properly applied with the default reduced arity
+ // constructor extensions.
+ test_default_constructible_extension_sfinae();
}
diff --git a/test/utilities/tuple/tuple.tuple/tuple.cnstr/default.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.cnstr/default.pass.cpp
index b72b77e..9cde90d 100644
--- a/test/utilities/tuple/tuple.tuple/tuple.cnstr/default.pass.cpp
+++ b/test/utilities/tuple/tuple.tuple/tuple.cnstr/default.pass.cpp
@@ -16,9 +16,23 @@
#include <tuple>
#include <string>
#include <cassert>
+#include <type_traits>
#include "DefaultOnly.h"
+struct NoDefault {
+ NoDefault() = delete;
+ explicit NoDefault(int) { }
+};
+
+struct NoExceptDefault {
+ NoExceptDefault() noexcept = default;
+};
+
+struct ThrowingDefault {
+ ThrowingDefault() { }
+};
+
int main()
{
{
@@ -46,6 +60,20 @@
assert(std::get<2>(t) == "");
assert(std::get<3>(t) == DefaultOnly());
}
+ {
+ // See bug #21157.
+ static_assert(!std::is_default_constructible<std::tuple<NoDefault>>(), "");
+ static_assert(!std::is_default_constructible<std::tuple<DefaultOnly, NoDefault>>(), "");
+ static_assert(!std::is_default_constructible<std::tuple<NoDefault, DefaultOnly, NoDefault>>(), "");
+ }
+ {
+ static_assert(noexcept(std::tuple<NoExceptDefault>()), "");
+ static_assert(noexcept(std::tuple<NoExceptDefault, NoExceptDefault>()), "");
+
+ static_assert(!noexcept(std::tuple<ThrowingDefault, NoExceptDefault>()), "");
+ static_assert(!noexcept(std::tuple<NoExceptDefault, ThrowingDefault>()), "");
+ static_assert(!noexcept(std::tuple<ThrowingDefault, ThrowingDefault>()), "");
+ }
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
{
constexpr std::tuple<> t;
diff --git a/test/utilities/tuple/tuple.tuple/tuple.cnstr/tuple_array_template_depth.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.cnstr/tuple_array_template_depth.pass.cpp
new file mode 100644
index 0000000..65a1c70
--- /dev/null
+++ b/test/utilities/tuple/tuple.tuple/tuple.cnstr/tuple_array_template_depth.pass.cpp
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <tuple>
+
+// template <class... Types> class tuple;
+
+// template <class Tuple, __tuple_convertible<Tuple, tuple> >
+// tuple(Tuple &&);
+//
+// template <class Tuple, __tuple_constructible<Tuple, tuple> >
+// tuple(Tuple &&);
+
+// This test checks that we do not evaluate __make_tuple_types
+// on the array.
+
+#include <array>
+#include <tuple>
+
+// Use 1256 to try and blow the template instantiation depth for all compilers.
+typedef std::array<char, 1256> array_t;
+typedef std::tuple<array_t> tuple_t;
+
+int main()
+{
+ array_t arr;
+ tuple_t tup(arr);
+}
diff --git a/test/utilities/tuple/tuple.tuple/tuple.creation/tuple_cat.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.creation/tuple_cat.pass.cpp
index b47842d..3fca573 100644
--- a/test/utilities/tuple/tuple.tuple/tuple.creation/tuple_cat.pass.cpp
+++ b/test/utilities/tuple/tuple.tuple/tuple.creation/tuple_cat.pass.cpp
@@ -213,4 +213,18 @@
assert(std::get<3>(t3) == 4);
assert(std::get<4>(t3) == 5);
}
+ {
+ // See bug #19616.
+ auto t1 = std::tuple_cat(
+ std::make_tuple(std::make_tuple(1)),
+ std::make_tuple()
+ );
+ assert(t1 == std::make_tuple(std::make_tuple(1)));
+
+ auto t2 = std::tuple_cat(
+ std::make_tuple(std::make_tuple(1)),
+ std::make_tuple(std::make_tuple(2))
+ );
+ assert(t2 == std::make_tuple(std::make_tuple(1), std::make_tuple(2)));
+ }
}
diff --git a/test/utilities/tuple/tuple.tuple/tuple.helper/tuple.include.array.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.helper/tuple.include.array.pass.cpp
new file mode 100644
index 0000000..d8a72c6
--- /dev/null
+++ b/test/utilities/tuple/tuple.tuple/tuple.helper/tuple.include.array.pass.cpp
@@ -0,0 +1,52 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <tuple>
+
+// template <class... Types> class tuple;
+
+// template <size_t I, class... Types>
+// class tuple_element<I, tuple<Types...> >
+// {
+// public:
+// typedef Ti type;
+// };
+//
+// LWG #2212 says that tuple_size and tuple_element must be
+// available after including <utility>
+
+#include <array>
+#include <type_traits>
+
+template <class T, std::size_t N, class U, size_t idx>
+void test()
+{
+ static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+ std::tuple_size<T> >::value), "");
+ static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+ std::tuple_size<const T> >::value), "");
+ static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+ std::tuple_size<volatile T> >::value), "");
+ static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+ std::tuple_size<const volatile T> >::value), "");
+ static_assert((std::is_same<typename std::tuple_element<idx, T>::type, U>::value), "");
+ static_assert((std::is_same<typename std::tuple_element<idx, const T>::type, const U>::value), "");
+ static_assert((std::is_same<typename std::tuple_element<idx, volatile T>::type, volatile U>::value), "");
+ static_assert((std::is_same<typename std::tuple_element<idx, const volatile T>::type, const volatile U>::value), "");
+}
+
+int main()
+{
+ test<std::array<int, 5>, 5, int, 0>();
+ test<std::array<int, 5>, 5, int, 1>();
+ test<std::array<const char *, 4>, 4, const char *, 3>();
+ test<std::array<volatile int, 4>, 4, volatile int, 3>();
+ test<std::array<char *, 3>, 3, char *, 1>();
+ test<std::array<char *, 3>, 3, char *, 2>();
+}
diff --git a/test/utilities/tuple/tuple.tuple/tuple.helper/tuple.include.utility.pass.cpp b/test/utilities/tuple/tuple.tuple/tuple.helper/tuple.include.utility.pass.cpp
new file mode 100644
index 0000000..8c8357d
--- /dev/null
+++ b/test/utilities/tuple/tuple.tuple/tuple.helper/tuple.include.utility.pass.cpp
@@ -0,0 +1,49 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <tuple>
+
+// template <class... Types> class tuple;
+
+// template <class... Types>
+// class tuple_size<tuple<Types...>>
+// : public integral_constant<size_t, sizeof...(Types)> { };
+//
+// LWG #2212 says that tuple_size and tuple_element must be
+// available after including <utility>
+
+#include <utility>
+#include <type_traits>
+
+template <class T, std::size_t N, class U, size_t idx>
+void test()
+{
+ static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+ std::tuple_size<T> >::value), "");
+ static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+ std::tuple_size<const T> >::value), "");
+ static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+ std::tuple_size<volatile T> >::value), "");
+ static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+ std::tuple_size<const volatile T> >::value), "");
+ static_assert((std::is_same<typename std::tuple_element<idx, T>::type, U>::value), "");
+ static_assert((std::is_same<typename std::tuple_element<idx, const T>::type, const U>::value), "");
+ static_assert((std::is_same<typename std::tuple_element<idx, volatile T>::type, volatile U>::value), "");
+ static_assert((std::is_same<typename std::tuple_element<idx, const volatile T>::type, const volatile U>::value), "");
+}
+
+int main()
+{
+ test<std::pair<int, int>, 2, int, 0>();
+ test<std::pair<int, int>, 2, int, 1>();
+ test<std::pair<const int, int>, 2, int, 1>();
+ test<std::pair<int, volatile int>, 2, volatile int, 1>();
+ test<std::pair<char *, int>, 2, char *, 0>();
+ test<std::pair<char *, int>, 2, int, 1>();
+}
diff --git a/www/cxx1z_status.html b/www/cxx1z_status.html
new file mode 100644
index 0000000..caa750b
--- /dev/null
+++ b/www/cxx1z_status.html
@@ -0,0 +1,108 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
+<html>
+<head>
+ <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>libc++ C++1Z Status</title>
+ <link type="text/css" rel="stylesheet" href="menu.css">
+ <link type="text/css" rel="stylesheet" href="content.css">
+</head>
+
+<body>
+<div id="menu">
+ <div>
+ <a href="http://llvm.org/">LLVM Home</a>
+ </div>
+
+ <div class="submenu">
+ <label>libc++ Info</label>
+ <a href="/index.html">About</a>
+ </div>
+
+ <div class="submenu">
+ <label>Quick Links</label>
+ <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">cfe-dev</a>
+ <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">cfe-commits</a>
+ <a href="http://llvm.org/bugs/">Bug Reports</a>
+ <a href="http://llvm.org/svn/llvm-project/libcxx/trunk/">Browse SVN</a>
+ <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/">Browse ViewVC</a>
+ </div>
+</div>
+
+<div id="content">
+ <!--*********************************************************************-->
+ <h1>libc++ C++1z Status</h1>
+ <!--*********************************************************************-->
+
+ <p>In November 2014, the C++ standard committee created a draft for the next version of the C++ standard, known here as "C++1z" (probably to be C++17)</p>
+ <p>This page shows the status of libc++; the status of clang's support of the language features is <a href="http://clang.llvm.org/cxx_status.html#cxx17">here</a>.</p>
+
+ <p>The groups that have contributed papers:
+ <ul>
+ <li>LWG - Library working group</li>
+ <li>CWG - Core Language Working group</li>
+ <li>SG1 - Study group #1 (Concurrency working group)</li>
+ </ul>
+ </p>
+
+ <h3>Paper Status</h3>
+ <table id="papers" border="1">
+ <tr><th>Paper #</th><th>Group</th><th>Paper Name</th><th>Meeting</th><th>Status</th><th>First released version</th></tr>
+<!--
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3346.pdf">3346</a></td><td>LWG</td><td>Terminology for Container Element Requirements - Rev 1</td><td>Kona</td><td>Complete</td><td>3.4</td></tr>
+-->
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3911">N3911</a></td><td>LWG</td></td><td>TransformationTrait Alias <code>void_t</code>.</td><td>Urbana</td><td>Complete</td><td>3.6</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4089">N4089</a></td><td>LWG</td></td><td>Safe conversions in <code>unique_ptr<T[]></code>.</td><td>Urbana</td><td></td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4169">N4169</a></td><td>LWG</td></td><td>A proposal to add invoke function template</td><td>Urbana</td><td></td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4190">N4190</a></td></td><td>LWG</td><td>Removing auto_ptr, random_shuffle(), And Old <functional> Stuff.</td><td>Urbana</td><td></td><td></td></tr>
+ <tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/n4258.pdf">N4258</a></td><td>LWG</td></td><td>Cleaning-up noexcept in the Library.</td><td>Urbana</td><td></td><td></td></tr>
+ <tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/N4277.html">N4277</a></td><td>LWG</td></td><td>TriviallyCopyable <code>reference_wrapper</code>.</td><td>Urbana</td><td>Complete</td><td>3.2</td></tr>
+ <tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/n4279.html">N4279</a></td><td>LWG</td></td><td>Improved insertion interface for unique-key maps.</td><td>Urbana</td><td></td><td></td></tr>
+ <tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/n4280.pdf">N4280</a></td><td>LWG</td></td><td>Non-member size() and more</td><td>Urbana</td><td>Complete</td><td>3.6</td></tr>
+ <tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/n4284.html">N4284</a></td><td>LWG</td></td><td>Contiguous Iterators.</td><td>Urbana</td><td></td><td></td></tr>
+
+<!-- <tr><td></td><td></td><td></td><td></td><td></td><td></td></tr> -->
+ </table>
+
+ <h3>Library Working group Issues Status</h3>
+<!-- <I>Note: "NAD" means that the issue was deemed "Not a defect"</I> -->
+ <table id="issues" border="1">
+ <tr><th>Issue #</th><th>Issue Name</th><th>Meeting</th><th>Status</th></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2016">2016</a></td><td>Allocators must be no-throw swappable</td><td>Urbana</td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2376">2118</td><td><code>unique_ptr</code> for array does not support cv qualification conversion of actual argument</td><td>Urbana</td><td>Will be resolved by N4089</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2170">2170</a></td><td>Aggregates cannot be <code>DefaultConstructible</code></td><td>Urbana</td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2387">2308</td><td>Clarify container destructor requirements w.r.t. <code>std::array</code></td><td>Urbana</td><td>Will be resolved by N4258</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2340">2340</a></td><td>Replacement allocation functions declared as inline</td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2354">2354</a></td><td>Unnecessary copying when inserting into maps with braced-init syntax</td><td>Urbana</td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2377">2377</a></td><td><code>std::align</code> requirements overly strict</td><td>Urbana</td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2396">2396</a></td><td><code>underlying_type</code> doesn't say what to do for an incomplete enumeration type</td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2399">2399</a></td><td><code>shared_ptr</code>'s constructor from <code>unique_ptr</code> should be constrained</td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2400">2400</a></td><td><code>shared_ptr</code>'s <code>get_deleter()</code> should use <code>addressof()</code></td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2401">2401</a></td><td><code>std::function</code> needs more noexcept</td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2404">2404</a></td><td><code>mismatch()</code>'s complexity needs to be updated</td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2408">2408</a></td><td>SFINAE-friendly <code>common_type</code> / <code>iterator_traits</code> is missing in C++14</td><td>Urbana</td><td></td></tr>
+ <tr><td></td><td></td><td></td><td></td></tr>
+
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2106">2106</td><td><code>move_iterator</code> wrapping iterators returning prvalues</td><td>Urbana</td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2129">2129</td><td>User specializations of <code>std::initializer_list</code></td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2212">2212</td><td><code>tuple_size</code> for <code>const pair</code> request <tuple> header</td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2217">2217</td><td><code>operator==(sub_match, string)</code> slices on embedded '\0's</td><td>Urbana</td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2230">2230</td><td>"see below" for <code>initializer_list</code> constructors of unordered containers</td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2233">2233</td><td><code>bad_function_call::what()</code> unhelpful</td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2266">2266</td><td><code>vector</code> and <code>deque</code> have incorrect insert requirements</td><td>Urbana</td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2325">2325</td><td><code>minmax_element()</code>'s behavior differing from <code>max_element()</code>'s should be noted</td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2361">2361</td><td>Apply 2299 resolution throughout library</td><td>Urbana</td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2365">2365</td><td>Missing noexcept in <code>shared_ptr::shared_ptr(nullptr_t)</code></td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2376">2376</td><td><code>bad_weak_ptr::what()</code> overspecified</td><td>Urbana</td><td>Complete</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2387">2387</td><td>More nested types that must be accessible and unambiguous</td><td>Urbana</td><td></td></tr>
+<!--
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1214">1214</a></td><td>Insufficient/inconsistent key immutability requirements for associative containers</td><td>Urbana</td><td></td></tr>
+-->
+<!-- <tr><td></td><td></td><td></td><td></td></tr> -->
+ </table>
+
+ <p>Last Updated: 18-Nov-2014</p>
+</div>
+</body>
+</html>
diff --git a/www/index.html b/www/index.html
index c1f3aa5..2052ad6 100644
--- a/www/index.html
+++ b/www/index.html
@@ -126,6 +126,8 @@
<p>LLVM and Clang can self host in C++ and C++11 mode with libc++ on Linux.</p>
<p>libc++ is also a 100% complete C++14 implementation. A list of new features and changes for
C++14 can be found <a href="cxx1y_status.html">here</a>.</p>
+ <p>A list of features and changes for the next C++ standard, known here as
+ "C++1z" (probably to be C++17) can be found <a href="cxx1z_status.html">here</a>.</p>
<p>Implementation of the post-c++14 Technical Specifications is in progress. A list of features and
the current status of these features can be found <a href="ts1z_status.html">here</a>.</p>
<p>
@@ -134,6 +136,25 @@
and <a href="results.Linux.html">Linux</a>.
</p>
+ <!--======================================================================-->
+ <h2 id="dir-structure">Build Bots</h2>
+ <!--======================================================================-->
+ <p>These are the libc++ build bots</p>
+ <ul>
+ <li><a href="http://llvm-amd64.freebsd.your.org/b/builders/libcxx-amd64-freebsd">
+ clang-libcxxrt-x86_64-freebsd10
+ </a></li>
+ <li><a href="http://llvm-amd64.freebsd.your.org/b/builders/libcxx-i386-freebsd">
+ clang-libcxxrt-i386-freebsd10
+ </a></li>
+ <li><a href="http://lab.llvm.org:8011/builders/libcxx-libcxxabi-x86_64-linux-debian">
+ clang-libcxxabi-x86_64-linux-debian
+ </a></li>
+ <li><a href="http://lab.llvm.org:8011/builders/libcxx-libcxxabi-x86_64-linux-ubuntu">
+ clang-libcxxabi-x86_64-linux-ubuntu
+ </a></li>
+ </ul>
+
<!--=====================================================================-->
<h2>Get it and get involved!</h2>
<!--=====================================================================-->
@@ -415,6 +436,37 @@
</p>
<!--=====================================================================-->
+ <h2 id="local-abi">Using a local ABI library</h2>
+ <!--=====================================================================-->
+ <p>
+ <strong>Note: This is not recommended in almost all cases.</strong><br>
+ Generally these instructions should only be used when you can't install
+ your ABI library.
+ </p>
+ <p>
+ Normally you must link libc++ against a ABI shared library that the
+ linker can find. If you want to build and test libc++ against an ABI
+ library not in the linker's path you need to set
+ <code>-DLIBCXX_CXX_ABI_LIBRARY_PATH=/path/to/abi/lib</code> when
+ configuring CMake.
+ </p>
+ <p>
+ An example build using libc++abi would look like:
+ <ul>
+ <li><code>CC=clang CXX=clang++ cmake
+ -DLIBCXX_CXX_ABI=libc++abi
+ -DLIBCXX_LIBCXXABI_INCLUDE_PATHS="/path/to/libcxxabi/include"
+ -DLIBCXX_CXX_ABI_LIBRARY_PATH="/path/to/libcxxabi-build/lib"
+ path/to/libcxx</code></li>
+ <li><code>make</code></li>
+ </ul>
+ </p>
+ <p>
+ When testing libc++ LIT will automatically link against the proper ABI
+ library.
+ </p>
+
+ <!--=====================================================================-->
<h2>Design Documents</h2>
<!--=====================================================================-->
diff --git a/www/results.Linux.html b/www/results.Linux.html
index 84b612c..82416a3 100644
--- a/www/results.Linux.html
+++ b/www/results.Linux.html
@@ -5,13 +5,12 @@
</head>
<body>
<pre>
-
All failures in the libc++ test suite will be documented here.
Note: glibc >= 2.16 is required for full C11 compatibility.
Test Suite Run Information:
-Date: 7/31/2014
-Compiler: Clang Tip-of-Tree (r214433), Built 7/31/2014
+Date: 8/18/2014
+Compiler: Clang Tip-of-Tree (r215809)
ABI: libc++abi
C Library: eglibc 2.19
Platform: x86_64-linux-gnu
@@ -19,84 +18,496 @@
Distribution: Ubuntu 14.04
Run By: Eric Fiselier (eric at efcs dot ca)
-depr/
- depr.c.headers/
- math_h.pass.cpp: Fails a static assert that the return type of
- isnan(double) and isinf(double) is a bool. see PR18382.
-input.output/
- iostream.format/
- ext.manip/
- get_time.pass.cpp: Local representation is 'Sat 31 Dec 2061
- 11:55:59 PM EST' which does not match the expected result in the
- test.
- put_time.pass.cpp: idem.
-localization/
- locale.categories/
- category.collate/
- locale.collate.byname/
- compare.pass.cpp: In the C local, sorting order seems OK, but not
- in the "" and en UTF8 locals. Needs investigation.
- category.ctype/
- locale.ctype.byname/
- tolower_1.pass.cpp: Needs Investigation.
- tolower_many.pass.cpp: idem.
- toupper_1.pass.cpp: idem.
- toupper_many.pass.cpp: idem.
- widen_1.pass.cpp: idem.
- widen_many.pass.cpp: idem.
- category.monetary/
- locale.money.get/
- locale.money.get.members/
- get_long_double_ru_RU.pass.cpp: Needs investigation.
- get_long_double_zh_CN.pass.cpp: idem.
- locale.money.put.members/
- put_long_double_ru_RU.pass.cpp: idem.
- put_long_double_zh_CN.pass.cpp: idem.
- locale.moneypunct.byname/
- decimal_point.pass.cpp: Expects ',' for RU, but gets '.'.
- thousands_sep.pass.cpp: idem.
- category.numeric/
- locale.nm.put/
- facet.num.put.members/
- put_long_double.pass.cpp: Fails due to getting '+nan' rather
- than just 'nan'.
- category.time/
- locale.time.get.byname/
- get_date.pass.cpp: Needs investigation.
- get_date_wide.pass.cpp: idem.
- get_one.pass.cpp: idem.
- get_one_wide.pass.cpp: idem.
- get_weekday.pass.cpp: idem.
- get_weekday_wide.pass.cpp: idem.
- locale.time.put.byname/
- put1.pass.cpp: idem.
- locale.time.put/
- locale.time.put.members/
- put2.pass.cpp: idem.
- facet.numpunct/
- locale.numpunct.byname/
- grouping.pass.cpp: idem.
- thousands_sep.pass.cpp: idem.
-numerics/
- c.math/
- cmath.pass.cpp: Fails for same reason as depr/depr.c.headers/math_h.pass.cpp
-re/
- re.alg/
- re.alg.match/
- basic.pass.cpp: Needs investigation.
- ecma.pass.cpp: idem.
- extended.pass.cpp: idem.
- re.alg.search/
- awk.pass.cpp: idem.
- basic.pass.cpp: idem.
- ecma.pass.cpp: idem.
- extended.pass.cpp: idem.
- re.traits/
- lookup_collatename.pass.cpp: idem.
-strings/
- c.strings/
- cuchar.pass.cpp: Can't find cuchar header
- version_cuchar.pass.cpp: idem.
+
+Testing Time: 1187.82s
+********************
+Failing Tests (33):
+ libc++ :: localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp
+ - GLIBC's locales collate strings differently. Needs investigation.
+ libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp
+ - Needs Investigation.
+ libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp
+ - Idem.
+ libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp
+ - Idem.
+ libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp
+ - Idem.
+ libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp
+ - Idem
+ libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp
+ - Idem
+ libc++ :: localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp
+ - Differences in GLIBC locales. Needs investigation.
+ libc++ :: localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp
+ - Differences in GLIBC locales. Puts '-' before 'CNY' as opposed to after.
+ libc++ :: localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp
+ - Differences in GLIBC locales. Needs investigation.
+ libc++ :: localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp
+ - Differences in GLIBC locales. Puts '-' before 'CNY' as opposed to after.
+ libc++ :: localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp
+ - Expects ',' for ru_RU but gets '.'.
+ libc++ :: localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp
+ - Expects ',' for ru_RU but gets '.'.
+ libc++ :: localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp
+ - GLIBC puts "+nan" where "nan" is expected.
+ libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp
+ - GLIBC has different locale data for fr_FR, ru_RU and zh_CN.
+ The is also a possible bug in zh_CN tests. Needs investigation.
+ libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp
+ - Idem.
+ libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp
+ - Some test cases are non-portible with GLIBC (include time zone).
+ Other failures related to GLIBC locale data. Needs investigation.
+ libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp
+ - Idem.
+ libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp
+ - GLIBC starts weekdays with lowercase letters. Test case expectes upper case.
+ libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp
+ - Idem.
+ libc++ :: localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp
+ - GLIBC abbreviated days end with '.'. Test case expects no '.'.
+ libc++ :: localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp
+ - Needs investigation.
+ libc++ :: localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp
+ - Fails due to differences in GLIBC locales
+ libc++ :: localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp
+ - Fails due to differences in GLIBC locales
+ libc++ :: re/re.alg/re.alg.match/basic.pass.cpp
+ - Needs investigation.
+ libc++ :: re/re.alg/re.alg.match/ecma.pass.cpp
+ - Idem.
+ libc++ :: re/re.alg/re.alg.match/extended.pass.cpp
+ - Idem.
+ libc++ :: re/re.alg/re.alg.search/awk.pass.cpp
+ - Idem.
+ libc++ :: re/re.alg/re.alg.search/basic.pass.cpp
+ - Idem.
+ libc++ :: re/re.alg/re.alg.search/ecma.pass.cpp
+ - Idem.
+ libc++ :: re/re.alg/re.alg.search/extended.pass.cpp
+ - Idem.
+ libc++ :: re/re.traits/lookup_collatename.pass.cpp
+ - Idem.
+ libc++ :: re/re.traits/translate_nocase.pass.cpp
+ - Idem.
+
+********************
+Expected Failing Tests (5):
+ libc++ :: depr/depr.c.headers/math_h.pass.cpp
+ - Fails a static assert that the return type of
+ isnan(double) and isinf(double) is a bool. see PR18382.
+ libc++ :: numerics/c.math/cmath_isinf.pass.cpp
+ - Idem.
+ libc++ :: numerics/c.math/cmath_isnan.pass.cpp
+ - Idem.
+ libc++ :: strings/c.strings/cuchar.pass.cpp
+ - <cuchar> is not implemented.
+ libc++ :: strings/c.strings/version_cuchar.pass.cpp
+ - Idem.
+
+ Expected Passes : 4716
+ Expected Failures : 5
+ Unexpected Failures: 33
+
+********************************************************************************
+
+-- Testing: 4754 tests, 2 threads --
+FAIL: libc++ :: localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp (2073 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmp4DtKocexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmp4DtKocexe'
+Exit Code: -6
+Standard Error:
+--
+tmp4DtKocexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp:38: int main(): Assertion `f.compare(s2.data(), s2.data() + s2.size(), s3.data(), s3.data() + s3.size()) == 1' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp (2152 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpAfkClkexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpAfkClkexe'
+Exit Code: -6
+Standard Error:
+--
+tmpAfkClkexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp:38: int main(): Assertion `f.tolower('\xDA') == '\xFA'' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp (2153 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpGjakKeexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpGjakKeexe'
+Exit Code: -6
+Standard Error:
+--
+tmpGjakKeexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp:35: int main(): Assertion `in[0] == '\xFA'' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp (2154 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmp0gK3Y6exe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmp0gK3Y6exe'
+Exit Code: -6
+Standard Error:
+--
+tmp0gK3Y6exe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp:39: int main(): Assertion `f.toupper('\xFA') == '\xDA'' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp (2155 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpCoF624exe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpCoF624exe'
+Exit Code: -6
+Standard Error:
+--
+tmpCoF624exe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp:35: int main(): Assertion `in[0] == '\xDA'' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp (2157 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpjOo8fnexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpjOo8fnexe'
+Exit Code: -6
+Standard Error:
+--
+tmpjOo8fnexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp:53: int main(): Assertion `f.widen(char(-5)) == wchar_t(251)' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp (2158 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpDWZ5aNexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpDWZ5aNexe'
+Exit Code: -6
+Standard Error:
+--
+tmpDWZ5aNexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp:60: int main(): Assertion `v[6] == wchar_t(133)' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp (2184 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpfA5HOrexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpfA5HOrexe'
+Exit Code: -6
+Standard Error:
+--
+tmpfA5HOrexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp:71: int main(): Assertion `iter.base() == v.data() + v.size()' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp (2185 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpTI59qtexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpTI59qtexe'
+Exit Code: -6
+Standard Error:
+--
+tmpTI59qtexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp:314: int main(): Assertion `iter.base() == v.data() + v.size()' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp (2192 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmp1psSk2exe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmp1psSk2exe'
+Exit Code: -6
+Standard Error:
+--
+tmp1psSk2exe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp:70: int main(): Assertion `ex == "0,00 "' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp (2193 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpKwjbrPexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpKwjbrPexe'
+Exit Code: -6
+Standard Error:
+--
+tmpKwjbrPexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp:218: int main(): Assertion `ex == "CNY -0.01"' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp (2198 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmp4UnNQ2exe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmp4UnNQ2exe'
+Exit Code: -6
+Standard Error:
+--
+tmp4UnNQ2exe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp:114: int main(): Assertion `f.decimal_point() == ','' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp (2205 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmp6MGZAmexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmp6MGZAmexe'
+Exit Code: -6
+Standard Error:
+--
+tmp6MGZAmexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp:114: int main(): Assertion `f.thousands_sep() == ' '' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp (2229 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmp7AME77exe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmp7AME77exe'
+Exit Code: -6
+Standard Error:
+--
+tmp7AME77exe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp:10886: void test5(): Assertion `ex == "nan"' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp (2249 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpooRjFgexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpooRjFgexe'
+Exit Code: -6
+Standard Error:
+--
+tmpooRjFgexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp:64: int main(): Assertion `i.base() == in+sizeof(in)/sizeof(in[0])-1' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp (2250 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpcm_vb9exe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpcm_vb9exe'
+Exit Code: -6
+Standard Error:
+--
+tmpcm_vb9exe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_date.pass.cpp:64: int main(): Assertion `i.base() == in+sizeof(in)/sizeof(in[0])-1' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp (2253 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpLKJQXHexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpLKJQXHexe'
+Exit Code: -6
+Standard Error:
+--
+tmpLKJQXHexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_one.pass.cpp:51: int main(): Assertion `i.base() == in+sizeof(in)/sizeof(in[0])-1' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp (2254 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpiDgYiqexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpiDgYiqexe'
+Exit Code: -6
+Standard Error:
+--
+tmpiDgYiqexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp:51: int main(): Assertion `i.base() == in+sizeof(in)/sizeof(in[0])-1' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp (2257 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpAUaH78exe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpAUaH78exe'
+Exit Code: -6
+Standard Error:
+--
+tmpAUaH78exe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday.pass.cpp:74: int main(): Assertion `i.base() == in+sizeof(in)/sizeof(in[0])-1' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp (2258 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmp7iGNTDexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmp7iGNTDexe'
+Exit Code: -6
+Standard Error:
+--
+tmp7iGNTDexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp:72: int main(): Assertion `i.base() == in+sizeof(in)/sizeof(in[0])-1' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp (2277 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpnT0vVFexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpnT0vVFexe'
+Exit Code: -6
+Standard Error:
+--
+tmpnT0vVFexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.put.byname/put1.pass.cpp:73: int main(): Assertion `(ex == "Today is Samedi which is abbreviated Sam.")|| (ex == "Today is samedi which is abbreviated sam." )' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp (2281 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmp47THCHexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmp47THCHexe'
+Exit Code: -6
+Standard Error:
+--
+tmp47THCHexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/category.time/locale.time.put/locale.time.put.members/put2.pass.cpp:185: int main(): Assertion `ex == "May"' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp (2285 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpn6fLHJexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpn6fLHJexe'
+Exit Code: -6
+Standard Error:
+--
+tmpn6fLHJexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp:57: int main(): Assertion `np.grouping() == "\x7F"' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp (2286 of 4754)
+******************** TEST 'libc++ :: localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpkna8llexe' '/home/eric/workspace/staging-libcxx/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpkna8llexe'
+Exit Code: -6
+Standard Error:
+--
+tmpkna8llexe: /home/eric/workspace/staging-libcxx/test/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp:57: int main(): Assertion `np.thousands_sep() == ','' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: re/re.alg/re.alg.match/basic.pass.cpp (3203 of 4754)
+******************** TEST 'libc++ :: re/re.alg/re.alg.match/basic.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmp0wkTrlexe' '/home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.match/basic.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmp0wkTrlexe'
+Exit Code: -6
+Standard Error:
+--
+tmp0wkTrlexe: /home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.match/basic.pass.cpp:624: int main(): Assertion `std::regex_match(s, m, std::regex("[a[=M=]z]", std::regex_constants::basic))' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: re/re.alg/re.alg.match/ecma.pass.cpp (3204 of 4754)
+******************** TEST 'libc++ :: re/re.alg/re.alg.match/ecma.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpghcl7yexe' '/home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.match/ecma.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpghcl7yexe'
+Exit Code: -6
+Standard Error:
+--
+tmpghcl7yexe: /home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.match/ecma.pass.cpp:585: int main(): Assertion `std::regex_match(s, m, std::regex("[a[=M=]z]"))' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: re/re.alg/re.alg.match/extended.pass.cpp (3208 of 4754)
+******************** TEST 'libc++ :: re/re.alg/re.alg.match/extended.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpGVUdIMexe' '/home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.match/extended.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpGVUdIMexe'
+Exit Code: -6
+Standard Error:
+--
+tmpGVUdIMexe: /home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.match/extended.pass.cpp:622: int main(): Assertion `std::regex_match(s, m, std::regex("[a[=M=]z]", std::regex_constants::extended))' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: re/re.alg/re.alg.search/awk.pass.cpp (3218 of 4754)
+******************** TEST 'libc++ :: re/re.alg/re.alg.search/awk.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpgFuw4cexe' '/home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.search/awk.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpgFuw4cexe'
+Exit Code: -6
+Standard Error:
+--
+tmpgFuw4cexe: /home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.search/awk.pass.cpp:694: int main(): Assertion `std::regex_search(s, m, std::regex("[a[=M=]z]", std::regex_constants::awk))' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: re/re.alg/re.alg.search/basic.pass.cpp (3219 of 4754)
+******************** TEST 'libc++ :: re/re.alg/re.alg.search/basic.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpXeQuwGexe' '/home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.search/basic.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpXeQuwGexe'
+Exit Code: -6
+Standard Error:
+--
+tmpXeQuwGexe: /home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.search/basic.pass.cpp:696: int main(): Assertion `std::regex_search(s, m, std::regex("[a[=M=]z]", std::regex_constants::basic))' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: re/re.alg/re.alg.search/ecma.pass.cpp (3220 of 4754)
+******************** TEST 'libc++ :: re/re.alg/re.alg.search/ecma.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpvGAAImexe' '/home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.search/ecma.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpvGAAImexe'
+Exit Code: -6
+Standard Error:
+--
+tmpvGAAImexe: /home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.search/ecma.pass.cpp:675: int main(): Assertion `std::regex_search(s, m, std::regex("[a[=M=]z]"))' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: re/re.alg/re.alg.search/extended.pass.cpp (3224 of 4754)
+******************** TEST 'libc++ :: re/re.alg/re.alg.search/extended.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpGvouurexe' '/home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.search/extended.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpGvouurexe'
+Exit Code: -6
+Standard Error:
+--
+tmpGvouurexe: /home/eric/workspace/staging-libcxx/test/re/re.alg/re.alg.search/extended.pass.cpp:694: int main(): Assertion `std::regex_search(s, m, std::regex("[a[=M=]z]", std::regex_constants::extended))' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: re/re.traits/lookup_collatename.pass.cpp (3349 of 4754)
+******************** TEST 'libc++ :: re/re.traits/lookup_collatename.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpItXmtJexe' '/home/eric/workspace/staging-libcxx/test/re/re.traits/lookup_collatename.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpItXmtJexe'
+Exit Code: -6
+Standard Error:
+--
+tmpItXmtJexe: /home/eric/workspace/staging-libcxx/test/re/re.traits/lookup_collatename.pass.cpp:31: void test(const char_type *, const std::basic_string<char_type> &) [char_type = char]: Assertion `t.lookup_collatename(F(A), F(A + t.length(A))) == expected' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
+FAIL: libc++ :: re/re.traits/translate_nocase.pass.cpp (3354 of 4754)
+******************** TEST 'libc++ :: re/re.traits/translate_nocase.pass.cpp' FAILED ********************
+Compiled With: '/opt/llvm-tot/bin/clang++' '-o' '/tmp/tmpGsRNu3exe' '/home/eric/workspace/staging-libcxx/test/re/re.traits/translate_nocase.pass.cpp' '-nostdinc++' '-std=c++11' '-D__STDC_FORMAT_MACROS' '-D__STDC_LIMIT_MACROS' '-D__STDC_CONSTANT_MACROS' '-I/home/eric/workspace/staging-libcxx/test/../include' '-I/home/eric/workspace/staging-libcxx/test/../test/support' '-nodefaultlibs' '-L/home/eric/workspace/build-libcxx-staging/lib' '-lc++' '-lc++abi' '-lgcc_eh' '-lc' '-lm' '-lpthread' '-lrt' '-lgcc_s' '-Wl,-R' '/home/eric/workspace/build-libcxx-staging/lib'
+Command: '/tmp/tmpGsRNu3exe'
+Exit Code: -6
+Standard Error:
+--
+tmpGsRNu3exe: /home/eric/workspace/staging-libcxx/test/re/re.traits/translate_nocase.pass.cpp:44: int main(): Assertion `t.translate_nocase('\xDA') == '\xFA'' failed.
+--
+
+Compiled test failed unexpectedly!
+********************
</pre>
</body>
</html>
diff --git a/www/ts1z_status.html b/www/ts1z_status.html
index 3a15770..95880b9 100644
--- a/www/ts1z_status.html
+++ b/www/ts1z_status.html
@@ -41,14 +41,21 @@
<h3>Technical Specifications</h3>
<table id="TS" border="1">
- <tr><th>Paper Number</th><th>TS Title</th></tr>
+ <tr><th>Paper Number</th><th>Paper Title</th><th>TS</th></tr>
- <tr><td>4023</td><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4023.html">C++ Extensions for Library Fundamentals</a></td></tr>
- <tr><td>3940</td><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3940.html">Technical Specification - File System</a></td></tr>
- <tr><td></td><td></td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4023.html">4023</a></td><td>C++ Extensions for Library Fundamentals</td><td>Library Fundamentals 1</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3940.html">3940</a></td><td>Technical Specification - File System</td><td>File System</td></tr>
+ <tr><td></td><td></td><td></td></tr>
+
+ <tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/n4273.txt">4273</a></td><td>Uniform Container Erasure.</td><td>Library Fundamentals 2</td></tr>
+ <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4061">4061</a></td><td>Greatest Common Divisor and Least Common Multiple.</td><td>Library Fundamentals 2</td></tr>
+ <tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/N4257.htm">4257</a></td><td>Delimited iterators.</td><td>Library Fundamentals 2</td></tr>
+ <tr><td><a href="http://wiki.edg.com/twiki/pub/Wg21urbana-champaign/StrawPolls/N4282.pdf">4282</a></td><td>The World's Dumbest Smart Pointer.</td><td>Library Fundamentals 2</td></tr>
+ <tr><td></td><td></td><td></td></tr>
+
</table>
- <h3>Features in Library Fundamentals</h3>
+ <h3>Features in Library Fundamentals 1</h3>
<table id="Features" border="1">
<tr><th>Feature Name</th><th>Status</th></tr>
<tr><td>Uses-allocator construction</td><td>Not started</td></tr>
@@ -76,6 +83,13 @@
</table>
+ <h3>Features in Library Fundamentals 2</h3>
+ <table id="Features" border="1">
+ <tr><th>Feature Name</th><th>Status</th></tr>
+<!-- <tr><td></td><td></td></tr> -->
+
+ </table>
+
<h3>Features in Filesystem</h3>
<table id="Features" border="1">
<tr><th>Feature Name</th><th>Status</th></tr>