From 25aeb8538beec68e0cf105b21ca797aa8e8ce603 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Wed, 4 Jun 2025 20:23:58 +0800 Subject: [PATCH 1/2] [libc++][test] Test LWG3819: `reference_meows_from_temporary` should not use `is_meowible` Changes need to be done by compilers, while library implementations can hardly do anything. So the version number actually corresponds to Clang. --- libcxx/docs/Status/Cxx23Issues.csv | 2 +- .../meta/meta.unary/meta.unary.prop/common.h | 8 ++++++++ ...ference_constructs_from_temporary.pass.cpp | 20 +++++++++++++++++++ ...reference_converts_from_temporary.pass.cpp | 20 +++++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv index d1546f4a452b5..f53aad179db70 100644 --- a/libcxx/docs/Status/Cxx23Issues.csv +++ b/libcxx/docs/Status/Cxx23Issues.csv @@ -261,7 +261,7 @@ "`LWG3733 `__","``ranges::to`` misuses ``cpp17-input-iterator``","2023-02 (Issaquah)","|Complete|","17","" "`LWG3742 `__","``deque::prepend_range`` needs to permute","2023-02 (Issaquah)","","","" "`LWG3790 `__","`P1467 `__ accidentally changed ``nexttoward``'s signature","2023-02 (Issaquah)","","","" -"`LWG3819 `__","``reference_meows_from_temporary`` should not use ``is_meowible``","2023-02 (Issaquah)","","","" +"`LWG3819 `__","``reference_meows_from_temporary`` should not use ``is_meowible``","2023-02 (Issaquah)","|Complete|","21","Changes are made in compilers but not libraries. The version number corresponds to Clang." "`LWG3821 `__","``uses_allocator_construction_args`` should have overload for ``pair-like``","2023-02 (Issaquah)","|Complete|","18","" "`LWG3834 `__","Missing ``constexpr`` for ``std::intmax_t`` math functions in ````","2023-02 (Issaquah)","","","" "`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 ad53c8176cc92..04f7b48a46bbf 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>)); test_reference_constructs_from_temporary, 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, false>(); #endif @@ -66,6 +67,25 @@ constexpr bool test() { test_reference_constructs_from_temporary(); +#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(); + test_reference_constructs_from_temporary(); + + // Test cv-qualification dropping for scalar prvalues. LWG3819 also covers this. + test_reference_constructs_from_temporary(); + test_reference_constructs_from_temporary(); +#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(); +#endif + // Additional checks test_reference_constructs_from_temporary(); test_reference_constructs_from_temporary(); 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 73cc4f3e29d5a..543ced79a7d3e 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>)); test_reference_converts_from_temporary, 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, false>(); #endif @@ -66,6 +67,25 @@ constexpr bool test() { test_reference_converts_from_temporary(); +#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(); + test_reference_converts_from_temporary(); + + // Test cv-qualification dropping for scalar prvalues. LWG3819 also covers this. + test_reference_converts_from_temporary(); + test_reference_converts_from_temporary(); +#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(); +#endif + // Additional checks test_reference_converts_from_temporary(); test_reference_converts_from_temporary(); From 016ae31b5397bfb58ee7cd5a96cfad2376073ba4 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Mon, 1 Sep 2025 15:39:04 +0800 Subject: [PATCH 2/2] Address @philnik777's review comments and tweak macro guards --- libcxx/docs/Status/Cxx23Issues.csv | 2 +- .../reference_constructs_from_temporary.pass.cpp | 14 +++++++++++--- .../reference_converts_from_temporary.pass.cpp | 14 +++++++++++--- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv index f53aad179db70..fe81a092df66d 100644 --- a/libcxx/docs/Status/Cxx23Issues.csv +++ b/libcxx/docs/Status/Cxx23Issues.csv @@ -261,7 +261,7 @@ "`LWG3733 `__","``ranges::to`` misuses ``cpp17-input-iterator``","2023-02 (Issaquah)","|Complete|","17","" "`LWG3742 `__","``deque::prepend_range`` needs to permute","2023-02 (Issaquah)","","","" "`LWG3790 `__","`P1467 `__ accidentally changed ``nexttoward``'s signature","2023-02 (Issaquah)","","","" -"`LWG3819 `__","``reference_meows_from_temporary`` should not use ``is_meowible``","2023-02 (Issaquah)","|Complete|","21","Changes are made in compilers but not libraries. The version number corresponds to Clang." +"`LWG3819 `__","``reference_meows_from_temporary`` should not use ``is_meowible``","2023-02 (Issaquah)","|Complete|","22","Changes are made in compilers but not libraries. The version number corresponds to Clang." "`LWG3821 `__","``uses_allocator_construction_args`` should have overload for ``pair-like``","2023-02 (Issaquah)","|Complete|","18","" "`LWG3834 `__","Missing ``constexpr`` for ``std::intmax_t`` math functions in ````","2023-02 (Issaquah)","","","" "`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/reference_constructs_from_temporary.pass.cpp b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/reference_constructs_from_temporary.pass.cpp index 04f7b48a46bbf..fc9817a4a0983 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 @@ -67,8 +67,12 @@ constexpr bool test() { test_reference_constructs_from_temporary(); -#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. +#if defined(TEST_COMPILER_GCC) || \ + (defined(TEST_CLANG_VER) && \ + ((!defined(__ANDROID__) && TEST_CLANG_VER >= 2100) || (defined(__ANDROID__) && TEST_CLANG_VER >= 2200))) || \ + (defined(TEST_APPLE_CLANG_VER) && TEST_APPLE_CLANG_VER >= 1800) + // TODO: Bump the version numbers if newer Apple Clang or Android Clang hasn't implemented LWG3819 yet. + // TODO: Remove this guard once no supported Clang is affected by https://llvm.org/PR114344. // Test function references. test_reference_constructs_from_temporary(); @@ -79,7 +83,11 @@ constexpr bool test() { test_reference_constructs_from_temporary(); #endif -#if defined(TEST_CLANG_VER) && TEST_CLANG_VER >= 2100 +#if !defined(TEST_COMPILER_GCC) && \ + ((defined(TEST_CLANG_VER) && \ + ((!defined(__ANDROID__) && TEST_CLANG_VER >= 2100) || (defined(__ANDROID__) && TEST_CLANG_VER >= 2200))) || \ + (defined(TEST_APPLE_CLANG_VER) && TEST_APPLE_CLANG_VER >= 1800)) + // TODO: Bump the version numbers if newer Apple Clang or Android Clang hasn't implemented LWG3819 yet. // TODO: Remove this guard once supported Clang and GCC have LWG3819 implemented. // Test LWG3819: reference_meows_from_temporary should not use is_meowible. 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 543ced79a7d3e..aeb5310468fe7 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 @@ -67,8 +67,12 @@ constexpr bool test() { test_reference_converts_from_temporary(); -#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. +#if defined(TEST_COMPILER_GCC) || \ + (defined(TEST_CLANG_VER) && \ + ((!defined(__ANDROID__) && TEST_CLANG_VER >= 2100) || (defined(__ANDROID__) && TEST_CLANG_VER >= 2200))) || \ + (defined(TEST_APPLE_CLANG_VER) && TEST_APPLE_CLANG_VER >= 1800) + // TODO: Bump the version numbers if newer Apple Clang or Android Clang hasn't implemented LWG3819 yet. + // TODO: Remove this guard once no supported Clang is affected by https://llvm.org/PR114344. // Test function references. test_reference_converts_from_temporary(); @@ -79,7 +83,11 @@ constexpr bool test() { test_reference_converts_from_temporary(); #endif -#if defined(TEST_CLANG_VER) && TEST_CLANG_VER >= 2100 +#if !defined(TEST_COMPILER_GCC) && \ + ((defined(TEST_CLANG_VER) && \ + ((!defined(__ANDROID__) && TEST_CLANG_VER >= 2100) || (defined(__ANDROID__) && TEST_CLANG_VER >= 2200))) || \ + (defined(TEST_APPLE_CLANG_VER) && TEST_APPLE_CLANG_VER >= 1800)) + // TODO: Bump the version numbers if newer Apple Clang or Android Clang hasn't implemented LWG3819 yet. // TODO: Remove this guard once supported Clang and GCC have LWG3819 implemented. // Test LWG3819: reference_meows_from_temporary should not use is_meowible.