Por motivos de desempenho, o LLVM pode mapear o tipo <3 x double> para um par de _ m128d (em x86 64), expandindo efetivamente a largura do tipo em um elemento. Isso quebra o programa se o bloco de memória for alocado como uma matriz de duplos sob a suposição de que cada vetor tem 3 elementos de largura e, em seguida, convertido para o tipo de vetor.
Por exemplo, o seguinte programa compilado com Clang:
#include <stdio.h>
typedef double double3 __attribute__((ext_vector_type(3)));
int main(void) {
double a[] = {1, 2, 3, 4, 5, 6, 7, 8};
double b[] = {0, 0, 0, 0, 0, 0, 0, 0};
((double3 *)b)[0] = ((double3 *)a)[0];
((double3 *)b)[1] = ((double3 *)a)[1];
printf("%lf %lf %lf %lf %lf %lfn",
b[0], b[1], b[2], b[3], b[4], b[5]);
return 0;
}
produz o seguinte:
1.000000 2.000000 3.000000 0.000000 5.000000 6.000000
O Elemento 4 mapeia para o espaço alargado e é ignorado.