Я пытаюсь создать новый Constant*
с ArrayType
и ArrayRef
с использованием Constant* ConstantArray::get(ArrayType *Ty, ArrayRef<Constant*> V);
В настоящее время я получаю ошибку подтверждения о несовместимых типах;в частности, ошибка:
.../llvm/lib/IR/Constants.cpp:973: static llvm::Constant*
llvm::ConstantArray::getImpl(llvm::ArrayType*,
llvm::ArrayRef<llvm::Constant*>): Assertion `V[i]->getType() ==
Ty->getElementType() && "Wrong type in array element initializer"' failed.
Проблема в том, что оба типа ArrayType
и ArrayRef
имеют тип float
, но при попытке их сравнить не удастся.
Мой код:
//Type* newType is [3 x float]
Type* newElem = (cast<ArrayType>(newType))->getElementType();
ArrayType* newArrayType = ArrayType::get(newElem, numElements);
//arrayElements is a vector of ConstantFP
ArrayRef<llvm::Constant*> *arrayRef = new ArrayRef<llvm::Constant*>(arrayElements);
Constant* newConstantArray = ConstantArray::get(newArrayType, *arrayRef);
Фактический вызов LLVM, который не подтверждает утверждение:
Constant *ConstantArray::getImpl(ArrayType *Ty, ArrayRef<Constant*> V) {
...
for (unsigned i = 0, e = V.size(); i != e; ++i) {
assert(V[i]->getType() == Ty->getElementType() &&
"Wrong type in array element initializer"); //FAILS HERE
}
}
Я прошел через gdb
и распечаталтипы всех arrayRef
элементов, а также newArrayType->getElementType()
и всех возвращаемых float
. Перед подтверждением, если я попробую следующий код, он возвращает false:
bool eq = (arrayRef->data()[1]->getType() == newArrayType->getElementType());
errs() << *arrayRef->data()[1]->getType() << " == " << *newArrayType->getElementType() <<": ";
if(eq){
errs() <<"true\n";
} else {
errs() <<"false\n";
}
печатает:
float == float: false
Я что-то упустил из-за того, как работает llvm::Type
? Если оба типа float
, почему они не равны?