[libc++] Workaround timespec_get not always being available in Apple SDKs
authorLouis Dionne <ldionne@apple.com>
Tue, 1 Sep 2020 19:05:33 +0000 (15:05 -0400)
committerLouis Dionne <ldionne@apple.com>
Tue, 1 Sep 2020 19:10:50 +0000 (15:10 -0400)
timespec_get is not available in Apple SDKs when (__DARWIN_C_LEVEL >= __DARWIN_C_FULL)
isn't true, which leads to libc++ trying to import ::timespec_get into
namespace std when it's not available. This issue has been reported to
Apple's libc, but we need a workaround in the meantime.

https://llvm.org/PR47208
rdar://68157284

libcxx/include/__config
libcxx/test/libcxx/language.support/timespec_get.xopen.compile.pass.cpp [new file with mode: 0644]

index d7b6a2a..d734c10 100644 (file)
          __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ >= 130000 || \
          __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ >= 60000)
 #      define _LIBCPP_HAS_ALIGNED_ALLOC
-#      define _LIBCPP_HAS_TIMESPEC_GET
+       // TODO: Apple SDKs don't define ::timespec_get unconditionally in C++
+       //       mode. This should be fixed in future SDKs, but for the time
+       //       being we need to avoid trying to use that declaration when
+       //       the SDK doesn't provide it.
+#      include <sys/cdefs.h>
+#      if (__DARWIN_C_LEVEL >= __DARWIN_C_FULL)
+#        define _LIBCPP_HAS_TIMESPEC_GET
+#      endif
 #    endif
 #  endif // __APPLE__
 #endif
diff --git a/libcxx/test/libcxx/language.support/timespec_get.xopen.compile.pass.cpp b/libcxx/test/libcxx/language.support/timespec_get.xopen.compile.pass.cpp
new file mode 100644 (file)
index 0000000..cf4c595
--- /dev/null
@@ -0,0 +1,18 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14
+
+// Make sure that <ctime> can be included even when _XOPEN_SOURCE is defined.
+// This used to trigger some bug in Apple SDKs, since timespec_get was not
+// defined in <time.h> but we tried using it from <ctime>.
+// See https://llvm.org/PR47208 for details.
+
+// ADDITIONAL_COMPILE_FLAGS: -D_XOPEN_SOURCE=500
+
+#include <ctime>