summaryrefslogtreecommitdiff
path: root/test/Analysis/cxx-uninitialized-object-unionlike-constructs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/Analysis/cxx-uninitialized-object-unionlike-constructs.cpp')
-rw-r--r--test/Analysis/cxx-uninitialized-object-unionlike-constructs.cpp136
1 files changed, 136 insertions, 0 deletions
diff --git a/test/Analysis/cxx-uninitialized-object-unionlike-constructs.cpp b/test/Analysis/cxx-uninitialized-object-unionlike-constructs.cpp
new file mode 100644
index 0000000000000..dc52afd901950
--- /dev/null
+++ b/test/Analysis/cxx-uninitialized-object-unionlike-constructs.cpp
@@ -0,0 +1,136 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.cplusplus.UninitializedObject \
+// RUN: -analyzer-config alpha.cplusplus.UninitializedObject:Pedantic=true -DPEDANTIC \
+// RUN: -analyzer-config alpha.cplusplus.UninitializedObject:IgnoreRecordsWithField="[Tt]ag|[Kk]ind" \
+// RUN: -std=c++11 -verify %s
+
+// expected-no-diagnostics
+
+// Both type and name contains "kind".
+struct UnionLikeStruct1 {
+ enum Kind {
+ volume,
+ area
+ } kind;
+
+ int Volume;
+ int Area;
+
+ UnionLikeStruct1(Kind kind, int Val) : kind(kind) {
+ switch (kind) {
+ case volume:
+ Volume = Val;
+ break;
+ case area:
+ Area = Val;
+ break;
+ }
+ }
+};
+
+void fUnionLikeStruct1() {
+ UnionLikeStruct1 t(UnionLikeStruct1::volume, 10);
+}
+
+// Only name contains "kind".
+struct UnionLikeStruct2 {
+ enum Type {
+ volume,
+ area
+ } kind;
+
+ int Volume;
+ int Area;
+
+ UnionLikeStruct2(Type kind, int Val) : kind(kind) {
+ switch (kind) {
+ case volume:
+ Volume = Val;
+ break;
+ case area:
+ Area = Val;
+ break;
+ }
+ }
+};
+
+void fUnionLikeStruct2() {
+ UnionLikeStruct2 t(UnionLikeStruct2::volume, 10);
+}
+
+// Only type contains "kind".
+struct UnionLikeStruct3 {
+ enum Kind {
+ volume,
+ area
+ } type;
+
+ int Volume;
+ int Area;
+
+ UnionLikeStruct3(Kind type, int Val) : type(type) {
+ switch (type) {
+ case volume:
+ Volume = Val;
+ break;
+ case area:
+ Area = Val;
+ break;
+ }
+ }
+};
+
+void fUnionLikeStruct3() {
+ UnionLikeStruct3 t(UnionLikeStruct3::volume, 10);
+}
+
+// Only type contains "tag".
+struct UnionLikeStruct4 {
+ enum Tag {
+ volume,
+ area
+ } type;
+
+ int Volume;
+ int Area;
+
+ UnionLikeStruct4(Tag type, int Val) : type(type) {
+ switch (type) {
+ case volume:
+ Volume = Val;
+ break;
+ case area:
+ Area = Val;
+ break;
+ }
+ }
+};
+
+void fUnionLikeStruct4() {
+ UnionLikeStruct4 t(UnionLikeStruct4::volume, 10);
+}
+
+// Both name and type name contains but does not equal to tag/kind.
+struct UnionLikeStruct5 {
+ enum WhateverTagBlahBlah {
+ volume,
+ area
+ } FunnyKindName;
+
+ int Volume;
+ int Area;
+
+ UnionLikeStruct5(WhateverTagBlahBlah type, int Val) : FunnyKindName(type) {
+ switch (FunnyKindName) {
+ case volume:
+ Volume = Val;
+ break;
+ case area:
+ Area = Val;
+ break;
+ }
+ }
+};
+
+void fUnionLikeStruct5() {
+ UnionLikeStruct5 t(UnionLikeStruct5::volume, 10);
+}