1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.cplusplus.UninitializedObject \
2 // RUN: -analyzer-config alpha.cplusplus.UninitializedObject:Pedantic=true -DPEDANTIC \
3 // RUN: -analyzer-config alpha.cplusplus.UninitializedObject:IgnoreRecordsWithField="[Tt]ag|[Kk]ind" \
4 // RUN: -std=c++11 -verify %s
5
6 // expected-no-diagnostics
7
8 // Both type and name contains "kind".
9 struct UnionLikeStruct1 {
10 enum Kind {
11 volume,
12 area
13 } kind;
14
15 int Volume;
16 int Area;
17
UnionLikeStruct1UnionLikeStruct118 UnionLikeStruct1(Kind kind, int Val) : kind(kind) {
19 switch (kind) {
20 case volume:
21 Volume = Val;
22 break;
23 case area:
24 Area = Val;
25 break;
26 }
27 }
28 };
29
fUnionLikeStruct1()30 void fUnionLikeStruct1() {
31 UnionLikeStruct1 t(UnionLikeStruct1::volume, 10);
32 }
33
34 // Only name contains "kind".
35 struct UnionLikeStruct2 {
36 enum Type {
37 volume,
38 area
39 } kind;
40
41 int Volume;
42 int Area;
43
UnionLikeStruct2UnionLikeStruct244 UnionLikeStruct2(Type kind, int Val) : kind(kind) {
45 switch (kind) {
46 case volume:
47 Volume = Val;
48 break;
49 case area:
50 Area = Val;
51 break;
52 }
53 }
54 };
55
fUnionLikeStruct2()56 void fUnionLikeStruct2() {
57 UnionLikeStruct2 t(UnionLikeStruct2::volume, 10);
58 }
59
60 // Only type contains "kind".
61 struct UnionLikeStruct3 {
62 enum Kind {
63 volume,
64 area
65 } type;
66
67 int Volume;
68 int Area;
69
UnionLikeStruct3UnionLikeStruct370 UnionLikeStruct3(Kind type, int Val) : type(type) {
71 switch (type) {
72 case volume:
73 Volume = Val;
74 break;
75 case area:
76 Area = Val;
77 break;
78 }
79 }
80 };
81
fUnionLikeStruct3()82 void fUnionLikeStruct3() {
83 UnionLikeStruct3 t(UnionLikeStruct3::volume, 10);
84 }
85
86 // Only type contains "tag".
87 struct UnionLikeStruct4 {
88 enum Tag {
89 volume,
90 area
91 } type;
92
93 int Volume;
94 int Area;
95
UnionLikeStruct4UnionLikeStruct496 UnionLikeStruct4(Tag type, int Val) : type(type) {
97 switch (type) {
98 case volume:
99 Volume = Val;
100 break;
101 case area:
102 Area = Val;
103 break;
104 }
105 }
106 };
107
fUnionLikeStruct4()108 void fUnionLikeStruct4() {
109 UnionLikeStruct4 t(UnionLikeStruct4::volume, 10);
110 }
111
112 // Both name and type name contains but does not equal to tag/kind.
113 struct UnionLikeStruct5 {
114 enum WhateverTagBlahBlah {
115 volume,
116 area
117 } FunnyKindName;
118
119 int Volume;
120 int Area;
121
UnionLikeStruct5UnionLikeStruct5122 UnionLikeStruct5(WhateverTagBlahBlah type, int Val) : FunnyKindName(type) {
123 switch (FunnyKindName) {
124 case volume:
125 Volume = Val;
126 break;
127 case area:
128 Area = Val;
129 break;
130 }
131 }
132 };
133
fUnionLikeStruct5()134 void fUnionLikeStruct5() {
135 UnionLikeStruct5 t(UnionLikeStruct5::volume, 10);
136 }
137