diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2572,11 +2572,18 @@ } // Warn -x after last input file has no effect - { + if (!IsCLMode()) { Arg *LastXArg = Args.getLastArgNoClaim(options::OPT_x); Arg *LastInputArg = Args.getLastArgNoClaim(options::OPT_INPUT); - if (LastXArg && LastInputArg && LastInputArg->getIndex() < LastXArg->getIndex()) + if (LastXArg && LastInputArg && + LastInputArg->getIndex() < LastXArg->getIndex()) Diag(clang::diag::warn_drv_unused_x) << LastXArg->getValue(); + } else { + // In CL mode suggest /TC or /TP since -x doesn't make sense if passed via + // /clang:. + if (auto *A = Args.getLastArg(options::OPT_x)) + Diag(diag::err_drv_unsupported_opt_with_suggestion) + << A->getAsString(Args) << "/TC' or '/TP"; } for (Arg *A : Args) { diff --git a/clang/test/ClangScanDeps/Inputs/modules_cdb_clangcl_by_mod_name.json b/clang/test/ClangScanDeps/Inputs/modules_cdb_clangcl_by_mod_name.json --- a/clang/test/ClangScanDeps/Inputs/modules_cdb_clangcl_by_mod_name.json +++ b/clang/test/ClangScanDeps/Inputs/modules_cdb_clangcl_by_mod_name.json @@ -1,12 +1,12 @@ [ { "directory": "DIR", - "command": "clang-cl /E /IInputs /D INCLUDE_HEADER2 /clang:-MD /clang:-MF /clang:DIR/modules_cdb2_clangcl.d /clang:-fmodules /clang:-fcxx-modules /clang:-fmodules-cache-path=DIR/module-cache_clangcl /clang:-fimplicit-modules /clang:-fimplicit-module-maps /clang:-x /clang:c++ --", + "command": "clang-cl /E /IInputs /D INCLUDE_HEADER2 /clang:-MD /clang:-MF /clang:DIR/modules_cdb2_clangcl.d /clang:-fmodules /clang:-fcxx-modules /clang:-fmodules-cache-path=DIR/module-cache_clangcl /clang:-fimplicit-modules /clang:-fimplicit-module-maps /TP --", "file": "" }, { "directory": "DIR", - "command": "clang-cl /E /IInputs /clang:-fmodules /clang:-fcxx-modules /clang:-fmodules-cache-path=DIR/module-cache_clangcl /clang:-fimplicit-modules /clang:-fimplicit-module-maps /clang:-x /clang:c++ --", + "command": "clang-cl /E /IInputs /clang:-fmodules /clang:-fcxx-modules /clang:-fmodules-cache-path=DIR/module-cache_clangcl /clang:-fimplicit-modules /clang:-fimplicit-module-maps /TP --", "file": "" }, ] diff --git a/clang/test/Driver/x-args.c b/clang/test/Driver/x-args.c --- a/clang/test/Driver/x-args.c +++ b/clang/test/Driver/x-args.c @@ -5,3 +5,8 @@ // RUN: %clang -fsyntax-only -xc %s -xc++ -fsyntax-only 2>&1 | FileCheck %s // RUN: %clang -fsyntax-only %s -xc %s -xc++ -fsyntax-only 2>&1 | FileCheck %s // CHECK: '-x c++' after last input file has no effect + +// RUN: not %clang_cl /WX /clang:-xc /clang:-E /clang:-dM %s 2>&1 | FileCheck -check-prefix=CL %s +// RUN: not %clang_cl /WX /clang:-E /clang:-dM %s /clang:-xc 2>&1 | FileCheck -check-prefix=CL %s +// CL-NOT: '-x c' after last input file has no effect +// CL: error: unsupported option '-x c'; did you mean '/TC' or '/TP'?