Commit 56eb15a1 authored by Mark de Wever's avatar Mark de Wever
Browse files

[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
parent 7b44f042
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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 {
+4 −4
Original line number Diff line number Diff line
@@ -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
}

+5 −0
Original line number Diff line number Diff line
@@ -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()