1717#include " clang/AST/ExprCXX.h"
1818#include " clang/AST/ExprObjC.h"
1919#include " clang/AST/IgnoreExpr.h"
20+ #include " clang/AST/TypeBase.h"
2021#include " clang/AST/TypeLoc.h"
2122#include " clang/Basic/SourceManager.h"
2223#include " clang/Basic/Specifiers.h"
@@ -403,6 +404,9 @@ class InitListChecker {
403404 unsigned &Index,
404405 InitListExpr *StructuredList,
405406 unsigned &StructuredIndex);
407+ void CheckMatrixType (const InitializedEntity &Entity, InitListExpr *IList,
408+ QualType DeclType, unsigned &Index,
409+ InitListExpr *StructuredList, unsigned &StructuredIndex);
406410 void CheckVectorType (const InitializedEntity &Entity,
407411 InitListExpr *IList, QualType DeclType, unsigned &Index,
408412 InitListExpr *StructuredList,
@@ -1004,7 +1008,8 @@ InitListChecker::FillInEmptyInitializations(const InitializedEntity &Entity,
10041008 return ;
10051009
10061010 if (ElementEntity.getKind () == InitializedEntity::EK_ArrayElement ||
1007- ElementEntity.getKind () == InitializedEntity::EK_VectorElement)
1011+ ElementEntity.getKind () == InitializedEntity::EK_VectorElement ||
1012+ ElementEntity.getKind () == InitializedEntity::EK_MatrixElement)
10081013 ElementEntity.setElementIndex (Init);
10091014
10101015 if (Init >= NumInits && (ILE->hasArrayFiller () || SkipEmptyInitChecks))
@@ -1274,6 +1279,7 @@ static void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity,
12741279
12751280 switch (Entity.getKind ()) {
12761281 case InitializedEntity::EK_VectorElement:
1282+ case InitializedEntity::EK_MatrixElement:
12771283 case InitializedEntity::EK_ComplexElement:
12781284 case InitializedEntity::EK_ArrayElement:
12791285 case InitializedEntity::EK_Parameter:
@@ -1373,11 +1379,12 @@ void InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity,
13731379 SemaRef.Diag (IList->getInit (Index)->getBeginLoc (), DK)
13741380 << T << IList->getInit (Index)->getSourceRange ();
13751381 } else {
1376- int initKind = T->isArrayType () ? 0 :
1377- T->isVectorType () ? 1 :
1378- T->isScalarType () ? 2 :
1379- T->isUnionType () ? 3 :
1380- 4 ;
1382+ int initKind = T->isArrayType () ? 0
1383+ : T->isVectorType () ? 1
1384+ : T->isMatrixType () ? 2
1385+ : T->isScalarType () ? 3
1386+ : T->isUnionType () ? 4
1387+ : 5 ;
13811388
13821389 unsigned DK = ExtraInitsIsError ? diag::err_excess_initializers
13831390 : diag::ext_excess_initializers;
@@ -1431,6 +1438,9 @@ void InitListChecker::CheckListElementTypes(const InitializedEntity &Entity,
14311438 } else if (DeclType->isVectorType ()) {
14321439 CheckVectorType (Entity, IList, DeclType, Index,
14331440 StructuredList, StructuredIndex);
1441+ } else if (DeclType->isMatrixType ()) {
1442+ CheckMatrixType (Entity, IList, DeclType, Index, StructuredList,
1443+ StructuredIndex);
14341444 } else if (const RecordDecl *RD = DeclType->getAsRecordDecl ()) {
14351445 auto Bases =
14361446 CXXRecordDecl::base_class_const_range (CXXRecordDecl::base_class_const_iterator (),
@@ -1878,6 +1888,37 @@ void InitListChecker::CheckReferenceType(const InitializedEntity &Entity,
18781888 AggrDeductionCandidateParamTypes->push_back (DeclType);
18791889}
18801890
1891+ void InitListChecker::CheckMatrixType (const InitializedEntity &Entity,
1892+ InitListExpr *IList, QualType DeclType,
1893+ unsigned &Index,
1894+ InitListExpr *StructuredList,
1895+ unsigned &StructuredIndex) {
1896+ if (!SemaRef.getLangOpts ().HLSL )
1897+ return ;
1898+
1899+ const ConstantMatrixType *MT = DeclType->castAs <ConstantMatrixType>();
1900+ QualType ElemTy = MT->getElementType ();
1901+ const unsigned MaxElts = MT->getNumElementsFlattened ();
1902+
1903+ unsigned NumEltsInit = 0 ;
1904+ InitializedEntity ElemEnt =
1905+ InitializedEntity::InitializeElement (SemaRef.Context , 0 , Entity);
1906+
1907+ while (NumEltsInit < MaxElts && Index < IList->getNumInits ()) {
1908+ // Not a sublist: just consume directly.
1909+ ElemEnt.setElementIndex (Index);
1910+ CheckSubElementType (ElemEnt, IList, ElemTy, Index, StructuredList,
1911+ StructuredIndex);
1912+ ++NumEltsInit;
1913+ }
1914+
1915+ // For HLSL The error for this case is handled in SemaHLSL's initializer
1916+ // list diagnostics, That means the execution should require NumEltsInit
1917+ // to equal Max initializers. In other words execution should never
1918+ // reach this point if this condition is not true".
1919+ assert (NumEltsInit == MaxElts && " NumEltsInit must equal MaxElts" );
1920+ }
1921+
18811922void InitListChecker::CheckVectorType (const InitializedEntity &Entity,
18821923 InitListExpr *IList, QualType DeclType,
18831924 unsigned &Index,
@@ -3640,6 +3681,9 @@ InitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index,
36403681 } else if (const VectorType *VT = Parent.getType ()->getAs <VectorType>()) {
36413682 Kind = EK_VectorElement;
36423683 Type = VT->getElementType ();
3684+ } else if (const MatrixType *MT = Parent.getType ()->getAs <MatrixType>()) {
3685+ Kind = EK_MatrixElement;
3686+ Type = MT->getElementType ();
36433687 } else {
36443688 const ComplexType *CT = Parent.getType ()->getAs <ComplexType>();
36453689 assert (CT && " Unexpected type" );
@@ -3688,6 +3732,7 @@ DeclarationName InitializedEntity::getName() const {
36883732 case EK_Delegating:
36893733 case EK_ArrayElement:
36903734 case EK_VectorElement:
3735+ case EK_MatrixElement:
36913736 case EK_ComplexElement:
36923737 case EK_BlockElement:
36933738 case EK_LambdaToBlockConversionBlockElement:
@@ -3721,6 +3766,7 @@ ValueDecl *InitializedEntity::getDecl() const {
37213766 case EK_Delegating:
37223767 case EK_ArrayElement:
37233768 case EK_VectorElement:
3769+ case EK_MatrixElement:
37243770 case EK_ComplexElement:
37253771 case EK_BlockElement:
37263772 case EK_LambdaToBlockConversionBlockElement:
@@ -3754,6 +3800,7 @@ bool InitializedEntity::allowsNRVO() const {
37543800 case EK_Delegating:
37553801 case EK_ArrayElement:
37563802 case EK_VectorElement:
3803+ case EK_MatrixElement:
37573804 case EK_ComplexElement:
37583805 case EK_BlockElement:
37593806 case EK_LambdaToBlockConversionBlockElement:
@@ -3793,6 +3840,9 @@ unsigned InitializedEntity::dumpImpl(raw_ostream &OS) const {
37933840 case EK_Delegating: OS << " Delegating" ; break ;
37943841 case EK_ArrayElement: OS << " ArrayElement " << Index; break ;
37953842 case EK_VectorElement: OS << " VectorElement " << Index; break ;
3843+ case EK_MatrixElement:
3844+ OS << " MatrixElement " << Index;
3845+ break ;
37963846 case EK_ComplexElement: OS << " ComplexElement " << Index; break ;
37973847 case EK_BlockElement: OS << " Block" ; break ;
37983848 case EK_LambdaToBlockConversionBlockElement:
@@ -6030,7 +6080,7 @@ static void TryOrBuildParenListInitialization(
60306080 Sequence.SetFailed (InitializationSequence::FK_ParenthesizedListInitFailed);
60316081 if (!VerifyOnly) {
60326082 QualType T = Entity.getType ();
6033- int InitKind = T->isArrayType () ? 0 : T->isUnionType () ? 3 : 4 ;
6083+ int InitKind = T->isArrayType () ? 0 : T->isUnionType () ? 4 : 5 ;
60346084 SourceRange ExcessInitSR (Args[EntityIndexToProcess]->getBeginLoc (),
60356085 Args.back ()->getEndLoc ());
60366086 S.Diag (Kind.getLocation (), diag::err_excess_initializers)
@@ -6823,7 +6873,8 @@ void InitializationSequence::InitializeFrom(Sema &S,
68236873 // For HLSL ext vector types we allow list initialization behavior for C++
68246874 // functional cast expressions which look like constructor syntax. This is
68256875 // accomplished by converting initialization arguments to InitListExpr.
6826- if (S.getLangOpts ().HLSL && Args.size () > 1 && DestType->isExtVectorType () &&
6876+ if (S.getLangOpts ().HLSL && Args.size () > 1 &&
6877+ (DestType->isExtVectorType () || DestType->isConstantMatrixType ()) &&
68276878 (SourceType.isNull () ||
68286879 !Context.hasSameUnqualifiedType (SourceType, DestType))) {
68296880 InitListExpr *ILE = new (Context)
@@ -6988,6 +7039,7 @@ static AssignmentAction getAssignmentAction(const InitializedEntity &Entity,
69887039 case InitializedEntity::EK_Binding:
69897040 case InitializedEntity::EK_ArrayElement:
69907041 case InitializedEntity::EK_VectorElement:
7042+ case InitializedEntity::EK_MatrixElement:
69917043 case InitializedEntity::EK_ComplexElement:
69927044 case InitializedEntity::EK_BlockElement:
69937045 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
@@ -7013,6 +7065,7 @@ static bool shouldBindAsTemporary(const InitializedEntity &Entity) {
70137065 case InitializedEntity::EK_Base:
70147066 case InitializedEntity::EK_Delegating:
70157067 case InitializedEntity::EK_VectorElement:
7068+ case InitializedEntity::EK_MatrixElement:
70167069 case InitializedEntity::EK_ComplexElement:
70177070 case InitializedEntity::EK_Exception:
70187071 case InitializedEntity::EK_BlockElement:
@@ -7043,6 +7096,7 @@ static bool shouldDestroyEntity(const InitializedEntity &Entity) {
70437096 case InitializedEntity::EK_Base:
70447097 case InitializedEntity::EK_Delegating:
70457098 case InitializedEntity::EK_VectorElement:
7099+ case InitializedEntity::EK_MatrixElement:
70467100 case InitializedEntity::EK_ComplexElement:
70477101 case InitializedEntity::EK_BlockElement:
70487102 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
@@ -7096,6 +7150,7 @@ static SourceLocation getInitializationLoc(const InitializedEntity &Entity,
70967150 case InitializedEntity::EK_Base:
70977151 case InitializedEntity::EK_Delegating:
70987152 case InitializedEntity::EK_VectorElement:
7153+ case InitializedEntity::EK_MatrixElement:
70997154 case InitializedEntity::EK_ComplexElement:
71007155 case InitializedEntity::EK_BlockElement:
71017156 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
@@ -7845,11 +7900,13 @@ ExprResult InitializationSequence::Perform(Sema &S,
78457900 ExprResult CurInit ((Expr *)nullptr );
78467901 SmallVector<Expr*, 4 > ArrayLoopCommonExprs;
78477902
7848- // HLSL allows vector initialization to function like list initialization, but
7849- // use the syntax of a C++-like constructor.
7850- bool IsHLSLVectorInit = S.getLangOpts ().HLSL && DestType->isExtVectorType () &&
7851- isa<InitListExpr>(Args[0 ]);
7852- (void )IsHLSLVectorInit;
7903+ // HLSL allows vector/matrix initialization to function like list
7904+ // initialization, but use the syntax of a C++-like constructor.
7905+ bool IsHLSLVectorOrMatrixInit =
7906+ S.getLangOpts ().HLSL &&
7907+ (DestType->isExtVectorType () || DestType->isConstantMatrixType ()) &&
7908+ isa<InitListExpr>(Args[0 ]);
7909+ (void )IsHLSLVectorOrMatrixInit;
78537910
78547911 // For initialization steps that start with a single initializer,
78557912 // grab the only argument out the Args and place it into the "current"
@@ -7888,7 +7945,7 @@ ExprResult InitializationSequence::Perform(Sema &S,
78887945 case SK_StdInitializerList:
78897946 case SK_OCLSamplerInit:
78907947 case SK_OCLZeroOpaqueType: {
7891- assert (Args.size () == 1 || IsHLSLVectorInit );
7948+ assert (Args.size () == 1 || IsHLSLVectorOrMatrixInit );
78927949 CurInit = Args[0 ];
78937950 if (!CurInit.get ()) return ExprError ();
78947951 break ;
@@ -9105,7 +9162,7 @@ bool InitializationSequence::Diagnose(Sema &S,
91059162 << R;
91069163 else
91079164 S.Diag (Kind.getLocation (), diag::err_excess_initializers)
9108- << /* scalar=*/ 2 << R;
9165+ << /* scalar=*/ 3 << R;
91099166 break ;
91109167 }
91119168
0 commit comments