The world number one, a three-time runner-up and seeking a maiden Roland Garros crown to complete the career Grand Slam, defeated Czech seventh seed Tomas Berdych 6-3, 7-5, 6-3, claiming a place in an eighth French Open semi-final and sixth in succession.
But the 29-year-old Serb, who will face Dominic Thiem of Austria for a spot in the final, admitted he was lucky to escape being kicked out of the tournament in the second game of the third set.