Closed
Description
Code
(hand-reduced)
#![feature(transmutability)]
#![crate_type = "lib"]
pub enum ApiError {}
pub struct TokioError {
b: bool,
}
pub enum Error {
Api { source: ApiError },
Ethereum,
Tokio { source: TokioError },
}
mod assert {
use std::mem::BikeshedIntrinsicFrom;
pub fn is_transmutable<Src, Dst>()
where
Dst: BikeshedIntrinsicFrom<Src>, // safety is NOT assumed
{
}
}
fn test() {
struct Src;
type Dst = Error;
assert::is_transmutable::<Src, Dst>();
}
(original)
//@ compile-flags: -C opt-level=0
#![crate_type = "lib"]
pub enum ApiError {}
#[allow(dead_code)]
pub struct TokioError {
b: bool,
}
pub enum Error {
Api { source: ApiError },
Ethereum,
Tokio { source: TokioError },
}
struct Api;
impl IntoError<Error> for Api {
type Source = ApiError;
// CHECK-LABEL: @into_error
// CHECK: llvm.trap()
// Also check the next two instructions to make sure we do not match against `trap`
// elsewhere in the code.
// CHECK-NEXT: load
// CHECK-NEXT: ret
#[no_mangle]
fn into_error(self, error: Self::) -> Error {
Error::Api { source: error }
}
}
pub trait IntoError<E> {
/// The underlying error
type Source;
/// Combine the information to produce the error
fn into_error(self, source: Self::Source) -> E;
}
//@ check-pass
//! The presence of safety invariants in the source type does not affect
//! transmutability.
#![crate_type = "lib"]
#![feature(transmutability)]
#![allow(dead_code)]
mod assert {
use std::mem::BikeshedIntrinsicFrom;
pub fn is_transmutable<Src, Dst>()
where
Dst: BikeshedIntrinsicFrom<Src> // safety is NOT assumed
{}
}
fn test() {
#[repr(C)]
struct Src;
type Dst = Error;
assert::is_transmutable::<Src, Dst>();
}
Meta
rustc --version --verbose
:
rustc 1.81.0-nightly (b5b13568f 2024-06-10)
binary: rustc
commit-hash: b5b13568fb5da4ac988bde370008d6134d3dfe6c
commit-date: 2024-06-10
host: x86_64-apple-darwin
release: 1.81.0-nightly
LLVM version: 18.1.7
Error output
Command: rustc
<output>
Backtrace
thread 'rustc' panicked at compiler/rustc_const_eval/src/interpret/discriminant.rs:288:22:
overflow computing relative variant idx
stack backtrace:
0: _rust_begin_unwind
1: core::panicking::panic_fmt
2: core::option::expect_failed
3: rustc_const_eval::const_eval::tag_for_variant_provider
[... omitted 2 frames ...]
4: <rustc_transmute::layout::tree::Tree<rustc_transmute::layout::rustc::Def, rustc_transmute::layout::rustc::Ref>>::from_enum
5: <rustc_transmute::rustc::TransmuteTypeEnv>::is_transmutable
6: <rustc_trait_selection::traits::select::SelectionContext>::confirm_candidate
7: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_candidate::{closure#0}::{closure#0}
8: <rustc_infer::infer::InferCtxt>::probe::<core::result::Result<rustc_middle::traits::select::EvaluationResult, rustc_middle::traits::select::OverflowError>, <rustc_trait_selection::traits::select::SelectionContext>::evaluation_probe<<rustc_trait_selection::traits::select::SelectionContext>::evaluate_candidate::{closure#0}::{closure#0}>::{closure#0}>
9: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_trait_predicate_recursively::{closure#0}::{closure#1}
10: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_trait_predicate_recursively::{closure#0}
11: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_predicate_recursively::{closure#0}::{closure#0}
12: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_root_obligation::{closure#0}
13: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_root_obligation
14: rustc_traits::evaluate_obligation::evaluate_obligation
[... omitted 2 frames ...]
15: <rustc_infer::infer::InferCtxt as rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt>::evaluate_obligation
16: <rustc_infer::infer::InferCtxt as rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt>::evaluate_obligation_no_overflow
17: <rustc_trait_selection::traits::fulfill::FulfillProcessor>::process_trait_obligation
18: <rustc_trait_selection::traits::fulfill::FulfillProcessor as rustc_data_structures::obligation_forest::ObligationProcessor>::process_obligation
19: <rustc_data_structures::obligation_forest::ObligationForest<rustc_trait_selection::traits::fulfill::PendingPredicateObligation>>::process_obligations::<rustc_trait_selection::traits::fulfill::FulfillProcessor>
20: <rustc_trait_selection::traits::fulfill::FulfillmentContext<rustc_trait_selection::traits::FulfillmentError> as rustc_infer::traits::engine::TraitEngine<rustc_trait_selection::traits::FulfillmentError>>::select_where_possible
21: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_argument_types
22: <rustc_hir_typeck::fn_ctxt::FnCtxt>::confirm_builtin_call
23: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
24: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
25: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_block_with_expected
26: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
27: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_return_expr
28: rustc_hir_typeck::check::check_fn
29: rustc_hir_typeck::typeck
[... omitted 1 frame ...]
30: <rustc_middle::hir::map::Map>::par_body_owners::<rustc_hir_analysis::check_crate::{closure#4}>::{closure#0}
31: rustc_hir_analysis::check_crate
32: rustc_interface::passes::run_required_analyses
33: rustc_interface::passes::analysis
[... omitted 1 frame ...]
34: <rustc_interface::queries::QueryResult<&rustc_middle::ty::context::GlobalCtxt>>::enter::<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure#0}::{closure#1}::{closure#3}>
35: rustc_interface::interface::run_compiler::<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
error: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md
note: please make sure that you have updated to the latest nightly
note: please attach the file at `/Volumes/T7/workspace/240607_100chaos_tree_combine_typ/icefiles/rustc-ice-2024-06-11T10_43_12-38775.txt` to your bug report
query stack during panic:
#0 [tag_for_variant] computing variant tag for enum
#1 [evaluate_obligation] evaluating trait selection obligation `Error: core::mem::transmutability::BikeshedIntrinsicFrom<test::Src, core::mem::transmutability::Assume { alignment: false, lifetimes: false, safety: false, validity: false }>`
#2 [typeck] type-checking `test`
#3 [analysis] running analysis passes on this crate
end of query stack
Notes
- ICE location:
compiler/rustc_const_eval/src/interpret/discriminant.rs L288
rust/compiler/rustc_const_eval/src/interpret/discriminant.rs
Lines 276 to 288 in b5b1356
- If constructor
Ethereum
orTokio
removed from enum definition in the reduced ICE triggering code (Line 10, 11), ICE: compiler/rustc_const_eval/src/interpret/discriminant.rs assertion failed 0 != 1 #125811 will be triggered.- (
compiler/rustc_const_eval/src/interpret/discriminant.rs L245
)
rust/compiler/rustc_const_eval/src/interpret/discriminant.rs
Lines 243 to 247 in b5b1356
- (
- Closed issue-66787 might be related.
@rustbot label +F-transmutability