Add #pragma clang module build/endbuild pragmas for performing a module build
as part of a compilation.

This is intended for two purposes:

1) Writing self-contained test cases for modules: we can now write a single
source file test that builds some number of module files on the side and
imports them.

2) Debugging / test case reduction. A single-source testcase is much more
amenable to reduction, compared to a VFS tarball or .pcm files.

llvm-svn: 305101
diff --git a/clang/test/Modules/preprocess-build.cpp b/clang/test/Modules/preprocess-build.cpp
new file mode 100644
index 0000000..bf9f161
--- /dev/null
+++ b/clang/test/Modules/preprocess-build.cpp
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -std=c++1z %s -verify
+
+#pragma clang module build baz
+  module baz {}
+#pragma clang module endbuild // baz
+
+#pragma clang module build foo
+  module foo { module bar {} }
+#pragma clang module contents
+  #pragma clang module begin foo.bar
+  
+    // Can import baz here even though it was created in an outer build.
+    #pragma clang module import baz
+  
+    #pragma clang module build bar
+      module bar {}
+    #pragma clang module contents
+      #pragma clang module begin bar
+        extern int n;
+      #pragma clang module end
+    #pragma clang module endbuild // bar
+    
+    #pragma clang module import bar
+    
+    constexpr int *f() { return &n; }
+  
+  #pragma clang module end
+#pragma clang module endbuild // foo
+
+#pragma clang module import bar
+#pragma clang module import foo.bar
+static_assert(f() == &n);
+
+#pragma clang module build // expected-error {{expected module name}}
+#pragma clang module build unterminated // expected-error {{no matching '#pragma clang module endbuild'}}