151 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.UninitializedObject \2// RUN: -analyzer-config optin.cplusplus.UninitializedObject:Pedantic=true -DPEDANTIC \3// RUN: -analyzer-config optin.cplusplus.UninitializedObject:IgnoreRecordsWithField="[Tt]ag|[Kk]ind" \4// RUN: -std=c++11 -verify %s5 6// RUN: not %clang_analyze_cc1 -verify %s \7// RUN: -analyzer-checker=core \8// RUN: -analyzer-checker=optin.cplusplus.UninitializedObject \9// RUN: -analyzer-config \10// RUN: optin.cplusplus.UninitializedObject:IgnoreRecordsWithField="([)]" \11// RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-UNINIT-INVALID-REGEX12 13// CHECK-UNINIT-INVALID-REGEX: (frontend): invalid input for checker option14// CHECK-UNINIT-INVALID-REGEX-SAME: 'optin.cplusplus.UninitializedObject:IgnoreRecordsWithField',15// CHECK-UNINIT-INVALID-REGEX-SAME: that expects a valid regex, building failed16// CHECK-UNINIT-INVALID-REGEX-SAME: with error message "parentheses not17// CHECK-UNINIT-INVALID-REGEX-SAME: balanced"18 19 20// expected-no-diagnostics21 22// Both type and name contains "kind".23struct UnionLikeStruct1 {24 enum Kind {25 volume,26 area27 } 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 area53 } 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 area79 } 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 area105 } 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 area131 } 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