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;
+}