[PATCH] D113545: [C++20] [Module] Support reachable definition initially/partially
Chuanqi Xu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 15 01:47:18 PDT 2022
ChuanqiXu added a comment.
@rsmith Thanks for your valuable input!
================
Comment at: clang/lib/Sema/SemaLookup.cpp:2000-2004
+ // Class and enumeration member names can be found by name lookup in any
+ // context in which a definition of the type is reachable.
+ if (auto *ECD = dyn_cast<EnumConstantDecl>(ND))
+ return getSema().hasReachableDeclaration(
+ cast<NamedDecl>(ECD->getDeclContext()));
----------------
rsmith wrote:
> I don't think this is quite right. Given:
>
> ```
> export module M {
> export enum E1 { e1 };
> enum E2 { e2 };
> export using E2U = E2;
> enum E3 { e3 };
> export E3 f();
> ```
>
> ... the intent is:
>
> ```
> import M;
> int main() {
> auto a = E1::e1; // OK, namespace-scope name E1 is visible and e1 is reachable
> auto b = e1; // OK, namespace-scope name e1 is visible
> auto c = E2::e2; // error, namespace-scope name E2 is not visible
> auto d = e2; // error, namespace-scope name e2 is not visible
> auto e = E2U::e2; // OK, namespace-scope name E2U is visible and E2::e2 is reachable
> auto f = E3::e3; // error, namespace-scope name E3 is not visible
> auto g = e3; // error, namespace-scope name e3 is not visible
> auto h = decltype(f())::e3; // OK, namespace-scope name f is visible and E3::e3 is reachable
> }
> ```
>
> Instead of doing the check in this function, I think we need to consider the scope in which we're doing a lookup: if that scope is a class or enumeration scope, and the class or enumeration has a reachable definition, then we don't do any visibility checks for its members.
Oh, your example makes sense. The current implementation would accept `d` and `g` unexpectedly. I spent some time to look into this one. And I find it is not so easy to fix. I left a FIXME below and I would file an issue if this patch landed. Do you think this is OK?
BTW, I feel like the wording of spec need to be adjusted too. From the wording, I feel like `d` and `g` should be accepted.
================
Comment at: clang/lib/Sema/SemaLookup.cpp:3754
+ // reachable definition in the set of associated entities,
+ if (AssociatedClasses.count(RD) && hasReachableDeclaration(D)) {
Visible = true;
----------------
rsmith wrote:
> We should look for a reachable definition here, not a reachable declaration.
Yeah, from the wording it should be reachable definition. But it would cause many failures if I write hasReachableDefinition/hasVisibleDefinition here. So it looks like a legacy defect. I chose to follow the original style here.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D113545/new/
https://reviews.llvm.org/D113545
More information about the cfe-commits
mailing list