aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2020-09-08 17:15:33 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2020-09-10 18:04:11 +0200
commit29ff25e70671ce2046aab5cf89bf519ec6cf2bed (patch)
tree0b0c7ca07dfe2772afb2b5f3b73b785e297efd3b
parente63eb26d22dbbbbb67f7f240ea5a7234cd2498cb (diff)
downloadgcc-29ff25e70671ce2046aab5cf89bf519ec6cf2bed.zip
gcc-29ff25e70671ce2046aab5cf89bf519ec6cf2bed.tar.gz
gcc-29ff25e70671ce2046aab5cf89bf519ec6cf2bed.tar.bz2
d: Warn when casting from a D class to a C++ class.
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.
-rw-r--r--gcc/d/d-convert.cc4
-rw-r--r--gcc/testsuite/gdc.dg/Waddress.d12
-rw-r--r--gcc/testsuite/gdc.dg/Wcastresult1.d18
-rw-r--r--gcc/testsuite/gdc.dg/Wcastresult2.d12
4 files changed, 44 insertions, 2 deletions
diff --git a/gcc/d/d-convert.cc b/gcc/d/d-convert.cc
index 5e3e855..40e84f0 100644
--- a/gcc/d/d-convert.cc
+++ b/gcc/d/d-convert.cc
@@ -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
index 0000000..74d7de8
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/Waddress.d
@@ -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
index 0000000..759b338
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/Wcastresult1.d
@@ -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
index 0000000..56d2dd2
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/Wcastresult2.d
@@ -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;
+}