Author: Chuanqi Xu
Date: 2023-05-15T11:19:17+08:00
New Revision: 62b5e55512d57b083ac07d40b41242c7116a3d20

URL: 
https://github.com/llvm/llvm-project/commit/62b5e55512d57b083ac07d40b41242c7116a3d20
DIFF: 
https://github.com/llvm/llvm-project/commit/62b5e55512d57b083ac07d40b41242c7116a3d20.diff

LOG: Revert "[Serialization] Don't try to complete the redeclaration chain in"

Close https://github.com/llvm/llvm-project/issues/62705

This reverts commit cf47e9fe86aa65b74b0476a5ad4d036dd7463bfb. This
introduces a breaking change in
https://github.com/llvm/llvm-project/issues/62705. Revert this one to
fix it quickly.

Added: 
    clang/test/Modules/pr62705.cppm

Modified: 
    clang/include/clang/Serialization/ASTReader.h
    clang/lib/Serialization/ASTReader.cpp
    clang/test/Modules/polluted-operator.cppm

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Serialization/ASTReader.h 
b/clang/include/clang/Serialization/ASTReader.h
index af01bacbfdc42..1360ee1877c1a 100644
--- a/clang/include/clang/Serialization/ASTReader.h
+++ b/clang/include/clang/Serialization/ASTReader.h
@@ -988,9 +988,6 @@ class ASTReader
   ///Whether we are currently processing update records.
   bool ProcessingUpdateRecords = false;
 
-  /// Whether we are going to write modules.
-  bool FinalizedForWriting = false;
-
   using SwitchCaseMapTy = llvm::DenseMap<unsigned, SwitchCase *>;
 
   /// Mapping from switch-case IDs in the chain to switch-case statements

diff  --git a/clang/lib/Serialization/ASTReader.cpp 
b/clang/lib/Serialization/ASTReader.cpp
index 93409df3d4fc4..bdf476cf128a3 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -5089,8 +5089,7 @@ void ASTReader::InitializeContext() {
 }
 
 void ASTReader::finalizeForWriting() {
-  assert(!NumCurrentElementsDeserializing && "deserializing when reading");
-  FinalizedForWriting = true;
+  // Nothing to do for now.
 }
 
 /// Reads and return the signature record from \p PCH's control block, or
@@ -7329,12 +7328,6 @@ Decl *ASTReader::GetExternalDecl(uint32_t ID) {
 }
 
 void ASTReader::CompleteRedeclChain(const Decl *D) {
-  // We don't need to complete declaration chain after we start writing.
-  // We loses more chances to find ODR violation in the writing place and
-  // we get more efficient writing process.
-  if (FinalizedForWriting)
-    return;
-
   if (NumCurrentElementsDeserializing) {
     // We arrange to not care about the complete redeclaration chain while 
we're
     // deserializing. Just remember that the AST has marked this one as 
complete

diff  --git a/clang/test/Modules/polluted-operator.cppm 
b/clang/test/Modules/polluted-operator.cppm
index 9b45734432db9..b24464aa6ad21 100644
--- a/clang/test/Modules/polluted-operator.cppm
+++ b/clang/test/Modules/polluted-operator.cppm
@@ -51,20 +51,7 @@ module;
 export module b;
 import a;
 
-void b() {
-  std::variant<int, double> v;
-}
-
 // expected-error@* {{has 
diff erent definitions in 
diff erent modules; first 
diff erence is defined here found data member '_S_copy_ctor' with an 
initializer}}
 // expected-note@* {{but in 'a.<global>' found data member '_S_copy_ctor' with 
a 
diff erent initializer}}
 // expected-error@* {{from module 'a.<global>' is not present in definition of 
'variant<_Types...>' provided earlier}}
 // expected-note@* {{declaration of 'swap' does not match}}
-
-//--- c.cppm
-module;
-#include "bar.h"
-export module c;
-import a;
-
-// expected-error@* {{has 
diff erent definitions in 
diff erent modules; first 
diff erence is defined here found data member '_S_copy_ctor' with an 
initializer}}
-// expected-note@* {{but in 'a.<global>' found data member '_S_copy_ctor' with 
a 
diff erent initializer}}

diff  --git a/clang/test/Modules/pr62705.cppm b/clang/test/Modules/pr62705.cppm
new file mode 100644
index 0000000000000..a09bdf2563e84
--- /dev/null
+++ b/clang/test/Modules/pr62705.cppm
@@ -0,0 +1,48 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 %t/a.cppm -std=c++20 -triple %itanium_abi_triple \
+// RUN:     -emit-module-interface -o %t/a.pcm
+// RUN: %clang_cc1 %t/b.cppm -std=c++20 -triple %itanium_abi_triple \
+// RUN:     -emit-module-interface -o %t/b.pcm \
+// RUN:     -fmodule-file=a=%t/a.pcm
+// RUN: %clang_cc1 %t/b.pcm -std=c++20 -triple %itanium_abi_triple \
+// RUN:     -emit-llvm -o - | FileCheck %t/b.cppm
+
+//--- foo.h
+namespace n {
+
+template<typename>
+struct s0 {
+       static int m;
+};
+
+template<typename T>
+struct s1 {
+       using type = s0<T>;
+};
+
+}
+
+template<typename T>
+void require(n::s1<T>) {
+}
+
+//--- a.cppm
+module;
+
+#include "foo.h"
+
+export module a;
+
+//--- b.cppm
+module;
+
+#include "foo.h"
+
+export module b;
+import a;
+
+// Check the LLVM IR of module 'b' get generated correctly.
+// CHECK: define{{.*}}@_ZGIW1b


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to