[LLVMbugs] [Bug 17835] New: -Wunused-value and ternary operator gives unexpected behavior

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Wed Nov 6 13:13:15 PST 2013


http://llvm.org/bugs/show_bug.cgi?id=17835

            Bug ID: 17835
           Summary: -Wunused-value and ternary operator gives unexpected
                    behavior
           Product: clang
           Version: trunk
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Static Analyzer
          Assignee: kremenek at apple.com
          Reporter: kaduk-llvm at mit.edu
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

This is using a trunk snapshot from FreeBSD's lang/clang-devel port, it seems
to be LLVM svn r193887.  The behavior is slightly different in older versions
of clang, but still unexpected/confusing.

This program:
%%%%%%
int main(int argc, char **argv) {
    (1 < 2) ? 3 : 4;
    return 0;
}
%%%%%%
(correctly) gives a warning: expression result unused (-Wunused-value),
pointing to the '3'.  However, if the '<' is changed to '>', the warning still
points to the '3' (and not the '4' as one might expect, given that the
conditional expression is a constant).
It seems that C99 requires that the two branches of the ternary expression have
the same (or compatible) type, so "by the spec" it suffices to check the return
value of just one branch.  However, if I apply a '(void)' cast to either the
'3' or the '4', with either the '<' or '>' version of the test program, no
warning is generated, even with -Wall.  If the warning points to only the '3'
value, it is nonintuitive that a cast on the '4' branch will quiesce the
warning.

I'm not really sure what the best resolution to this situation is -- from
looking at bug 10030 it seems that maybe one should expect CFG analysis in this
scope, but I am unfamiliar with the details.
Another thing to consider would be a warning if the types of the two branches
of the ternary expression were incompatible, that would make the behavior with
(void) casts easier to understand.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20131106/8022329e/attachment.html>


More information about the llvm-bugs mailing list