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 Dergachevvoid 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 Dergachevvoid 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