diff --git a/include/swift/AST/DiagnosticsFrontend.def b/include/swift/AST/DiagnosticsFrontend.def index b9b2625c79a4c..5b38bd1bb6561 100644 --- a/include/swift/AST/DiagnosticsFrontend.def +++ b/include/swift/AST/DiagnosticsFrontend.def @@ -156,6 +156,9 @@ ERROR(error_load_resolved_plugin,none, NOTE(note_valid_swift_versions, none, "valid arguments to '-swift-version' are %0", (StringRef)) +ERROR(error_module_interface_requires_language_mode,none, + "emitting module interface files requires '-language-mode'", ()) + ERROR(error_mode_cannot_emit_dependencies,none, "this mode does not support emitting dependency files", ()) ERROR(error_mode_cannot_emit_reference_dependencies,none, diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 8b8f4b419cba3..ef80371c7b39b 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1034,6 +1034,9 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args, } if (!isValid) diagnoseSwiftVersion(vers, A, Args, Diags); + } else if (FrontendOpts.InputsAndOutputs.hasModuleInterfaceOutputPath()) { + Diags.diagnose({}, diag::error_module_interface_requires_language_mode); + HadError = true; } if (auto A = Args.getLastArg(OPT_package_description_version)) { diff --git a/test/Driver/createCompilerInvocation.swift b/test/Driver/createCompilerInvocation.swift index 1f9bec4fe9c3a..f3e046da10f31 100644 --- a/test/Driver/createCompilerInvocation.swift +++ b/test/Driver/createCompilerInvocation.swift @@ -9,12 +9,13 @@ // CHECK-NOWARN-NOT: warning // RUN: %swift-ide-test_plain -test-createCompilerInvocation \ -// RUN: -module-name foo -emit-module -emit-module-path %t/foo.swiftmodule -emit-objc-header -emit-objc-header-path %t/foo.h -enable-library-evolution -emit-module-interface -emit-module-interface-path %t/foo.swiftinterface -emit-library -emit-tbd -emit-tbd-path %t/foo.tbd -emit-dependencies -serialize-diagnostics %s \ +// RUN: -swift-version 5 -module-name foo -emit-module -emit-module-path %t/foo.swiftmodule -emit-objc-header -emit-objc-header-path %t/foo.h -enable-library-evolution -emit-module-interface -emit-module-interface-path %t/foo.swiftinterface -emit-library -emit-tbd -emit-tbd-path %t/foo.tbd -emit-dependencies -serialize-diagnostics %s \ // RUN: 2>&1 | %FileCheck %s --check-prefix=NORMAL_ARGS --implicit-check-not="error: " // NORMAL_ARGS: Frontend Arguments BEGIN // NORMAL_ARGS-DAG: -o{{$}} // NORMAL_ARGS-DAG: foo-{{[a-z0-9]+}}.o // NORMAL_ARGS-DAG: -c{{$}} +// NORMAL_ARGS-DAG: -swift-version // NORMAL_ARGS-DAG: -module-name // NORMAL_ARGS-DAG: -emit-module-path // NORMAL_ARGS-DAG: -emit-module-doc-path @@ -26,7 +27,7 @@ // NORMAL_ARGS: Frontend Arguments END // RUN: %swift-ide-test_plain -test-createCompilerInvocation -force-no-outputs \ -// RUN: -module-name foo -emit-module -emit-module-path %t/foo.swiftmodule -emit-objc-header -emit-objc-header-path %t/foo.h -enable-library-evolution -emit-module-interface -emit-module-interface-path %t/foo.swiftinterface -emit-library -emit-tbd -emit-tbd-path %t/foo.tbd -emit-dependencies -serialize-diagnostics %s \ +// RUN: -swift-version 5 -module-name foo -emit-module -emit-module-path %t/foo.swiftmodule -emit-objc-header -emit-objc-header-path %t/foo.h -enable-library-evolution -emit-module-interface -emit-module-interface-path %t/foo.swiftinterface -emit-library -emit-tbd -emit-tbd-path %t/foo.tbd -emit-dependencies -serialize-diagnostics %s \ // RUN: 2>&1 > %t.nooutput_args // RUN: %FileCheck %s --check-prefix=NOOUTPUT_ARGS --implicit-check-not="error: " < %t.nooutput_args // RUN: %FileCheck %s --check-prefix=NOOUTPUT_ARGS_NEG --implicit-check-not="error: " < %t.nooutput_args diff --git a/test/ModuleInterface/language_mode.swift b/test/ModuleInterface/language_mode.swift new file mode 100644 index 0000000000000..d46e32b1eeb89 --- /dev/null +++ b/test/ModuleInterface/language_mode.swift @@ -0,0 +1,27 @@ +// RUN: %empty-directory(%t) + +// RUN: not %swift_frontend_plain -target %target-swift-5.1-abi-triple %s \ +// RUN: -enable-library-evolution -module-name Test \ +// RUN: -emit-module-interface-path %t.swiftinterface \ +// RUN: -emit-module -o /dev/null 2>&1 | %FileCheck %s + +// CHECK: :0: error: emitting module interface files requires '-language-mode' + +// RUN: %swift_frontend_plain -target %target-swift-5.1-abi-triple %s \ +// RUN: -enable-library-evolution -module-name Test \ +// RUN: -emit-module-interface-path %t.swiftinterface \ +// RUN: -emit-module -o /dev/null -language-mode 5 + +// RUN: %FileCheck %s --check-prefix CHECK-SWIFTINTERFACE < %t.swiftinterface + +// RUN: %swift_frontend_plain -target %target-swift-5.1-abi-triple %s \ +// RUN: -enable-library-evolution -module-name Test \ +// RUN: -emit-module-interface-path %t.swiftinterface \ +// RUN: -emit-module -o /dev/null -swift-version 5 + +// RUN: %FileCheck %s --check-prefix CHECK-SWIFTINTERFACE < %t.swiftinterface + +// CHECK-SWIFTINTERFACE: swift-module-flags: +// CHECK-SWIFTINTERFACE-SAME: -enable-library-evolution +// CHECK-SWIFTINTERFACE-SAME: -module-name Test +// CHECK-SWIFTINTERFACE-SAME: {{-swift-version|-language-mode}} 5