| // Test that, in C++20 modules reduced BMI, the implementation detail changes |
| // in non-inline function may not propagate while the inline function changes |
| // can get propagate. |
| // |
| // RUN: rm -rf %t |
| // RUN: split-file %s %t |
| // RUN: cd %t |
| // |
| // RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-reduced-module-interface -o %t/a.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/a.v1.cppm -emit-reduced-module-interface -o %t/a.v1.pcm |
| // |
| // The BMI of A should differ since the different implementation. |
| // RUN: not diff %t/a.pcm %t/a.v1.pcm &> /dev/null |
| // |
| // The BMI of B should change since the dependent inline function changes |
| // RUN: %clang_cc1 -std=c++20 %t/b.cppm -emit-reduced-module-interface -fmodule-file=a=%t/a.pcm \ |
| // RUN: -o %t/b.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/b.cppm -emit-reduced-module-interface -fmodule-file=a=%t/a.v1.pcm \ |
| // RUN: -o %t/b.v1.pcm |
| // RUN: not diff %t/b.v1.pcm %t/b.pcm &> /dev/null |
| // |
| // Test the case with unused partitions. |
| // RUN: %clang_cc1 -std=c++20 %t/M-A.cppm -emit-reduced-module-interface -o %t/M-A.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/M-B.cppm -emit-reduced-module-interface -o %t/M-B.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/M.cppm -emit-reduced-module-interface -o %t/M.pcm \ |
| // RUN: -fmodule-file=M:partA=%t/M-A.pcm \ |
| // RUN: -fmodule-file=M:partB=%t/M-B.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/N.cppm -emit-reduced-module-interface -o %t/N.pcm \ |
| // RUN: -fmodule-file=M:partA=%t/M-A.pcm \ |
| // RUN: -fmodule-file=M:partB=%t/M-B.pcm \ |
| // RUN: -fmodule-file=M=%t/M.pcm |
| // |
| // Now we change `M-A.cppm` to `M-A.v1.cppm`. |
| // RUN: %clang_cc1 -std=c++20 %t/M-A.v1.cppm -emit-reduced-module-interface -o %t/M-A.v1.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/M.cppm -emit-reduced-module-interface -o %t/M.v1.pcm \ |
| // RUN: -fmodule-file=M:partA=%t/M-A.v1.pcm \ |
| // RUN: -fmodule-file=M:partB=%t/M-B.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/N.cppm -emit-reduced-module-interface -o %t/N.v1.pcm \ |
| // RUN: -fmodule-file=M:partA=%t/M-A.v1.pcm \ |
| // RUN: -fmodule-file=M:partB=%t/M-B.pcm \ |
| // RUN: -fmodule-file=M=%t/M.v1.pcm |
| // |
| // The BMI of N can keep unchanged since the N didn't use the changed partition unit 'M:A'. |
| // RUN: diff %t/N.v1.pcm %t/N.pcm &> /dev/null |
| |
| //--- a.cppm |
| export module a; |
| export inline int a() { |
| return 48; |
| } |
| |
| //--- a.v1.cppm |
| export module a; |
| export inline int a() { |
| return 50; |
| } |
| |
| //--- b.cppm |
| export module b; |
| import a; |
| export inline int b() { |
| return a(); |
| } |
| |
| //--- M-A.cppm |
| export module M:partA; |
| export inline int a() { |
| return 43; |
| } |
| |
| //--- M-A.v1.cppm |
| export module M:partA; |
| export inline int a() { |
| return 50; |
| } |
| |
| //--- M-B.cppm |
| export module M:partB; |
| export inline int b() { |
| return 44; |
| } |
| |
| //--- M.cppm |
| export module M; |
| export import :partA; |
| export import :partB; |
| |
| //--- N.cppm |
| export module N; |
| import M; |
| |
| export inline int n() { |
| return b(); |
| } |