diff options
| author | Jorge Aparicio <jorge@japaric.io> | 2018-05-29 11:23:00 +0200 |
|---|---|---|
| committer | Jorge Aparicio <jorge@japaric.io> | 2018-06-03 13:46:19 +0200 |
| commit | da2ee5dcb29b3675cb342c9bc240a22eea9cc2b7 (patch) | |
| tree | 4afa1b7897986449957131ee4b3eebd2ccc99d71 /src | |
| parent | 4c84d382ed87521a5b98b30f508366111dbbc7d5 (diff) | |
| download | rust-da2ee5dcb29b3675cb342c9bc240a22eea9cc2b7.tar.gz rust-da2ee5dcb29b3675cb342c9bc240a22eea9cc2b7.zip | |
reject `fn panic_impl<T>(_: &PanicInfo) -> !`
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_typeck/check/mod.rs | 15 | ||||
| -rw-r--r-- | src/test/compile-fail/panic-implementation-bad-signature-4.rs | 23 |
2 files changed, 36 insertions, 2 deletions
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index 23ebf418195..d54f29e6b99 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -130,7 +130,7 @@ use syntax_pos::{self, BytePos, Span, MultiSpan}; use rustc::hir::intravisit::{self, Visitor, NestedVisitorMap}; use rustc::hir::itemlikevisit::ItemLikeVisitor; use rustc::hir::map::Node; -use rustc::hir::{self, PatKind}; +use rustc::hir::{self, PatKind, Item_}; use rustc::middle::lang_items; mod autoderef; @@ -1133,7 +1133,7 @@ fn check_fn<'a, 'gcx, 'tcx>(inherited: &'a Inherited<'a, 'gcx, 'tcx>, if let Some(panic_impl_did) = fcx.tcx.lang_items().panic_impl() { if panic_impl_did == fn_hir_id.owner_def_id() { if let Some(panic_info_did) = fcx.tcx.lang_items().panic_info() { - if ret_ty.sty != ty::TyNever { + if declared_ret_ty.sty != ty::TyNever { fcx.tcx.sess.span_err( decl.output.span(), "return type should be `!`", @@ -1161,6 +1161,17 @@ fn check_fn<'a, 'gcx, 'tcx>(inherited: &'a Inherited<'a, 'gcx, 'tcx>, "argument should be `&PanicInfo`", ); } + + if let Node::NodeItem(item) = fcx.tcx.hir.get(fn_id) { + if let Item_::ItemFn(_, _, _, _, ref generics, _) = item.node { + if !generics.params.is_empty() { + fcx.tcx.sess.span_err( + span, + "`#[panic_implementation]` function should have no type parameters", + ); + } + } + } } else { fcx.tcx.sess.span_err(span, "function should have one argument"); } diff --git a/src/test/compile-fail/panic-implementation-bad-signature-4.rs b/src/test/compile-fail/panic-implementation-bad-signature-4.rs new file mode 100644 index 00000000000..d5f942ba2d6 --- /dev/null +++ b/src/test/compile-fail/panic-implementation-bad-signature-4.rs @@ -0,0 +1,23 @@ +// 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-flags:-C panic=abort + +#![feature(panic_implementation)] +#![no_std] +#![no_main] + +use core::panic::PanicInfo; + +#[panic_implementation] +fn panic<T>(pi: &PanicInfo) -> ! { + //~^ ERROR `#[panic_implementation]` function should have no type parameters + loop {} +} |
