The logic resolving self::super is ancient, it works since Rust 1.0.
You can find inside fn resolve_path_with_ribs in compiler\rustc_resolve\src\lib.rs.
I doubt anyone remembers now whether it's intended or not.
You can use git blame https://github.com/rust-lang/rust/blame/master/compiler/rustc_resolve/src/lib.rs to go through the history and find out when exactly it was introduced, maybe the PR/commit description will shed some light on this problem.
The behavior is reasonable though. self and super are equivalents of . and .. on the filesystem, and they occasionally work when not written at the path start, e.g. in use a::b::{self} = a/b/. = a/b = a::b.
So the restriction regarding their positions in paths is artificial, and I'd personally just lift it entirely some day.