[PATCH] D128921: [Sema] Merge C++20 concept definitions from different modules in same TU
Ilya Biryukov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 6 10:14:44 PDT 2022
ilya-biryukov added a comment.
Many thanks! I didn't know about `split-file`, it's much nicer indeed!
Also incorporating feedback from @rsmith and removing the call to `makeMergedDefinitionVisible`. Keeping just `setPrimaryMergedDecl` is enough here.
Richard's reply from the email exchange:
I don't think that makeMergedDefinitionVisible is quite right; that's intended to solve a different problem. Specifically, when we have a repeated class definition in a single parse:
// in module X
class A { void f(); };
// in module Y
class A { void f(); };
Here, we first see and parse the class definition of A in module X. That then becomes "the" definition of A, for the purposes of this compilation. Then when we see another definition of the class, we choose to skip it because we already have a definition, and Clang wants there to only be one definition of each class. So we end up behaving as if we parsed this:
// in module X
class A { void f(); };
// in module Y
class A;
... but we still need to track that class A has a complete definition if only Y is imported, so that A::f can be used for example. And that's what makeMergedDefinitionVisible does: it says that A should be considered as having a complete definition when Y is imported, even though the definition actually lives in X.
For concepts I think the situation is different: we're not going to skip the "body" of the concept and treat
// module X
template<typename T> concept bool C = true;
// module Y
template<typename T> concept bool C = true;
as if it were
// module X
template<typename T> concept bool C = true;
// module Y
template<typename T> concept bool C; // forward declaration?
... because there's no such thing as a forward declaration of a concept. Instead, I think we should just be calling ASTContext::setPrimaryMergedDecl to say that the C in module Y is a redeclaration of the C in module X, so that a name lookup that finds both is not ambiguous. It shouldn't matter which one we actually pick, because they are the same.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D128921/new/
https://reviews.llvm.org/D128921
More information about the cfe-commits
mailing list