Theo Hernandez scored a superb 90th-minute winner as France hit back from 2-0 down to stun Belgium and reach the Nations League final.
Didier Deschamps’ side looked out of contention at the break after conceding two goals in the space of four minutes, but a thrilling second-half fightback set up a meeting with Spain.
AC Milan full-back Hernandez was the match-winner, collecting the ball on the edge of the box and firing home a finish into the far corner to spark joyous scenes at the Allianz Stadium in Turin.
It started well for Belgium, who took a 37th-minute lead when Yannick Carrasco cut in from the left and drilled in a finish at the near post, wrongfooting goalkeeper Hugo Lloris.
Just four minutes later, Roberto Martinez’s side doubled their advantage as Romelu Lukaku latched on to Kevin de Bruyne’s through ball and fired a blistering shot into the roof of the net.
- Relive France’s dramatic comeback victory over Belgium
But Karim Benzema pulled a goal back on the hour mark, turning and sliding a finish into the bottom corner from Kylian Mbappe’s lay-off.
And they drew level through Mbappe’s confidently taken penalty after Youri Tielemans’ trip on Antoine Griezmann inside the area.
Lukaku thought he had won it with three minutes remaining after slotting in from Carrasco’s low cross, but the strike was ruled out by VAR for offside.
There was still time for Paul Pogba to rattled the crossbar with a sublime curling free-kick from 30 yards out, before Hernandez struck late on.
The final takes place at the San Siro on Sunday (19: 45 BST kick-off), while the third-place play-off between Belgium and European champions Italy is in Turin on the same day (14: 00).
Marvellous Mbappe at centre of famous comeback
France eased the pressure on boss Deschamps, who had won just one of his previous six games in charge, with a splendid second-half showing to turn the game around.
Belgium should really have taken the lead in the third minute but Lloris made a stunning reflex save to keep out De Bruyne’s ferocious effort from 10 yards out.
The Manchester City midfielder thrashed a volley over from the edge of the box following good hold-up play by Lukaku, who should have added to his 68 international goals in the second half but struck a volley straight at the Tottenham goalkeeper.
Mbappe was causing havoc with his pace and trickery and he side-footed a volley from 18 yards out, saved comfortably by goalkeeper Thibaut Courtois.
With France chasing the game and Belgium happy to sit back, the French pushed on and created numerous chances with Manchester United midfielder Pogba heading over from six yards out and having a rasping drive pushed away by Courtois in the second half.
Benzema, who has scored 10 goals in 10 games for Real Madrid this season, showed he is a man in form by stroking in for 2-1 and Mbappe made it 2-2 from the penalty spot, having missed at Euro 2020 to send his side out.
Griezmann somehow scuffed wide from four yards out, Mbappe curled wide from the edge of the box and with the game heading to extra-time, Hernandez popped up with his first goal for France to seal a famous victory.
‘Golden generation’ running out of time
Belgium have been ranked the world number one side for more than three years, but are the only team to top the Fifa rankings without claiming a major trophy.
Under Martinez, the team’s best finish has been third place at the 2018 World Cup and the search for that elusive trophy goes on.
The country’s so called ‘golden generation’ are running out of time to be remembered as silverware winners, with De Bruyne, Eden Hazard, Toby Alderweireld and Jan Vertonghen all aged 30 or over.
Their second-half collapse against the world champions will be of particular concern, given they were in total control at the break courtesy of clinical finishes from Carrasco and Lukaku.
They barely threatened after the interval and wilted under pressure from the resurgent France.
- 5VertonghenBooked at 67mins
- 21CastagneSubstituted forBatshuayiat 90+2′minutes
- 8TielemansSubstituted forVanakenat 70′minutes
- 7De Bruyne
- 10E HazardSubstituted forTrossardat 74′minutes
- 18De Ketelaere
- 2PavardSubstituted forDuboisat 90+2′minutes
- 14RabiotSubstituted forTchouaméniat 75′minutes
- 19BenzemaSubstituted forVeretoutat 90+7′minutes
- 20Ben Yedder
- Daniel Siebert
Match ends, Belgium 2, France 3.
Second Half ends, Belgium 2, France 3.
Substitution, France. Jordan Veretout replaces Karim Benzema.
Foul by Jan Vertonghen (Belgium).
Jules Koundé (France) wins a free kick in the defensive half.
Substitution, Belgium. Michy Batshuayi replaces Timothy Castagne.
Substitution, France. Léo Dubois replaces Benjamin Pavard.
Goal! Belgium 2, France 3. Theo Hernández (France) left footed shot from the left side of the box to the bottom right corner.
Paul Pogba (France) hits the bar with a right footed shot from outside the box from a direct free kick.
Foul by Axel Witsel (Belgium).
Karim Benzema (France) wins a free kick in the attacking half.
VAR Decision: No Goal Belgium 2-2 France.
Offside, Belgium. Yannick Carrasco tries a through ball, but Romelu Lukaku is caught offside.
Attempt missed. Kylian Mbappé (France) right footed shot from the centre of the box is close, but misses to the left. Assisted by Karim Benzema.
Leandro Trossard (Belgium) wins a free kick in the attacking half.
Foul by Jules Koundé (France).
Corner, France. Conceded by Timothy Castagne.
Attempt missed. Antoine Griezmann (France) left footed shot from outside the box is too high. Assisted by Paul Pogba.
Offside, Belgium. Leandro Trossard tries a through ball, but Romelu Lukaku is caught offside.
Attempt saved. Aurélien Tchouaméni (France) right footed shot from outside the box is saved in the top centre of the goal.