cppreference says that
All attributes unknown to an implementation are ignored without causing an error.
... but that this edict was introduced in C++17. What about earlier versions of C++? Are unknown attributes supposed to be errors? Is it implementation-defined what to do with them?
It was implementation-defined since its introduction in C++11.
See [dcl.attr.grammar]/5: