aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-04-22 09:31:08 +0000
committerGitHub <noreply@github.com>2022-04-22 09:31:08 +0000
commitf0b6dca3fcd6f435a0c0fc5c60c4bfba088930dd (patch)
treeb313d302580ea5261a4a65c8ea893ac360201802
parent243ef0dfe713a9fc8d4d80feb488a58b2639f39f (diff)
parent0d4fc557c7f1e8e645354d7e40b955a7a03b52d0 (diff)
downloadgcc-f0b6dca3fcd6f435a0c0fc5c60c4bfba088930dd.zip
gcc-f0b6dca3fcd6f435a0c0fc5c60c4bfba088930dd.tar.gz
gcc-f0b6dca3fcd6f435a0c0fc5c60c4bfba088930dd.tar.bz2
Merge #1145
1145: Fix generic param redefined bug r=philberty a=philberty 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 Co-authored-by: Philip Herron <philip.herron@embecosm.com>
-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;
+}