forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			86 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %check_clang_tidy %s bugprone-multiple-statement-macro %t
 | 
						|
 | 
						|
void F();
 | 
						|
 | 
						|
#define BAD_MACRO(x) \
 | 
						|
  F();               \
 | 
						|
  F()
 | 
						|
 | 
						|
#define GOOD_MACRO(x) \
 | 
						|
  do {                \
 | 
						|
    F();              \
 | 
						|
    F();              \
 | 
						|
  } while (0)
 | 
						|
 | 
						|
#define GOOD_MACRO2(x) F()
 | 
						|
 | 
						|
#define GOOD_MACRO3(x) F();
 | 
						|
 | 
						|
#define MACRO_ARG_MACRO(X) \
 | 
						|
  if (54)                  \
 | 
						|
  X(2)
 | 
						|
 | 
						|
#define ALL_IN_MACRO(X) \
 | 
						|
  if (43)               \
 | 
						|
    F();                \
 | 
						|
  F()
 | 
						|
 | 
						|
#define GOOD_NESTED(x)   \
 | 
						|
  if (x)            \
 | 
						|
    GOOD_MACRO3(x); \
 | 
						|
  F();
 | 
						|
 | 
						|
#define IF(x) if(x)
 | 
						|
 | 
						|
void positives() {
 | 
						|
  if (1)
 | 
						|
    BAD_MACRO(1);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used without braces; some statements will be unconditionally executed [bugprone-multiple-statement-macro]
 | 
						|
  if (1) {
 | 
						|
  } else
 | 
						|
    BAD_MACRO(1);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used
 | 
						|
  while (1)
 | 
						|
    BAD_MACRO(1);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used
 | 
						|
  for (;;)
 | 
						|
    BAD_MACRO(1);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used
 | 
						|
 | 
						|
  MACRO_ARG_MACRO(BAD_MACRO);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: multiple statement macro used
 | 
						|
  MACRO_ARG_MACRO(F(); int);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: multiple statement macro used
 | 
						|
  IF(1) BAD_MACRO(1);
 | 
						|
  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: multiple statement macro used
 | 
						|
}
 | 
						|
 | 
						|
void negatives() {
 | 
						|
  if (1) {
 | 
						|
    BAD_MACRO(1);
 | 
						|
  } else {
 | 
						|
    BAD_MACRO(1);
 | 
						|
  }
 | 
						|
  while (1) {
 | 
						|
    BAD_MACRO(1);
 | 
						|
  }
 | 
						|
  for (;;) {
 | 
						|
    BAD_MACRO(1);
 | 
						|
  }
 | 
						|
 | 
						|
  if (1)
 | 
						|
    GOOD_MACRO(1);
 | 
						|
  if (1) {
 | 
						|
    GOOD_MACRO(1);
 | 
						|
  }
 | 
						|
  if (1)
 | 
						|
    GOOD_MACRO2(1);
 | 
						|
  if (1)
 | 
						|
    GOOD_MACRO3(1);
 | 
						|
 | 
						|
  MACRO_ARG_MACRO(GOOD_MACRO);
 | 
						|
  ALL_IN_MACRO(1);
 | 
						|
 | 
						|
  IF(1) GOOD_MACRO(1);
 | 
						|
}
 |