You're right; code could have used 'async = 1' before.
Another technique is:
try:
import test_module
except SyntaxError:
...
except NameError:
...
Nonetheless, my point wasn't really to show that eval() was essential, only that any language which supports eval() will have these problems.
Is C a permissive language?
C99 added support for BCPL-style comments, causing
int a = 1 //* */ 2
;
to give different behavior. C11 removed gets(), and broke code which just happened to define its own aligned_alloc() while also #including stdlib.h.