Skip to content

Commit 6f77689

Browse files
authored
Merge pull request #18056 from jckarter/uiapplicationmain-overloads-4.2
[4.2] SILGen: Cope with overloads when emitting artificial main for @UIApplicationMain.
2 parents 19e67df + 09e34eb commit 6f77689

File tree

5 files changed

+31
-2
lines changed

5 files changed

+31
-2
lines changed

lib/SILGen/SILGenFunction.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -446,9 +446,24 @@ void SILGenFunction::emitArtificialTopLevel(ClassDecl *mainClass) {
446446
/*resolver*/nullptr,
447447
results);
448448
assert(!results.empty() && "couldn't find UIApplicationMain in UIKit");
449-
assert(results.size() == 1 && "more than one UIApplicationMain?");
450449

451-
auto mainRef = SILDeclRef(results.front()).asForeign();
450+
// We want the original UIApplicationMain() declaration from Objective-C,
451+
// not any overlay overloads.
452+
ValueDecl *UIApplicationMainDecl = nullptr;
453+
for (auto *result : results) {
454+
if (result->hasClangNode()) {
455+
assert(!UIApplicationMainDecl
456+
&& "more than one UIApplicationMain defined in ObjC?!");
457+
UIApplicationMainDecl = result;
458+
#ifndef NDEBUG
459+
break;
460+
#endif
461+
}
462+
}
463+
464+
assert(UIApplicationMainDecl && "no UIApplicationMain defined in ObjC?!");
465+
466+
auto mainRef = SILDeclRef(UIApplicationMainDecl).asForeign();
452467
auto UIApplicationMainFn = SGM.M.getOrCreateFunction(mainClass, mainRef,
453468
NotForDefinition);
454469
auto fnTy = UIApplicationMainFn->getLoweredFunctionType();

test/SILGen/Inputs/UIKit.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
import Foundation
22
@_exported import UIKit
33

4+
public func UIApplicationMain() {}

test/SILGen/Inputs/usr/include/UIKit.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
@protocol UIApplicationDelegate
44
@end
55

6+
#ifdef SILGEN_TEST_UIAPPLICATIONMAIN_NULLABILITY
7+
int UIApplicationMain(int argc, char *_Nullable *_Nonnull argv,
8+
NSString *_Nullable principalClassName,
9+
NSString *_Nullable delegateClassName);
10+
#else
611
int UIApplicationMain(int argc, char **argv,
712
NSString *principalClassName,
813
NSString *delegateClassName);
14+
#endif

test/SILGen/UIApplicationMain.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
// RUN: %empty-directory(%t)
22
// RUN: %build-silgen-test-overlays
3+
// RUN: %build-silgen-test-overlays-ios
34

45
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -emit-silgen -parse-as-library %s | %FileCheck %s
56
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -emit-ir -parse-as-library %s | %FileCheck %s -check-prefix=IR
67

8+
// RUN: %target-swift-frontend(mock-sdk: -DSILGEN_TEST_UIAPPLICATIONMAIN_NULLABILITY -sdk %S/Inputs -I %t) -emit-silgen -parse-as-library %s | %FileCheck %s
9+
// RUN: %target-swift-frontend(mock-sdk: -DSILGEN_TEST_UIAPPLICATIONMAIN_NULLABILITY -sdk %S/Inputs -I %t) -emit-ir -parse-as-library %s | %FileCheck %s -check-prefix=IR
10+
711
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -emit-silgen -parse-as-library %s -D REFERENCE | %FileCheck %s
812
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -emit-ir -parse-as-library %s -D REFERENCE | %FileCheck %s -check-prefix=IR
913

test/SILGen/lit.local.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,6 @@ config.substitutions.insert(0, ('%build-silgen-test-overlays',
55
'%target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -emit-module -o %t %S/Inputs/ObjectiveC.swift && '
66
'%target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -emit-module -o %t %S/Inputs/Dispatch.swift && '
77
'%target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -emit-module -o %t %S/Inputs/Foundation.swift'))
8+
9+
config.substitutions.insert(0, ('%build-silgen-test-overlays-ios',
10+
'%target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -emit-module -o %t %S/Inputs/UIKit.swift'))

0 commit comments

Comments
 (0)