diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc index dedaae27b31..194d1a2c02a 100644 --- a/gcc/gimple-ssa-warn-access.cc +++ b/gcc/gimple-ssa-warn-access.cc @@ -1762,7 +1762,7 @@ new_delete_mismatch_p (tree new_decl, tree delete_decl) void *np = NULL, *dp = NULL; demangle_component *ndc = cplus_demangle_v3_components (new_str, 0, &np); demangle_component *ddc = cplus_demangle_v3_components (del_str, 0, &dp); - bool mismatch = new_delete_mismatch_p (*ndc, *ddc); + bool mismatch = ndc && ddc && new_delete_mismatch_p (*ndc, *ddc); free (np); free (dp); return mismatch; diff --git a/gcc/testsuite/g++.dg/pr115232.C b/gcc/testsuite/g++.dg/pr115232.C new file mode 100644 index 00000000000..e1d96d8f899 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr115232.C @@ -0,0 +1,25 @@ +// { dg-do compile } +// { dg-require-effective-target c++20 } + +using size_t = decltype(sizeof(0)); +template +static constexpr bool cst = true; +template +struct Outer +{ + Outer(); + template void method() requires cst + { + struct Inner + { + static void* operator new(size_t){return new char;} + static void operator delete(void*){} + Outer t; + }; + new Inner; + } +}; +void f() +{ + Outer{}.method(); +}