Index: llvm-convert.cpp =================================================================== --- llvm-convert.cpp (revision 122081) +++ llvm-convert.cpp (working copy) @@ -209,14 +209,20 @@ void HandleScalarArgument(const llvm::Type *LLVMTy, tree type) { Value *ArgVal = AI; if (ArgVal->getType() != LLVMTy) { - // If this is just a mismatch between integer types, this could be due - // to K&R prototypes, where the forward proto defines the arg as int and - // the actual impls is a short or char. - assert(ArgVal->getType()->isIntegral() && LLVMTy->isIntegral() && - "Lowerings don't match?"); - bool isSigned = type == 0 ? true : !TYPE_UNSIGNED(type); - ArgVal = CastInst::createIntegerCast(ArgVal, LLVMTy, isSigned, - NameStack.back(), CurBB); + if (isa(ArgVal->getType()) && isa(LLVMTy)) { + // If this is GCC being sloppy about pointer types, insert a bitcast. + // See PR1083 for an example. + ArgVal = new BitCastInst(ArgVal, LLVMTy, "tmp", CurBB); + } else { + // If this is just a mismatch between integer types, this could be due + // to K&R prototypes, where the forward proto defines the arg as int + // and the actual impls is a short or char. + assert(ArgVal->getType()->isIntegral() && LLVMTy->isIntegral() && + "Lowerings don't match?"); + bool isSigned = type == 0 ? true : !TYPE_UNSIGNED(type); + ArgVal = CastInst::createIntegerCast(ArgVal, LLVMTy, isSigned, + NameStack.back(), CurBB); + } } assert(!LocStack.empty()); Value *Loc = LocStack.back();