diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-08-22 14:48:03 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-08-22 14:56:27 +0100 |
commit | 5a0e34b74aa6de092632bad2bee4883c5a23e036 (patch) | |
tree | 9bef8c57466f78db9fd8444f33ed854c24187d16 /gcc | |
parent | db24e859d8f0141ba97d828deed7cd0d0ae9a43d (diff) | |
download | gcc-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.cc | 3 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-path.cc | 22 | ||||
-rw-r--r-- | gcc/testsuite/rust/execute/torture/trait2.rs | 37 |
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 +} |