| // RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-checker=alpha.deadcode.IdempotentOperations -verify %s |
| |
| // C++ specific false positives |
| |
| extern void test(int i); |
| extern void test_ref(int &i); |
| |
| // Test references affecting pseudoconstants |
| void false1() { |
| int a = 0; |
| int five = 5; |
| int &b = a; |
| test(five * a); // expected-warning {{The right operand to '*' is always 0}} |
| b = 4; |
| } |
| |
| // Test not flagging idempotent operations because we aborted the analysis |
| // of a path because of an unsupported construct. |
| struct RDar9219143_Foo { |
| ~RDar9219143_Foo(); |
| operator bool() const; |
| }; |
| |
| RDar9219143_Foo foo(); |
| unsigned RDar9219143_bar(); |
| void RDar9219143_test() { |
| unsigned i, e; |
| for (i = 0, e = RDar9219143_bar(); i != e; ++i) |
| if (foo()) |
| break; |
| if (i == e) // no-warning |
| return; |
| } |
| |