--- gcc/cp/semantics.c.jj	2012-11-23 00:14:40.000000000 +0100
+++ gcc/cp/semantics.c	2012-12-03 14:02:54.407690163 +0100
@@ -6451,6 +6451,14 @@ adjust_temp_type (tree type, tree temp)
   /* Avoid wrapping an aggregate value in a NOP_EXPR.  */
   if (TREE_CODE (temp) == CONSTRUCTOR)
     return build_constructor (type, CONSTRUCTOR_ELTS (temp));
+  if (TREE_CODE (temp) == VECTOR_CST)
+    {
+      int i, count = TYPE_VECTOR_SUBPARTS (type);
+      tree *vec = XALLOCAVEC (tree, count);
+      for (i = 0; i < count; i++)
+	vec[i] = cp_fold_convert (TREE_TYPE (type), VECTOR_CST_ELT (temp, i));
+      return build_vector (type, vec);
+    }
   gcc_assert (SCALAR_TYPE_P (type));
   return cp_fold_convert (type, temp);
 }
--- gcc/testsuite/g++.dg/cpp0x/constexpr-55573.C.jj	2012-12-03 14:21:05.367303150 +0100
+++ gcc/testsuite/g++.dg/cpp0x/constexpr-55573.C	2012-12-03 14:19:42.000000000 +0100
@@ -0,0 +1,22 @@
+// PR c++/55573
+// { dg-do compile }
+// { dg-options "-std=gnu++11" }
+
+template <typename T, int N>
+struct ExtVecTraits {
+  typedef T __attribute__((vector_size (N * sizeof (T)))) type;
+};
+
+template <typename T>
+using Vec4 = typename ExtVecTraits<T,4>::type;
+
+template <typename T>
+struct Rot3
+{
+  typedef Vec4<T> Vec;
+  Vec axis[3];
+  constexpr Rot3 (Vec4<T> ix, Vec4<T> iy, Vec4<T> iz) : axis {ix, iy, iz} {}
+};
+
+typedef Vec4<float> Vec;
+Rot3<float> r2 ((Vec) {0, 1, 0, 0}, (Vec){0, 0, 1, 0}, (Vec){1, 0, 0, 0});
