ICE in as_string, at rust/typecheck/rust-tyty-variance-analysis.cc: recursive struct
Maintainers usually reply within 3 days
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 45/100
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.
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: [0;31mSUCCESSFULLY PARSED CRATE [0m
crab1: note: ran register_plugins (with no body)
crab1: note: [0;31mSUCCESSFULLY REGISTERED PLUGINS [0m
crab1: note: started injection
crab1: note: finished injection
crab1: note: [0;31mSUCCESSFULLY FINISHED INJECTION [0m
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: [0;31mSUCCESSFULLY FINISHED EXPANSION [0m
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.
- Dominant language
- C++
- Stars
- 3k
- Forks
- 238
- Avg merge
- 4d 8h
- Merged PRs (30d)
- 31
Getting set up
- Ships a Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Rust-GCC/gccrs
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
Maintainers usually reply within 3 days
-
Allow pattern matching of floating point literalsPossibly taken @Vivekkumar0995 claimed this 7 days ago. Opencleanup good-first-pr typechecking
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
Rust-GCC/gccrs#5047 · 3 comments · 1 assignee ·
Maintainers usually reply within 3 days
-
ICE in variance analysis on core, projection field keeps the impl's type paramPossibly taken @u7k4rs6 claimed this 1 day ago. Opentypechecking
Rust-GCC/gccrs#5074 · 1 assignee ·
Maintainers usually reply within 3 days
-
subset-error typechecking
Difficulty 4/5 3-5 days Newbie friendliness 25/100
Maintainers usually reply within 3 days
-
Difficulty 3/5 1-2 days Newbie friendliness 46/100
Rust-GCC/gccrs#5060 · 2 comments ·
Maintainers usually reply within 3 days
Similar issues
-
mlir
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
llvm/llvm-project#241070 · 1 comment ·
Maintainers usually reply within 1 day
-
help wanted new command
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
tldr-pages/tldr#25111 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
Maintainers usually reply within 1 day
-
Ask the `ServerHelper` for fresh headers on every poll in `Future::get`, as is done for cookiesOpenenhancement
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
NVIDIA/cuda-quantum#5886 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
Maintainers usually reply within 1 day