[modules] If we reach a definition of a class for which we already have a
non-visible definition, skip the new definition and make the old one visible
instead of trying to parse it again and failing horribly. C++'s ODR allows
us to assume that the two definitions are identical.

llvm-svn: 233250
diff --git a/clang/test/Modules/Inputs/submodules-merge-defs/defs.h b/clang/test/Modules/Inputs/submodules-merge-defs/defs.h
new file mode 100644
index 0000000..1c866b5
--- /dev/null
+++ b/clang/test/Modules/Inputs/submodules-merge-defs/defs.h
@@ -0,0 +1,6 @@
+struct A {};
+class B {
+  struct Inner1 {};
+  struct Inner2;
+};
+struct B::Inner2 : Inner1 {};
diff --git a/clang/test/Modules/Inputs/submodules-merge-defs/empty.h b/clang/test/Modules/Inputs/submodules-merge-defs/empty.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/clang/test/Modules/Inputs/submodules-merge-defs/empty.h
diff --git a/clang/test/Modules/Inputs/submodules-merge-defs/import-and-redefine.h b/clang/test/Modules/Inputs/submodules-merge-defs/import-and-redefine.h
new file mode 100644
index 0000000..8d695bc
--- /dev/null
+++ b/clang/test/Modules/Inputs/submodules-merge-defs/import-and-redefine.h
@@ -0,0 +1,5 @@
+// Trigger import of definitions, but don't make them visible.
+#include "empty.h"
+
+// Now parse the definitions again.
+#include "defs.h"
diff --git a/clang/test/Modules/Inputs/submodules-merge-defs/module.modulemap b/clang/test/Modules/Inputs/submodules-merge-defs/module.modulemap
new file mode 100644
index 0000000..5c7ee8a
--- /dev/null
+++ b/clang/test/Modules/Inputs/submodules-merge-defs/module.modulemap
@@ -0,0 +1,11 @@
+module "stuff" {
+  textual header "defs.h"
+  module "empty" { header "empty.h" }
+  module "use" { header "use-defs.h" }
+}
+
+module "redef" {
+  header "import-and-redefine.h"
+  // Do not re-export stuff.use
+  use "stuff"
+}
diff --git a/clang/test/Modules/Inputs/submodules-merge-defs/use-defs.h b/clang/test/Modules/Inputs/submodules-merge-defs/use-defs.h
new file mode 100644
index 0000000..31c69c6
--- /dev/null
+++ b/clang/test/Modules/Inputs/submodules-merge-defs/use-defs.h
@@ -0,0 +1 @@
+#include "defs.h"
diff --git a/clang/test/Modules/submodules-merge-defs.cpp b/clang/test/Modules/submodules-merge-defs.cpp
new file mode 100644
index 0000000..48d4feb
--- /dev/null
+++ b/clang/test/Modules/submodules-merge-defs.cpp
@@ -0,0 +1,13 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -x c++ -fmodules-cache-path=%t -fmodules -I %S/Inputs/submodules-merge-defs %s -verify -fno-modules-error-recovery
+
+// Trigger import of definitions, but don't make them visible.
+#include "empty.h"
+
+A pre_a; // expected-error {{must be imported}} expected-error {{must use 'struct'}}
+// expected-note@defs.h:1 {{here}}
+
+// Make definitions from second module visible.
+#include "import-and-redefine.h"
+
+A post_a;