Index: include/__config =================================================================== --- include/__config +++ include/__config @@ -908,6 +908,13 @@ #define _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF #endif +_LIBCPP_BEGIN_NAMESPACE_STD +_LIBCPP_FUNC_VIS _LIBCPP_WEAK int __libcpp_library_version(); +_LIBCPP_END_NAMESPACE_STD + +#define _LIBCPP_LIBRARY_VERSION \ + (_VSTD::__libcpp_library_version ? _VSTD::__libcpp_library_version() : -1) + #endif // __cplusplus #endif // _LIBCPP_CONFIG Index: include/__libcpp_version =================================================================== --- /dev/null +++ include/__libcpp_version @@ -0,0 +1 @@ +4000 \ No newline at end of file Index: src/libcpp_version.cpp =================================================================== --- /dev/null +++ src/libcpp_version.cpp @@ -0,0 +1,14 @@ +#include "__config" + +_LIBCPP_BEGIN_NAMESPACE_STD + +// Test that _LIBCPP_VERSION and __libcpp_version are in sync. +// The __libcpp_version file stores only a number representing the libc++ +// version so it can be easily parsed by clang. +static_assert(_LIBCPP_VERSION == +#include "__libcpp_version" + , "version file does not match"); + +int __libcpp_library_version() { return _LIBCPP_VERSION; } + +_LIBCPP_END_NAMESPACE_STD Index: test/libcxx/version.pass.cpp =================================================================== --- /dev/null +++ test/libcxx/version.pass.cpp @@ -0,0 +1,29 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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 the _LIBCPP_VERSION and _LIBCPP_LIBRARY_VERSION macros + +#include <__config> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION must be defined +#endif + +#ifndef _LIBCPP_LIBRARY_VERSION +#error _LIBCPP_LIBRARY_VERSION must be defined +#endif + +#include + +int main() { + assert(_LIBCPP_VERSION == _LIBCPP_LIBRARY_VERSION); + assert(std::__libcpp_library_version); + assert(_LIBCPP_LIBRARY_VERSION == std::__libcpp_library_version()); +}