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