Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fake cycle detected when computing supertraits #3126

Open
liamnaddell opened this issue Aug 10, 2024 · 1 comment
Open

fake cycle detected when computing supertraits #3126

liamnaddell opened this issue Aug 10, 2024 · 1 comment
Labels

Comments

@liamnaddell
Copy link
Contributor

Code

extern "C" {
    fn printf(s: *const i8, ...);
}

#[lang = "sized"]
pub trait Sized {}

struct Foo {
    my_int: u32,
}

trait Parent<T> {
    fn parent(&self) -> T;
}

trait Child: Parent<u32> {
    fn child(&self);
}

impl Parent<u32> for Foo {
    fn parent(&self) -> u32 {
        unsafe {
            let parent = "parent%i\n\0";
            let msg = parent as *const str;
            printf(msg as *const i8,self.my_int);
            return self.my_int;
        }
    }
}

impl Child for Foo {
    fn child(&self) {
        let _ = self;
        unsafe {
            let child = "child\n\0";
            let msg = child as *const str;
            printf(msg as *const i8);
        }
    }
}

pub fn main() {
    let a = Foo{ my_int: 0xf00dfeed};
    let b: &dyn Child = &a;

    b.parent();
    b.child();
}

Meta

  • What version of Rust GCC were you using, git sha if possible.
    be1e78b

Error output

liam@gentoo ~/super2 $ gccrs trait16.rs
trait16.rs:18:1: error: cycle detected when computing the super predicates of ‘Child’ [E0391]
   18 | trait Child: Parent<u32> {
      | ^~~~~
crab1: internal compiler error: in resolve_impl_block_substitutions, at rust/typecheck/rust-hir-type-check-item.cc:673
Backtrace

crab1: internal compiler error: in resolve_impl_block_substitutions, at rust/typecheck/rust-hir-type-check-item.cc:673
0x1327d4f Rust::Resolver::TypeCheckItem::resolve_impl_block_substitutions(Rust::HIR::ImplBlock&, bool&)
      ../../gccrs/gcc/rust/typecheck/rust-hir-type-check-item.cc:673
0x1324eaf Rust::Resolver::TypeCheckItem::ResolveImplBlockSelf(Rust::HIR::ImplBlock&)
      ../../gccrs/gcc/rust/typecheck/rust-hir-type-check-item.cc:73
0x138de63 Rust::Resolver::query_type(unsigned int, Rust::TyTy::BaseType**)
      ../../gccrs/gcc/rust/typecheck/rust-type-util.cc:91
0x130f7c7 operator()
      ../../gccrs/gcc/rust/typecheck/rust-tyty-bounds.cc:75
0x1312f6f __invoke_impl<bool, Rust::Resolver::TypeBoundsProbe::scan()::<lambda(Rust::HirId, Rust::HIR::ImplBlock*)>&, unsigned int, Rust::HIR::ImplBlock*>
      /usr/lib/gcc/aarch64-unknown-linux-gnu/13/include/g++-v13/bits/invoke.h:61
0x1312df7 __invoke_r<bool, Rust::Resolver::TypeBoundsProbe::scan()::<lambda(Rust::HirId, Rust::HIR::ImplBlock*)>&, unsigned int, Rust::HIR::ImplBlock*>
      /usr/lib/gcc/aarch64-unknown-linux-gnu/13/include/g++-v13/bits/invoke.h:114
0x1312cbf _M_invoke
      /usr/lib/gcc/aarch64-unknown-linux-gnu/13/include/g++-v13/bits/std_function.h:290
0x11ce63b Rust::Analysis::Mappings::iterate_impl_blocks(std::function<bool (unsigned int, Rust::HIR::ImplBlock*)>)
      ../../gccrs/gcc/rust/util/rust-hir-map.cc:826
0x130f957 Rust::Resolver::TypeBoundsProbe::scan()
      ../../gccrs/gcc/rust/typecheck/rust-tyty-bounds.cc:67
0x130f54b Rust::Resolver::TypeBoundsProbe::Probe(Rust::TyTy::BaseType const*)
      ../../gccrs/gcc/rust/typecheck/rust-tyty-bounds.cc:35
0x12c0c07 Rust::TyTy::BaseType::satisfies_bound(Rust::TyTy::TypeBoundPredicate const&, bool) const
      ../../gccrs/gcc/rust/typecheck/rust-tyty.cc:296
0x12c121b Rust::TyTy::BaseType::bounds_compatible(Rust::TyTy::BaseType const&, unsigned int, bool) const
      ../../gccrs/gcc/rust/typecheck/rust-tyty.cc:388
0x12e31d7 Rust::TyTy::SubstitutionParamMapping::fill_param_ty(Rust::TyTy::SubstitutionArgumentMappings&, unsigned int)
      ../../gccrs/gcc/rust/typecheck/rust-tyty-subst.cc:139
0x1311747 Rust::TyTy::TypeBoundPredicate::apply_generic_arguments(Rust::HIR::GenericArgs*, bool)
      ../../gccrs/gcc/rust/typecheck/rust-tyty-bounds.cc:502
0x131044b Rust::Resolver::TypeCheckBase::get_predicate_from_bound(Rust::HIR::TypePath&, Rust::HIR::Type*, Rust::BoundPolarity)
      ../../gccrs/gcc/rust/typecheck/rust-tyty-bounds.cc:295
0x1327d8b Rust::Resolver::TypeCheckItem::resolve_impl_block_substitutions(Rust::HIR::ImplBlock&, bool&)
      ../../gccrs/gcc/rust/typecheck/rust-hir-type-check-item.cc:678
0x1324eaf Rust::Resolver::TypeCheckItem::ResolveImplBlockSelf(Rust::HIR::ImplBlock&)
      ../../gccrs/gcc/rust/typecheck/rust-hir-type-check-item.cc:73
0x138de63 Rust::Resolver::query_type(unsigned int, Rust::TyTy::BaseType**)
      ../../gccrs/gcc/rust/typecheck/rust-type-util.cc:91
0x130f7c7 operator()
      ../../gccrs/gcc/rust/typecheck/rust-tyty-bounds.cc:75
0x1312f6f __invoke_impl<bool, Rust::Resolver::TypeBoundsProbe::scan()::<lambda(Rust::HirId, Rust::HIR::ImplBlock*)>&, unsigned int, Rust::HIR::ImplBlock*>
      /usr/lib/gcc/aarch64-unknown-linux-gnu/13/include/g++-v13/bits/invoke.h:61
Please submit a full bug report, with preprocessed source (by using -freport-bug).
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.

Expected output

I expected this code to compile, since rustc happily compiles this code.

@liamnaddell
Copy link
Contributor Author

liamnaddell commented Aug 10, 2024

This was found during testing for #914
Likely does not block the issue, however, it means we have less tests for supertraits.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant