mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 02:03:53 +00:00
a647ba250a
`#[cfg]`s are frequently used to gate crate content behind cargo features. This can lead to very confusing errors when features are missing. For example, `serde` doesn't have the `derive` feature by default. Therefore, `serde::Serialize` fails to resolve with a generic error, even though the macro is present in the docs. This commit adds a list of all stripped item names to metadata. This is filled during macro expansion and then, through a fed query, persisted in metadata. The downstream resolver can then access the metadata to look at possible candidates for mentioning in the errors. This slightly increases metadata (800k->809k for the feature-heavy windows crate), but not enough to really matter.
32 lines
1.3 KiB
Rust
32 lines
1.3 KiB
Rust
// aux-build:cfged_out.rs
|
|
|
|
extern crate cfged_out;
|
|
|
|
fn main() {
|
|
// There is no uwu at this path - no diagnostic.
|
|
cfged_out::uwu(); //~ ERROR cannot find function
|
|
//~^ NOTE not found in `cfged_out`
|
|
|
|
// It does exist here - diagnostic.
|
|
cfged_out::inner::uwu(); //~ ERROR cannot find function
|
|
//~^ NOTE found an item that was configured out
|
|
//~| NOTE not found in `cfged_out::inner`
|
|
|
|
// The module isn't found - we would like to get a diagnostic, but currently don't due to
|
|
// the awkward way the resolver diagnostics are currently implemented.
|
|
// FIXME(Nilstrieb): Also add a note to the cfg diagnostic here
|
|
cfged_out::inner::doesnt_exist::hello(); //~ ERROR failed to resolve
|
|
//~^ NOTE could not find `doesnt_exist` in `inner`
|
|
|
|
// It should find the one in the right module, not the wrong one.
|
|
cfged_out::inner::right::meow(); //~ ERROR cannot find function
|
|
//~^ NOTE found an item that was configured out
|
|
//~| NOTE not found in `cfged_out::inner::right
|
|
//~| NOTE the item is gated behind the `what-a-cool-feature` feature
|
|
|
|
// Exists in the crate root - diagnostic.
|
|
cfged_out::vanished(); //~ ERROR cannot find function
|
|
//~^ NOTE found an item that was configured out
|
|
//~| NOTE not found in `cfged_out`
|
|
}
|