about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJorge Aparicio <jorge@japaric.io>2018-05-29 11:23:00 +0200
committerJorge Aparicio <jorge@japaric.io>2018-06-03 13:46:19 +0200
commitda2ee5dcb29b3675cb342c9bc240a22eea9cc2b7 (patch)
tree4afa1b7897986449957131ee4b3eebd2ccc99d71 /src
parent4c84d382ed87521a5b98b30f508366111dbbc7d5 (diff)
downloadrust-da2ee5dcb29b3675cb342c9bc240a22eea9cc2b7.tar.gz
rust-da2ee5dcb29b3675cb342c9bc240a22eea9cc2b7.zip
reject `fn panic_impl<T>(_: &PanicInfo) -> !`
Diffstat (limited to 'src')
-rw-r--r--src/librustc_typeck/check/mod.rs15
-rw-r--r--src/test/compile-fail/panic-implementation-bad-signature-4.rs23
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 {}
+}