Author: rnk Date: Wed Dec 26 13:04:08 2018 New Revision: 350072 URL: http://llvm.org/viewvc/llvm-project?rev=350072&view=rev Log: [clang-cl] Treat inputs as C++ with /E, like MSVC
midl invokes the compiler on .idl files with /E. Before this change, we would treat unrecognized inputs as object files. Now we pre-process to stdout as expected. I checked that MSVC defines __cplusplus when invoked this way, so treating the input as C++ seems like the right thing to do. After this change, I was able to run midl like this with clang-cl: $ midl -cpp_cmd clang-cl.exe foo.idl Things worked for the example IDL file in the Microsoft documentation, but beyond that, I don't know if this will work well. Fixes PR40140 Added: cfe/trunk/test/Driver/cl-idl.cpp Modified: cfe/trunk/lib/Driver/Driver.cpp Modified: cfe/trunk/lib/Driver/Driver.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=350072&r1=350071&r2=350072&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Driver.cpp (original) +++ cfe/trunk/lib/Driver/Driver.cpp Wed Dec 26 13:04:08 2018 @@ -2057,7 +2057,8 @@ void Driver::BuildInputs(const ToolChain Ty = types::TY_C; } else { // Otherwise lookup by extension. - // Fallback is C if invoked as C preprocessor or Object otherwise. + // Fallback is C if invoked as C preprocessor, C++ if invoked with + // clang-cl /E, or Object otherwise. // We use a host hook here because Darwin at least has its own // idea of what .s is. if (const char *Ext = strrchr(Value, '.')) @@ -2066,6 +2067,8 @@ void Driver::BuildInputs(const ToolChain if (Ty == types::TY_INVALID) { if (CCCIsCPP()) Ty = types::TY_C; + else if (IsCLMode() && Args.hasArgNoClaim(options::OPT_E)) + Ty = types::TY_CXX; else Ty = types::TY_Object; } Added: cfe/trunk/test/Driver/cl-idl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cl-idl.cpp?rev=350072&view=auto ============================================================================== --- cfe/trunk/test/Driver/cl-idl.cpp (added) +++ cfe/trunk/test/Driver/cl-idl.cpp Wed Dec 26 13:04:08 2018 @@ -0,0 +1,18 @@ +// Note: %s must be preceded by --, otherwise it may be interpreted as a +// command-line option, e.g. on Mac where %s is commonly under /Users. + +// Test that 'clang-cl /E' treats inputs as C++ if the extension is +// unrecognized. midl relies on this. See PR40140. + +// Use a plain .cpp extension first. +// RUN: %clang_cl /E -- %s | FileCheck %s + +// Copy to use .idl as the extension. +// RUN: cp %s %t.idl +// RUN: %clang_cl /E -- %t.idl | FileCheck %s + +#ifdef __cplusplus +struct IsCPlusPlus {}; +#endif + +// CHECK: struct IsCPlusPlus {}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits