================ @@ -3010,3 +3013,193 @@ void SemaHLSL::processExplicitBindingsOnDecl(VarDecl *VD) { } } } + +static bool CastInitializer(Sema &S, ASTContext &Ctx, Expr *E, + llvm::SmallVectorImpl<Expr *> &List, + llvm::SmallVectorImpl<QualType> &DestTypes) { + if (List.size() >= DestTypes.size()) { + List.push_back(E); + // This is odd, but it isn't technically a failure due to conversion, we + // handle mismatched counts of arguments differently. + return true; + } + InitializedEntity Entity = InitializedEntity::InitializeParameter( + Ctx, DestTypes[List.size()], false); + ExprResult Res = S.PerformCopyInitialization(Entity, E->getBeginLoc(), E); + if (Res.isInvalid()) + return false; + Expr *Init = Res.get(); + List.push_back(Init); + return true; +} + +static bool BuildInitializerList(Sema &S, ASTContext &Ctx, Expr *E, + llvm::SmallVectorImpl<Expr *> &List, + llvm::SmallVectorImpl<QualType> &DestTypes) { + // If this is an initialization list, traverse the sub initializers. + if (auto *Init = dyn_cast<InitListExpr>(E)) { + for (auto *SubInit : Init->inits()) + if (!BuildInitializerList(S, Ctx, SubInit, List, DestTypes)) + return false; + return true; + } + + // If this is a scalar type, just enqueue the expression. + QualType Ty = E->getType(); + + if (Ty->isScalarType() || (Ty->isRecordType() && !Ty->isAggregateType())) + return CastInitializer(S, Ctx, E, List, DestTypes); + + if (auto *ATy = Ty->getAs<VectorType>()) { ---------------- bogner wrote:
I find these abbreviations a bit confusing. `ATy` is a vector type? `VTy` is an array type? Might be best to use longer names here. https://github.com/llvm/llvm-project/pull/123141 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits