Close https://github.com/llvm/llvm-project/issues/60890.
For the following example:
```cpp
export module a;
export template<typename T>
struct a {
friend void aa(a) requires(true) {
}
};
```
```cpp
export module b;
import a;
struct b {
a<int> m;
};
```
```cpp
export module c;
import a;
struct c {
void f() const {
aa(a<int>());
}
};
```
```cpp
import a;
import b;
import c;
void d() {
aa(a<int>());
}
```
The current clang will reject this incorrectly. The reason is that the require clause will be replaced with the evaluated version (https://github.com/llvm/llvm-project/blob/efae3174f09560353fb0f3d528bcbffe060d5438/clang/lib/Sema/SemaConcept.cpp#L664-L665). In module 'b', the friend function is instantiated but not used so the require clause of the friend function is `(true)`. However, in module 'c', the friend function is used so the require clause is `true`. So deserializer classify these two function to two different functions instead of one. Then here is the bug report.
The proposed solution is to provide an original require clause which wouldn't change during the semantic analysis.