@@ -628,9 +628,10 @@ class ObjCPrinter : private DeclVisitor<ObjCPrinter>,
628
628
if (looksLikeInitMethod (AFD->getObjCSelector ())) {
629
629
os << " SWIFT_METHOD_FAMILY(none)" ;
630
630
}
631
- if (!methodTy->getResult ()->isVoid () &&
632
- !methodTy->getResult ()->isUninhabited () &&
633
- !AFD->getAttrs ().hasAttribute <DiscardableResultAttr>()) {
631
+ if (methodTy->getResult ()->isUninhabited ()) {
632
+ os << " SWIFT_NORETURN" ;
633
+ } else if (!methodTy->getResult ()->isVoid () &&
634
+ !AFD->getAttrs ().hasAttribute <DiscardableResultAttr>()) {
634
635
os << " SWIFT_WARN_UNUSED_RESULT" ;
635
636
}
636
637
}
@@ -648,10 +649,8 @@ class ObjCPrinter : private DeclVisitor<ObjCPrinter>,
648
649
= FD->getForeignErrorConvention ();
649
650
assert (!FD->getGenericSignature () &&
650
651
" top-level generic functions not supported here" );
651
- auto resultTy = getForeignResultType (
652
- FD,
653
- FD->getInterfaceType ()->castTo <FunctionType>(),
654
- errorConvention);
652
+ auto funcTy = FD->getInterfaceType ()->castTo <FunctionType>();
653
+ auto resultTy = getForeignResultType (FD, funcTy, errorConvention);
655
654
656
655
// The result type may be a partial function type we need to close
657
656
// up later.
@@ -665,18 +664,29 @@ class ObjCPrinter : private DeclVisitor<ObjCPrinter>,
665
664
666
665
assert (FD->getParameterLists ().size () == 1 && " not a C-compatible func" );
667
666
auto params = FD->getParameterLists ().back ();
668
- interleave (*params,
669
- [&](const ParamDecl *param) {
670
- print (param->getInterfaceType (), OTK_None, param->getName (),
671
- IsFunctionParam);
672
- },
673
- [&]{ os << " , " ; });
667
+ if (params->size ()) {
668
+ interleave (*params,
669
+ [&](const ParamDecl *param) {
670
+ print (param->getInterfaceType (), OTK_None, param->getName (),
671
+ IsFunctionParam);
672
+ },
673
+ [&]{ os << " , " ; });
674
+ } else {
675
+ os << " void" ;
676
+ }
674
677
675
678
os << ' )' ;
676
679
677
680
// Finish the result type.
678
681
multiPart.finish ();
679
682
683
+ if (funcTy->getResult ()->isUninhabited ()) {
684
+ os << " SWIFT_NORETURN" ;
685
+ } else if (!funcTy->getResult ()->isVoid () &&
686
+ !FD->getAttrs ().hasAttribute <DiscardableResultAttr>()) {
687
+ os << " SWIFT_WARN_UNUSED_RESULT" ;
688
+ }
689
+
680
690
appendAvailabilityAttribute (FD);
681
691
682
692
os << ' ;' ;
@@ -2337,6 +2347,11 @@ class ModuleWriter {
2337
2347
" #else\n "
2338
2348
" # define SWIFT_WARN_UNUSED_RESULT\n "
2339
2349
" #endif\n "
2350
+ " #if defined(__has_attribute) && __has_attribute(noreturn)\n "
2351
+ " # define SWIFT_NORETURN __attribute__((noreturn))\n "
2352
+ " #else\n "
2353
+ " # define SWIFT_NORETURN\n "
2354
+ " #endif\n "
2340
2355
" #if !defined(SWIFT_CLASS_EXTRA)\n "
2341
2356
" # define SWIFT_CLASS_EXTRA\n "
2342
2357
" #endif\n "
0 commit comments