@@ -4146,7 +4146,10 @@ Explosion NativeConventionSchema::mapFromNative(IRGenModule &IGM,
41464146 if (explosionTy != elt->getType ()) {
41474147 if (isa<llvm::IntegerType>(explosionTy) &&
41484148 isa<llvm::IntegerType>(elt->getType ())) {
4149- elt = IGF.Builder .CreateTrunc (elt, explosionTy);
4149+ // [HACK: Atomic-Bool-IRGen] In the case of _Atomic(_Bool), Clang
4150+ // treats it as i8 whereas Swift works with i1, so we need to zext
4151+ // in that case.
4152+ elt = IGF.Builder .CreateZExtOrTrunc (elt, explosionTy);
41504153 } else {
41514154 elt = IGF.coerceValue (elt, explosionTy, DataLayout);
41524155 }
@@ -4278,10 +4281,14 @@ Explosion NativeConventionSchema::mapIntoNative(IRGenModule &IGM,
42784281 auto *elt = fromNonNative.claimNext ();
42794282 if (nativeTy != elt->getType ()) {
42804283 if (isa<llvm::IntegerType>(nativeTy) &&
4281- isa<llvm::IntegerType>(elt->getType ()))
4282- elt = IGF.Builder .CreateZExt (elt, nativeTy);
4283- else
4284+ isa<llvm::IntegerType>(elt->getType ())) {
4285+ // [HACK: Atomic-Bool-IRGen] In the case of _Atomic(_Bool), Clang
4286+ // treats it as i8 whereas Swift works with i1, so we need to trunc
4287+ // in that case.
4288+ elt = IGF.Builder .CreateZExtOrTrunc (elt, nativeTy);
4289+ } else {
42844290 elt = IGF.coerceValue (elt, nativeTy, DataLayout);
4291+ }
42854292 }
42864293 nativeExplosion.add (elt);
42874294 return nativeExplosion;
0 commit comments