aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-05-09 13:21:05 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-05-10 12:08:14 +0100
commit4fd7b3c089191b720d9bc0cf6634fbc8c54450a4 (patch)
treedeefc472327be4e4faa7fc282dc82ccb8d5af66a
parent7e66d683186ffdcca835bad1a90081fe56be8822 (diff)
downloadgcc-4fd7b3c089191b720d9bc0cf6634fbc8c54450a4.zip
gcc-4fd7b3c089191b720d9bc0cf6634fbc8c54450a4.tar.gz
gcc-4fd7b3c089191b720d9bc0cf6634fbc8c54450a4.tar.bz2
Ensure we lower the generic params for impl items
Inherit impl items can have generic parameters and must be preserved into the HIR trees in order for the type params to be resolved. Fixes #417
-rw-r--r--gcc/rust/hir/rust-ast-lower-implitem.h12
-rw-r--r--gcc/testsuite/rust.test/compile/generics28.rs18
2 files changed, 28 insertions, 2 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-implitem.h b/gcc/rust/hir/rust-ast-lower-implitem.h
index 3ddc62c..2581d68e 100644
--- a/gcc/rust/hir/rust-ast-lower-implitem.h
+++ b/gcc/rust/hir/rust-ast-lower-implitem.h
@@ -86,7 +86,6 @@ public:
void visit (AST::Function &function) override
{
// ignore for now and leave empty
- std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
std::vector<HIR::Attribute> outer_attrs;
std::vector<std::unique_ptr<HIR::WhereClauseItem> > where_clause_items;
HIR::WhereClause where_clause (std::move (where_clause_items));
@@ -95,6 +94,11 @@ public:
HIR::Visibility vis = HIR::Visibility::create_public ();
// need
+ std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
+ if (function.has_generics ())
+ {
+ generic_params = lower_generic_params (function.get_generic_params ());
+ }
Identifier function_name = function.get_function_name ();
Location locus = function.get_locus ();
@@ -165,7 +169,6 @@ public:
void visit (AST::Method &method) override
{
// ignore for now and leave empty
- std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
std::vector<HIR::Attribute> outer_attrs;
std::vector<std::unique_ptr<HIR::WhereClauseItem> > where_clause_items;
HIR::WhereClause where_clause (std::move (where_clause_items));
@@ -174,6 +177,11 @@ public:
HIR::Visibility vis = HIR::Visibility::create_public ();
// need
+ std::vector<std::unique_ptr<HIR::GenericParam> > generic_params;
+ if (method.has_generics ())
+ {
+ generic_params = lower_generic_params (method.get_generic_params ());
+ }
Identifier method_name = method.get_method_name ();
Location locus = method.get_locus ();
diff --git a/gcc/testsuite/rust.test/compile/generics28.rs b/gcc/testsuite/rust.test/compile/generics28.rs
new file mode 100644
index 0000000..8cee8b0
--- /dev/null
+++ b/gcc/testsuite/rust.test/compile/generics28.rs
@@ -0,0 +1,18 @@
+struct Foo<A, B>(A, B);
+
+impl Foo<i32, f32> {
+ fn test<X>(a: X) -> X {
+ a
+ }
+}
+
+fn main() {
+ let a;
+ a = Foo::test::<_>(123);
+
+ let b;
+ b = Foo::test::<bool>(true);
+
+ let c;
+ c = Foo::test(456f32);
+}