@@ -1642,22 +1642,8 @@ bool Compiler<Emitter>::VisitImplicitValueInitExpr(
1642
1642
if (QT->isIncompleteArrayType ())
1643
1643
return true ;
1644
1644
1645
- if (QT->isArrayType ()) {
1646
- const ArrayType *AT = QT->getAsArrayTypeUnsafe ();
1647
- assert (AT);
1648
- const auto *CAT = cast<ConstantArrayType>(AT);
1649
- size_t NumElems = CAT->getZExtSize ();
1650
- PrimType ElemT = classifyPrim (CAT->getElementType ());
1651
-
1652
- for (size_t I = 0 ; I != NumElems; ++I) {
1653
- if (!this ->visitZeroInitializer (ElemT, CAT->getElementType (), E))
1654
- return false ;
1655
- if (!this ->emitInitElem (ElemT, I, E))
1656
- return false ;
1657
- }
1658
-
1659
- return true ;
1660
- }
1645
+ if (QT->isArrayType ())
1646
+ return this ->visitZeroArrayInitializer (QT, E);
1661
1647
1662
1648
if (const auto *ComplexTy = E->getType ()->getAs <ComplexType>()) {
1663
1649
assert (Initializing);
@@ -3916,18 +3902,9 @@ bool Compiler<Emitter>::visitZeroRecordInitializer(const Record *R,
3916
3902
return false ;
3917
3903
}
3918
3904
} else if (D->isCompositeArray ()) {
3919
- const Record *ElemRecord = D->ElemDesc ->ElemRecord ;
3920
- assert (D->ElemDesc ->ElemRecord );
3921
- for (uint32_t I = 0 , N = D->getNumElems (); I != N; ++I) {
3922
- if (!this ->emitConstUint32 (I, E))
3923
- return false ;
3924
- if (!this ->emitArrayElemPtr (PT_Uint32, E))
3925
- return false ;
3926
- if (!this ->visitZeroRecordInitializer (ElemRecord, E))
3927
- return false ;
3928
- if (!this ->emitPopPtr (E))
3929
- return false ;
3930
- }
3905
+ // Can't be a vector or complex field.
3906
+ if (!this ->visitZeroArrayInitializer (D->getType (), E))
3907
+ return false ;
3931
3908
} else if (D->isRecord ()) {
3932
3909
if (!this ->visitZeroRecordInitializer (D->ElemRecord , E))
3933
3910
return false ;
@@ -3958,6 +3935,52 @@ bool Compiler<Emitter>::visitZeroRecordInitializer(const Record *R,
3958
3935
return true ;
3959
3936
}
3960
3937
3938
+ template <class Emitter >
3939
+ bool Compiler<Emitter>::visitZeroArrayInitializer(QualType T, const Expr *E) {
3940
+ assert (T->isArrayType () || T->isAnyComplexType () || T->isVectorType ());
3941
+ const ArrayType *AT = T->getAsArrayTypeUnsafe ();
3942
+ QualType ElemType = AT->getElementType ();
3943
+ size_t NumElems = cast<ConstantArrayType>(AT)->getZExtSize ();
3944
+
3945
+ if (std::optional<PrimType> ElemT = classify (ElemType)) {
3946
+ for (size_t I = 0 ; I != NumElems; ++I) {
3947
+ if (!this ->visitZeroInitializer (*ElemT, ElemType, E))
3948
+ return false ;
3949
+ if (!this ->emitInitElem (*ElemT, I, E))
3950
+ return false ;
3951
+ }
3952
+ return true ;
3953
+ } else if (ElemType->isRecordType ()) {
3954
+ const Record *R = getRecord (ElemType);
3955
+
3956
+ for (size_t I = 0 ; I != NumElems; ++I) {
3957
+ if (!this ->emitConstUint32 (I, E))
3958
+ return false ;
3959
+ if (!this ->emitArrayElemPtr (PT_Uint32, E))
3960
+ return false ;
3961
+ if (!this ->visitZeroRecordInitializer (R, E))
3962
+ return false ;
3963
+ if (!this ->emitPopPtr (E))
3964
+ return false ;
3965
+ }
3966
+ return true ;
3967
+ } else if (ElemType->isArrayType ()) {
3968
+ for (size_t I = 0 ; I != NumElems; ++I) {
3969
+ if (!this ->emitConstUint32 (I, E))
3970
+ return false ;
3971
+ if (!this ->emitArrayElemPtr (PT_Uint32, E))
3972
+ return false ;
3973
+ if (!this ->visitZeroArrayInitializer (ElemType, E))
3974
+ return false ;
3975
+ if (!this ->emitPopPtr (E))
3976
+ return false ;
3977
+ }
3978
+ return true ;
3979
+ }
3980
+
3981
+ return false ;
3982
+ }
3983
+
3961
3984
template <class Emitter >
3962
3985
template <typename T>
3963
3986
bool Compiler<Emitter>::emitConst(T Value, PrimType Ty, const Expr *E) {
0 commit comments