Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add long explanation for E0453, lint attribute overruled by outer forbid #34242

Merged
merged 2 commits into from Jun 13, 2016
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
46 changes: 45 additions & 1 deletion src/librustc/diagnostics.rs
Expand Up @@ -1444,6 +1444,51 @@ lint name). Ensure the attribute is of this form:
```
"##,

E0453: r##"
A lint check attribute was overruled by a `forbid` directive set as an
attribute on an enclosing scope, or on the command line with the `-F` option.

Example of erroneous code:

```compile_fail
#![forbid(non_snake_case)]

#[allow(non_snake_case)]
fn main() {
let MyNumber = 2; // error: allow(non_snake_case) overruled by outer
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please indent the error comment like this:

    let MyNumber = 2; // error: allow(non_snake_case) overruled by outer
                      //        forbid(non_snake_case)

// forbid(non_snake_case)
}
```

The `forbid` lint setting makes code that fails the lint check result in a
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit hard to read. Could you rewrite it please? For example:

"The forbid lint setting transform the corresponding compilation warning into a hard error. It also prevents itself from being overridden by inner attributes."

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Compilation warning" may not be the most strictly accurate phrase—the lint check emits a compilation warning if it's set to warn, but it could default to allow, &c.—but I agree that it seems worth glossing over such fine distinctions and preferring familiar phrases for the sake of pedagogy.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But I do think we want to explicitly contrast deny and forbid here.

compilation-terminating error (like `deny`), but also prevents itself from
being overridden by inner attributes.

You can change `forbid` to `deny` (or use `-D` instead of `-F` if the `forbid`
setting was given as a command-line option) to allow the inner lint check
attribute:

```
#![deny(non_snake_case)]

#[allow(non_snake_case)]
fn main() {
let MyNumber = 2; // ok!
}
```

Alternatively, edit the code to pass the lint check, and remove the overruled
attribute:

```
#![forbid(non_snake_case)]

fn main() {
let my_number = 2;
}
```
"##,

E0496: r##"
A lifetime name is shadowing another lifetime name. Erroneous code example:

Expand Down Expand Up @@ -1628,7 +1673,6 @@ register_diagnostics! {
E0314, // closure outlives stack frame
E0315, // cannot invoke closure outside of its lifetime
E0316, // nested quantification of lifetimes
E0453, // overruled by outer forbid
E0473, // dereference of reference outside its lifetime
E0474, // captured variable `..` does not outlive the enclosing closure
E0475, // index of slice outside its lifetime
Expand Down