xref: /llvm-project/clang/test/Analysis/diagnostics/initializer.cpp (revision ef0aab3138ac8a57c370623c32854f797713dda2)
1 // RUN: %clang_analyze_cc1 -w -analyzer-checker=core -analyzer-output=text \
2 // RUN:   -verify %s
3 
4 namespace note_on_skipped_vbases {
5 struct A {
6   int x;
Anote_on_skipped_vbases::A7   A() : x(0) {} // expected-note{{The value 0 is assigned to 'c.x'}}
Anote_on_skipped_vbases::A8   A(int x) : x(x) {}
9 };
10 
11 struct B : virtual A {
12   int y;
13   // This note appears only once, when this constructor is called from C.
14   // When this constructor is called from D, this note is still correct but
15   // it doesn't appear because it's pruned out because it's irrelevant to the
16   // bug report.
Bnote_on_skipped_vbases::B17   B(): // expected-note{{Virtual base initialization skipped because it has already been handled by the most derived class}}
18     A(1),
19     y(1 / x) // expected-warning{{Division by zero}}
20              // expected-note@-1{{Division by zero}}
21   {}
22 };
23 
24 struct C : B {
Cnote_on_skipped_vbases::C25   C(): // expected-note{{Calling default constructor for 'A'}}
26        // expected-note@-1{{Returning from default constructor for 'A'}}
27     B() // expected-note{{Calling default constructor for 'B'}}
28   {}
29 };
30 
test_note()31 void test_note() {
32   C c; // expected-note{{Calling default constructor for 'C'}}
33 }
34 
35 struct D: B {
Dnote_on_skipped_vbases::D36   D() : A(1), B() {}
37 };
38 
test_prunability()39 void test_prunability() {
40   D d;
41   1 / 0; // expected-warning{{Division by zero}}
42          // expected-note@-1{{Division by zero}}
43 }
44 } // namespace note_on_skipped_vbases
45