Finish up semantic analysis for vector components.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40584 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/Expr.cpp b/AST/Expr.cpp
index 11aca82..36ab033 100644
--- a/AST/Expr.cpp
+++ b/AST/Expr.cpp
@@ -226,6 +226,10 @@
     break;
   case ParenExprClass: // C99 6.5.1p5
     return cast<ParenExpr>(this)->getSubExpr()->isLvalue();
+  case OCUVectorComponentClass:
+    if (cast<OCUVectorComponent>(this)->containsDuplicateComponents())
+      return LV_DuplicateVectorComponents;
+    return LV_Valid;
   default:
     break;
   }
@@ -244,6 +248,7 @@
   case LV_Valid: break;
   case LV_NotObjectType: return MLV_NotObjectType;
   case LV_IncompleteVoidType: return MLV_IncompleteVoidType;
+  case LV_DuplicateVectorComponents: return MLV_DuplicateVectorComponents;
   case LV_InvalidExpression: return MLV_InvalidExpression;
   }
   if (TR.isConstQualified())
@@ -581,3 +586,16 @@
   if (VT->isTextureAccessor(*compStr)) return Texture;
   assert(0 && "getComponentType(): Illegal accessor");
 }
+
+bool OCUVectorComponent::containsDuplicateComponents() const {
+  const char *compStr = Accessor.getName();
+  unsigned length = strlen(compStr);
+  
+  for (unsigned i = 0; i < length-1; i++) {
+    const char *s = compStr+i;
+    for (const char c = *s++; *s; s++)
+      if (c == *s) 
+        return true;
+  }
+  return false;
+}