]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/115232 - demangle failure during -Waccess
authorRichard Biener <rguenther@suse.de>
Mon, 27 May 2024 07:13:11 +0000 (09:13 +0200)
committerRichard Biener <rguenther@suse.de>
Mon, 27 May 2024 09:24:04 +0000 (11:24 +0200)
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.

gcc/gimple-ssa-warn-access.cc
gcc/testsuite/g++.dg/pr115232.C [new file with mode: 0644]

index 0cd5b6d6ef48532b4957333c186b3145d6e2e362..61f9f0f3d3100ef32e1c4d4ec393afdcd4956796 100644 (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;
diff --git a/gcc/testsuite/g++.dg/pr115232.C b/gcc/testsuite/g++.dg/pr115232.C
new file mode 100644 (file)
index 0000000..e1d96d8
--- /dev/null
@@ -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>();
+}