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