What is happening in your testcase is actually slightly different than you describe.
IEEE 1800-2012 74.6 says:
Writing to an array with an invalid index shall perform no operation, with the exceptions of
writing to element [$+1] of a queue (described in 7.10.1) and creating a new element of an associative array
(described in 7.8.6). Implementations may issue a warning if an invalid index occurs for a read or write
operation on an array.
The key phrase in that is “Implementations may issue a warning…”
This means each simulation vendor is free to choose for themselves if they issue warning message in cases like this or not. For example in QuestaSim we do not issue a warning in default mode, but you will get the warning
** Warning: class_array.sv(13): (vopt-2696) Element index 1 into ‘top1’ is out of bounds.
if you compile in -lint mode.
If you add a $display statement that prints the contents or size of your ‘top1’ array, you will see that it actually only contains 2 elements and the end your initial block