diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 9002dd14faecc4bc831dfec8b660fda19c7e483e..703ddd3cc7a6b3a00485cae838bb6f9eb9f613fe 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -8114,7 +8114,7 @@ build_reinterpret_cast_1 (location_t loc, tree type, tree expr,
 		    "pointer-to-object is conditionally-supported");
       return build_nop_reinterpret (type, expr);
     }
-  else if (gnu_vector_type_p (type))
+  else if (gnu_vector_type_p (type) && scalarish_type_p (intype))
     return convert_to_vector (type, rvalue (expr));
   else if (gnu_vector_type_p (intype)
 	   && INTEGRAL_OR_ENUMERATION_TYPE_P (type))
diff --git a/gcc/testsuite/g++.dg/ext/vector41.C b/gcc/testsuite/g++.dg/ext/vector41.C
new file mode 100644
index 0000000000000000000000000000000000000000..bfc3bb6db4bd5c05c5c0edb7637448d7d878a9f9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/vector41.C
@@ -0,0 +1,12 @@
+// PR c++/100517
+// { dg-options "" }
+
+typedef int __v2si __attribute__ ((__vector_size__ (8)));
+
+struct S { };
+
+void
+f (S s)
+{
+  (void) reinterpret_cast<__v2si> (s); // { dg-error "" }
+}