From 75c4408653753fbb8e273ad41cd41997d498e7d3 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Thu, 12 Mar 2020 11:16:30 -0700 Subject: [PATCH] Reland: Don't expose unavailable cstdio functions. Marked unsupported for C++03 and C++11 since this test uses alias declarations, and at least one C++03 bot was failing with -Wc++11-extensions. Change-Id: I8c3a579edd7eb83e0bc74e85d116b68f22400161 --- libcxx/include/__config | 7 +++++++ libcxx/include/cstdio | 4 ++++ .../no_fgetpos_fsetpos.fail.cpp | 21 +++++++++++++++++++ .../std/depr/depr.c.headers/stdio_h.pass.cpp | 4 ++++ .../file.streams/c.files/cstdio.pass.cpp | 4 ++++ 5 files changed, 40 insertions(+) create mode 100644 libcxx/test/libcxx/depr/depr.c.headers/no_fgetpos_fsetpos.fail.cpp diff --git a/libcxx/include/__config b/libcxx/include/__config index c9a9e5e28a69..42f59ea99665 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -1541,6 +1541,13 @@ _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container( #define _LIBCPP_BUILTIN_CONSTANT_P(x) false #endif +// Support for _FILE_OFFSET_BITS=64 landed gradually in Android, so the full set +// of functions used in cstdio may not be available for low API levels when +// using 64-bit file offsets on LP32. +#if defined(__BIONIC__) && defined(__USE_FILE_OFFSET64) && __ANDROID_API__ < 24 +#define _LIBCPP_HAS_NO_FGETPOS_FSETPOS +#endif + #endif // __cplusplus #endif // _LIBCPP_CONFIG diff --git a/libcxx/include/cstdio b/libcxx/include/cstdio index 0f3f42dac2da..d0492a083505 100644 --- a/libcxx/include/cstdio +++ b/libcxx/include/cstdio @@ -131,9 +131,13 @@ using ::putc; using ::ungetc; using ::fread; using ::fwrite; +#ifndef _LIBCPP_HAS_NO_FGETPOS_FSETPOS using ::fgetpos; +#endif using ::fseek; +#ifndef _LIBCPP_HAS_NO_FGETPOS_FSETPOS using ::fsetpos; +#endif using ::ftell; using ::rewind; using ::clearerr; diff --git a/libcxx/test/libcxx/depr/depr.c.headers/no_fgetpos_fsetpos.fail.cpp b/libcxx/test/libcxx/depr/depr.c.headers/no_fgetpos_fsetpos.fail.cpp new file mode 100644 index 000000000000..eedcb3e8c95b --- /dev/null +++ b/libcxx/test/libcxx/depr/depr.c.headers/no_fgetpos_fsetpos.fail.cpp @@ -0,0 +1,21 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// REQUIRES: verify-support +// UNSUPPORTED: c++98 || c++03 + +#include + +using U = decltype(::fgetpos); +using V = decltype(::fsetpos); +#ifdef _LIBCPP_HAS_NO_FGETPOS_FSETPOS +// expected-error@-3 {{no member named 'fgetpos' in the global namespace}} +// expected-error@-3 {{no member named 'fsetpos' in the global namespace}} +#else +// expected-no-diagnostics +#endif diff --git a/libcxx/test/std/depr/depr.c.headers/stdio_h.pass.cpp b/libcxx/test/std/depr/depr.c.headers/stdio_h.pass.cpp index 97ea0d41519b..43a0e292e15d 100644 --- a/libcxx/test/std/depr/depr.c.headers/stdio_h.pass.cpp +++ b/libcxx/test/std/depr/depr.c.headers/stdio_h.pass.cpp @@ -156,9 +156,13 @@ int main(int, char**) static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); +#ifndef _LIBCPP_HAS_NO_FGETPOS_FSETPOS static_assert((std::is_same::value), ""); +#endif static_assert((std::is_same::value), ""); +#ifndef _LIBCPP_HAS_NO_FGETPOS_FSETPOS static_assert((std::is_same::value), ""); +#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); diff --git a/libcxx/test/std/input.output/file.streams/c.files/cstdio.pass.cpp b/libcxx/test/std/input.output/file.streams/c.files/cstdio.pass.cpp index af8dc97a5e83..bae82fec69b0 100644 --- a/libcxx/test/std/input.output/file.streams/c.files/cstdio.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/c.files/cstdio.pass.cpp @@ -120,9 +120,13 @@ int main(int, char**) static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); +#ifndef _LIBCPP_HAS_NO_FGETPOS_FSETPOS static_assert((std::is_same::value), ""); +#endif static_assert((std::is_same::value), ""); +#ifndef _LIBCPP_HAS_NO_FGETPOS_FSETPOS static_assert((std::is_same::value), ""); +#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), "");