Rust-GCC / Rust-GCC/gccrs

ICE in as_string, at rust/typecheck/rust-tyty-variance-analysis.cc: recursive struct

Open
#4,733 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
C++
Stars
2.9k
Forks
231
Avg merge
19h 55m
Merged PRs (30d)
67

Description

auto-reduced (treereduce-rust):

//@compile-flags: -frust-debug -frust-incomplete-and-experimental-compiler-do-not-use -frust-crate-attr=no_core
pub struct Problem<'a> {
    pub dat: &'a [u8; Problem::C],
}

impl<'a> Problem<'a> {
    const C: usize = 0;
}

original:

pub struct Problem<'a> {
    pub dat: &'a [u8; Problem::C],
}

impl<'a> Problem<'a> {
	const C: usize = 0;
}

fn main() {}

Version information:

c539964b8cc842e871d77b45150df6a5882335fb

Possibly related line of code:
https://github.com/Rust-GCC/gccrs/blob/c539964b8cc842e871d77b45150df6a5882335fb/gcc/rust/typecheck/rust-tyty-variance-analysis.cc#L119-L131

Command:
/home/matthias/vcs/github/gccrs/gccrs-build/gcc/crab1 -frust-debug -frust-incomplete-and-experimental-compiler-do-not-use -frust-crate-attr=no_core -frust-crate-attr=feature(no_core)

Program output

crab1: note: Preparing to parse files. 
crab1: note: Attempting to parse file: /tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs
crab1: note: skipped left angle in generic param
crab1: note: finished parsing actual generic params (i.e. inside angles)
crab1: note: beginning null denotation identifier handling
crab1: note: parsing null denotation after path
crab1: note: skipped left angle in generic param
crab1: note: finished parsing actual generic params (i.e. inside angles)
crab1: note: successfully parsed inherent impl
crab1: note: inferred crate name: mvce
crab1: note: SUCCESSFULLY PARSED CRATE 
crab1: note: ran register_plugins (with no body)
crab1: note: SUCCESSFULLY REGISTERED PLUGINS 
crab1: note: started injection
crab1: note: finished injection
crab1: note: SUCCESSFULLY FINISHED INJECTION 
crab1: note: started expansion
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: str, v: (S)[] (NS)[68] (G)[]
crab1: note: current_rib: k: char, v: (S)[] (NS)[67] (G)[]
crab1: note: current_rib: k: isize, v: (S)[] (NS)[66] (G)[]
crab1: note: current_rib: k: u8, v: (S)[] (NS)[53] (G)[]
crab1: note: current_rib: k: u64, v: (S)[] (NS)[56] (G)[]
crab1: note: current_rib: k: u16, v: (S)[] (NS)[54] (G)[]
crab1: note: current_rib: k: u32, v: (S)[] (NS)[55] (G)[]
crab1: note: current_rib: k: i16, v: (S)[] (NS)[59] (G)[]
crab1: note: current_rib: k: !, v: (S)[] (NS)[69] (G)[]
crab1: note: current_rib: k: u128, v: (S)[] (NS)[57] (G)[]
crab1: note: current_rib: k: bool, v: (S)[] (NS)[52] (G)[]
crab1: note: current_rib: k: i32, v: (S)[] (NS)[60] (G)[]
crab1: note: current_rib: k: f32, v: (S)[] (NS)[63] (G)[]
crab1: note: current_rib: k: i8, v: (S)[] (NS)[58] (G)[]
crab1: note: current_rib: k: i64, v: (S)[] (NS)[61] (G)[]
crab1: note: current_rib: k: i128, v: (S)[] (NS)[62] (G)[]
crab1: note: current_rib: k: usize, v: (S)[] (NS)[65] (G)[]
crab1: note: current_rib: k: f64, v: (S)[] (NS)[64] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(29 [Problem]): existed? no
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(44 [<anon>]): existed? no
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? no
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? no
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: popping link
crab1: note: new cursor: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: new cursor: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: popping link
crab1: note: popping link
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: popping link
crab1: note: new cursor: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: new cursor: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: popping link
crab1: note: popping link
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: popping link
crab1: note: new cursor: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: new cursor: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: popping link
crab1: note: popping link
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: popping link
crab1: note: new cursor: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: new cursor: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: popping link
crab1: note: popping link
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: popping link
crab1: note: new cursor: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: new cursor: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: finished expansion
crab1: note: SUCCESSFULLY FINISHED EXPANSION 
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: inserting link: Link(29 [Problem]): existed? yes
crab1: note: resolving ::u8
crab1: note: resolving ::Problem::C
crab1: note: resolving ::Problem::C
crab1: note: popping link
crab1: note: popping link
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: resolving ::Problem
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(44 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: inserting link: Link(43 [<anon>]): existed? yes
crab1: note: resolving ::usize
crab1: note: popping link
crab1: note: new cursor: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: C, v: (S)[] (NS)[43] (G)[]
crab1: note: popping link
crab1: note: new cursor: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: popping link
crab1: note: current_rib: k: Self, v: (S)[] (NS)[37] (G)[]
crab1: note: new cursor: k: Problem, v: (S)[] (NS)[29] (G)[]
crab1: note: popping link
crab1: note: popping link
/tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs:2:19: note: root resolved type-path to: [u8]
    2 |     pub dat: &'a [u8; Problem::C],
      |                   ^~
/tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs:1:5: note: resolved item {31} to
    1 | pub struct Problem<'a> {
      |     ^~~~~~
/tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs:2:23: error: cannot find value ‘Problem::C’ in this scope [E0425]
    2 |     pub dat: &'a [u8; Problem::C],
      |                       ^~~~~~~
crab1: note: add_type_constraints: Problem{Problem {dat:& <tyty::error>}}
crab1: note: 	add_constraint_from_ty: & <tyty::error> with v=+
crab1: note: 		add_constraint: +
crab1: note: 	add_constraint_from_ty: <tyty::error> with v=+
/tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs:5:1: note: resolved impl block type {35} to
    5 | impl<'a> Problem<'a> {
      | ^~~~
/tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs:5:10: note: root resolved type-path to: [Problem]
    5 | impl<'a> Problem<'a> {
      |          ^~~~~~~
/tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs:5:1: note: begin unify_site_and commit false infer true check_bounds true id={0} expected={Problem} expr={Problem}
    5 | impl<'a> Problem<'a> {
      | ^~~~
crab1: note: unify::go ltype={Problem} rtype={Problem}
crab1: note: unify::go ltype={& <tyty::error>} rtype={& <tyty::error>}
crab1: note: unify::go ltype={<tyty::error>} rtype={<tyty::error>}
/tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs:5:1: note: unify_site_and done ok=false commit false infer true id={0} expected={Problem} expr={Problem}
    5 | impl<'a> Problem<'a> {
      | ^~~~
/tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs:2:32: error: failed to resolve path segment using an impl Probe
    2 |     pub dat: &'a [u8; Problem::C],
      |                                ^
crab1: note: add_type_constraints: Problem{Problem {dat:& <tyty::error>}}
crab1: note: 	add_constraint_from_ty: & <tyty::error> with v=+
crab1: note: 		add_constraint: +
crab1: note: 	add_constraint_from_ty: <tyty::error> with v=+
/tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs:6:14: note: root resolved type-path to: [usize]
    6 |     const C: usize = 0;
      |              ^~~~~
crab1: note: unify_site id={40} expected={usize} expr={<integer>}
crab1: note: unify::go ltype={usize} rtype={<integer>}
crab1: note: Variance analysis solving started:
crab1: note: Variance analysis results:
crab1: internal compiler error: in as_string, at rust/typecheck/rust-tyty-variance-analysis.cc:125
0x32edd17 internal_error(char const*, ...)
	../../gcc/diagnostic-global-context.cc:787
0xc847b9 fancy_abort(char const*, int, char const*)
	../../gcc/diagnostics/context.cc:1813
0x921da5 Rust::TyTy::VarianceAnalysis::Variance::as_string[abi:cxx11]() const
	../../gcc/rust/typecheck/rust-tyty-variance-analysis.cc:125
0x921da5 Rust::TyTy::VarianceAnalysis::Variance::as_string[abi:cxx11]() const
	../../gcc/rust/typecheck/rust-tyty-variance-analysis.cc:112
0x107734f Rust::TyTy::VarianceAnalysis::GenericTyPerCrateCtx::debug_print_solutions()
	../../gcc/rust/typecheck/rust-tyty-variance-analysis.cc:195
0xecc411 Rust::Session::compile_crate(char const*)
	../../gcc/rust/rust-session-manager.cc:810
/home/matthias/vcs/github/gccrs/gccrs-build/gcc/crab1 /tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/mvce.rs -o/tmp/icemaker_global_tempdir.dOHUSECYKF5i/rustc_testrunner_tmpdir_reporting.OSmGrfUfVM9J/binaryname -frust-debug -frust-incomplete-and-experimental-compiler-do-not-use -frust-crate-attr=no_core -frust-crate-attr=feature(no_core)
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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the reduced Rust reproducer in /tmp/im/gcc/snippet_150.rs and the referenced variance-analysis code in gcc/rust/typecheck/rust-tyty-variance-analysis.cc:119-131. Run the provided crab1 command to reproduce the ICE, then verify that compiling the recursive-struct case no longer crashes.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, rust
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.