From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id A58D838887A8; Wed, 8 Jun 2022 12:34:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A58D838887A8 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/rust/master] Fix generic param redefined bug X-Act-Checkin: gcc X-Git-Author: Philip Herron X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: fc22f12c9c707b258f35a1bab0e8154441b972b8 X-Git-Newrev: 0d4fc557c7f1e8e645354d7e40b955a7a03b52d0 Message-Id: <20220608123424.A58D838887A8@sourceware.org> Date: Wed, 8 Jun 2022 12:34:24 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Jun 2022 12:34:24 -0000 https://gcc.gnu.org/g:0d4fc557c7f1e8e645354d7e40b955a7a03b52d0 commit 0d4fc557c7f1e8e645354d7e40b955a7a03b52d0 Author: Philip Herron Date: Thu Apr 21 18:57:24 2022 +0100 Fix generic param redefined bug When we name-resolve generic parameters their declaration gets inserted in to the upper-most rib on the stack. Then when this is referenced we lookup the relevant binding starting from the uppermost rib this lead to the 2nd extern item adding the same binding into the same rib which caused this clash. To fix this we need to have a seperate rib for each declaration so as reusing the same names don't clash with each other. Fixes #1131 Diff: --- gcc/rust/resolve/rust-ast-resolve-item.h | 14 ++++++++++++++ gcc/testsuite/rust/compile/issue-1131.rs | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h index 5d32c0022d0..f662d5df507 100644 --- a/gcc/rust/resolve/rust-ast-resolve-item.h +++ b/gcc/rust/resolve/rust-ast-resolve-item.h @@ -955,6 +955,15 @@ public: void visit (AST::ExternalFunctionItem &function) override { + NodeId scope_node_id = function.get_node_id (); + resolver->get_name_scope ().push (scope_node_id); + resolver->get_type_scope ().push (scope_node_id); + resolver->get_label_scope ().push (scope_node_id); + resolver->push_new_name_rib (resolver->get_name_scope ().peek ()); + resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); + resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); + + // resolve the generics if (function.has_generics ()) { for (auto &generic : function.get_generic_params ()) @@ -971,6 +980,11 @@ public: { ResolveType::go (param.get_type ().get (), param.get_node_id ()); } + + // done + resolver->get_name_scope ().pop (); + resolver->get_type_scope ().pop (); + resolver->get_label_scope ().pop (); } void visit (AST::ExternalStaticItem &item) override diff --git a/gcc/testsuite/rust/compile/issue-1131.rs b/gcc/testsuite/rust/compile/issue-1131.rs new file mode 100644 index 00000000000..fd158abc700 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-1131.rs @@ -0,0 +1,4 @@ +extern "rust-intrinsic" { + fn size_of() -> usize; + fn offset(dst: *const T, offset: isize) -> *const T; +}