Author: Chuanqi Xu
Date: 2026-01-07T06:57:40Z
New Revision: 2451172df73445bc2e28bf3f9b7caf2e4bff7469

URL: 
https://github.com/llvm/llvm-project/commit/2451172df73445bc2e28bf3f9b7caf2e4bff7469
DIFF: 
https://github.com/llvm/llvm-project/commit/2451172df73445bc2e28bf3f9b7caf2e4bff7469.diff

LOG: [C++20] [Modules] Don't update MarkAsUsed information for decls from named 
modules (#174687)

Declarations from named modules are used naturally. Thet are
declarations in other TU. We don't need to record the information for
updating them.

Added: 
    clang/test/Modules/class-instantiate-no-change.cppm

Modified: 
    clang/lib/Serialization/ASTWriterDecl.cpp
    clang/test/Modules/malformed-constraint-template-non-type-parm-decl.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Serialization/ASTWriterDecl.cpp 
b/clang/lib/Serialization/ASTWriterDecl.cpp
index 89e6d8e2acfec..df24a12271a16 100644
--- a/clang/lib/Serialization/ASTWriterDecl.cpp
+++ b/clang/lib/Serialization/ASTWriterDecl.cpp
@@ -525,7 +525,10 @@ void ASTDeclWriter::VisitDecl(Decl *D) {
   // store it as 0b001111, which takes 6 bits only now.
   DeclBits.addBits((uint64_t)D->getModuleOwnershipKind(), /*BitWidth=*/3);
   DeclBits.addBit(D->isThisDeclarationReferenced());
-  DeclBits.addBit(D->isUsed(false));
+  // If we're writing a BMI for a named module unit, we can treat all decls as 
in
+  // the BMI as used. Otherwise, the consumer need to mark it as used again, 
this
+  // simply waste time.
+  DeclBits.addBit(Writer.isWritingStdCXXNamedModules() ? true : 
D->isUsed(false));
   DeclBits.addBits(D->getAccess(), /*BitWidth=*/2);
   DeclBits.addBit(D->isImplicit());
   DeclBits.addBit(D->getDeclContext() != D->getLexicalDeclContext());

diff  --git a/clang/test/Modules/class-instantiate-no-change.cppm 
b/clang/test/Modules/class-instantiate-no-change.cppm
new file mode 100644
index 0000000000000..6ea7d24252ab5
--- /dev/null
+++ b/clang/test/Modules/class-instantiate-no-change.cppm
@@ -0,0 +1,50 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+
+// RUN: %clang_cc1 -std=c++20 %t/impl.cppm -emit-reduced-module-interface -o 
%t/impl.pcm
+// RUN: %clang_cc1 -std=c++20 %t/impl.v2.cppm -emit-reduced-module-interface 
-o %t/impl.v2.pcm
+// RUN: %clang_cc1 -std=c++20 %t/m.cppm -emit-reduced-module-interface -o 
%t/m.pcm \
+// RUN:     -fmodule-file=impl=%t/impl.pcm
+// RUN: %clang_cc1 -std=c++20 %t/m.cppm -emit-reduced-module-interface -o 
%t/m.v2.pcm \
+// RUN:     -fmodule-file=impl=%t/impl.v2.pcm
+
+// Since m only uses impl in the definition, the change in impl shouldn't 
affect m.
+// RUN: 
diff  %t/m.pcm %t/m.v2.pcm &> /dev/null
+
+//--- impl.cppm
+export module impl;
+export struct Impl {
+    Impl() {}
+    Impl(const Impl &) {}
+    ~Impl() {}
+    int get() {
+        return 43;
+    }
+};
+
+//--- impl.v2.cppm
+export module impl;
+export struct Impl {
+    Impl() {}
+    Impl(const Impl &) {}
+    ~Impl() {}
+    int get() {
+        return 43;
+    }
+};
+
+export struct ImplV2 {
+    int get() {
+        return 43;
+    }
+};
+
+//--- m.cppm
+export module m;
+import impl;
+
+export int interface() {
+    Impl impl;
+    return impl.get();
+};

diff  --git 
a/clang/test/Modules/malformed-constraint-template-non-type-parm-decl.cpp 
b/clang/test/Modules/malformed-constraint-template-non-type-parm-decl.cpp
index 73dff88e506b4..6162ffa103a6e 100644
--- a/clang/test/Modules/malformed-constraint-template-non-type-parm-decl.cpp
+++ b/clang/test/Modules/malformed-constraint-template-non-type-parm-decl.cpp
@@ -30,26 +30,26 @@ auto tan(const Rep& q);
 // expected-no-diagnostics
 import mod;
 
-// CHECK:      |-FunctionTemplateDecl {{.*}} <line:11:1, line:12:22> col:6 
imported in mod hidden invalid cos
-// CHECK-NEXT: | |-NonTypeTemplateParmDecl {{.*}} <line:11:10, col:34> col:34 
imported in mod hidden referenced invalid 'ReferenceOf<angle> auto' depth 0 
index 0 R
-// CHECK-NEXT: | |-TemplateTypeParmDecl {{.*}} <col:37, col:46> col:46 
imported in mod hidden referenced typename depth 0 index 1 Rep
+// CHECK:      |-FunctionTemplateDecl {{.*}} <line:11:1, line:12:22> col:6 
imported in mod hidden used invalid cos
+// CHECK-NEXT: | |-NonTypeTemplateParmDecl {{.*}} <line:11:10, col:34> col:34 
imported in mod hidden used invalid 'ReferenceOf<angle> auto' depth 0 index 0 R
+// CHECK-NEXT: | |-TemplateTypeParmDecl {{.*}} <col:37, col:46> col:46 
imported in mod hidden used typename depth 0 index 1 Rep
 // CHECK-NEXT: | |-RequiresExpr {{.*}} <col:60, col:84> 'bool'
-// CHECK-NEXT: | | |-ParmVarDecl {{.*}} <col:69, col:73> col:73 imported in 
mod hidden referenced v 'Rep'
+// CHECK-NEXT: | | |-ParmVarDecl {{.*}} <col:69, col:73> col:73 imported in 
mod hidden used v 'Rep'
 // CHECK-NEXT: | | `-SimpleRequirement {{.*}} dependent
 // CHECK-NEXT: | |   `-CallExpr {{.*}} <col:77, col:82> '<dependent type>'
 // CHECK-NEXT: | |     |-UnresolvedLookupExpr {{.*}} <col:77> '<overloaded 
function type>' lvalue (ADL) = 'cos' empty
 // CHECK-NEXT: | |     `-DeclRefExpr {{.*}} <col:81> 'Rep' lvalue ParmVar 
{{.*}} 'v' 'Rep' non_odr_use_unevaluated
-// CHECK-NEXT: | `-FunctionDecl {{.*}} <line:12:1, col:22> col:6 imported in 
mod hidden cos 'auto (const Rep &)'
-// CHECK-NEXT: |   `-ParmVarDecl {{.*}} <col:10, col:21> col:21 imported in 
mod hidden q 'const Rep &'
+// CHECK-NEXT: | `-FunctionDecl {{.*}} <line:12:1, col:22> col:6 imported in 
mod hidden used cos 'auto (const Rep &)'
+// CHECK-NEXT: |   `-ParmVarDecl {{.*}} <col:10, col:21> col:21 imported in 
mod hidden used q 'const Rep &'
 
-// CHECK:      |-FunctionTemplateDecl {{.*}} <line:15:1, line:16:22> col:6 
imported in mod hidden invalid tan
-// CHECK-NEXT: | |-NonTypeTemplateParmDecl {{.*}} <line:15:10, col:34> col:34 
imported in mod hidden referenced invalid 'ReferenceOf<angle> auto' depth 0 
index 0 R
-// CHECK-NEXT: | |-TemplateTypeParmDecl {{.*}} <col:37, col:46> col:46 
imported in mod hidden referenced typename depth 0 index 1 Rep
+// CHECK:      |-FunctionTemplateDecl {{.*}} <line:15:1, line:16:22> col:6 
imported in mod hidden used invalid tan
+// CHECK-NEXT: | |-NonTypeTemplateParmDecl {{.*}} <line:15:10, col:34> col:34 
imported in mod hidden used invalid 'ReferenceOf<angle> auto' depth 0 index 0 R
+// CHECK-NEXT: | |-TemplateTypeParmDecl {{.*}} <col:37, col:46> col:46 
imported in mod hidden used typename depth 0 index 1 Rep
 // CHECK-NEXT: | |-RequiresExpr {{.*}} <col:60, col:84> 'bool'
-// CHECK-NEXT: | | |-ParmVarDecl {{.*}} <col:69, col:73> col:73 imported in 
mod hidden referenced v 'Rep'
+// CHECK-NEXT: | | |-ParmVarDecl {{.*}} <col:69, col:73> col:73 imported in 
mod hidden used v 'Rep'
 // CHECK-NEXT: | | `-SimpleRequirement {{.*}} dependent
 // CHECK-NEXT: | |   `-CallExpr {{.*}} <col:77, col:82> '<dependent type>'
 // CHECK-NEXT: | |     |-UnresolvedLookupExpr {{.*}} <col:77> '<overloaded 
function type>' lvalue (ADL) = 'tan' empty
 // CHECK-NEXT: | |     `-DeclRefExpr {{.*}} <col:81> 'Rep' lvalue ParmVar 
{{.*}} 'v' 'Rep' non_odr_use_unevaluated
-// CHECK-NEXT: | `-FunctionDecl {{.*}} <line:16:1, col:22> col:6 imported in 
mod hidden tan 'auto (const Rep &)'
-// CHECK-NEXT: |   `-ParmVarDecl {{.*}} <col:10, col:21> col:21 imported in 
mod hidden q 'const Rep &'
+// CHECK-NEXT: | `-FunctionDecl {{.*}} <line:16:1, col:22> col:6 imported in 
mod hidden used tan 'auto (const Rep &)'
+// CHECK-NEXT: |   `-ParmVarDecl {{.*}} <col:10, col:21> col:21 imported in 
mod hidden used q 'const Rep &'


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to