From 7091876e6410b29f5ab7b179bf2abb643b629841 Mon Sep 17 00:00:00 2001 From: Steven Wu Date: Thu, 2 May 2024 15:33:09 -0700 Subject: [PATCH] [ScanDependencies] Fix assertion failure when failed to scan header Fix an assertion failure when bridging header dependency scanning failed. rdar://127459045 --- .../ClangModuleDependencyScanner.cpp | 14 +++++++++----- test/ScanDependencies/clang_scan_error.swift | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 test/ScanDependencies/clang_scan_error.swift diff --git a/lib/ClangImporter/ClangModuleDependencyScanner.cpp b/lib/ClangImporter/ClangModuleDependencyScanner.cpp index f3bc56b88fc77..193ea128567fd 100644 --- a/lib/ClangImporter/ClangModuleDependencyScanner.cpp +++ b/lib/ClangImporter/ClangModuleDependencyScanner.cpp @@ -493,11 +493,8 @@ bool ClangImporter::addHeaderDependencies( auto dependencies = clangScanningTool.getTranslationUnitDependencies( commandLineArgs, workingDir, cache.getAlreadySeenClangModules(), lookupModuleOutput); - if (!dependencies) { - // FIXME: Route this to a normal diagnostic. - llvm::logAllUnhandledErrors(dependencies.takeError(), llvm::errs()); + if (!dependencies) return dependencies.takeError(); - } // Record module dependencies for each new module we found. auto bridgedDeps = bridgeClangModuleDependencies( @@ -527,8 +524,15 @@ bool ClangImporter::addHeaderDependencies( !targetModule.getBridgingHeader()->empty()) { auto clangModuleDependencies = scanHeaderDependencies(*targetModule.getBridgingHeader()); - if (!clangModuleDependencies) + if (!clangModuleDependencies) { + // FIXME: Route this to a normal diagnostic. + llvm::logAllUnhandledErrors(clangModuleDependencies.takeError(), + llvm::errs()); + Impl.SwiftContext.Diags.diagnose( + SourceLoc(), diag::clang_dependency_scan_error, + "failed to scan bridging header dependencies"); return true; + } if (auto TreeID = clangModuleDependencies->IncludeTreeID) targetModule.addBridgingHeaderIncludeTree(*TreeID); recordBridgingHeaderOptions(targetModule, *clangModuleDependencies); diff --git a/test/ScanDependencies/clang_scan_error.swift b/test/ScanDependencies/clang_scan_error.swift new file mode 100644 index 0000000000000..515ca91064176 --- /dev/null +++ b/test/ScanDependencies/clang_scan_error.swift @@ -0,0 +1,15 @@ +// REQUIRES: objc_interop +// RUN: %empty-directory(%t) +// RUN: split-file %s %t + +// RUN: %target-swift-frontend -scan-dependencies -module-name Test %t/main.swift -import-objc-header %t/bridging.h \ +// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import -parse-stdlib \ +// RUN: -o %t/deps.json -I %t -swift-version 5 2>&1 | %FileCheck %s + +// CHECK: error: Clang dependency scanner failure: failed to scan bridging header dependencies + +//--- bridging.h +#include "do-not-exist.h" + +//--- main.swift +func test() {}