about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBastian Kauschke <bastian_kauschke@hotmail.de>2020-08-04 07:30:04 +0200
committerBastian Kauschke <bastian_kauschke@hotmail.de>2020-08-04 07:35:59 +0200
commit06dbd06e4deab2255d310d38ed0ea28becf43664 (patch)
tree6f573a5e035727c82735fcb7b3916ad4cdc57935 /src
parentd51b71a35a816f4be56f77d1d1a6f4095352649e (diff)
downloadrust-06dbd06e4deab2255d310d38ed0ea28becf43664.tar.gz
rust-06dbd06e4deab2255d310d38ed0ea28becf43664.zip
forbid `#[track_caller]` on main
Diffstat (limited to 'src')
-rw-r--r--src/librustc_typeck/lib.rs36
-rw-r--r--src/test/ui/rfc-2091-track-caller/error-with-main.rs4
-rw-r--r--src/test/ui/rfc-2091-track-caller/error-with-main.stderr12
-rw-r--r--src/test/ui/rfc-2091-track-caller/error-with-start.rs7
-rw-r--r--src/test/ui/rfc-2091-track-caller/error-with-start.stderr12
5 files changed, 70 insertions, 1 deletions
diff --git a/src/librustc_typeck/lib.rs b/src/librustc_typeck/lib.rs
index 9ba2545ba63..016f68bfc6b 100644
--- a/src/librustc_typeck/lib.rs
+++ b/src/librustc_typeck/lib.rs
@@ -100,7 +100,7 @@ use rustc_middle::ty::query::Providers;
 use rustc_middle::ty::{self, Ty, TyCtxt};
 use rustc_middle::util;
 use rustc_session::config::EntryFnType;
-use rustc_span::{Span, DUMMY_SP};
+use rustc_span::{symbol::sym, Span, DUMMY_SP};
 use rustc_target::spec::abi::Abi;
 use rustc_trait_selection::traits::error_reporting::InferCtxtExt as _;
 use rustc_trait_selection::traits::{
@@ -194,6 +194,23 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: LocalDefId) {
                         .emit();
                         error = true;
                     }
+
+                    for attr in it.attrs {
+                        if attr.check_name(sym::track_caller) {
+                            tcx.sess
+                                .struct_span_err(
+                                    attr.span,
+                                    "`main` function is not allowed to be `#[track_caller]`",
+                                )
+                                .span_label(
+                                    main_span,
+                                    "`main` function is not allowed to be `#[track_caller]`",
+                                )
+                                .emit();
+                            error = true;
+                        }
+                    }
+
                     if error {
                         return;
                     }
@@ -274,6 +291,23 @@ fn check_start_fn_ty(tcx: TyCtxt<'_>, start_def_id: LocalDefId) {
                         .emit();
                         error = true;
                     }
+
+                    for attr in it.attrs {
+                        if attr.check_name(sym::track_caller) {
+                            tcx.sess
+                                .struct_span_err(
+                                    attr.span,
+                                    "start is not allowed to be `#[track_caller]`",
+                                )
+                                .span_label(
+                                    start_span,
+                                    "start is not allowed to be `#[track_caller]`",
+                                )
+                                .emit();
+                            error = true;
+                        }
+                    }
+
                     if error {
                         return;
                     }
diff --git a/src/test/ui/rfc-2091-track-caller/error-with-main.rs b/src/test/ui/rfc-2091-track-caller/error-with-main.rs
new file mode 100644
index 00000000000..b2ea31bb517
--- /dev/null
+++ b/src/test/ui/rfc-2091-track-caller/error-with-main.rs
@@ -0,0 +1,4 @@
+#[track_caller] //~ ERROR `main` function is not allowed to be
+fn main() {
+    panic!("{}: oh no", std::panic::Location::caller());
+}
diff --git a/src/test/ui/rfc-2091-track-caller/error-with-main.stderr b/src/test/ui/rfc-2091-track-caller/error-with-main.stderr
new file mode 100644
index 00000000000..f05f88e7d71
--- /dev/null
+++ b/src/test/ui/rfc-2091-track-caller/error-with-main.stderr
@@ -0,0 +1,12 @@
+error: `main` function is not allowed to be `#[track_caller]`
+  --> $DIR/error-with-main.rs:1:1
+   |
+LL |   #[track_caller]
+   |   ^^^^^^^^^^^^^^^
+LL | / fn main() {
+LL | |     panic!("{}: oh no", std::panic::Location::caller());
+LL | | }
+   | |_- `main` function is not allowed to be `#[track_caller]`
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/rfc-2091-track-caller/error-with-start.rs b/src/test/ui/rfc-2091-track-caller/error-with-start.rs
new file mode 100644
index 00000000000..678cb7fa404
--- /dev/null
+++ b/src/test/ui/rfc-2091-track-caller/error-with-start.rs
@@ -0,0 +1,7 @@
+#![feature(start)]
+
+#[start]
+#[track_caller] //~ ERROR start is not allowed to be `#[track_caller]`
+fn start(_argc: isize, _argv: *const *const u8) -> isize {
+    panic!("{}: oh no", std::panic::Location::caller());
+}
diff --git a/src/test/ui/rfc-2091-track-caller/error-with-start.stderr b/src/test/ui/rfc-2091-track-caller/error-with-start.stderr
new file mode 100644
index 00000000000..03b2ce5514f
--- /dev/null
+++ b/src/test/ui/rfc-2091-track-caller/error-with-start.stderr
@@ -0,0 +1,12 @@
+error: start is not allowed to be `#[track_caller]`
+  --> $DIR/error-with-start.rs:4:1
+   |
+LL |   #[track_caller]
+   |   ^^^^^^^^^^^^^^^
+LL | / fn start(_argc: isize, _argv: *const *const u8) -> isize {
+LL | |     panic!("{}: oh no", std::panic::Location::caller());
+LL | | }
+   | |_- start is not allowed to be `#[track_caller]`
+
+error: aborting due to previous error
+