Real Madrid extended their Clasico victory to five in a row but it wasn't a walkover for the La Liga giants as Barcelona young players showed a glimpse of hope for the Catalans.
At the end of a pulsating contest in Saudi Arabia, Madrid scraped through 3-2 after extra-time and will now face either Atletico Madrid or Athletic Bilbao, who play on Thursday, in Sunday's final.
As expected, Madrid triumphed to make it a quintet of consecutive Clasico victories, the first time either side has enjoyed such dominance since Pep Guardiola's Barcelona won 5-0 at Camp Nou in 2010.
That Vinicius Junior and Karim Benzema, Madrid's deadly attacking duo, both scored again was not a shock either, nor even that the brilliant Ansu Fati came off the bench to head home in his first appearance in two months.
The surprise was that a youthful Barcelona side, that sits 17 points behind Real Madrid in LaLiga, pushed Madrid all the way at the King Fahd Stadium and for 10 minutes after Fati's late equaliser looked the more likely to reach the final.
Xavi Hernandez said this game would be an "exam" for his team and while they lost the game, it would be harsh not to conclude they passed.
By the end, Barcelona's 11 included Pedri, 19, Ez Abde, 20, Fati, 19, Nico Gonzalez, 20, and Ronald Araujo, 22. Gavi, 17, and Ferran Torres, 21, had gone off.
Madrid's own young gem, Vinicius, might prove to be the best of the lot, the Brazilian almost unstoppable again.
Luuk de Jong, though, equalised for Barcelona and after Fati cancelled out Benzema's strike, it needed Fede Valverde to score the winner in extra-time.
Barcelona were almost unrecognisable from the start, boosted by the return of several key players. Fati, Pedri, Frenkie de Jong and Araujo were all back after injury.
Torres also made his debut, 15 days after completing his move from Manchester City. He tested negative for Covid and was finally registered by LaLiga, Barca making space in their budget by extending the contract of Samuel Umtiti.
Real Madrid were the better side early on, slicker through midfield and more meaningful in attack.
Yet when the goal came, it was via an error from Sergio Busquets, the veteran robbed of the ball in the centre circle. Benzema caught him napping, received it back from Luka Modric and sent the ball into the path of Vinicius.
With three perfect touches, he controlled, pushed away from Ronald Araujo and lifted the ball into the net.