1// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-checker=alpha.deadcode.IdempotentOperations -verify %s
2
3// C++ specific false positives
4
5extern void test(int i);
6extern void test_ref(int &i);
7
8// Test references affecting pseudoconstants
9void false1() {
10  int a = 0;
11  int five = 5;
12  int &b = a;
13   test(five * a); // expected-warning {{The right operand to '*' is always 0}}
14   b = 4;
15}
16
17// Test not flagging idempotent operations because we aborted the analysis
18// of a path because of an unsupported construct.
19struct RDar9219143_Foo {
20  ~RDar9219143_Foo();
21  operator bool() const;
22};
23
24RDar9219143_Foo foo();
25unsigned RDar9219143_bar();
26void RDar9219143_test() {
27  unsigned i, e;
28  for (i = 0, e = RDar9219143_bar(); i != e; ++i)
29    if (foo())
30      break;
31  if (i == e) // no-warning
32    return;
33}
34
35