aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2009-10-23 17:55:45 +0000
committerJohn McCall <rjmccall@apple.com>2009-10-23 17:55:45 +0000
commiteee91c3efbfc6a1509b42f39beb5533a9636fd70 (patch)
tree77a525301c503a57764424048732da8f06a5998a
parent38caf910aa1fbf3953bf05506b1e49577f46ab42 (diff)
Rebuild dependently-sized ext vectors if either the element type or the size
changed under the transform. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84953 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/TreeTransform.h3
-rw-r--r--test/SemaTemplate/ext-vector-type.cpp13
2 files changed, 15 insertions, 1 deletions
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index 7e0972fe03..dec94994a8 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -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());
diff --git a/test/SemaTemplate/ext-vector-type.cpp b/test/SemaTemplate/ext-vector-type.cpp
index b6aebc102f..7cc4ae930e 100644
--- a/test/SemaTemplate/ext-vector-type.cpp
+++ b/test/SemaTemplate/ext-vector-type.cpp
@@ -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}}
+}