From da2ee5dcb29b3675cb342c9bc240a22eea9cc2b7 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Tue, 29 May 2018 11:23:00 +0200 Subject: [PATCH] reject `fn panic_impl(_: &PanicInfo) -> !` --- src/librustc_typeck/check/mod.rs | 15 ++++++++++-- .../panic-implementation-bad-signature-4.rs | 23 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/test/compile-fail/panic-implementation-bad-signature-4.rs 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 or the MIT license +// , 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(pi: &PanicInfo) -> ! { + //~^ ERROR `#[panic_implementation]` function should have no type parameters + loop {} +}