]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix up erroneous template error recovery ICE [PR117826]
authorJakub Jelinek <jakub@redhat.com>
Wed, 4 Dec 2024 09:54:41 +0000 (10:54 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 4 Dec 2024 09:54:41 +0000 (10:54 +0100)
The testcase in the PR (which can't be easily reduced and is
way too large and has way too many errors) results in an ICE,
because the erroneous_templates hash_map holds trees of erroneous
templates across ggc_collect and some of the templates in there
could be removed, so the later lookup can crash on comparison of
already freed and reused trees.

The following patch makes the hash_map GTY((cache)) marked.
The cp-tree.h changes before the erroneous_template declaration
are needed to make gengtype happy, it didn't like using
directive nor using a template-id as a template parameter.

It is marked cache because if a decl would be solely referenced from
the erroneous_templates hash_map, then nothing would look it up.

2024-12-04  Jakub Jelinek  <jakub@redhat.com>

PR c++/117826
* cp-tree.h (struct decl_location_traits): New type.
(erroneous_templates_t): Change using into typedef.
(erroneous_templates): Add GTY((cache)).
* error.cc (cp_adjust_diagnostic_info): Use
hash_map_safe_get_or_insert<true> rather than
hash_map_safe_get_or_insert<false> for erroneous_templates.

gcc/cp/cp-tree.h
gcc/cp/error.cc

index 0d6fce0f08b878ed3bcc223a83a322120c94798e..29f28d5e38338145804d902b1b07c076d072a069 100644 (file)
@@ -7222,9 +7222,10 @@ extern location_t location_of                   (tree);
 extern void qualified_name_lookup_error                (tree, tree, tree,
                                                 location_t);
 
-using erroneous_templates_t
-  = hash_map<tree, location_t, simple_hashmap_traits<tree_decl_hash, location_t>>;
-extern erroneous_templates_t *erroneous_templates;
+struct decl_location_traits
+  : simple_cache_map_traits<tree_decl_hash, location_t> { };
+typedef hash_map<tree, location_t, decl_location_traits> erroneous_templates_t;
+extern GTY((cache)) erroneous_templates_t *erroneous_templates;
 
 extern bool cp_seen_error ();
 #define seen_error() cp_seen_error ()
index 10d7f46346a87138253996ddee3e9b94fe95bb15..ce8d5b15ac040382972933ffb9ac4b6d612ee2d7 100644 (file)
@@ -237,8 +237,8 @@ cp_adjust_diagnostic_info (diagnostic_context *context,
 
        bool existed;
        location_t &error_loc
-         = hash_map_safe_get_or_insert<false> (erroneous_templates,
-                                               tmpl, &existed);
+         = hash_map_safe_get_or_insert<true> (erroneous_templates,
+                                              tmpl, &existed);
        if (!existed)
          /* Remember that this template had a parse-time error so
             that we'll ensure a hard error has been issued upon