@@ -3060,12 +3060,13 @@ void SemaHLSL::processExplicitBindingsOnDecl(VarDecl *VD) {
30603060static bool CastInitializer (Sema &S, ASTContext &Ctx, Expr *E,
30613061 llvm::SmallVectorImpl<Expr *> &List,
30623062 llvm::SmallVectorImpl<QualType> &DestTypes) {
3063- if (List.size () >= DestTypes.size ())
3064- return false ;
3065- InitializedEntity Entity =
3066- InitializedEntity::InitializeParameter (Ctx, DestTypes[List.size ()], false );
3067- ExprResult Res =
3068- S.PerformCopyInitialization (Entity, E->getBeginLoc (), E);
3063+ if (List.size () >= DestTypes.size ()) {
3064+ List.push_back (E);
3065+ return true ;
3066+ }
3067+ InitializedEntity Entity = InitializedEntity::InitializeParameter (
3068+ Ctx, DestTypes[List.size ()], false );
3069+ ExprResult Res = S.PerformCopyInitialization (Entity, E->getBeginLoc (), E);
30693070 if (Res.isInvalid ())
30703071 return false ;
30713072 Expr *Init = Res.get ();
@@ -3074,18 +3075,16 @@ static bool CastInitializer(Sema &S, ASTContext &Ctx, Expr *E,
30743075}
30753076
30763077static void BuildInitializerList (Sema &S, ASTContext &Ctx, Expr *E,
3077- llvm::SmallVectorImpl<Expr *> &List,
3078- llvm::SmallVectorImpl<QualType> &DestTypes,
3079- bool &ExcessInits) {
3080- if (List.size () >= DestTypes.size ()) {
3078+ llvm::SmallVectorImpl<Expr *> &List,
3079+ llvm::SmallVectorImpl<QualType> &DestTypes,
3080+ bool &ExcessInits) {
3081+ if (List.size () >= DestTypes.size ())
30813082 ExcessInits = true ;
3082- return ;
3083- }
30843083
30853084 // If this is an initialization list, traverse the sub initializers.
30863085 if (auto *Init = dyn_cast<InitListExpr>(E)) {
30873086 for (auto *SubInit : Init->inits ())
3088- BuildIntializerList (S, Ctx, SubInit, List, DestTypes, ExcessInits);
3087+ BuildInitializerList (S, Ctx, SubInit, List, DestTypes, ExcessInits);
30893088 return ;
30903089 }
30913090
@@ -3099,10 +3098,8 @@ static void BuildInitializerList(Sema &S, ASTContext &Ctx, Expr *E,
30993098 if (auto *ATy = Ty->getAs <VectorType>()) {
31003099 uint64_t Size = ATy->getNumElements ();
31013100
3102- if (List.size () + Size > DestTypes.size ()) {
3101+ if (List.size () + Size > DestTypes.size ())
31033102 ExcessInits = true ;
3104- return ;
3105- }
31063103 QualType SizeTy = Ctx.getSizeType ();
31073104 uint64_t SizeTySize = Ctx.getTypeSize (SizeTy);
31083105 for (uint64_t I = 0 ; I < Size; ++I) {
@@ -3113,8 +3110,7 @@ static void BuildInitializerList(Sema &S, ASTContext &Ctx, Expr *E,
31133110 E, E->getBeginLoc (), Idx, E->getEndLoc ());
31143111 if (ElExpr.isInvalid ())
31153112 return ;
3116- if (!CastInitializer (S, Ctx, ElExpr.get (), List, DestTypes))
3117- return ;
3113+ CastInitializer (S, Ctx, ElExpr.get (), List, DestTypes);
31183114 }
31193115 return ;
31203116 }
@@ -3130,7 +3126,7 @@ static void BuildInitializerList(Sema &S, ASTContext &Ctx, Expr *E,
31303126 E, E->getBeginLoc (), Idx, E->getEndLoc ());
31313127 if (ElExpr.isInvalid ())
31323128 return ;
3133- BuildIntializerList (S, Ctx, ElExpr.get (), List, DestTypes, ExcessInits);
3129+ BuildInitializerList (S, Ctx, ElExpr.get (), List, DestTypes, ExcessInits);
31343130 }
31353131 return ;
31363132 }
@@ -3143,7 +3139,7 @@ static void BuildInitializerList(Sema &S, ASTContext &Ctx, Expr *E,
31433139 E, false , E->getBeginLoc (), CXXScopeSpec (), FD, Found, NameInfo);
31443140 if (Res.isInvalid ())
31453141 return ;
3146- BuildIntializerList (S, Ctx, Res.get (), List, DestTypes, ExcessInits);
3142+ BuildInitializerList (S, Ctx, Res.get (), List, DestTypes, ExcessInits);
31473143 }
31483144 }
31493145}
@@ -3155,6 +3151,7 @@ static Expr *GenerateInitLists(ASTContext &Ctx, QualType Ty,
31553151 }
31563152 llvm::SmallVector<Expr *> Inits;
31573153 assert (!isa<MatrixType>(Ty) && " Matrix types not yet supported in HLSL" );
3154+ Ty = Ty.getDesugaredType (Ctx);
31583155 if (Ty->isVectorType () || Ty->isConstantArrayType ()) {
31593156 QualType ElTy;
31603157 uint64_t Size = 0 ;
@@ -3197,7 +3194,7 @@ bool SemaHLSL::TransformInitList(const InitializedEntity &Entity,
31973194 llvm::SmallVector<Expr *, 16 > ArgExprs;
31983195 bool ExcessInits = false ;
31993196 for (Expr *Arg : Init->inits ())
3200- BuildIntializerList (SemaRef, Ctx, Arg, ArgExprs, DestTypes, ExcessInits);
3197+ BuildInitializerList (SemaRef, Ctx, Arg, ArgExprs, DestTypes, ExcessInits);
32013198
32023199 if (DestTypes.size () != ArgExprs.size () || ExcessInits) {
32033200 int TooManyOrFew = ExcessInits ? 1 : 0 ;
0 commit comments