@@ -1663,15 +1663,42 @@ Expected<Value *> BitcodeReader::materializeValue(unsigned StartValID,
1663
1663
C = BlockAddress::get (Fn, BB);
1664
1664
break ;
1665
1665
}
1666
- case BitcodeConstant::ConstantStructOpcode:
1667
- C = ConstantStruct::get (cast<StructType>(BC->getType ()), ConstOps);
1666
+ case BitcodeConstant::ConstantStructOpcode: {
1667
+ auto *ST = cast<StructType>(BC->getType ());
1668
+ if (ST->getNumElements () != ConstOps.size ())
1669
+ return error (" Invalid number of elements in struct initializer" );
1670
+
1671
+ for (const auto [Ty, Op] : zip (ST->elements (), ConstOps))
1672
+ if (Op->getType () != Ty)
1673
+ return error (" Incorrect type in struct initializer" );
1674
+
1675
+ C = ConstantStruct::get (ST, ConstOps);
1668
1676
break ;
1669
- case BitcodeConstant::ConstantArrayOpcode:
1670
- C = ConstantArray::get (cast<ArrayType>(BC->getType ()), ConstOps);
1677
+ }
1678
+ case BitcodeConstant::ConstantArrayOpcode: {
1679
+ auto *AT = cast<ArrayType>(BC->getType ());
1680
+ if (AT->getNumElements () != ConstOps.size ())
1681
+ return error (" Invalid number of elements in array initializer" );
1682
+
1683
+ for (Constant *Op : ConstOps)
1684
+ if (Op->getType () != AT->getElementType ())
1685
+ return error (" Incorrect type in array initializer" );
1686
+
1687
+ C = ConstantArray::get (AT, ConstOps);
1671
1688
break ;
1672
- case BitcodeConstant::ConstantVectorOpcode:
1689
+ }
1690
+ case BitcodeConstant::ConstantVectorOpcode: {
1691
+ auto *VT = cast<FixedVectorType>(BC->getType ());
1692
+ if (VT->getNumElements () != ConstOps.size ())
1693
+ return error (" Invalid number of elements in vector initializer" );
1694
+
1695
+ for (Constant *Op : ConstOps)
1696
+ if (Op->getType () != VT->getElementType ())
1697
+ return error (" Incorrect type in vector initializer" );
1698
+
1673
1699
C = ConstantVector::get (ConstOps);
1674
1700
break ;
1701
+ }
1675
1702
case Instruction::GetElementPtr:
1676
1703
C = ConstantExpr::getGetElementPtr (
1677
1704
BC->SrcElemTy , ConstOps[0 ], ArrayRef (ConstOps).drop_front (),
0 commit comments