Milan missed the chance to guarantee themselves a place in next season's Champions League as they were held to a 0-0 draw by Cagliari.
With their safety assured before kick-off, Cagliari did not have anything but pride to play for, yet Milan – shorn of the injured Zlatan Ibrahimovic – could not take the points which would have secured their top-four place thanks to their head-to-head record against fifth-placed Juventus, who beat Inter on Saturday.
Cagliari are the team that Stefano Pioli has won the most matches against as a coach in Serie A, but Milan had Gianluigi Donnarumma to thank as he made two huge saves in the second half.
Samu Castillejo missed a golden chance at the other end, while Hakan Calhanoglu sent a speculative effort crashing against the woodwork.
Alexis Saelemaekers forced the first save of the match, Alessio Cragno lunging across to tip a decent effort wide.
Theo Hernandez and Calhanoglu struck free-kicks over and into the wall respectively, but there was little other action in a tepid first half.
Indeed, it was Donnarumma who produced the first moment of quality, making a fantastic, instinctive stop from Leonardo Pavoletti's header nine minutes after the restart.
The Italian goalkeeper came to Milan's rescue again 11 minutes later, this time diving low to his right to keep out Diego Godin's header.
Milan should have been ahead moments after, only for Castillejo to volley over from point-blank range.
Calhanoglu almost produced a moment of magic to finally break the deadlock, but his venomous strike from a tight angle rattled the upright as Milan's Champions League hopes remain in the balance.
What does it mean? Top-four race set for photo finish
One of Milan, Juve or Napoli will miss out on the Champions League - and all that is left is to decide is which one will wind up finishing fifth.
Atalanta, thanks to their improved head-to-head record with Juve, are ensured of a place in UEFA's elite club competition once more, and it is Gian Piero Gasperini's team who Milan must face in their final game.
Juve will host Bologna, while third-placed Napoli have an equably favourable game against mid-table Hellas Verona. With no Ibrahimovic to rely on, will Milan have enough?
Donnarumma delivers, but will he be heading for pastures new?
Donnarumma may well have played for the final time as a Milan player at San Siro. He is out of contract at the end of the season and has been heavily linked with a move to Juve – Lille's Mike Maignan a reported Milan target.
Should this have been his farewell game, albeit in front of an empty stadium, the 22-year-old turned in another high-quality performance when it counted, making two fantastic stops from the only shots on target he faced.
Ibrahimovic absence felt up front
Milan's talisman will be out for the remainder of the campaign, plus he will also miss Euro 2020 with Sweden due to a knee injury.
Without him, Milan toiled at the time they needed some quality to shine through. They managed 21 attempts, yet only two were on target, Castillejo guilty of the worst miss when he sliced over from inside the six-yard box.
While Milan travel to Atalanta, Cagliari round off their Serie A season against Genoa.