Skip to content

false positive in nested vector_logic_linter usage when '&' is a method #1453

Closed
@MichaelChirico

Description

@MichaelChirico

& and | are generics, so methods can be defined for which the output is not logical.

This is the case for base octmode class which has an & method to do bitwise-and (much like C/Python's &) and returns octmode (see ?"&.octmode"). As seen in base R:

https://github.com/r-devel/r-svn/blob/9bcb4bef2979e608804fb37ab6471b4894bfa2b2/src/library/utils/R/tar.R#L497

if (is.null(extra_flags) && grepl("/(configure|cleanup)$", f) &&
    (mode & "111") != as.octmode("111")) {
    #     ^ marked as a lint
    warning(gettextf("file '%s' did not have execute permissions: corrected", f), domain = NA, call. = FALSE)
    mode <- mode | "111"
}

The giveaway here is that a comparison operator is used in the <expr> above & -- IINM vector_logic_linter() assumes parent infixes will be &/&&/|/||.

My first instinct was just to call this a known edge case & move on, because in general we can't swap && for all methods of &, but for this particular method we can detect it's fine statically.

Metadata

Metadata

Assignees

No one assigned

    Labels

    false-positivecode that shouldn't lint, but does

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions