tree-optimization/115232 - demangle failure during -Waccess

For the following testcase we fail to demangle
_ZZN5OuterIvE6methodIvEEvvQ3cstITL0__EEN5InnernwEm and
_ZZN5OuterIvE6methodIvEEvvQ3cstITL0__EEN5InnerdlEPv and in turn end
up building NULL references.  The following puts in a safeguard for
faile demangling into -Waccess.

	PR tree-optimization/115232
	* gimple-ssa-warn-access.cc (new_delete_mismatch_p): Handle
	failure to demangle gracefully.

	* g++.dg/pr115232.C: New testcase.

(cherry picked from commit 311d7f5c17b8969c7ed8e4f23178d6ec4752e33f)
This commit is contained in:
Richard Biener 2024-05-27 09:13:11 +02:00
parent 0cae44a288
commit 4790076933
2 changed files with 26 additions and 1 deletions

View file

@ -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;

View file

@ -0,0 +1,25 @@
// { dg-do compile }
// { dg-require-effective-target c++20 }
using size_t = decltype(sizeof(0));
template <class U>
static constexpr bool cst = true;
template<class T>
struct Outer
{
Outer();
template <class U> void method() requires cst<U>
{
struct Inner
{
static void* operator new(size_t){return new char;}
static void operator delete(void*){}
Outer<void> t;
};
new Inner;
}
};
void f()
{
Outer<void>{}.method<void>();
}