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