From ef5fba0067d35bf287476401671111c1f189e4bc Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 25 Jul 2018 13:05:05 +0200 Subject: [PATCH] Hide some lints which are not quite right the way they are reported to the user --- src/librustc_mir/transform/const_prop.rs | 104 +++++++++++++++++--- src/test/ui/const-eval/const_prop_errors.rs | 24 +++++ 2 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 src/test/ui/const-eval/const_prop_errors.rs diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index 94f96d46996d8..c8d4ce88f27c1 100644 --- a/src/librustc_mir/transform/const_prop.rs +++ b/src/librustc_mir/transform/const_prop.rs @@ -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, diff --git a/src/test/ui/const-eval/const_prop_errors.rs b/src/test/ui/const-eval/const_prop_errors.rs new file mode 100644 index 0000000000000..bea4fb76ed166 --- /dev/null +++ b/src/test/ui/const-eval/const_prop_errors.rs @@ -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 or the MIT license +// , 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 Foo for T { + fn foo(self) -> u32 { + fn bar() { loop {} } + bar:: as u32 + } +} + +fn main() {}