@@ -4158,7 +4158,10 @@ Explosion NativeConventionSchema::mapFromNative(IRGenModule &IGM,
41584158 if (explosionTy != elt->getType ()) {
41594159 if (isa<llvm::IntegerType>(explosionTy) &&
41604160 isa<llvm::IntegerType>(elt->getType ())) {
4161- elt = IGF.Builder .CreateTrunc (elt, explosionTy);
4161+ // [HACK: Atomic-Bool-IRGen] In the case of _Atomic(_Bool), Clang
4162+ // treats it as i8 whereas Swift works with i1, so we need to zext
4163+ // in that case.
4164+ elt = IGF.Builder .CreateZExtOrTrunc (elt, explosionTy);
41624165 } else {
41634166 elt = IGF.coerceValue (elt, explosionTy, DataLayout);
41644167 }
@@ -4290,10 +4293,14 @@ Explosion NativeConventionSchema::mapIntoNative(IRGenModule &IGM,
42904293 auto *elt = fromNonNative.claimNext ();
42914294 if (nativeTy != elt->getType ()) {
42924295 if (isa<llvm::IntegerType>(nativeTy) &&
4293- isa<llvm::IntegerType>(elt->getType ()))
4294- elt = IGF.Builder .CreateZExt (elt, nativeTy);
4295- else
4296+ isa<llvm::IntegerType>(elt->getType ())) {
4297+ // [HACK: Atomic-Bool-IRGen] In the case of _Atomic(_Bool), Clang
4298+ // treats it as i8 whereas Swift works with i1, so we need to trunc
4299+ // in that case.
4300+ elt = IGF.Builder .CreateZExtOrTrunc (elt, nativeTy);
4301+ } else {
42964302 elt = IGF.coerceValue (elt, nativeTy, DataLayout);
4303+ }
42974304 }
42984305 nativeExplosion.add (elt);
42994306 return nativeExplosion;
0 commit comments