-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Modules] Do not rewrite existing decls when deserializing class fields
Classes can have implicit members that were added before fields were deserialized. These members were previously silently removed from `decls()` when fields were deserialized after them. This was the root cause of a compilation error exposed in bc95f27, added a test for it. Reviewed By: ChuanqiXu Differential Revision: https://reviews.llvm.org/D148515
- Loading branch information
1 parent
2948316
commit ccf7191
Showing
2 changed files
with
78 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
// RUN: rm -rf %t | ||
// RUN: mkdir -p %t | ||
// RUN: split-file %s %t | ||
// | ||
// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm | ||
// RUN: %clang_cc1 -std=c++20 %t/b.cppm -emit-module-interface -o %t/b.pcm \ | ||
// RUN: -fprebuilt-module-path=%t | ||
// RUN: %clang_cc1 -std=c++20 %t/c.cppm -emit-module-interface -o %t/c.pcm \ | ||
// RUN: -fprebuilt-module-path=%t | ||
// RUN: %clang_cc1 -std=c++20 %t/d.cppm -emit-module-interface -o %t/d.pcm \ | ||
// RUN: -fprebuilt-module-path=%t | ||
// RUN: %clang_cc1 -std=c++20 %t/e.cpp -fsyntax-only -verify -fprebuilt-module-path=%t | ||
|
||
//--- a.cppm | ||
export module a; | ||
|
||
struct WithCtor { | ||
WithCtor(); | ||
}; | ||
|
||
export template <typename T> | ||
struct Getter { | ||
union { | ||
WithCtor container; | ||
}; | ||
}; | ||
|
||
//--- b.cppm | ||
export module b; | ||
|
||
import a; | ||
|
||
export template <typename T> | ||
class AnySpan { | ||
public: | ||
AnySpan(); | ||
AnySpan(Getter<T> getter) | ||
: getter_(getter) {} | ||
|
||
private: | ||
Getter<T> getter_; | ||
}; | ||
|
||
//--- c.cppm | ||
export module c; | ||
import b; | ||
|
||
export inline void RegisterInt322( | ||
AnySpan<const int> sibling_field_nums) { | ||
sibling_field_nums = sibling_field_nums; | ||
} | ||
|
||
//--- d.cppm | ||
// expected-no-diagnostics | ||
export module d; | ||
import c; | ||
import b; | ||
|
||
export inline void RegisterInt32( | ||
AnySpan<const int> sibling_field_nums = {}) { | ||
sibling_field_nums = sibling_field_nums; | ||
} | ||
|
||
//--- e.cpp | ||
import d; | ||
import b; | ||
|
||
// expected-no-diagnostics | ||
void foo(AnySpan<const int> s) { | ||
s = AnySpan<const int>(s); | ||
} |