Artem Dergachev | 6119944 | 2018-03-01 18:53:13 +0000 | [diff] [blame] | 1 | // RUN: %clang_analyze_cc1 -analyze -analyzer-checker core -analyzer-config cfg-temporary-dtors=true,c++-temp-dtor-inlining=true -analyzer-output=text -verify %s |
Artem Dergachev | 60f5aab | 2018-02-15 19:28:21 +0000 | [diff] [blame] | 2 | |
| 3 | namespace test_simple_temporary { |
| 4 | class C { |
| 5 | int x; |
| 6 | |
| 7 | public: |
| 8 | C(int x): x(x) {} // expected-note{{The value 0 is assigned to field 'x'}} |
| 9 | ~C() { x = 1 / x; } // expected-warning{{Division by zero}} |
| 10 | // expected-note@-1{{Division by zero}} |
| 11 | }; |
| 12 | |
| 13 | void test() { |
| 14 | C(0); // expected-note {{Passing the value 0 via 1st parameter 'x'}} |
| 15 | // expected-note@-1{{Calling constructor for 'C'}} |
| 16 | // expected-note@-2{{Returning from constructor for 'C'}} |
| 17 | // expected-note@-3{{Calling '~C'}} |
| 18 | } |
| 19 | } // end namespace test_simple_temporary |
| 20 | |
| 21 | namespace test_lifetime_extended_temporary { |
| 22 | class C { |
| 23 | int x; |
| 24 | |
| 25 | public: |
| 26 | C(int x): x(x) {} // expected-note{{The value 0 is assigned to field 'x'}} |
| 27 | void nop() const {} |
| 28 | ~C() { x = 1 / x; } // expected-warning{{Division by zero}} |
| 29 | // expected-note@-1{{Division by zero}} |
| 30 | }; |
| 31 | |
| 32 | void test(int coin) { |
Artem Dergachev | 9a209ad | 2018-06-28 00:30:18 +0000 | [diff] [blame] | 33 | // We'd divide by zero in the automatic destructor for variable 'c'. |
Artem Dergachev | 60f5aab | 2018-02-15 19:28:21 +0000 | [diff] [blame] | 34 | const C &c = coin ? C(1) : C(0); // expected-note {{Assuming 'coin' is 0}} |
| 35 | // expected-note@-1{{'?' condition is false}} |
| 36 | // expected-note@-2{{Passing the value 0 via 1st parameter 'x'}} |
| 37 | // expected-note@-3{{Calling constructor for 'C'}} |
| 38 | // expected-note@-4{{Returning from constructor for 'C'}} |
Artem Dergachev | 60f5aab | 2018-02-15 19:28:21 +0000 | [diff] [blame] | 39 | c.nop(); |
Artem Dergachev | 9a209ad | 2018-06-28 00:30:18 +0000 | [diff] [blame] | 40 | } // expected-note{{Calling '~C'}} |
Artem Dergachev | 60f5aab | 2018-02-15 19:28:21 +0000 | [diff] [blame] | 41 | } // end namespace test_lifetime_extended_temporary |
| 42 | |
| 43 | namespace test_bug_after_dtor { |
| 44 | int glob; |
| 45 | |
| 46 | class C { |
| 47 | public: |
| 48 | C() { glob += 1; } |
| 49 | ~C() { glob -= 2; } // expected-note{{The value 0 is assigned to 'glob'}} |
| 50 | }; |
| 51 | |
| 52 | void test() { |
| 53 | glob = 1; |
| 54 | C(); // expected-note {{Calling '~C'}} |
| 55 | // expected-note@-1{{Returning from '~C'}} |
| 56 | glob = 1 / glob; // expected-warning{{Division by zero}} |
| 57 | // expected-note@-1{{Division by zero}} |
| 58 | } |
| 59 | } // end namespace test_bug_after_dtor |