diff options
| author | Oliver Schneider <github35764891676564198441@oli-obk.de> | 2018-08-13 13:48:47 +0200 |
|---|---|---|
| committer | Oliver Schneider <github35764891676564198441@oli-obk.de> | 2018-08-22 18:28:57 +0200 |
| commit | bb78426ca8f12f467e4d3bb38e82c0d3b6209e61 (patch) | |
| tree | 80627d1053b6bb1cdcaea8f50789786613026f04 /src/librustc | |
| parent | 674ef668f13c52a1fadbf01b24d8da1e12d15e70 (diff) | |
| download | rust-bb78426ca8f12f467e4d3bb38e82c0d3b6209e61.tar.gz rust-bb78426ca8f12f467e4d3bb38e82c0d3b6209e61.zip | |
Allow panicking with string literal messages inside constants
Diffstat (limited to 'src/librustc')
| -rw-r--r-- | src/librustc/ich/impls_ty.rs | 7 | ||||
| -rw-r--r-- | src/librustc/middle/lang_items.rs | 2 | ||||
| -rw-r--r-- | src/librustc/mir/interpret/error.rs | 12 | ||||
| -rw-r--r-- | src/librustc/ty/structural_impls.rs | 6 |
4 files changed, 23 insertions, 4 deletions
diff --git a/src/librustc/ich/impls_ty.rs b/src/librustc/ich/impls_ty.rs index 46f4ed4ec47..54829058f44 100644 --- a/src/librustc/ich/impls_ty.rs +++ b/src/librustc/ich/impls_ty.rs @@ -536,7 +536,6 @@ for ::mir::interpret::EvalErrorKind<'gcx, O> { DeallocateNonBasePtr | HeapAllocZeroBytes | Unreachable | - Panic | ReadFromReturnPointer | UnimplementedTraitSelection | TypeckError | @@ -550,6 +549,12 @@ for ::mir::interpret::EvalErrorKind<'gcx, O> { GeneratorResumedAfterReturn | GeneratorResumedAfterPanic | InfiniteLoop => {} + Panic { ref msg, ref file, line, col } => { + msg.hash_stable(hcx, hasher); + file.hash_stable(hcx, hasher); + line.hash_stable(hcx, hasher); + col.hash_stable(hcx, hasher); + }, ReferencedConstant(ref err) => err.hash_stable(hcx, hasher), MachineError(ref err) => err.hash_stable(hcx, hasher), FunctionPointerTyMismatch(a, b) => { diff --git a/src/librustc/middle/lang_items.rs b/src/librustc/middle/lang_items.rs index cf94a0fb4b4..8c300a0aba0 100644 --- a/src/librustc/middle/lang_items.rs +++ b/src/librustc/middle/lang_items.rs @@ -305,6 +305,8 @@ language_item_table! { PanicBoundsCheckFnLangItem, "panic_bounds_check", panic_bounds_check_fn; PanicInfoLangItem, "panic_info", panic_info; PanicImplLangItem, "panic_impl", panic_impl; + // Libstd panic entry point. Necessary for const eval to be able to catch it + BeginPanicFnLangItem, "begin_panic", begin_panic_fn; ExchangeMallocFnLangItem, "exchange_malloc", exchange_malloc_fn; BoxFreeFnLangItem, "box_free", box_free_fn; diff --git a/src/librustc/mir/interpret/error.rs b/src/librustc/mir/interpret/error.rs index 1e9584bc55b..436478b8416 100644 --- a/src/librustc/mir/interpret/error.rs +++ b/src/librustc/mir/interpret/error.rs @@ -17,6 +17,7 @@ use errors::DiagnosticBuilder; use syntax_pos::Span; use syntax::ast; +use syntax::symbol::Symbol; pub type ConstEvalResult<'tcx> = Result<&'tcx ty::Const<'tcx>, Lrc<ConstEvalErr<'tcx>>>; @@ -250,7 +251,12 @@ pub enum EvalErrorKind<'tcx, O> { HeapAllocZeroBytes, HeapAllocNonPowerOfTwoAlignment(u64), Unreachable, - Panic, + Panic { + msg: Symbol, + line: u32, + col: u32, + file: Symbol, + }, ReadFromReturnPointer, PathNotFound(Vec<String>), UnimplementedTraitSelection, @@ -370,7 +376,7 @@ impl<'tcx, O> EvalErrorKind<'tcx, O> { "tried to re-, de-, or allocate heap memory with alignment that is not a power of two", Unreachable => "entered unreachable code", - Panic => + Panic { .. } => "the evaluated program panicked", ReadFromReturnPointer => "tried to read from the return pointer", @@ -465,6 +471,8 @@ impl<'tcx, O: fmt::Debug> fmt::Debug for EvalErrorKind<'tcx, O> { write!(f, "{}", inner), IncorrectAllocationInformation(size, size2, align, align2) => write!(f, "incorrect alloc info: expected size {} and align {}, got size {} and align {}", size.bytes(), align.abi(), size2.bytes(), align2.abi()), + Panic { ref msg, line, col, ref file } => + write!(f, "the evaluated program panicked at '{}', {}:{}:{}", msg, file, line, col), _ => write!(f, "{}", self.description()), } } diff --git a/src/librustc/ty/structural_impls.rs b/src/librustc/ty/structural_impls.rs index ad29f808285..95e2cc6c387 100644 --- a/src/librustc/ty/structural_impls.rs +++ b/src/librustc/ty/structural_impls.rs @@ -574,7 +574,11 @@ impl<'a, 'tcx, O: Lift<'tcx>> Lift<'tcx> for interpret::EvalErrorKind<'a, O> { HeapAllocZeroBytes => HeapAllocZeroBytes, HeapAllocNonPowerOfTwoAlignment(n) => HeapAllocNonPowerOfTwoAlignment(n), Unreachable => Unreachable, - Panic => Panic, + Panic { ref msg, ref file, line, col } => Panic { + msg: msg.clone(), + file: file.clone(), + line, col, + }, ReadFromReturnPointer => ReadFromReturnPointer, PathNotFound(ref v) => PathNotFound(v.clone()), UnimplementedTraitSelection => UnimplementedTraitSelection, |
