]> granicus.if.org Git - clang/commitdiff
Don't allow taking the address of an element in an ext_vector
authorNate Begeman <natebegeman@mac.com>
Sun, 15 Feb 2009 22:45:20 +0000 (22:45 +0000)
committerNate Begeman <natebegeman@mac.com>
Sun, 15 Feb 2009 22:45:20 +0000 (22:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64614 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/Sema/expr-address-of.c

index 3143fc7aa1faf1ea8b8c19d294dd33f1855a9eb4..60a1bea2f47cc5f8e40dc17d318c0eccefb472db 100644 (file)
@@ -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 
index 58bc540a30d57c9b26ec5223810a132d2d1d8b48..7dd7dd67d37eab788787b2cdac8b6506464d515b 100644 (file)
@@ -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;