ParamAttrs(0) {
SymTab = new ValueSymbolTable();
- assert((getReturnType()->isFirstClassType() ||getReturnType() == Type::VoidTy)
+ assert((getReturnType()->isFirstClassType() ||getReturnType() == Type::VoidTy
+ || getReturnType()->getTypeID() == Type::StructTyID)
&& "LLVM functions cannot return aggregate values!");
// If the function has arguments, mark them as lazily built.
ContainedTys = reinterpret_cast<PATypeHandle*>(this+1);
NumContainedTys = Params.size() + 1; // + 1 for result type
assert((Result->isFirstClassType() || Result == Type::VoidTy ||
- isa<OpaqueType>(Result)) &&
+ Result->getTypeID() == Type::StructTyID ||
+ isa<OpaqueType>(Result)) &&
"LLVM functions cannot return aggregates");
bool isAbstract = Result->isAbstract();
new (&ContainedTys[0]) PATypeHandle(Result, this);
"# formal arguments must match # of arguments for function type!",
&F, FT);
Assert1(F.getReturnType()->isFirstClassType() ||
- F.getReturnType() == Type::VoidTy,
+ F.getReturnType() == Type::VoidTy ||
+ F.getReturnType()->getTypeID() == Type::StructTyID,
"Functions cannot return aggregate values!", &F);
Assert1(!F.isStructReturn() || FT->getReturnType() == Type::VoidTy,
// Check to make sure that only first-class-values are operands to
// instructions.
- Assert1(I.getOperand(i)->getType()->isFirstClassType(),
+ Assert1(I.getOperand(i)->getType()->isFirstClassType()
+ || (isa<ReturnInst>(I)
+ && I.getOperand(i)->getType()->getTypeID() == Type::StructTyID),
"Instruction operands must be first-class values!", &I);
if (Function *F = dyn_cast<Function>(I.getOperand(i))) {