diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-07-30 18:59:06 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-07-30 19:12:06 +0000 |
commit | 22f4c74767bddcb9813dca06fc6a354a67d05343 (patch) | |
tree | 9fa39ac1f11e58b37a4a4addf9319973ad0a0c25 /gcc/rust | |
parent | a3fc40c6749aa0635c03f84b9682fa5e86be7b3d (diff) | |
download | gcc-22f4c74767bddcb9813dca06fc6a354a67d05343.zip gcc-22f4c74767bddcb9813dca06fc6a354a67d05343.tar.gz gcc-22f4c74767bddcb9813dca06fc6a354a67d05343.tar.bz2 |
gccrs: Fix ICE by adding check for enum candidate's in TypePath resolution
Fixes #2479
gcc/rust/ChangeLog:
* typecheck/rust-hir-trait-resolve.cc (TraitItemReference::resolve_item):
always resolve the type even when its an a mandatory trait item
* typecheck/rust-hir-type-check-type.cc (TypeCheckType::resolve_root_path):
Add check for enum candidates otherwise you get undefined behaviour
gcc/testsuite/ChangeLog:
* rust/compile/issue-2479.rs: New test.
Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Diffstat (limited to 'gcc/rust')
-rw-r--r-- | gcc/rust/typecheck/rust-hir-trait-resolve.cc | 6 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-type.cc | 18 |
2 files changed, 21 insertions, 3 deletions
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc index 1d0fee7..8b96a81 100644 --- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc +++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc @@ -339,13 +339,13 @@ TraitItemReference::resolve_item (HIR::TraitItemConst &constant) void TraitItemReference::resolve_item (HIR::TraitItemFunc &func) { - if (!is_optional ()) - return; - TyTy::BaseType *item_tyty = get_tyty (); if (item_tyty->get_kind () == TyTy::TypeKind::ERROR) return; + if (!is_optional ()) + return; + // check the block and return types rust_assert (item_tyty->get_kind () == TyTy::TypeKind::FNDEF); diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc b/gcc/rust/typecheck/rust-hir-type-check-type.cc index b4c62b5..d03fcec 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-type.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc @@ -440,6 +440,16 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, size_t *offset, *root_resolved_node_id = ref_node_id; *offset = *offset + 1; root_tyty = lookup; + + // this enforces the proper get_segments checks to take place + bool is_adt = root_tyty->get_kind () == TyTy::TypeKind::ADT; + if (is_adt) + { + const TyTy::ADTType &adt + = *static_cast<const TyTy::ADTType *> (root_tyty); + if (adt.is_enum ()) + return root_tyty; + } } return root_tyty; @@ -498,6 +508,14 @@ TypeCheckType::resolve_segments ( prev_segment = tyseg; tyseg = candidate.ty; + if (candidate.is_enum_candidate ()) + { + rust_error_at (seg->get_locus (), + "expected type, found variant of %s", + tyseg->get_name ().c_str ()); + return new TyTy::ErrorType (expr_id); + } + if (candidate.is_impl_candidate ()) { resolved_node_id |