9479792cb4
Rustc of course already WF-checked the field types at the definition site, but for error tainting of consts to work properly, there needs to be an error emitted at the use site. Previously, with no use-site error, we proceeded with CTFE and ran into ICEs since we are running code with type errors. Emitting use-site errors also brings struct-like constructors more in line with fn-like constructors since they already emit use-site errors for WF issues.
29 lines
740 B
Rust
29 lines
740 B
Rust
// This ensures we don't ICE in situations like rust-lang/rust#126272.
|
|
|
|
#![feature(adt_const_params)]
|
|
#![allow(incomplete_features)]
|
|
|
|
use std::marker::ConstParamTy;
|
|
|
|
#[derive(Debug, PartialEq, Eq, ConstParamTy)]
|
|
//~^ ERROR the trait `ConstParamTy_`
|
|
//~| ERROR the trait `ConstParamTy_`
|
|
struct Foo {
|
|
nested: &'static Bar<dyn std::fmt::Debug>,
|
|
//~^ ERROR the size for values
|
|
//~| ERROR the size for values
|
|
//~| ERROR binary operation `==` cannot
|
|
//~| ERROR the trait bound `dyn Debug: Eq`
|
|
//~| ERROR the size for values
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Eq, ConstParamTy)]
|
|
struct Bar<T>(T);
|
|
|
|
struct Test<const F: Foo>;
|
|
|
|
fn main() {
|
|
let x: Test<{ Foo { nested: &Bar(4) } }> = Test;
|
|
//~^ ERROR the size for values
|
|
}
|