]> granicus.if.org Git - clang/commitdiff
Rebuild dependently-sized ext vectors if either the element type or the size
authorJohn McCall <rjmccall@apple.com>
Fri, 23 Oct 2009 17:55:45 +0000 (17:55 +0000)
committerJohn McCall <rjmccall@apple.com>
Fri, 23 Oct 2009 17:55:45 +0000 (17:55 +0000)
changed under the transform.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84953 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/SemaTemplate/ext-vector-type.cpp

index 7e0972fe03c4e8d152cd9f63d4ba6899590c80b8..dec94994a8a095367a1abd52ac4f3712bf572d90 100644 (file)
@@ -2331,7 +2331,8 @@ QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
 
   QualType Result = TL.getType();
   if (getDerived().AlwaysRebuild() ||
-      (ElementType != T->getElementType() && Size.get() != T->getSizeExpr())) {
+      ElementType != T->getElementType() ||
+      Size.get() != T->getSizeExpr()) {
     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
                                                          move(Size),
                                                          T->getAttributeLoc());
index b6aebc102fb464e41a13dc8694c7f00c005abbc2..7cc4ae930ed21238a4483c179f5412b00cccfe23 100644 (file)
@@ -45,3 +45,16 @@ struct make5 {
   typedef int_ptr __attribute__((ext_vector_type(Length))) type; // expected-error{{invalid vector type}}             
 };
 
+template<int Length>
+struct make6 {
+  typedef int __attribute__((ext_vector_type(Length))) type;
+};
+
+int test_make6() {
+  make6<4>::type x;
+  x.w = 7;
+
+  make6<2>::type y;
+  y.x = -1;
+  y.w = -1; // expected-error{{vector component access exceeds type}}
+}