Revert r300001 "Revert r298824 & r298816, recommit r298742 & r298754"

It caused PR32640.

llvm-svn: 300074
diff --git a/clang/test/Modules/odr_hash.cpp b/clang/test/Modules/odr_hash.cpp
index 53233b4..7543670 100644
--- a/clang/test/Modules/odr_hash.cpp
+++ b/clang/test/Modules/odr_hash.cpp
@@ -275,33 +275,6 @@
 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with a different initializer}}
 #endif
 
-#if defined(FIRST)
-struct S12 {
-  unsigned x[5];
-};
-#elif defined(SECOND)
-struct S12 {
-  unsigned x[7];
-};
-#else
-S12 s12;
-// expected-error@first.h:* {{'Field::S12::x' from module 'FirstModule' is not present in definition of 'Field::S12' in module 'SecondModule'}}
-// expected-note@second.h:* {{declaration of 'x' does not match}}
-#endif
-
-#if defined(FIRST)
-struct S13 {
-  unsigned x[7];
-};
-#elif defined(SECOND)
-struct S13 {
-  double x[7];
-};
-#else
-S13 s13;
-// expected-error@first.h:* {{'Field::S13::x' from module 'FirstModule' is not present in definition of 'Field::S13' in module 'SecondModule'}}
-// expected-note@second.h:* {{declaration of 'x' does not match}}
-#endif
 }  // namespace Field
 
 namespace Method {
@@ -430,93 +403,6 @@
 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is const}}
 #endif
 
-#if defined(FIRST)
-struct S9 {
-  void A(int x) {}
-  void A(int x, int y) {}
-};
-#elif defined(SECOND)
-struct S9 {
-  void A(int x, int y) {}
-  void A(int x) {}
-};
-#else
-S9 s9;
-// expected-error@second.h:* {{'Method::S9' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' that has 2 parameters}}
-// expected-note@first.h:* {{but in 'FirstModule' found method 'A' that has 1 parameter}}
-#endif
-
-#if defined(FIRST)
-struct S10 {
-  void A(int x) {}
-  void A(float x) {}
-};
-#elif defined(SECOND)
-struct S10 {
-  void A(float x) {}
-  void A(int x) {}
-};
-#else
-S10 s10;
-// expected-error@second.h:* {{'Method::S10' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter of type 'float'}}
-// expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter of type 'int'}}
-#endif
-
-#if defined(FIRST)
-struct S11 {
-  void A(int x) {}
-};
-#elif defined(SECOND)
-struct S11 {
-  void A(int y) {}
-};
-#else
-S11 s11;
-// expected-error@second.h:* {{'Method::S11' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter named 'y'}}
-// expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter named 'x'}}
-#endif
-
-#if defined(FIRST)
-struct S12 {
-  void A(int x) {}
-};
-#elif defined(SECOND)
-struct S12 {
-  void A(int x = 1) {}
-};
-#else
-S12 s12;
-// expected-error@second.h:* {{'Method::S12' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter with default argument}}
-// expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter with no default argument}}
-#endif
-
-#if defined(FIRST)
-struct S13 {
-  void A(int x = 1 + 0) {}
-};
-#elif defined(SECOND)
-struct S13 {
-  void A(int x = 1) {}
-};
-#else
-S13 s13;
-// expected-error@second.h:* {{'Method::S13' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter with default argument}}
-// expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter with different default argument}}
-#endif
-
-#if defined(FIRST)
-struct S14 {
-  void A(int x[2]) {}
-};
-#elif defined(SECOND)
-struct S14 {
-  void A(int x[3]) {}
-};
-#else
-S14 s14;
-// expected-error@second.h:* {{'Method::S14' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter of type 'int *' decayed from 'int [3]'}}
-// expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter of type 'int *' decayed from 'int [2]'}}
-#endif
 }  // namespace Method
 
 // Naive parsing of AST can lead to cycles in processing.  Ensure
@@ -636,54 +522,71 @@
 #endif
 }  // namespace Using
 
+
 // Interesting cases that should not cause errors.  struct S should not error
 // while struct T should error at the access specifier mismatch at the end.
-#define ALL_DECLS                                        \
-public:                                                  \
-private:                                                 \
-protected:                                               \
-  static_assert(1 == 1, "Message");                      \
-  static_assert(2 == 2);                                 \
-                                                         \
-  int x;                                                 \
-  double y;                                              \
-                                                         \
-  INT z;                                                 \
-                                                         \
-  unsigned a : 1;                                        \
-  unsigned b : 2 * 2 + 5 / 2;                            \
-                                                         \
-  mutable int c = sizeof(x + y);                         \
-                                                         \
-  void method() {}                                       \
-  static void static_method() {}                         \
-  virtual void virtual_method() {}                       \
-  virtual void pure_virtual_method() = 0;                \
-  inline void inline_method() {}                         \
-  void volatile_method() volatile {}                     \
-  void const_method() const {}                           \
-                                                         \
-  typedef int typedef_int;                               \
-  using using_int = int;                                 \
-                                                         \
-  void method_one_arg(int x) {}                          \
-  void method_one_arg_default_argument(int x = 5 + 5) {} \
-  void method_decayed_type(int x[5]) {}                  \
-                                                         \
-  int constant_arr[5];                                   \
-                                                         \
-  double last_decl;
-
 namespace AllDecls {
 #if defined(FIRST)
 typedef int INT;
 struct S {
-  ALL_DECLS
+  public:
+  private:
+  protected:
+
+  static_assert(1 == 1, "Message");
+  static_assert(2 == 2);
+
+  int x;
+  double y;
+
+  INT z;
+
+  unsigned a : 1;
+  unsigned b : 2*2 + 5/2;
+
+  mutable int c = sizeof(x + y);
+
+  void method() {}
+  static void static_method() {}
+  virtual void virtual_method() {}
+  virtual void pure_virtual_method() = 0;
+  inline void inline_method() {}
+  void volatile_method() volatile {}
+  void const_method() const {}
+
+  typedef int typedef_int;
+  using using_int = int;
 };
 #elif defined(SECOND)
 typedef int INT;
 struct S {
-  ALL_DECLS
+  public:
+  private:
+  protected:
+
+  static_assert(1 == 1, "Message");
+  static_assert(2 == 2);
+
+  int x;
+  double y;
+
+  INT z;
+
+  unsigned a : 1;
+  unsigned b : 2 * 2 + 5 / 2;
+
+  mutable int c = sizeof(x + y);
+
+  void method() {}
+  static void static_method() {}
+  virtual void virtual_method() {}
+  virtual void pure_virtual_method() = 0;
+  inline void inline_method() {}
+  void volatile_method() volatile {}
+  void const_method() const {}
+
+  typedef int typedef_int;
+  using using_int = int;
 };
 #else
 S *s;
@@ -692,14 +595,66 @@
 #if defined(FIRST)
 typedef int INT;
 struct T {
-  ALL_DECLS
+  public:
+  private:
+  protected:
+
+  static_assert(1 == 1, "Message");
+  static_assert(2 == 2);
+
+  int x;
+  double y;
+
+  INT z;
+
+  unsigned a : 1;
+  unsigned b : 2 * 2 + 5 / 2;
+
+  mutable int c = sizeof(x + y);
+
+  void method() {}
+  static void static_method() {}
+  virtual void virtual_method() {}
+  virtual void pure_virtual_method() = 0;
+  inline void inline_method() {}
+  void volatile_method() volatile {}
+  void const_method() const {}
+
+  typedef int typedef_int;
+  using using_int = int;
 
   private:
 };
 #elif defined(SECOND)
 typedef int INT;
 struct T {
-  ALL_DECLS
+  public:
+  private:
+  protected:
+
+  static_assert(1 == 1, "Message");
+  static_assert(2 == 2);
+
+  int x;
+  double y;
+
+  INT z;
+
+  unsigned a : 1;
+  unsigned b : 2 * 2 + 5 / 2;
+
+  mutable int c = sizeof(x + y);
+
+  void method() {}
+  static void static_method() {}
+  virtual void virtual_method() {}
+  virtual void pure_virtual_method() = 0;
+  inline void inline_method() {}
+  void volatile_method() volatile {}
+  void const_method() const {}
+
+  typedef int typedef_int;
+  using using_int = int;
 
   public:
 };
@@ -989,22 +944,6 @@
 #endif
 }  // namespace StructWithForwardDeclarationNoDefinition
 
-namespace LateParsedDefaultArgument {
-#if defined(FIRST)
-template <typename T>
-struct S {
-  struct R {
-    void foo(T x = 0) {}
-  };
-};
-#elif defined(SECOND)
-#else
-void run() {
-  S<int>::R().foo();
-}
-#endif
-}
-
 // Keep macros contained to one file.
 #ifdef FIRST
 #undef FIRST