-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[libc++][type_traits] P2674R1: A trait for implicit lifetime types #106870
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
[libc++][type_traits] P2674R1: A trait for implicit lifetime types #106870
Conversation
✅ With the latest revision this PR passed the C/C++ code formatter. |
43241f6
to
0ab51dc
Compare
✅ With the latest revision this PR passed the Python code formatter. |
0ab51dc
to
4e995ac
Compare
The implementation without the builtin can never be implemented correctly for all structs. You wouldn't be able to check if this class has a trivial default constructor: struct X {
X() = default; // Trivial eligible constructor
X(int = 0); // ... But X is not default constructible
X(const X&);
};
static_assert(__builtin_is_implicit_lifetime(X));
static_assert(!is_implicit_lifetime_v<X>); Not sure you should try to provide a fallback in the (But if you do keep it, you don't check if it's a class before you check |
Thanks for the review. I plan to remove the non-builtin implementation. |
4cf8ca3
to
4799114
Compare
4799114
to
02e288f
Compare
Implements P2674R1: https://wg21.link/P2674R1 - https://eel.is/c++draft/type.traits - https://eel.is/c++draft/meta.type.synop - https://eel.is/c++draft/meta.unary.prop - https://eel.is/c++draft/support.limits - https://eel.is/c++draft/version.syn Implementation details: - Uses compiler intrinsic `__builtin_is_implicit_lifetime`: - llvm#101807 - Tests based on: - https://github.com/llvm/llvm-project/blob/d213981c80626698a07b11ce872acba098a863d4/clang/test/SemaCXX/type-traits.cpp#L1989 References: - Implicit-lifetime - Implicit-lifetime types [basic.types.general]/9: https://eel.is/c++draft/basic.types.general - Implicit-lifetime class [class.prop]/9: https://eel.is/c++draft/class.prop - P0593R6 Implicit creation of objects for low-level object manipulation: https://wg21.link/P0593R6 - P1010R1 Container support for implicit lifetime types: https://wg21.link/P1010R1 - P0593R6 Implicit creation of objects for low-level object manipulation: https://wg21.link/P0593R6 Closes: llvm#105259
02e288f
to
c8ae04b
Compare
Strange build failure with macOS back deployment: https://buildkite.com/llvm-project/libcxx-ci/builds/37470#0191b844-f2b4-4102-b33f-e633e18147c7 |
@llvm/pr-subscribers-libcxx Author: Hristo Hristov (H-G-Hristov) ChangesImplements P2674R1: https://wg21.link/P2674R1 Implementation details:
References:
Closes: #105259 Patch is 30.39 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/106870.diff 14 Files Affected:
diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst
index c909a4300db1a6..05b08da5215350 100644
--- a/libcxx/docs/FeatureTestMacroTable.rst
+++ b/libcxx/docs/FeatureTestMacroTable.rst
@@ -336,6 +336,8 @@ Status
---------------------------------------------------------- -----------------
``__cpp_lib_ios_noreplace`` ``202207L``
---------------------------------------------------------- -----------------
+ ``__cpp_lib_is_implicit_lifetime`` ``202302L``
+ ---------------------------------------------------------- -----------------
``__cpp_lib_is_scoped_enum`` ``202011L``
---------------------------------------------------------- -----------------
``__cpp_lib_mdspan`` ``202207L``
diff --git a/libcxx/docs/ReleaseNotes/20.rst b/libcxx/docs/ReleaseNotes/20.rst
index 93d6027291ad95..cb95d7059eb837 100644
--- a/libcxx/docs/ReleaseNotes/20.rst
+++ b/libcxx/docs/ReleaseNotes/20.rst
@@ -41,6 +41,7 @@ Implemented Papers
- P2747R2: ``constexpr`` placement new (`Github <https://github.com/llvm/llvm-project/issues/105427>`__)
- P2609R3: Relaxing Ranges Just A Smidge (`Github <https://github.com/llvm/llvm-project/issues/105253>`__)
- P2985R0: A type trait for detecting virtual base classes (`Github <https://github.com/llvm/llvm-project/issues/105432>`__)
+- P2674R1: A trait for implicit lifetime types (`Github <https://github.com/llvm/llvm-project/issues/105259>`__)
Improvements and New Features
diff --git a/libcxx/docs/Status/Cxx23Papers.csv b/libcxx/docs/Status/Cxx23Papers.csv
index 2c8a91d8401b53..2cf63b29ab53ba 100644
--- a/libcxx/docs/Status/Cxx23Papers.csv
+++ b/libcxx/docs/Status/Cxx23Papers.csv
@@ -113,7 +113,7 @@
"`P2572R1 <https://wg21.link/P2572R1>`__","``std::format`` fill character allowances","2023-02 (Issaquah)","|Complete|","17.0",""
"`P2693R1 <https://wg21.link/P2693R1>`__","Formatting ``thread::id`` and ``stacktrace``","2023-02 (Issaquah)","|Partial|","","The formatter for ``stacktrace`` is not implemented, since ``stacktrace`` is not implemented yet"
"`P2679R2 <https://wg21.link/P2679R2>`__","Fixing ``std::start_lifetime_as`` for arrays","2023-02 (Issaquah)","","",""
-"`P2674R1 <https://wg21.link/P2674R1>`__","A trait for implicit lifetime types","2023-02 (Issaquah)","","",""
+"`P2674R1 <https://wg21.link/P2674R1>`__","A trait for implicit lifetime types","2023-02 (Issaquah)","|Complete|","20.0",""
"`P2655R3 <https://wg21.link/P2655R3>`__","``common_reference_t`` of ``reference_wrapper`` Should Be a Reference Type","2023-02 (Issaquah)","","",""
"`P2652R2 <https://wg21.link/P2652R2>`__","Disallow User Specialization of ``allocator_traits``","2023-02 (Issaquah)","|Complete|","19.0",""
"`P2787R1 <https://wg21.link/P2787R1>`__","``pmr::generator`` - Promise Types are not Values","2023-02 (Issaquah)","","",""
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index 32579272858a8e..6c755e90214b44 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -778,6 +778,7 @@ set(files
__type_traits/is_floating_point.h
__type_traits/is_function.h
__type_traits/is_fundamental.h
+ __type_traits/is_implicit_lifetime.h
__type_traits/is_implicitly_default_constructible.h
__type_traits/is_integral.h
__type_traits/is_literal_type.h
diff --git a/libcxx/include/__type_traits/is_implicit_lifetime.h b/libcxx/include/__type_traits/is_implicit_lifetime.h
new file mode 100644
index 00000000000000..2aba420bd2b59d
--- /dev/null
+++ b/libcxx/include/__type_traits/is_implicit_lifetime.h
@@ -0,0 +1,35 @@
+//===----------------------------------------------------------------------===//
+//
+// 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___TYPE_TRAITS_IS_IMPLICIT_LIFETIME_H
+#define _LIBCPP___TYPE_TRAITS_IS_IMPLICIT_LIFETIME_H
+
+#include <__config>
+#include <__type_traits/integral_constant.h>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+# pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+#if _LIBCPP_STD_VER >= 23
+# if __has_builtin(__builtin_is_implicit_lifetime)
+
+template <class _Tp>
+struct _LIBCPP_TEMPLATE_VIS is_implicit_lifetime : public bool_constant<__builtin_is_implicit_lifetime(_Tp)> {};
+
+template <class _Tp>
+inline constexpr bool is_implicit_lifetime_v = __builtin_is_implicit_lifetime(_Tp);
+
+# endif
+#endif
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___TYPE_TRAITS_IS_IMPLICIT_LIFETIME_H
diff --git a/libcxx/include/module.modulemap b/libcxx/include/module.modulemap
index f193b5d95f49f5..da3fa1cbaa66ba 100644
--- a/libcxx/include/module.modulemap
+++ b/libcxx/include/module.modulemap
@@ -1944,6 +1944,7 @@ module std_private_type_traits_is_final [system
module std_private_type_traits_is_floating_point [system] { header "__type_traits/is_floating_point.h" }
module std_private_type_traits_is_function [system] { header "__type_traits/is_function.h" }
module std_private_type_traits_is_fundamental [system] { header "__type_traits/is_fundamental.h" }
+module std_private_type_traits_is_implicit_lifetime [system] { header "__type_traits/is_implicit_lifetime.h" }
module std_private_type_traits_is_implicitly_default_constructible [system] {
header "__type_traits/is_implicitly_default_constructible.h"
export std_private_type_traits_integral_constant
diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits
index 5937d4fdc9e1a7..d29721a371c39a 100644
--- a/libcxx/include/type_traits
+++ b/libcxx/include/type_traits
@@ -137,6 +137,8 @@ namespace std
template <class T> struct is_nothrow_swappable; // C++17
template <class T> struct is_nothrow_destructible;
+ template<class T> struct is_implicit_lifetime; // Since C++23
+
template <class T> struct has_virtual_destructor;
template<class T> struct has_unique_object_representations; // C++17
@@ -374,6 +376,8 @@ namespace std
= is_nothrow_swappable<T>::value; // C++17
template <class T> inline constexpr bool is_nothrow_destructible_v
= is_nothrow_destructible<T>::value; // C++17
+ template<class T>
+ constexpr bool is_implicit_lifetime_v = is_implicit_lifetime<T>::value; // Since C++23
template <class T> inline constexpr bool has_virtual_destructor_v
= has_virtual_destructor<T>::value; // C++17
template<class T> inline constexpr bool has_unique_object_representations_v // C++17
@@ -517,6 +521,10 @@ namespace std
# include <__type_traits/unwrap_ref.h>
#endif
+#if _LIBCPP_STD_VER >= 23
+# include <__type_traits/is_implicit_lifetime.h>
+#endif
+
#include <version>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/version b/libcxx/include/version
index dc1d3fd268ce83..482913b2759c9b 100644
--- a/libcxx/include/version
+++ b/libcxx/include/version
@@ -138,6 +138,7 @@ __cpp_lib_ios_noreplace 202207L <ios>
__cpp_lib_is_aggregate 201703L <type_traits>
__cpp_lib_is_constant_evaluated 201811L <type_traits>
__cpp_lib_is_final 201402L <type_traits>
+__cpp_lib_is_implicit_lifetime 202302L <type_traits>
__cpp_lib_is_invocable 201703L <type_traits>
__cpp_lib_is_layout_compatible 201907L <type_traits>
__cpp_lib_is_nothrow_convertible 201806L <type_traits>
@@ -473,6 +474,9 @@ __cpp_lib_void_t 201411L <type_traits>
# define __cpp_lib_forward_like 202207L
# define __cpp_lib_invoke_r 202106L
# define __cpp_lib_ios_noreplace 202207L
+# if __has_builtin(__builtin_is_implicit_lifetime)
+# define __cpp_lib_is_implicit_lifetime 202302L
+# endif
# define __cpp_lib_is_scoped_enum 202011L
# define __cpp_lib_mdspan 202207L
# define __cpp_lib_modules 202207L
diff --git a/libcxx/modules/std/type_traits.inc b/libcxx/modules/std/type_traits.inc
index d368daf35ccb8c..d7b5a7243746b2 100644
--- a/libcxx/modules/std/type_traits.inc
+++ b/libcxx/modules/std/type_traits.inc
@@ -98,7 +98,9 @@ export namespace std {
using std::is_nothrow_destructible;
- // using std::is_implicit_lifetime;
+#if _LIBCPP_STD_VER >= 23 && __has_builtin(__builtin_is_implicit_lifetime)
+ using std::is_implicit_lifetime;
+#endif
using std::has_virtual_destructor;
@@ -243,7 +245,9 @@ export namespace std {
using std::is_destructible_v;
using std::is_empty_v;
using std::is_final_v;
- // using std::is_implicit_lifetime_v;
+#if _LIBCPP_STD_VER >= 23 && __has_builtin(__builtin_is_implicit_lifetime)
+ using std::is_implicit_lifetime_v;
+#endif
using std::is_move_assignable_v;
using std::is_move_constructible_v;
using std::is_nothrow_assignable_v;
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.compile.pass.cpp
index 1cbf2699a95bcc..d9d698ace2b653 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.compile.pass.cpp
@@ -23,6 +23,7 @@
__cpp_lib_is_aggregate 201703L [C++17]
__cpp_lib_is_constant_evaluated 201811L [C++20]
__cpp_lib_is_final 201402L [C++14]
+ __cpp_lib_is_implicit_lifetime 202302L [C++23]
__cpp_lib_is_invocable 201703L [C++17]
__cpp_lib_is_layout_compatible 201907L [C++20]
__cpp_lib_is_nothrow_convertible 201806L [C++20]
@@ -75,6 +76,10 @@
# error "__cpp_lib_is_final should not be defined before c++14"
# endif
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined before c++23"
+# endif
+
# ifdef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should not be defined before c++17"
# endif
@@ -179,6 +184,10 @@
# error "__cpp_lib_is_final should have the value 201402L in c++14"
# endif
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined before c++23"
+# endif
+
# ifdef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should not be defined before c++17"
# endif
@@ -301,6 +310,10 @@
# error "__cpp_lib_is_final should have the value 201402L in c++17"
# endif
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined before c++23"
+# endif
+
# ifndef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should be defined in c++17"
# endif
@@ -444,6 +457,10 @@
# error "__cpp_lib_is_final should have the value 201402L in c++20"
# endif
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined before c++23"
+# endif
+
# ifndef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should be defined in c++20"
# endif
@@ -614,6 +631,19 @@
# error "__cpp_lib_is_final should have the value 201402L in c++23"
# endif
+# if __has_builtin(__builtin_is_implicit_lifetime)
+# ifndef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should be defined in c++23"
+# endif
+# if __cpp_lib_is_implicit_lifetime != 202302L
+# error "__cpp_lib_is_implicit_lifetime should have the value 202302L in c++23"
+# endif
+# else
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined when the requirement '__has_builtin(__builtin_is_implicit_lifetime)' is not met!"
+# endif
+# endif
+
# ifndef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should be defined in c++23"
# endif
@@ -796,6 +826,19 @@
# error "__cpp_lib_is_final should have the value 201402L in c++26"
# endif
+# if __has_builtin(__builtin_is_implicit_lifetime)
+# ifndef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should be defined in c++26"
+# endif
+# if __cpp_lib_is_implicit_lifetime != 202302L
+# error "__cpp_lib_is_implicit_lifetime should have the value 202302L in c++26"
+# endif
+# else
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined when the requirement '__has_builtin(__builtin_is_implicit_lifetime)' is not met!"
+# endif
+# endif
+
# ifndef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
index a022c90e166c8d..10cf69f67c39f9 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
@@ -125,6 +125,7 @@
__cpp_lib_is_aggregate 201703L [C++17]
__cpp_lib_is_constant_evaluated 201811L [C++20]
__cpp_lib_is_final 201402L [C++14]
+ __cpp_lib_is_implicit_lifetime 202302L [C++23]
__cpp_lib_is_invocable 201703L [C++17]
__cpp_lib_is_layout_compatible 201907L [C++20]
__cpp_lib_is_nothrow_convertible 201806L [C++20]
@@ -671,6 +672,10 @@
# error "__cpp_lib_is_final should not be defined before c++14"
# endif
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined before c++23"
+# endif
+
# ifdef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should not be defined before c++17"
# endif
@@ -1550,6 +1555,10 @@
# error "__cpp_lib_is_final should have the value 201402L in c++14"
# endif
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined before c++23"
+# endif
+
# ifdef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should not be defined before c++17"
# endif
@@ -2564,6 +2573,10 @@
# error "__cpp_lib_is_final should have the value 201402L in c++17"
# endif
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined before c++23"
+# endif
+
# ifndef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should be defined in c++17"
# endif
@@ -3842,6 +3855,10 @@
# error "__cpp_lib_is_final should have the value 201402L in c++20"
# endif
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined before c++23"
+# endif
+
# ifndef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should be defined in c++20"
# endif
@@ -5306,6 +5323,19 @@
# error "__cpp_lib_is_final should have the value 201402L in c++23"
# endif
+# if __has_builtin(__builtin_is_implicit_lifetime)
+# ifndef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should be defined in c++23"
+# endif
+# if __cpp_lib_is_implicit_lifetime != 202302L
+# error "__cpp_lib_is_implicit_lifetime should have the value 202302L in c++23"
+# endif
+# else
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined when the requirement '__has_builtin(__builtin_is_implicit_lifetime)' is not met!"
+# endif
+# endif
+
# ifndef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should be defined in c++23"
# endif
@@ -7112,6 +7142,19 @@
# error "__cpp_lib_is_final should have the value 201402L in c++26"
# endif
+# if __has_builtin(__builtin_is_implicit_lifetime)
+# ifndef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should be defined in c++26"
+# endif
+# if __cpp_lib_is_implicit_lifetime != 202302L
+# error "__cpp_lib_is_implicit_lifetime should have the value 202302L in c++26"
+# endif
+# else
+# ifdef __cpp_lib_is_implicit_lifetime
+# error "__cpp_lib_is_implicit_lifetime should not be defined when the requirement '__has_builtin(__builtin_is_implicit_lifetime)' is not met!"
+# endif
+# endif
+
# ifndef __cpp_lib_is_invocable
# error "__cpp_lib_is_invocable should be defined in c++26"
# endif
diff --git a/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp
new file mode 100644
index 00000000000000..2b8d00ea577455
--- /dev/null
+++ b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp
@@ -0,0 +1,323 @@
+//===----------------------------------------------------------------------===//
+//
+// 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, c++17, c++20
+
+// These compilers don't support __builtin_is_implicit_lifetime yet.
+// UNSUPPORTED: clang-17, clang-18, clang-19, gcc-14, apple-clang-16, apple-clang-17
+// XFAIL: apple-clang
+
+// <type_traits>
+
+// template<class T> struct is_implicit_lifetime;
+
+#include <cassert>
+#include <cstddef>
+#include <tuple>
+#include <type_traits>
+#include <utility>
+
+#include "test_macros.h"
+
+enum Enum { EV };
+enum SignedEnum : signed int {};
+enum UnsignedEnum : unsigned int {};
+
+enum class EnumClass { EV };
+enum class SignedEnumClass : signed int {};
+enum class UnsignedEnumClass : unsigned int {};
+
+struct EmptyStruct {};
+struct IncompleteStruct;
+
+struct NoEligibleTrivialContructor {
+ NoEligibleTrivialContructor() {};
+ NoEligibleTrivialContructor(const NoEligibleTrivialContructor&) {}
+ NoEligibleTrivialContructor(NoEligibleTrivialContructor&&) {}
+};
+
+struct OnlyDefaultConstructorIsTrivial {
+ OnlyDefaultConstructorIsTrivial() = default;
+ OnlyDefaultConstructorIsTrivial(const OnlyDefaultConstructorIsTrivial&) {}
+ OnlyDefaultConstructorIsTrivial(OnlyDefaultConstructorIsTrivial&&) {}
+};
+
+struct AllContstructorsAreTrivial {
+ AllContstructorsAreTrivial() = default;
+ AllContstructorsAreTrivial(const AllContstructorsAreTrivial&) = default;
+ AllContstructorsAreTrivial(AllContstructorsAreTrivial&&) = default;
+};
+
+struct InheritedNoEligibleTrivialConstructor : NoEligibleTrivialContructor {
+ using NoEligibleTrivialContructor::NoEligibleTrivialContructor;
+};
+
+struct InheritedOnlyDefaultConstructorIsTrivial : OnlyDefaultConstructorIsTrivial {
+ using OnlyDefaultConstructorIsTrivial::OnlyDefaultConstructorIsTrivial;
+};
+
+struct InheritedAllContstructorsAreTrivial : AllContstructorsAreTrivial {
+ using AllContstructorsAreTrivial::AllContstructorsAreTrivial;
+};
+
+struct UserDeclaredDestructor {
+ ~UserDeclaredDestructor() = default;
+};
+
+struct UserProvidedDestructor {
+ ~UserProvidedDestructor() {}
+};
+
+struct UserDeletedDestructorInAggregate {
+ ~UserDeletedDestructorInAggregate() = delete;
+};
+
+struct UserDeletedDestructorInNonAggregate {
+ virtual void NonAggregate();
+ ~UserDeletedDestructorInNonAggregate() = dele...
[truncated]
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few comments but this looks really good!
libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp
Outdated
Show resolved
Hide resolved
libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp
Outdated
Show resolved
Hide resolved
libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.verify.cpp
Outdated
Show resolved
Hide resolved
libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp
Outdated
Show resolved
Hide resolved
libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp
Outdated
Show resolved
Hide resolved
Thank you for the review. I think the CI is not using Clang-20 with the builtin yet and I should wait for the CI to be updated before I merge. WDYT? |
libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp
Outdated
Show resolved
Hide resolved
libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp
Outdated
Show resolved
Hide resolved
libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.verify.cpp
Outdated
Show resolved
Hide resolved
libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp
Outdated
Show resolved
Hide resolved
libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_implicit_lifetime.pass.cpp
Outdated
Show resolved
Hide resolved
libcxx/include/module.modulemap
Outdated
export std_core.type_traits.integral_constant | ||
} | ||
module is_implicit_lifetime { | ||
header "__type_traits/is_implicit_lifetime.h" | ||
export std_core.type_traits.is_implicit_lifetime | ||
} | ||
module is_implicitly_default_constructible { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ldionne The new module map required this PR to be updated. Could you please reapprove the above change?
@philnik777 I addressed your comments. I checked |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Basically LGTM except for the modulemap.
I guess this PR will have to be updated with the changes from #111522 |
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/186/builds/3057 Here is the relevant piece of the build log for the reference
|
Modulemap changes look good to me.
Edit: Looks like I am blind, now that I found the failures they don't look related to this change. |
Implements P2674R1: https://wg21.link/P2674R1
Implementation details:
__builtin_is_implicit_lifetime
:__builtin_is_implicit_lifetime()
#101807llvm-project/clang/test/SemaCXX/type-traits.cpp
Line 1989 in d213981
References:
Closes: #105259