xref: /llvm-project/clang/test/Parser/ms-if-exists.cpp (revision 6d8d22ae404cc857782c422e1f53c7d4a3d9311f)
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 Kleckner void 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 Kleckner int 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 Kleckner void 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 Kleckner void 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 Kleckner void 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