FYI, it seems you wrote sum::<u32>(), but the <u32> was interpreted as an HTML tag and doesn't show up. Enclose your code in backticks so it'll display properly.
As to your question, ::<> is the "turbofish operator," here used to specify the type of the generic parameter to the sum<S>() method. Without it, Rust wouldn't be able to tell what type sum() should return, as there could be multiple S's that implement Sum<u32> (assuming that n has already been explicitly annotated as u32, that is, otherwise it gets even more ambiguous).
No, that's invalid. The :: are needed so that the compiler can tell the difference between a turbofish and a less-than operation chained with a greater-than.
Turbofish (leading ::) is used in expressions. In type specific context, it is not.
Given how the biggest push to allow eliding the colons in expressions went (follow the links in the bastion comment), the turbofish is unlikely to ever go away.
Some say the turbofish is Ferris' () friend or sidekick.
(1..=n).sum < u32 means: take sum field and u32 variable and compare them[1]
(1..=n).sum < u32 >() means: tale value that you have on previous step and compare it with ()[2]
(1..=n).sum < u32 >().pow(2) means: take that comparison result and call pow now[3]
You may say that it's not what you have meant, but then, if you would involve types in the syntax parsing, you get nasty surprises and it becomes literally impossible to answer the question: does that thing that I have is a syntactically valid Rust code or not (it may depend on target platform and even then it's impossible to answer that question 100% of time).
Rust uses turbofish to avoid all that insanity. And it also avoid proliferation of typename and template tags in generics (which are needed because even with full compiler on your hand you still couldn't parse sum<u32>() properly in C++ is sum nested class.
Instead of spending hundreds of man-years and making every user learn bazillion complicated rules to save couple of characters Rust decided to use turbofish operator instead.
This was, obviously, the right thing to do.
And yes, variable named u32 is perfectly valid in Rust ↩︎