Is this supposed to happen
According to standard: If the program is well-formed, then the program is supposed to be compiled successfully. The compiler is allowed to provide diagnostic messages. Lack of virtual destructor does not make the program ill-formed, even though it's a likely bug in this case.
Compilers typically have the option to treat warnings as errors. Given such option, the described behaviour is supposed to happen, even though that technically doesn't conform to the standard.
why does clang characterize this as an error
Clang can be configured to treat warnings as errors. Given such option is enabled, that would explain this behaviour.
but gnu doesn't?
Although GCC can also be configured to treat warnings as errors, if such option isn't enabled, that would explain this behaviour.
To solve the problem, declare the destructor as virtual.