Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Clang] [Sema] Handle placeholders in '.*' expressions (#83103) #9089

Merged
merged 1 commit into from
Aug 12, 2024

Commits on Aug 10, 2024

  1. [Clang] [Sema] Handle placeholders in '.*' expressions (llvm#83103)

    When analysing whether we should handle a binary expression as an
    overloaded operator call or a builtin operator, we were calling
    `checkPlaceholderForOverload()`, which takes care of any placeholders
    that are not overload sets—which would usually make sense since those
    need to be handled as part of overload resolution.
    
    Unfortunately, we were also doing that for `.*`, which is not
    overloadable, and then proceeding to create a builtin operator anyway,
    which would crash if the RHS happened to be an unresolved overload set
    (due hitting an assertion in `CreateBuiltinBinOp()`—specifically, in one
    of its callees—in the `.*` case that makes sure its arguments aren’t
    placeholders).
    
    This pr instead makes it so we check for *all* placeholders early if the
    operator is `.*`.
    
    It’s worth noting that,
    1. In the `.*` case, we now additionally also check for *any*
    placeholders (not just non-overload-sets) in the LHS; this shouldn’t
    make a difference, however—at least I couldn’t think of a way to trigger
    the assertion with an overload set as the LHS of `.*`; it is worth
    noting that the assertion in question would also complain if the LHS
    happened to be of placeholder type, though.
    2. There is another case in which we also don’t perform overload
    resolution—namely `=` if the LHS is not of class or enumeration type
    after handling non-overload-set placeholders—as in the `.*` case, but
    similarly to 1., I first couldn’t think of a way of getting this case to
    crash, and secondly, `CreateBuiltinBinOp()` doesn’t seem to care about
    placeholders in the LHS or RHS in the `=` case (from what I can tell,
    it, or rather one of its callees, only checks that the LHS is not a
    pseudo-object type, but those will have already been handled by the call
    to `checkPlaceholderForOverload()` by the time we get to this function),
    so I don’t think this case suffers from the same problem.
    
    This fixes llvm#53815.
    
    ---------
    
    Co-authored-by: Aaron Ballman <[email protected]>
    (cherry picked from commit d23ef9e)
    Sirraide authored and compnerd committed Aug 10, 2024
    Configuration menu
    Copy the full SHA
    4c0dc61 View commit details
    Browse the repository at this point in the history