| // RUN: %clang_analyze_cc1 -w -analyzer-checker=core -analyzer-output=text \ |
| // RUN: -verify %s |
| |
| namespace note_on_skipped_vbases { |
| struct A { |
| int x; |
| A() : x(0) {} // expected-note{{The value 0 is assigned to 'c.x'}} |
| A(int x) : x(x) {} |
| }; |
| |
| struct B : virtual A { |
| int y; |
| // This note appears only once, when this constructor is called from C. |
| // When this constructor is called from D, this note is still correct but |
| // it doesn't appear because it's pruned out because it's irrelevant to the |
| // bug report. |
| B(): // expected-note{{Virtual base initialization skipped because it has already been handled by the most derived class}} |
| A(1), |
| y(1 / x) // expected-warning{{Division by zero}} |
| // expected-note@-1{{Division by zero}} |
| {} |
| }; |
| |
| struct C : B { |
| C(): // expected-note{{Calling default constructor for 'A'}} |
| // expected-note@-1{{Returning from default constructor for 'A'}} |
| B() // expected-note{{Calling default constructor for 'B'}} |
| {} |
| }; |
| |
| void test_note() { |
| C c; // expected-note{{Calling default constructor for 'C'}} |
| } |
| |
| struct D: B { |
| D() : A(1), B() {} |
| }; |
| |
| void test_prunability() { |
| D d; |
| 1 / 0; // expected-warning{{Division by zero}} |
| // expected-note@-1{{Division by zero}} |
| } |
| } // namespace note_on_skipped_vbases |