## Paths
~~~~ {.notrust .ebnf .gram}
-expr_path : ident [ "::" expr_path_tail ] + ;
+expr_path : [ "::" ] ident [ "::" expr_path_tail ] + ;
expr_path_tail : '<' type_expr [ ',' type_expr ] + '>'
| expr_path ;
# }
~~~~
+Paths can be denoted with various leading qualifiers to change the meaning of
+how it is resolved:
+
+* Paths starting with `::` are considered to be global paths where the
+ components of the path start being resolved from the crate root. Each
+ identifier in the path must resolve to an item.
+
+ ```rust
+ mod a {
+ pub fn foo() {}
+ }
+ mod b {
+ pub fn foo() {
+ ::a::foo(); // call a's foo function
+ }
+ }
+ # fn main() {}
+ ```
+
+* Paths starting with the keyword `super` begin resolution relative to the
+ parent module. Each further identifier must resolve to an item
+
+ ```rust
+ mod a {
+ pub fn foo() {}
+ }
+ mod b {
+ pub fn foo() {
+ super::a::foo(); // call a's foo function
+ }
+ }
+ # fn main() {}
+ ```
+
+* Paths starting with the keyword `self` begin resolution relative to the
+ current module. Each further identifier must resolve to an item.
+
+ ```rust
+ fn foo() {}
+ fn bar() {
+ self::foo();
+ }
+ # fn main() {}
+ ```
+
# Syntax extensions
A number of minor features of Rust are not central enough to have their own