mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 17:36:36 +00:00

Some compiler provided type traits like __has_trivial_constructor have been documented as deprecated for quite some time. Still, some people apparently still use them, even though mixing them with concepts and with deleted functions leads to weird results. There's also disagreement about some edge cases between GCC (which Clang claims to follow) and MSVC. This patch adds deprecation warnings for the usage of those builtins, except for __has_trivial_destructor which doesn't have a GCC alternative. I made the warning on by default, so I had to silence it for some tests but it's not too many. Some (decade old) history of issues with those builtins: https://github.com/llvm/llvm-project/issues/18187 https://github.com/llvm/llvm-project/issues/18559 https://github.com/llvm/llvm-project/issues/22161 https://github.com/llvm/llvm-project/issues/33063 The abseil usage of them that triggered me to add this warning: https://github.com/abseil/abseil-cpp/issues/1201 Weird interaction of those builtins with C++20's conditionally trivial special member functions: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106085 Reviewed By: #clang-language-wg, aaron.ballman Differential Revision: https://reviews.llvm.org/D129170
40 lines
1.0 KiB
C++
40 lines
1.0 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 -Wno-deprecated-builtins
|
|
// expected-no-diagnostics
|
|
struct T1 {
|
|
};
|
|
static_assert(__has_trivial_constructor(T1), "T1 has trivial constructor!");
|
|
|
|
struct T2 {
|
|
T2();
|
|
};
|
|
static_assert(!__has_trivial_constructor(T2), "T2 has a user-declared constructor!");
|
|
|
|
struct T3 {
|
|
virtual void f();
|
|
};
|
|
static_assert(!__has_trivial_constructor(T3), "T3 has a virtual function!");
|
|
|
|
struct T4 : virtual T3 {
|
|
};
|
|
static_assert(!__has_trivial_constructor(T4), "T4 has a virtual base class!");
|
|
|
|
struct T5 : T1 {
|
|
};
|
|
static_assert(__has_trivial_constructor(T5), "All the direct base classes of T5 have trivial constructors!");
|
|
|
|
struct T6 {
|
|
T5 t5;
|
|
T1 t1[2][2];
|
|
static T2 t2;
|
|
};
|
|
static_assert(__has_trivial_constructor(T6), "All nonstatic data members of T6 have trivial constructors!");
|
|
|
|
struct T7 {
|
|
T4 t4;
|
|
};
|
|
static_assert(!__has_trivial_constructor(T7), "t4 does not have a trivial constructor!");
|
|
|
|
struct T8 : T2 {
|
|
};
|
|
static_assert(!__has_trivial_constructor(T8), "The base class T2 does not have a trivial constructor!");
|