xref: /llvm-project/clang/test/Analysis/cxx-inherited-ctor-init-expr.cpp (revision 59a960b83c2d1559f31e1dd75728dd24fae2f68c)
1a82ffe9dSArtem Dergachev // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify %s
2a82ffe9dSArtem Dergachev 
3a82ffe9dSArtem Dergachev void clang_analyzer_eval(bool);
4a82ffe9dSArtem Dergachev 
5a82ffe9dSArtem Dergachev namespace basic_tests {
6a82ffe9dSArtem Dergachev struct A {
7a82ffe9dSArtem Dergachev   int x;
Abasic_tests::A8a82ffe9dSArtem Dergachev   A(int x): x(x) {}
9a82ffe9dSArtem Dergachev };
10a82ffe9dSArtem Dergachev 
11a82ffe9dSArtem Dergachev struct B : A {
12a82ffe9dSArtem Dergachev   using A::A;
13a82ffe9dSArtem Dergachev };
14a82ffe9dSArtem Dergachev 
15a82ffe9dSArtem Dergachev struct C : B {
16a82ffe9dSArtem Dergachev   using B::B;
17a82ffe9dSArtem Dergachev };
18a82ffe9dSArtem Dergachev 
test_B()19a82ffe9dSArtem Dergachev void test_B() {
20a82ffe9dSArtem Dergachev   B b(1);
21a82ffe9dSArtem Dergachev   clang_analyzer_eval(b.x == 1); // expected-warning{{TRUE}}
22a82ffe9dSArtem Dergachev }
23a82ffe9dSArtem Dergachev 
test_C()24a82ffe9dSArtem Dergachev void test_C() {
25a82ffe9dSArtem Dergachev   C c(2);
26a82ffe9dSArtem Dergachev   clang_analyzer_eval(c.x == 2); // expected-warning{{TRUE}}
27a82ffe9dSArtem Dergachev }
28a82ffe9dSArtem Dergachev } // namespace basic_tests
29a82ffe9dSArtem Dergachev 
30a82ffe9dSArtem Dergachev namespace arguments_with_constructors {
31a82ffe9dSArtem Dergachev struct S {
32a82ffe9dSArtem Dergachev   int x, y;
Sarguments_with_constructors::S33a82ffe9dSArtem Dergachev   S(int x, int y): x(x), y(y) {}
~Sarguments_with_constructors::S34a82ffe9dSArtem Dergachev   ~S() {}
35a82ffe9dSArtem Dergachev };
36a82ffe9dSArtem Dergachev 
37a82ffe9dSArtem Dergachev struct A {
38a82ffe9dSArtem Dergachev   S s;
39a82ffe9dSArtem Dergachev   int z;
Aarguments_with_constructors::A40a82ffe9dSArtem Dergachev   A(S s, int z) : s(s), z(z) {}
41a82ffe9dSArtem Dergachev };
42a82ffe9dSArtem Dergachev 
43a82ffe9dSArtem Dergachev struct B : A {
44a82ffe9dSArtem Dergachev   using A::A;
45a82ffe9dSArtem Dergachev };
46a82ffe9dSArtem Dergachev 
test_B()47a82ffe9dSArtem Dergachev void test_B() {
48a82ffe9dSArtem Dergachev   B b(S(1, 2), 3);
49a82ffe9dSArtem Dergachev   // FIXME: There should be no execution path on which this is false.
50a82ffe9dSArtem Dergachev   clang_analyzer_eval(b.s.x == 1); // expected-warning{{TRUE}}
51a82ffe9dSArtem Dergachev                                    // expected-warning@-1{{FALSE}}
52a82ffe9dSArtem Dergachev 
53a82ffe9dSArtem Dergachev   // FIXME: There should be no execution path on which this is false.
54a82ffe9dSArtem Dergachev   clang_analyzer_eval(b.s.y == 2); // expected-warning{{TRUE}}
55a82ffe9dSArtem Dergachev                                    // expected-warning@-1{{FALSE}}
56a82ffe9dSArtem Dergachev 
57a82ffe9dSArtem Dergachev   clang_analyzer_eval(b.z == 3); // expected-warning{{TRUE}}
58a82ffe9dSArtem Dergachev }
59a82ffe9dSArtem Dergachev } // namespace arguments_with_constructors
60*59a960b8SGabor Marton 
61*59a960b8SGabor Marton namespace inherited_constructor_crash {
62*59a960b8SGabor Marton class a {
63*59a960b8SGabor Marton public:
64*59a960b8SGabor Marton   a(int);
65*59a960b8SGabor Marton };
66*59a960b8SGabor Marton struct b : a {
67*59a960b8SGabor Marton   using a::a; // Ihnerited ctor.
68*59a960b8SGabor Marton };
c()69*59a960b8SGabor Marton void c() {
70*59a960b8SGabor Marton   int d;
71*59a960b8SGabor Marton   // This construct expr utilizes the inherited ctor.
72*59a960b8SGabor Marton   // Note that d must be uninitialized to cause the crash.
73*59a960b8SGabor Marton   (b(d)); // expected-warning{{1st function call argument is an uninitialized value}}
74*59a960b8SGabor Marton }
75*59a960b8SGabor Marton } // namespace inherited_constructor_crash
76