From 44cdca37c01a58da94087be8ebd0ee2bd2ba724e Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Wed, 2 Feb 2022 12:23:51 -0500 Subject: [PATCH] [libc++] Define `namespace views` in its own detail header. Discovered in the comments on D118748: we would like this namespace to exist anytime Ranges exists, regardless of whether concepts syntax is supported. Also, we'd like to fully granularize the header, which means not putting any loose declarations at the top level. Differential Revision: https://reviews.llvm.org/D118809 --- libcxx/include/CMakeLists.txt | 1 + libcxx/include/__ranges/views.h | 35 +++++++++++++++++++ libcxx/include/module.modulemap | 1 + libcxx/include/ranges | 11 +----- .../ranges/views.module.verify.cpp | 15 ++++++++ 5 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 libcxx/include/__ranges/views.h create mode 100644 libcxx/test/libcxx/diagnostics/detail.headers/ranges/views.module.verify.cpp diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index 65fded9a430f..ba93e9a36671 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -351,6 +351,7 @@ set(files __ranges/take_view.h __ranges/transform_view.h __ranges/view_interface.h + __ranges/views.h __split_buffer __std_stream __string diff --git a/libcxx/include/__ranges/views.h b/libcxx/include/__ranges/views.h new file mode 100644 index 000000000000..8cc5ba3d2aca --- /dev/null +++ b/libcxx/include/__ranges/views.h @@ -0,0 +1,35 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___RANGES_VIEWS +#define _LIBCPP___RANGES_VIEWS + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) + +namespace ranges { + +namespace views { } + +} // namespace ranges + +namespace views = ranges::views; + +#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___RANGES_VIEWS diff --git a/libcxx/include/module.modulemap b/libcxx/include/module.modulemap index adec0b7d86a8..0e2e761530b9 100644 --- a/libcxx/include/module.modulemap +++ b/libcxx/include/module.modulemap @@ -817,6 +817,7 @@ module std [system] { export functional.__functional.perfect_forward } module view_interface { private header "__ranges/view_interface.h" } + module views { private header "__ranges/views.h" } } } module ratio { diff --git a/libcxx/include/ranges b/libcxx/include/ranges index 8c9569cbaaea..e8142084fe97 100644 --- a/libcxx/include/ranges +++ b/libcxx/include/ranges @@ -258,6 +258,7 @@ namespace std { #include <__ranges/take_view.h> #include <__ranges/transform_view.h> #include <__ranges/view_interface.h> +#include <__ranges/views.h> #include // Required by the standard. #include // Required by the standard. #include // Required by the standard. @@ -267,16 +268,6 @@ namespace std { # pragma GCC system_header #endif -_LIBCPP_BEGIN_NAMESPACE_STD - -#if !defined(_LIBCPP_HAS_NO_CONCEPTS) - -namespace views = ranges::views; - -#endif // !defined(_LIBCPP_HAS_NO_CONCEPTS) - -_LIBCPP_END_NAMESPACE_STD - #endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) #endif // _LIBCPP_RANGES diff --git a/libcxx/test/libcxx/diagnostics/detail.headers/ranges/views.module.verify.cpp b/libcxx/test/libcxx/diagnostics/detail.headers/ranges/views.module.verify.cpp new file mode 100644 index 000000000000..3b5b61709687 --- /dev/null +++ b/libcxx/test/libcxx/diagnostics/detail.headers/ranges/views.module.verify.cpp @@ -0,0 +1,15 @@ +//===----------------------------------------------------------------------===// +// +// 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: modules-build + +// WARNING: This test was generated by 'generate_private_header_tests.py' +// and should not be edited manually. + +// expected-error@*:* {{use of private header from outside its module: '__ranges/views.h'}} +#include <__ranges/views.h>