teak-llvm/clang/test/Analysis/diagnostics/initializer.cpp
Artem Dergachev ef0aab3138 [analyzer] Add a prunable note for skipping vbase inits in subclasses.
When initialization of virtual base classes is skipped, we now tell the user
about it, because this aspect of C++ isn't very well-known.

The implementation is based on the new "note tags" feature (r358781).
In order to make use of it, allow note tags to produce prunable notes,
and move the note tag factory to CoreEngine.

Differential Revision: https://reviews.llvm.org/D61817

llvm-svn: 361682
2019-05-24 23:37:11 +00:00

45 lines
1.3 KiB
C++

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