[all-commits] [llvm/llvm-project] 28669b: [demangler] Improve ->* & .* demangling

Nathan Sidwell via All-commits all-commits at lists.llvm.org
Tue Feb 8 06:28:58 PST 2022

  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 28669bd091e1542d8318bec4cb2219d65cb73b07
  Author: Nathan Sidwell <nathan at acm.org>
  Date:   2022-02-08 (Tue, 08 Feb 2022)

  Changed paths:
    M libcxxabi/src/demangle/ItaniumDemangle.h
    M libcxxabi/test/test_demangle.pass.cpp
    M llvm/include/llvm/Demangle/ItaniumDemangle.h
    M llvm/include/llvm/Demangle/StringView.h
    M llvm/include/llvm/Demangle/Utility.h

  Log Message:
  [demangler] Improve ->* & .* demangling

The demangler treats ->* as a BinaryExpr, but .* as a MemberExpr.
That's inconsistent.  This makes the former a MemberExpr too.
However, in order to not regress the paren output, MemberExpr::print
is modified to parenthesize the MemberExpr if the operator ends with
'*'.  Printing is affected thusly:

    (obj) ->* (member)

   obj.member   # Unchanged
   obj->member  # Unchanged
   obj.*(member)  # Added paren member operand
   obj->*(member) # Removed paren on object operand, less whitespace

The right solution to the paren problem is to add some notion of
precedence (and associativity) to Nodes, but that's a larger change
that would become simpler once the refactoring I'm doing is completed.

FWIW, binutils' demangler's paren algorithm has a small idea of
precedence, and will generally not emit parens when the operand is

Reviewed By: bruno

Differential Revision: https://reviews.llvm.org/D118486

More information about the All-commits mailing list