@@ -4914,6 +4914,40 @@ Expr* SemanticsVisitor::checkGeneralMemberLookupExpr(MemberExpr* expr, Type* bas
4914
4914
return createLookupResultExpr (expr->name , lookupResult, expr->baseExpression , expr->loc , expr);
4915
4915
}
4916
4916
4917
+ bool isValidVectorSwizzleName (Name* name)
4918
+ {
4919
+ if (!name)
4920
+ return false ;
4921
+ if (name->text .getLength () > 4 || name->text .getLength () == 0 )
4922
+ return false ;
4923
+ bool isRGBA = false ;
4924
+ bool isXYZW = false ;
4925
+ for (auto ch : name->text )
4926
+ {
4927
+ switch (ch)
4928
+ {
4929
+ case ' w' :
4930
+ case ' x' :
4931
+ case ' y' :
4932
+ case ' z' :
4933
+ isXYZW = true ;
4934
+ continue ;
4935
+ case ' r' :
4936
+ case ' g' :
4937
+ case ' b' :
4938
+ case ' a' :
4939
+ isRGBA = true ;
4940
+ continue ;
4941
+ default :
4942
+ return false ;
4943
+ }
4944
+ }
4945
+ // A valid swizzle cannot mix XYZW and RGBA.
4946
+ if (isXYZW && isRGBA)
4947
+ return false ;
4948
+ return true ;
4949
+ }
4950
+
4917
4951
Expr* SemanticsExprVisitor::visitMemberExpr (MemberExpr* expr)
4918
4952
{
4919
4953
bool needDeref = false ;
@@ -4955,15 +4989,21 @@ Expr* SemanticsExprVisitor::visitMemberExpr(MemberExpr* expr)
4955
4989
}
4956
4990
if (auto baseVecType = as<VectorExpressionType>(baseType))
4957
4991
{
4958
- return CheckSwizzleExpr (
4959
- expr,
4960
- baseVecType->getElementType (),
4961
- baseVecType->getElementCount ());
4992
+ if (isValidVectorSwizzleName (expr->name ))
4993
+ {
4994
+ return CheckSwizzleExpr (
4995
+ expr,
4996
+ baseVecType->getElementType (),
4997
+ baseVecType->getElementCount ());
4998
+ }
4962
4999
}
4963
- else if (auto baseScalarType = as<BasicExpressionType>(baseType))
5000
+ if (auto baseScalarType = as<BasicExpressionType>(baseType))
4964
5001
{
4965
- // Treat scalar like a 1-element vector when swizzling
4966
- return CheckSwizzleExpr (expr, baseScalarType, 1 );
5002
+ if (isValidVectorSwizzleName (expr->name ))
5003
+ {
5004
+ // Treat scalar like a 1-element vector when swizzling
5005
+ return CheckSwizzleExpr (expr, baseScalarType, 1 );
5006
+ }
4967
5007
}
4968
5008
else if (as<NamespaceType>(baseType))
4969
5009
{
0 commit comments