Teenager Stefanos Tsitsipas outlasted Wimbledon finalist Kevin Anderson on Saturday, winning 6-7 (4/7), 6-4, 7-6 (9/7) to reach the final of the Toronto Masters.
The Greek, who turns 20 on Sunday, will aim for the title against either top seed Rafael Nadal or Russian Karen Khachanov after saving a match point against Anderson.
Tsitsipas became the first player since 2014 to beat four top 10 players in a Masters 1000 event; Jo-Wilfried Tsonga did it here in 2014.
He is the first unseeded finalist in Canada since Nicolas Kiefer in 2008.
"I can't think of a better way to celebrate my birthday than playing a Masters 1000 final," the winner said.
"It's all unbelievable. I would have probably never thought this could happen so fast.
"I've really improved my game a lot. A year ago I was playing a Challenger in Slovenia."
Tsitsipas worked for two hours, 48 minutes to secure his upset of the hard-serving South African, with Anderson going down with 10 aces.
Tsitsipas will be playing his second ATP final after losing to Nadal on clay in Barcelona in the spring.
The youngster who beat second seed Alexander Zverev in the quarter-finals after also accounting for Dominic Thiem and Novak Djokovic in earlier rounds, advanced on his third match point.
The outcome was decided in a tight third-set tiebreaker, with Tsitsipas blowing his first two winning chances with a double-fault and a forehand error.
Anderson missed out on a match point off his own serve as Tsitsipas slammed over a backhand cross-court winner.
The winner saved all four break points he faced while breaking Anderson once in the afternoon struggle.
"It's obviously incredibly difficult losing a match like where it's so close at such a big stage of the tournament," Anderson said.
"I did what I could. I thought he played some really good tennis, especially when it mattered the most.
"On the one match point that I had, he came up with an unbelievable backhand cross-court winner - it was a very impressive effort from him."
Victory assured Tsitsipas the 15th ranking after starting this week on 27th.