So DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE is not being handled
from the demangler in new_delete_mismatch_p. This adds the handling,
just like DEMANGLE_COMPONENT_BUILTIN_TYPE as there is no simple way
to compare the type you have to call into the demanager to do it
instead.
Bootstrapped and tested on x86_64-linux-gnu.
PR tree-optimization/123849
gcc/ChangeLog:
* gimple-ssa-warn-access.cc (new_delete_mismatch_p): Handle
DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE like
DEMANGLE_COMPONENT_BUILTIN_TYPE.
gcc/testsuite/ChangeLog:
* g++.dg/warn/Wmismatched-new-delete-11.C: New test.
Signed-off-by: Andrew Pinski <[email protected]>
---
gcc/gimple-ssa-warn-access.cc | 1 +
.../g++.dg/warn/Wmismatched-new-delete-11.C | 45 +++++++++++++++++++
2 files changed, 46 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-11.C
diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc
index df34da2bf96..c8f10cae32f 100644
--- a/gcc/gimple-ssa-warn-access.cc
+++ b/gcc/gimple-ssa-warn-access.cc
@@ -1701,6 +1701,7 @@ new_delete_mismatch_p (const demangle_component &newc,
return new_delete_mismatch_p (*newc.u.s_dtor.name,
*delc.u.s_dtor.name);
+ case DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE:
case DEMANGLE_COMPONENT_BUILTIN_TYPE:
{
/* The demangler API provides no better way to compare built-in
diff --git a/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-11.C
b/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-11.C
new file mode 100644
index 00000000000..8191a812058
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-11.C
@@ -0,0 +1,45 @@
+// PR tree-optimization/123849
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wall" }
+// { dg-add-options float16 }
+// { dg-require-effective-target float16 }
+
+#include <new>
+
+template<typename Derived> class MatrixBase
+{
+public:
+ MatrixBase();
+};
+
+template<typename Derived>
+class PlainObjectBase : public MatrixBase<Derived>
+{
+public:
+ void *operator new(std::size_t size);
+ void operator delete(void * ptr);
+};
+
+template<typename _Scalar>
+class Matrix
+ : public PlainObjectBase<Matrix<_Scalar> >
+{
+};
+
+template<typename T>
+struct resource
+{
+ T& makeref() const
+ {
+ T* ret = new T;
+ return *ret;
+ }
+};
+
+
+using T = Matrix<_Float16>;
+
+void func(resource<T>& A)
+{
+ (void)A.makeref();
+}
--
2.43.0