diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index a0a70d8fe2c5a..c11dd8ef8ec1d 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5282,6 +5282,12 @@ void Clang::ConstructHostCompilerJob(Compilation &C, const JobAction &JA, HostCompileArgs.push_back(TCArgs.MakeArgString(*CWD)); } + // Add /external:W0 for MSVC based compilation. We are using /external:I + // which requires /external:Wn upon usage. Use of /external:W0 disables + // warnings from headers that are included with /external:I. + if (IsMSVCHostCompiler) + HostCompileArgs.push_back("/external:W0"); + // Add default header search directories. SmallString<128> BaseDir(C.getDriver().Dir); llvm::sys::path::append(BaseDir, "..", "include"); @@ -5292,11 +5298,13 @@ void Clang::ConstructHostCompilerJob(Compilation &C, const JobAction &JA, // STL headers in their programs (e.g., ). SmallString<128> STLWrappersDir(SYCLDir); llvm::sys::path::append(STLWrappersDir, "stl_wrappers"); - HostCompileArgs.push_back("-I"); + // Add the SYCL specific header directories as system directories for non + // MSVC compilers. + HostCompileArgs.push_back(IsMSVCHostCompiler ? "/external:I" : "-isystem"); HostCompileArgs.push_back(TCArgs.MakeArgString(SYCLDir)); - HostCompileArgs.push_back("-I"); + HostCompileArgs.push_back(IsMSVCHostCompiler ? "/external:I" : "-isystem"); HostCompileArgs.push_back(TCArgs.MakeArgString(STLWrappersDir)); - HostCompileArgs.push_back("-I"); + HostCompileArgs.push_back(IsMSVCHostCompiler ? "/external:I" : "-isystem"); HostCompileArgs.push_back(TCArgs.MakeArgString(BaseDir)); if (!OutputAdded) { diff --git a/clang/test/Driver/sycl-host-compiler-old-model.cpp b/clang/test/Driver/sycl-host-compiler-old-model.cpp index e72b454db40c7..fb9af06364295 100644 --- a/clang/test/Driver/sycl-host-compiler-old-model.cpp +++ b/clang/test/Driver/sycl-host-compiler-old-model.cpp @@ -4,13 +4,22 @@ // RUN: %clangxx -fsycl --no-offload-new-driver -fsycl-host-compiler=/some/dir/g++ %s -### 2>&1 \ // RUN: | FileCheck -check-prefix=HOST_COMPILER %s // HOST_COMPILER: clang{{.*}} "-fsycl-is-device"{{.*}} "-fsycl-int-header=[[INTHEADER:.+\.h]]" "-fsycl-int-footer={{.*}}" -// HOST_COMPILER: g++{{.*}} "-c" "-include" "[[INTHEADER]]" "-iquote" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl"{{.*}} "-o" "[[HOSTOBJ:.+\.o]]"{{.*}} +// HOST_COMPILER: g++{{.*}} "-c" "-include" "[[INTHEADER]]" +// HOST_COMPILER-SAME: "-iquote" +// HOST_COMPILER-SAME: "-isystem" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl" +// HOST_COMPILER-SAME: "-isystem" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl{{[/\\]+}}stl_wrappers" +// HOST_COMPILER-SAME: "-isystem" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include" +// HOST_COMPILER-SAME: "-o" "[[HOSTOBJ:.+\.o]]" // HOST_COMPILER: ld{{.*}} "[[HOSTOBJ]]" // RUN: %clang_cl -fsycl --no-offload-new-driver -fsycl-host-compiler=/some/dir/cl %s -### 2>&1 \ // RUN: | FileCheck -check-prefix=HOST_COMPILER_CL %s // HOST_COMPILER_CL: clang{{.*}} "-fsycl-is-device"{{.*}} "-fsycl-int-header=[[INTHEADER:.+\.h]]" "-fsycl-int-footer={{.*}}" -// HOST_COMPILER_CL: cl{{.*}} "-c" "-Fo[[HOSTOBJ:.+\.obj]]" "-FI" "[[INTHEADER]]"{{.*}} "-I" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl"{{.*}} +// HOST_COMPILER_CL: cl{{.*}} "-c" "-Fo[[HOSTOBJ:.+\.obj]]" "-FI" "[[INTHEADER]]" +// HOST_COMPILER_CL-SAME: "/external:W0" +// HOST_COMPILER_CL-SAME: "/external:I" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl" +// HOST_COMPILER_CL-SAME: "/external:I" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl{{[/\\]+}}stl_wrappers" +// HOST_COMPILER_CL-SAME: "/external:I" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include" // HOST_COMPILER_CL: link{{.*}} "[[HOSTOBJ]]" /// check for additional host options