ClassName ist aber kein Makro, sondern schon eine richtige Funktion die zur Laufzeit nachschlagen muss welche Klasse das Objekt denn ist. Es ist also nicht ok, keine Warnung zu generieren.
Delphi-Quellcode:
procedure p();
var
x, y, z: TObject;
begin
x := TObject.Create();
y := TInterfacedObject.Create();
z := nil;
WriteLn( x.ClassName() );
WriteLn( y.ClassName() );
WriteLn( z.ClassName() );
end;
Es gibt echt noch tausend andere Fälle dass der Compiler vor offensichtlichen Fehlern nicht warnt. Embarcadero stolpert ja selbst darüber, TJson.Format(..) beispielsweise hat bis vor ein, zwei Versionen ungültiges Json ausgespuckt weil der Rückgabewert nicht richtig initialisiert wurde und der Compiler davor nicht warnt.