mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Taint const qualifs if a static is referenced that didn't pass wfcheck
This commit is contained in:
parent
63f70b3d10
commit
801413ecd1
@ -331,6 +331,11 @@ impl<'mir, 'tcx> Checker<'mir, 'tcx> {
|
|||||||
if self.tcx.is_thread_local_static(def_id) {
|
if self.tcx.is_thread_local_static(def_id) {
|
||||||
self.tcx.dcx().span_bug(span, "tls access is checked in `Rvalue::ThreadLocalRef`");
|
self.tcx.dcx().span_bug(span, "tls access is checked in `Rvalue::ThreadLocalRef`");
|
||||||
}
|
}
|
||||||
|
if let Some(def_id) = def_id.as_local()
|
||||||
|
&& let Err(guar) = self.tcx.at(span).check_well_formed(hir::OwnerId { def_id })
|
||||||
|
{
|
||||||
|
self.error_emitted = Some(guar);
|
||||||
|
}
|
||||||
self.check_op_spanned(ops::StaticAccess, span)
|
self.check_op_spanned(ops::StaticAccess, span)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
//@ known-bug: #123153
|
|
||||||
pub struct wl_interface {
|
|
||||||
pub version: str,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Interface {
|
|
||||||
pub other_interfaces: &'static [&'static Interface],
|
|
||||||
pub c_ptr: Option<&'static wl_interface>,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub static mut wl_callback_interface: wl_interface = wl_interface { version: 0 };
|
|
||||||
|
|
||||||
pub static WL_CALLBACK_INTERFACE: Interface =
|
|
||||||
Interface { other_interfaces: &[], c_ptr: Some(unsafe { &wl_callback_interface }) };
|
|
||||||
|
|
||||||
|
|
||||||
fn main() {}
|
|
21
tests/ui/statics/unsized_type2.rs
Normal file
21
tests/ui/statics/unsized_type2.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
//! This test used to actually start evaluating the static even though
|
||||||
|
//! there were errors in typeck.
|
||||||
|
//! issue: rust-lang/rust#123153
|
||||||
|
|
||||||
|
pub struct Foo {
|
||||||
|
pub version: str,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Bar {
|
||||||
|
pub ok: &'static [&'static Bar],
|
||||||
|
pub bad: &'static Foo,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub static WITH_ERROR: Foo = Foo { version: 0 };
|
||||||
|
//~^ ERROR the size for values of type `str` cannot be known at compilation time
|
||||||
|
//~| ERROR the size for values of type `str` cannot be known at compilation time
|
||||||
|
//~| ERROR mismatched types
|
||||||
|
|
||||||
|
pub static USE_WITH_ERROR: Bar = Bar { ok: &[], bad: &WITH_ERROR };
|
||||||
|
|
||||||
|
fn main() {}
|
37
tests/ui/statics/unsized_type2.stderr
Normal file
37
tests/ui/statics/unsized_type2.stderr
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
error[E0277]: the size for values of type `str` cannot be known at compilation time
|
||||||
|
--> $DIR/unsized_type2.rs:14:24
|
||||||
|
|
|
||||||
|
LL | pub static WITH_ERROR: Foo = Foo { version: 0 };
|
||||||
|
| ^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
||||||
|
= help: within `Foo`, the trait `Sized` is not implemented for `str`, which is required by `Foo: Sized`
|
||||||
|
note: required because it appears within the type `Foo`
|
||||||
|
--> $DIR/unsized_type2.rs:5:12
|
||||||
|
|
|
||||||
|
LL | pub struct Foo {
|
||||||
|
| ^^^
|
||||||
|
|
||||||
|
error[E0277]: the size for values of type `str` cannot be known at compilation time
|
||||||
|
--> $DIR/unsized_type2.rs:14:30
|
||||||
|
|
|
||||||
|
LL | pub static WITH_ERROR: Foo = Foo { version: 0 };
|
||||||
|
| ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
||||||
|
= help: within `Foo`, the trait `Sized` is not implemented for `str`, which is required by `Foo: Sized`
|
||||||
|
note: required because it appears within the type `Foo`
|
||||||
|
--> $DIR/unsized_type2.rs:5:12
|
||||||
|
|
|
||||||
|
LL | pub struct Foo {
|
||||||
|
| ^^^
|
||||||
|
= note: constant expressions must have a statically known size
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/unsized_type2.rs:14:45
|
||||||
|
|
|
||||||
|
LL | pub static WITH_ERROR: Foo = Foo { version: 0 };
|
||||||
|
| ^ expected `str`, found integer
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0277, E0308.
|
||||||
|
For more information about an error, try `rustc --explain E0277`.
|
Loading…
Reference in New Issue
Block a user