[clang] 0eddedc - [clang][DependencyScanning] Return failure upon CompilerInstanceWithContext failure to create target (#211607)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 30 08:56:31 PDT 2026
Author: Ian Li
Date: 2026-07-30T08:56:25-07:00
New Revision: 0eddedc4e718f05617c8649be78c72eda60d14a2
URL: https://github.com/llvm/llvm-project/commit/0eddedc4e718f05617c8649be78c72eda60d14a2
DIFF: https://github.com/llvm/llvm-project/commit/0eddedc4e718f05617c8649be78c72eda60d14a2.diff
LOG: [clang][DependencyScanning] Return failure upon CompilerInstanceWithContext failure to create target (#211607)
This was first pointed out by a static analysis scan: Success/failure
results from `CompilerInstance::createTarget` in
`CompilerInstanceWithContext::initialize` is currently being discarded.
AFAICT, `initialize` should have failed if
`CompilerInstance::createTarget` failed, as I noticed that calls in
`CompilerInstanceWithContext::computeDependencies` (which is ran right
after `initialize`) contains function calls (i.e. `CI.loadModule`) that
make references to `CompilerInstance::getTarget`: `getTarget` then tries
to obtain a reference to the very `TargetInfo` instance that the earlier
`CompilerInstance::createTarget` call failed to create.
AFAIK `createTarget` doesn't actually seem to fail currently, but I
haven't been able to find a good reason as for why success/failure from
`CompilerInstance::createTarget` should be ignored even if it failed.
But please let me know if I am not seeing something here!
Added:
clang/test/ClangScanDeps/modules-invalid-target.c
Modified:
clang/lib/Tooling/DependencyScanningTool.cpp
Removed:
################################################################################
diff --git a/clang/lib/Tooling/DependencyScanningTool.cpp b/clang/lib/Tooling/DependencyScanningTool.cpp
index b435e42af28b4..4072244f33fc3 100644
--- a/clang/lib/Tooling/DependencyScanningTool.cpp
+++ b/clang/lib/Tooling/DependencyScanningTool.cpp
@@ -500,9 +500,7 @@ bool CompilerInstanceWithContext::initialize(
// once here, and the information is reused for all computeDependencies calls.
// We do not need to call createTarget explicitly if we go through
// CompilerInstance::ExecuteAction to perform scanning.
- CI.createTarget();
-
- return true;
+ return CI.createTarget();
}
bool CompilerInstanceWithContext::computeDependencies(
diff --git a/clang/test/ClangScanDeps/modules-invalid-target.c b/clang/test/ClangScanDeps/modules-invalid-target.c
new file mode 100644
index 0000000000000..333bfdfe48c9e
--- /dev/null
+++ b/clang/test/ClangScanDeps/modules-invalid-target.c
@@ -0,0 +1,29 @@
+// Test that failure to create a target when initializing
+// CompilerInstanceWithContext (i.e. the user provides a bad target triple)
+// is properly diagnosed, instead of continuing to run with Target = nullptr.
+
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+// RUN: sed "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json
+
+// RUN: not clang-scan-deps -compilation-database %t/cdb.json -format \
+// RUN: experimental-full -module-names=M 2>&1 | FileCheck %s
+
+// Check that CompilerInstanceWithContext::initializeOrError properly errors
+// during target creation, instead of an assert or a segfault later down the
+// line:
+// CHECK: Error while scanning dependencies for M:
+// CHECK-NEXT: error: unknown target triple 'unknown-unknown-unknown'
+
+//--- module.modulemap
+module M { header "M.h" }
+
+//--- M.h
+void m(void);
+
+//--- cdb.json.template
+[{
+ "file": "",
+ "directory": "DIR",
+ "command": "clang -fmodules -fmodules-cache-path=DIR/cache -I DIR -x c --target=unknown-unknown-unknown"
+}]
More information about the cfe-commits
mailing list