public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] Fix ICE on missing TypeParam within type context
@ 2022-06-08 12:39 Thomas Schwinge
  0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2022-06-08 12:39 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:bbf171c9d25becdf77087a9e7d2b9e4bde030e80

commit bbf171c9d25becdf77087a9e7d2b9e4bde030e80
Author: Philip Herron <philip.herron@embecosm.com>
Date:   Thu Apr 28 13:44:39 2022 +0100

    Fix ICE on missing TypeParam within type context
    
    During type-resolution we resolve/type-check traits in a query based way.
    So when we reference a trait we look it up as required but this left a case
    for the privacy pass where the type-context information on the trait when
    the trait was not used meant there was no type-checking performed on the
    trait.
    
    This patch adds an interface to directly resolve the trait when as we
    iterate the crate so we do it as required. There is already code in the
    trait resolver to check if we have already type-resolved this trait.
    
    Fixes #1128

Diff:
---
 gcc/rust/typecheck/rust-hir-trait-resolve.cc  | 27 +++++++++++++++++++++------
 gcc/rust/typecheck/rust-hir-trait-resolve.h   | 10 +++++++---
 gcc/rust/typecheck/rust-hir-type-check-item.h |  2 ++
 gcc/testsuite/rust/compile/issue-1128.rs      |  6 ++++++
 4 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
index 823cb76a02d..13edd8d1a6f 100644
--- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc
+++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
@@ -74,7 +74,14 @@ TraitReference *
 TraitResolver::Resolve (HIR::TypePath &path)
 {
   TraitResolver resolver;
-  return resolver.go (path);
+  return resolver.resolve_path (path);
+}
+
+TraitReference *
+TraitResolver::Resolve (HIR::Trait &trait)
+{
+  TraitResolver resolver;
+  return resolver.resolve_trait (&trait);
 }
 
 TraitReference *
@@ -84,10 +91,12 @@ TraitResolver::Lookup (HIR::TypePath &path)
   return resolver.lookup_path (path);
 }
 
-TraitResolver::TraitResolver () : TypeCheckBase () {}
+TraitResolver::TraitResolver ()
+  : TypeCheckBase (), resolved_trait_reference (nullptr)
+{}
 
 TraitReference *
-TraitResolver::go (HIR::TypePath &path)
+TraitResolver::resolve_path (HIR::TypePath &path)
 {
   NodeId ref;
   if (!resolver->lookup_resolved_type (path.get_mappings ().get_nodeid (),
@@ -110,8 +119,14 @@ TraitResolver::go (HIR::TypePath &path)
 
   rust_assert (resolved_item != nullptr);
   resolved_item->accept_vis (*this);
-  rust_assert (trait_reference != nullptr);
+  rust_assert (resolved_trait_reference != nullptr);
 
+  return resolve_trait (resolved_trait_reference);
+}
+
+TraitReference *
+TraitResolver::resolve_trait (HIR::Trait *trait_reference)
+{
   TraitReference *tref = &TraitReference::error_node ();
   if (context->lookup_trait_reference (
 	trait_reference->get_mappings ().get_defid (), &tref))
@@ -243,11 +258,11 @@ TraitResolver::lookup_path (HIR::TypePath &path)
 
   rust_assert (resolved_item != nullptr);
   resolved_item->accept_vis (*this);
-  rust_assert (trait_reference != nullptr);
+  rust_assert (resolved_trait_reference != nullptr);
 
   TraitReference *tref = &TraitReference::error_node ();
   if (context->lookup_trait_reference (
-	trait_reference->get_mappings ().get_defid (), &tref))
+	resolved_trait_reference->get_mappings ().get_defid (), &tref))
     {
       return tref;
     }
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.h b/gcc/rust/typecheck/rust-hir-trait-resolve.h
index 91e94ccab24..a73b67fc142 100644
--- a/gcc/rust/typecheck/rust-hir-trait-resolve.h
+++ b/gcc/rust/typecheck/rust-hir-trait-resolve.h
@@ -66,19 +66,23 @@ class TraitResolver : public TypeCheckBase
 public:
   static TraitReference *Resolve (HIR::TypePath &path);
 
+  static TraitReference *Resolve (HIR::Trait &trait);
+
   static TraitReference *Lookup (HIR::TypePath &path);
 
 private:
   TraitResolver ();
 
-  TraitReference *go (HIR::TypePath &path);
+  TraitReference *resolve_path (HIR::TypePath &path);
+
+  TraitReference *resolve_trait (HIR::Trait *trait_reference);
 
   TraitReference *lookup_path (HIR::TypePath &path);
 
-  HIR::Trait *trait_reference;
+  HIR::Trait *resolved_trait_reference;
 
 public:
-  void visit (HIR::Trait &trait) override { trait_reference = &trait; }
+  void visit (HIR::Trait &trait) override { resolved_trait_reference = &trait; }
 };
 
 } // namespace Resolver
diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.h b/gcc/rust/typecheck/rust-hir-type-check-item.h
index 9d3beae7a61..71b6b815e36 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-item.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-item.h
@@ -224,6 +224,8 @@ public:
       TypeCheckItem::Resolve (item.get ());
   }
 
+  void visit (HIR::Trait &trait) override { TraitResolver::Resolve (trait); }
+
 private:
   TypeCheckItem () : TypeCheckBase () {}
 };
diff --git a/gcc/testsuite/rust/compile/issue-1128.rs b/gcc/testsuite/rust/compile/issue-1128.rs
new file mode 100644
index 00000000000..462426b679d
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-1128.rs
@@ -0,0 +1,6 @@
+pub trait Hasher {
+    fn write(&mut self, bytes: &[u8]);
+    fn write_u8(&mut self, i: u8) {
+        self.write(&[i])
+    }
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-06-08 12:39 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-08 12:39 [gcc/devel/rust/master] Fix ICE on missing TypeParam within type context Thomas Schwinge

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).