As far as I can tell, the only difference between that proposal and the one that was originally proposed here is that, under your proposal, crate names are not brought into scope in every module automatically.
A lot of people have argued that leading :: is ugly, and I’m wholly inclined to agree. It would add a lot of syntactic noise to the use of absolute paths, especially in items. Already, users very much dislike having to write, say impl ::std::fmt::Display for T. This proposal does not fix this ergonomics problem.
To me, the original proposal suggested makes a lot of sense. As far as ambiguity goes, I think there are two possible issues. The first is an example like that provided by @nikomatsakis where macro expansion can change the meaning of other code. I would suggest the following resolution: the leading component of a path cannot be the name of a macro, if that macro shadows another identifier (including a crate name). Thus, cases of mutual dependency will fall afoul of this, as will the following:
struct S;
fn foo() {
declare_s!(); // declares a type named S.
let s = S{};
}
Second, there is the case of ambiguity where the compiler is perfectly capable of resolving the situation, but humans reading the code are not. Consequently, the meaning of code may change by the introduction of a name within a glob. These are also problematic, of course, because they lead to great difficulty understanding code. Consequently, the same rule would apply to identifiers brought in by glob: if a name brought in by a glob shadows another name, then it may not be used as the leading component of a path. This can be fixed by a path from the glob’s parent; if needed the author should make the import use foo::{self, *} so as to be able to refer to foo in paths. This would be a breaking change, but easily
These rules would allow users to refer to names imported by glob or declared by macro, provided that they are careful to qualify references to shadowed entities. If they do not, then the moment they add one, the compiler will give an error and force the discipline to be kept. Nothing will force the user to change immediately, however, so harmless globs will not lose their ergonomics, and any collisions are easily fixed.
For the most part, these transformations could be done automatically in existing code. In case of naming collision between multiple glob imports (let’s not talk about macro_use), situations where the conflict is between two conflicting globs, we could require Cargo to add a self documents, so maybe not the best choice.