From 28ad953a3a610227b83b0de0d1c06ac52cb30d78 Mon Sep 17 00:00:00 2001 From: reuk Date: Mon, 27 Feb 2023 20:45:29 +0000 Subject: [PATCH] Xcode: Fix nullability warnings in Xcode 14.3 --- modules/juce_core/native/juce_mac_Network.mm | 5 +++ .../accessibility/juce_ios_Accessibility.mm | 10 ++++++ .../native/juce_mac_MainMenu.mm | 13 +++++--- .../native/juce_mac_Windowing.mm | 4 +++ .../native/juce_ios_InAppPurchases.cpp | 33 ++++++++++++++----- 5 files changed, 52 insertions(+), 13 deletions(-) diff --git a/modules/juce_core/native/juce_mac_Network.mm b/modules/juce_core/native/juce_mac_Network.mm index 56110874d2..901214b256 100644 --- a/modules/juce_core/native/juce_mac_Network.mm +++ b/modules/juce_core/native/juce_mac_Network.mm @@ -686,7 +686,12 @@ struct BackgroundDownloadTask : public URL::DownloadTask activeSessions.set (uniqueIdentifier, this); auto nsUrl = [NSURL URLWithString: juceStringToNS (urlToUse.toString (true))]; + + jassert (nsUrl != nullptr); + + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnullable-to-nonnull-conversion") NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL: nsUrl]; + JUCE_END_IGNORE_WARNINGS_GCC_LIKE if (options.usePost) [request setHTTPMethod: @"POST"]; diff --git a/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm b/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm index e7f8516cb1..beddd314cc 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm @@ -533,7 +533,17 @@ private: { const auto s = detail::makeCompileTimeStr (@encode (Result), @encode (id), @encode (SEL), @encode (Args)...); const auto signature = [NSMethodSignature signatureWithObjCTypes: s.data()]; + + if (signature == nullptr) + { + jassertfalse; + return {}; + } + + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnullable-to-nonnull-conversion") const auto invocation = [NSInvocation invocationWithMethodSignature: signature]; + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + invocation.selector = HasSelector::sel(); // Indices 0 and 1 are 'id self' and 'SEL _cmd' respectively diff --git a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm index 0e6ba3e3cb..9c89a04493 100644 --- a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm +++ b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm @@ -506,12 +506,15 @@ private: { if (isPositiveAndBelow (menuItemIndex, (int) [parentMenu numberOfItems])) { - auto menuItem = [parentMenu itemAtIndex:menuItemIndex]; + if (auto menuItem = [parentMenu itemAtIndex:menuItemIndex]) + { + if (auto submenu = [menuItem submenu]) + removeItemRecursive (submenu); - if (auto submenu = [menuItem submenu]) - removeItemRecursive (submenu); - - [parentMenu removeItem:menuItem]; + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnullable-to-nonnull-conversion") + [parentMenu removeItem: menuItem]; + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + } } else jassertfalse; diff --git a/modules/juce_gui_basics/native/juce_mac_Windowing.mm b/modules/juce_gui_basics/native/juce_mac_Windowing.mm index ba7e7e03d8..3c54104ef2 100644 --- a/modules/juce_gui_basics/native/juce_mac_Windowing.mm +++ b/modules/juce_gui_basics/native/juce_mac_Windowing.mm @@ -153,9 +153,11 @@ bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Co NSImage* image = [[NSWorkspace sharedWorkspace] iconForFile: nsEmptyString()]; [dragItem setDraggingFrame: getDragRect (view, event) contents: image]; + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnullable-to-nonnull-conversion") if (auto session = [view beginDraggingSessionWithItems: [NSArray arrayWithObject: dragItem] event: event source: helper]) + JUCE_END_IGNORE_WARNINGS_GCC_LIKE { session.animatesToStartingPositionsOnCancelOrFail = YES; session.draggingFormation = NSDraggingFormationNone; @@ -208,9 +210,11 @@ bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& fi NSDraggingSourceHelper::setDragOperation (helper, canMoveFiles ? NSDragOperationMove : NSDragOperationCopy); + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnullable-to-nonnull-conversion") return [view beginDraggingSessionWithItems: dragItems event: event source: helper] != nullptr; + JUCE_END_IGNORE_WARNINGS_GCC_LIKE } } } diff --git a/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp b/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp index f324393e7d..56fdb0be89 100644 --- a/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp +++ b/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp @@ -374,11 +374,25 @@ struct InAppPurchases::Pimpl //============================================================================== void processReceiptRefreshResponseWithSubscriptionsSharedSecret (const String& secret) { - auto receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; + const auto succeeded = [&] + { + auto receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; + + if (receiptURL == nullptr) + return false; + + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnullable-to-nonnull-conversion") + auto receiptData = [NSData dataWithContentsOfURL: receiptURL]; + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + if (receiptData == nullptr) + return false; - if (auto receiptData = [NSData dataWithContentsOfURL: receiptURL]) fetchReceiptDetailsFromAppStore (receiptData, secret); - else + return true; + }(); + + if (! succeeded) owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored ({}, false, NEEDS_TRANS ("Receipt fetch failed")); }); } @@ -410,7 +424,10 @@ struct InAppPurchases::Pimpl if (nsurl == nullptr) return; + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnullable-to-nonnull-conversion") const auto storeRequest = [NSMutableURLRequest requestWithURL: nsurl]; + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + [storeRequest setHTTPMethod: @"POST"]; [storeRequest setHTTPBody: requestData]; @@ -611,7 +628,7 @@ private: addMethod (@selector (productsRequest:didReceiveResponse:), [] (id self, SEL, SKProductsRequest* request, SKProductsResponse* response) { auto& t = getThis (self); - + for (auto i = 0; i < t.pendingProductInfoRequests.size(); ++i) { auto& pendingRequest = *t.pendingProductInfoRequests[i]; @@ -634,7 +651,7 @@ private: addMethod (@selector (requestDidFinish:), [] (id self, SEL, SKRequest* request) { auto& t = getThis (self); - + if (auto receiptRefreshRequest = getAs (request)) { for (auto i = 0; i < t.pendingReceiptRefreshRequests.size(); ++i) @@ -654,7 +671,7 @@ private: addMethod (@selector (request:didFailWithError:), [] (id self, SEL, SKRequest* request, NSError* error) { auto& t = getThis (self); - + if (auto receiptRefreshRequest = getAs (request)) { for (auto i = 0; i < t.pendingReceiptRefreshRequests.size(); ++i) @@ -675,7 +692,7 @@ private: addMethod (@selector (paymentQueue:updatedTransactions:), [] (id self, SEL, SKPaymentQueue*, NSArray* transactions) { auto& t = getThis (self); - + for (SKPaymentTransaction* transaction in transactions) { switch (transaction.transactionState) @@ -706,7 +723,7 @@ private: addMethod (@selector (paymentQueue:updatedDownloads:), [] (id self, SEL, SKPaymentQueue*, NSArray* downloads) { auto& t = getThis (self); - + for (SKDownload* download in downloads) { if (auto* pendingDownload = t.getPendingDownloadFor (download))