Heat the olive oil in a Dutch oven over medium heat. Add the onion and cook, stirring frequently, for 12 to 15 minutes until soft and golden.
Add the garlic and a pinch of salt. Cook for 1 minute, stirring constantly.
Add the tomatoes, stock, basil, and pepper. Increase the heat to high and bring to a boil, then reduce the heat and simmer for 15 minutes, stirring occasionally.
Remove from heat and purée with an immersion blender until smooth.
Stir in the parmesan until melted. If the soup is very hot, temper the cream by stirring a small amount of the soup into it first. Stir in the cream.
Return the pot to low heat and stir for about 5 minutes until the soup is hot. Do not let it boil. Season with salt and pepper to taste and garnish with fresh basil.
Notes
Use a deep pot or Dutch oven for immersion blending without splatter. A regular blender can be used, but blend in two batches and vent the lid.Fresh tomatoes: Halve about 3 pounds of Roma or San Marzano tomatoes, toss with olive oil, salt, and pepper, and roast at 400°F for 40 to 45 minutes. Use them with their juices in place of the canned tomatoes.Slow cooker: Cook the onion and garlic on the stove first, then add them to the slow cooker with the tomatoes, stock, basil, and pepper. Cook on low 6 to 8 hours or high 3 to 4 hours. Blend, stir in the parmesan and cream, and cook on low 20 to 30 minutes more.To freeze: Freeze the soup before adding the parmesan and cream for up to 3 months. Stir them in after reheating.