forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			151 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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);
 | |
| }
 |