-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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
Regression in Servo: "internal compiler error: mutable allocation in constant" #67601
Comments
If possible, providing a self-contained example that fits into the playground would make minimization and finding the cause of the ICE easier. |
Repro extracted from example: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=d437e043d28ec84f02dd5467c36fc645 minifying now |
Reduced to: pub const FOO: &'static *const u32 = &(&BAR as _);
pub const BAR: u32 = 0; Errors: Compiling playground v0.0.1 (/playground)
error: internal compiler error: mutable allocation in constant
--> src/lib.rs:1:39
|
1 | pub const FOO: &'static *const u32 = &(&BAR as _);
| ^^^^^^^^^^^^
thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:349:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports
note: rustc 1.42.0-nightly (a9c1c04e9 2019-12-24) running on x86_64-unknown-linux-gnu
note: compiler flags: -C codegen-units=1 -C debuginfo=2 --crate-type lib
note: some of the compiler flags provided by cargo are hidden
error: could not compile `playground`.
To learn more, run the command again with --verbose. |
This code is 100% reasonable and should not be ICEing or erroring. I think the reason it is ICEing is the raw pointer causing the allocation to not get interned as immutable, even though it must be. Basically the inner pub const FOO: &'static *const i32 = &(&0 as _); gives the following MIR // WARNING: This output format is intended for human consumers only
// and is subject to change without notice. Knock yourself out.
const FOO: &*const i32 = {
let mut _0: &*const i32; // return place in scope 0 at src/lib.rs:1:17: 1:36
let _1: &*const i32; // in scope 0 at src/lib.rs:1:39: 1:49
bb0: {
StorageLive(_1); // bb0[0]: scope 0 at src/lib.rs:1:39: 1:49
_1 = &(promoted[0]: *const i32); // bb0[1]: scope 0 at src/lib.rs:1:39: 1:49
_0 = _1; // bb0[2]: scope 0 at src/lib.rs:1:39: 1:49
StorageDead(_1); // bb0[3]: scope 0 at src/lib.rs:1:48: 1:49
return; // bb0[4]: scope 0 at src/lib.rs:1:1: 1:50
}
}
promoted[0] in FOO: *const i32 = {
let mut _0: *const i32; // return place in scope 0 at src/lib.rs:1:39: 1:49
let mut _1: *const i32; // in scope 0 at src/lib.rs:1:40: 1:49
let mut _2: &i32; // in scope 0 at src/lib.rs:1:41: 1:43
let mut _3: i32; // in scope 0 at src/lib.rs:1:42: 1:43
bb0: {
_3 = const 0i32; // bb0[0]: scope 0 at src/lib.rs:1:42: 1:43
// ty::Const
// + ty: i32
// + val: Value(Scalar(0x00000000))
// mir::Constant
// + span: src/lib.rs:1:42: 1:43
// + literal: Const { ty: i32, val: Value(Scalar(0x00000000)) }
_2 = &_3; // bb0[1]: scope 0 at src/lib.rs:1:41: 1:43
_1 = &raw const (*_2); // bb0[2]: scope 0 at src/lib.rs:1:41: 1:43
_0 = move _1; // bb0[3]: scope 0 at src/lib.rs:1:39: 1:49
return; // bb0[4]: scope 0 at src/lib.rs:1:39: 1:49
}
} cc @ecstatic-morse promoteds still contain the inner promoteds as just locals without |
I'll prep a fix PR. |
Well I beg to disagree, this creates non- |
well... 100% reasonable from our current rule set, which does a const body based analysis instead of relying on our type system. I didn't say the rule set is 100% reasonable. |
The ICE persists if we eliminate sharing of non- pub struct SyncPtr(*const u32);
unsafe impl Sync for SyncPtr {}
pub const FOO: &'static SyncPtr = &SyncPtr(&BAR as _);
pub const BAR: u32 = 0; Errors:
|
Yeah, that's what I meant by "separate issue". The ICE has nothing to do with |
Upgrade to rustc 1.42.0-nightly (3291ae339 2020-01-15) This was unblocked by rust-lang/rust#67603 fixing rust-lang/rust#67601.
Upgrade to rustc 1.42.0-nightly (3291ae339 2020-01-15) This was unblocked by rust-lang/rust#67603 fixing rust-lang/rust#67601.
Upgrade to rustc 1.42.0-nightly (3291ae339 2020-01-15) This was unblocked by rust-lang/rust#67603 fixing rust-lang/rust#67601.
Upgrade to rustc 1.42.0-nightly (3291ae339 2020-01-15) This was unblocked by rust-lang/rust#67603 fixing rust-lang/rust#67601.
Upgrade to rustc 1.42.0-nightly (3291ae339 2020-01-15) This was unblocked by rust-lang/rust#67603 fixing rust-lang/rust#67601.
https://community-tc.services.mozilla.com/tasks/bdytAYuMTdWK1kbybZ6FWA/runs/0/logs/https%3A%2F%2Fcommunity-tc.services.mozilla.com%2Fapi%2Fqueue%2Fv1%2Ftask%2FbdytAYuMTdWK1kbybZ6FWA%2Fruns%2F0%2Fartifacts%2Fpublic%2Flogs%2Flive.log#L1943
(Many other occurrences)
The crate uses
#![feature(const_fn)]
.Example of one of the affected
const
items:Definitions of types involved:
Regression range:
git log --merges --oneline 9ae6ced...a9c1c04
a9c1c04 Auto merge of #67241 - mark-i-m:simplify-borrow_check-3, r=matthewjasper
f6dca76 Auto merge of #66221 - ohadravid:doc-constants, r=Dylan-DPC
84d8f9d Auto merge of #67579 - RalfJung:miri, r=RalfJung
6253754 Auto merge of #67575 - Centril:rollup-feikoir, r=Centril
a76d67f Rollup merge of #67572 - aidanhs:aphs-choco-direct-cdn, r=Mark-Simulacrum
20d5df9 Rollup merge of #67569 - Mark-Simulacrum:opt-char-encode, r=oli-obk
75b27ef Rollup merge of #67561 - euclio:remove-description, r=jonas-schievink
a75968a Rollup merge of #67551 - ldm0:E0627, r=Dylan-DPC
d130e8d Rollup merge of #67547 - GuillaumeGomez:cleanup-err-codes, r=Dylan-DPC
07effe1 Rollup merge of #67543 - JohnTitor:regression-tests, r=Centril
1ac8fc7 Rollup merge of #67337 - oli-obk:no_mut_static_ref_from_const, r=RalfJung
a4cd03d Auto merge of #66296 - Centril:bindings_after_at-init, r=pnkfelix
The error message appears to be from #67337, cc @oli-obk
If this (modulo ICE vs proper diagnostic) is not a rustc bug, I don’t understand what change we’re supposed to make to this code. I don’t see any heap allocation or mutability happening.
The text was updated successfully, but these errors were encountered: