https://gcc.gnu.org/g:5957ce932fc83b778d6881a375d50147ac6ca9bd
commit r16-7100-g5957ce932fc83b778d6881a375d50147ac6ca9bd Author: Andrew Pinski <[email protected]> Date: Tue Jan 27 16:55:45 2026 -0800 waccess: Fix handling of extended builtin types [PR123849] 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]> Diff: --- gcc/gimple-ssa-warn-access.cc | 1 + .../g++.dg/warn/Wmismatched-new-delete-11.C | 45 ++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc index df34da2bf960..c8f10cae32f5 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 000000000000..8191a812058c --- /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(); +}
