From 9ab065dcda070680e18ca0da4366ad45e1665f0f Mon Sep 17 00:00:00 2001 From: Adam Perry Date: Mon, 11 Nov 2019 08:45:52 -0800 Subject: Implement #[track_caller] in const. --- .../ui/consts/const-eval/const_caller_location.rs | 36 ++++++++++++++++------ .../const_caller_location.stderr | 8 +++++ 2 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 src/test/ui/rfc-2091-track-caller/const_caller_location.stderr (limited to 'src/test') diff --git a/src/test/ui/consts/const-eval/const_caller_location.rs b/src/test/ui/consts/const-eval/const_caller_location.rs index c63822f052b..e36790505e8 100644 --- a/src/test/ui/consts/const-eval/const_caller_location.rs +++ b/src/test/ui/consts/const-eval/const_caller_location.rs @@ -1,23 +1,41 @@ // run-pass -#![feature(const_fn, core_intrinsics)] +#![feature(const_fn, core_intrinsics, track_caller)] use std::{intrinsics::caller_location, panic::Location}; const LOCATION: &Location = caller_location(); -const NESTED: &Location = { - const fn nested_location() -> &'static Location<'static> { - caller_location() - }; - nested_location() -}; + +const TRACKED: &Location = tracked(); +#[track_caller] +const fn tracked() -> &'static Location <'static> { + caller_location() +} + +const NESTED: &Location = nested_location(); +const fn nested_location() -> &'static Location<'static> { + caller_location() +} + +const CONTAINED: &Location = contained(); +const fn contained() -> &'static Location<'static> { + tracked() +} fn main() { assert_eq!(LOCATION.file(), file!()); assert_eq!(LOCATION.line(), 7); assert_eq!(LOCATION.column(), 29); + assert_eq!(TRACKED.file(), file!()); + assert_eq!(TRACKED.line(), 9); + assert_eq!(TRACKED.column(), 28); + assert_eq!(NESTED.file(), file!()); - assert_eq!(NESTED.line(), 10); - assert_eq!(NESTED.column(), 9); + assert_eq!(NESTED.line(), 17); + assert_eq!(NESTED.column(), 5); + + assert_eq!(CONTAINED.file(), file!()); + assert_eq!(CONTAINED.line(), 22); + assert_eq!(CONTAINED.column(), 5); } diff --git a/src/test/ui/rfc-2091-track-caller/const_caller_location.stderr b/src/test/ui/rfc-2091-track-caller/const_caller_location.stderr new file mode 100644 index 00000000000..01a00dd28fd --- /dev/null +++ b/src/test/ui/rfc-2091-track-caller/const_caller_location.stderr @@ -0,0 +1,8 @@ +warning: the feature `track_caller` is incomplete and may cause the compiler to crash + --> $DIR/const_caller_location.rs:3:39 + | +LL | #![feature(const_fn, core_intrinsics, track_caller)] + | ^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + -- cgit 1.4.1-3-g733a5 From de44f09cc38be7b8d2bdc5d3e6426417cbe54a7a Mon Sep 17 00:00:00 2001 From: Adam Perry Date: Sun, 27 Oct 2019 16:22:20 -0700 Subject: Rename test filename to match others. --- .../ui/consts/const-eval/const_caller_location.rs | 41 ---------------------- .../rfc-2091-track-caller/const-caller-location.rs | 41 ++++++++++++++++++++++ .../const-caller-location.stderr | 8 +++++ .../const_caller_location.stderr | 8 ----- 4 files changed, 49 insertions(+), 49 deletions(-) delete mode 100644 src/test/ui/consts/const-eval/const_caller_location.rs create mode 100644 src/test/ui/rfc-2091-track-caller/const-caller-location.rs create mode 100644 src/test/ui/rfc-2091-track-caller/const-caller-location.stderr delete mode 100644 src/test/ui/rfc-2091-track-caller/const_caller_location.stderr (limited to 'src/test') diff --git a/src/test/ui/consts/const-eval/const_caller_location.rs b/src/test/ui/consts/const-eval/const_caller_location.rs deleted file mode 100644 index e36790505e8..00000000000 --- a/src/test/ui/consts/const-eval/const_caller_location.rs +++ /dev/null @@ -1,41 +0,0 @@ -// run-pass - -#![feature(const_fn, core_intrinsics, track_caller)] - -use std::{intrinsics::caller_location, panic::Location}; - -const LOCATION: &Location = caller_location(); - -const TRACKED: &Location = tracked(); -#[track_caller] -const fn tracked() -> &'static Location <'static> { - caller_location() -} - -const NESTED: &Location = nested_location(); -const fn nested_location() -> &'static Location<'static> { - caller_location() -} - -const CONTAINED: &Location = contained(); -const fn contained() -> &'static Location<'static> { - tracked() -} - -fn main() { - assert_eq!(LOCATION.file(), file!()); - assert_eq!(LOCATION.line(), 7); - assert_eq!(LOCATION.column(), 29); - - assert_eq!(TRACKED.file(), file!()); - assert_eq!(TRACKED.line(), 9); - assert_eq!(TRACKED.column(), 28); - - assert_eq!(NESTED.file(), file!()); - assert_eq!(NESTED.line(), 17); - assert_eq!(NESTED.column(), 5); - - assert_eq!(CONTAINED.file(), file!()); - assert_eq!(CONTAINED.line(), 22); - assert_eq!(CONTAINED.column(), 5); -} diff --git a/src/test/ui/rfc-2091-track-caller/const-caller-location.rs b/src/test/ui/rfc-2091-track-caller/const-caller-location.rs new file mode 100644 index 00000000000..e36790505e8 --- /dev/null +++ b/src/test/ui/rfc-2091-track-caller/const-caller-location.rs @@ -0,0 +1,41 @@ +// run-pass + +#![feature(const_fn, core_intrinsics, track_caller)] + +use std::{intrinsics::caller_location, panic::Location}; + +const LOCATION: &Location = caller_location(); + +const TRACKED: &Location = tracked(); +#[track_caller] +const fn tracked() -> &'static Location <'static> { + caller_location() +} + +const NESTED: &Location = nested_location(); +const fn nested_location() -> &'static Location<'static> { + caller_location() +} + +const CONTAINED: &Location = contained(); +const fn contained() -> &'static Location<'static> { + tracked() +} + +fn main() { + assert_eq!(LOCATION.file(), file!()); + assert_eq!(LOCATION.line(), 7); + assert_eq!(LOCATION.column(), 29); + + assert_eq!(TRACKED.file(), file!()); + assert_eq!(TRACKED.line(), 9); + assert_eq!(TRACKED.column(), 28); + + assert_eq!(NESTED.file(), file!()); + assert_eq!(NESTED.line(), 17); + assert_eq!(NESTED.column(), 5); + + assert_eq!(CONTAINED.file(), file!()); + assert_eq!(CONTAINED.line(), 22); + assert_eq!(CONTAINED.column(), 5); +} diff --git a/src/test/ui/rfc-2091-track-caller/const-caller-location.stderr b/src/test/ui/rfc-2091-track-caller/const-caller-location.stderr new file mode 100644 index 00000000000..edb57199db8 --- /dev/null +++ b/src/test/ui/rfc-2091-track-caller/const-caller-location.stderr @@ -0,0 +1,8 @@ +warning: the feature `track_caller` is incomplete and may cause the compiler to crash + --> $DIR/const-caller-location.rs:3:39 + | +LL | #![feature(const_fn, core_intrinsics, track_caller)] + | ^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + diff --git a/src/test/ui/rfc-2091-track-caller/const_caller_location.stderr b/src/test/ui/rfc-2091-track-caller/const_caller_location.stderr deleted file mode 100644 index 01a00dd28fd..00000000000 --- a/src/test/ui/rfc-2091-track-caller/const_caller_location.stderr +++ /dev/null @@ -1,8 +0,0 @@ -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/const_caller_location.rs:3:39 - | -LL | #![feature(const_fn, core_intrinsics, track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - -- cgit 1.4.1-3-g733a5 From d47043b1c9ad716f8f773c4f03848be232558f6c Mon Sep 17 00:00:00 2001 From: Adam Perry Date: Sun, 27 Oct 2019 16:27:32 -0700 Subject: Add failing test for codegen'd track_caller attribute. --- .../track-caller-attribute.rs | 40 ++++++++++++++++++++++ .../track-caller-attribute.stderr | 8 +++++ 2 files changed, 48 insertions(+) create mode 100644 src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs create mode 100644 src/test/ui/rfc-2091-track-caller/track-caller-attribute.stderr (limited to 'src/test') diff --git a/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs new file mode 100644 index 00000000000..525c07e1c3a --- /dev/null +++ b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs @@ -0,0 +1,40 @@ +// run-pass + +#![feature(const_fn, core_intrinsics, track_caller)] + +use std::{intrinsics::caller_location, panic::Location}; + +#[track_caller] +fn tracked() -> &'static Location <'static> { + caller_location() +} + +fn nested_intrinsic() -> &'static Location<'static> { + caller_location() +} + +fn nested_tracked() -> &'static Location<'static> { + tracked() +} + +fn main() { + let location = caller_location(); + assert_eq!(location.file(), file!()); + assert_eq!(location.line(), 21); + assert_eq!(location.column(), 20); + + let tracked = tracked(); + assert_eq!(tracked.file(), file!()); + assert_eq!(tracked.line(), 26); + assert_eq!(tracked.column(), 19); + + let nested = nested_intrinsic(); + assert_eq!(nested.file(), file!()); + assert_eq!(nested.line(), 13); + assert_eq!(nested.column(), 5); + + let contained = nested_tracked(); + assert_eq!(contained.file(), file!()); + assert_eq!(contained.line(), 17); + assert_eq!(contained.column(), 5); +} diff --git a/src/test/ui/rfc-2091-track-caller/track-caller-attribute.stderr b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.stderr new file mode 100644 index 00000000000..7e23c9d1dbe --- /dev/null +++ b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.stderr @@ -0,0 +1,8 @@ +warning: the feature `track_caller` is incomplete and may cause the compiler to crash + --> $DIR/track-caller-attribute.rs:3:39 + | +LL | #![feature(const_fn, core_intrinsics, track_caller)] + | ^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + -- cgit 1.4.1-3-g733a5 From ebaebd987f38227fe17cdc3eb23be819e4070429 Mon Sep 17 00:00:00 2001 From: Adam Perry Date: Thu, 7 Nov 2019 16:13:44 -0800 Subject: Remove #[track_caller] from incomplete features list. --- src/librustc_feature/active.rs | 1 - src/test/ui/rfc-2091-track-caller/const-caller-location.stderr | 8 -------- src/test/ui/rfc-2091-track-caller/error-odd-syntax.rs | 2 +- src/test/ui/rfc-2091-track-caller/error-odd-syntax.stderr | 8 -------- src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.rs | 2 +- src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.stderr | 8 -------- src/test/ui/rfc-2091-track-caller/error-with-naked.rs | 2 +- src/test/ui/rfc-2091-track-caller/error-with-naked.stderr | 8 -------- src/test/ui/rfc-2091-track-caller/error-with-trait-decl.rs | 2 +- src/test/ui/rfc-2091-track-caller/error-with-trait-decl.stderr | 8 -------- .../ui/rfc-2091-track-caller/error-with-trait-default-impl.rs | 2 +- .../ui/rfc-2091-track-caller/error-with-trait-default-impl.stderr | 8 -------- src/test/ui/rfc-2091-track-caller/error-with-trait-fn-impl.rs | 2 +- src/test/ui/rfc-2091-track-caller/error-with-trait-fn-impl.stderr | 8 -------- src/test/ui/rfc-2091-track-caller/only-for-fns.rs | 2 +- src/test/ui/rfc-2091-track-caller/only-for-fns.stderr | 8 -------- src/test/ui/rfc-2091-track-caller/pass.rs | 2 +- src/test/ui/rfc-2091-track-caller/pass.stderr | 8 -------- src/test/ui/rfc-2091-track-caller/track-caller-attribute.stderr | 8 -------- 19 files changed, 8 insertions(+), 89 deletions(-) delete mode 100644 src/test/ui/rfc-2091-track-caller/const-caller-location.stderr delete mode 100644 src/test/ui/rfc-2091-track-caller/pass.stderr delete mode 100644 src/test/ui/rfc-2091-track-caller/track-caller-attribute.stderr (limited to 'src/test') diff --git a/src/librustc_feature/active.rs b/src/librustc_feature/active.rs index fc880b9e929..6f440f2ade5 100644 --- a/src/librustc_feature/active.rs +++ b/src/librustc_feature/active.rs @@ -538,5 +538,4 @@ pub const INCOMPLETE_FEATURES: &[Symbol] = &[ sym::or_patterns, sym::let_chains, sym::raw_dylib, - sym::track_caller, ]; diff --git a/src/test/ui/rfc-2091-track-caller/const-caller-location.stderr b/src/test/ui/rfc-2091-track-caller/const-caller-location.stderr deleted file mode 100644 index edb57199db8..00000000000 --- a/src/test/ui/rfc-2091-track-caller/const-caller-location.stderr +++ /dev/null @@ -1,8 +0,0 @@ -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/const-caller-location.rs:3:39 - | -LL | #![feature(const_fn, core_intrinsics, track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - diff --git a/src/test/ui/rfc-2091-track-caller/error-odd-syntax.rs b/src/test/ui/rfc-2091-track-caller/error-odd-syntax.rs index d400db8575e..d6560231871 100644 --- a/src/test/ui/rfc-2091-track-caller/error-odd-syntax.rs +++ b/src/test/ui/rfc-2091-track-caller/error-odd-syntax.rs @@ -1,4 +1,4 @@ -#![feature(track_caller)] //~ WARN the feature `track_caller` is incomplete +#![feature(track_caller)] #[track_caller(1)] fn f() {} diff --git a/src/test/ui/rfc-2091-track-caller/error-odd-syntax.stderr b/src/test/ui/rfc-2091-track-caller/error-odd-syntax.stderr index a53a8ee2bed..8906fa59506 100644 --- a/src/test/ui/rfc-2091-track-caller/error-odd-syntax.stderr +++ b/src/test/ui/rfc-2091-track-caller/error-odd-syntax.stderr @@ -4,13 +4,5 @@ error: malformed `track_caller` attribute input LL | #[track_caller(1)] | ^^^^^^^^^^^^^^^^^^ help: must be of the form: `#[track_caller]` -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/error-odd-syntax.rs:1:12 - | -LL | #![feature(track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - error: aborting due to previous error diff --git a/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.rs b/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.rs index 162c6387088..4d9618a3bb0 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.rs +++ b/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.rs @@ -1,4 +1,4 @@ -#![feature(track_caller)] //~ WARN the feature `track_caller` is incomplete +#![feature(track_caller)] #[track_caller] //~ ERROR Rust ABI is required to use `#[track_caller]` extern "C" fn f() {} diff --git a/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.stderr b/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.stderr index ad89b142f0e..bede0ea593c 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.stderr +++ b/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.stderr @@ -1,11 +1,3 @@ -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/error-with-invalid-abi.rs:1:12 - | -LL | #![feature(track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - error[E0737]: Rust ABI is required to use `#[track_caller]` --> $DIR/error-with-invalid-abi.rs:3:1 | diff --git a/src/test/ui/rfc-2091-track-caller/error-with-naked.rs b/src/test/ui/rfc-2091-track-caller/error-with-naked.rs index bbbcec30e8d..dd9e5d04135 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-naked.rs +++ b/src/test/ui/rfc-2091-track-caller/error-with-naked.rs @@ -1,4 +1,4 @@ -#![feature(naked_functions, track_caller)] //~ WARN the feature `track_caller` is incomplete +#![feature(naked_functions, track_caller)] #[track_caller] #[naked] diff --git a/src/test/ui/rfc-2091-track-caller/error-with-naked.stderr b/src/test/ui/rfc-2091-track-caller/error-with-naked.stderr index 93e6f7a4cd3..2f5003cfdb7 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-naked.stderr +++ b/src/test/ui/rfc-2091-track-caller/error-with-naked.stderr @@ -1,11 +1,3 @@ -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/error-with-naked.rs:1:29 - | -LL | #![feature(naked_functions, track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - error[E0736]: cannot use `#[track_caller]` with `#[naked]` --> $DIR/error-with-naked.rs:3:1 | diff --git a/src/test/ui/rfc-2091-track-caller/error-with-trait-decl.rs b/src/test/ui/rfc-2091-track-caller/error-with-trait-decl.rs index 4fd768d640a..ef037ab62aa 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-trait-decl.rs +++ b/src/test/ui/rfc-2091-track-caller/error-with-trait-decl.rs @@ -1,4 +1,4 @@ -#![feature(track_caller)] //~ WARN the feature `track_caller` is incomplete +#![feature(track_caller)] trait Trait { #[track_caller] //~ ERROR: `#[track_caller]` may not be used on trait methods diff --git a/src/test/ui/rfc-2091-track-caller/error-with-trait-decl.stderr b/src/test/ui/rfc-2091-track-caller/error-with-trait-decl.stderr index 72ed6f89faa..ded721d2782 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-trait-decl.stderr +++ b/src/test/ui/rfc-2091-track-caller/error-with-trait-decl.stderr @@ -1,11 +1,3 @@ -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/error-with-trait-decl.rs:1:12 - | -LL | #![feature(track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - error[E0738]: `#[track_caller]` may not be used on trait methods --> $DIR/error-with-trait-decl.rs:4:5 | diff --git a/src/test/ui/rfc-2091-track-caller/error-with-trait-default-impl.rs b/src/test/ui/rfc-2091-track-caller/error-with-trait-default-impl.rs index 2139ba5de10..17e4bf41ddb 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-trait-default-impl.rs +++ b/src/test/ui/rfc-2091-track-caller/error-with-trait-default-impl.rs @@ -1,4 +1,4 @@ -#![feature(track_caller)] //~ WARN the feature `track_caller` is incomplete +#![feature(track_caller)] trait Trait { #[track_caller] //~ ERROR: `#[track_caller]` may not be used on trait methods diff --git a/src/test/ui/rfc-2091-track-caller/error-with-trait-default-impl.stderr b/src/test/ui/rfc-2091-track-caller/error-with-trait-default-impl.stderr index 05689c9468b..867eb918b6e 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-trait-default-impl.stderr +++ b/src/test/ui/rfc-2091-track-caller/error-with-trait-default-impl.stderr @@ -1,11 +1,3 @@ -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/error-with-trait-default-impl.rs:1:12 - | -LL | #![feature(track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - error[E0738]: `#[track_caller]` may not be used on trait methods --> $DIR/error-with-trait-default-impl.rs:4:5 | diff --git a/src/test/ui/rfc-2091-track-caller/error-with-trait-fn-impl.rs b/src/test/ui/rfc-2091-track-caller/error-with-trait-fn-impl.rs index b565e11f55b..75f20f76e66 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-trait-fn-impl.rs +++ b/src/test/ui/rfc-2091-track-caller/error-with-trait-fn-impl.rs @@ -1,6 +1,6 @@ // check-fail -#![feature(track_caller)] //~ WARN the feature `track_caller` is incomplete +#![feature(track_caller)] trait Trait { fn unwrap(&self); diff --git a/src/test/ui/rfc-2091-track-caller/error-with-trait-fn-impl.stderr b/src/test/ui/rfc-2091-track-caller/error-with-trait-fn-impl.stderr index 707b367484c..fafceefbfd8 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-trait-fn-impl.stderr +++ b/src/test/ui/rfc-2091-track-caller/error-with-trait-fn-impl.stderr @@ -1,11 +1,3 @@ -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/error-with-trait-fn-impl.rs:3:12 - | -LL | #![feature(track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - error[E0738]: `#[track_caller]` may not be used on trait methods --> $DIR/error-with-trait-fn-impl.rs:10:5 | diff --git a/src/test/ui/rfc-2091-track-caller/only-for-fns.rs b/src/test/ui/rfc-2091-track-caller/only-for-fns.rs index 01ebf13b521..0fd59b4bf49 100644 --- a/src/test/ui/rfc-2091-track-caller/only-for-fns.rs +++ b/src/test/ui/rfc-2091-track-caller/only-for-fns.rs @@ -1,4 +1,4 @@ -#![feature(track_caller)] //~ WARN the feature `track_caller` is incomplete +#![feature(track_caller)] #[track_caller] struct S; diff --git a/src/test/ui/rfc-2091-track-caller/only-for-fns.stderr b/src/test/ui/rfc-2091-track-caller/only-for-fns.stderr index 3301da7ff47..7becb9c5b60 100644 --- a/src/test/ui/rfc-2091-track-caller/only-for-fns.stderr +++ b/src/test/ui/rfc-2091-track-caller/only-for-fns.stderr @@ -1,11 +1,3 @@ -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/only-for-fns.rs:1:12 - | -LL | #![feature(track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - error[E0739]: attribute should be applied to function --> $DIR/only-for-fns.rs:3:1 | diff --git a/src/test/ui/rfc-2091-track-caller/pass.rs b/src/test/ui/rfc-2091-track-caller/pass.rs index f2c3f0dc59e..eef83b3d68f 100644 --- a/src/test/ui/rfc-2091-track-caller/pass.rs +++ b/src/test/ui/rfc-2091-track-caller/pass.rs @@ -1,5 +1,5 @@ // run-pass -#![feature(track_caller)] //~ WARN the feature `track_caller` is incomplete +#![feature(track_caller)] #[track_caller] fn f() {} diff --git a/src/test/ui/rfc-2091-track-caller/pass.stderr b/src/test/ui/rfc-2091-track-caller/pass.stderr deleted file mode 100644 index b1fd23a6a9d..00000000000 --- a/src/test/ui/rfc-2091-track-caller/pass.stderr +++ /dev/null @@ -1,8 +0,0 @@ -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/pass.rs:2:12 - | -LL | #![feature(track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - diff --git a/src/test/ui/rfc-2091-track-caller/track-caller-attribute.stderr b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.stderr deleted file mode 100644 index 7e23c9d1dbe..00000000000 --- a/src/test/ui/rfc-2091-track-caller/track-caller-attribute.stderr +++ /dev/null @@ -1,8 +0,0 @@ -warning: the feature `track_caller` is incomplete and may cause the compiler to crash - --> $DIR/track-caller-attribute.rs:3:39 - | -LL | #![feature(const_fn, core_intrinsics, track_caller)] - | ^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - -- cgit 1.4.1-3-g733a5 From bc6e66eb3aa432f422bc61cdb6f0e9c61025a6d5 Mon Sep 17 00:00:00 2001 From: Adam Perry Date: Sun, 10 Nov 2019 13:11:25 -0800 Subject: Implement core::panic::Location::caller using #[track_caller]. --- src/libcore/lib.rs | 1 + src/libcore/panic.rs | 54 ++++++++++++++++++++++ .../caller-location-intrinsic.rs | 8 ++-- .../rfc-2091-track-caller/const-caller-location.rs | 10 ++-- .../track-caller-attribute.rs | 12 ++--- 5 files changed, 70 insertions(+), 15 deletions(-) (limited to 'src/test') diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 188ea1a9631..8a514f1e78e 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -102,6 +102,7 @@ #![feature(staged_api)] #![feature(std_internals)] #![feature(stmt_expr_attributes)] +#![cfg_attr(not(bootstrap), feature(track_caller))] #![feature(transparent_unions)] #![feature(unboxed_closures)] #![feature(unsized_locals)] diff --git a/src/libcore/panic.rs b/src/libcore/panic.rs index 99b372d92c8..e924ee20369 100644 --- a/src/libcore/panic.rs +++ b/src/libcore/panic.rs @@ -176,6 +176,60 @@ pub struct Location<'a> { col: u32, } +impl<'a> Location<'a> { + /// Returns the source location of the caller of this function. If that function's caller is + /// annotated then its call location will be returned, and so on up the stack to the first call + /// within a non-tracked function body. + /// + /// # Examples + /// + /// ``` + /// #![feature(track_caller)] + /// use core::panic::Location; + /// + /// /// Returns the [`Location`] at which it is called. + /// #[track_caller] + /// fn get_caller_location() -> &'static Location<'static> { + /// Location::caller() + /// } + /// + /// /// Returns a [`Location`] from within this function's definition. + /// fn get_just_one_location() -> &'static Location<'static> { + /// get_caller_location() + /// } + /// + /// let fixed_location = get_just_one_location(); + /// assert_eq!(fixed_location.file(), file!()); + /// assert_eq!(fixed_location.line(), 15); + /// assert_eq!(fixed_location.column(), 5); + /// + /// // running the same untracked function in a different location gives us the same result + /// let second_fixed_location = get_just_one_location(); + /// assert_eq!(fixed_location.file(), second_fixed_location.file()); + /// assert_eq!(fixed_location.line(), second_fixed_location.line()); + /// assert_eq!(fixed_location.column(), second_fixed_location.column()); + /// + /// let this_location = get_caller_location(); + /// assert_eq!(this_location.file(), file!()); + /// assert_eq!(this_location.line(), 29); + /// assert_eq!(this_location.column(), 21); + /// + /// // running the tracked function in a different location produces a different value + /// let another_location = get_caller_location(); + /// assert_eq!(this_location.file(), another_location.file()); + /// assert_ne!(this_location.line(), another_location.line()); + /// assert_ne!(this_location.column(), another_location.column()); + /// ``` + #[cfg(not(bootstrap))] + #[unstable(feature = "track_caller", + reason = "uses #[track_caller] which is not yet stable", + issue = "47809")] + #[track_caller] + pub const fn caller() -> &'static Location<'static> { + crate::intrinsics::caller_location() + } +} + impl<'a> Location<'a> { #![unstable(feature = "panic_internals", reason = "internal details of the implementation of the `panic!` \ diff --git a/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs b/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs index 1c4d4666fa1..76e62b89ab8 100644 --- a/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs +++ b/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs @@ -1,18 +1,18 @@ // run-pass -#![feature(core_intrinsics)] +#![feature(track_caller)] macro_rules! caller_location_from_macro { - () => (core::intrinsics::caller_location()); + () => (core::panic::Location::caller()); } fn main() { - let loc = core::intrinsics::caller_location(); + let loc = core::panic::Location::caller(); assert_eq!(loc.file(), file!()); assert_eq!(loc.line(), 10); assert_eq!(loc.column(), 15); - // `caller_location()` in a macro should behave similarly to `file!` and `line!`, + // `Location::caller()` in a macro should behave similarly to `file!` and `line!`, // i.e. point to where the macro was invoked, instead of the macro itself. let loc2 = caller_location_from_macro!(); assert_eq!(loc2.file(), file!()); diff --git a/src/test/ui/rfc-2091-track-caller/const-caller-location.rs b/src/test/ui/rfc-2091-track-caller/const-caller-location.rs index e36790505e8..0614c52c660 100644 --- a/src/test/ui/rfc-2091-track-caller/const-caller-location.rs +++ b/src/test/ui/rfc-2091-track-caller/const-caller-location.rs @@ -1,20 +1,20 @@ // run-pass -#![feature(const_fn, core_intrinsics, track_caller)] +#![feature(const_fn, track_caller)] -use std::{intrinsics::caller_location, panic::Location}; +use std::panic::Location; -const LOCATION: &Location = caller_location(); +const LOCATION: &Location = Location::caller(); const TRACKED: &Location = tracked(); #[track_caller] const fn tracked() -> &'static Location <'static> { - caller_location() + Location::caller() } const NESTED: &Location = nested_location(); const fn nested_location() -> &'static Location<'static> { - caller_location() + Location::caller() } const CONTAINED: &Location = contained(); diff --git a/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs index 525c07e1c3a..8436ee510a5 100644 --- a/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs +++ b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs @@ -1,16 +1,16 @@ // run-pass -#![feature(const_fn, core_intrinsics, track_caller)] +#![feature(const_fn, track_caller)] -use std::{intrinsics::caller_location, panic::Location}; +use std::panic::Location; #[track_caller] -fn tracked() -> &'static Location <'static> { - caller_location() +fn tracked() -> &'static Location<'static> { + Location::caller() } fn nested_intrinsic() -> &'static Location<'static> { - caller_location() + Location::caller() } fn nested_tracked() -> &'static Location<'static> { @@ -18,7 +18,7 @@ fn nested_tracked() -> &'static Location<'static> { } fn main() { - let location = caller_location(); + let location = Location::caller(); assert_eq!(location.file(), file!()); assert_eq!(location.line(), 21); assert_eq!(location.column(), 20); -- cgit 1.4.1-3-g733a5 From eb679c9c5d57c88deaa313608af4011befc69605 Mon Sep 17 00:00:00 2001 From: Adam Perry Date: Thu, 14 Nov 2019 07:47:35 -0800 Subject: Add test for Location::caller in a macro. --- .../ui/rfc-2091-track-caller/intrinsic-wrapper.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs (limited to 'src/test') diff --git a/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs b/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs new file mode 100644 index 00000000000..76e62b89ab8 --- /dev/null +++ b/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs @@ -0,0 +1,21 @@ +// run-pass + +#![feature(track_caller)] + +macro_rules! caller_location_from_macro { + () => (core::panic::Location::caller()); +} + +fn main() { + let loc = core::panic::Location::caller(); + assert_eq!(loc.file(), file!()); + assert_eq!(loc.line(), 10); + assert_eq!(loc.column(), 15); + + // `Location::caller()` in a macro should behave similarly to `file!` and `line!`, + // i.e. point to where the macro was invoked, instead of the macro itself. + let loc2 = caller_location_from_macro!(); + assert_eq!(loc2.file(), file!()); + assert_eq!(loc2.line(), 17); + assert_eq!(loc2.column(), 16); +} -- cgit 1.4.1-3-g733a5 From 28b22571609ef415ef974844982ba5f03c447ab4 Mon Sep 17 00:00:00 2001 From: Adam Perry Date: Sun, 27 Oct 2019 13:32:18 -0700 Subject: Error message no longer implies #[track_caller] is a requirement for Rust ABI. --- src/librustc_typeck/collect.rs | 2 +- src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.rs | 3 ++- src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.stderr | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src/test') diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 6d6e7685fa0..b9829793cbe 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -2616,7 +2616,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs { tcx.sess, attr.span, E0737, - "Rust ABI is required to use `#[track_caller]`" + "`#[track_caller]` requires Rust ABI" ).emit(); } codegen_fn_attrs.flags |= CodegenFnAttrFlags::TRACK_CALLER; diff --git a/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.rs b/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.rs index 4d9618a3bb0..20d29619ba4 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.rs +++ b/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.rs @@ -1,6 +1,7 @@ #![feature(track_caller)] -#[track_caller] //~ ERROR Rust ABI is required to use `#[track_caller]` +#[track_caller] extern "C" fn f() {} +//~^^ ERROR `#[track_caller]` requires Rust ABI fn main() {} diff --git a/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.stderr b/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.stderr index bede0ea593c..2a3a4385c8b 100644 --- a/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.stderr +++ b/src/test/ui/rfc-2091-track-caller/error-with-invalid-abi.stderr @@ -1,4 +1,4 @@ -error[E0737]: Rust ABI is required to use `#[track_caller]` +error[E0737]: `#[track_caller]` requires Rust ABI --> $DIR/error-with-invalid-abi.rs:3:1 | LL | #[track_caller] -- cgit 1.4.1-3-g733a5 From 15d1f7cffdc0b111123a6d34a356eae95af04676 Mon Sep 17 00:00:00 2001 From: Adam Perry Date: Fri, 6 Dec 2019 17:10:47 -0800 Subject: Add additional layer of #[track_caller] to test, avoid const prop. --- .../ui/rfc-2091-track-caller/caller-location-intrinsic.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'src/test') diff --git a/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs b/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs index 76e62b89ab8..0a79aea376f 100644 --- a/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs +++ b/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs @@ -2,20 +2,26 @@ #![feature(track_caller)] +#[inline(never)] +#[track_caller] +fn defeat_const_prop() -> &'static core::panic::Location<'static> { + core::panic::Location::caller() +} + macro_rules! caller_location_from_macro { - () => (core::panic::Location::caller()); + () => (defeat_const_prop()); } fn main() { - let loc = core::panic::Location::caller(); + let loc = defeat_const_prop(); assert_eq!(loc.file(), file!()); - assert_eq!(loc.line(), 10); + assert_eq!(loc.line(), 16); assert_eq!(loc.column(), 15); // `Location::caller()` in a macro should behave similarly to `file!` and `line!`, // i.e. point to where the macro was invoked, instead of the macro itself. let loc2 = caller_location_from_macro!(); assert_eq!(loc2.file(), file!()); - assert_eq!(loc2.line(), 17); + assert_eq!(loc2.line(), 23); assert_eq!(loc2.column(), 16); } -- cgit 1.4.1-3-g733a5