From: Philip Herron <[email protected]>
With simple patterns we dont introduce any more inference varaibles as
they are already declared in a specific way. This would only lead to
more unconstrained inference varaibles than is required.
Fixes Rust-GCC#3022
gcc/rust/ChangeLog:
* hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_self): add
location mappings
* typecheck/rust-hir-type-check-path.cc
(TypeCheckExpr::resolve_root_path): check for self
gcc/testsuite/ChangeLog:
* rust/compile/issue-3022.rs: New test.
Signed-off-by: Philip Herron <[email protected]>
---
gcc/rust/hir/rust-ast-lower-base.cc | 1 +
gcc/rust/typecheck/rust-hir-type-check-path.cc | 5 ++++-
gcc/testsuite/rust/compile/issue-3022.rs | 18 ++++++++++++++++++
3 files changed, 23 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/rust/compile/issue-3022.rs
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc
b/gcc/rust/hir/rust-ast-lower-base.cc
index 35a25093b73..add02747b0a 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -666,6 +666,7 @@ ASTLoweringBase::lower_self (AST::Param ¶m)
Analysis::NodeMapping mapping (crate_num, self.get_node_id (),
mappings.get_next_hir_id (crate_num),
mappings.get_next_localdef_id (crate_num));
+ mappings.insert_location (mapping.get_hirid (), param.get_locus ());
if (self.has_type ())
{
diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc
b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index a5243631fbd..33570ffa1c7 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -312,6 +312,8 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression
&expr, size_t *offset,
auto seg_is_module = mappings.lookup_module (ref).has_value ();
auto seg_is_crate = mappings.is_local_hirid_crate (ref);
auto seg_is_pattern = mappings.lookup_hir_pattern (ref).has_value ();
+ auto seg_is_self = is_root && !have_more_segments
+ && seg.get_segment ().as_string () == "self";
if (seg_is_module || seg_is_crate)
{
// A::B::C::this_is_a_module::D::E::F
@@ -388,7 +390,8 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression
&expr, size_t *offset,
if (lookup->get_kind () == TyTy::TypeKind::ERROR)
return new TyTy::ErrorType (expr.get_mappings ().get_hirid ());
}
- else if (lookup->needs_generic_substitutions () && !seg_is_pattern)
+ else if (lookup->needs_generic_substitutions () && !seg_is_pattern
+ && !seg_is_self)
{
lookup = SubstMapper::InferSubst (lookup, expr.get_locus ());
}
diff --git a/gcc/testsuite/rust/compile/issue-3022.rs
b/gcc/testsuite/rust/compile/issue-3022.rs
new file mode 100644
index 00000000000..b8b8e6fd5c7
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3022.rs
@@ -0,0 +1,18 @@
+#[lang = "sized"]
+trait Sized {}
+
+trait Foo<T> {
+ fn foo(self) -> T;
+}
+
+struct Bar<T, U> {
+ // { dg-warning "struct is never constructed" "" { target *-*-* } .-1 }
+ value: U,
+ valte: T,
+}
+
+impl<T: Foo<U>, U> Foo<U> for Bar<T, U> {
+ fn foo(self) -> U {
+ self.value
+ }
+}
--
2.45.2