diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-05-09 13:21:05 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-05-10 12:08:14 +0100 |
commit | 4fd7b3c089191b720d9bc0cf6634fbc8c54450a4 (patch) | |
tree | deefc472327be4e4faa7fc282dc82ccb8d5af66a | |
parent | 7e66d683186ffdcca835bad1a90081fe56be8822 (diff) | |
download | gcc-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.h | 12 | ||||
-rw-r--r-- | gcc/testsuite/rust.test/compile/generics28.rs | 18 |
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); +} |