aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-08-22 14:48:03 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-08-22 14:56:27 +0100
commit5a0e34b74aa6de092632bad2bee4883c5a23e036 (patch)
tree9bef8c57466f78db9fd8444f33ed854c24187d16 /gcc
parentdb24e859d8f0141ba97d828deed7cd0d0ae9a43d (diff)
downloadgcc-5a0e34b74aa6de092632bad2bee4883c5a23e036.zip
gcc-5a0e34b74aa6de092632bad2bee4883c5a23e036.tar.gz
gcc-5a0e34b74aa6de092632bad2bee4883c5a23e036.tar.bz2
Qualified paths can be fully resolved sometimes
This means we need to be permissive to overload the resolved name to something other than the trait item if we can.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve.cc3
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-path.cc22
-rw-r--r--gcc/testsuite/rust/execute/torture/trait2.rs37
3 files changed, 39 insertions, 23 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc
index 5b6bb24..9d79b36 100644
--- a/gcc/rust/resolve/rust-ast-resolve.cc
+++ b/gcc/rust/resolve/rust-ast-resolve.cc
@@ -225,9 +225,6 @@ Resolver::lookup_definition (NodeId id, Definition *def)
void
Resolver::insert_resolved_name (NodeId refId, NodeId defId)
{
- auto it = resolved_names.find (refId);
- rust_assert (it == resolved_names.end ());
-
resolved_names[refId] = defId;
get_name_scope ().append_reference_for_def (refId, defId);
}
diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index df45e66..7b0e8ae 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -118,26 +118,8 @@ TypeCheckExpr::visit (HIR::QualifiedPathInExpression &expr)
if (fully_resolved)
{
- // lookup if the name resolver was able to canonically resolve this or
- // not
- NodeId path_resolved_id = UNKNOWN_NODEID;
- if (resolver->lookup_resolved_name (expr.get_mappings ().get_nodeid (),
- &path_resolved_id))
- {
- rust_assert (path_resolved_id == root_resolved_node_id);
- }
- // check the type scope
- else if (resolver->lookup_resolved_type (
- expr.get_mappings ().get_nodeid (), &path_resolved_id))
- {
- rust_assert (path_resolved_id == root_resolved_node_id);
- }
- else
- {
- resolver->insert_resolved_name (expr.get_mappings ().get_nodeid (),
- root_resolved_node_id);
- }
-
+ resolver->insert_resolved_name (expr.get_mappings ().get_nodeid (),
+ root_resolved_node_id);
context->insert_receiver (expr.get_mappings ().get_hirid (), root);
return;
}
diff --git a/gcc/testsuite/rust/execute/torture/trait2.rs b/gcc/testsuite/rust/execute/torture/trait2.rs
new file mode 100644
index 0000000..c96615f
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/trait2.rs
@@ -0,0 +1,37 @@
+/* { dg-output "Bar::A = 456\n<Foo as Bar>::A = 456\n" } */
+extern "C" {
+ fn printf(s: *const i8, ...);
+}
+
+trait Foo {
+ const A: i32 = 123;
+}
+
+struct Bar;
+impl Foo for Bar {
+ const A: i32 = 456;
+}
+
+fn main() -> i32 {
+ let a;
+ a = Bar::A;
+
+ unsafe {
+ let _a = "Bar::A = %i\n\0";
+ let _b = _a as *const str;
+ let _c = _b as *const i8;
+ printf(_c, a);
+ }
+
+ let b;
+ b = <Bar as Foo>::A;
+
+ unsafe {
+ let _a = "<Foo as Bar>::A = %i\n\0";
+ let _b = _a as *const str;
+ let _c = _b as *const i8;
+ printf(_c, b);
+ }
+
+ 0
+}