@@ -290,14 +290,20 @@ void SILGenFunction::emitForeignErrorBlock(SILLocation loc,
290290static SILValue emitUnwrapIntegerResult (SILGenFunction &gen,
291291 SILLocation loc,
292292 SILValue value) {
293- while (!value->getType ().is <BuiltinIntegerType>()) {
294- auto structDecl = value->getType ().getStructOrBoundGenericStruct ();
295- assert (structDecl && " value for error result wasn't of struct type!" );
296- assert (std::next (structDecl->getStoredProperties ().begin ())
297- == structDecl->getStoredProperties ().end ());
298- auto property = *structDecl->getStoredProperties ().begin ();
299- value = gen.B .createStructExtract (loc, value, property);
300- }
293+ CanType boolType = gen.SGM .Types .getBoolType ();
294+
295+ value = gen.emitBridgedToNativeValue (
296+ loc, ManagedValue::forUnmanaged (value),
297+ SILFunctionTypeRepresentation::CFunctionPointer,
298+ boolType).forward (gen);
299+
300+ auto structDecl = value->getType ().getStructOrBoundGenericStruct ();
301+ assert (structDecl && " value for error result wasn't of struct type!" );
302+ assert (std::next (structDecl->getStoredProperties ().begin ())
303+ == structDecl->getStoredProperties ().end ());
304+ auto property = *structDecl->getStoredProperties ().begin ();
305+ value = gen.B .createStructExtract (loc, value, property);
306+ assert (value->getType ().is <BuiltinIntegerType>());
301307
302308 return value;
303309}
@@ -315,20 +321,28 @@ emitResultIsZeroErrorCheck(SILGenFunction &gen, SILLocation loc,
315321
316322 SILValue resultValue =
317323 emitUnwrapIntegerResult (gen, loc, result.getUnmanagedValue ());
318- SILValue zero =
319- gen.B .createIntegerLiteral (loc, resultValue->getType (), 0 );
320-
321- ASTContext &ctx = gen.getASTContext ();
322- SILValue resultIsError =
323- gen.B .createBuiltinBinaryFunction (loc,
324- zeroIsError ? " cmp_eq" : " cmp_ne" ,
325- resultValue->getType (),
326- SILType::getBuiltinIntegerType (1 , ctx),
327- {resultValue, zero});
324+ CanType resultType = resultValue->getType ().getSwiftRValueType ();
325+
326+ if (!resultType->isBuiltinIntegerType (1 )) {
327+ SILValue zero =
328+ gen.B .createIntegerLiteral (loc, resultValue->getType (), 0 );
329+
330+ ASTContext &ctx = gen.getASTContext ();
331+ resultValue =
332+ gen.B .createBuiltinBinaryFunction (loc,
333+ " cmp_ne" ,
334+ resultValue->getType (),
335+ SILType::getBuiltinIntegerType (1 , ctx),
336+ {resultValue, zero});
337+ }
328338
329339 SILBasicBlock *errorBB = gen.createBasicBlock (FunctionSection::Postmatter);
330340 SILBasicBlock *contBB = gen.createBasicBlock ();
331- gen.B .createCondBranch (loc, resultIsError, errorBB, contBB);
341+
342+ if (zeroIsError)
343+ gen.B .createCondBranch (loc, resultValue, contBB, errorBB);
344+ else
345+ gen.B .createCondBranch (loc, resultValue, errorBB, contBB);
332346
333347 gen.emitForeignErrorBlock (loc, errorBB, errorSlot);
334348
0 commit comments