diff --git a/checks/Jamfile.v2 b/checks/Jamfile.v2 index f178bb74..1b5e2fd9 100644 --- a/checks/Jamfile.v2 +++ b/checks/Jamfile.v2 @@ -1,6 +1,6 @@ # # *** DO NOT EDIT THIS FILE BY HAND *** -# This file was automatically generated on Fri Jul 1 18:47:25 2016 +# This file was automatically generated on Fri Oct 14 20:08:50 2016 # by libs/config/tools/generate.cpp # Copyright John Maddock. # Use, modification and distribution are subject to the @@ -131,6 +131,7 @@ run-simple TEST_BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES : cxx14_initi run-simple TEST_BOOST_NO_CXX14_AGGREGATE_NSDMI : cxx14_aggregate_nsdmi ; run-simple TEST_BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION : cxx14_return_type_deduction ; run-simple TEST_BOOST_NO_CXX14_VARIABLE_TEMPLATES : cxx14_variable_templates ; +run-simple TEST_BOOST_NO_CXX17_STD_INVOKE : cxx17_std_invoke ; run-simple TEST_BOOST_NO_CXX11_HDR_FUNCTIONAL : cxx11_hdr_functional ; run-simple TEST_BOOST_NO_CXX11_DECLTYPE : cxx11_decltype ; run-simple TEST_BOOST_NO_CXX11_DECLTYPE_N3276 : cxx11_decltype_n3276 ; diff --git a/checks/test_case.cpp b/checks/test_case.cpp index bf309432..d3ad56ca 100644 --- a/checks/test_case.cpp +++ b/checks/test_case.cpp @@ -1,4 +1,4 @@ -// This file was automatically generated on Fri Jul 1 18:47:25 2016 +// This file was automatically generated on Fri Oct 14 20:08:50 2016 // by libs/config/tools/generate.cpp // Copyright John Maddock 2002-4. // Use, modification and distribution are subject to the @@ -457,6 +457,10 @@ namespace test = boost_no_cxx14_return_type_deduction; # include "../test/boost_no_cxx14_var_templ.ipp" namespace test = boost_no_cxx14_variable_templates; #endif +#ifdef TEST_BOOST_NO_CXX17_STD_INVOKE +# include "../test/boost_no_cxx17_std_invoke.ipp" +namespace test = boost_no_cxx17_std_invoke; +#endif #ifdef TEST_BOOST_NO_CXX11_HDR_FUNCTIONAL # include "../test/boost_no_cxx_hdr_functional.ipp" namespace test = boost_no_cxx11_hdr_functional; diff --git a/doc/macro_reference.qbk b/doc/macro_reference.qbk index e9944040..1a8afd89 100644 --- a/doc/macro_reference.qbk +++ b/doc/macro_reference.qbk @@ -924,6 +924,18 @@ provide compliant C++14 support. [endsect] +[section Macros that describe C++17 features not supported] + +The following macros describe features in the 2016 ISO C++ standard, formerly known as C++1z, +that are not yet supported by a particular compiler or library. + +[table +[[Macro ][Description ]] +[[`BOOST_NO_CXX17_STD_IVOKE`][The compiler does not support `std::invoke()`.]] +] + +[endsect] + [#config_helpers] [section Boost Helper Macros] diff --git a/include/boost/config/stdlib/dinkumware.hpp b/include/boost/config/stdlib/dinkumware.hpp index af8ddda5..b551aca0 100644 --- a/include/boost/config/stdlib/dinkumware.hpp +++ b/include/boost/config/stdlib/dinkumware.hpp @@ -157,6 +157,11 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++17 features +#elif !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650) +# define BOOST_NO_CXX17_STD_INVOKE +#endif + #if defined(BOOST_INTEL) && (BOOST_INTEL <= 1400) // Intel's compiler can't handle this header yet: # define BOOST_NO_CXX11_HDR_ATOMIC diff --git a/include/boost/config/stdlib/libcomo.hpp b/include/boost/config/stdlib/libcomo.hpp index 941498d0..07c48965 100644 --- a/include/boost/config/stdlib/libcomo.hpp +++ b/include/boost/config/stdlib/libcomo.hpp @@ -72,6 +72,9 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++17 features +# define BOOST_NO_CXX17_STD_INVOKE + // // Intrinsic type_traits support. // The SGI STL has it's own __type_traits class, which diff --git a/include/boost/config/stdlib/libcpp.hpp b/include/boost/config/stdlib/libcpp.hpp index 096b8c0d..96cf57c3 100644 --- a/include/boost/config/stdlib/libcpp.hpp +++ b/include/boost/config/stdlib/libcpp.hpp @@ -73,6 +73,8 @@ #if _LIBCPP_VERSION < 3700 // libc++ uses a non-standard messages_base #define BOOST_NO_STD_MESSAGES +// C++17 features +#define BOOST_NO_CXX17_STD_INVOKE #endif #if (_LIBCPP_VERSION <= 1101) && !defined(BOOST_NO_CXX11_THREAD_LOCAL) diff --git a/include/boost/config/stdlib/libstdcpp3.hpp b/include/boost/config/stdlib/libstdcpp3.hpp index 1d8f6ccb..c4a9c9d4 100644 --- a/include/boost/config/stdlib/libstdcpp3.hpp +++ b/include/boost/config/stdlib/libstdcpp3.hpp @@ -98,6 +98,7 @@ #if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103) # define BOOST_LIBSTDCXX11 #endif + // // Decide which version of libstdc++ we have, normally // stdlibc++ C++0x support is detected via __GNUC__, __GNUC_MINOR__, and possibly @@ -122,7 +123,11 @@ // #ifdef __clang__ -#if __has_include() +#include + +#if defined(__cpp_lib_invoke) && (__cpp_lib_invoke >= 201411) +# define BOOST_LIBSTDCXX_VERSION 60100 +#elif __has_include() # define BOOST_LIBSTDCXX_VERSION 50100 #elif __has_include() # define BOOST_LIBSTDCXX_VERSION 40900 @@ -139,6 +144,7 @@ #elif __has_include() # define BOOST_LIBSTDCXX_VERSION 40300 #endif + // // GCC 4.8 and 9 add working versions of and respectively. // However, we have no test for these as the headers were present but broken @@ -251,6 +257,13 @@ # define BOOST_NO_CXX11_STD_ALIGN #endif +// +// C++17 features in GCC 6.1 and later +// +#if (BOOST_LIBSTDCXX_VERSION < 60100) || (__cplusplus <= 201402L) +# define BOOST_NO_CXX17_STD_INVOKE +#endif + #if defined(__has_include) #if !__has_include() # define BOOST_NO_CXX14_HDR_SHARED_MUTEX diff --git a/include/boost/config/stdlib/modena.hpp b/include/boost/config/stdlib/modena.hpp index 7a85e0cd..7092e9ba 100644 --- a/include/boost/config/stdlib/modena.hpp +++ b/include/boost/config/stdlib/modena.hpp @@ -61,6 +61,9 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++17 features +# define BOOST_NO_CXX17_STD_INVOKE + #define BOOST_STDLIB "Modena C++ standard library" diff --git a/include/boost/config/stdlib/msl.hpp b/include/boost/config/stdlib/msl.hpp index dd2775e1..ce60b7ee 100644 --- a/include/boost/config/stdlib/msl.hpp +++ b/include/boost/config/stdlib/msl.hpp @@ -85,4 +85,7 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++17 features +# define BOOST_NO_CXX17_STD_INVOKE + #define BOOST_STDLIB "Metrowerks Standard Library version " BOOST_STRINGIZE(__MSL_CPP__) diff --git a/include/boost/config/stdlib/roguewave.hpp b/include/boost/config/stdlib/roguewave.hpp index 97a2b0b9..e87ec78d 100644 --- a/include/boost/config/stdlib/roguewave.hpp +++ b/include/boost/config/stdlib/roguewave.hpp @@ -196,3 +196,6 @@ #else # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif + +// C++17 features +# define BOOST_NO_CXX17_STD_INVOKE diff --git a/include/boost/config/stdlib/sgi.hpp b/include/boost/config/stdlib/sgi.hpp index c8052717..1623de38 100644 --- a/include/boost/config/stdlib/sgi.hpp +++ b/include/boost/config/stdlib/sgi.hpp @@ -155,4 +155,7 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif -#define BOOST_STDLIB "SGI standard library" \ No newline at end of file +// C++17 features +# define BOOST_NO_CXX17_STD_INVOKE + +#define BOOST_STDLIB "SGI standard library" diff --git a/include/boost/config/stdlib/stlport.hpp b/include/boost/config/stdlib/stlport.hpp index bbc4176c..6d796128 100644 --- a/include/boost/config/stdlib/stlport.hpp +++ b/include/boost/config/stdlib/stlport.hpp @@ -245,4 +245,7 @@ namespace boost { using std::min; using std::max; } # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++17 features +# define BOOST_NO_CXX17_STD_INVOKE + #define BOOST_STDLIB "STLPort standard library version " BOOST_STRINGIZE(__SGI_STL_PORT) diff --git a/include/boost/config/stdlib/vacpp.hpp b/include/boost/config/stdlib/vacpp.hpp index 4ccd0d24..0876cf8c 100644 --- a/include/boost/config/stdlib/vacpp.hpp +++ b/include/boost/config/stdlib/vacpp.hpp @@ -61,4 +61,7 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++17 features +# define BOOST_NO_CXX17_STD_INVOKE + #define BOOST_STDLIB "Visual Age default standard library" diff --git a/test/all/Jamfile.v2 b/test/all/Jamfile.v2 index 01f53d21..d76b6cf3 100644 --- a/test/all/Jamfile.v2 +++ b/test/all/Jamfile.v2 @@ -1,7 +1,7 @@ # # Regression test Jamfile for boost configuration setup. # *** DO NOT EDIT THIS FILE BY HAND *** -# This file was automatically generated on Fri Jul 1 18:47:25 2016 +# This file was automatically generated on Fri Oct 14 20:08:50 2016 # by libs/config/tools/generate.cpp # Copyright John Maddock. # Use, modification and distribution are subject to the @@ -358,6 +358,9 @@ test-suite "BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION" : test-suite "BOOST_NO_CXX14_VARIABLE_TEMPLATES" : [ run ../no_cxx14_var_templ_pass.cpp ] [ compile-fail ../no_cxx14_var_templ_fail.cpp ] ; +test-suite "BOOST_NO_CXX17_STD_INVOKE" : +[ run ../no_cxx17_std_invoke_pass.cpp ] +[ compile-fail ../no_cxx17_std_invoke_fail.cpp ] ; test-suite "BOOST_NO_CXX11_HDR_FUNCTIONAL" : [ run ../no_cxx_hdr_functional_pass.cpp ] [ compile-fail ../no_cxx_hdr_functional_fail.cpp ] ; diff --git a/test/boost_no_cxx17_std_invoke.ipp b/test/boost_no_cxx17_std_invoke.ipp new file mode 100644 index 00000000..77f20e6c --- /dev/null +++ b/test/boost_no_cxx17_std_invoke.ipp @@ -0,0 +1,27 @@ +// (C) Copyright Oliver Kowalke 2016. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/config for most recent version. + +// MACRO: BOOST_NO_CXX17_STD_INVOKE +// TITLE: invoke +// DESCRIPTION: The compiler supports the std::invoke() function. + +#include + +namespace boost_no_cxx17_std_invoke { + +int foo( int i, int j) { + return i + j; +} + +int test() { + int i = 1, j = 2; + std::invoke( foo, i, j); + return 0; +} + +} + diff --git a/test/config_info.cpp b/test/config_info.cpp index 96d2e397..8bb1e441 100644 --- a/test/config_info.cpp +++ b/test/config_info.cpp @@ -1074,6 +1074,7 @@ void print_boost_macros() PRINT_MACRO(BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES); PRINT_MACRO(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION); PRINT_MACRO(BOOST_NO_CXX14_VARIABLE_TEMPLATES); + PRINT_MACRO(BOOST_NO_CXX17_STD_INVOKE); PRINT_MACRO(BOOST_NO_DEPENDENT_NESTED_DERIVATIONS); PRINT_MACRO(BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS); PRINT_MACRO(BOOST_NO_EXCEPTIONS); @@ -1141,6 +1142,9 @@ void print_boost_macros() + + + // END GENERATED BLOCK PRINT_MACRO(BOOST_INTEL); diff --git a/test/config_test.cpp b/test/config_test.cpp index 7fbcb73d..a887972d 100644 --- a/test/config_test.cpp +++ b/test/config_test.cpp @@ -1,4 +1,4 @@ -// This file was automatically generated on Fri Jul 1 18:47:25 2016 +// This file was automatically generated on Fri Oct 14 20:08:50 2016 // by libs/config/tools/generate.cpp // Copyright John Maddock 2002-4. // Use, modification and distribution are subject to the @@ -317,6 +317,11 @@ namespace boost_no_cxx14_return_type_deduction = empty_boost; #else namespace boost_no_cxx14_variable_templates = empty_boost; #endif +#ifndef BOOST_NO_CXX17_STD_INVOKE +#include "boost_no_cxx17_std_invoke.ipp" +#else +namespace boost_no_cxx17_std_invoke = empty_boost; +#endif #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL #include "boost_no_cxx_hdr_functional.ipp" #else @@ -1561,6 +1566,11 @@ int main( int, char *[] ) std::cerr << "Failed test for BOOST_NO_CXX14_VARIABLE_TEMPLATES at: " << __FILE__ << ":" << __LINE__ << std::endl; ++error_count; } + if(0 != boost_no_cxx17_std_invoke::test()) + { + std::cerr << "Failed test for BOOST_NO_CXX17_STD_INVOKE at: " << __FILE__ << ":" << __LINE__ << std::endl; + ++error_count; + } if(0 != boost_no_cxx11_hdr_functional::test()) { std::cerr << "Failed test for BOOST_NO_CXX11_HDR_FUNCTIONAL at: " << __FILE__ << ":" << __LINE__ << std::endl; diff --git a/test/no_cxx17_std_invoke_fail.cpp b/test/no_cxx17_std_invoke_fail.cpp new file mode 100644 index 00000000..a34fc7a8 --- /dev/null +++ b/test/no_cxx17_std_invoke_fail.cpp @@ -0,0 +1,37 @@ +// This file was automatically generated on Fri Oct 14 12:13:46 2016 +// by libs/config/tools/generate.cpp +// Copyright John Maddock 2002-4. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/config for the most recent version.// +// Revision $Id$ +// + + +// Test file for macro BOOST_NO_CXX17_STD_INVOKE +// This file should not compile, if it does then +// BOOST_NO_STD_INVOKE should not be defined. +// See file boost_no_cxx17_std_invoke.ipp for details + +// Must not have BOOST_ASSERT_CONFIG set; it defeats +// the objective of this file: +#ifdef BOOST_ASSERT_CONFIG +# undef BOOST_ASSERT_CONFIG +#endif + +#include +#include "test.hpp" + +#ifdef BOOST_NO_CXX17_STD_INVOKE +#include "boost_no_cxx17_std_invoke.ipp" +#else +#error "this file should not compile" +#endif + +int main( int, char *[] ) +{ + return boost_no_cxx17_std_invoke::test(); +} + diff --git a/test/no_cxx17_std_invoke_pass.cpp b/test/no_cxx17_std_invoke_pass.cpp new file mode 100644 index 00000000..76e28e17 --- /dev/null +++ b/test/no_cxx17_std_invoke_pass.cpp @@ -0,0 +1,37 @@ +// This file was automatically generated on Fri Oct 14 12:13:46 2016 +// by libs/config/tools/generate.cpp +// Copyright John Maddock 2002-4. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/config for the most recent version.// +// Revision $Id$ +// + + +// Test file for macro BOOST_NO_CXX17_STD_INVOKE +// This file should compile, if it does not then +// BOOST_NO_STD_INVOKE should be defined. +// See file boost_no_cxx17_std_invoke.ipp for details + +// Must not have BOOST_ASSERT_CONFIG set; it defeats +// the objective of this file: +#ifdef BOOST_ASSERT_CONFIG +# undef BOOST_ASSERT_CONFIG +#endif + +#include +#include "test.hpp" + +#ifndef BOOST_NO_CXX17_STD_INVOKE +#include "boost_no_cxx17_std_invoke.ipp" +#else +namespace boost_no_cxx17_std_invoke = empty_boost; +#endif + +int main( int, char *[] ) +{ + return boost_no_cxx17_std_invoke::test(); +} +