Rollup merge of #72445 - anp:stabilize-track-caller, r=oli-obk
Stabilize `#[track_caller]`. # Stabilization Report RFC: [2091] Tracking issue: https://github.com/rust-lang/rust/issues/47809 ## Summary From the [rustc-dev-guide chapter][dev-guide]: > Take this example program: ```rust fn main() { let foo: Option<()> = None; foo.unwrap(); // this should produce a useful panic message! } ``` > Prior to Rust 1.42, panics like this `unwrap()` printed a location in libcore: ``` $ rustc +1.41.0 example.rs; example.exe thread 'main' panicked at 'called `Option::unwrap()` on a `None` value',...core\macros\mod.rs:15:40 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. ``` > As of 1.42, we get a much more helpful message: ``` $ rustc +1.42.0 example.rs; example.exe thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', example.rs:3:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` > These error messages are achieved through a combination of changes to `panic!` internals to make use of `core::panic::Location::caller` and a number of `#[track_caller]` annotations in the standard library which propagate caller information. The attribute adds an implicit caller location argument to the ABI of annotated functions, but does not affect the type or MIR of the function. We implement the feature entirely in codegen and in the const evaluator. ## Bottom Line This PR stabilizes the use of `#[track_caller]` everywhere, including traits and extern blocks. It also stabilizes `core::panic::Location::caller`, although the use of that function in a const context remains gated by `#![feature(const_caller_location)]`. The implementation for the feature already changed the output of panic messages for a number of std functions, as described in the [1.42 release announcement]. The attribute's use in `Index` and `IndexMut` traits is visible to users since 1.44. ## Tests All of the tests for this feature live under [src/test/ui/rfc-2091-track-caller][tests] in the repo. Noteworthy cases: * [use of attr in std] * validates user-facing benefit of the feature * [trait attribute inheritance] * covers subtle behavior designed during implementation and not RFC'd * [const/codegen equivalence] * this was the result of a suspected edge case and investigation * [diverging function support] * covers an unresolved question from the RFC * [fn pointers and shims] * covers important potential sources of unsoundness ## Documentation The rustc-dev-guide now has a chapter on [Implicit Caller Location][dev-guide]. I have an [open PR to the reference][attr-reference-pr] documenting the attribute. The intrinsic's [wrapper] includes some examples as well. ## Implementation History * 2019-10-02: [`#[track_caller]` feature gate (RFC 2091 1/N) #65037](https://github.com/rust-lang/rust/pull/65037) * Picked up the patch that @ayosec had started on the feature gate. * 2019-10-13: [Add `Instance::resolve_for_fn_ptr` (RFC 2091 #2/N) #65182](https://github.com/rust-lang/rust/pull/65182) * 2019-10-20: ~~[WIP Add MIR argument for #[track_caller] (RFC 2091 3/N) #65258](https://github.com/rust-lang/rust/pull/65258)~~ * Abandoned approach to send location as a MIR argument. * 2019-10-28: [`std::panic::Location` is a lang_item, add `core::intrinsics::caller_location` (RFC 2091 3/N) #65664](https://github.com/rust-lang/rust/pull/65664) * 2019-12-07: [Implement #[track_caller] attribute. (RFC 2091 4/N) #65881](https://github.com/rust-lang/rust/pull/65881) * 2020-01-04: [libstd uses `core::panic::Location` where possible. #67137](https://github.com/rust-lang/rust/pull/67137) * 2020-01-08: [`Option::{expect,unwrap}` and `Result::{expect, expect_err, unwrap, unwrap_err}` have `#[track_caller]` #67887](https://github.com/rust-lang/rust/pull/67887) * 2020-01-20: [Fix #[track_caller] and function pointers #68302](https://github.com/rust-lang/rust/pull/68302) (fixed #68178) * 2020-03-23: [#[track_caller] in traits #69251](https://github.com/rust-lang/rust/pull/69251) * 2020-03-24: [#[track_caller] on core::ops::{Index, IndexMut}. #70234](https://github.com/rust-lang/rust/pull/70234) * 2020-04-08 [Support `#[track_caller]` on functions in `extern "Rust" { ... }` #70916](https://github.com/rust-lang/rust/pull/70916) ## Unresolveds ### From the RFC > Currently the RFC simply prohibit applying #[track_caller] to trait methods as a future-proofing > measure. **Resolved.** See the dev-guide documentation and the tests section above. > Diverging functions should be supported. **Resolved.** See the tests section above. > The closure foo::{{closure}} should inherit most attributes applied to the function foo, ... **Resolved.** This unknown was related to specifics of the implementation which were made irrelevant by the final implementation. ### Binary Size I [instrumented track_caller to use custom sections][measure-size] in a local build and discovered relatively minor binary size usage for the feature overall. I'm leaving the issue open to discuss whether we want to upstream custom section support. There's an [open issue to discuss mitigation strategies][mitigate-size]. Some decisions remain about the "right" strategies to reduce size without overly constraining the compiler implementation. I'd be excited to see someone carry that work forward but my opinion is that we shouldn't block stabilization on implementing compiler flags for redaction. ### Specialization There's an [open issue][specialization] on the semantics of the attribute in specialization chains. I'm inclined to move forward with stabilization without an exact resolution here given that specialization is itself unstable, but I also think it should be an easy question to resolve. ### Location only points to the start of a call span https://github.com/rust-lang/rust/issues/69977 was resolved by https://github.com/rust-lang/rust/pull/73182, and the next step should probably be to [extend `Location` with a notion of the end of a call](https://github.com/rust-lang/rust/issues/73554). ### Regression of std's panic messages #70963 should be resolved by serializing span hygeine to crate metadata: https://github.com/rust-lang/rust/issues/68686. [2091]: https://github.com/rust-lang/rfcs/blob/master/text/2091-inline-semantic.md [dev-guide]: https://rustc-dev-guide.rust-lang.org/codegen/implicit-caller-location.html [specialization]: https://github.com/rust-lang/rust/issues/70293 [measure-size]: https://github.com/rust-lang/rust/issues/70579 [mitigate-size]: https://github.com/rust-lang/rust/issues/70580 [attr-reference-pr]: https://github.com/rust-lang/reference/pull/742 [wrapper]: https://doc.rust-lang.org/nightly/core/panic/struct.Location.html#method.caller [tests]: https://github.com/rust-lang/rust/tree/master/src/test/ui/rfc-2091-track-caller [const/codegen equivalence]: https://github.com/rust-lang/rust/blob/master/src/test/ui/rfc-2091-track-caller/caller-location-fnptr-rt-ctfe-equiv.rs [diverging function support]: https://github.com/rust-lang/rust/blob/master/src/test/ui/rfc-2091-track-caller/diverging-caller-location.rs [use of attr in std]: https://github.com/rust-lang/rust/blob/master/src/test/ui/rfc-2091-track-caller/std-panic-locations.rs [fn pointers and shims]: https://github.com/rust-lang/rust/blob/master/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr-with-arg.rs [trait attribute inheritance]: https://github.com/rust-lang/rust/blob/master/src/test/ui/rfc-2091-track-caller/tracked-trait-impls.rs [1.42 release announcement]: https://blog.rust-lang.org/2020/03/12/Rust-1.42.html#useful-line-numbers-in-option-and-result-panic-messages
This commit is contained in:
commit
ae79c30d74
38 changed files with 36 additions and 99 deletions
|
|
@ -1,5 +0,0 @@
|
|||
# `track_caller`
|
||||
|
||||
The tracking issue for this feature is: [#47809](https://github.com/rust-lang/rust/issues/47809).
|
||||
|
||||
------------------------
|
||||
|
|
@ -118,7 +118,7 @@
|
|||
#![feature(staged_api)]
|
||||
#![feature(std_internals)]
|
||||
#![feature(stmt_expr_attributes)]
|
||||
#![feature(track_caller)]
|
||||
#![cfg_attr(bootstrap, feature(track_caller))]
|
||||
#![feature(transparent_unions)]
|
||||
#![feature(unboxed_closures)]
|
||||
#![feature(unsized_locals)]
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#[doc(include = "panic.md")]
|
||||
#[macro_export]
|
||||
#[allow_internal_unstable(core_panic, track_caller)]
|
||||
#[allow_internal_unstable(core_panic, const_caller_location)]
|
||||
#[stable(feature = "core", since = "1.6.0")]
|
||||
macro_rules! panic {
|
||||
() => (
|
||||
|
|
|
|||
|
|
@ -190,7 +190,6 @@ impl<'a> Location<'a> {
|
|||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(track_caller)]
|
||||
/// use core::panic::Location;
|
||||
///
|
||||
/// /// Returns the [`Location`] at which it is called.
|
||||
|
|
@ -206,7 +205,7 @@ impl<'a> Location<'a> {
|
|||
///
|
||||
/// let fixed_location = get_just_one_location();
|
||||
/// assert_eq!(fixed_location.file(), file!());
|
||||
/// assert_eq!(fixed_location.line(), 15);
|
||||
/// assert_eq!(fixed_location.line(), 14);
|
||||
/// assert_eq!(fixed_location.column(), 5);
|
||||
///
|
||||
/// // running the same untracked function in a different location gives us the same result
|
||||
|
|
@ -217,7 +216,7 @@ impl<'a> Location<'a> {
|
|||
///
|
||||
/// let this_location = get_caller_location();
|
||||
/// assert_eq!(this_location.file(), file!());
|
||||
/// assert_eq!(this_location.line(), 29);
|
||||
/// assert_eq!(this_location.line(), 28);
|
||||
/// assert_eq!(this_location.column(), 21);
|
||||
///
|
||||
/// // running the tracked function in a different location produces a different value
|
||||
|
|
@ -226,13 +225,8 @@ impl<'a> Location<'a> {
|
|||
/// assert_ne!(this_location.line(), another_location.line());
|
||||
/// assert_ne!(this_location.column(), another_location.column());
|
||||
/// ```
|
||||
// FIXME: When stabilizing this method, please also update the documentation
|
||||
// of `intrinsics::caller_location`.
|
||||
#[unstable(
|
||||
feature = "track_caller",
|
||||
reason = "uses #[track_caller] which is not yet stable",
|
||||
issue = "47809"
|
||||
)]
|
||||
#[stable(feature = "track_caller", since = "1.46.0")]
|
||||
#[rustc_const_unstable(feature = "const_caller_location", issue = "47809")]
|
||||
#[track_caller]
|
||||
pub const fn caller() -> &'static Location<'static> {
|
||||
crate::intrinsics::caller_location()
|
||||
|
|
|
|||
|
|
@ -3,8 +3,6 @@
|
|||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0736
|
||||
#![feature(track_caller)]
|
||||
|
||||
#[naked]
|
||||
#[track_caller]
|
||||
fn foo() {}
|
||||
|
|
|
|||
|
|
@ -5,8 +5,6 @@ restrictions.
|
|||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0737
|
||||
#![feature(track_caller)]
|
||||
|
||||
#[track_caller]
|
||||
extern "C" fn foo() {}
|
||||
```
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0739
|
||||
#![feature(track_caller)]
|
||||
#[track_caller]
|
||||
struct Bar {
|
||||
a: u8,
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/")]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(nll)]
|
||||
#![feature(track_caller)]
|
||||
#![cfg_attr(bootstrap, feature(track_caller))]
|
||||
|
||||
pub use emitter::ColorConfig;
|
||||
|
||||
|
|
|
|||
|
|
@ -265,6 +265,9 @@ declare_features! (
|
|||
(accepted, const_if_match, "1.45.0", Some(49146), None),
|
||||
/// Allows the use of `loop` and `while` in constants.
|
||||
(accepted, const_loop, "1.45.0", Some(52000), None),
|
||||
/// Allows `#[track_caller]` to be used which provides
|
||||
/// accurate caller location reporting during panic (RFC 2091).
|
||||
(accepted, track_caller, "1.46.0", Some(47809), None),
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// feature-group-end: accepted features
|
||||
|
|
|
|||
|
|
@ -494,10 +494,6 @@ declare_features! (
|
|||
/// Allows the use of raw-dylibs (RFC 2627).
|
||||
(active, raw_dylib, "1.40.0", Some(58713), None),
|
||||
|
||||
/// Allows `#[track_caller]` to be used which provides
|
||||
/// accurate caller location reporting during panic (RFC 2091).
|
||||
(active, track_caller, "1.40.0", Some(47809), None),
|
||||
|
||||
/// Allows making `dyn Trait` well-formed even if `Trait` is not object safe.
|
||||
/// In that case, `dyn Trait: Trait` does not hold. Moreover, coercions and
|
||||
/// casts in safe Rust to `dyn Trait` for such a `Trait` is also forbidden.
|
||||
|
|
|
|||
|
|
@ -260,6 +260,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
ungated!(cold, Whitelisted, template!(Word)),
|
||||
ungated!(no_builtins, Whitelisted, template!(Word)),
|
||||
ungated!(target_feature, Whitelisted, template!(List: r#"enable = "name""#)),
|
||||
ungated!(track_caller, Whitelisted, template!(Word)),
|
||||
gated!(
|
||||
no_sanitize, Whitelisted,
|
||||
template!(List: "address, memory, thread"),
|
||||
|
|
@ -333,7 +334,6 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
gated!(ffi_returns_twice, Whitelisted, template!(Word), experimental!(ffi_returns_twice)),
|
||||
gated!(ffi_pure, Whitelisted, template!(Word), experimental!(ffi_pure)),
|
||||
gated!(ffi_const, Whitelisted, template!(Word), experimental!(ffi_const)),
|
||||
gated!(track_caller, Whitelisted, template!(Word), experimental!(track_caller)),
|
||||
gated!(
|
||||
register_attr, CrateLevel, template!(List: "attr1, attr2, ..."),
|
||||
experimental!(register_attr),
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
#![feature(or_patterns)]
|
||||
#![feature(range_is_empty)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(track_caller)]
|
||||
#![cfg_attr(bootstrap, feature(track_caller))]
|
||||
#![feature(trusted_len)]
|
||||
#![feature(stmt_expr_attributes)]
|
||||
#![feature(test)]
|
||||
|
|
|
|||
|
|
@ -316,7 +316,7 @@
|
|||
#![feature(toowned_clone_into)]
|
||||
#![feature(total_cmp)]
|
||||
#![feature(trace_macros)]
|
||||
#![feature(track_caller)]
|
||||
#![cfg_attr(bootstrap, feature(track_caller))]
|
||||
#![feature(try_reserve)]
|
||||
#![feature(unboxed_closures)]
|
||||
#![feature(untagged_unions)]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
// only-linux
|
||||
// run-pass
|
||||
|
||||
#![feature(asm, track_caller, thread_local)]
|
||||
#![feature(asm, thread_local)]
|
||||
|
||||
extern "C" fn f1() -> i32 {
|
||||
111
|
||||
|
|
|
|||
|
|
@ -1,5 +0,0 @@
|
|||
#[track_caller]
|
||||
fn f() {}
|
||||
//~^^ ERROR the `#[track_caller]` attribute is an experimental feature
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
error[E0658]: the `#[track_caller]` attribute is an experimental feature
|
||||
--> $DIR/feature-gate-track_caller.rs:1:1
|
||||
|
|
||||
LL | #[track_caller]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #47809 <https://github.com/rust-lang/rust/issues/47809> for more information
|
||||
= help: add `#![feature(track_caller)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(track_caller)]
|
||||
|
||||
fn main() {
|
||||
(0..)
|
||||
.map(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error[E0658]: `#[target_feature(..)]` can only be applied to `unsafe` functions
|
||||
--> $DIR/issue-68060.rs:6:13
|
||||
--> $DIR/issue-68060.rs:4:13
|
||||
|
|
||||
LL | #[target_feature(enable = "")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -11,13 +11,13 @@ LL | |_| (),
|
|||
= help: add `#![feature(target_feature_11)]` to the crate attributes to enable
|
||||
|
||||
error: the feature named `` is not valid for this target
|
||||
--> $DIR/issue-68060.rs:6:30
|
||||
--> $DIR/issue-68060.rs:4:30
|
||||
|
|
||||
LL | #[target_feature(enable = "")]
|
||||
| ^^^^^^^^^^^ `` is not valid for this target
|
||||
|
||||
error[E0737]: `#[track_caller]` requires Rust ABI
|
||||
--> $DIR/issue-68060.rs:9:13
|
||||
--> $DIR/issue-68060.rs:7:13
|
||||
|
|
||||
LL | #[track_caller]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
// merged.
|
||||
|
||||
#![feature(test, stmt_expr_attributes)]
|
||||
#![feature(track_caller)]
|
||||
#![deny(overflowing_literals)]
|
||||
extern crate test;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(track_caller)]
|
||||
|
||||
use std::panic::Location;
|
||||
|
||||
struct Foo;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
// run-pass
|
||||
// compile-flags: -Z unleash-the-miri-inside-of-you
|
||||
|
||||
#![feature(core_intrinsics, const_caller_location, track_caller, const_fn)]
|
||||
#![feature(core_intrinsics, const_caller_location, const_fn)]
|
||||
|
||||
type L = &'static std::panic::Location<'static>;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(track_caller)]
|
||||
|
||||
#[inline(never)]
|
||||
#[track_caller]
|
||||
fn codegen_caller_loc() -> &'static core::panic::Location<'static> {
|
||||
|
|
@ -15,13 +13,13 @@ macro_rules! caller_location_from_macro {
|
|||
fn main() {
|
||||
let loc = codegen_caller_loc();
|
||||
assert_eq!(loc.file(), file!());
|
||||
assert_eq!(loc.line(), 16);
|
||||
assert_eq!(loc.line(), 14);
|
||||
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(), 23);
|
||||
assert_eq!(loc2.line(), 21);
|
||||
assert_eq!(loc2.column(), 16);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(const_fn, track_caller)]
|
||||
#![feature(const_caller_location, const_fn)]
|
||||
|
||||
use std::panic::Location;
|
||||
|
||||
|
|
|
|||
|
|
@ -6,8 +6,6 @@
|
|||
//! we don't inspect the location returned -- it would be difficult to distinguish between the
|
||||
//! explicit panic and a failed assertion. That it compiles and runs is enough for this one.
|
||||
|
||||
#![feature(track_caller)]
|
||||
|
||||
#[track_caller]
|
||||
fn doesnt_return() -> ! {
|
||||
let _location = core::panic::Location::caller();
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(track_caller)]
|
||||
|
||||
#[track_caller(1)]
|
||||
fn f() {}
|
||||
//~^^ ERROR malformed `track_caller` attribute input
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: malformed `track_caller` attribute input
|
||||
--> $DIR/error-odd-syntax.rs:3:1
|
||||
--> $DIR/error-odd-syntax.rs:1:1
|
||||
|
|
||||
LL | #[track_caller(1)]
|
||||
| ^^^^^^^^^^^^^^^^^^ help: must be of the form: `#[track_caller]`
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(track_caller)]
|
||||
|
||||
#[track_caller]
|
||||
extern "C" fn f() {}
|
||||
//~^^ ERROR `#[track_caller]` requires Rust ABI
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
error[E0737]: `#[track_caller]` requires Rust ABI
|
||||
--> $DIR/error-with-invalid-abi.rs:3:1
|
||||
--> $DIR/error-with-invalid-abi.rs:1:1
|
||||
|
|
||||
LL | #[track_caller]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0737]: `#[track_caller]` requires Rust ABI
|
||||
--> $DIR/error-with-invalid-abi.rs:8:5
|
||||
--> $DIR/error-with-invalid-abi.rs:6:5
|
||||
|
|
||||
LL | #[track_caller]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#![feature(naked_functions, track_caller)]
|
||||
#![feature(naked_functions)]
|
||||
|
||||
#[track_caller] //~ ERROR cannot use `#[track_caller]` with `#[naked]`
|
||||
#[naked]
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(track_caller)]
|
||||
|
||||
macro_rules! caller_location_from_macro {
|
||||
() => (core::panic::Location::caller());
|
||||
}
|
||||
|
|
@ -9,13 +7,13 @@ macro_rules! caller_location_from_macro {
|
|||
fn main() {
|
||||
let loc = core::panic::Location::caller();
|
||||
assert_eq!(loc.file(), file!());
|
||||
assert_eq!(loc.line(), 10);
|
||||
assert_eq!(loc.line(), 8);
|
||||
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(), 15);
|
||||
assert_eq!(loc2.column(), 16);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(track_caller)]
|
||||
|
||||
#[track_caller]
|
||||
struct S;
|
||||
//~^^ ERROR attribute should be applied to function
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error[E0739]: attribute should be applied to function
|
||||
--> $DIR/only-for-fns.rs:3:1
|
||||
--> $DIR/only-for-fns.rs:1:1
|
||||
|
|
||||
LL | #[track_caller]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
|
|||
|
|
@ -1,6 +1,4 @@
|
|||
// run-pass
|
||||
#![feature(track_caller)]
|
||||
|
||||
#[track_caller]
|
||||
fn f() {}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(track_caller)]
|
||||
|
||||
use std::panic::Location;
|
||||
|
||||
#[track_caller]
|
||||
|
|
@ -20,21 +18,21 @@ fn nested_tracked() -> &'static Location<'static> {
|
|||
fn main() {
|
||||
let location = Location::caller();
|
||||
assert_eq!(location.file(), file!());
|
||||
assert_eq!(location.line(), 21);
|
||||
assert_eq!(location.line(), 19);
|
||||
assert_eq!(location.column(), 20);
|
||||
|
||||
let tracked = tracked();
|
||||
assert_eq!(tracked.file(), file!());
|
||||
assert_eq!(tracked.line(), 26);
|
||||
assert_eq!(tracked.line(), 24);
|
||||
assert_eq!(tracked.column(), 19);
|
||||
|
||||
let nested = nested_intrinsic();
|
||||
assert_eq!(nested.file(), file!());
|
||||
assert_eq!(nested.line(), 13);
|
||||
assert_eq!(nested.line(), 11);
|
||||
assert_eq!(nested.column(), 5);
|
||||
|
||||
let contained = nested_tracked();
|
||||
assert_eq!(contained.file(), file!());
|
||||
assert_eq!(contained.line(), 17);
|
||||
assert_eq!(contained.line(), 15);
|
||||
assert_eq!(contained.column(), 5);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(track_caller)]
|
||||
|
||||
use std::panic::Location;
|
||||
|
||||
extern "Rust" {
|
||||
|
|
@ -30,21 +28,21 @@ mod provides {
|
|||
fn main() {
|
||||
let location = Location::caller();
|
||||
assert_eq!(location.file(), file!());
|
||||
assert_eq!(location.line(), 31);
|
||||
assert_eq!(location.line(), 29);
|
||||
assert_eq!(location.column(), 20);
|
||||
|
||||
let tracked = unsafe { rust_track_caller_ffi_test_tracked() };
|
||||
assert_eq!(tracked.file(), file!());
|
||||
assert_eq!(tracked.line(), 36);
|
||||
assert_eq!(tracked.line(), 34);
|
||||
assert_eq!(tracked.column(), 28);
|
||||
|
||||
let untracked = unsafe { rust_track_caller_ffi_test_untracked() };
|
||||
assert_eq!(untracked.file(), file!());
|
||||
assert_eq!(untracked.line(), 26);
|
||||
assert_eq!(untracked.line(), 24);
|
||||
assert_eq!(untracked.column(), 9);
|
||||
|
||||
let contained = rust_track_caller_ffi_test_nested_tracked();
|
||||
assert_eq!(contained.file(), file!());
|
||||
assert_eq!(contained.line(), 14);
|
||||
assert_eq!(contained.line(), 12);
|
||||
assert_eq!(contained.column(), 14);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(track_caller)]
|
||||
|
||||
fn pass_to_ptr_call<T>(f: fn(T), x: T) {
|
||||
f(x);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(track_caller)]
|
||||
|
||||
fn ptr_call(f: fn()) {
|
||||
f();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(track_caller)]
|
||||
|
||||
macro_rules! assert_expansion_site_is_tracked {
|
||||
() => {{
|
||||
let location = std::panic::Location::caller();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue