[clang] [Driver][SYCL] Treat stdin as C++ when -fsycl is active (PR #204968)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Jun 21 02:24:06 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Wenju He (wenju-he)
<details>
<summary>Changes</summary>
1723b7a30145 added a frontend check that rejects C inputs when SYCL mode is active (since SYCL requires C++). The stdin path in BuildInputs hardcoded TY_C regardless of driver mode, so `-fsycl -dM -E -` would pass -x c to cc1 and trigger the new diagnostic.
Fix: use TY_CXX for stdin when IsSYCL.
Also, upstream a downstream test that fails due to 1723b7a30145.
---
Full diff: https://github.com/llvm/llvm-project/pull/204968.diff
2 Files Affected:
- (modified) clang/lib/Driver/Driver.cpp (+4)
- (added) clang/test/Driver/sycl-print-internal-defines.cpp (+12)
``````````diff
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index d153e99d37280..d21e20c4aa445 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -3134,6 +3134,8 @@ void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args,
Diag(clang::diag::warn_drv_unused_x) << LastXArg->getValue();
}
+ bool IsSYCL = Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false);
+
for (Arg *A : Args) {
if (A->getOption().getKind() == Option::InputClass) {
const char *Value = A->getValue();
@@ -3151,6 +3153,8 @@ void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args,
Ty = types::TY_Fortran;
} else if (IsDXCMode()) {
Ty = types::TY_HLSL;
+ } else if (IsSYCL) {
+ Ty = types::TY_CXX;
} else {
// If running with -E, treat as a C input (this changes the
// builtin macros, for example). This may be overridden by -ObjC
diff --git a/clang/test/Driver/sycl-print-internal-defines.cpp b/clang/test/Driver/sycl-print-internal-defines.cpp
new file mode 100644
index 0000000000000..0fc412b5b33ab
--- /dev/null
+++ b/clang/test/Driver/sycl-print-internal-defines.cpp
@@ -0,0 +1,12 @@
+// UNSUPPORTED: system-windows
+// Test that clang can print defines in SYCL mode.
+// REQUIRES: x86-registered-target
+
+// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -dM -E %s 2>&1 \
+// RUN: | FileCheck --check-prefix CHECK-PRINT-INTERNAL-DEFINES %s
+// CHECK-PRINT-INTERNAL-DEFINES: #define
+
+// Printing defines also works when input is stdin.
+// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -dM -E - < /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefixes=CHECK-PRINT-INTERNAL-DEFINES,CHECK-NO-ERROR %s
+// CHECK-NO-ERROR-NOT: error:
``````````
</details>
https://github.com/llvm/llvm-project/pull/204968
More information about the cfe-commits
mailing list