[PATCH] D122460: [clang] fixed bug #54406

John McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Mar 25 22:49:57 PDT 2022


rjmccall added inline comments.


================
Comment at: clang/lib/Sema/SemaExprMember.cpp:690
+    // int n = a.B::m;
+    if (BaseExpr && isa<CXXRecordDecl>(DC) && isa<CXXRecordDecl>(RDecl)) {
+      CXXRecordDecl *SRecord = cast<CXXRecordDecl>(DC)->getCanonicalDecl();
----------------
We don't generally cite bug numbers in the source code; we just cite the language rule.  You can reference the bug number in your test, though.

The standard says that this is an error even when the member access is implicit, so the check for `BaseExpr` is incorrect.

Conversely, the standard says this is not an error when the declaration referenced is not a non-static data member or member function, so you cannot do this before the lookup; in fact, you cannot do it until we've fully resolved the lookup, which may require contextual information.

All of the code paths that build a non-static member eventually funnel into `BuildMemberExpr`, so maybe that's the right place for the check?  But note that you have to check explicitly for a non-static member, because `MemberExpr` is used for all of them.

Technically, this rule wasn't in C++98, but since it does appear in C++03, I agree we should just enforce it unconditionally, as we usually treat C++03 as an errata release rather than its own language mode.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D122460/new/

https://reviews.llvm.org/D122460



More information about the cfe-commits mailing list