[PATCH] D75758: [Sema] Add -Wpointer-to-enum-cast and -Wvoid-pointer-to-enum-cast
Nathan Chancellor via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 6 13:51:10 PST 2020
nathanchance updated this revision to Diff 248824.
nathanchance edited the summary of this revision.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75758/new/
https://reviews.llvm.org/D75758
Files:
clang/include/clang/Basic/DiagnosticGroups.td
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaCast.cpp
clang/test/Sema/cast.c
Index: clang/test/Sema/cast.c
===================================================================
--- clang/test/Sema/cast.c
+++ clang/test/Sema/cast.c
@@ -186,3 +186,23 @@
void *intToPointerCast3() {
return (void*)(1 + 3);
}
+
+void voidPointerToEnumCast(VoidPtr v) {
+ (void)(X) v; // expected-warning{{cast to smaller integer type 'X' from 'VoidPtr' (aka 'void *')}}
+ // Test that casts to void* can be controlled separately
+ // from other -Wpointer-to-enum-cast warnings.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wvoid-pointer-to-enum-cast"
+ (void)(X) v; // no-warning
+#pragma clang diagnostic pop
+}
+
+void pointerToEnumCast(CharPtr v) {
+ (void)(X) v; // expected-warning{{cast to smaller integer type 'X' from 'CharPtr' (aka 'char *')}}
+ // Test that casts to void* can be controlled separately
+ // from other -Wpointer-to-enum-cast warnings.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wvoid-pointer-to-enum-cast"
+ (void)(X) v; // expected-warning{{cast to smaller integer type 'X' from 'CharPtr' (aka 'char *')}}
+#pragma clang diagnostic pop
+}
Index: clang/lib/Sema/SemaCast.cpp
===================================================================
--- clang/lib/Sema/SemaCast.cpp
+++ clang/lib/Sema/SemaCast.cpp
@@ -2777,11 +2777,18 @@
// If the result cannot be represented in the integer type, the behavior
// is undefined. The result need not be in the range of values of any
// integer type.
- unsigned Diag = Self.getLangOpts().MicrosoftExt
- ? diag::ext_ms_pointer_to_int_cast
- : SrcType->isVoidPointerType()
- ? diag::warn_void_pointer_to_int_cast
- : diag::warn_pointer_to_int_cast;
+ unsigned Diag;
+ if (Self.getLangOpts().MicrosoftExt)
+ Diag = diag::ext_ms_pointer_to_int_cast;
+ else if (SrcType->isVoidPointerType())
+ if (DestType->isEnumeralType())
+ Diag = diag::warn_void_pointer_to_enum_cast;
+ else
+ Diag = diag::warn_void_pointer_to_int_cast;
+ else if (DestType->isEnumeralType())
+ Diag = diag::warn_pointer_to_enum_cast;
+ else
+ Diag = diag::warn_pointer_to_int_cast;
Self.Diag(OpRange.getBegin(), Diag) << SrcType << DestType << OpRange;
}
}
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -3669,9 +3669,15 @@
def warn_pointer_to_int_cast : Warning<
"cast to smaller integer type %1 from %0">,
InGroup<PointerToIntCast>;
+def warn_pointer_to_enum_cast : Warning<
+ warn_pointer_to_int_cast.Text>,
+ InGroup<PointerToEnumCast>;
def warn_void_pointer_to_int_cast : Warning<
"cast to smaller integer type %1 from %0">,
InGroup<VoidPointerToIntCast>;
+def warn_void_pointer_to_enum_cast : Warning<
+ warn_void_pointer_to_int_cast.Text>,
+ InGroup<VoidPointerToEnumCast>;
def ext_ms_pointer_to_int_cast : ExtWarn<
"cast to smaller integer type %1 from %0 is a Microsoft extension">,
InGroup<MicrosoftCast>;
Index: clang/include/clang/Basic/DiagnosticGroups.td
===================================================================
--- clang/include/clang/Basic/DiagnosticGroups.td
+++ clang/include/clang/Basic/DiagnosticGroups.td
@@ -838,9 +838,13 @@
def IntToVoidPointerCast : DiagGroup<"int-to-void-pointer-cast">;
def IntToPointerCast : DiagGroup<"int-to-pointer-cast",
[IntToVoidPointerCast]>;
-def VoidPointerToIntCast : DiagGroup<"void-pointer-to-int-cast">;
+def VoidPointerToEnumCast : DiagGroup<"void-pointer-to-enum-cast">;
+def VoidPointerToIntCast : DiagGroup<"void-pointer-to-int-cast",
+ [VoidPointerToEnumCast]>;
+def PointerToEnumCast : DiagGroup<"pointer-to-enum-cast",
+ [VoidPointerToEnumCast]>;
def PointerToIntCast : DiagGroup<"pointer-to-int-cast",
- [VoidPointerToIntCast]>;
+ [PointerToEnumCast, VoidPointerToIntCast]>;
def Move : DiagGroup<"move", [
PessimizingMove,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D75758.248824.patch
Type: text/x-patch
Size: 4310 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200306/af48b518/attachment-0001.bin>
More information about the cfe-commits
mailing list