Author: Chuanqi Xu
Date: 2024-08-05T17:01:24+08:00
New Revision: 1fec981b67ac57abd4d8defd73beb5a9433c602f

URL: 
https://github.com/llvm/llvm-project/commit/1fec981b67ac57abd4d8defd73beb5a9433c602f
DIFF: 
https://github.com/llvm/llvm-project/commit/1fec981b67ac57abd4d8defd73beb5a9433c602f.diff

LOG: [C++20] [Modules] Skip ODR checks in implicit global modules

Previously we skipped the ODR checks in explicit global modules. And due
to similar reasons, we should skip the ODR checks in implicit global
modules too.

Added: 
    

Modified: 
    clang/include/clang/AST/DeclBase.h
    clang/include/clang/Serialization/ASTReader.h
    clang/lib/AST/DeclBase.cpp
    clang/test/Modules/skip-odr-check-in-gmf.cppm

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/AST/DeclBase.h 
b/clang/include/clang/AST/DeclBase.h
index 40f01abf384e9..58f0aaba93b71 100644
--- a/clang/include/clang/AST/DeclBase.h
+++ b/clang/include/clang/AST/DeclBase.h
@@ -673,6 +673,9 @@ class alignas(8) Decl {
   /// Whether this declaration comes from explicit global module.
   bool isFromExplicitGlobalModule() const;
 
+  /// Whether this declaration comes from global module.
+  bool isFromGlobalModule() const;
+
   /// Whether this declaration comes from a named module.
   bool isInNamedModule() const;
 

diff  --git a/clang/include/clang/Serialization/ASTReader.h 
b/clang/include/clang/Serialization/ASTReader.h
index 76e51ac7ab979..1ae1bf8ec7957 100644
--- a/clang/include/clang/Serialization/ASTReader.h
+++ b/clang/include/clang/Serialization/ASTReader.h
@@ -2478,7 +2478,7 @@ class BitsUnpacker {
 
 inline bool shouldSkipCheckingODR(const Decl *D) {
   return D->getASTContext().getLangOpts().SkipODRCheckInGMF &&
-         D->isFromExplicitGlobalModule();
+         D->isFromGlobalModule();
 }
 
 } // namespace clang

diff  --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index a1f70546bde42..98a7746b7d997 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/lib/AST/DeclBase.cpp
@@ -1144,6 +1144,10 @@ bool Decl::isFromExplicitGlobalModule() const {
   return getOwningModule() && getOwningModule()->isExplicitGlobalModule();
 }
 
+bool Decl::isFromGlobalModule() const {
+  return getOwningModule() && getOwningModule()->isGlobalModule();
+}
+
 bool Decl::isInNamedModule() const {
   return getOwningModule() && getOwningModule()->isNamedModule();
 }

diff  --git a/clang/test/Modules/skip-odr-check-in-gmf.cppm 
b/clang/test/Modules/skip-odr-check-in-gmf.cppm
index 3ee7d09224bfa..4a6003287a39a 100644
--- a/clang/test/Modules/skip-odr-check-in-gmf.cppm
+++ b/clang/test/Modules/skip-odr-check-in-gmf.cppm
@@ -35,17 +35,21 @@ module;
 export module a;
 export using ::func;
 
+export extern "C++" bool func1() { return true; }
+
 //--- b.cppm
 module;
 #include "func2.h"
 export module b;
 export using ::func;
 
+export extern "C++" bool func1() { return false; }
+
 //--- test.cc
 import a;
 import b;
 bool test() {
-    return func(1, 2);
+    return func(1, 2) && func1();
 }
 
 #ifdef IGNORE_ODR_VIOLATION
@@ -53,4 +57,6 @@ bool test() {
 #else
 // expected-error@func2.h:1 {{'func' has 
diff erent definitions in 
diff erent modules;}}
 // expected-note@func1.h:1 {{but in 'a.<global>' found a 
diff erent body}}
+// expected-er...@b.cppm:6 {{'func1' has 
diff erent definitions in 
diff erent modules; definition in module 'b.<implicit global>' first 
diff erence is function body}}
+// expected-n...@a.cppm:6 {{but in 'a.<implicit global>' found a 
diff erent body}}
 #endif


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

Reply via email to