127e14731SReid Kleckner // RUN: %clang_cc1 %s -std=c++11 -fsyntax-only -Wmicrosoft -verify -fms-extensions 227e14731SReid Kleckner 327e14731SReid Kleckner class MayExist { 427e14731SReid Kleckner private: 527e14731SReid Kleckner typedef int Type; 627e14731SReid Kleckner }; 727e14731SReid Kleckner test_if_exists_stmts()827e14731SReid Klecknervoid test_if_exists_stmts() { 927e14731SReid Kleckner int b = 0; 1027e14731SReid Kleckner __if_exists(MayExist::Type) { 1127e14731SReid Kleckner b++; 1227e14731SReid Kleckner b++; 1327e14731SReid Kleckner } 1427e14731SReid Kleckner __if_exists(MayExist::Type_not) { 1527e14731SReid Kleckner this will not compile. 1627e14731SReid Kleckner } 1727e14731SReid Kleckner __if_not_exists(MayExist::Type) { 1827e14731SReid Kleckner this will not compile. 1927e14731SReid Kleckner } 2027e14731SReid Kleckner __if_not_exists(MayExist::Type_not) { 2127e14731SReid Kleckner b++; 2227e14731SReid Kleckner b++; 2327e14731SReid Kleckner } 2427e14731SReid Kleckner } 2527e14731SReid Kleckner if_exists_creates_no_scope()266be648f0SReid Klecknerint if_exists_creates_no_scope() { 276be648f0SReid Kleckner __if_exists(MayExist::Type) { 286be648f0SReid Kleckner int x; // 'x' is declared in the parent scope. 296be648f0SReid Kleckner } 306be648f0SReid Kleckner __if_not_exists(MayExist::Type_not) { 316be648f0SReid Kleckner x++; 326be648f0SReid Kleckner } 336be648f0SReid Kleckner return x; 346be648f0SReid Kleckner } 356be648f0SReid Kleckner __if_exists(MayExist::Type)3627e14731SReid Kleckner__if_exists(MayExist::Type) { 3727e14731SReid Kleckner int var23; 3827e14731SReid Kleckner } 3927e14731SReid Kleckner __if_exists(MayExist::Type_not)4027e14731SReid Kleckner__if_exists(MayExist::Type_not) { 4127e14731SReid Kleckner this will not compile. 4227e14731SReid Kleckner } 4327e14731SReid Kleckner __if_not_exists(MayExist::Type)4427e14731SReid Kleckner__if_not_exists(MayExist::Type) { 4527e14731SReid Kleckner this will not compile. 4627e14731SReid Kleckner } 4727e14731SReid Kleckner __if_not_exists(MayExist::Type_not)4827e14731SReid Kleckner__if_not_exists(MayExist::Type_not) { 4927e14731SReid Kleckner int var244; 5027e14731SReid Kleckner } 5127e14731SReid Kleckner test_if_exists_init_list()5227e14731SReid Klecknervoid test_if_exists_init_list() { 5327e14731SReid Kleckner 5427e14731SReid Kleckner int array1[] = { 5527e14731SReid Kleckner 0, 5627e14731SReid Kleckner __if_exists(MayExist::Type) {2, } 5727e14731SReid Kleckner 3 5827e14731SReid Kleckner }; 5927e14731SReid Kleckner 6027e14731SReid Kleckner int array2[] = { 6127e14731SReid Kleckner 0, 6227e14731SReid Kleckner __if_exists(MayExist::Type_not) { this will not compile } 6327e14731SReid Kleckner 3 6427e14731SReid Kleckner }; 6527e14731SReid Kleckner 6627e14731SReid Kleckner int array3[] = { 6727e14731SReid Kleckner 0, 6827e14731SReid Kleckner __if_not_exists(MayExist::Type_not) {2, } 6927e14731SReid Kleckner 3 7027e14731SReid Kleckner }; 7127e14731SReid Kleckner 7227e14731SReid Kleckner int array4[] = { 7327e14731SReid Kleckner 0, 7427e14731SReid Kleckner __if_not_exists(MayExist::Type) { this will not compile } 7527e14731SReid Kleckner 3 7627e14731SReid Kleckner }; 7727e14731SReid Kleckner 7827e14731SReid Kleckner } 7927e14731SReid Kleckner 8027e14731SReid Kleckner 8127e14731SReid Kleckner class IfExistsClassScope { __if_exists(MayExist::Type)8227e14731SReid Kleckner __if_exists(MayExist::Type) { 8327e14731SReid Kleckner // __if_exists, __if_not_exists can nest 8427e14731SReid Kleckner __if_not_exists(MayExist::Type_not) { 8527e14731SReid Kleckner int var123; 8627e14731SReid Kleckner } 8727e14731SReid Kleckner int var23; 8827e14731SReid Kleckner } 8927e14731SReid Kleckner __if_exists(MayExist::Type_not)9027e14731SReid Kleckner __if_exists(MayExist::Type_not) { 9127e14731SReid Kleckner this will not compile. 9227e14731SReid Kleckner } 9327e14731SReid Kleckner __if_not_exists(MayExist::Type)9427e14731SReid Kleckner __if_not_exists(MayExist::Type) { 9527e14731SReid Kleckner this will not compile. 9627e14731SReid Kleckner } 9727e14731SReid Kleckner __if_not_exists(MayExist::Type_not)9827e14731SReid Kleckner __if_not_exists(MayExist::Type_not) { 9927e14731SReid Kleckner int var244; 10027e14731SReid Kleckner } 10127e14731SReid Kleckner }; 102*6d8d22aeSReid Kleckner test_nested_if_exists()103*6d8d22aeSReid Klecknervoid test_nested_if_exists() { 104*6d8d22aeSReid Kleckner __if_exists(MayExist::Type) { 105*6d8d22aeSReid Kleckner int x = 42; 106*6d8d22aeSReid Kleckner __if_not_exists(MayExist::Type_not) { 107*6d8d22aeSReid Kleckner x++; 108*6d8d22aeSReid Kleckner } 109*6d8d22aeSReid Kleckner } 110*6d8d22aeSReid Kleckner } 111*6d8d22aeSReid Kleckner test_attribute_on_if_exists()112*6d8d22aeSReid Klecknervoid test_attribute_on_if_exists() { 113*6d8d22aeSReid Kleckner [[clang::fallthrough]] // expected-error {{an attribute list cannot appear here}} 114*6d8d22aeSReid Kleckner __if_exists(MayExist::Type) { 115*6d8d22aeSReid Kleckner int x; 116*6d8d22aeSReid Kleckner } 117*6d8d22aeSReid Kleckner } 118