summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNate Begeman <natebegeman@mac.com>2009-02-15 22:45:20 +0000
committerNate Begeman <natebegeman@mac.com>2009-02-15 22:45:20 +0000
commita6b47a41429fb9bc7e8dcacc014dac37d5759a02 (patch)
treee9127d85ece7201b8ca65f22baf0d6acce9e0e55
parent4576b2eebdba83c913166e8e26ba4310ee442f45 (diff)
downloadbcm5719-llvm-a6b47a41429fb9bc7e8dcacc014dac37d5759a02.tar.gz
bcm5719-llvm-a6b47a41429fb9bc7e8dcacc014dac37d5759a02.zip
Don't allow taking the address of an element in an ext_vector
llvm-svn: 64614
-rw-r--r--clang/lib/Sema/SemaExpr.cpp6
-rw-r--r--clang/test/Sema/expr-address-of.c7
2 files changed, 9 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 3143fc7aa1f..60a1bea2f47 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -3485,10 +3485,10 @@ QualType Sema::CheckAddressOfOperand(Expr *op, SourceLocation OpLoc) {
}
}
// Check for Apple extension for accessing vector components.
- } else if (isa<ArraySubscriptExpr>(op) &&
- cast<ArraySubscriptExpr>(op)->getBase()->getType()->isVectorType()) {
+ } else if (isa<ExtVectorElementExpr>(op) || (isa<ArraySubscriptExpr>(op) &&
+ cast<ArraySubscriptExpr>(op)->getBase()->getType()->isVectorType())){
Diag(OpLoc, diag::err_typecheck_address_of)
- << "vector" << op->getSourceRange();
+ << "vector element" << op->getSourceRange();
return QualType();
} else if (dcl) { // C99 6.5.3.2p1
// We have an lvalue with a decl. Make sure the decl is not declared
diff --git a/clang/test/Sema/expr-address-of.c b/clang/test/Sema/expr-address-of.c
index 58bc540a30d..7dd7dd67d37 100644
--- a/clang/test/Sema/expr-address-of.c
+++ b/clang/test/Sema/expr-address-of.c
@@ -28,9 +28,14 @@ void foo() {
void testVectorComponentAccess() {
typedef float v4sf __attribute__ ((vector_size (16)));
static v4sf q;
- float* r = &q[0]; // expected-error {{address of vector requested}}
+ float* r = &q[0]; // expected-error {{address of vector element requested}}
}
+typedef __attribute__(( ext_vector_type(4) )) float float4;
+
+float *testExtVectorComponentAccess(float4 x) {
+ return &x.w; // expected-error {{address of vector element requested}}
+}
void f0() {
register int *x0;
OpenPOWER on IntegriCloud