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 | // RUN: not %clang_analyze_cc1 -verify %s \ |
7 | // RUN: -analyzer-checker=core \ |
8 | // RUN: -analyzer-checker=alpha.cplusplus.UninitializedObject \ |
9 | // RUN: -analyzer-config \ |
10 | // RUN: alpha.cplusplus.UninitializedObject:IgnoreRecordsWithField="([)]" \ |
11 | // RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-UNINIT-INVALID-REGEX |
12 | |
13 | // CHECK-UNINIT-INVALID-REGEX: (frontend): invalid input for checker option |
14 | // CHECK-UNINIT-INVALID-REGEX-SAME: 'alpha.cplusplus.UninitializedObject:IgnoreRecordsWithField', |
15 | // CHECK-UNINIT-INVALID-REGEX-SAME: that expects a valid regex, building failed |
16 | // CHECK-UNINIT-INVALID-REGEX-SAME: with error message "parentheses not |
17 | // CHECK-UNINIT-INVALID-REGEX-SAME: balanced" |
18 | |
19 | |
20 | // expected-no-diagnostics |
21 | |
22 | // Both type and name contains "kind". |
23 | struct UnionLikeStruct1 { |
24 | enum Kind { |
25 | volume, |
26 | area |
27 | } kind; |
28 | |
29 | int Volume; |
30 | int Area; |
31 | |
32 | UnionLikeStruct1(Kind kind, int Val) : kind(kind) { |
33 | switch (kind) { |
34 | case volume: |
35 | Volume = Val; |
36 | break; |
37 | case area: |
38 | Area = Val; |
39 | break; |
40 | } |
41 | } |
42 | }; |
43 | |
44 | void fUnionLikeStruct1() { |
45 | UnionLikeStruct1 t(UnionLikeStruct1::volume, 10); |
46 | } |
47 | |
48 | // Only name contains "kind". |
49 | struct UnionLikeStruct2 { |
50 | enum Type { |
51 | volume, |
52 | area |
53 | } kind; |
54 | |
55 | int Volume; |
56 | int Area; |
57 | |
58 | UnionLikeStruct2(Type kind, int Val) : kind(kind) { |
59 | switch (kind) { |
60 | case volume: |
61 | Volume = Val; |
62 | break; |
63 | case area: |
64 | Area = Val; |
65 | break; |
66 | } |
67 | } |
68 | }; |
69 | |
70 | void fUnionLikeStruct2() { |
71 | UnionLikeStruct2 t(UnionLikeStruct2::volume, 10); |
72 | } |
73 | |
74 | // Only type contains "kind". |
75 | struct UnionLikeStruct3 { |
76 | enum Kind { |
77 | volume, |
78 | area |
79 | } type; |
80 | |
81 | int Volume; |
82 | int Area; |
83 | |
84 | UnionLikeStruct3(Kind type, int Val) : type(type) { |
85 | switch (type) { |
86 | case volume: |
87 | Volume = Val; |
88 | break; |
89 | case area: |
90 | Area = Val; |
91 | break; |
92 | } |
93 | } |
94 | }; |
95 | |
96 | void fUnionLikeStruct3() { |
97 | UnionLikeStruct3 t(UnionLikeStruct3::volume, 10); |
98 | } |
99 | |
100 | // Only type contains "tag". |
101 | struct UnionLikeStruct4 { |
102 | enum Tag { |
103 | volume, |
104 | area |
105 | } type; |
106 | |
107 | int Volume; |
108 | int Area; |
109 | |
110 | UnionLikeStruct4(Tag type, int Val) : type(type) { |
111 | switch (type) { |
112 | case volume: |
113 | Volume = Val; |
114 | break; |
115 | case area: |
116 | Area = Val; |
117 | break; |
118 | } |
119 | } |
120 | }; |
121 | |
122 | void fUnionLikeStruct4() { |
123 | UnionLikeStruct4 t(UnionLikeStruct4::volume, 10); |
124 | } |
125 | |
126 | // Both name and type name contains but does not equal to tag/kind. |
127 | struct UnionLikeStruct5 { |
128 | enum WhateverTagBlahBlah { |
129 | volume, |
130 | area |
131 | } FunnyKindName; |
132 | |
133 | int Volume; |
134 | int Area; |
135 | |
136 | UnionLikeStruct5(WhateverTagBlahBlah type, int Val) : FunnyKindName(type) { |
137 | switch (FunnyKindName) { |
138 | case volume: |
139 | Volume = Val; |
140 | break; |
141 | case area: |
142 | Area = Val; |
143 | break; |
144 | } |
145 | } |
146 | }; |
147 | |
148 | void fUnionLikeStruct5() { |
149 | UnionLikeStruct5 t(UnionLikeStruct5::volume, 10); |
150 | } |
151 | |