1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.cplusplus.UninitializedObject -analyzer-config alpha.cplusplus.UninitializedObject:Pedantic=true -std=c++11 -verify %s
3 //===----------------------------------------------------------------------===//
4 // Non-polymorphic inheritance tests
5 //===----------------------------------------------------------------------===//
7 class NonPolymorphicLeft1 {
14 NonPolymorphicLeft1() = default;
15 NonPolymorphicLeft1(int) : x(1) {}
18 class NonPolymorphicInheritanceTest1 : public NonPolymorphicLeft1 {
22 NonPolymorphicInheritanceTest1()
23 : NonPolymorphicLeft1(int{}) {
30 void fNonPolymorphicInheritanceTest1() {
31 NonPolymorphicInheritanceTest1();
34 class NonPolymorphicBaseClass2 {
35 int x; // expected-note{{uninitialized field 'this->x'}}
40 NonPolymorphicBaseClass2() = default;
41 NonPolymorphicBaseClass2(int) : x(4) {}
44 class NonPolymorphicInheritanceTest2 : public NonPolymorphicBaseClass2 {
48 NonPolymorphicInheritanceTest2() {
50 z = 6; // expected-warning{{1 uninitialized field}}
54 void fNonPolymorphicInheritanceTest2() {
55 NonPolymorphicInheritanceTest2();
58 class NonPolymorphicBaseClass3 {
62 int y; // expected-note{{uninitialized field 'this->y'}}
64 NonPolymorphicBaseClass3() = default;
65 NonPolymorphicBaseClass3(int) : x(7) {}
68 class NonPolymorphicInheritanceTest3 : public NonPolymorphicBaseClass3 {
72 NonPolymorphicInheritanceTest3()
73 : NonPolymorphicBaseClass3(int{}) {
74 z = 8; // expected-warning{{1 uninitialized field}}
78 void fNonPolymorphicInheritanceTest3() {
79 NonPolymorphicInheritanceTest3();
82 class NonPolymorphicBaseClass4 {
89 NonPolymorphicBaseClass4() = default;
90 NonPolymorphicBaseClass4(int) : x(9) {}
93 class NonPolymorphicInheritanceTest4 : public NonPolymorphicBaseClass4 {
94 int z; // expected-note{{uninitialized field 'this->z'}}
97 NonPolymorphicInheritanceTest4()
98 : NonPolymorphicBaseClass4(int{}) {
99 y = 10; // expected-warning{{1 uninitialized field}}
103 void fNonPolymorphicInheritanceTest4() {
104 NonPolymorphicInheritanceTest4();
107 //===----------------------------------------------------------------------===//
108 // Polymorphic inheritance tests
109 //===----------------------------------------------------------------------===//
111 class PolymorphicLeft1 {
118 virtual ~PolymorphicLeft1() = default;
119 PolymorphicLeft1() = default;
120 PolymorphicLeft1(int) : x(11) {}
123 class PolymorphicInheritanceTest1 : public PolymorphicLeft1 {
127 PolymorphicInheritanceTest1()
128 : PolymorphicLeft1(int{}) {
135 void fPolymorphicInheritanceTest1() {
136 PolymorphicInheritanceTest1();
139 class PolymorphicRight1 {
140 int x; // expected-note{{uninitialized field 'this->x'}}
145 virtual ~PolymorphicRight1() = default;
146 PolymorphicRight1() = default;
147 PolymorphicRight1(int) : x(14) {}
150 class PolymorphicInheritanceTest2 : public PolymorphicRight1 {
154 PolymorphicInheritanceTest2() {
156 z = 16; // expected-warning{{1 uninitialized field}}
160 void fPolymorphicInheritanceTest2() {
161 PolymorphicInheritanceTest2();
164 class PolymorphicBaseClass3 {
168 int y; // expected-note{{uninitialized field 'this->y'}}
170 virtual ~PolymorphicBaseClass3() = default;
171 PolymorphicBaseClass3() = default;
172 PolymorphicBaseClass3(int) : x(17) {}
175 class PolymorphicInheritanceTest3 : public PolymorphicBaseClass3 {
179 PolymorphicInheritanceTest3()
180 : PolymorphicBaseClass3(int{}) {
181 z = 18; // expected-warning{{1 uninitialized field}}
185 void fPolymorphicInheritanceTest3() {
186 PolymorphicInheritanceTest3();
189 class PolymorphicBaseClass4 {
196 virtual ~PolymorphicBaseClass4() = default;
197 PolymorphicBaseClass4() = default;
198 PolymorphicBaseClass4(int) : x(19) {}
201 class PolymorphicInheritanceTest4 : public PolymorphicBaseClass4 {
202 int z; // expected-note{{uninitialized field 'this->z'}}
205 PolymorphicInheritanceTest4()
206 : PolymorphicBaseClass4(int{}) {
207 y = 20; // expected-warning{{1 uninitialized field}}
211 void fPolymorphicInheritanceTest4() {
212 PolymorphicInheritanceTest4();
215 //===----------------------------------------------------------------------===//
216 // Virtual inheritance tests
217 //===----------------------------------------------------------------------===//
219 class VirtualPolymorphicLeft1 {
226 virtual ~VirtualPolymorphicLeft1() = default;
227 VirtualPolymorphicLeft1() = default;
228 VirtualPolymorphicLeft1(int) : x(21) {}
231 class VirtualInheritanceTest1 : virtual public VirtualPolymorphicLeft1 {
235 VirtualInheritanceTest1()
236 : VirtualPolymorphicLeft1(int()) {
243 void fVirtualInheritanceTest1() {
244 VirtualInheritanceTest1();
247 class VirtualPolymorphicRight1 {
248 int x; // expected-note{{uninitialized field 'this->x'}}
253 virtual ~VirtualPolymorphicRight1() = default;
254 VirtualPolymorphicRight1() = default;
255 VirtualPolymorphicRight1(int) : x(24) {}
258 class VirtualInheritanceTest2 : virtual public VirtualPolymorphicRight1 {
262 VirtualInheritanceTest2() {
264 z = 26; // expected-warning{{1 uninitialized field}}
268 void fVirtualInheritanceTest2() {
269 VirtualInheritanceTest2();
272 class VirtualPolymorphicBaseClass3 {
276 int y; // expected-note{{uninitialized field 'this->y'}}
278 virtual ~VirtualPolymorphicBaseClass3() = default;
279 VirtualPolymorphicBaseClass3() = default;
280 VirtualPolymorphicBaseClass3(int) : x(27) {}
283 class VirtualInheritanceTest3 : virtual public VirtualPolymorphicBaseClass3 {
287 VirtualInheritanceTest3()
288 : VirtualPolymorphicBaseClass3(int{}) {
289 z = 28; // expected-warning{{1 uninitialized field}}
293 void fVirtualInheritanceTest3() {
294 VirtualInheritanceTest3();
297 //===----------------------------------------------------------------------===//
298 // Multiple inheritance tests
299 //===----------------------------------------------------------------------===//
306 MultipleInheritanceTest
312 Left1(int) : x(29) {}
317 Right1(int) : y(30) {}
320 class MultipleInheritanceTest1 : public Left1, public Right1 {
324 MultipleInheritanceTest1()
331 MultipleInheritanceTest1(int)
338 MultipleInheritanceTest1(int, int)
346 void fMultipleInheritanceTest1() {
347 MultipleInheritanceTest1();
348 MultipleInheritanceTest1(int());
349 MultipleInheritanceTest1(int(), int());
355 Left2(int) : x(36) {}
358 int y; // expected-note{{uninitialized field 'this->y'}}
360 Right2(int) : y(37) {}
363 class MultipleInheritanceTest2 : public Left2, public Right2 {
367 MultipleInheritanceTest2()
369 z = 38; // expected-warning{{1 uninitialized field}}
373 void fMultipleInheritanceTest2() {
374 MultipleInheritanceTest2();
378 int x; // expected-note{{uninitialized field 'this->x'}}
380 Left3(int) : x(39) {}
385 Right3(int) : y(40) {}
388 class MultipleInheritanceTest3 : public Left3, public Right3 {
392 MultipleInheritanceTest3()
394 z = 41; // expected-warning{{1 uninitialized field}}
398 void fMultipleInheritanceTest3() {
399 MultipleInheritanceTest3();
405 Left4(int) : x(42) {}
410 Right4(int) : y(43) {}
413 class MultipleInheritanceTest4 : public Left4, public Right4 {
414 int z; // expected-note{{uninitialized field 'this->z'}}
417 MultipleInheritanceTest4()
419 Right4(char{}) { // expected-warning{{1 uninitialized field}}
423 void fMultipleInheritanceTest4() {
424 MultipleInheritanceTest4();
430 Left5(int) : x(44) {}
433 int y; // expected-note{{uninitialized field 'this->y'}}
435 Right5(int) : y(45) {}
438 class MultipleInheritanceTest5 : public Left5, public Right5 {
439 int z; // expected-note{{uninitialized field 'this->z'}}
442 MultipleInheritanceTest5() // expected-warning{{2 uninitialized fields}}
447 void fMultipleInheritanceTest5() {
448 MultipleInheritanceTest5();
451 //===----------------------------------------------------------------------===//
452 // Non-virtual diamond inheritance tests
453 //===----------------------------------------------------------------------===//
456 NonVirtualBase NonVirtualBase
464 NonVirtualDiamondInheritanceTest
467 struct NonVirtualBase1 {
469 NonVirtualBase1() = default;
470 NonVirtualBase1(int) : x(46) {}
472 struct First1 : public NonVirtualBase1 {
474 First1(int) : NonVirtualBase1(int{}) {}
476 struct Second1 : public NonVirtualBase1 {
478 Second1(int) : NonVirtualBase1(int{}) {}
481 class NonVirtualDiamondInheritanceTest1 : public First1, public Second1 {
485 NonVirtualDiamondInheritanceTest1()
492 NonVirtualDiamondInheritanceTest1(int)
499 NonVirtualDiamondInheritanceTest1(int, int)
507 void fNonVirtualDiamondInheritanceTest1() {
508 NonVirtualDiamondInheritanceTest1();
509 NonVirtualDiamondInheritanceTest1(int());
510 NonVirtualDiamondInheritanceTest1(int(), int());
513 struct NonVirtualBase2 {
514 int x; // expected-note{{uninitialized field 'this->x'}}
515 NonVirtualBase2() = default;
516 NonVirtualBase2(int) : x(52) {}
518 struct First2 : public NonVirtualBase2 {
520 First2(int) : NonVirtualBase2(int{}) {}
522 struct Second2 : public NonVirtualBase2 {
524 Second2(int) : NonVirtualBase2(int{}) {}
527 class NonVirtualDiamondInheritanceTest2 : public First2, public Second2 {
531 NonVirtualDiamondInheritanceTest2()
533 z = 53; // expected-warning{{1 uninitialized field}}
537 void fNonVirtualDiamondInheritanceTest2() {
538 NonVirtualDiamondInheritanceTest2();
541 struct NonVirtualBase3 {
542 int x; // expected-note{{uninitialized field 'this->x'}}
543 NonVirtualBase3() = default;
544 NonVirtualBase3(int) : x(54) {}
546 struct First3 : public NonVirtualBase3 {
548 First3(int) : NonVirtualBase3(int{}) {}
550 struct Second3 : public NonVirtualBase3 {
552 Second3(int) : NonVirtualBase3(int{}) {}
555 class NonVirtualDiamondInheritanceTest3 : public First3, public Second3 {
559 NonVirtualDiamondInheritanceTest3()
561 z = 55; // expected-warning{{1 uninitialized field}}
565 void fNonVirtualDiamondInheritanceTest3() {
566 NonVirtualDiamondInheritanceTest3();
569 struct NonVirtualBase4 {
570 int x; // expected-note{{uninitialized field 'this->x'}}
571 // expected-note@-1{{uninitialized field 'this->x'}}
572 NonVirtualBase4() = default;
573 NonVirtualBase4(int) : x(56) {}
575 struct First4 : public NonVirtualBase4 {
577 First4(int) : NonVirtualBase4(int{}) {}
579 struct Second4 : public NonVirtualBase4 {
581 Second4(int) : NonVirtualBase4(int{}) {}
584 class NonVirtualDiamondInheritanceTest4 : public First4, public Second4 {
588 NonVirtualDiamondInheritanceTest4() {
589 z = 57; // expected-warning{{2 uninitialized fields}}
593 void fNonVirtualDiamondInheritanceTest4() {
594 NonVirtualDiamondInheritanceTest4();
597 struct NonVirtualBase5 {
599 NonVirtualBase5() = default;
600 NonVirtualBase5(int) : x(58) {}
602 struct First5 : public NonVirtualBase5 {
604 First5(int) : NonVirtualBase5(int{}) {}
606 struct Second5 : public NonVirtualBase5 {
608 Second5(int) : NonVirtualBase5(int{}) {}
611 class NonVirtualDiamondInheritanceTest5 : public First5, public Second5 {
612 int z; // expected-note{{uninitialized field 'this->z'}}
615 NonVirtualDiamondInheritanceTest5()
617 Second5(int{}) { // expected-warning{{1 uninitialized field}}
621 void fNonVirtualDiamondInheritanceTest5() {
622 NonVirtualDiamondInheritanceTest5();
625 struct NonVirtualBase6 {
626 int x; // expected-note{{uninitialized field 'this->x'}}
627 NonVirtualBase6() = default;
628 NonVirtualBase6(int) : x(59) {}
630 struct First6 : public NonVirtualBase6 {
632 First6(int) : NonVirtualBase6(int{}) {}
634 struct Second6 : public NonVirtualBase6 {
636 Second6(int) : NonVirtualBase6(int{}) {}
639 class NonVirtualDiamondInheritanceTest6 : public First6, public Second6 {
640 int z; // expected-note{{uninitialized field 'this->z'}}
643 NonVirtualDiamondInheritanceTest6() // expected-warning{{2 uninitialized fields}}
645 // 'z' and 'Second::x' unintialized
649 void fNonVirtualDiamondInheritanceTest6() {
650 NonVirtualDiamondInheritanceTest6();
653 //===----------------------------------------------------------------------===//
654 // Virtual diamond inheritance tests
655 //===----------------------------------------------------------------------===//
662 VirtualFirst VirtualSecond
666 VirtualDiamondInheritanceTest
669 struct VirtualBase1 {
671 VirtualBase1() = default;
672 VirtualBase1(int) : x(60) {}
674 struct VirtualFirst1 : virtual public VirtualBase1 {
675 VirtualFirst1() = default;
676 VirtualFirst1(int) : VirtualBase1(int{}) {}
677 VirtualFirst1(int, int) { x = 61; }
679 struct VirtualSecond1 : virtual public VirtualBase1 {
680 VirtualSecond1() = default;
681 VirtualSecond1(int) : VirtualBase1(int{}) {}
682 VirtualSecond1(int, int) { x = 62; }
685 class VirtualDiamondInheritanceTest1 : public VirtualFirst1, public VirtualSecond1 {
688 VirtualDiamondInheritanceTest1() {
693 VirtualDiamondInheritanceTest1(int)
694 : VirtualFirst1(int{}, int{}),
695 VirtualSecond1(int{}, int{}) {
699 VirtualDiamondInheritanceTest1(int, int)
700 : VirtualFirst1(int{}, int{}) {
705 void fVirtualDiamondInheritanceTest1() {
706 VirtualDiamondInheritanceTest1();
707 VirtualDiamondInheritanceTest1(int());
708 VirtualDiamondInheritanceTest1(int(), int());
711 struct VirtualBase2 {
712 int x; // expected-note{{uninitialized field 'this->x'}}
713 VirtualBase2() = default;
714 VirtualBase2(int) : x(63) {}
716 struct VirtualFirst2 : virtual public VirtualBase2 {
717 VirtualFirst2() = default;
718 VirtualFirst2(int) : VirtualBase2(int{}) {}
719 VirtualFirst2(int, int) { x = 64; }
721 struct VirtualSecond2 : virtual public VirtualBase2 {
722 VirtualSecond2() = default;
723 VirtualSecond2(int) : VirtualBase2(int{}) {}
724 VirtualSecond2(int, int) { x = 65; }
727 class VirtualDiamondInheritanceTest2 : public VirtualFirst2, public VirtualSecond2 {
730 VirtualDiamondInheritanceTest2() // expected-warning{{1 uninitialized field}}
731 : VirtualFirst2(int{}) {
732 // From the N4659 C++ Standard Working Draft:
735 // [...] A 'mem-initializer' where the 'mem-initializer-id' denotes a
736 // virtual base class is ignored during execution of a constructor of any
737 // class that is not the most derived class.
739 // This means that Left1::x will not be initialized, because in both
740 // VirtualFirst::VirtualFirst(int) and VirtualSecond::VirtualSecond(int)
741 // the constructor delegation to Left1::Left1(int) will be
746 void fVirtualDiamondInheritanceTest2() {
747 VirtualDiamondInheritanceTest2();
750 struct VirtualBase3 {
751 int x; // expected-note{{uninitialized field 'this->x'}}
752 VirtualBase3() = default;
753 VirtualBase3(int) : x(66) {}
755 struct VirtualFirst3 : virtual public VirtualBase3 {
756 VirtualFirst3() = default;
757 VirtualFirst3(int) : VirtualBase3(int{}) {}
758 VirtualFirst3(int, int) { x = 67; }
760 struct VirtualSecond3 : virtual public VirtualBase3 {
761 VirtualSecond3() = default;
762 VirtualSecond3(int) : VirtualBase3(int{}) {}
763 VirtualSecond3(int, int) { x = 68; }
766 class VirtualDiamondInheritanceTest3 : public VirtualFirst3, public VirtualSecond3 {
769 VirtualDiamondInheritanceTest3() // expected-warning{{1 uninitialized field}}
770 : VirtualFirst3(int{}) {}
773 void fVirtualDiamondInheritanceTest3() {
774 VirtualDiamondInheritanceTest3();