Implement the Microsoft __if_exists/if_not_exists extension in initializer-list.
Necessary to parse Microsoft ATL code.

Example: 
  int array[] = {
    0, 
    __if_exists(CLASS::Type) {2, }
    3
  };

will declare an array of 2 or 3 elements depending on if CLASS::Type exists or not.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146447 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/Parser/MicrosoftExtensions.cpp b/test/Parser/MicrosoftExtensions.cpp
index 0c5459c..89394c3 100644
--- a/test/Parser/MicrosoftExtensions.cpp
+++ b/test/Parser/MicrosoftExtensions.cpp
@@ -215,6 +215,35 @@
   int var244;
 }
 
+int __if_exists_init_list() {
+
+  int array1[] = {

+    0, 

+    __if_exists(IF_EXISTS::Type) {2, }

+    3

+  };

+
+  int array2[] = {

+    0, 

+    __if_exists(IF_EXISTS::Type_not) { this wont compile }

+    3

+  };

+

+  int array3[] = {

+    0, 

+    __if_not_exists(IF_EXISTS::Type_not) {2, }

+    3

+  };

+
+  int array4[] = {

+    0, 

+    __if_not_exists(IF_EXISTS::Type) { this wont compile }

+    3

+  };

+
+}
+
+
 class IF_EXISTS_CLASS_TEST {
   __if_exists(IF_EXISTS::Type) {
     // __if_exists, __if_not_exists can nest
diff --git a/test/SemaTemplate/ms-if-exists.cpp b/test/SemaTemplate/ms-if-exists.cpp
index 8ac4e24..04f4a63 100644
--- a/test/SemaTemplate/ms-if-exists.cpp
+++ b/test/SemaTemplate/ms-if-exists.cpp
@@ -47,6 +47,12 @@
     int *i = t; // expected-error{{no viable conversion from 'HasFoo' to 'int *'}}
     { }
   }
+
+  int array2[] = {

+    0, 

+    __if_exists(T::bar) {2, }// expected-warning{{dependent __if_exists declarations are ignored}}

+    3

+  };

 }
 
 template void f(HasFoo); // expected-note{{in instantiation of function template specialization 'f<HasFoo>' requested here}}