[clang] 56eb15a - [Sema] Fix pointer-to-int-cast diagnostic for _Bool

Mark de Wever via cfe-commits cfe-commits at lists.llvm.org
Sat Feb 22 10:40:21 PST 2020


Author: Mark de Wever
Date: 2020-02-22T19:39:49+01:00
New Revision: 56eb15a1c71061043d50aa669407816bc08dfb5d

URL: https://github.com/llvm/llvm-project/commit/56eb15a1c71061043d50aa669407816bc08dfb5d
DIFF: https://github.com/llvm/llvm-project/commit/56eb15a1c71061043d50aa669407816bc08dfb5d.diff

LOG: [Sema] Fix pointer-to-int-cast diagnostic for _Bool

The diagnostic added in D72231 also shows a diagnostic when casting to a
_Bool. This is unwanted. This patch removes the diagnostic for _Bool types.

Differential Revision: https://reviews.llvm.org/D74860

Added: 
    

Modified: 
    clang/lib/Sema/SemaCast.cpp
    clang/test/Sema/MicrosoftExtensions.c
    clang/test/Sema/cast.c
    clang/test/SemaCXX/cstyle-cast.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp
index a89cc4be53aa..2b3b60e6bde4 100644
--- a/clang/lib/Sema/SemaCast.cpp
+++ b/clang/lib/Sema/SemaCast.cpp
@@ -2764,7 +2764,8 @@ void CastOperation::CheckCStyleCast() {
     }
 
     if ((Self.Context.getTypeSize(SrcType) >
-         Self.Context.getTypeSize(DestType))) {
+         Self.Context.getTypeSize(DestType)) &&
+        !DestType->isBooleanType()) {
       // C 6.3.2.3p6: Any pointer type may be converted to an integer type.
       // Except as previously specified, the result is implementation-defined.
       // If the result cannot be represented in the integer type, the behavior

diff  --git a/clang/test/Sema/MicrosoftExtensions.c b/clang/test/Sema/MicrosoftExtensions.c
index 6e784bfe6102..8e7087a57991 100644
--- a/clang/test/Sema/MicrosoftExtensions.c
+++ b/clang/test/Sema/MicrosoftExtensions.c
@@ -99,7 +99,7 @@ void pointer_to_integral_type_conv(char* ptr) {
    sh = (short)ptr; // expected-warning{{cast to smaller integer type 'short' from 'char *' is a Microsoft extension}}
 
    // This is valid ISO C.
-   _Bool b = (_Bool)ptr; // expected-warning{{cast to smaller integer type '_Bool' from 'char *' is a Microsoft extension}}
+   _Bool b = (_Bool)ptr;
 }
 
 typedef struct {

diff  --git a/clang/test/Sema/cast.c b/clang/test/Sema/cast.c
index f16064d78dd9..0c4fc7d129fc 100644
--- a/clang/test/Sema/cast.c
+++ b/clang/test/Sema/cast.c
@@ -151,7 +151,7 @@ void testCDouble(CDouble v) {
 }
 
 void testVoidPtr(VoidPtr v) {
-  (void) (Bool) v; // expected-warning{{cast to smaller integer type 'Bool' (aka '_Bool') from 'VoidPtr' (aka 'void *')}}
+  (void)(Bool) v;
   (void) (Int) v; // expected-warning{{cast to smaller integer type 'Int' (aka 'int') from 'VoidPtr' (aka 'void *')}}
   (void) (Long) v;
   (void) (VoidPtr) v;
@@ -160,12 +160,12 @@ void testVoidPtr(VoidPtr v) {
   // from other -Wpointer-to-int-cast warnings.
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wvoid-pointer-to-int-cast"
-  (void) (Bool) v; // no-warning
+  (void)(Int) v; // no-warning
 #pragma clang diagnostic pop
 }
 
 void testCharPtr(CharPtr v) {
-  (void) (Bool) v; // expected-warning{{cast to smaller integer type 'Bool' (aka '_Bool') from 'CharPtr' (aka 'char *')}}
+  (void)(Bool) v;
   (void) (Int) v; // expected-warning{{cast to smaller integer type 'Int' (aka 'int') from 'CharPtr' (aka 'char *')}}
   (void) (Long) v;
   (void) (VoidPtr) v;
@@ -174,7 +174,7 @@ void testCharPtr(CharPtr v) {
   // from other -Wpointer-to-int-cast warnings.
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wvoid-pointer-to-int-cast"
-  (void) (Bool) v; // expected-warning{{cast to smaller integer type 'Bool' (aka '_Bool') from 'CharPtr' (aka 'char *')}}
+  (void)(Int) v; // expected-warning{{cast to smaller integer type 'Int' (aka 'int') from 'CharPtr' (aka 'char *')}}
 #pragma clang diagnostic pop
 }
 

diff  --git a/clang/test/SemaCXX/cstyle-cast.cpp b/clang/test/SemaCXX/cstyle-cast.cpp
index 2327d7b51d97..32a6e205f769 100644
--- a/clang/test/SemaCXX/cstyle-cast.cpp
+++ b/clang/test/SemaCXX/cstyle-cast.cpp
@@ -178,6 +178,11 @@ void integral_conversion()
   fnptr fnp = (fnptr)(l);
   (void)(char)(fnp); // expected-error {{cast from pointer to smaller type 'char' loses information}}
   (void)(long)(fnp);
+
+  (void)(bool)((void*)0);
+  (void)(bool)((int*)0);
+  (void)(char)((void*)0); // expected-error {{cast from pointer to smaller type 'char' loses information}}
+  (void)(char)((int*)0);  // expected-error {{cast from pointer to smaller type 'char' loses information}}
 }
 
 void pointer_conversion()


        


More information about the cfe-commits mailing list