Author: d0k Date: Mon Nov 5 04:46:02 2018 New Revision: 346130 URL: http://llvm.org/viewvc/llvm-project?rev=346130&view=rev Log: Reapply "Fix regression in behavior of clang -x c++-header -fmodule-name=XXX"
This reverts commit r345963. We have a path forward now. Original commit message: The driver accidentally stopped passing the input filenames on to -cc1 in this mode due to confusion over what action was being requested. This change also fixes a couple of crashes I encountered when passing multiple files to such a -cc1 invocation. Added: cfe/trunk/test/Modules/strict-decluse-headers.cpp Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp cfe/trunk/lib/Frontend/CompilerInstance.cpp cfe/trunk/lib/Lex/ModuleMap.cpp cfe/trunk/test/Driver/header-module.cpp Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=346130&r1=346129&r2=346130&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Mon Nov 5 04:46:02 2018 @@ -3250,18 +3250,15 @@ void Clang::ConstructJob(Compilation &C, bool IsCuda = JA.isOffloading(Action::OFK_Cuda); bool IsHIP = JA.isOffloading(Action::OFK_HIP); bool IsOpenMPDevice = JA.isDeviceOffloading(Action::OFK_OpenMP); - bool IsModulePrecompile = - isa<PrecompileJobAction>(JA) && JA.getType() == types::TY_ModuleFile; bool IsHeaderModulePrecompile = isa<HeaderModulePrecompileJobAction>(JA); // A header module compilation doesn't have a main input file, so invent a // fake one as a placeholder. - // FIXME: Pick the language based on the header file language. const char *ModuleName = [&]{ auto *ModuleNameArg = Args.getLastArg(options::OPT_fmodule_name_EQ); return ModuleNameArg ? ModuleNameArg->getValue() : ""; }(); - InputInfo HeaderModuleInput(types::TY_CXXModule, ModuleName, ModuleName); + InputInfo HeaderModuleInput(Inputs[0].getType(), ModuleName, ModuleName); const InputInfo &Input = IsHeaderModulePrecompile ? HeaderModuleInput : Inputs[0]; @@ -3272,10 +3269,9 @@ void Clang::ConstructJob(Compilation &C, for (const InputInfo &I : Inputs) { if (&I == &Input) { // This is the primary input. - } else if (IsModulePrecompile && + } else if (IsHeaderModulePrecompile && types::getPrecompiledType(I.getType()) == types::TY_PCH) { - types::ID Expected = - types::lookupHeaderTypeForSourceType(Inputs[0].getType()); + types::ID Expected = HeaderModuleInput.getType(); if (I.getType() != Expected) { D.Diag(diag::err_drv_module_header_wrong_kind) << I.getFilename() << types::getTypeName(I.getType()) Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=346130&r1=346129&r2=346130&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original) +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Mon Nov 5 04:46:02 2018 @@ -372,6 +372,9 @@ static void InitializeFileRemapping(Diag void CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) { const PreprocessorOptions &PPOpts = getPreprocessorOpts(); + // The module manager holds a reference to the old preprocessor (if any). + ModuleManager.reset(); + // Create a PTH manager if we are using some form of a token cache. PTHManager *PTHMgr = nullptr; if (!PPOpts.TokenCache.empty()) Modified: cfe/trunk/lib/Lex/ModuleMap.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=346130&r1=346129&r2=346130&view=diff ============================================================================== --- cfe/trunk/lib/Lex/ModuleMap.cpp (original) +++ cfe/trunk/lib/Lex/ModuleMap.cpp Mon Nov 5 04:46:02 2018 @@ -523,7 +523,7 @@ void ModuleMap::diagnoseHeaderInclusion( // At this point, only non-modular includes remain. - if (LangOpts.ModulesStrictDeclUse) { + if (RequestingModule && LangOpts.ModulesStrictDeclUse) { Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module) << RequestingModule->getTopLevelModule()->Name << Filename; } else if (RequestingModule && RequestingModuleIsModuleInterface && Modified: cfe/trunk/test/Driver/header-module.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/header-module.cpp?rev=346130&r1=346129&r2=346130&view=diff ============================================================================== --- cfe/trunk/test/Driver/header-module.cpp (original) +++ cfe/trunk/test/Driver/header-module.cpp Mon Nov 5 04:46:02 2018 @@ -7,7 +7,18 @@ // CHECK-PRECOMPILE-SAME: -fno-implicit-modules // CHECK-PRECOMPILE-SAME: -fmodule-name=foobar // CHECK-PRECOMPILE-SAME: -o {{.*}}.pcm -// CHECK-PRECOMPILE-SAME: -x c++ +// CHECK-PRECOMPILE-SAME: -x c++-header // CHECK-PRECOMPILE-SAME: header1.h // CHECK-PRECOMPILE-SAME: header2.h // CHECK-PRECOMPILE-SAME: header3.h +// +// RUN: %clang -fmodules-ts -fmodule-name=foobar -x c++-header -fsyntax-only %S/Inputs/header1.h %S/Inputs/header2.h %S/Inputs/header3.h -v 2>&1 | FileCheck %s --check-prefix=CHECK-SYNTAX-ONLY +// CHECK-SYNTAX-ONLY: -cc1 {{.*}} -fsyntax-only +// CHECK-SYNTAX-ONLY-SAME: -fmodules-ts +// CHECK-SYNTAX-ONLY-SAME: -fno-implicit-modules +// CHECK-SYNTAX-ONLY-SAME: -fmodule-name=foobar +// CHECK-SYNTAX-ONLY-NOT: -o{{ }} +// CHECK-SYNTAX-ONLY-SAME: -x c++-header +// CHECK-SYNTAX-ONLY-SAME: header1.h +// CHECK-SYNTAX-ONLY-SAME: header2.h +// CHECK-SYNTAX-ONLY-SAME: header3.h Added: cfe/trunk/test/Modules/strict-decluse-headers.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/strict-decluse-headers.cpp?rev=346130&view=auto ============================================================================== --- cfe/trunk/test/Modules/strict-decluse-headers.cpp (added) +++ cfe/trunk/test/Modules/strict-decluse-headers.cpp Mon Nov 5 04:46:02 2018 @@ -0,0 +1,17 @@ +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: touch %t/foo.h +// RUN: echo '#include "foo.h"' > %t/bar.h +// RUN: touch %t/baz.h +// RUN: echo 'module X { header "bar.h" header "baz.h" }' > %t/map +// +// RUN: not %clang_cc1 -fsyntax-only -fmodules -fmodule-map-file=%t/map -I%t -fmodules-strict-decluse -fmodule-name=X -x c++ %t/bar.h %t/baz.h 2>&1 | FileCheck %s +// RUN: not %clang_cc1 -fsyntax-only -fmodules -fmodule-map-file=%t/map -I%t -fmodules-strict-decluse -fmodule-name=X -x c++ %t/baz.h %t/bar.h 2>&1 | FileCheck %s +// +// Don't crash on this: (FIXME: we should produce an error that the specified module name is not known) +// RUN: %clang_cc1 -fsyntax-only -fmodules -I%t -fmodules-strict-decluse -fmodule-name=X -x c++ %t/baz.h %t/bar.h +// +// Don't crash on this: (FIXME: we should produce an error that the specified file is not part of the specified module) +// RUN: %clang_cc1 -fsyntax-only -fmodules -fmodule-map-file=%t/map -I%t -fmodules-strict-decluse -fmodule-name=X -x c++ %t/foo.h +// +// CHECK: module X does not depend on a module exporting 'foo.h' _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits