diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td
index 0943feae950eb8ae4f27e2e6c6d4788ee30994b6..a7d2116f1a705f98573eb0895f2b3b43a5533efe 100644
--- a/include/clang/Basic/DiagnosticParseKinds.td
+++ b/include/clang/Basic/DiagnosticParseKinds.td
@@ -243,7 +243,10 @@ def err_expected_property_name : Error<"expected property name">;
 
 def err_unexpected_at : Error<"unexpected '@' in program">;
 def err_atimport : Error<
-"use of '@import' when modules are disabled">;
+  "use of '@import' when modules are disabled">;
+def err_atimport_cxx : Error<
+  "use of '@import' when C++ modules are disabled, consider using fmodules "
+  "and fcxx-modules">;
 
 def err_invalid_reference_qualifier_application : Error<
   "'%0' qualifier may not be applied to a reference">;
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp
index 81761bf8d2d89535399793a61527db34d750e5c5..68768e1835544d899441e6cd867b5c8ba0aabec7 100644
--- a/lib/Parse/ParseObjc.cpp
+++ b/lib/Parse/ParseObjc.cpp
@@ -83,7 +83,10 @@ Parser::DeclGroupPtrTy Parser::ParseObjCAtDirectives() {
   case tok::objc_import:
     if (getLangOpts().Modules || getLangOpts().DebuggerSupport)
       return ParseModuleImport(AtLoc);
-    Diag(AtLoc, diag::err_atimport);
+    if (getLangOpts().CPlusPlus)
+      Diag(AtLoc, diag::err_atimport_cxx);
+    else
+      Diag(AtLoc, diag::err_atimport);
     SkipUntil(tok::semi);
     return Actions.ConvertDeclToDeclGroup(nullptr);
   default:
diff --git a/test/Modules/check-syntax.mm b/test/Modules/check-syntax.mm
new file mode 100644
index 0000000000000000000000000000000000000000..ebb4bd3faf3fd3eb56f49b9045411222a6032024
--- /dev/null
+++ b/test/Modules/check-syntax.mm
@@ -0,0 +1,5 @@
+// RUN: not %clang -fmodules -fno-cxx-modules -fsyntax-only %s 2>&1 | FileCheck %s
+// rdar://19399671
+
+// CHECK: use of '@import' when C++ modules are disabled
+@import Foundation;