@@ -3014,12 +3014,13 @@ void SemaHLSL::processExplicitBindingsOnDecl(VarDecl *VD) {
30143014static bool CastInitializer (Sema &S, ASTContext &Ctx, Expr *E,
30153015 llvm::SmallVectorImpl<Expr *> &List,
30163016 llvm::SmallVectorImpl<QualType> &DestTypes) {
3017- if (List.size () >= DestTypes.size ())
3018- return false ;
3019- InitializedEntity Entity =
3020- InitializedEntity::InitializeParameter (Ctx, DestTypes[List.size ()], false );
3021- ExprResult Res =
3022- S.PerformCopyInitialization (Entity, E->getBeginLoc (), E);
3017+ if (List.size () >= DestTypes.size ()) {
3018+ List.push_back (E);
3019+ return true ;
3020+ }
3021+ InitializedEntity Entity = InitializedEntity::InitializeParameter (
3022+ Ctx, DestTypes[List.size ()], false );
3023+ ExprResult Res = S.PerformCopyInitialization (Entity, E->getBeginLoc (), E);
30233024 if (Res.isInvalid ())
30243025 return false ;
30253026 Expr *Init = Res.get ();
@@ -3028,18 +3029,16 @@ static bool CastInitializer(Sema &S, ASTContext &Ctx, Expr *E,
30283029}
30293030
30303031static void BuildInitializerList (Sema &S, ASTContext &Ctx, Expr *E,
3031- llvm::SmallVectorImpl<Expr *> &List,
3032- llvm::SmallVectorImpl<QualType> &DestTypes,
3033- bool &ExcessInits) {
3034- if (List.size () >= DestTypes.size ()) {
3032+ llvm::SmallVectorImpl<Expr *> &List,
3033+ llvm::SmallVectorImpl<QualType> &DestTypes,
3034+ bool &ExcessInits) {
3035+ if (List.size () >= DestTypes.size ())
30353036 ExcessInits = true ;
3036- return ;
3037- }
30383037
30393038 // If this is an initialization list, traverse the sub initializers.
30403039 if (auto *Init = dyn_cast<InitListExpr>(E)) {
30413040 for (auto *SubInit : Init->inits ())
3042- BuildIntializerList (S, Ctx, SubInit, List, DestTypes, ExcessInits);
3041+ BuildInitializerList (S, Ctx, SubInit, List, DestTypes, ExcessInits);
30433042 return ;
30443043 }
30453044
@@ -3053,10 +3052,8 @@ static void BuildInitializerList(Sema &S, ASTContext &Ctx, Expr *E,
30533052 if (auto *ATy = Ty->getAs <VectorType>()) {
30543053 uint64_t Size = ATy->getNumElements ();
30553054
3056- if (List.size () + Size > DestTypes.size ()) {
3055+ if (List.size () + Size > DestTypes.size ())
30573056 ExcessInits = true ;
3058- return ;
3059- }
30603057 QualType SizeTy = Ctx.getSizeType ();
30613058 uint64_t SizeTySize = Ctx.getTypeSize (SizeTy);
30623059 for (uint64_t I = 0 ; I < Size; ++I) {
@@ -3067,8 +3064,7 @@ static void BuildInitializerList(Sema &S, ASTContext &Ctx, Expr *E,
30673064 E, E->getBeginLoc (), Idx, E->getEndLoc ());
30683065 if (ElExpr.isInvalid ())
30693066 return ;
3070- if (!CastInitializer (S, Ctx, ElExpr.get (), List, DestTypes))
3071- return ;
3067+ CastInitializer (S, Ctx, ElExpr.get (), List, DestTypes);
30723068 }
30733069 return ;
30743070 }
@@ -3084,7 +3080,7 @@ static void BuildInitializerList(Sema &S, ASTContext &Ctx, Expr *E,
30843080 E, E->getBeginLoc (), Idx, E->getEndLoc ());
30853081 if (ElExpr.isInvalid ())
30863082 return ;
3087- BuildIntializerList (S, Ctx, ElExpr.get (), List, DestTypes, ExcessInits);
3083+ BuildInitializerList (S, Ctx, ElExpr.get (), List, DestTypes, ExcessInits);
30883084 }
30893085 return ;
30903086 }
@@ -3097,7 +3093,7 @@ static void BuildInitializerList(Sema &S, ASTContext &Ctx, Expr *E,
30973093 E, false , E->getBeginLoc (), CXXScopeSpec (), FD, Found, NameInfo);
30983094 if (Res.isInvalid ())
30993095 return ;
3100- BuildIntializerList (S, Ctx, Res.get (), List, DestTypes, ExcessInits);
3096+ BuildInitializerList (S, Ctx, Res.get (), List, DestTypes, ExcessInits);
31013097 }
31023098 }
31033099}
@@ -3109,6 +3105,7 @@ static Expr *GenerateInitLists(ASTContext &Ctx, QualType Ty,
31093105 }
31103106 llvm::SmallVector<Expr *> Inits;
31113107 assert (!isa<MatrixType>(Ty) && " Matrix types not yet supported in HLSL" );
3108+ Ty = Ty.getDesugaredType (Ctx);
31123109 if (Ty->isVectorType () || Ty->isConstantArrayType ()) {
31133110 QualType ElTy;
31143111 uint64_t Size = 0 ;
@@ -3151,7 +3148,7 @@ bool SemaHLSL::TransformInitList(const InitializedEntity &Entity,
31513148 llvm::SmallVector<Expr *, 16 > ArgExprs;
31523149 bool ExcessInits = false ;
31533150 for (Expr *Arg : Init->inits ())
3154- BuildIntializerList (SemaRef, Ctx, Arg, ArgExprs, DestTypes, ExcessInits);
3151+ BuildInitializerList (SemaRef, Ctx, Arg, ArgExprs, DestTypes, ExcessInits);
31553152
31563153 if (DestTypes.size () != ArgExprs.size () || ExcessInits) {
31573154 int TooManyOrFew = ExcessInits ? 1 : 0 ;
0 commit comments