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).