[all-commits] [llvm/llvm-project] 2408f9: Recommit [C++20] [Modules] Trying to compare the t...

Chuanqi Xu via All-commits all-commits at lists.llvm.org
Fri Mar 3 01:28:16 PST 2023


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 2408f97652caadf733a879e1d7d9c0702a80d609
      https://github.com/llvm/llvm-project/commit/2408f97652caadf733a879e1d7d9c0702a80d609
  Author: Chuanqi Xu <yedeng.yd at linux.alibaba.com>
  Date:   2023-03-03 (Fri, 03 Mar 2023)

  Changed paths:
    M clang/lib/AST/ASTContext.cpp
    A clang/test/Modules/pr60890.cppm

  Log Message:
  -----------
  Recommit [C++20] [Modules] Trying to compare the trailing require clause from the primary template function

Close https://github.com/llvm/llvm-project/issues/60890.

For the following example:

```
export module a;

export template<typename T>
struct a {
	friend void aa(a) requires(true) {
	}
};
```

```
export module b;

import a;

struct b {
	a<int> m;
};
```

```
export module c;

import a;

struct c {
	void f() const {
		aa(a<int>());
	}
};
```

```
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 try to compare the trailing require clause
of the primary template when performing ODR checking.

Reviewed By: erichkeane

Differential Revision: https://reviews.llvm.org/D144626




More information about the All-commits mailing list