diff options
Diffstat (limited to 'clang/test/Analysis/diagnostics/initializer.cpp')
| -rw-r--r-- | clang/test/Analysis/diagnostics/initializer.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/clang/test/Analysis/diagnostics/initializer.cpp b/clang/test/Analysis/diagnostics/initializer.cpp new file mode 100644 index 00000000000..db744efd8cf --- /dev/null +++ b/clang/test/Analysis/diagnostics/initializer.cpp @@ -0,0 +1,44 @@ +// 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 |

