diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 964d2bc19303..469bae8dd442 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -75,7 +75,7 @@ def err_drv_invalid_libcxx_deployment : Error< "invalid deployment target for -stdlib=libc++ (requires %0 or later)">; def err_drv_invalid_feature : Error< "invalid feature '%0' for CPU '%1'">; - + def err_drv_I_dash_not_supported : Error< "'%0' not supported, please use -iquote instead">; def err_drv_unknown_argument : Error<"unknown argument: '%0'">; @@ -150,4 +150,9 @@ def err_analyzer_config_no_value : Error< "analyzer-config option '%0' has a key but no value">; def err_analyzer_config_multiple_values : Error< "analyzer-config option '%0' should contain only one '='">; + +def err_drv_modules_integrated_as : Error< + "modules can only be used with the compiler's integrated assembler">; +def note_drv_modules_integrated_as : Note< + "'-no-integrated-as' cannot be used with '-fmodules'">; } diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 62b1febd5291..ef759ff6d39e 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -1429,12 +1429,18 @@ static bool ShouldDisableCFI(const ArgList &Args, Default); } -static bool ShouldDisableDwarfDirectory(const ArgList &Args, - const ToolChain &TC) { +static bool ShouldUseIntegratedAssembler(const ArgList &Args, + const ToolChain &TC) { bool IsIADefault = TC.IsIntegratedAssemblerDefault(); bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as, options::OPT_no_integrated_as, IsIADefault); + return UseIntegratedAs; +} + +static bool ShouldDisableDwarfDirectory(const ArgList &Args, + const ToolChain &TC) { + bool UseIntegratedAs = ShouldUseIntegratedAssembler(Args, TC); bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm, options::OPT_fno_dwarf_directory_asm, UseIntegratedAs); @@ -2778,6 +2784,12 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-fmodules"); HaveModules = true; } + + if (HaveModules && !ShouldUseIntegratedAssembler(Args, getToolChain())) { + D.Diag(diag::err_drv_modules_integrated_as); + D.Diag(diag::note_drv_modules_integrated_as); + return; + } } // If a module path was provided, pass it along. Otherwise, use a temporary diff --git a/clang/test/Driver/modules_integrated_as.c b/clang/test/Driver/modules_integrated_as.c new file mode 100644 index 000000000000..037cdd0c3c3f --- /dev/null +++ b/clang/test/Driver/modules_integrated_as.c @@ -0,0 +1,4 @@ +// RUN: %clang -fmodules -no-integrated-as -fsyntax-only %s 2>&1 | FileCheck %s + +// CHECK: error: modules can only be used with the compiler's integrated assembler +// CHECK note: '-no-integrated-as' cannot be used with '-fmodules'