// 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); }