d: Warn when casting from a D class to a C++ class.
authorIain Buclaw <ibuclaw@gdcproject.org>
Tue, 8 Sep 2020 15:15:33 +0000 (17:15 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Thu, 10 Sep 2020 16:04:11 +0000 (18:04 +0200)
Before, the warning was only issued when casting in the other direction.
Now a warning is printed for both directions.

gcc/d/ChangeLog:

* d-convert.cc (convert_expr): Warn when casting from a D class to a
C++ class.

gcc/testsuite/ChangeLog:

* gdc.dg/Waddress.d: New test.
* gdc.dg/Wcastresult1.d: New test.
* gdc.dg/Wcastresult2.d: New test.

gcc/d/d-convert.cc
gcc/testsuite/gdc.dg/Waddress.d [new file with mode: 0644]
gcc/testsuite/gdc.dg/Wcastresult1.d [new file with mode: 0644]
gcc/testsuite/gdc.dg/Wcastresult2.d [new file with mode: 0644]

index 5e3e855b2cb6c561b3fded9576128941269438a0..40e84f053470594f18af6e77c0db14257a588ff9 100644 (file)
@@ -430,10 +430,10 @@ convert_expr (tree exp, Type *etype, Type *totype)
              /* d_convert will make a no-op cast.  */
              break;
            }
-         else if (cdfrom->isCPPclass ())
+         else if (cdfrom->isCPPclass () || cdto->isCPPclass ())
            {
              /* Downcasting in C++ is a no-op.  */
-             if (cdto->isCPPclass ())
+             if (cdfrom->isCPPclass () && cdto->isCPPclass ())
                break;
 
              /* Casting from a C++ interface to a class/non-C++ interface
diff --git a/gcc/testsuite/gdc.dg/Waddress.d b/gcc/testsuite/gdc.dg/Waddress.d
new file mode 100644 (file)
index 0000000..74d7de8
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-Waddress" }
+
+void* ptr;
+
+int test()
+{
+    if (&ptr) // { dg-warning "the address of 'ptr' will always evaluate as 'true'" }
+        return 1;
+
+    return 0;
+}
diff --git a/gcc/testsuite/gdc.dg/Wcastresult1.d b/gcc/testsuite/gdc.dg/Wcastresult1.d
new file mode 100644 (file)
index 0000000..759b338
--- /dev/null
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-options "-Wcast-result" }
+
+extern(C++) class CPPClass
+{
+    int a;
+}
+
+extern(D) class DClass
+{
+    int a;
+}
+
+void test()
+{
+    auto cpptod = cast(DClass)new CPPClass; // { dg-warning "cast to 'Wcastresult1.DClass' will produce null result" }
+    auto dtocpp = cast(CPPClass)new DClass; // { dg-warning "cast to 'Wcastresult1.CPPClass' will produce null result" }
+}
diff --git a/gcc/testsuite/gdc.dg/Wcastresult2.d b/gcc/testsuite/gdc.dg/Wcastresult2.d
new file mode 100644 (file)
index 0000000..56d2dd2
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-Wcast-result" }
+
+void test()
+{
+    auto imvalue = 1.23i;
+    auto revalue = 1.23;
+
+    auto imtore = cast(double)imvalue; // { dg-warning "cast from 'idouble' to 'double' will produce zero result" }
+    auto retoim = cast(idouble)revalue; // { dg-warning "cast from 'double' to 'idouble' will produce zero result" }
+    return;
+}