Clang Project

clang_source_code/test/Analysis/cxx-uninitialized-object-unionlike-constructs.cpp
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".
23struct 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
44void fUnionLikeStruct1() {
45  UnionLikeStruct1 t(UnionLikeStruct1::volume, 10);
46}
47
48// Only name contains "kind".
49struct 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
70void fUnionLikeStruct2() {
71  UnionLikeStruct2 t(UnionLikeStruct2::volume, 10);
72}
73
74// Only type contains "kind".
75struct 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
96void fUnionLikeStruct3() {
97  UnionLikeStruct3 t(UnionLikeStruct3::volume, 10);
98}
99
100// Only type contains "tag".
101struct 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
122void fUnionLikeStruct4() {
123  UnionLikeStruct4 t(UnionLikeStruct4::volume, 10);
124}
125
126// Both name and type name contains but does not equal to tag/kind.
127struct 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
148void fUnionLikeStruct5() {
149  UnionLikeStruct5 t(UnionLikeStruct5::volume, 10);
150}
151