The Croatian stunned the Swiss great 6-4, 6-4 in what was an unusually error-strewn performance from the 20-time Grand Slam champion.
The 21-year-old Coric was defeated by Novak Djokovic in Sunday's final after the Serb thrashed Alexander Zverev 6-2, 6-1, leapfrogging Federer to number two in the world rankings. Federer has not been at his best all week, dropping sets in the two opening matches of his wobbly title defence.
The 37-year-old top seed was more like his old self on Friday, defeating eighth seed Kei Nishikori in two high-quality sets. But he made a slow start against Coric, ranked 19 in the world, getting broken in the first game. There was a subtle shake of the head when Federer similarly lost his serve at the start of the second set.
“I thought he was better, I think he had more punch on the ball. He served better,” said Federer, proclaiming himself pleased overall with his form. “I feel like I'm explosive out there, returning well,” he added.
“Serving, I think, it's okay, could be even a little bit better. I don't think I played a match where I didn't get broken, so that's something a bit more unusual for me.”
In contrast, Coric was largely untroubled on his serve.
Federer won the Australian Open at the start of this year but has had a mediocre season by his sky-high standards. He exited the US Open in the last 16 at the hands of unheralded Australian John Millman, ranked 55th, and only made the quarter-finals at Wimbledon.
Coric, who has only two career titles to his name, has now beaten Federer twice — the previous time was in the final at Halle this year.