| // RUN: %clang_cc1 -fsyntax-only -verify %s | 
 |  | 
 | // Test template instantiation for Clang-specific features. | 
 |  | 
 | // --------------------------------------------------------------------- | 
 | // Vector types | 
 | // --------------------------------------------------------------------- | 
 | typedef __attribute__(( ext_vector_type(2) )) double double2; | 
 | typedef __attribute__(( ext_vector_type(4) )) double double4; | 
 |  | 
 | template<typename T> | 
 | struct ExtVectorAccess0 { | 
 |   void f(T v1, double4 v2) { | 
 |     v1.xy = v2.yx; | 
 |   } | 
 | }; | 
 |  | 
 | template struct ExtVectorAccess0<double2>; | 
 | template struct ExtVectorAccess0<double4>; | 
 |  | 
 | typedef __attribute__(( ext_vector_type(2) )) double double2; | 
 |  | 
 | template<typename T, typename U, int N, int M> | 
 | struct ShuffleVector0 { | 
 |   void f(T t, U u, double2 a, double2 b) { | 
 |     (void)__builtin_shufflevector(t, u, N, M); // expected-error{{index}} | 
 |     (void)__builtin_shufflevector(a, b, N, M); // expected-error{{index}} | 
 |     (void)__builtin_shufflevector(a, b, 2, 1); | 
 |   } | 
 | }; | 
 |  | 
 | template struct ShuffleVector0<double2, double2, 2, 1>; | 
 | template struct ShuffleVector0<double2, double2, 4, 3>; // expected-note{{instantiation}} | 
 |  | 
 |  |