-
Notifications
You must be signed in to change notification settings - Fork 13.1k
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
Fix loop label resolution around constants #52568
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -274,7 +274,7 @@ pub struct Handler { | |
err_count: AtomicUsize, | ||
emitter: Lock<Box<dyn Emitter + sync::Send>>, | ||
continue_after_error: LockCell<bool>, | ||
delayed_span_bug: Lock<Option<Diagnostic>>, | ||
delayed_span_bug: Lock<Vec<Diagnostic>>, | ||
|
||
// This set contains the `DiagnosticId` of all emitted diagnostics to avoid | ||
// emitting the same diagnostic with extended help (`--teach`) twice, which | ||
|
@@ -299,9 +299,25 @@ thread_local!(pub static TRACK_DIAGNOSTICS: Cell<fn(&Diagnostic)> = | |
pub struct HandlerFlags { | ||
pub can_emit_warnings: bool, | ||
pub treat_err_as_bug: bool, | ||
pub report_delayed_bugs: bool, | ||
pub external_macro_backtrace: bool, | ||
} | ||
|
||
impl Drop for Handler { | ||
fn drop(&mut self) { | ||
if self.err_count() == 0 { | ||
let mut bugs = self.delayed_span_bug.borrow_mut(); | ||
let has_bugs = !bugs.is_empty(); | ||
for bug in bugs.drain(..) { | ||
DiagnosticBuilder::new_diagnostic(self, bug).emit(); | ||
} | ||
if has_bugs { | ||
panic!("no errors encountered even though `delay_span_bug` issued"); | ||
} | ||
} | ||
} | ||
} | ||
|
||
impl Handler { | ||
pub fn with_tty_emitter(color_config: ColorConfig, | ||
can_emit_warnings: bool, | ||
|
@@ -346,7 +362,7 @@ impl Handler { | |
err_count: AtomicUsize::new(0), | ||
emitter: Lock::new(e), | ||
continue_after_error: LockCell::new(true), | ||
delayed_span_bug: Lock::new(None), | ||
delayed_span_bug: Lock::new(Vec::new()), | ||
taught_diagnostics: Lock::new(FxHashSet()), | ||
emitted_diagnostic_codes: Lock::new(FxHashSet()), | ||
emitted_diagnostics: Lock::new(FxHashSet()), | ||
|
@@ -503,11 +519,18 @@ impl Handler { | |
} | ||
pub fn delay_span_bug<S: Into<MultiSpan>>(&self, sp: S, msg: &str) { | ||
if self.flags.treat_err_as_bug { | ||
// FIXME: don't abort here if report_delayed_bugs is off | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How straightforward is this to address in this PR? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh it's easy. I just didn't want to change the default behaviour in this PR. ppl might get confused and not know about the extra flag you need to get the old behaviour back |
||
self.span_bug(sp, msg); | ||
} | ||
let mut diagnostic = Diagnostic::new(Level::Bug, msg); | ||
diagnostic.set_span(sp.into()); | ||
*self.delayed_span_bug.borrow_mut() = Some(diagnostic); | ||
self.delay_as_bug(diagnostic); | ||
} | ||
fn delay_as_bug(&self, diagnostic: Diagnostic) { | ||
if self.flags.report_delayed_bugs { | ||
DiagnosticBuilder::new_diagnostic(self, diagnostic.clone()).emit(); | ||
} | ||
self.delayed_span_bug.borrow_mut().push(diagnostic); | ||
} | ||
pub fn span_bug_no_panic<S: Into<MultiSpan>>(&self, sp: S, msg: &str) { | ||
self.emit(&sp.into(), msg, Bug); | ||
|
@@ -615,9 +638,6 @@ impl Handler { | |
|
||
pub fn abort_if_errors(&self) { | ||
if self.err_count() == 0 { | ||
if let Some(bug) = self.delayed_span_bug.borrow_mut().take() { | ||
DiagnosticBuilder::new_diagnostic(self, bug).emit(); | ||
} | ||
return; | ||
} | ||
FatalError.raise(); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
fn main() { | ||
[(); { &loop { break } as *const _ as usize } ]; //~ ERROR unimplemented expression type | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
error[E0019]: constant contains unimplemented expression type | ||
--> $DIR/issue-52442.rs:12:14 | ||
| | ||
LL | [(); { &loop { break } as *const _ as usize } ]; //~ ERROR unimplemented expression type | ||
| ^^^^^^^^^^^^^^ | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0019`. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
fn main() { | ||
[(); & { loop { continue } } ]; //~ ERROR mismatched types | ||
[(); loop { break }]; //~ ERROR mismatched types | ||
[(); {while true {break}; 0}]; //~ ERROR constant contains unimplemented expression type | ||
[(); { for _ in 0usize.. {}; 0}]; //~ ERROR calls in constants are limited to constant functions | ||
//~^ ERROR constant contains unimplemented expression type | ||
//~| ERROR could not evaluate repeat length | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
error[E0308]: mismatched types | ||
--> $DIR/issue-52443.rs:12:10 | ||
| | ||
LL | [(); & { loop { continue } } ]; //~ ERROR mismatched types | ||
| ^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | | ||
| expected usize, found reference | ||
| help: consider removing the borrow: `{ loop { continue } }` | ||
| | ||
= note: expected type `usize` | ||
found type `&_` | ||
|
||
error[E0308]: mismatched types | ||
--> $DIR/issue-52443.rs:13:17 | ||
| | ||
LL | [(); loop { break }]; //~ ERROR mismatched types | ||
| ^^^^^ expected (), found usize | ||
| | ||
= note: expected type `()` | ||
found type `usize` | ||
|
||
error[E0019]: constant contains unimplemented expression type | ||
--> $DIR/issue-52443.rs:14:11 | ||
| | ||
LL | [(); {while true {break}; 0}]; //~ ERROR constant contains unimplemented expression type | ||
| ^^^^^^^^^^^^^^^^^^ | ||
|
||
error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants | ||
--> $DIR/issue-52443.rs:15:21 | ||
| | ||
LL | [(); { for _ in 0usize.. {}; 0}]; //~ ERROR calls in constants are limited to constant functions | ||
| ^^^^^^^^ | ||
|
||
error[E0019]: constant contains unimplemented expression type | ||
--> $DIR/issue-52443.rs:15:21 | ||
| | ||
LL | [(); { for _ in 0usize.. {}; 0}]; //~ ERROR calls in constants are limited to constant functions | ||
| ^^^^^^^^ | ||
|
||
error[E0080]: could not evaluate repeat length | ||
--> $DIR/issue-52443.rs:15:10 | ||
| | ||
LL | [(); { for _ in 0usize.. {}; 0}]; //~ ERROR calls in constants are limited to constant functions | ||
| ^^^^^^^^^^^--------^^^^^^^ | ||
| | | ||
| calling non-const fn `<I as std::iter::IntoIterator><std::ops::RangeFrom<usize>>::into_iter` | ||
|
||
error: aborting due to 6 previous errors | ||
|
||
Some errors occurred: E0015, E0019, E0080, E0308. | ||
For more information about an error, try `rustc --explain E0015`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps this should be called
delayed_span_bugs
.