https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116666
--- Comment #5 from Patrick Palka <ppalka at gcc dot gnu.org> --- <stdin>: In instantiation of ‘struct glsl::VectorType<__vector(4) int, 4>’: <stdin>:577:63: required from here <stdin>:106:13: error: invalid vector type for attribute ‘vector_size’ <stdin>:108:22: error: invalid vector type for attribute ‘vector_size’ <stdin>:110:13: error: invalid vector type for attribute ‘vector_size’ Agreed. It looks like the code is trying to apply the vector_size attribute to an already vector type. Before r15-2331 we would prematurely strip the vector_size attribute on the dependent alias when used as a template argument for a dependent specialization, even though it affects the identity of the type, so VectorType<mask_type, N> is equivalent to VectorType<mask_index, N>. Now we don't, which AFAICT is the more desirable/consistent behavior. Though I wonder why Clang accepts the testcase given that it also rejects applying vector_size to a vector type directly: template<class T> struct X { typedef T A __attribute__((vector_size(16))); typedef A B __attribute__((vector_size(16))); // error }; template struct X<int>;