]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
SARIF output: fix diagnostics within C++ member fns [PR122626]
authorDavid Malcolm <dmalcolm@redhat.com>
Mon, 17 Nov 2025 19:08:59 +0000 (14:08 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Mon, 17 Nov 2025 19:08:59 +0000 (14:08 -0500)
When building hierarchical logical locations, we were stopping traveral
upwards before any TRANSLATION_UNIT_DECL for decls, but not for types,
leading to an assertion failure when producing SARIF output for
diagnostics within C++ member fns.

Fixed thusly.

gcc/testsuite/ChangeLog:
PR analyzer/122626
* g++.dg/analyzer/malloc.C: Add sarif output to verify the fix for
PR analyzer/122626.

gcc/ChangeLog:
PR analyzer/122626
* tree-logical-location.cc
(tree_logical_location_manager::get_parent): Return null when
TYPE_CONTEXT is a TRANSLATION_UNIT_DECL so that we don't fail
the assertion in assert_valid_tree.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
gcc/testsuite/g++.dg/analyzer/malloc.C
gcc/tree-logical-location.cc

index d4ef831fe623aadcb8da27f8f186074bf93fdff8..f2da9884466edad9743441e61cf332168c172005 100644 (file)
@@ -1,6 +1,9 @@
 // { dg-do compile }
 /* { dg-skip-if "requires hosted libstdc++ for stdlib free" { ! hostedlib } } */
 
+/* Verify we don't ICE on SARIF output (PR analyzer/122626).  */
+/* { dg-additional-options "-fdiagnostics-add-output=sarif" } */
+
 #include <stdlib.h>
 
 void test_1 (void *ptr)
@@ -24,3 +27,5 @@ void test_2 (void *ptr)
   free (ptr); // { dg-message "first 'free' here" }
   s2 a (ptr); // { dg-message "passing freed pointer 'ptr' in call to 's2::s2' from 'test_2'" }
 }
+
+/* { dg-final { verify-sarif-file } } */
index b39327feca5ea4d64105c1ab0344def3c662245a..879bdf1df69ee20da3689f5bd64eb29620a0a952 100644 (file)
@@ -152,6 +152,8 @@ tree_logical_location_manager::get_parent (key k) const
     {
       if (!TYPE_CONTEXT (node))
        return key ();
+      if (TREE_CODE (TYPE_CONTEXT (node)) == TRANSLATION_UNIT_DECL)
+       return key ();
       return key_from_tree (TYPE_CONTEXT (node));
     }
   return key ();