@@ -3346,46 +3346,6 @@ void Converter::SetUFCSReceiver(clang::Expr *base, bool is_arrow,
33463346 ufcs_receiver_ = std::move (buf).str ();
33473347}
33483348
3349- // Returns the inner member and the replacement string.
3350- static std::pair<clang::MemberExpr *, std::string>
3351- replaceNonUniformLibcField (clang::MemberExpr *expr) {
3352- // Example: ::struct stat::st_mtim::tv_sec -> ::libc::stat::st_mtime
3353- struct Mapping {
3354- const char *record;
3355- const char *inner_field;
3356- const char *leaf_field;
3357- const char *replacement;
3358- };
3359- static constexpr Mapping kFields [] = {
3360- {" stat" , " st_mtim" , " tv_sec" , " st_mtime" }, // Linux
3361- {" stat" , " st_mtimespec" , " tv_sec" , " st_mtime" }, // macOS
3362- {" in6_addr" , " __in6_u" , " __u6_addr8" , " s6_addr" },
3363- };
3364-
3365- auto getNamedIdentifierOrNull = [](auto *decl) {
3366- return decl && decl->getDeclName ().isIdentifier () ? decl : nullptr ;
3367- };
3368-
3369- if (auto leaf = getNamedIdentifierOrNull (expr->getMemberDecl ())) {
3370- if (auto inner = clang::dyn_cast<clang::MemberExpr>(
3371- expr->getBase ()->IgnoreParenImpCasts ())) {
3372- if (auto field = getNamedIdentifierOrNull (
3373- clang::dyn_cast<clang::FieldDecl>(inner->getMemberDecl ()))) {
3374- if (getNamedIdentifierOrNull (field->getParent ())) {
3375- for (const auto &m : kFields ) {
3376- if (field->getParent ()->getName () == m.record &&
3377- field->getName () == m.inner_field &&
3378- leaf->getName () == m.leaf_field ) {
3379- return {inner, m.replacement };
3380- }
3381- }
3382- }
3383- }
3384- }
3385- }
3386- return {nullptr , " " };
3387- }
3388-
33893349void Converter::ConvertMemberExpr (clang::MemberExpr *expr) {
33903350 if (auto mapped = GetMappedAsString (expr); !mapped.empty ()) {
33913351 if (RuleRegistry::ReturnsPointer (ctx_, expr)) {
@@ -3397,7 +3357,7 @@ void Converter::ConvertMemberExpr(clang::MemberExpr *expr) {
33973357 }
33983358
33993359 auto *member = expr->getMemberDecl ();
3400- auto [inner, name_override] = replaceNonUniformLibcField (expr);
3360+ auto [inner, record, name_override] = ReplaceNonUniformLibcField (expr);
34013361 if (inner) {
34023362 expr = inner;
34033363 }
0 commit comments