aeubanks created this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. aeubanks added reviewers: rnk, thakis, Mordante.
MSVC also warns on this: $ cat /tmp/a.c int f(void* p) { return (int) p; } $ cl /c /tmp/a.c C:/src/tmp/a.c(1): warning C4311: 'type cast': pointer truncation from 'void *' to 'int' Warnings originally added in https://reviews.llvm.org/D72231. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D75643 Files: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaCast.cpp clang/test/Sema/MicrosoftExtensions.c Index: clang/test/Sema/MicrosoftExtensions.c =================================================================== --- clang/test/Sema/MicrosoftExtensions.c +++ clang/test/Sema/MicrosoftExtensions.c @@ -1,5 +1,4 @@ -// RUN: %clang_cc1 -triple i686-windows %s -fsyntax-only -Wno-unused-value -Wmicrosoft -verify -fms-extensions - +// RUN: %clang_cc1 -triple i686-windows %s -fsyntax-only -Wno-unused-value -Wno-pointer-to-int-cast -Wmicrosoft -verify -fms-extensions struct A { @@ -93,13 +92,13 @@ }; void pointer_to_integral_type_conv(char* ptr) { - char ch = (char)ptr; // expected-warning{{cast to smaller integer type 'char' from 'char *' is a Microsoft extension}} - short sh = (short)ptr; // expected-warning{{cast to smaller integer type 'short' from 'char *' is a Microsoft extension}} - ch = (char)ptr; // expected-warning{{cast to smaller integer type 'char' from 'char *' is a Microsoft extension}} - sh = (short)ptr; // expected-warning{{cast to smaller integer type 'short' from 'char *' is a Microsoft extension}} + char ch = (char)ptr; + short sh = (short)ptr; + ch = (char)ptr; + sh = (short)ptr; - // This is valid ISO C. - _Bool b = (_Bool)ptr; + // This is valid ISO C. + _Bool b = (_Bool)ptr; } typedef struct { Index: clang/lib/Sema/SemaCast.cpp =================================================================== --- clang/lib/Sema/SemaCast.cpp +++ clang/lib/Sema/SemaCast.cpp @@ -2771,11 +2771,9 @@ // 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 = SrcType->isVoidPointerType() + ? diag::warn_void_pointer_to_int_cast + : 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 @@ -3672,9 +3672,6 @@ def warn_void_pointer_to_int_cast : Warning< "cast to smaller integer type %1 from %0">, InGroup<VoidPointerToIntCast>; -def ext_ms_pointer_to_int_cast : ExtWarn< - "cast to smaller integer type %1 from %0 is a Microsoft extension">, -InGroup<MicrosoftCast>; def warn_attribute_ignored_for_field_of_type : Warning< "%0 attribute ignored for field of type %1">,
Index: clang/test/Sema/MicrosoftExtensions.c =================================================================== --- clang/test/Sema/MicrosoftExtensions.c +++ clang/test/Sema/MicrosoftExtensions.c @@ -1,5 +1,4 @@ -// RUN: %clang_cc1 -triple i686-windows %s -fsyntax-only -Wno-unused-value -Wmicrosoft -verify -fms-extensions - +// RUN: %clang_cc1 -triple i686-windows %s -fsyntax-only -Wno-unused-value -Wno-pointer-to-int-cast -Wmicrosoft -verify -fms-extensions struct A { @@ -93,13 +92,13 @@ }; void pointer_to_integral_type_conv(char* ptr) { - char ch = (char)ptr; // expected-warning{{cast to smaller integer type 'char' from 'char *' is a Microsoft extension}} - short sh = (short)ptr; // expected-warning{{cast to smaller integer type 'short' from 'char *' is a Microsoft extension}} - ch = (char)ptr; // expected-warning{{cast to smaller integer type 'char' from 'char *' is a Microsoft extension}} - sh = (short)ptr; // expected-warning{{cast to smaller integer type 'short' from 'char *' is a Microsoft extension}} + char ch = (char)ptr; + short sh = (short)ptr; + ch = (char)ptr; + sh = (short)ptr; - // This is valid ISO C. - _Bool b = (_Bool)ptr; + // This is valid ISO C. + _Bool b = (_Bool)ptr; } typedef struct { Index: clang/lib/Sema/SemaCast.cpp =================================================================== --- clang/lib/Sema/SemaCast.cpp +++ clang/lib/Sema/SemaCast.cpp @@ -2771,11 +2771,9 @@ // 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 = SrcType->isVoidPointerType() + ? diag::warn_void_pointer_to_int_cast + : 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 @@ -3672,9 +3672,6 @@ def warn_void_pointer_to_int_cast : Warning< "cast to smaller integer type %1 from %0">, InGroup<VoidPointerToIntCast>; -def ext_ms_pointer_to_int_cast : ExtWarn< - "cast to smaller integer type %1 from %0 is a Microsoft extension">, -InGroup<MicrosoftCast>; def warn_attribute_ignored_for_field_of_type : Warning< "%0 attribute ignored for field of type %1">,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits