Skip to content

NLL: diagnostics deviate from source line order for no obvious reason #51167

@pnkfelix

Description

@pnkfelix
Member

Consider:

https://github.com/rust-lang/rust/blob/master/src/test/ui/span/send-is-not-static-ensures-scoping.nll.stderr

compare it to the AST borrowck output:

https://github.com/rust-lang/rust/blob/master/src/test/ui/span/send-is-not-static-ensures-scoping.stderr

  1. Why are we inverting the order in which we report these diagnostics?
  2. We may want to consider not doing that. Even if it means e.g. buffering the diangotics and sorting them before emitting them, or some similar hack. (I admit I am loathe to do this since I myself really like when I am able to correlate the RUST_LOG output with diagnostic output. But if necessary, we could add a -Z flag to turn off the buffer+sorting, in order to bring back such correlation. For end users, buffering+sorting is probably a net win.)

An important reason to prioritize this: Fixing this is likely going to make our internal process for comparing the diagnostic output more efficient.

Activity

nikomatsakis

nikomatsakis commented on Jun 29, 2018

@nikomatsakis
Contributor

Marking as Edition Preview 2 because .. maybe an easy fix.

nikomatsakis

nikomatsakis commented on Jul 3, 2018

@nikomatsakis
Contributor

I think we should just try visiting the basic blocks in reverse-postfix order. The visit occurs here:

fn analyze_results(&mut self, flow_uninit: &mut Self::FlowState) {
let flow = flow_uninit;
for bb in self.mir().basic_blocks().indices() {
flow.reset_to_entry_of(bb);
self.process_basic_block(bb, flow);
}
}

and in particular the for loop here goes over the basic blocks in an arbitrary order

for bb in self.mir().basic_blocks().indices() {

What we want to do is to go over in reverse post-order, which basically maps to execution order as we would normally define it. There is a function reverse_postorder that already exists to compute this ordering -- it returns an Iterator<Item = BasicBlock> -- and you can see some other random code that uses it here:

let mut rpo = traversal::reverse_postorder(mir);

So we basically want to change that code to iterate over the result of reverse_postorder.

added
E-mentorCall for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion.
on Jul 3, 2018
removed
E-mentorCall for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion.
on Jul 6, 2018
nikomatsakis

nikomatsakis commented on Jul 6, 2018

@nikomatsakis
Contributor

OK, @csmoe did the RPO trick -- it definitely helped, but it doesn't seem to have fixed @pnkfelix's example. Not sure @pnkfelix how many more such examples there are -- however, it occurs to me -- @spastorino is also adding some buffering that we might use to do sorting after the fact, as well.

added a commit that references this issue on Jul 7, 2018
ec6bba3
nikomatsakis

nikomatsakis commented on Jul 17, 2018

@nikomatsakis
Contributor

Assigning to @spastorino as this should get fixed as a side-effect of #46908

spastorino

spastorino commented on Jul 23, 2018

@spastorino
Member

Assigning to @pnkfelix as he took over the migrate thing. I can help here if needed at some point.

pnkfelix

pnkfelix commented on Jul 24, 2018

@pnkfelix
MemberAuthor

@nikomatsakis do you think this should remain on EP2, or should we move it to RC?

(I'm going to take a shot at resolving it today, or at least doing as much as I can via the buffering we added. But still, time is tight for EP2.)

pnkfelix

pnkfelix commented on Jul 24, 2018

@pnkfelix
MemberAuthor

moving this to RC as I think it is sufficiently low priority that it should not block EP2 nor NLL's release in EP2.

added a commit that references this issue on Aug 1, 2018
20d2c3f
added a commit that references this issue on Aug 1, 2018
2d29c44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

A-NLLArea: Non-lexical lifetimes (NLL)NLL-diagnosticsWorking towards the "diagnostic parity" goal

Type

No type

Projects

No projects

Relationships

None yet

    Development

    No branches or pull requests

      Participants

      @spastorino@nikomatsakis@pnkfelix

      Issue actions

        NLL: diagnostics deviate from source line order for no obvious reason · Issue #51167 · rust-lang/rust