Rollup merge of #52695 - oli-obk:const_err_panic, r=petrochenkov

Hide some lints which are not quite right the way they are reported to the user

fixes #52603
This commit is contained in:
Mark Rousskov 2018-07-26 09:18:37 -06:00 committed by GitHub
commit cc7a826594
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 117 additions and 11 deletions

View File

@ -144,18 +144,100 @@ impl<'b, 'a, 'tcx:'b> ConstPropagator<'b, 'a, 'tcx> {
};
let r = match f(self) {
Ok(val) => Some(val),
Err(err) => {
match err.kind {
Err(error) => {
let (stacktrace, span) = self.ecx.generate_stacktrace(None);
let diagnostic = ConstEvalErr { span, error, stacktrace };
use rustc::mir::interpret::EvalErrorKind::*;
match diagnostic.error.kind {
// don't report these, they make no sense in a const prop context
EvalErrorKind::MachineError(_) => {},
_ => {
let (frames, span) = self.ecx.generate_stacktrace(None);
let err = ConstEvalErr {
span,
error: err,
stacktrace: frames,
};
err.report_as_lint(
| MachineError(_)
// at runtime these transformations might make sense
// FIXME: figure out the rules and start linting
| FunctionPointerTyMismatch(..)
// fine at runtime, might be a register address or sth
| ReadBytesAsPointer
// fine at runtime
| ReadForeignStatic
| Unimplemented(_)
// don't report const evaluator limits
| StackFrameLimitReached
| NoMirFor(..)
| InlineAsm
=> {},
| InvalidMemoryAccess
| DanglingPointerDeref
| DoubleFree
| InvalidFunctionPointer
| InvalidBool
| InvalidDiscriminant
| PointerOutOfBounds { .. }
| InvalidNullPointerUsage
| MemoryLockViolation { .. }
| MemoryAcquireConflict { .. }
| ValidationFailure(..)
| InvalidMemoryLockRelease { .. }
| DeallocatedLockedMemory { .. }
| InvalidPointerMath
| ReadUndefBytes
| DeadLocal
| InvalidBoolOp(_)
| DerefFunctionPointer
| ExecuteMemory
| Intrinsic(..)
| InvalidChar(..)
| AbiViolation(_)
| AlignmentCheckFailed{..}
| CalledClosureAsFunction
| VtableForArgumentlessMethod
| ModifiedConstantMemory
| AssumptionNotHeld
// FIXME: should probably be removed and turned into a bug! call
| TypeNotPrimitive(_)
| ReallocatedWrongMemoryKind(_, _)
| DeallocatedWrongMemoryKind(_, _)
| ReallocateNonBasePtr
| DeallocateNonBasePtr
| IncorrectAllocationInformation(..)
| UnterminatedCString(_)
| HeapAllocZeroBytes
| HeapAllocNonPowerOfTwoAlignment(_)
| Unreachable
| ReadFromReturnPointer
| GeneratorResumedAfterReturn
| GeneratorResumedAfterPanic
| ReferencedConstant(_)
| InfiniteLoop
=> {
// FIXME: report UB here
},
| OutOfTls
| TlsOutOfBounds
| PathNotFound(_)
=> bug!("these should not be in rustc, but in miri's machine errors"),
| Layout(_)
| UnimplementedTraitSelection
| TypeckError
| TooGeneric
| CheckMatchError
// these are just noise
=> {},
// non deterministic
| ReadPointerAsBytes
// FIXME: implement
=> {},
| Panic
| BoundsCheck{..}
| Overflow(_)
| OverflowNeg
| DivisionByZero
| RemainderByZero
=> {
diagnostic.report_as_lint(
self.ecx.tcx,
"this expression will panic at runtime",
lint_root,

View File

@ -0,0 +1,24 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// compile-pass
pub trait Foo {
fn foo(self) -> u32;
}
impl<T> Foo for T {
fn foo(self) -> u32 {
fn bar<T>() { loop {} }
bar::<T> as u32
}
}
fn main() {}