summaryrefslogtreecommitdiffstats
path: root/src/test/ui/proc-macro/amputate-span.fixed
blob: 1afc3501a327779f6b6a902e0eab50bcb1979395 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// aux-build:amputate-span.rs
// run-rustfix
// edition:2018
// compile-flags: --extern amputate_span

// This test has been crafted to ensure the following things:
//
// 1. There's a resolution error that prompts the compiler to suggest
//    adding a `use` item.
//
// 2. There are no `use` or `extern crate` items in the source
//    code. In fact, there is only one item, the `fn main`
//    declaration.
//
// 3. The single `fn main` declaration has an attribute attached to it
//    that just deletes the first token from the given item.
//
// You need all of these conditions to hold in order to replicate the
// scenario that yielded issue 87613, where the compiler's suggestion
// looks like:
//
// ```
// help: consider importing this struct
//    |
// 47 | hey */ async use std::process::Command;
//    |              ++++++++++++++++++++++++++
// ```
//
// The first condition is necessary to force the compiler issue a
// suggestion. The second condition is necessary to force the
// suggestion to be issued at a span associated with the sole
// `fn`-item of this crate. The third condition is necessary in order
// to yield the weird state where the associated span of the `fn`-item
// does not actually cover all of the original source code of the
// `fn`-item (which is why we are calling it an "amputated" span
// here).
//
// Note that satisfying conditions 2 and 3 requires the use of the
// `--extern` compile flag.
//
// You might ask yourself: What code would do such a thing?  The
// answer is: the #[tokio::main] attribute does *exactly* this (as
// well as injecting some other code into the `fn main` that it
// constructs).

use std::process::Command;

#[amputate_span::drop_first_token]
/* what the
hey */ async fn main() {
    Command::new("git"); //~ ERROR [E0433]
}

// (The /* ... */ comment in the above is not part of the original
// bug. It is just meant to illustrate one particular facet of the
// original non-ideal behavior, where we were transcribing the
// trailing comment as part of the emitted suggestion, for better or
// for worse.)

#[allow(dead_code)]
mod inner {
    use std::process::Command;

#[amputate_span::drop_first_token]
        /* another interesting
    case */ async fn foo() {
        Command::new("git"); //~ ERROR [E0433]
    }
}