@@ -2127,6 +2127,17 @@ namespace {
21272127 // The name of every member.
21282128 llvm::DenseSet<StringRef> allMemberNames;
21292129
2130+ bool hasConstOperatorStar = false ;
2131+ for (auto member : decl->decls ()) {
2132+ if (auto method = dyn_cast<clang::CXXMethodDecl>(member)) {
2133+ if (method->getOverloadedOperator () ==
2134+ clang::OverloadedOperatorKind::OO_Star &&
2135+ method->param_empty () && method->isConst ())
2136+ hasConstOperatorStar = true ;
2137+ }
2138+ }
2139+ bool hasSynthesizedPointeeProperty = false ;
2140+
21302141 // FIXME: Import anonymous union fields and support field access when
21312142 // it is nested in a struct.
21322143 for (auto m : decl->decls ()) {
@@ -2210,9 +2221,16 @@ namespace {
22102221 if (cxxOperatorKind == clang::OO_Star && cxxMethod->param_empty ()) {
22112222 // This is a dereference operator. We synthesize a computed
22122223 // property called `pointee` for it.
2213- VarDecl *pointeeProperty =
2214- synthesizer.makeDereferencedPointeeProperty (MD);
2215- result->addMember (pointeeProperty);
2224+
2225+ // If this record has multiple overloads of `operator*`, prefer
2226+ // the const overload if it exists.
2227+ if ((cxxMethod->isConst () || !hasConstOperatorStar) &&
2228+ !hasSynthesizedPointeeProperty) {
2229+ VarDecl *pointeeProperty =
2230+ synthesizer.makeDereferencedPointeeProperty (MD);
2231+ result->addMember (pointeeProperty);
2232+ hasSynthesizedPointeeProperty = true ;
2233+ }
22162234
22172235 Impl.markUnavailable (MD, " use .pointee property" );
22182236 MD->overwriteAccess (AccessLevel::Private);
0 commit comments