// RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.UninitializedObject \
// RUN: -analyzer-config optin.cplusplus.UninitializedObject:Pedantic=true -DPEDANTIC \
// RUN: -analyzer-config optin.cplusplus.UninitializedObject:IgnoreRecordsWithField="[Tt]ag|[Kk]ind" \
// RUN: -std=c++11 -verify %s
// RUN: not %clang_analyze_cc1 -verify %s \
// RUN: -analyzer-checker=core \
// RUN: -analyzer-checker=optin.cplusplus.UninitializedObject \
// RUN: -analyzer-config \
// RUN: optin.cplusplus.UninitializedObject:IgnoreRecordsWithField="([)]" \
// RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-UNINIT-INVALID-REGEX
// CHECK-UNINIT-INVALID-REGEX: (frontend): invalid input for checker option
// CHECK-UNINIT-INVALID-REGEX-SAME: 'optin.cplusplus.UninitializedObject:IgnoreRecordsWithField',
// CHECK-UNINIT-INVALID-REGEX-SAME: that expects a valid regex, building failed
// CHECK-UNINIT-INVALID-REGEX-SAME: with error message "parentheses not
// CHECK-UNINIT-INVALID-REGEX-SAME: balanced"
// 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);
}