The Swiss second seed and two-time champion in Canada will take on Jo-Wilfried Tsonga after the Frenchman rolled over rising star Grigor Dimitrov 6-4, 6-3.
Tsonga, seeded 13th and loser to Federer in two previous finals, will be playing his first final in Canada, while Federer moved into his 120th career final.
Federer stayed in total control from the opening point against Lopez, who was treated in the second set for an apparent neck problem.
The 32-year-old Spaniard has now lost all 11 of his matches with Federer, who will be looking for an 80th career trophy when he plays Tsonga.
"I'm happy to be playing in such good form," said Federer, who turned 33 on Friday and lost just four points in serve in the first set. I'm super-happy to be in the final."
"The key to the match was always the big serve. I had to focus on my own and then try to create chances. I started well from the get-go.
"I could tell Feliciano was tired, he's played a lot of tennis this week. The second set was maybe not of the highest quality, but I was seeing the ball very well.
"The final will be exciting, Jo has been playing well. I know what's ahead of me, I have my work cut out if I want to win the trophy."
Federer improved his 2014 record to 44 wins and eight defeats as he bids for a third title of the season after Dubai and Halle. He is only a month removed from the Wimbledon final.
The winner fired 13 aces and never faced a break point while forcing Lopez to save nine of 11 break points.
The 29-year-old Tsonga will face off for his second Masters 1000 shield on Sunday. He claimed a Masters win at Paris Bercy in 2008, but lost in Paris and London in two other finals to Federer.
"I'm feeling good, I've been waiting for this moment since a couple of years now. I've always believed it myself during all these years, and all those weeks where I was losing," he said.
"Finally I get a little reward (with the victory), it's good for me. It will for sure make me stronger, keep my motivation at the highest level."
Tsonga spent fewer than 90 minutes in dispatching 23-year-old Bulgarian Dimitrov, the youngest member of the ATP Tour's top 10 who stands eighth in the world and is tipped as one of the stars of the future.
The Frenchman took victory on his second match point after a tie in which he struck seven aces, saved all four break points he faced and fired 22 winners as he broke his opponent three times.
Tsonga needed to work for three-quarters of an hour to win the opening set against a player he beat three times in 2011.
Tsonga earned a break for 5-4 in the opener and claimed the set after a marathon final game in which he saved four break points.
In the second set, the Frenchman got on top 2-1 and then broke again in the final game to post his 29th win of the season against 13 losses.