Skip to content
  • Bruno Ricci's avatar
    8a571538
    [Sema] SequenceChecker: Fix handling of operator ||, && and ?: · 8a571538
    Bruno Ricci 创作于
    The current handling of the operators ||, && and ?: has a number of false
    positive and false negative. The issues for operator || and && are:
    
    1. We need to add sequencing regions for the LHS and RHS as is done for the
       comma operator. Not doing so causes false positives in expressions like
       `((a++, false) || (a++, false))` (from PR39779, see PR22197 for another
        example).
    
    2. In the current implementation when the evaluation of the LHS fails, the RHS
       is added to a worklist to be processed later. This results in false negatives
       in expressions like `(a && a++) + a`.
    
    Fix these issues by introducing sequencing regions for the LHS and RHS, and by
    not deferring the visitation of the RHS.
    
    The issues with the ternary operator ?: are similar, with the added twist that
    we should not warn on expressions like `(x ? y += 1 : y += 2)` since exactly
    one of the 2nd and 3rd expression is going to be evaluated, but we should still
    warn on expressions like `(x ? y += 1 : y += 2) = y`.
    
    Differential Revision: https://reviews.llvm.org/D57747
    
    Reviewed By: rsmith
    8a571538
    [Sema] SequenceChecker: Fix handling of operator ||, && and ?:
    Bruno Ricci 创作于
    The current handling of the operators ||, && and ?: has a number of false
    positive and false negative. The issues for operator || and && are:
    
    1. We need to add sequencing regions for the LHS and RHS as is done for the
       comma operator. Not doing so causes false positives in expressions like
       `((a++, false) || (a++, false))` (from PR39779, see PR22197 for another
        example).
    
    2. In the current implementation when the evaluation of the LHS fails, the RHS
       is added to a worklist to be processed later. This results in false negatives
       in expressions like `(a && a++) + a`.
    
    Fix these issues by introducing sequencing regions for the LHS and RHS, and by
    not deferring the visitation of the RHS.
    
    The issues with the ternary operator ?: are similar, with the added twist that
    we should not warn on expressions like `(x ? y += 1 : y += 2)` since exactly
    one of the 2nd and 3rd expression is going to be evaluated, but we should still
    warn on expressions like `(x ? y += 1 : y += 2) = y`.
    
    Differential Revision: https://reviews.llvm.org/D57747
    
    Reviewed By: rsmith
加载中