xref: /llvm-project/clang/test/Analysis/cxx-uninitialized-object-unionlike-constructs.cpp (revision 85e0ff752ca7aa15b7b429d4dbb62d9592570cc5)
1*85e0ff75SKristof Umann // RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.UninitializedObject \
2*85e0ff75SKristof Umann // RUN:   -analyzer-config optin.cplusplus.UninitializedObject:Pedantic=true -DPEDANTIC \
3*85e0ff75SKristof Umann // RUN:   -analyzer-config optin.cplusplus.UninitializedObject:IgnoreRecordsWithField="[Tt]ag|[Kk]ind" \
4d6145d98SKristof Umann // RUN:   -std=c++11 -verify  %s
5d6145d98SKristof Umann 
6748c139aSKristof Umann // RUN: not %clang_analyze_cc1 -verify %s \
7748c139aSKristof Umann // RUN:   -analyzer-checker=core \
8*85e0ff75SKristof Umann // RUN:   -analyzer-checker=optin.cplusplus.UninitializedObject \
9748c139aSKristof Umann // RUN:   -analyzer-config \
10*85e0ff75SKristof Umann // RUN:     optin.cplusplus.UninitializedObject:IgnoreRecordsWithField="([)]" \
11748c139aSKristof Umann // RUN:   2>&1 | FileCheck %s -check-prefix=CHECK-UNINIT-INVALID-REGEX
12748c139aSKristof Umann 
13748c139aSKristof Umann // CHECK-UNINIT-INVALID-REGEX: (frontend): invalid input for checker option
14*85e0ff75SKristof Umann // CHECK-UNINIT-INVALID-REGEX-SAME: 'optin.cplusplus.UninitializedObject:IgnoreRecordsWithField',
15748c139aSKristof Umann // CHECK-UNINIT-INVALID-REGEX-SAME: that expects a valid regex, building failed
16748c139aSKristof Umann // CHECK-UNINIT-INVALID-REGEX-SAME: with error message "parentheses not
17748c139aSKristof Umann // CHECK-UNINIT-INVALID-REGEX-SAME: balanced"
18748c139aSKristof Umann 
19748c139aSKristof Umann 
20d6145d98SKristof Umann // expected-no-diagnostics
21d6145d98SKristof Umann 
22d6145d98SKristof Umann // Both type and name contains "kind".
23d6145d98SKristof Umann struct UnionLikeStruct1 {
24d6145d98SKristof Umann   enum Kind {
25d6145d98SKristof Umann     volume,
26d6145d98SKristof Umann     area
27d6145d98SKristof Umann   } kind;
28d6145d98SKristof Umann 
29d6145d98SKristof Umann   int Volume;
30d6145d98SKristof Umann   int Area;
31d6145d98SKristof Umann 
UnionLikeStruct1UnionLikeStruct132d6145d98SKristof Umann   UnionLikeStruct1(Kind kind, int Val) : kind(kind) {
33d6145d98SKristof Umann     switch (kind) {
34d6145d98SKristof Umann     case volume:
35d6145d98SKristof Umann       Volume = Val;
36d6145d98SKristof Umann       break;
37d6145d98SKristof Umann     case area:
38d6145d98SKristof Umann       Area = Val;
39d6145d98SKristof Umann       break;
40d6145d98SKristof Umann     }
41d6145d98SKristof Umann   }
42d6145d98SKristof Umann };
43d6145d98SKristof Umann 
fUnionLikeStruct1()44d6145d98SKristof Umann void fUnionLikeStruct1() {
45d6145d98SKristof Umann   UnionLikeStruct1 t(UnionLikeStruct1::volume, 10);
46d6145d98SKristof Umann }
47d6145d98SKristof Umann 
48d6145d98SKristof Umann // Only name contains "kind".
49d6145d98SKristof Umann struct UnionLikeStruct2 {
50d6145d98SKristof Umann   enum Type {
51d6145d98SKristof Umann     volume,
52d6145d98SKristof Umann     area
53d6145d98SKristof Umann   } kind;
54d6145d98SKristof Umann 
55d6145d98SKristof Umann   int Volume;
56d6145d98SKristof Umann   int Area;
57d6145d98SKristof Umann 
UnionLikeStruct2UnionLikeStruct258d6145d98SKristof Umann   UnionLikeStruct2(Type kind, int Val) : kind(kind) {
59d6145d98SKristof Umann     switch (kind) {
60d6145d98SKristof Umann     case volume:
61d6145d98SKristof Umann       Volume = Val;
62d6145d98SKristof Umann       break;
63d6145d98SKristof Umann     case area:
64d6145d98SKristof Umann       Area = Val;
65d6145d98SKristof Umann       break;
66d6145d98SKristof Umann     }
67d6145d98SKristof Umann   }
68d6145d98SKristof Umann };
69d6145d98SKristof Umann 
fUnionLikeStruct2()70d6145d98SKristof Umann void fUnionLikeStruct2() {
71d6145d98SKristof Umann   UnionLikeStruct2 t(UnionLikeStruct2::volume, 10);
72d6145d98SKristof Umann }
73d6145d98SKristof Umann 
74d6145d98SKristof Umann // Only type contains "kind".
75d6145d98SKristof Umann struct UnionLikeStruct3 {
76d6145d98SKristof Umann   enum Kind {
77d6145d98SKristof Umann     volume,
78d6145d98SKristof Umann     area
79d6145d98SKristof Umann   } type;
80d6145d98SKristof Umann 
81d6145d98SKristof Umann   int Volume;
82d6145d98SKristof Umann   int Area;
83d6145d98SKristof Umann 
UnionLikeStruct3UnionLikeStruct384d6145d98SKristof Umann   UnionLikeStruct3(Kind type, int Val) : type(type) {
85d6145d98SKristof Umann     switch (type) {
86d6145d98SKristof Umann     case volume:
87d6145d98SKristof Umann       Volume = Val;
88d6145d98SKristof Umann       break;
89d6145d98SKristof Umann     case area:
90d6145d98SKristof Umann       Area = Val;
91d6145d98SKristof Umann       break;
92d6145d98SKristof Umann     }
93d6145d98SKristof Umann   }
94d6145d98SKristof Umann };
95d6145d98SKristof Umann 
fUnionLikeStruct3()96d6145d98SKristof Umann void fUnionLikeStruct3() {
97d6145d98SKristof Umann   UnionLikeStruct3 t(UnionLikeStruct3::volume, 10);
98d6145d98SKristof Umann }
99d6145d98SKristof Umann 
100d6145d98SKristof Umann // Only type contains "tag".
101d6145d98SKristof Umann struct UnionLikeStruct4 {
102d6145d98SKristof Umann   enum Tag {
103d6145d98SKristof Umann     volume,
104d6145d98SKristof Umann     area
105d6145d98SKristof Umann   } type;
106d6145d98SKristof Umann 
107d6145d98SKristof Umann   int Volume;
108d6145d98SKristof Umann   int Area;
109d6145d98SKristof Umann 
UnionLikeStruct4UnionLikeStruct4110d6145d98SKristof Umann   UnionLikeStruct4(Tag type, int Val) : type(type) {
111d6145d98SKristof Umann     switch (type) {
112d6145d98SKristof Umann     case volume:
113d6145d98SKristof Umann       Volume = Val;
114d6145d98SKristof Umann       break;
115d6145d98SKristof Umann     case area:
116d6145d98SKristof Umann       Area = Val;
117d6145d98SKristof Umann       break;
118d6145d98SKristof Umann     }
119d6145d98SKristof Umann   }
120d6145d98SKristof Umann };
121d6145d98SKristof Umann 
fUnionLikeStruct4()122d6145d98SKristof Umann void fUnionLikeStruct4() {
123d6145d98SKristof Umann   UnionLikeStruct4 t(UnionLikeStruct4::volume, 10);
124d6145d98SKristof Umann }
125d6145d98SKristof Umann 
126d6145d98SKristof Umann // Both name and type name contains but does not equal to tag/kind.
127d6145d98SKristof Umann struct UnionLikeStruct5 {
128d6145d98SKristof Umann   enum WhateverTagBlahBlah {
129d6145d98SKristof Umann     volume,
130d6145d98SKristof Umann     area
131d6145d98SKristof Umann   } FunnyKindName;
132d6145d98SKristof Umann 
133d6145d98SKristof Umann   int Volume;
134d6145d98SKristof Umann   int Area;
135d6145d98SKristof Umann 
UnionLikeStruct5UnionLikeStruct5136d6145d98SKristof Umann   UnionLikeStruct5(WhateverTagBlahBlah type, int Val) : FunnyKindName(type) {
137d6145d98SKristof Umann     switch (FunnyKindName) {
138d6145d98SKristof Umann     case volume:
139d6145d98SKristof Umann       Volume = Val;
140d6145d98SKristof Umann       break;
141d6145d98SKristof Umann     case area:
142d6145d98SKristof Umann       Area = Val;
143d6145d98SKristof Umann       break;
144d6145d98SKristof Umann     }
145d6145d98SKristof Umann   }
146d6145d98SKristof Umann };
147d6145d98SKristof Umann 
fUnionLikeStruct5()148d6145d98SKristof Umann void fUnionLikeStruct5() {
149d6145d98SKristof Umann   UnionLikeStruct5 t(UnionLikeStruct5::volume, 10);
150d6145d98SKristof Umann }
151