aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-04-21 18:57:24 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-04-21 18:57:24 +0100
commit0d4fc557c7f1e8e645354d7e40b955a7a03b52d0 (patch)
tree1da88098c403662906918dc27570f6e5040e71ca /gcc
parentfc22f12c9c707b258f35a1bab0e8154441b972b8 (diff)
downloadgcc-0d4fc557c7f1e8e645354d7e40b955a7a03b52d0.zip
gcc-0d4fc557c7f1e8e645354d7e40b955a7a03b52d0.tar.gz
gcc-0d4fc557c7f1e8e645354d7e40b955a7a03b52d0.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.h14
-rw-r--r--gcc/testsuite/rust/compile/issue-1131.rs4
2 files changed, 18 insertions, 0 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h
index 5d32c00..f662d5d 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 0000000..fd158ab
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-1131.rs
@@ -0,0 +1,4 @@
+extern "rust-intrinsic" {
+ fn size_of<T>() -> usize;
+ fn offset<T>(dst: *const T, offset: isize) -> *const T;
+}