Skip to content

Commit 5bfca3e

Browse files
authored
Merge pull request #18055 from jckarter/uiapplicationmain-overloads
SILGen: Cope with overloads when emitting artificial main for @UIApplicationMain.
2 parents 7c088be + cba32f7 commit 5bfca3e

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
@@ -449,9 +449,24 @@ void SILGenFunction::emitArtificialTopLevel(ClassDecl *mainClass) {
449449
/*resolver*/nullptr,
450450
results);
451451
assert(!results.empty() && "couldn't find UIApplicationMain in UIKit");
452-
assert(results.size() == 1 && "more than one UIApplicationMain?");
453452

454-
auto mainRef = SILDeclRef(results.front()).asForeign();
453+
// We want the original UIApplicationMain() declaration from Objective-C,
454+
// not any overlay overloads.
455+
ValueDecl *UIApplicationMainDecl = nullptr;
456+
for (auto *result : results) {
457+
if (result->hasClangNode()) {
458+
assert(!UIApplicationMainDecl
459+
&& "more than one UIApplicationMain defined in ObjC?!");
460+
UIApplicationMainDecl = result;
461+
#ifndef NDEBUG
462+
break;
463+
#endif
464+
}
465+
}
466+
467+
assert(UIApplicationMainDecl && "no UIApplicationMain defined in ObjC?!");
468+
469+
auto mainRef = SILDeclRef(UIApplicationMainDecl).asForeign();
455470
auto UIApplicationMainFn = SGM.M.getOrCreateFunction(mainClass, mainRef,
456471
NotForDefinition);
457472
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-emit-silgen(mock-sdk: -sdk %S/Inputs -I %t) -parse-as-library %s | %FileCheck %s
56
// RUN: %target-swift-emit-ir(mock-sdk: -sdk %S/Inputs -I %t) -parse-as-library %s | %FileCheck %s -check-prefix=IR
67

8+
// RUN: %target-swift-emit-silgen(mock-sdk: -Xcc -DSILGEN_TEST_UIAPPLICATIONMAIN_NULLABILITY -sdk %S/Inputs -I %t) -parse-as-library %s | %FileCheck %s
9+
// RUN: %target-swift-emit-ir(mock-sdk: -Xcc -DSILGEN_TEST_UIAPPLICATIONMAIN_NULLABILITY -sdk %S/Inputs -I %t) -parse-as-library %s | %FileCheck %s -check-prefix=IR
10+
711
// RUN: %target-swift-emit-silgen(mock-sdk: -sdk %S/Inputs -I %t) -parse-as-library %s -D REFERENCE | %FileCheck %s
812
// RUN: %target-swift-emit-ir(mock-sdk: -sdk %S/Inputs -I %t) -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 -enable-objc-interop -o %t %S/Inputs/ObjectiveC.swift && '
66
'%target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -emit-module -enable-objc-interop -o %t %S/Inputs/Dispatch.swift && '
77
'%target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -emit-module -enable-objc-interop -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 -enable-objc-interop -o %t %S/Inputs/UIKit.swift'))

0 commit comments

Comments
 (0)