forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			118 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 %s -std=c++11 -fsyntax-only -Wmicrosoft -verify -fms-extensions
 | 
						|
 | 
						|
class MayExist {
 | 
						|
private:
 | 
						|
  typedef int Type;
 | 
						|
};
 | 
						|
 | 
						|
void test_if_exists_stmts() {
 | 
						|
  int b = 0;
 | 
						|
  __if_exists(MayExist::Type) {
 | 
						|
    b++;
 | 
						|
    b++;
 | 
						|
  }
 | 
						|
  __if_exists(MayExist::Type_not) {
 | 
						|
    this will not compile.
 | 
						|
  }
 | 
						|
  __if_not_exists(MayExist::Type) {
 | 
						|
    this will not compile.
 | 
						|
  }
 | 
						|
  __if_not_exists(MayExist::Type_not) {
 | 
						|
    b++;
 | 
						|
    b++;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
int if_exists_creates_no_scope() {
 | 
						|
  __if_exists(MayExist::Type) {
 | 
						|
    int x;  // 'x' is declared in the parent scope.
 | 
						|
  }
 | 
						|
  __if_not_exists(MayExist::Type_not) {
 | 
						|
    x++;
 | 
						|
  }
 | 
						|
  return x;
 | 
						|
}
 | 
						|
 | 
						|
__if_exists(MayExist::Type) {
 | 
						|
  int var23;
 | 
						|
}
 | 
						|
 | 
						|
__if_exists(MayExist::Type_not) {
 | 
						|
  this will not compile.
 | 
						|
}
 | 
						|
 | 
						|
__if_not_exists(MayExist::Type) {
 | 
						|
  this will not compile.
 | 
						|
}
 | 
						|
 | 
						|
__if_not_exists(MayExist::Type_not) {
 | 
						|
  int var244;
 | 
						|
}
 | 
						|
 | 
						|
void test_if_exists_init_list() {
 | 
						|
 | 
						|
  int array1[] = {
 | 
						|
    0,
 | 
						|
    __if_exists(MayExist::Type) {2, }
 | 
						|
    3
 | 
						|
  };
 | 
						|
 | 
						|
  int array2[] = {
 | 
						|
    0,
 | 
						|
    __if_exists(MayExist::Type_not) { this will not compile }
 | 
						|
    3
 | 
						|
  };
 | 
						|
 | 
						|
  int array3[] = {
 | 
						|
    0,
 | 
						|
    __if_not_exists(MayExist::Type_not) {2, }
 | 
						|
    3
 | 
						|
  };
 | 
						|
 | 
						|
  int array4[] = {
 | 
						|
    0,
 | 
						|
    __if_not_exists(MayExist::Type) { this will not compile }
 | 
						|
    3
 | 
						|
  };
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
class IfExistsClassScope {
 | 
						|
  __if_exists(MayExist::Type) {
 | 
						|
    // __if_exists, __if_not_exists can nest
 | 
						|
    __if_not_exists(MayExist::Type_not) {
 | 
						|
      int var123;
 | 
						|
    }
 | 
						|
    int var23;
 | 
						|
  }
 | 
						|
 | 
						|
  __if_exists(MayExist::Type_not) {
 | 
						|
   this will not compile.
 | 
						|
  }
 | 
						|
 | 
						|
  __if_not_exists(MayExist::Type) {
 | 
						|
   this will not compile.
 | 
						|
  }
 | 
						|
 | 
						|
  __if_not_exists(MayExist::Type_not) {
 | 
						|
    int var244;
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
void test_nested_if_exists() {
 | 
						|
  __if_exists(MayExist::Type) {
 | 
						|
    int x = 42;
 | 
						|
    __if_not_exists(MayExist::Type_not) {
 | 
						|
      x++;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void test_attribute_on_if_exists() {
 | 
						|
  [[clang::fallthrough]] // expected-error {{an attribute list cannot appear here}}
 | 
						|
  __if_exists(MayExist::Type) {
 | 
						|
    int x;
 | 
						|
  }
 | 
						|
}
 |