[clang] [Clang] Remove __is_nullptr (PR #99038)
Nikolas Klauser via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 31 10:59:39 PDT 2024
https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/99038
>From fbc9ebb3900e69f2485111cfdc6b7a7dfd3e6ebe Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Tue, 16 Jul 2024 14:53:30 +0200
Subject: [PATCH 1/2] [Clang] Remove __is_nullptr
---
clang/docs/LanguageExtensions.rst | 4 ----
clang/lib/Parse/ParseDeclCXX.cpp | 5 ++---
clang/lib/Parse/ParseExpr.cpp | 1 -
clang/lib/Sema/SemaExprCXX.cpp | 3 ---
clang/test/SemaCXX/type-traits.cpp | 36 ------------------------------
5 files changed, 2 insertions(+), 47 deletions(-)
diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst
index 81784c75081ba..cfd7d29fb9eac 100644
--- a/clang/docs/LanguageExtensions.rst
+++ b/clang/docs/LanguageExtensions.rst
@@ -1614,10 +1614,6 @@ The following type trait primitives are supported by Clang. Those traits marked
* ``__is_nothrow_assignable`` (C++, MSVC 2013)
* ``__is_nothrow_constructible`` (C++, MSVC 2013)
* ``__is_nothrow_destructible`` (C++, MSVC 2013)
-* ``__is_nullptr`` (C++, GNU, Microsoft, Embarcadero):
- Returns true for ``std::nullptr_t`` and false for everything else. The
- corresponding standard library feature is ``std::is_null_pointer``, but
- ``__is_null_pointer`` is already in use by some implementations.
* ``__is_object`` (C++, Embarcadero)
* ``__is_pod`` (C++, GNU, Microsoft, Embarcadero):
Note, the corresponding standard trait was deprecated in C++20.
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index ce827c689beb7..2c201d346328b 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -447,9 +447,9 @@ Decl *Parser::ParseLinkage(ParsingDeclSpec &DS, DeclaratorContext Context) {
///
/// HLSL: Parse export function declaration.
///
-/// export-function-declaration:
+/// export-function-declaration:
/// 'export' function-declaration
-///
+///
/// export-declaration-group:
/// 'export' '{' function-declaration-seq[opt] '}'
///
@@ -1799,7 +1799,6 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
tok::kw___is_nothrow_constructible,
tok::kw___is_nothrow_convertible,
tok::kw___is_nothrow_destructible,
- tok::kw___is_nullptr,
tok::kw___is_object,
tok::kw___is_pod,
tok::kw___is_pointer,
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp
index 3d7c58e5b3c3c..b3df9cfbc8b9a 100644
--- a/clang/lib/Parse/ParseExpr.cpp
+++ b/clang/lib/Parse/ParseExpr.cpp
@@ -800,7 +800,6 @@ bool Parser::isRevertibleTypeTrait(const IdentifierInfo *II,
REVERTIBLE_TYPE_TRAIT(__is_nothrow_assignable);
REVERTIBLE_TYPE_TRAIT(__is_nothrow_constructible);
REVERTIBLE_TYPE_TRAIT(__is_nothrow_destructible);
- REVERTIBLE_TYPE_TRAIT(__is_nullptr);
REVERTIBLE_TYPE_TRAIT(__is_object);
REVERTIBLE_TYPE_TRAIT(__is_pod);
REVERTIBLE_TYPE_TRAIT(__is_pointer);
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index bef7da239e6e5..a41b938531cab 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -4979,7 +4979,6 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, TypeTrait UTT,
case UTT_IsArray:
case UTT_IsBoundedArray:
case UTT_IsPointer:
- case UTT_IsNullPointer:
case UTT_IsReferenceable:
case UTT_IsLvalueReference:
case UTT_IsRvalueReference:
@@ -5235,8 +5234,6 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT,
return T->isIncompleteArrayType();
case UTT_IsPointer:
return T->isAnyPointerType();
- case UTT_IsNullPointer:
- return T->isNullPtrType();
case UTT_IsLvalueReference:
return T->isLValueReferenceType();
case UTT_IsRvalueReference:
diff --git a/clang/test/SemaCXX/type-traits.cpp b/clang/test/SemaCXX/type-traits.cpp
index 7adbf4aad7afe..b38e8989cb559 100644
--- a/clang/test/SemaCXX/type-traits.cpp
+++ b/clang/test/SemaCXX/type-traits.cpp
@@ -1041,42 +1041,6 @@ void is_pointer()
static_assert(!__is_pointer(void (StructWithMembers::*) ()));
}
-void is_null_pointer() {
- StructWithMembers x;
-
- static_assert(__is_nullptr(decltype(nullptr)));
- static_assert(!__is_nullptr(void *));
- static_assert(!__is_nullptr(cvoid *));
- static_assert(!__is_nullptr(cvoid *));
- static_assert(!__is_nullptr(char *));
- static_assert(!__is_nullptr(int *));
- static_assert(!__is_nullptr(int **));
- static_assert(!__is_nullptr(ClassType *));
- static_assert(!__is_nullptr(Derives *));
- static_assert(!__is_nullptr(Enum *));
- static_assert(!__is_nullptr(IntArNB *));
- static_assert(!__is_nullptr(Union *));
- static_assert(!__is_nullptr(UnionAr *));
- static_assert(!__is_nullptr(StructWithMembers *));
- static_assert(!__is_nullptr(void (*)()));
-
- static_assert(!__is_nullptr(void));
- static_assert(!__is_nullptr(cvoid));
- static_assert(!__is_nullptr(cvoid));
- static_assert(!__is_nullptr(char));
- static_assert(!__is_nullptr(int));
- static_assert(!__is_nullptr(int));
- static_assert(!__is_nullptr(ClassType));
- static_assert(!__is_nullptr(Derives));
- static_assert(!__is_nullptr(Enum));
- static_assert(!__is_nullptr(IntArNB));
- static_assert(!__is_nullptr(Union));
- static_assert(!__is_nullptr(UnionAr));
- static_assert(!__is_nullptr(StructWithMembers));
- static_assert(!__is_nullptr(int StructWithMembers::*));
- static_assert(!__is_nullptr(void(StructWithMembers::*)()));
-}
-
void is_member_object_pointer()
{
StructWithMembers x;
>From bd3b3b354fd3c94ef4f9eb9acd7f5bfd1beddbb1 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Wed, 31 Jul 2024 19:59:25 +0200
Subject: [PATCH 2/2] Add a release notes
---
clang/docs/ReleaseNotes.rst | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 0b79e952b48af..462e9754d402e 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -43,6 +43,10 @@ C/C++ Language Potentially Breaking Changes
C++ Specific Potentially Breaking Changes
-----------------------------------------
+- The type trait builtin ``__is_nullptr`` has been removed, since it has very
+ few users and can be written as ``__is_same(__remove_cv(T), decltype(nullptr))``,
+ which GCC supports as well.
+
ABI Changes in This Version
---------------------------
@@ -117,7 +121,7 @@ Improvements to Clang's diagnostics
- Some template related diagnostics have been improved.
.. code-block:: c++
-
+
void foo() { template <typename> int i; } // error: templates can only be declared in namespace or class scope
struct S {
More information about the cfe-commits
mailing list