Skip to content

[libc++][test] Test LWG3819: reference_meows_from_temporary should not use is_meowible #143474

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

frederick-vs-ja
Copy link
Contributor

Actually, this LWG issue is not "Nothing To Do". But the changes need to be done by compilers, and library implementations can hardly do anything.

Closes #105079.

not use `is_meowible`

Actually, this LWG issue is not "Nothing To Do". But the changes need to
be done by compilers, and library implementations can hardly do
anything.
@frederick-vs-ja frederick-vs-ja requested a review from a team as a code owner June 10, 2025 03:41
@frederick-vs-ja frederick-vs-ja added libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. test-suite labels Jun 10, 2025
@llvmbot
Copy link
Member

llvmbot commented Jun 10, 2025

@llvm/pr-subscribers-libcxx

Author: A. Jiang (frederick-vs-ja)

Changes

Actually, this LWG issue is not "Nothing To Do". But the changes need to be done by compilers, and library implementations can hardly do anything.

Closes #105079.


Full diff: https://github.com/llvm/llvm-project/pull/143474.diff

4 Files Affected:

  • (modified) libcxx/docs/Status/Cxx23Issues.csv (+1-1)
  • (modified) libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/common.h (+8)
  • (modified) libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_constructs_from_temporary.pass.cpp (+20)
  • (modified) libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_converts_from_temporary.pass.cpp (+20)
diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv
index b5c88611559ef..5c3d8f1c477f6 100644
--- a/libcxx/docs/Status/Cxx23Issues.csv
+++ b/libcxx/docs/Status/Cxx23Issues.csv
@@ -261,7 +261,7 @@
 "`LWG3733 <https://wg21.link/LWG3733>`__","``ranges::to`` misuses ``cpp17-input-iterator``","2023-02 (Issaquah)","|Complete|","17",""
 "`LWG3742 <https://wg21.link/LWG3742>`__","``deque::prepend_range`` needs to permute","2023-02 (Issaquah)","","",""
 "`LWG3790 <https://wg21.link/LWG3790>`__","`P1467 <https://wg21.link/P1467>`__ accidentally changed ``nexttoward``'s signature","2023-02 (Issaquah)","","",""
-"`LWG3819 <https://wg21.link/LWG3819>`__","``reference_meows_from_temporary`` should not use ``is_meowible``","2023-02 (Issaquah)","","",""
+"`LWG3819 <https://wg21.link/LWG3819>`__","``reference_meows_from_temporary`` should not use ``is_meowible``","2023-02 (Issaquah)","|Nothing To Do|","",""
 "`LWG3821 <https://wg21.link/LWG3821>`__","``uses_allocator_construction_args`` should have overload for ``pair-like``","2023-02 (Issaquah)","|Complete|","18",""
 "`LWG3834 <https://wg21.link/LWG3834>`__","Missing ``constexpr`` for ``std::intmax_t`` math functions in ``<cinttypes>``","2023-02 (Issaquah)","","",""
 "`LWG3839 <https://wg21.link/LWG3839>`__","``range_formatter``'s ``set_separator``, ``set_brackets``, and ``underlying`` functions should be ``noexcept``","2023-02 (Issaquah)","|Complete|","17",""
diff --git a/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/common.h b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/common.h
index b51444915a5c5..4fba34e3817be 100644
--- a/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/common.h
+++ b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/common.h
@@ -85,6 +85,14 @@ class ExplicitConversionRef {
   explicit operator int&();
 };
 
+struct NonMovable {
+  NonMovable(NonMovable&&) = delete;
+};
+
+struct ConvertsFromNonMovable {
+  ConvertsFromNonMovable(NonMovable);
+};
+
 #endif
 
 #endif // TEST_META_UNARY_COMP_COMMON_H
diff --git a/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_constructs_from_temporary.pass.cpp b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_constructs_from_temporary.pass.cpp
index 5b3753c67381f..4a09e34b37b1b 100644
--- a/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_constructs_from_temporary.pass.cpp
+++ b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_constructs_from_temporary.pass.cpp
@@ -58,6 +58,7 @@ constexpr bool test() {
   assert((std::is_constructible_v<const int&, ConvertsToRef<long, long&>>));
   test_reference_constructs_from_temporary<const int&, ConvertsToRef<long, long&>, true>();
 #ifndef TEST_COMPILER_GCC
+  // TODO: Remove this guard once https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120529 gets fixed.
   test_reference_constructs_from_temporary<const int&, ConvertsToRefPrivate<long, long&>, false>();
 #endif
 
@@ -66,6 +67,25 @@ constexpr bool test() {
 
   test_reference_constructs_from_temporary<const int&, long, true>();
 
+#if defined(TEST_COMPILER_GCC) || (defined(TEST_CLANG_VER) && TEST_CLANG_VER >= 2100)
+  // TODO: Remove this guard once no supported Clang is affected by https://github.com/llvm/llvm-project/issues/114344.
+
+  // Test function references.
+  test_reference_constructs_from_temporary<void (&)(), void(), false>();
+  test_reference_constructs_from_temporary<void (&&)(), void(), false>();
+
+  // Test cv-qualification dropping for scalar prvalues. LWG3819 also covers this.
+  test_reference_constructs_from_temporary<int&&, const int, true>();
+  test_reference_constructs_from_temporary<int&&, volatile int, true>();
+#endif
+
+#if defined(TEST_CLANG_VER) && TEST_CLANG_VER >= 2100
+  // TODO: Remove this guard once supported Clang and GCC have LWG3819 implemented.
+
+  // Test LWG3819: reference_meows_from_temporary should not use is_meowible.
+  test_reference_constructs_from_temporary<ConvertsFromNonMovable&&, NonMovable, true>();
+#endif
+
   // Additional checks
   test_reference_constructs_from_temporary<const Base&, Derived, true>();
   test_reference_constructs_from_temporary<int&&, int, true>();
diff --git a/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_converts_from_temporary.pass.cpp b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_converts_from_temporary.pass.cpp
index 849e286c8cdab..1b199a497b372 100644
--- a/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_converts_from_temporary.pass.cpp
+++ b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_converts_from_temporary.pass.cpp
@@ -58,6 +58,7 @@ constexpr bool test() {
   assert((std::is_constructible_v<const int&, ConvertsToRef<long, long&>>));
   test_reference_converts_from_temporary<const int&, ConvertsToRef<long, long&>, true>();
 #ifndef TEST_COMPILER_GCC
+  // TODO: Remove this guard once https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120529 gets fixed.
   test_reference_converts_from_temporary<const int&, ConvertsToRefPrivate<long, long&>, false>();
 #endif
 
@@ -66,6 +67,25 @@ constexpr bool test() {
 
   test_reference_converts_from_temporary<const int&, long, true>();
 
+#if defined(TEST_COMPILER_GCC) || (defined(TEST_CLANG_VER) && TEST_CLANG_VER >= 2100)
+  // TODO: Remove this guard once no supported Clang is affected by https://github.com/llvm/llvm-project/issues/114344.
+
+  // Test function references.
+  test_reference_converts_from_temporary<void (&)(), void(), false>();
+  test_reference_converts_from_temporary<void (&&)(), void(), false>();
+
+  // Test cv-qualification dropping for scalar prvalues. LWG3819 also covers this.
+  test_reference_converts_from_temporary<int&&, const int, true>();
+  test_reference_converts_from_temporary<int&&, volatile int, true>();
+#endif
+
+#if defined(TEST_CLANG_VER) && TEST_CLANG_VER >= 2100
+  // TODO: Remove this guard once supported Clang and GCC have LWG3819 implemented.
+
+  // Test LWG3819: reference_meows_from_temporary should not use is_meowible.
+  test_reference_converts_from_temporary<ConvertsFromNonMovable&&, NonMovable, true>();
+#endif
+
   // Additional checks
   test_reference_converts_from_temporary<const Base&, Derived, true>();
   test_reference_converts_from_temporary<int&&, int, true>();

@@ -261,7 +261,7 @@
"`LWG3733 <https://wg21.link/LWG3733>`__","``ranges::to`` misuses ``cpp17-input-iterator``","2023-02 (Issaquah)","|Complete|","17",""
"`LWG3742 <https://wg21.link/LWG3742>`__","``deque::prepend_range`` needs to permute","2023-02 (Issaquah)","","",""
"`LWG3790 <https://wg21.link/LWG3790>`__","`P1467 <https://wg21.link/P1467>`__ accidentally changed ``nexttoward``'s signature","2023-02 (Issaquah)","","",""
"`LWG3819 <https://wg21.link/LWG3819>`__","``reference_meows_from_temporary`` should not use ``is_meowible``","2023-02 (Issaquah)","","",""
"`LWG3819 <https://wg21.link/LWG3819>`__","``reference_meows_from_temporary`` should not use ``is_meowible``","2023-02 (Issaquah)","|Nothing To Do|","",""
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We recorded LWG3823 as "Nothing To Do" because no change was made in the library implementation. But I'm not sure whether this is also OK for LWG3819.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it's an observable change it's not "nothing to do", even if there are no changes in the actual library implementation. If there are test changes it almost certainly means it's not "Nothing to do".

@frederick-vs-ja
Copy link
Contributor Author

Oops, this seem blocked as the version of Clang before merging #142554 is still used in CI.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. test-suite
Projects
None yet
Development

Successfully merging this pull request may close these issues.

LWG3819: reference_meows_from_temporary should not use is_meowible
3 participants